Diese Seite wurde maschinell übersetzt, sie kann einige Ungenauigkeiten enthalten. Du kannst helfen, indem du eine Übersetzung beisteuerst, alternativ kannst du zur englischen Version.

Neue Skriptfunktionen#

Dies funktioniert nur auf T6 & IW5.

Für IW5 sollten Sie Karten-/Spieltypskripte in einem mp Ordner (So, scripts/mp/mp_rust/myGsc.gscoder scripts/mp/dm/myFfaGsc.gsc)

Erste Schritte#

Dieses Thema dient als Ressource für diejenigen, die wissen möchten, welche Skriptfunktionen / -verbesserungen verfügbar sind und welche als bevorstehend bestätigt wurden.

In diesem Thema wird erläutert, wie die derzeit vorhandene GSC-Funktion replaceFunc() vor einiger Zeit hinzugefügte Werke und gehen Sie auch detailliert darauf ein, wie benutzerdefinierte Skripte funktionieren.

replaceFunc() Übersicht#

replaceFunc() ermöglicht es einem Skripter, jede Skriptfunktion aus einem Standardskript durch eine eigene Version zu ersetzen. Das Konzept ähnelt der Funktionsweise eines Funktionszeigers bereits, aber replaceFunc() funktioniert mit jeder Funktion, unabhängig davon, ob sie als Funktionszeiger aufgerufen wird oder nicht.

Die primäre Verwendung wäre die Änderung einer Kern-Gameplay-Mechanik, die von GSC gesteuert wird, und die einzige Möglichkeit, dies normal zu tun, besteht darin, das gesamte Skript zu überschreiben, auch wenn Sie nur ein oder zwei Funktionen ändern müssen.

replaceFunc() funktioniert folgendermaßen:
Zum ersten Argument ist genau die Funktion, die Sie ersetzen möchten.
Es kann eine Funktion in jedem Skript sein, das derzeit vom Spiel geladen wird (daher müssen kartenabhängige Skripte auf eine etwas andere Weise überschrieben werden).
Es kann auch eine Funktion im selben Skript sein.

Zum zweiten Argument ist die Funktion, die das Spiel anstelle der Stock-Funktion aufrufen soll.
Es hängt wahrscheinlich von der Art der Funktion ab, die Sie ersetzen möchten, dass Sie die neue Funktion auf der Funktion basieren müssen, die Sie ersetzen, um die Wahrscheinlichkeit zu minimieren, dass Probleme auftreten.

Wenn es in einem Skript verwendet wird, würde es so aussehen:

main()
{
    replaceFunc( common_scripts/utility::flag_set, ::flag_set_with_print );
}

flag_set_with_print( flagname )
{
    print( "Flag set: " + flagname );
    level.flag[ flagname ] = 1;
    level notify( flagname );
    common_scripts/utility::set_trigger_flag_permissions( flagname );
}

Wenn nun ein Flag durch den normalen Aufruf gesetzt wird, ruft es stattdessen unsere Funktion auf und gibt den Namen des gesetzten Flags aus.
Dies ist natürlich nur ein Beispiel für das Ersetzen einer einfachen Utility-Funktion, um ein besseres Verständnis der Reihenfolge zu haben, in der Flags zu einigen Zeiten gesetzt werden können (was ein großer Teil der Logik bei Zombies ist).

Übersicht über benutzerdefinierte benannte Skripts#

Sie fragen sich vielleicht: "Warum verwendet dieser Beispielcode ein main() anstelle eines init()?"

In Verbindung mit ReplaceFunc() ist es nun möglich, vollständig benutzerdefinierte Skripte unabhängig von Standard-Skripten zu erstellen.
Es ist nicht mehr notwendig, Skripte wie _clientids oder _development_dvars.
Zusätzlich ReplaceFunc() muss ausgeführt werden, bevor eine Funktion ausgeführt wird, da sonst die gewünschten Änderungen niemals auftreten würden.
Daher haben benutzerdefinierte Skripte ein main() für diesen Zweck.
Sie können ReplaceFunc() eine beliebige Funktion in der main() eines benutzerdefinierten Skripts, da benutzerdefinierte Skripthauptbücher immer vor allen Standardskripten ausgeführt werden.

Dies bedeutet natürlich, dass Sie aufgrund dieser Ladereihenfolge ändern müssen, wie Ihr Code funktioniert, oder?
Tatsächlich haben benutzerdefinierte Skripte neben einem main() auch ein init(), das das Spiel automatisch aufruft, nachdem die Spieltyplogik gestartet wurde.
In der Tat ist es ungefähr die gleiche Zeit wie _clientids::init() heißt.

Wenn Sie dies wissen, können Sie dies verwenden main() Um jede Art von Logik einzurichten, die Sie initialisieren möchten, bevor das Spiel normalerweise ausgeführt wird.
Dann können Sie auch init() Um bestimmte Variablenwerte zu überschreiben und anderen Code zu verwenden, a _clientids::init() würde normalerweise enthalten.

Nachdem ich nun die Grundlagen dieser beiden Funktionen gründlich erklärt habe, werde ich auf jede Eigenart oder potenziell nützliche Information eingehen. ReplaceFunc() und benutzerdefinierte Namensskripts.

ReplaceFunc() Besonderheiten#

Nun, während ich zuvor gesagt hatte, können Sie jede Funktion mit dieser GSC-Funktion ersetzen, die nicht vollständig genau ist.
Sie können keine Funktion ersetzen, die direkt vom Modul aufgerufen wird, z. B.:

  • Alle Funktionen, die mit CodeCallback_
  • Jegliche main() in einem Skript mit demselben Namen wie die Karte
  • Jegliche main() in einem Skript mit demselben Namen wie der Spieltyp
  • Eine Exklusivfunktion für Zombies namens gamemode_callback_setup() befindet sich auch im mapname.gsc.

Sie können diese Einschränkung umgehen, indem Sie das gesamte Skript überschreiben, indem Sie es in demselben Unterpfad platzieren, den es erwartet. storage/gamename/, oder das Überschreiben aller aufgerufenen Funktionen.
Zum Beispiel, wenn Sie ersetzen möchten maps/mp/gametypes/_globallogic.gsc der Weg wäre storage/T6/maps/mp/gametypes/_globallogic.gsc.

ReplaceFunc() MUSS immer aufgerufen werden, bevor die Funktion, die Sie ersetzen möchten, aufgerufen wird, da sie sonst keine Auswirkungen hat.
Verwenden Sie daher immer ReplaceFunc() in einem main() eines benutzerdefinierten Skripts.

Besonderheiten benutzerdefinierter benannter Skripts#

Benutzerdefinierte Skripts können auch effizient organisiert werden.
Jedes Skript, das das Spiel analysiert, enthält auch seine Enthält, solange sie sich im selben Ordner oder einem Unterordner dieses Ordners befinden.
Auf diese Weise können Sie Dienstprogrammskripts erstellen und Ihre Skripts in kleinere Skripts in Unterordnern aufteilen.
Sie können beispielsweise einen Unterordner mit dem Namen custom_perks in scripts/zm und darin haben verschiedene Skripte, die die Attribute und Funktionen eines benutzerdefinierten Perks definieren.
Um diese Funktionen in diesen Skripten aufzurufen, fügen Sie dann ein Include in eines der Skripte im zm-Ordner hinzu, das in etwa wie folgt aussieht: #include scripts/zm/custom_perks/flopper; und dann könnten Sie Funktionen daraus aufrufen.
Skripten main() oder init() In benutzerdefinierten Unterordnern sind NICHT vom Motor automatisch aufgerufen. Jedes Stock-Skript kann auch in benutzerdefinierte Skripts eingeschlossen werden.
Ein Benutzer kann Skripts auch in scripts/zm/mapname für Skripte, die nur automatisch von der Engine aufgerufen werden, wenn diese Karte geladen wird, oder auch in scripts/zm/gametype nur dann automatisch von der Engine aufgerufen werden, wenn dieser Spieltyp geladen wird.
Nur Skripts auf Stammebene werden vom Modul in diesen Unterordnern aufgerufen.

Die spezifische Ladereihenfolge für neugierige Personen funktioniert folgendermaßen:

- custom_scripts::main()
- gametype::main()
- mapname::main()
- gametype start (_callbacksetup::startgametype)
- custom_scripts::init()