diff --git a/netsync/nodes/ped/CPedGameStateDataNode.hpp b/netsync/nodes/ped/CPedGameStateDataNode.hpp index bd470da..7888ce7 100644 --- a/netsync/nodes/ped/CPedGameStateDataNode.hpp +++ b/netsync/nodes/ped/CPedGameStateDataNode.hpp @@ -29,6 +29,7 @@ public: uint16_t m_mount_id; //0x0142 uint16_t m_custodian_id; //0x0144 uint16_t unk_0146; // 0x0146 + uint8_t new_014C; bool m_tint_index; //0x0148 char pad_0149; //0x0149 uint8_t unk_014A; // 0x014A diff --git a/network/Network.hpp b/network/Network.hpp index e4fc98a..eb9729e 100644 --- a/network/Network.hpp +++ b/network/Network.hpp @@ -99,9 +99,9 @@ class MatchmakingSessionResult { public: class rage::rlSessionDetail m_detail; - char pad_03B8[24]; //0x03B8 + char pad_03B8[88]; //0x03B8 }; //Size: 0x03D0 -static_assert(sizeof(MatchmakingSessionResult) == 0x490); +static_assert(sizeof(MatchmakingSessionResult) == 0x4D0); class PlayerNameMapNode { @@ -178,6 +178,8 @@ static_assert(sizeof(InvitedGamers) == 0xC88); class Network { public: + bool m_unk; + char pad_0001[0x7]; rage::rlSessionInfo m_steam_unk_session; //0x0000 rage::Obf32 m_num_dinput8_instances; //0x0070 rage::Obf32 m_last_time_dinput8_checked; //0x0080 @@ -206,7 +208,7 @@ public: bool m_was_invited; //0xB3FD char pad_B3FE[26]; //0xB3FE TODO: the reclass file is broken class rage::rlSessionInfo m_unk_session_info; //0xB408 - char pad_B4D8[635]; //0xB4D8 + char pad_B4D8[643]; //0xB4D8 bool m_need_host_change; //0xB753 char pad_B754[74316]; //0xB754 class rage::rlSessionDetail m_joining_session_detail; //0x1D9A0 @@ -238,6 +240,9 @@ public: class rage::rlGamerHandle m_inviter_handle; //0x2DCE0 class CNetComplaintMgr m_game_complaint_mgr; //0x2DCF0 class CNetComplaintMgr m_transition_complaint_mgr; //0x2EB88 + + // fields beyond this point are likely outdated! + char pad_2FA20[32]; //0x2FA20 class JoiningPlayerNameMap m_unused_joining_player_name_map; //0x2FA40 char pad_31048[8]; //0x31048 @@ -280,5 +285,5 @@ public: uint32_t m_follower_count; //0x49EE0 char pad_49EE4[628]; //0x49EE4 }; //Size: 0x38650 -static_assert(sizeof(Network) == 0x4A168); +static_assert(sizeof(Network) == 0x4A678); #pragma pack(pop) \ No newline at end of file diff --git a/network/netPlayer.hpp b/network/netPlayer.hpp index 30b2937..7b15e94 100644 --- a/network/netPlayer.hpp +++ b/network/netPlayer.hpp @@ -19,10 +19,11 @@ namespace rage virtual void reset(); virtual bool is_valid(); virtual const char* get_name(); - virtual void _0x50(); + virtual std::uint64_t get_host_token(); + virtual void _0x58(); virtual bool is_host(); virtual rage::rlGamerInfo* get_net_data(); - virtual void _0x68(); + virtual void _0x70(); char pad_0008[8]; //0x0008 CNonPhysicalPlayerData* m_non_physical_player; //0x0010 diff --git a/script/globals/GPBD_FM.hpp b/script/globals/GPBD_FM.hpp index 2f06877..adb4e88 100644 --- a/script/globals/GPBD_FM.hpp +++ b/script/globals/GPBD_FM.hpp @@ -456,9 +456,16 @@ struct SALVAGE_YARD_DATA }; static_assert(sizeof(SALVAGE_YARD_DATA) == 7 * 8); +struct BAIL_SHOP_DATA +{ + SCR_INT Index; + uint64_t PAD_0001[12]; +}; +static_assert(sizeof(BAIL_SHOP_DATA) == 13 * 8); + struct PROPERTY_DATA { - SCR_ARRAY PropertyIds; // size 30 -> 31 b3095 + SCR_ARRAY PropertyIds; // size 30 -> 31 b3095, size 31 -> 32 b3258 SCR_BITSETFlags; // I really don't want to indent everything again SCR_INT RingingPlayers; // bitset of players requesting entry into property SCR_INT Index; // the value you pass to the send to apartment TSE @@ -467,7 +474,7 @@ struct PROPERTY_DATA PLAYER_INDEX ExteriorOwner; SCR_ARRAY RingingPlayersState; // 0 = ringing, 1 = accepted, 2 = denied GAMER_HANDLE OwnerHandle; // can be used to bypass RID spoofing when player is inside interior - SCR_ARRAY EclipseTheme; // size 30 -> 31 b3095 + SCR_ARRAY EclipseTheme; // size 30 -> 31 b3095, size 31 -> 32 b3258 SCR_INT ApartmentType; // normal vs stilt vs eclipse SCR_INT OwnerInstance; // same as Instance in most cases SCR_ARRAY ExecutiveWarehouseInfos; @@ -540,8 +547,9 @@ struct PROPERTY_DATA VEHICLE_INDEX CurrentlyModdingVehicleFixerHQ; MULTI_STOREY_GARAGE_DATA MultiStoreyGarageData; // @507 as of 1.67 SCR_INT FreakshopBits; // 0: has weapon workshop, 1: radio enabled + BAIL_SHOP_DATA BailShopData; }; -static_assert(sizeof(PROPERTY_DATA) == 523 * 8); +static_assert(sizeof(PROPERTY_DATA) == 538 * 8); struct BIKER_CONTRACTS { @@ -585,6 +593,7 @@ struct GPBD_FM_Entry TEXT_LABEL_63 JobName; SCR_ARRAY ActiveGunRange; // this should have really been an enum lol MP_SCRIPT_DATA MissionScriptData; + SCR_BOOL PAD_0057; // added b3258, some mission thing JOB_SETTINGS JobSettings; SCR_INT FMMCLauncherState; VEHICLE_SELECTION VehicleSelection; @@ -643,17 +652,17 @@ struct GPBD_FM_Entry SCR_INT PAD_0837; // some more aircraft flags SCR_BOOL RespawningToPreviousCheckpoint; NIGHTCLUB_SALE NightclubSale; - uint64_t PAD_844[11]; // unused, all of them + uint64_t PAD_844; SCR_INT SeatingIndex; ARENA_WAR_DATA ArenaWarData; // @858 as of 1.67 uint64_t PAD_0861[2]; SCR_INT ApartmentEnterFlags; SCR_VEC3 AvengerMissionStartPosition; }; -static_assert(sizeof(GPBD_FM_Entry) == 877 * 8); +static_assert(sizeof(GPBD_FM_Entry) == 883 * 8); struct GPBD_FM { SCR_ARRAY Entries; }; -static_assert(sizeof(GPBD_FM) == 28065 * 8); +static_assert(sizeof(GPBD_FM) == 28257 * 8); diff --git a/script/globals/GPBD_FM_3.hpp b/script/globals/GPBD_FM_3.hpp index ad05095..6d6f97c 100644 --- a/script/globals/GPBD_FM_3.hpp +++ b/script/globals/GPBD_FM_3.hpp @@ -212,7 +212,7 @@ struct BOSS_GOON uint64_t PAD_0183[4]; // TODO some unknown contraband struct VEHICLE_EXPORT VehicleExport; uint64_t PAD_0193[12]; // TODO - SCR_ARRAY ActiveFreemodeEvents; // force thunder + SCR_ARRAY ActiveFreemodeEvents; // force thunder, size 7 -> 8 b3258 uint64_t PAD_0212[22]; // I'm not even going to bother with this one HANGAR_CARGO HangarCargo; uint64_t PAD_0236[23]; // not going to bother with this one either @@ -280,7 +280,7 @@ struct BOSS_GOON uint64_t PAD_0478[18]; // TODO SCR_BOOL DoubleActionCacheLocationRevealed; }; -static_assert(sizeof(BOSS_GOON) == 498 * 8); +static_assert(sizeof(BOSS_GOON) == 499 * 8); struct MC_STATS { @@ -348,10 +348,10 @@ struct GBPD_FM_3_Entry SCR_INT CasinoFlowProgress; SCR_ARRAY DailyObjectiveFlags; // @607 as of 1.67 }; -static_assert(sizeof(GBPD_FM_3_Entry) == 609 * 8); +static_assert(sizeof(GBPD_FM_3_Entry) == 610 * 8); struct GPBD_FM_3 { SCR_ARRAY Entries; }; -static_assert(sizeof(GPBD_FM_3) == 19489 * 8); \ No newline at end of file +static_assert(sizeof(GPBD_FM_3) == 19521 * 8); \ No newline at end of file diff --git a/script/globals/GSBD_FM.hpp b/script/globals/GSBD_FM.hpp index a0449ab..eb8f300 100644 --- a/script/globals/GSBD_FM.hpp +++ b/script/globals/GSBD_FM.hpp @@ -63,4 +63,4 @@ struct GSBD_FM BIKER_CONTRACTS_SERVER BikerContracts; SCR_ARRAY DoubleActionCacheLocationRevealed; }; -static_assert(sizeof(GSBD_FM) == 642 * 8); \ No newline at end of file +static_assert(sizeof(GSBD_FM) == 643 * 8); \ No newline at end of file diff --git a/script/globals/GlobalPlayerBD.hpp b/script/globals/GlobalPlayerBD.hpp index 706b326..84ac2f0 100644 --- a/script/globals/GlobalPlayerBD.hpp +++ b/script/globals/GlobalPlayerBD.hpp @@ -479,6 +479,7 @@ struct SMPL_INTERIOR_DATA SCR_INT Flags5; SCR_INT Flags6; SCR_INT Flags7; + SCR_INT Flags8; // added b3258 alignas(8) eSimpleInteriorIndex Index; SCR_INT InstanceId; SCR_INT AllowedGoons; @@ -496,7 +497,7 @@ struct SMPL_INTERIOR_DATA SCR_INT MissionSpawnSimpleInteriorIndex; SCR_INT InteriorSubtype; // nightclub vs nightclub garage etc }; -static_assert(sizeof(SMPL_INTERIOR_DATA) == 29 * 8); +static_assert(sizeof(SMPL_INTERIOR_DATA) == 30 * 8); // yes there's a struct for leaving your clubhouse struct LEAVE_CLUBHOUSE @@ -546,6 +547,7 @@ struct GlobalPlayerBDEntry NETWORK_INDEX DeliveryMechanicNetId4; // another one... NETWORK_INDEX AcidLabNetId; NETWORK_INDEX DeliveryBikeNetId; + NETWORK_INDEX BountyTransporterNetId; // added b3258 SCR_BOOL PAD_0057; uint64_t PAD_0058[15]; // confirmed these are not used by PC scripts PLAYER_BLIP PlayerBlip; @@ -660,10 +662,10 @@ struct GlobalPlayerBDEntry SCR_BOOL CanSpawnGunVan; }; -static_assert(sizeof(GlobalPlayerBDEntry) == 463 * 8); +static_assert(sizeof(GlobalPlayerBDEntry) == 465 * 8); struct GlobalPlayerBD { SCR_ARRAY Entries; }; -static_assert(sizeof(GlobalPlayerBD) == 14817 * 8); \ No newline at end of file +static_assert(sizeof(GlobalPlayerBD) == 14881 * 8); \ No newline at end of file diff --git a/script/globals/g_AMC_playerBD.hpp b/script/globals/g_AMC_playerBD.hpp index 4733f50..783892f 100644 --- a/script/globals/g_AMC_playerBD.hpp +++ b/script/globals/g_AMC_playerBD.hpp @@ -1,16 +1,16 @@ -#pragma once -#include "../types.hpp" -#include "../Timer.hpp" - -struct g_AMC_playerBD_Entry -{ - SCR_ARRAY UsedContactServicesTimer; // only index 2 (mugger) is actually used by the scripts. the rest is just a waste of bandwidth - SCR_ARRAY ContactServiceCooldowns; // same as above -}; -static_assert(sizeof(g_AMC_playerBD_Entry) == 242 * 8); - -struct g_AMC_playerBD -{ - SCR_ARRAY Entries; -}; -static_assert(sizeof(g_AMC_playerBD) == 7745 * 8); \ No newline at end of file +#pragma once +#include "../types.hpp" +#include "../Timer.hpp" + +struct g_AMC_playerBD_Entry +{ + SCR_ARRAY UsedContactServicesTimer; // only index 2 (mugger) is actually used by the scripts. the rest is just a waste of bandwidth + SCR_ARRAY ContactServiceCooldowns; // same as above +}; +static_assert(sizeof(g_AMC_playerBD_Entry) == 245 * 8); + +struct g_AMC_playerBD +{ + SCR_ARRAY Entries; +}; +static_assert(sizeof(g_AMC_playerBD) == 7841 * 8); \ No newline at end of file diff --git a/script/types.hpp b/script/types.hpp index 34f5971..78336e6 100644 --- a/script/types.hpp +++ b/script/types.hpp @@ -1,103 +1,103 @@ -#pragma once -#include -#include "scrVector.hpp" - -#ifndef BOOL -#define BOOL int -#endif - -using Void = void; -using Any = int; -using Hash = std::uint32_t; -using Entity = std::int32_t; -using Player = std::int32_t; -using FireId = std::int32_t; -using Interior = std::int32_t; -using Ped = Entity; -using Vehicle = Entity; -using Cam = std::int32_t; -using Object = Entity; -using Pickup = Object; -using Blip = std::int32_t; -using Camera = Entity; -using ScrHandle = Entity; -using Vector3 = rage::scrVector; - -#define PLAYER_INDEX alignas(8) Player -#define ENTITY_INDEX alignas(8) Entity -#define PED_INDEX alignas(8) Ped -#define VEHICLE_INDEX alignas(8) Vehicle -#define INTERIOR_INDEX alignas(8) Interior -#define NETWORK_INDEX alignas(8) int - -#define SCR_HASH alignas(8) Hash -#define SCR_INT alignas(8) int -#define SCR_BOOL alignas(8) BOOL -#define SCR_FLOAT alignas(8) float -#define SCR_VEC3 Vector3 - -template -struct SCR_TEXT_LABEL -{ - alignas(8) char Data[SIZE]; -private: - alignas(8) char _PAD[SIZE]; -public: - operator char* () { return Data; } -}; - -#define TEXT_LABEL_15 SCR_TEXT_LABEL<16> -#define TEXT_LABEL_23 SCR_TEXT_LABEL<24> -#define TEXT_LABEL_31 SCR_TEXT_LABEL<32> -#define TEXT_LABEL_63 SCR_TEXT_LABEL<64> - -template -struct SCR_ARRAY -{ - SCR_INT Size; - alignas(8) T Data[SIZE]; - - T& operator [](int index) - { - return Data[index]; - } -}; - -template -struct SCR_BITSET -{ - alignas(8) int Value; - - bool IsSet(T val) - { - return Value & (1 << (int)val); - } - - void Set(T val) - { - Value |= (1 << (int)val); - } - - void Clear(T val) - { - Value &= ~(1 << (int)val); - } -}; - -struct Color3 -{ - SCR_INT R; - SCR_INT G; - SCR_INT B; -}; -static_assert(sizeof(Color3) == 3 * 8); - -// serialized bitbuffer data of rage::rlGamerHandle + some padding for last gen compatibility -struct GAMER_HANDLE -{ -private: - uint64_t Data[13]; -}; -static_assert(sizeof(GAMER_HANDLE) == 13 * 8); - -#define NUM_CONTACTS 80 \ No newline at end of file +#pragma once +#include +#include "scrVector.hpp" + +#ifndef BOOL +#define BOOL int +#endif + +using Void = void; +using Any = int; +using Hash = std::uint32_t; +using Entity = std::int32_t; +using Player = std::int32_t; +using FireId = std::int32_t; +using Interior = std::int32_t; +using Ped = Entity; +using Vehicle = Entity; +using Cam = std::int32_t; +using Object = Entity; +using Pickup = Object; +using Blip = std::int32_t; +using Camera = Entity; +using ScrHandle = Entity; +using Vector3 = rage::scrVector; + +#define PLAYER_INDEX alignas(8) Player +#define ENTITY_INDEX alignas(8) Entity +#define PED_INDEX alignas(8) Ped +#define VEHICLE_INDEX alignas(8) Vehicle +#define INTERIOR_INDEX alignas(8) Interior +#define NETWORK_INDEX alignas(8) int + +#define SCR_HASH alignas(8) Hash +#define SCR_INT alignas(8) int +#define SCR_BOOL alignas(8) BOOL +#define SCR_FLOAT alignas(8) float +#define SCR_VEC3 Vector3 + +template +struct SCR_TEXT_LABEL +{ + alignas(8) char Data[SIZE]; +private: + alignas(8) char _PAD[SIZE]; +public: + operator char* () { return Data; } +}; + +#define TEXT_LABEL_15 SCR_TEXT_LABEL<16> +#define TEXT_LABEL_23 SCR_TEXT_LABEL<24> +#define TEXT_LABEL_31 SCR_TEXT_LABEL<32> +#define TEXT_LABEL_63 SCR_TEXT_LABEL<64> + +template +struct SCR_ARRAY +{ + SCR_INT Size; + alignas(8) T Data[SIZE]; + + T& operator [](int index) + { + return Data[index]; + } +}; + +template +struct SCR_BITSET +{ + alignas(8) int Value; + + bool IsSet(T val) + { + return Value & (1 << (int)val); + } + + void Set(T val) + { + Value |= (1 << (int)val); + } + + void Clear(T val) + { + Value &= ~(1 << (int)val); + } +}; + +struct Color3 +{ + SCR_INT R; + SCR_INT G; + SCR_INT B; +}; +static_assert(sizeof(Color3) == 3 * 8); + +// serialized bitbuffer data of rage::rlGamerHandle + some padding for last gen compatibility +struct GAMER_HANDLE +{ +private: + uint64_t Data[13]; +}; +static_assert(sizeof(GAMER_HANDLE) == 13 * 8); + +#define NUM_CONTACTS 81 \ No newline at end of file