Skip to content

Commit abf9bc4

Browse files
committed
fix(Factory): cache script global instances
1 parent e8b16d9 commit abf9bc4

6 files changed

Lines changed: 180 additions & 207 deletions

File tree

SSV2/includes/classes/gta/CEntity.lua

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,34 @@ function CEntity:IsValid()
6767
return self.m_ptr and self.m_ptr:is_valid()
6868
end
6969

70+
---@generic R1, R2, R3, R4, R5
71+
---@param default any
72+
---@param func fun(...?): R1, R2?, R3?, R4?, R5?, ...?
73+
---@param ... any
74+
---@return R1, R2?, R3?, R4?, R5?, ...?
75+
function CEntity:__safecall(default, func, ...)
76+
if (not self:IsValid()) then
77+
return default
78+
end
79+
80+
return func(...)
81+
end
82+
83+
---@return pointer
84+
function CEntity:GetPointer()
85+
return self.m_ptr
86+
end
87+
7088
---@return uint64_t
7189
function CEntity:GetAddress()
7290
return self.m_ptr:get_address()
7391
end
7492

7593
---@return eModelType
7694
function CEntity:GetModelType()
77-
if not self:IsValid() then
78-
return Enums.eModelType.Invalid
79-
end
80-
81-
return (self.m_model_type:get_word() & 0x1F)
95+
return self:__safecall(Enums.eModelType.Invalid, function()
96+
return self.m_model_type:get_word() & 0x1F
97+
end)
8298
end
8399

84100
return CEntity

SSV2/includes/classes/gta/CPed.lua

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -63,52 +63,49 @@ end
6363

6464
---@return boolean
6565
function CPed:CanRagdoll()
66-
if not self:IsValid() then
67-
return false
68-
end
69-
70-
return (self.m_ped_type & 0x20) ~= 0
66+
return self:__safecall(false, function()
67+
return (self.m_ped_type & 0x20) ~= 0
68+
end)
7169
end
7270

7371
---@return boolean
7472
function CPed:HasSeatbelt()
75-
if not self:IsValid() then
76-
return false
77-
end
78-
79-
return (self.m_seatbelt & 0x3) ~= 0
73+
return self:__safecall(false, function()
74+
return (self.m_seatbelt & 0x3) ~= 0
75+
end)
8076
end
8177

8278
---@return float
8379
function CPed:GetSpeed()
84-
if not self:IsValid() then
85-
return 0.0
86-
end
87-
88-
local speed_vec = self.m_velocity:get_vec3()
89-
return speed_vec:mag()
80+
return self:__safecall(0.0, function()
81+
return self.m_velocity:get_vec3():mag()
82+
end)
9083
end
9184

9285
---@return ePedType
9386
function CPed:GetPedType()
94-
return (self.m_ped_type:get_word() << 11 >> 25)
87+
return self:__safecall(-1, function()
88+
return (self.m_ped_type:get_word() << 11 >> 25)
89+
end)
9590
end
9691

9792
---@return CPedWeaponManager?
9893
function CPed:GetWeaponManager()
99-
local ptr = self.m_ped_weapon_mgr:deref()
100-
if (ptr:is_null()) then
101-
self.m_ped_weapon_mgr_inst = nil
102-
return
103-
end
104-
105-
local mgr = self.m_ped_weapon_mgr_inst
106-
---@diagnostic disable-next-line: invisible
107-
if (not mgr or not mgr:IsValid() or (mgr.m_ptr ~= ptr)) then
108-
self.m_ped_weapon_mgr_inst = CPedWeaponManager(ptr)
109-
end
110-
111-
return self.m_ped_weapon_mgr_inst
94+
return self:__safecall(nil, function()
95+
local ptr = self.m_ped_weapon_mgr:deref()
96+
if (ptr:is_null()) then
97+
self.m_ped_weapon_mgr_inst = nil
98+
return nil
99+
end
100+
101+
local mgr = self.m_ped_weapon_mgr_inst
102+
---@diagnostic disable-next-line: invisible
103+
if (not mgr or not mgr:IsValid() or (mgr.m_ptr ~= ptr)) then
104+
self.m_ped_weapon_mgr_inst = CPedWeaponManager(ptr)
105+
end
106+
107+
return self.m_ped_weapon_mgr_inst
108+
end)
112109
end
113110

114111
return CPed

0 commit comments

Comments
 (0)