#pragma once // @test: using interfaces in the header | not critical but could blow up someday with thousands of errors or affect to compilation time etc // used: cgameentitysystem, ischemasystem #include "../core/interfaces.h" #include "interfaces/igameresourceservice.h" #include "interfaces/ischemasystem.h" // used: schema field #include "../core/schema.h" // used: l_print #include "../utilities/log.h" // used: vector_t #include "datatypes/vector.h" // used: qangle_t #include "datatypes/qangle.h" // used: ctransform #include "datatypes/transform.h" // used: cbasehandle #include "entity_handle.h" // used: game's definitions #include "const.h" // used: entity vdata #include "vdata.h" using GameTime_t = std::float_t; using GameTick_t = std::int32_t; class CEntityInstance; class CEntityIdentity { public: CS_CLASS_NO_INITIALIZER(CEntityIdentity); // @note: handle index is not entity index SCHEMA_ADD_OFFSET(std::uint32_t, GetIndex, 0x10); SCHEMA_ADD_FIELD(const char*, GetDesignerName, "CEntityIdentity->m_designerName"); SCHEMA_ADD_FIELD(std::uint32_t, GetFlags, "CEntityIdentity->m_flags"); [[nodiscard]] bool IsValid() { return GetIndex() != INVALID_EHANDLE_INDEX; } [[nodiscard]] int GetEntryIndex() { if (!IsValid()) return ENT_ENTRY_MASK; return GetIndex() & ENT_ENTRY_MASK; } [[nodiscard]] int GetSerialNumber() { return GetIndex() >> NUM_SERIAL_NUM_SHIFT_BITS; } CEntityInstance* pInstance; // 0x00 }; class CEntityInstance { public: CS_CLASS_NO_INITIALIZER(CEntityInstance); void GetSchemaClassInfo(SchemaClassInfoData_t** pReturn) { return MEM::CallVFunc(this, pReturn); } [[nodiscard]] CBaseHandle GetRefEHandle() { CEntityIdentity* pIdentity = GetIdentity(); if (pIdentity == nullptr) return CBaseHandle(); return CBaseHandle(pIdentity->GetEntryIndex(), pIdentity->GetSerialNumber() - (pIdentity->GetFlags() & 1)); } SCHEMA_ADD_FIELD(CEntityIdentity*, GetIdentity, "CEntityInstance->m_pEntity"); }; class CCollisionProperty { public: std::uint16_t CollisionMask() { return *reinterpret_cast(reinterpret_cast(this) + 0x38); } CS_CLASS_NO_INITIALIZER(CCollisionProperty); SCHEMA_ADD_FIELD(Vector_t, GetMins, "CCollisionProperty->m_vecMins"); SCHEMA_ADD_FIELD(Vector_t, GetMaxs, "CCollisionProperty->m_vecMaxs"); SCHEMA_ADD_FIELD(std::uint8_t, GetSolidFlags, "CCollisionProperty->m_usSolidFlags"); SCHEMA_ADD_FIELD(std::uint8_t, GetCollisionGroup, "CCollisionProperty->m_CollisionGroup"); }; class CSkeletonInstance; class CGameSceneNode { public: CS_CLASS_NO_INITIALIZER(CGameSceneNode); SCHEMA_ADD_FIELD(CTransform, GetNodeToWorld, "CGameSceneNode->m_nodeToWorld"); SCHEMA_ADD_FIELD(CEntityInstance*, GetOwner, "CGameSceneNode->m_pOwner"); SCHEMA_ADD_FIELD(Vector_t, GetAbsOrigin, "CGameSceneNode->m_vecAbsOrigin"); SCHEMA_ADD_FIELD(Vector_t, GetRenderOrigin, "CGameSceneNode->m_vRenderOrigin"); SCHEMA_ADD_FIELD(QAngle_t, GetAngleRotation, "CGameSceneNode->m_angRotation"); SCHEMA_ADD_FIELD(QAngle_t, GetAbsAngleRotation, "CGameSceneNode->m_angAbsRotation"); SCHEMA_ADD_FIELD(bool, IsDormant, "CGameSceneNode->m_bDormant"); CSkeletonInstance* GetSkeletonInstance() { return MEM::CallVFunc(this); } }; class C_BaseEntity : public CEntityInstance { public: CS_CLASS_NO_INITIALIZER(C_BaseEntity); [[nodiscard]] bool IsBasePlayerController() { SchemaClassInfoData_t* pClassInfo; GetSchemaClassInfo(&pClassInfo); if (pClassInfo == nullptr) return false; return FNV1A::Hash(pClassInfo->szName) == FNV1A::HashConst("C_CSPlayerController"); } [[nodiscard]] bool IsWeapon() { static SchemaClassInfoData_t* pWeaponBaseClass = nullptr; if (pWeaponBaseClass == nullptr) I::SchemaSystem->FindTypeScopeForModule(CS_XOR("client.dll"))->FindDeclaredClass(&pWeaponBaseClass, CS_XOR("C_CSWeaponBase")); SchemaClassInfoData_t* pClassInfo; GetSchemaClassInfo(&pClassInfo); if (pClassInfo == nullptr) return false; return (pClassInfo->InheritsFrom(pWeaponBaseClass)); } static C_BaseEntity* GetLocalPlayer(); // get entity origin on scene [[nodiscard]] const Vector_t& GetSceneOrigin(); SCHEMA_ADD_FIELD(CGameSceneNode*, GetGameSceneNode, "C_BaseEntity->m_pGameSceneNode"); SCHEMA_ADD_FIELD(CCollisionProperty*, GetCollision, "C_BaseEntity->m_pCollision"); SCHEMA_ADD_FIELD(std::uint8_t, GetTeam, "C_BaseEntity->m_iTeamNum"); SCHEMA_ADD_FIELD(CBaseHandle, GetOwnerHandle, "C_BaseEntity->m_hOwnerEntity"); SCHEMA_ADD_FIELD(Vector_t, GetBaseVelocity, "C_BaseEntity->m_vecBaseVelocity"); SCHEMA_ADD_FIELD(Vector_t, GetAbsVelocity, "C_BaseEntity->m_vecAbsVelocity"); SCHEMA_ADD_FIELD(bool, IsTakingDamage, "C_BaseEntity->m_bTakesDamage"); SCHEMA_ADD_FIELD(std::uint32_t, GetFlags, "C_BaseEntity->m_fFlags"); SCHEMA_ADD_FIELD(std::int32_t, GetEflags, "C_BaseEntity->m_iEFlags"); SCHEMA_ADD_FIELD(std::uint8_t, GetMoveType, "C_BaseEntity->m_nActualMoveType"); // m_nActualMoveType returns CSGO style movetype, m_nMoveType returns bitwise shifted move type SCHEMA_ADD_FIELD(std::uint8_t, GetLifeState, "C_BaseEntity->m_lifeState"); SCHEMA_ADD_FIELD(std::int32_t, GetHealth, "C_BaseEntity->m_iHealth"); SCHEMA_ADD_FIELD(std::int32_t, GetMaxHealth, "C_BaseEntity->m_iMaxHealth"); SCHEMA_ADD_FIELD(float, GetWaterLevel, "C_BaseEntity->m_flWaterLevel"); SCHEMA_ADD_FIELD_OFFSET(void*, GetVData, "C_BaseEntity->m_nSubclassID", 0x8); }; class CGlowProperty; class C_BaseModelEntity : public C_BaseEntity { public: CS_CLASS_NO_INITIALIZER(C_BaseModelEntity); SCHEMA_ADD_FIELD(CCollisionProperty, GetCollisionInstance, "C_BaseModelEntity->m_Collision"); SCHEMA_ADD_FIELD(CGlowProperty, GetGlowProperty, "C_BaseModelEntity->m_Glow"); SCHEMA_ADD_FIELD(Vector_t, GetViewOffset, "C_BaseModelEntity->m_vecViewOffset"); SCHEMA_ADD_FIELD(GameTime_t, GetCreationTime, "C_BaseModelEntity->m_flCreateTime"); SCHEMA_ADD_FIELD(GameTick_t, GetCreationTick, "C_BaseModelEntity->m_nCreationTick"); SCHEMA_ADD_FIELD(CBaseHandle, GetMoveParent, "C_BaseModelEntity->m_hOldMoveParent"); SCHEMA_ADD_FIELD(std::float_t, GetAnimTime, "C_BaseModelEntity->m_flAnimTime"); SCHEMA_ADD_FIELD(std::float_t, GetSimulationTime, "C_BaseModelEntity->m_flSimulationTime"); }; class CPlayer_ItemServices; class CPlayer_CameraServices; class CPlayer_WeaponServices { public: SCHEMA_ADD_FIELD(CBaseHandle, GetActiveWeapon, "CPlayer_WeaponServices->m_hActiveWeapon"); }; class CCSPlayer_WeaponServices : public CPlayer_WeaponServices { public: SCHEMA_ADD_FIELD(GameTime_t, GetNextAttack, "CCSPlayer_WeaponServices->m_flNextAttack"); }; class C_BasePlayerPawn : public C_BaseModelEntity { public: CS_CLASS_NO_INITIALIZER(C_BasePlayerPawn); SCHEMA_ADD_FIELD(CBaseHandle, GetControllerHandle, "C_BasePlayerPawn->m_hController"); SCHEMA_ADD_FIELD(CCSPlayer_WeaponServices*, GetWeaponServices, "C_BasePlayerPawn->m_pWeaponServices"); SCHEMA_ADD_FIELD(CPlayer_ItemServices*, GetItemServices, "C_BasePlayerPawn->m_pItemServices"); SCHEMA_ADD_FIELD(CPlayer_CameraServices*, GetCameraServices, "C_BasePlayerPawn->m_pCameraServices"); [[nodiscard]] Vector_t GetEyePosition() { Vector_t vecEyePosition = Vector_t(0.0f, 0.0f, 0.0f); // Credit: https://www.unknowncheats.me/forum/4258133-post6228.html MEM::CallVFunc(this, &vecEyePosition); return vecEyePosition; } }; class CCSPlayer_ViewModelServices; class C_CSPlayerPawnBase : public C_BasePlayerPawn { public: CS_CLASS_NO_INITIALIZER(C_CSPlayerPawnBase); SCHEMA_ADD_FIELD(CCSPlayer_ViewModelServices*, GetViewModelServices, "C_CSPlayerPawnBase->m_pViewModelServices"); SCHEMA_ADD_FIELD(float, GetLowerBodyYawTarget, "C_CSPlayerPawnBase->m_flLowerBodyYawTarget"); SCHEMA_ADD_FIELD(float, GetFlashMaxAlpha, "C_CSPlayerPawnBase->m_flFlashMaxAlpha"); SCHEMA_ADD_FIELD(float, GetFlashDuration, "C_CSPlayerPawnBase->m_flFlashDuration"); SCHEMA_ADD_FIELD(Vector_t, GetLastSmokeOverlayColor, "C_CSPlayerPawnBase->m_vLastSmokeOverlayColor"); SCHEMA_ADD_FIELD(int, GetSurvivalTeam, "C_CSPlayerPawnBase->m_nSurvivalTeam"); // danger zone }; class C_CSPlayerPawn : public C_CSPlayerPawnBase { public: CS_CLASS_NO_INITIALIZER(C_CSPlayerPawn); [[nodiscard]] bool IsOtherEnemy(C_CSPlayerPawn* pOther); [[nodiscard]] int GetAssociatedTeam(); [[nodiscard]] bool CanAttack(const float flServerTime); [[nodiscard]] std::uint32_t GetOwnerHandleIndex(); [[nodiscard]] std::uint16_t GetCollisionMask(); SCHEMA_ADD_FIELD(bool, IsScoped, "C_CSPlayerPawn->m_bIsScoped"); SCHEMA_ADD_FIELD(bool, IsDefusing, "C_CSPlayerPawn->m_bIsDefusing"); SCHEMA_ADD_FIELD(bool, IsGrabbingHostage, "C_CSPlayerPawn->m_bIsGrabbingHostage"); SCHEMA_ADD_FIELD(bool, IsWaitForNoAttack, "C_CSPlayerPawn->m_bWaitForNoAttack"); SCHEMA_ADD_FIELD(int, GetShotsFired, "C_CSPlayerPawn->m_iShotsFired"); SCHEMA_ADD_FIELD(std::int32_t, GetArmorValue, "C_CSPlayerPawn->m_ArmorValue"); SCHEMA_ADD_FIELD(QAngle_t, GetAimPuchAngle, "C_CSPlayerPawn->m_aimPunchAngle"); }; class CBasePlayerController : public C_BaseModelEntity { public: CS_CLASS_NO_INITIALIZER(CBasePlayerController); SCHEMA_ADD_FIELD(std::uint64_t, GetSteamId, "CBasePlayerController->m_steamID"); SCHEMA_ADD_FIELD(std::uint32_t, GetTickBase, "CBasePlayerController->m_nTickBase"); SCHEMA_ADD_FIELD(CBaseHandle, GetPawnHandle, "CBasePlayerController->m_hPawn"); SCHEMA_ADD_FIELD(bool, IsLocalPlayerController, "CBasePlayerController->m_bIsLocalPlayerController"); }; // forward decleration class C_CSWeaponBaseGun; class C_BasePlayerWeapon; class CCSPlayerController : public CBasePlayerController { public: CS_CLASS_NO_INITIALIZER(CCSPlayerController); [[nodiscard]] static CCSPlayerController* GetLocalPlayerController(); // @note: always get origin from pawn not controller [[nodiscard]] const Vector_t& GetPawnOrigin(); SCHEMA_ADD_FIELD(std::uint32_t, GetPing, "CCSPlayerController->m_iPing"); SCHEMA_ADD_FIELD(const char*, GetPlayerName, "CCSPlayerController->m_sSanitizedPlayerName"); SCHEMA_ADD_FIELD(std::int32_t, GetPawnHealth, "CCSPlayerController->m_iPawnHealth"); SCHEMA_ADD_FIELD(std::int32_t, GetPawnArmor, "CCSPlayerController->m_iPawnArmor"); SCHEMA_ADD_FIELD(bool, IsPawnHasDefuser, "CCSPlayerController->m_bPawnHasDefuser"); SCHEMA_ADD_FIELD(bool, IsPawnHasHelmet, "CCSPlayerController->m_bPawnHasHelmet"); SCHEMA_ADD_FIELD(bool, IsPawnAlive, "CCSPlayerController->m_bPawnIsAlive"); SCHEMA_ADD_FIELD(CBaseHandle, GetPlayerPawnHandle, "CCSPlayerController->m_hPlayerPawn"); }; class CBaseAnimGraph : public C_BaseModelEntity { public: CS_CLASS_NO_INITIALIZER(CBaseAnimGraph); SCHEMA_ADD_FIELD(bool, IsClientRagdoll, "CBaseAnimGraph->m_bClientRagdoll"); }; class C_BaseFlex : public CBaseAnimGraph { public: CS_CLASS_NO_INITIALIZER(C_BaseFlex); /* not implemented */ }; class C_EconItemView { public: CS_CLASS_NO_INITIALIZER(C_EconItemView); SCHEMA_ADD_FIELD(std::uint16_t, GetItemDefinitionIndex, "C_EconItemView->m_iItemDefinitionIndex"); SCHEMA_ADD_FIELD(std::uint64_t, GetItemID, "C_EconItemView->m_iItemID"); SCHEMA_ADD_FIELD(std::uint32_t, GetItemIDHigh, "C_EconItemView->m_iItemIDHigh"); SCHEMA_ADD_FIELD(std::uint32_t, GetItemIDLow, "C_EconItemView->m_iItemIDLow"); SCHEMA_ADD_FIELD(std::uint32_t, GetAccountID, "C_EconItemView->m_iAccountID"); SCHEMA_ADD_FIELD(char[161], GetCustomName, "C_EconItemView->m_szCustomName"); SCHEMA_ADD_FIELD(char[161], GetCustomNameOverride, "C_EconItemView->m_szCustomNameOverride"); }; class CAttributeManager { public: CS_CLASS_NO_INITIALIZER(CAttributeManager); virtual ~CAttributeManager() = 0; }; static_assert(sizeof(CAttributeManager) == 0x8); class C_AttributeContainer : public CAttributeManager { public: CS_CLASS_NO_INITIALIZER(C_AttributeContainer); SCHEMA_ADD_PFIELD(C_EconItemView, GetItem, "C_AttributeContainer->m_Item"); }; class C_EconEntity : public C_BaseFlex { public: CS_CLASS_NO_INITIALIZER(C_EconEntity); SCHEMA_ADD_PFIELD(C_AttributeContainer, GetAttributeManager, "C_EconEntity->m_AttributeManager"); SCHEMA_ADD_FIELD(std::uint32_t, GetOriginalOwnerXuidLow, "C_EconEntity->m_OriginalOwnerXuidLow"); SCHEMA_ADD_FIELD(std::uint32_t, GetOriginalOwnerXuidHigh, "C_EconEntity->m_OriginalOwnerXuidHigh"); SCHEMA_ADD_FIELD(std::int32_t, GetFallbackPaintKit, "C_EconEntity->m_nFallbackPaintKit"); SCHEMA_ADD_FIELD(std::int32_t, GetFallbackSeed, "C_EconEntity->m_nFallbackSeed"); SCHEMA_ADD_FIELD(std::int32_t, GetFallbackWear, "C_EconEntity->m_flFallbackWear"); SCHEMA_ADD_FIELD(std::int32_t, GetFallbackStatTrak, "C_EconEntity->m_nFallbackStatTrak"); SCHEMA_ADD_FIELD(CBaseHandle, GetViewModelAttachmentHandle, "C_EconEntity->m_hViewmodelAttachment"); }; class C_EconWearable : public C_EconEntity { public: CS_CLASS_NO_INITIALIZER(C_EconWearable); SCHEMA_ADD_FIELD(std::int32_t, GetForceSkin, "C_EconWearable->m_nForceSkin"); SCHEMA_ADD_FIELD(bool, IsAlwaysAllow, "C_EconWearable->m_bAlwaysAllow"); }; class C_BasePlayerWeapon : public C_EconEntity { public: CS_CLASS_NO_INITIALIZER(C_BasePlayerWeapon); SCHEMA_ADD_FIELD(GameTick_t, GetNextPrimaryAttackTick, "C_BasePlayerWeapon->m_nNextPrimaryAttackTick"); SCHEMA_ADD_FIELD(float, GetNextPrimaryAttackTickRatio, "C_BasePlayerWeapon->m_flNextPrimaryAttackTickRatio"); SCHEMA_ADD_FIELD(GameTick_t, GetNextSecondaryAttackTick, "C_BasePlayerWeapon->m_nNextSecondaryAttackTick"); SCHEMA_ADD_FIELD(float, GetNextSecondaryAttackTickRatio, "C_BasePlayerWeapon->m_flNextSecondaryAttackTickRatio"); SCHEMA_ADD_FIELD(std::int32_t, GetClip1, "C_BasePlayerWeapon->m_iClip1"); SCHEMA_ADD_FIELD(std::int32_t, GetClip2, "C_BasePlayerWeapon->m_iClip2"); SCHEMA_ADD_FIELD(std::int32_t[2], GetReserveAmmo, "C_BasePlayerWeapon->m_pReserveAmmo"); }; class C_CSWeaponBase : public C_BasePlayerWeapon { public: CS_CLASS_NO_INITIALIZER(C_CSWeaponBase); SCHEMA_ADD_FIELD(bool, IsInReload, "C_CSWeaponBase->m_bInReload"); CCSWeaponBaseVData* GetWeaponVData() { return static_cast(GetVData()); } }; class C_CSWeaponBaseGun : public C_CSWeaponBase { public: CS_CLASS_NO_INITIALIZER(C_CSWeaponBaseGun); SCHEMA_ADD_FIELD(std::int32_t, GetZoomLevel, "C_CSWeaponBaseGun->m_zoomLevel"); SCHEMA_ADD_FIELD(std::int32_t, GetBurstShotsRemaining, "C_CSWeaponBaseGun->m_iBurstShotsRemaining"); SCHEMA_ADD_FIELD(bool, IsBurstMode, "C_CSWeaponBase->m_bBurstMode"); SCHEMA_ADD_FIELD(float, GetPostponeFireReadyFrac, "C_CSWeaponBase->m_flPostponeFireReadyFrac"); [[nodiscard]] bool CanPrimaryAttack(const int nWeaponType, const float flServerTime); [[nodiscard]] bool CanSecondaryAttack(const int nWeaponType, const float flServerTime); }; class C_BaseCSGrenade : public C_CSWeaponBase { public: SCHEMA_ADD_FIELD(bool, IsHeldByPlayer, "C_BaseCSGrenade->m_bIsHeldByPlayer"); SCHEMA_ADD_FIELD(bool, IsPinPulled, "C_BaseCSGrenade->m_bPinPulled"); SCHEMA_ADD_FIELD(GameTime_t, GetThrowTime, "C_BaseCSGrenade->m_fThrowTime"); SCHEMA_ADD_FIELD(float, GetThrowStrength, "C_BaseCSGrenade->m_flThrowStrength"); }; class C_BaseGrenade : public C_BaseFlex { public: CS_CLASS_NO_INITIALIZER(C_BaseGrenade); }; class CSkeletonInstance : public CGameSceneNode { public: MEM_PAD(0x1CC); //0x0000 int nBoneCount; //0x01CC MEM_PAD(0x18); //0x01D0 int nMask; //0x01E8 MEM_PAD(0x4); //0x01EC Matrix2x4_t* pBoneCache; //0x01F0 };