Skip to content

Commit 632fba5

Browse files
authored
Merge pull request #331 from Astralcircle/moreperf
More entity __index optimizations
2 parents 97149eb + 89fb1b9 commit 632fba5

20 files changed

Lines changed: 239 additions & 216 deletions

File tree

lua/entities/base_glide/cl_init.lua

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -70,20 +70,36 @@ end
7070
local IsValid = IsValid
7171

7272
function ENT:GetWheelSpin( index )
73-
local wheel = self.wheels and self.wheels[index]
73+
local wheels = self.wheels
7474

75-
if IsValid( wheel ) and wheel.GetLastSpin then
76-
return wheel:GetLastSpin()
75+
if wheels then
76+
local wheel = wheels[index]
77+
78+
if IsValid( wheel ) then
79+
local GetLastSpin = wheel.GetLastSpin
80+
81+
if GetLastSpin then
82+
return GetLastSpin( wheel )
83+
end
84+
end
7785
end
7886

7987
return 0
8088
end
8189

8290
function ENT:GetWheelOffset( index )
83-
local wheel = self.wheels and self.wheels[index]
91+
local wheels = self.wheels
8492

85-
if IsValid( wheel ) and wheel.GetBaseZPos then
86-
return wheel:GetLocalPos()[3] - wheel:GetBaseZPos()
93+
if wheels then
94+
local wheel = wheels[index]
95+
96+
if IsValid( wheel ) then
97+
local GetBaseZPos = wheel.GetBaseZPos
98+
99+
if GetBaseZPos then
100+
return wheel:GetLocalPos()[3] - GetBaseZPos( wheel )
101+
end
102+
end
87103
end
88104

89105
return 0
@@ -182,7 +198,6 @@ end
182198

183199
local RealTime = RealTime
184200
local Effect = util.Effect
185-
local IsGameUIVisible = gui.IsGameUIVisible
186201
local GetTable = FindMetaTable( "Entity" ).GetTable
187202

188203
local DEFAULT_FLAME_ANGLE = Angle()
@@ -192,12 +207,11 @@ function ENT:InternalUpdateFeatures()
192207
local selfTbl = GetTable( self )
193208

194209
-- Keep particles consistent even at high FPS
195-
if t > selfTbl.particleCD and self:WaterLevel() < 3 and not IsGameUIVisible() then
210+
if t > selfTbl.particleCD and self:WaterLevel() < 3 then
196211
selfTbl.particleCD = t + 0.03
212+
selfTbl.OnUpdateParticles( self )
197213

198-
self:OnUpdateParticles()
199-
200-
if self:GetIsEngineOnFire() then
214+
if selfTbl.GetIsEngineOnFire( self ) then
201215
local velocity = self:GetVelocity()
202216
local eff = EffectData()
203217

@@ -212,35 +226,33 @@ function ENT:InternalUpdateFeatures()
212226
end
213227

214228
-- Manually manage the engine fire sound instead of using ENT:CreateLoopingSound
215-
if self:GetIsEngineOnFire() then
229+
if selfTbl.GetIsEngineOnFire( self ) then
216230
if not selfTbl.engineFireSound then
217231
selfTbl.engineFireSound = CreateSound( self, "glide/fire/fire_loop_1.wav" )
218232
selfTbl.engineFireSound:SetSoundLevel( 80 )
219233
selfTbl.engineFireSound:PlayEx( 0.9, 100 )
220234
end
221-
222235
elseif selfTbl.engineFireSound then
223236
selfTbl.engineFireSound:Stop()
224237
selfTbl.engineFireSound = nil
225238
end
226239

227240
if selfTbl.shouldThinkNow then
228-
local isSoundActive = self:ShouldActivateSounds()
241+
local isSoundActive = selfTbl.ShouldActivateSounds( self )
229242

230243
if isSoundActive then
231244
if not selfTbl.isSoundActive then
232245
selfTbl.isSoundActive = true
233-
self:OnActivateSounds()
246+
selfTbl.OnActivateSounds( self )
234247
end
235248

236249
-- Let children classes do their own thing
237-
self:OnUpdateSounds()
238-
250+
selfTbl.OnUpdateSounds( self )
239251
elseif selfTbl.isSoundActive then
240-
self:InternalDeactivateSounds()
252+
selfTbl.InternalDeactivateSounds( self )
241253
end
242254

243-
local signal = self:GetTurnSignalState()
255+
local signal = selfTbl.GetTurnSignalState( self )
244256

245257
if signal > 0 and selfTbl.TurnSignalVolume > 0 then
246258
local signalBlink = ( CurTime() % selfTbl.TurnSignalCycle ) > selfTbl.TurnSignalCycle * 0.5
@@ -259,7 +271,7 @@ function ENT:InternalUpdateFeatures()
259271

260272
local sounds = selfTbl.sounds
261273

262-
if sounds.start and self:GetEngineState() ~= 1 then
274+
if sounds.start and selfTbl.GetEngineState( self ) ~= 1 then
263275
sounds.start:Stop()
264276
sounds.start = nil
265277

@@ -270,11 +282,11 @@ function ENT:InternalUpdateFeatures()
270282
end
271283

272284
-- Update lights and sprites
273-
self:UpdateLights( selfTbl )
285+
selfTbl.UpdateLights( self, selfTbl )
274286

275287
-- Let children classes do their own thing
276-
self:OnUpdateMisc()
277-
self:OnUpdateAnimations()
288+
selfTbl.OnUpdateMisc( self )
289+
selfTbl.OnUpdateAnimations( self )
278290
end
279291

280292
function ENT:Think()
@@ -283,20 +295,21 @@ function ENT:Think()
283295
-- Run some things less frequently when the
284296
-- local player is not inside this vehicle.
285297
local t = RealTime()
298+
local selfTbl = GetTable( self )
286299
local shouldThinkNow = true
287300

288-
if not self.isLocalPlayerInVehicle then
289-
shouldThinkNow = t > self.lazyThinkCD
301+
if not selfTbl.isLocalPlayerInVehicle then
302+
shouldThinkNow = t > selfTbl.lazyThinkCD
290303

291304
if shouldThinkNow then
292-
self.lazyThinkCD = t + 0.05
305+
selfTbl.lazyThinkCD = t + 0.05
293306
end
294307
end
295308

296-
self.shouldThinkNow = shouldThinkNow
309+
selfTbl.shouldThinkNow = shouldThinkNow
297310

298-
if self.rfMisc then
299-
self.rfMisc:Think()
311+
if selfTbl.rfMisc then
312+
selfTbl.rfMisc:Think()
300313
end
301314

302315
return true

lua/entities/base_glide/cl_lights.lua

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ local colorHeadlight = Color( 255, 255, 255 )
6565

6666
--- Draw sprites depending on which type of lights are active.
6767
function ENT:UpdateLights( selfTbl )
68-
local headlightState = self:GetHeadlightState()
68+
local headlightState = selfTbl.GetHeadlightState( self )
6969

7070
if headlightState > 0 then
71-
local colorVec = self:GetHeadlightColor()
71+
local colorVec = selfTbl.GetHeadlightColor( self )
7272
colorHeadlight.r = colorVec[1] * 255
7373
colorHeadlight.g = colorVec[2] * 255
7474
colorHeadlight.b = colorVec[3] * 255
@@ -77,7 +77,7 @@ function ENT:UpdateLights( selfTbl )
7777
-- Handle projected lights
7878
if selfTbl.headlightState ~= headlightState then
7979
selfTbl.headlightState = headlightState
80-
self:RemoveHeadlights()
80+
selfTbl.RemoveHeadlights( self )
8181

8282
if headlightState == 0 then return end
8383

@@ -93,7 +93,7 @@ function ENT:UpdateLights( selfTbl )
9393

9494
if enable then
9595
v.angles = v.angles or Angle( 10, 0, 0 )
96-
self:CreateHeadlight( index, v.offset, v.angles, v.color or colorHeadlight, v.texture, v.fovScale )
96+
selfTbl.CreateHeadlight( self, index, v.offset, v.angles, v.color or colorHeadlight, v.texture, v.fovScale )
9797
end
9898
end
9999
end
@@ -119,14 +119,14 @@ function ENT:UpdateLights( selfTbl )
119119
end
120120

121121
-- Handle sprites
122-
local allowLights = self:IsEngineOn() or headlightState > 0
122+
local allowLights = selfTbl.IsEngineOn( self ) or headlightState > 0
123123

124-
lightState.brake = allowLights and self:IsBraking()
125-
lightState.reverse = allowLights and self:IsReversing()
124+
lightState.brake = allowLights and selfTbl.IsBraking( self )
125+
lightState.reverse = allowLights and selfTbl.IsReversing( self )
126126
lightState.headlight = headlightState > 0
127127
lightState.taillight = headlightState > 0
128128

129-
local signal = self:GetTurnSignalState()
129+
local signal = selfTbl.GetTurnSignalState( self )
130130
local signalBlink = ( CurTime() % selfTbl.TurnSignalCycle ) > selfTbl.TurnSignalCycle * 0.5
131131

132132
lightState.signal_left = signal == 1 or signal == 3

lua/entities/base_glide/init.lua

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -665,11 +665,14 @@ function ENT:Think()
665665
self:NextThink( time )
666666

667667
-- Update speed variables
668-
selfTbl.localVelocity = self:WorldToLocal( self:GetPos() + self:GetVelocity() )
668+
local pos = self:GetPos()
669+
local velocity = self:GetVelocity()
670+
velocity:Add( pos )
671+
672+
selfTbl.localVelocity = self:WorldToLocal( velocity )
669673
selfTbl.totalSpeed = selfTbl.localVelocity:Length()
670674

671675
local forwardSpeed = selfTbl.localVelocity[1]
672-
673676
selfTbl.forwardAcceleration = ( forwardSpeed - selfTbl.forwardSpeed ) / dt
674677
selfTbl.forwardSpeed = forwardSpeed
675678

@@ -679,25 +682,25 @@ function ENT:Think()
679682
local driverSeat = selfTbl.seats[1]
680683
local driver = IsValid( driverSeat ) and driverSeat:GetDriver() or NULL
681684

682-
if driver ~= self:GetDriver() then
683-
self:SetDriver( driver )
684-
self:ClearLockOnTarget()
685+
if driver ~= selfTbl.GetDriver( self ) then
686+
selfTbl.SetDriver( self, driver )
687+
selfTbl.ClearLockOnTarget( self )
685688

686689
if IsValid( driver ) then
687690
if TriggerOutput then
688691
TriggerOutput( self, "Active", 1 )
689692
TriggerOutput( self, "Driver", driver )
690693
end
691694

692-
self:OnDriverEnter()
695+
selfTbl.OnDriverEnter( self )
693696
selfTbl.lastDriver = driver
694697
else
695698
if TriggerOutput then
696699
TriggerOutput( self, "Active", 0 )
697700
TriggerOutput( self, "Driver", NULL )
698701
end
699702

700-
self:OnDriverExit()
703+
selfTbl.OnDriverExit( self )
701704
end
702705

703706
selfTbl.hasTheDriverBeenRagdolled = nil
@@ -706,16 +709,16 @@ function ENT:Think()
706709

707710
-- Update weapons
708711
if selfTbl.weaponCount > 0 then
709-
self:WeaponThink( selfTbl )
712+
selfTbl.WeaponThink( self, selfTbl )
710713
end
711714

712715
-- Update water logic
713-
self:WaterThink( selfTbl )
716+
selfTbl.WaterThink( self, selfTbl )
714717

715718
-- Deal engine fire damage over time
716-
if self:GetIsEngineOnFire() then
719+
if selfTbl.GetIsEngineOnFire( self ) then
717720
if self:WaterLevel() > 2 then
718-
self:SetIsEngineOnFire( false )
721+
selfTbl.SetIsEngineOnFire( self, false )
719722
else
720723
local attacker = IsValid( selfTbl.lastDamageAttacker ) and selfTbl.lastDamageAttacker or self
721724
local inflictor = IsValid( selfTbl.lastDamageInflictor ) and selfTbl.lastDamageInflictor or self
@@ -726,42 +729,42 @@ function ENT:Think()
726729
dmg:SetInflictor( inflictor )
727730
dmg:SetDamageType( 0 )
728731
dmg:SetDamageForce( Vector() )
729-
dmg:SetDamagePosition( self:GetPos() )
732+
dmg:SetDamagePosition( pos )
730733
self:TakeDamageInfo( dmg )
731734
end
732735
end
733736

734737
-- Update wheels
735738
if selfTbl.wheelCount > 0 then
736-
self:WheelThink( dt, selfTbl )
739+
selfTbl.WheelThink( self, dt, selfTbl )
737740
end
738741

739742
-- Update trailer sockets
740743
if selfTbl.socketCount > 0 then
741-
self:SocketThink( dt, time )
744+
selfTbl.SocketThink( self, dt, time, selfTbl )
742745
end
743746

744747
-- Handle hold input actions
745748
for action, data in pairs( selfTbl.holdInputActions ) do
746749
-- If this action has been held for long enough...
747750
if data.timer and time > data.timer then
748751
data.timer = nil
749-
self:OnHoldInputAction( action, data )
752+
selfTbl.OnHoldInputAction( self, action, data )
750753

751754
elseif data.shouldRelease then
752755
data.shouldRelease = nil
753-
self:SetInputBool( 1, action, false )
756+
selfTbl.SetInputBool( self, 1, action, false )
754757
end
755758
end
756759

757760
-- Update bodygroups
758-
self:UpdateLightBodygroups()
761+
selfTbl.UpdateLightBodygroups( self, selfTbl )
759762

760763
-- Let children classes do their own stuff
761-
self:OnPostThink( dt, selfTbl )
764+
selfTbl.OnPostThink( self, dt, selfTbl )
762765

763766
-- Let children classes update their features
764-
self:OnUpdateFeatures( dt )
767+
selfTbl.OnUpdateFeatures( self, dt )
765768

766769
local phys = self:GetPhysicsObject()
767770

@@ -775,10 +778,10 @@ function ENT:Think()
775778
-- Make sure the physics stay awake when necessary,
776779
-- otherwise the driver's input won't do anything.
777780
local driverInput =
778-
self:GetInputFloat( 1, "accelerate", selfTbl ) +
779-
self:GetInputFloat( 1, "brake", selfTbl ) +
780-
self:GetInputFloat( 1, "steer", selfTbl ) +
781-
self:GetInputFloat( 1, "throttle", selfTbl )
781+
selfTbl.GetInputFloat( self, 1, "accelerate", selfTbl ) +
782+
selfTbl.GetInputFloat( self, 1, "brake", selfTbl ) +
783+
selfTbl.GetInputFloat( self, 1, "steer", selfTbl ) +
784+
selfTbl.GetInputFloat( self, 1, "throttle", selfTbl )
782785

783786
if phys:IsAsleep() and Abs( driverInput ) > 0.01 then
784787
phys:Wake()

lua/entities/base_glide/shared.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ if SERVER then
435435
function ENT:OnWeaponStop( _weapon, _weaponIndex ) end
436436

437437
function ENT:OnPostThink( _dt, _selfTbl ) end
438-
function ENT:OnSimulatePhysics( _phys, _dt, _outLin, _outAng ) end
438+
function ENT:OnSimulatePhysics( _phys, _dt, _outLin, _outAng, _selfTbl ) end
439439
function ENT:OnUpdateFeatures( _dt ) end
440440

441441
function ENT:OnSocketConnect( _socket, _otherVehicle ) end

lua/entities/base_glide/sv_input.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ function ENT:ResetInputs( seatIndex )
2727
end
2828

2929
--- Mark a input action as one the vehicle's driver can hold.
30-
---
30+
---
3131
--- When `action` is held for a specified amount of time,
3232
--- the `ENT:OnHoldInputAction` function runs instead of
3333
--- performing the original action.
@@ -114,7 +114,7 @@ function ENT:SetInputBool( seatIndex, action, pressed )
114114
-- Don't run the default logic for this action
115115
return
116116
else
117-
-- If the driver released this action before the hold timer expired...
117+
-- If the driver released this action before the hold timer expired...
118118
if holdData.timer then
119119
-- Clear the timer, run the original press action,
120120
-- and then run the release action on the next tick.

0 commit comments

Comments
 (0)