mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
169 lines
6.8 KiB
Lua
169 lines
6.8 KiB
Lua
AddCSLuaFile("cl_init.lua")
|
|
AddCSLuaFile("shared.lua")
|
|
include("shared.lua")
|
|
|
|
function ENT:Initialize()
|
|
self:SetModel("models/props_combine/breendesk.mdl")
|
|
self.BaseClass.Initialize(self)
|
|
self.DriverSeat = self:CreateSeat("driver", Vector(-40, 0, 0), Angle(0, 0, 0), "models//nova/chair_office02.mdl")
|
|
self.CursorX = 0
|
|
self.CursorY = 0
|
|
self:CursorMove(0, 0)
|
|
self.Station = 0
|
|
end
|
|
|
|
hook.Add("AcceptInput", "metrostroi_arm_trigger_check", function(ent, inputName, activator, called, data)
|
|
if inputName == "ARMStartTouch" then
|
|
called.ARMTriggered = true
|
|
print(called, called:GetName(), activator, "Enable")
|
|
end
|
|
|
|
if inputName == "ARMEndTouch" then
|
|
called.ARMTriggered = false
|
|
print(called, called:GetName(), activator, "Disable")
|
|
end
|
|
end)
|
|
|
|
|
|
local function GetOccupation(tbl)
|
|
for sID,signame in ipairs(tbl) do
|
|
if signame[1] == "@" then
|
|
local trigger = Metrostroi.ARMGet(signame:sub(2,-1), "trigger")
|
|
if not trigger or trigger.ARMTriggered then
|
|
return true
|
|
end
|
|
elseif signame ~= "" then
|
|
local signal = Metrostroi.ARMGet(signame, "signal")
|
|
if not signal or signal.OccupiedBy and signal.OccupiedBy ~= signal then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function ENT:Think()
|
|
local armTbl = Metrostroi.ARMTable
|
|
local armConf = Metrostroi.ARMConfigGenerated
|
|
local station = armConf[self.Station]
|
|
local armTblStation = armTbl[self.Station]
|
|
if not station then return end
|
|
if not armTblStation or (IsValid(armTblStation.Controller) and armTblStation.Controller ~= self) then return end
|
|
armTblStation.Controller = self
|
|
for buttonID,button in ipairs(station.buttons) do
|
|
--print(button,button.selected)
|
|
Metrostroi.ARMSync(self.Station, 1000+buttonID, "buttonPressable",button.pressable)
|
|
Metrostroi.ARMSync(self.Station, 1000+buttonID, "buttonSelected",button.selected)
|
|
end
|
|
for segmID, segm in ipairs(station) do
|
|
if type(segm) == "table" then
|
|
if segm.occup then
|
|
Metrostroi.ARMSync(self.Station, segmID, "occup", GetOccupation(segm.occup) or segm.occupAlt and GetOccupation(segm.occupAlt))
|
|
end
|
|
|
|
if segm.occup2 then
|
|
Metrostroi.ARMSync(self.Station, segmID, "occup2", GetOccupation(segm.occup2))
|
|
end
|
|
Metrostroi.ARMSync(self.Station, segmID, "route", segm.route and true)
|
|
|
|
|
|
if segm.switch then
|
|
local switch = Metrostroi.ARMGet(segm.switch, "switch")
|
|
local main = switch and switch.MainTrack and not switch.AlternateTrack
|
|
local alt = switch and not switch.MainTrack and switch.AlternateTrack
|
|
Metrostroi.ARMSync(self.Station, segmID, "switch_m", main)
|
|
Metrostroi.ARMSync(self.Station, segmID, "switch_a", alt)
|
|
Metrostroi.ARMSync(self.Station, segmID, "switch_na", not main and not alt)
|
|
end
|
|
if segm.signal1 then
|
|
local signal = Metrostroi.ARMGet(segm.signal1.name, "signal")
|
|
local colors = signal and signal.Colors
|
|
if segm.signal1.type > 1 then Metrostroi.ARMSync(self.Station, segmID, "signal1I", signal and signal.InvationSignal) end
|
|
if segm.signal1.type > 2 then
|
|
local Y = #colors:gsub("[^yY]","") > 1
|
|
if Y then colors = colors:SetChar(colors:find("[yY]"),"") end
|
|
Metrostroi.ARMSync(self.Station, segmID, "signal1Y", Y)
|
|
end
|
|
Metrostroi.ARMSync(self.Station, segmID, "signal1", colors)
|
|
end
|
|
if segm.signal2 then
|
|
local signal = Metrostroi.ARMGet(segm.signal2.name, "signal")
|
|
local colors = signal and signal.Colors
|
|
if segm.signal2.type > 1 then Metrostroi.ARMSync(self.Station, segmID, "signal2I", signal and signal.InvationSignal) end
|
|
if segm.signal2.type > 2 then
|
|
local Y = #colors:gsub("[^yY]","") > 1
|
|
if Y then colors = colors:SetChar(colors:find("[yY]"),"") end
|
|
Metrostroi.ARMSync(self.Station, segmID, "signal2Y", Y)
|
|
end
|
|
Metrostroi.ARMSync(self.Station, segmID, "signal2", colors)
|
|
end
|
|
end
|
|
end
|
|
|
|
self:NextThink(CurTime() + 0.5)
|
|
|
|
return true
|
|
end
|
|
|
|
function ENT:OnRemove()
|
|
end
|
|
|
|
function ENT:CursorMove(sys, dX, dY)
|
|
self.CursorX = sys == "" and math.Clamp(self.CursorX + dX * 200, 0, 800) or dX
|
|
self.CursorY = sys == "" and math.Clamp(self.CursorY + dY * 200, 0, 600) or dY
|
|
self:SetNW2Int("CursorX", math.floor(self.CursorX))
|
|
self:SetNW2Int("CursorY", math.floor(self.CursorY))
|
|
end
|
|
|
|
function ENT:PanelTouch(state, x, y)
|
|
for i, v in ipairs(Metrostroi.ARMConfig) do
|
|
if math.InRangeXYR(self.CursorX, self.CursorY, 20 + (i - 1) * 30, 20, 30, 20) then
|
|
self.Station = i
|
|
self:SetNW2Int("ARM:Station", i)
|
|
end
|
|
end
|
|
if not state then return end
|
|
local RouteChoosing = self.RouteChoosing
|
|
self.RouteChoosing = nil
|
|
if RouteChoosing then
|
|
print("DISABLE")
|
|
for k,v in pairs(RouteChoosing.routes) do
|
|
if v[1].button then
|
|
v[1].button.selected = false
|
|
elseif v[1].isbutton then
|
|
v[1].selected = false
|
|
end
|
|
end
|
|
end
|
|
local confGenStation = Metrostroi.ARMConfigGenerated[self.Station]
|
|
for k,button in pairs(confGenStation.buttons) do
|
|
local sx,sy = 100+button.x*36,100+button.y*70
|
|
if button.type == "r" then
|
|
local sw,sh = 15,25
|
|
local xa,ya = 3,12
|
|
local x,y = sx+xa,sy+ya
|
|
if RouteChoosing then
|
|
if math.InRangeXYR(self.CursorX, self.CursorY, x,y,sw,sh) then
|
|
for k,v in ipairs(RouteChoosing.routes) do
|
|
if v[1].button and button == v[1].button or v[1].isbutton and button==v[1] then
|
|
Metrostroi.CentralisationPrepareRoute(self.Station,v)
|
|
end
|
|
end
|
|
end
|
|
elseif not self.RouteChoosing and button.pressable then
|
|
if math.InRangeXYR(self.CursorX, self.CursorY, x,y,sw,sh) then
|
|
self.RouteChoosing = button
|
|
for k,v in ipairs(button.routes) do
|
|
print(v[1],v[1].name,v[1].button)
|
|
if v[1].button then
|
|
v[1].button.selected = true
|
|
elseif v[1].isbutton then
|
|
v[1].selected = true
|
|
print(2)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end |