RU/Writing Gamemodes
Это руководство поможет вам, как написать правильный режим игры. Если вы только что начали писать скрипты для MTA, вы должны сначала просмотреть другие учебники на Главная страница.
Введение
Gamemode (ГМ, мод, гейммод, игровой режим) - ресурс, который, будучи запущенным, контролирует весь игровой процесс. Гейммод включает в себя отправку сообщений игрокам - указания к действиям, респаун игроков, создание команд, указаний, что игрокам нужно делать для победы, или для получения очков, и т.д. Примеры - гонки и DeatMatch'и.
Что означает "правильный игровой режим"?
Проще говоря, правильным игровым режимом можно назвать такой режим, который в полной мере использует MTA систему .map файлов. Это означает, что код игрового режима не имеет любых специфических карт, данные которых жестко привязаны к нему, такие как положение игроков или автомобилей. Вместо этого, игровой режим должен быть в состоянии загружать .map файлы, которые и будут определять эти данные. Таким образом, игровой режим может иметь несколько карт, а также люди смогут создавать .map файлы для игрового режима используя MTA редактор карт, который является гораздо более удобным, чем написание кода.
Очевидным примеров "правильного игрового режима" является MTA: Race. Он допускает пользовательские карты с большим количеством возможностей внутри .map файла. Чтобы изменить точки появления игроков, объекты и т.д., пользователю не нужно изменять сам игровой режим.
Файлы карт
Файлы карт основываются на XML документах с форматом .map. Они определяют контекст игры для одного или нескольких конкретных игровых режимов. Однако, они не должны менять правила игры, которые определены игровым режимом.
Каждый элемент на карте соответствует узлу .map файла. Существует стандартный синтаксис для общих элементов, таких как точки появления игроков, объекты и транспортные средства. Для особых же элементов карты, соответствующих специфике игрового режима, вам нужно придумать собственный синтаксис.
Пример
Давайте для примера возьмем режим Capture the Flag. Карта для этого режима нуждается главным образом в определенных точках появления игроков, расположенных флагах и в конце концов объектах и транспортных средствах. Упрощенный файл карты может выглядеть следующим образом:
<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>
Здесь вы можете увидеть два MTA элемента - точку появления игрока и пикап. Что еще более важно, карта имеет пользовательский узел "flag", который определяет положение и цвет флага. Точка появления игрока и пикап могут быть обработаны путем существующих внешних ресурсов, пользовательские элементы должны быть обработаны игровым режимом.
To summarize - we want mass mapper input as we saw in MTA:Race. Users should NOT have to touch the gamemode script itself at all.
Пример получения .map информации
Как уже упоминалось выше, вашему игровому режиму нужно получить пользовательские элементы, которые определены в файле карты, и обработать их. Это довольно просто, как показано ниже.
-- получаем таблицу со всеми элементами типа "flag" local flagElements = getElementsByType ( "flag" ) -- пропускаем их через цикл for key, value in pairs(flagElements) do -- получаем нашу информацию local posX = getElementData ( value, "posX" ) local posY = getElementData ( value, "posY" ) local posZ = getElementData ( value, "posZ" ) local team = getElementData ( value, "team" ) -- создаем объект в соответствии с положением флага createObject ( 1337, posX, posY, posZ ) -- выводим команду, для которой мы создали базу outputChatBox ( "Base for team " .. team .. " created" ) end
Функция getElementsByType возвращает таблицу всех элементов определенного типа (тип соответствует имени узла в .map файле). Это работает как с пользовательскими типами, так и со встроенными в МТА(например, "vehicle" или "player"). getElementData может быть использована для получения XML-атрибутов в .map файле. В этом простом примере объект создается на месте флага и в окно чата выводится сообщение. В действительности, вы конечно должны делать все это во время загрузки карты, так как в этом случае создается форма столкновения для обнаружения игроков с флагом.
Менеджер карт
Прочитав раздел выше должно быть понятно, что режим игры всегда должен состоять из двух частей:
- Ресурс игрового режима, который всегда остается неизменным
- Множество различных ресурсов карт, которые дают игровому режиму конкретную карту содержащую информацию
Теперь вместо того чтобы писать загрузчик карт для каждого игрового режима, Map manager предоставляет функции для загрузки этих самых режимов и карт. 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).