Beiträge von eis_os

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


    Das wäre bei CommonAPI2 ggf. busMaybeTramOnly wenn CommonAPI2 läuft.

    Dann fährt weder ein Auto noch ein LKW drüber. Das ist dann ne echte ÖPNV Spur. Hilfreich für Bushaltestellen, dann fahren die LKWs dran vorbei...


    https://commonapi2.bytetransfe…ts?id=laneconfigcommonapi

    Wobei trainOnly ein split bekommt, damit Industriegleise dann nicht mit der E-Lok befahren werden...


    UG filtert die transportModes da etliche Kombinationen zu erheblichen Crashs führen.


    Um eine Linie zu zeichnen, brauchst aber nix an transportModes zu ändern...

    https://wiki.transportfever2.c…g:tracksstreets#materials

    Da ich meinen eigenen Dampf Client API geschrieben habe, hab ich gute Chancen das ich das nicht schlimmer mache als es gerade ist und ich weiß was ich tue ;)


    Der ModHub ist das neue Teil Ingame ModBrowser. Ich kann mir auch denken warum UG das so gemacht hat, um oben Links eine % Anzeige darzustellen.

    Laut SteamSDK Beschreibung kann man sonst nur auf eine Status Änderung via callback reagieren.
    Das wäre https://partner.steamgames.com…ISteamUGC#ItemInstalled_t


    Ich kann gefahrlos modhub::SteamModHubBackend::Init::lambda_fn(mdata); aus dem Spiel entfernen, bzw. das Interval ändern.
    Man bekommt halt kein Feedback bzw. erst wenn man im Menü wieder ist oder nur alle X ms. Wie ich schon oben ausgeführt habe, hat das keine ModRep Verbindung,


    Quasi macht die lambda Funktion nichts anderes als ständig die Steam API nach der Liste:

    • Mutex
    • ISteamUGC->GetNumSubscribedItems()
    • Vector allozieren für die IDs
    • ISteamUGC->GetSubscribedItems()
    • Mutex
    • SteamModHubBackend->flathashmap reallozieren
    • Für alle IDs dann:
      • ISteamUGC->GetItemState()
      • ISteamUGC->GetItemInstallInfo() ggf. Progress?
      • Alle die Daten in eine flathashmap schreiben


    D.h. es muss dann nach jedem Durchlauf mindestens 8 Bytes * ModIds für die Ids alloziert werden im Thread

    Via TCP müssen mindestens jeweils ein Datenpaket zum SteamClient gesendet werden, und die Daten dann abgeholt werden.


    Bei 2000 Mods hast dann schon mal 2002 Roundtrips zum Kernel, lecker.. Ach und GetItemInstallInfo holt auch den Pfad ab, wenn wir den bei 512Bytes einstellen, haben wir dann alle 200 ms 1MB durch den Kernel gejagt für nicht Spielrelevantes.






    Außerdem, gibt es für alle solche Sachen einen Schalter in CommonAPI2, man muss den Fix nicht aktivieren, wenn man nicht möchte.

    Keine Ahnung ob sie einen Bugreport haben wollen, manche Nutzer hatten einen Erfolg.


    Ich hab mir das mal näher angeschaut und UGs Code funktioniert so:


    disableSleep = 1 im Hauptmenü und wird im Spiel 0, d.h. UG bremst den thread per nanosleep aus.
    Wenn ich da bei Sekunden ne 2 ms machen, mein 8600G ist mit den par Kb unterfordert so das man nix im Spiel merkt...


    Ob das daher Spiel relevant ist, keine Ahnung. Es könnte sein, wenn man viele Mods im Abo hat, das sich das dann doch summiert.

    Wer Linux und CommonAPI2 nutzt und alle 200ms ein Frame Einbrauch verzeichnet, dem könnte ich ggf testweise einen Patch dafür schreiben, das im Spiel nur noch nanosleep ausgeführt wird.


    Alternativ Versuchsweise, dieses im Speicher / TransportFever

    48 C7 45 D0 00 00 00 00 48 C7 45 D8 00 C2 EB 0B

    durch dieses hier ersetzen:


    48 C7 45 D0 14 00 00 00 48 C7 45 D8 00 C2 EB 0B

    Das würde dann nanosleep 20ms warten lassen..


    -edit-

    PS: Das passiert natürlich nur mit der Steam Version. Wie viele Mods Ihr im Spielstand aktiviert habt ist unerheblich. Die Anzahl der im Workshop abonnierten Mods ist ausschlaggebend. Sprich auch eine leere Map ohne Mods. (Wie am Anfang, hat man dann halt ~8MB/s zusätzlichen Traffic intern. (Also Loopback zurm Steamclient, nicht nach außen)

    Dieses ist eine Testversion, gerade bei traintracksonstreets ist ein Backup des Spielstands zu machen.

    Mir geht es in letzter Zeit nicht so gut, daher erwartet bitte keine Support Leistung. (Bleibt halt bei der normalen Download Version)


    This is a test version , specially traintracksonstreets should be only used with a savegame backup

    I am not that healthy in the moment, please don't expect support.


    Stabile Version, stable version 1.9.20251010 is here:

    CommonAPI2 Download



    1.9.20260315-dev

    - fix CGameTime::GetGameTime1 animation stuttering on windows (bascule bridge)

    - fix and enable old CommonAPI user filter settings for tracks and streets

    - FlexStreets: add extradataCommonAPI for StreetType to access extradata in postRunFn (sol2 wrappers)

    - FlexStreets: add setting traintracksonstreets (requires FlexStreets)

    - FlexStreets: add support for own materials streetTrain, streetTrainTrack, crossingStreetTrain

    - FlexStreets: simplify StreetGeneratorOverlay, add train tracks to street transition, add crossingTrainTrack materials in overlay

    - FlexStreets: simplify ExtraMaterial, change memory layout, so it can be used as StreetTypeMaterial

    - rename setting flexstreetstracks to traintrackcatenary

    - add commonapi.supports.TRAINTRACKSONSTREETS

    - inspect window: BASE_EDGE_STREET: add api.res.streetTypeRep.get to console when pressing street type

    - inspect window: show MOVE_PATH entries

    - inspect window: add MOVE_PATH_AIRCRAFT(hidden)

    - Show currently run postRunFn mod when verbosity setting is debug

    - streetTerminalCommonAPI openDoors = left: try to use right animation if left animDuration is zero



    Wenn ich irgendwann dazu komme, werde ich versuchen das neue Straßenpaket dann auch noch anzuhängen ... (heute aber unwahrscheinlich)


    -edit-

    Entfernt wegen neuer Version / Removed because of new version

    Also ich hab mal ein pcap (nur während des Spiels) in Wireshark geladen, das sieht mir während des Spiels nach einer Workshopliste aus. Zumindest das große Datenpaket.


    Die ModRep hat ne std::list<std::pair<int, std::string>> m_workshopId2path; Liste, also daher sollte es nicht kommen.


    Spaßeshalber hab ich - da ich Puzzle liebe - mal ein commonapi._native.dampf.getMods() gemacht,

    und finde so auch die Daten TCP Steam wieder, wie Timestamp oder sizeOnDisk

    Code
      {
        folder = "/ZEUGS/Games/Steam/steamapps/workshop/content/1066780/1957631242",
        handle = 1957631242,
        sizeOnDisk = 9996549,
        timestamp = 1676107902,
      },


    Sprich es gibt vom Anschein nach zumindest bei mir hier ein regen Datenaustausch zwischen Steam Ciient und Steam API im Spiel.

    Ob das durch UG verursacht hat, keine Ahnung.


    Wireshark:

    () = WorkshopID (bzw. Handle)
    {} = sizeOnDisk

    [] = timeStamp





    -edit-


    Bin mir nun ziemlich sicher woran es liegt. Es liegt an dem neuen ModHub von UG.

    Keine Ahnung was UG sich dabei gedacht hat... da gibt es halt einen Thread der ständig die Steam IPC nutzt um die ModHub Daten zu füttern.

    Nur der Thread läuft auch während eines Spiels.


    Urban Games macht halt Urban Games Sachen... ||

    Ihr versteht schon, das LO Interface der Loopback Adapter ist um TCP Verbindungen zwischen Userprozesse zu ermöglichen.


    Naja, ein dump wäre nur aussagekräftig während des Spiels.
    Während man im Hauptmenü ist, lädt TPF2 ja ggf. noch Mods per Workshop herunter, der Traffic wäre also normal. Auch das an der Stelle TPF2 nach dem Mapping zwischen IDs und Dateipfade macht.

    (Das macht CommonAPI2 ja auch sobald ne neue Liste von Mods irgendwie aktiv ist)


    Bei einer Mod wird halt an verschiedenen stellen, auch in der CommonAPI2 schlussendlich eine Funktion aufgerufen, die aus der Workshop ID dann den Pfad erstellt. Das macht im Endeffekt dann die Steam API schlussendlich.

    Ich könnte da wohl via CommonAPI2 einen Cache einbauen, keine Ahnung ob das sinnvoll ist. Aber was ich nicht verstehe, warum es keine Änderung zwischen einen Savegame mit Mods und ohne Steam Mods gibt.


    Unter Einstellungen mal den Debug Modus von UG abstellen, speichern und Spiel komplett neu starten. (wichtig! und dann den traffic anschauen.)


    Die UG LUA Console hat auch ne Funktion die irgendwie ne Modliste nutzt, ggf. gibt es dort Probleme,

    Im Hauptmenü oder im Spiel?


    Es könnte intern die Nachfrage bei File IO sein, sprich Mapping zwischen dem virtuellen Filesystem und dann zu einem bestimmten Steam Mod. (Workshop ID zum Verzeichnis Nachfrage)


    Dann gäbe es noch die Steam Achievements...

    Meine Mini Testmap mit CommonAPI2 zeigt da so 179KiB/s da gerade an.


    Wird es denn weniger wenn du ein Spielstand ohne Workshop Mods startest?

    Hallo


    Wer mit api.type.ConstructionDesc.new() eine dynamische Konstruktion in der postRunFn erstellen möchte, wird vielleicht feststellen,

    das die Funktion für preProcessScript als erstes Funktionsparameter auch capturedParams enthält.


    Dies halte ich für einen Fehler / Bug seitens Urban Games. Das müsste als zusätzliche Funktionsparameter übergeben werden.


    Das setzen von preProcessScript ist zwingend erforderlich, sonst kann man eine ConstructionDesc nicht hinzufügen.

    Im Gegensatz ist preProcessFn in einer con nicht zwingend erforderlich und wird auch nicht benötigt wenn man eine vorhandene con Datei in der postRunFn via api ändert.


    Konvertiert man seine normale funktionierende con also in eine dynamisch komplett erzeugte erhält man einen Crash bzw. internal error am cursor:



    Ihr müsst modules.capturedParams = nil setzen, Beispiel:


    Code
    preProcessFnScript = function(modules, change)
        if change.added then
            modules[change.slotId] = change.module
        else
            modules[change.slotId] = nil
        end
        modules.capturedParams = nil
        return modules
    end


    Ich habe keine dementsprechende Information in der Dokumentation von TPF2 gefunden.

    https://wiki.transportfever2.c…uction_postRunFn.lua.html


    Wenn Ihr sie findet, hab ich vielleicht Tomaten auf den Augen oder UG hat die Doku geändert :D

    Einfach eine leere Tabelle oder nil bei preProcessScript zurückgeben, wird nicht funktionieren, da man dann keine Module mehr bauen kann.


    Da der Fehler eher nichtssagend ist und ich daher mein ganzes Script debuggen musste,

    vielleicht stolpert ja in Zukunft jemand über diesen Beitrag und diese Info ist bei der Entwicklung eines Mods hilfreich.



    PS: Nein, das hab ich nicht an UG gemeldet.

    Früherer versuche UG zur Dokumentation zu bewegen sind immer gescheitert, ggf. erhält man diese Info wenn man sie kontaktiert... (das ist aber nicht hilfreich für alle anderen Modder)

    Eigentlich nö, aber du kannst natürlich auch 123 als fileName nehmen, das wäre aber für Lua auch egal, schauen wir mal:

    Code
    >> commonapi.dmp(api.res.trackTypeRep.getAll())
    {
    [0] = "eis_os_1000mm.lua",
    [1] = "eis_os_1000mm_5_5m.lua",
    [2] = "eis_os_750mm.lua",
    [3] = "high_speed.lua",
    [4] = "standard.lua",
    <metatable> = <__name: sol.std::map<int, std::__cxx11::basic_string<char> >>
    }

    Das ist eine c++ std::map<int, std::::string> (Schlüssel können nur int annehmen, die Werte sind immer ein std::string, und daraus wird halt ein lua string)

    postRunFn mit dynamischen Gleisen funktioniert genauso wie alle Repository Funktionen via Dateinamen zu ID Mapping.

    Das ID Mapping übernimmt UG intern. Beachtet, es können ID Lücken entstehen... (sprich getAll ist nicht mit ipairs zu nutzen)


    repository.add(fileName, resource, visible)


    Wichtig ist, bei fileName etwas eindeutiges zu vergeben. Dieser sollte trotzdem, wie ein echter Dateiname keine obskuren Zeichen beinhalten...

    Sollte ein Dateiname schon vergeben sein, wird TPF2 crashen, mit einem "duplicate Name" error. Typisch wird einem der Dateinamen natürlich nicht gesagt... :rolleyes:


    Also repository.find nutzen, ist das Teil schon da?


    Intern hat jedes repo eine m_name2index. Die eigentlichen Einträge werden in der Regel intern mit ids angesprochen und liegen auch in einem std::vector.

    Alternativ via (file)Name zum Beispiel wenn die Daten von einer Konstruktion kommen. Irgendwann wird aber trotzdem dann gemappt.



    Randnotizen:


    Die postRunFn Id kann sich auch von der im schlussendlich im Spiel befindlichen id unterscheiden.


    Alle Texturen müssen für Straßen vorgeladen werden.

    Das war früher anders und UG hat dieses dynamisch gemacht. Nachteil war, hat mein eine kaputte Straße gebaut, gab es dann einen Crash...


    Bei Brücken errechnet beim Bau wohl für jeden möglichen Brückentyp die Kollisionen. Daher bitte keine X Brücken hinzufügen....


    Mit CommonAPI2 erhält man ggf. mehr Informationen (Teile die UG nicht gemappt haben, bzw. bald auch extra Daten der CommonAPI2 für Straßen zumindest.)

    Da ist ein Ausrufezeichen, bitte schaue wie und wo NEP2 installiert wurde, ggf. hast du einen Ordner in Ordner


    Nep bekommst du hier:

    Natural Environment Professional 2



    mods\unixroot_natural_environment_pro_tpf2_2\unixroot_natural_environment_pro_tpf2_2\


    Es darf aber nur so sein.

    mods\unixroot_natural_environment_pro_tpf2_2\


    Das Addon benötigt eine richtig installierte Version von NEP2 und ist nicht ohne den Basismod lauffähig.


    Schau erst, das NEP2 wieder von TPF2 erkannt wird.

    Auch wenn sich verschiedene Bahnhöfe überschneiden visuell, eine Komponente kann nur einer Entity gehören.

    Ich wüsste auch nicht -bis auf Speicherfehler - wie eine Komponente von zwei Entities genutzt werden können.


    TPF2 meckert hier das ein Teil fehlt. Wobei die BaseNode 172033 von den Komponenten richtig aussieht.


    Gibt es in der Nähe von 172033 irgendwelche NodeEditor Daten? Wobei dieses Lageabhängig wäre und keine weiteren Bahnhöfe beeinflussen könnte...


    Wurde der Bahnhof ggf. mal verschoben mit irgendwelchen Tools?


    Im Inspektor von CommonAPI2 für 172033 kannst du da ein bzw zwei Tracks auf der Karte finden?

    D.h. Unter BaseNode -> Tracks:

    Müssten dann für die meisten Nodes zwei Gleise auffindbar sein mit dem Auge Symbol.

    Vielleicht ist eine Base Edge abhanden gekommen, auch da wäre mir kein Weg bekannt, dieses zu Triggern...

    Ohne CommonAPI2 probieren.


    Das sieht komisch aus:

    commonapi2.utils: cannot open A:/SteamLibrary/steamapps/common/Transport Fever 2/mods/Gebäude_ElevatedStation_1/res/config/track/zzz_mock_elevated_station.lua: No such file or directory

    commonapi2.utils: cannot open A:/SteamLibrary/steamapps/common/Transport Fever 2/mods/Gebäude_ElevatedStation_1/res/config/bridge/elevated_station.lua: No such file or directory


    Die stdout.txt zeigt keinen Crash... Hängt das Spiel?