Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[submodule "sdk"]
path = sdk
url = https://github.com/alliedmodders/hl2sdk.git
branch = cs2
[submodule "hl2sdk-manifests"]
path = hl2sdk-manifests
url = https://github.com/alliedmodders/hl2sdk-manifests
Expand Down
2 changes: 1 addition & 1 deletion AMBuildScript
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,7 @@ const char *PLUGIN_FULL_VERSION = \"{version}\";
cxx.cxxincludes += [
os.path.join(context.currentSourcePath),
os.path.join(mms_core_path),
os.path.join(mms_core_path, 'sourcehook'),
os.path.join(self.mms_root, 'third_party', 'khook', 'include'),
]

for other_sdk in self.sdk_manifests:
Expand Down
9 changes: 2 additions & 7 deletions AMBuilder
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,16 @@ for sdk_target in MMSPlugin.sdk_targets:
os.path.join(builder.sourcePath, 'src', 'utils'),
os.path.join(builder.sourcePath, 'public'),
os.path.join(builder.sourcePath, 'sdk', 'thirdparty', 'protobuf-3.21.8', 'src'),
os.path.join(builder.sourcePath, 'vendor', 'funchook', 'include'),
]

target_folder = 'Debug' if builder.options.debug else 'Release'

if binary.compiler.target.platform == 'linux':
binary.compiler.postlink += [
os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'libfunchook.a'),
os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'libdistorm.a'),
os.path.join(builder.sourcePath, 'sdk', 'lib', 'linux64', 'release', 'libprotobuf.a'),
]
binary.sources += ['src/utils/plat_unix.cpp']
elif binary.compiler.target.platform == 'windows':
binary.compiler.postlink += [
os.path.join('psapi.lib'),
os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'funchook.lib'),
os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'distorm.lib'),
os.path.join(builder.sourcePath, 'sdk', 'lib' ,'public', 'win64', '2015', 'libprotobuf.lib'),
os.path.join(builder.sourcePath, 'sdk', 'lib', 'public', 'win64', 'steam_api64.lib')
]
Expand All @@ -44,6 +37,7 @@ for sdk_target in MMSPlugin.sdk_targets:
'src/commands.cpp',
'src/addresses.cpp',
'src/detours.cpp',
'src/virtual_hooks.cpp',
'src/entities.cpp',
'src/events.cpp',
'src/utils/entity.cpp',
Expand All @@ -52,6 +46,7 @@ for sdk_target in MMSPlugin.sdk_targets:
'src/utils/utils.cpp',
'src/utils/vscript_function.cpp',
'src/cs2_sdk/entity/services.cpp',
'src/cs2_sdk/entity/customhudlayout.cpp',
'src/cs2_sdk/entity/ccsplayerpawn.cpp',
'src/cs2_sdk/entity/cbasemodelentity.cpp',
'src/cs2_sdk/schema.cpp',
Expand Down
6 changes: 5 additions & 1 deletion CS2Fixes.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@
<ClCompile Include="src\customio.cpp" />
<ClCompile Include="src\cvars.cpp" />
<ClCompile Include="src\detours.cpp" />
<ClCompile Include="src\virtual_hooks.cpp" />
<ClCompile Include="src\discord.cpp" />
<ClCompile Include="src\entities.cpp" />
<ClCompile Include="src\entwatch.cpp" />
Expand Down Expand Up @@ -232,6 +233,7 @@
<ClCompile Include="src\utils\utils.cpp" />
<ClCompile Include="src\utils\vscript_function.cpp" />
<ClCompile Include="src\cs2_sdk\entity\services.cpp" />
<ClCompile Include="src\cs2_sdk\entity\customhudlayout.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\buttonwatch.h" />
Expand Down Expand Up @@ -265,6 +267,7 @@
<ClInclude Include="src\cs2_sdk\entity\cteam.h" />
<ClInclude Include="src\cs2_sdk\entity\ctriggerpush.h" />
<ClInclude Include="src\cs2_sdk\entity\ctriggerteleport.h" />
<ClInclude Include="src\cs2_sdk\entity\customhudlayout.h" />
<ClInclude Include="src\cs2_sdk\entity\cvotecontroller.h" />
<ClInclude Include="src\cs2_sdk\entity\globaltypes.h" />
<ClInclude Include="src\cs2_sdk\entity\lights.h" />
Expand All @@ -274,10 +277,10 @@
<ClInclude Include="src\cs2_sdk\schema.h" />
<ClInclude Include="src\cs2_sdk\entityio.h" />
<ClInclude Include="src\cs2_sdk\cchecktransmitinfo.h" />
<ClInclude Include="src\cdetour.h" />
<ClInclude Include="src\ctimer.h" />
<ClInclude Include="src\customio.h" />
<ClInclude Include="src\detours.h" />
<ClInclude Include="src\virtual_hooks.h" />
<ClInclude Include="src\discord.h" />
<ClInclude Include="src\entities.h" />
<ClInclude Include="src\entwatch.h" />
Expand Down Expand Up @@ -314,6 +317,7 @@
<ClInclude Include="src\utils\version_gen_placeholder.h" />
<ClInclude Include="src\utils\hud_manager.h" />
<ClInclude Include="src\utils\utils.h" />
<ClInclude Include="src\utils\sighook.h" />
<ClInclude Include="src\utils\weapon.h" />
<!--- CS2ModServer - Headers -->
<ClInclude Include="src\cs2_sdk\cchecktransmitinfo.h" />
Expand Down
18 changes: 15 additions & 3 deletions CS2Fixes.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@
<ClCompile Include="src\detours.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\virtual_hooks.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\playermanager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
Expand Down Expand Up @@ -200,6 +203,9 @@
<ClCompile Include="src\cs2_sdk\entity\services.cpp">
<Filter>Source Files\cs2_sdk\entity</Filter>
</ClCompile>
<ClCompile Include="src\cs2_sdk\entity\customhudlayout.cpp">
<Filter>Source Files\cs2_sdk\entity</Filter>
</ClCompile>
<ClCompile Include="src\topdefender.cpp">
<Filter>Source Files</Filter>
</ClCompile>
Expand Down Expand Up @@ -268,15 +274,15 @@
<ClInclude Include="src\commands.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\cdetour.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\ctimer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\detours.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\virtual_hooks.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\playermanager.h">
<Filter>Header Files</Filter>
</ClInclude>
Expand Down Expand Up @@ -445,6 +451,9 @@
<ClInclude Include="src\utils\utils.h">
<Filter>Header Files\utils</Filter>
</ClInclude>
<ClInclude Include="src\utils\sighook.h">
<Filter>Header Files\utils</Filter>
</ClInclude>
<ClInclude Include="src\cs2_sdk\entity\cpointorient.h">
<Filter>Header Files\cs2_sdk\entity</Filter>
</ClInclude>
Expand Down Expand Up @@ -505,5 +514,8 @@
<ClInclude Include="src\utils\weapon.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\cs2_sdk\entity\customhudlayout.h">
<Filter>Header Files\cs2_sdk\entity</Filter>
</ClInclude>
</ItemGroup>
</Project>
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ FROM ghcr.io/source2ze/build-containers:steamrt3

WORKDIR /app

RUN git clone https://github.com/alliedmodders/metamod-source
RUN git clone --recurse-submodules https://github.com/alliedmodders/metamod-source
RUN git config --global --add safe.directory /app

COPY ./docker-entrypoint.sh ./
Expand Down
4 changes: 2 additions & 2 deletions cfg/cs2fixes/cs2fixes.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -155,10 +155,10 @@ cs2f_idle_kick_min_players 0 // Minimum amount of connected clients to kick id
cs2f_idle_kick_admins 1 // Whether to kick idle players with ADMFLAG_GENERIC

// Button watch
cs2f_enable_button_watch 1 // INCOMPATIBLE WITH CS#. Whether to enable button watch or not.
cs2f_enable_button_watch 0 // Whether to enable button watch or not.

// EntWatch Settings
entwatch_enable 0 // INCOMPATIBLE WITH CS#. Whether to enable EntWatch features
entwatch_enable 0 // Whether to enable EntWatch features
entwatch_auto_filter 1 // Whether to automatically block non-item holders from triggering uses
entwatch_clantag 1 // Whether to set item holder's clantag and set 9999 score
entwatch_clantag_colour_mode 1 // Whether to set item clantag colours (0=No colour, 1=Use item colour, 2=Use entwatch_clantag_colour value)
Expand Down
12 changes: 3 additions & 9 deletions gamedata/cs2fixes.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
"UTIL_SayTextFilter":
{
"library": "server",
"windows": "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 49 8B F8",
"linux": "55 48 8D 05 ? ? ? ? 48 89 E5 41 57 41 56 4C 8D 75 ? 41 55 41 89 CD 41 54 49 89 D4"
"windows": "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 49 8B F0 48 89 4D",
"linux": "55 48 8D 05 ? ? ? ? 48 89 E5 41 57 41 56 4C 8D 75 ? 41 55 49 89 D5"
},
// Called from Host_Say
"UTIL_SayText2Filter":
{
"library": "server",
"windows": "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 45 0F B6 F0",
"windows": "48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 41 8B F8",
"linux": "55 48 8D 05 ? ? ? ? 48 89 E5 41 57 41 56 41 89 D6 31 D2"
},
// idk a good way to find this again, i just brute forced the vtable. offset is 136 on CTriggerPush
Expand Down Expand Up @@ -222,12 +222,6 @@
"windows": "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 41 56 48 83 EC ? 41 0F B6 F0",
"linux": "55 48 89 E5 41 57 49 89 FF 41 56 41 55 41 54 53 89 D3 48 81 EC ? ? ? ? 40 38 B7"
},
"CTakeDamageInfo":
{
"library": "server",
"windows": "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 41 56 48 83 EC ? 45 33 F6 48 C7 41",
"linux": "49 BB ? ? ? ? ? ? ? ? 55 48 89 E5 48 83 EC ? 4C 8D 15"
},
// "%sRecv usercmd %d. Margin:%5.1fms net +%2d queue =%5.1f total\n"
"ProcessUsercmds":
{
Expand Down
55 changes: 27 additions & 28 deletions src/addresses.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/**
/**
* =============================================================================
* CS2Fixes
* Copyright (C) 2023-2026 Source2ZE
Expand Down Expand Up @@ -27,10 +27,10 @@

#include "tier0/memdbgon.h"

#define RESOLVE_SIG(gameConfig, name, variable) \
variable = (decltype(variable))gameConfig->ResolveSignature(name); \
if (!variable) \
return false; \
#define RESOLVE_SIG(name, variable) \
variable = (decltype(variable))g_GameConfig->ResolveSignature(name); \
if (!variable) \
return false; \
Message("Found %s at 0x%p\n", name, variable);

#define RESOLVE_SF(scriptDesc, funcName, variable) \
Expand All @@ -41,7 +41,7 @@
else \
Message("Found %s::%s at 0x%p\n", scriptDesc->m_pszClassname, funcName, variable.GetPtr());

bool addresses::Initialize(CGameConfig* g_GameConfig)
bool addresses::Initialize()
{
modules::engine = new CModule(ROOTBIN, "engine2");
modules::tier0 = new CModule(ROOTBIN, "tier0");
Expand All @@ -62,30 +62,29 @@ bool addresses::Initialize(CGameConfig* g_GameConfig)
modules::hammer = new CModule(ROOTBIN, "tools/hammer");
#endif

RESOLVE_SIG(g_GameConfig, "SetGroundEntity", addresses::SetGroundEntity);
RESOLVE_SIG(g_GameConfig, "CCSPlayerController_SwitchTeam", addresses::CCSPlayerController_SwitchTeam);
RESOLVE_SIG(g_GameConfig, "CBasePlayerController_SetPawn", addresses::CBasePlayerController_SetPawn);
RESOLVE_SIG(g_GameConfig, "CBaseModelEntity_SetModel", addresses::CBaseModelEntity_SetModel);
RESOLVE_SIG(g_GameConfig, "CEntitySystem_AddEntityIOEvent", addresses::CEntitySystem_AddEntityIOEvent);
RESOLVE_SIG(g_GameConfig, "CEntityInstance_AcceptInput", addresses::CEntityInstance_AcceptInput);
RESOLVE_SIG(g_GameConfig, "CGameEntitySystem_FindEntityByClassName", addresses::CGameEntitySystem_FindEntityByClassName);
RESOLVE_SIG(g_GameConfig, "CGameEntitySystem_FindEntityByName", addresses::CGameEntitySystem_FindEntityByName);
RESOLVE_SIG(g_GameConfig, "CGameRules_TerminateRound", addresses::CGameRules_TerminateRound);
RESOLVE_SIG(g_GameConfig, "CreateEntityByName", addresses::CreateEntityByName);
RESOLVE_SIG(g_GameConfig, "DispatchSpawn", addresses::DispatchSpawn);
RESOLVE_SIG(g_GameConfig, "DispatchParticleEffect", addresses::DispatchParticleEffect);
RESOLVE_SIG(g_GameConfig, "CBaseEntity_EmitSoundFilter", addresses::CBaseEntity_EmitSoundFilter);
RESOLVE_SIG(g_GameConfig, "CBaseEntity_SetMoveType", addresses::CBaseEntity_SetMoveType);
RESOLVE_SIG(g_GameConfig, "CTakeDamageInfo", addresses::CTakeDamageInfo_Constructor);
RESOLVE_SIG(g_GameConfig, "CCSPlayer_WeaponServices_EquipWeapon", addresses::CCSPlayer_WeaponServices_EquipWeapon);
RESOLVE_SIG(g_GameConfig, "GetSpawnGroups", addresses::GetSpawnGroups);
RESOLVE_SIG(g_GameConfig, "CBasePlayerPawn_SnapViewAngles", addresses::CBasePlayerPawn_SnapViewAngles);
RESOLVE_SIG(g_GameConfig, "CCSPlayer_WeaponServices_EquipWeapon", addresses::CCSPlayer_WeaponServices_EquipWeapon);

return InitializeBanMap(g_GameConfig);
RESOLVE_SIG("SetGroundEntity", addresses::SetGroundEntity);
RESOLVE_SIG("CCSPlayerController_SwitchTeam", addresses::CCSPlayerController_SwitchTeam);
RESOLVE_SIG("CBasePlayerController_SetPawn", addresses::CBasePlayerController_SetPawn);
RESOLVE_SIG("CBaseModelEntity_SetModel", addresses::CBaseModelEntity_SetModel);
RESOLVE_SIG("CEntitySystem_AddEntityIOEvent", addresses::CEntitySystem_AddEntityIOEvent);
RESOLVE_SIG("CEntityInstance_AcceptInput", addresses::CEntityInstance_AcceptInput);
RESOLVE_SIG("CGameEntitySystem_FindEntityByClassName", addresses::CGameEntitySystem_FindEntityByClassName);
RESOLVE_SIG("CGameEntitySystem_FindEntityByName", addresses::CGameEntitySystem_FindEntityByName);
RESOLVE_SIG("CGameRules_TerminateRound", addresses::CGameRules_TerminateRound);
RESOLVE_SIG("CreateEntityByName", addresses::CreateEntityByName);
RESOLVE_SIG("DispatchSpawn", addresses::DispatchSpawn);
RESOLVE_SIG("DispatchParticleEffect", addresses::DispatchParticleEffect);
RESOLVE_SIG("CBaseEntity_EmitSoundFilter", addresses::CBaseEntity_EmitSoundFilter);
RESOLVE_SIG("CBaseEntity_SetMoveType", addresses::CBaseEntity_SetMoveType);
RESOLVE_SIG("CCSPlayer_WeaponServices_EquipWeapon", addresses::CCSPlayer_WeaponServices_EquipWeapon);
RESOLVE_SIG("GetSpawnGroups", addresses::GetSpawnGroups);
RESOLVE_SIG("CBasePlayerPawn_SnapViewAngles", addresses::CBasePlayerPawn_SnapViewAngles);
RESOLVE_SIG("CBaseEntity_TakeDamageOld", addresses::CBaseEntity_TakeDamageOld);

return InitializeBanMap();
}

bool addresses::InitializeBanMap(CGameConfig* g_GameConfig)
bool addresses::InitializeBanMap()
{
// This signature directly points to the instruction referencing sm_mapGcBanInformation
uintptr_t pAddr = (uintptr_t)g_GameConfig->ResolveSignature("CCSGameRules__sm_mapGcBanInformation");
Expand Down
10 changes: 5 additions & 5 deletions src/addresses.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/**
/**
* =============================================================================
* CS2Fixes
* Copyright (C) 2023-2026 Source2ZE
Expand Down Expand Up @@ -61,6 +61,7 @@ class CBasePlayerWeapon;
class CSpawnGroupMgrGameSystem;
struct EmitSound_t;
struct StartSoundEventInfo;
struct CTakeDamageResult;

// Can't be forward-declared, can't include cgamerules.h.. just define it here
struct CGcBanInformation_t
Expand All @@ -73,8 +74,8 @@ struct CGcBanInformation_t

namespace addresses
{
bool Initialize(CGameConfig* g_GameConfig);
bool InitializeBanMap(CGameConfig* g_GameConfig);
bool Initialize();
bool InitializeBanMap();
bool InitializeVScriptFunctions();

inline CUtlOrderedMap<uint32, CGcBanInformation_t, uint32>* sm_mapGcBanInformation;
Expand Down Expand Up @@ -102,11 +103,10 @@ namespace addresses
char iAttachmentPoint, CUtlSymbolLarge iAttachmentName, bool bResetAllParticlesOnEntity, int nSplitScreenPlayerSlot, IRecipientFilter* a7, byte* a8);
inline StartSoundEventInfo(FASTCALL* CBaseEntity_EmitSoundFilter)(IRecipientFilter& filter, CEntityIndex ent, const EmitSound_t& params);
inline void(FASTCALL* CBaseEntity_SetMoveType)(CBaseEntity* pThis, MoveType_t nMoveType, MoveCollide_t nMoveCollide);
inline void(FASTCALL* CTakeDamageInfo_Constructor)(CTakeDamageInfo* pThis, CBaseEntity* pInflictor, CBaseEntity* pAttacker, CBaseEntity* pAbility,
const Vector* vecDamageForce, const Vector* vecDamagePosition, float flDamage, int bitsDamageType, int iCustomDamage, void* a10);
inline void(FASTCALL* CCSPlayer_WeaponServices_EquipWeapon)(CCSPlayer_WeaponServices* pWeaponServices, CBasePlayerWeapon* pPlayerWeapon);
inline void(FASTCALL* GetSpawnGroups)(CSpawnGroupMgrGameSystem* pSpawnGroupMgr, CUtlVector<SpawnGroupHandle_t>* pList);
inline void(FASTCALL* CBasePlayerPawn_SnapViewAngles)(CBasePlayerPawn* pPawn, QAngle* pAngles);
inline int64(FASTCALL* CBaseEntity_TakeDamageOld)(CBaseEntity* pThis, CTakeDamageInfo* pInfo, CTakeDamageResult* pResult);

inline CVScriptFunction<void, CBaseEntity, float> SetGravityScale;
inline CVScriptFunction<void, CBaseEntity, const char*> ScriptSetEntityName;
Expand Down
23 changes: 3 additions & 20 deletions src/buttonwatch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,11 @@
#include "entity/clogiccase.h"
#include "entity/cpointviewcontrol.h"

CConVar<bool> g_cvarEnableButtonWatch(
"cs2f_enable_button_watch", FCVAR_NONE, "INCOMPATIBLE WITH CS#. Whether to enable button watch or not.", false,
[](CConVar<bool>* cvar, CSplitScreenSlot slot, const bool* new_val, const bool* old_val) {
if (!(*new_val) || !SetupFireOutputInternalDetour())
{
mapIOFunctions.erase("buttonwatch");
cvar->Set(false);
}
else if (!IsButtonWatchEnabled())
mapIOFunctions["buttonwatch"] = ButtonWatch;
});
CConVar<bool> g_cvarEnableButtonWatch("cs2f_enable_button_watch", FCVAR_NONE, "Whether to enable button watch or not.", false);

CON_COMMAND_CHAT_FLAGS(bw, "- Toggle button watch display", ADMFLAG_GENERIC)
{
if (!IsButtonWatchEnabled())
if (!g_cvarEnableButtonWatch.Get())
{
ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Button watch is disabled on this server.");
return;
Expand Down Expand Up @@ -84,17 +74,10 @@ CON_COMMAND_CHAT_FLAGS(bw, "- Toggle button watch display", ADMFLAG_GENERIC)
}
}

bool IsButtonWatchEnabled()
{
return std::any_of(mapIOFunctions.begin(), mapIOFunctions.end(), [](const auto& p) {
return p.first == "buttonwatch";
});
}

std::map<int, bool> mapRecentEnts;
void ButtonWatch(const CEntityIOOutput* pThis, CEntityInstance* pActivator, CEntityInstance* pCaller, const CVariant* value, float flDelay)
{
if (!IsButtonWatchEnabled() || !GetGlobals() || V_stricmp(pThis->m_pDesc->m_pName, "OnPressed") || !pActivator || !((CBaseEntity*)pActivator)->IsPawn() || !pCaller || mapRecentEnts.contains(pCaller->GetEntityIndex().Get()))
if (!GetGlobals() || V_stricmp(pThis->m_pDesc->m_pName, "OnPressed") || !pActivator || !((CBaseEntity*)pActivator)->IsPawn() || !pCaller || mapRecentEnts.contains(pCaller->GetEntityIndex().Get()))
return;

CCSPlayerController* ccsPlayer = CCSPlayerController::FromPawn(static_cast<CCSPlayerPawn*>(pActivator));
Expand Down
3 changes: 2 additions & 1 deletion src/buttonwatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@
#pragma once
#include "detours.h"

bool IsButtonWatchEnabled();
extern CConVar<bool> g_cvarEnableButtonWatch;

void ButtonWatch(const CEntityIOOutput* pThis, CEntityInstance* pActivator, CEntityInstance* pCaller, const CVariant* value, float flDelay);
Loading
Loading