mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
1515 lines
68 KiB
Lua
1515 lines
68 KiB
Lua
TOOL.Category = "Metro"
|
|
TOOL.Name = "Signalling Tool"
|
|
TOOL.Command = nil
|
|
TOOL.ConfigName = ""
|
|
TOOL.ClientConVar["signaldata"] = ""
|
|
TOOL.ClientConVar["signdata"] = ""
|
|
TOOL.ClientConVar["autodata"] = ""
|
|
TOOL.ClientConVar["type"] = 1
|
|
TOOL.ClientConVar["routetype"] = 1
|
|
|
|
if SERVER then util.AddNetworkString "metrostroi-stool-signalling" end
|
|
|
|
|
|
local Types = {"Signal","Sign","Autodrive",[0] = "Choose Type"}
|
|
local TypesOfSignal = {"Inside","Outside big","Outside small"}
|
|
local TypesOfSign = {"NF","40","60","70","80","Station border","C(horn) Street","STOP Street","Dangerous","Deadlock",
|
|
"Stop marker","!(stop)","X","T Start","T End","T Sbor(engage)","Engines off","Engines on","C(horn)","T stop emer","Shod",
|
|
"Left doors","Phone▲","Phone▼","1up","STOP Street cyka","NF outside","35 outside","40 outside","60 outside","70 outside","80 outside",
|
|
"T Sbor(engage) outside","35","Dangerous 200","CR End","CR End(inv)","2up","3up","4up","5up","6up","X outside", "Metal","50","50 outside",
|
|
"Forward x2",
|
|
"Ted Off kn",
|
|
"Ted Off p1",
|
|
"Ted Off p2",
|
|
"Ted Off pn",
|
|
"Ted Off t1",
|
|
"Ted Off t2",
|
|
"Ted Off t3",
|
|
"Ted Off t4",
|
|
"Ted On kn",
|
|
"Ted On p1",
|
|
"Ted On p2",
|
|
"Ted On pn",
|
|
"Ted On t1",
|
|
"Ted On t2",
|
|
"Ted On t3",
|
|
"Ted On t4",
|
|
"Ted Off 722 10%",
|
|
"Ted Off 722 20%",
|
|
"Ted Off 722 30%",
|
|
"Ted Off 722 40%",
|
|
"Ted Off 722 50%",
|
|
"Ted Off 722 60%",
|
|
"Ted Off 722 70%",
|
|
"Ted Off 722 80%",
|
|
"Ted Off 722 90%",
|
|
"Ted Off 722 100%",
|
|
"Ted Off Outside",
|
|
"Ted On 722 10%",
|
|
"Ted On 722 20%",
|
|
"Ted On 722 30%",
|
|
"Ted On 722 40%",
|
|
"Ted On 722 50%",
|
|
"Ted On 722 60%",
|
|
"Ted On 722 70%",
|
|
"Ted On 722 80%",
|
|
"Ted On 722 90%",
|
|
"Ted On 722 100%",
|
|
"Ted On Outside",
|
|
}
|
|
local RouteTypes = {"Auto", "Manual","Repeater","Emerg"}
|
|
|
|
local TypesOfAuto = {
|
|
"Drive commands","Station brake command", "Door command","Light sensor","PA Marker","UPPS Sensor","SBPP Sensor"
|
|
}
|
|
TOOL.Type = 0
|
|
TOOL.RouteType = 1
|
|
|
|
--TOOL.Signal.Type = 1
|
|
|
|
if CLIENT then
|
|
language.Add("Tool.signalling.name", "Signalling Tool")
|
|
language.Add("Tool.signalling.desc", "Adds and modifies signalling equipment (ARS/ALS) or signs")
|
|
language.Add("Tool.signalling.0", "Primary: Spawn/update selected signalling entity (point at the inner side of rail)\nReload: Copy ARS/light settings\nSecondary: Remove")
|
|
--language.Add("Undone_signalling", "Undone ARS/signalling equipment")
|
|
end
|
|
|
|
function TOOL:SpawnSignal(ply,trace,param)
|
|
local pos = trace.HitPos
|
|
|
|
-- Use some code from rerailer --
|
|
local tr = Metrostroi.RerailGetTrackData(pos,ply:GetAimVector())
|
|
if not tr then return end
|
|
-- Create self.Signal entity
|
|
local ent
|
|
local found = false
|
|
local entlist = ents.FindInSphere(pos,64)
|
|
for k,v in pairs(entlist) do
|
|
if v:GetClass() == "gmod_track_signal" then
|
|
if v.Name==self.Signal.Name then
|
|
ent = v
|
|
found=0
|
|
break
|
|
end
|
|
if not found or found > pos:Distance(v:GetPos()) then
|
|
ent = v
|
|
found = pos:Distance(v:GetPos())
|
|
end
|
|
end
|
|
end
|
|
if param == 2 then
|
|
if not ent then return end
|
|
self.Signal.Type = ent.SignalType + 1
|
|
self.Signal.Name = ent.Name
|
|
self.Signal.Lenses = ent.LensesStr
|
|
self.Signal.RouteNumber = ent.RouteNumber
|
|
self.Signal.RouteNumberSetup = ent.RouteNumberSetup
|
|
self.Signal.IsolateSwitches = ent.IsolateSwitches
|
|
self.Signal.Approve0 = ent.Approve0
|
|
self.Signal.TwoToSix = ent.TwoToSix
|
|
self.Signal.ARSOnly = ent.ARSOnly
|
|
self.Signal.NonAutoStop = ent.NonAutoStop
|
|
self.Signal.PassOcc = ent.PassOcc
|
|
self.Signal.Routes = ent.Routes
|
|
self.Signal.Left = ent.Left
|
|
self.Signal.Double = ent.Double
|
|
self.Signal.DoubleL = ent.DoubleL
|
|
net.Start("metrostroi-stool-signalling")
|
|
net.WriteUInt(0,8)
|
|
net.WriteTable(self.Signal)
|
|
net.Send(self:GetOwner())
|
|
else
|
|
if not ent then ent = ents.Create("gmod_track_signal") end
|
|
if IsValid(ent) then
|
|
if param ~= 2 then
|
|
ent:SetPos(tr.centerpos - tr.up * 9.5)
|
|
ent:SetAngles((-tr.right):Angle())
|
|
end
|
|
if not found then
|
|
ent:Spawn()
|
|
-- Add to undo
|
|
--[[undo.Create("signalling")
|
|
undo.AddEntity(ent)
|
|
undo.SetPlayer(ply)
|
|
undo.Finish()]]
|
|
end
|
|
ent.SignalType = self.Signal.Type-1
|
|
ent.ARSOnly = self.Signal.ARSOnly
|
|
ent.Name = self.Signal.Name
|
|
ent.LensesStr = self.Signal.Lenses
|
|
ent.RouteNumber = self.Signal.RouteNumber
|
|
ent.RouteNumberSetup = self.Signal.RouteNumberSetup
|
|
ent.IsolateSwitches = self.Signal.IsolateSwitches
|
|
ent.Approve0 = self.Signal.Approve0
|
|
ent.NonAutoStop = self.Signal.NonAutoStop
|
|
ent.TwoToSix = self.Signal.TwoToSix
|
|
ent.Routes = self.Signal.Routes
|
|
ent.Left = self.Signal.Left
|
|
ent.Double = self.Signal.Double
|
|
ent.DoubleL = self.Signal.DoubleL
|
|
ent.Lenses = string.Explode("-",ent.LensesStr)
|
|
ent.PassOcc = self.Signal.PassOcc
|
|
ent.InS = nil
|
|
ent:SendUpdate()
|
|
for i = 1,#ent.Lenses do
|
|
if ent.Lenses[i]:find("W") then
|
|
ent.InS = i
|
|
end
|
|
end
|
|
Metrostroi.UpdateSignalEntities()
|
|
Metrostroi.PostSignalInitialize()
|
|
end
|
|
return ent
|
|
end
|
|
end
|
|
|
|
function TOOL:SpawnSign(ply,trace,param)
|
|
local pos = trace.HitPos
|
|
|
|
-- Use some code from rerailer --
|
|
local tr = Metrostroi.RerailGetTrackData(pos,ply:GetAimVector())
|
|
if not tr then return end
|
|
-- Create self.Sign entity
|
|
local ent
|
|
local found = false
|
|
local entlist = ents.FindInSphere(pos,64)
|
|
for k,v in pairs(entlist) do
|
|
if v:GetClass() == "gmod_track_signs" then
|
|
ent = v
|
|
found = true
|
|
end
|
|
end
|
|
if param == 2 then
|
|
if not ent then return end
|
|
self.Sign.Type = ent.SignType
|
|
self.Sign.YOffset = ent.YOffset
|
|
self.Sign.ZOffset = ent.ZOffset
|
|
self.Sign.Left = ent.Left
|
|
net.Start("metrostroi-stool-signalling")
|
|
net.WriteUInt(1,8)
|
|
net.WriteTable(self.Sign)
|
|
net.Send(self:GetOwner())
|
|
else
|
|
if not ent then ent = ents.Create("gmod_track_signs") end
|
|
if IsValid(ent) then
|
|
if param ~= 2 then
|
|
ent:SetPos(tr.centerpos - tr.up * 9.5)
|
|
ent:SetAngles((-tr.right):Angle() + Angle(0,90,0))
|
|
end
|
|
if not found then
|
|
ent:Spawn()
|
|
-- Add to undo
|
|
--[[undo.Create("signalling")
|
|
undo.AddEntity(ent)
|
|
undo.SetPlayer(ply)
|
|
undo.Finish()]]
|
|
end
|
|
ent.SignType = self.Sign.Type
|
|
ent.YOffset = self.Sign.YOffset
|
|
ent.ZOffset = self.Sign.ZOffset
|
|
ent.Left = self.Sign.Left
|
|
ent:SendUpdate()
|
|
end
|
|
return ent
|
|
end
|
|
end
|
|
|
|
function TOOL:SpawnAutoPlate(ply,trace,param)
|
|
local pos = trace.HitPos
|
|
|
|
-- Use some code from rerailer --
|
|
local tr = Metrostroi.RerailGetTrackData(pos,ply:GetAimVector())
|
|
if not tr then return end
|
|
|
|
local ent
|
|
local found = false
|
|
local entlist = ents.FindInSphere(pos,self.Auto.Type == 5 and 192 or 64)
|
|
for k,v in pairs(entlist) do
|
|
if v:GetClass() == "gmod_track_pa_marker" and self.Auto.Type == 5 or v:GetClass() == "gmod_track_autodrive_plate" and v.PlateType == self.Auto.Type and not v.Linked then
|
|
ent = v
|
|
found = true
|
|
break
|
|
end
|
|
end
|
|
if param == 2 then
|
|
if not ent then return end
|
|
--self.Auto.Type = ent.PlateType
|
|
|
|
if self.Auto.Type == METROSTROI_ACOIL_DRIVE then
|
|
self.Auto.Right = ent.Right
|
|
self.Auto.Mode = ent.Mode
|
|
self.Auto.StationID = ent.StationID
|
|
self.Auto.StationPath = ent.StationPath
|
|
elseif self.Auto.Type == METROSTROI_ACOIL_DOOR then
|
|
self.Auto.Right = ent.Right
|
|
elseif self.Auto.Type == 5 then
|
|
self.Auto.PAType = ent.PAType or 1
|
|
if self.Auto.PAType == 1 then
|
|
self.Auto.PAStationPath = ent.PAStationPath
|
|
self.Auto.PAStationID = ent.PAStationID
|
|
self.Auto.PAStationName = ent.PAStationName
|
|
self.Auto.PALastStation = ent.PALastStation
|
|
self.Auto.PAWrongPath = ent.PAWrongPath
|
|
self.Auto.PADeadlockStart = ent.PADeadlockStart
|
|
self.Auto.PADeadlockEnd = ent.PADeadlockEnd
|
|
self.Auto.PALineChange = ent.PALineChange
|
|
self.Auto.PALineChangeStationPath = ent.PALineChangeStationPath
|
|
self.Auto.PALineChangeStationID = ent.PALineChangeStationID
|
|
self.Auto.PALastStationName = ent.PALastStationName
|
|
self.Auto.PAStationHasSwtiches = ent.PAStationHasSwtiches
|
|
self.Auto.PAStationRightDoors = ent.PAStationRightDoors
|
|
self.Auto.PAStationHorlift = ent.PAStationHorlift
|
|
end
|
|
elseif self.Auto.Type == METROSTROI_SBPPSENSOR and not ent.Linked then
|
|
self.Auto.SBPPType = ent.SBPPType
|
|
self.Auto.SBPPDeadlock = ent.IsDeadlock
|
|
self.Auto.SBPPStationPath = ent.StationPath
|
|
self.Auto.SBPPStationID = ent.StationID
|
|
self.Auto.SBPPDriveMode = ent.DriveMode
|
|
self.Auto.SBPPRightDoors = ent.RightDoors
|
|
self.Auto.SBPPWTime = ent.WTime or 0
|
|
self.Auto.SBPPRK = ent.RKPos or 1
|
|
self.Auto.LXp = ent.DistanceToOPV
|
|
end
|
|
self.Auto.LXp = ent.DistanceToOPV or ent.LXp or self.Auto.LXp
|
|
self.Auto.LYp = ent.LYp or self.Auto.LYp
|
|
self.Auto.LZp = ent.LZp or self.Auto.LZp
|
|
net.Start("metrostroi-stool-signalling")
|
|
net.WriteUInt(2,8)
|
|
net.WriteTable(self.Auto)
|
|
net.Send(self:GetOwner())
|
|
else
|
|
if self.Auto.Type ~= 5 then
|
|
if not ent then ent = ents.Create("gmod_track_autodrive_plate") end
|
|
if IsValid(ent) then
|
|
local angle = (-tr.right):Angle()
|
|
angle:RotateAroundAxis(tr.up,90)
|
|
|
|
ent.PlateType = self.Auto.Type
|
|
local center = (tr.centerpos - tr.up * 9.5)
|
|
if self.Auto.Type == METROSTROI_ACOIL_DRIVE then
|
|
local dist = 50
|
|
if self.Auto.Dist == 1 then
|
|
ent.Model = "models/metrostroi/signals/autodrive/doska5.mdl"
|
|
dist = 5
|
|
elseif self.Auto.Dist == 2 then
|
|
ent.Model = "models/metrostroi/signals/autodrive/doska20.mdl"
|
|
dist = 20
|
|
else
|
|
ent.Model = "models/metrostroi/signals/autodrive/doska50.mdl"
|
|
end
|
|
ent.Right = self.Auto.Right
|
|
ent.Mode = self.Auto.Mode
|
|
if self.Auto.Mode == 3 or self.Auto.Mode == 4 then
|
|
dist = -dist/2+2.5+1.5
|
|
ent.StationID = self.Auto.StationID
|
|
ent.StationPath = self.Auto.StationPath
|
|
else
|
|
dist = 0
|
|
ent.StationID = nil
|
|
ent.StationPath = nil
|
|
end
|
|
|
|
if self.Auto.Mode < 3 or self.Auto.Mode == 5 or 6 < self.Auto.Mode then ent.Power = true end
|
|
if ent.Right then
|
|
ent:SetPos(center + (tr.forward*(-(dist)/0.01905)+tr.right*-66+tr.up*5))
|
|
else
|
|
ent:SetPos(center + (tr.forward*(-(dist)/0.01905)+tr.right*66+tr.up*5))
|
|
end
|
|
elseif self.Auto.Type == METROSTROI_ACOIL_SBRAKE then
|
|
ent.Model = "models/metrostroi/signals/autodrive/doska160.mdl"
|
|
ent:SetPos(center + (tr.forward*(-(80+2.5+1.5+0.4)/0.01905)+tr.right*66+tr.up*5)) ---75
|
|
elseif self.Auto.Type == METROSTROI_ACOIL_DOOR then
|
|
ent.Model = "models/metrostroi/signals/autodrive/doska5.mdl"
|
|
ent.Right = self.Auto.Right
|
|
if ent.Right then
|
|
ent:SetPos(center + (tr.forward*(-(4-2.5)/0.01905)+tr.right*66+tr.up*5))
|
|
else
|
|
ent:SetPos(center + (tr.forward*(-(4-2.5)/0.01905)+tr.right*-66+tr.up*5))
|
|
end
|
|
elseif self.Auto.Type == METROSTROI_LSENSOR then
|
|
ent.Model = "models/mus/metro/station_marker_4.mdl"
|
|
ent:SetPos(center + (tr.forward*(-(self.Auto.LXp or 0)/0.01905)+tr.right*((self.Auto.LYp or 0)/0.01905+120)+tr.up*((self.Auto.LZp or 0)/0.01905+130)))
|
|
angle:RotateAroundAxis(tr.up,90)
|
|
elseif self.Auto.Type == METROSTROI_UPPSSENSOR then
|
|
ent.Model = "models/metrostroi/upps.mdl"
|
|
ent:SetPos(center + (tr.forward*(-(self.Auto.LXp or 0)/0.01905)+tr.right*((self.Auto.LYp or 0)/0.01905)+tr.up*((0.8+(self.Auto.LZp or 0))/0.01905)))
|
|
ent.DistanceToOPV = self.Auto.LXp
|
|
ent.UPPS=true
|
|
angle:RotateAroundAxis(tr.forward,self.Auto.Roll or 0)
|
|
elseif self.Auto.Type == METROSTROI_SBPPSENSOR then
|
|
ent.SBPPType = self.Auto.SBPPType or 1
|
|
ent.IsDeadlock = ent.SBPPType<=3 and self.Auto.SBPPDeadlock
|
|
ent.StationPath = 2<=ent.SBPPType and ent.SBPPType<=3 and tonumber(self.Auto.SBPPStationPath)
|
|
ent.StationID = 2<=ent.SBPPType and ent.SBPPType<=3 and tonumber(self.Auto.SBPPStationID)
|
|
ent.DriveMode = ent.SBPPType==3 and self.Auto.SBPPDriveMode
|
|
ent.RightDoors = ent.SBPPType==3 and self.Auto.SBPPRightDoors
|
|
ent.WTime = (ent.SBPPType==3 or ent.SBPPType>=5) and self.Auto.SBPPWTime
|
|
ent.RKPos = ent.SBPPType==7 and self.Auto.SBPPRK
|
|
if ent.SBPPType<=2 then ent.DistanceToOPV = self.Auto.LXp end
|
|
ent.Model = "models/metrostroi/signals/autodrive/rfid.mdl"
|
|
local pos
|
|
if ent.SBPPType==1 then
|
|
pos = center
|
|
else
|
|
pos = center + (tr.forward*(-(self.Auto.LXp or 0)/0.01905)+tr.right*(-80+(self.Auto.LYp or 0)/0.01905)+tr.up*(52+(self.Auto.LZp or 0)/0.01905))
|
|
end
|
|
angle:RotateAroundAxis(tr.up,90)
|
|
angle:RotateAroundAxis(tr.forward,90)
|
|
if ent.SBPPType==1 then
|
|
local rpos = Metrostroi.GetPositionOnTrack(pos,angle)
|
|
local res = rpos[1]
|
|
if res then
|
|
local tpos, tang = Metrostroi.GetTrackPosition(res.path,res.x-self.Auto.LXp*(self.Auto.LInvX and -1 or 1))
|
|
if tpos then
|
|
tang = tang:Angle()
|
|
pos = tpos + (tang:Right()*(-79+(self.Auto.LYp or 0)/0.01905)*(self.Auto.LRightP and -1 or 1)+tang:Up()*(-60+(self.Auto.LZp or 0)/0.01905))
|
|
|
|
tang:RotateAroundAxis(tang:Up(),-90)
|
|
tang:RotateAroundAxis(tang:Right(),self.Auto.LRightP and 90 or -90)
|
|
angle = tang
|
|
end
|
|
end
|
|
elseif ent.SBPPType==3 and not ent.BrakeProps then
|
|
ent.BrakeProps = {}
|
|
for i=-1,1,2 do
|
|
local entL = ents.Create("gmod_track_autodrive_plate")
|
|
entL.Model = "models/metrostroi/signals/autodrive/rfid.mdl"
|
|
entL:SetPos(pos + (tr.forward*(-1.5*i)/0.01905))
|
|
entL:SetModel(ent.Model)
|
|
entL:SetAngles(angle)
|
|
entL:Spawn()
|
|
entL.Linked = ent
|
|
entL.SBPPType = ent.SBPPType
|
|
entL.PlateType = METROSTROI_SBPPSENSOR
|
|
table.insert(ent.BrakeProps,entL)
|
|
end
|
|
end
|
|
ent:SetPos(pos)
|
|
end
|
|
if not ent.DistanceToOPV then ent.LXp = self.Auto.LXp end
|
|
ent.LYp = self.Auto.LYp
|
|
ent.LZp = self.Auto.LZp
|
|
ent:SetModel(ent.Model)
|
|
ent:SetAngles(angle)
|
|
end
|
|
else
|
|
if not ent then ent = ents.Create("gmod_track_pa_marker") end
|
|
if IsValid(ent) then
|
|
local angle = (tr.forward):Angle()
|
|
local center = (tr.centerpos - tr.up * 9.5)
|
|
--angle:RotateAroundAxis(tr.up,90)
|
|
ent.PAType = self.Auto.PAType
|
|
ent.PAStationPath = tonumber(self.Auto.PAStationPath)
|
|
ent.PAStationID = tonumber(self.Auto.PAStationID)
|
|
ent.PAStationName = self.Auto.PAStationName or "N/A"
|
|
ent.PALastStation = self.Auto.PALastStation
|
|
ent.PAWrongPath = self.Auto.PAWrongPath
|
|
ent.PADeadlockStart = self.Auto.PADeadlockStart or 128
|
|
ent.PADeadlockEnd = self.Auto.PADeadlockEnd or 512
|
|
ent.PALineChange = self.Auto.PALineChange
|
|
ent.PALineChangeStationPath = self.Auto.PALineChangeStationPath
|
|
ent.PALineChangeStationID = self.Auto.PALineChangeStationID
|
|
ent.PALastStationName = self.Auto.PALastStationName
|
|
ent.PAStationRightDoors = self.Auto.PAStationRightDoors
|
|
ent.PAStationHorlift = self.Auto.PAStationHorlift
|
|
ent.PAStationHasSwtiches = self.Auto.PAStationHasSwtiches
|
|
ent:UpdateTrackPos(center,angle)
|
|
end
|
|
end
|
|
if not found then
|
|
ent:Spawn()
|
|
-- Add to undo
|
|
--[[undo.Create("signalling")
|
|
undo.AddEntity(ent)
|
|
undo.SetPlayer(ply)
|
|
undo.Finish()]]
|
|
end
|
|
return ent
|
|
end
|
|
end
|
|
|
|
function TOOL:LeftClick(trace)
|
|
if CLIENT then
|
|
return true
|
|
end
|
|
|
|
--self.Signal = util.JSONToTable(self:GetClientInfo("signaldata"):replace("''","\""))
|
|
--if not self.Signal then return end
|
|
local ply = self:GetOwner()
|
|
if (ply:IsValid()) and (not ply:IsAdmin()) then return false end
|
|
if not trace then return false end
|
|
if trace.Entity and trace.Entity:IsPlayer() then return false end
|
|
|
|
local ent
|
|
if self.Type == 1 then
|
|
ent = self:SpawnSignal(ply,trace)
|
|
elseif self.Type == 2 then
|
|
ent = self:SpawnSign(ply,trace)
|
|
elseif self.Type == 3 then
|
|
ent = self:SpawnAutoPlate(ply,trace)
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
function TOOL:RightClick(trace)
|
|
if CLIENT then
|
|
return true
|
|
end
|
|
|
|
local ply = self:GetOwner()
|
|
if (ply:IsValid()) and (not ply:IsAdmin()) then return false end
|
|
if not trace then return false end
|
|
if trace.Entity and trace.Entity:IsPlayer() then return false end
|
|
|
|
local entlist = ents.FindInSphere(trace.HitPos,(self.Type == 3 and self.Auto.Type == 5) and 192 or 64)
|
|
for k,v in pairs(entlist) do
|
|
if v:GetClass() == "gmod_track_signal" and self.Type == 1 then
|
|
if IsValid(v) then SafeRemoveEntity(v) end
|
|
end
|
|
if v:GetClass() == "gmod_track_switch" then
|
|
if IsValid(v) then SafeRemoveEntity(v) end
|
|
end
|
|
if v:GetClass() == "gmod_track_signs" and self.Type == 2 then
|
|
if IsValid(v) then SafeRemoveEntity(v) end
|
|
end
|
|
if v:GetClass() == "gmod_track_autodrive_plate" and self.Type == 3 and self.Auto.Type == v.PlateType then
|
|
if IsValid(v) then SafeRemoveEntity(v) end
|
|
end
|
|
if v:GetClass() == "gmod_track_pa_marker" and self.Type == 3 and self.Auto.Type == 5 then
|
|
if IsValid(v) then SafeRemoveEntity(v) end
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
function TOOL:Reload(trace)
|
|
if CLIENT then return true end
|
|
--self.Signal = util.JSONToTable(self:GetClientInfo("signaldata"):replace("''","\""))
|
|
|
|
local ply = self:GetOwner()
|
|
--if not (ply:IsValid()) and (not ply:IsAdmin()) then return false end
|
|
if not trace then return false end
|
|
if trace.Entity and trace.Entity:IsPlayer() then return false end
|
|
local ent
|
|
if self.Type == 1 then
|
|
ent = self:SpawnSignal(ply,trace,2)
|
|
elseif self.Type == 2 then
|
|
ent = self:SpawnSign(ply,trace,2)
|
|
elseif self.Type == 3 then
|
|
ent = self:SpawnAutoPlate(ply,trace,2)
|
|
end
|
|
return true
|
|
end
|
|
|
|
function TOOL:SendSettings()
|
|
if self.Type == 1 then
|
|
if not self.Signal then return end
|
|
RunConsoleCommand("signalling_signaldata",util.TableToJSON(self.Signal))
|
|
net.Start("metrostroi-stool-signalling")
|
|
net.WriteUInt(0,8)
|
|
--net.WriteEntity(self)
|
|
net.WriteTable(self.Signal)
|
|
net.SendToServer()
|
|
|
|
elseif self.Type == 2 then
|
|
if not self.Sign then return end
|
|
RunConsoleCommand("signalling_signdata",util.TableToJSON(self.Sign))
|
|
net.Start("metrostroi-stool-signalling")
|
|
net.WriteUInt(1,8)
|
|
--net.WriteEntity(self)
|
|
net.WriteTable(self.Sign)
|
|
net.SendToServer()
|
|
elseif self.Type == 3 then
|
|
if not self.Auto then return end
|
|
RunConsoleCommand("signalling_autodata",util.TableToJSON(self.Auto))
|
|
net.Start("metrostroi-stool-signalling")
|
|
net.WriteUInt(2,8)
|
|
--net.WriteEntity(self)
|
|
net.WriteTable(self.Auto)
|
|
net.SendToServer()
|
|
end
|
|
end
|
|
|
|
net.Receive("metrostroi-stool-signalling", function(_, ply)
|
|
local TOOL = LocalPlayer and LocalPlayer():GetTool("signalling") or ply:GetTool("signalling")
|
|
local typ = net.ReadUInt(8)
|
|
if typ == 2 then
|
|
TOOL.Auto = net.ReadTable()
|
|
if CLIENT then
|
|
RunConsoleCommand("signalling_signdata",util.TableToJSON(TOOL.Auto))
|
|
NeedUpdate = true
|
|
end
|
|
elseif typ == 1 then
|
|
TOOL.Sign = net.ReadTable()
|
|
if CLIENT then
|
|
RunConsoleCommand("signalling_signdata",util.TableToJSON(TOOL.Sign))
|
|
NeedUpdate = true
|
|
end
|
|
elseif typ == 0 then
|
|
TOOL.Signal = net.ReadTable()
|
|
if CLIENT then
|
|
RunConsoleCommand("signalling_signaldata",util.TableToJSON(TOOL.Signal))
|
|
NeedUpdate = true
|
|
end
|
|
end
|
|
TOOL.Type = typ+1
|
|
end)
|
|
|
|
function TOOL:BuildCPanelCustom()
|
|
local tool = self
|
|
local CPanel = controlpanel.Get("signalling")
|
|
if not CPanel then return end
|
|
--("signalling_signaldata",util.TableToJSON(tool.Signal))
|
|
--tool.Type = GetConVarNumber("signalling_type") or 1
|
|
tool.RouteType = GetConVar("signalling_routetype"):GetInt() or 1
|
|
CPanel:ClearControls()
|
|
CPanel:SetPadding(0)
|
|
CPanel:SetSpacing(0)
|
|
CPanel:Dock( FILL )
|
|
local VType = vgui.Create("DComboBox")
|
|
VType:ChooseOption(Types[tool.Type],tool.Type)
|
|
VType:SetColor(color_black)
|
|
for i = 1,#Types do
|
|
VType:AddChoice(Types[i])
|
|
end
|
|
VType.OnSelect = function(_, index, name)
|
|
VType:SetValue(name)
|
|
tool.Type = index
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
CPanel:AddItem(VType)
|
|
if tool.Type == 1 then
|
|
local VSType = vgui.Create("DComboBox")
|
|
VSType:ChooseOption(TypesOfSignal[tool.Signal.Type or 1],tool.Signal.Type or 1)
|
|
VSType:SetColor(color_black)
|
|
for i = 1,#TypesOfSignal do
|
|
VSType:AddChoice(TypesOfSignal[i])
|
|
end
|
|
VSType.OnSelect = function(_, index, name)
|
|
VSType:SetValue(name)
|
|
tool.Signal.Type = index
|
|
tool:SendSettings()
|
|
end
|
|
CPanel:AddItem(VSType)
|
|
local VNameT,VNameN = CPanel:TextEntry("Name:")
|
|
VNameT:SetTooltip("Name. Letters or digits!\nFor example:IND2")
|
|
VNameT:SetValue(tool.Signal.Name or "")
|
|
VNameT:SetEnterAllowed(false)
|
|
function VNameT:OnChange()
|
|
local oldval = self:GetValue()
|
|
local pos = self:GetCaretPos()
|
|
local NewValue = ""
|
|
for i = 1,10 do
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("^[%u%d%s/]+") or "")
|
|
end
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(pos < #NewValue and pos or #NewValue)
|
|
end
|
|
function VNameT:OnLoseFocus()
|
|
tool.Signal.Name = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
if not tool.Signal.ARSOnly then
|
|
local VLensT,VLensN = CPanel:TextEntry("Lenses:")
|
|
VLensT:SetTooltip("G - Green, Y - Yellow, R - Red, B - Blue, W - White, M - Routing Pointer\nExample: GYG-RW-M")
|
|
VLensT:SetValue(tool.Signal.Lenses or "")
|
|
VLensT:SetEnterAllowed(false)
|
|
function VLensT:OnChange()
|
|
local NewValue = ""
|
|
for i = 1,#self:GetValue() do
|
|
NewValue = NewValue..((self:GetValue()[i] or ""):upper():match("[RYGWBM-]") or "")
|
|
end
|
|
local NewValueT = string.Explode("-",NewValue)
|
|
local maxval = tool.Signal.Type == 3 and 4 or 3
|
|
for id,text in ipairs(NewValueT) do
|
|
if id > 4 then
|
|
for i = 5,#NewValueT do
|
|
table.remove(NewValueT,i)
|
|
end
|
|
break
|
|
end
|
|
if text:find("M") then
|
|
if text[1] == "M" then
|
|
NewValueT[id] = "M"
|
|
else
|
|
NewValueT[id] = text:gsub("M","")
|
|
id = id + 1
|
|
NewValueT[id] = "M"
|
|
end
|
|
for i = id+1,#NewValueT do
|
|
table.remove(NewValueT, i)
|
|
end
|
|
break
|
|
end
|
|
text = text:match("[RYGWB]+") or ""
|
|
--[[local WFind = id==3 and text:find("W") or nil
|
|
--print(MFind,id)
|
|
if WFind then
|
|
if text:find("M") then
|
|
NewValueT[#NewValueT+1] = "M"
|
|
end
|
|
|
|
NewValueT[id] = "W"
|
|
else]]
|
|
NewValueT[id] = text:sub(1,maxval)
|
|
if #text > maxval then
|
|
NewValueT[#NewValueT+1] = text:sub(maxval+1,#text)
|
|
end
|
|
--end
|
|
--[[
|
|
if MID > 0 then
|
|
for i = MID,#NewValueT do
|
|
table.remove(NewValueT,i)
|
|
end
|
|
break
|
|
end]]
|
|
end
|
|
local NewValue = table.concat(NewValueT,"-")
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(#NewValue)
|
|
end
|
|
function VLensT:OnLoseFocus()
|
|
tool.Signal.Lenses = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
if tool.Signal.Type == 1 then
|
|
local VRoutT,VRoutN = CPanel:TextEntry("Custom route number:")
|
|
VRoutT:SetTooltip("Custom routte number. Can be empty. For example:12WK")
|
|
VRoutT:SetValue(tool.Signal.RouteNumberSetup or "")
|
|
VRoutT:SetEnterAllowed(false)
|
|
function VRoutT:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[1-4DWKFLRX]+") or "")
|
|
end
|
|
local oldpos = self:GetCaretPos()
|
|
self:SetText(NewValue:sub(1,5))
|
|
self:SetCaretPos(math.min(5,oldpos))
|
|
end
|
|
function VRoutT:OnLoseFocus()
|
|
tool.Signal.RouteNumberSetup = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
local VLeftC = CPanel:CheckBox("Left side")
|
|
VLeftC:SetTooltip("Left side")
|
|
VLeftC:SetValue(tool.Signal.Left or false)
|
|
function VLeftC:OnChange()
|
|
tool.Signal.Left = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local VDoubleC = CPanel:CheckBox("Double side")
|
|
if tool.Signal.Double then
|
|
local VDoubleLC = CPanel:CheckBox("Double light")
|
|
VDoubleLC:SetTooltip("DoubleL light")
|
|
VDoubleLC:SetValue(tool.Signal.DoubleL or false)
|
|
function VDoubleLC:OnChange()
|
|
tool.Signal.DoubleL = self:GetChecked() and tool.Signal.Double
|
|
self:SetChecked(tool.Signal.DoubleL)
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
VDoubleC:SetTooltip("Double side")
|
|
VDoubleC:SetValue(tool.Signal.Double or false)
|
|
function VDoubleC:OnChange()
|
|
tool.Signal.Double = self:GetChecked()
|
|
tool.Signal.DoubleL = tool.Signal.DoubleL and self:GetChecked()
|
|
tool:BuildCPanelCustom()
|
|
--if tool.Signal.Double then VDoubleLC:SetChecked(tool.Signal.DoubleL and tool.Signal.Double) end
|
|
tool:SendSettings()
|
|
end
|
|
local VRouT,VRouN = CPanel:TextEntry("Route number:")
|
|
VRouT:SetTooltip("Route number. Can be empty. One digit or D.\nFor example:D")
|
|
VRouT:SetValue(tool.Signal.RouteNumber or "")
|
|
VRouT:SetEnterAllowed(false)
|
|
function VRouT:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
if #NewValue > 0 then break end
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match(tool.Signal.Type == 1 and "[%dDFLR]" or "[%dD]") or "")
|
|
end
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(0)
|
|
end
|
|
function VRouT:OnLoseFocus()
|
|
tool.Signal.RouteNumber = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local VIsoSC = CPanel:CheckBox("Isolating switches")
|
|
VIsoSC:SetTooltip("Is tool.Signal isolate switch signals")
|
|
VIsoSC:SetValue(tool.Signal.IsolateSwitches or false)
|
|
function VIsoSC:OnChange()
|
|
tool.Signal.IsolateSwitches = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local VAppC = CPanel:CheckBox("325Hz on 0")
|
|
VAppC:SetTooltip("Is tool.Signal will be issuse 325Hz(for PA-KSD) on zero?")
|
|
VAppC:SetValue(tool.Signal.Approve0 or false)
|
|
function VAppC:OnChange()
|
|
tool.Signal.Approve0 = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local VAuStC = CPanel:CheckBox("Autostop")
|
|
VAuStC:SetTooltip("Is autostop present or no?")
|
|
if tool.Signal.NonAutoStop ~= nil then
|
|
VAuStC:SetValue(not tool.Signal.NonAutoStop)
|
|
else
|
|
VAuStC:SetValue(true)
|
|
end
|
|
function VAuStC:OnChange()
|
|
tool.Signal.NonAutoStop = not self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local VDepC = CPanel:CheckBox("2/6")
|
|
VDepC:SetTooltip("Is Signal produces 2 freqencies or not?")
|
|
VDepC:SetValue(tool.Signal.TwoToSix or false)
|
|
function VDepC:OnChange()
|
|
tool.Signal.TwoToSix = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local VARSOC = CPanel:CheckBox("ARS Only")
|
|
VARSOC:SetTooltip("ARS Box")
|
|
VARSOC:SetValue(tool.Signal.ARSOnly or false)
|
|
function VARSOC:OnChange()
|
|
tool.Signal.ARSOnly = self:GetChecked()
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
local VPassOccC = CPanel:CheckBox("Pass occupation signal")
|
|
VPassOccC:SetTooltip("Pass occupation signal")
|
|
VPassOccC:SetValue(tool.Signal.PassOcc or false)
|
|
function VPassOccC:OnChange()
|
|
tool.Signal.PassOcc = self:GetChecked()
|
|
tool:SendSettings()
|
|
--tool:BuildCPanelCustom()
|
|
end
|
|
|
|
for i = 1,(tool.Signal.Routes and #tool.Signal.Routes or 0) do
|
|
local CollCat = vgui.Create("DForm")
|
|
local rou = tool.Signal.Routes[i].Manual and 2 or tool.Signal.Routes[i].Repeater and 3 or tool.Signal.Routes[i].Emer and 4 or 1
|
|
CollCat:SetLabel(RouteTypes[rou])
|
|
CollCat:SetExpanded(1)
|
|
local VTypeOfRouteI = vgui.Create("DComboBox")
|
|
--VType:SetValue("Choose tool.Type")
|
|
VTypeOfRouteI:ChooseOption(RouteTypes[rou],rou)
|
|
for i1 = 1,#RouteTypes do
|
|
VTypeOfRouteI:AddChoice(RouteTypes[i1])
|
|
end
|
|
VTypeOfRouteI.OnSelect = function(_, index, name)
|
|
VTypeOfRouteI:SetValue(name)
|
|
tool.Signal.Routes[i].Manual = index == 2
|
|
tool.Signal.Routes[i].Repeater = index == 3
|
|
tool.Signal.Routes[i].Emer = index == 4
|
|
tool:SendSettings()
|
|
self:BuildCPanelCustom()
|
|
end
|
|
CollCat:AddItem(VTypeOfRouteI)
|
|
local VRNT,VRNN = CollCat:TextEntry("Route name:")
|
|
VRNT:SetText(tool.Signal.Routes[i].RouteName or "")
|
|
VRNT:SetTooltip("Route name.\nIt uses for !sopen or !sclose")
|
|
function VRNT:OnLoseFocus()
|
|
tool.Signal.Routes[i].RouteName = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local VNexT,VNexN = CollCat:TextEntry("Next Signal:")
|
|
VNexT:SetText(tool.Signal.Routes[i].NextSignal or "")
|
|
VNexT:SetTooltip("Next Signal. Name of the next Signal.\nFor example:[113]IND2")
|
|
function VNexT:OnChange()
|
|
local oldval = self:GetValue()
|
|
local pos = self:GetCaretPos()
|
|
local NewValue = ""
|
|
for i = 1,10 do
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%u%d%s%*/]") or "")
|
|
end
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(pos < #NewValue and pos or #NewValue)
|
|
end
|
|
function VNexT:OnLoseFocus()
|
|
tool.Signal.Routes[i].NextSignal = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
if not tool.Signal.ARSOnly then
|
|
local VLighT,VLighN = CollCat:TextEntry("Lights:")
|
|
VLighT:SetText(tool.Signal.Routes[i].Lights or "")
|
|
VLighT:SetTooltip("Numbers of lenses.\nFor example: for RGY:1-13-3-32-2 (R-RY-Y-YG-G)")
|
|
function VLighT:OnLoseFocus()
|
|
tool.Signal.Routes[i].Lights = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
if not tool.Signal.Routes[i].Repeater then
|
|
local VARST,VARSN = CollCat:TextEntry("ARSCodes:")
|
|
VARST:SetText(tool.Signal.Routes[i].ARSCodes or "")
|
|
VARST:SetTooltip("ARS Codes:0 - 0, 1 - No frequency, 2 - Absolute stop, 4 - 40, 6 - 60, 7 - 70, 8 - 80\nFor example: 004678(0-0-40-60-70-80)")
|
|
function VARST:OnLoseFocus()
|
|
tool.Signal.Routes[i].ARSCodes = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
local VSwiT,VSwiN = CollCat:TextEntry("Switches:")
|
|
VSwiT:SetText(tool.Signal.Routes[i].Switches or "")
|
|
VSwiT:SetTooltip("Switches. Next Switches + State. Can be empty(if no switches to next tool.Signal).\nFor example: 112+,114-,116+")
|
|
function VSwiT:OnLoseFocus()
|
|
tool.Signal.Routes[i].Switches = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local VEnRouC = CollCat:CheckBox("Enable route number")
|
|
VEnRouC:SetTooltip("Enable route number(when disabled route number enables only with invitation signal)")
|
|
VEnRouC:SetValue(tool.Signal.Routes[i].EnRou or false)
|
|
function VEnRouC:OnChange()
|
|
tool.Signal.Routes[i].EnRou = self:GetChecked()
|
|
tool:SendSettings()
|
|
--tool:BuildCPanelCustom()
|
|
end
|
|
local VRemoveR = CollCat:Button("Remove route")
|
|
VRemoveR.DoClick = function()
|
|
table.remove(tool.Signal.Routes,i)
|
|
tool:SendSettings()
|
|
self:BuildCPanelCustom()
|
|
end
|
|
CPanel:AddItem(CollCat)
|
|
end
|
|
CPanel:AddItem(VAddPanel)
|
|
local VTypeOfRoute = vgui.Create("DComboBox")
|
|
--VType:SetValue("Choose tool.Type")
|
|
VTypeOfRoute:ChooseOption(RouteTypes[tool.RouteType],tool.RouteType)
|
|
VTypeOfRoute:SetColor(color_black)
|
|
for i = 1,#RouteTypes do
|
|
VTypeOfRoute:AddChoice(RouteTypes[i])
|
|
end
|
|
VTypeOfRoute.OnSelect = function(_, index, name)
|
|
VTypeOfRoute:SetValue(name)
|
|
tool.RouteType = index
|
|
end
|
|
CPanel:AddItem(VTypeOfRoute)
|
|
local VAddR = CPanel:Button("Add route")
|
|
VAddR.DoClick = function()
|
|
if not tool.Signal.Routes then tool.Signal.Routes = {} end
|
|
table.insert(tool.Signal.Routes,{Manual = tool.RouteType==2, Repeater = tool.RouteType == 3, Emer = tool.RouteType == 4, RouteName = ""})
|
|
tool:SendSettings()
|
|
self:BuildCPanelCustom()
|
|
end
|
|
elseif tool.Type == 2 then
|
|
--local VNotF = vgui.Create("DLabel") VNotF:SetText("Not Finished yet!!")
|
|
local VSType = vgui.Create("DComboBox")
|
|
VSType:ChooseOption(TypesOfSign[tool.Sign.Type or 1],tool.Sign.Type or 1)
|
|
VSType:SetColor(color_black)
|
|
for i = 1,#TypesOfSign do
|
|
VSType:AddChoice(TypesOfSign[i])
|
|
end
|
|
VSType.OnSelect = function(_, index, name)
|
|
VSType:SetValue(name)
|
|
tool.Sign.Type = index
|
|
tool:SendSettings()
|
|
end
|
|
CPanel:AddItem(VSType)
|
|
local VYOffT = CPanel:NumSlider("Y Offset:",nil,-100,100,0)
|
|
VYOffT:SetValue(tool.Sign.YOffset or 0)
|
|
VYOffT.OnValueChanged = function(num)
|
|
tool.Sign.YOffset = VYOffT:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local VZOffT = CPanel:NumSlider("Z Offset:",nil,-50,50,0)
|
|
VZOffT:SetValue(tool.Sign.ZOffset or 0)
|
|
VZOffT.OnValueChanged = function(num)
|
|
tool.Sign.ZOffset = VZOffT:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local VLeftOC = CPanel:CheckBox("Left side(if can be left-side)")
|
|
VLeftOC:SetTooltip("Left side")
|
|
VLeftOC:SetValue(tool.Sign.Left or false)
|
|
function VLeftOC:OnChange()
|
|
tool.Sign.Left = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
elseif tool.Type == 3 then
|
|
--local VNotF = vgui.Create("DLabel") VNotF:SetText("Not Finished yet!!")
|
|
local VAType = vgui.Create("DComboBox")
|
|
CPanel:AddItem(VAType)
|
|
VAType:SetColor(color_black)
|
|
for i = 1,#TypesOfAuto do
|
|
VAType:AddChoice(TypesOfAuto[i])
|
|
end
|
|
VAType:ChooseOptionID(tool.Auto.Type or 1)
|
|
VAType.OnSelect = function(_, index, name)
|
|
VAType:SetValue(name)
|
|
tool.Auto.Type = index
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
if tool.Auto.Type == METROSTROI_ACOIL_DOOR then
|
|
local VRightOC = CPanel:CheckBox("Right doors")
|
|
VRightOC:SetTooltip("Right doors")
|
|
VRightOC:SetValue(tool.Auto.Right or false)
|
|
function VRightOC:OnChange()
|
|
tool.Auto.Right = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
if tool.Auto.Type == METROSTROI_LSENSOR or tool.Auto.Type == METROSTROI_UPPSSENSOR or tool.Auto.Type == METROSTROI_SBPPSENSOR then
|
|
local VLXpT = CPanel:NumSlider("X:",nil,0,200,2)
|
|
VLXpT:SetValue(tool.Auto.LXp or 0)
|
|
VLXpT.OnValueChanged = function(num)
|
|
tool.Auto.LXp = VLXpT:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
if tool.Auto.Type ~= 5 then
|
|
local VLYpT = CPanel:NumSlider("Y:",nil,-10,10,2)
|
|
VLYpT:SetValue(tool.Auto.LYp or 0)
|
|
VLYpT.OnValueChanged = function(num)
|
|
tool.Auto.LYp = VLYpT:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local VLZpT = CPanel:NumSlider("Z:",nil,-10,10,2)
|
|
VLZpT:SetValue(tool.Auto.LZp or 0)
|
|
VLZpT.OnValueChanged = function(num)
|
|
tool.Auto.LZp = VLZpT:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
if tool.Auto.Type == 5 then
|
|
local VAPAType = vgui.Create("DComboBox")
|
|
CPanel:AddItem(VAPAType)
|
|
VAPAType:SetColor(color_black)
|
|
VAPAType:AddChoice("OPV")
|
|
VAPAType:ChooseOptionID(tool.Auto.PAType or 1)
|
|
VAPAType.OnSelect = function(_, index, name)
|
|
VAPAType:SetValue(name)
|
|
tool.Auto.PAType = index
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
if tool.Auto.PAType == 1 then
|
|
local SPath = CPanel:TextEntry("Station path:")
|
|
SPath:SetTooltip("Station path")
|
|
SPath:SetValue(tool.Auto.PAStationPath or "")
|
|
SPath:SetEnterAllowed(false)
|
|
function SPath:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
if #NewValue > 0 then break end
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]") or "")
|
|
end
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(0)
|
|
end
|
|
function SPath:OnLoseFocus()
|
|
tool.Auto.PAStationPath = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SID = CPanel:TextEntry("Station ID:")
|
|
SID:SetTooltip("Station index")
|
|
SID:SetValue(tool.Auto.PAStationID or "")
|
|
SID:SetEnterAllowed(false)
|
|
function SID:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]+") or "")
|
|
end
|
|
local oldpos = self:GetCaretPos()
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(math.min(#NewValue,oldpos))
|
|
end
|
|
function SID:OnLoseFocus()
|
|
tool.Auto.PAStationID = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SLast = CPanel:CheckBox("Last station")
|
|
SLast:SetTooltip("Last station")
|
|
SLast:SetValue(tool.Auto.PALastStation or false)
|
|
function SLast:OnChange()
|
|
tool.Auto.PALastStation = self:GetChecked()
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
if tool.Auto.PALastStation then
|
|
local SLWrongPath = CPanel:CheckBox("In wrong path")
|
|
SLWrongPath:SetValue(tool.Auto.PAWrongPath or false)
|
|
function SLWrongPath:OnChange()
|
|
tool.Auto.PAWrongPath = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local SLDStart = CPanel:NumSlider("Distance to\ndeadlock start:",nil,0,1024,0)
|
|
SLDStart:SetValue(tool.Auto.PADeadlockStart or 128)
|
|
SLDStart.OnValueChanged = function(num)
|
|
tool.Auto.PADeadlockStart = SLDStart:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SLDEnd = CPanel:NumSlider("Distance to\ndeadlock end:",nil,0,1024,0)
|
|
SLDEnd:SetValue(tool.Auto.PADeadlockEnd or 512)
|
|
SLDEnd.OnValueChanged = function(num)
|
|
tool.Auto.PADeadlockEnd = SLDEnd:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SLLChange = CPanel:CheckBox("Line change")
|
|
SLLChange:SetValue(tool.Auto.PALineChange or false)
|
|
function SLLChange:OnChange()
|
|
tool.Auto.PALineChange = self:GetChecked()
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
if tool.Auto.PALineChange then
|
|
local SLLCLine = CPanel:TextEntry("Line change\nstation path:")
|
|
SLLCLine:SetValue(tool.Auto.PALineChangeStationPath or "")
|
|
SLLCLine:SetEnterAllowed(false)
|
|
function SLLCLine:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
if #NewValue > 0 then break end
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]") or "")
|
|
end
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(0)
|
|
end
|
|
function SLLCLine:OnLoseFocus()
|
|
tool.Auto.PALineChangeStationPath = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SLLCID = CPanel:TextEntry("Line change\nstation ID:")
|
|
SLLCID:SetTooltip("Station index")
|
|
SLLCID:SetValue(tool.Auto.PALineChangeStationID or "")
|
|
SLLCID:SetEnterAllowed(false)
|
|
function SLLCID:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]+") or "")
|
|
end
|
|
local oldpos = self:GetCaretPos()
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(math.min(#NewValue,oldpos))
|
|
end
|
|
function SLLCID:OnLoseFocus()
|
|
tool.Auto.PALineChangeStationID = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
end
|
|
local SName = CPanel:TextEntry("Station name:")
|
|
SName:SetTooltip("Station name")
|
|
SName:SetValue(tool.Auto.PAStationName or "")
|
|
SName:SetEnterAllowed(false)
|
|
function SName:OnLoseFocus()
|
|
tool.Auto.PAStationName = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
if tool.Auto.PALastStation then
|
|
local SLName = CPanel:TextEntry("Last station name:")
|
|
SLName:SetTooltip("Last station name")
|
|
SLName:SetValue(tool.Auto.PALastStationName or "")
|
|
SLName:SetEnterAllowed(false)
|
|
function SLName:OnLoseFocus()
|
|
tool.Auto.PALastStationName = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
local SHorlift = CPanel:CheckBox("Has switches:")
|
|
SHorlift:SetTooltip("Has switches")
|
|
SHorlift:SetValue(tool.Auto.PAStationHasSwtiches or false)
|
|
function SHorlift:OnChange()
|
|
tool.Auto.PAStationHasSwtiches = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local SRDoors = CPanel:CheckBox("Rights doors")
|
|
SRDoors:SetTooltip("Rights doors")
|
|
SRDoors:SetValue(tool.Auto.PAStationRightDoors or false)
|
|
function SRDoors:OnChange()
|
|
tool.Auto.PAStationRightDoors = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local SHorlift = CPanel:CheckBox("Horlift")
|
|
SHorlift:SetTooltip("Horlift")
|
|
SHorlift:SetValue(tool.Auto.PAStationHorlift or false)
|
|
function SHorlift:OnChange()
|
|
tool.Auto.PAStationHorlift = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
end
|
|
if tool.Auto.Type == METROSTROI_SBPPSENSOR then
|
|
local VASBPPType = vgui.Create("DComboBox")
|
|
CPanel:AddItem(VASBPPType)
|
|
VASBPPType:SetColor(color_black)
|
|
VASBPPType:AddChoice("ST1")
|
|
VASBPPType:AddChoice("ST2")
|
|
VASBPPType:AddChoice("OPV")
|
|
VASBPPType:AddChoice("OD")
|
|
VASBPPType:AddChoice("X2")
|
|
VASBPPType:AddChoice("X3")
|
|
VASBPPType:AddChoice("TP")
|
|
VASBPPType:ChooseOptionID(tool.Auto.SBPPType or 1)
|
|
VASBPPType.OnSelect = function(_, index, name)
|
|
VASBPPType:SetValue(name)
|
|
tool.Auto.SBPPType = index
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
local SBPPType = tool.Auto.SBPPType or 1
|
|
if SBPPType <= 3 then
|
|
local SDeadlock = CPanel:CheckBox("Deadlock")
|
|
SDeadlock:SetTooltip("Deadlock")
|
|
SDeadlock:SetValue(tool.Auto.SBPPDeadlock or false)
|
|
function SDeadlock:OnChange()
|
|
tool.Auto.SBPPDeadlock = self:GetChecked()
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
end
|
|
if SBPPType == 1 then
|
|
local SRPos = CPanel:CheckBox("Rights pos")
|
|
SRPos:SetTooltip("Rights pos")
|
|
SRPos:SetValue(tool.Auto.LRightP or false)
|
|
function SRPos:OnChange()
|
|
tool.Auto.LRightP = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local SRInvX = CPanel:CheckBox("Invert X")
|
|
SRInvX:SetTooltip("Invert X")
|
|
SRInvX:SetValue(tool.Auto.LInvX or false)
|
|
function SRInvX:OnChange()
|
|
tool.Auto.LInvX = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
if 2<= SBPPType and SBPPType <= 3 and not tool.Auto.SBPPDeadlock then
|
|
local SPath = CPanel:TextEntry("Station path:")
|
|
SPath:SetTooltip("Station path")
|
|
SPath:SetValue(tool.Auto.SBPPStationPath or "")
|
|
SPath:SetEnterAllowed(false)
|
|
function SPath:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
if #NewValue > 0 then break end
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]") or "")
|
|
end
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(0)
|
|
end
|
|
function SPath:OnLoseFocus()
|
|
tool.Auto.SBPPStationPath = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SID = CPanel:TextEntry("Station ID:")
|
|
SID:SetTooltip("Station index")
|
|
SID:SetValue(tool.Auto.SBPPStationID or "")
|
|
SID:SetEnterAllowed(false)
|
|
function SID:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]+") or "")
|
|
end
|
|
local oldpos = self:GetCaretPos()
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(math.min(#NewValue,oldpos))
|
|
end
|
|
function SID:OnLoseFocus()
|
|
tool.Auto.SBPPStationID = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
if SBPPType == 3 then
|
|
local SRDoors = CPanel:CheckBox("Rights doors")
|
|
SRDoors:SetTooltip("Rights doors")
|
|
SRDoors:SetValue(tool.Auto.SBPPRightDoors or false)
|
|
function SRDoors:OnChange()
|
|
tool.Auto.SBPPRightDoors = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local SDriveMode = vgui.Create("DComboBox")
|
|
CPanel:AddItem(SDriveMode)
|
|
SDriveMode:SetColor(color_black)
|
|
SDriveMode:AddChoice("None")
|
|
SDriveMode:AddChoice("X2")
|
|
SDriveMode:AddChoice("X3")
|
|
SDriveMode:ChooseOptionID(tool.Auto.SBPPDriveMode or 1)
|
|
SDriveMode.OnSelect = function(_, index, name)
|
|
SDriveMode:SetValue(name)
|
|
tool.Auto.SBPPDriveMode = index
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
if SBPPType==7 then
|
|
local SRK = CPanel:NumSlider("RK Pos:",nil,1,18,0)
|
|
SRK:SetValue(tool.Auto.SBPPRK or 1)
|
|
SRK.OnValueChanged = function(num)
|
|
tool.Auto.SBPPRK = SRK:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
if SBPPType == 3 or SBPPType>=5 then
|
|
local STime = CPanel:NumSlider("Work time:",nil,0,120,2)
|
|
STime:SetValue(tool.Auto.SBPPWTime or 0)
|
|
STime.OnValueChanged = function(num)
|
|
tool.Auto.SBPPWTime = STime:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
--[[ local SPath = CPanel:TextEntry("Station path:")
|
|
SPath:SetTooltip("Station path")
|
|
SPath:SetValue(tool.Auto.PAStationPath or "")
|
|
SPath:SetEnterAllowed(false)
|
|
function SPath:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
if #NewValue > 0 then break end
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]") or "")
|
|
end
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(0)
|
|
end
|
|
function SPath:OnLoseFocus()
|
|
tool.Auto.PAStationPath = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SID = CPanel:TextEntry("Station ID:")
|
|
SID:SetTooltip("Station index")
|
|
SID:SetValue(tool.Auto.PAStationID or "")
|
|
SID:SetEnterAllowed(false)
|
|
function SID:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]+") or "")
|
|
end
|
|
local oldpos = self:GetCaretPos()
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(math.min(#NewValue,oldpos))
|
|
end
|
|
function SID:OnLoseFocus()
|
|
tool.Auto.PAStationID = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SLast = CPanel:CheckBox("Last station")
|
|
SLast:SetTooltip("Last station")
|
|
SLast:SetValue(tool.Auto.PALastStation or false)
|
|
function SLast:OnChange()
|
|
tool.Auto.PALastStation = self:GetChecked()
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
if tool.Auto.PALastStation then
|
|
local SLWrongPath = CPanel:CheckBox("In wrong path")
|
|
SLWrongPath:SetValue(tool.Auto.PAWrongPath or false)
|
|
function SLWrongPath:OnChange()
|
|
tool.Auto.PAWrongPath = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local SLDStart = CPanel:NumSlider("Distance to\ndeadlock start:",nil,0,1024,0)
|
|
SLDStart:SetValue(tool.Auto.PADeadlockStart or 128)
|
|
SLDStart.OnValueChanged = function(num)
|
|
tool.Auto.PADeadlockStart = SLDStart:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SLDEnd = CPanel:NumSlider("Distance to\ndeadlock end:",nil,0,1024,0)
|
|
SLDEnd:SetValue(tool.Auto.PADeadlockEnd or 512)
|
|
SLDEnd.OnValueChanged = function(num)
|
|
tool.Auto.PADeadlockEnd = SLDEnd:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SLLChange = CPanel:CheckBox("Line change")
|
|
SLLChange:SetValue(tool.Auto.PALineChange or false)
|
|
function SLLChange:OnChange()
|
|
tool.Auto.PALineChange = self:GetChecked()
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
if tool.Auto.PALineChange then
|
|
local SLLCLine = CPanel:TextEntry("Line change\nstation path:")
|
|
SLLCLine:SetValue(tool.Auto.PALineChangeStationPath or "")
|
|
SLLCLine:SetEnterAllowed(false)
|
|
function SLLCLine:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
if #NewValue > 0 then break end
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]") or "")
|
|
end
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(0)
|
|
end
|
|
function SLLCLine:OnLoseFocus()
|
|
tool.Auto.PALineChangeStationPath = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SLLCID = CPanel:TextEntry("Line change\nstation ID:")
|
|
SLLCID:SetTooltip("Station index")
|
|
SLLCID:SetValue(tool.Auto.PALineChangeStationID or "")
|
|
SLLCID:SetEnterAllowed(false)
|
|
function SLLCID:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]+") or "")
|
|
end
|
|
local oldpos = self:GetCaretPos()
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(math.min(#NewValue,oldpos))
|
|
end
|
|
function SLLCID:OnLoseFocus()
|
|
tool.Auto.PALineChangeStationID = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
end
|
|
local SName = CPanel:TextEntry("Station name:")
|
|
SName:SetTooltip("Station name")
|
|
SName:SetValue(tool.Auto.PAStationName or "")
|
|
SName:SetEnterAllowed(false)
|
|
function SName:OnLoseFocus()
|
|
tool.Auto.PAStationName = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
if tool.Auto.PALastStation then
|
|
local SLName = CPanel:TextEntry("Last station name:")
|
|
SLName:SetTooltip("Last station name")
|
|
SLName:SetValue(tool.Auto.PALastStationName or "")
|
|
SLName:SetEnterAllowed(false)
|
|
function SLName:OnLoseFocus()
|
|
tool.Auto.PALastStationName = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
local SHorlift = CPanel:CheckBox("Has switches:")
|
|
SHorlift:SetTooltip("Has switches")
|
|
SHorlift:SetValue(tool.Auto.PAStationHasSwtiches or false)
|
|
function SHorlift:OnChange()
|
|
tool.Auto.PAStationHasSwtiches = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local SRDoors = CPanel:CheckBox("Rights doors")
|
|
SRDoors:SetTooltip("Rights doors")
|
|
SRDoors:SetValue(tool.Auto.PAStationRightDoors or false)
|
|
function SRDoors:OnChange()
|
|
tool.Auto.PAStationRightDoors = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local SHorlift = CPanel:CheckBox("Horlift")
|
|
SHorlift:SetTooltip("Horlift")
|
|
SHorlift:SetValue(tool.Auto.PAStationHorlift or false)
|
|
function SHorlift:OnChange()
|
|
tool.Auto.PAStationHorlift = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
end--]]
|
|
end
|
|
if tool.Auto.Type == METROSTROI_ACOIL_DRIVE then
|
|
local VRightOC = CPanel:CheckBox("Right")
|
|
VRightOC:SetTooltip("Right")
|
|
VRightOC:SetValue(tool.Auto.Right or false)
|
|
function VRightOC:OnChange()
|
|
tool.Auto.Right = self:GetChecked()
|
|
tool:SendSettings()
|
|
end
|
|
local VADist = vgui.Create("DComboBox")
|
|
CPanel:AddItem(VADist)
|
|
VADist:SetColor(color_black)
|
|
VADist:AddChoice("5 m")
|
|
VADist:AddChoice("20 m")
|
|
VADist:AddChoice("50 m")
|
|
VADist:ChooseOptionID(tool.Auto.Dist or 1)
|
|
VADist.OnSelect = function(_, index, name)
|
|
VADist:SetValue(name)
|
|
tool.Auto.Dist = index
|
|
tool:SendSettings()
|
|
end
|
|
local VAMode = vgui.Create("DComboBox")
|
|
CPanel:AddItem(VAMode)
|
|
VAMode:SetColor(color_black)
|
|
VAMode:AddChoice("X-2")
|
|
VAMode:AddChoice("X-3")
|
|
VAMode:AddChoice("X-2 Station")
|
|
VAMode:AddChoice("X-3 Station")
|
|
VAMode:AddChoice("0")
|
|
VAMode:AddChoice("0 Regulated")
|
|
VAMode:AddChoice("T")
|
|
--VAMode:AddChoice("T-1a")
|
|
VAMode:ChooseOptionID(tool.Auto.Mode or 1)
|
|
VAMode.OnSelect = function(_, index, name)
|
|
VAMode:SetValue(name)
|
|
tool.Auto.Mode = index
|
|
tool:SendSettings()
|
|
tool:BuildCPanelCustom()
|
|
end
|
|
if tool.Auto.Mode == 3 or tool.Auto.Mode == 4 then
|
|
local SID,VSIDN = CPanel:TextEntry("Station ID:")
|
|
SID:SetTooltip("Station index")
|
|
SID:SetValue(tool.Auto.StationID or "")
|
|
SID:SetEnterAllowed(false)
|
|
function SID:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]+") or "")
|
|
end
|
|
local oldpos = self:GetCaretPos()
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(math.min(#NewValue,oldpos))
|
|
end
|
|
function SID:OnLoseFocus()
|
|
tool.Auto.StationID = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
local SPath,VSPathN = CPanel:TextEntry("Station path:")
|
|
SPath:SetTooltip("Station path")
|
|
SPath:SetValue(tool.Auto.StationPath or "")
|
|
SPath:SetEnterAllowed(false)
|
|
function SPath:OnChange()
|
|
local oldval = self:GetValue()
|
|
local NewValue = ""
|
|
for i = 1,#oldval do
|
|
if #NewValue > 0 then break end
|
|
NewValue = NewValue..((oldval[i] or ""):upper():match("[%d]") or "")
|
|
end
|
|
self:SetText(NewValue)
|
|
self:SetCaretPos(0)
|
|
end
|
|
function SPath:OnLoseFocus()
|
|
tool.Auto.StationPath = self:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
end
|
|
if tool.Auto.Type == METROSTROI_UPPSSENSOR then
|
|
local VRollT = CPanel:NumSlider("Roll:",nil,-180,180,0)
|
|
VRollT:SetValue(tool.Auto.Roll or 0)
|
|
VRollT.OnValueChanged = function(num)
|
|
tool.Auto.Roll = VRollT:GetValue()
|
|
tool:SendSettings()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
TOOL.NotBuilt = true
|
|
function TOOL:Think()
|
|
if CLIENT and (self.NotBuilt or NeedUpdate) then
|
|
self.Signal = self.Signal or util.JSONToTable(string.Replace(GetConVar("signalling_signaldata"):GetString(),"'","\"")) or {}
|
|
self.Sign = self.Sign or util.JSONToTable(string.Replace(GetConVar("signalling_signdata"):GetString(),"'","\"")) or {}
|
|
self.Auto = self.Auto or util.JSONToTable(string.Replace(GetConVar("signalling_autodata"):GetString(),"'","\"")) or {}
|
|
self:SendSettings()
|
|
self:BuildCPanelCustom()
|
|
self.NotBuilt = nil
|
|
NeedUpdate = nil
|
|
end
|
|
end
|
|
function TOOL.BuildCPanel(panel)
|
|
panel:SetName("#Tool.signalling.name")
|
|
panel:Help("#Tool.signalling.desc")
|
|
if not self then return end
|
|
self:BuildCPanelCustom()
|
|
end
|