From d1e6b3b7b93ffd23312822afe317d8ac26f9a0a4 Mon Sep 17 00:00:00 2001 From: maybegreat48 <96936658+maybegreat48@users.noreply.github.com> Date: Sat, 22 Jul 2023 17:59:25 +0000 Subject: [PATCH] Add some nodes and netConnection stuff (#128) --- classes.cpp | 18 ++ gtav.rcnet | Bin 27739 -> 28436 bytes .../entity/CEntityScriptGameStateDataNode.hpp | 4 +- netsync/nodes/heli/CHeliControlDataNode.hpp | 25 +++ .../nodes/object/CObjectCreationDataNode.hpp | 63 +++--- netsync/nodes/ped/CPedGameStateDataNode.hpp | 134 ++++++------ .../nodes/ped/CPedMovementGroupDataNode.hpp | 24 +++ .../nodes/ped/CPedTaskSequenceDataNode.hpp | 25 +++ netsync/nodes/ped/CPedTaskTreeDataNode.hpp | 26 +++ .../CPhysicalScriptGameStateDataNode.hpp | 36 ++++ .../CPlayerAmbientModelStreamingNode.hpp | 16 ++ netsync/nodes/player/CPlayerGamerDataNode.hpp | 41 ++-- .../nodes/player/CPlayerPedGroupDataNode.hpp | 35 +++ .../player/CPlayerWantedAndLOSDataNode.hpp | 27 +++ .../CVehicleComponentReservationDataNode.hpp | 15 ++ .../nodes/vehicle/CVehicleControlDataNode.hpp | 41 ++++ .../vehicle/CVehicleDamageStatusDataNode.hpp | 32 +++ .../vehicle/CVehicleGameStateDataNode.hpp | 80 +++++++ .../nodes/vehicle/CVehicleHealthDataNode.hpp | 35 +++ .../vehicle/CVehicleSteeringDataNode.hpp | 13 ++ .../nodes/vehicle/CVehicleTaskDataNode.hpp | 14 ++ network/RemoteGamerInfoMsg.hpp | 19 +- network/netConnection.hpp | 202 ++++++++++++++++++ 23 files changed, 786 insertions(+), 139 deletions(-) create mode 100644 netsync/nodes/heli/CHeliControlDataNode.hpp create mode 100644 netsync/nodes/ped/CPedMovementGroupDataNode.hpp create mode 100644 netsync/nodes/ped/CPedTaskSequenceDataNode.hpp create mode 100644 netsync/nodes/ped/CPedTaskTreeDataNode.hpp create mode 100644 netsync/nodes/physical/CPhysicalScriptGameStateDataNode.hpp create mode 100644 netsync/nodes/player/CPlayerAmbientModelStreamingNode.hpp create mode 100644 netsync/nodes/player/CPlayerPedGroupDataNode.hpp create mode 100644 netsync/nodes/player/CPlayerWantedAndLOSDataNode.hpp create mode 100644 netsync/nodes/vehicle/CVehicleComponentReservationDataNode.hpp create mode 100644 netsync/nodes/vehicle/CVehicleControlDataNode.hpp create mode 100644 netsync/nodes/vehicle/CVehicleDamageStatusDataNode.hpp create mode 100644 netsync/nodes/vehicle/CVehicleGameStateDataNode.hpp create mode 100644 netsync/nodes/vehicle/CVehicleHealthDataNode.hpp create mode 100644 netsync/nodes/vehicle/CVehicleSteeringDataNode.hpp create mode 100644 netsync/nodes/vehicle/CVehicleTaskDataNode.hpp create mode 100644 network/netConnection.hpp diff --git a/classes.cpp b/classes.cpp index 4a50ce6..b7b2a3c 100644 --- a/classes.cpp +++ b/classes.cpp @@ -50,6 +50,8 @@ #include "netsync/nodes/entity/CEntityOrientationDataNode.hpp" #include "netsync/nodes/entity/CEntityScriptGameStateDataNode.hpp" #include "netsync/nodes/entity/CEntityScriptInfoDataNode.hpp" +#include "netsync/nodes/heli/CHeliHealthDataNode.hpp" +#include "netsync/nodes/heli/CHeliControlDataNode.hpp" #include "netsync/nodes/object/CObjectCreationDataNode.hpp" #include "netsync/nodes/ped/CPedAIDataNode.hpp" #include "netsync/nodes/ped/CPedAppearanceDataNode.hpp" @@ -60,23 +62,31 @@ #include "netsync/nodes/ped/CPedHealthDataNode.hpp" #include "netsync/nodes/ped/CPedInventoryDataNode.hpp" #include "netsync/nodes/ped/CPedMovementDataNode.hpp" +#include "netsync/nodes/ped/CPedMovementGroupDataNode.hpp" #include "netsync/nodes/ped/CPedOrientationDataNode.hpp" #include "netsync/nodes/ped/CPedScriptCreationDataNode.hpp" +#include "netsync/nodes/ped/CPedTaskSequenceDataNode.hpp" #include "netsync/nodes/ped/CPedTaskSpecificDataNode.hpp" +#include "netsync/nodes/ped/CPedTaskTreeDataNode.hpp" #include "netsync/nodes/physical/CPhysicalAngVelocityDataNode.hpp" #include "netsync/nodes/physical/CPhysicalAttachDataNode.hpp" +#include "netsync/nodes/physical/CPhysicalGameStateDataNode.hpp" #include "netsync/nodes/physical/CPhysicalHealthDataNode.hpp" #include "netsync/nodes/physical/CPhysicalMigrationDataNode.hpp" +#include "netsync/nodes/physical/CPhysicalScriptGameStateDataNode.hpp" #include "netsync/nodes/physical/CPhysicalScriptMigrationDataNode.hpp" #include "netsync/nodes/physical/CPhysicalVelocityDataNode.hpp" #include "netsync/nodes/pickup/CPickupCreationDataNode.hpp" #include "netsync/nodes/pickup_placement/CPickupPlacementCreationDataNode.hpp" +#include "netsync/nodes/player/CPlayerAmbientModelStreamingNode.hpp" #include "netsync/nodes/player/CPlayerAppearanceDataNode.hpp" #include "netsync/nodes/player/CPlayerCameraDataNode.hpp" #include "netsync/nodes/player/CPlayerCreationDataNode.hpp" #include "netsync/nodes/player/CPlayerGamerDataNode.hpp" #include "netsync/nodes/player/CPlayerGameStateDataNode.hpp" +#include "netsync/nodes/player/CPlayerPedGroupDataNode.hpp" #include "netsync/nodes/player/CPlayerSectorPosNode.hpp" +#include "netsync/nodes/player/CPlayerWantedAndLOSDataNode.hpp" #include "netsync/nodes/proximity_migrateable/CGlobalFlagsDataNode.hpp" #include "netsync/nodes/proximity_migrateable/CMigrationDataNode.hpp" #include "netsync/nodes/proximity_migrateable/CSectorDataNode.hpp" @@ -84,8 +94,15 @@ #include "netsync/nodes/task/ClonedTakeOffPedVariationInfo.hpp" #include "netsync/nodes/train/CTrainGameStateDataNode.hpp" #include "netsync/nodes/vehicle/CVehicleCreationDataNode.hpp" +#include "netsync/nodes/vehicle/CVehicleControlDataNode.hpp" +#include "netsync/nodes/vehicle/CVehicleTaskDataNode.hpp" #include "netsync/nodes/vehicle/CVehicleGadgetDataNode.hpp" #include "netsync/nodes/vehicle/CVehicleProximityMigrationDataNode.hpp" +#include "netsync/nodes/vehicle/CVehicleComponentReservationDataNode.hpp" +#include "netsync/nodes/vehicle/CVehicleDamageStatusDataNode.hpp" +#include "netsync/nodes/vehicle/CVehicleSteeringDataNode.hpp" +#include "netsync/nodes/vehicle/CVehicleHealthDataNode.hpp" +#include "netsync/nodes/vehicle/CVehicleGameStateDataNode.hpp" #include "netsync/trees/CDynamicEntitySyncTreeBase.hpp" #include "netsync/trees/CEntitySyncTreeBase.hpp" #include "netsync/trees/CPhysicalSyncTreeBase.hpp" @@ -108,6 +125,7 @@ #include "network/RemoteGamerInfoMsg.hpp" #include "network/snConnectToPeerTask.hpp" #include "network/snSession.hpp" +#include "network/netConnection.hpp" #include "ped/CPed.hpp" #include "ped/CPedBoneInfo.hpp" #include "ped/CPedFactory.hpp" diff --git a/gtav.rcnet b/gtav.rcnet index 6ed4e9f933a6fde8627462b68f006dd8ccab3edc..4861669d92f4d5d3618186db4b9379e087b01778 100644 GIT binary patch literal 28436 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 v588(=$7b%G(7SnzoSE#e7X$;=1pD3R*X6 +#include "netsync/CProjectBaseSyncDataNode.hpp" +#include "netsync/nodes/vehicle/CVehicleControlDataNode.hpp" + +#pragma pack(push, 8) +class CHeliControlDataNode : CVehicleControlDataNode +{ +public: + char m_pad[0x10]; // 0x130 + float m_yaw_control; // 0x140 + float m_pitch_control; // 0x144 + float m_roll_control; // 0x148 + float m_throttle_control; // 0x14C + bool m_engine_off; // 0x150 + int m_landing_gear_state; // 0x154 + bool m_has_landing_gear; // 0x158 + bool m_has_vehicle_task; // 0x159 + bool m_is_thruster_model; // 0x15A + float m_thruster_side_rcs_throttle; // 0x15C + float m_thruster_throttle; // 0x160 + bool m_unk8; // 0x164 +}; +static_assert(sizeof(CHeliControlDataNode) == 0x168); +#pragma pack(pop) \ No newline at end of file diff --git a/netsync/nodes/object/CObjectCreationDataNode.hpp b/netsync/nodes/object/CObjectCreationDataNode.hpp index 91a3d5d..0058d9f 100644 --- a/netsync/nodes/object/CObjectCreationDataNode.hpp +++ b/netsync/nodes/object/CObjectCreationDataNode.hpp @@ -7,34 +7,39 @@ class CObjectCreationDataNode : CProjectBaseSyncDataNode { public: - uint16_t unk_00C0; //0x00C0 - char pad_0xC2[14]; //0x00C2 - rage::fvector4 m_object_orientation; //0x00D0 - char pad_00E0[30]; //0x00E0 - rage::fvector3 m_object_position; //0x0100 - char pad_010C[4]; //0x010C - rage::fvector3 m_dummy_position; //0x010E - char pad_011A[20]; //0x011C - rage::fvector3 m_script_grab_position; //0x0130 - char pad_013C[12]; //0x013C - float m_script_grab_radius; //0x0148 - uint32_t m_created_by; //0x014C - uint32_t m_model; //0x0150 - uint32_t m_frag_group_index; //0x0154 - uint32_t m_ownership_token; //0x0158 - uint32_t unk_015C; //0x015C - bool m_no_reassign; //0x0160 - bool unk_0161; //0x0161 - bool m_player_wants_control; //0x0162 - bool m_has_init_physics; //0x0163 - bool m_script_grabbed_from_world; //0x0164 - bool m_has_frag_group; //0x0165 - bool m_is_broken; //0x0166 - bool m_has_exploded; //0x0167 - bool m_keep_registered; //0x0168 - bool unk_0169; //0x0169 - bool unk_016A; //0x016A - bool unk_016B; //0x016B + uint32_t unk_00C0; //0x00C0 + uint32_t unk_00C4; //0x00C4 + uint32_t unk_00C8; //0x00C8 + bool unk_00CC; + bool unk_00CD; + uint16_t unk_00D0; //0x00D0 + char pad_0xC2[14]; //0x00D2 + rage::fvector4 m_object_orientation; //0x00E0 + char pad_00E0[30]; //0x00F0 + rage::fvector3 m_object_position; //0x0110 + char pad_010C[4]; //0x011C + rage::fvector3 m_dummy_position; //0x011E + char pad_011A[20]; //0x012C + rage::fvector3 m_script_grab_position; //0x0140 + char pad_013C[12]; //0x013C + float m_script_grab_radius; //0x0148 + uint32_t m_created_by; //0x014C + uint32_t m_model; //0x0150 + uint32_t m_frag_group_index; //0x0154 + uint32_t m_ownership_token; //0x0158 + uint32_t unk_015C; //0x015C + bool m_no_reassign; //0x0160 + bool unk_0161; //0x0161 + bool m_player_wants_control; //0x0162 + bool m_has_init_physics; //0x0163 + bool m_script_grabbed_from_world; //0x0164 + bool m_has_frag_group; //0x0165 + bool m_is_broken; //0x0166 + bool m_has_exploded; //0x0167 + bool m_keep_registered; //0x0168 + bool unk_0169; //0x0169 + bool unk_016A; //0x016A + bool unk_016B; //0x016B }; //Size: 0x016C -static_assert(sizeof(CObjectCreationDataNode) == 0x16C); +static_assert(sizeof(CObjectCreationDataNode) == 0x17C); #pragma pack(pop) diff --git a/netsync/nodes/ped/CPedGameStateDataNode.hpp b/netsync/nodes/ped/CPedGameStateDataNode.hpp index 61f9cd3..bd470da 100644 --- a/netsync/nodes/ped/CPedGameStateDataNode.hpp +++ b/netsync/nodes/ped/CPedGameStateDataNode.hpp @@ -6,72 +6,72 @@ class CPedGameStateDataNode : CSyncDataNodeInfrequent { public: - bool m_weapon_component_something[11]; //0x0C0 - uint32_t m_weapon_component_hash[11]; //0x0CC - uint32_t m_gadget_hash[3]; //0x0F8 - uint32_t unk_0104; // 0x0104 - uint32_t unk_0108; // 0x0108 - uint32_t unk_010C; // 0x010C - float unk_0110; // 0x0110 - float unk_0114; // 0x0114 - float unk_0118; // 0x0118 - bool unk_011C; // 0x011C - char pad_011D[3]; //0x011D - uint32_t m_arrest_state; //0x0120 - uint32_t m_death_state; //0x0124 - uint32_t m_weapon_hash; //0x0128 - uint32_t m_num_weapon_components; //0x012C - uint32_t m_num_equiped_gadgets; //0x0130 - uint32_t m_seat; //0x0134 - uint32_t m_action_mode_override; //0x0138 - uint32_t unk_013C; // 0x013C - uint16_t m_vehicle; //0x0140 - uint16_t m_mount_id; //0x0142 - uint16_t m_custodian_id; //0x0144 - uint16_t unk_0146; // 0x0146 - bool m_tint_index; //0x0148 - char pad_0149; //0x0149 - uint8_t unk_014A; // 0x014A - bool m_is_handcuffed; //0x014B - bool m_can_preform_arrest; //0x014C - bool m_can_preform_uncuff; //0x014D - bool m_can_be_arrested; //0x014E - bool m_is_in_custody; //0x014F - char pad_0150; //0x0150 - bool m_weapon_exists; //0x0151 - bool m_weapon_visible; //0x0152 - bool m_weapon_has_ammo; //0x0153 - bool m_weapon_attach_left; //0x0154 - char pad_0155; //0x0155 - bool m_in_seat; //0x0156 - bool m_in_vehicle; //0x0157 - bool m_on_mount; //0x0158 - bool m_has_custodian_or_arrest_flags; //0x0159 - char pad_015A; //0x015A - bool m_action_mode_enabled; //0x015B - bool m_stealth_mode_enabled; //0x015C - bool unk_015D; // 0x015D - bool unk_015E; // 0x015E - bool unk_015F; // 0x015F - bool unk_0160; // 0x0160 - bool unk_0161; // 0x0161 - bool unk_0162; // 0x0162 - bool unk_0163; // 0x0163 - bool unk_0164; // 0x0164 - bool unk_0165; // 0x0165 - bool unk_0166; // 0x0166 - bool unk_0167; // 0x0167 - bool unk_0168; // 0x0168 - bool unk_0169; // 0x0169 - bool unk_016A; // 0x016A - bool unk_016B; // 0x016B - bool unk_016C; // 0x016C - bool unk_016D; // 0x016D - bool unk_016E; // 0x016E - bool unk_016F; // 0x016F - bool unk_0170; // 0x0170 - bool unk_0171; // 0x0171 - bool unk_0172; // 0x0172 + bool m_weapon_component_something[12]; //0x0C0 + uint32_t m_weapon_component_hash[12]; //0x0CC + uint32_t m_gadget_hash[3]; //0x0F8 + uint32_t unk_0104; // 0x0104 + uint32_t unk_0108; // 0x0108 + uint32_t unk_010C; // 0x010C + float unk_0110; // 0x0110 + float unk_0114; // 0x0114 + float unk_0118; // 0x0118 + bool unk_011C; // 0x011C + char pad_011D[3]; //0x011D + uint32_t m_arrest_state; //0x0120 + uint32_t m_death_state; //0x0124 + uint32_t m_weapon_hash; //0x0128 + uint32_t m_num_weapon_components; //0x012C + uint32_t m_num_equiped_gadgets; //0x0130 + uint32_t m_seat; //0x0134 + uint32_t m_action_mode_override; //0x0138 + uint32_t unk_013C; // 0x013C + uint16_t m_vehicle; //0x0140 + uint16_t m_mount_id; //0x0142 + uint16_t m_custodian_id; //0x0144 + uint16_t unk_0146; // 0x0146 + bool m_tint_index; //0x0148 + char pad_0149; //0x0149 + uint8_t unk_014A; // 0x014A + bool m_is_handcuffed; //0x014B + bool m_can_preform_arrest; //0x014C + bool m_can_preform_uncuff; //0x014D + bool m_can_be_arrested; //0x014E + bool m_is_in_custody; //0x014F + char pad_0150; //0x0150 + bool m_weapon_exists; //0x0151 + bool m_weapon_visible; //0x0152 + bool m_weapon_has_ammo; //0x0153 + bool m_weapon_attach_left; //0x0154 + char pad_0155; //0x0155 + bool m_in_seat; //0x0156 + bool m_in_vehicle; //0x0157 + bool m_on_mount; //0x0158 + bool m_has_custodian_or_arrest_flags; //0x0159 + char pad_015A; //0x015A + bool m_action_mode_enabled; //0x015B + bool m_stealth_mode_enabled; //0x015C + bool unk_015D; // 0x015D + bool unk_015E; // 0x015E + bool unk_015F; // 0x015F + bool unk_0160; // 0x0160 + bool unk_0161; // 0x0161 + bool unk_0162; // 0x0162 + bool unk_0163; // 0x0163 + bool unk_0164; // 0x0164 + bool unk_0165; // 0x0165 + bool unk_0166; // 0x0166 + bool unk_0167; // 0x0167 + bool unk_0168; // 0x0168 + bool unk_0169; // 0x0169 + bool unk_016A; // 0x016A + bool unk_016B; // 0x016B + bool unk_016C; // 0x016C + bool unk_016D; // 0x016D + bool unk_016E; // 0x016E + bool unk_016F; // 0x016F + bool unk_0170; // 0x0170 + bool unk_0171; // 0x0171 + bool unk_0172; // 0x0172 }; //Size: 0x0174 -static_assert(sizeof(CPedGameStateDataNode) == 0x174); +static_assert(sizeof(CPedGameStateDataNode) == 0x178); #pragma pack(pop) \ No newline at end of file diff --git a/netsync/nodes/ped/CPedMovementGroupDataNode.hpp b/netsync/nodes/ped/CPedMovementGroupDataNode.hpp new file mode 100644 index 0000000..bf4c90c --- /dev/null +++ b/netsync/nodes/ped/CPedMovementGroupDataNode.hpp @@ -0,0 +1,24 @@ +#pragma once +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push, 4) +class CPedMovementGroupDataNode : CSyncDataNodeFrequent +{ +public: + float m_unk; // 0xC0 (CTaskMotionInAutomobile+0x1EC) + uint32_t m_movement_task_index; // 0xC4 + uint32_t m_movement_task_stage; // 0xC8 + uint32_t m_movement_group; // 0xCC + uint32_t m_overridden_weapon_group; // 0xD0 + uint32_t m_overridden_unk_group; // 0xD4 (SET_PED_ALTERNATE_MOVEMENT_ANIM?) + bool m_is_crouching; // 0xD8 + bool m_is_stealthy; // 0xD9 + bool m_is_strafing; // 0xDA + bool m_is_ragdolling; // 0xDB + bool m_is_ragdoll_constraint_ankle_active;// 0xDC + bool m_is_ragdoll_constraint_wrist_active;// 0xDD + char m_pad1[2]; // 0xDE + char m_tennis_data[0x20]; // 0xE0 TODO +}; +static_assert(sizeof(CPedMovementGroupDataNode) == 0x100); +#pragma pack(pop) diff --git a/netsync/nodes/ped/CPedTaskSequenceDataNode.hpp b/netsync/nodes/ped/CPedTaskSequenceDataNode.hpp new file mode 100644 index 0000000..e7353d8 --- /dev/null +++ b/netsync/nodes/ped/CPedTaskSequenceDataNode.hpp @@ -0,0 +1,25 @@ +#pragma once +#include +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push,4) +class CPedTaskSequenceData +{ +public: + int m_task_type; // 0x00 + int m_task_data_size; // 0x04 + char m_task_data[602]; // 0x08 +}; +static_assert(sizeof(CPedTaskSequenceData) == 0x264); + +class CPedTaskSequenceDataNode : CSyncDataNodeFrequent +{ +public: + bool m_has_sequence; // 0xC0 + int m_sequence_resource_id; // 0xC4 + int m_num_tasks_in_sequence; // 0xC8 + CPedTaskSequenceData m_task_data[10]; // 0xCC + int m_unk; // 0x18B4 +}; +static_assert(sizeof(CPedTaskSequenceDataNode) == 0x18B8); +#pragma pack(pop) \ No newline at end of file diff --git a/netsync/nodes/ped/CPedTaskTreeDataNode.hpp b/netsync/nodes/ped/CPedTaskTreeDataNode.hpp new file mode 100644 index 0000000..f1bf38f --- /dev/null +++ b/netsync/nodes/ped/CPedTaskTreeDataNode.hpp @@ -0,0 +1,26 @@ +#pragma once +#include +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push,4) +class CPedTaskData +{ +public: + int m_task_type; // 0x00 + int m_priority; // 0x04 + int m_tree_depth; // 0x08 + int m_sequence_id; // 0x0C + bool m_active; // 0x10 +}; +static_assert(sizeof(CPedTaskData) == 0x14); + +class CPedTaskTreeDataNode : CSyncDataNodeFrequent +{ +public: + CPedTaskData m_tasks[8]; // 0xC0 + int m_task_bitset; // 0x160 + int m_script_command; // 0x164 + int m_script_command_stage; // 0x168 +}; +static_assert(sizeof(CPedTaskTreeDataNode) == 0x16C); // tree offset != size for this one +#pragma pack(pop) \ No newline at end of file diff --git a/netsync/nodes/physical/CPhysicalScriptGameStateDataNode.hpp b/netsync/nodes/physical/CPhysicalScriptGameStateDataNode.hpp new file mode 100644 index 0000000..43ca261 --- /dev/null +++ b/netsync/nodes/physical/CPhysicalScriptGameStateDataNode.hpp @@ -0,0 +1,36 @@ +#pragma once +#include +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push, 4) +class CPhysicalScriptGameStateDataNode : CSyncDataNodeInfrequent +{ +public: + bool m_godmode; + bool m_dont_load_collision; + bool m_freeze_on_collision_load; + bool m_only_damaged_by_player; + bool m_bullet_proof; + bool m_fire_proof; + bool m_explosion_proof; + bool m_collision_proof; + bool m_melee_proof; + bool m_cannot_be_damaged_by_relationship_group; + bool m_can_only_be_damaged_by_relationship_group; + bool m_smoke_proof; + bool m_steam_proof; + bool m_can_only_be_damaged_by_participants; + bool m_dont_reset_proofs_on_cleanup_mission; + bool m_no_reassign; + bool m_pass_control_in_tutorial; + bool m_visible_in_cutscene; + bool m_visible_in_cutscene_remain_hack; + bool m_pickup_by_cargobob_disabled; + uint32_t m_relationship_group; + uint32_t m_always_cloned_for_players; + bool m_modified_max_speed; + bool m_trigger_damage_event_for_zero_damage; + float m_max_speed; +}; +static_assert(sizeof(CPhysicalScriptGameStateDataNode) == 0xE4); // don't know the actual size of this one +#pragma pack(pop) diff --git a/netsync/nodes/player/CPlayerAmbientModelStreamingNode.hpp b/netsync/nodes/player/CPlayerAmbientModelStreamingNode.hpp new file mode 100644 index 0000000..51ae06a --- /dev/null +++ b/netsync/nodes/player/CPlayerAmbientModelStreamingNode.hpp @@ -0,0 +1,16 @@ +#pragma once +#include +#include "rage/vector.hpp" +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push,4) +class CPlayerAmbientModelStreamingNode : CSyncDataNodeInfrequent +{ +public: + int m_allowed_ped_model_start_offset; // 0xC0 + int m_allowed_vehicle_model_start_offset; // 0xC4 + int m_vehicle_anim_streaming_target_entrypoint; // 0xC8 + int16_t m_vehicle_anim_streaming_target; // 0xCC +}; +static_assert(sizeof(CPlayerAmbientModelStreamingNode) == 0xD0); +#pragma pack(pop) diff --git a/netsync/nodes/player/CPlayerGamerDataNode.hpp b/netsync/nodes/player/CPlayerGamerDataNode.hpp index f0a353d..c1f210a 100644 --- a/netsync/nodes/player/CPlayerGamerDataNode.hpp +++ b/netsync/nodes/player/CPlayerGamerDataNode.hpp @@ -3,31 +3,24 @@ #include "network/ClanData.hpp" #include "netsync/CProjectBaseSyncDataNode.hpp" -#pragma pack(push, 1) +#pragma pack(push, 8) class CPlayerGamerDataNode : CSyncDataNodeInfrequent { public: - ClanData m_clan_data; //0x00C0 - bool m_need_crew_rank_sysflags; //0x0178 - bool m_need_crew_rank_title; //0x0179 - char m_crew_rank_title[25]; //0x017A - bool m_has_started_transition; //0x0193 - bool m_has_transition_info; //0x0194 - char m_transition_info_buffer[125]; //0x0195 - bool m_is_rockstar_dev; //0x0212 - bool m_is_rockstar_qa; //0x0213 - bool m_is_cheater; //0x0214 - char pad_0215[3]; //0x0215 - uint32_t m_matchmaking_group; //0x0218 - bool m_need_mute_data; //0x021C - char pad_021D[3]; //0x021D - int32_t m_mute_count; //0x0220 - int32_t m_mute_talkers_count; //0x0224 - uint32_t unk_0228; //0x0228 - bool m_has_communication_privilege; //0x022C - char pad_022D[3]; //0x022D - int32_t unk_0230; //0x0230 - char pad_0234[620]; //0x0234 -}; //Size: 0x04A0 -static_assert(sizeof(CPlayerGamerDataNode) == 0x4A0); + ClanData m_clan_data; //0x00C0 + bool m_need_crew_rank_sysflags; //0x0178 + bool m_need_crew_rank_title; //0x0179 + char m_crew_rank_title[25]; //0x017A + bool m_has_started_transition; //0x0193 + bool m_has_transition_info; //0x0194 + char m_transition_info_buffer[169]; //0x0195 + int m_player_privilege_flags; //0x0240 + uint32_t m_matchmaking_group; //0x0244 + bool m_need_mute_data; //0x0248 + int32_t m_mute_count; //0x024C + int32_t m_mute_talkers_count; //0x0250 + uint32_t m_unk; //0x0254 + int32_t m_account_id; //0x0258 +}; +static_assert(sizeof(CPlayerGamerDataNode) == 0x260); #pragma pack(pop) \ No newline at end of file diff --git a/netsync/nodes/player/CPlayerPedGroupDataNode.hpp b/netsync/nodes/player/CPlayerPedGroupDataNode.hpp new file mode 100644 index 0000000..2f765ba --- /dev/null +++ b/netsync/nodes/player/CPlayerPedGroupDataNode.hpp @@ -0,0 +1,35 @@ +#pragma once +#include +#include "rage/vector.hpp" +#include "netsync/CProjectBaseSyncDataNode.hpp" +#include "ped/CPed.hpp" + +#pragma pack(push, 8) +class CGroup; +class CGroupMember +{ +public: + int16_t m_net_id; + CPed* m_ped; // this isn't serialized +}; +static_assert(sizeof(CGroupMember) == 0x10); + +class CPlayerPedGroupDataNode : CSyncDataNodeInfrequent +{ +public: + char m_unused[0x10]; // 0xC0 + CGroup* m_group; // 0xD0 (not serialized) + CGroupMember m_members[7]; // 0xD8 + CGroupMember m_leader; // 0x148 + char m_unused2[8]; // 0x158 + float m_max_separation; // 0x160 + char m_unused3[0xC]; // 0x164 + int m_pop_type; // 0x170 + bool m_needs_group_event_scan; // 0x175 + char m_unused4[6]; // 0x176 + int m_formation_type; // 0x17C + float m_formation_distance; // 0x180 + char m_unused5[0xC]; // 0x184 +}; +static_assert(sizeof(CPlayerPedGroupDataNode) == 0x190); +#pragma pack(pop) diff --git a/netsync/nodes/player/CPlayerWantedAndLOSDataNode.hpp b/netsync/nodes/player/CPlayerWantedAndLOSDataNode.hpp new file mode 100644 index 0000000..d956e34 --- /dev/null +++ b/netsync/nodes/player/CPlayerWantedAndLOSDataNode.hpp @@ -0,0 +1,27 @@ +#pragma once +#include +#include "rage/vector.hpp" +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push,4) +class CPlayerWantedAndLOSDataNode : CSyncDataNodeInfrequent +{ +public: + rage::fvector3 m_wanted_position; // 0xC0 + int m_time_in_prev_pursuit; // 0xCC + rage::fvector3 m_unk_position; // 0xD0 + int m_time_in_pursuit; // 0xDC + int m_wanted_level; // 0xE0 + int m_unk_wanted_level; // 0xE4 + int m_current_time; // 0xE8 + int m_unk_player_bitset; // 0xEC + int m_pursuit_start_time; // 0xF0 + uint8_t m_fake_wanted_level; // 0xF4 + bool m_cops_cant_see_player; // 0xF5 + bool m_is_evading; // 0xF6 + bool m_pending_wanted_level; // 0xF7 + bool m_unk3; // 0xF8 + uint8_t m_unk_player_index; // 0xF9 +}; +static_assert(sizeof(CPlayerWantedAndLOSDataNode) == 0xFC); +#pragma pack(pop) diff --git a/netsync/nodes/vehicle/CVehicleComponentReservationDataNode.hpp b/netsync/nodes/vehicle/CVehicleComponentReservationDataNode.hpp new file mode 100644 index 0000000..70ba08e --- /dev/null +++ b/netsync/nodes/vehicle/CVehicleComponentReservationDataNode.hpp @@ -0,0 +1,15 @@ +#pragma once +#include +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push, 4) +class CVehicleComponentReservationDataNode : CSyncDataNodeInfrequent +{ +public: + bool m_has_component_reservations; //0x00C0 + uint32_t m_num_peds_using_component; //0x00C4 + uint16_t m_peds_using_component[32]; //0x00C8 +}; //Size: 0x00C8 +#pragma pack(pop) + +static_assert(sizeof(CVehicleComponentReservationDataNode) == 0x108); diff --git a/netsync/nodes/vehicle/CVehicleControlDataNode.hpp b/netsync/nodes/vehicle/CVehicleControlDataNode.hpp new file mode 100644 index 0000000..ea297ea --- /dev/null +++ b/netsync/nodes/vehicle/CVehicleControlDataNode.hpp @@ -0,0 +1,41 @@ +#pragma once +#include +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push, 4) +class CVehicleControlDataNode : CSyncDataNodeFrequent +{ +public: + uint32_t m_num_wheels; + uint32_t dwordC4; + uint32_t m_brake_control; + uint32_t dwordCC; + uint32_t m_road_node_address; + bool m_kers_active; + bool m_bringing_vehicle_to_halt; + float m_halt_distance; + bool m_control_vertical_velocity; + bool m_has_suspension_data; + bool byteDE; + float m_suspension_heights[10]; + bool byte108; + bool byte109; + bool byte10A; + bool byte10B; + bool byte10C; + bool byte10D; + bool byte10E; + float float110; + uint32_t dword114; + char byte118; + bool m_is_submarine_car; + char gap11A[2]; + float m_rudder_rotation_x; + float m_rudder_rotation_y; + float m_rudder_rotation_z; + char byte128; + char byte129; + char pad[5]; +}; +static_assert(sizeof(CVehicleControlDataNode) == 0x130); +#pragma pack(pop) diff --git a/netsync/nodes/vehicle/CVehicleDamageStatusDataNode.hpp b/netsync/nodes/vehicle/CVehicleDamageStatusDataNode.hpp new file mode 100644 index 0000000..20740b9 --- /dev/null +++ b/netsync/nodes/vehicle/CVehicleDamageStatusDataNode.hpp @@ -0,0 +1,32 @@ +#pragma once +#include +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push, 4) +class CVehicleDamageStatusDataNode : CSyncDataNodeInfrequent +{ +public: + uint8_t m_bullet_counts[6]; // 0xC0 + uint8_t m_front_damage_level; // 0xC6 + uint8_t m_rear_damage_level; // 0xC7 + uint8_t m_left_damage_level; // 0xC8 + uint8_t m_right_damage_level; // 0xC9 + uint8_t m_rear_left_damage_level; // 0xCA + uint8_t m_rear_right_damage_level; // 0xCB + uint8_t m_windows_state[8]; // 0xCC + float m_unk2[8]; // 0xD4 + bool m_sirens_broken[20]; // 0xF4 + bool m_lights_broken[20]; // 0x108 + uint8_t m_front_bumper_state; // 0x11E + uint8_t m_rear_bumper_state; // 0x11F + uint8_t m_unk3[8]; // 0x120 + bool m_has_damage_levels; // 0x128 + bool m_has_broken_lights; // 0x129 + bool m_has_broken_sirens; // 0x12A + bool m_has_broken_windows; // 0x12B + bool m_has_broken_bumpers; // 0x12C + bool m_has_bullets; // 0x12D + bool m_has_unk; // 0x12E +}; //Size: 0x00C8 +#pragma pack(pop) +static_assert(sizeof(CVehicleDamageStatusDataNode) == 0x130); diff --git a/netsync/nodes/vehicle/CVehicleGameStateDataNode.hpp b/netsync/nodes/vehicle/CVehicleGameStateDataNode.hpp new file mode 100644 index 0000000..a24d51b --- /dev/null +++ b/netsync/nodes/vehicle/CVehicleGameStateDataNode.hpp @@ -0,0 +1,80 @@ +#pragma once +#include +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push, 2) +class CVehicleGameStateDataNode : CSyncDataNodeInfrequent +{ +public: + float m_unk66; + float m_unk32; + float m_unk200; + float m_unk204; + int m_radio_station; + uint32_t m_lock_status; + uint32_t m_unk17; + uint32_t m_unbreakable_doors; + uint32_t m_open_windows; + uint32_t m_unk34; + uint8_t m_unk49[4]; + unsigned int m_unk62_1; + uint32_t m_unk240; + uint16_t m_unk35; + uint16_t m_unk37[2]; + uint16_t m_unk39; + uint8_t m_unk252; + char m_light_state; + uint8_t m_unk21; + char m_unk27[8]; + uint8_t m_doors_open; + char m_door_positions[8]; + uint32_t m_locked_players; + uint8_t m_is_engine_on; + bool m_is_engine_starting; + bool unk4; + bool m_handbrake; + bool m_unk6; + uint8_t m_siren_on; + bool m_unk1; + uint8_t m_unk13; + uint8_t m_unk12; + uint8_t m_unk14; + uint8_t m_unk25; + uint8_t m_unk26; + bool m_no_longer_needed; + uint8_t m_unk28; + uint8_t m_unk33; + uint8_t m_unk30; + bool m_lights_on; + bool m_highbeams_on; + char m_unk43; + char m_unk44; + bool m_unk7; + char m_unk29; + char m_unk45; + char m_unk46; + char m_unk47; + char m_unk48; + uint8_t m_unk38; + char m_unk51; + bool m_has_been_owned_by_player; + char m_unk53; + char m_unk54; + char m_unk55; + char m_unk56; + char m_unk57; + char m_unk58; + char m_unk61; + uint8_t m_unk62; + char m_unk63; + char m_unk64; + char m_unk67; + char m_unk68; + char m_unk138; + char m_unk139; + char m_unk59; + char m_unk60; + char pad[6]; +}; +#pragma pack(pop) +static_assert(sizeof(CVehicleGameStateDataNode) == 0x148); \ No newline at end of file diff --git a/netsync/nodes/vehicle/CVehicleHealthDataNode.hpp b/netsync/nodes/vehicle/CVehicleHealthDataNode.hpp new file mode 100644 index 0000000..228de38 --- /dev/null +++ b/netsync/nodes/vehicle/CVehicleHealthDataNode.hpp @@ -0,0 +1,35 @@ +#pragma once +#include +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push, 4) +class CVehicleHealthDataNode : CSyncDataNodeInfrequent +{ +public: + float m_tires_unk14[10]; //0x00C0 + float m_tires_open_wheel_heat[10]; //0x00E8 + bool m_tires_bursted[10]; //0x0110 + bool m_tires_bursted_on_rim[10]; //0x011A + bool m_tires_unk11[10]; //0x0124 + bool m_tires_unk12[10]; //0x012E + uint64_t m_unk24; //0x0138 + int32_t m_engine_health; //0x0140 + uint32_t m_petrol_tank_health; //0x0144 + uint32_t m_num_tires; //0x0148 + bool m_tires_fine; //0x014C + bool m_unk7; //0x014D + char pad_014E[1]; //0x014E + bool m_health_changed; //0x014F + uint32_t m_health; //0x0150 + uint32_t m_body_health; //0x0154 + uint32_t m_damage_weapon; //0x0158 + int16_t m_damager_net_id; //0x015C + uint8_t m_total_repairs; //0x015E + uint8_t m_unk21; //0x015F + bool m_unk1; //0x0160 + bool m_unk2; //0x0161 + bool m_body_health_changed; //0x0162 + uint32_t m_pad2; // 0x0164 +}; //Size: 0x0380 +#pragma pack(pop) +static_assert(sizeof(CVehicleHealthDataNode) == 0x168); \ No newline at end of file diff --git a/netsync/nodes/vehicle/CVehicleSteeringDataNode.hpp b/netsync/nodes/vehicle/CVehicleSteeringDataNode.hpp new file mode 100644 index 0000000..525ae88 --- /dev/null +++ b/netsync/nodes/vehicle/CVehicleSteeringDataNode.hpp @@ -0,0 +1,13 @@ +#pragma once +#include +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push, 4) +class CVehicleSteeringNodeData : CSyncDataNodeFrequent +{ +public: + float m_steering_handle; // 0xC0 + char pad[4]; // 0xC4 +}; //Size: 0x00C8 +#pragma pack(pop) +static_assert(sizeof(CVehicleSteeringNodeData) == 0xC8); diff --git a/netsync/nodes/vehicle/CVehicleTaskDataNode.hpp b/netsync/nodes/vehicle/CVehicleTaskDataNode.hpp new file mode 100644 index 0000000..90d52d9 --- /dev/null +++ b/netsync/nodes/vehicle/CVehicleTaskDataNode.hpp @@ -0,0 +1,14 @@ +#pragma once +#include +#include "netsync/CProjectBaseSyncDataNode.hpp" + +#pragma pack(push,4) +class CVehicleTaskDataNode : CSyncDataNodeInfrequent +{ +public: + uint32_t m_task_type; // 0xC0 + uint32_t m_task_data_size; // 0xC4 + char m_task_data[255]; // 0xC8 +}; //Size: 0x0180 +static_assert(sizeof(CVehicleTaskDataNode) == 0x1C8); +#pragma pack(pop) \ No newline at end of file diff --git a/network/RemoteGamerInfoMsg.hpp b/network/RemoteGamerInfoMsg.hpp index b2b050c..7061dfc 100644 --- a/network/RemoteGamerInfoMsg.hpp +++ b/network/RemoteGamerInfoMsg.hpp @@ -1,22 +1,7 @@ #pragma once #include #include "../rage/rlGamerInfo.hpp" - -#pragma pack(push, 4) -class netConnectionPeer -{ -public: - uint32_t m_internal_ip; //0x0000 - uint16_t m_internal_port; //0x0004 - uint32_t m_external_ip; //0x0008 - uint16_t m_external_port; //0x000C - uint64_t m_peer_id; //0x0010 - uint32_t unk_0018; //0x0018 - uint16_t unk_001C; //0x001C - uint8_t m_platform; //0x001E -}; -static_assert(sizeof(netConnectionPeer) == 0x20); -#pragma pack(pop) +#include "netConnection.hpp" #pragma pack(push, 8) class RemoteGamerInfoMsg @@ -24,7 +9,7 @@ class RemoteGamerInfoMsg public: uint64_t m_session_id; //0x0000 class rage::rlGamerInfo m_gamer_info; //0x0008 - class netConnectionPeer m_gamer_peer_data; //0x00A0 + class rage::netPeerAddress m_peer_address; //0x00A0 uint32_t unk_0xC0; //0x00C0 uint32_t m_unk_struct_size; //0x00C4 char m_unk_struct[512]; //0x00C8 Might be bitbuffer data diff --git a/network/netConnection.hpp b/network/netConnection.hpp new file mode 100644 index 0000000..5274741 --- /dev/null +++ b/network/netConnection.hpp @@ -0,0 +1,202 @@ +#pragma once +#include +#include "rage/rlGamerInfoBase.hpp" + +#pragma pack(push, 1) +namespace rage +{ + class netConnectionManager; + class netConnectionPeer; + +#pragma pack(push, 4) + class netPeerAddress + { + public: + uint32_t m_internal_ip; //0x0000 + uint16_t m_internal_port; //0x0004 + uint32_t m_external_ip; //0x0008 + uint16_t m_external_port; //0x000C + uint64_t m_peer_id; //0x0010 + uint32_t unk_0018; //0x0018 + uint16_t unk_001C; //0x001C + uint8_t m_platform; //0x001E + }; + static_assert(sizeof(netPeerAddress) == 0x20); +#pragma pack(pop) + + class netQueuedMessage + { + public: + void* m_data_buffer; + void* qword8; + void* qword10; + void* qword18; + rage::netQueuedMessage* m_next; + void* qword28; + char gap30[8]; + int m_creation_time; + int m_last_send_time; + int m_resend_count; + char gap44[4]; + int dword48; + uint16_t word4C; + char byte4E; + }; + static_assert(sizeof(netQueuedMessage) == 0x4F); + + class netMessageQueue + { + public: + rage::netQueuedMessage* m_first; + rage::netQueuedMessage* m_last; + uint64_t m_count; + }; + + class netPackedMessage + { + public: + void* m_data_buffer; + void* m_allocator; + void* qword10; + void* qword18; + }; + + class netPackedMessageQueue + { + public: + rage::netPackedMessage* m_first; + rage::netPackedMessage* m_last; + uint64_t m_count; + }; + + class netConnection + { + public: + class InFrame + { + public: + enum class EventType + { + ConnectionClosed = 3, + FrameReceived = 4, + BandwidthExceeded = 6, + OutOfMemory = 7 + }; + + virtual ~InFrame() = default; + + virtual void destroy() = 0; + virtual EventType get_event_type() = 0; + virtual uint32_t _0x18() = 0; + + uint32_t m_timestamp; //0x0008 + char pad_0008[52]; //0x000C + uint32_t m_msg_id; //0x0040 + uint32_t m_connection_identifier; //0x0044 + InFrame* m_this; //0x0048 + uint32_t m_peer_id; //0x0050 + char pad_0050[44]; //0x0058 + uint32_t m_length; //0x0080 + char pad_007C[4]; //0x0084 + void* m_data; //0x0088 + }; + static_assert(sizeof(rage::netConnection::InFrame) == 0x90); + + char gap0[8]; + rage::netConnectionPeer* m_connection_peer; + int m_msg_id; + uint32_t m_connection_id; + void* m_allocator; + uint32_t m_connection_state; + uint32_t m_last_send_time; + uint32_t m_last_receive_time; + uint32_t m_num_failed_messages; + char gap30[8]; + uint32_t m_timeout_reason; + uint32_t dword3C; + uint32_t m_timeout; + uint32_t dword44; + uint32_t m_resend_threshold; + char gap4C[4]; + rage::netMessageQueue m_reliables_resend_queue; + rage::netMessageQueue m_normal_message_queue; + rage::netQueuedMessage* m_unacked_reliable_message_list; + int m_unacked_reliable_message_count; + char gap8C[36]; + netConnectionManager* m_net_connection_mgr; + char gapB8[8]; + uint32_t dwordC0; + int16_t m_msg_counter; + int16_t wordC6; + char gapC8[2]; + int16_t m_last_reliable_msg_counter; + char m_flags; + char gapCD[3]; + int m_failed_allocation_size; + int32_t m_failed_allocations; + rage::netConnection* m_next; + char gapE0[208]; + int m_flags2; + char gap1B4[69]; + }; + static_assert(sizeof(netConnection) == 0x1F9); + + class netConnectionQueue + { + public: + rage::netConnection* m_first; + rage::netConnection* m_last; + uint64_t m_count; + }; + + class netConnectionPeer + { + public: + rage::netConnection* m_connections_by_id[16]; + rage::netConnectionQueue m_net_connection_queue; + rage::netPackedMessageQueue m_packed_message_queue; + void* qwordB0; + char byteB8; + char gapB9[3]; + int intBC; + uint32_t dwordC0; + char gapC4[4]; + void* qwordC8; + rage::netPeerAddress m_relay_address; + rage::rlGamerInfoBase m_gamer_info; + char gap1B0[24]; + uint32_t dword1C8; + char gap1CC[28]; + uint32_t m_security_id; + char gap1EC[28]; + void* qword208; + char gap210[24]; + rage::netPeerAddress m_peer_address; + rage::netConnectionPeer* m_next; + char gap250[8]; + int m_time_until_next_batch; + int m_empty_batch_interval; + uint32_t m_time_until_timeout; + int m_last_msg_process_time; + int gap268; + void* qword26C; + char gap274[4]; + void* qword278; + char gap280[24]; + void* qword298; + char gap2A0[64]; + uint32_t m_peer_id; + char byte2E4; + char more[51]; + int gap318; + char gap31C[24]; + int m_num_encryption_attempts; + char gap338[60]; + int m_num_messages_batched; + int m_num_reliable_messages_batched; + int m_num_resent_reliable_messages_batched; + char gap380[145]; + }; + static_assert(sizeof(netConnectionPeer) == 0x411); +} +#pragma pack(pop) \ No newline at end of file