Skip to content

Commit 76cddb2

Browse files
committed
Pass Distance
1 parent 61e0165 commit 76cddb2

File tree

14 files changed

+66
-22
lines changed

14 files changed

+66
-22
lines changed

lua/entities/gmod_subway_base/cl_init.lua

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ end
297297

298298
local C_DisableHUD = GetConVar("metrostroi_disablehud")
299299
local C_RenderDistance = GetConVar("metrostroi_renderdistance")
300+
local C_PassRenderDistance = GetConVar("metrostroi_passengers_distance")
300301
local C_SoftDraw = GetConVar("metrostroi_softdrawmultipier")
301302
local C_ScreenshotMode = GetConVar("metrostroi_screenshotmode")
302303
local C_DrawDebug = GetConVar("metrostroi_drawdebug")
@@ -865,7 +866,7 @@ function ENT:OnRemove(nfinal)
865866
end
866867
end
867868
for _,v in pairs(self.PassengerEnts or {}) do
868-
SafeRemoveEntity(v)
869+
SafeRemoveEntity(v.ent)
869870
end
870871
for _,v in pairs(self.PassengerEntsStucked or {}) do
871872
SafeRemoveEntity(v)
@@ -1363,7 +1364,7 @@ function ENT:Think()
13631364
else
13641365
self:PlayOnceFromPos("PassStuckL"..i,"subway_trains/common/door/pass_stuck.mp3",5,0.9+math.random()*0.2,150,400,v)
13651366
end
1366-
elseif not self:GetPackedBool("DoorLS"..i) and IsValid(stucked[i]) then
1367+
elseif IsValid(stucked[i]) and (not self:GetPackedBool("DoorLS"..i) or stucked[i]:IsDormant()) then
13671368
SafeRemoveEntity(stucked[i])
13681369
end
13691370
end
@@ -1386,17 +1387,17 @@ function ENT:Think()
13861387
else
13871388
self:PlayOnceFromPos("PassStuckR"..i,"subway_trains/common/door/pass_stuck.mp3",5,0.9+math.random()*0.2,150,400,v)
13881389
end
1389-
elseif not self:GetPackedBool("DoorRS"..i) and IsValid(stucked[-i]) then
1390+
elseif IsValid(stucked[-i]) and (not self:GetPackedBool("DoorRS"..i) or stucked[-i]:IsDormant()) then
13901391
SafeRemoveEntity(stucked[-i])
13911392
end
13921393
end
13931394
if #self.PassengerEnts ~= self:GetNW2Float("PassengerCount") then
13941395
-- Passengers go out
13951396
while #self.PassengerEnts > self:GetNW2Float("PassengerCount") do
1396-
local ent = self.PassengerEnts[#self.PassengerEnts]
1397+
local tbl = self.PassengerEnts[#self.PassengerEnts]
13971398
table.remove(self.PassengerPositions,#self.PassengerPositions)
13981399
table.remove(self.PassengerEnts,#self.PassengerEnts)
1399-
ent:Remove()
1400+
SafeRemoveEntity(tbl.ent)
14001401
end
14011402
-- Passengers go in
14021403
while #self.PassengerEnts < self:GetNW2Float("PassengerCount") do
@@ -1405,22 +1406,40 @@ function ENT:Think()
14051406

14061407
--local ent = ents.CreateClientProp("models/metrostroi/81-717/reverser.mdl")
14071408
--ent:SetModel(table.Random(self.PassengerModels))
1408-
local ent = ClientsideModel(table.Random(self.PassengerModels),RENDERGROUP_OPAQUE)
1409-
if not IsValid(ent) then break end
1410-
ent:SetPos(self:LocalToWorld(pos))
1411-
ent:SetAngles(Angle(0,math.random(0,360),0))
1409+
local tbl = {}
1410+
tbl.mdl = table.Random(self.PassengerModels)
1411+
tbl.pos = pos
1412+
tbl.ang = Angle(0,math.random(0,360),0)
14121413
--[[
14131414
hook.Add("MetrostroiBigLag",ent,function(ent)
14141415
ent:SetPos(self:LocalToWorld(pos))
14151416
ent:SetAngles(Angle(0,math.random(0,360),0))
14161417
--if ent.Spawned then hook.Remove("MetrostroiBigLag",ent) end
14171418
--ent.Spawned = true
14181419
end)]]
1419-
ent:SetSkin(math.floor(ent:SkinCount()*math.random()))
1420-
ent:SetModelScale(0.98 + (-0.02+0.04*math.random()),0)
1421-
ent:SetParent(self)
1420+
tbl.scale = 0.98 + (-0.02+0.04*math.random())
14221421
table.insert(self.PassengerPositions,pos)
1423-
table.insert(self.PassengerEnts,ent)
1422+
table.insert(self.PassengerEnts,tbl)
1423+
end
1424+
end
1425+
if (CurTime() - (self.ModelCheckTimer or 0) > 1.0) then
1426+
self.ModelCheckTimer = CurTime()
1427+
local plyPos = LocalPlayer():GetPos()
1428+
local dist = C_PassRenderDistance:GetInt()/0.01905
1429+
for _,tbl in pairs(self.PassengerEnts) do
1430+
if not IsValid(tbl.ent) and plyPos:Distance(tbl.pos) <= dist then
1431+
local ent = ClientsideModel(tbl.mdl, RENDERGROUP_OPAQUE)
1432+
if not IsValid(ent) then continue end
1433+
ent:SetPos(self:LocalToWorld(tbl.pos))
1434+
ent:SetAngles(self:LocalToWorldAngles(tbl.ang))
1435+
if not tbl.skin then tbl.skin = math.floor(ent:SkinCount()*math.random()) end
1436+
ent:SetSkin(tbl.skin)
1437+
ent:SetModelScale(tbl.scale,0)
1438+
ent:SetParent(self)
1439+
tbl.ent = ent
1440+
elseif IsValid(tbl.ent) and (plyPos:Distance(tbl.pos) > dist or tbl.ent:IsDormant()) then
1441+
SafeRemoveEntity(tbl.ent)
1442+
end
14241443
end
14251444
end
14261445
end
@@ -2644,6 +2663,7 @@ function ENT:SetLightPower(index,power,brightness)
26442663
-- Create light
26452664
if lightData[1] == "light" or lightData[1] == "glow" then
26462665
local light = ents.CreateClientside("gmod_train_sprite")
2666+
if not IsValid(light) then return end
26472667
light:SetPos(self:LocalToWorld(lightData[2]))
26482668
--light:SetLocalAngles(lightData[3])
26492669

@@ -2690,6 +2710,7 @@ function ENT:SetLightPower(index,power,brightness)
26902710
self.GlowingLights[index] = light
26912711
elseif lightData[1] == "dynamiclight" then
26922712
local light = ents.CreateClientside("gmod_train_dlight")
2713+
if not IsValid(light) then return end
26932714
light:SetParent(self)
26942715

26952716
-- Set position

lua/entities/gmod_track_platform/cl_init.lua

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ function ENT:OnRemove()
5757
for k,v in pairs(self.ClientModels) do SafeRemoveEntity(v) end
5858
self.ClientModels = {}
5959
self.ClientsideModels = {}
60+
for k,v in pairs(self.CleanupModels) do SafeRemoveEntity(v.ent) end
6061
self.CleanupModels = {}
6162
self.Pool = nil
6263
self.PassengersLeft = nil
@@ -149,6 +150,7 @@ function ENT:PopulatePlatform(platformStart,platformEnd,stationCenter)
149150
end
150151
end
151152

153+
local C_PassRenderDistance = GetConVar("metrostroi_passengers_distance")
152154

153155
--------------------------------------------------------------------------------
154156
-- Think loop that manages clientside models
@@ -164,7 +166,7 @@ function ENT:Think()
164166
self.PrevTime = self.PrevTime or CurTime()
165167
self.DeltaTime = (CurTime() - self.PrevTime)
166168
self.PrevTime = CurTime()
167-
if self:IsDormant() then
169+
if self:IsDormant() or Metrostroi and Metrostroi.ReloadClientside then
168170
if self.Pool then
169171
self:OnRemove()
170172
end
@@ -214,10 +216,12 @@ function ENT:Think()
214216
self:PopulatePlatform(platformStart,platformEnd,stationCenter)
215217
end
216218

219+
local plyPos = LocalPlayer():GetPos()
217220
local modelCount = 0
218221
-- Check if set of models changed
219222
if (CurTime() - (self.ModelCheckTimer or 0) > 1.0) and poolReady then
220223
self.ModelCheckTimer = CurTime()
224+
local dist = C_PassRenderDistance:GetInt()/0.01905
221225

222226
local WindowStart = self:GetNW2Int("WindowStart")
223227
local WindowEnd = self:GetNW2Int("WindowEnd")
@@ -227,7 +231,7 @@ function ENT:Think()
227231
if WindowStart > WindowEnd then in_bounds = (i >= WindowStart) or (i <= WindowEnd) end
228232
if in_bounds then
229233
-- Model in window
230-
if not self.ClientModels[i] then
234+
if not self.ClientModels[i] and plyPos:Distance(self.Pool[i].pos) <= dist then
231235
--self.ClientModels[i] = ents.CreateClientProp("models/metrostroi/81-717/reverser.mdl")
232236
--self.ClientModels[i]:SetModel(self.Pool[i].model)
233237
--hook.Add("MetrostroiBigLag",self.ClientModels[i],function(ent)
@@ -247,6 +251,8 @@ function ENT:Think()
247251
self.ClientModels[i]:DrawShadow(false)
248252
modelCount = modelCount + 1
249253
if modelCount > 15 then poolReady = false self.ModelCheckTimer = self.ModelCheckTimer - 0.9 break end
254+
elseif IsValid(self.ClientModels[i]) and (plyPos:Distance(self.Pool[i].pos) > dist or self.ClientModels[i]:IsDormant()) then
255+
SafeRemoveEntity(self.ClientModels[i])
250256
end
251257
else
252258
-- Model found that is not in window
@@ -323,6 +329,10 @@ function ENT:Think()
323329
if not IsValid(v.ent) then
324330
self.CleanupModels[k] = nil
325331
continue
332+
elseif v.ent:IsDormant() then
333+
v.ent:Remove()
334+
self.CleanupModels[k] = nil
335+
continue
326336
end
327337
-- Get pos and target in XY plane
328338
local pos = v.ent:GetPos()
@@ -333,7 +343,7 @@ function ENT:Think()
333343
local distance = pos:DistToSqr(target)
334344
local count = self:GetNW2Int("TrainDoorCount",0)
335345
-- Delete if reached the target point
336-
if distance < 2*256--[[threshold]] or math.abs(LocalPlayer():GetPos().z - v.ent:GetPos().z) > 256 or count == 0 then
346+
if distance < 2*256--[[threshold]] or math.abs(plyPos.z - v.ent:GetPos().z) > 256 or count == 0 then
337347
v.ent:Remove()
338348
self.CleanupModels[k] = nil
339349
continue

lua/entities/gmod_train_bogey/cl_init.lua

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -461,11 +461,13 @@ net.Receive("metrostroi_bogey_contact",function()
461461
util.Effect("stunstickimpact", effectdata, true, true)
462462

463463
local light = ents.CreateClientside("gmod_train_dlight")
464-
light:SetPos(effectdata:GetOrigin())
465-
light:SetDColor(Color(100,220,255))
466-
light:SetSize(256)
467-
light:SetBrightness(5)
468-
light:Spawn()
469-
SafeRemoveEntityDelayed(light,0.1)
464+
if IsValid(light) then
465+
light:SetPos(effectdata:GetOrigin())
466+
light:SetDColor(Color(100,220,255))
467+
light:SetSize(256)
468+
light:SetBrightness(5)
469+
light:Spawn()
470+
SafeRemoveEntityDelayed(light,0.1)
471+
end
470472
sound.Play("subway_trains/bogey/spark.mp3",effectdata:GetOrigin(),75,math.random(100,150),volume)
471473
end)

lua/metrostroi/cl_cpanel.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ local function ClientPanel(panel)
4343
panel:NumSlider(Metrostroi.GetPhrase("Panel.Z"),"metrostroi_cabz",-10,10)
4444
panel:NumSlider(Metrostroi.GetPhrase("Panel.RenderDistance"),"metrostroi_renderdistance",960,3072)
4545
panel:NumSlider(Metrostroi.GetPhrase("Panel.RenderSignals"),"metrostroi_signal_distance",6144,16384)
46+
panel:NumSlider(Metrostroi.GetPhrase("Panel.RenderPassengers"),"metrostroi_passengers_distance",40,110)
4647
panel:Button(Metrostroi.GetPhrase("Panel.ReloadClient"),"metrostroi_reload_client",true)
4748

4849
function DRouteNumber:OnChange()

lua/metrostroi/convars.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ CreateClientConVar("metrostroi_debugger_data_timeout",2,true,false)
102102
CreateClientConVar("metrostroi_disablehud",0,true)
103103
CreateClientConVar("metrostroi_renderdistance",1024,true)
104104
CreateClientConVar("metrostroi_signal_distance",8192,true)
105+
CreateClientConVar("metrostroi_passengers_distance",75,true)
105106
CreateClientConVar("metrostroi_screenshotmode",0,true)
106107
CreateClientConVar("metrostroi_disableseatshadows",0,true)
107108
CreateClientConVar("metrostroi_softdrawmultipier",100,true)

lua/metrostroi_data/languages/cz_base.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Panel.FOV = FOV
4444
Panel.Z = Výška kamery
4545
Panel.RenderDistance = Vykreslovací\nvzdálenost
4646
Panel.RenderSignals = Traced signals #NEW #FIXME
47+
Panel.RenderPassengers = Traced passengers #NEW #FIXME
4748
Panel.ReloadClient = Znovu načíst klienta
4849
4950
Panel.ClientAdvanced = Klient (pokročilý)

lua/metrostroi_data/languages/de_base.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Panel.FOV = Sichtfeld
4444
Panel.Z = Camera height #NEW
4545
Panel.RenderDistance = Render distanz
4646
Panel.RenderSignals = Traced signals #NEW #FIXME
47+
Panel.RenderPassengers = Traced passengers #NEW #FIXME
4748
Panel.ReloadClient = Clientseitig neuladen
4849
4950
Panel.ClientAdvanced = Client (Fortgeschritten)

lua/metrostroi_data/languages/en_base.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ Panel.FOV = FOV
5353
Panel.Z = Camera height #NEW
5454
Panel.RenderDistance = Render distance
5555
Panel.RenderSignals = Traced signals #NEW #FIXME
56+
Panel.RenderPassengers = Traced passengers #NEW #FIXME
5657
Panel.ReloadClient = Reload client side
5758
5859
Panel.ClientAdvanced = Client (advanced)

lua/metrostroi_data/languages/fr_base.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Panel.FOV = Champ de vision (FOV)
4444
Panel.Z = Hauteur de caméra
4545
Panel.RenderDistance = Rendu à distance
4646
Panel.RenderSignals = Traced signals #NEW #FIXME
47+
Panel.RenderPassengers = Traced passengers #NEW #FIXME
4748
Panel.ReloadClient = Redémarrer le client
4849
4950
Panel.ClientAdvanced = Client (avancé)

lua/metrostroi_data/languages/hu_base.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ Panel.FOV = FOV
4242
Panel.Z = Kamera magassága
4343
Panel.RenderDistance = Renderelési távolság
4444
Panel.RenderSignals = Traced signals #NEW #FIXME
45+
Panel.RenderPassengers = Traced passengers #NEW #FIXME
4546
Panel.ReloadClient = Kliens oldal újraindítása
4647
4748
Panel.ClientAdvanced = Kliens (haladó)

0 commit comments

Comments
 (0)