Modding - Einsteigerfragen

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


  • Hallo zusammen,


    da mich TpF2 mittlerweise fasziniert, möchte ich mich auch mit dem Thema Mods mal näher beschäftigen.

    Obwohl da ja schon sehr viele tolle Sachen erschienen sind, fehlen mir immer wieder mal ein paar Kleinigkeiten – und da dachte ich mir, das wäre vielleicht mal ein guter Einstieg.


    Ok, jetzt gibt es ja das Modding-Wiki bei UG, da habe ich mir mal einen ersten Eindruck verschafft.

    Von LUA habe ich bisher absolut Null Ahnung, es scheint ein wenig wie Python zu sein, was ich aber auch nur als MicroPython für den ESP kenne.

    Meine letzten Programmier-Tätigkeiten waren Datenbank-Anwendungen mit VB6 und dem WinApi, und das ist über 10 Jahre her.

    LUA lerne ich also gerade, wobei das aber nicht so schwierig erscheint.


    Zum Thema Mod-Erstellung habe ich auf YT leider nur wenige Dinge gefunden, die sich irgendwie auch alle fast nur ums Modellieren drehen:


    Ein mehrteiliges Mod-Tutorial von Mariotator, was schon mal sehr hilfreich war.


    Ein ähnliches Mod-Tutorial der Mod-Werkstatt.


    Und ein Tutorial von Badgerrhax, in dem zumindest etwas auf de Script-Teil eingegangen wird.


    Blender habe ich drauf, Gimp sowieso, angesprochene Tools (Converter, etc.) gibt es scheinbar leider nur für Windooze (was mir nie wieder auf einen Rechner kommt).


    Dank des guten Tutorials von Mariotator habe ich mit Blender auch schon ein paar brauchbare Ergebnisse produziert.

    Mit den Texturen übe ich noch, das ist nicht immer das, was ich mir vorstelle, aber auch da gibt es Fortschritte.


    Gibt es irgendwo noch gute Tutorials, die gerade auf den Script-Teil näher eingehen?


    Ich habe mir ein paar Mods mal intern angesehen, aber kaum was verstanden, von dem was da steht.

    Das Mitlesen hier im Forum bringt zwar immer wieder neue Erkenntnisse, was machbar ist und was nicht.

    Nur in Sachen der Scripts bringt mich das leider auch nicht weiter.


    Gut, so einfache Assets, das würde ich vielleicht irgendwie hin gefrickelt bekommen.

    Aber alles, was darüber hinaus geht, gerade auch mit Parameter und so, erschließt sich mir leider nicht wirklich.


    Es tauchen auf immer wieder zwei Dinge auf, der ParamBuilder von VacuumTube und das CommonApi(2) von eis_os.


    Der ParamBuilder scheint das Frontend für die Parameter bereit zu stellen, wie ich diese dann aber nutze, ist mir immer noch nicht klar.


    Und bei CommonApi(2) ist mir nicht klar geworden, wann und wozu ich das genau nutze(n kann).


    Für den Anfang würde es mir schon reichen, wenn ich irgendwie lernen kann, wie ich für ein Objekt die Texturen auswählbar mache und wie ich das Objekt skalieren kann.

    Also quasi so, wie die Siri das in ihren Gebäude-Mods gemacht hat. Wenn ihr jetzt sagt "hey, das ist für den Einstieg ziemlich viel.",


    Wäre echt super, wenn ich hier den ein oder anderen Anhaltspunkt bekommen könnte, wie ich diese Script-Sachen genau angehen muss.


    LG

    der HaJu

  • Ich weiß nicht genau was du vorhast.. Es klingt als würdest du Modelle via Konstruktion ins Spiel bringen wollen.


    Lua und Scriptmodding decken ja aber noch viel mehr ab. Wie du gemerkt hast, gibt es dafür keine wirklichen Tutorials. Das muss man sich größtenteils durch andere Mods und Trial and Error erlernen. Das wiki ist dennoch ein guter Startpunkt, weil es eine gute Übersicht über die Modding Möglichkeiten gibt.


    Vielen hilft es, in andere Mods zu schauen und an Beispielen zu lernen. Such dir einfach Mods raus, die du schon benutzt und verstehe, wie die funktionieren. Hier gibt es allerdings das Dilemma, dass kleinere Script Teile von Moddern, die wenig mit Lua machen, manchmal unnötig kompliziert sind und so manchmal die Fehler von anderen kopiert werden - auf der anderen Seite sind umfassendere Script Mods oft schwer für Einsteiger zu durchblicken, weil Script Modder den Code mit eigenen Funktionen optimieren (was langfristig den Code besser macht).


    Zum Lua lernen: https://www.lua.org/pil/contents.html

    Lua hat seine Eigenarten und ist manchmal etwas umständlich, aber wenn man damit klarkommt, ist es gar nicht schwer. Grundprinzip: alles ist eine Table, also eine Art dict, was Lua aber auch als Array nutzt.


    Der ParamBuilder ist ein Interface für Parameterdefintionen und die Ermittlung vom ausgewählten Wert in der updateFn. Man sollte schon wissen wie Parameter funktionieren: https://www.transportfever2.co…ding:constructionbasics&s[]=parameter

    Man kann damit die interne Darstellung als Integer umgehen und direkt die Werte nutzen um die es eigentlichen geht (Strings, Dateinamen, ...)


    Texturen auswählbar heißt mehrere Modelle, schätze ich. Skalierung ist eines der meist gemachten Dinge, daher schau einfach wie andere Mods das machen. Manche beschreiben die Transf Matrix direkt; der saubere Weg ist, die Scale Funktion der transf.lua zu benutzen.

  • Das Modding-Wiki ist knapp aber gerade eben so ausreichend - man muß aber mehrmals lesen und dahinterkriechen, was die Leute meinen. Wichtig ist erst einmal, daß Du verstehst, wie die einzelnen Komponenten einer Mod zusammenarbeiten:

    - Die "Steuerzentrale" ist meist die .con-Datei. Das Spiel klappert anfangs alle Mods ab und sammelt (u. a.) alle .con-Dateien. In der .con gibt es die Funktion data(), die bei dieser Gelegenheit ausgeführt wird. Dort definierst Du allerhand Daten für die Mod, die Parameter und eine updateFn, die jedes Mal ausgeführt wird, wenn ein Modell am Mauszeiger hängend angezeigt werden soll oder tatsächlich gebaut oder modifiziert wird. In dieser werden die Modelle hingestellt.

    Die Modelle werden in der .mdl-Datei definiert, und diese greift für das Mesh auf die .msh und .msh.blob zu, sowie für die Textur auf die .mtl-Dateien, in ihren jeweiligen Ordnern unterhalb von res/model.

    Die .mtl-Datei greift wieder auf die Texturen zu.


    Dann gibt es noch die mod.lua, die notwendig ist, meistens aber nur allgemeine Daten liefert (mit der runFn und der postRunFn kann man auch mehr machen, aber das ist für Fortgeschrittene - versuche am Anfang nicht die Mods zu untersuchen, die damit herumspielen).


    Für die Lokalisierung (=Übersetzungen) gibt es noch die strings.lua. An Deiner Stelle würde ich sie gleich anlegen, sonst jagst Du dauern irgendwelchen noch nicht übersetzten Strings hinterher. Die Anwendung ist einfach: Jeder String, der irgendwie im Spiel angezeigt werden soll, wird in der .con (oder wo er sonst aufgerufen wird) in _() eingepackt, also z. B. _("adfasd"). Wenn dieser String in strings.lua unter der vom Spieler eingestellten Sprache zu finden ist, wird die Übersetzung angezeigt, sonst der String.

    Mit

    Code
    en = {
    adfasd = "Intelligent Example",
    },
    de = {
    adfasd = "Intelligentes Beispiel",
    },

    bekommst Du auf Englisch "Intelligent Example", auf Deutsch "Intelligentes Beispiel" und auf Hebräisch oder Französisch "adfasd" im Spiel angezeigt.


    Vom CommonAPI würde ich für den Anfang auch die Finger lassen, selbst wenn das Teil nützlich ist. Der ParamBuilder ersetzt das manuelle Füllen der Parameter-Struktur in der .con durch einen Funktionsaufruf mit gleich vielen Parametern. Bei der ersten Mod ist es besser, das zunächst zu Fuß zu probieren, damit Du ein Gefühl dafür bekommst, was der ParamBuilder machen soll. Ob Du ihn dann hinterher benutzt, ist Deine Sache.

    13! = 13*12!

  • Hallo nochmal,


    vielen Dank VacuumTube für den Link zur LUA-Anleitung, die ist doch deutlich besser als das, was ich da hatte.

    Nachdem ich mich nun etwas mehr mit LUA beschäftigt habe, merke ich auch, wo meine Probleme liegen.

    Es sind zum einen die fehlenden Deklarationen, die ich sonst kenne und vieles einfacher machen.

    Auch diese "Typenlosigkeit" der Variablen ist nicht meine Welt. Irgendwie kann jede Variable alles sein - gruselig.


    Bei den verschiedenen Mods, die ich mir so ansehe, stelle ich fest, das mancher Code wirklich kaum zu verstehen ist, bei ein paar anderen habe ich inzwischen zumindest eine Ahnung davon, was da im Hintergrund so passiert. Ich denke, an diesen werde ich mich erstmal orientieren und sehen, was ich da zustande bekomme.


    Die Einträge im Wiki hatte ich größtenteils mal durchgelesen, aber einiges wohl noch nicht verstanden, bzw. falsch verstanden. Da werde ich also auch nochmal reinschauen.


    Sehr hilfreich ist für mich auch die ausführliche Erklärung von Rutel, vielen Dank dafür, das hat mir Licht ins Dunkel gebracht. Ich war der Ansicht, das alles an der mod.lua hängt und habe immer nach den Zusammenhängen zu den Modellen gesucht. Jetzt weiß ich aber, das eigentlich die .con-Dateien der Dreh- und Angelpunkt sind und die mod.lua eigentlich "nur" den Eintrag als Mod erzeugt und Metadaten liefert. Das hat mir beim Verstehen der Code-Scripte auch gut geholfen.


    Insgesamt hatte ich mir das wohl etwas zu einfach vorgestellt und wollte das Thema schon beenden.

    Aber jetzt bin ich angefixt, so langsam ergibt das alles einen Sinn und ich glaube, mit ein wenig Vertiefung in das Thema komme da schon noch hin.

    Nur die Sprache LUA ist mir noch ziemlich ein Graus, ich spiele jetzt erstmal mit dem Interpreter herum, um da ein wenig rein zu kommen.


    Ich denke, ich übe jetzt erstmal ein wenig, und wenn ich noch Fragen habe, komme ich noch mal hier vorbei.


    Vielen Dank euch beiden!


    LG

    der HaJu

  • Die "Typenlosigkeit", bzw. auf neudeutsch duck typing, ist mir auch ein Graus. Der Programmierer spart sich ein Wort und jeder, der den Code benutzen will, muß sich durch -zig Dateien und tausende Zeilen wühlen, bis er weiß, was wirklich in ein Funktionsargument geschrieben wird. Aber das ist in Python auch nicht besser. Da braucht es keinen Obfuscated Code Contest mehr, das ist schon eingebaut.

    13! = 13*12!

  • Große c++ Projekte außerhalb bestehenden APIs sind auch nicht besser.


    LUA ist aber im Gegensatz zu anderen Sprachen extra kompakt und einfach aufgebaut.


    Zu beachten gilt noch, bzw. Stolpersteine von anderen Sprachen:

    LUA Array Index beginnt bei 1.

    Da TPF2 aber in C++ geschrieben ist, nutzt es halt 0, zum Beispiel bei API aufrufen oder wenn du zum Beispiel terminals baust.


    LUA Tabellen sind immer Referenzen. (ggf. bei komplexen Code wichtig, in seltenen Fällen braucht man ein deepcopy)


    Man muss sich entscheiden, wenn eine Tabelle ein Array sein soll, müssen die Keys 1..x fortlaufend sein. (ipairs läuft sonst nicht!)

    Man kann beides in eine LUA Tabelle stecken, da rate ich aber von ab.


    Dateinamen Plattformunabhängig gestalten:

    Daher keine Unicodezeichen oder Umlaute in Dateinamen verwenden und Groß und Kleinschreibung beachten. Linux, Mac Nutzer werden es dir danken.


    Um die Fehlersuche zu erleichtern, Dateinamen so gestalten, das man dich als Entwickler wieder finden kann. Damit vermeidet man dann auch Probleme von gleichen Dateinamen in verschiedenen Mods.

  • Hallo eis_os,


    der Tipp mit dem Array Index hat bei mir gerade schon wieder ein Problem gelöst, da hatte ich nämlich Schwierigkeiten, im Interpreter hatte ich was getestet und es lief, bei meinem Mod-Versuch dann leider nicht. Aber das ist wirklich nur der Index - krass - Danke!


    Das mit den Dateinamen und so kenne ich als leidgeprüfter Linux-Anwender nur zu gut...


    LG

    der HaJu

  • Hallo nochmal,


    ich habe leider noch ein Problem mit dem Model Editor, ich habe die entsprechende Datei gemäß Anleitung erstellt und korrekt befüllt, wenn ich aber die ModelEditor.sh starte, passiert genau -> gar nichts!

    Keine Fehlermeldung, nichts. Ich lande wieder am Prompt und das war's. Ich finde auch nichts in der Prozessliste.

    Hat jemand einen Tipp, wo ich hier ansetzen könnte?


    LG

    der HaJu

BlueBrixx