|
| 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 |
0 commit comments