Beiträge von Transalpin4010

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

    Danke dir fürs Umschreiben. Die Rasten und auch die Animationen und die Steuerung mit der Tastatur funktionieren jetzt auch für alle anderen Hebel, aber ich bin dennoch etwas verwirrt.


    Die erste Verwirrung ist mit dem "require", weil der einzige Unterschied zwischen deiner und meiner Version ist, dass ich die throttleScript-Variable lokal definiert habe. Das sollte doch egal sein, oder? Oder muss das require ganz am Anfang immer stehen, weil du das VirtualThrottle auskommentiert hast?


    Meine 2. Verwirrung betrifft das if(ControlExists) SetControl in Bezug auf die Animationen, definiert in der .bin. Muss ich zwingend im Skript jede Veränderung von einem ControlValue mit einem Set weiterleiten? Wenn das Skript nämlich z. B. leer ist oder alle Methoden leer sind und ich dieses If-Statement nicht habe, dann funktionieren die Animationen auch nicht mehr? Nach meinem logischen Verständnis sollten die Animationen und Rasten, die in der .bin gesetzt sind, nicht unabhängig vom Skript funktionieren und das Skript dann eben nur Verbindung schaffen zwischen der Eingabe am VirtualThrottle und der Berechnung für die Leistung durch die Stufe, z. B.?


    Das dritte betrifft die Struktur der Subfiles generell. Ich komme aus der Richtung C#, Java und etwas C++, wo ich andere Files alleine zur Definition von Klassen oder einzelnen Funktionen nutzen konnte, ohne die gesamte Anwendungsstruktur zu haben. Ist das in Lua nun anders? Offenbar brauche ich im ThrottleScript ebenfalls eine Initialise-, Update- und OnControlValueChange-Methode. Brauche ich das für jedes Subfile von meinem Main-Script im Train Sim? Kann ich nicht aus der OnControLValueChange aus dem Mainfile direkt die UpdateTargetPosition-Methode aus dem ThrottleScript-Subfile verwenden, muss ich immer den Umweg über eine eigene OnControLValueChange-Methode gehen?


    Im vierten bin ich verwirrt, wie Lua jetzt genau die Funktionen benutzt. Nach der throttleScript-Variable führst du throttle_Initialise als Initialise usw. ein. Ist das jetzt die Initialise aus dem Main-Skript oder aus dem Sub-Skript? Wenn beide gleich heißen, woher entscheidet der Compiler, welche Version und wie sind dann jetzt überhaupt die Initialise, OnControLValueChange etc. aus dem Subskript mit dem Main verbunden? Die Struktur verwirrt mich sehr gerade.


    Abschließend hast du die VirtualThrottle-String-Deklaration nur auskommentiert, weil du sie nicht brauchst, oder hat das Lua im Train Sim etweas dagegen, wenn locale Variablen im Script so heißen, wie Objekte in der .bin, die dann als Namen übergeben werden in der ControlValueChange, z. B.?

    Ja voll, das ist mir klar. Mein Problem liegt aber etwas woanders. Wenn ich mir den Eintrag vom Fahrschalter in der 4010_A.bin anschaue, wie RSSLo ihn definiert hat, dann sehe ich da eine Animation, die verlinkt ist, und fest definierte Raststellungen. So wie ich den Teil bei ChrisTrains in der Dokumentation verstanden habe, sollte damit automatisch bei dem jeweiligen Tastendruck der Fahrschalter auf/abschalten mit der gegebenen Animation und vor allem in den definierten Rasten einrasten, ohne, dass ich das manuell nochmal im Skript einfügen müsste. Das Problem ist jetzt, wenn mein neues Skriptfile leer ist oder ohne Errors funktioniert, kann ich den Fahrschalter nicht mit der Tastatur drehen und wenn ichs per Drag-and-Drop mit der Maus mache, bleibt er einfach dort stehen, wo ich ihn loslasse, und rastet nicht in den definierten Positionen ein. Wenn das Skript abstürzt, ebenfalls. Wenn ich im Skript nur den Fehler habe, dass das require einen Boolean zurückgibt, wie oben beschrieben, dann ist der Fahrschalter beim Start der Simulation in der definierten Defaultposition, er lässt sich über die Tastatur steuern und rastet auch in den definierten Stellungen ein. Genau das verstehe ich nicht: Warum funktioniert das nur, wenn das Skript einen Fehler ausgibt, und nicht, wenn es entweder leer ist oder nur Funktionen hat, die ohne Error funktionieren!?


    Eventuell verstehe ich Deinen Ansatz nicht, aber wenn Du das Originalskript mit "require" einbindest, "kaufst" Du das Verhalten aus dem Orginalskript mit.


    Wenn Du zB eine Zugsicherungsvsariante einbinden willst, die das Orginal nicht hat, dann ist das eine valider Ansatz, weil Du hinzufügst, nicht überschreibst.


    Für eine Veränderung vorhandenen Verhaltens, müsstest Du das zentrale Skript neu aufsetzen, sonst kämpfst Du mit dem Verhalten aus dem Orginalskript.

    Ich will ein komplett neues Skript schreiben. Also alles von neu auf, aber aufgeteilt, sodass es leichter maintanable ist. Auf das Aufteilen kann ich sosnt auch fürs erste verzichten, das für mich grade Wichtigste ist, warum die Animationen und Rasten aus dem .bin file da sind, wenn das Skript mir den Error gibt, dass das require einen boolean gibt, den es natpürlich nicht indizieren kann, aber die Rasten und Animationen weg sind, wenn das Skript entweder komplett crashed oder keinen error gibt.

    Ok verstehe, ich versuch's dann mal, in den gleichen Ordner zu geben. Das erklärt aber trotzdem nicht, warum die Default-Animationen und auch die Rasten, die in der .bin definiert sind, funktionieren, wenn das Skript nicht funktioniert,aber nicht mehr funktionieren, wenn das Skript geht.


    Edit: Die Position macht keinen Unterschied. Wenn es gefunden wird, liegt es als Boolean-Value vor und wenn es nicht gefunden wird, dann crasht das ganze Skript. Wenn das ganze Skript crasht, dann sind die Rasten und Animationen auch weg. Irgendwie nur, wenn ich den Fehler habe, dass das throttleScript als Boolean-Value versucht wird zu indizieren, dann sind die Animationen und Rasten aus der .bin vorhanden.

    Liebe Community!


    Ich versuche, mich in das Scripting im Train Sim Classic anhand des RSSLO 4010 einzuarbeiten, jedoch bin ich auf eine massive Verwirrung gestoßen. Ich habe ein komplett neues Skript aufgesetzt, sodass ich alle Funktionen neu und ggf. besser ausführen kann. Ich wollte dabei auch die Möglichkeit nutzen, das Lua-Skript in einzelnen Files aufzuteilen und die Teile durch require() zu laden, sodass alles übersichtlicher wird. Nun zum eigentlichen Problem. DIe Skriptteile sind dazu im .rar file im Anhang, sodass sie direkt in den RSSLO/OBB4010/RailVehicles/Engine/Script-Ordner kopiert werden können.


    Wenn ich im Throttle-Teil die ThrottleScript Liste public lasse (also ohne local) und am Ende nicht returne und ich im Main-Script einfach ThrottleScript.Update... benutze, bekomme ich in LogMate keine Errors und das Skript gibt meine Prints aus. Der Fahrschalter ingame bleibt jedoch auf der 0-Position und geht nicht in die in der .bin definierte Default-Position. Auch lässt er sich nicht über die Tastatur steuern.


    Mache ich jetzt die ThrottleScript-Liste lokal und returne sie am Ende, sodass ich im Main-Skript die kleingeschriebene Variable throttleScript.Update... benutze, bekomme ich im Logmate den Error weiter unten. Das macht ohnehin nach meinem Lua-Verständnis schon wenig Sinn. Das Verwunderliche ist aber, dass nun ingame die Default-Animationen funktionieren!? Also bei mStart wandert der Fahrschalter in die in der .bin definierten Default-Position und er lässt sich auch über die Tastatur steuern. Jedoch nur der Fahrschalter, alle anderen Hebel nicht.


    In keiner Dokumentation konnte ich nachvollziehen, wie die Animationen in der .bin mit dem Script zusammenhängen und ob oder was was überschreibt!? Wieso funktioniert die Animation, wenn das Skript nicht funktioniert? Aber eben auch nur für den einen Schalter? Kann mich da bitte jemand aufklären? Ich verzweifle damit gerade sehr.


    Laut meinem logischen Verständnis sollte dann ja jede Default-Animation immer funktionieren, solange das Skript nicht brute-force einen Wert direkt setzt, wenn man eine Taste drückt, und vor allem sollten sie immer funktionieren, selbst wenn das Skript zum Beispiel völlig leer ist!?

    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.