Mod mit GameScript erstellen

Willkommen in der Transport Fever Community

Wir begrüßen euch in der Fan-Community zu den Spielen Transport Fever und Train Fever, den Wirtschaftssimulatoren von Urban Games. Die Community steht euch kostenlos zur Verfügung damit ihr euch über das Spiel austauschen und informieren könnt. Wir pflegen hier einen freundlichen und sachlichen Umgang untereinander und unser Team steht euch in allen Fragen gerne beiseite.

 

Die Registrierung und Nutzung ist selbstverständlich kostenlos.

 

Wir wünschen euch viel Spaß und hoffen auf rege Beteiligung.

Das Team der Transport-Fever Community


Sie betrachten gerade eine ältere Version des Eintrags. Klicken Sie hier, um zur aktuellen Version zu gelangen.

  • Kurze Beschreibung, wie man einen Mod mit Game Script erstellen kann.

    Um eine Mod zu erstellen, die auf Ingame Events reagieren kann, muss man ein Game Script anlegen.


    Dazu erstellt man im Mod-Ordner einen Ordner /res/config/game_script


    Dort legt man dann die Datei modname.lua mit folgendem Grundgerüst an:


    handleEvent und update laufen im Game Thread, guiHandleEvent und guiUpdate laufen im Gui Thread.
    Man kann Daten von der Gui zum Script schicken mit game.interface.sendScriptEvent(id, name, param)

    Dabei drann denken, das dieses Event alle anderen aktiven GameScripte auch erhalten können.


    Die Funktion guiUpdate wird recht regelmäßig getriggert, muss noch herausfinden, ob bei jedem Tick.


    Ich werde mich jetzt erstmal weiter durch die Vanilla Files wühlen, um zu sehen, was man alles anstellen kann.




    GameScript State Handling (Eigenarten):

    save() und load() werden während eines Fames mehrmals (bei mir 3 mal) abwechselnd aufgerufen.

    Dabei wird save() aus dem Game-Threads angestoßen, in denen auch update() und handleEvent() ausgeführen wird.

    load() dagen wird im GUI-Thread aufgerufen, wie guiHandleEvent() und guiUpdate()


    Wenn ein Spieler sein Spiel speichert, wird zusätzlich save() mehrmals aufgerufen.

    Und wenn der Spieler ein Spiel startet, wird load() mehrmals ausgelöst, aber nur für die Game-Threads.



    Der Zustand innerhalb eines GameScripts kann nur durch die Wechselaufrufe von save() und load() vom Game-Thread zum GUI-Thread gelangen.

    Anders rum muss game.interface.sendScriptEvent() im GUI-Thread aufgerufen werden und dieser in handleEvent() dann im Game-Thread verarbeitet.

Teilen

Kommentare 1

  • Kann mir jemand ein Beispiel für diese Funktion schreiben "replaceVehicle"? Ich habe es mit CommonAPI2 getestet, aber ich konnte die Parameter nicht richtig angeben.

  • Habe den Eintrag mal umfassend überarbeitet, sortiert und einige Informationen hinzugefügt.

    Danke an alle für die bisherigen Infos :)

    Was save und load angeht, so bin ich mir mit der Angabe, dass diese 3 mal in einem Frame aufgerufen werden, unsicher. Ich hatte den Eindruck, dass save und load ähnlich wie update aufgerufen werden.

  • Hat jemand startEvent getestet? Wenn ich dieselbe Zeile verwende, die in TpF1 funktioniert, erhalte ich jetzt eine CTD in TpF2.


    Has anyone tested startEvent? When I use the same line that works in TpF1 I now get a CTD in TpF2.

    stdout.txt

    c:\build\tpf2_steam\src\game\scripting\interface.cpp:2320: auto __cdecl scripting::SetupInterface::<lambda_d632bb7827acf6d5147b617fa6d1eaa7>::operator ()(class lua::State &) const: Assertion `false' failed.

    • I have got a quick answer from UG and "startEvent" function is not supported for the moment.

  • War mal so frei und hab ein bischen was ergänzt :)

    Verständlichere Formulierungen und noch mehr Infos wären aber sich wünschenswert, damit kann ich aber leider erst mal nicht dienen.


    MFG PMV