225 lines
4.8 KiB
C++
225 lines
4.8 KiB
C++
// Copyright 2022-2023 The Mumble Developers. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license
|
|
// that can be found in the LICENSE file at the root of the
|
|
// Mumble source tree or at <https://www.mumble.info/LICENSE>.
|
|
|
|
#ifndef GTAV_STRUCTS
|
|
#define GTAV_STRUCTS
|
|
|
|
#include <array>
|
|
#include <cstdint>
|
|
|
|
// Reference: https://github.com/Yimura/GTAV-Classes
|
|
|
|
using ptr_t = uint64_t;
|
|
|
|
enum class GameState : int32_t {
|
|
Invalid = -1,
|
|
Playing,
|
|
Died,
|
|
Arrested,
|
|
FailedMission,
|
|
LeftGame,
|
|
Respawn,
|
|
InMPCutscene
|
|
};
|
|
|
|
enum class ModelType : uint8_t { Unk0, Object, Unk1, Unk2, Weapon, Vehicle, Ped, Plant = 129 };
|
|
|
|
// Rockstar Advanced Game Engine (RAGE).
|
|
namespace rage {
|
|
template< typename T > using vector3 = std::array< T, 3 >;
|
|
|
|
using fvector3 = vector3< float >;
|
|
|
|
struct netAddress {
|
|
uint8_t field4;
|
|
uint8_t field3;
|
|
uint8_t field2;
|
|
uint8_t field1;
|
|
};
|
|
|
|
struct netPlayerData {
|
|
uint8_t pad1[8];
|
|
uint64_t rockstarID;
|
|
uint8_t pad2[52];
|
|
netAddress relayIP;
|
|
uint16_t relayPort;
|
|
uint8_t pad3[2];
|
|
netAddress externalIP;
|
|
uint16_t externalPort;
|
|
uint8_t pad4[2];
|
|
netAddress internalIP;
|
|
uint16_t internalPort;
|
|
uint8_t pad5[6];
|
|
uint64_t hostToken;
|
|
uint64_t peerID;
|
|
uint64_t rockstarID2;
|
|
uint8_t pad6[12];
|
|
char name[20];
|
|
};
|
|
|
|
#pragma pack(push, 4)
|
|
struct fwEntity {
|
|
uint8_t pad1[32];
|
|
ptr_t modelInfo; // CBaseModelInfo *
|
|
uint8_t pad2[1];
|
|
int8_t entityType;
|
|
uint8_t pad3[2];
|
|
uint8_t invisible;
|
|
uint8_t pad4[3];
|
|
ptr_t navigation; // CNavigation *
|
|
uint8_t pad5[16];
|
|
ptr_t drawData; // rage::fwDrawData *
|
|
uint8_t pad6[16];
|
|
rage::fvector3 right;
|
|
uint8_t pad7[4];
|
|
rage::fvector3 forward;
|
|
uint8_t pad8[4];
|
|
rage::fvector3 up;
|
|
uint8_t pad9[4];
|
|
rage::fvector3 position;
|
|
uint8_t pad10[52];
|
|
ptr_t netObject; // rage::netObject *
|
|
uint8_t pad11[176];
|
|
uint32_t damageBits;
|
|
};
|
|
#pragma pack(pop)
|
|
} // namespace rage
|
|
|
|
#pragma pack(push, 4)
|
|
struct CPed : public rage::fwEntity {
|
|
uint8_t hostility;
|
|
uint8_t pad1[243];
|
|
float health;
|
|
uint8_t pad2[28];
|
|
float maxHealth;
|
|
uint8_t pad3[124];
|
|
rage::fvector3 velocity;
|
|
uint8_t pad4[2564];
|
|
ptr_t vehicle; // CAutomobile *
|
|
uint8_t pad5[912];
|
|
ptr_t playerInfo; // CPlayerInfo *
|
|
uint8_t pad6[8];
|
|
ptr_t weaponManager; // CPedWeaponManager *
|
|
uint8_t pad7[907];
|
|
uint8_t pedTaskFlag;
|
|
uint8_t pad8[196];
|
|
float armor;
|
|
};
|
|
#pragma pack(pop)
|
|
|
|
struct CGameCameraAngles {
|
|
ptr_t cameraManagerAngles; // CCameraManagerAngles *
|
|
uint8_t pad[56];
|
|
};
|
|
|
|
struct CCameraManagerAngles {
|
|
ptr_t cameraAngles; // CCameraAngles *
|
|
};
|
|
|
|
struct alignas(8) CCameraAngles {
|
|
uint8_t pad1[960];
|
|
ptr_t playerAngles; // CPlayerAngles *
|
|
uint8_t pad2[60];
|
|
};
|
|
|
|
struct CPlayerAngles {
|
|
uint8_t pad1[16];
|
|
ptr_t camData; // CPlayerCameraData *
|
|
uint8_t pad2[24];
|
|
rage::fvector3 right;
|
|
uint8_t pad3[4];
|
|
rage::fvector3 forward;
|
|
uint8_t pad4[4];
|
|
rage::fvector3 up;
|
|
uint8_t pad5[4];
|
|
rage::fvector3 position;
|
|
uint8_t pad6[36];
|
|
};
|
|
|
|
struct CPlayerInfo {
|
|
uint8_t pad1[32];
|
|
rage::netPlayerData netData;
|
|
uint8_t pad2[184];
|
|
float swimSpeed;
|
|
uint8_t pad3[20];
|
|
uint32_t waterProof;
|
|
uint8_t pad4[76];
|
|
GameState gameState;
|
|
uint8_t pad5[12];
|
|
ptr_t ped; // CPed *
|
|
uint8_t pad6[40];
|
|
uint32_t frameFlags;
|
|
uint8_t pad7[52];
|
|
uint32_t playerControls;
|
|
uint8_t pad8[1256];
|
|
float wantedCanChange;
|
|
uint8_t pad9[304];
|
|
uint32_t npcIgnore;
|
|
uint8_t pad10[12];
|
|
bool isWanted;
|
|
uint8_t pad11[7];
|
|
uint32_t wantedLevel;
|
|
uint32_t wantedLevelDisplay;
|
|
uint8_t pad12[1120];
|
|
float runSpeed;
|
|
float stamina;
|
|
float staminaRegen;
|
|
uint8_t pad13[16];
|
|
float weaponDamageMult;
|
|
float weaponDefenceMult;
|
|
uint8_t pad14[4];
|
|
float meleeWeaponDamageMult;
|
|
float meleeDamageMult;
|
|
float meleeDefenceMult;
|
|
uint8_t pad15[8];
|
|
float meleeWeaponDefenceMult;
|
|
};
|
|
|
|
#pragma pack(push, 1)
|
|
struct CNetGamePlayer {
|
|
ptr_t vtable;
|
|
uint8_t pad1[8];
|
|
ptr_t nonPhysicalData; // CNonPhysicalPlayerData *
|
|
uint32_t msgID;
|
|
uint8_t pad2[4];
|
|
uint8_t activeID;
|
|
uint8_t id;
|
|
uint8_t pad3[3];
|
|
uint16_t complaints;
|
|
uint8_t pad4[17];
|
|
ptr_t unknownList[10]; // CNetGamePlayer *
|
|
uint8_t pad5[24];
|
|
ptr_t info; // CPlayerInfo *
|
|
};
|
|
#pragma pack(pop)
|
|
|
|
#pragma pack(push, 2)
|
|
struct CNetworkPlayerMgr {
|
|
ptr_t vtable;
|
|
uint8_t pad1[224];
|
|
ptr_t player; // CNetGamePlayer *
|
|
uint8_t pad2[144];
|
|
ptr_t players[32]; // CNetGamePlayer *
|
|
uint16_t playersMax;
|
|
uint8_t pad_0282[10];
|
|
uint16_t playersCount;
|
|
};
|
|
#pragma pack(pop)
|
|
|
|
static_assert(sizeof(rage::netAddress) == 0x4, "");
|
|
static_assert(sizeof(rage::netPlayerData) == 0x98, "");
|
|
static_assert(sizeof(rage::fwEntity) == 0x18C, "");
|
|
|
|
static_assert(sizeof(CPed) == 0x1534, "");
|
|
static_assert(sizeof(CGameCameraAngles) == 0x40, "");
|
|
static_assert(sizeof(CCameraManagerAngles) == 0x8, "");
|
|
static_assert(sizeof(CCameraAngles) == 0x408, "");
|
|
static_assert(sizeof(CPlayerAngles) == 0x90, "");
|
|
static_assert(sizeof(CPlayerInfo) == 0xD30, "");
|
|
static_assert(sizeof(CNetGamePlayer) == 0xA8, "");
|
|
static_assert(sizeof(CNetworkPlayerMgr) == 0x28E, "");
|
|
|
|
#endif
|