1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00
Files
MetrostroiAddon/lua/entities/gmod_track_signal_controller/init.lua
Αλέξανδρος 4c927670bd #315 (#342)
* Add "SetFreeBS" trigger input to signal controller

* Fix controller logic
2021-08-06 13:33:25 +03:00

148 lines
4.4 KiB
Lua

AddCSLuaFile("shared.lua")
AddCSLuaFile("cl_init.lua")
include("shared.lua")
function ENT:Initialize()
self:SetModel("models/z-o-m-b-i-e/metro_2033/electro/m33_electro_box_08.mdl")
self.Sig = ""
end
function ENT:OnRemove()
end
function ENT:Think()
if not IsValid(self.SignalEntity) then
self.SignalEntity = Metrostroi.GetSignalByName(self.Signal)
if IsValid(self.SignalEntity) then
print(Format("Metrostroi Signal Controller: Linked to signal %s",self.Signal))
if not self.SignalEntity.Controllers then
self.SignalEntity.Controllers = {}
table.insert(self.SignalEntity.Controllers,self)
end
self.SignalEntity.ControllerLogic = self.DisableSignal
for k,v in pairs(self.SignalEntity.Controllers) do
if v == self then
self:NextThink(CurTime() + 1.0)
return true
end
end
table.insert(self.SignalEntity.Controllers,self)
end
end
self:NextThink(CurTime() + 1.0)
return true
end
function ENT:KeyValue(key ,value)
if key == "targetsignal" then
self.Signal = value
elseif key == "disablesignal" and value == "1" then
self.DisableSignal = true
elseif key == "LenseEnabled" then
if not self.Entities then self.Entities = {} end
local tbl = string.Explode(",",value)
timer.Simple(0,function() table.insert(self.Entities,{ents.FindByName(tbl[1]),tbl[2]}) end)
self:StoreOutput(key,value)
elseif key == "LenseDisabled" then
if not self.Entities then self.Entities = {} end
local tbl = string.Explode(",",value)
timer.Simple(0,function() table.insert(self.Entities,{ents.FindByName(tbl[1]),tbl[2],true}) end)
self:StoreOutput(key,value)
end
end
function ENT:TriggerOutput(output,_,data)
if not self.Entities then return end
for k,v in pairs(self.Entities) do
if output == "LenseEnabled" and not v[3] or output == "LenseDisabled" and v[3] then
for _,ent in pairs(v[1]) do
ent:Fire(v[2],data)
end
end
end
end
function ENT:AcceptInput( input, activator, called, data )
if not IsValid(self.SignalEntity) then
self.SignalEntity = Metrostroi.GetSignalByName(self.Signal)
if not IsValid(self.SignalEntity) then
if #ents.FindByClass("gmod_track_signal") > 0 then
ErrorNoHalt(Format("\nMetrostroi Signal Controller: Can't find signal %s!\nCheck, that you use official verion of signal\n",self.Signal))
else
ErrorNoHalt("\nMetrostroi Signal Controller: Please, load a signals first!\n")
end
end
return true
end
local sig = self.SignalEntity
if input == "Open" then
for k,v in pairs(sig.Routes) do
if v.Manual then v.IsOpened = true end
end
elseif input == "OpenRoute" then
for k,v in pairs(sig.Routes) do
sig.Close = false
if v.RouteName and v.RouteName:upper() == data then
if v.Manual then v.IsOpened = true end
else
if v.Manual then v.IsOpened = false end
end
end
elseif input == "Close" then
for k,v in pairs(sig.Routes) do
if v.Manual then v.IsOpened = false end
end
elseif input == "SetKGU" then
sig.KGU = data == "1"
elseif input == "SetIS" then
sig.InvationSignal = data == "1"
elseif input == "SetSignal" then
local index = 0
for k,v in ipairs(sig.Lenses) do
if v ~= "M" then
--get the some models data
local dat = #v ~= 1 and sig.TrafficLightModels[sig.SignalType][#v-1] or sig.TrafficLightModels[sig.SignalType][sig.Signal_IS]
if not dat then continue end
for i = 1,#v do
if index == tonumber(data) then
sig.Sig = string.SetChar(sig.Sig,index,"1")
end
index = index + 1
end
end
end
elseif input == "ResetSignal" then
sig.Sig = ""
local index = 0
for k,v in ipairs(sig.Lenses) do
if v ~= "M" then
--get the some models data
local data = #v ~= 1 and sig.TrafficLightModels[sig.SignalType][#v-1] or sig.TrafficLightModels[sig.SignalType][sig.Signal_IS]
if not data then continue end
for i = 1,#v do
index = index + 1
sig.Sig = sig.Sig..0
end
end
end
elseif input == "SetFreq" then
sig.ARSSpeedLimit = tonumber(data) or 1
elseif input == "SetFreqMode26" then
sig.TwoToSix = true
elseif input == "SetFreqMode15" then
sig.TwoToSix = false
elseif input == "ResetFreq" then
sig.ARSSpeedLimit = 1
elseif input == "SetAutostop" then
sig.AutoEnabled = true
elseif input == "ResetAutostop" then
sig.AutoEnabled = false
elseif input == "SetRouteNumber" then
sig.RouteNumberReplace = data
elseif input == "ResetRouteNumber" then
sig.RouteNumberReplace = data
elseif input == "SetFreeBS" then
sig.FreeBS = tonumber(data) or 0
end
end