From 2b80341c519ec05bc60856346afa92e04cea25ea Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sun, 30 Jun 2024 16:11:16 +0200 Subject: [PATCH] Server: fix server entity structs The sizes were correct, but some of the field offsets weren't. CBaseCombatCharacter also contained fields specific to CPlayer, these have been moved to CPlayer. CBaseCombatCharacter now aligns on all classes deriving from it (CAI_BaseNPC, etc..). Classes now align properly in the disassembler. Also added more static assertions to prevent mistakes. --- src/game/server/baseanimating.h | 3 +++ src/game/server/baseanimatingoverlay.h | 3 ++- src/game/server/basecombatcharacter.h | 19 +++---------------- src/game/server/baseentity.h | 5 +++-- src/game/server/player.h | 17 ++++++++++++++++- src/game/shared/collisionproperty.h | 2 ++ 6 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/game/server/baseanimating.h b/src/game/server/baseanimating.h index f5f436b8..5cfe383b 100644 --- a/src/game/server/baseanimating.h +++ b/src/game/server/baseanimating.h @@ -133,8 +133,11 @@ protected: char gap_119c[4]; __int64 m_AnimSyncScriptProps[8]; int m_numAnimSyncScriptProps; + char padding_unknown[8]; }; +static_assert(sizeof(CBaseAnimating) == 0x11F0); + inline CBaseAnimating*(*CBaseAnimating__LockStudioHdr)(CBaseAnimating* thisp); /////////////////////////////////////////////////////////////////////////////// diff --git a/src/game/server/baseanimatingoverlay.h b/src/game/server/baseanimatingoverlay.h index b5e492ea..abafaed8 100644 --- a/src/game/server/baseanimatingoverlay.h +++ b/src/game/server/baseanimatingoverlay.h @@ -14,7 +14,6 @@ class CBaseAnimatingOverlay : public CBaseAnimating { - void* __vftable; int m_maxOverlays; char gap_11f4[4]; CAnimationLayer m_AnimOverlay; @@ -43,4 +42,6 @@ class CBaseAnimatingOverlay : public CBaseAnimating float m_localAnimOverlayFadeOutDuration[4]; }; +static_assert(sizeof(CBaseAnimatingOverlay) == 0x15B0); + #endif // BASE_ANIMATING_OVERLAY_H diff --git a/src/game/server/basecombatcharacter.h b/src/game/server/basecombatcharacter.h index c92d72da..615f024e 100644 --- a/src/game/server/basecombatcharacter.h +++ b/src/game/server/basecombatcharacter.h @@ -44,9 +44,6 @@ struct CTether //----------------------------------------------------------------------------- class CBaseCombatCharacter : public CBaseAnimatingOverlay { -public: - inline const char* GetNetName() const { return m_szNetname; }; - private: bool m_bPreventWeaponPickup; char gap_15b1[3]; @@ -136,18 +133,8 @@ private: char gap_5949[3]; int m_latest3pWeaponGettingEquipped[2]; char gap_5954[12]; - char m_szNetname[256]; - bool m_zoomViewdriftDebounceEnabled; - bool m_bZooming; - char gap_5a62[2]; - float m_zoomToggleOnStartTime; - float m_zoomBaseFrac; - float m_zoomBaseTime; - float m_zoomFullStartTime; - int m_physicsSolidMask; - int m_rightHandAttachment; - int m_leftHandAttachment; - int m_headAttachment; - int m_chestAttachment; }; + +static_assert(sizeof(CBaseCombatCharacter) == 0x5960); + #endif // BASECOMBATCHARACTER_H diff --git a/src/game/server/baseentity.h b/src/game/server/baseentity.h index 950e8748..36a3984f 100644 --- a/src/game/server/baseentity.h +++ b/src/game/server/baseentity.h @@ -69,9 +69,10 @@ protected: void* m_pfnMoveDone; void* m_pfnThink; CServerNetworkProperty m_Network; + char padding_or_unknown[8]; string_t m_ModelName; int m_entIndex; - char gap_74[8]; // Aligns properly in IDA and generated code after setting from 4 to 8. + char gap_74[4]; string_t* m_iClassname; float m_flAnimTime; float m_flSimulationTime; @@ -276,7 +277,7 @@ protected: char m_realmsTransmitMaskCached[16]; int m_realmsTransmitMaskCachedSerialNumber; }; -static_assert(sizeof(CBaseEntity) == 2824); +static_assert(sizeof(CBaseEntity) == 0xB08); inline CBaseEntity*(*CBaseEntity__GetBaseEntity)(CBaseEntity* thisp); diff --git a/src/game/server/player.h b/src/game/server/player.h index a71752ea..6a2905fb 100644 --- a/src/game/server/player.h +++ b/src/game/server/player.h @@ -263,7 +263,22 @@ public: inline NucleusID_t GetPlatformUserId() const { return m_platformUserId; }; + inline const char* GetNetName() const { return m_szNetname; }; + private: + char m_szNetname[256]; + bool m_zoomViewdriftDebounceEnabled; + bool m_bZooming; + char gap_5a62[2]; + float m_zoomToggleOnStartTime; + float m_zoomBaseFrac; + float m_zoomBaseTime; + float m_zoomFullStartTime; + int m_physicsSolidMask; + int m_rightHandAttachment; + int m_leftHandAttachment; + int m_headAttachment; + int m_chestAttachment; int m_StuckLast; char gap_5a8c[4]; CPlayerLocalData m_Local; @@ -795,7 +810,7 @@ private: char gap_7ee5[3]; int m_armsModelIndex; }; -static_assert(sizeof(CPlayer) == 0x7EF0); // !TODO: backwards compatibility. +static_assert(sizeof(CPlayer) == 0x7EF0); inline QAngle*(*CPlayer__EyeAngles)(CPlayer* pPlayer, QAngle* pAngles); inline void(*CPlayer__PlayerRunCommand)(CPlayer* pPlayer, CUserCmd* pUserCmd, IMoveHelper* pMover); diff --git a/src/game/shared/collisionproperty.h b/src/game/shared/collisionproperty.h index fddd1bb6..724ad3ad 100644 --- a/src/game/shared/collisionproperty.h +++ b/src/game/shared/collisionproperty.h @@ -38,4 +38,6 @@ class CCollisionProperty : public ICollideable float m_hitboxTestRadius; }; +static_assert(sizeof(CCollisionProperty) == 0x78); + #endif // COLLISIONPROPERTY_H \ No newline at end of file