LUA-Script Verzögerungs-Befehl


Abonniere unseren Kanal auf WhatsApp (klicke hier zum abonnieren).
  • Hallo,


    ich schreibe gerade die LUA-Scripts für meine Dampfloks. Kennt jemand einen LUA Befehl, der eine Art Verzögerung hervorruft. Wer nicht weiß was ich meine:


    Anweisung1;


    1s. Pause/Verzögerung;


    Anweisung2;



    Bzw. gibt es sowas überhaupt für LUA im TS? Vielleicht kann mir ja jemand helfen.


    LG BR03_1010-2

  • Hallo,


    meinst du, dass sich die Hebel verzögert bewegen? Also eher gedämpft sind, anstatt sich so hastig nach vorne zu bewegen?


    Eine Verzögerung im zeitlichen Sinne, also dass die nächste Anweisung beispielsweise erst in einer Sekunde durchgeführt wird, könnte man dadurch erreichen, dass man sich mit Call( "*:GetSimulationTime") die aktuelle Simulationszeit holt, die erste Anweisung ausführt, dann sofort die aktuelle Simulationszeit in eine andere Variable packt und die Anweisung2 nur mit einer If-Abfrage zu starten.


  • Nein, ich suche einen Befehl mit dem ich eine Verzögerung hervorrufen kann. In C++ sah das damals so aus:



    Ich wollte eine Art "Auf- und Abschaltung" für den Regler programmieren. Die ReglerVorwahl habe ich im Inputmapper mit den Tasten D und A belegt. Solange ReglerVorwahl größer als Regler ist sollte er den Wert Regler langsam Aufschalten, solange der Wert ReglerVorwahl kleiner als Regler ist sollte der Wert Regler langsam abgeschalten werden. Damit die Ab und Aufschaltung überhaupt eine Wirkung hat, wollte ich das auf/abschalten des Regler Wertes mit etwas Verzögerung geschehen lassen.

  • Auch das kannst du in der Update()-Funktion machen. Lege dir nochmals zwei globale Variablen an. Beispielsweise ReglerSoll und ReglerIst. Nun gehst du in die Funktion "function OnControlValueChange (name, index, value)". Falls du sie noch nicht erstellt hast, solltest du das eben machen. Hast du im InputMapper auch als Parameter "ReglerVorwahl" festgelegt? Also da, wo du quasi die Tasten A und D festgelegt hast. Dann musst du unter der Funktion OnControlValueChange folgendes schreiben:


    So ungefähr müsste das laufen, wenn ich dich richtig verstanden habe ^^


    Wobei man hier vielleicht doch wieder mit zeitlicher Verzögerung arbeiten sollte/könnte. Da bin ich mir jetzt etwas unsicher. Denn diese Update-Funktion wird ja pro Minute auch, ich schätze mal, 100 mal durchlaufen. Und es könnte etwas performancelastig sein, wenn man ständig dieses Call("*:SetControlValue"..) aufruft. Vielleicht kombinierst du das einfach mit dem lastSimulationZeit/lastSimulationTime.

  • Nein, ich suche einen Befehl mit dem ich eine Verzögerung hervorrufen kann. In C++ sah das damals so aus:



    Ich wollte eine Art "Auf- und Abschaltung" für den Regler programmieren. Die ReglerVorwahl habe ich im Inputmapper mit den Tasten D und A belegt. Solange ReglerVorwahl größer als Regler ist sollte er den Wert Regler langsam Aufschalten, solange der Wert ReglerVorwahl kleiner als Regler ist sollte der Wert Regler langsam abgeschalten werden. Damit die Ab und Aufschaltung überhaupt eine Wirkung hat, wollte ich das auf/abschalten des Regler Wertes mit etwas Verzögerung geschehen lassen.

    Dafuer gibt es bereits eine spezielle Lua Anweisung im TS, die dieses Herangleiten an einen Kontrollwert regelt. Die von @questo vorgeschlagene Update-variante ist also unter Umstaenden nicht noetig. Nimm statt Call("*:SetControlValue", "Regulator", 0, Sollwert) die Anweisung Call("*:SetControlTargetValue", "Regulator", 0, Sollwert). Diese Variante erzeugt eine langsame Annaeherung des "Regulator"-Wertes an den Sollwert.

  • Ich habe es mal mit dem Tipp von @StefanDD versucht, aber irgendwie fährt die Lok nicht. Ich habe in der Engine.bin die ReglerVorwahl mit der Regler-Animation verknüpft. Das Funktioierrt auch, jedoch wird der "echte" Regler nicht angesprochen:


    Code
    Call("*:GetControlValue", "<RegulatorVorwahl>", 0);
    	if name == RegulatorVorwahl then
    	value = ReglerSoll;
    
    
    	end
    	Call("*:SetControlTargetValue", "Regulator", 0, "ReglerSoll");


    Ist dort vielleicht ein Fehler drinne? Ich habe die Variable ReglerSoll außerhalb der Funktionen hinterlegt.

  • Ist dort vielleicht ein Fehler drinne? Ich habe die Variable ReglerSoll außerhalb der Funktionen hinterlegt.

    Das geht so nicht. Die Funktion Call("*:SetControlTargetValue"... benoetigt eine Zahl, keine Zeichenkette, also waere ein erlaubter Aufruf Call("*:SetControlTargetValue", "Regulator", 0, ReglerSoll) oder Call("*:SetControlTargetValue", "Regulator", 0, value);


    Auch "Call("*:GetControlValue", "<RegulatorVorwahl>", 0);" ist nicht korrekt -- wozu die '<', '>'?


    Insgesamt sieht das Codefragment nicht sehr sinnvoll aus :( und ich glaube, Du musst Dich wohl oder uebel durch ein paar Skriptingtutorials arbeiten, sonst muessten die Forumsmitglieder Dein Skript per Forumspostings Schritt fuer Schritt mitaufbauen, was, sagen wir mal, ein sehr zaeher Prozess waere.

  • @StefanDD auch das hat nicht funktioniert.



    Hier ist nochmal der gesamte Quellcode. Das meiste ist von der Kuju Black 5. Mein Teil beginnt bei Zeile 81 und endet bei Zeile 85.



    Edit: @StefanDD Es hat doch funktioniert, jedoch ist die ReglerVorwahl jetzt genau so schnell wie der Regulator, kann man irgendwie den SetControlTargetValue langsamer machen? Meine Grundidee war ja, dass es wie bei der 86er wird. Da ich weiß, dass es da einen relativ komplexe Schieberkasten-Simulation gibt, wollte ich einfach nur diese Verzögerung hinzufügen um zumindest ein wenig von der unrealistischen Dampfloksteuerung im TS wegzukommen.


    Edit2: Hat sich erledigt, ich habe es selber hinbekommen.

  • Hallo,


    ich habe noch eine Frage und wollte nicht unbedingt einen neuen Thread erstellen. Ich habe jetzt folgendes Problem: Ich Versuche schon den ganzen Tag lang den Sound des Troffimow-Druckausgleichsschiebers hinzubekommen. Ich wollte, damit es einfach bleibt, dass immer wenn die Lok eine Geschwindigkeit von 2km/h hat und der Regler offen ist, dieser Sound ertönt. Ich habe es schon mit SysCall("ScenarioManager:PlayDialogueSound", "Troffimow.wav"); versucht (wobei ich mir schon denken konnte, dass dieser Befehl nicht funktioniert). Außerdem habe ich Call(“ControlSound:SetParameter”, “Troffimow”, 1) versucht. Beides ohne erfolg. Hat jemand Ahnung davon und kann mir vielleicht helfen?


    LG BR03_1010-2

  • @Stephan218 Theoretisch schon, jedoch wollte ich es vereinfachen, da man sonnst den ganzen Druckausgleich-Prozess simulieren müsste.


    So wie ich das jetzt gelesen habe und es mir ein Dampflokführer vor ein paar Wochen erklärt hat, klackt es nur wenn zuvor während der Fahrt der Trofimow-Druckausgleich gemacht wurde. Die Besonderheit beim Trofimow-Ausgleichsschieber war, dass sich der Schieber im Zylinder einklappen konnte.



    Das wurde ja meines Achtens gemacht, damit der sich während des "Rollens" der Lok kein Überdruck in den Zylindern bilden konnte, der die Lok ausbremste. Dabei galt:



    Bei den HSB-Loks war ja eine weitere Besonderheit, dass die beweglichen Schieberseiten keine Dämpfung hatten, deswegen auch das Charakteristische Klacken beim Losfahren, wenn sich die Schieberseiten durch den Druck wieder nach außen pressten.

  • @BR03_1010-2


    oh okay habe ich wieder was dazu gelernt, dass mit dem Druckausgleich wusste ich nämlich nicht.


    Aber wäre es reintheoretisch nicht einfach dem Script zusagen, dass wem man den Regleröffnet das dann dieser Sound kommt egal bei welcher Geschwindigkeit.
    Mit der Steuerung, dass wäre ja interneswissen.


    Also ich könnt mich daran erfreuen wenn man den Regleröffnet und dieses typiche Klacken kommt, dass mit dem Druckausgleich wäre mir eigentlich egal. Und wenn es für dich einfacher wäre? :D