diff --git a/base/CNavigation.hpp b/base/CNavigation.hpp index 62b3abf..c1c8ae6 100644 --- a/base/CNavigation.hpp +++ b/base/CNavigation.hpp @@ -16,6 +16,13 @@ public: { return reinterpret_cast(&m_transformation_matrix.rows[3]); } + + void model_to_world(const rage::fvector3& model_coords, rage::fvector3& world_coords) + { + world_coords.x = model_coords.x * m_transformation_matrix.data[0][0] + model_coords.y * m_transformation_matrix.data[1][0] + model_coords.z * m_transformation_matrix.data[2][0] + m_transformation_matrix.data[3][0]; + world_coords.y = model_coords.x * m_transformation_matrix.data[0][1] + model_coords.y * m_transformation_matrix.data[1][1] + model_coords.z * m_transformation_matrix.data[2][1] + m_transformation_matrix.data[3][1]; + world_coords.z = model_coords.x * m_transformation_matrix.data[0][2] + model_coords.y * m_transformation_matrix.data[1][2] + model_coords.z * m_transformation_matrix.data[2][2] + m_transformation_matrix.data[3][2]; + } }; //Size: 0x0060 static_assert(sizeof(CNavigation) == 0x60); #pragma pack(pop) diff --git a/entities/fwEntity.hpp b/entities/fwEntity.hpp index 83924ff..631393a 100644 --- a/entities/fwEntity.hpp +++ b/entities/fwEntity.hpp @@ -31,6 +31,18 @@ namespace rage uint32_t dwordB0; //0x00B0 char gapB4[4]; //0x00B4 std::uint8_t byteB8; //0x00B8 + + rage::fvector3* get_position() + { + return reinterpret_cast(&m_transformation_matrix.rows[3]); + } + + void model_to_world(const fvector3& model_coords, fvector3& world_coords) + { + world_coords.x = model_coords.x * m_transformation_matrix.data[0][0] + model_coords.y * m_transformation_matrix.data[1][0] + model_coords.z * m_transformation_matrix.data[2][0] + m_transformation_matrix.data[3][0]; + world_coords.y = model_coords.x * m_transformation_matrix.data[0][1] + model_coords.y * m_transformation_matrix.data[1][1] + model_coords.z * m_transformation_matrix.data[2][1] + m_transformation_matrix.data[3][1]; + world_coords.z = model_coords.x * m_transformation_matrix.data[0][2] + model_coords.y * m_transformation_matrix.data[1][2] + model_coords.z * m_transformation_matrix.data[2][2] + m_transformation_matrix.data[3][2]; + } }; static_assert(sizeof(fwEntity) == 0xB9); #pragma pack(pop) diff --git a/ped/CPed.hpp b/ped/CPed.hpp index a16368d..c1b1fcb 100644 --- a/ped/CPed.hpp +++ b/ped/CPed.hpp @@ -1,6 +1,5 @@ #pragma once - #include "../vehicle/CVehicle.hpp" #include "../player/CPlayerInfo.hpp" #include "CPedModelInfo.hpp" @@ -15,14 +14,13 @@ #include #pragma pack(push, 1) - class CPed : public rage::CPhysical { public: char gap2EC[20]; rage::fvector3 m_velocity; //0x0300 char pad_030C[260]; //0x030C - class CPedBoneInfo m_bone_info; //0x0410 + class CPedBoneInfo m_bone_info[9]; //0x0410 char pad_04A0[2160]; //0x04A0 class CVehicle *m_vehicle; //0x0D10 char pad_0D18[896]; //0x0D18 @@ -49,7 +47,14 @@ public: char pad_1524[240]; //0x1524 uint16_t m_cash; //0x1614 - float get_speed() { return std::sqrt(m_velocity.x * m_velocity.x + m_velocity.y * m_velocity.y + m_velocity.z * m_velocity.z); } + float get_speed() { return sqrt(m_velocity.x * m_velocity.x + m_velocity.y * m_velocity.y + m_velocity.z * m_velocity.z); } + + rage::fvector3 get_bone_coords(ePedBoneType type) + { + rage::fvector3 world_coords; + model_to_world(m_bone_info[(uint32_t)type].model_coords, world_coords); + return world_coords; + } bool can_be_ragdolled() { return m_ped_type & 0x20; } @@ -60,5 +65,4 @@ public: void forced_aim(bool toggle) { m_forced_aim ^= (m_forced_aim ^ -(char)toggle) & 0x20; } }; //Size: 0x1616 static_assert(sizeof(CPed) == 0x1616); - #pragma pack(pop) diff --git a/ped/CPedBoneInfo.hpp b/ped/CPedBoneInfo.hpp index f9205d9..ba54b77 100644 --- a/ped/CPedBoneInfo.hpp +++ b/ped/CPedBoneInfo.hpp @@ -2,26 +2,23 @@ #include "../rage/vector.hpp" +enum class ePedBoneType +{ + HEAD, + L_FOOT, + R_FOOT, + L_ANKLE, + R_ANKLE, + L_HAND, + R_HAND, + NECK, + ABDOMEN +}; + class CPedBoneInfo { public: - rage::fvector3 m_bone_head_model_coords; //0x0000 - char pad_000C[4]; //0x000C - rage::fvector3 m_bone_left_foot_model_coords; //0x0010 - char pad_001C[4]; //0x001C - rage::fvector3 m_bone_right_foot_model_coords; //0x0020 - char pad_002C[4]; //0x002C - rage::fvector3 m_bone_left_ankle_model_coords; //0x0030 - char pad_003C[4]; //0x003C - rage::fvector3 m_bone_right_ankle_model_coords; //0x0040 - char pad_004C[4]; //0x004C - rage::fvector3 m_bone_left_hand_model_coords; //0x0050 - char pad_005C[4]; //0x005C - rage::fvector3 m_bone_right_hand_model_coords; //0x0060 - char pad_006C[4]; //0x006C - rage::fvector3 m_bone_neck_model_coords; //0x0070 - char pad_007C[4]; //0x007C - rage::fvector3 m_bone_abdomen_model_coords; //0x0080 - char pad_008C[4]; //0x008C -}; //Size: 0x0090 -static_assert(sizeof(CPedBoneInfo) == 0x90); \ No newline at end of file + rage::fvector3 model_coords; + char pad_000C[4]; +}; +static_assert(sizeof(CPedBoneInfo) == 0x10); \ No newline at end of file diff --git a/vehicle/CVehicle.hpp b/vehicle/CVehicle.hpp index 8c13f56..856dfde 100644 --- a/vehicle/CVehicle.hpp +++ b/vehicle/CVehicle.hpp @@ -4,6 +4,7 @@ #include "CHandlingData.hpp" #include +#include #pragma pack(push, 1) class CVehicle : public rage::CPhysical @@ -47,6 +48,8 @@ public: char pad_0CD0[0x6A0]; //0x0CD0 uint32_t m_door_lock_status; //0x1370 char pad_1374[0xDC]; //0x1374 + + float get_speed() { return sqrt(m_velocity.x * m_velocity.x + m_velocity.y * m_velocity.y + m_velocity.z * m_velocity.z); } }; static_assert(sizeof(CVehicle) == 0x1450); #pragma pack(pop)