Add Zuggreifer
This commit is contained in:
parent
640d94c53c
commit
c5e7843296
@ -4,3 +4,10 @@ Name_ENG = "Serializer"
|
|||||||
Desc_GER = "Lua-Tabellen serialisieren, in Slots abspeichern und wieder laden"
|
Desc_GER = "Lua-Tabellen serialisieren, in Slots abspeichern und wieder laden"
|
||||||
Desc_ENG = "Serialize Lua tables, save them in slots, and load them again"
|
Desc_ENG = "Serialize Lua tables, save them in slots, and load them again"
|
||||||
Script = "Installscripts\Serializer.ini"
|
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"
|
||||||
|
3
Installscripts/Zuggreifer.ini
Normal file
3
Installscripts/Zuggreifer.ini
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[EEPInstall]
|
||||||
|
EEPVersion = 15
|
||||||
|
File001 = "../Zuggreifer.lua","LUA\Zuggreifer.lua"
|
106
Zuggreifer.lua
Normal file
106
Zuggreifer.lua
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user