From c5e7843296fd2ad1139ec48d8e78277267ba5b35 Mon Sep 17 00:00:00 2001 From: Nero <41307858+nero@users.noreply.github.com> Date: Thu, 30 Jun 2022 19:25:05 +0000 Subject: [PATCH] Add Zuggreifer --- Installation.eep | 7 +++ Installscripts/Zuggreifer.ini | 3 + Zuggreifer.lua | 106 ++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 Installscripts/Zuggreifer.ini create mode 100644 Zuggreifer.lua diff --git a/Installation.eep b/Installation.eep index 4eac744..4d466f7 100644 --- a/Installation.eep +++ b/Installation.eep @@ -4,3 +4,10 @@ Name_ENG = "Serializer" Desc_GER = "Lua-Tabellen serialisieren, in Slots abspeichern und wieder laden" Desc_ENG = "Serialize Lua tables, save them in slots, and load them again" Script = "Installscripts\Serializer.ini" + +[Install_01] +Name_GER = "Zuggreifer" +Name_ENG = "Train grabber" +Desc_GER = "Einen Zug durch Gleisbesetztmeldung identifizieren und abfahren lassen" +Desc_ENG = "Identify and start trains by track occupation query" +Script = "Installscripts\Zuggreifer.ini" diff --git a/Installscripts/Zuggreifer.ini b/Installscripts/Zuggreifer.ini new file mode 100644 index 0000000..92894fe --- /dev/null +++ b/Installscripts/Zuggreifer.ini @@ -0,0 +1,3 @@ +[EEPInstall] +EEPVersion = 15 +File001 = "../Zuggreifer.lua","LUA\Zuggreifer.lua" diff --git a/Zuggreifer.lua b/Zuggreifer.lua new file mode 100644 index 0000000..3ebcfbe --- /dev/null +++ b/Zuggreifer.lua @@ -0,0 +1,106 @@ +-- Erwartet im Anlagenscript definierte Zuggreifer-Tabelle: +-- Schluessel ist die Signal-ID +-- Wert ist eine Liste von Gleisen vor dem Signal +-- Fuehrt das Gleis vom Signal weg statt hin, wird die ID negativ angegeben +function ZuggreiferInstallieren(Optionen) + if type(EEPRollingstockGetOrientation) ~= "function" and Optionen.FahrzeugeGleicheRichtung ~= true then + error("Zuggreifer erfordert mindestens EEP 15 Plugin 1") + end + if type(EEPRollingstockGetTrack) ~= "function" then + error("Zuggreifer erfordert mindestens EEP 15") + end + if type(Zuggreifer) ~= "table" then + error("Zuggreifer findet seine Tabelle nicht") + end + if type(leseSignal) ~= "function" then + error("Zuggreifer findet leseSignal() nicht") + end + if Optionen == nil then Optionen={} end + for Signal, Schienen in pairs(Zuggreifer) do + if EEPGetSignal(Signal) == 0 then + print("Zuggreifer findet Signal "..Signal.." nicht") + end + -- Schienen fuer die Gleisbesetztabfrage registrieren + for i=1,#Schienen do + local SchienenID = math.abs(Schienen[i]) + if not EEPRegisterRailTrack(SchienenID) then + print("Zuggreifer "..Signal.." findet Gleis "..SchienenID.." nicht") + end + end + -- Vorherigen Callback retten + local CallbackName = "EEPOnSignal_"..tostring(Signal) + local VorherigerCallback = _G[CallbackName] + -- Wenn der User vorher EEPRegisterSignal vergessen hat, holen wirs nicht nach. + -- Das darf nicht sein das es der User vergisst und es funktioniert trotzdem. + if VorherigerCallback == nil then + EEPRegisterSignal(Signal) + end + -- Callback registrieren + _G[CallbackName]=function(Stellung) + -- Vorherigen Callback trotzdem ausfuehren + if VorherigerCallback ~= nil then + VorherigerCallback(Stellung) + end + -- Nix tun, wenn das Signal auf Halt gestellt wurde + local Fahrt, V_max = leseSignal(Signal) + if not Fahrt then return end + if type(V_max) ~= "number" then V_max = 40 end + -- Zug ermitteln + local Zugname, Richtung = ZuggreiferAbfragen(Zuggreifer[Signal]) + -- Erfolg melden + if Optionen.Melden then + print("Signal ",Signal," hat ",Zugname and Zugname or "ins Leere"," gegriffen") + end + -- Abfahrbefehl erteilen + if Zugname then + if type(AnimiereAbfahrt) == "function" then + AnimiereAbfahrt(Zugname, V_max * Richtung) + else + EEPSetTrainSpeed(Zugname, V_max * Richtung) + end + end + end + end +end + +-- Schienen ist eine Liste von Gleis-IDs +-- Negative ID wenn andersherum verlegt +function ZuggreiferAbfragen(Schienen) + local Zugname = nil + local SchienenMap = {} + local Besetzt = false + local ok + -- Testen, ob hier ueberhaupt was steht + for i=1,#Schienen do + local SchienenID = math.abs(Schienen[i]) + SchienenMap[SchienenID] = Schienen[i] > 0 and 1 or -1 + if not Besetzt then + ok, Besetzt, Zugname = EEPIsRailTrackReserved(SchienenID , true) + if not ok then + error("Zuggreifer kann Gleis "..SchienenID.." nicht abfragen, wurde das Gleis registriert?") + end + end + end + -- Wenn hier ein Zug steht, dann... + if Zugname then + -- Alle Fahrzeuge durchgehen + local AnzahlFahrzeuge = EEPGetRollingstockItemsCount(Zugname) + for i=0,AnzahlFahrzeuge-1 do + local FahrzeugName = EEPGetRollingstockItemName(Zugname, i) + -- Testen, ob das Fahrzeug auf einen von "unseren" Gleisen steht + local ok, Gleis, _, FahrzeugRichtung, _ = EEPRollingstockGetTrack(FahrzeugName) + if not ok then return Zugname, 0 end + if SchienenMap[Gleis] ~= nil then + FahrzeugRichtung = FahrzeugRichtung > 0 and 1 or -1 + -- Richtung des Fahrzeugs im Zug ermitteln, benoetigt EEP 15 Plugin 1 + local FahrzeugVorwaerts = true + if type(EEPRollingstockGetOrientation) == "function" then + local ok, FahrzeugVorwaerts = EEPRollingstockGetOrientation(FahrzeugName) + end + -- Richtung zusammenmultiplizieren und mit Zugnamen zurueckgeben + return Zugname, SchienenMap[Gleis] * ( FahrzeugRichtung > 0 and 1 or -1) * (FahrzeugVorwaerts and 1 or -1) + end + end + end + return nil, 0 +end