diff --git a/managed/CounterStrikeSharp.API/Core/Listeners.g.cs b/managed/CounterStrikeSharp.API/Core/Listeners.g.cs
index ee0918c47..6141fb2b4 100644
--- a/managed/CounterStrikeSharp.API/Core/Listeners.g.cs
+++ b/managed/CounterStrikeSharp.API/Core/Listeners.g.cs
@@ -183,6 +183,15 @@ public class Listeners
[ListenerName("CheckTransmit")]
public delegate void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList);
+ ///
+ /// Called in the entity pre-think when the player's buttons have changed.
+ ///
+ ///
+ ///
+ ///
+ [ListenerName("OnPlayerButtonsChanged")]
+ public delegate void OnPlayerButtonsChanged(CCSPlayerController player, PlayerButtons pressed, PlayerButtons released);
+
///
/// Called when all metamod plugins are loaded.
///
diff --git a/managed/CounterStrikeSharp.API/Core/ScriptContext.cs b/managed/CounterStrikeSharp.API/Core/ScriptContext.cs
index a8a89e1e2..af6064f57 100644
--- a/managed/CounterStrikeSharp.API/Core/ScriptContext.cs
+++ b/managed/CounterStrikeSharp.API/Core/ScriptContext.cs
@@ -50,13 +50,12 @@ public unsafe struct fxScriptContext
public ulong nativeIdentifier;
public fixed byte functionData[8 * 32];
- public fixed byte result[8];
- }
+ public fixed byte result[8];
+ }
public class ScriptContext
{
- [ThreadStatic]
- private static ScriptContext _globalScriptContext;
+ [ThreadStatic] private static ScriptContext _globalScriptContext;
public static ScriptContext GlobalScriptContext
{
@@ -67,14 +66,14 @@ public static ScriptContext GlobalScriptContext
}
}
- public unsafe ScriptContext()
+ public unsafe ScriptContext()
{
}
- public unsafe ScriptContext(fxScriptContext* context)
- {
- m_extContext = *context;
- }
+ public unsafe ScriptContext(fxScriptContext* context)
+ {
+ m_extContext = *context;
+ }
private readonly ConcurrentQueue ms_finalizers = new ConcurrentQueue();
@@ -84,7 +83,7 @@ public unsafe ScriptContext(fxScriptContext* context)
internal fxScriptContext m_extContext = new fxScriptContext();
- internal bool isCleanupLocked = false;
+ internal bool isCleanupLocked = false;
[SecuritySafeCritical]
public void Reset()
@@ -97,23 +96,23 @@ private void InternalReset()
{
m_extContext.numArguments = 0;
m_extContext.numResults = 0;
- m_extContext.hasError = 0;
- //CleanUp();
- }
+ m_extContext.hasError = 0;
+ //CleanUp();
+ }
[SecuritySafeCritical]
public void Invoke()
{
- if (!isCleanupLocked)
- {
- isCleanupLocked = true;
- InvokeNativeInternal();
- GlobalCleanUp();
- isCleanupLocked = false;
- return;
- }
+ if (!isCleanupLocked)
+ {
+ isCleanupLocked = true;
+ InvokeNativeInternal();
+ GlobalCleanUp();
+ isCleanupLocked = false;
+ return;
+ }
- InvokeNativeInternal();
+ InvokeNativeInternal();
}
[SecurityCritical]
@@ -153,13 +152,13 @@ public void Push(object arg)
PushInternal(arg);
}
- [SecuritySafeCritical]
+ [SecuritySafeCritical]
public unsafe void SetResult(object arg, fxScriptContext* cxt)
{
- SetResultInternal(cxt, arg);
+ SetResultInternal(cxt, arg);
}
- [SecurityCritical]
+ [SecurityCritical]
private unsafe void PushInternal(object arg)
{
fixed (fxScriptContext* context = &m_extContext)
@@ -188,7 +187,6 @@ public unsafe void CheckErrors()
throw new NativeException(error);
}
}
-
}
[SecurityCritical]
@@ -217,15 +215,15 @@ internal unsafe void Push(fxScriptContext* context, object arg)
return;
}
- else if (arg is IMarshalToNative marshalToNative)
- {
- foreach (var value in marshalToNative.GetNativeObject())
- {
- Push(context ,value);
- }
+ else if (arg is IMarshalToNative marshalToNative)
+ {
+ foreach (var value in marshalToNative.GetNativeObject())
+ {
+ Push(context, value);
+ }
- return;
- }
+ return;
+ }
else if (arg is NativeObject nativeObject)
{
Push(context, (InputArgument)nativeObject);
@@ -245,38 +243,38 @@ internal unsafe void Push(fxScriptContext* context, object arg)
context->numArguments++;
}
- [SecurityCritical]
- internal unsafe void SetResultInternal(fxScriptContext* context, object arg)
- {
- if (arg == null)
- {
- arg = 0;
- }
+ [SecurityCritical]
+ internal unsafe void SetResultInternal(fxScriptContext* context, object arg)
+ {
+ if (arg == null)
+ {
+ arg = 0;
+ }
- if (arg.GetType().IsEnum)
- {
- arg = Convert.ChangeType(arg, arg.GetType().GetEnumUnderlyingType());
- }
+ if (arg.GetType().IsEnum)
+ {
+ arg = Convert.ChangeType(arg, arg.GetType().GetEnumUnderlyingType());
+ }
- if (arg is string)
- {
- var str = (string)Convert.ChangeType(arg, typeof(string));
- SetResultString(context, str);
+ if (arg is string)
+ {
+ var str = (string)Convert.ChangeType(arg, typeof(string));
+ SetResultString(context, str);
- return;
- }
- else if (arg is InputArgument ia)
- {
- SetResultInternal(context, ia.Value);
+ return;
+ }
+ else if (arg is InputArgument ia)
+ {
+ SetResultInternal(context, ia.Value);
- return;
- }
+ return;
+ }
- if (Marshal.SizeOf(arg.GetType()) <= 8)
- {
- SetResultUnsafe(context, arg);
- }
- }
+ if (Marshal.SizeOf(arg.GetType()) <= 8)
+ {
+ SetResultUnsafe(context, arg);
+ }
+ }
[SecurityCritical]
internal unsafe void PushUnsafe(fxScriptContext* cxt, object arg)
@@ -285,14 +283,14 @@ internal unsafe void PushUnsafe(fxScriptContext* cxt, object arg)
Marshal.StructureToPtr(arg, new IntPtr(cxt->functionData + (8 * cxt->numArguments)), true);
}
- [SecurityCritical]
- internal unsafe void SetResultUnsafe(fxScriptContext* cxt, object arg)
- {
- *(long*)(&cxt->result[0]) = 0;
- Marshal.StructureToPtr(arg, new IntPtr(cxt->result), true);
- }
+ [SecurityCritical]
+ internal unsafe void SetResultUnsafe(fxScriptContext* cxt, object arg)
+ {
+ *(long*)(&cxt->result[0]) = 0;
+ Marshal.StructureToPtr(arg, new IntPtr(cxt->result), true);
+ }
- [SecurityCritical]
+ [SecurityCritical]
internal unsafe void PushString(string str)
{
fixed (fxScriptContext* cxt = &m_extContext)
@@ -326,28 +324,28 @@ internal unsafe void PushString(fxScriptContext* cxt, string str)
cxt->numArguments++;
}
- [SecurityCritical]
- internal unsafe void SetResultString(fxScriptContext* cxt, string str)
- {
- var ptr = IntPtr.Zero;
+ [SecurityCritical]
+ internal unsafe void SetResultString(fxScriptContext* cxt, string str)
+ {
+ var ptr = IntPtr.Zero;
- if (str != null)
- {
- var b = Encoding.UTF8.GetBytes(str);
+ if (str != null)
+ {
+ var b = Encoding.UTF8.GetBytes(str);
- ptr = Marshal.AllocHGlobal(b.Length + 1);
+ ptr = Marshal.AllocHGlobal(b.Length + 1);
- Marshal.Copy(b, 0, ptr, b.Length);
- Marshal.WriteByte(ptr, b.Length, 0);
+ Marshal.Copy(b, 0, ptr, b.Length);
+ Marshal.WriteByte(ptr, b.Length, 0);
- ms_finalizers.Enqueue(() => Free(ptr));
- }
+ ms_finalizers.Enqueue(() => Free(ptr));
+ }
- unsafe
- {
- *(IntPtr*)(&cxt->result[8]) = ptr;
- }
- }
+ unsafe
+ {
+ *(IntPtr*)(&cxt->result[8]) = ptr;
+ }
+ }
[SecuritySafeCritical]
private void Free(IntPtr ptr)
@@ -464,7 +462,7 @@ internal unsafe object GetResult(Type type, byte* ptr)
if (type.IsEnum)
{
- return Enum.ToObject(type, (int)GetResult(typeof(int), ptr));
+ return Enum.ToObject(type, GetResult(type.GetEnumUnderlyingType(), ptr));
}
if (Marshal.SizeOf(type) <= 8)
diff --git a/src/core/cs2_sdk/entity/dump.h b/src/core/cs2_sdk/entity/dump.h
new file mode 100644
index 000000000..d6dcf4727
--- /dev/null
+++ b/src/core/cs2_sdk/entity/dump.h
@@ -0,0 +1,1029 @@
+#include "core/cs2_sdk/schema.h"
+#include "public/variant.h"
+#include "entity2/entitysystem.h"
+#include "game/shared/ehandle.h"
+
+class CGameSceneNode;
+class CCSPlayerPawn;
+class CBasePlayerPawn;
+class CCollisionProperty;
+class CBodyComponent;
+
+class CNetworkTransmitComponent
+{
+ DECLARE_SCHEMA_CLASS(CNetworkTransmitComponent)
+
+ SCHEMA_FIELD(uint8, m_nTransmitStateOwnedCounter)
+};
+
+class GameTick_t
+{
+ DECLARE_SCHEMA_CLASS(GameTick_t)
+
+ SCHEMA_FIELD(int32, m_Value)
+};
+
+enum InputBitMask_t : uint64_t
+{
+ // MEnumeratorIsNotAFlag
+ IN_NONE = 0x0,
+ // MEnumeratorIsNotAFlag
+ IN_ALL = 0xffffffffffffffff,
+ IN_ATTACK = 0x1,
+ IN_JUMP = 0x2,
+ IN_DUCK = 0x4,
+ IN_FORWARD = 0x8,
+ IN_BACK = 0x10,
+ IN_USE = 0x20,
+ IN_TURNLEFT = 0x80,
+ IN_TURNRIGHT = 0x100,
+ IN_MOVELEFT = 0x200,
+ IN_MOVERIGHT = 0x400,
+ IN_ATTACK2 = 0x800,
+ IN_RELOAD = 0x2000,
+ IN_SPEED = 0x10000,
+ IN_JOYAUTOSPRINT = 0x20000,
+ // MEnumeratorIsNotAFlag
+ IN_FIRST_MOD_SPECIFIC_BIT = 0x100000000,
+ IN_USEORRELOAD = 0x100000000,
+ IN_SCORE = 0x200000000,
+ IN_ZOOM = 0x400000000,
+ IN_LOOK_AT_WEAPON = 0x800000000,
+};
+
+enum class TakeDamageFlags_t : uint64
+{
+ DFLAG_NONE = 0,
+ DFLAG_SUPPRESS_HEALTH_CHANGES = 1, // (1 << 0)
+ DFLAG_SUPPRESS_PHYSICS_FORCE = 2, // (1 << 1)
+ DFLAG_SUPPRESS_EFFECTS = 4, // (1 << 2)
+ DFLAG_PREVENT_DEATH = 8, // (1 << 3)
+ DFLAG_FORCE_DEATH = 16, // (1 << 4)
+ DFLAG_ALWAYS_GIB = 32, // (1 << 5)
+ DFLAG_NEVER_GIB = 64, // (1 << 6)
+ DFLAG_REMOVE_NO_RAGDOLL = 128, // (1 << 7)
+ DFLAG_SUPPRESS_DAMAGE_MODIFICATION = 256, // (1 << 8)
+ DFLAG_ALWAYS_FIRE_DAMAGE_EVENTS = 512, // (1 << 9)
+ DFLAG_RADIUS_DMG = 1024, // (1 << 10)
+ DFLAG_FORCEREDUCEARMOR_DMG = 2048, // (1 << 11)
+ DFLAG_SUPPRESS_INTERRUPT_FLINCH = 4096, // (1 << 12)
+ DMG_LASTDFLAG = 4096, // (1 << 12)
+ DFLAG_IGNORE_ARMOR = 8192, // (1 << 13)
+ DFLAG_SUPPRESS_UTILREMOVE = 16384, // (1 << 14)
+};
+
+enum class EntityPlatformTypes_t : uint8
+{
+ ENTITY_NOT_PLATFORM = 0,
+ ENTITY_PLATFORM_PLAYER_FOLLOWS_YAW = 1,
+ ENTITY_PLATFORM_PLAYER_IGNORES_YAW = 2,
+};
+
+class CEntityIOOutput
+{
+ DECLARE_SCHEMA_CLASS(CEntityIOOutput)
+};
+
+class CNetworkVelocityVector
+{
+ DECLARE_SCHEMA_CLASS(CNetworkVelocityVector)
+
+ SCHEMA_FIELD(float, m_vecX)
+ SCHEMA_FIELD(float, m_vecY)
+ SCHEMA_FIELD(float, m_vecZ)
+};
+
+enum class BloodType : int32
+{
+ None = -1,
+ ColorRed = 0,
+ ColorYellow = 1,
+ ColorGreen = 2,
+ ColorRedLVL2 = 3,
+ ColorRedLVL3 = 4,
+ ColorRedLVL4 = 5,
+ ColorRedLVL5 = 6,
+ ColorRedLVL6 = 7,
+};
+
+class CBaseEntity : public CEntityInstance
+{
+ DECLARE_SCHEMA_CLASS(CBaseEntity)
+
+ SCHEMA_FIELD(CBodyComponent*, m_CBodyComponent)
+ SCHEMA_FIELD(CNetworkTransmitComponent, m_NetworkTransmitComponent)
+ SCHEMA_FIELD(int32, m_iCurrentThinkContext)
+ SCHEMA_FIELD(GameTick_t, m_nLastThinkTick)
+ SCHEMA_FIELD(bool, m_bDisabledContextThinks)
+ SCHEMA_FIELD(CBitVec<64>, m_isSteadyState)
+ SCHEMA_FIELD(float32, m_lastNetworkChange)
+ SCHEMA_FIELD(CUtlSymbolLarge, m_iszResponseContext)
+ SCHEMA_FIELD(int32, m_iHealth)
+ SCHEMA_FIELD(int32, m_iMaxHealth)
+ SCHEMA_FIELD(uint8, m_lifeState)
+ SCHEMA_FIELD(float32, m_flDamageAccumulator)
+ SCHEMA_FIELD(bool, m_bTakesDamage)
+ SCHEMA_FIELD(TakeDamageFlags_t, m_nTakeDamageFlags)
+ SCHEMA_FIELD(EntityPlatformTypes_t, m_nPlatformType)
+ SCHEMA_FIELD(MoveCollide_t, m_MoveCollide)
+ SCHEMA_FIELD(MoveType_t, m_MoveType)
+ SCHEMA_FIELD(MoveType_t, m_nActualMoveType)
+ SCHEMA_FIELD(uint8, m_nWaterTouch)
+ SCHEMA_FIELD(uint8, m_nSlimeTouch)
+ SCHEMA_FIELD(bool, m_bRestoreInHierarchy)
+ SCHEMA_FIELD(CUtlSymbolLarge, m_target)
+ SCHEMA_FIELD(CUtlSymbolLarge, m_iszDamageFilterName)
+ SCHEMA_FIELD(float32, m_flMoveDoneTime)
+ SCHEMA_FIELD(CUtlStringToken, m_nSubclassID)
+ SCHEMA_FIELD(float32, m_flAnimTime)
+ SCHEMA_FIELD(float32, m_flSimulationTime)
+ SCHEMA_FIELD(GameTime_t, m_flCreateTime)
+ SCHEMA_FIELD(bool, m_bClientSideRagdoll)
+ SCHEMA_FIELD(uint8, m_ubInterpolationFrame)
+ SCHEMA_FIELD(Vector, m_vPrevVPhysicsUpdatePos)
+ SCHEMA_FIELD(uint8, m_iTeamNum)
+ SCHEMA_FIELD(CUtlSymbolLarge, m_iGlobalname)
+ SCHEMA_FIELD(int32, m_iSentToClients)
+ SCHEMA_FIELD(float32, m_flSpeed)
+ SCHEMA_FIELD(CUtlString, m_sUniqueHammerID)
+ SCHEMA_FIELD(uint32, m_spawnflags)
+ SCHEMA_FIELD(GameTick_t, m_nNextThinkTick)
+ SCHEMA_FIELD(int32, m_nSimulationTick)
+ SCHEMA_FIELD(CEntityIOOutput, m_OnKilled)
+ SCHEMA_FIELD(uint32, m_fFlags)
+ SCHEMA_FIELD(Vector, m_vecAbsVelocity)
+ SCHEMA_FIELD(CNetworkVelocityVector, m_vecVelocity)
+ SCHEMA_FIELD(Vector, m_vecBaseVelocity)
+ SCHEMA_FIELD(int32, m_nPushEnumCount)
+ SCHEMA_FIELD(CCollisionProperty*, m_pCollision)
+ SCHEMA_FIELD(CHandle, m_hEffectEntity)
+ SCHEMA_FIELD(CHandle, m_hOwnerEntity)
+ SCHEMA_FIELD(uint32, m_fEffects)
+ SCHEMA_FIELD(CHandle, m_hGroundEntity)
+ SCHEMA_FIELD(int32, m_nGroundBodyIndex)
+ SCHEMA_FIELD(float32, m_flFriction)
+ SCHEMA_FIELD(float32, m_flElasticity)
+ SCHEMA_FIELD(float32, m_flGravityScale)
+ SCHEMA_FIELD(float32, m_flTimeScale)
+ SCHEMA_FIELD(float32, m_flWaterLevel)
+ SCHEMA_FIELD(bool, m_bAnimatedEveryTick)
+ SCHEMA_FIELD(bool, m_bDisableLowViolence)
+ SCHEMA_FIELD(uint8, m_nWaterType)
+ SCHEMA_FIELD(int32, m_iEFlags)
+ SCHEMA_FIELD(CEntityIOOutput, m_OnUser1)
+ SCHEMA_FIELD(CEntityIOOutput, m_OnUser2)
+ SCHEMA_FIELD(CEntityIOOutput, m_OnUser3)
+ SCHEMA_FIELD(CEntityIOOutput, m_OnUser4)
+ SCHEMA_FIELD(int32, m_iInitialTeamNum)
+ SCHEMA_FIELD(GameTime_t, m_flNavIgnoreUntilTime)
+ SCHEMA_FIELD(QAngle, m_vecAngVelocity)
+ SCHEMA_FIELD(bool, m_bNetworkQuantizeOriginAndAngles)
+ SCHEMA_FIELD(bool, m_bLagCompensate)
+ SCHEMA_FIELD(float32, m_flOverriddenFriction)
+ SCHEMA_FIELD(CHandle, m_pBlocker)
+ SCHEMA_FIELD(float32, m_flLocalTime)
+ SCHEMA_FIELD(float32, m_flVPhysicsUpdateLocalTime)
+ SCHEMA_FIELD(BloodType, m_nBloodType)
+};
+
+enum class PlayerConnectedState : int32
+{
+ PlayerNeverConnected = -1,
+ PlayerConnected = 0,
+ PlayerConnecting = 1,
+ PlayerReconnecting = 2,
+ PlayerDisconnecting = 3,
+ PlayerDisconnected = 4,
+ PlayerReserved = 5,
+};
+
+enum class ChatIgnoreType_t : uint32
+{
+ CHAT_IGNORE_NONE = 0,
+ CHAT_IGNORE_ALL = 1,
+ CHAT_IGNORE_TEAM = 2,
+};
+
+class CBasePlayerController : public CBaseEntity
+{
+ public:
+ DECLARE_SCHEMA_CLASS(CBasePlayerController)
+
+ SCHEMA_FIELD(uint64, m_nInButtonsWhichAreToggles)
+ SCHEMA_FIELD(uint32, m_nTickBase)
+ SCHEMA_FIELD(CHandle, m_hPawn)
+ SCHEMA_FIELD(bool, m_bKnownTeamMismatch)
+ SCHEMA_FIELD(CSplitScreenSlot, m_nSplitScreenSlot)
+ SCHEMA_FIELD(CHandle, m_hSplitOwner)
+ SCHEMA_FIELD(bool, m_bIsHLTV)
+ SCHEMA_FIELD(PlayerConnectedState, m_iConnected)
+ SCHEMA_FIELD_POINTER(char, m_iszPlayerName)
+ SCHEMA_FIELD(CUtlString, m_szNetworkIDString)
+ SCHEMA_FIELD(float32, m_fLerpTime)
+ SCHEMA_FIELD(bool, m_bLagCompensation)
+ SCHEMA_FIELD(bool, m_bPredict)
+ SCHEMA_FIELD(bool, m_bIsLowViolence)
+ SCHEMA_FIELD(bool, m_bGamePaused)
+ SCHEMA_FIELD(ChatIgnoreType_t, m_iIgnoreGlobalChat)
+ SCHEMA_FIELD(float32, m_flLastPlayerTalkTime)
+ SCHEMA_FIELD(float32, m_flLastEntitySteadyState)
+ SCHEMA_FIELD(int32, m_nAvailableEntitySteadyState)
+ SCHEMA_FIELD(bool, m_bHasAnySteadyStateEnts)
+ SCHEMA_FIELD(uint64, m_steamID)
+ SCHEMA_FIELD(uint32, m_iDesiredFOV)
+};
+
+class QuestProgress
+{
+ DECLARE_SCHEMA_CLASS(QuestProgress)
+};
+
+class IntervalTimer
+{
+ DECLARE_SCHEMA_CLASS(IntervalTimer)
+
+ SCHEMA_FIELD(GameTime_t, m_timestamp)
+ SCHEMA_FIELD(WorldGroupId_t, m_nWorldGroupId)
+};
+
+class CCSPlayerController : public CBasePlayerController
+{
+ public:
+ DECLARE_SCHEMA_CLASS(CCSPlayerController)
+
+ SCHEMA_FIELD(uint32, m_iPing)
+ SCHEMA_FIELD(bool, m_bHasCommunicationAbuseMute)
+ SCHEMA_FIELD(uint32, m_uiCommunicationMuteFlags)
+ SCHEMA_FIELD(CUtlSymbolLarge, m_szCrosshairCodes)
+ SCHEMA_FIELD(uint8, m_iPendingTeamNum)
+ SCHEMA_FIELD(GameTime_t, m_flForceTeamTime)
+ SCHEMA_FIELD(int32, m_iCompTeammateColor)
+ SCHEMA_FIELD(bool, m_bEverPlayedOnTeam)
+ SCHEMA_FIELD(bool, m_bAttemptedToGetColor)
+ SCHEMA_FIELD(int32, m_iTeammatePreferredColor)
+ SCHEMA_FIELD(bool, m_bTeamChanged)
+ SCHEMA_FIELD(bool, m_bInSwitchTeam)
+ SCHEMA_FIELD(bool, m_bHasSeenJoinGame)
+ SCHEMA_FIELD(bool, m_bJustBecameSpectator)
+ SCHEMA_FIELD(bool, m_bSwitchTeamsOnNextRoundReset)
+ SCHEMA_FIELD(bool, m_bRemoveAllItemsOnNextRoundReset)
+ SCHEMA_FIELD(GameTime_t, m_flLastJoinTeamTime)
+ SCHEMA_FIELD(CUtlSymbolLarge, m_szClan)
+ SCHEMA_FIELD_POINTER(char, m_szClanName)
+ SCHEMA_FIELD(int32, m_iCoachingTeam)
+ SCHEMA_FIELD(uint64, m_nPlayerDominated)
+ SCHEMA_FIELD(uint64, m_nPlayerDominatingMe)
+ SCHEMA_FIELD(int32, m_iCompetitiveRanking)
+ SCHEMA_FIELD(int32, m_iCompetitiveWins)
+ SCHEMA_FIELD(int8, m_iCompetitiveRankType)
+ SCHEMA_FIELD(int32, m_iCompetitiveRankingPredicted_Win)
+ SCHEMA_FIELD(int32, m_iCompetitiveRankingPredicted_Loss)
+ SCHEMA_FIELD(int32, m_iCompetitiveRankingPredicted_Tie)
+ SCHEMA_FIELD(int32, m_nEndMatchNextMapVote)
+ SCHEMA_FIELD(uint16, m_unActiveQuestId)
+ SCHEMA_FIELD(uint32, m_rtActiveMissionPeriod)
+ SCHEMA_FIELD(uint32, m_unPlayerTvControlFlags)
+ SCHEMA_FIELD(int32, m_iDraftIndex)
+ SCHEMA_FIELD(uint32, m_msQueuedModeDisconnectionTimestamp)
+ SCHEMA_FIELD(uint32, m_uiAbandonRecordedReason)
+ SCHEMA_FIELD(uint32, m_eNetworkDisconnectionReason)
+ SCHEMA_FIELD(bool, m_bCannotBeKicked)
+ SCHEMA_FIELD(bool, m_bEverFullyConnected)
+ SCHEMA_FIELD(bool, m_bAbandonAllowsSurrender)
+ SCHEMA_FIELD(bool, m_bAbandonOffersInstantSurrender)
+ SCHEMA_FIELD(bool, m_bDisconnection1MinWarningPrinted)
+ SCHEMA_FIELD(bool, m_bScoreReported)
+ SCHEMA_FIELD(int32, m_nDisconnectionTick)
+ SCHEMA_FIELD(bool, m_bControllingBot)
+ SCHEMA_FIELD(bool, m_bHasControlledBotThisRound)
+ SCHEMA_FIELD(bool, m_bHasBeenControlledByPlayerThisRound)
+ SCHEMA_FIELD(int32, m_nBotsControlledThisRound)
+ SCHEMA_FIELD(bool, m_bCanControlObservedBot)
+ SCHEMA_FIELD(CHandle, m_hPlayerPawn)
+ SCHEMA_FIELD(int32, m_DesiredObserverMode)
+ SCHEMA_FIELD(CEntityHandle, m_hDesiredObserverTarget)
+ SCHEMA_FIELD(bool, m_bPawnIsAlive)
+ SCHEMA_FIELD(uint32, m_iPawnHealth)
+ SCHEMA_FIELD(int32, m_iPawnArmor)
+ SCHEMA_FIELD(bool, m_bPawnHasDefuser)
+ SCHEMA_FIELD(bool, m_bPawnHasHelmet)
+ SCHEMA_FIELD(uint16, m_nPawnCharacterDefIndex)
+ SCHEMA_FIELD(int32, m_iPawnLifetimeStart)
+ SCHEMA_FIELD(int32, m_iPawnLifetimeEnd)
+ SCHEMA_FIELD(int32, m_iPawnBotDifficulty)
+ SCHEMA_FIELD(CHandle, m_hOriginalControllerOfCurrentPawn)
+ SCHEMA_FIELD(int32, m_iScore)
+ SCHEMA_FIELD(int32, m_iRoundScore)
+ SCHEMA_FIELD(int32, m_iRoundsWon)
+ SCHEMA_FIELD_POINTER(uint8, m_recentKillQueue)
+ SCHEMA_FIELD(uint8, m_nFirstKill)
+ SCHEMA_FIELD(uint8, m_nKillCount)
+ SCHEMA_FIELD(bool, m_bMvpNoMusic)
+ SCHEMA_FIELD(int32, m_eMvpReason)
+ SCHEMA_FIELD(int32, m_iMusicKitID)
+ SCHEMA_FIELD(int32, m_iMusicKitMVPs)
+ SCHEMA_FIELD(int32, m_iMVPs)
+ SCHEMA_FIELD(int32, m_nUpdateCounter)
+ SCHEMA_FIELD(float32, m_flSmoothedPing)
+ SCHEMA_FIELD(IntervalTimer, m_lastHeldVoteTimer)
+ SCHEMA_FIELD(bool, m_bShowHints)
+ SCHEMA_FIELD(int32, m_iNextTimeCheck)
+ SCHEMA_FIELD(bool, m_bJustDidTeamKill)
+ SCHEMA_FIELD(bool, m_bPunishForTeamKill)
+ SCHEMA_FIELD(bool, m_bGaveTeamDamageWarning)
+ SCHEMA_FIELD(bool, m_bGaveTeamDamageWarningThisRound)
+ SCHEMA_FIELD(float64, m_dblLastReceivedPacketPlatFloatTime)
+ SCHEMA_FIELD(GameTime_t, m_LastTeamDamageWarningTime)
+ SCHEMA_FIELD(GameTime_t, m_LastTimePlayerWasDisconnectedForPawnsRemove)
+ SCHEMA_FIELD(uint32, m_nSuspiciousHitCount)
+ SCHEMA_FIELD(uint32, m_nNonSuspiciousHitStreak)
+ SCHEMA_FIELD(bool, m_bFireBulletsSeedSynchronized)
+};
+
+class CNetworkVarChainer
+{
+ DECLARE_SCHEMA_CLASS(CNetworkVarChainer)
+
+ SCHEMA_FIELD(ChangeAccessorFieldPathIndex_t, m_PathIndex)
+};
+
+class CBodyComponent : public CEntityComponent
+{
+ DECLARE_SCHEMA_CLASS(CBodyComponent)
+
+ SCHEMA_FIELD(CGameSceneNode*, m_pSceneNode)
+ SCHEMA_FIELD(CNetworkVarChainer, __m_pChainEntity)
+};
+
+class CHitboxComponent : public CEntityComponent
+{
+ DECLARE_SCHEMA_CLASS(CHitboxComponent)
+
+ SCHEMA_FIELD_POINTER(uint32, m_bvDisabledHitGroups)
+};
+
+class VPhysicsCollisionAttribute_t
+{
+ DECLARE_SCHEMA_CLASS(VPhysicsCollisionAttribute_t)
+
+ SCHEMA_FIELD(uint64, m_nInteractsAs)
+ SCHEMA_FIELD(uint64, m_nInteractsWith)
+ SCHEMA_FIELD(uint64, m_nInteractsExclude)
+ SCHEMA_FIELD(uint32, m_nEntityId)
+ SCHEMA_FIELD(uint32, m_nOwnerId)
+ SCHEMA_FIELD(uint16, m_nHierarchyId)
+ SCHEMA_FIELD(uint8, m_nCollisionGroup)
+ SCHEMA_FIELD(uint8, m_nCollisionFunctionMask)
+};
+
+enum class SurroundingBoundsType_t : uint8
+{
+ USE_OBB_COLLISION_BOUNDS = 0,
+ USE_BEST_COLLISION_BOUNDS = 1,
+ USE_HITBOXES = 2,
+ USE_SPECIFIED_BOUNDS = 3,
+ USE_GAME_CODE = 4,
+ USE_ROTATION_EXPANDED_BOUNDS = 5,
+ USE_ROTATION_EXPANDED_ORIENTED_BOUNDS = 6,
+ USE_COLLISION_BOUNDS_NEVER_VPHYSICS = 7,
+ USE_ROTATION_EXPANDED_SEQUENCE_BOUNDS = 8,
+ SURROUNDING_TYPE_BIT_COUNT = 3,
+};
+
+class CCollisionProperty
+{
+ DECLARE_SCHEMA_CLASS(CCollisionProperty)
+
+ SCHEMA_FIELD(VPhysicsCollisionAttribute_t, m_collisionAttribute)
+ SCHEMA_FIELD(Vector, m_vecMins)
+ SCHEMA_FIELD(Vector, m_vecMaxs)
+ SCHEMA_FIELD(uint8, m_usSolidFlags)
+ SCHEMA_FIELD(SolidType_t, m_nSolidType)
+ SCHEMA_FIELD(uint8, m_triggerBloat)
+ SCHEMA_FIELD(SurroundingBoundsType_t, m_nSurroundType)
+ SCHEMA_FIELD(uint8, m_CollisionGroup)
+ SCHEMA_FIELD(uint8, m_nEnablePhysics)
+ SCHEMA_FIELD(float32, m_flBoundingRadius)
+ SCHEMA_FIELD(Vector, m_vecSpecifiedSurroundingMins)
+ SCHEMA_FIELD(Vector, m_vecSpecifiedSurroundingMaxs)
+ SCHEMA_FIELD(Vector, m_vecSurroundingMaxs)
+ SCHEMA_FIELD(Vector, m_vecSurroundingMins)
+ SCHEMA_FIELD(Vector, m_vCapsuleCenter1)
+ SCHEMA_FIELD(Vector, m_vCapsuleCenter2)
+ SCHEMA_FIELD(float32, m_flCapsuleRadius)
+};
+
+class CGlowProperty
+{
+ DECLARE_SCHEMA_CLASS(CGlowProperty)
+
+ SCHEMA_FIELD(Vector, m_fGlowColor)
+ SCHEMA_FIELD(int32, m_iGlowType)
+ SCHEMA_FIELD(int32, m_iGlowTeam)
+ SCHEMA_FIELD(int32, m_nGlowRange)
+ SCHEMA_FIELD(int32, m_nGlowRangeMin)
+ SCHEMA_FIELD(Color, m_glowColorOverride)
+ SCHEMA_FIELD(bool, m_bFlashing)
+ SCHEMA_FIELD(float32, m_flGlowTime)
+ SCHEMA_FIELD(float32, m_flGlowStartTime)
+ SCHEMA_FIELD(bool, m_bEligibleForScreenHighlight)
+ SCHEMA_FIELD(bool, m_bGlowing)
+};
+
+class CNetworkViewOffsetVector
+{
+ DECLARE_SCHEMA_CLASS(CNetworkViewOffsetVector)
+
+ SCHEMA_FIELD(float, m_vecX)
+ SCHEMA_FIELD(float, m_vecY)
+ SCHEMA_FIELD(float, m_vecZ)
+};
+
+class CBaseModelEntity : public CBaseEntity
+{
+ DECLARE_SCHEMA_CLASS(CBaseModelEntity)
+
+ SCHEMA_FIELD(CHitboxComponent, m_CHitboxComponent)
+ SCHEMA_FIELD(HitGroup_t, m_nDestructiblePartInitialStateDestructed0)
+ SCHEMA_FIELD(HitGroup_t, m_nDestructiblePartInitialStateDestructed1)
+ SCHEMA_FIELD(HitGroup_t, m_nDestructiblePartInitialStateDestructed2)
+ SCHEMA_FIELD(HitGroup_t, m_nDestructiblePartInitialStateDestructed3)
+ SCHEMA_FIELD(HitGroup_t, m_nDestructiblePartInitialStateDestructed4)
+ SCHEMA_FIELD(int32, m_nLastHitDestructiblePartIndex)
+ SCHEMA_FIELD(HitGroup_t, m_LastHitGroup)
+ SCHEMA_FIELD(GameTime_t, m_flDissolveStartTime)
+ SCHEMA_FIELD(CEntityIOOutput, m_OnIgnite)
+ SCHEMA_FIELD(RenderMode_t, m_nRenderMode)
+ SCHEMA_FIELD(RenderFx_t, m_nRenderFX)
+ SCHEMA_FIELD(bool, m_bAllowFadeInView)
+ SCHEMA_FIELD(Color, m_clrRender)
+ SCHEMA_FIELD(bool, m_bRenderToCubemaps)
+ SCHEMA_FIELD(bool, m_bNoInterpolate)
+ SCHEMA_FIELD(CCollisionProperty, m_Collision)
+ SCHEMA_FIELD(CGlowProperty, m_Glow)
+ SCHEMA_FIELD(float32, m_flGlowBackfaceMult)
+ SCHEMA_FIELD(float32, m_fadeMinDist)
+ SCHEMA_FIELD(float32, m_fadeMaxDist)
+ SCHEMA_FIELD(float32, m_flFadeScale)
+ SCHEMA_FIELD(float32, m_flShadowStrength)
+ SCHEMA_FIELD(uint8, m_nObjectCulling)
+ SCHEMA_FIELD(int32, m_nAddDecal)
+ SCHEMA_FIELD(Vector, m_vDecalPosition)
+ SCHEMA_FIELD(Vector, m_vDecalForwardAxis)
+ SCHEMA_FIELD(float32, m_flDecalHealBloodRate)
+ SCHEMA_FIELD(float32, m_flDecalHealHeightRate)
+ SCHEMA_FIELD(CNetworkViewOffsetVector, m_vecViewOffset)
+};
+
+class PhysicsRagdollPose_t
+{
+ DECLARE_SCHEMA_CLASS(PhysicsRagdollPose_t)
+
+ SCHEMA_FIELD(CHandle, m_hOwner)
+};
+
+class CBaseAnimGraph : public CBaseModelEntity
+{
+ DECLARE_SCHEMA_CLASS(CBaseAnimGraph)
+
+ SCHEMA_FIELD(bool, m_bInitiallyPopulateInterpHistory)
+ SCHEMA_FIELD(bool, m_bAnimGraphUpdateEnabled)
+ SCHEMA_FIELD(float32, m_flMaxSlopeDistance)
+ SCHEMA_FIELD(Vector, m_vLastSlopeCheckPos)
+ SCHEMA_FIELD(bool, m_bAnimationUpdateScheduled)
+ SCHEMA_FIELD(Vector, m_vecForce)
+ SCHEMA_FIELD(int32, m_nForceBone)
+ SCHEMA_FIELD(PhysicsRagdollPose_t, m_RagdollPose)
+ SCHEMA_FIELD(bool, m_bRagdollClientSide)
+ SCHEMA_FIELD(int32, m_nLastDestructiblePartDestroyedAnimgraphSetTick)
+};
+
+class SceneEventId_t
+{
+ DECLARE_SCHEMA_CLASS(SceneEventId_t)
+
+ SCHEMA_FIELD(uint32, m_Value)
+};
+
+class CBaseFlex : public CBaseAnimGraph
+{
+ DECLARE_SCHEMA_CLASS(CBaseFlex)
+
+ SCHEMA_FIELD(Vector, m_vLookTargetPosition)
+ SCHEMA_FIELD(bool, m_blinktoggle)
+ SCHEMA_FIELD(GameTime_t, m_flAllowResponsesEndTime)
+ SCHEMA_FIELD(GameTime_t, m_flLastFlexAnimationTime)
+ SCHEMA_FIELD(SceneEventId_t, m_nNextSceneEventId)
+ SCHEMA_FIELD(bool, m_bUpdateLayerPriorities)
+};
+
+enum class Hull_t : uint32
+{
+ HULL_HUMAN = 0,
+ HULL_SMALL_CENTERED = 1,
+ HULL_WIDE_HUMAN = 2,
+ HULL_TINY = 3,
+ HULL_MEDIUM = 4,
+ HULL_TINY_CENTERED = 5,
+ HULL_LARGE = 6,
+ HULL_LARGE_CENTERED = 7,
+ HULL_MEDIUM_TALL = 8,
+ HULL_SMALL = 9,
+ NUM_HULLS = 10,
+ HULL_NONE = 11,
+};
+
+class CBaseCombatCharacter : public CBaseFlex
+{
+ DECLARE_SCHEMA_CLASS(CBaseCombatCharacter)
+
+ SCHEMA_FIELD(bool, m_bForceServerRagdoll)
+ SCHEMA_FIELD(float32, m_impactEnergyScale)
+ SCHEMA_FIELD(bool, m_bApplyStressDamage)
+ SCHEMA_FIELD(int32, m_iDamageCount)
+ SCHEMA_FIELD(CUtlSymbolLarge, m_strRelationships)
+ SCHEMA_FIELD(Hull_t, m_eHull)
+ SCHEMA_FIELD(uint32, m_nNavHullIdx)
+};
+
+class fogparams_t
+{
+ DECLARE_SCHEMA_CLASS(fogparams_t)
+
+ SCHEMA_FIELD(Vector, dirPrimary)
+ SCHEMA_FIELD(Color, colorPrimary)
+ SCHEMA_FIELD(Color, colorSecondary)
+ SCHEMA_FIELD(Color, colorPrimaryLerpTo)
+ SCHEMA_FIELD(Color, colorSecondaryLerpTo)
+ SCHEMA_FIELD(float32, start)
+ SCHEMA_FIELD(float32, end)
+ SCHEMA_FIELD(float32, farz)
+ SCHEMA_FIELD(float32, maxdensity)
+ SCHEMA_FIELD(float32, exponent)
+ SCHEMA_FIELD(float32, HDRColorScale)
+ SCHEMA_FIELD(float32, skyboxFogFactor)
+ SCHEMA_FIELD(float32, skyboxFogFactorLerpTo)
+ SCHEMA_FIELD(float32, startLerpTo)
+ SCHEMA_FIELD(float32, endLerpTo)
+ SCHEMA_FIELD(float32, maxdensityLerpTo)
+ SCHEMA_FIELD(GameTime_t, lerptime)
+ SCHEMA_FIELD(float32, duration)
+ SCHEMA_FIELD(float32, blendtobackground)
+ SCHEMA_FIELD(float32, scattering)
+ SCHEMA_FIELD(float32, locallightscale)
+ SCHEMA_FIELD(bool, enable)
+ SCHEMA_FIELD(bool, blend)
+ SCHEMA_FIELD(bool, m_bNoReflectionFog)
+ SCHEMA_FIELD(bool, m_bPadding)
+};
+
+class sky3dparams_t
+{
+ DECLARE_SCHEMA_CLASS(sky3dparams_t)
+
+ SCHEMA_FIELD(int16, scale)
+ SCHEMA_FIELD(Vector, origin)
+ SCHEMA_FIELD(bool, bClip3DSkyBoxNearToWorldFar)
+ SCHEMA_FIELD(float32, flClip3DSkyBoxNearToWorldFarOffset)
+ SCHEMA_FIELD(fogparams_t, fog)
+ SCHEMA_FIELD(WorldGroupId_t, m_nWorldGroupID)
+};
+
+class CInButtonState
+{
+ public:
+ DECLARE_SCHEMA_CLASS(CInButtonState)
+
+ SCHEMA_FIELD_POINTER(uint64, m_pButtonStates)
+};
+
+class CPlayerPawnComponent
+{
+ DECLARE_SCHEMA_CLASS(CPlayerPawnComponent)
+
+ SCHEMA_FIELD(CNetworkVarChainer, __m_pChainEntity)
+};
+
+class CPlayer_MovementServices : public CPlayerPawnComponent
+{
+ public:
+ DECLARE_SCHEMA_CLASS(CPlayer_MovementServices)
+
+ SCHEMA_FIELD(int32, m_nImpulse)
+ SCHEMA_FIELD(CInButtonState, m_nButtons)
+ SCHEMA_FIELD(uint64, m_nQueuedButtonDownMask)
+ SCHEMA_FIELD(uint64, m_nQueuedButtonChangeMask)
+ SCHEMA_FIELD(uint64, m_nButtonDoublePressed)
+ SCHEMA_FIELD_POINTER(uint32, m_pButtonPressedCmdNumber)
+ SCHEMA_FIELD(uint32, m_nLastCommandNumberProcessed)
+ SCHEMA_FIELD(uint64, m_nToggleButtonDownMask)
+ SCHEMA_FIELD(float32, m_flMaxspeed)
+ SCHEMA_FIELD_POINTER(float32, m_arrForceSubtickMoveWhen)
+ SCHEMA_FIELD(float32, m_flForwardMove)
+ SCHEMA_FIELD(float32, m_flLeftMove)
+ SCHEMA_FIELD(float32, m_flUpMove)
+ SCHEMA_FIELD(Vector, m_vecLastMovementImpulses)
+ SCHEMA_FIELD(QAngle, m_vecOldViewAngles)
+};
+
+class CPlayer_MovementServices_Humanoid : public CPlayer_MovementServices
+{
+ DECLARE_SCHEMA_CLASS(CPlayer_MovementServices_Humanoid)
+
+ SCHEMA_FIELD(float32, m_flStepSoundTime)
+ SCHEMA_FIELD(float32, m_flFallVelocity)
+ SCHEMA_FIELD(bool, m_bInCrouch)
+ SCHEMA_FIELD(uint32, m_nCrouchState)
+ SCHEMA_FIELD(GameTime_t, m_flCrouchTransitionStartTime)
+ SCHEMA_FIELD(bool, m_bDucked)
+ SCHEMA_FIELD(bool, m_bDucking)
+ SCHEMA_FIELD(bool, m_bInDuckJump)
+ SCHEMA_FIELD(Vector, m_groundNormal)
+ SCHEMA_FIELD(float32, m_flSurfaceFriction)
+ SCHEMA_FIELD(CUtlStringToken, m_surfaceProps)
+ SCHEMA_FIELD(int32, m_nStepside)
+ SCHEMA_FIELD(int32, m_iTargetVolume)
+ SCHEMA_FIELD(Vector, m_vecSmoothedVelocity)
+};
+
+class CCSPlayer_MovementServices : public CPlayer_MovementServices_Humanoid
+{
+ DECLARE_SCHEMA_CLASS(CCSPlayer_MovementServices)
+
+ SCHEMA_FIELD(Vector, m_vecLadderNormal)
+ SCHEMA_FIELD(int32, m_nLadderSurfacePropIndex)
+ SCHEMA_FIELD(float32, m_flDuckAmount)
+ SCHEMA_FIELD(float32, m_flDuckSpeed)
+ SCHEMA_FIELD(bool, m_bDuckOverride)
+ SCHEMA_FIELD(bool, m_bDesiresDuck)
+ SCHEMA_FIELD(float32, m_flDuckOffset)
+ SCHEMA_FIELD(uint32, m_nDuckTimeMsecs)
+ SCHEMA_FIELD(uint32, m_nDuckJumpTimeMsecs)
+ SCHEMA_FIELD(uint32, m_nJumpTimeMsecs)
+ SCHEMA_FIELD(float32, m_flLastDuckTime)
+ SCHEMA_FIELD(Vector2D, m_vecLastPositionAtFullCrouchSpeed)
+ SCHEMA_FIELD(bool, m_duckUntilOnGround)
+ SCHEMA_FIELD(bool, m_bHasWalkMovedSinceLastJump)
+ SCHEMA_FIELD(bool, m_bInStuckTest)
+ SCHEMA_FIELD_POINTER(float32, m_flStuckCheckTime)
+ SCHEMA_FIELD(int32, m_nTraceCount)
+ SCHEMA_FIELD(int32, m_StuckLast)
+ SCHEMA_FIELD(bool, m_bSpeedCropped)
+ SCHEMA_FIELD(float32, m_flGroundMoveEfficiency)
+ SCHEMA_FIELD(int32, m_nOldWaterLevel)
+ SCHEMA_FIELD(float32, m_flWaterEntryTime)
+ SCHEMA_FIELD(Vector, m_vecForward)
+ SCHEMA_FIELD(Vector, m_vecLeft)
+ SCHEMA_FIELD(Vector, m_vecUp)
+ SCHEMA_FIELD(int32, m_nGameCodeHasMovedPlayerAfterCommand)
+ SCHEMA_FIELD(bool, m_bMadeFootstepNoise)
+ SCHEMA_FIELD(int32, m_iFootsteps)
+ SCHEMA_FIELD(bool, m_bOldJumpPressed)
+ SCHEMA_FIELD(float32, m_flJumpPressedTime)
+ SCHEMA_FIELD(GameTime_t, m_fStashGrenadeParameterWhen)
+ SCHEMA_FIELD(uint64, m_nButtonDownMaskPrev)
+ SCHEMA_FIELD(float32, m_flOffsetTickCompleteTime)
+ SCHEMA_FIELD(float32, m_flOffsetTickStashedSpeed)
+ SCHEMA_FIELD(float32, m_flStamina)
+ SCHEMA_FIELD(float32, m_flHeightAtJumpStart)
+ SCHEMA_FIELD(float32, m_flMaxJumpHeightThisJump)
+ SCHEMA_FIELD(float32, m_flMaxJumpHeightLastJump)
+ SCHEMA_FIELD(float32, m_flStaminaAtJumpStart)
+ SCHEMA_FIELD(float32, m_flAccumulatedJumpError)
+};
+
+class CBasePlayerPawn : public CBaseCombatCharacter
+{
+ public:
+ DECLARE_SCHEMA_CLASS(CBasePlayerPawn)
+
+ SCHEMA_FIELD(CPlayer_MovementServices*, m_pMovementServices)
+ SCHEMA_FIELD(uint32, m_nHighestGeneratedServerViewAngleChangeIndex)
+ SCHEMA_FIELD(QAngle, v_angle)
+ SCHEMA_FIELD(QAngle, v_anglePrevious)
+ SCHEMA_FIELD(uint32, m_iHideHUD)
+ SCHEMA_FIELD(sky3dparams_t, m_skybox3d)
+ SCHEMA_FIELD(GameTime_t, m_fTimeLastHurt)
+ SCHEMA_FIELD(GameTime_t, m_flDeathTime)
+ SCHEMA_FIELD(GameTime_t, m_fNextSuicideTime)
+ SCHEMA_FIELD(bool, m_fInitHUD)
+ SCHEMA_FIELD(CHandle, m_hController)
+ SCHEMA_FIELD(float32, m_fHltvReplayDelay)
+ SCHEMA_FIELD(float32, m_fHltvReplayEnd)
+ SCHEMA_FIELD(CEntityIndex, m_iHltvReplayEntity)
+};
+
+class CTouchExpansionComponent : public CEntityComponent
+{
+ DECLARE_SCHEMA_CLASS(CTouchExpansionComponent)
+};
+
+enum class CSPlayerState : uint32
+{
+ STATE_ACTIVE = 0,
+ STATE_WELCOME = 1,
+ STATE_PICKINGTEAM = 2,
+ STATE_PICKINGCLASS = 3,
+ STATE_DEATH_ANIM = 4,
+ STATE_DEATH_WAIT_FOR_KEY = 5,
+ STATE_OBSERVER_MODE = 6,
+ STATE_GUNGAME_RESPAWN = 7,
+ STATE_DORMANT = 8,
+ NUM_PLAYER_STATES = 9,
+};
+
+class CCSPlayerPawnBase : public CBasePlayerPawn
+{
+ DECLARE_SCHEMA_CLASS(CCSPlayerPawnBase)
+
+ SCHEMA_FIELD(CTouchExpansionComponent, m_CTouchExpansionComponent)
+ SCHEMA_FIELD(GameTime_t, m_blindUntilTime)
+ SCHEMA_FIELD(GameTime_t, m_blindStartTime)
+ SCHEMA_FIELD(CSPlayerState, m_iPlayerState)
+ SCHEMA_FIELD(bool, m_bRespawning)
+ SCHEMA_FIELD(GameTime_t, m_fImmuneToGunGameDamageTime)
+ SCHEMA_FIELD(bool, m_bGunGameImmunity)
+ SCHEMA_FIELD(float32, m_fMolotovDamageTime)
+ SCHEMA_FIELD(bool, m_bHasMovedSinceSpawn)
+ SCHEMA_FIELD(int32, m_iNumSpawns)
+ SCHEMA_FIELD(float32, m_flIdleTimeSinceLastAction)
+ SCHEMA_FIELD(float32, m_fNextRadarUpdateTime)
+ SCHEMA_FIELD(float32, m_flFlashDuration)
+ SCHEMA_FIELD(float32, m_flFlashMaxAlpha)
+ SCHEMA_FIELD(float32, m_flProgressBarStartTime)
+ SCHEMA_FIELD(int32, m_iProgressBarDuration)
+ SCHEMA_FIELD(QAngle, m_angEyeAngles)
+ SCHEMA_FIELD(bool, m_wasNotKilledNaturally)
+ SCHEMA_FIELD(bool, m_bCommittingSuicideOnTeamChange)
+ SCHEMA_FIELD(CHandle, m_hOriginalController)
+};
+
+enum class loadout_slot_t : int32
+{
+ LOADOUT_SLOT_PROMOTED = -2,
+ LOADOUT_SLOT_INVALID = -1,
+ LOADOUT_SLOT_MELEE = 0,
+ LOADOUT_SLOT_C4 = 1,
+ LOADOUT_SLOT_FIRST_AUTO_BUY_WEAPON = 0,
+ LOADOUT_SLOT_LAST_AUTO_BUY_WEAPON = 1,
+ LOADOUT_SLOT_SECONDARY0 = 2,
+ LOADOUT_SLOT_SECONDARY1 = 3,
+ LOADOUT_SLOT_SECONDARY2 = 4,
+ LOADOUT_SLOT_SECONDARY3 = 5,
+ LOADOUT_SLOT_SECONDARY4 = 6,
+ LOADOUT_SLOT_SECONDARY5 = 7,
+ LOADOUT_SLOT_SMG0 = 8,
+ LOADOUT_SLOT_SMG1 = 9,
+ LOADOUT_SLOT_SMG2 = 10,
+ LOADOUT_SLOT_SMG3 = 11,
+ LOADOUT_SLOT_SMG4 = 12,
+ LOADOUT_SLOT_SMG5 = 13,
+ LOADOUT_SLOT_RIFLE0 = 14,
+ LOADOUT_SLOT_RIFLE1 = 15,
+ LOADOUT_SLOT_RIFLE2 = 16,
+ LOADOUT_SLOT_RIFLE3 = 17,
+ LOADOUT_SLOT_RIFLE4 = 18,
+ LOADOUT_SLOT_RIFLE5 = 19,
+ LOADOUT_SLOT_HEAVY0 = 20,
+ LOADOUT_SLOT_HEAVY1 = 21,
+ LOADOUT_SLOT_HEAVY2 = 22,
+ LOADOUT_SLOT_HEAVY3 = 23,
+ LOADOUT_SLOT_HEAVY4 = 24,
+ LOADOUT_SLOT_HEAVY5 = 25,
+ LOADOUT_SLOT_FIRST_WHEEL_WEAPON = 2,
+ LOADOUT_SLOT_LAST_WHEEL_WEAPON = 25,
+ LOADOUT_SLOT_FIRST_PRIMARY_WEAPON = 8,
+ LOADOUT_SLOT_LAST_PRIMARY_WEAPON = 25,
+ LOADOUT_SLOT_FIRST_WHEEL_GRENADE = 26,
+ LOADOUT_SLOT_GRENADE0 = 26,
+ LOADOUT_SLOT_GRENADE1 = 27,
+ LOADOUT_SLOT_GRENADE2 = 28,
+ LOADOUT_SLOT_GRENADE3 = 29,
+ LOADOUT_SLOT_GRENADE4 = 30,
+ LOADOUT_SLOT_GRENADE5 = 31,
+ LOADOUT_SLOT_LAST_WHEEL_GRENADE = 31,
+ LOADOUT_SLOT_EQUIPMENT0 = 32,
+ LOADOUT_SLOT_EQUIPMENT1 = 33,
+ LOADOUT_SLOT_EQUIPMENT2 = 34,
+ LOADOUT_SLOT_EQUIPMENT3 = 35,
+ LOADOUT_SLOT_EQUIPMENT4 = 36,
+ LOADOUT_SLOT_EQUIPMENT5 = 37,
+ LOADOUT_SLOT_FIRST_WHEEL_EQUIPMENT = 32,
+ LOADOUT_SLOT_LAST_WHEEL_EQUIPMENT = 37,
+ LOADOUT_SLOT_CLOTHING_CUSTOMPLAYER = 38,
+ LOADOUT_SLOT_CLOTHING_CUSTOMHEAD = 39,
+ LOADOUT_SLOT_CLOTHING_FACEMASK = 40,
+ LOADOUT_SLOT_CLOTHING_HANDS = 41,
+ LOADOUT_SLOT_FIRST_COSMETIC = 41,
+ LOADOUT_SLOT_LAST_COSMETIC = 41,
+ LOADOUT_SLOT_CLOTHING_EYEWEAR = 42,
+ LOADOUT_SLOT_CLOTHING_HAT = 43,
+ LOADOUT_SLOT_CLOTHING_LOWERBODY = 44,
+ LOADOUT_SLOT_CLOTHING_TORSO = 45,
+ LOADOUT_SLOT_CLOTHING_APPEARANCE = 46,
+ LOADOUT_SLOT_MISC0 = 47,
+ LOADOUT_SLOT_MISC1 = 48,
+ LOADOUT_SLOT_MISC2 = 49,
+ LOADOUT_SLOT_MISC3 = 50,
+ LOADOUT_SLOT_MISC4 = 51,
+ LOADOUT_SLOT_MISC5 = 52,
+ LOADOUT_SLOT_MISC6 = 53,
+ LOADOUT_SLOT_MUSICKIT = 54,
+ LOADOUT_SLOT_FLAIR0 = 55,
+ LOADOUT_SLOT_SPRAY0 = 56,
+ LOADOUT_SLOT_FIRST_ALL_CHARACTER = 54,
+ LOADOUT_SLOT_LAST_ALL_CHARACTER = 56,
+ LOADOUT_SLOT_COUNT = 57,
+};
+
+class IEconItemInterface
+{
+ DECLARE_SCHEMA_CLASS(IEconItemInterface)
+};
+
+class CAttributeList
+{
+ DECLARE_SCHEMA_CLASS(CAttributeList)
+};
+
+class CEconItemView : public IEconItemInterface
+{
+ DECLARE_SCHEMA_CLASS(CEconItemView)
+
+ SCHEMA_FIELD(uint16, m_iItemDefinitionIndex)
+ SCHEMA_FIELD(int32, m_iEntityQuality)
+ SCHEMA_FIELD(uint32, m_iEntityLevel)
+ SCHEMA_FIELD(uint64, m_iItemID)
+ SCHEMA_FIELD(uint32, m_iItemIDHigh)
+ SCHEMA_FIELD(uint32, m_iItemIDLow)
+ SCHEMA_FIELD(uint32, m_iAccountID)
+ SCHEMA_FIELD(uint32, m_iInventoryPosition)
+ SCHEMA_FIELD(bool, m_bInitialized)
+ SCHEMA_FIELD(CAttributeList, m_AttributeList)
+ SCHEMA_FIELD(CAttributeList, m_NetworkedDynamicAttributes)
+ SCHEMA_FIELD_POINTER(char, m_szCustomName)
+ SCHEMA_FIELD_POINTER(char, m_szCustomNameOverride)
+};
+
+class EntitySpottedState_t
+{
+ DECLARE_SCHEMA_CLASS(EntitySpottedState_t)
+
+ SCHEMA_FIELD(bool, m_bSpotted)
+ SCHEMA_FIELD_POINTER(uint32, m_bSpottedByMask)
+};
+
+enum class CSPlayerBlockingUseAction_t : uint32
+{
+ k_CSPlayerBlockingUseAction_None = 0,
+ k_CSPlayerBlockingUseAction_DefusingDefault = 1,
+ k_CSPlayerBlockingUseAction_DefusingWithKit = 2,
+ k_CSPlayerBlockingUseAction_HostageGrabbing = 3,
+ k_CSPlayerBlockingUseAction_HostageDropping = 4,
+ k_CSPlayerBlockingUseAction_MapLongUseEntity_Pickup = 5,
+ k_CSPlayerBlockingUseAction_MapLongUseEntity_Place = 6,
+ k_CSPlayerBlockingUseAction_MaxCount = 7,
+};
+
+class CCSPlayerPawn : public CCSPlayerPawnBase
+{
+ DECLARE_SCHEMA_CLASS(CCSPlayerPawn)
+
+ SCHEMA_FIELD(uint16, m_nCharacterDefIndex)
+ SCHEMA_FIELD(bool, m_bHasFemaleVoice)
+ SCHEMA_FIELD(CUtlString, m_strVOPrefix)
+ SCHEMA_FIELD_POINTER(char, m_szLastPlaceName)
+ SCHEMA_FIELD(bool, m_bInHostageResetZone)
+ SCHEMA_FIELD(bool, m_bInBuyZone)
+ SCHEMA_FIELD(bool, m_bWasInBuyZone)
+ SCHEMA_FIELD(bool, m_bInHostageRescueZone)
+ SCHEMA_FIELD(bool, m_bInBombZone)
+ SCHEMA_FIELD(bool, m_bWasInHostageRescueZone)
+ SCHEMA_FIELD(int32, m_iRetakesOffering)
+ SCHEMA_FIELD(int32, m_iRetakesOfferingCard)
+ SCHEMA_FIELD(bool, m_bRetakesHasDefuseKit)
+ SCHEMA_FIELD(bool, m_bRetakesMVPLastRound)
+ SCHEMA_FIELD(int32, m_iRetakesMVPBoostItem)
+ SCHEMA_FIELD(loadout_slot_t, m_RetakesMVPBoostExtraUtility)
+ SCHEMA_FIELD(GameTime_t, m_flHealthShotBoostExpirationTime)
+ SCHEMA_FIELD(float32, m_flLandingTimeSeconds)
+ SCHEMA_FIELD(QAngle, m_aimPunchAngle)
+ SCHEMA_FIELD(QAngle, m_aimPunchAngleVel)
+ SCHEMA_FIELD(int32, m_aimPunchTickBase)
+ SCHEMA_FIELD(float32, m_aimPunchTickFraction)
+ SCHEMA_FIELD(bool, m_bIsBuyMenuOpen)
+ SCHEMA_FIELD(CTransform, m_xLastHeadBoneTransform)
+ SCHEMA_FIELD(bool, m_bLastHeadBoneTransformIsValid)
+ SCHEMA_FIELD(GameTime_t, m_lastLandTime)
+ SCHEMA_FIELD(bool, m_bOnGroundLastTick)
+ SCHEMA_FIELD(int32, m_iPlayerLocked)
+ SCHEMA_FIELD(GameTime_t, m_flTimeOfLastInjury)
+ SCHEMA_FIELD(GameTime_t, m_flNextSprayDecalTime)
+ SCHEMA_FIELD(bool, m_bNextSprayDecalTimeExpedited)
+ SCHEMA_FIELD(int32, m_nRagdollDamageBone)
+ SCHEMA_FIELD(Vector, m_vRagdollDamageForce)
+ SCHEMA_FIELD(Vector, m_vRagdollDamagePosition)
+ SCHEMA_FIELD_POINTER(char, m_szRagdollDamageWeaponName)
+ SCHEMA_FIELD(bool, m_bRagdollDamageHeadshot)
+ SCHEMA_FIELD(Vector, m_vRagdollServerOrigin)
+ SCHEMA_FIELD(CEconItemView, m_EconGloves)
+ SCHEMA_FIELD(uint8, m_nEconGlovesChanged)
+ SCHEMA_FIELD(QAngle, m_qDeathEyeAngles)
+ SCHEMA_FIELD(bool, m_bSkipOneHeadConstraintUpdate)
+ SCHEMA_FIELD(bool, m_bLeftHanded)
+ SCHEMA_FIELD(GameTime_t, m_fSwitchedHandednessTime)
+ SCHEMA_FIELD(float32, m_flViewmodelOffsetX)
+ SCHEMA_FIELD(float32, m_flViewmodelOffsetY)
+ SCHEMA_FIELD(float32, m_flViewmodelOffsetZ)
+ SCHEMA_FIELD(float32, m_flViewmodelFOV)
+ SCHEMA_FIELD(bool, m_bIsWalking)
+ SCHEMA_FIELD(float32, m_fLastGivenDefuserTime)
+ SCHEMA_FIELD(float32, m_fLastGivenBombTime)
+ SCHEMA_FIELD(float32, m_flDealtDamageToEnemyMostRecentTimestamp)
+ SCHEMA_FIELD(uint32, m_iDisplayHistoryBits)
+ SCHEMA_FIELD(float32, m_flLastAttackedTeammate)
+ SCHEMA_FIELD(GameTime_t, m_allowAutoFollowTime)
+ SCHEMA_FIELD(bool, m_bResetArmorNextSpawn)
+ SCHEMA_FIELD(CEntityIndex, m_nLastKillerIndex)
+ SCHEMA_FIELD(EntitySpottedState_t, m_entitySpottedState)
+ SCHEMA_FIELD(int32, m_nSpotRules)
+ SCHEMA_FIELD(bool, m_bIsScoped)
+ SCHEMA_FIELD(bool, m_bResumeZoom)
+ SCHEMA_FIELD(bool, m_bIsDefusing)
+ SCHEMA_FIELD(bool, m_bIsGrabbingHostage)
+ SCHEMA_FIELD(CSPlayerBlockingUseAction_t, m_iBlockingUseActionInProgress)
+ SCHEMA_FIELD(GameTime_t, m_flEmitSoundTime)
+ SCHEMA_FIELD(bool, m_bInNoDefuseArea)
+ SCHEMA_FIELD(CEntityIndex, m_iBombSiteIndex)
+ SCHEMA_FIELD(int32, m_nWhichBombZone)
+ SCHEMA_FIELD(bool, m_bInBombZoneTrigger)
+ SCHEMA_FIELD(bool, m_bWasInBombZoneTrigger)
+ SCHEMA_FIELD(int32, m_iShotsFired)
+ SCHEMA_FIELD(float32, m_flFlinchStack)
+ SCHEMA_FIELD(float32, m_flVelocityModifier)
+ SCHEMA_FIELD(float32, m_flHitHeading)
+ SCHEMA_FIELD(int32, m_nHitBodyPart)
+ SCHEMA_FIELD(Vector, m_vecTotalBulletForce)
+ SCHEMA_FIELD(bool, m_bWaitForNoAttack)
+ SCHEMA_FIELD(float32, m_ignoreLadderJumpTime)
+ SCHEMA_FIELD(bool, m_bKilledByHeadshot)
+ SCHEMA_FIELD(int32, m_LastHitBox)
+ SCHEMA_FIELD(int32, m_LastHealth)
+ SCHEMA_FIELD(bool, m_bBotAllowActive)
+ SCHEMA_FIELD(QAngle, m_thirdPersonHeading)
+ SCHEMA_FIELD(float32, m_flSlopeDropOffset)
+ SCHEMA_FIELD(float32, m_flSlopeDropHeight)
+ SCHEMA_FIELD(Vector, m_vHeadConstraintOffset)
+ SCHEMA_FIELD(int32, m_nLastPickupPriority)
+ SCHEMA_FIELD(float32, m_flLastPickupPriorityTime)
+ SCHEMA_FIELD(int32, m_ArmorValue)
+ SCHEMA_FIELD(uint16, m_unCurrentEquipmentValue)
+ SCHEMA_FIELD(uint16, m_unRoundStartEquipmentValue)
+ SCHEMA_FIELD(uint16, m_unFreezetimeEndEquipmentValue)
+ SCHEMA_FIELD(int32, m_iLastWeaponFireUsercmd)
+ SCHEMA_FIELD(bool, m_bIsSpawning)
+ SCHEMA_FIELD(int32, m_iDeathFlags)
+ SCHEMA_FIELD(bool, m_bHasDeathInfo)
+ SCHEMA_FIELD(float32, m_flDeathInfoTime)
+ SCHEMA_FIELD(Vector, m_vecDeathInfoOrigin)
+ SCHEMA_FIELD_POINTER(uint32, m_vecPlayerPatchEconIndices)
+ SCHEMA_FIELD(Color, m_GunGameImmunityColor)
+ SCHEMA_FIELD(GameTime_t, m_grenadeParameterStashTime)
+ SCHEMA_FIELD(bool, m_bGrenadeParametersStashed)
+ SCHEMA_FIELD(QAngle, m_angStashedShootAngles)
+ SCHEMA_FIELD(Vector, m_vecStashedGrenadeThrowPosition)
+ SCHEMA_FIELD(Vector, m_vecStashedVelocity)
+ SCHEMA_FIELD_POINTER(QAngle, m_angShootAngleHistory)
+ SCHEMA_FIELD_POINTER(Vector, m_vecThrowPositionHistory)
+ SCHEMA_FIELD_POINTER(Vector, m_vecVelocityHistory)
+ SCHEMA_FIELD(int32, m_nHighestAppliedDamageTagTick)
+};
+
+class CGameSceneNode
+{
+ DECLARE_SCHEMA_CLASS(CGameSceneNode)
+
+ SCHEMA_FIELD(CTransform, m_nodeToWorld)
+ SCHEMA_FIELD(CEntityInstance*, m_pOwner)
+ SCHEMA_FIELD(CGameSceneNode*, m_pParent)
+ SCHEMA_FIELD(CGameSceneNode*, m_pChild)
+ SCHEMA_FIELD(CGameSceneNode*, m_pNextSibling)
+ SCHEMA_FIELD(QAngle, m_angRotation)
+ SCHEMA_FIELD(float32, m_flScale)
+ SCHEMA_FIELD(Vector, m_vecAbsOrigin)
+ SCHEMA_FIELD(QAngle, m_angAbsRotation)
+ SCHEMA_FIELD(float32, m_flAbsScale)
+ SCHEMA_FIELD(int16, m_nParentAttachmentOrBone)
+ SCHEMA_FIELD(bool, m_bDebugAbsOriginChanges)
+ SCHEMA_FIELD(bool, m_bDormant)
+ SCHEMA_FIELD(bool, m_bForceParentToBeNetworked)
+
+ SCHEMA_FIELD(uint8, m_nHierarchicalDepth)
+ SCHEMA_FIELD(uint8, m_nHierarchyType)
+ SCHEMA_FIELD(uint8, m_nDoNotSetAnimTimeInInvalidatePhysicsCount)
+ SCHEMA_FIELD(CUtlStringToken, m_name)
+ SCHEMA_FIELD(CUtlStringToken, m_hierarchyAttachName)
+ SCHEMA_FIELD(float32, m_flZOffset)
+ SCHEMA_FIELD(float32, m_flClientLocalScale)
+ SCHEMA_FIELD(Vector, m_vRenderOrigin)
+};
diff --git a/src/core/cs2_sdk/schema.cpp b/src/core/cs2_sdk/schema.cpp
index a2cea1a11..4c35001d7 100644
--- a/src/core/cs2_sdk/schema.cpp
+++ b/src/core/cs2_sdk/schema.cpp
@@ -125,12 +125,14 @@ SchemaKey schema::GetOffset(const char* className, uint32_t classKey, const char
return tableMap->Element(memberIndex);
}
-void SetStateChanged(Z_CBaseEntity* pEntity, int offset)
+void SetStateChanged(uintptr_t entityInstance, int nOffset)
{
- // addresses::StateChanged(pEntity->m_NetworkTransmitComponent(), pEntity, offset, -1, -1);
- auto vars = counterstrikesharp::globals::getGlobalVars();
-
- // if (vars) pEntity->m_lastNetworkChange = vars->curtime;
+ reinterpret_cast(entityInstance)->NetworkStateChanged(nOffset);
+}
- // pEntity->m_isSteadyState().ClearAll();
-};
+void ChainNetworkStateChanged(uintptr_t networkVarChainer, uint nLocalOffset)
+{
+ CEntityInstance* pEntity = *reinterpret_cast(networkVarChainer);
+ if (pEntity && (pEntity->m_pEntity->m_flags & EF_IS_CONSTRUCTION_IN_PROGRESS) == 0)
+ pEntity->NetworkStateChanged(nLocalOffset, -1, *reinterpret_cast(networkVarChainer + 32));
+}
diff --git a/src/core/cs2_sdk/schema.h b/src/core/cs2_sdk/schema.h
index cbbf18ca7..28cfd2202 100644
--- a/src/core/cs2_sdk/schema.h
+++ b/src/core/cs2_sdk/schema.h
@@ -19,14 +19,14 @@
#pragma once
+#include
+#include
+#include
#include "tier0/dbg.h"
-#include "const.h"
#include "utils/virtual.h"
#include
#include
-#include
-#include
#undef schema
@@ -37,19 +37,20 @@ struct SchemaKey
};
class Z_CBaseEntity;
-void SetStateChanged(Z_CBaseEntity* pEntity, int offset);
+void SetStateChanged(uintptr_t pEntity, int offset);
+void ChainNetworkStateChanged(uintptr_t pEntity, int offset);
-inline uint32_t val_32_const = 0x811c9dc5;
-inline uint32_t prime_32_const = 0x1000193;
-inline uint64_t val_64_const = 0xcbf29ce484222325;
-inline uint64_t prime_64_const = 0x100000001b3;
+constexpr uint32_t val_32_const = 0x811c9dc5;
+constexpr uint32_t prime_32_const = 0x1000193;
+constexpr uint64_t val_64_const = 0xcbf29ce484222325;
+constexpr uint64_t prime_64_const = 0x100000001b3;
-inline uint32_t hash_32_fnv1a_const(const char* str, const uint32_t value = val_32_const) noexcept
+inline constexpr uint32_t hash_32_fnv1a_const(const char* str, const uint32_t value = val_32_const) noexcept
{
return (str[0] == '\0') ? value : hash_32_fnv1a_const(&str[1], (value ^ uint32_t(str[0])) * prime_32_const);
}
-inline uint64_t hash_64_fnv1a_const(const char* str, const uint64_t value = val_64_const) noexcept
+inline constexpr uint64_t hash_64_fnv1a_const(const char* str, const uint64_t value = val_64_const) noexcept
{
return (str[0] == '\0') ? value : hash_64_fnv1a_const(&str[1], (value ^ uint64_t(str[0])) * prime_64_const);
}
@@ -97,3 +98,90 @@ static std::vector CS2BadList = {
int16_t FindChainOffset(const char* className);
SchemaKey GetOffset(const char* className, uint32_t classKey, const char* memberName, uint32_t memberKey);
} // namespace schema
+
+#define SCHEMA_FIELD_OFFSET(type, varName, extra_offset) \
+ class varName##_prop \
+ { \
+ public: \
+ std::add_lvalue_reference_t Get() \
+ { \
+ static constexpr auto datatable_hash = hash_32_fnv1a_const(ThisClassName); \
+ static constexpr auto prop_hash = hash_32_fnv1a_const(#varName); \
+ \
+ static const auto m_key = schema::GetOffset(ThisClassName, datatable_hash, #varName, prop_hash); \
+ \
+ static const size_t offset = offsetof(ThisClass, varName); \
+ ThisClass* pThisClass = (ThisClass*)((byte*)this - offset); \
+ \
+ return *reinterpret_cast>((uintptr_t)(pThisClass) + m_key.offset + extra_offset); \
+ } \
+ void Set(type val) \
+ { \
+ static constexpr auto datatable_hash = hash_32_fnv1a_const(ThisClassName); \
+ static constexpr auto prop_hash = hash_32_fnv1a_const(#varName); \
+ \
+ static const auto m_key = schema::GetOffset(ThisClassName, datatable_hash, #varName, prop_hash); \
+ \
+ static const auto m_chain = schema::FindChainOffset(ThisClassName); \
+ \
+ static const size_t offset = offsetof(ThisClass, varName); \
+ ThisClass* pThisClass = (ThisClass*)((byte*)this - offset); \
+ \
+ if (m_chain != 0 && m_key.networked) \
+ { \
+ DevMsg("Found chain offset %d for %s::%s\n", m_chain, ThisClassName, #varName); \
+ ChainNetworkStateChanged((uintptr_t)(pThisClass) + m_chain, m_key.offset + extra_offset); \
+ } \
+ else if (m_key.networked) \
+ { \
+ /* WIP: Works fine for most props, but inlined classes in the middle of a class will \
+ need to have their this pointer corrected by the offset .*/ \
+ if (!IsStruct) SetStateChanged((uintptr_t)pThisClass, m_key.offset + extra_offset); \
+ else \
+ CALL_VIRTUAL(void, 1, pThisClass, m_key.offset + extra_offset, 0xFFFFFFFF, 0xFFFFFFFF); \
+ } \
+ *reinterpret_cast>((uintptr_t)(pThisClass) + m_key.offset + extra_offset) = val; \
+ } \
+ operator std::add_lvalue_reference_t() { return Get(); } \
+ std::add_lvalue_reference_t operator()() { return Get(); } \
+ std::add_lvalue_reference_t operator->() { return Get(); } \
+ void operator()(type val) { Set(val); } \
+ void operator=(type val) { Set(val); } \
+ } varName;
+
+#define SCHEMA_FIELD_POINTER_OFFSET(type, varName, extra_offset) \
+ class varName##_prop \
+ { \
+ public: \
+ type* Get() \
+ { \
+ static constexpr auto datatable_hash = hash_32_fnv1a_const(ThisClassName); \
+ static constexpr auto prop_hash = hash_32_fnv1a_const(#varName); \
+ \
+ static const auto m_key = schema::GetOffset(ThisClassName, datatable_hash, #varName, prop_hash); \
+ \
+ static const size_t offset = offsetof(ThisClass, varName); \
+ ThisClass* pThisClass = (ThisClass*)((byte*)this - offset); \
+ \
+ return reinterpret_cast>((uintptr_t)(pThisClass) + m_key.offset + extra_offset); \
+ } \
+ operator type*() { return Get(); } \
+ type* operator()() { return Get(); } \
+ type* operator->() { return Get(); } \
+ } varName;
+
+// Use this when you want the member's value itself
+#define SCHEMA_FIELD(type, varName) SCHEMA_FIELD_OFFSET(type, varName, 0)
+
+// Use this when you want a pointer to a member
+#define SCHEMA_FIELD_POINTER(type, varName) SCHEMA_FIELD_POINTER_OFFSET(type, varName, 0)
+
+#define DECLARE_SCHEMA_CLASS_BASE(className, isStruct) \
+ typedef className ThisClass; \
+ static constexpr const char* ThisClassName = #className; \
+ static constexpr bool IsStruct = isStruct;
+
+#define DECLARE_SCHEMA_CLASS(className) DECLARE_SCHEMA_CLASS_BASE(className, false)
+
+// Use this for classes that can be wholly included within other classes (like CCollisionProperty within CBaseModelEntity)
+#define DECLARE_SCHEMA_CLASS_INLINE(className) DECLARE_SCHEMA_CLASS_BASE(className, true)
diff --git a/src/core/game_system.cpp b/src/core/game_system.cpp
index 83f6d484b..a01a232d5 100644
--- a/src/core/game_system.cpp
+++ b/src/core/game_system.cpp
@@ -22,6 +22,7 @@
#include "core/gameconfig.h"
#include "core/game_system.h"
#include "core/managers/server_manager.h"
+#include "core/managers/player_manager.h"
#include "scripting/callback_manager.h"
#include
@@ -77,6 +78,12 @@ GS_EVENT_MEMBER(CGameSystem, ServerPreEntityThink)
callback->ScriptContext().Reset();
callback->Execute();
}
+
+ auto globals = counterstrikesharp::globals::getGlobalVars();
+ if (globals && globals->m_bInSimulation)
+ {
+ counterstrikesharp::globals::playerManager.RunThink();
+ }
}
GS_EVENT_MEMBER(CGameSystem, ServerPostEntityThink)
diff --git a/src/core/managers/player_manager.cpp b/src/core/managers/player_manager.cpp
index 5260647c3..60afe8d38 100644
--- a/src/core/managers/player_manager.cpp
+++ b/src/core/managers/player_manager.cpp
@@ -42,6 +42,10 @@
#include "core/timer_system.h"
#include "scripting/callback_manager.h"
#include
+#include "player_manager.h"
+#include
+#include "entity/dump.h"
+#include
// extern CEntitySystem *g_pEntitySystem;
SH_DECL_HOOK4_void(IServerGameClients, ClientActive, SH_NOATTRIB, 0, CPlayerSlot, bool, const char*, uint64);
@@ -80,6 +84,7 @@ void PlayerManager::OnAllInitialized()
m_on_client_disconnect_post_callback = globals::callbackManager.CreateCallback("OnClientDisconnectPost");
m_on_client_voice_callback = globals::callbackManager.CreateCallback("OnClientVoice");
m_on_client_authorized_callback = globals::callbackManager.CreateCallback("OnClientAuthorized");
+ m_on_player_buttons_changed_callback = globals::callbackManager.CreateCallback("OnPlayerButtonsChanged");
}
void PlayerManager::OnShutdown()
@@ -103,6 +108,7 @@ void PlayerManager::OnShutdown()
globals::callbackManager.ReleaseCallback(m_on_client_disconnect_post_callback);
globals::callbackManager.ReleaseCallback(m_on_client_authorized_callback);
globals::callbackManager.ReleaseCallback(m_on_client_voice_callback);
+ globals::callbackManager.ReleaseCallback(m_on_player_buttons_changed_callback);
}
bool PlayerManager::OnClientConnect(
@@ -322,6 +328,52 @@ CPlayer* PlayerManager::GetPlayerBySlot(int client) const
return &m_players[client];
}
+void PlayerManager::RunThink() const
+{
+ VPROF_BUDGET("CS#::PlayerManager::RunThink", "CS# On Frame");
+
+ for (int i = 0; i <= MaxClients(); i++)
+ {
+ auto player = GetPlayerBySlot(i);
+ auto pController = (CCSPlayerController*)globals::entitySystem->GetEntityInstance(CEntityIndex(i + 1));
+
+ if (!player || !pController || !pController->m_hPlayerPawn().IsValid())
+ {
+ continue;
+ }
+
+ if (((CBasePlayerController*)pController)->m_iConnected() != PlayerConnectedState::PlayerConnected) continue;
+
+ auto pawn = pController->m_hPlayerPawn().Get();
+ if (!pawn || !pawn->m_pMovementServices()) continue;
+
+ auto buttonStates = pawn->m_pMovementServices()->m_nButtons().m_pButtonStates();
+ const auto buttons = buttonStates[0];
+
+ const auto lastButtons = player->m_buttonState;
+ const auto buttonsChanged = buttons ^ lastButtons;
+
+ const auto buttonsPressedThisFrame = (~lastButtons) & buttons;
+ const auto buttonsReleasedThisFrame = lastButtons & (~buttons);
+
+ if (buttonsPressedThisFrame || buttonsReleasedThisFrame)
+ {
+ auto callback = m_on_player_buttons_changed_callback;
+
+ if (callback && callback->GetFunctionCount())
+ {
+ callback->ScriptContext().Reset();
+ callback->ScriptContext().Push(pController);
+ callback->ScriptContext().Push(buttonsPressedThisFrame);
+ callback->ScriptContext().Push(buttonsReleasedThisFrame);
+ callback->Execute();
+ }
+ }
+
+ player->m_buttonState = buttons;
+ }
+}
+
// CPlayer *PlayerManager::GetClientOfUserId(int user_id) const
//{
// if (user_id < 0 || user_id > USHRT_MAX)
diff --git a/src/core/managers/player_manager.h b/src/core/managers/player_manager.h
index 19a39fda4..ab10a21c4 100644
--- a/src/core/managers/player_manager.h
+++ b/src/core/managers/player_manager.h
@@ -131,6 +131,7 @@ class CPlayer
ListenOverride m_listenMap[66] = {};
VoiceFlag_t m_voiceFlag = 0;
CPlayerBitVec m_selfMutes[64] = {};
+ uint64 m_buttonState = ~0;
void SetName(const char* name);
INetChannelInfo* GetNetInfo() const;
};
@@ -167,6 +168,7 @@ class PlayerManager : public GlobalClass
int MaxClients() const;
CPlayer* GetPlayerBySlot(int client) const;
CPlayer* GetClientOfUserId(int user_id) const;
+ void RunThink() const;
private:
void InvalidatePlayer(CPlayer* pPlayer) const;
@@ -186,6 +188,8 @@ class PlayerManager : public GlobalClass
ScriptCallback* m_on_client_disconnect_post_callback;
ScriptCallback* m_on_client_voice_callback;
ScriptCallback* m_on_client_authorized_callback;
+
+ ScriptCallback* m_on_player_buttons_changed_callback;
};
} // namespace counterstrikesharp