mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
307 lines
10 KiB
Lua
307 lines
10 KiB
Lua
--------------------------------------------------------------------------------
|
|
-- Signs in tunnels and on stations
|
|
--------------------------------------------------------------------------------
|
|
Metrostroi.Signs = Metrostroi.Signs or {}
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Helper for commonly used trace
|
|
--------------------------------------------------------------------------------
|
|
local function trace(pos,dir,col)
|
|
local tr = util.TraceLine({
|
|
start = pos,
|
|
endpos = pos+dir,
|
|
mask = MASK_NPCWORLDSTATIC
|
|
})
|
|
timer.Simple(0.05,function()
|
|
local t = 5
|
|
debugoverlay.Line(tr.StartPos,tr.HitPos,t,col or Color(0,0,255),true)
|
|
debugoverlay.Sphere(tr.StartPos,2,t,Color(0,255,255),true)
|
|
debugoverlay.Sphere(tr.HitPos,2,t,Color(255,0,0),true)
|
|
end)
|
|
return tr
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Create station name signs
|
|
--------------------------------------------------------------------------------
|
|
function Metrostroi.AddStationSign(ent)
|
|
if ent.SignOff then return end
|
|
if not Metrostroi.StationNamesConfiguration[ent.StationIndex] then return end
|
|
|
|
local platformStart = ent.PlatformStart
|
|
local platformEnd = ent.PlatformEnd
|
|
local platformDir = platformEnd-platformStart
|
|
local platformN = (platformDir:Angle()-Angle(0,90,0)):Forward()
|
|
local platformD = platformDir:GetNormalized()
|
|
|
|
local N = 2
|
|
local X = { 0.25, 0.75 }
|
|
for i=1,N do
|
|
local pos = (platformStart + platformDir*X[i]) + Vector(0,0,64+32) + platformN*96
|
|
local tr = trace(pos,platformN*384)
|
|
|
|
-- Bad hit workaround
|
|
if (not tr.Hit) or (tr.Fraction < 0.05) then
|
|
--print("STATION BAD HIT 1",ent.StationIndex,tr.Hit,tr.Fraction)
|
|
|
|
pos = (platformStart + platformDir*X[i]) + Vector(0,0,64+32) + platformN*0
|
|
tr = trace(pos,platformN*384)
|
|
end
|
|
if (not tr.Hit) or (tr.Fraction < 0.05) then
|
|
--print("STATION BAD HIT 3",ent.StationIndex,tr.Hit,tr.Fraction)
|
|
|
|
pos = (platformStart + platformDir*X[i]) + Vector(0,0,64+32) + platformN*0
|
|
tr = trace(pos,-platformN*384)
|
|
end
|
|
if (not tr.Hit) or (tr.Fraction < 0.05) then
|
|
--print("STATION BAD HIT 2",ent.StationIndex,tr.Hit,tr.Fraction)
|
|
|
|
pos = (platformStart + platformDir*X[i]) + Vector(0,0,64+32) + platformN*96
|
|
tr = trace(pos,-platformN*384)
|
|
end
|
|
|
|
local sign = ents.Create("gmod_track_sign")
|
|
if IsValid(sign) then
|
|
if tr.Hit then
|
|
sign:SetPos(tr.HitPos + tr.HitNormal*4)
|
|
sign:SetAngles(tr.HitNormal:Angle())
|
|
else
|
|
sign:SetPos(tr.HitPos + tr.HitNormal*4)
|
|
sign:SetAngles(-platformN:Angle())
|
|
print(Format("Metrostroi: Could not find a nice way to place station names for %03d",ent.StationIndex))
|
|
end
|
|
sign:Spawn()
|
|
|
|
sign:SetNW2String("Type","station")
|
|
sign:SetNW2String("Name",Metrostroi.StationNames[ent.StationIndex] or "")
|
|
sign:SetNW2Int("ID",ent.StationIndex)
|
|
sign:SetNW2Int("Platform",ent.PlatformIndex)
|
|
|
|
-- Get path of this station
|
|
local path1 = math.floor(ent.StationIndex/100)
|
|
|
|
-- List of change stations
|
|
local ChangeStations = {
|
|
[122] = 321,
|
|
[321] = 122,
|
|
}
|
|
|
|
-- Store up to two changes
|
|
local change2List = {}
|
|
local change3List = {}
|
|
local change2Used = nil
|
|
local change3Used = nil
|
|
for k,v in pairs(ChangeStations) do
|
|
local path2 = math.floor(k/100)
|
|
if path1 == path2 then
|
|
if not change2Used then
|
|
change2Used = k
|
|
sign:SetNW2Int("Change2",k)
|
|
sign:SetNW2Int("Change2ID",v)
|
|
elseif not change3Used then
|
|
change3Used = k
|
|
sign:SetNW2Int("Change3",k)
|
|
sign:SetNW2Int("Change3ID",v)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Get stations list
|
|
local change2_path = math.floor((ChangeStations[change2Used or 0] or 0)/100)
|
|
local change3_path = math.floor((ChangeStations[change3Used or 0] or 0)/100)
|
|
local stationList = {}
|
|
for k,v in pairs(Metrostroi.StationNames) do
|
|
local path2 = math.floor(k/100)
|
|
if (path1 == path2) or (change2_path == path2) or (change3_path == path2) then
|
|
local R = (Metrostroi.StationNamesConfiguration[k] or {})[1] or 0
|
|
local G = (Metrostroi.StationNamesConfiguration[k] or {})[2] or 0
|
|
local B = (Metrostroi.StationNamesConfiguration[k] or {})[3] or 0
|
|
local Use = (Metrostroi.StationNamesConfiguration[k] or {})[4] or 0
|
|
if (Use > 0) then
|
|
if (change2_path == path2) and (path2 ~= path1) then
|
|
table.insert(change2List,k)
|
|
elseif (change3_path == path3) and (path2 ~= path1) then
|
|
table.insert(change3List,k)
|
|
else
|
|
if ((ent.PlatformIndex == 2) and (ent.StationIndex >= k)) or
|
|
((ent.PlatformIndex == 1) and (ent.StationIndex <= k)) then
|
|
table.insert(stationList,k)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Sort stations list
|
|
if ent.PlatformIndex == 2 then
|
|
table.sort(stationList, function(a, b) return a < b end)
|
|
else
|
|
table.sort(stationList, function(a, b) return a > b end)
|
|
end
|
|
table.sort(change2List, function(a, b) return a < b end)
|
|
table.sort(change3List, function(a, b) return a < b end)
|
|
|
|
-- Send stations list
|
|
sign:SetNW2Int("StationList#",#stationList)
|
|
for k,v in ipairs(stationList) do
|
|
sign:SetNW2Int("StationList"..k.."[ID]",v)
|
|
sign:SetNW2String("StationList"..k.."[Name1]",Metrostroi.StationTitles[v])
|
|
sign:SetNW2String("StationList"..k.."[Name2]",Metrostroi.StationNames[v])
|
|
sign:SetNW2Int("StationList"..k.."[R]",(Metrostroi.StationNamesConfiguration[v] or {})[1])
|
|
sign:SetNW2Int("StationList"..k.."[G]",(Metrostroi.StationNamesConfiguration[v] or {})[2])
|
|
sign:SetNW2Int("StationList"..k.."[B]",(Metrostroi.StationNamesConfiguration[v] or {})[3])
|
|
--sign:SetNW2Int("StationList"..k.."[R]",(Metrostroi.StationNamesConfiguration[v.ID] or {})[1])
|
|
end
|
|
|
|
-- Send change lists
|
|
sign:SetNW2Int("Change2List#",#change2List)
|
|
for k,v in ipairs(change2List) do
|
|
sign:SetNW2Int("Change2List"..k.."[ID]",v)
|
|
sign:SetNW2String("Change2List"..k.."[Name1]",Metrostroi.StationTitles[v])
|
|
sign:SetNW2String("Change2List"..k.."[Name2]",Metrostroi.StationNames[v])
|
|
sign:SetNW2Int("Change2List"..k.."[R]",(Metrostroi.StationNamesConfiguration[v] or {})[1])
|
|
sign:SetNW2Int("Change2List"..k.."[G]",(Metrostroi.StationNamesConfiguration[v] or {})[2])
|
|
sign:SetNW2Int("Change2List"..k.."[B]",(Metrostroi.StationNamesConfiguration[v] or {})[3])
|
|
end
|
|
sign:SetNW2Int("Change3List#",#change3List)
|
|
for k,v in ipairs(change3List) do
|
|
sign:SetNW2Int("Change3List"..k.."[ID]",v)
|
|
sign:SetNW2String("Change3List"..k.."[Name1]",Metrostroi.StationTitles[v])
|
|
sign:SetNW2String("Change3List"..k.."[Name2]",Metrostroi.StationNames[v])
|
|
sign:SetNW2Int("Change3List"..k.."[R]",(Metrostroi.StationNamesConfiguration[v] or {})[1])
|
|
sign:SetNW2Int("Change3List"..k.."[G]",(Metrostroi.StationNamesConfiguration[v] or {})[2])
|
|
sign:SetNW2Int("Change3List"..k.."[B]",(Metrostroi.StationNamesConfiguration[v] or {})[3])
|
|
end
|
|
|
|
--[[sign:MakeStationSign(
|
|
Metrostroi.StationTitles[ent.StationIndex] or Metrostroi.StationNames[ent.StationIndex],
|
|
Metrostroi.StationNames[ent.StationIndex])]]--
|
|
table.insert(Metrostroi.Signs,sign)
|
|
end
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Create horizontal lift signals
|
|
--------------------------------------------------------------------------------
|
|
function Metrostroi.AddStationSignal(ent)
|
|
if ent.HorliftStation == 0 or ent.HorliftHaveSignal then return end
|
|
|
|
local platformStart = ent.PlatformStart
|
|
local platformEnd = ent.PlatformEnd
|
|
local platformDir = platformEnd-platformStart
|
|
local platformN = (platformDir:Angle()-Angle(0,90,0)):Forward()
|
|
local platformD = platformDir:GetNormalized()
|
|
|
|
local pos = platformEnd + Vector(0,0,64) + platformN*96 + platformD*(192-32)
|
|
local tr = trace(pos,platformN*384)
|
|
local sign = ents.Create("gmod_track_horlift_signal")
|
|
if IsValid(sign) then
|
|
sign.VMF = sign.VMF or {}
|
|
sign.VMF.Type = "0"
|
|
if tr.Hit then
|
|
sign:SetPos(tr.HitPos)
|
|
sign:SetAngles(tr.HitNormal:Angle())
|
|
else
|
|
sign:SetPos(tr.HitPos)
|
|
sign:SetAngles(-platformN:Angle())
|
|
end
|
|
sign:Spawn()
|
|
table.insert(Metrostroi.Signs,sign)
|
|
end
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Create all signs
|
|
--------------------------------------------------------------------------------
|
|
function Metrostroi.InitializeSigns()
|
|
-- Clear old signs
|
|
for k,v in pairs(Metrostroi.Signs) do
|
|
SafeRemoveEntity(v)
|
|
end
|
|
Metrostroi.Signs = {}
|
|
|
|
-- Add sign for every station name
|
|
local entities = ents.FindByClass("gmod_track_platform")
|
|
for k,v in pairs(entities) do
|
|
Metrostroi.AddStationSign(v)
|
|
Metrostroi.AddStationSignal(v)
|
|
end
|
|
|
|
-- Add temporary lights
|
|
--[[
|
|
local entities = ents.FindByClass("gmod_track_switch")
|
|
for k,v in pairs(entities) do
|
|
for k2,v2 in pairs(v.TrackSwitches) do
|
|
local tr = trace(v2:GetPos(),Vector(0,0,384))
|
|
if tr.Hit then
|
|
local light = ents.Create("env_projectedtexture")
|
|
light:SetPos(tr.HitPos - Vector(0,0,16))
|
|
light:SetAngles(tr.HitNormal:Angle())
|
|
|
|
-- Set parameters
|
|
light:SetKeyValue("enableshadows", 0)
|
|
light:SetKeyValue("farz", 600)
|
|
light:SetKeyValue("nearz", 16)
|
|
light:SetKeyValue("lightfov", 170)
|
|
|
|
-- Set Brightness
|
|
local brightness = 0.3
|
|
light:SetKeyValue("lightcolor",
|
|
Format("%i %i %i 255",
|
|
180*brightness,
|
|
255*brightness,
|
|
255*brightness
|
|
)
|
|
)
|
|
|
|
-- Turn light on
|
|
light:Spawn()
|
|
light:Input("SpotlightTexture",nil,nil,"effects/flashlight001")
|
|
table.insert(Metrostroi.Signs,light)
|
|
end
|
|
end
|
|
end
|
|
|
|
--17473 20200
|
|
if Metrostroi.Paths[1] then
|
|
for k,v in pairs(Metrostroi.Paths[1]) do
|
|
if (type(v) == "table") and (v.x) and (v.x > 17470) and (v.x < 20200) then
|
|
local tr = trace(v.pos + Vector(0,0,64),Vector(0,0,384)) --384*(v.dir:Angle() + Angle(0,0,90)):Forward())
|
|
if tr.Hit and ((k % 2) == 0) and false then
|
|
local light = ents.Create("env_projectedtexture")
|
|
light:SetPos(tr.HitPos - tr.HitNormal*64)
|
|
light:SetAngles(tr.HitNormal:Angle())
|
|
|
|
-- Set parameters
|
|
light:SetKeyValue("enableshadows", 0)
|
|
light:SetKeyValue("farz", 512+192)
|
|
light:SetKeyValue("nearz", 128)
|
|
light:SetKeyValue("lightfov", 160)
|
|
|
|
-- Set Brightness
|
|
local brightness = 0.20
|
|
light:SetKeyValue("lightcolor",
|
|
Format("%i %i %i 255",
|
|
180*brightness,
|
|
255*brightness,
|
|
255*brightness
|
|
)
|
|
)
|
|
|
|
-- Turn light on
|
|
light:Spawn()
|
|
light:Input("SpotlightTexture",nil,nil,"effects/flashlight001")
|
|
table.insert(Metrostroi.Signs,light)
|
|
end
|
|
end
|
|
end
|
|
end]]--
|
|
end
|
|
|
|
Metrostroi.InitializeSigns()
|