297
297
298
298
local C_DisableHUD = GetConVar (" metrostroi_disablehud" )
299
299
local C_RenderDistance = GetConVar (" metrostroi_renderdistance" )
300
+ local C_PassRenderDistance = GetConVar (" metrostroi_passengers_distance" )
300
301
local C_SoftDraw = GetConVar (" metrostroi_softdrawmultipier" )
301
302
local C_ScreenshotMode = GetConVar (" metrostroi_screenshotmode" )
302
303
local C_DrawDebug = GetConVar (" metrostroi_drawdebug" )
@@ -865,7 +866,7 @@ function ENT:OnRemove(nfinal)
865
866
end
866
867
end
867
868
for _ ,v in pairs (self .PassengerEnts or {}) do
868
- SafeRemoveEntity (v )
869
+ SafeRemoveEntity (v . ent )
869
870
end
870
871
for _ ,v in pairs (self .PassengerEntsStucked or {}) do
871
872
SafeRemoveEntity (v )
@@ -1363,7 +1364,7 @@ function ENT:Think()
1363
1364
else
1364
1365
self :PlayOnceFromPos (" PassStuckL" .. i ," subway_trains/common/door/pass_stuck.mp3" ,5 ,0.9 + math.random ()* 0.2 ,150 ,400 ,v )
1365
1366
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
1367
1368
SafeRemoveEntity (stucked [i ])
1368
1369
end
1369
1370
end
@@ -1386,17 +1387,17 @@ function ENT:Think()
1386
1387
else
1387
1388
self :PlayOnceFromPos (" PassStuckR" .. i ," subway_trains/common/door/pass_stuck.mp3" ,5 ,0.9 + math.random ()* 0.2 ,150 ,400 ,v )
1388
1389
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
1390
1391
SafeRemoveEntity (stucked [- i ])
1391
1392
end
1392
1393
end
1393
1394
if # self .PassengerEnts ~= self :GetNW2Float (" PassengerCount" ) then
1394
1395
-- Passengers go out
1395
1396
while # self .PassengerEnts > self :GetNW2Float (" PassengerCount" ) do
1396
- local ent = self .PassengerEnts [# self .PassengerEnts ]
1397
+ local tbl = self .PassengerEnts [# self .PassengerEnts ]
1397
1398
table.remove (self .PassengerPositions ,# self .PassengerPositions )
1398
1399
table.remove (self .PassengerEnts ,# self .PassengerEnts )
1399
- ent : Remove ( )
1400
+ SafeRemoveEntity ( tbl . ent )
1400
1401
end
1401
1402
-- Passengers go in
1402
1403
while # self .PassengerEnts < self :GetNW2Float (" PassengerCount" ) do
@@ -1405,22 +1406,40 @@ function ENT:Think()
1405
1406
1406
1407
-- local ent = ents.CreateClientProp("models/metrostroi/81-717/reverser.mdl")
1407
1408
-- 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 )
1412
1413
--[[
1413
1414
hook.Add("MetrostroiBigLag",ent,function(ent)
1414
1415
ent:SetPos(self:LocalToWorld(pos))
1415
1416
ent:SetAngles(Angle(0,math.random(0,360),0))
1416
1417
--if ent.Spawned then hook.Remove("MetrostroiBigLag",ent) end
1417
1418
--ent.Spawned = true
1418
1419
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 ())
1422
1421
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
1424
1443
end
1425
1444
end
1426
1445
end
@@ -2644,6 +2663,7 @@ function ENT:SetLightPower(index,power,brightness)
2644
2663
-- Create light
2645
2664
if lightData [1 ] == " light" or lightData [1 ] == " glow" then
2646
2665
local light = ents .CreateClientside (" gmod_train_sprite" )
2666
+ if not IsValid (light ) then return end
2647
2667
light :SetPos (self :LocalToWorld (lightData [2 ]))
2648
2668
-- light:SetLocalAngles(lightData[3])
2649
2669
@@ -2690,6 +2710,7 @@ function ENT:SetLightPower(index,power,brightness)
2690
2710
self .GlowingLights [index ] = light
2691
2711
elseif lightData [1 ] == " dynamiclight" then
2692
2712
local light = ents .CreateClientside (" gmod_train_dlight" )
2713
+ if not IsValid (light ) then return end
2693
2714
light :SetParent (self )
2694
2715
2695
2716
-- Set position
0 commit comments