Multi Theft Auto Deathmatch Pisanie Gamemodu

Gamemod jest zasobem, który kontroluje wszelkie zagadnienia związane z grą. Dzięki niemu możemy przekazać graczom co mają robić, spawnować ich, tworzyć drużyny, zdefiniować co muszą zrobić by wygrać czy też zdobyć punkty. Przykładem są tu mody typu Race i Deathmatch.

Czym tak właściwie jest ‘gamemode’?

Mówiąc krótko gamemodem nazywamy skrypt, który w pełni korzysta z systemu map MTA. Oznacza to, że gamemod nie ma żadnych specyfikacji map umieszczonych wewnątrz niego tj. rozmieszczenie pojazdów czy tez spawny graczy. toteż gamemod powinien mieć możliwość załadowania plików map właśnie z tymi danymi. Dzięki temu pojedynczy gamemod może mieć zdefiniowane różne mapy, a dodatkowo gracze mogą stworzyć swoje własne mapy korzystając z Map Editora.

Pliki map

Pliki map są to przede wszystkim pliki XML wraz z rozszerzeniami mapy. One właśnie definiują środowisko mapy. Nie mają one za zadanie zmienić zasad gry – od tego są gamemody.

Każdy element w mapie odpowiada jakiemuś plikowi mapy (.map), odpowiadające za podstawowe składnie, np. spawnpointy, obiekty, pojazdy.

Przykład

Za przykład posłuży nam gamemod ‘Capture the Flag’. Mapa dla tego typu gamemodu musi mieć zdefiniowane spawnpointy, miejsce gdzie umieszczona jest flaga oraz ewentualnie obiekty i pojazdy. Prosty plik mapy mógłby wyglądać tak:

Kod
<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>

Tutaj możecie zauważyć dwa podstawowe elementy MTA – spawnpointy oraz pickupy. Co ważniejsze w kodzie pojawia się tzw. ‘flagę’(‘flag’), która definiuje nam miejsce oraz kolor flagi.

Przykład wyciąganie informacji z pliku .map

Wspomniany wyżej gamemod musi zostać wyposażony w jakieś elementy, które są zdefiniowane w plikach .map oraz ich przetworzenie:

Kod
– pozyskuje tabelę wraz ze wszystkimi elementami flagi
local flagElements = getElementsByType ( ‘flag’ )
– pętla
for key, value in pairs(flagElements) do
– get our info
local posX = getElementData ( value, ‘posX’ )
local posY = getElementData ( value, ‘posY’ )
local posZ = getElementData ( value, ‘posZ’ )
local team = getElementData ( value, ‘team’ )
– tworzenie obiektu wedle pozycji flagi
createObject ( 1337, posX, posY, posZ )
– output dla drżyny. że utworzyliśmy bazę
outputChatBox ( ‘Base for team ‘ .. team .. ‘ created’ )

end

Funkcja getElementsByType pobiera tabelę wszystkich elementów pewnego typu (typ ten odpowiada odpowiedniemu węzłowi w pliku .map).Natomiast funkcja getElementData może zostać użyta do pobrania odpowiednich atrybutów zawartych w pliku xml. W tym prostym przykładzie w miejscu flagi stworzony zostaje obiekt oraz wyświetlona informacja w czacie. W rzeczywistości jednak będziesz musiał się nieco bardziej wysilić ustalając odpowiednie ‘kolizje’, które ustalają kiedy gracz przechwytuje flagę.

Map manager

Po przeczytaniu powyższych informacji powinieneś dojść do wniosku, że każdy gamemod powinien składać się z dwóch elementów:

  • zasoby gamemodu, które zawsze są takie same
  • wiele różnych zasobów mapy, które nadają gamemodowi jego specyficzny charakter

Teraz zamiast pisać oddzielny loader dla każdego gamemodu posłużymy się Map managerem, który dysponuje odpowiednią funkcja odpowiedzialną za ładowanie gamemodów oraz map. Kiedy wpiszesz odpowiednią komendę – np.’gamemode ctf ctf-italy’ on uruchomi oba zasoby tj. ‘ctf’ oraz ‘ctf-italy’. tak więc zostanie uruchomione zdarzenie ‘onGamemodeMapStart’, które powie zasobowi ‘ctf’, że została załadowana odpowiednia mapa. Po tym zasób ‘ctf’ odczyta informację z ‘ctf-italy’ i zacznie spawnowac graczy.

Jak używać mapmanagera?

By z niego skorzystać musimy ‘zaznaczyć’ nasz gamemod. Ściślej mówiąc musimy ustawić atrybut ‘type’ (zamknięty w tagu ”) wewnątrz xml. Dodatkowo możemy ustawić nasza własną nazwę dla gamemodu, np. ‘Capture the flag’, która zostanie wyświetlona w ASE zamiast nazwy pliku zasobu.

Kod
<!– meta.xml w gamemodzie ‘cowcatapult’ –>

<meta>

<info type=’gamemode’ name=’Cow catapulting 2.0′/>

</meta>

Jeżeli nasz gamemod będzie ładował różne mapy powinniśmy dodać odpowiedniego ‘ładowacza’ dla:

  • onGamemodeMapStart
  • onGamemodeMapStop (gdy niezbędne jest odładowanie)

Są one niezbędne gdy nasz gamemod zostaje uruchominony i zatrzymany (zakończony) oraz kiedy korzysta z parametrów zasobów map. Dzięki funkcji ‘ładowacza’ możemy pobrać wszelkie niezbędne informacje z zasobów map oraz plików konfiguracyjnych.

Kod
function startCtfMap( startedMap ) — startedMap zawiera odniesienie do zasobu mapy

local mapRoot = getResourceRootElement( startedMap ) — pobiera rdzeń węzła rozpoczętej mapy

local flagElements = getElementsByType ( ‘flag’ , mapRoot ) — pobiera wszystkie flagi z .map oraz ustawia je w tabelę

– dalej ładuje informacje tak jak w przykładzie wyżej

— spawnuje graczy etc.

end

addEventHandler(‘onGamemodeMapStart’, getRootElement(), startCtfMap)

Kompatybilując mapy

Mapy są oddzielnymi zasobami. Dzięki nimi nie będziemy musieli edytować gamemodu by wykonać mapę oraz także pozwala na spakowanie z nimi specyfikację mapy, pliki konfiguracyjne.

By wykonać mapę kompatybilną z naszym gamemodem, otwórz jego zasób meta.xml i ustaw atrybit ‘type’ do odpowiedniej mapy. Natomiast atrybuty ‘gamemodeu’ musza być ciągła listą (bez spacji) spaces) of gamemode resource names that the map works with.

Kod
<!– meta.xml mapy –>

<meta>

<info type=’map’ gamemodes=’cowcatapult,assault,tdm’/>

</meta>

Kiedy już to wykonamy admini będą mogli korzystać z tych dwóch komend: /gamemode nazwa_gamemodu [Nazwa_mapy] oraz /changemap [Nazwa_mapy] [nazwa_gamemodu]

Co jeszcze powinniśmy zrobić?

Istnieje jeszcze wiele zasobów, w które każdy gamemod powinien zostać wyposażony:

Helpmanager/ Pomoc

Helpmanager jest standardowo dołączonym interfejsem, który wyświetla wszelkie wskazówki dla graczy. Oprócz standardowych komend gracz może dodać tu nieco od siebie. Pomoc zawiera zakładki prowadzące do innych części pomocy. Tak więc możemy tu umieścić krótki opis naszego gamemodu czy też naszą listę komend dostępnych w gamemodzie.

  • dostarcza podstawowych informacji o co chodzi w gamemodzie
  • w wyświetlanym okienku pomocy możemy dodać dowolny element GUI. Dzięki temu będziemy mogli przekazać konkretniejszych informacji o naszym gamemodzie.

Scoreboard / tabela wyników

Scoreboard jest tabelą, która wyświetla informacje o drużynach oraz graczach aktualnie grających na serwerze. W przeciwieństwie do konkurencyjnego multiplayera – SA-MP w MTA mamy możliwość dowolnej modyfikacji zawartości tej tabeli, dodając do niej przeróżne kolumny. Dla przykładu może tu posłużyć kolumna ‘points’, która w gamemodzie ‘Control The Flag’ może przedstawiać liczbę osób, które zabił gracz lub ile razy zdobył flagę.

Map cycler

Map cycler odpowiedzialny jest za to jakie gamemody i mapy będą rozgrywane na serwerze. Odpowiada m.in. za to ile razy ma byc rozegrana mapa w rundzie zanim przejdzie do kolejnej rundy. By to jednak uczynić musimy wskazać kiedy gamemod się kończy (np. po końcu rundy).