DE/Writing Gamemodes

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

Diese Anleitung versucht, den Prozess zu skizzieren, wie man einen richtigen Spielmodus schreibt. Wenn Sie gerade erst mit dem Schreiben von Skripten für MTA begonnen haben, sollten Sie sich zuerst die anderen Skript-Tutorials auf der Main Page ansehen.

Introduction

Ein Spielmodus ist eine Ressource, die, einmal gestartet, das gesamte Spielgeschehen steuert. Dazu kann gehören, den Spielern zu sagen, was sie zu tun haben, Spieler zu spawnen, Teams zu bilden, festzulegen, was die Spieler tun müssen, um zu gewinnen oder Punkte zu erhalten und vieles mehr. Beispiele sind Rennen und Deathmatch.

What does "proper gamemode" mean?

Um es einfach auszudrücken, ist ein richtiger Spielmodus einer, der das .map-Dateisystem von MTA vollständig nutzt. Das bedeutet, dass der Gamemode-Code keine kartenspezifischen Daten enthält, wie z.B. die Positionen von Spielern oder Autos. Stattdessen sollte der Spielmodus in der Lage sein, .map-Dateien zu laden, die diese Daten definieren. Auf diese Weise kann der Spielmodus mehrere Karten haben; außerdem kann man mit dem MTA-Karteneditor .map-Dateien für den Spielmodus erstellen, was viel bequemer ist als das Schreiben von Code.

Ein offensichtliches Beispiel für einen "richtigen Spielmodus" ist MTA:Race. Er erlaubt benutzerdefinierte Karten mit vielen Möglichkeiten innerhalb der .map-Datei. Um Spawnpunkte, Objekte usw. zu ändern, muss der Benutzer nicht den Spielmodus selbst bearbeiten.

Map Files

Kartendateien sind im Grunde XML-Dokumente mit der Erweiterung .map. Sie definieren eine Umgebung, in der ein oder mehrere bestimmte Spielmodi gespielt werden können. Sie sollen jedoch nicht die Regeln des Spiels ändern - diese werden durch den Spielmodus definiert.

Jedes Element in einer Karte entspricht einem Knoten in der Map-Datei. Es gibt eine Standardsyntax für allgemeine Dinge wie Spawnpunkte, Objekte und Fahrzeuge; für "spezielle", spielmodusspezifische Informationen müssen Sie jedoch Ihre eigene Syntax erfinden.

Example

Nehmen wir als Beispiel einen "Capture the Flag"-Gamemodus. Eine Karte für diesen Spielmodus muss hauptsächlich Spawnpunkte und Flaggenstandorte sowie eventuell Objekte und Fahrzeuge definieren. Eine vereinfachte Map-Datei könnte wie folgt aussehen:

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

Hier sehen Sie zwei MTA-Elemente - einen Spawnpoint und einen Pickup. Noch wichtiger ist, dass diese .map einen benutzerdefinierten "Flag"-Knoten hat, der die Position und Farbe der Flagge definiert. Der Spawnpoint und der Pickup können von bestehenden externen Ressourcen verwaltet werden, die benutzerdefinierten Elemente müssen vom Spielmodus verarbeitet werden.

Zusammengefasst: Wir wollen eine massenhafte Mappereingabe, wie wir sie in MTA:Race gesehen haben. Die Benutzer sollten das Gamemode-Skript selbst überhaupt nicht anfassen müssen.

Example of getting the .map information

Wie bereits erwähnt, muss dein Spielmodus benutzerdefinierte Elemente abrufen, die in einer Kartendatei definiert sind, und sie verarbeiten. Dies ist ganz einfach, wie unten gezeigt.

-- retrieve a table with all flag elements
local flagElements = getElementsByType ( "flag" )
-- loop through them
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" )
	-- create an object according to the flag position
	createObject ( 1337, posX, posY, posZ )
	-- output the team that we created a base for
	outputChatBox ( "Base for team " .. team .. " created" )
end

Die Funktion getElementsByType ruft eine Tabelle mit allen Elementen eines bestimmten Typs ab (der Typ entspricht dem Knotennamen in der .map-Datei). Dies funktioniert sowohl für benutzerdefinierte Typen als auch für eingebaute MTA-Typen (wie "vehicle" oder "player"). getElementData kann verwendet werden um die In diesem einfachen Beispiel wird ein Objekt an der Position der Flagge erstellt und eine Nachricht in der Chatbox ausgegeben. In der Realität muss man beim Laden der Karte natürlich noch mehr tun, wie in diesem Fall die Einrichtung von Kollisionsformen, um Spieler zu erkennen, die die Flagge einnehmen.


Map manager

Nach der Lektüre des obigen Abschnitts sollte klar sein, dass ein Spielmodus immer aus zwei Teilen bestehen sollte:

  • Die Spielmodus-Ressource, die immer die gleiche bleibt
  • Viele verschiedene Kartenressourcen, die dem Spielmodus kartenspezifische Informationen liefern

Anstatt nun für jeden einzelnen Spielmodus einen Map-Loader zu schreiben, bietet der Map manager Funktionen zum Laden von Spielmodi und Maps. Einfach gesagt, wenn man den richtigen Befehl eingibt (z.B. 'gamemode ctf ctf-italy'), werden die beiden Ressourcen 'ctf' und 'ctf-italy' gestartet und gleichzeitig ein Ereignis (onGamemodeMapStart) ausgelöst, das der Ressource 'ctf' mitteilt, dass eine Karte geladen wurde. Die 'ctf'-Ressource kann dann auf die in 'ctf-italy' enthaltenen Informationen zugreifen und mit dem Spawnen von Spielern usw. beginnen.


How to use the mapmanager

Um den Mapmanager-Dienst zu nutzen, muss die Gamemode-Ressource zunächst als solche gekennzeichnet werden. Genauer gesagt musst du das Attribut "type" der Ressource <info> Tag in der meta.xml auf "gamemode" setzen. Außerdem können Sie das Attribut "name" auf einen freundlichen Namen setzen (z. B. "Capture the flag"), der auf ASE anstelle des Ressourcennamens angezeigt wird.

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

Wenn Ihr Spielmodus benutzerdefinierte Karten laden wird, sollten Sie Handler für

  • onGamemodeMapStart
  • onGamemodeMapStop (if any unloading is necessary)

Diese werden ausgelöst, wenn eine Karte für Ihren Spielmodus gestartet oder gestoppt wird, und übergeben die Kartenressource als Parameter. In der Handler-Funktion für diese Ereignisse können Sie alle Informationen aus den Kartendateien und Konfigurationsdateien der Ressource extrahieren, die Sie benötigen.

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

Karten sind separate Ressourcen. Dadurch ist keine Bearbeitung der Gamemode-Ressource erforderlich, um eine benutzerdefinierte Karte zu erstellen, und Sie können auch kartenspezifische Skripte/Konfigurationsdateien mit ihnen packen.

Um eine Karte mit deinem Spielmodus kompatibel zu machen, öffne die meta.xml der Ressource und markiere sie ebenfalls: das Attribut "type" muss auf "map" gesetzt werden und das Attribut "gamemodes" muss eine durch Kommata getrennte Liste (ohne Leerzeichen) von Spielmodus-Ressourcennamen sein, mit denen die Karte funktioniert.

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

Sobald Sie alles eingerichtet haben, können Administratoren mit diesen beiden Befehlen "gamemodes" starten und stoppen: /gamemode gamemodeName [mapName] (optionaler Parameter für die Auswahl einer Anfangskarte, Standardwert: keine) /changemap mapName [gamemodeName] (optionaler Parameter, der den Spielmodus angibt, mit dem die Karte gestartet werden soll; Standardwert ist der aktuelle Spielmodus)

Map manager exportiert einige weitere Zugriffsfunktionen, die Sie nicht verwenden müssen, die aber nützlich sein können.

What else should you do

Es gibt mehrere andere Ressourcen, die von den Spielmodi genutzt werden sollten bzw. mit ihnen übereinstimmen.

Helpmanager

Der Helpmanager soll die Standardschnittstelle für Spieler sein, wenn sie Hilfe benötigen. Wenn du den Helpmanager benutzt, um die Hilfe deines Spielmodus anzuzeigen, weiß jeder Spieler, der den Helpmanager schon einmal benutzt hat (z.B. in anderen Spielmodi), sofort, wie er dorthin kommt. Er zeigt auch Hilfe für verschiedene Ressourcen an, die in einem Fenster laufen, falls nötig.

TEs gibt grundsätzlich zwei Möglichkeiten, den Helpmanager zu verwenden:

  • Stellen Sie einen einfachen Text zur Verfügung, der erklärt, wie Sie Ihren Spielmodus verwenden
  • Fordert ein GUI-Element vom Helpmanager an, das in einem eigenen Tab im Helpmanager-Fenster angezeigt wird und mit dem Sie beliebige GUI-Elemente hinzufügen können. Dies ist der empfohlene Weg für Spielmodi, die komplexere Informationen anzeigen müssen, die eine eigene grafische Benutzeroberfläche benötigen.

Lesen Sie die helpmanager help page, um zu erfahren, wie man das macht.

Scoreboard

Die Anzeigetafel zeigt die Spieler und Mannschaften an, die gerade im Spiel sind. Sie können ihr benutzerdefinierte Spalten hinzufügen, um kartenspezifische Informationen bereitzustellen. Zum Beispiel könnte die Spalte "Punkte" im Spielmodus "ctf" die durch Kills oder Eroberungen erzielten Punkte des Spielers anzeigen. Wie üblich finden Sie weitere Informationen in der scoreboard help page.

Map cycler

Der Map Cycler steuert, welche Spielmodi und Karten auf einem Server gespielt werden. Sie können z. B. festlegen, wie oft eine Karte hintereinander gespielt werden soll, bis zur nächsten Karte gewechselt wird. Um dies zu erreichen, müssen Sie dem Map Cycler mitteilen, wann Ihr Gamemode beendet ist (z. B. wenn eine Runde endet).