Créer un mode de jeu
Ce guide à pour but de vous aprpendre à créer un mode de jeu. Si vous venez juste de commencer à scripter pour MTA, il serait préférable que vous lisiez les autres tutoriels de l apage principale.
Introduction
Un mode de jeu est une ressource qui une fois démarrée contrôle tout les éléments du gameplay. Cela inclus l'explication du mode de jeu aux joueurs. Par exemple expliquer comment gagner des points ou de l'argent. (Mode de jeu existans : race, deathmatch, ctf, freeroam et bien d'autres).
Que signifie "coder proprement un mode de jeu" ?
Pour faire simple, un mode de jeu doit utilisé les fonctionnalités du système de map dans MTA. Cela signifie que le code des maps doit être accompagné des position des véhicule, spawn des joueur et autres. Cela permet au mode de jeu d'être indépendant des maps proposées par les joueurs.
Instead, the gamemode should be able to load .map files which define these data. This way the gamemode can have multiple maps; also, people can create .map files for the gamemode with MTA's map editor, which is much more convenient than writing code.
An obvious example of a "proper gamemode" is MTA:Race. It allows usermade maps with lots of possibilities within the .map file. To alter spawnpoints, objects etc., the user doesn't need to edit the gamemode itself.
Fichier MAP
Les fichiers map sont en XML avec l'extension .map. Ils définissent l'environnement pour un mode de jeu ou plusieurs si la map est compatible avec d'aures. Ils ne sont cependant pas supposés changer les règles du jeu. Les règles sont définies dans le mode de jeu.
Chaque élémment dans une map correspond à un noeud dans le fichier .map. Il y a une syntaxe particulière pour les points de spawn, objets ou véhicules. Cependant il est possible, pour des cas d'ajouts d'objets spéciaux d'inventer votre propre syntaxe.
Exemple
Commencons par un mode de jeu bien connu, la capture de drapeau. Une map pour ce mode de jeu à besoin de point de spawn et de positions pour les drapeaux des deux équipes. On peut aussi y ajouter des véhicules et d'autres objets. Un fichier de map simplifié pourrait ressembler à ça :
<map> <spawnpoint id="spawnpoint1" posX="1959.5487060547" posY="-1714.4613037109" posZ="877.25219726563" rot="63.350006103516" model="0"/> <pickup id="Armor 1" posX="1911.083984375" posY="-1658.8798828125" posZ="885.40216064453" type="armor" health="50" respawn="60000"/> <flag posX="1959.5487060547" posY="-1714.4613037109" posZ="877.25219726563" team="blue" /> ... </map>
Dans le code ci-dessus on peut apercevoir trois éléments : un point de spawn,un pickup et un flag. Le pickup permettera une fois pris par le joueur de lui rendre 50 points de vie, celui-ci respawn toute les 60 secondes. Le flag est ici définit au niveau de sa position et de sa couleur (propre à l'équipe). Le point de spawn et le pickup peuvent être utilisé par une ressource externe. Les éléments personnalisés doievent être gérés par le mode de jeu.
Pour résumé, votre objectif est de facilité la vie des mappeurs. Ceux-ci ne doivent pas avoir à se tracasser du script concernant le mode de jeu.
Exemple de récupération d'informations sur un .map
Votre mode de jeu doit appelés les éléments personnalisés définit dans le fichier .map afin des les utilisés. Ce n'est pas bien compliqué et voici une démonstration ci-dessous.
-- récupère une liste avec tout les éléments de type flag local flagElements = getElementsByType ( "flag" ) -- On boucle sur cette liste pour récupérer les positions for key, value in pairs(flagElements) do -- Récupération des informations local posX = getElementData ( value, "posX" ) local posY = getElementData ( value, "posY" ) local posZ = getElementData ( value, "posZ" ) local team = getElementData ( value, "team" ) -- Création de l'objet flag createObject ( 1337, posX, posY, posZ ) -- Affichage dans le tchat que le dreapau est créé outputChatBox ( "Base for team " .. team .. " created" ) end
La fonction getElementsByType récupère une table de tout les éléments d'un certain type. (le type correspond au noeud créé dans le fichier .map) Fonctionne pour les objets presonnalisé mais aussi pour les objets présents par défauts dans MTA comme "vehicle" ou "player". getElementData peut être utilisé pour récupérer les atributs XML définis dans le fichier .map. Pour exemple, un objet est créé à la position du drapeau et un message s'affiche dans le tchat pour prévenir les joueurs. En réalité, cette action sera plutôt réalisée lors du chargement de la map. Par contre on peut imaginer une action lorsqu'un joueur s'empare du drapeau ennemi.
Map Manager
Après avoir lu les sections ci-dessus il doit vous paraître clair qu'un mode de jeu est composé en deux parties :
- La ressource du mode de jeu (Unique)
- Les maps qui accompagnent le mode de jeu
A la place d'écrire un Map manager pour chaque mode de jeu différent, le Map manager de base fournit des fonctions pour charger mode de jeu et maps. Il suffit simplement d'entrer un commande correcte (par exemple 'gamemode ctf ctf-italy'), cette action va démarrer le mode de jeu et la map pendant que l'évênement déclenché (onGamemodeMapStart) avertira le mode de jeu q'une map est chargée. La ressource 'ctf' peut alors accéder au informations de la map. Le mode de jeu peut alors faire spawn les joueurs.
Comment utiliser le Map Manager
Pour utiliser le Map Manager, votre mode de jeu doit être ciblé en premier lieu. Vous devez en fait configurer l'attribut "type" dans la baile <info> du meta.xml avec le mode de jeu souhaité. L'attribut "name" peut contenir un non plus convivial comme 'Capture de drapeau', c'estl enom qui sera affiché dans la liste des serveurs à la place du om de la ressource par défaut.
<!-- meta.xml in "shootermode" gamemode --> <meta> <info type="gamemode" name="Shooter Mode 2.0"/> </meta>
Si votre mode de jeu utilise des maps personnalisées, vous devriez utiliser les évênements suivant :
- onGamemodeMapStart
- onGamemodeMapStop (Si la map doit-être déchargée)
Les évênements ci-dessus sont appelés quand une map de votre mode démarre ou s'arrête. Le paramètre passé par ces évênement n'est rien d'autre que le nom de la ressource. Avec les fonctions sur les évênements, vous pouvez extraire toute les informations de la map ainsi que du fichier de configuration.
Example
function startCtfMap( startedMap ) -- startedMap contient une référence vers la ressource de la map local mapRoot = getResourceRootElement( startedMap ) -- recoit le noeud principal de la map démarrée local flagElements = getElementsByType ( "flag" , mapRoot ) -- recoit tout les drapeausx de la map et les stocke dans un tableau -- Démarrage du chargement des informations -- Spawn les joueurs etc end addEventHandler("onGamemodeMapStart", getRootElement(), startCtfMap)
Faire des maps compatibles
Les maps sont des ressources séparées du mode de jeu de telle sorte qu'il ne faut pas modofier le mode de jeu pour chaque nouvelle map. Les maps peuent aussi contenir des scripts et configurations propres à elles.
Pour faire une map compatible avec votre mode, il suffit d'ouvrir le meta.xml et de mettre l'attribut "type" à 'map' et l'attribut "gamemode" doit être composé d'une liste des mode de jeu compatible avec la map (modes séparé d'une virgule).
<!--map's meta.xml--> <meta> <info type="map" gamemodes="shootermode,assault,tdm"/> </meta>
Une fois que tout est configuré, les administrateurs peuvent utiliser le panel ou les commandes start/stop suivit du nom du mode. /gamemode gamemodeName [NomDeLaMap] (paramètre optionel qui permet de démarré une map avec le mode, par défaut pas de map) /changemap mapName [NomDuModeDeJeu] (paramètre optionnel qui permet dans le cas ou la map est démarrée de lancé le mode de jeu qui lui convient, par défaut le mode de jeu actif)
Map manager possède d'autres fonctions qui pourrait vous être utliles, mais elle ne sont pas toutes présentées ici.
Autres possibilités
Il y a une multitude d'autres ressources avec lesquelles les modes de jeu peuvent interférer.
Helpmanager
L'Helpmanager est une interface en jeu pour les joueurs qui on besopin d'aide. Si vous utilisez l'HelpManager pour l'aide de votre mode de jeu, tous les joueurs qui l'on utilisé précédement serront plus à l'aise car la plupart des modes l'utilise. Il affiche aussi les différentes ressources dans des onglet, si configuré pour.
Il y à deux façons d'utiliser le HelpManager :
- Fournir un simple texte qui explique le mode de jeu.
- Request a GUI element from the helpmanager that will be displayed in its own tab in the helpmanager window and lets you add any GUI elements to it. This is the recommended way for gamemodes that need to display more complex information that needs its own GUI.
Read the helpmanager page for details on how to do it.
Scoreboard
Scoreboard displays players and teams currently ingame. You add custom columns to it to provide map specific information. For example the column 'points' in the 'ctf' gamemode could represent the player's points gained through kills or captures. As usual, see the scoreboard help page for more information.
Map cycler
The map cycler controls what gamemodes and maps are played on a server. You can specifiy for example how many times in a row a map will be played until it switches to the next. To achieve this, you need to tell the map cycler when your gamemode finished (e.g. when a round ends).