diff --git a/classes.cpp b/classes.cpp index 17a1788..321ac1b 100644 --- a/classes.cpp +++ b/classes.cpp @@ -19,6 +19,7 @@ #include "network/CNetworkScSessionPlayer.hpp" #include "network/CScriptedGameEvent.hpp" #include "network/InFrame.hpp" +#include "network/netEncryption.hpp" #include "network/netGameEvent.hpp" #include "network/netObject.hpp" #include "network/netPeerAddress.hpp" @@ -41,10 +42,14 @@ #include "network/sync/netSyncNodeBase.hpp" #include "network/sync/netSyncTree.hpp" #include "network/sync/animal/CAnimalCreationData.hpp" +#include "network/sync/animscene/CAnimSceneCreationData.hpp" +#include "network/sync/animscene/CAnimSceneInfrequentData.hpp" #include "network/sync/object/CObjectCreationData.hpp" #include "network/sync/ped/CPedAttachData.hpp" #include "network/sync/ped/CPedCreationData.hpp" +#include "network/sync/ped/CPedHealthData.hpp" #include "network/sync/ped/CPedTaskTreeData.hpp" +#include "network/sync/ped/CPedVitalityData.hpp" #include "network/sync/physical/CPhysicalAttachData.hpp" #include "network/sync/pickup/CPickupCreationData.hpp" #include "network/sync/player/CPlayerAppearanceData.hpp" @@ -93,3 +98,4 @@ #include "script/scriptIdBase.hpp" #include "script/scrProgram.hpp" #include "script/types.hpp" +#include "train/CTrainConfig.hpp" diff --git a/network/netEncryption.hpp b/network/netEncryption.hpp new file mode 100644 index 0000000..b2f71e4 --- /dev/null +++ b/network/netEncryption.hpp @@ -0,0 +1,12 @@ +#pragma once +#include + +namespace rage +{ + class netEncryptionOverride + { + public: + char m_OverrideKey[33]; + std::uint8_t m_EncryptionFlags; + }; +} \ No newline at end of file diff --git a/network/netObject.hpp b/network/netObject.hpp index da90ac1..9556d30 100644 --- a/network/netObject.hpp +++ b/network/netObject.hpp @@ -7,6 +7,44 @@ namespace rage class netObject { public: +#pragma pack(push, 1) + struct GUID + { + std::uint64_t m_Data1; + std::uint64_t m_Data2; + + std::uint32_t GetAccountId() const + { + return m_Data2 & 0xFFFFFFFF; + } + + std::uint16_t GetAccountComponent() const + { + return (m_Data2 >> 32) & 0xFFFF; + } + + std::uint64_t GetCreationTime() const + { + return m_Data1 & 0xFFFFFFFFFFFF; + } + + std::uint16_t GetObjectToken() const + { + return m_Data1 >> 48; + } + + std::uint16_t GetObjectType() const + { + return (m_Data2 >> 48) & 0xFF; + } + + std::uint8_t GetCreationCycle() const + { + return m_Data2 >> 56; + } + }; +#pragma pack(pop) + virtual ~netObject() = 0; char m_Pad[0x38]; // 0x08 @@ -18,6 +56,8 @@ namespace rage bool m_IsRemotelyControlled; // 0x47 char m_Pad2[0xA8]; // 0x48 int m_OwnershipToken; // 0xF0 + char m_Pad3[0x14]; // 0xF4 + GUID m_Guid; // 0x108 }; - static_assert(sizeof(rage::netObject) == 0xF8); + static_assert(sizeof(rage::netObject) == 0x118); } \ No newline at end of file diff --git a/network/netServerMessages.hpp b/network/netServerMessages.hpp index ed74fbf..6f7edb9 100644 --- a/network/netServerMessages.hpp +++ b/network/netServerMessages.hpp @@ -3,41 +3,41 @@ namespace rage { -class ServerRPCSerializer -{ -public: - virtual int dtor() = 0; - virtual int Unk() = 0; - virtual void *GetData() = 0; - virtual int GetSize() = 0; -}; + class netRpcBuilder + { + public: + virtual ~netRpcBuilder() = default; + virtual int Unk() = 0; + virtual void* GetData() = 0; + virtual int GetSize() = 0; + }; -class ServerMsgData -{ -public: - unsigned char *data; - int size; - bool is_json; -}; + class netRpcReaderContext + { + public: + void* m_Data; + int m_Size; + void* m_JsonReader; + }; -class ServerMsg -{ -public: - virtual ~ServerMsg() = default; - virtual void _0x08() = 0; - virtual void _0x10() = 0; - virtual void _0x18() = 0; - virtual void _0x20() = 0; - virtual void _0x28() = 0; - virtual void _0x30() = 0; - virtual const char *GetName() = 0; - virtual void _0x40() = 0; - virtual void _0x48() = 0; - virtual void _0x50() = 0; - virtual void _0x58() = 0; - virtual void _0x60() = 0; - virtual void _0x68() = 0; - virtual void _0x70() = 0; - virtual ServerMsgData *GetMsgData() = 0; -}; + class netRpcReader + { + public: + virtual ~netRpcReader() = default; + virtual void _0x08() = 0; + virtual void _0x10() = 0; + virtual void _0x18() = 0; + virtual void _0x20() = 0; + virtual void _0x28() = 0; + virtual void _0x30() = 0; + virtual const char* GetName() = 0; + virtual void _0x40() = 0; + virtual void _0x48() = 0; + virtual void _0x50() = 0; + virtual void _0x58() = 0; + virtual void _0x60() = 0; + virtual void _0x68() = 0; + virtual void _0x70() = 0; + virtual netRpcReaderContext* GetContext() = 0; + }; } \ No newline at end of file diff --git a/network/rlScSessionEvent.hpp b/network/rlScSessionEvent.hpp index 6a9f3ac..0354b8c 100644 --- a/network/rlScSessionEvent.hpp +++ b/network/rlScSessionEvent.hpp @@ -16,8 +16,18 @@ namespace rage QUEUE_ERROR = 17, LOCALIZED_MESSAGE = 19, CONFIG_PARAM = 20, + INVITE_RESULT = 21, + INVITE_QUEUED = 22, + TRANSITION_READY_INVITE = 28, + TRANSITION_READY_PLAYER_QUEUE = 29, + KEEP_ALIVE_REQUEST = 30, COMPLAINT_RECEIVED = 31, QUEUE_ENTERED = 32, + PREPARE_SERVER_TRANSFER = 33, + SERVER_TRANSFER_RESULT = 34, + TRANSITION_READY_SERVER_TRANSFER = 35, + TRANSFER_TO_SERVER = 36, + PAUSE_FOR_SERVER_TRANSFER = 37, ADMIN_SECURITY_INVITE = 38 }; diff --git a/network/sync/animscene/CAnimSceneCreationData.hpp b/network/sync/animscene/CAnimSceneCreationData.hpp new file mode 100644 index 0000000..5497c0d --- /dev/null +++ b/network/sync/animscene/CAnimSceneCreationData.hpp @@ -0,0 +1,12 @@ +#pragma once +#include + +class CAnimSceneCreationData +{ +public: + uint32_t m_AnimDict; // 0x0000 + int32_t m_PlaybackListName; // 0x0004 + uint32_t m_Flags; // 0x0008 - TODO: fix this + char m_Pad[116]; // 0x0012 +}; //Size: 0x0080 +static_assert(sizeof(CAnimSceneCreationData) == 0x80); \ No newline at end of file diff --git a/network/sync/animscene/CAnimSceneInfrequentData.hpp b/network/sync/animscene/CAnimSceneInfrequentData.hpp new file mode 100644 index 0000000..159d43f --- /dev/null +++ b/network/sync/animscene/CAnimSceneInfrequentData.hpp @@ -0,0 +1,74 @@ +#pragma once + +class CAnimSceneSerializedVariable +{ +public: + enum class Type + { + Bool = 5, + Float = 10, + Int = 19 + }; + + std::uint32_t m_VariableName; + Type m_Type; + union + { + int m_Int; + bool m_Bool; + float m_Float; + }; +}; +static_assert(sizeof(CAnimSceneSerializedVariable) == 0xC); + +class CAnimSceneSerializedEntityBase +{ +public: + virtual void Serialize(void*) {}; + virtual void Reset() {}; + + std::uint32_t m_EntityName; + bool m_TransferOwnership; +}; +static_assert(sizeof(CAnimSceneSerializedEntityBase) == 0x10); + +class CAnimSceneSerializedEntity : public CAnimSceneSerializedEntityBase +{ +public: + std::uint16_t m_ObjectId; + bool m_Abort; +}; +static_assert(sizeof(CAnimSceneSerializedEntity) == 0x18); + +class CAnimSceneSerializedDoor : public CAnimSceneSerializedEntityBase +{ +public: + std::uint32_t m_DoorHash; +}; +static_assert(sizeof(CAnimSceneSerializedDoor) == 0x18); + +class CAnimSceneSerializedPlaybackList +{ +public: + virtual void Serialize(void*) {}; + virtual void Reset() {}; + + std::uint32_t m_PlaybackList; + float m_Time; +}; +static_assert(sizeof(CAnimSceneSerializedPlaybackList) == 0x10); + +class CAnimSceneInfrequentData +{ +public: + std::uint16_t m_NumEntities; + std::uint16_t m_NumDoors; + std::uint16_t m_NumVariables; + std::uint16_t m_NumPlaybackLists; + char m_Pad[0x50]; // origin, rotation, scene attachments + CAnimSceneSerializedEntity m_Entities[32]; + CAnimSceneSerializedDoor m_Doors[5]; + CAnimSceneSerializedVariable m_Variables[32]; + CAnimSceneSerializedPlaybackList m_PlaybackLists[9]; +}; //Size: 0x05E0 +static_assert(sizeof(CAnimSceneInfrequentData) == 0x5E0); \ No newline at end of file diff --git a/network/sync/ped/CPedHealthData.hpp b/network/sync/ped/CPedHealthData.hpp new file mode 100644 index 0000000..a0137f2 --- /dev/null +++ b/network/sync/ped/CPedHealthData.hpp @@ -0,0 +1,59 @@ +#pragma once +#include "rage/vector.hpp" + +class CPedHealthData +{ +public: + rage::matrix44 m_WoundEffectPos; + uint32_t m_DamageWeaponHash; + uint32_t m_DamageWeaponMode; + uint32_t m_KillerWeaponHash; + uint32_t m_KillerWeaponMode; + uint32_t m_HitComponent; + float m_CurrentBleedOutDuration; + uint32_t m_IncapacitationThreshold; + uint32_t m_WoundIntensity; + int m_DeathTime; + uint32_t unk_0064; + int m_Health; + unsigned int unsigned_int6C; + unsigned int m_HealthConfig; + unsigned int unk_0074; + uint16_t m_DamagerId; + uint16_t m_KillerId; + uint16_t unk_007C; + char m_DamageCleanliness; + char unk_007F; + int m_DamageCleanlinessHits; + uint8_t m_TotalBleedOutDuration; + uint8_t unk_0085; + uint8_t m_FireDamageAmount; + char unk_0087; + uint16_t m_IncapacitationFlags; + uint8_t m_TranquilizerPlayerId; + bool unk_008B; + bool m_TotalBleedOutDurationOverridden; + bool m_HasDefaultHealth; + bool m_HasDamageBone; + bool unk_008F; + bool unk_0090; + bool unk_0091; + bool unk_0092; + bool m_CanBeIncapacitated; + bool m_Incapacitated; + bool unk_0095; + bool unk_0096; + bool unk_0097; + bool unk_0098; + bool unk_0099; + bool unk_009A; + bool unk_009B; + bool m_HasWound; + bool m_HasBloodPool; + bool unk_009E; + bool m_TakingDamage; + bool unk_00A0; + bool unk_00A1; + char epad[0xE]; +}; +static_assert(sizeof(CPedHealthData) == 0xB0); \ No newline at end of file diff --git a/network/sync/ped/CPedVitalityData.hpp b/network/sync/ped/CPedVitalityData.hpp new file mode 100644 index 0000000..079865b --- /dev/null +++ b/network/sync/ped/CPedVitalityData.hpp @@ -0,0 +1,41 @@ +#pragma once +#include + +class CPedVitalityData +{ +public: + uint32_t m_HealthInReserve[8]; + uint32_t m_Health; + uint32_t unk_0024; + uint32_t unk_0028; + uint32_t unk_002C; + uint32_t unk_0030; + uint32_t unk_0034; + uint8_t m_NumHealthReserves; + bool unk_0039; + bool m_HasUpgradeData; + bool unk_003B; + bool unk_003C; + bool unk_003D; + bool m_HasHealthTankUpgrade; + bool m_HasStaminaTankUpgrade; + uint32_t unk_0040; + uint32_t unk_0044; + uint32_t unk_0048; + bool unk_004C; + bool unk_004D; + bool unk_004E; + uint32_t m_TotalHealth; + uint32_t m_UnkComponentValue; + uint32_t dword58; + char gap5C[4]; + uint64_t qword60; + uint64_t qword68; + bool m_HasDefaultHealth; + bool m_IsDead; + bool m_HasDefaultUnk; + bool m_IsIncapacitated; + bool unk_0074; + bool unk_0075; +}; +static_assert(sizeof(CPedVitalityData) == 0x78); \ No newline at end of file diff --git a/train/CTrainConfig.hpp b/train/CTrainConfig.hpp new file mode 100644 index 0000000..06c4634 --- /dev/null +++ b/train/CTrainConfig.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include +#include + +#include "rage/atArray.hpp" + +class CTrainCarriageInfo +{ +public: + uint32_t m_ModelName; + uint32_t _0x5E64EA3E; + uint32_t _0xE2BDEA7B; + uint32_t _0xECA6D302; + uint32_t _0xFBF5C716; + float _0x46B81FF8; + float _0xEC4633A5; + uint _0x535A0BBE; + uint m_ModelId; + int m_Extras; + bool _0x153918B6; + bool _0x88A76D74; + bool _0xC77853E4; + uint8_t m_TintPreset; +}; +static_assert(sizeof(CTrainCarriageInfo) == 0x2C); + +class CTrainConfigRef +{ +public: + uint32_t m_TrainConfigName; + uint8_t _0x07E33620; +}; +static_assert(sizeof(CTrainConfigRef) == 0x8); + +class CTrainConfig +{ +public: + uint32_t m_Name; + float _0x0ED29061; + float _0xE43D854D; + float _0x72443177; + float _0xA50FC0EB; + bool _0xFD90C5F8; + bool _0x0546B416; + bool _0xD41F8E7D; + bool m_CarriagesSwing; + bool _0xEDD766A7; + bool _0xDB277834; + bool m_NoRandomSpawn; + bool m_NoDriver; + float m_CarriageGap; + rage::atArray m_Carriages; + uint32_t _0xA400A33A; + float m_DefaultMaxSpeed; + float m_MaxAcceleration; + float m_MaxDeceleration; + bool m_IsTram; +}; +static_assert(sizeof(CTrainConfig) == 0x48); + +class CTrainConfigGroup +{ +public: + uint32_t m_Name; + rage::atArray m_Refs; +}; +static_assert(sizeof(CTrainConfigGroup) == 0x18); + +class CTrainConfigs +{ +public: + rage::atArray m_TrainConfigs; + rage::atArray m_TrainGroups; +}; \ No newline at end of file