Lokbau - LUA Script

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

  • Das will irgendwie nicht ^^


    EDIT: Doch geht auf einmal, Vielen Dank Maik :D*super*
    Ausser dass die Bremse nicht mehr auslöst ^^

  • Naja, ne sonderbar gute Lösung ist das auch nicht. Zumal da ein Fehler drin ist. So könnte das aussehen. Hab ich nur mal eben "hingeschmiert". Das soll dir nur den richtigen Ansatz zeigen.


  • Naja, ich wollte dir nur aufzeigen wie man aktiv mögliches Dauerfeuer unterbindet und kein fertiges Rezept auf den Tisch legen. Sowohl beim Controller SifaWeg als auch bei der SifaReset Tastenabfrage is das unterbinden wichtig. Wozu eine Taste in jedem Frame auswerten und bei jeden Wert wenn ich doch nur 1 oder 0 und auch nur je einmal benötige. Das sind essentielle Dinge die man verstehen muss, sonst schreibt man Scripte die nicht gut funktionieren werden und die Spielperformance im Zweifel beeinträchtigen.

  • Eine Frage, wie kann ich es unterbinden das der Wert sich so oft verändert, ich glaub im ms Bereich. Der springt die ganze Zeit zwischen 2-3% im TS herum.


    local Fuehrerbremsventil = Call ( "GetControlValue", "Fuehrerbremsventil",0);


    if( Fuehrerbremsventil ~= Fbv)then


    if(Fuehrerbremsventil > Fbv)then
    Fbv = Fbv + math.abs(time / 2) ;
    Call ("SetControlValue","TrainBrakeControl", 0, Fbv);
    elseif(Fuehrerbremsventil < Fbv)then
    Fbv = Fbv - math.abs(time / 2) ;
    Call ("SetControlValue","TrainBrakeControl", 0, Fbv);

    end
    end

  • Ja, da sieht man dass du noch nichts verstanden hast. Das ist doch was ich dir mit meinem Scriptschnipsel aufzeigen wollte. Dauerfeuer unterbinden durch das zwischenspeichern und prüfen der Werte. Du musst da noch viel Grundkenntnisarbeit bei dir leisten bevor du sowas wie ein enkoppeltes FBrV coden kannst. Ausserdem solltest du dir mal VirtualBrake anschauen statt einen eigenen Controller für den enkoppelten Hebel zu erfinden. Und was bitte soll math.abs(time) ? Weist du überhaupt was math.abs macht?

  • @Taurus0815
    Auch wenn der Onkel Maik mal wieder schimpft weil du angeblich nichts verstanden hast darfste das nicht so eng sehen.


    Meinen Respekt hast du jedenfalls schon mal da du scheinbar der einzige hier im Forum bist der sich damit auseinander setzt :thumbup:


    Hör jedenfalls auf den Onkel Maik da kannste noch viel lernen :ugly:

  • Hast du denn schon irgendwelche Programmiererfahrungen? Die wären durchaus angebracht, sonst verstehts du das auch nicht was ich dir sagen will. LUA an sich ist super einfach. Das bisschen Syntax ist an einem Tag erlernt, aber das zaubert noch nix hervor. Es ist einfacher ausserhalb des TS damit was zu programmieren als für den TS. Der hat halt seine Eigenarten und man hat nur wenige Dinge an die man sich "anheften" kann. Du musst viele der Unzulänglichkeiten (zB fehlende Events) umschiffen. Das wird um so schwerer je komplizierter die Systeme sind die man umsetzen möchte. Vor allem Vorgänge die von Werten des TS abhängen sind manchmal schwer in den Griff zu bekommen weil die gelieferten Daten teils wirr und unberechenbar sind. Das muss man ausgleichen sonst bekommt man falsche Ergebnisse. Dein obiges Beispiel aber ist fehlende Erfahrung in der Programmierung. Du fragst den Hebel ab ob er dem Wert der Bremse entspricht. Tut er es nicht würde man jetzt eben den Wert des Hebels auf die Bremse schreiben. Du aber schreibst time/2 auf die Bremse und so wird "Fbv" niemals "Fuehrerbremsventil" sein, die Bedingung also nie wahr. Oder war dein Ziel eine Zeitsteuerung? Das geht dann aber völlig anders.

  • Also ich hab schon C programmiert aber nur in der Schule, einfache Programme halt.
    Das time / 2 kommt vom Versuch ein verzögertes Szeuerrad zu machen, wobei es dort auch Dauerfeuer gibt.


    EDIT: Im Grunde war die Lösung nicht schwer ^^ Denk auch viel zu kompliziert meistens.
    if(Fuehrerbremsventil ~= Fbv and sifaZwb == 0 and pzbZwb == 0)then
    Fbv = Fuehrerbremsventil;
    Call ("SetControlValue","TrainBrakeControl", 0, Fbv);
    end

  • Wenn du etwas zeitverzögert laufen lassen willst dann brauchts du entsprechende run-up und run-down Konstrukte mit Sollvorgaben und Ist-Werten. Der Hebel legt die Sollvorgabe fest und startet den Run. Dort wird dann geschaut ob Soll < oder > oder = Ist-Wert ist und etsprechend addiert oder subtrahiert (mit time/irgendwas für eine gleichbleibende lineare Bewegung oder auch mit anderen Spielerkens wie beschleunigter Bewegung über Pow() oder mit einem lerp mit 4 Werten). Wenn Soll == Ist wird der Run unterbrochen. Die Hebelstellung wird zwischengespeichert und gegengeprüft. Erst wenn der Hebel nicht mehr mit dem gespeicherten Wert übereinstimmt wird der Sollwert wieder vorgegeben und der Run gestartet. Das funktioniert ziemlich zuverlässig. Wichtig ist dass der Run unterbrochen wird wenn die Sollvorgabe etwa erreicht ist (wenn soll < ist + 0.001 dann ist = soll und run stop).

  • Hab mal geschaut wie man eine Message im Spiel zeigt, dabei habe ich das gefunden:


    SysCall("ScenarioManager:ShowAlertMessageExt", "PZB Info Message", "Zugart O",2,0);


    Gleich probiert und siehe da, es gibt ein Dauerfeuer der Message Fenster. Schon alles probiert es zu unterbinden, aber erfolglos.


    LG

  • Hallo,


    Ich möchte von der vorderen Lok aus sagen dass die hintere die Stromabnehmer heben soll.


    Das funktioniert mal nicht, jemand eine Idee?