Schrankenscript erstellen

Willkommen in der OMSI-WebDisk!
Als Gast kannst du nur Inhalte in deiner ausgewählten Sprache sehen. Registrierte Nutzer können die Sichtbarkeit anderer Sprachen in ihrem Kontrollzentrum aktivieren, weitere Infos hier.
Alle Themen sind in den Foren mit einer Sprachflagge gekennzeichnet: = Englisch [EN], = Deutsch [DE], = Französisch [FR]. Wenn du die angegebene Sprache nicht beherrschst, schreibe auf Englisch!
  • Hallo zusammen,

    ich bastele gerade an einer Mapmod und habe an meinem Betriebshof die Schranke aus den Kamaz_Objekten verbaut.

    Aktuell wird (anscheinend?) über die Nightmap gesteuert wann die Schranke auf und wann sie zu ist.

    (Die .sco-Datei besagt aktuell:

    (Im gesamten Ordner ist aber interessanterweise keine einzige "varlist" vorhanden mit genannter Variable. Trotzdem funktioniert es irgendwie, und ich hab keine Ahnung wie. Evtl. in der o3d verankert? Glaube ich aber net wirklich dass das geht...)


    Ich möchte diese Schranke nun so umstellen, dass sie per Script zu bestimmten Uhrzeiten auf und zu ist. (Zwischen 5 Uhr und 22 Uhr offen, sonst geschlossen)


    ' Schranke auf ' und ' Schranke zu ' sind zwei eigene .o3d, d.h. kein einfaches bewegliches Teil.


    Theoretisch soll das Skript nun also folgendes sagen:


    "
    Wenn
    Uhrzeit kleiner als 5 Uhr,
    Dann
    'zeige Datei 'Schranke zu'.

    Sonst
    'wenn Uhrzeit kleiner als 22 Uhr,'
    Dann

    'zeige Datei 'Schranke auf''

    Sonst

    'zeige Datei 'Schranke zu'

    "


    Verständlich geschrieben? Ich hoffe 😅.

    Ich habe versucht den Wiki-Eintrag zu lesen und zu verstehen, bin aber gescheitert. Deswegen wäre eine Erklärung für Dummies nett :grins: In Excel weiß ich wie ich sowas definieren könnte lol

    Freue mich über jede hilfreiche Antwort.

    VG Thorsten

  • InUse ist eine OMSI Interne variable, die dem Objekt sagt, ob es aktiv ist. das kannst du mit sicherheit irgendwo einstellen. willst du ein Script nutzen, musst du eine Varlist mit "Schranke_state" als variable erstellen und definierst diese in der sco.

    dann brauchst du noch ein kurzes script, welches jeden Frame aufgerufen wird:


    Code
    {frame}
    (L.S.Time) 18000 <=
    (L.S.Time) 79200 >= || (S.L.Schranke_state)
    {end}



    Schranke_state ist "true" oder "1" vor 5 Uhr und Nach 22 Uhr; ansonsten ist schranke_state false oder 0. dementsprechend musst du die Konfig anpassen:


    fertig.

  • Danke dir Chrizzly92 für die schnelle Rückmeldung!

    Das Einstellen der InUse geht dann wahrscheinlich doch über die o3d selbst würde ich mal schätzen. Beim Durchsuchen meines Sceneryobjects-Ordner nach diesem Eintrag ist nämlich kein Resultat in einer Script-Datei, nur in den/der .sco selbst herausgekommen.



    Für mich zum Verständnis vom Scriptstück selbst:

    Deine Zeile sagt praktisch folgendes:

    "Anforderung (Stack) 1" - "Prüfe Variable Uhrzeit kleiner gleich" - "18000 sek. (also 5h ab 0, weil OMSI nach Sekunden liest)"

    "Anforderung (Stack) 2" - "Prüfe variable Uhrzeit größer gleich" - "79200 sek (also 22h ab 0)" - "Oder" - "Nutze Variable "Schranke_state"
    '> wenn Anforderung 1 oder 2 korrekt sind, dann ist Variable 'Schranke_state' im Ergebnis "1", also richtig. Sonst ist diese Variable "0", also falsch)

    Hab ich das dann so richtig verstanden/interpretiert?


    EDIT:

    Habe alles so eingefügt wie du es gesagt hast, aber es funktioniert leider nicht:



    Logfile wirft keinen einzigen Fehler. Scriptdateien anbei.

    Noch einen Vorschlag?

    • Hilfreichster Beitrag

    Ich glaube du kannst bei den objekten über den Editor einstellen, ob und wann diese aktiv sind. wie geanu das funktioniert, kann ich aber nicht sagen.

    scheint so als hättest du das script in der sco nicht hinterlegt.

    nehmen wir mal die kirche aus dem standardcontent als beispiel:


    6dFYidp.png


    genauso musst du in der *.sco die varlist und das script eintragen. OMSI erkennt das nicht automatisch, das muss entsprechend definiert werden.


    im grunde checkt das Script, ob vor 5 uhr oder nach 22 uhr; wenn ja, setze auf 1, sonst auf null und speichere dann in schranke_state. das ist halt die kompakteste form des scriptes, man könnte es auch so schreiben:


    Code
    {frame}
        (L.S.Time) 18000 <=
        (L.S.Time) 79200 >= ||
        {if}
            1 (S.L.Schranke_state)
        {else}
            0 (S.L.Schranke_state)
        {endif}
    {end}

    sollte so besser erkennbar sein. Grundsätzlich hast du das aber schon richtig verstanden. :-)

  • Und wieder sind es die banalen Dinge die ich übersehen hab... :facepalm:

    Natürlich hab ich den Eintrag des Scripts und der Varlist selbst unterschlagen. Und natürlich kann dann auch nix funktionieren wenn OMSI nicht weiß dass da ein Script verwendet werden soll lol Ich sollte so ne Geschichten nicht um halb 3 morgens machen lol

    Danke dir 😅


    Sou, nochmal ein paar Stunden und mehrere Trial-and-Error Geschichten später hat es nun endlich, endlich funktioniert und Objekt und Script sind eine Liebesbeziehung eingegangen.
    Ich hab noch

    - ein paar versteckte Leerzeichen weggemacht (die versehentlich reingekommen sind, OMSI ist ja bekanntlich sehr zickig mit Leerzeichen),

    - in den einzelnen .sco-Dateien selbst (also in "Schranke_auf.sco" und "Schranke_zu.sco") die visible-variable sowie die Verweise auf Script und Varlist eingefügt

    - im Script selbst noch einen {init}-Block eingefügt (Laut Wiki ratsam, wenngleich auch das vermutlich nicht benötigt wäre. Aber hey lieber zu viel als zu wenig).



    Und nun funktioniert es :)

    Ganz lieben Dank dir Chrizzly92 für die Hilfe, und die "kindgerechte" Erklärung :)

    VG Thorsten