432 lines
15 KiB
C++
432 lines
15 KiB
C++
#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<void, 38U>(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<std::uint16_t*>(reinterpret_cast<std::uintptr_t>(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<CSkeletonInstance*, 8U>(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::int32_t, GetMoveType, "C_BaseEntity->m_MoveType");
|
|
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);
|
|
MEM::CallVFunc<void, 166U>(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<CCSWeaponBaseVData*>(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
|
|
};
|