Skip to content

Commit b15c2c8

Browse files
committed
feat(classes): add more classes
- Add some game classes (unfinished) - Add a PointerScanner module. - Document all vector classes.
1 parent 178dc08 commit b15c2c8

29 files changed

+1866
-730
lines changed

SmallBase/includes/backend.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ end
109109

110110
---@return boolean
111111
function Backend:IsUpToDate()
112-
return (self.target_build == "any") or (Game.Version._build and self.target_build == Game.Version._build)
112+
local game_ver = Game.GetVersion()
113+
return (self.target_build == "any") or (game_ver._build and self.target_build == game_ver._build)
113114
end
114115

115116
---@param handle integer
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
---@diagnostic disable: param-type-mismatch
2+
3+
--------------------------------------
4+
-- Class: CPed
5+
--------------------------------------
6+
---@ignore
7+
---@class CPed
8+
---@field private m_addr pointer
9+
---@field CPedIntelligence pointer -- `class`
10+
---@field CPedInventory pointer -- `class`
11+
---@field CPedWeaponManager pointer -- `class`
12+
---@field CPlayerInfo? CPlayerInfo -- `class`
13+
---@field m_velocity vec3 -- `rage::fvector3`
14+
---@field m_ped_type number -- `uint32_t`
15+
---@field m_ped_task_flag number -- `uint8_t`
16+
---@field m_seatbelt number -- `uint8_t`
17+
---@field m_armor float -- `float`
18+
---@overload fun(ped: integer): CPed|nil
19+
CPed = {}
20+
CPed.__index = CPed
21+
setmetatable(CPed, {
22+
__call = function(cls, addr)
23+
return cls.new(addr)
24+
end,
25+
})
26+
27+
---@param ped integer
28+
---@return CPed|nil
29+
function CPed.new(ped)
30+
if not ENTITY.DOES_ENTITY_EXIST(ped) or not ENTITY.IS_ENTITY_A_PED(ped) then
31+
return
32+
end
33+
34+
local ptr = memory.handle_to_ptr(ped)
35+
if not ptr or ptr:is_null() then
36+
return nil
37+
end
38+
39+
local instance = setmetatable({}, CPed)
40+
instance.m_addr = ptr
41+
instance.CPedIntelligence = ptr:add(0x10A0):deref()
42+
instance.CPedInventory = ptr:add(0x10B0):deref()
43+
instance.CPedWeaponManager = ptr:add(0x10B0):deref()
44+
instance.m_velocity = ptr:add(0x0300):get_vec3()
45+
instance.m_ped_type = ptr:add(0x1098):get_dword()
46+
instance.m_ped_task_flag = ptr:add(0x144B):get_byte()
47+
instance.m_seatbelt = ptr:add(0x143C):get_word()
48+
instance.m_armor = ptr:add(0x150C):get_float()
49+
50+
if PED.IS_PED_A_PLAYER(ped) then
51+
instance.CPlayerInfo = CPlayerInfo(ptr:add(0x10A8):deref())
52+
end
53+
54+
return instance
55+
end
56+
57+
---@return boolean
58+
function CPed:IsValid()
59+
return self.m_addr and not self.m_addr:is_null()
60+
end
61+
62+
---@return boolean
63+
function CPed:CanPedRagdoll()
64+
if not self:IsValid() then
65+
return false
66+
end
67+
68+
return (self.m_ped_type & 0x20) ~= 0
69+
end
70+
71+
---@return boolean
72+
function CPed:HasSeatbelt()
73+
if not self:IsValid() then
74+
return false
75+
end
76+
77+
return (self.m_seatbelt & 0x3) ~= 0
78+
end
79+
80+
---@retuurn number
81+
function CPed:GetGameState()
82+
if self.CPlayerInfo then
83+
return self.CPlayerInfo:GetGameState()
84+
end
85+
86+
return -1 -- not a player ped
87+
end
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
---@diagnostic disable: param-type-mismatch
2+
3+
--------------------------------------
4+
-- Class: CPlayerInfo
5+
--------------------------------------
6+
---@ignore
7+
---@class CPlayerInfo
8+
---@field private m_addr pointer
9+
---@field m_swim_speed float `float`
10+
---@field m_is_wanted boolean `boolean`
11+
---@field m_wanted_level number `uint32_t`
12+
---@field m_wanted_level_display number `uint32_t`
13+
---@field m_run_speed float `float`
14+
---@field m_stamina float `float`
15+
---@field m_stamina_regen float `float`
16+
---@field m_weapon_damage_mult float `float`
17+
---@field m_weapon_defence_mult float `float`
18+
---@field m_game_state number `uint32_t`
19+
---@overload fun(addr: pointer): CPlayerInfo|nil
20+
CPlayerInfo = {}
21+
CPlayerInfo.__index = CPlayerInfo
22+
setmetatable(CPlayerInfo, {
23+
__call = function(cls, addr)
24+
return cls.new(addr)
25+
end,
26+
})
27+
28+
---@return CPlayerInfo|nil
29+
function CPlayerInfo.new(ptr)
30+
if not ptr or ptr:is_null() then
31+
return nil
32+
end
33+
34+
local instance = setmetatable({}, CPlayerInfo)
35+
36+
instance.m_addr = ptr
37+
instance.m_swim_speed = ptr:add(0x01C8):get_float()
38+
instance.m_is_wanted = ptr:add(0x08E0):get_byte()
39+
instance.m_wanted_level = ptr:add(0x08E8):get_dword()
40+
instance.m_wanted_level_display = ptr:add(0x08EC):get_dword()
41+
instance.m_run_speed = ptr:add(0x0D50):get_float()
42+
instance.m_stamina = ptr:add(0x0D54):get_float()
43+
instance.m_stamina_regen = ptr:add(0x0D58):get_float()
44+
instance.m_weapon_damage_mult = ptr:add(0x0D6C):get_float()
45+
instance.m_weapon_defence_mult = ptr:add(0x0D70):get_float()
46+
instance.m_game_state = ptr:add(0x0230):get_dword()
47+
48+
return instance
49+
end
50+
51+
---@return boolean
52+
function CPlayerInfo:IsValid()
53+
return self.m_addr and not self.m_addr:is_null()
54+
end
55+
56+
---@return number
57+
function CPlayerInfo:GetGameState()
58+
return self.m_game_state
59+
end

0 commit comments

Comments
 (0)