helper functions (#77)

This commit is contained in:
Aure7138 2022-11-29 05:14:26 +08:00 committed by GitHub
parent afbc5546a7
commit d7c99fb996
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 48 additions and 25 deletions

View File

@ -16,6 +16,13 @@ public:
{
return reinterpret_cast<rage::fvector3*>(&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)

View File

@ -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<rage::fvector3*>(&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)

View File

@ -1,6 +1,5 @@
#pragma once
#include "../vehicle/CVehicle.hpp"
#include "../player/CPlayerInfo.hpp"
#include "CPedModelInfo.hpp"
@ -15,14 +14,13 @@
#include <cmath>
#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)

View File

@ -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);
rage::fvector3 model_coords;
char pad_000C[4];
};
static_assert(sizeof(CPedBoneInfo) == 0x10);

View File

@ -4,6 +4,7 @@
#include "CHandlingData.hpp"
#include <cstdint>
#include <cmath>
#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)