Beiträge von Transalpin4010

Discord Einladung
Trete unserem Discord-Server bei (klicke hier zum Beitreten).

    Liebe Community!


    Um mich mit Lua vertraut zu machen, arbeite ich gerade an einem Skriptupdate für den RSSLO-4010er. Dabei bin ich bei den Tastatureingaben auf eine Verwirrung gestoßen. Im Skript selber kann man ja nicht nach Tastatureingaben direkt suchen, sondern nur auf die veränderten Werte der Controls, die durch den InputMapper verbunden sind, warten. Nun frage ich mich aber, wie man jetzt genau mit dem Setzen von Werten aus dem Skript umgeht.

    Nehmen wir das Beispiel „Fahrschalter“ Dieser hat bestimmte Positionen, genannt Nocken, in denen er einrastet. Ohne Skript ist das Virtual Throttle Control aber völlig frei setzbar, also muss ich im Skript den gesetzten Wert abfragen und dann auf die nächstgelegene Nocke setzen. Bis jetzt mache ich das direkt über die „OnControlValueChange“-Methode, das ist aber suboptimal, weil die natürlich bei jeder kleinen Änderung triggert und bei Tastatureingaben sind die Änderungen dann so klein, dass der Fahrschalter direkt wieder auf seinen Ausgangswert gesetzt wird. Jetzt gibt es noch die Update-Methode, da hätte ich 2 Gedanken. Einerseits könnte ich eine starre Zeit warten, bevor das jeweilige Control auf die richtige Position gesetzt wird, das macht alles aber sehr unresponsive. Mein 2. Gedanke wäre, in jedem Updateschritt die aktuelle Position abzufragen und mit der letzten gespeicherten Position zu vergleichen. Hat sie sich geändert, tut man erstmal nichts. Ist sie jedoch gleich, ruft man die Methode auf, die die Position korrigiert. Dabei muss ich aber in jedem Updateschritt einen Call an die GetValue-Methode machen und das kommt mir sehr kostspielig vor, vor allem, wenn man mehrere Controls abfragen muss.


    Zusätzlich verwirrt mich das Tastatursystem aufgrund folgender Tatsache: Ich habe am 4010er zum Debuggen eine Alertbox anzeigen lassen, wenn ich H drücke, um die Headlights einzuschalten. Dabei ist mir dann aufgefallen, dass einmaliges Drücken den aktuellen Wert erhöht, aber längeres Gedrückthalten den Wert nicht weiter verändert Im Originalskript hat längeres Gedrückthalten jedoch durchaus den Wert stetig erhöht, zumindest beim Fahrschalter. Daher meine Frage, ob das ein gewolltes Verhalten ist, da es sich bei den Headlights nur um einen An/Ausschalter handelt, oder ob man hier im Skript noch mehr berücksichtigen muss?


    Gibt es da wirklich keinen besseren Weg Was sind die Meinungen der erfahrenen Entwickler dazu? Habt ihr da noch Tipps für mich?

    Führerbremsventil vom 4010er ist ein klassisches altes mechanisches Ventil, kein Kombihebel oder so. Ich habe aber im Skript in der ValueChanged-Methode nach Änderungen von dem TrainBrakeControl gelistened mit einer Ausgabe, wenn es was tut, aber egal, wie ich den Hebel hin und her bewege, der Wert ändert sich nicht. Ich hab's über die OnControlValueChanged-Methode überprüft und auch nochmal über die Update-Methode.

    Ich hab herausgefunden, dass auch in der Simulation.bin falsche Werte waren. ich hab die jetzt auf die tatsächlichen Leistungen gesetzt und jetzt wirkt die BEschleunigung im Simulator sehr real.


    Mein nächstes Problem entsteht aber bei der Bremse. Ich habe alle ControlNames aus der .bin durchprobiert, kein einziger ändert sich passend zur Bewegung des Führerbremsventils oder der direkten Bremse Die Kopplung zwischen dem Führerbremsventil und der Bremse im f ist aber gegeben. Wie finde ich jetzt heraus, welchen Wert ich im Skript für die Position der Bremsventile abrufen kann, korrigieren kann und dann im Main Control für den Simulator setzen kann!?

    Ja, voll, das wär der Sinn der TractiveEffortVsSpeed Datei, aber die Kurve ist hier halt sehr generalisiert und obwohl der Trend bei den Motoren gleich ist, gibt's ja doch Unterschiede, ob die Lok jetzt von einem modernen Asynchronmotor angetrieben wird oder von einem alten Reihenschlussmotor Deswegen hab ich die Kurve neutralisiert und quasi konstant auf die maximale Leistung gesetzt, damit ich im Skript aus den Gleichungen des Reihenschlussmotors die tatsächliche Leistung in jedem Frame berechnen kann und dann als Prozentsatz der maximalen Leistung setzen kann. So bekomme ich ja ein viel genaueres und realistischeres Traktionsbild, ist mein Gedanke.


    Und soweit ich das verstanden habe, setzt die TractiveEfforVsSpeed nur die Lokleistung um, Luftwiderstand, Reibung wird dann extra daraufgesetzt.

    Liebe Community!


    Um die Reichweite an potentiellem Wissen zu vergrößern, möchte ich mein Problem auch hier schildern. Ich arbeite derzeit an einem Skriptupdate für den RSSLO 4010er (apparently nutzt er das Skript von der SZ363). Das sollte der erste Step für ein weiteres Soundupdate sein. Als ersten Schritt habe ich dafür im Skript die Fortschaltgrenzen und Zeiten richtig gesetzt und die Motorströme und die Leistung anhand der korrekten Formeln für Reihenschlussmotoren berechnet. Dies passiert in jedem Simulationsschritt. Damit die TractiveEffortVsSpeed/Throttle nicht dazwischenpfuschen, habe ich sie quasi neutralisiert, indem ich in der Speed-File eine konstante Leistung etwas über der maximalen Leistung angegeben habe und den Throttle auf 1 gesetzt hab, sodass es dafür keine Multiplikatoren gibt. Im Skript wird für den Regulator schließlich ein Wert zwischen 0 und 1 normiert auf die angegebene Maximalleistung pro Motor gesetzt. Das schien mir der beste Approach für eine möglichst genaue Simulation zu sein. Die Motorwiderstände sind dabei aus der Leistungstafel des Motors und mehreren Leistungspunkten über die Verlustleistung berechnet. Da die Induktivität mit dem Arbeitspunkt schwankt, habe ich als Dämpfung eine Exponentialfunktion verwendet, um nicht im Skript langsame DGLS lösen zu müssen.

    So viel zur Beschreibung. Mein Problem ist jetzt, dass, obwohl die Werte alle aus dem realen Fahrzeug stammen und in meinen Augen korrekt berechnet werden, die Leistung im Spiel viel zu hoch ist. Bereits bei der ersten Stufe gerät das Fahrzeug direkt ins Schleudern und beschleunigt über alle Maßen. Habe ich irgendwas falsch verstanden, wie der Train Sim mit Leistungen und Kräften umgeht? Hab ich was übersehen oder stimmt etwas in meiner Logik im Script selber nicht? Nachdem RWA einige sehr genaue Addons erschaffen hat, würde ich mich freuen, wenn ihr mich auf die richtige Spur leiten könntet. Die geänderten Files sind im Anhang ersichtlich.


    (Anm.: Ich habe einige Programmiererfahrung in C# und Java, für Lua ist das jedoch mein erstes Projekt, deswegen bitte hinsichtlich des Codestyles nachsichtig sein.)

    Danke dir vielmals, das macht sehr viel Sinn. Eine Verständnisfrage noch zur onControlValueChange, wieso muss man nochmal SetControlValue mit dem gleichen Namen, index und value aufrufen? So wie ich das verstanden habe, passiert der Aufruf für die OnControlValueChange ja weil der value für das objekt mit dem Namen und dem index geändert wurde oder nicht?

    Danke für die ganzen hilfreichen Antworten, mangels Autoabo vom Thread hab ich die jetzt erst sehr spät gesehen. Kuju Skripte habe ich mir bereits ein paar angeschaut und auch ein paar andere, unter anderem das vom RSSLO 4010er, das ich ja rekonstruieren, am besten verbessern, will und obwohl dabei zwar die Methodennamen verloren gehen, ist das auch sehr praktisch zum reverse Engineeren. Die Skripte von AP werde ich mir auf jeden Fall noch anschauen.

    Anschließend an meinen anderen Thread: Werden in den Skript files, nicht dem SimpleEngineScript, weil das ist zu 90% tatsächlich leer, alle 4 Basic Methoden, also die Initialise, Setup, Update und ControlValueChange aufgerufen theoretisch oder nur bestimmte bzw. gibt es Voraussetzungen dafür, dass eine Methode aufgerufen wird, also dass ich das Fahrzeug zb Bewegen muss oder so?



    Daran anschließend, kann man im Train Simulator statt lua jetzt auch TypeScript verwenden? Ich habe mir den Sourcecode heruntergeladen, die Scripte haben dort aber alle .ts Endung, das verwirrt mich etwas.

    Danke dir für die Antwort, also das SimpleEngineScript ruft nur noch die Update und Setup Funktion auf? Die ,,normalen" Skript files dann nur noch die Initialise und diese ValueChange methode? Ich schau da nochmal drüber aber ich habe ein paar Scripte decompiled und, obwohl zwar die Methodennamen dabei verloren gehen, finde ich immer einige Methoden, die von der Anzahl der Parameter immer auf die 4, also Init, Setup, Update und ControlValueChanged, passen würden, also sollten sie in den normalen ja auch aufgerufen werden oder?

    Liebe Community!


    Ich versuche gerade eine Skript Update für den RSSLO 4010 zu machen. Dafür habe ich erstmal die wichtigsten Funktionen definiert, Die Initialise(), Setup(), Update(interval) und OnControlValueChange(name, index value). Alle sind in der Script_OBB4010.lua. Für alle habe ich Print Statements eingefügt, um in LogMate zu sehen, ob alles funktioniert, wie erwartet. Die Setup Methode wird jedoch nur in der SimpleEngineSimulation aufgerufen, die Setup Methode allgemein nie, egal ob von der Script_OBB4010.lua oder von der SimpleEngineSimulation.lua. Das macht für mich aber absolut keinen Sinn, muss davor irgendwas passieren, damit die Methoden aufgerufen werden? Habe ich etwas falsch definiert?


    Script_OBB4010:


    SimpleEngineSimulation:

    Code
    function Setup ()
        Print("[DEBUG] Setup method called in SimpleEngine.")
    end
    
    function Update (interval)
        Print("[UPDATEMETHOD] called update from SimpleEngine!")
    end

    Ahja das macht Sinn, danke vielmals. Während meiner weiteren Recherche bin ich hier im Rail Sim Forum auf die Liste der möglichen Methoden gekommen, ist die vollständig? Ich habe leider nichts zu dem Togglen von Animationen gefunden. Laut dem .bin file wäre für den Fahrschalter zum Beispiel die default Position auf 0.5, was ,,Aus" entspricht. Mittels der SetControlValue habe ich versucht per Script den Fahrschalter auch auf die Position zu setzen, im Simulator steht der Fahrschalter im f4 hud auch auf der richtigen Position, nur das 3d Schaltrad steht auf 0. Gibt es da eine gute Möglichkeit, den Fahrschalter in der Initialisierung auch im 3d Modell auf die richtige Position zu stellen?


    Eine eher Pfusch Möglichkeit wäre, kurz nach der Initialisierung die Animation über einen Zeitraum in die Position laufen zu lassen und nachdem man tatsächlich sieht, wie sich das Rad dreht, wenn man die Standard Version des Scriptes hat, nehme ich an, dass RSSLO das auch so gemacht hat, aber ich bin mir auch da mit den möglichen Methoden nicht ganz sicher, wie das am besten geht.


    Dazu stellt sich mir auch die Frage, woher finde ich den Childname? In der .GeoPcDx gibt es zwar diverse <Child> tags, die über TransformIds mit Transforms verbunden sind, die passende Namen tragen würden und auch in der .bin finde ich zum Beispiel den ElementName Vleka für den VirtualThrottle, wenn ich aber zum Beispiel pos = Call("Vleka:getNearPosition") verwende um zu Debuggen, ob das das richtige Element ist bzw. Call("Vleka:SetTime", "Vleka", 0.5) um die Animation zu starten, passiert nichts, bzw. wenn ich pos printen will, bekomme ich nur einen Error, weil es wohl nil ist.

    Liebe Community!


    Ich habe vor, mich ins Lua Scripting für den Train Sim einzuarbeiten. Programmiererfahrung habe ich bereits in Java und C#, also gilt es für Lua nur mit der neuen Syntax umzugehen. Ich habe mir bereits die zwei verfügbaren Tutorials zum Lua Scripting angesehen, die sind jedoch sehr allgemein und gehen nicht auf den Train Sim ein. Für den Anfang wollte ich das Script eines bereits funktionierten Fahrzeuges, dem RSSLO 4010, erneuern, da das Fahrzeug bereits existiert, der Funktionsumfang bisher recht einfach ist und grundsätzlich die Eigenschaften feststehen, es sind daher nur die .out files, also die verschlüsselten lua Scripte neu zu erstellen.


    Die originalen habe ich gesichert und dem ,;Create an Engine" Tutorial von den Developer Documents (Developer Documents) folgend, habe ich ein neues SimpleEngineScript.lua File erstellt in der Location vom alten, damit ich den Speicherort nicht in der bin ändern muss. Für den Anfang wollte ich einfachen Debug Output für LogMate haben, damit ich einfach und schnell sehen kann, was für Auswirkungen meine Änderungen haben. Die Struktur habe ich dafür aus genanntem Tutorial genommen und sieht folgendermaßen aus:


    Code
    function Setup ()
        Print("[DEBUG] Script initialized.")
    end
    function Update (interval)
        local speed = SysCall("GetSpeed") * 3.6 -- m/s to km/h
        Print("[Speed] Current speed: " .. tostring(speed) .. " km/h")
    end

    Gespeichert habe ich das mit Notepad++ als .lua file, ich nehme nicht an, dass ich das file auch als .out file verschlüsseln muss während des Development Prozesses. Dem Thread (Lua-Script Print-Funktion) folgend, habe ich auch die Startoption hinzugefügt, wie am Screenshot erkennbar, im Logfile von LogMate habe ich jedoch keinen Debug output von meinem Code. Was ist hierbei das Problem? Was habe ich vergessen? Muss man das File doch verschlüsseln?


    Durch trial and Error habe ich auch im Script folder das Script_OBB4010.out file durch ein eigenes .lua fil eersetzt mit folgendem, leicht abweichenden Code:

    Code
    function Initialise()
        Print("[Init] Locomotive script loaded. From OBB4010.lua")
    end
    
    function Update(time)
        local speed = SysCall("GetSpeed") * 3.6 -- m/s to km/h
        Print("[Speed] Current speed: " .. tostring(speed) .. " km/h")
    end

    Nun habe ich tatsächlich Debug output von diesem File. Das bringt mich aber zu weiteren Fragen. Was ist nun die Aufgabe der SimpleEngineSimulation.lua im Vergleich zu der Script.lua? Wieso haben die Methoden, zumindest die zur Initialisierung, andere Signaturen?

    Wie ist eigentlich der Stand vom Sim und die Zukunftsaussichten? Ich überlege mir, mir den Sim vor allem für die Stellwerke zu kaufen, aber nachdem die ja nur über Server spielbar sind, stellt sich mir auch die Frage, wie Zukunftssicher der Simulator ist und was man da noch erwarten kann weiter, 35 Euro sind ja auch nicht wenig.

    Ich freu mich, dass endlich eine Österreichische Strecke kommt und freu mich auf mehr. Der TSW ist ein Nischenprodukt und die Community hat bekanntermaßen keine Wahl, also ist es ja nur natürlich im Kapitalismus, dass der TSW jedes Jahr neu rauskommt mit kaum Neuerungen aber Vollpreis.