diff --git a/network/CCommunications.hpp b/network/CCommunications.hpp index a876032..3dbb2ba 100644 --- a/network/CCommunications.hpp +++ b/network/CCommunications.hpp @@ -9,25 +9,25 @@ public: class rage::rlGamerInfo m_gamer_info; //0x0000 char pad_0098[40]; //0x00F8 }; //Size: 0x00C0 -static_assert(sizeof(CVoiceConnection) == 0x120); +static_assert(sizeof(CVoiceConnection) == 0x118); class CVoice { public: class CVoiceConnection m_connection_storage[32]; //0x0000 - char pad_1800[8]; //0x1800 - class CVoiceConnection* m_connections[32]; //0x1808 - uint32_t m_connection_count; //0x1908 - char pad_190C[3508]; //0x190C -}; //Size: 0x1978 -static_assert(sizeof(CVoice) == 0x32C0); + char pad_2300[8]; //0x2300 + class CVoiceConnection* m_connections[32]; //0x2308 + uint32_t m_connection_count; //0x2408 + char pad_240C[3508]; //0x240C +}; //Size: 0x31C0 +static_assert(sizeof(CVoice) == 0x31C0); class CCommunications { public: char pad_0000[48]; //0x0000 class CVoice m_voice; //0x0030 - char pad_26F0[280300]; //0x26F0 -}; //Size: 0x46DE4 -static_assert(sizeof(CCommunications) == 0x479DC); + char pad_31F0[280300]; //0x31F0 +}; //Size: 0x478DC +static_assert(sizeof(CCommunications) == 0x478DC); #pragma pack(pop) \ No newline at end of file diff --git a/network/CNetComplaintMgr.hpp b/network/CNetComplaintMgr.hpp index 56ac6af..f520185 100644 --- a/network/CNetComplaintMgr.hpp +++ b/network/CNetComplaintMgr.hpp @@ -4,67 +4,67 @@ class CNetRemoteComplaint { public: - uint64_t m_complainer_token; //0x0000 - uint64_t m_complainee_token; //0x0008 - uint32_t m_flags; //0x0010 - uint32_t m_time; //0x0014 + uint64_t m_complainer_token; //0x0000 + uint64_t m_complainee_token; //0x0008 + uint32_t m_flags; //0x0010 + uint32_t m_time; //0x0014 }; //Size: 0x0018 static_assert(sizeof(CNetRemoteComplaint) == 0x18); class CNetComplaintMgr { public: - uint64_t m_host_token; //0x0000 - uint32_t m_host_peer_id; //0x0008 - char pad_000C[4]; //0x000C - void* m_net_connection_mgr; //0x0010 - char pad_0018[64]; //0x0018 - uint64_t m_host_tokens_in_scope[64]; //0x0058 - uint32_t m_num_tokens_in_scope; //0x0258 - char pad_025C[4]; //0x025C - class CNetRemoteComplaint m_remote_complaints[64]; //0x0260 - uint32_t m_num_remote_complaints; //0x0860 - char pad_0864[4]; //0x0864 - uint64_t m_host_tokens_complained[64]; //0x0868 - uint32_t m_num_tokens_complained; //0x0A68 - char pad_0A6C[520]; //0x0A6C - uint32_t m_connection_identifier; //0x0C74 - uint32_t m_last_resend_time; //0x0C78 - char pad_0C7C[4]; //0x0C7C - uint32_t m_time_to_resend; //0x0C80 - uint32_t m_flags; //0x0C84 - char pad_0C88[16]; //0x0C88 + uint64_t m_host_token; //0x0000 + uint32_t m_host_peer_id; //0x0008 + char pad_000C[4]; //0x000C + void* m_net_connection_mgr; //0x0010 + char pad_0018[64]; //0x0018 + class rage::rlGamerHandle m_handles_in_scope[64]; //0x0058 + uint32_t m_num_handles_in_scope; //0x0458 + char pad_045C[4]; //0x045C + class CNetRemoteComplaint m_remote_complaints[64]; //0x0460 + uint32_t m_num_remote_complaints; //0x0A60 + char pad_0A64[4]; //0x0A64 + uint64_t m_host_tokens_complained[64]; //0x0A68 + uint32_t m_num_tokens_complained; //0x0C68 + char pad_0C6C[520]; //0x0C6C + uint32_t m_connection_identifier; //0x0E74 + uint32_t m_last_resend_time; //0x0E78 + char pad_0E7C[4]; //0x0E7C + uint32_t m_time_to_resend; //0x0E80 + uint32_t m_flags; //0x0E84 + char pad_0E88[16]; //0x0E88 - inline bool has_local_complaint(uint64_t host_token) - { - for (std::uint32_t i = 0; i < m_num_tokens_complained; i++) - if (m_host_tokens_complained[i] == host_token) - return true; + inline bool has_local_complaint(uint64_t host_token) + { + for (std::uint32_t i = 0; i < m_num_tokens_complained; i++) + if (m_host_tokens_complained[i] == host_token) + return true; - return false; - } + return false; + } - inline void raise_complaint(uint64_t host_token) - { - if (has_local_complaint(host_token)) - return; + inline void raise_complaint(uint64_t host_token) + { + if (has_local_complaint(host_token)) + return; - m_host_tokens_complained[m_num_tokens_complained++] = host_token; + m_host_tokens_complained[m_num_tokens_complained++] = host_token; - // big::g_pointers->m_raise_network_complaint(this, host_token); - } + // big::g_pointers->m_raise_network_complaint(this, host_token); + } - inline void remove_complaint(uint64_t host_token) - { - if (!has_local_complaint(host_token)) - return; + inline void remove_complaint(uint64_t host_token) + { + if (!has_local_complaint(host_token)) + return; - for (std::uint32_t i = 0; i < m_num_tokens_complained; i++) - if (m_host_tokens_complained[i] == host_token) - m_host_tokens_complained[i] = m_host_tokens_complained[m_num_tokens_complained - 1]; + for (std::uint32_t i = 0; i < m_num_tokens_complained; i++) + if (m_host_tokens_complained[i] == host_token) + m_host_tokens_complained[i] = m_host_tokens_complained[m_num_tokens_complained - 1]; - m_num_tokens_complained--; - } + m_num_tokens_complained--; + } }; //Size: 0x0C98 -static_assert(sizeof(CNetComplaintMgr) == 0xC98); \ No newline at end of file +static_assert(sizeof(CNetComplaintMgr) == 0xE98); \ No newline at end of file diff --git a/network/CNetworkPlayerMgr.hpp b/network/CNetworkPlayerMgr.hpp index b53dcf0..8a89ba9 100644 --- a/network/CNetworkPlayerMgr.hpp +++ b/network/CNetworkPlayerMgr.hpp @@ -10,25 +10,25 @@ class CNetworkPlayerMgr : public rage::netPlayerMgrBase { public: - CNetGamePlayer m_net_players[32]; //0x08E0 - uint64_t unk_60E0; //0x60E0 - uint64_t unk_60E8; //0x60E8 - uint64_t unk_60F0; //0x60F0 - uint64_t unk_60F8; //0x60F8 - CNetGamePlayer m_net_players_2[32]; //0x6100 - uint64_t unk_B900; //0xB900 - uint64_t unk_B908; //0xB908 - uint64_t unk_B910; //0xB910 - uint64_t unk_B918; //0xB918 - uint64_t unk_B920; //0xB920 - uint64_t unk_B928; //0xB928 - uint64_t unk_B930; //0xB930 - uint32_t unk_B938; //0xB938 - char pad_B93C[3]; //0xB93C - bool unk_B93F; //0xB93F - uint32_t unk_B940; //0xB940 - uint32_t unk_B944; //0xB944 - uint16_t unk_B948; //0xB948 + CNetGamePlayer m_net_players[32]; //0x08E0 + uint64_t unk_60E0; //0x60E0 + uint64_t unk_60E8; //0x60E8 + uint64_t unk_60F0; //0x60F0 + uint64_t unk_60F8; //0x60F8 + CNetGamePlayer m_net_players_2[32]; //0x6100 + uint64_t unk_B900; //0xB900 + uint64_t unk_B908; //0xB908 + uint64_t unk_B910; //0xB910 + uint64_t unk_B918; //0xB918 + uint64_t unk_B920; //0xB920 + uint64_t unk_B928; //0xB928 + uint64_t unk_B930; //0xB930 + uint32_t unk_B938; //0xB938 + char pad_B93C[3]; //0xB93C + bool unk_B93F; //0xB93F + uint32_t unk_B940; //0xB940 + uint32_t unk_B944; //0xB944 + uint16_t unk_B948; //0xB948 }; //Size: 0xB94A -static_assert(sizeof(CNetworkPlayerMgr) == 0xD14A); +static_assert(sizeof(CNetworkPlayerMgr) == 0xD152); #pragma pack(pop) diff --git a/network/Network.hpp b/network/Network.hpp index 81f1eee..b695b91 100644 --- a/network/Network.hpp +++ b/network/Network.hpp @@ -10,276 +10,279 @@ class MetricSessionMigrated : public rage::rlMetric { public: - char pad_0008[828]; //0x0008 - uint32_t m_num_players; //0x0344 + char pad_0008[828]; //0x0008 + uint32_t m_num_players; //0x0344 }; //Size: 0x0348 static_assert(sizeof(MetricSessionMigrated) == 0x348); class NetworkGameConfig { public: - char pad_0000[48]; //0x0000 - uint32_t m_public_slots; //0x0030 - uint32_t m_private_slots; //0x0034 - char pad_0038[272]; //0x0038 + char pad_0000[48]; //0x0000 + uint32_t m_public_slots; //0x0030 + uint32_t m_private_slots; //0x0034 + char pad_0038[272]; //0x0038 }; //Size: 0x0148 static_assert(sizeof(NetworkGameConfig) == 0x148); class NetworkGameFilterMatchmakingComponent { public: - // do not use for actual network filters, this will break things - inline void SetParameter(const char* name, int index, int value) - { - std::strcpy(m_param_names[index], name); - m_param_mappings[index] = index; - m_param_values[index] = value; - m_enabled_params_bitset |= (1 << index); + // do not use for actual network filters, this will break things + inline void SetParameter(const char* name, int index, int value) + { + std::strcpy(m_param_names[index], name); + m_param_mappings[index] = index; + m_param_values[index] = value; + m_enabled_params_bitset |= (1 << index); - if (m_num_parameters <= (uint32_t)index) - m_num_parameters++; - } + if (m_num_parameters <= (uint32_t)index) + m_num_parameters++; + } - uint32_t m_filter_type; //0x0000 - char m_filter_name[24]; //0x0004 - uint32_t m_num_parameters; //0x001C - uint16_t m_game_mode; //0x0020 - uint16_t m_session_type; //0x0022 - uint32_t m_param_unk[8]; //0x0024 - char m_param_names[8][24]; //0x0044 - char pad_0104[4]; //0x0104 - uint32_t m_param_mappings[8]; //0x0108 - char pad_0128[352]; //0x0128 - uint32_t m_param_values[8]; //0x0288 - char pad_02A8[96]; //0x02A8 - uint32_t m_enabled_params_bitset; //0x0308 - char pad_030C[8]; //0x030C + uint32_t m_filter_type; //0x0000 + char m_filter_name[24]; //0x0004 + uint32_t m_num_parameters; //0x001C + uint16_t m_game_mode; //0x0020 + uint16_t m_session_type; //0x0022 + uint32_t m_param_unk[8]; //0x0024 + char m_param_names[8][24]; //0x0044 + char pad_0104[4]; //0x0104 + uint32_t m_param_mappings[8]; //0x0108 + char pad_0128[352]; //0x0128 + uint32_t m_param_values[8]; //0x0288 + char pad_02A8[96]; //0x02A8 + uint32_t m_enabled_params_bitset; //0x0308 + char pad_030C[8]; //0x030C }; //Size: 0x0314 static_assert(sizeof(NetworkGameFilterMatchmakingComponent) == 0x314); class MatchmakingAttributes { public: - uint32_t m_game_mode; //0x0000 - uint32_t m_num_params; //0x0004 - uint32_t m_param_unk[8]; //0x0008 - char m_param_names[8][24]; //0x0028 - uint32_t m_param_values[8]; //0x00E8 - uint32_t m_params_bitset; //0x0108 + uint32_t m_game_mode; //0x0000 + uint32_t m_num_params; //0x0004 + uint32_t m_param_unk[8]; //0x0008 + char m_param_names[8][24]; //0x0028 + uint32_t m_param_values[8]; //0x00E8 + uint32_t m_params_bitset; //0x0108 }; //Size: 0x010C static_assert(sizeof(MatchmakingAttributes) == 0x10C); class NetworkGameFilter { public: - virtual ~NetworkGameFilter() = default; - virtual void Reset() {}; + virtual ~NetworkGameFilter() = default; + virtual void Reset() {}; - uint32_t m_build_type; //0x0008 - uint32_t m_discriminator; //0x000C - uint32_t m_discriminator_mapping; //0x0010 - uint32_t m_region_mapping; //0x0014 - uint32_t m_language_mapping; //0x0018 - uint32_t m_mm_group_1_mapping; //0x001C - uint32_t m_mm_group_2_mapping; //0x0020 - uint32_t m_activity_type_mapping; //0x0024 - uint32_t m_activity_id_mapping; //0x0028 - uint32_t m_activity_players_mapping; //0x002C - class NetworkGameFilterMatchmakingComponent m_matchmaking_component; //0x0030 + uint32_t m_build_type; //0x0008 + uint32_t m_discriminator; //0x000C + uint32_t m_discriminator_mapping; //0x0010 + uint32_t m_region_mapping; //0x0014 + uint32_t m_language_mapping; //0x0018 + uint32_t m_mm_group_1_mapping; //0x001C + uint32_t m_mm_group_2_mapping; //0x0020 + uint32_t m_activity_type_mapping; //0x0024 + uint32_t m_activity_id_mapping; //0x0028 + uint32_t m_activity_players_mapping; //0x002C + class NetworkGameFilterMatchmakingComponent m_matchmaking_component; //0x0030 }; //Size: 0x0344 static_assert(sizeof(NetworkGameFilter) == 0x344); class SessionInfoBackup { public: - class rage::rlSessionInfo m_session_info; - uint32_t m_unk; //0x0070 - char pad_0074[4]; //0x0074 - uint32_t m_flags; //0x0078 + class rage::rlSessionInfo m_session_info; + uint32_t m_unk; //0x0070 + char pad_0074[4]; //0x0074 + uint32_t m_flags; //0x0078 }; //Size: 0x007C static_assert(sizeof(SessionInfoBackup) == 0xDC); class MatchmakingSessionResult { public: - class rage::rlSessionDetail m_detail; - char pad_03B8[24]; //0x03B8 + class rage::rlSessionDetail m_detail; + char pad_03B8[24]; //0x03B8 }; //Size: 0x03D0 static_assert(sizeof(MatchmakingSessionResult) == 0x490); class PlayerNameMapNode { public: - char m_name[24]; //0x0000 - class rage::rlGamerHandle m_handle; //0x0018 - class PlayerNameMapNode* m_next; //0x0028 - class PlayerNameMapNode* m_prev; //0x0030 -}; //Size: 0x0038 -static_assert(sizeof(PlayerNameMapNode) == 0x38); + char m_name[16]; //0x0000 + class rage::rlGamerHandle m_handle; //0x0010 + class PlayerNameMapNode* m_next; //0x0020 + class PlayerNameMapNode* m_prev; //0x0028 +}; //Size: 0x0030 +static_assert(sizeof(PlayerNameMapNode) == 0x30); class JoiningPlayerNameMap { public: - class PlayerNameMapNode m_names[100]; //0x0000 - char pad_15E0[40]; //0x15E0 - uint32_t m_num_name_nodes; //0x1608 - char pad_160C[796]; //0x160C -}; //Size: 0x1928 -static_assert(sizeof(JoiningPlayerNameMap) == 0x1928); + class PlayerNameMapNode m_names[100]; //0x0000 + char pad_12C0[40]; //0x12C0 + uint32_t m_num_name_nodes; //0x12E8 + char pad_12EC[796]; //0x12EC +}; //Size: 0x1608 +static_assert(sizeof(JoiningPlayerNameMap) == 0x1608); class CNetBlacklistNode { public: - class rage::rlGamerHandle m_handle; //0x0000 - bool m_block_rejoin; //0x0010 - char pad_0011[3]; //0x0011 - uint32_t m_added_time; //0x0014 - class CNetBlacklistNode* m_next; //0x0018 - class CNetBlacklistNode* m_prev; //0x0020 + class rage::rlGamerHandle m_handle; //0x0000 + bool m_block_rejoin; //0x0010 + char pad_0011[3]; //0x0011 + uint32_t m_added_time; //0x0014 + class CNetBlacklistNode* m_next; //0x0018 + class CNetBlacklistNode* m_prev; //0x0020 }; //Size: 0x0028 static_assert(sizeof(CNetBlacklistNode) == 0x28); class CNetBlacklist { public: - class CNetBlacklistNode m_nodes[16]; //0x0000 - class CNetBlacklistNode* m_head; //0x0280 - class CNetBlacklistNode* m_tail; //0x0288 - uint32_t m_free_nodes; //0x0290 - char pad_0294[4]; //0x0294 - class CNetBlacklistNode* m_start; //0x0298 - char pad_02A0[24]; //0x02A0 + class CNetBlacklistNode m_nodes[16]; //0x0000 + class CNetBlacklistNode* m_head; //0x0280 + class CNetBlacklistNode* m_tail; //0x0288 + uint32_t m_free_nodes; //0x0290 + char pad_0294[4]; //0x0294 + class CNetBlacklistNode* m_start; //0x0298 + char pad_02A0[24]; //0x02A0 }; //Size: 0x02B8 static_assert(sizeof(CNetBlacklist) == 0x2B8); class RemotePlayerData { public: - class rage::netGamePlayerData m_data[32]; //0x0000 - uint32_t m_count; //0x0600 - char pad_0604[4]; //0x0604 + class rage::netGamePlayerData m_data[32]; //0x0000 + uint32_t m_count; //0x0600 + char pad_0604[4]; //0x0604 }; //Size: 0x0608 static_assert(sizeof(RemotePlayerData) == 0x608); class InvitedGamer { public: - class rage::rlGamerHandle m_handle; - char pad_0010[12]; //0x0010 - uint32_t m_flags; //0x001C + class rage::rlGamerHandle m_handle; + char pad_0010[12]; //0x0010 + uint32_t m_flags; //0x001C }; //Size: 0x0020 static_assert(sizeof(InvitedGamer) == 0x20); class InvitedGamers { public: - class InvitedGamer m_invited_gamers[100]; //0x0000 - uint32_t m_num_invited_gamers; //0x0C80 - char pad_0C84[4]; //0x0C84 + class InvitedGamer m_invited_gamers[100]; //0x0000 + uint32_t m_num_invited_gamers; //0x0C80 + char pad_0C84[4]; //0x0C84 }; //Size: 0x0C88 static_assert(sizeof(InvitedGamers) == 0xC88); class Network { public: - rage::rlSessionInfo m_steam_unk_session; //0x0000 - rage::Obf32 m_num_dinput8_instances; //0x0070 - rage::Obf32 m_last_time_dinput8_checked; //0x0080 - class rage::snSession* m_game_session_ptr; //0x0090 - class rage::snSession* m_transition_session_ptr; //0x0098 - char pad_00A0[24]; //0x00A0 - class rage::snSession m_game_session; //0x00B8 - class rage::snSession m_transition_session; //0x3F28 - char pad_7D98[16]; //0x7D98 - class NetworkGameConfig m_network_game_config; //0xAC48 - class NetworkGameConfig m_network_transition_config; //0xAD90 - bool m_session_attributes_dirty; //0xAED8 - char pad_AED9[19]; //0xAED9 - uint32_t m_session_visibility_flags; //0xAEEC - uint32_t m_transition_visibility_flags; //0xAEF0 - char pad_AEF4[60]; //0xAEF4 - class MetricSessionMigrated m_metric_session_migrated; //0xAF30 - bool m_migrated_metric_enabled; //0xB278 - char pad_B279[3]; //0xB279 - uint32_t m_game_session_state; //0xB27C - class NetworkGameFilter m_network_game_filter; //0xB280 - char pad_B5C4[33]; //0xB5C4 - bool m_was_invited; //0xB5E5 - char pad_B5E6[10]; //0xB5E6 - class rage::rlSessionInfo m_unk_session_info; //0xB5F0 - char pad_B6C0[635]; //0xB6C0 - bool m_need_host_change; //0xB93B - char pad_B93C[2628]; //0xB93C - class rage::rlSessionDetail m_joining_session_detail; //0xC380 - class SessionInfoBackup m_last_joined_session; //0xC7F8 - char pad_C8D4[40]; //0xC8D4 - uint32_t m_current_matchmaking_group; //0xC8FC - uint32_t m_matchmaking_group_max_players[5]; //0xC900 - uint32_t m_num_active_matchmaking_groups; //0xC914 - char pad_C918[8]; //0xC918 - uint8_t m_matchmaking_property_id; //0xC920 - uint8_t m_matchmaking_mental_state; //0xC921 - char pad_C922[366]; //0xC922 - class rage::rlMatchmakingFindResult m_game_session_matchmaking[3]; //0xCA90 - char pad_195A0[40]; //0x195A0 - class MatchmakingSessionResult m_game_matchmaking_session_results[10]; //0x195C8 - char pad_1C368[308]; //0x1C368 - uint32_t m_num_bosses; //0x1C49C - bool m_num_bosses_set; //0x1C4A0 - char pad_1C4A1[7]; //0x1C4A1 - class rage::rlGamerHandle m_transition_creator_handle; //0x1C4A8 - char pad_1C4B8[12]; //0x1C4B8 - bool m_is_waiting_async; //0x1C4C4 - bool m_is_preferred_activity; //0x1C4C5 - char pad_1C4C6[2]; //0x1C4C6 - uint32_t m_in_progress_finish_time; //0x1C4C8 - char pad_1C4CC[4]; //0x1C4CC - bool m_local_player_info_dirty; //0x1C4D0 - char pad_1C4D1[495]; //0x1C4D1 - class rage::rlGamerHandle m_inviter_handle; //0x1C6C0 - class CNetComplaintMgr m_game_complaint_mgr; //0x1C6D0 - class CNetComplaintMgr m_transition_complaint_mgr; //0x1D368 - char pad_1E000[32]; //0x1E000 - class JoiningPlayerNameMap m_unused_joining_player_name_map; //0x1E020 - char pad_1F948[8]; //0x1F948 - class CNetBlacklist m_blacklist; //0x1F950 - char pad_1FC08[8]; //0x1FC08 - class InvitedGamers m_game_invited_gamers; //0x1FC10 - char pad_20898[4864]; //0x20898 - class SessionInfoBackup m_last_joined_transition; //0x21B98 - uint32_t m_activity_max_players; //0x21C74 - uint32_t m_activity_max_spectators; //0x21C78 - char pad_21C7C[48]; //0x21C7C - bool m_do_not_launch_from_join_as_migrated_host; //0x21CAC - char pad_21CAD[7]; //0x21CAD - bool m_is_activity_session; //0x21CB4 - char pad_21CB5[35]; //0x21CB5 - class RemotePlayerData m_remote_player_data; //0x21CD8 - char pad_222E0[8]; //0x222E0 - class rage::netGamePlayerData m_local_net_game_player_data; //0x222E8 - char pad_22318[608]; //0x22318 - class rage::rlMatchmakingFindResult m_transition_matchmaking[4]; //0x22578 - class NetworkGameFilter m_transition_filters[4]; //0x33438 - char pad_34148[20]; //0x34148 - uint32_t m_transition_quickmatch_group_handle_count; //0x3415C - class rage::rlGamerHandle m_transition_quickmatch_group_handles[32]; //0x34160 - bool m_retain_activity_group; //0x34360 - char pad_34361[7]; //0x34361 - class rage::rlSessionInfo m_transition_to_activity_session_info; //0x34368 - char pad_34438[48]; //0x34438 - class MatchmakingSessionResult m_transition_matchmaking_session_results[10]; //0x34468 - char pad_37208[8]; //0x37208 - class InvitedGamers m_transition_invited_gamers; //0x37210 - char pad_37E98[16]; //0x37E98 - class rage::rlGamerHandle m_transition_to_game_handle; //0x37EA8 - class rage::rlSessionInfo m_transition_to_game_session_info; //0x37EB8 - char pad_37F88[4]; //0x37F88 - uint32_t m_transition_to_game_session_participant_count; //0x37F8C - class rage::rlGamerHandle m_transition_to_game_session_participants[32]; //0x37F90 - char pad_38190[72]; //0x38190 - class rage::rlGamerHandle m_follower_handles[32]; //0x381D8 - uint32_t m_follower_count; //0x383D8 - char pad_383DC[628]; //0x383DC + rage::rlSessionInfo m_steam_unk_session; //0x0000 + rage::Obf32 m_num_dinput8_instances; //0x0070 + rage::Obf32 m_last_time_dinput8_checked; //0x0080 + class rage::snSession m_game_session; //0x00F0 + class rage::snSession m_transition_session; //0x5578 + char pad_AA00[16]; //0xAA00 + class rage::snSession* m_game_session_ptr_2; //0xAA10 + class rage::snSession* m_transition_session_ptr_2; //0xAA18 + char pad_AA20[16]; //0xAA20 + class rage::snSession* m_game_session_ptr; //0xAA30 + class rage::snSession* m_transition_session_ptr; //0xAA38 + char pad_AA40[24]; //0xAA40 + class NetworkGameConfig m_network_game_config; //0xAA58 + class NetworkGameConfig m_network_transition_config; //0xABA0 + bool m_session_attributes_dirty; //0xACE8 + char pad_ACE9[19]; //0xACE9 + uint32_t m_session_visibility_flags; //0xACFC + uint32_t m_transition_visibility_flags; //0xAD00 + char pad_AD04[68]; //0xAD04 + class MetricSessionMigrated m_metric_session_migrated; //0xAD48 + bool m_migrated_metric_enabled; //0xB090 + char pad_B091[3]; //0xB091 + uint32_t m_game_session_state; //0xB094 + class NetworkGameFilter m_network_game_filter; //0xB098 + char pad_B3DC[33]; //0xB3DC + bool m_was_invited; //0xB3FD + char pad_B3FE[10]; //0xB3FE + class rage::rlSessionInfo m_unk_session_info; //0xB408 + char pad_B4D8[635]; //0xB4D8 + bool m_need_host_change; //0xB753 + char pad_B754[74316]; //0xB754 + class rage::rlSessionDetail m_joining_session_detail; //0x1D9A0 + class SessionInfoBackup m_last_joined_session; //0x1DE18 + char pad_1DEF4[40]; //0x1DEF4 + uint32_t m_current_matchmaking_group; //0x1DF1C + uint32_t m_matchmaking_group_max_players[5]; //0x1DF20 + uint32_t m_num_active_matchmaking_groups; //0x1DF34 + char pad_1DF38[8]; //0x1DF38 + uint8_t m_matchmaking_property_id; //0x1DF40 + uint8_t m_matchmaking_mental_state; //0x1DF41 + char pad_1DF42[366]; //0x1DF42 + class rage::rlMatchmakingFindResult m_game_session_matchmaking[3]; //0x1E0B0 + char pad_2ABC0[40]; //0x2ABC0 + class MatchmakingSessionResult m_game_matchmaking_session_results[10]; //0x2ABE8 + char pad_2D988[308]; //0x2D988 + uint32_t m_num_bosses; //0x2DABC + bool m_num_bosses_set; //0x2DAC0 + char pad_2DAC1[7]; //0x2DAC1 + class rage::rlGamerHandle m_transition_creator_handle; //0x2DAC8 + char pad_2DAD8[12]; //0x2DAD8 + bool m_is_waiting_async; //0x2DAE4 + bool m_is_preferred_activity; //0x2DAE5 + char pad_2DAE6[2]; //0x2DAE6 + uint32_t m_in_progress_finish_time; //0x2DAE8 + char pad_2DAEC[4]; //0x2DAEC + bool m_local_player_info_dirty; //0x2DAF0 + char pad_2DAF1[495]; //0x2DAF1 + class rage::rlGamerHandle m_inviter_handle; //0x2DCE0 + class CNetComplaintMgr m_game_complaint_mgr; //0x2DCF0 + class CNetComplaintMgr m_transition_complaint_mgr; //0x2EB88 + char pad_2FA20[32]; //0x2FA20 + class JoiningPlayerNameMap m_unused_joining_player_name_map; //0x2FA40 + char pad_31048[8]; //0x31048 + class CNetBlacklist m_blacklist; //0x31050 + char pad_31308[8]; //0x31308 + class InvitedGamers m_game_invited_gamers; //0x31310 + char pad_31F98[5888]; //0x31F98 + class SessionInfoBackup m_last_joined_transition; //0x33698 + uint32_t m_activity_max_players; //0x33774 + uint32_t m_activity_max_spectators; //0x33778 + char pad_3377C[48]; //0x3377C + bool m_do_not_launch_from_join_as_migrated_host; //0x337AC + char pad_337AD[7]; //0x337AD + bool m_is_activity_session; //0x337B4 + char pad_337B5[35]; //0x337B5 + class RemotePlayerData m_remote_player_data; //0x337D8 + char pad_33DE0[8]; //0x33DE0 + class rage::netGamePlayerData m_local_net_game_player_data; //0x33DE8 + char pad_33E18[608]; //0x33E18 + class rage::rlMatchmakingFindResult m_transition_matchmaking[4]; //0x34078 + class NetworkGameFilter m_transition_filters[4]; //0x44F38 + char pad_45C48[20]; //0x45C48 + uint32_t m_transition_quickmatch_group_handle_count; //0x45C5C + class rage::rlGamerHandle m_transition_quickmatch_group_handles[32]; //0x45C60 + bool m_retain_activity_group; //0x45E60 + char pad_45E61[7]; //0x45E61 + class rage::rlSessionInfo m_transition_to_activity_session_info; //0x45E68 + char pad_45F38[48]; //0x45F38 + class MatchmakingSessionResult m_transition_matchmaking_session_results[10]; //0x45F68 + char pad_48D08[8]; //0x48D08 + class InvitedGamers m_transition_invited_gamers; //0x48D10 + char pad_49998[16]; //0x49998 + class rage::rlGamerHandle m_transition_to_game_handle; //0x499A8 + class rage::rlSessionInfo m_transition_to_game_session_info; //0x499B8 + char pad_49A88[4]; //0x49A88 + uint32_t m_transition_to_game_session_participant_count; //0x49A8C + class rage::rlGamerHandle m_transition_to_game_session_participants[32]; //0x49A90 + char pad_49C90[80]; //0x49C90 + class rage::rlGamerHandle m_follower_handles[32]; //0x49CE0 + uint32_t m_follower_count; //0x49EE0 + char pad_49EE4[628]; //0x49EE4 }; //Size: 0x38650 -static_assert(sizeof(Network) == 0x38650); +static_assert(sizeof(Network) == 0x4A158); #pragma pack(pop) \ No newline at end of file diff --git a/network/RemoteGamerInfoMsg.hpp b/network/RemoteGamerInfoMsg.hpp index 1ab0e43..b2b050c 100644 --- a/network/RemoteGamerInfoMsg.hpp +++ b/network/RemoteGamerInfoMsg.hpp @@ -31,5 +31,5 @@ public: uint32_t m_num_handles; //0x02C8 class rage::rlGamerHandle m_handles[32]; //0x02D0 }; //Size: 0x04D0 -static_assert(sizeof(RemoteGamerInfoMsg) == 0x530); +static_assert(sizeof(RemoteGamerInfoMsg) == 0x528); #pragma pack(pop) diff --git a/network/netPlayerMgrBase.hpp b/network/netPlayerMgrBase.hpp index ede960c..1222670 100644 --- a/network/netPlayerMgrBase.hpp +++ b/network/netPlayerMgrBase.hpp @@ -9,29 +9,29 @@ namespace rage { #pragma pack(push, 8) - class netPlayerMgrBase - { - public: - virtual ~netPlayerMgrBase() = default; - virtual void Initialize() = 0; - virtual void Shutdown() = 0; - virtual void unk_0x18() = 0; - virtual CNetGamePlayer* AddPlayer_raw(rage::rlGamerInfo* gamer_info, uint32_t a2, CNetGamePlayerDataMsg* player_data, CNonPhysicalPlayerData* non_physical_player_data) = 0; - virtual void RemovePlayer(CNetGamePlayer* net_game_player) = 0; - virtual void UpdatePlayerListsForPlayer(CNetGamePlayer* net_game_player) = 0; - virtual CNetGamePlayer* AddPlayer(rage::rlGamerInfo* gamer_info, uint32_t a3, CNetGamePlayerDataMsg* player_data, CNonPhysicalPlayerData* non_physical_player_data) = 0; + class netPlayerMgrBase + { + public: + virtual ~netPlayerMgrBase() = default; + virtual void Initialize() = 0; + virtual void Shutdown() = 0; + virtual void unk_0x18() = 0; + virtual CNetGamePlayer* AddPlayer_raw(rage::rlGamerInfo* gamer_info, uint32_t a2, CNetGamePlayerDataMsg* player_data, CNonPhysicalPlayerData* non_physical_player_data) = 0; + virtual void RemovePlayer(CNetGamePlayer* net_game_player) = 0; + virtual void UpdatePlayerListsForPlayer(CNetGamePlayer* net_game_player) = 0; + virtual CNetGamePlayer* AddPlayer(rage::rlGamerInfo* gamer_info, uint32_t a3, CNetGamePlayerDataMsg* player_data, CNonPhysicalPlayerData* non_physical_player_data) = 0; - char pad_0008[8]; //0x0008 - uint64_t *m_network_bandwidth_manager; //0x0010 - char pad_0018[208]; //0x0018 - CNetGamePlayer *m_local_net_player; //0x00E8 - char pad_00F0[144]; //0x00F0 - CNetGamePlayer *m_player_list[32]; //0x0180 - uint16_t m_player_limit; //0x0280 - char pad_0282[10]; //0x0282 - uint16_t m_player_count; //0x028C - char pad_0290[1618]; //0x0290 - }; //Size: 0x08E0 - static_assert(sizeof(netPlayerMgrBase) == 0x8E0); + char pad_0008[8]; //0x0008 + uint64_t* m_network_bandwidth_manager; //0x0010 + char pad_0018[216]; //0x0018 + CNetGamePlayer* m_local_net_player; //0x00E8 + char pad_00F0[144]; //0x00F0 + CNetGamePlayer* m_player_list[32]; //0x0180 + uint16_t m_player_limit; //0x0280 + char pad_0282[10]; //0x0282 + uint16_t m_player_count; //0x028C + char pad_0290[1618]; //0x0290 + }; //Size: 0x08E0 + static_assert(sizeof(netPlayerMgrBase) == 0x8E8); #pragma pack(pop) } diff --git a/network/snSession.hpp b/network/snSession.hpp index d13f906..2762151 100644 --- a/network/snSession.hpp +++ b/network/snSession.hpp @@ -6,188 +6,190 @@ #pragma pack(push, 1) namespace rage { - class netConnectionManager; - class sysMemAllocator; + class netConnectionManager; + class sysMemAllocator; - class snPlayer - { - public: - uint64_t m_msg_id; //0x0000 - class rage::rlGamerInfo m_player_data; //0x0008 - }; //Size: 0x00A0 - static_assert(sizeof(rage::snPlayer) == 0x100); + class snPlayer + { + public: + uint64_t m_msg_id; //0x0000 + class rage::rlGamerInfo m_player_data; //0x0008 + char pad_00F8[8]; //0x00F8 + }; //Size: 0x0100 + static_assert(sizeof(rage::snPlayer) == 0x100); - class snPeer - { - public: - class rage::rlGamerInfo m_peer_data; //0x0000 - char pad_0098[40]; //0x0098 - }; //Size: 0x00C0 - static_assert(sizeof(rage::snPeer) == 0x120); + class snPeer + { + public: + class rage::rlGamerInfo m_peer_data; //0x0000 + char pad_0098[40]; //0x0098 + }; //Size: 0x00C0 + static_assert(sizeof(rage::snPeer) == 0x118); - class rlRemoteGamer - { - public: - rage::rlGamerHandle m_handle; - char pad_0010[4]; //0x0010 - uint32_t m_timeout_time; //0x0014 - uint32_t m_time_unk; //0x0018 - char pad_001C[4]; //0x001C - }; //Size: 0x0020 - static_assert(sizeof(rage::rlRemoteGamer) == 0x20); + class rlRemoteGamer + { + public: + rage::rlGamerHandle m_handle; + char pad_0010[4]; //0x0010 + uint32_t m_timeout_time; //0x0014 + uint32_t m_time_unk; //0x0018 + char pad_001C[4]; //0x001C + }; //Size: 0x0020 + static_assert(sizeof(rage::rlRemoteGamer) == 0x20); - class rlSession - { - public: - char pad_0008[264]; //0x0008 - class rage::rlSessionInfo m_session_info; //0x0110 - char pad_01E0[288]; //0x01E0 - uint64_t m_session_id; //0x0300 - char pad_0308[1136]; //0x0308 + class rlSession + { + public: + char pad_0008[248]; //0x0008 + class rage::rlSessionInfo m_session_info; //0x0100 + char pad_01D0[296]; //0x01D0 + uint64_t m_session_id; //0x02F8 + char pad_0300[1136]; //0x0300 - virtual ~rlSession() = default; - }; //Size: 0x0778 - static_assert(sizeof(rage::rlSession) == 0x778); + virtual ~rlSession() = default; + }; //Size: 0x0770 + static_assert(sizeof(rage::rlSession) == 0x770); - class rlSessionDetail - { - public: - class rage::rlGamerInfoBase m_base_gamer_info; - char pad_0060[8]; //0x0060 - class rage::rlSessionInfo m_session_info; //0x0068 - char pad_00D8[14]; //0x00D8 - uint16_t m_session_type; //0x00E6 - char pad_00E8[324]; //0x00E8 - uint32_t m_player_count; //0x022C - uint32_t m_unk_player_count; //0x0230 - char pad_0234[2]; //0x0234 - int16_t m_unk_pos_x; //0x0236 - int16_t m_unk_pos_y; //0x0238 - int16_t m_unk_pos_z; //0x023A - uint8_t m_matchmaking_property_ids[32]; //0x023C - char pad_025C[2]; //0x025C - uint16_t m_rank; //0x025E - char pad_0260[1]; //0x0260 - uint8_t m_mental_state; //0x0261 - char pad_0262[21]; //0x0262 - uint8_t m_population_density; //0x0277 - char pad_0278[320]; //0x0278 - }; //Size: 0x03CA - static_assert(sizeof(rlSessionDetail) == 0x478); + class rlSessionDetail + { + public: + class rage::rlGamerInfoBase m_base_gamer_info; + char pad_0060[8]; //0x0060 + class rage::rlSessionInfo m_session_info; //0x0068 + char pad_00D8[14]; //0x00D8 + uint16_t m_session_type; //0x00E6 + char pad_00E8[324]; //0x00E8 + uint32_t m_player_count; //0x022C + uint32_t m_unk_player_count; //0x0230 + char pad_0234[2]; //0x0234 + int16_t m_unk_pos_x; //0x0236 + int16_t m_unk_pos_y; //0x0238 + int16_t m_unk_pos_z; //0x023A + uint8_t m_matchmaking_property_ids[32]; //0x023C + char pad_025C[2]; //0x025C + uint16_t m_rank; //0x025E + char pad_0260[1]; //0x0260 + uint8_t m_mental_state; //0x0261 + char pad_0262[21]; //0x0262 + uint8_t m_population_density; //0x0277 + char pad_0278[320]; //0x0278 + }; //Size: 0x03CA + static_assert(sizeof(rlSessionDetail) == 0x478); - class rlMatchmakingFindResult - { - public: - class rage::rlSessionDetail m_result_session_details[15]; //0x0000 - char pad_37C8[168]; //0x37C8 - }; //Size: 0x3870 - static_assert(sizeof(rage::rlMatchmakingFindResult) == 0x43B0); + class rlMatchmakingFindResult + { + public: + class rage::rlSessionDetail m_result_session_details[15]; //0x0000 + char pad_37C8[168]; //0x37C8 + }; //Size: 0x3870 + static_assert(sizeof(rage::rlMatchmakingFindResult) == 0x43B0); - class netGamePlayerData - { - public: - class rlGamerHandle m_handle; - bool m_is_activity_spectator; //0x0010 - char pad_0011[7]; //0x0011 - uint64_t m_crew_id; //0x0018 - uint16_t m_rank; //0x0020 - uint16_t m_debug_unk; //0x0022 - char pad_0024[4]; //0x0024 - uint32_t m_nat_type; //0x0028 - bool m_is_rockstar_dev; //0x002C - char pad_002D[3]; //0x002D - }; //Size: 0x0030 - static_assert(sizeof(rage::netGamePlayerData) == 0x30); + class netGamePlayerData + { + public: + class rlGamerHandle m_handle; + bool m_is_activity_spectator; //0x0010 + char pad_0011[7]; //0x0011 + uint64_t m_crew_id; //0x0018 + uint16_t m_rank; //0x0020 + uint16_t m_debug_unk; //0x0022 + char pad_0024[4]; //0x0024 + uint32_t m_nat_type; //0x0028 + bool m_is_rockstar_dev; //0x002C + char pad_002D[3]; //0x002D + }; //Size: 0x0030 + static_assert(sizeof(rage::netGamePlayerData) == 0x30); - class snSession - { - public: - rage::sysMemAllocator* m_memory_allocator; //0x0000 - char pad_0008[64]; //0x0008 - rage::netConnectionManager* m_net_connection_mgr; //0x0048 - char pad_0050[48]; //0x0050 - class rage::rlSession m_rline_session; //0x0080 - class rage::snPlayer m_local_player; //0x0938 - uint64_t m_host_token; //0x09D8 - char pad_09E0[144]; //0x09E0 - class rage::snPeer m_peer_storage[32]; //0x0A70 - char pad_2270[24]; //0x2270 - class rage::snPeer* m_peers[32]; //0x2288 - uint32_t m_peer_count; //0x2388 - char pad_238C[4]; //0x238C - class rage::snPlayer m_player_storage[32]; //0x2390 - char pad_3790[24]; //0x3790 - class rage::snPlayer* m_players[32]; //0x37A8 - uint32_t m_player_count; //0x38A8 - char pad_38AC[4]; //0x38AC - class rage::rlRemoteGamer m_remote_gamers[32]; //0x38B0 - uint32_t m_num_remote_gamers; //0x3CB0 - bool m_player_joining; //0x3CB4 - char pad_3CB5[107]; //0x3CB5 - uint32_t m_connection_identifier; //0x3D20 - char pad_3D24[8]; //0x3D24 - char m_token_key[64]; //0x3D2C - char m_id_key[64]; //0x3D6C - char m_info_key[64]; //0x3DAC - char m_host_key[64]; //0x3DEC - char m_join_key[64]; //0x3E2C - char pad_3E6C[4]; //0x3E6C + class snSession + { + public: + uint64_t m_memory_allocator; //0x0000 + char pad_0008[64]; //0x0008 + rage::netConnectionManager* m_net_connection_mgr; //0x0048 + char pad_0050[48]; //0x0050 + class rage::rlSession m_rline_session; //0x0080 + class rage::snPlayer m_local_player; //0x07F0 + uint64_t m_host_token; //0x08F0 + char pad_08F8[144]; //0x08F8 + class rage::snPeer m_peer_storage[32]; //0x0988 + char pad_2C88[24]; //0x2C88 + class rage::snPeer* m_peers[32]; //0x2CA0 + uint32_t m_peer_count; //0x2DA0 + char pad_2DA4[4]; //0x2DA4 + class rage::snPlayer m_player_storage[32]; //0x2DA8 + char pad_4DA8[24]; //0x4DA8 + class rage::snPlayer* m_players[32]; //0x4DC0 + int32_t m_player_count; //0x4EC0 + char pad_4EC4[4]; //0x4EC4 + class rage::rlRemoteGamer m_remote_gamers[32]; //0x4EC8 + uint32_t m_num_remote_gamers; //0x52C8 + bool m_player_joining; //0x52CC + char pad_52CD[107]; //0x52CD + uint32_t m_connection_identifier; //0x5338 + char pad_533C[4]; //0x533C + uint32_t m_profile_index; //0x5340 + char m_token_key[64]; //0x5344 + char m_id_key[64]; //0x5384 + char m_info_key[64]; //0x53C4 + char m_host_key[64]; //0x5404 + char m_join_key[64]; //0x5444 + char pad_5484[4]; //0x5484 - inline bool is_host() - { - return m_local_player.m_player_data.m_host_token == m_host_token; - } + inline bool is_host() + { + return m_local_player.m_player_data.m_host_token == m_host_token; + } - inline snPlayer* get_player_by_token(uint64_t token) - { - for (std::uint32_t i = 0; i < m_player_count; i++) - { - if (m_players[i]->m_player_data.m_host_token == token) - { - return m_players[i]; - } - } + inline snPlayer* get_player_by_token(uint64_t token) + { + for (std::uint32_t i = 0; i < m_player_count; i++) + { + if (m_players[i]->m_player_data.m_host_token == token) + { + return m_players[i]; + } + } - return nullptr; - } + return nullptr; + } - inline snPeer* get_peer_by_rockstar_id(uint64_t rid) - { - for (uint32_t i = 0; i < m_peer_count; i++) - { - if (m_peers[i]->m_peer_data.m_gamer_handle_2.m_rockstar_id == rid) - { - return m_peers[i]; - } - } + inline snPeer* get_peer_by_rockstar_id(uint64_t rid) + { + for (uint32_t i = 0; i < m_peer_count; i++) + { + if (m_peers[i]->m_peer_data.m_gamer_handle_2.m_rockstar_id == rid) + { + return m_peers[i]; + } + } - return nullptr; - } + return nullptr; + } - }; //Size: 0x3E70 - static_assert(sizeof(rage::snSession) == 0x5590); + }; //Size: 0x3E70 + static_assert(sizeof(rage::snSession) == 0x5488); - class snMsgRemoveGamersFromSessionCmd - { - public: - uint64_t m_session_id; //0x0000 - uint64_t m_peer_ids[32]; //0x0008 - int32_t m_unk = -1; //0x0108 - uint32_t m_num_peers; //0x010C - }; //Size: 0x0110 - static_assert(sizeof(rage::snMsgRemoveGamersFromSessionCmd) == 0x110); + class snMsgRemoveGamersFromSessionCmd + { + public: + uint64_t m_session_id; //0x0000 + rage::rlGamerHandle m_handles[32]; //0x0008 + int32_t m_unk = -1; //0x208 + uint32_t m_num_peers; //0x20C + }; //Size: 0x0110 + static_assert(sizeof(rage::snMsgRemoveGamersFromSessionCmd) == 0x210); } class SessionSortEntry { public: - class rage::rlSessionDetail* m_session_detail; //0x0000 - char pad_0008[4]; //0x0008 - float m_score; //0x000C - char pad_0010[8]; //0x0010 + class rage::rlSessionDetail* m_session_detail; //0x0000 + char pad_0008[4]; //0x0008 + float m_score; //0x000C + char pad_0010[8]; //0x0010 }; //Size: 0x0018 static_assert(sizeof(SessionSortEntry) == 0x18); #pragma pack(pop) diff --git a/player/CPlayerInfo.hpp b/player/CPlayerInfo.hpp index 517957e..5b5a0bd 100644 --- a/player/CPlayerInfo.hpp +++ b/player/CPlayerInfo.hpp @@ -6,60 +6,56 @@ enum class eGameState : int32_t { - Invalid = -1, - Playing, - Died, - Arrested, - FailedMission, - LeftGame, - Respawn, - InMPCutscene + Invalid = -1, + Playing, + Died, + Arrested, + FailedMission, + LeftGame, + Respawn, + InMPCutscene }; #pragma pack(push, 4) class CPlayerInfo { public: - char pad_0000[32]; //0x0000 - class rage::rlGamerInfo m_net_player_data; //0x0020 - char pad_00B8[184]; //0x00B8 - float m_swim_speed; //0x0170 - char pad_0174[20]; //0x0174 - uint32_t m_water_proof; //0x0188 - char pad_018C[76]; //0x018C - eGameState m_game_state; //0x01D8 - char pad_01DC[12]; //0x01DC - class CPed *m_ped; //0x01E8 - char pad_01F0[40]; //0x01F0 - uint32_t m_frame_flags; //0x0218 - char pad_021C[52]; //0x021C - uint32_t m_player_controls; //0x0250 - char pad_0254[1256]; //0x0254 - float m_wanted_can_change; //0x073C - char pad_0740[144]; //0x0740 - float m_wanted_level_difficulty; //0x07D0 min:-1 max:1 - char pad_07D4[52]; //0x07D4 - float m_wanted_level_multiplier; //0x0808 min:0 max:1 - char pad_080C[100]; //0x080C - uint32_t m_npc_ignore; //0x0870 - char pad_0874[12]; //0x0874 - bool m_is_wanted; //0x0880 - char pad_0881[7]; //0x0881 - uint32_t m_wanted_level; //0x0888 - uint32_t m_wanted_level_display; //0x088C - char pad_0890[1120]; //0x0890 - float m_run_speed; //0x0CF0 - float m_stamina; //0x0CF4 - float m_stamina_regen; //0x0CF8 - char pad_0CFC[16]; //0x0CFC - float m_weapon_damage_mult; //0x0D0C - float m_weapon_defence_mult; //0x0D10 - char pad_0D14[4]; //0x0D14 - float m_melee_weapon_damage_mult; //0x0D18 - float m_melee_damage_mult; //0x0D1C - float m_melee_defence_mult; //0x0D20 - char pad_0D24[8]; //0x0D24 - float m_melee_weapon_defence_mult; //0x0D2C -}; //Size: 0x0D30 -static_assert(sizeof(CPlayerInfo) == 0xD90); + char pad_0000[32]; //0x0000 + class rage::rlGamerInfo m_net_player_data; //0x0020 + char pad_0110[184]; //0x0110 + float m_swim_speed; //0x01C8 + char pad_01CC[20]; //0x01CC + uint32_t m_water_proof; //0x01E0 + char pad_01E4[76]; //0x01E4 + eGameState m_game_state; //0x0230 + char pad_0234[12]; //0x0234 + class CPed* m_ped; //0x0240 + char pad_0248[40]; //0x0248 + uint32_t m_frame_flags; //0x0270 + char pad_0274[52]; //0x0274 + uint32_t m_player_controls; //0x02A8 + char pad_02AC[1248]; //0x02AC + float m_wanted_can_change; //0x078C + char pad_0790[304]; //0x0790 + uint32_t m_npc_ignore; //0x08C0 + char pad_08C4[12]; //0x08C4 + bool m_is_wanted; //0x08D0 + char pad_08D1[7]; //0x08D1 + uint32_t m_wanted_level; //0x08D8 + uint32_t m_wanted_level_display; //0x08DC + char pad_08E0[1120]; //0x08E0 + float m_run_speed; //0x0D40 + float m_stamina; //0x0D44 + float m_stamina_regen; //0x0D48 + char pad_0D4C[16]; //0x0D4C + float m_weapon_damage_mult; //0x0D5C + float m_weapon_defence_mult; //0x0D60 + char pad_0D64[4]; //0x0D64 + float m_melee_weapon_damage_mult; //0x0D68 + float m_melee_damage_mult; //0x0D6C + float m_melee_defence_mult; //0x0D70 + char pad_0D74[8]; //0x0D74 + float m_melee_weapon_defence_mult; //0x0D7C +}; //Size: 0x0D80 +static_assert(sizeof(CPlayerInfo) == 0xD80); #pragma pack(pop) diff --git a/rage/rlGamerInfo.hpp b/rage/rlGamerInfo.hpp index c2854c5..a061a49 100644 --- a/rage/rlGamerInfo.hpp +++ b/rage/rlGamerInfo.hpp @@ -6,15 +6,20 @@ namespace rage { #pragma pack(push,8) - class rlGamerInfo : public rlGamerInfoBase - { - public: - uint64_t m_host_token; - uint64_t m_peer_id_2; - rlGamerHandle m_gamer_handle_2; - uint32_t m_ros_privilege; - char m_name[17]; - }; //Size: 0x0098 - static_assert(sizeof(rlGamerInfo) == 0xF8); + class rlGamerInfo : public rlGamerInfoBase + { + public: + uint64_t m_host_token; + + union + { + rlGamerHandle m_gamer_handle_2; + uint32_t m_peer_id_2; // not found in all instances + }; + + uint32_t m_ros_privilege; + char m_name[17]; + }; //Size: 0x0098 + static_assert(sizeof(rlGamerInfo) == 0xF0); #pragma pack(pop) } diff --git a/script/globals/GPBD_FM.hpp b/script/globals/GPBD_FM.hpp index 49e316b..41279d5 100644 --- a/script/globals/GPBD_FM.hpp +++ b/script/globals/GPBD_FM.hpp @@ -5,640 +5,642 @@ enum class eMissionDataFlags { - kMissionLaunched = 0, - kJobDownloaded = 2, - kStartingJob = 3, - kRequestingScript = 4, - kLaunchedScript = 6, // should be set if kMissionLaunched is set - kAutoStartOnProximity = 7, // used by gang attack - kNJVSQuickMatch = 8, - kVoteLiked = 10, - kVoteDisliked = 11, - kNoVote = 25 + kMissionLaunched = 0, + kJobDownloaded = 2, + kStartingJob = 3, + kRequestingScript = 4, + kLaunchedScript = 6, // should be set if kMissionLaunched is set + kAutoStartOnProximity = 7, // used by gang attack + kNJVSQuickMatch = 8, + kVoteLiked = 10, + kVoteDisliked = 11, + kNoVote = 25 }; // TODO enum class eTutorialBitset { - kInTutorialRace = 0, - kTutorialRaceActive = 2, - kShowCredits = 4, - kNeedFreeVehicle = 6 + kInTutorialRace = 0, + kTutorialRaceActive = 2, + kShowCredits = 4, + kNeedFreeVehicle = 6 }; enum class eGangCallServices { - kMugger = 0, - kMercenary = 1 + kMugger = 0, + kMercenary = 1 }; enum class eVehicleSelectionState { - NONE, - SELECTING, - SELECTED + NONE, + SELECTING, + SELECTED }; enum class eStatState { - NONE, - LETHARGIC, - OUT_OF_SHAPE, - HEALTHY, - ATHLETE, - TRI_ATHLETE, - UNTRAINED, - SPRAY_AND_PRAY, - POLICE_TRAINING, - MILITARY_TRAINING, - DEAD_EYE, - FRAGILE, - WEAK, - AVERAGE, - TOUGH, - BODYBUILDER, - CLUMSY, - LOUD, - SNEAKY, - HUNTER, - NINJA, - DANGEROUS, - RC_PILOT, - COMMERCIAL_PILOT, - FIGHTER_PILOT, - ACE, - UNLICENSED, - SUNDAY_DRIVER, - COMMUTER, - STREET_RACER, - PRO_RACER, - NORMAL, - UNSTABLE, - DERANGED, - MANIAC, - PSYCHOPATH, - DRUNK + NONE, + LETHARGIC, + OUT_OF_SHAPE, + HEALTHY, + ATHLETE, + TRI_ATHLETE, + UNTRAINED, + SPRAY_AND_PRAY, + POLICE_TRAINING, + MILITARY_TRAINING, + DEAD_EYE, + FRAGILE, + WEAK, + AVERAGE, + TOUGH, + BODYBUILDER, + CLUMSY, + LOUD, + SNEAKY, + HUNTER, + NINJA, + DANGEROUS, + RC_PILOT, + COMMERCIAL_PILOT, + FIGHTER_PILOT, + ACE, + UNLICENSED, + SUNDAY_DRIVER, + COMMUTER, + STREET_RACER, + PRO_RACER, + NORMAL, + UNSTABLE, + DERANGED, + MANIAC, + PSYCHOPATH, + DRUNK }; enum class ePropertyInteriorFlags { - kOwnerOfInterior = 0, - kVisitorOfInterior = 1, // mutually exclusive with above flag - kConcealWhenDead = 12, - kRenovatingProperty = 19, - kPreviewingDecor = 20, - kRenovatingClubhouse = 21, - kUsingYachtRmBath1 = 22, - kUsingYachtRmBath3 = 23, - kUsingYachtRmWeeBathroom = 25, - kGunLockerOpen = 27, - kOfficeSafeOpen = 28, - kOfficeAssistantMale = 29 + kOwnerOfInterior = 0, + kVisitorOfInterior = 1, // mutually exclusive with above flag + kConcealWhenDead = 12, + kRenovatingProperty = 19, + kPreviewingDecor = 20, + kRenovatingClubhouse = 21, + kUsingYachtRmBath1 = 22, + kUsingYachtRmBath3 = 23, + kUsingYachtRmWeeBathroom = 25, + kGunLockerOpen = 27, + kOfficeSafeOpen = 28, + kOfficeAssistantMale = 29 }; enum class eInteriorStyleFlags { - kGunLockerShowPumpShotgun = 0, - kGunLockerShowMicroSMG = 1, - kGunLockerShowC4 = 2, // proximity or sticky - kGunLockerShowGrenade = 3, - kGunLockerShowCombatMG = 4, - kGunLockerShowMarksmanRifle = 5, - kPurchasedSnacks = 6, - kPurchasedInteriorRenovations = 7, - kForceOfficeAssistantSpawn = 8, - kAssistantAnimationOver = 9, - kChangeInteriorDecorOfficeHelpShown = 11, - kChangeInteriorDecorApartmentHelpShown = 12, - kOwnsOfficeBedroom = 13, - kOwnsClubhouseBikeShop = 16, - kOwnsOfficeGunLocker = 17, - KOwnsClubhouseWalls = 18, // ??? - kOwnsClubhouseFurnishings = 19, - kOwnsClubhouseDecors = 20 + kGunLockerShowPumpShotgun = 0, + kGunLockerShowMicroSMG = 1, + kGunLockerShowC4 = 2, // proximity or sticky + kGunLockerShowGrenade = 3, + kGunLockerShowCombatMG = 4, + kGunLockerShowMarksmanRifle = 5, + kPurchasedSnacks = 6, + kPurchasedInteriorRenovations = 7, + kForceOfficeAssistantSpawn = 8, + kAssistantAnimationOver = 9, + kChangeInteriorDecorOfficeHelpShown = 11, + kChangeInteriorDecorApartmentHelpShown = 12, + kOwnsOfficeBedroom = 13, + kOwnsClubhouseBikeShop = 16, + kOwnsOfficeGunLocker = 17, + KOwnsClubhouseWalls = 18, // ??? + kOwnsClubhouseFurnishings = 19, + kOwnsClubhouseDecors = 20 }; enum class eBusinessHubProductIndex { - CARGO, - WEAPONS, - COCAINE, - METH, - WEED, - FORGED_DOCUMENTS, - COUNTERFEIT_CASH + CARGO, + WEAPONS, + COCAINE, + METH, + WEED, + FORGED_DOCUMENTS, + COUNTERFEIT_CASH }; struct PLAYLIST_DATA { - PLAYER_INDEX Host; - SCR_INT Flags; - SCR_BOOL PAD_0002; - SCR_INT CurrentMission; - SCR_INT TotalMissions; - PLAYER_INDEX PAD_0006; + PLAYER_INDEX Host; + SCR_INT Flags; + SCR_BOOL PAD_0002; + SCR_INT CurrentMission; + SCR_INT TotalMissions; + PLAYER_INDEX PAD_0006; }; static_assert(sizeof(PLAYLIST_DATA) == 6 * 8); // local copy can be found at Global_2680247 struct JOB_SETTINGS { - SCR_ARRAY Settings; // indices vary based on job type. take a look at func_8988 in fmmc_launcher if you wish to change them - SCR_INT NumPlayers; // verify - SCR_INT PAD_0033; - SCR_INT SpawnSimpleInteriorIndex; - SCR_INT PAD_0035; // unused - SCR_BOOL MatchmakingOpen; - SCR_INT ContentHash; + SCR_ARRAY Settings; // indices vary based on job type. take a look at func_8988 in fmmc_launcher if you wish to change them + SCR_INT NumPlayers; // verify + SCR_INT PAD_0033; + SCR_INT SpawnSimpleInteriorIndex; + SCR_INT PAD_0035; // unused + SCR_BOOL MatchmakingOpen; + SCR_INT ContentHash; }; static_assert(sizeof(JOB_SETTINGS) == 38 * 8); struct VEHICLE_SELECTION { - SCR_BOOL Active; - SCR_BOOL Active2; - PLAYER_INDEX PAD_0002; // set to host by fmmc but not read at all - SCR_HASH VehicleModel; - SCR_INT CreatorIndex; - alignas(8) eVehicleSelectionState State; - SCR_INT PrimaryColor; - Color3 CustomPrimaryColor; - Color3 CustomSecondaryColor; - PLAYER_INDEX Partner; // for rally races? - GAMER_HANDLE PartnerHandle; - SCR_INT PreferredRole; // target assault races - SCR_INT PAD_0028; // TODO - SCR_INT ControlType; // 1 = kb&m 2 = controller - SCR_INT BettingFlags; - SCR_INT Team; - SCR_INT Flags; - SCR_INT JoinedMembers; // bitset of joined transition members set by the host - SCR_INT AdversaryOutfitIndex; - alignas(8) eStatState StatState; // see func_9142 in fmmc_launcher, shown to other players - SCR_INT CashWager; // shown to other players... - uint64_t PAD_0037[2]; // TODO - SCR_INT PAD_0039; // TODO random integer between 1 and 11 + SCR_BOOL Active; + SCR_BOOL Active2; + PLAYER_INDEX PAD_0002; // set to host by fmmc but not read at all + SCR_HASH VehicleModel; + SCR_INT CreatorIndex; + alignas(8) eVehicleSelectionState State; + SCR_INT PrimaryColor; + Color3 CustomPrimaryColor; + Color3 CustomSecondaryColor; + PLAYER_INDEX Partner; // for rally races? + GAMER_HANDLE PartnerHandle; + SCR_INT PreferredRole; // target assault races + SCR_INT PAD_0028; // TODO + SCR_INT ControlType; // 1 = kb&m 2 = controller + SCR_INT BettingFlags; + SCR_INT Team; + SCR_INT Flags; + SCR_INT JoinedMembers; // bitset of joined transition members set by the host + SCR_INT AdversaryOutfitIndex; + alignas(8) eStatState StatState; // see func_9142 in fmmc_launcher, shown to other players + SCR_INT CashWager; // shown to other players... + uint64_t PAD_0037[2]; // TODO + SCR_INT PAD_0039; // TODO random integer between 1 and 11 }; static_assert(sizeof(VEHICLE_SELECTION) == 40 * 8); struct STRIKE_TEAM { - PLAYER_INDEX Target; - TIMER Cooldown; - SCR_BOOL CancelStrikeTeam; // read but not written to - SCR_INT Level; + PLAYER_INDEX Target; + TIMER Cooldown; + SCR_BOOL CancelStrikeTeam; // read but not written to + SCR_INT Level; }; static_assert(sizeof(STRIKE_TEAM) == 5 * 8); struct PLAYER_STATS { - SCR_INT Team; - SCR_INT RP; - SCR_INT CrewRP; - SCR_INT WalletBalance; - SCR_INT HeistBonus; - SCR_INT GlobalRP; - SCR_INT Rank; - TEXT_LABEL_31 CrewTitle; - SCR_INT TotalRacesWon; - SCR_INT TotalRacesLost; - SCR_INT TimesFinishRaceAsTop3; - SCR_INT TimesFinishRaceLast; - SCR_INT TimesRaceBestLap; - SCR_INT TotalDeathmatchesWon; - SCR_INT TotalDeathmatchesLost; - SCR_INT TotalTeamDeathmatchesWon; - SCR_INT TotalTeamDeathmatchesLost; - SCR_INT Shots; - SCR_INT Hits; - SCR_FLOAT KdRatio; - SCR_FLOAT DropoutRate; - SCR_INT KillsOnPlayers; - SCR_INT DeathsByPlayers; - SCR_INT TotalFinishDeathmatchAsTop3; - SCR_INT TotalFinishDeathmatchLast; - SCR_INT DartsTotalWins; - SCR_INT DartsTotalMatches; - SCR_INT ArmwrestlingTotalWins; - SCR_INT ArmwrestlingTotalMatches; - SCR_INT TennisMatchesWon; - SCR_INT TennisMatchesLost; - SCR_INT BaseJumpWins; - SCR_INT BaseJumpLosses; - SCR_INT GolfWins; - SCR_INT GolfLosses; - SCR_INT ShootingRangeWins; - SCR_INT ShootingRangeLosses; - SCR_INT ShootingAbility; - SCR_INT MissionWins; - SCR_INT TotalMissionsPlayed; - SCR_INT SurvivalWins; - SCR_INT TotalSurvivalsPlayed; - SCR_INT PAD_0049; // TODO - SCR_INT MissionsCreated; - SCR_INT CommunicationRestrictions; - SCR_BOOL CanSpectate; - SCR_INT MostFavoriteStation; - SCR_INT ProstitutesFrequented; - SCR_INT LapDancesBought; - SCR_INT Money; - SCR_FLOAT WeaponAccuracy; - SCR_HASH FavoriteVehicle; - SCR_HASH FavoriteWeapon; + SCR_INT Team; + SCR_INT RP; + SCR_INT CrewRP; + SCR_INT WalletBalance; + SCR_INT HeistBonus; + SCR_INT GlobalRP; + SCR_INT Rank; + TEXT_LABEL_31 CrewTitle; + SCR_INT TotalRacesWon; + SCR_INT TotalRacesLost; + SCR_INT TimesFinishRaceAsTop3; + SCR_INT TimesFinishRaceLast; + SCR_INT TimesRaceBestLap; + SCR_INT TotalDeathmatchesWon; + SCR_INT TotalDeathmatchesLost; + SCR_INT TotalTeamDeathmatchesWon; + SCR_INT TotalTeamDeathmatchesLost; + SCR_INT Shots; + SCR_INT Hits; + SCR_FLOAT KdRatio; + SCR_FLOAT DropoutRate; + SCR_INT KillsOnPlayers; + SCR_INT DeathsByPlayers; + SCR_INT TotalFinishDeathmatchAsTop3; + SCR_INT TotalFinishDeathmatchLast; + SCR_INT DartsTotalWins; + SCR_INT DartsTotalMatches; + SCR_INT ArmwrestlingTotalWins; + SCR_INT ArmwrestlingTotalMatches; + SCR_INT TennisMatchesWon; + SCR_INT TennisMatchesLost; + SCR_INT BaseJumpWins; + SCR_INT BaseJumpLosses; + SCR_INT GolfWins; + SCR_INT GolfLosses; + SCR_INT ShootingRangeWins; + SCR_INT ShootingRangeLosses; + SCR_INT ShootingAbility; + SCR_INT MissionWins; + SCR_INT TotalMissionsPlayed; + SCR_INT SurvivalWins; + SCR_INT TotalSurvivalsPlayed; + SCR_INT PAD_0049; // TODO + SCR_INT MissionsCreated; + SCR_INT CommunicationRestrictions; + SCR_BOOL CanSpectate; + SCR_INT MostFavoriteStation; + SCR_INT ProstitutesFrequented; + SCR_INT LapDancesBought; + SCR_INT Money; + SCR_FLOAT WeaponAccuracy; + SCR_HASH FavoriteVehicle; + SCR_HASH FavoriteWeapon; }; static_assert(sizeof(PLAYER_STATS) == 60 * 8); struct EXEC_WAREHOUSE_INFO { - SCR_INT Index; - SCR_INT Stock; - SCR_INT PAD_0002; // unused + SCR_INT Index; + SCR_INT Stock; + SCR_INT PAD_0002; // unused }; static_assert(sizeof(EXEC_WAREHOUSE_INFO) == 3 * 8); struct IE_WAREHOUSE_DATA { - SCR_INT Index; - SCR_INT NumVehicles; - SCR_ARRAY Vehicles; - SCR_INT PAD_0043; // set to zero and not read - SCR_INT OwnedWarehouseVariation; + SCR_INT Index; + SCR_INT NumVehicles; + SCR_ARRAY Vehicles; + SCR_INT PAD_0043; // set to zero and not read + SCR_INT OwnedWarehouseVariation; }; static_assert(sizeof(IE_WAREHOUSE_DATA) == 45 * 8); struct FACTORY_INFO { - SCR_INT Index; - SCR_INT TotalProduct; - SCR_INT TotalSupplies; - SCR_INT TotalSupplies2; // TODO: what's the difference? - uint64_t PAD_0004; - SCR_INT EquipmentUpgrades; - SCR_BOOL Running; - SCR_BOOL SetupDone; - SCR_BOOL PAD_0008; - SCR_INT Research; // valid only for factory index 5 (bunker) - SCR_INT StaffState; - SCR_INT ProductValue; // untested - SCR_INT StaffAssignmentType; // valid only for factory index 5 (bunker) 0 = manufacturing, 1 = research, 2 = both + SCR_INT Index; + SCR_INT TotalProduct; + SCR_INT TotalSupplies; + SCR_INT TotalSupplies2; // TODO: what's the difference? + uint64_t PAD_0004; + SCR_INT EquipmentUpgrades; + SCR_BOOL Running; + SCR_BOOL SetupDone; + SCR_BOOL PAD_0008; + SCR_INT Research; // valid only for factory index 5 (bunker) + SCR_INT StaffState; + SCR_INT ProductValue; // untested + SCR_INT StaffAssignmentType; // valid only for factory index 5 (bunker) 0 = manufacturing, 1 = research, 2 = both }; static_assert(sizeof(FACTORY_INFO) == 13 * 8); struct HANGAR_DATA { - SCR_INT Index; - SCR_INT AppearanceBitset; - SCR_INT PAD_0002; // unused - SCR_INT TotalContraband; - SCR_INT PAD_0004; // unused, a function tries to set it to something but is never called with the right parameters. it isn't read either - SCR_BOOL SetupDone; + SCR_INT Index; + SCR_INT AppearanceBitset; + SCR_INT PAD_0002; // unused + SCR_INT TotalContraband; + SCR_INT PAD_0004; // unused, a function tries to set it to something but is never called with the right parameters. it isn't read either + SCR_BOOL SetupDone; }; static_assert(sizeof(HANGAR_DATA) == 6 * 8); // facility struct DEFUNCT_BASE_DATA { - SCR_INT Index; - SCR_INT AppearanceBitset; - SCR_INT AppearanceBitset2; - SCR_INT ObtainedAwards; - SCR_INT PAD_0004; // unused, a function tries to set it to something but is never called with the right parameters. it isn't read either - SCR_INT PAD_0005; - SCR_INT TotalContraband; // wat + SCR_INT Index; + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_INT ObtainedAwards; + SCR_INT PAD_0004; // unused, a function tries to set it to something but is never called with the right parameters. it isn't read either + SCR_INT PAD_0005; + SCR_INT TotalContraband; // wat }; static_assert(sizeof(DEFUNCT_BASE_DATA) == 7 * 8); // nightclub struct BUSINESS_HUB_DATA { - SCR_INT Index; - SCR_INT TotalContraband; // not read by the scripts - SCR_INT ProducingBusinesses; // bitset - SCR_INT ProducingFactories; // bitset - SCR_INT Upgrades; - SCR_INT PAD_0005; - SCR_INT PAD_0006; // not read by the scripts - SCR_INT SetupBitset; // includes owned DJs - SCR_ARRAY ProductStocks; // see eBusinessHubProductIndex - SCR_ARRAY PAD_0017; // have no clue what this is - SCR_ARRAY TotalSoldProduct; + SCR_INT Index; + SCR_INT TotalContraband; // not read by the scripts + SCR_INT ProducingBusinesses; // bitset + SCR_INT ProducingFactories; // bitset + SCR_INT Upgrades; + SCR_INT PAD_0005; + SCR_INT PAD_0006; // not read by the scripts + SCR_INT SetupBitset; // includes owned DJs + SCR_ARRAY ProductStocks; // see eBusinessHubProductIndex + SCR_ARRAY PAD_0017; // have no clue what this is + SCR_ARRAY TotalSoldProduct; }; static_assert(sizeof(BUSINESS_HUB_DATA) == 43 * 8); // also the nightclub? strange struct NIGHTCLUB_DATA { - SCR_INT Index; // same as BusinessHubData::Index - SCR_INT AppearanceBitset; - SCR_INT AppearanceBitset2; - SCR_INT AccessSettings; // TODO: figure out how this works - SCR_FLOAT Popularity; // 0.0 to 1.0 - SCR_INT SafeCashValue; - SCR_INT EntryCost; // can be set to any arbitrary value - SCR_INT CroudVariation; - SCR_INT DanceAwardProgress; // "Gold Dancer trophy unlocked." - SCR_INT DanceAward2Progress; // "Gold Battler trophy unlocked." - TIMER DJMusicChangeTimer; + SCR_INT Index; // same as BusinessHubData::Index + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_INT AccessSettings; // TODO: figure out how this works + SCR_FLOAT Popularity; // 0.0 to 1.0 + SCR_INT SafeCashValue; + SCR_INT EntryCost; // can be set to any arbitrary value + SCR_INT CroudVariation; + SCR_INT DanceAwardProgress; // "Gold Dancer trophy unlocked." + SCR_INT DanceAward2Progress; // "Gold Battler trophy unlocked." + TIMER DJMusicChangeTimer; }; static_assert(sizeof(NIGHTCLUB_DATA) == 12 * 8); struct ARENA_GARAGE_DATA { - SCR_INT Index; // always one for obvious reasons - SCR_INT OwnedGarageFloorLevel; - SCR_INT AppearanceBitset; - SCR_INT AppearanceBitset2; - SCR_INT InteriorTypeA; - SCR_INT InteriorTypeB; - SCR_INT SpectatingIndex; - SCR_INT SpectatingType; - SCR_INT PAD_0008; // unused + SCR_INT Index; // always one for obvious reasons + SCR_INT OwnedGarageFloorLevel; + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_INT InteriorTypeA; + SCR_INT InteriorTypeB; + SCR_INT SpectatingIndex; + SCR_INT SpectatingType; + SCR_INT PAD_0008; // unused }; static_assert(sizeof(ARENA_GARAGE_DATA) == 9 * 8); struct INSIDE_TRACK { - TEXT_LABEL_63 PlayerName; // real name leak when playing inside track - SCR_INT BetHorseID; - SCR_INT BetChips; + TEXT_LABEL_63 PlayerName; // real name leak when playing inside track + SCR_INT BetHorseID; + SCR_INT BetChips; }; static_assert(sizeof(INSIDE_TRACK) == 18 * 8); // casino penthouse struct CASINO_APARTMENT_DATA { - SCR_INT Index; // always one for obvious reasons - SCR_INT PAD_0001; // unused - SCR_INT AppearanceBitset; - SCR_INT AppearanceBitset2; - uint64_t PAD_0005[2]; - INSIDE_TRACK InsideTrack; + SCR_INT Index; // always one for obvious reasons + SCR_INT PAD_0001; // unused + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + uint64_t PAD_0005[2]; + INSIDE_TRACK InsideTrack; }; static_assert(sizeof(CASINO_APARTMENT_DATA) == 24 * 8); struct ARCADE_DATA { - SCR_INT Index; - SCR_INT AppearanceBitset; - SCR_INT AppearanceBitset2; - SCR_INT AppearanceBitset3; - SCR_INT SafeCashValue; - SCR_INT PAD_0005; // unused + SCR_INT Index; + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_INT AppearanceBitset3; + SCR_INT SafeCashValue; + SCR_INT PAD_0005; // unused }; static_assert(sizeof(ARCADE_DATA) == 6 * 8); struct ARCADE_MACHINES { - SCR_INT OrderedMachinesBitset; - SCR_INT ArrivedMachinesBitset; + SCR_INT OrderedMachinesBitset; + SCR_INT ArrivedMachinesBitset; }; static_assert(sizeof(ARCADE_MACHINES) == 2 * 8); struct SUBMARINE_DATA { - SCR_INT AppearanceBitset; - SCR_HASH Model; // not read by the scripts, always set to HASH("kosatka") - SCR_INT Color; // "PACKED_MP_INT_KOSATKA_COLOUR" - SCR_INT Flag; // "PACKED_MP_INT_KOSATKA_FLAG" - SCR_INT LastGuidedMissileUseTime; - SCR_INT PAD_0005; // unused + SCR_INT AppearanceBitset; + SCR_HASH Model; // not read by the scripts, always set to HASH("kosatka") + SCR_INT Color; // "PACKED_MP_INT_KOSATKA_COLOUR" + SCR_INT Flag; // "PACKED_MP_INT_KOSATKA_FLAG" + SCR_INT LastGuidedMissileUseTime; + SCR_INT PAD_0005; // unused }; static_assert(sizeof(SUBMARINE_DATA) == 6 * 8); struct AUTOSHOP_DATA { - SCR_INT Index; - SCR_INT AccessSetting; - SCR_INT AppearanceBitset; - SCR_INT AppearanceBitset2; - SCR_INT PAD_0004; - SCR_ARRAY ModdingVehicles; // VEHICLE_INDEX, not NETWORK_INDEX + SCR_INT Index; + SCR_INT AccessSetting; + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_INT PAD_0004; + SCR_ARRAY ModdingVehicles; // VEHICLE_INDEX, not NETWORK_INDEX }; static_assert(sizeof(AUTOSHOP_DATA) == 8 * 8); // LS car meet struct CAR_CLUB_DATA { - SCR_INT Flags; - SCR_INT Reputation; - SCR_INT ReputationLevel; - SCR_INT TestTrackAccess; // unused? + SCR_INT Flags; + SCR_INT Reputation; + SCR_INT ReputationLevel; + SCR_INT TestTrackAccess; // unused? }; static_assert(sizeof(CAR_CLUB_DATA) == 4 * 8); // agency struct FIXER_HQ_DATA { - SCR_INT Index; - SCR_INT AppearanceBitset; - SCR_INT SafeCashValue; + SCR_INT Index; + SCR_INT AppearanceBitset; + SCR_INT SafeCashValue; }; static_assert(sizeof(FIXER_HQ_DATA) == 3 * 8); // eclipse blvd garage (currently unreleased) struct MULTI_STOREY_GARAGE_DATA { - SCR_INT Index; // always one for obvious reasons - SCR_INT AppearanceBitset; - SCR_INT AppearanceBitset2; - SCR_ARRAY GarageTints; + SCR_INT Index; // always one for obvious reasons + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_ARRAY GarageTints; }; static_assert(sizeof(MULTI_STOREY_GARAGE_DATA) == 6 * 8); struct PROPERTY_DATA { - SCR_ARRAY PropertyIds; - 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 - SCR_INT Instance; - SCR_INT ExteriorIndex; - 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; // not sure why this is an array of 30 yet - SCR_INT ApartmentType; // normal vs stilt vs eclipse - SCR_INT OwnerInstance; // same as Instance in most cases - SCR_ARRAY ExecutiveWarehouseInfos; - SCR_INT OfficeSafeMoneyMultiplier; - SCR_BITSET StyleFlags; - SCR_INT PAD_0134; // unused - SCR_INT AssistantGreetingChoice; - SCR_INT AssistantDialogBitset; - SCR_INT AssistantDialogBitset2; - SCR_INT LifetimeCargoMissionsComplete; // used for trophy type - SCR_INT CasinoChipsMultiplier; - SCR_INT AssistantDialogBitset3; - SCR_INT AssistantDialogBitset4; - SCR_INT AssistantDialogBitset5; - SCR_INT AssistantDialogBitset6; // do we REALLY need 6 bitsets for assistant dialog? - IE_WAREHOUSE_DATA IEWarehouseData; - SCR_INT Garage1DataBitset; - SCR_INT Garage2DataBitset; - SCR_INT Garage3DataBitset; - SCR_INT ModshopDataBitset; - SCR_ARRAY FactoryInfos; - SCR_INT TotalBunkerResearch; - SCR_INT CurrentBunkerResearchProgress; - SCR_INT BunkerDecorVariation; - SCR_INT MOCBitset; - SCR_INT MOCColor; // bitset for some reason - uint64_t PAD_0290[2]; // unused - SCR_INT GunShopFlags; - HANGAR_DATA HangarData; - SCR_INT PAD_0299; - DEFUNCT_BASE_DATA DefunctBaseData; - SCR_INT AvengerInteriorDecorFlags; // "PACKED_MP_INT_ARMORY_AIRCRAFT_INTERIOR_v0" - uint64_t PAD_0308[2]; - BUSINESS_HUB_DATA BusinessHubData; - NIGHTCLUB_DATA NightclubData; - SCR_INT PAD_0365; - SCR_INT TerrorbyteDesign; - SCR_INT PAD_0367; - SCR_INT AcidLabRadio; - SCR_INT TerrorbyteRadio; - SCR_INT NanoDroneCooldown; - PLAYER_INDEX HostOfInteriorScript; - ARENA_GARAGE_DATA ArenaGarageData; - SCR_INT ArcadeJukeboxStation; // for simple interior type 17 - SCR_INT JukeboxFavoritePlaylist; - SCR_INT ClubhouseBarCashAmount; - SCR_INT DefaultJukeboxStation; - SCR_INT FreakshopJukeboxStation; - SCR_INT PAD_0386; // TODO - SCR_HASH MOCModel; // used by the bunker script to detect exits with MOC - SCR_INT PAD_0388; // unused - SCR_HASH TerrorbyteModel; - SCR_ARRAY PAD_0390; // some property interior stuff - uint64_t PAD_0398[4]; - SCR_INT OfficeGarageModdingVehicleSlot; - SCR_INT CurrentOfficeGarageFloor; - CASINO_APARTMENT_DATA CasinoApartmentData; - ARCADE_DATA ArcadeData; - ARCADE_MACHINES ArcadeMachines; - SCR_ARRAY ArcadeMachineSlots; - SCR_INT PAD_0478; // TODO - SUBMARINE_DATA SubmarineData; - AUTOSHOP_DATA AutoShopData; - SCR_ARRAY AutoShopArcadeMachineSlots; - CAR_CLUB_DATA CarClubData; - FIXER_HQ_DATA FixerHQData; - SCR_INT PAD_0503; // not read by the scripts - VEHICLE_INDEX CurrentlyModdingVehicleFixerHQ; - MULTI_STOREY_GARAGE_DATA MultiStoreyGarageData; - SCR_INT FreakshopBits; // 0: has weapon workshop, 1: radio enabled + SCR_ARRAY PropertyIds; + 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 + SCR_INT Instance; + SCR_INT ExteriorIndex; + 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; // not sure why this is an array of 30 yet + SCR_INT ApartmentType; // normal vs stilt vs eclipse + SCR_INT OwnerInstance; // same as Instance in most cases + SCR_ARRAY ExecutiveWarehouseInfos; + SCR_INT OfficeSafeMoneyMultiplier; + SCR_BITSET StyleFlags; + SCR_INT PAD_0134; // unused + SCR_INT AssistantGreetingChoice; + SCR_INT AssistantDialogBitset; + SCR_INT AssistantDialogBitset2; + SCR_INT LifetimeCargoMissionsComplete; // used for trophy type + SCR_INT CasinoChipsMultiplier; + SCR_INT AssistantDialogBitset3; + SCR_INT AssistantDialogBitset4; + SCR_INT AssistantDialogBitset5; + SCR_INT AssistantDialogBitset6; // do we REALLY need 6 bitsets for assistant dialog? + IE_WAREHOUSE_DATA IEWarehouseData; + SCR_INT Garage1DataBitset; + SCR_INT Garage2DataBitset; + SCR_INT Garage3DataBitset; + SCR_INT ModshopDataBitset; + SCR_ARRAY FactoryInfos; + SCR_INT TotalBunkerResearch; + SCR_INT CurrentBunkerResearchProgress; + SCR_INT BunkerDecorVariation; + SCR_INT MOCBitset; + SCR_INT MOCColor; // bitset for some reason + uint64_t PAD_0290[2]; // unused + SCR_INT GunShopFlags; + HANGAR_DATA HangarData; + SCR_INT PAD_0299; + DEFUNCT_BASE_DATA DefunctBaseData; + SCR_INT AvengerInteriorDecorFlags; // "PACKED_MP_INT_ARMORY_AIRCRAFT_INTERIOR_v0" + uint64_t PAD_0308[3]; + BUSINESS_HUB_DATA BusinessHubData; + NIGHTCLUB_DATA NightclubData; + SCR_INT PAD_0365; + SCR_INT TerrorbyteDesign; + SCR_INT PAD_0367; + SCR_INT AcidLabRadio; + SCR_INT TerrorbyteRadio; + SCR_INT NanoDroneCooldown; + PLAYER_INDEX HostOfInteriorScript; + ARENA_GARAGE_DATA ArenaGarageData; + SCR_INT ArcadeJukeboxStation; // for simple interior type 17 + SCR_INT JukeboxFavoritePlaylist; + SCR_INT ClubhouseBarCashAmount; + SCR_INT DefaultJukeboxStation; + SCR_INT FreakshopJukeboxStation; + SCR_INT PAD_0386; // TODO + SCR_HASH MOCModel; // used by the bunker script to detect exits with MOC + SCR_INT PAD_0388; // unused + SCR_HASH TerrorbyteModel; + SCR_ARRAY PAD_0390; // some property interior stuff + uint64_t PAD_0398[4]; + SCR_INT OfficeGarageModdingVehicleSlot; + SCR_INT CurrentOfficeGarageFloor; + CASINO_APARTMENT_DATA CasinoApartmentData; // @405 as of 1.67 + ARCADE_DATA ArcadeData; + ARCADE_MACHINES ArcadeMachines; + SCR_ARRAY ArcadeMachineSlots; + SCR_INT PAD_0478; // TODO + SUBMARINE_DATA SubmarineData; + AUTOSHOP_DATA AutoShopData; + SCR_ARRAY AutoShopArcadeMachineSlots; + CAR_CLUB_DATA CarClubData; + FIXER_HQ_DATA FixerHQData; + SCR_INT PAD_0503; // not read by the scripts + SCR_INT PAD_0504; + VEHICLE_INDEX CurrentlyModdingVehicleFixerHQ; + MULTI_STOREY_GARAGE_DATA MultiStoreyGarageData; // @507 as of 1.67 + SCR_INT FreakshopBits; // 0: has weapon workshop, 1: radio enabled }; -static_assert(sizeof(PROPERTY_DATA) == 512 * 8); +static_assert(sizeof(PROPERTY_DATA) == 514 * 8); struct BIKER_CONTRACTS { - SCR_ARRAY ActiveContractMissions; - SCR_INT SelectedContractMission; - SCR_BOOL Enabled; + SCR_ARRAY ActiveContractMissions; + SCR_INT SelectedContractMission; + SCR_BOOL Enabled; }; static_assert(sizeof(BIKER_CONTRACTS) == 7 * 8); struct NIGHTCLUB_SALE { - SCR_INT BuyerIndex; - SCR_INT NumSoldItems; - SCR_INT SaleAmount; - uint64_t PAD_0003[2]; + SCR_INT BuyerIndex; + SCR_INT NumSoldItems; + SCR_INT SaleAmount; + uint64_t PAD_0003[2]; }; static_assert(sizeof(NIGHTCLUB_SALE) == 5 * 8); struct ARENA_WAR_DATA { - SCR_INT PointsTier; - SCR_INT SkillLevel; - SCR_INT TrinketBitset; // MP_STAT_ARN_BS_TRINKET_SAVED + SCR_INT PointsTier; + SCR_INT SkillLevel; + SCR_INT TrinketBitset; // MP_STAT_ARN_BS_TRINKET_SAVED }; static_assert(sizeof(ARENA_WAR_DATA) == 3 * 8); struct GPBD_FM_Entry { - SCR_INT CurrentActivity; - SCR_INT MissionScriptInstance; - SCR_INT PAD_0002; // TODO - SCR_INT NumFreeSpectatorSlots; - SCR_INT NumPlayersInTransition; // not really - SCR_INT NJVSVoteState; // voting screen shown after a mission ends - SCR_INT NJVSVoteContentBitset; - SCR_BOOL NJVSChoiceMade; - SCR_INT NJVSLeaveState; // network error or quit - SCR_INT JobPoints; // can be spoofed to change the "JP" value in the player list - PLAYER_INDEX NextHost; // transfer transition host when joining next job - PLAYLIST_DATA PlaylistData; - TEXT_LABEL_63 JobName; - SCR_ARRAY ActiveGunRange; // this should have really been an enum lol - MP_SCRIPT_DATA MissionScriptData; - JOB_SETTINGS JobSettings; - SCR_INT FMMCLauncherState; - VEHICLE_SELECTION VehicleSelection; - SCR_INT JobStartCloudTime; // this is a struct but too lazy to create one - SCR_INT ContentHash; - SCR_BOOL PAD_0138; // unused - SCR_BITSET TutorialBitset; - SCR_BITSET GangCallRequestedServices; - PLAYER_INDEX GangCallTarget; // can be used to send muggers/hit squad - SCR_BITSET GangCallSentServices; - SCR_INT TutorialBitset2; - TEXT_LABEL_23 PlayingContentUsedId; - TEXT_LABEL_23 MatchId; - uint64_t PAD_0156[8]; // unused - TEXT_LABEL_63 DisplayJobName; // as shown in the playerlist? - STRIKE_TEAM StrikeTeam; - uint64_t PAD_0185[7]; // pad - SCR_INT FMMCState; - SCR_INT PAD_0193; // TODO - SCR_INT KillStreak; - SCR_INT NumSuicides; // deducts RP reward in missions - SCR_INT DeathmatchBounty; // "You have been deducted $~1~ for being idle for too long, and you now have a bounty placed on you." - SCR_BOOL CollectedBounty; - SCR_INT AliveDeathmatchPlayers; - SCR_INT WantedLevelFlags; - SCR_ARRAY PAD_0201; - SCR_INT HairdoShopIndex; - SCR_INT PAD_0204; - PLAYER_STATS PlayerStats; - SCR_INT PAD_265; - SCR_INT Mood; - PROPERTY_DATA PropertyData; - uint64_t PAD_0779[4]; // TODO - uint64_t PAD_0783[12]; // no clue what it does but it looks rather interesting - SCR_INT AssistedKillFlags; - NETWORK_INDEX UnkNetworkId; - SCR_BOOL SpawningUnkVehicle; - SCR_BOOL MeltdownComplete; // yes, the singleplayer mission "Meltdown" (michael4) - SCR_INT UNK_0799; - SCR_INT GangAttackTarget; // triggers unique dialog from some phone NPCs - SCR_INT ActivePVSlot; - PLAYER_INDEX SpectatingPlayer; - SCR_INT PAD_0803; - SCR_ARRAY ActiveAmbientWeaponPickups; - SCR_ARRAY OfficeMapMarkers; - SCR_INT OfficeLargestMoneyThresholdIndex; - SCR_ARRAY EnabledOfficeCashPiles; - SCR_ARRAY EnabledClubhouseCashPiles; - BIKER_CONTRACTS BikerContracts; - SCR_INT CasinoWonBitset; // can be used to tamper with the casino PA system - uint64_t PAD_0829[2]; - SCR_BOOL CameraPositionOverriden; - SCR_VEC3 OverrideCameraPosition; - SCR_INT PAD_0835; - SCR_INT HeliRappelFlags; - SCR_INT PAD_0837; // some more aircraft flags - SCR_BOOL RespawningToPreviousCheckpoint; - NIGHTCLUB_SALE NightclubSale; - uint64_t PAD_844[11]; // unused, all of them - SCR_INT SeatingIndex; - ARENA_WAR_DATA ArenaWarData; - uint64_t PAD_0859[2]; - SCR_INT ApartmentEnterFlags; + SCR_INT CurrentActivity; + SCR_INT MissionScriptInstance; + SCR_INT PAD_0002; // TODO + SCR_INT NumFreeSpectatorSlots; + SCR_INT NumPlayersInTransition; // not really + SCR_INT NJVSVoteState; // voting screen shown after a mission ends + SCR_INT NJVSVoteContentBitset; + SCR_BOOL NJVSChoiceMade; + SCR_INT NJVSLeaveState; // network error or quit + SCR_INT JobPoints; // can be spoofed to change the "JP" value in the player list + PLAYER_INDEX NextHost; // transfer transition host when joining next job + PLAYLIST_DATA PlaylistData; + TEXT_LABEL_63 JobName; + SCR_ARRAY ActiveGunRange; // this should have really been an enum lol + MP_SCRIPT_DATA MissionScriptData; + JOB_SETTINGS JobSettings; + SCR_INT FMMCLauncherState; + VEHICLE_SELECTION VehicleSelection; + SCR_INT JobStartCloudTime; // this is a struct but too lazy to create one + SCR_INT ContentHash; + SCR_BOOL PAD_0138; // unused + SCR_BITSET TutorialBitset; + SCR_BITSET GangCallRequestedServices; + PLAYER_INDEX GangCallTarget; // can be used to send muggers/hit squad + SCR_BITSET GangCallSentServices; + SCR_INT TutorialBitset2; + TEXT_LABEL_23 PlayingContentUsedId; + TEXT_LABEL_23 MatchId; + uint64_t PAD_0156[8]; // unused + TEXT_LABEL_63 DisplayJobName; // as shown in the playerlist? + STRIKE_TEAM StrikeTeam; + uint64_t PAD_0185[7]; // pad + SCR_INT FMMCState; + SCR_INT PAD_0193; // TODO + SCR_INT KillStreak; + SCR_INT NumSuicides; // deducts RP reward in missions + SCR_INT DeathmatchBounty; // "You have been deducted $~1~ for being idle for too long, and you now have a bounty placed on you." + SCR_BOOL CollectedBounty; + SCR_INT AliveDeathmatchPlayers; + SCR_INT WantedLevelFlags; + SCR_ARRAY PAD_0201; + SCR_INT HairdoShopIndex; + SCR_INT PAD_0204; + PLAYER_STATS PlayerStats; + SCR_INT PAD_265; + SCR_INT Mood; + PROPERTY_DATA PropertyData; + uint64_t PAD_0779[4]; // TODO + uint64_t PAD_0783[12]; // no clue what it does but it looks rather interesting + SCR_INT AssistedKillFlags; + NETWORK_INDEX UnkNetworkId; + SCR_BOOL SpawningUnkVehicle; + SCR_BOOL MeltdownComplete; // yes, the singleplayer mission "Meltdown" (michael4) + SCR_INT UNK_0799; + SCR_INT GangAttackTarget; // triggers unique dialog from some phone NPCs + SCR_INT ActivePVSlot; + PLAYER_INDEX SpectatingPlayer; + SCR_INT PAD_0803; + SCR_ARRAY ActiveAmbientWeaponPickups; + SCR_ARRAY OfficeMapMarkers; + SCR_INT OfficeLargestMoneyThresholdIndex; + SCR_ARRAY EnabledOfficeCashPiles; + SCR_ARRAY EnabledClubhouseCashPiles; + BIKER_CONTRACTS BikerContracts; + SCR_INT CasinoWonBitset; // can be used to tamper with the casino PA system + uint64_t PAD_0829[2]; + SCR_BOOL CameraPositionOverriden; + SCR_VEC3 OverrideCameraPosition; + SCR_INT PAD_0835; + SCR_INT HeliRappelFlags; + SCR_INT PAD_0837; // some more aircraft flags + SCR_BOOL RespawningToPreviousCheckpoint; + NIGHTCLUB_SALE NightclubSale; + uint64_t PAD_844[11]; // unused, all of them + 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) == 862 * 8); +static_assert(sizeof(GPBD_FM_Entry) == 867 * 8); struct GPBD_FM { - SCR_ARRAY Entries; + SCR_ARRAY Entries; }; -static_assert(sizeof(GPBD_FM) == 27585 * 8); +static_assert(sizeof(GPBD_FM) == 27745 * 8); diff --git a/script/globals/GPBD_FM_3.hpp b/script/globals/GPBD_FM_3.hpp index e207326..b9b9311 100644 --- a/script/globals/GPBD_FM_3.hpp +++ b/script/globals/GPBD_FM_3.hpp @@ -6,352 +6,352 @@ enum class eActivityType { - HeistPrep = 233, - Gunrunning = 180, - Sightseer = 142, - HeadHunter = 166, - BuySpecialCargo = 167, - SellSpecialCargo = 168, - DefendSpecialCargo = 169, - StealVehicle = 178, - ExportVehicle = 188, - Gunrunning2 = 225, - GunrunningSell = 226, - GunrunningDefend = 227, - BikerSell = 190, - BikerDefend = 191, - BusinessResupply = 192, - Survival = 3, - Darts = 14, - ArmWresling = 15, - GangAttack = 6, - PilotSchool = 122, - Golf = 11, - ShootingRange = 13, - Tennis = 12, - BaseJump = 8, - Deathmatch = 1, - ImpromptuDeathmatch = 5, - Mission = 0, - Race = 2, - ExecutiveDeathmatch = 148, - MarkedForDeath = 151, - PiracyPrevention = 152, - MostWanted = 153, - AssetRecovery = 157, - HostileTakeover = 159, - Point2Point = 162, - AmphibiousAssault = 216, - Velocity = 219, - GunsForHire = 185, - ByThePound = 182, - RippingItUp = 194, - RaceToPoint = 189, - HitAndRide = 193, - CriminalMischief = 205, - WeaponOfChoice = 186, - FragileGoods = 207, - Torched = 208, - Outrider = 209, - WheelieRider = 210, - POW = 183, - ExecutiveSearch = 199, - StandYourGround = 201, - AutoBuyout = 163, - DueDiligence = 160, - MarketManipulation = 154, - CourierService = 155, - Skydive = 267 + HeistPrep = 233, + Gunrunning = 180, + Sightseer = 142, + HeadHunter = 166, + BuySpecialCargo = 167, + SellSpecialCargo = 168, + DefendSpecialCargo = 169, + StealVehicle = 178, + ExportVehicle = 188, + Gunrunning2 = 225, + GunrunningSell = 226, + GunrunningDefend = 227, + BikerSell = 190, + BikerDefend = 191, + BusinessResupply = 192, + Survival = 3, + Darts = 14, + ArmWresling = 15, + GangAttack = 6, + PilotSchool = 122, + Golf = 11, + ShootingRange = 13, + Tennis = 12, + BaseJump = 8, + Deathmatch = 1, + ImpromptuDeathmatch = 5, + Mission = 0, + Race = 2, + ExecutiveDeathmatch = 148, + MarkedForDeath = 151, + PiracyPrevention = 152, + MostWanted = 153, + AssetRecovery = 157, + HostileTakeover = 159, + Point2Point = 162, + AmphibiousAssault = 216, + Velocity = 219, + GunsForHire = 185, + ByThePound = 182, + RippingItUp = 194, + RaceToPoint = 189, + HitAndRide = 193, + CriminalMischief = 205, + WeaponOfChoice = 186, + FragileGoods = 207, + Torched = 208, + Outrider = 209, + WheelieRider = 210, + POW = 183, + ExecutiveSearch = 199, + StandYourGround = 201, + AutoBuyout = 163, + DueDiligence = 160, + MarketManipulation = 154, + CourierService = 155, + Skydive = 267 }; enum class eBossGoonFlags { - kOneOnOneDM = 4, - kJoinSuccess = 7, - kJoinFail = 8, - kSpectating = 24 + kOneOnOneDM = 4, + kJoinSuccess = 7, + kJoinFail = 8, + kSpectating = 24 }; enum class eGoonInviteType { - DEBUG, - NEARBY, - FRIENDS, - CREW, - INDIVIDUAL, - LOOKING_FOR_WORK + DEBUG, + NEARBY, + FRIENDS, + CREW, + INDIVIDUAL, + LOOKING_FOR_WORK }; enum class eBossVehicleState { - NONE, - SPAWNED, - DESTROYED = 3 + NONE, + SPAWNED, + DESTROYED = 3 }; enum class eMCRole { - PROSPECT = -1, - VICE_PRESIDENT, - ROAD_CAPTAIN, - SERGEANT_IN_ARMS, - ENFORCER + PROSPECT = -1, + VICE_PRESIDENT, + ROAD_CAPTAIN, + SERGEANT_IN_ARMS, + ENFORCER }; enum class eClubhouseActivity { - NONE = -1, - DARTS, - ARM_WRESTLING + NONE = -1, + DARTS, + ARM_WRESTLING }; struct MC_STYLE { - SCR_BOOL Enabled; - SCR_INT BossOutfitType; - SCR_INT GoonOutfitType; - SCR_ARRAY GoonOutfitIndices; // one outfit for each goon, size is 7 instead of 8 for some reason - SCR_ARRAY GoonOutfitIndicesOverride; - SCR_INT PAD_0019; - SCR_BOOL HeadgearEnabled; - SCR_BOOL EmblemEnabled; + SCR_BOOL Enabled; + SCR_INT BossOutfitType; + SCR_INT GoonOutfitType; + SCR_ARRAY GoonOutfitIndices; // one outfit for each goon, size is 7 instead of 8 for some reason + SCR_ARRAY GoonOutfitIndicesOverride; + SCR_INT PAD_0019; + SCR_BOOL HeadgearEnabled; + SCR_BOOL EmblemEnabled; }; static_assert(sizeof(MC_STYLE) == 22 * 8); struct VEHICLE_EXPORT { - SCR_ARRAY SellingVehicleIndices; - SCR_INT PAD_0005; // this is set to zero in all export scripts and never read + SCR_ARRAY SellingVehicleIndices; + SCR_INT PAD_0005; // this is set to zero in all export scripts and never read }; static_assert(sizeof(VEHICLE_EXPORT) == 6 * 8); struct HANGAR_CARGO { - SCR_INT PAD_0000; // unused? - SCR_ARRAY DeliverableTypes; - SCR_INT CargoType; + SCR_INT PAD_0000; // unused? + SCR_ARRAY DeliverableTypes; + SCR_INT CargoType; }; static_assert(sizeof(HANGAR_CARGO) == 23 * 8); struct CASINO_HEIST_PREP { - SCR_INT PrepIndex; - SCR_INT SupportCrewMemberIndex; // only set on preps 1 through 3 - SCR_INT LoadoutIndex; // only set on prep 1 and 2 + SCR_INT PrepIndex; + SCR_INT SupportCrewMemberIndex; // only set on preps 1 through 3 + SCR_INT LoadoutIndex; // only set on prep 1 and 2 }; static_assert(sizeof(CASINO_HEIST_PREP) == 3 * 8); struct LEAVE_IN_HELI { - SCR_INT Flags; - PLAYER_INDEX Owner; - SCR_INT SeatIndex; + SCR_INT Flags; + PLAYER_INDEX Owner; + SCR_INT SeatIndex; }; static_assert(sizeof(LEAVE_IN_HELI) == 3 * 8); struct BOSS_GOON { - PLAYER_INDEX Boss; // leader of CEO/MC - SCR_INT TimeBecameBoss; - SCR_INT TimeBecameGoon; - SCR_INT LastPayTime; - SCR_BITSET Flags; - SCR_INT Flags2; // TODO - SCR_INT Flags3; // TODO - SCR_INT TotalBossGoonTime; - SCR_ARRAY BossGoonUUID; - SCR_ARRAY Goons; - SCR_INT GoonsRequestingJoin; // bitset - SCR_INT PayGrade; - SCR_INT InvitesByBosses; // bitset - SCR_INT TransitionBossPersistanceStage; - SCR_INT EndBeingGoonReason; - SCR_INT PAD_0025; // TODO - PLAYER_INDEX JoiningBoss; - alignas(8) eGoonInviteType JoinedInviteType; - SCR_INT NumBossDeathsSinceLastPay; - SCR_VEC3 PAD_0029; // TODO - alignas(8) eActivityType UnkActivity; - alignas(8) eActivityType CurrentActivity; - PLAYER_INDEX JoustTarget; - PLAYER_INDEX ExecutiveDeathmatchTarget; - MP_SCRIPT_DATA ActiveScript; - PLAYER_INDEX PAD_0057; - PLAYER_INDEX PAD_0058; - alignas(8) eBossVehicleState BossVehicleState; - SCR_INT BossVehicleSpawnState; - PLAYER_INDEX PlayerInsideBossVehicle; - SCR_HASH BossVehicleModel; - TIMER LastBossVehicleSpawnTimer; - TIMER BossVehicleInvincibleTimer; - SCR_VEC3 BossVehicleSpawnedPosition; - alignas(8) HudColor BossVehicleHudColor; - TEXT_LABEL_15 BossVehicleTextLabel; - SCR_INT BossVehicleNetId; - MC_STYLE MCStyle; - uint64_t PAD_0098[3]; // unused - SCR_INT FriendlyFireDisabledPlayers; - SCR_INT PiracyPreventionYachtIndex; // not used by the scripts - SCR_INT BossGoonMissionLaunchState; - SCR_INT ColorSlot; - TEXT_LABEL_63 MCName; - SCR_INT Language; // can be used to get the system language of player - SCR_INT SpawnableBossVehicles; - SCR_INT AutoBuyoutDeliveryLocationIndex; - SCR_INT AutoBuyoutDeliveryLocationSubIndex; - SCR_INT PAD_0125; // unused - SCR_ARRAY PAD_0126; // TODO - SCR_ARRAY ContrabandPositions; // positions of cargo used to notify players to destroy them when they get near - SCR_HASH ContrabandPickupModel; - PLAYER_INDEX StealingContrabandVehiclePlayerIndex; - SCR_INT PAD_0178; // TODO - SCR_HASH ContrabandPickupModel2; - SCR_BOOL DestroyedCargo; - SCR_INT VIPGameplayDisabledTimer; - SCR_INT SettingUpBusiness; - uint64_t PAD_0183[4]; // TODO some unknown contraband struct - VEHICLE_EXPORT VehicleExport; - uint64_t PAD_0193[12]; // TODO - SCR_ARRAY ActiveFreemodeEvents; // force thunder - 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 - SCR_ARRAY CasinoDeliverables; - SCR_INT CasinoLimoDestination; - SCR_BOOL CasinoLimoActive; - SCR_BOOL CasinoLuxuryCarActive; - SCR_HASH CasinoLuxuryCarModel; - CASINO_HEIST_PREP CasinoHeistPrep; - SCR_INT CayoPrepIndex; - SCR_INT CompanySUVDestination; - SCR_BOOL CompanySUVActive; - SCR_ARRAY ContrabandIndices; // type of selling cargo - SCR_ARRAY VehicleExportIndices; // not sure what this is - SCR_INT VehicleExportMissionType; // valid range is 2000 to 2010, 2000 = 0, 2001 = 1 etc - SCR_ARRAY VehicleExportSellingIndices; - SCR_BOOL PAD_0337; // TODO - TEXT_LABEL_63 GangName; // CEO Name - TEXT_LABEL_63 ClubhouseName; // cut content? - SCR_INT SourcingContrabandType; - SCR_INT FragileGoodsMissionType; - SCR_INT SalvageMissionType; - SCR_INT DoomsdayPrepIndex; - SCR_INT VehicleExportIndex; // another one... - SCR_INT PAD_0375; // unused - SCR_INT BunkerSourceIndex; // check gb_gunrunning func_1540 - SCR_ARRAY BunkerCargoIndices; - uint64_t PAD_0386[5]; - uint64_t PAD_0391[2]; // unused - uint64_t PAD_0393[15]; // smuggler data - SCR_INT LastBossWorkTime; // seconds since epoch - uint64_t PAD_0409[19]; - SCR_BOOL IsMC; - alignas(8) eMCRole MCRole; // applies to goons only, boss is always the MC president - SCR_BOOL FormationFlyingAssist; - SCR_INT PAD_0431; // always set to zero and not read - SCR_BOOL MCFormationActive; - SCR_BOOL MCFormationHelpShown; - TIMER MCFormationHealthBonusTimer; - TIMER MCFormationLastHealthBonusTimer; - TIMER MCFormationBreakTimer; - SCR_INT PAD_0440; // unused - SCR_BOOL MCFormationAssist; - SCR_BOOL MCRidingStyleRelaxed; - SCR_FLOAT PAD_0443; // set from a tunable - SCR_FLOAT PAD_0444; // set from a tunable - uint64_t PAD_0445[16]; // somewhat unused, a few fields are accessed in the business battle script - SCR_INT ClothingValue; // total value of equipped clothing used by criminal damage - PLAYER_INDEX Adversary; // for common adversary calculations? - SCR_HASH ContrabandType; // unknown HASH_ENUM - SCR_INT HitAndRideGangType; - SCR_BOOL IsMC2; - SCR_INT BossGoonVersion; - SCR_INT MCTotalContributionPoints; - SCR_INT MCContributionPoints; - SCR_INT FavoriteBikeStyle; // not read by the scripts - SCR_INT GreatestFormationTimeIndex; - SCR_INT FormationTime; - SCR_BOOL RidingFavoriteMotorcycle; - SCR_INT ContrabandSellLocation; - SCR_INT BusinessBattleType; - SCR_INT PAD_0475; - SCR_INT NightclubMissionIndex; - SCR_INT NightclubDefendMissionIndex; - uint64_t PAD_0478[18]; // TODO - SCR_BOOL DoubleActionCacheLocationRevealed; + PLAYER_INDEX Boss; // leader of CEO/MC + SCR_INT TimeBecameBoss; + SCR_INT TimeBecameGoon; + SCR_INT LastPayTime; + SCR_BITSET Flags; + SCR_INT Flags2; // TODO + SCR_INT Flags3; // TODO + SCR_INT TotalBossGoonTime; + SCR_ARRAY BossGoonUUID; + SCR_ARRAY Goons; + SCR_INT GoonsRequestingJoin; // bitset + SCR_INT PayGrade; + SCR_INT InvitesByBosses; // bitset + SCR_INT TransitionBossPersistanceStage; + SCR_INT EndBeingGoonReason; + SCR_INT PAD_0025; // TODO + PLAYER_INDEX JoiningBoss; + alignas(8) eGoonInviteType JoinedInviteType; + SCR_INT NumBossDeathsSinceLastPay; + SCR_VEC3 PAD_0029; // TODO + alignas(8) eActivityType UnkActivity; + alignas(8) eActivityType CurrentActivity; + PLAYER_INDEX JoustTarget; + PLAYER_INDEX ExecutiveDeathmatchTarget; + MP_SCRIPT_DATA ActiveScript; + PLAYER_INDEX PAD_0057; + PLAYER_INDEX PAD_0058; + alignas(8) eBossVehicleState BossVehicleState; + SCR_INT BossVehicleSpawnState; + PLAYER_INDEX PlayerInsideBossVehicle; + SCR_HASH BossVehicleModel; + TIMER LastBossVehicleSpawnTimer; + TIMER BossVehicleInvincibleTimer; + SCR_VEC3 BossVehicleSpawnedPosition; + alignas(8) HudColor BossVehicleHudColor; + TEXT_LABEL_15 BossVehicleTextLabel; + SCR_INT BossVehicleNetId; + MC_STYLE MCStyle; + uint64_t PAD_0098[3]; // unused + SCR_INT FriendlyFireDisabledPlayers; + SCR_INT PiracyPreventionYachtIndex; // not used by the scripts + SCR_INT BossGoonMissionLaunchState; + SCR_INT ColorSlot; + TEXT_LABEL_63 MCName; + SCR_INT Language; // can be used to get the system language of player + SCR_INT SpawnableBossVehicles; + SCR_INT AutoBuyoutDeliveryLocationIndex; + SCR_INT AutoBuyoutDeliveryLocationSubIndex; + SCR_INT PAD_0125; // unused + SCR_ARRAY PAD_0126; // TODO + SCR_ARRAY ContrabandPositions; // positions of cargo used to notify players to destroy them when they get near + SCR_HASH ContrabandPickupModel; + PLAYER_INDEX StealingContrabandVehiclePlayerIndex; + SCR_INT PAD_0178; // TODO + SCR_HASH ContrabandPickupModel2; + SCR_BOOL DestroyedCargo; + SCR_INT VIPGameplayDisabledTimer; // @181 as of 1.67 + SCR_INT SettingUpBusiness; + uint64_t PAD_0183[4]; // TODO some unknown contraband struct + VEHICLE_EXPORT VehicleExport; + uint64_t PAD_0193[12]; // TODO + SCR_ARRAY ActiveFreemodeEvents; // force thunder + 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 + SCR_ARRAY CasinoDeliverables; + SCR_INT CasinoLimoDestination; + SCR_BOOL CasinoLimoActive; + SCR_BOOL CasinoLuxuryCarActive; + SCR_HASH CasinoLuxuryCarModel; + CASINO_HEIST_PREP CasinoHeistPrep; + SCR_INT CayoPrepIndex; + SCR_INT CompanySUVDestination; + SCR_BOOL CompanySUVActive; + SCR_ARRAY ContrabandIndices; // type of selling cargo + SCR_ARRAY VehicleExportIndices; // not sure what this is + SCR_INT VehicleExportMissionType; // valid range is 2000 to 2010, 2000 = 0, 2001 = 1 etc + SCR_ARRAY VehicleExportSellingIndices; + SCR_BOOL PAD_0337; // TODO + TEXT_LABEL_63 GangName; // CEO Name + TEXT_LABEL_63 ClubhouseName; // cut content? + SCR_INT SourcingContrabandType; + SCR_INT FragileGoodsMissionType; + SCR_INT SalvageMissionType; + SCR_INT DoomsdayPrepIndex; + SCR_INT VehicleExportIndex; // another one... + SCR_INT PAD_0375; // unused + SCR_INT BunkerSourceIndex; // check gb_gunrunning func_1540 + SCR_ARRAY BunkerCargoIndices; + uint64_t PAD_0386[5]; + uint64_t PAD_0391[2]; // unused + uint64_t PAD_0393[15]; // smuggler data + SCR_INT LastBossWorkTime; // seconds since epoch + uint64_t PAD_0409[19]; + SCR_BOOL IsMC; + alignas(8) eMCRole MCRole; // applies to goons only, boss is always the MC president + SCR_BOOL FormationFlyingAssist; + SCR_INT PAD_0431; // always set to zero and not read + SCR_BOOL MCFormationActive; + SCR_BOOL MCFormationHelpShown; + TIMER MCFormationHealthBonusTimer; + TIMER MCFormationLastHealthBonusTimer; + TIMER MCFormationBreakTimer; + SCR_INT PAD_0440; // unused + SCR_BOOL MCFormationAssist; + SCR_BOOL MCRidingStyleRelaxed; + SCR_FLOAT PAD_0443; // set from a tunable + SCR_FLOAT PAD_0444; // set from a tunable + uint64_t PAD_0445[16]; // somewhat unused, a few fields are accessed in the business battle script + SCR_INT ClothingValue; // total value of equipped clothing used by criminal damage + PLAYER_INDEX Adversary; // for common adversary calculations? + SCR_HASH ContrabandType; // unknown HASH_ENUM + SCR_INT HitAndRideGangType; + SCR_BOOL IsMC2; + SCR_INT BossGoonVersion; + SCR_INT MCTotalContributionPoints; + SCR_INT MCContributionPoints; + SCR_INT FavoriteBikeStyle; // not read by the scripts + SCR_INT GreatestFormationTimeIndex; + SCR_INT FormationTime; + SCR_BOOL RidingFavoriteMotorcycle; + SCR_INT ContrabandSellLocation; + SCR_INT BusinessBattleType; + SCR_INT PAD_0475; + SCR_INT NightclubMissionIndex; + SCR_INT NightclubDefendMissionIndex; + uint64_t PAD_0478[18]; // TODO + SCR_BOOL DoubleActionCacheLocationRevealed; }; -static_assert(sizeof(BOSS_GOON) == 497 * 8); +static_assert(sizeof(BOSS_GOON) == 498 * 8); struct MC_STATS { - SCR_INT FormationTime0; - SCR_INT FormationTime1; - SCR_INT FormationTime2; - SCR_INT FormationTime3; - SCR_INT MembersMarkedForDeath; - SCR_INT MCKills; - SCR_INT MCDeaths; - SCR_INT RivalPresidentKills; - SCR_INT RivalCEOAndVIPKills; - SCR_INT MeleeKills; - SCR_INT ClubhouseContractsComplete; - SCR_INT ClubhouseContractEarnings; - SCR_INT ClubworkCompleted; - SCR_INT ClubChallengesCompleted; - SCR_INT MemberChallengesCompleted; + SCR_INT FormationTime0; + SCR_INT FormationTime1; + SCR_INT FormationTime2; + SCR_INT FormationTime3; + SCR_INT MembersMarkedForDeath; + SCR_INT MCKills; + SCR_INT MCDeaths; + SCR_INT RivalPresidentKills; + SCR_INT RivalCEOAndVIPKills; + SCR_INT MeleeKills; + SCR_INT ClubhouseContractsComplete; + SCR_INT ClubhouseContractEarnings; + SCR_INT ClubworkCompleted; + SCR_INT ClubChallengesCompleted; + SCR_INT MemberChallengesCompleted; }; static_assert(sizeof(MC_STATS) == 15 * 8); struct GBPD_FM_3_Entry { - alignas(8) eActivityType CurrentActivity; // enum is outdated - SCR_INT Flags; // TODO - alignas(8) eActivityType CurrentFreemodeActivity; // subset of CurrentActivity - SCR_INT SeatingFlags; - SCR_VEC3 CurrentFreemodeActivityObjectivePosition; - SCR_INT VehiclesNearbyActivityObjective; // only used by challenges and checkpoints - SCR_BOOL PassiveMode; - SCR_BOOL TimeTrialActive; // verify - BOSS_GOON BossGoon; - uint64_t PAD_507[3]; // unused - SCR_INT ScriptEventReplayProtectionCounter; - TIMER CoronaForcedLaunchTimer; - LEAVE_IN_HELI LeaveInHeli; - SCR_INT OfficeDesktopFlags; // bit 0 -> login, bit 1 -> map - uint64_t PAD_514[8]; // some IE stuff, most of it is unused - SCR_INT IlluminatedClothingState; - SCR_INT MatchHistoryId1; // used for telemetry - SCR_INT MatchHistoryId2; - alignas(8) eClubhouseActivity ClubhouseActivity; - SCR_INT ClubhouseFont; - SCR_INT ClubhouseColor; - SCR_INT ClubhouseEmblem; - SCR_BOOL ClubhouseHideSignage; - uint64_t PAD_0533[2]; // facility exit - uint64_t PAD_0535[6]; // no clue what this is - MC_STATS MCStats; - uint64_t PAD_0556[29]; - SCR_HASH ForcedWeapon; - SCR_INT HangarCargoMissionLocationIndex; - SCR_VEC3 AvengerPosition; - SCR_VEC3 TerrorbytePosition; - SCR_VEC3 AcidLabPosition; - PLAYER_INDEX DeliveringExportVehicleOwner; - uint64_t PAD_0597[2]; // TODO - SCR_INT BountyAmount; // values above 10000 will prevent payout - PLAYER_INDEX BountyPlacedBy; - SCR_INT PAD_0601; // unused, set to -1 by business_battles_sell and never read - SCR_INT CurrentlyUsingArenaTurretIndex; // works similar to the vars found in GlobalPlayerBD - SCR_INT CurrentlyUsingArenaTurretActivatedTime; - SCR_INT CasinoStoryProgress; - SCR_INT CasinoFlowProgress; - SCR_ARRAY DailyObjectiveFlags; + alignas(8) eActivityType CurrentActivity; // enum is outdated + SCR_INT Flags; // TODO + alignas(8) eActivityType CurrentFreemodeActivity; // subset of CurrentActivity + SCR_INT SeatingFlags; + SCR_VEC3 CurrentFreemodeActivityObjectivePosition; + SCR_INT VehiclesNearbyActivityObjective; // only used by challenges and checkpoints + SCR_BOOL PassiveMode; + SCR_BOOL TimeTrialActive; // verify + BOSS_GOON BossGoon; + uint64_t PAD_507[3]; // unused + SCR_INT ScriptEventReplayProtectionCounter; + TIMER CoronaForcedLaunchTimer; + LEAVE_IN_HELI LeaveInHeli; + SCR_INT OfficeDesktopFlags; // bit 0 -> login, bit 1 -> map + uint64_t PAD_514[8]; // some IE stuff, most of it is unused + SCR_INT IlluminatedClothingState; + SCR_INT MatchHistoryId1; // used for telemetry + SCR_INT MatchHistoryId2; + alignas(8) eClubhouseActivity ClubhouseActivity; + SCR_INT ClubhouseFont; + SCR_INT ClubhouseColor; + SCR_INT ClubhouseEmblem; + SCR_BOOL ClubhouseHideSignage; + uint64_t PAD_0533[2]; // facility exit + uint64_t PAD_0535[6]; // no clue what this is + MC_STATS MCStats; + uint64_t PAD_0556[29]; + SCR_HASH ForcedWeapon; + SCR_INT HangarCargoMissionLocationIndex; + SCR_VEC3 AvengerPosition; + SCR_VEC3 TerrorbytePosition; + SCR_VEC3 AcidLabPosition; + PLAYER_INDEX DeliveringExportVehicleOwner; + uint64_t PAD_0597[2]; // TODO + SCR_INT BountyAmount; // values above 10000 will prevent payout + PLAYER_INDEX BountyPlacedBy; + SCR_INT PAD_0601; // unused, set to -1 by business_battles_sell and never read + SCR_INT CurrentlyUsingArenaTurretIndex; // works similar to the vars found in GlobalPlayerBD + SCR_INT CurrentlyUsingArenaTurretActivatedTime; + SCR_INT CasinoStoryProgress; + SCR_INT CasinoFlowProgress; + SCR_ARRAY DailyObjectiveFlags; // @607 as of 1.67 }; -static_assert(sizeof(GBPD_FM_3_Entry) == 608 * 8); +static_assert(sizeof(GBPD_FM_3_Entry) == 609 * 8); struct GPBD_FM_3 { - SCR_ARRAY Entries; + SCR_ARRAY Entries; }; -static_assert(sizeof(GPBD_FM_3) == 19457 * 8); \ No newline at end of file +static_assert(sizeof(GPBD_FM_3) == 19489 * 8); \ No newline at end of file diff --git a/script/globals/GSBD_FM.hpp b/script/globals/GSBD_FM.hpp index ff2bb41..dc67447 100644 --- a/script/globals/GSBD_FM.hpp +++ b/script/globals/GSBD_FM.hpp @@ -49,9 +49,9 @@ struct GSBD_FM SCR_ARRAY MuggingPlayers; // 0 = mugger, 1 = merryweather mercs SCR_ARRAY MuggedPlayers; uint64_t PAD_0112[4]; // unused - SCR_ARRAY PAD_0116; // TODO + SCR_ARRAY PAD_0116; // TODO SCR_INT ShopProcessingBitset; - SCR_ARRAY ActiveContactServiceBitsets; + SCR_ARRAY ActiveContactServiceBitsets; SCR_ARRAY ActiveContactServices; PLAYER_INDEX SpectatorTVWantedPlayer; SCR_BOOL SpectatorTVWantedClosing; @@ -63,4 +63,4 @@ struct GSBD_FM BIKER_CONTRACTS_SERVER BikerContracts; SCR_ARRAY DoubleActionCacheLocationRevealed; }; -static_assert(sizeof(GSBD_FM) == 574 * 8); \ No newline at end of file +static_assert(sizeof(GSBD_FM) == 576 * 8); \ No newline at end of file diff --git a/script/globals/GlobalPlayerBD.hpp b/script/globals/GlobalPlayerBD.hpp index 0baadda..cc45cd2 100644 --- a/script/globals/GlobalPlayerBD.hpp +++ b/script/globals/GlobalPlayerBD.hpp @@ -4,666 +4,661 @@ enum class eFreemodeState { - NONE = 0, - UNK_2 = 2, - RUNNING = 4, - CLOSING = 5, - UNK_10 = 10, - UNK_11 = 11 + NONE = 0, + UNK_2 = 2, + RUNNING = 4, + CLOSING = 5, + UNK_10 = 10, + UNK_11 = 11 }; enum class eMissionType { - NONE, - MISSION, - HEIST, - UNK_3, - ADVERSARY_MODE, - LAST_TEAM_STANDING, - CAPTURE, - HEIST_SETUP, - UNK_8, // FMMC_RSTAR_MCP - UNKNOWN // everything else + NONE, + MISSION, + HEIST, + UNK_3, + ADVERSARY_MODE, + LAST_TEAM_STANDING, + CAPTURE, + HEIST_SETUP, + UNK_8, // FMMC_RSTAR_MCP + UNKNOWN // everything else }; enum class eAnimationBitset { - kCashRainActive = 12, - kChampagneSprayActive = 13 + kCashRainActive = 12, + kChampagneSprayActive = 13 }; enum class eBlipFlags { - // 0 is unused - kVisibleOnCutscene = 1, - kFlashMinimapDisplay = 2, - kFlashBlip = 3, - kMicroLightOTRActive = 4, - kSkipTutorialSessionChecks = 5, - kHideOnMinimap = 6, // needs testing - kHideOnMinimapWhenInterior = 7, // needs testing - kHideOnMinimapWhenBigMapActive = 9, // needs testing - kDontUsePassiveBlip = 21, - kUseRampageBlip = 24, - kHideWhenFading = 25 + // 0 is unused + kVisibleOnCutscene = 1, + kFlashMinimapDisplay = 2, + kFlashBlip = 3, + kMicroLightOTRActive = 4, + kSkipTutorialSessionChecks = 5, + kHideOnMinimap = 6, // needs testing + kHideOnMinimapWhenInterior = 7, // needs testing + kHideOnMinimapWhenBigMapActive = 9, // needs testing + kDontUsePassiveBlip = 21, + kUseRampageBlip = 24, + kHideWhenFading = 25 }; enum class eBlipType { - ON_FOOT, - TANK, - PLAYER_JET, - PLAYER_PLANE, - PLAYER_HELI, - PLAYER_GUNCAR, - PLAYER_BOAT, - ROCKET_VOLTIC, - TECHNICAL, - RUINER_2000, - DUNE_BUGGY, - PHANTOM_WEDGE, - ARMORED_BOXVILLE, // boxville5 - WASTELANDER, - QUAD, - APC, - OPPRESSOR_MK_1, - HALF_TRACK, - DUNE_FAV, - WEAPONIZED_TAMPA, - AA_TRAILER, - ALPHA_Z1, - BOMBUSHKA, - HAVOK, - HOWARD, - HUNTER, - MICROLIGHT, - MOGUL, - MOLOTOK, - NOKOTA, - PYRO, - ROGUE, - STARLING, - SEABREEZE, - TULA, - STROMBERG, - DELUXO, - THRUSTER, - KHANJALI, - RIOT_VAN, - VOLATOL, - BARRAGE, - AKULA, - CHERNOBOG, - AVENGER, - TURRETED_LIMO, - SEA_SPARROW, - CARACARA, - PARTY_BUS, - TERRORBYTE, - MENACER, - SCRAMJET, - POUNDER_CUSTOM, - MULE_CUSTOM, - SPEEDO_CUSTOM, - OPPRESSOR_MK_2, - STRIKEFORCE, - ARENA_BRUISER, - ARENA_BRUTUS, - ARENA_CERBERUS, - ARENA_DEATHBIKE, - ARENA_DOMINATOR, - ARENA_IMPALER, - ARENA_IMPERATOR, - ARENA_ISSI, - ARENA_SASQUATCH, - ARENA_SCARAB, - ARENA_SLAMVAN, - ARENA_ZR380, - MINI_SUB, - SPARROW, - FOLDING_WING_JET, - GANG_BIKE, - MILITARY_QUAD, - SQUADDIE, // SQUADEE - CAYO_DINGHY, - WINKY, - PATROL_BOAT, - ANNIHILATOR, - KART_RETRO, - KART_MODERN, - MILITARY_TRUCK, - SUBMARINE, - CHAMPION, - BUFFALO_STX, - DEITY, // why does this have a blip? - JUBILEE, - GRANGER_3600LX, - PATRIOT_MILSPEC, - ARMS_DEALING_AIR, // requires some flag to be set - BRICKADE_6X6 + ON_FOOT, + TANK, + PLAYER_JET, + PLAYER_PLANE, + PLAYER_HELI, + PLAYER_GUNCAR, + PLAYER_BOAT, + ROCKET_VOLTIC, + TECHNICAL, + RUINER_2000, + DUNE_BUGGY, + PHANTOM_WEDGE, + ARMORED_BOXVILLE, // boxville5 + WASTELANDER, + QUAD, + APC, + OPPRESSOR_MK_1, + HALF_TRACK, + DUNE_FAV, + WEAPONIZED_TAMPA, + AA_TRAILER, + ALPHA_Z1, + BOMBUSHKA, + HAVOK, + HOWARD, + HUNTER, + MICROLIGHT, + MOGUL, + MOLOTOK, + NOKOTA, + PYRO, + ROGUE, + STARLING, + SEABREEZE, + TULA, + STROMBERG, + DELUXO, + THRUSTER, + KHANJALI, + RIOT_VAN, + VOLATOL, + BARRAGE, + AKULA, + CHERNOBOG, + AVENGER, + TURRETED_LIMO, + SEA_SPARROW, + CARACARA, + PARTY_BUS, + TERRORBYTE, + MENACER, + SCRAMJET, + POUNDER_CUSTOM, + MULE_CUSTOM, + SPEEDO_CUSTOM, + OPPRESSOR_MK_2, + STRIKEFORCE, + ARENA_BRUISER, + ARENA_BRUTUS, + ARENA_CERBERUS, + ARENA_DEATHBIKE, + ARENA_DOMINATOR, + ARENA_IMPALER, + ARENA_IMPERATOR, + ARENA_ISSI, + ARENA_SASQUATCH, + ARENA_SCARAB, + ARENA_SLAMVAN, + ARENA_ZR380, + MINI_SUB, + SPARROW, + FOLDING_WING_JET, + GANG_BIKE, + MILITARY_QUAD, + SQUADDIE, // SQUADEE + CAYO_DINGHY, + WINKY, + PATROL_BOAT, + ANNIHILATOR, + KART_RETRO, + KART_MODERN, + MILITARY_TRUCK, + SUBMARINE, + CHAMPION, + BUFFALO_STX, + DEITY, // why does this have a blip? + JUBILEE, + GRANGER_3600LX, + PATRIOT_MILSPEC, + ARMS_DEALING_AIR, // requires some flag to be set + BRICKADE_6X6 }; enum class ePlayerStateFlags { - kScreenFadingOut = 0, - kScreenFadedOut = 1, - kCinematicNewsChannelActive = 2, - kRepeatingPreviousCheckpoint = 3, - kCarModIntro = 4, - kPlayerSwitchStateAscent = 5, - kPlayerSwitchStateInClouds = 6, - kPlayerSwitchStatePan = 7, - kPlayerSwitchStateDescent = 8, - kModshopActive = 9, - kModshopExitingVehicle = 10, - kSpectating = 28, - kBeastActive = 29, - kPlayerNotInSCTV = 30, - kPlayerInSCTV = 31 + kScreenFadingOut = 0, + kScreenFadedOut = 1, + kCinematicNewsChannelActive = 2, + kRepeatingPreviousCheckpoint = 3, + kCarModIntro = 4, + kPlayerSwitchStateAscent = 5, + kPlayerSwitchStateInClouds = 6, + kPlayerSwitchStatePan = 7, + kPlayerSwitchStateDescent = 8, + kModshopActive = 9, + kModshopExitingVehicle = 10, + kSpectating = 28, + kBeastActive = 29, + kPlayerNotInSCTV = 30, + kPlayerInSCTV = 31 }; enum class eActivityFlags { - kWatchingMovie = 0, - kInGangAttack = 1, - kImpromptuRace = 2, - kCrateDrop = 4, // tf is this? "~s~A plane is on its way to drop a Crate ~HUD_COLOUR_GREEN~~BLIP_CRATEDROP~ ~s~which contains useful equipment. Be the first to collect it." - kDeliveringSimeonVehicle = 6, - kInLapDance = 7, - kHoldUpTutorial = 8, - kJoyrider = 9, // uh what is this? - kCarModTutorial = 10, - kMissionLauncher = 11, // ??? - kLesterCutsceneActive = 12, - kTrevorCutsceneActive = 13, - kHeistIntro = 14, - kPlaneTakedown = 15, // not sure what this is - kDistractCops = 16, // "Great. Thank you for your help. Now some horrible criminals are in jail for a crime they did commit and it's all your fault!!" ??? - kDestroyVehicle = 17, // ??? - kPartakingInHotTarget = 18, - kPartakingInKillList = 19, - kTimeTrialStarted = 21, - kPartakingInCheckpoints = 22, - kPartakingInChallenge = 23, - kPennedInActive = 24, - kRCTimeTrialStarted = 25, - kPartakingInHotProperty = 27, - kPartakingInKingOfTheCastle = 29, - kPartakingInCriminalDamage = 30, - kLowriderIntro = 31 + kWatchingMovie = 0, + kInGangAttack = 1, + kImpromptuRace = 2, + kCrateDrop = 4, // tf is this? "~s~A plane is on its way to drop a Crate ~HUD_COLOUR_GREEN~~BLIP_CRATEDROP~ ~s~which contains useful equipment. Be the first to collect it." + kDeliveringSimeonVehicle = 6, + kInLapDance = 7, + kHoldUpTutorial = 8, + kJoyrider = 9, // uh what is this? + kCarModTutorial = 10, + kMissionLauncher = 11, // ??? + kLesterCutsceneActive = 12, + kTrevorCutsceneActive = 13, + kHeistIntro = 14, + kPlaneTakedown = 15, // not sure what this is + kDistractCops = 16, // "Great. Thank you for your help. Now some horrible criminals are in jail for a crime they did commit and it's all your fault!!" ??? + kDestroyVehicle = 17, // ??? + kPartakingInHotTarget = 18, + kPartakingInKillList = 19, + kTimeTrialStarted = 21, + kPartakingInCheckpoints = 22, + kPartakingInChallenge = 23, + kPennedInActive = 24, + kRCTimeTrialStarted = 25, + kPartakingInHotProperty = 27, + kPartakingInKingOfTheCastle = 29, + kPartakingInCriminalDamage = 30, + kLowriderIntro = 31 }; enum class eGamerTagFlags { - kShowPackageCount = 13, - kFadeOutGamerTag = 17, - kGangCEO = 19, - kGangBiker = 20 + kShowPackageCount = 13, + kFadeOutGamerTag = 17, + kGangCEO = 19, + kGangBiker = 20 }; // TODO! enum class eOrbitalBitset { - kOrbitalCannonActive = 0, - kWatchingMovie = 1, // not a typo, the orbital cannon script needs to know if you are inside a movie theater for some strange reason - kCutsceneOrInterior = 2, - kTransactionPending = 3 + kOrbitalCannonActive = 0, + kWatchingMovie = 1, // not a typo, the orbital cannon script needs to know if you are inside a movie theater for some strange reason + kCutsceneOrInterior = 2, + kTransactionPending = 3 }; enum class eArcadeGameBitset { - kArcadeMachineActivated = 0, - kLoveMeterActivated = 1, - kLoveMeterAnimationGenderDecided = 2 + kArcadeMachineActivated = 0, + kLoveMeterActivated = 1, + kLoveMeterAnimationGenderDecided = 2 }; enum class eOutOfSightFlags { - kOutOfSightEnabled = 0, - kOutOfSightActive = 1, // this controls whether you appear on radar or not - kHelpDisplayed = 2, - kDamagedPlayerOutsideOrganization = 3 + kOutOfSightEnabled = 0, + kOutOfSightActive = 1, // this controls whether you appear on radar or not + kHelpDisplayed = 2, + kDamagedPlayerOutsideOrganization = 3 }; enum class eSimpleInteriorIndex { - SIMPLE_INTERIOR_INVALID = -1, - SIMPLE_INTERIOR_WAREHOUSE_1, - SIMPLE_INTERIOR_WAREHOUSE_2, - SIMPLE_INTERIOR_WAREHOUSE_3, - SIMPLE_INTERIOR_WAREHOUSE_4, - SIMPLE_INTERIOR_WAREHOUSE_5, - SIMPLE_INTERIOR_WAREHOUSE_6, - SIMPLE_INTERIOR_WAREHOUSE_7, - SIMPLE_INTERIOR_WAREHOUSE_8, - SIMPLE_INTERIOR_WAREHOUSE_9, - SIMPLE_INTERIOR_WAREHOUSE_10, - SIMPLE_INTERIOR_WAREHOUSE_11, - SIMPLE_INTERIOR_WAREHOUSE_12, - SIMPLE_INTERIOR_WAREHOUSE_13, - SIMPLE_INTERIOR_WAREHOUSE_14, - SIMPLE_INTERIOR_WAREHOUSE_15, - SIMPLE_INTERIOR_WAREHOUSE_16, - SIMPLE_INTERIOR_WAREHOUSE_17, - SIMPLE_INTERIOR_WAREHOUSE_18, - SIMPLE_INTERIOR_WAREHOUSE_19, - SIMPLE_INTERIOR_WAREHOUSE_20, - SIMPLE_INTERIOR_WAREHOUSE_21, - SIMPLE_INTERIOR_WAREHOUSE_22, - SIMPLE_INTERIOR_FACTORY_METH_1, - SIMPLE_INTERIOR_FACTORY_WEED_1, - SIMPLE_INTERIOR_FACTORY_CRACK_1, - SIMPLE_INTERIOR_FACTORY_MONEY_1, - SIMPLE_INTERIOR_FACTORY_DOCUMENTS_1, - SIMPLE_INTERIOR_FACTORY_METH_2, - SIMPLE_INTERIOR_FACTORY_WEED_2, - SIMPLE_INTERIOR_FACTORY_CRACK_2, - SIMPLE_INTERIOR_FACTORY_MONEY_2, - SIMPLE_INTERIOR_FACTORY_DOCUMENTS_2, - SIMPLE_INTERIOR_FACTORY_METH_3, - SIMPLE_INTERIOR_FACTORY_WEED_3, - SIMPLE_INTERIOR_FACTORY_CRACK_3, - SIMPLE_INTERIOR_FACTORY_MONEY_3, - SIMPLE_INTERIOR_FACTORY_DOCUMENTS_3, - SIMPLE_INTERIOR_FACTORY_METH_4, - SIMPLE_INTERIOR_FACTORY_WEED_4, - SIMPLE_INTERIOR_FACTORY_CRACK_4, - SIMPLE_INTERIOR_FACTORY_MONEY_4, - SIMPLE_INTERIOR_FACTORY_DOCUMENTS_4, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_POLICE_STATION, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MC_CLUBHOUSE, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_ROCKFORD, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_PILLBOX, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_ALTA, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_BURTON, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_PALETO, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_GRAND_SENORA, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_CHUMASH, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_ROCKCLUB, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_2, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_3, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_4, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FARMHOUSE, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_HEIST_YACHT, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_RECYCLING_PLANT, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BIOLAB, - SIMPLE_INTERIOR_IE_WAREHOUSE_1, - SIMPLE_INTERIOR_IE_WAREHOUSE_2, - SIMPLE_INTERIOR_IE_WAREHOUSE_3, - SIMPLE_INTERIOR_IE_WAREHOUSE_4, - SIMPLE_INTERIOR_IE_WAREHOUSE_5, - SIMPLE_INTERIOR_IE_WAREHOUSE_6, - SIMPLE_INTERIOR_IE_WAREHOUSE_7, - SIMPLE_INTERIOR_IE_WAREHOUSE_8, - SIMPLE_INTERIOR_IE_WAREHOUSE_9, - SIMPLE_INTERIOR_IE_WAREHOUSE_10, - SIMPLE_INTERIOR_BUNKER_1, - SIMPLE_INTERIOR_BUNKER_2, - SIMPLE_INTERIOR_BUNKER_3, - SIMPLE_INTERIOR_BUNKER_4, - SIMPLE_INTERIOR_BUNKER_5, - SIMPLE_INTERIOR_BUNKER_6, - SIMPLE_INTERIOR_BUNKER_7, - SIMPLE_INTERIOR_BUNKER_9, - SIMPLE_INTERIOR_BUNKER_10, - SIMPLE_INTERIOR_BUNKER_11, - SIMPLE_INTERIOR_BUNKER_12, - SIMPLE_INTERIOR_ARMORY_TRUCK_1, - SIMPLE_INTERIOR_CREATOR_TRAILER_1, - SIMPLE_INTERIOR_HANGAR_1, - SIMPLE_INTERIOR_HANGAR_2, - SIMPLE_INTERIOR_HANGAR_3, - SIMPLE_INTERIOR_HANGAR_4, - SIMPLE_INTERIOR_HANGAR_5, - SIMPLE_INTERIOR_ARMORY_AIRCRAFT_1, - SIMPLE_INTERIOR_DEFUNCT_BASE_1, - SIMPLE_INTERIOR_DEFUNCT_BASE_2, - SIMPLE_INTERIOR_DEFUNCT_BASE_3, - SIMPLE_INTERIOR_DEFUNCT_BASE_4, - SIMPLE_INTERIOR_DEFUNCT_BASE_6, - SIMPLE_INTERIOR_DEFUNCT_BASE_7, - SIMPLE_INTERIOR_DEFUNCT_BASE_8, - SIMPLE_INTERIOR_DEFUNCT_BASE_9, - SIMPLE_INTERIOR_DEFUNCT_BASE_10, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MEDIUM_GARAGE, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_LOWEND_STUDIO, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MIDEND_APARTMENT, - SIMPLE_INTERIOR_CREATOR_AIRCRAFT_1, - SIMPLE_INTERIOR_HUB_LA_MESA, - SIMPLE_INTERIOR_HUB_MISSION_ROW, - SIMPLE_INTERIOR_HUB_STRAWBERRY_WAREHOUSE, - SIMPLE_INTERIOR_HUB_WEST_VINEWOOD, - SIMPLE_INTERIOR_HUB_CYPRESS_FLATS, - SIMPLE_INTERIOR_HUB_LSIA_WAREHOUSE, - SIMPLE_INTERIOR_HUB_ELYSIAN_ISLAND, - SIMPLE_INTERIOR_HUB_DOWNTOWN_VINEWOOD, - SIMPLE_INTERIOR_HUB_DEL_PERRO_BUILDING, - SIMPLE_INTERIOR_HUB_VESPUCCI_CANALS, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SHERIFF, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SHERIFF2, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_UNION_DEPOSITORY_CARPARK, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SIMEON_SHOWROOM, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_ABATTOIR, - SIMPLE_INTERIOR_HACKER_TRUCK, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_JEWEL_STORE, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_LIFE_INVADER, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_DJ_YACHT, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MELANOMA_GARAGE, - SIMPLE_INTERIOR_ARENA_GARAGE_1, - SIMPLE_INTERIOR_CASINO, - SIMPLE_INTERIOR_CASINO_APT, - SIMPLE_INTERIOR_CASINO_VAL_GARAGE, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_HAYES_AUTOS, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_METH_LAB, - SIMPLE_INTERIOR_ARCADE_PALETO_BAY, - SIMPLE_INTERIOR_ARCADE_GRAPESEED, - SIMPLE_INTERIOR_ARCADE_DAVIS, - SIMPLE_INTERIOR_ARCADE_WEST_VINEWOOD, - SIMPLE_INTERIOR_ARCADE_ROCKFORD_HILLS, - SIMPLE_INTERIOR_ARCADE_LA_MESA, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FIB_BUILDING, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BIOLAB_AND_TUNNEL, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FOUNDRY, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MAX_RENDA, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_2, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_3, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_4, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_5, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_6, - SIMPLE_INTERIOR_RESTRICTED_INTERIOR_OMEGA, - SIMPLE_INTERIOR_SOLOMONS_OFFICE, - SIMPLE_INTERIOR_CASINO_NIGHTCLUB, - SIMPLE_INTERIOR_SUBMARINE, - SIMPLE_INTERIOR_MUSIC_STUDIO, - SIMPLE_INTERIOR_AUTO_SHOP_LA_MESA, - SIMPLE_INTERIOR_AUTO_SHOP_STRAWBERRY, - SIMPLE_INTERIOR_AUTO_SHOP_BURTON, - SIMPLE_INTERIOR_AUTO_SHOP_RANCHO, - SIMPLE_INTERIOR_AUTO_SHOP_MISSION_ROW, - SIMPLE_INTERIOR_CAR_MEET, - SIMPLE_INTERIOR_FIXER_HQ_HAWICK, - SIMPLE_INTERIOR_FIXER_HQ_ROCKFORD, - SIMPLE_INTERIOR_FIXER_HQ_SEOUL, - SIMPLE_INTERIOR_FIXER_HQ_VESPUCCI, - SIMPLE_INTERIOR_ACID_LAB, - SIMPLE_INTERIOR_JUGGALO_HIDEOUT, - SIMPLE_INTERIOR_MULTISTOREY_GARAGE + SIMPLE_INTERIOR_INVALID = -1, + SIMPLE_INTERIOR_WAREHOUSE_1, + SIMPLE_INTERIOR_WAREHOUSE_2, + SIMPLE_INTERIOR_WAREHOUSE_3, + SIMPLE_INTERIOR_WAREHOUSE_4, + SIMPLE_INTERIOR_WAREHOUSE_5, + SIMPLE_INTERIOR_WAREHOUSE_6, + SIMPLE_INTERIOR_WAREHOUSE_7, + SIMPLE_INTERIOR_WAREHOUSE_8, + SIMPLE_INTERIOR_WAREHOUSE_9, + SIMPLE_INTERIOR_WAREHOUSE_10, + SIMPLE_INTERIOR_WAREHOUSE_11, + SIMPLE_INTERIOR_WAREHOUSE_12, + SIMPLE_INTERIOR_WAREHOUSE_13, + SIMPLE_INTERIOR_WAREHOUSE_14, + SIMPLE_INTERIOR_WAREHOUSE_15, + SIMPLE_INTERIOR_WAREHOUSE_16, + SIMPLE_INTERIOR_WAREHOUSE_17, + SIMPLE_INTERIOR_WAREHOUSE_18, + SIMPLE_INTERIOR_WAREHOUSE_19, + SIMPLE_INTERIOR_WAREHOUSE_20, + SIMPLE_INTERIOR_WAREHOUSE_21, + SIMPLE_INTERIOR_WAREHOUSE_22, + SIMPLE_INTERIOR_FACTORY_METH_1, + SIMPLE_INTERIOR_FACTORY_WEED_1, + SIMPLE_INTERIOR_FACTORY_CRACK_1, + SIMPLE_INTERIOR_FACTORY_MONEY_1, + SIMPLE_INTERIOR_FACTORY_DOCUMENTS_1, + SIMPLE_INTERIOR_FACTORY_METH_2, + SIMPLE_INTERIOR_FACTORY_WEED_2, + SIMPLE_INTERIOR_FACTORY_CRACK_2, + SIMPLE_INTERIOR_FACTORY_MONEY_2, + SIMPLE_INTERIOR_FACTORY_DOCUMENTS_2, + SIMPLE_INTERIOR_FACTORY_METH_3, + SIMPLE_INTERIOR_FACTORY_WEED_3, + SIMPLE_INTERIOR_FACTORY_CRACK_3, + SIMPLE_INTERIOR_FACTORY_MONEY_3, + SIMPLE_INTERIOR_FACTORY_DOCUMENTS_3, + SIMPLE_INTERIOR_FACTORY_METH_4, + SIMPLE_INTERIOR_FACTORY_WEED_4, + SIMPLE_INTERIOR_FACTORY_CRACK_4, + SIMPLE_INTERIOR_FACTORY_MONEY_4, + SIMPLE_INTERIOR_FACTORY_DOCUMENTS_4, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_POLICE_STATION, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MC_CLUBHOUSE, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_ROCKFORD, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_PILLBOX, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_ALTA, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_BURTON, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_PALETO, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_GRAND_SENORA, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_CHUMASH, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_ROCKCLUB, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_2, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_3, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_4, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FARMHOUSE, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_HEIST_YACHT, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_RECYCLING_PLANT, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BIOLAB, + SIMPLE_INTERIOR_IE_WAREHOUSE_1, + SIMPLE_INTERIOR_IE_WAREHOUSE_2, + SIMPLE_INTERIOR_IE_WAREHOUSE_3, + SIMPLE_INTERIOR_IE_WAREHOUSE_4, + SIMPLE_INTERIOR_IE_WAREHOUSE_5, + SIMPLE_INTERIOR_IE_WAREHOUSE_6, + SIMPLE_INTERIOR_IE_WAREHOUSE_7, + SIMPLE_INTERIOR_IE_WAREHOUSE_8, + SIMPLE_INTERIOR_IE_WAREHOUSE_9, + SIMPLE_INTERIOR_IE_WAREHOUSE_10, + SIMPLE_INTERIOR_BUNKER_1, + SIMPLE_INTERIOR_BUNKER_2, + SIMPLE_INTERIOR_BUNKER_3, + SIMPLE_INTERIOR_BUNKER_4, + SIMPLE_INTERIOR_BUNKER_5, + SIMPLE_INTERIOR_BUNKER_6, + SIMPLE_INTERIOR_BUNKER_7, + SIMPLE_INTERIOR_BUNKER_9, + SIMPLE_INTERIOR_BUNKER_10, + SIMPLE_INTERIOR_BUNKER_11, + SIMPLE_INTERIOR_BUNKER_12, + SIMPLE_INTERIOR_ARMORY_TRUCK_1, + SIMPLE_INTERIOR_CREATOR_TRAILER_1, + SIMPLE_INTERIOR_HANGAR_1, + SIMPLE_INTERIOR_HANGAR_2, + SIMPLE_INTERIOR_HANGAR_3, + SIMPLE_INTERIOR_HANGAR_4, + SIMPLE_INTERIOR_HANGAR_5, + SIMPLE_INTERIOR_ARMORY_AIRCRAFT_1, + SIMPLE_INTERIOR_DEFUNCT_BASE_1, + SIMPLE_INTERIOR_DEFUNCT_BASE_2, + SIMPLE_INTERIOR_DEFUNCT_BASE_3, + SIMPLE_INTERIOR_DEFUNCT_BASE_4, + SIMPLE_INTERIOR_DEFUNCT_BASE_6, + SIMPLE_INTERIOR_DEFUNCT_BASE_7, + SIMPLE_INTERIOR_DEFUNCT_BASE_8, + SIMPLE_INTERIOR_DEFUNCT_BASE_9, + SIMPLE_INTERIOR_DEFUNCT_BASE_10, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MEDIUM_GARAGE, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_LOWEND_STUDIO, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MIDEND_APARTMENT, + SIMPLE_INTERIOR_CREATOR_AIRCRAFT_1, + SIMPLE_INTERIOR_HUB_LA_MESA, + SIMPLE_INTERIOR_HUB_MISSION_ROW, + SIMPLE_INTERIOR_HUB_STRAWBERRY_WAREHOUSE, + SIMPLE_INTERIOR_HUB_WEST_VINEWOOD, + SIMPLE_INTERIOR_HUB_CYPRESS_FLATS, + SIMPLE_INTERIOR_HUB_LSIA_WAREHOUSE, + SIMPLE_INTERIOR_HUB_ELYSIAN_ISLAND, + SIMPLE_INTERIOR_HUB_DOWNTOWN_VINEWOOD, + SIMPLE_INTERIOR_HUB_DEL_PERRO_BUILDING, + SIMPLE_INTERIOR_HUB_VESPUCCI_CANALS, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SHERIFF, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SHERIFF2, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_UNION_DEPOSITORY_CARPARK, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SIMEON_SHOWROOM, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_ABATTOIR, + SIMPLE_INTERIOR_HACKER_TRUCK, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_JEWEL_STORE, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_LIFE_INVADER, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_DJ_YACHT, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MELANOMA_GARAGE, + SIMPLE_INTERIOR_ARENA_GARAGE_1, + SIMPLE_INTERIOR_CASINO, + SIMPLE_INTERIOR_CASINO_APT, + SIMPLE_INTERIOR_CASINO_VAL_GARAGE, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_HAYES_AUTOS, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_METH_LAB, + SIMPLE_INTERIOR_ARCADE_PALETO_BAY, + SIMPLE_INTERIOR_ARCADE_GRAPESEED, + SIMPLE_INTERIOR_ARCADE_DAVIS, + SIMPLE_INTERIOR_ARCADE_WEST_VINEWOOD, + SIMPLE_INTERIOR_ARCADE_ROCKFORD_HILLS, + SIMPLE_INTERIOR_ARCADE_LA_MESA, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FIB_BUILDING, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BIOLAB_AND_TUNNEL, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FOUNDRY, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MAX_RENDA, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_2, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_3, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_4, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_5, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_6, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_OMEGA, + SIMPLE_INTERIOR_SOLOMONS_OFFICE, + SIMPLE_INTERIOR_CASINO_NIGHTCLUB, + SIMPLE_INTERIOR_SUBMARINE, + SIMPLE_INTERIOR_MUSIC_STUDIO, + SIMPLE_INTERIOR_AUTO_SHOP_LA_MESA, + SIMPLE_INTERIOR_AUTO_SHOP_STRAWBERRY, + SIMPLE_INTERIOR_AUTO_SHOP_BURTON, + SIMPLE_INTERIOR_AUTO_SHOP_RANCHO, + SIMPLE_INTERIOR_AUTO_SHOP_MISSION_ROW, + SIMPLE_INTERIOR_CAR_MEET, + SIMPLE_INTERIOR_FIXER_HQ_HAWICK, + SIMPLE_INTERIOR_FIXER_HQ_ROCKFORD, + SIMPLE_INTERIOR_FIXER_HQ_SEOUL, + SIMPLE_INTERIOR_FIXER_HQ_VESPUCCI, + SIMPLE_INTERIOR_ACID_LAB, + SIMPLE_INTERIOR_JUGGALO_HIDEOUT, + SIMPLE_INTERIOR_MULTISTOREY_GARAGE }; struct JOB_STATS { - SCR_INT Wins; - SCR_INT Losses; - SCR_INT Kills; - SCR_INT Deaths; - SCR_INT PAD_0004; // unused + SCR_INT Wins; + SCR_INT Losses; + SCR_INT Kills; + SCR_INT Deaths; + SCR_INT PAD_0004; // unused }; struct JOB_BET { - SCR_INT PAD_0000; // TODO - SCR_INT Amount; + SCR_INT PAD_0000; // TODO + SCR_INT Amount; }; struct MISSION_BETS { - SCR_INT Identifier; // a random integer between 100 and 10000000 - JOB_STATS Stats; - SCR_ARRAY PlacedBets; - SCR_BOOL CancelBetting; + SCR_INT Identifier; // a random integer between 100 and 10000000 + JOB_STATS Stats; + SCR_ARRAY PlacedBets; + SCR_BOOL CancelBetting; }; static_assert(sizeof(MISSION_BETS) == 72 * 8); struct PLAYER_BLIP { - SCR_INT PAD_0000; - SCR_INT NumPassengersInVehicle; - SCR_BITSET BlipFlags; - alignas(8) eBlipType PlayerVehicleBlipType; // can be used to spoof your blip as a tank, oppressor etc - SCR_INT IdleDurationUntilBlipIsVisible; - SCR_INT BlipVisibleDuration; - SCR_INT MissionInteriorIndex; // can be used to spoof blip position - SCR_VEC3 MissionInteriorBlipLocation; - SCR_FLOAT MissionInteriorBlipRotation; - SCR_BOOL UnknownOverride; // can also be used to spoof position - SCR_VEC3 UnknownOverridePosition; + SCR_INT PAD_0000; + SCR_INT NumPassengersInVehicle; + SCR_BITSET BlipFlags; + alignas(8) eBlipType PlayerVehicleBlipType; // can be used to spoof your blip as a tank, oppressor etc + SCR_INT IdleDurationUntilBlipIsVisible; + SCR_INT BlipVisibleDuration; + SCR_INT MissionInteriorIndex; // can be used to spoof blip position + SCR_VEC3 MissionInteriorBlipLocation; + SCR_FLOAT MissionInteriorBlipRotation; + SCR_BOOL UnknownOverride; // can also be used to spoof position + SCR_VEC3 UnknownOverridePosition; }; static_assert(sizeof(PLAYER_BLIP) == 15 * 8); struct YACHT_APPEARANCE { - SCR_INT PAD_0000; // TODO - SCR_INT PAD_0001; - SCR_INT PAD_0002; - SCR_INT PAD_0003; - SCR_INT PAD_0004; - TEXT_LABEL_63 Name; - SCR_HASH NameHash; + SCR_INT PAD_0000; // TODO + SCR_INT PAD_0001; + SCR_INT PAD_0002; + SCR_INT PAD_0003; + SCR_INT PAD_0004; + TEXT_LABEL_63 Name; + SCR_HASH NameHash; }; static_assert(sizeof(YACHT_APPEARANCE) == 22 * 8); struct YACHT_DATA { - SCR_BOOL HasYacht; - SCR_VEC3 Position; - SCR_INT TravelStage; - SCR_BOOL TravelInProgress; - SCR_ARRAY VehicleNetIds; // the heli and the boats that spawn near the yacht - SCR_INT YachtIndexPlayerIsIn; // owned or unowned - SCR_INT UnkYachtIndex; // TODO - SCR_INT YachtIndexPlayerIsInCouldBeDriving; - SCR_ARRAY NearbyYachts; - SCR_INT ClosestYachtIndex; - SCR_INT TurbulenceState; // controls random camera shakes when on a yacht - SCR_INT DefenseSetting; - YACHT_APPEARANCE Appearance; - SCR_BOOL RemoveClothingWhileInHotTub; - SCR_HASH MissionYachtOwnerHandleHash; // always -1 or NETWORK::NETWORK_HASH_FROM_PLAYER_HANDLE(PLAYER::PLAYER_ID()) - SCR_BOOL SpawnAccess; // "spawn access"? - SCR_INT MissionYachtIndex; + SCR_BOOL HasYacht; + SCR_VEC3 Position; + SCR_INT TravelStage; + SCR_BOOL TravelInProgress; + SCR_ARRAY VehicleNetIds; // the heli and the boats that spawn near the yacht + SCR_INT YachtIndexPlayerIsIn; // owned or unowned + SCR_INT UnkYachtIndex; // TODO + SCR_INT YachtIndexPlayerIsInCouldBeDriving; + SCR_ARRAY NearbyYachts; + SCR_INT ClosestYachtIndex; + SCR_INT TurbulenceState; // controls random camera shakes when on a yacht + SCR_INT DefenseSetting; + YACHT_APPEARANCE Appearance; + SCR_BOOL RemoveClothingWhileInHotTub; + SCR_HASH MissionYachtOwnerHandleHash; // always -1 or NETWORK::NETWORK_HASH_FROM_PLAYER_HANDLE(PLAYER::PLAYER_ID()) + SCR_BOOL SpawnAccess; // "spawn access"? + SCR_INT MissionYachtIndex; }; static_assert(sizeof(YACHT_DATA) == 49 * 8); struct SMPL_INTERIOR_DATA { - SCR_INT Flags; // TODO!!! - SCR_INT Flags2; - SCR_INT Flags3; - SCR_INT Flags4; - SCR_INT Flags5; - SCR_INT Flags6; - SCR_INT Flags7; - alignas(8) eSimpleInteriorIndex Index; - SCR_INT InstanceId; - SCR_INT AllowedGoons; - PLAYER_INDEX Owner; - PLAYER_INDEX VehicleOwner; - SCR_VEC3 SpecialVehicleSpawnPosition; - SCR_FLOAT SpecialVehicleSpawnHeading; - SCR_INT EnteringSimpleInteriorIndex; - SCR_INT SpecialVehicleSimpleInteriorIndex; // MOC, Terrorbyte etc - alignas(8) eSimpleInteriorIndex UnkSimpleInteriorIndex; - alignas(8) eSimpleInteriorIndex UnkSimpleInteriorIndex2; - SCR_VEC3 AvengerPosition; - SCR_VEC3 AvengerPosition2; // not sure how this is different from the field above - SCR_FLOAT AvengerHeading; - SCR_INT MissionSpawnSimpleInteriorIndex; - SCR_INT InteriorSubtype; // nightclub vs nightclub garage etc + SCR_INT Flags; // TODO!!! + SCR_INT Flags2; + SCR_INT Flags3; + SCR_INT Flags4; + SCR_INT Flags5; + SCR_INT Flags6; + SCR_INT Flags7; + alignas(8) eSimpleInteriorIndex Index; + SCR_INT InstanceId; + SCR_INT AllowedGoons; + PLAYER_INDEX Owner; + PLAYER_INDEX VehicleOwner; + SCR_VEC3 SpecialVehicleSpawnPosition; + SCR_FLOAT SpecialVehicleSpawnHeading; + SCR_INT EnteringSimpleInteriorIndex; + SCR_INT SpecialVehicleSimpleInteriorIndex; // MOC, Terrorbyte etc + alignas(8) eSimpleInteriorIndex UnkSimpleInteriorIndex; + alignas(8) eSimpleInteriorIndex UnkSimpleInteriorIndex2; + SCR_VEC3 AvengerPosition; + SCR_VEC3 AvengerPosition2; // not sure how this is different from the field above + SCR_FLOAT AvengerHeading; + SCR_INT MissionSpawnSimpleInteriorIndex; + SCR_INT InteriorSubtype; // nightclub vs nightclub garage etc }; static_assert(sizeof(SMPL_INTERIOR_DATA) == 29 * 8); // yes there's a struct for leaving your clubhouse struct LEAVE_CLUBHOUSE { - SCR_BOOL Active; - SCR_BOOL Active2; - SCR_INT Identifier; - SCR_INT ExitLocation; - SCR_ARRAY ParticipantHashes; + SCR_BOOL Active; + SCR_BOOL Active2; + SCR_INT Identifier; + SCR_INT ExitLocation; + SCR_ARRAY ParticipantHashes; }; static_assert(sizeof(LEAVE_CLUBHOUSE) == 37 * 8); struct ARCADE_GAME { - SCR_BITSET Bits; - SCR_INT CabinetIndex; - SCR_INT PAD_0002; // The only valid value is 0 so idk - SCR_INT CabinetGame; // TODO - SCR_INT GameStage; + SCR_BITSET Bits; + SCR_INT CabinetIndex; + SCR_INT PAD_0002; // The only valid value is 0 so idk + SCR_INT CabinetGame; // TODO + SCR_INT GameStage; }; static_assert(sizeof(ARCADE_GAME) == 5 * 8); struct GlobalPlayerBDEntry { - alignas(8) eFreemodeState FreemodeState; - MP_SCRIPT_DATA CurrentScript; - uint64_t PAD_0022[11]; // unused - SCR_INT PlayersVisible; - SCR_INT PlayersTracked; - SCR_BITSET AnimationBitset; - SCR_INT NumSuccessfulHoldups; // resets every 12 minutes - SCR_INT PAD_0037; - NETWORK_INDEX PersonalVehicleNetId; - NETWORK_INDEX UnkVehicleNetId; - NETWORK_INDEX UnkVehicleNetId2; - SCR_ARRAY UnkVehicleNetIds; - NETWORK_INDEX DeliveryMechanicNetId; - NETWORK_INDEX DeliveryMechanicNetId2; - SCR_INT SpawningVehicleLiveryIndex; - SCR_INT SpawningVehiclePrimaryColor; - SCR_INT SpawningVehicleSecondaryColor; - NETWORK_INDEX AvengerNetId; - NETWORK_INDEX DeliveryMechanicNetId3; // wtf is this? - NETWORK_INDEX TerrorbyteNetId; // or is it the MOC? - NETWORK_INDEX SubmarineNetId; - NETWORK_INDEX DinghyNetId; - NETWORK_INDEX DeliveryMechanicNetId4; // another one... - NETWORK_INDEX AcidLabNetId; - NETWORK_INDEX DeliveryBikeNetId; - SCR_BOOL PAD_0057; - uint64_t PAD_0058[15]; // confirmed these are not used by PC scripts - PLAYER_BLIP PlayerBlip; - SCR_BOOL NeedToPopulateSessionStartTime; // the session start time is unused - uint64_t PAD_0089[32]; // TODO - alignas(8) eMissionType MissionType; - SCR_BOOL SpawningVehicle; - uint64_t PAD_0123[3]; // confirmed these are not used by PC scripts - MISSION_BETS MissionBets; - SCR_BOOL RadarBlipVisibliltyMechanicEnabled; - SCR_BITSET PlayerStateFlags; - SCR_INT PlayerStateFlags2; // TODO - SCR_INT PlayerStateFlags3; // TODO - SCR_INT CarMeetModShopSlotPreTakeover; - PLAYER_INDEX CurrentCarMeetSlotOwnerIndex; // can be player or player's CEO/MC leader - SCR_INT CarMeetModShopSlotPostTakeover; - SCR_HASH CarMeetModdingVehicleModel; - PLAYER_INDEX CarMeetCurrentlySeatedVehicleOwner; - SCR_VEC3 PlayerPosition; // updates every two seconds, used by spectate - SCR_BOOL OffRadarActive; - SCR_BOOL PassengerOfVehicleWithOffRadarDriver; - SCR_BOOL GoonOfBossWithOffRadar; - SCR_BOOL RevealPlayersActive; - PLAYER_INDEX RemoteWantedLevelPlayer; // cut content but still works - SCR_INT RemoteWantedLevelAmount; - PLAYER_INDEX RemoteWantedLevelRemovePlayer; // doesn't work at all - SCR_INT UnkTeleportStage; - SCR_BITSET ActivityFlags; - SCR_INT NumReservedMissionPeds; - SCR_INT NumReservedMissionVehicles; - SCR_INT NumReservedMissionObjects; - SCR_INT TransitionSessionState; // TODO reverse enum - SCR_VEC3 TransitionReturningPosition; // TODO - TEXT_LABEL_23 TransitionContentIDToLaunch; - SCR_INT RespawnState; - SCR_INT LastRespawnTime; - SCR_BOOL CollisionLoaded; - SCR_BOOL CommitingSuicide; - SCR_BOOL RespawningInVehicleAsDriver; - SCR_BOOL RespawningInVehicle; - SCR_BOOL PAD_0238; // this value is set but not read at all by any PC scripts - SCR_BITSET GamerTagFlags; - SCR_BOOL IsMale; - SCR_INT ArmwrestlingLocationFlags; - SCR_INT PAD_0242; // TODO - SCR_BOOL GamerTagShowArrow; - SCR_BOOL CarWashInProgress; - INTERIOR_INDEX CurrentInteriorIndex; - SCR_INT CurrentShopIndex; // things like clothing and tattoo stores - SCR_INT CurrentStoreIndex; // the stores in the map which can be held up - SCR_BOOL ShopActive; // any shop - SCR_BOOL InTaxi; - SCR_INT Haircut; - SCR_INT PrimaryHairColor; - SCR_INT SecondaryHairColor; - SCR_INT FriendlyPlayers; // bitset of player team relgroups that obtain a Respect relationship with player - SCR_BOOL IsInvisible; - SCR_BOOL InImpromptuDeathmatch; - SCR_VEC3 ImpromptuDeatmatchStartPosition; - SCR_INT PAD_0569; // not read by scripts, impromptu DM related - SCR_INT MissionLoseAnimType; - SCR_INT MissionWinAnimType; // verify - SCR_INT MissionCrewAnimType; - SCR_INT RallyRaceAnim; - SCR_BOOL IsRallyRace; - SCR_BOOL JustGetsPulledOutWhenElectrocuted; - SCR_INT HeistCutSelectionStage; // the only valid values seem to be 6 and 7 - SCR_BOOL IsBadsport; - SCR_FLOAT MentalState; - SCR_BOOL IsRockstarDev; // dev dlc check and not the CNetGamePlayer flag so can be used to detect YimMenu - SCR_BOOL ScreenFadedOut; - SCR_BOOL TimeTrialActive; - YACHT_DATA YachtData; - SMPL_INTERIOR_DATA SimpleInteriorData; - SCR_BOOL PAD_0350; // TODO - SCR_INT PAD_0351; // unused vehicle/interior stuff - SCR_BOOL ShowMOCBlip; - SCR_BOOL ShowAvengerBlip; - SCR_BOOL ShowTerrorbyteBlip; - SCR_BOOL ShowSubmarineBlip; - SCR_BOOL ShowDinghyBlip; - SCR_BOOL ShowDeliveryBikeBlip; - SCR_BOOL ShowAcidLabBlip; - LEAVE_CLUBHOUSE LeaveClubhouse; - SCR_INT Friends; // bitset of players that are friends - SCR_VEC3 InteriorVehiclePosition; // for terrorbyte and MOC, used to fake player blip position on map - SCR_FLOAT InteriorVehicleHeading; - SCR_VEC3 AcidLabPosition; // not read by the scripts - SCR_FLOAT AcidLabHeading; - SCR_INT VehicleTurretsActive; // bitset - SCR_ARRAY VehicleTurretsCameraPosition; - SCR_INT PAD_0416; // TODO - SCR_BOOL DozerDetected; // very shady stuff, anticheat? - SCR_ARRAY MissionTurretParticipants; - SCR_INT PAD_0425; // some seat index - SCR_INT MissionTurretSlot; - SCR_BITSET OrbitalBitset; - SCR_BOOL FacilityIntroCutsceneInProgress; - SCR_BOOL FacilityIntroCutsceneStarted; // like above but is enabled 2 stages earlier - SCR_BOOL PAD_0430; // todo - SCR_BOOL BeingSolicitedByProstitute; // why tf is this used by the orbital cannon? - SCR_VEC3 DronePosition; // updates every second - SCR_FLOAT DroneHeading; - SCR_INT OrbitalBitset2; // ugh - SCR_INT CurrentlyUsingArenaTrapIndex; - SCR_INT CurrentlyUsingArenaTrapActivatedTime; - ARCADE_GAME ArcadeGame; - SCR_INT DancePartner; - SCR_INT CayoPericoFlags; - SCR_INT BeachPartyFlags; - uint64_t PAD_0477[10]; // I don't think we'll ever be able to figure out what this does - SCR_INT ThreeCardPokerStyle; - SCR_INT BlackjackStyle; - SCR_BITSET OutOfSightFlags; - SCR_VEC3 OutOfSightArea; - SCR_INT AmmunationWeaponPartFlags; - PLAYER_INDEX LastKilledBy; - SCR_BOOL CanSpawnGunVan; + alignas(8) eFreemodeState FreemodeState; + MP_SCRIPT_DATA CurrentScript; + uint64_t PAD_0022[11]; // unused + SCR_INT PlayersVisible; + SCR_INT PlayersTracked; + SCR_BITSET AnimationBitset; + SCR_INT NumSuccessfulHoldups; // resets every 12 minutes + SCR_INT PAD_0037; + NETWORK_INDEX PersonalVehicleNetId; + NETWORK_INDEX UnkVehicleNetId; + NETWORK_INDEX UnkVehicleNetId2; + SCR_ARRAY UnkVehicleNetIds; + NETWORK_INDEX DeliveryMechanicNetId; + NETWORK_INDEX DeliveryMechanicNetId2; + SCR_INT SpawningVehicleLiveryIndex; + SCR_INT SpawningVehiclePrimaryColor; + SCR_INT SpawningVehicleSecondaryColor; + NETWORK_INDEX AvengerNetId; + NETWORK_INDEX DeliveryMechanicNetId3; // wtf is this? + NETWORK_INDEX TerrorbyteNetId; // or is it the MOC? + NETWORK_INDEX SubmarineNetId; + NETWORK_INDEX DinghyNetId; + NETWORK_INDEX DeliveryMechanicNetId4; // another one... + NETWORK_INDEX AcidLabNetId; + NETWORK_INDEX DeliveryBikeNetId; + SCR_BOOL PAD_0057; + uint64_t PAD_0058[15]; // confirmed these are not used by PC scripts + PLAYER_BLIP PlayerBlip; + SCR_BOOL NeedToPopulateSessionStartTime; // the session start time is unused + uint64_t PAD_0089[32]; // TODO + alignas(8) eMissionType MissionType; + SCR_BOOL SpawningVehicle; + uint64_t PAD_0123[3]; // confirmed these are not used by PC scripts + MISSION_BETS MissionBets; + SCR_BOOL RadarBlipVisibliltyMechanicEnabled; + SCR_BITSET PlayerStateFlags; + SCR_INT PlayerStateFlags2; // TODO + SCR_INT PlayerStateFlags3; // TODO + SCR_INT CarMeetModShopSlotPreTakeover; + PLAYER_INDEX CurrentCarMeetSlotOwnerIndex; // can be player or player's CEO/MC leader + SCR_INT CarMeetModShopSlotPostTakeover; + SCR_HASH CarMeetModdingVehicleModel; + PLAYER_INDEX CarMeetCurrentlySeatedVehicleOwner; + SCR_VEC3 PlayerPosition; // updates every two seconds, used by spectate + SCR_BOOL OffRadarActive; + SCR_BOOL PassengerOfVehicleWithOffRadarDriver; + SCR_BOOL GoonOfBossWithOffRadar; + SCR_BOOL RevealPlayersActive; + PLAYER_INDEX RemoteWantedLevelPlayer; // cut content but still works + SCR_INT RemoteWantedLevelAmount; + PLAYER_INDEX RemoteWantedLevelRemovePlayer; // doesn't work at all + SCR_INT UnkTeleportStage; + SCR_BITSET ActivityFlags; + SCR_INT NumReservedMissionPeds; + SCR_INT NumReservedMissionVehicles; + SCR_INT NumReservedMissionObjects; + SCR_INT TransitionSessionState; // TODO reverse enum + SCR_VEC3 TransitionReturningPosition; // TODO + TEXT_LABEL_23 TransitionContentIDToLaunch; + SCR_INT RespawnState; + SCR_INT LastRespawnTime; + SCR_BOOL CollisionLoaded; + SCR_BOOL CommitingSuicide; + SCR_BOOL RespawningInVehicleAsDriver; + SCR_BOOL RespawningInVehicle; + SCR_BOOL PAD_0238; // this value is set but not read at all by any PC scripts + SCR_BITSET GamerTagFlags; + SCR_BOOL IsMale; + SCR_INT ArmwrestlingLocationFlags; + SCR_INT PAD_0242; // TODO + SCR_BOOL GamerTagShowArrow; + SCR_BOOL CarWashInProgress; + INTERIOR_INDEX CurrentInteriorIndex; + SCR_INT CurrentShopIndex; // things like clothing and tattoo stores + SCR_INT CurrentStoreIndex; // the stores in the map which can be held up + SCR_BOOL ShopActive; // any shop + SCR_BOOL InTaxi; + SCR_INT Haircut; // @250 as of 1.67 + SCR_INT PrimaryHairColor; + SCR_INT SecondaryHairColor; + SCR_INT FriendlyPlayers; // bitset of player team relgroups that obtain a Respect relationship with player + SCR_BOOL IsInvisible; + SCR_BOOL InImpromptuDeathmatch; + SCR_VEC3 ImpromptuDeatmatchStartPosition; + SCR_INT PAD_0569; // not read by scripts, impromptu DM related + SCR_INT MissionLoseAnimType; + SCR_INT MissionWinAnimType; // verify + SCR_INT MissionCrewAnimType; + SCR_INT RallyRaceAnim; + SCR_BOOL IsRallyRace; + SCR_BOOL JustGetsPulledOutWhenElectrocuted; + SCR_INT HeistCutSelectionStage; // the only valid values seem to be 6 and 7 + SCR_BOOL IsBadsport; + SCR_FLOAT MentalState; + SCR_BOOL IsRockstarDev; // dev dlc check and not the CNetGamePlayer flag so can be used to detect YimMenu + SCR_BOOL ScreenFadedOut; + SCR_BOOL TimeTrialActive; + YACHT_DATA YachtData; + SMPL_INTERIOR_DATA SimpleInteriorData; + SCR_BOOL PAD_0350; // TODO + SCR_INT PAD_0351; // unused vehicle/interior stuff + SCR_INT BlipShownBitset; + LEAVE_CLUBHOUSE LeaveClubhouse; // @353 as of 1.67 + SCR_INT Friends; // bitset of players that are friends + SCR_VEC3 InteriorVehiclePosition; // for terrorbyte and MOC, used to fake player blip position on map + SCR_FLOAT InteriorVehicleHeading; + SCR_VEC3 AcidLabPosition; // not read by the scripts + SCR_FLOAT AcidLabHeading; + SCR_INT VehicleTurretsActive; // bitset + SCR_ARRAY VehicleTurretsCameraPosition; // 3->4 in 1.67 + SCR_INT PAD_0416; // TODO + SCR_BOOL DozerDetected; // very shady stuff, anticheat? @414 as of 1.67 + SCR_ARRAY MissionTurretParticipants; + SCR_INT PAD_0425; // some seat index + SCR_INT MissionTurretSlot; + SCR_BITSET OrbitalBitset; + SCR_BOOL FacilityIntroCutsceneInProgress; + SCR_BOOL FacilityIntroCutsceneStarted; // like above but is enabled 2 stages earlier + SCR_BOOL PAD_0430; // todo + SCR_BOOL BeingSolicitedByProstitute; // why tf is this used by the orbital cannon? + SCR_VEC3 DronePosition; // updates every second + SCR_FLOAT DroneHeading; // @432 as of 1.67 + SCR_INT OrbitalBitset2; // ugh + SCR_INT CurrentlyUsingArenaTrapIndex; + SCR_INT CurrentlyUsingArenaTrapActivatedTime; + ARCADE_GAME ArcadeGame; + SCR_INT DancePartner; + SCR_INT CayoPericoFlags; + SCR_INT BeachPartyFlags; + uint64_t PAD_0477[10]; // I don't think we'll ever be able to figure out what this does + SCR_INT ThreeCardPokerStyle; + SCR_INT BlackjackStyle; + SCR_BITSET OutOfSightFlags; + SCR_VEC3 OutOfSightArea; + SCR_INT AmmunationWeaponPartFlags; + PLAYER_INDEX LastKilledBy; // @461 as of 1.67 + SCR_BOOL CanSpawnGunVan; }; -static_assert(sizeof(GlobalPlayerBDEntry) == 466 * 8); + +static_assert(sizeof(GlobalPlayerBDEntry) == 463 * 8); struct GlobalPlayerBD { - SCR_ARRAY Entries; + SCR_ARRAY Entries; }; -static_assert(sizeof(GlobalPlayerBD) == 14913 * 8); \ No newline at end of file +static_assert(sizeof(GlobalPlayerBD) == 14817 * 8); \ No newline at end of file diff --git a/script/globals/g_AMC_playerBD.hpp b/script/globals/g_AMC_playerBD.hpp index 27912ad..4733f50 100644 --- a/script/globals/g_AMC_playerBD.hpp +++ b/script/globals/g_AMC_playerBD.hpp @@ -4,13 +4,13 @@ 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 + 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) == 239 * 8); +static_assert(sizeof(g_AMC_playerBD_Entry) == 242 * 8); struct g_AMC_playerBD { - SCR_ARRAY Entries; + SCR_ARRAY Entries; }; -static_assert(sizeof(g_AMC_playerBD) == 7649 * 8); \ No newline at end of file +static_assert(sizeof(g_AMC_playerBD) == 7745 * 8); \ No newline at end of file diff --git a/script/types.hpp b/script/types.hpp index bd5fa11..34f5971 100644 --- a/script/types.hpp +++ b/script/types.hpp @@ -39,11 +39,11 @@ using Vector3 = rage::scrVector; template struct SCR_TEXT_LABEL { - alignas(8) char Data[SIZE]; + alignas(8) char Data[SIZE]; private: - alignas(8) char _PAD[SIZE]; + alignas(8) char _PAD[SIZE]; public: - operator char* () { return Data; } + operator char* () { return Data; } }; #define TEXT_LABEL_15 SCR_TEXT_LABEL<16> @@ -54,41 +54,41 @@ public: template struct SCR_ARRAY { - SCR_INT Size; - alignas(8) T Data[SIZE]; + SCR_INT Size; + alignas(8) T Data[SIZE]; - T& operator [](int index) - { - return Data[index]; - } + T& operator [](int index) + { + return Data[index]; + } }; template struct SCR_BITSET { - alignas(8) int Value; + alignas(8) int Value; - bool IsSet(T val) - { - return Value & (1 << (int)val); - } + bool IsSet(T val) + { + return Value & (1 << (int)val); + } - void Set(T val) - { - Value |= (1 << (int)val); - } + void Set(T val) + { + Value |= (1 << (int)val); + } - void Clear(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; + SCR_INT R; + SCR_INT G; + SCR_INT B; }; static_assert(sizeof(Color3) == 3 * 8); @@ -96,6 +96,8 @@ static_assert(sizeof(Color3) == 3 * 8); struct GAMER_HANDLE { private: - uint64_t Data[13]; + uint64_t Data[13]; }; -static_assert(sizeof(GAMER_HANDLE) == 13 * 8); \ No newline at end of file +static_assert(sizeof(GAMER_HANDLE) == 13 * 8); + +#define NUM_CONTACTS 80 \ No newline at end of file