Créer un mode de jeu: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
Line 36: Line 36:


====Exemple de récupération d'informations sur un .map====
====Exemple de récupération d'informations sur un .map====
As mentioned above, your gamemode needs de retrieve custom elements that are defined in a map file and process them. This is quite easy as demonstrated below.
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.
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
-- retrieve a table with all flag elements
-- récupère une liste avec tout les éléments de type flag
local flagElements = getElementsByType ( "flag" )
local flagElements = getElementsByType ( "flag" )
-- loop through them
-- On boucle sur cette liste pour récupérer les positions
for key, value in pairs(flagElements) do
for key, value in pairs(flagElements) do
-- get our info
-- Récupération des informations
local posX = getElementData ( value, "posX" )
local posX = getElementData ( value, "posX" )
local posY = getElementData ( value, "posY" )
local posY = getElementData ( value, "posY" )
local posZ = getElementData ( value, "posZ" )
local posZ = getElementData ( value, "posZ" )
local team = getElementData ( value, "team" )
local team = getElementData ( value, "team" )
-- create an object according to the flag position
-- Création de l'objet flag
createObject ( 1337, posX, posY, posZ )
createObject ( 1337, posX, posY, posZ )
-- output the team that we created a base for
-- Affichage dans le tchat que le dreapau est créé
outputChatBox ( "Base for team " .. team .. " created" )
outputChatBox ( "Base for team " .. team .. " created" )
end
end
</syntaxhighlight>
</syntaxhighlight>
The [[getElementsByType]] function retrieves a table of all the elements of a certain type (the type corresponds to the node name in the .map file). This works for both custom types and built-in MTA types (like "vehicle" or "player").
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)
[[getElementData]] can be used to retrieve the xml attributes set in the .map file.
Fonctionne pour les objets presonnalisé mais aussi pour les objets présents par défauts dans MTA comme "vehicle" ou "player".
In this simple example, an object is created at the flag's location and a message is outputted in the chatbox. In reality, you will of course need to do more during map loading, like in this case setting up collision shapes to detect players taking the flag.
[[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==
==Map manager==

Revision as of 10:07, 4 April 2014

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 qu iune 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

Having read the section above it should be clear that a gamemode should always consist of two parts:

  • The gamemode resource that always stays the same
  • Many different maps resources that give the gamemode map-specific information

Now instead of writing a map-loader for every single gamemode, the Map manager provides functions to load gamemodes and maps. Simply put, when you enter the correct command (for example 'gamemode ctf ctf-italy') it will start both resources 'ctf' and 'ctf-italy' while triggering an event (onGamemodeMapStart) to tell the 'ctf' resource that a map was loaded. The 'ctf' resource can then access the information 'ctf-italy' contains and start spawning players etc.

How to use the mapmanager

To use the mapmanager service, your gamemode resource has to be tagged as such first. More specifically you'll be setting the "type" attribute of its <info> tag to "gamemode" inside meta.xml. Also, you can set the "name" attribute to a friendly name (like "Capture the flag") that will be shown on ASE instead of the resource name.

<!-- meta.xml in "cowcatapult" gamemode -->
<meta>
    <info type="gamemode" name="Cow catapulting 2.0"/>
</meta>

If your gamemode is going to load custom maps, you should add handlers for

  • onGamemodeMapStart
  • onGamemodeMapStop (if any unloading is necessary)

These are fired when a map for your gamemode is started or stopped, and pass the map resource as a parameter. Within the handler function for these events you can extract all info you need from the resource's map files and configuration files.

Example

function startCtfMap( startedMap ) -- startedMap contains a reference to the resource of the map
    local mapRoot = getResourceRootElement( startedMap )        -- get the root node of the started map
    local flagElements = getElementsByType ( "flag" , mapRoot ) -- get all flags in the map and store them in a table
    -- go on loading information like in the example above
    -- spawn players etc.
end
addEventHandler("onGamemodeMapStart", getRootElement(), startCtfMap)

Making maps compatible

Maps are separate resources. This is done so no editing of the gamemode resource is ever necessary in order to create a custom map, and also allows you to pack map-specific scripts/config files with them.

To make a map compatible with your gamemode, open its resource's meta.xml and tag it as well: the "type" attribute must be set to "map", and the "gamemodes" attribute must be a comma-separated list (no spaces) of gamemode resource names that the map works with.

<!--map's meta.xml-->
<meta>
    <info type="map" gamemodes="cowcatapult,assault,tdm"/>
</meta>

Once you have everything set up, admins will use these two commands to start/stop gamemodes: /gamemode gamemodeName [mapName] (optional parameter allows picking an initial map, defaults to none) /changemap mapName [gamemodeName] (optional parameter specifies the gamemode to start the map with, defaults to the current one)

Map manager exports a few more access functions which you don't have to use, but may be useful.

What else should you do

There are several other resources that gamemodes should use/be compliant with.

Helpmanager

The helpmanager is ought to be the standard interface for players when they need help. If you use the helpmanager to display your gamemode's help, every player that used helpmanager before (e.g. in other gamemodes) will immediately know how to get there. It also displays help for different resources running resources in one window, if necessary.

There are basicially two ways to use the helpmanager:

  • Provide a simple text that explains how to use your gamemode
  • 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).