diff --git a/.github/workflows/plugin.yml b/.github/workflows/plugin.yml index 98df3947..b100ab17 100644 --- a/.github/workflows/plugin.yml +++ b/.github/workflows/plugin.yml @@ -36,8 +36,8 @@ jobs: do plugin="$(basename "${file%.*}")" echo -e "\nCompiling $plugin\n" - spcomp -v2 -i scripting/include -o plugins/"$plugin".smx "$file" NO_DEBUG=1 ${{ matrix.game.args }} - spcomp -v2 -i scripting/include -o plugins/disabled/srccoop_debug/"$plugin".smx "$file" ${{ matrix.game.args }} + spcomp -v2 --warnings-as-errors -i scripting/include -o plugins/"$plugin".smx "$file" NO_DEBUG=1 ${{ matrix.game.args }} + spcomp -v2 --warnings-as-errors -i scripting/include -o plugins/disabled/srccoop_debug/"$plugin".smx "$file" ${{ matrix.game.args }} done - name: Create package diff --git a/scripting/include/logdebug.inc b/scripting/include/logdebug.inc index 506b8a3d..386693e6 100644 --- a/scripting/include/logdebug.inc +++ b/scripting/include/logdebug.inc @@ -7,11 +7,6 @@ * Define NO_DEBUG before including this file to completely disable all debugging */ -#if defined _logdebug_included - #endinput -#endif -#define _logdebug_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop.inc b/scripting/include/srccoop.inc index 27a8ec85..b98eb91a 100644 --- a/scripting/include/srccoop.inc +++ b/scripting/include/srccoop.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_included - #endinput -#endif -#define _srccoop_included - #pragma newdecls required #pragma semicolon 1 @@ -142,22 +137,19 @@ // Includes //------------------------------------------------------ - #include #include #include #include #include #include -#include +#include #include -#include #include #include -#include -#include +#include #include #include #include @@ -168,9 +160,9 @@ #include #include #if defined SRCCOOP_BLACKMESA -#include -#include -#include +#include +#include +#include #elseif defined SRCCOOP_HL2DM #include #endif diff --git a/scripting/include/srccoop/blackmesa/typedef.inc b/scripting/include/srccoop/blackmesa/typedef.inc deleted file mode 100644 index e69de29b..00000000 diff --git a/scripting/include/srccoop/blackmesa/deathnotice.inc b/scripting/include/srccoop/bms/deathnotice.inc similarity index 97% rename from scripting/include/srccoop/blackmesa/deathnotice.inc rename to scripting/include/srccoop/bms/deathnotice.inc index fad17982..dce0c315 100644 --- a/scripting/include/srccoop/blackmesa/deathnotice.inc +++ b/scripting/include/srccoop/bms/deathnotice.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_deathnotice_game_included - #endinput -#endif -#define _srccoop_deathnotice_game_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/blackmesa/entitypatch.inc b/scripting/include/srccoop/bms/entitypatch.inc similarity index 95% rename from scripting/include/srccoop/blackmesa/entitypatch.inc rename to scripting/include/srccoop/bms/entitypatch.inc index b26dcbe9..adad16a4 100644 --- a/scripting/include/srccoop/blackmesa/entitypatch.inc +++ b/scripting/include/srccoop/bms/entitypatch.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_entitypatch_bm_included - #endinput -#endif -#define _srccoop_entitypatch_bm_included - #pragma newdecls required #pragma semicolon 1 @@ -15,7 +10,7 @@ static bool g_pPlayerIronsightClassic[MAXPLAYERS + 1]; // scientists should classify as allies (in MP, base function returns false when player is not passed in) // this allows npcs to pass filter in "player ally only" triggers //------------------------------------------------------ -public MRESReturn Hook_IsPlayerAlly(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_IsPlayerAlly(int _this, DHookReturn hReturn, DHookParam hParams) { DHookSetReturn(hReturn, true); return MRES_Supercede; @@ -66,7 +61,7 @@ public void Hook_GargSpawnPost(int iEntIndex) // CAI_BaseNPC - npc_gargantua // fix the 'ChasePlayer' input by setting a target ent. //------------------------------------------------------ -public MRESReturn Hook_GargAcceptInputPost(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_GargAcceptInputPost(int _this, DHookReturn hReturn, DHookParam hParams) { if (!DHookIsNullParam(hParams, 1)) { @@ -262,7 +257,7 @@ public void Hook_XenTurretSpawnPost(int iEntIndex) //------------------------------------------------------ CBaseEntity g_pActiveMarionettist[MAXPLAYERS+1] = {view_as(-1), ...}; -public MRESReturn Hook_MarionettistAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_MarionettistAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (CoopManager.IsCoopModeEnabled()) { @@ -543,7 +538,7 @@ public MRESReturn Hook_MusicTrackThink(int _this) return MRES_Supercede; } -public MRESReturn Hook_MusicTrackAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_MusicTrackAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { char szInputType[MAX_FORMAT]; char szBuffer[MAX_VALUE]; @@ -648,7 +643,7 @@ public MRESReturn Hook_TestGroundMove(Address _this, DHookReturn hReturn, DHookP // `env_xen_portal_effect` // Fixes xen portals not pushing players. //------------------------------------------------------ -public MRESReturn Hook_XenPortalEffect_AcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_XenPortalEffect_AcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { char szInputType[MAX_FORMAT]; DHookGetParamString(hParams, 1, szInputType, sizeof(szInputType)); @@ -823,7 +818,7 @@ public void Hook_GrenadeFragSpawnPost(const int iEntIndex) // weapon_357/weapon_crossbow // New constructed logic of toggling ironsights. //------------------------------------------------------ -public MRESReturn Hook_ToggleIronsights(int _this, Handle hParams) +public MRESReturn Hook_ToggleIronsights(int _this, DHookParam hParams) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -875,8 +870,7 @@ public MRESReturn Hook_ToggleIronsights(int _this, Handle hParams) } pPlayer.SetFOV(pWeapon, bWillBeUsingIronsights ? iFOV : 0, 0.5); pWeapon.SetIronsights(bWillBeUsingIronsights); - - PreventWeaponFiring(pWeapon, 0.5); + pWeapon.DelayNextAttack(0.5); return MRES_Supercede; } @@ -887,7 +881,7 @@ public MRESReturn Hook_ToggleIronsights(int _this, Handle hParams) // weapon_357 // Fixes the shooting animation played while using ironsights. //------------------------------------------------------ -public MRESReturn Hook_IronsightGetPrimaryAttackActivity(int _this, Handle hReturn) +public MRESReturn Hook_IronsightGetPrimaryAttackActivity(int _this, DHookReturn hReturn) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -909,7 +903,7 @@ public MRESReturn Hook_IronsightGetPrimaryAttackActivity(int _this, Handle hRetu // weapon_crossbow // Fixes the shooting animation played while using ironsights. //------------------------------------------------------ -public MRESReturn Hook_CrossbowGetPrimaryAttackActivity(int _this, Handle hReturn) +public MRESReturn Hook_CrossbowGetPrimaryAttackActivity(int _this, DHookReturn hReturn) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -941,7 +935,7 @@ void ConvarQuery_IronsightClassic(QueryCookie hCookie, int iClient, ConVarQueryR //------------------------------------------------------ // Caches the client settings used for ironsights. //------------------------------------------------------ -public MRESReturn Hook_IronsightDeployPost_SaveSettings(int _this, Handle hReturn) +public MRESReturn Hook_IronsightDeployPost_SaveSettings(int _this, DHookReturn hReturn) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -959,7 +953,7 @@ public MRESReturn Hook_IronsightDeployPost_SaveSettings(int _this, Handle hRetur // grenade_bolt // Disables explosive bolts by blocking the call. //------------------------------------------------------ -public MRESReturn Hook_GrenadeBoltAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_GrenadeBoltAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -978,7 +972,7 @@ public MRESReturn Hook_GrenadeBoltAcceptInput(int _this, Handle hReturn, Handle // weapon_crossbow // Sets the skin of the crossbow. //------------------------------------------------------ -public MRESReturn Hook_CrossbowDeployPost(int _this, Handle hReturn) +public MRESReturn Hook_CrossbowDeployPost(int _this, DHookReturn hReturn) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1004,7 +998,7 @@ public MRESReturn Hook_CrossbowDeployPost(int _this, Handle hReturn) // TODO: Hooking ItemPostFrame with IsMultiplayer = false causes prediction issues. // Fix this by not calling IsMultiplayer = false. //------------------------------------------------------ -public MRESReturn Hook_CrossbowItemPostFrame(int _this, Handle hReturn) +public MRESReturn Hook_CrossbowItemPostFrame(int _this, DHookReturn hReturn) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1032,7 +1026,7 @@ public MRESReturn Hook_CrossbowItemPostFrame(int _this, Handle hReturn) // weapon_crossbow // See `Hook_CrossbowItemPostFrame` for details. //------------------------------------------------------ -public MRESReturn Hook_CrossbowItemPostFramePost(int _this, Handle hReturn) +public MRESReturn Hook_CrossbowItemPostFramePost(int _this, DHookReturn hReturn) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1049,7 +1043,7 @@ public MRESReturn Hook_CrossbowItemPostFramePost(int _this, Handle hReturn) // - Sets the rearm bool // - Sets animations //------------------------------------------------------ -public MRESReturn Hook_CrossbowPrimaryAttack(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_CrossbowPrimaryAttack(int _this, DHookReturn hReturn, DHookParam hParams) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1062,7 +1056,7 @@ public MRESReturn Hook_CrossbowPrimaryAttack(int _this, Handle hReturn, Handle h // weapon_crossbow // See `Hook_CrossbowPrimaryAttack` for details. //------------------------------------------------------ -public MRESReturn Hook_CrossbowPrimaryAttackPost(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_CrossbowPrimaryAttackPost(int _this, DHookReturn hReturn, DHookParam hParams) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1075,7 +1069,7 @@ public MRESReturn Hook_CrossbowPrimaryAttackPost(int _this, Handle hReturn, Hand // weapon_crossbow // Fixes the rearm animation when pulling out the crossbow. //------------------------------------------------------ -public MRESReturn Hook_CrossbowGetDrawActivity(int _this, Handle hReturn) +public MRESReturn Hook_CrossbowGetDrawActivity(int _this, DHookReturn hReturn) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1088,7 +1082,7 @@ public MRESReturn Hook_CrossbowGetDrawActivity(int _this, Handle hReturn) // weapon_crossbow // See `Hook_CrossbowGetDrawActivity` for details. //------------------------------------------------------ -public MRESReturn Hook_CrossbowGetDrawActivityPost(int _this, Handle hReturn) +public MRESReturn Hook_CrossbowGetDrawActivityPost(int _this, DHookReturn hReturn) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1102,7 +1096,7 @@ public MRESReturn Hook_CrossbowGetDrawActivityPost(int _this, Handle hReturn) // `CWeapon_Crossbow::FireBolt` is only called by `CWeapon_Crossbow::PrimaryAttack` which is hooked. // If this gets called with singleplayer being set, this will crash the server. //------------------------------------------------------ -public MRESReturn Hook_CrossbowFireBolt(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_CrossbowFireBolt(int _this, DHookReturn hReturn, DHookParam hParams) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1115,7 +1109,7 @@ public MRESReturn Hook_CrossbowFireBolt(int _this, Handle hReturn, Handle hParam // weapon_crossbow // See `Hook_CrossbowFireBolt` for details. //------------------------------------------------------ -public MRESReturn Hook_CrossbowFireBoltPost(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_CrossbowFireBoltPost(int _this, DHookReturn hReturn, DHookParam hParams) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1128,7 +1122,7 @@ public MRESReturn Hook_CrossbowFireBoltPost(int _this, Handle hReturn, Handle hP // weapon_tau // Fixes the tau velocity. //------------------------------------------------------ -public MRESReturn Hook_TauFireBeam(int _this, Handle hReturn) +public MRESReturn Hook_TauFireBeam(int _this, DHookReturn hReturn) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1141,7 +1135,7 @@ public MRESReturn Hook_TauFireBeam(int _this, Handle hReturn) // weapon_tau // See `Hook_TauFireBeamPost` for details. //------------------------------------------------------ -public MRESReturn Hook_TauFireBeamPost(int _this, Handle hReturn) +public MRESReturn Hook_TauFireBeamPost(int _this, DHookReturn hReturn) { if (CoopManager.IsFeatureEnabled(FT_SP_WEAPONS)) { @@ -1171,7 +1165,7 @@ public MRESReturn Hook_Dissolve(int _this, DHookReturn hReturn, DHookParam hPara // Switches between using singleplayer and multiplayer weapon values. // This will get triggered by the command `params_reload_server`. -public MRESReturn Hook_CParamsManager_InitInstances(Address _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_CParamsManager_InitInstances(Address _this, DHookReturn hReturn, DHookParam hParams) { // TODO: // Currently, this is getting only called during level init, but diff --git a/scripting/include/srccoop/blackmesa/idle_anims.inc b/scripting/include/srccoop/bms/idle_anims.inc similarity index 98% rename from scripting/include/srccoop/blackmesa/idle_anims.inc rename to scripting/include/srccoop/bms/idle_anims.inc index 29cb93da..22e1fea4 100644 --- a/scripting/include/srccoop/blackmesa/idle_anims.inc +++ b/scripting/include/srccoop/bms/idle_anims.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_idle_anims_game_included - #endinput -#endif -#define _srccoop_idle_anims_game_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/checkpoint.inc b/scripting/include/srccoop/checkpoint.inc index 9c9c8bde..344721cc 100644 --- a/scripting/include/srccoop/checkpoint.inc +++ b/scripting/include/srccoop/checkpoint.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_checkpoint_included - #endinput -#endif -#define _srccoop_checkpoint_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/commands.inc b/scripting/include/srccoop/commands.inc index c6ab659c..dde63835 100644 --- a/scripting/include/srccoop/commands.inc +++ b/scripting/include/srccoop/commands.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_commands_included - #endinput -#endif -#define _srccoop_commands_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/config.inc b/scripting/include/srccoop/config.inc index 7b6d50c4..a10e0636 100644 --- a/scripting/include/srccoop/config.inc +++ b/scripting/include/srccoop/config.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_config_included - #endinput -#endif -#define _srccoop_config_included - #pragma newdecls required #pragma semicolon 1 @@ -21,11 +16,11 @@ enum struct SourceCoopConfig float PORTAL_TOUCH_SIZE; //------------------------------------------------------ - // MANAGER + // COOPMANAGER //------------------------------------------------------ // Freeze intro - screenfade properties - int FROZEN_FADE_COLOR[4]; + RGBA FROZEN_FADE_COLOR; int FROZEN_FADE_DUR_IN; int FROZEN_FADE_DUR_OUT; diff --git a/scripting/include/srccoop/deathnotice.inc b/scripting/include/srccoop/deathnotice.inc index e9d9af74..ac6ad644 100644 --- a/scripting/include/srccoop/deathnotice.inc +++ b/scripting/include/srccoop/deathnotice.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_deathnotice_included - #endinput -#endif -#define _srccoop_deathnotice_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/entitypatch.inc b/scripting/include/srccoop/entitypatch.inc index e2c0e8de..037203f2 100644 --- a/scripting/include/srccoop/entitypatch.inc +++ b/scripting/include/srccoop/entitypatch.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_entitypatch_included - #endinput -#endif -#define _srccoop_entitypatch_included - #pragma newdecls required #pragma semicolon 1 @@ -133,7 +128,7 @@ void PopSinglePlayerOverride() //------------------------------------------------------ // UTIL_GetLocalPlayer //------------------------------------------------------ -public MRESReturn Hook_UTIL_GetLocalPlayer(Handle hReturn) +public MRESReturn Hook_UTIL_GetLocalPlayer(DHookReturn hReturn) { CBaseEntity pOverrideEntity = g_pLocalPlayerEntity[g_iLocalPlayerStackPointer]; if (pOverrideEntity.IsValid()) @@ -168,7 +163,7 @@ public MRESReturn Hook_UTIL_GetLocalPlayer(Handle hReturn) //------------------------------------------------------ // CMultiplayRules::IsMultiplayer //------------------------------------------------------ -public MRESReturn Hook_IsMultiplayer(Handle hReturn) +public MRESReturn Hook_IsMultiplayer(DHookReturn hReturn) { DHookSetReturn(hReturn, g_bIsMultiplayerOverride); return MRES_Supercede; @@ -179,7 +174,7 @@ public MRESReturn Hook_IsMultiplayer(Handle hReturn) // Lets mappers use custom npc models // (Using keyvalues proves most reliable against BM overriding models with its character manifest file before Spawn()) //------------------------------------------------------ -public MRESReturn Hook_BaseNPCKeyValuePost(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_BaseNPCKeyValuePost(int _this, DHookReturn hReturn, DHookParam hParams) { CBaseEntity pEntity = CBaseEntity(_this); @@ -200,7 +195,7 @@ public MRESReturn Hook_BaseNPCKeyValuePost(int _this, Handle hReturn, Handle hPa return MRES_Ignored; } -public MRESReturn BaseNPCSetModelBlock(int _this, Handle hParams) +public MRESReturn BaseNPCSetModelBlock(int _this, DHookParam hParams) { return MRES_Supercede; } @@ -236,7 +231,7 @@ public MRESReturn Hook_Physics_RunThinkFunctions(DHookParam hParams) // CAI_BaseNPC // Fix UpdateEnemyMemory input when player string is passed as parameter //------------------------------------------------------ -public MRESReturn Hook_BaseNPCAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_BaseNPCAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (!DHookIsNullParam(hParams, 1)) { @@ -272,7 +267,7 @@ public MRESReturn Hook_BaseNPCAcceptInput(int _this, Handle hReturn, Handle hPar // Scene entities // fix findnamedentity returning sp player ( nullptr ) //------------------------------------------------------ -public MRESReturn Hook_FindNamedEntity(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_FindNamedEntity(int _this, DHookReturn hReturn, DHookParam hParams) { if (!DHookIsNullParam(hParams, 1) && !DHookIsNullParam(hParams, 2)) { @@ -303,7 +298,7 @@ public MRESReturn Hook_FindNamedEntity(int _this, Handle hReturn, Handle hParams // NPCs that use the response system https://developer.valvesoftware.com/wiki/Response_System // The original function calls `AI_GetSinglePlayer()` which will end up returning null. //------------------------------------------------------ -public MRESReturn Hook_ExpresserHost_DoModifyOrAppendCriteriaPost(Handle hParams) +public MRESReturn Hook_ExpresserHost_DoModifyOrAppendCriteriaPost(DHookParam hParams) { CBaseEntity pSpeaker = CBaseEntity(DHookGetParam(hParams, 1)); CBasePlayer pPlayer = GetNearestPlayerPreferAlive(pSpeaker, true); @@ -350,7 +345,7 @@ public void Hook_ChangelevelSpawn(int iEntIndex) } } -public MRESReturn Hook_ChangelevelAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_ChangelevelAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (CoopManager.IsCoopModeEnabled()) { @@ -424,7 +419,7 @@ public Action ChangelevelEffects(Handle timer, CChangelevel pChangelevel) // Does not work in BM // Other games benefit from our custom map series logic //------------------------------------------------------ -public MRESReturn Hook_GameEndAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_GameEndAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (!CoopManager.IsCoopModeEnabled()) { @@ -458,7 +453,7 @@ public Action Hook_AutosaveSpawn(int iEntIndex) // CPointTeleport - point_teleport // multiplayer support //------------------------------------------------------ -public MRESReturn Hook_PointTeleportAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_PointTeleportAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (!DHookIsNullParam(hParams, 1)) { @@ -493,7 +488,7 @@ public MRESReturn Hook_PointTeleportAcceptInput(int _this, Handle hReturn, Handl // CTriggerCamera - point_viewcontrol // multiplayer support //------------------------------------------------------ -public MRESReturn Hook_PointViewcontrolAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_PointViewcontrolAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { static bool bHookSkip = false; LogDebug("Hook_PointViewcontrolAcceptInput ent=%d", _this); @@ -586,7 +581,7 @@ public Action OnEndFollowBlocker(const char[] output, int caller, int activator, // CMovementSpeedMod - player_speedmod // multiplayer support //------------------------------------------------------ -public MRESReturn Hook_SpeedmodAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_SpeedmodAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { static bool bHookSkip = false; if (!bHookSkip) @@ -624,7 +619,7 @@ public MRESReturn Hook_SpeedmodAcceptInput(int _this, Handle hReturn, Handle hPa // CEnvZoom - env_zoom // multiplayer support //------------------------------------------------------ -public MRESReturn Hook_EnvZoomAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_EnvZoomAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { static bool bHookSkip = false; if (!bHookSkip) @@ -695,7 +690,7 @@ public MRESReturn Hook_EnvZoomAcceptInput(int _this, Handle hReturn, Handle hPar // point_clientcommand // multiplayer support //------------------------------------------------------ -public MRESReturn Hook_ClientCommandAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_ClientCommandAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { static bool bHookSkip = false; if (!bHookSkip) @@ -773,7 +768,7 @@ public MRESReturn Hook_ClientCommandAcceptInput(int _this, Handle hReturn, Handl // point_servercommand // treat changelevel command as natural mapchange //------------------------------------------------------ -public MRESReturn Hook_ServerCommandAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_ServerCommandAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (CoopManager.IsCoopModeEnabled()) { @@ -812,7 +807,7 @@ public MRESReturn Hook_ServerCommandAcceptInput(int _this, Handle hReturn, Handl // env_credits // multiplayer support //------------------------------------------------------ -public MRESReturn Hook_EnvCreditsAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_EnvCreditsAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (!DHookIsNullParam(hParams, 1)) { @@ -919,7 +914,7 @@ public MRESReturn Hook_ResolveNames(int _this) // CAI_LeadBehavior // multiplayer support for ai_goal_lead //------------------------------------------------------ -public MRESReturn Hook_CanSelectSchedule(Handle hReturn) +public MRESReturn Hook_CanSelectSchedule(DHookReturn hReturn) { LogDebug("Hook_CanSelectSchedule"); // ToDo: acutally check conditions as in original code @@ -1066,7 +1061,7 @@ public MRESReturn Hook_SetPlayerAvoidState(int _this) // // - [Source SDK 2013](https://github.com/ValveSoftware/source-sdk-2013/blob/0d8dceea4310fde5706b3ce1c70609d72a38efdf/mp/src/game/server/ai_basenpc.cpp#L3353) // -public MRESReturn Hook_BaseNpcUpdateSleepState(int _this, Handle hParams) +public MRESReturn Hook_BaseNpcUpdateSleepState(int _this, DHookParam hParams) { // TODO: does bInPVS work for any and all players? CAI_BaseNPC pBaseNPC = CAI_BaseNPC(_this); @@ -1134,7 +1129,7 @@ public MRESReturn Hook_BaseNpcUpdateSleepState(int _this, Handle hParams) // Don't let an NPC sleep if they're running a script! if (!pBaseNPC.IsInAScript() && pBaseNPC.GetState() != NPC_STATE_SCRIPT) { - if (pBaseNPC.HasSleepFlags(AI_SLEEP_FLAG_AUTO_PVS)) + if (pBaseNPC.m_SleepFlags & AI_SLEEP_FLAG_AUTO_PVS) { if (!pBaseNPC.HasCondition(view_as(COND_IN_PVS))) { @@ -1143,13 +1138,13 @@ public MRESReturn Hook_BaseNpcUpdateSleepState(int _this, Handle hParams) } } - if (pBaseNPC.HasSleepFlags(AI_SLEEP_FLAG_AUTO_PVS_AFTER_PVS)) + if (pBaseNPC.m_SleepFlags & AI_SLEEP_FLAG_AUTO_PVS_AFTER_PVS) { if (pBaseNPC.HasCondition(view_as(COND_IN_PVS))) { // OK, we're in the player's PVS. Now switch to regular old AUTO_PVS sleep rules. - pBaseNPC.AddSleepFlags(AI_SLEEP_FLAG_AUTO_PVS); - pBaseNPC.RemoveSleepFlags(AI_SLEEP_FLAG_AUTO_PVS_AFTER_PVS); + pBaseNPC.m_SleepFlags |= AI_SLEEP_FLAG_AUTO_PVS; + pBaseNPC.m_SleepFlags &= ~AI_SLEEP_FLAG_AUTO_PVS_AFTER_PVS; } } } @@ -1195,7 +1190,7 @@ public bool HasAnyPlayerWalkedIntoWakeRadius(CAI_BaseNPC pBaseNPC) // // - [Source SDK 2013](https://github.com/ValveSoftware/source-sdk-2013/blob/0d8dceea4310fde5706b3ce1c70609d72a38efdf/mp/src/game/server/ai_basenpc_schedule.cpp#L3191) // -public MRESReturn Hook_BaseNPCRunTask(int _this, Handle hParams) +public MRESReturn Hook_BaseNPCRunTask(int _this, DHookParam hParams) { CAI_BaseNPC pEntity = CAI_BaseNPC(_this); Task_t pTask = DHookGetParam(hParams, 1); @@ -1215,7 +1210,7 @@ public MRESReturn Hook_BaseNPCRunTask(int _this, Handle hParams) return MRES_Ignored; } -public MRESReturn Hook_BaseNPCRunTaskPost(int _this, Handle hParams) +public MRESReturn Hook_BaseNPCRunTaskPost(int _this, DHookParam hParams) { PopSinglePlayerOverride(); return MRES_Ignored; @@ -1230,7 +1225,7 @@ public MRESReturn Hook_BaseNPCRunTaskPost(int _this, Handle hParams) // // - [Source SDK 2013](https://github.com/ValveSoftware/source-sdk-2013/blob/0d8dceea4310fde5706b3ce1c70609d72a38efdf/mp/src/game/server/hl2/proto_sniper.cpp#L1385) // -public MRESReturn Hook_ProtoSniperSelectSchedule(int _this, Handle hReturn) +public MRESReturn Hook_ProtoSniperSelectSchedule(int _this, DHookReturn hReturn) { CProtoSniper pSniper = CProtoSniper(_this); @@ -1352,7 +1347,7 @@ public Action Hook_NoDmg(int victim, int &attacker, int &inflictor, float &damag // player_loadsaved // multiplayer support //------------------------------------------------------ -public MRESReturn Hook_LoadSavedAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_LoadSavedAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (!CoopManager.IsCoopModeEnabled()) { @@ -1370,10 +1365,8 @@ public MRESReturn Hook_LoadSavedAcceptInput(int _this, Handle hReturn, Handle hP CBasePlayer pActivator = CBasePlayer(iActivator); if (pActivator.IsPlayer()) { - int r, g, b, a; - GetEntityRenderColor(_this, r, g, b, a); - float duration = GetEntPropFloat(_this, Prop_Data, "m_Duration"); - Client_ScreenFade(iActivator, RoundFloat(duration * 1000), view_as(FFADE_OUT | FFADE_STAYOUT), _, r, g, b, a); + CRevertSaved pThis = CRevertSaved(_this); + pActivator.ScreenFade(RoundFloat(pThis.GetDuration() * 1000), pThis.GetRenderColor(), FFADE_OUT | FFADE_STAYOUT); // This breaks the spectator overlay if the player is already dead if (pActivator.IsAlive()) @@ -1394,7 +1387,7 @@ public MRESReturn Hook_LoadSavedAcceptInput(int _this, Handle hReturn, Handle hP // Survival mode hook // May need to hook logic_active_autosave at some point if it is used, most maps do not use it though //------------------------------------------------------ -public MRESReturn Hook_LogicAutosaveAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_LogicAutosaveAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (!CoopManager.IsCoopModeEnabled()) { @@ -1424,7 +1417,7 @@ public MRESReturn Hook_LogicAutosaveAcceptInput(int _this, Handle hReturn, Handl // func_trackautochange // Prevent track from being blocked by players and forced to go back down //------------------------------------------------------ -public MRESReturn Hook_TrackChangeBlocked(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_TrackChangeBlocked(int _this, DHookReturn hReturn, DHookParam hParams) { if (!DHookIsNullParam(hParams, 1)) { @@ -1446,7 +1439,7 @@ public MRESReturn Hook_TrackChangeBlocked(int _this, Handle hReturn, Handle hPar // Prevent trains from being blocked by players // Moves players up if not blocked, otherwise kills blocking player //------------------------------------------------------ -public MRESReturn Hook_TrackTrainBlocked(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_TrackTrainBlocked(int _this, DHookReturn hReturn, DHookParam hParams) { static float vecOriginAdjusted[3]; diff --git a/scripting/include/srccoop/features.inc b/scripting/include/srccoop/features.inc index 3a1fab04..40c46a11 100644 --- a/scripting/include/srccoop/features.inc +++ b/scripting/include/srccoop/features.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_features_included - #endinput -#endif -#define _srccoop_features_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/globals.inc b/scripting/include/srccoop/globals.inc index c63414db..d21613f4 100644 --- a/scripting/include/srccoop/globals.inc +++ b/scripting/include/srccoop/globals.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_globals_included - #endinput -#endif -#define _srccoop_globals_included - #pragma newdecls required #pragma semicolon 1 @@ -11,7 +6,6 @@ // ---------------------------- ConVar g_pConvarCoopTeam; ConVar g_pConvarCoopRespawnTime; -ConVar g_pConvarCleanHud; ConVar g_pConvarStartWaitPeriod; ConVar g_pConvarStartWaitMode; ConVar g_pConvarEndWaitPeriod; @@ -26,24 +20,28 @@ ConVar g_pConvarDefaultMapConfigDest; ConVar g_pConvarDisableTeamSelect; #endif +#if defined SRCCOOP_BLACKMESA +ConVar g_pConvarCleanHud; +#endif + // Existing ConVars. ConVar mp_friendlyfire; ConVar mp_flashlight; ConVar mp_forcerespawn; // Existing Black Mesa ConVars. + +#if defined SRCCOOP_BLACKMESA ConVar sv_always_run; ConVar sv_speed_sprint; ConVar sv_speed_walk; ConVar sv_jump_long_enabled; ConVar sv_long_jump_manacost; +#endif // ---------------------------- // SDK Calls // ---------------------------- -#if defined PLAYERPATCH_SERVERSIDE_RAGDOLLS -Handle g_pCreateServerRagdoll; -#endif // ---------------------------- // DHooks diff --git a/scripting/include/srccoop/hl2dm/deathnotice.inc b/scripting/include/srccoop/hl2dm/deathnotice.inc index b1cf9458..7ad3d58a 100644 --- a/scripting/include/srccoop/hl2dm/deathnotice.inc +++ b/scripting/include/srccoop/hl2dm/deathnotice.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_deathnotice_game_included - #endinput -#endif -#define _srccoop_deathnotice_game_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/import.inc b/scripting/include/srccoop/import.inc index 164bf92f..be8e0956 100644 --- a/scripting/include/srccoop/import.inc +++ b/scripting/include/srccoop/import.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_import_included - #endinput -#endif -#define _srccoop_import_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/instancing.inc b/scripting/include/srccoop/instancing.inc index fbf7fc80..01b9cb19 100644 --- a/scripting/include/srccoop/instancing.inc +++ b/scripting/include/srccoop/instancing.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_instancing_included - #endinput -#endif -#define _srccoop_instancing_included - #pragma newdecls required #pragma semicolon 1 @@ -48,9 +43,8 @@ methodmap ItemInstancingManager char szKey[MAX_CHARS_INT(INT_MIN)]; IntToString(view_as(pItem), szKey, sizeof(szKey)); - - bool _bValue; - return g_pPickedUpItems[client].GetValue(szKey, _bValue); + + return g_pPickedUpItems[client].ContainsKey(szKey); } public static void ClearPickedUpItem(CBaseEntity pItem) @@ -91,7 +85,7 @@ public void Hook_Instancing_ItemSpawn(int iEntIndex) } // Do not allow to to touch-pickup consumed items -public MRESReturn Hook_Instancing_OnTryPickUpPre(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_Instancing_OnTryPickUpPre(int _this, DHookReturn hReturn, DHookParam hParams) { CBasePlayer pPlayer = CBasePlayer(DHookGetParam(hParams, 1)); if (pPlayer.IsPlayer()) @@ -107,7 +101,7 @@ public MRESReturn Hook_Instancing_OnTryPickUpPre(int _this, Handle hReturn, Hand } // Store this newly consumed item -public MRESReturn Hook_Instancing_OnTryPickUpPost(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_Instancing_OnTryPickUpPost(int _this, DHookReturn hReturn, DHookParam hParams) { bool bPickedUp = DHookGetReturn(hReturn); if (bPickedUp) diff --git a/scripting/include/srccoop/kv_shared.inc b/scripting/include/srccoop/kv_shared.inc index f95af205..4c875a1e 100644 --- a/scripting/include/srccoop/kv_shared.inc +++ b/scripting/include/srccoop/kv_shared.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_kv_shared_included - #endinput -#endif -#define _srccoop_kv_shared_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/levellump.inc b/scripting/include/srccoop/levellump.inc index ccfbc917..c41bba12 100644 --- a/scripting/include/srccoop/levellump.inc +++ b/scripting/include/srccoop/levellump.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_levellump_included - #endinput -#endif -#define _srccoop_levellump_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/manager.inc b/scripting/include/srccoop/manager.inc index 64f91565..3bece901 100644 --- a/scripting/include/srccoop/manager.inc +++ b/scripting/include/srccoop/manager.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_manager_included - #endinput -#endif -#define _srccoop_manager_included - #pragma newdecls required #pragma semicolon 1 @@ -215,7 +210,7 @@ methodmap CoopManager CBaseCombatWeapon pWeapon = pPlayer.GetActiveWeapon(); if (pWeapon != NULL_CBASEENTITY) { - PreventWeaponFiring(pWeapon, 0.25); + pWeapon.DelayNextAttack(0.25); } } } @@ -270,13 +265,12 @@ methodmap CoopManager if (g_pLevelLump.m_iIntroType == INTRO_FADE) { pPlayer.m_fFlags |= (FL_ATCONTROLS | FL_FROZEN | FL_NOTARGET); // Freeze controls and angles. - Client_ScreenFade(pPlayer.entindex, 0, view_as(FFADE_STAYOUT)); + pPlayer.ScreenFade(0, RGBA(0, 0, 0, 255), FFADE_STAYOUT); } else if (g_pLevelLump.m_iIntroType == INTRO_FREEZE) { pPlayer.m_fFlags |= (FL_ATCONTROLS | FL_NOTARGET); // Freeze controls. - Client_ScreenFade(pPlayer.entindex, Conf.FROZEN_FADE_DUR_IN, view_as(FFADE_OUT | FFADE_STAYOUT), _, - Conf.FROZEN_FADE_COLOR[0], Conf.FROZEN_FADE_COLOR[1], Conf.FROZEN_FADE_COLOR[2], Conf.FROZEN_FADE_COLOR[3]); + pPlayer.ScreenFade(Conf.FROZEN_FADE_DUR_IN, Conf.FROZEN_FADE_COLOR, FFADE_OUT | FFADE_STAYOUT); } if (g_pLevelLump.m_iIntroType == INTRO_NONE && !data.m_bMapHasDelayedOutput) @@ -619,8 +613,7 @@ public Action Timer_DecrementUntilMapStart(Handle hTimer) pPlayer.m_fFlags &= ~(FL_ATCONTROLS | FL_FROZEN | FL_NOTARGET); if (g_pLevelLump.m_iIntroType == INTRO_FREEZE) { - Client_ScreenFade(pPlayer.entindex, Conf.FROZEN_FADE_DUR_OUT, view_as(FFADE_PURGE | FFADE_IN), 1, - Conf.FROZEN_FADE_COLOR[0], Conf.FROZEN_FADE_COLOR[1], Conf.FROZEN_FADE_COLOR[2], Conf.FROZEN_FADE_COLOR[3]); + pPlayer.ScreenFade(Conf.FROZEN_FADE_DUR_OUT, Conf.FROZEN_FADE_COLOR, FFADE_PURGE | FFADE_IN, 1); } } } diff --git a/scripting/include/srccoop/manager_changelevel.inc b/scripting/include/srccoop/manager_changelevel.inc index 932b1de6..19b9537a 100644 --- a/scripting/include/srccoop/manager_changelevel.inc +++ b/scripting/include/srccoop/manager_changelevel.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_manager_changelevel_included - #endinput -#endif -#define _srccoop_manager_changelevel_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/manager_persistence.inc b/scripting/include/srccoop/manager_persistence.inc index ed1955d2..1633935a 100644 --- a/scripting/include/srccoop/manager_persistence.inc +++ b/scripting/include/srccoop/manager_persistence.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_manager_persistence_included - #endinput -#endif -#define _srccoop_manager_persistence_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/manager_survival.inc b/scripting/include/srccoop/manager_survival.inc index 9fe37708..540d489c 100644 --- a/scripting/include/srccoop/manager_survival.inc +++ b/scripting/include/srccoop/manager_survival.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_manager_survival_included - #endinput -#endif -#define _srccoop_manager_survival_included - #pragma newdecls required #pragma semicolon 1 @@ -147,7 +142,7 @@ methodmap SurvivalManager { ShowVGUIPanel(client, "specgui", null); // Remove previous fades - Client_ScreenFade(client, 1500, view_as(FFADE_IN | FFADE_PURGE), 1, 0, 0, 0, 255); + pPlayer.ScreenFade(1500, RGBA(0, 0, 0, 255), FFADE_IN | FFADE_PURGE, 1); SetHudTextParams(0.016, 0.04, 5.0, 255, 255, 255, 255, 1, 1.0, 1.0, 1.0); if (SurvivalManager.GetRespawnAtCheckpoints() && CCoopSpawnSystem.CountCheckpoints(true, true)) @@ -298,7 +293,9 @@ methodmap SurvivalManager { { CBasePlayer pPlayer = CBasePlayer(i); if (pPlayer.GetTeam() != TEAM_SPECTATOR) - Client_ScreenFade(i, 1000, view_as(FFADE_OUT | FFADE_STAYOUT), _, 0, 0, 0, 255); + { + pPlayer.ScreenFade(1000, RGBA(0, 0, 0, 255), FFADE_OUT | FFADE_STAYOUT); + } #if defined SRCCOOP_BLACKMESA if (!IsTranslatedForLanguage("survival game over", GetClientLanguage(i))) diff --git a/scripting/include/srccoop/menu.inc b/scripting/include/srccoop/menu.inc index 7fe0831c..e3f4adae 100644 --- a/scripting/include/srccoop/menu.inc +++ b/scripting/include/srccoop/menu.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_menu_included - #endinput -#endif -#define _srccoop_menu_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/natives.inc b/scripting/include/srccoop/natives.inc index 7ab8c45c..df182cda 100644 --- a/scripting/include/srccoop/natives.inc +++ b/scripting/include/srccoop/natives.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_natives_included - #endinput -#endif -#define _srccoop_natives_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop/playerpatch.inc b/scripting/include/srccoop/playerpatch.inc index ccb91513..8da52d0a 100644 --- a/scripting/include/srccoop/playerpatch.inc +++ b/scripting/include/srccoop/playerpatch.inc @@ -1,19 +1,17 @@ -#if defined _srccoop_playerpatch_included - #endinput -#endif -#define _srccoop_playerpatch_included - #pragma newdecls required #pragma semicolon 1 static float g_vec3PlayerShootPosition[MAXPLAYERS + 1][3]; -static bool g_bSetJumpModuleActive[MAXPLAYERS + 1]; static float g_flPlayerMaxSpeed[MAXPLAYERS + 1]; +#if defined PLAYERPATCH_BM_CLIENT_PREDICTION +static bool g_bSetJumpModuleActive[MAXPLAYERS + 1]; +#endif + //------------------------------------------------------ // Allow flashlight //------------------------------------------------------ -public MRESReturn Hook_FAllowFlashlight(Handle hReturn, Handle hParams) +public MRESReturn Hook_FAllowFlashlight(DHookReturn hReturn, DHookParam hParams) { DHookSetReturn(hReturn, mp_flashlight.BoolValue); return MRES_Supercede; @@ -90,7 +88,7 @@ public void Hook_PlayerPreThinkPost(int iClient) { if (g_bSetJumpModuleActive[iClient]) { - pBlackMesaPlayer.SendConVarValueBool(sv_jump_long_enabled, false); + pBlackMesaPlayer.SendConVarValueInt(sv_jump_long_enabled, false); g_bSetJumpModuleActive[iClient] = false; } } @@ -98,7 +96,7 @@ public void Hook_PlayerPreThinkPost(int iClient) { if (!g_bSetJumpModuleActive[iClient]) { - pBlackMesaPlayer.SendConVarValueBool(sv_jump_long_enabled, sv_jump_long_enabled.BoolValue); + pBlackMesaPlayer.SendConVarValueInt(sv_jump_long_enabled, sv_jump_long_enabled.BoolValue); g_bSetJumpModuleActive[iClient] = true; } } @@ -111,7 +109,7 @@ public void Hook_PlayerPreThinkPost(int iClient) if (pPlayer.IsCarryingObject()) { // fix clientside prediction errors when dropping objects - PreventWeaponFiring(pWeapon, 1.0); + pWeapon.DelayNextAttack(1.0); } else if (pPlayer.GetWaterLevel() == WL_Eyes) { @@ -125,7 +123,7 @@ public void Hook_PlayerPreThinkPost(int iClient) { if (!pWeapon.CanFireUnderwater() && pWeapon.GetPrimaryAmmoType() != -1) { - PreventWeaponFiring(pWeapon, 0.2); + pWeapon.DelayNextAttack(0.2); } } } @@ -338,7 +336,7 @@ public Action PlayerSoundListener(int iClients[MAXPLAYERS], int& iNumClients, ch return Plugin_Continue; } -public MRESReturn Hook_SetSuitUpdate(int _this, Handle hParams) +public MRESReturn Hook_SetSuitUpdate(int _this, DHookParam hParams) { if (CoopManager.IsFeatureEnabled(FT_HEV_SOUNDS)) { @@ -347,7 +345,7 @@ public MRESReturn Hook_SetSuitUpdate(int _this, Handle hParams) return MRES_Ignored; } -public MRESReturn Hook_SetSuitUpdatePost(int _this, Handle hParams) +public MRESReturn Hook_SetSuitUpdatePost(int _this, DHookParam hParams) { g_bIsMultiplayerOverride = true; return MRES_Ignored; @@ -358,7 +356,7 @@ public MRESReturn Hook_SetSuitUpdatePost(int _this, Handle hParams) // Prevent input of kill to player as this will put the player in a hanging state // This can occur in some maps where a trigger is set to kill the !activator and the player so happens to be there //------------------------------------------------------ -public MRESReturn Hook_PlayerAcceptInput(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_PlayerAcceptInput(int _this, DHookReturn hReturn, DHookParam hParams) { if (!DHookIsNullParam(hParams, 1)) { @@ -389,7 +387,7 @@ public void PlayerPatch_OnClientPutInServer(const int iClient) //------------------------------------------------------ // Player spawn //------------------------------------------------------ -public MRESReturn Hook_PlayerSpawn(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_PlayerSpawn(int _this, DHookReturn hReturn, DHookParam hParams) { if (CoopManager.IsCoopModeEnabled()) { @@ -410,7 +408,7 @@ public MRESReturn Hook_PlayerSpawn(int _this, Handle hReturn, Handle hParams) //------------------------------------------------------ // Player spawn post //------------------------------------------------------ -public MRESReturn Hook_PlayerSpawnPost(int iClient, Handle hReturn, Handle hParams) +public MRESReturn Hook_PlayerSpawnPost(int iClient, DHookReturn hReturn, DHookParam hParams) { if (!CoopManager.IsCoopModeEnabled()) return MRES_Ignored; @@ -485,7 +483,7 @@ public MRESReturn Hook_PlayerSpawnPost(int iClient, Handle hReturn, Handle hPara // Hide team select pPlayer.SendCommand("hidepanel team"); pPlayer.SendCommand("hidepanel deathmatch"); - pPlayer.SetTeam(TEAM_SCIENTIST); + pPlayer.SetTeam(TEAM_TWO); g_bPostTeamSelect[iClient] = true; } else @@ -565,8 +563,9 @@ void PlayerPatch_ApplyServerRagdoll(const CBasePlayer pPlayer, const CTakeDamage return; } + CBaseAnimating pSourceEntity = pPlayer; + #if defined SRCCOOP_BLACKMESA - int iRagdollInheritIndex; if (g_pIdle[pPlayer.entindex].m_pModel.IsValid()) { // Player is currently using model for idle animations. @@ -574,44 +573,19 @@ void PlayerPatch_ApplyServerRagdoll(const CBasePlayer pPlayer, const CTakeDamage // The model that was parented is cleared since `CreateServerRagdoll` will not work otherwise. pPlayer.m_fEffects |= EF_NODRAW; g_pIdle[pPlayer.entindex].m_pModel.ClearParent(); - iRagdollInheritIndex = g_pIdle[pPlayer.entindex].m_pModel.entindex; + pSourceEntity = g_pIdle[pPlayer.entindex].m_pModel; } else { - pPlayer.m_fEffects &= ~EF_NODRAW; - iRagdollInheritIndex = pPlayer.entindex; + pSourceEntity.m_fEffects &= ~EF_NODRAW; } - #else - int iRagdollInheritIndex = pPlayer.entindex; #endif - // TODO: - // Move `g_pCreateServerRagdoll` into `CRagdollProp`. - pRagdoll = CRagdollProp(SDKCall(g_pCreateServerRagdoll, iRagdollInheritIndex, pPlayer.GetForceBone(), pTakeDamageInfo, COLLISION_GROUP_DEBRIS_TRIGGER, false)); + pRagdoll = CreateServerRagdoll(pSourceEntity, pPlayer.GetForceBone(), pTakeDamageInfo, COLLISION_GROUP_DEBRIS_TRIGGER, false); if (pRagdoll != NULL_CBASEENTITY) { SDKHook(pRagdoll.entindex, SDKHook_OnTakeDamage, Hook_NoDmg); - // TODO: If killed by a player, attach ragdoll to barnacle - //CBaseEntity pInflictor = pTakeDamageInfo.GetInflictor(); - //if (pInflictor != NULL_CBASEENTITY) - //{ - // char szClassname[MAX_CLASSNAME]; - // pInflictor.GetClassname(szClassname, sizeof(szClassname)); - // if (strcmp(szClassname, "npc_barnacle") == 0) - // { - // CNPC_Barnacle pBarnacle = view_as(pInflictor); - // - // float vec3GrabPosition[3]; - // pPlayer.GetEyePosition(vec3GrabPosition); - // - // float vec3Position[3]; - // pPlayer.GetAbsOrigin(vec3Position); - // pBarnacle.AttachTongueToTarget(pRagdoll, vec3GrabPosition); - // pRagdoll.m_iEFlags |= EFL_IS_BEING_LIFTED_BY_BARNACLE; - // } - //} - pPlayer.SetRagdoll(pRagdoll); pPlayer.SetObserverMode(OBS_MODE_CHASE); pPlayer.SetObserverTarget(pRagdoll); @@ -710,7 +684,7 @@ public Action Hook_PlayerTakeDamage(int victim, int &attacker, int &inflictor, f // Fixes hit registration being off by 1 tick. // Credits to Xutax_Kamay (https://forums.alliedmods.net/showthread.php?t=315405) -public MRESReturn Hook_PlayerWeaponShootPosition_Post(int iClient, Handle hReturn) +public MRESReturn Hook_PlayerWeaponShootPosition_Post(int iClient, DHookReturn hReturn) { CBasePlayer pPlayer = CBasePlayer(iClient); // Objects that are carried will call this hook and lag further behind the desired position. @@ -747,7 +721,7 @@ public MRESReturn Hook_PlayerChangeTeam(int iClient, DHookParam hParams) if (iTeam == TEAM_UNASSIGNED) { - hParams.Set(1, TEAM_SCIENTIST); + hParams.Set(1, TEAM_TWO); return MRES_ChangedHandled; } } @@ -755,7 +729,7 @@ public MRESReturn Hook_PlayerChangeTeam(int iClient, DHookParam hParams) return MRES_Ignored; } -public MRESReturn Hook_PlayerChangeTeamPost(int iClient, Handle hParams) +public MRESReturn Hook_PlayerChangeTeamPost(int iClient, DHookParam hParams) { if (CoopManager.IsCoopModeEnabled()) { @@ -779,7 +753,7 @@ public MRESReturn Hook_PlayerChangeTeamPost(int iClient, Handle hParams) //------------------------------------------------------ // NoBlock //------------------------------------------------------ -public MRESReturn Hook_PlayerShouldCollide(int _this, Handle hReturn, Handle hParams) +public MRESReturn Hook_PlayerShouldCollide(int _this, DHookReturn hReturn, DHookParam hParams) { if (CoopManager.IsFeatureEnabled(FT_NOBLOCK)) { @@ -797,7 +771,7 @@ public MRESReturn Hook_PlayerShouldCollide(int _this, Handle hReturn, Handle hPa // Pickup_ForcePlayerToDropThisObject // reconstructed to avoid crash on UTIL_GetLocalPlayer nullptr //------------------------------------------------------ -public MRESReturn Hook_ForcePlayerToDropThisObject(Handle hParams) +public MRESReturn Hook_ForcePlayerToDropThisObject(DHookParam hParams) { if (!DHookIsNullParam(hParams, 1)) { @@ -896,14 +870,14 @@ public void Movement_FindLadder(CBasePlayer pPlayer) continue; // Finally the traces that need to be overridden to ignore players in the way... - CTraceRay pTraceRay = new CTraceRay(vecPlayerOrigin, closest, MASK_PLAYERSOLID, RayType_EndPoint, TraceEntityFilter_IgnorePlayers, -1); + CTraceRay pTraceRay = new CTraceRay(vecPlayerOrigin, closest, MASK_PLAYERSOLID, RayType_EndPoint, TraceEntityFilter_IgnorePlayers); if (pTraceRay.GetFraction() != 1.0 && pTraceRay.GetEntity() != pLadder) { pTraceRay.Close(); AddVectors(vecTmp, vecPlayerOrigin, vecTmp); vecTmp[2] += sizeZ; - pTraceRay = new CTraceRay(vecTmp, closest, MASK_PLAYERSOLID, RayType_EndPoint, TraceEntityFilter_IgnorePlayers, -1); + pTraceRay = new CTraceRay(vecTmp, closest, MASK_PLAYERSOLID, RayType_EndPoint, TraceEntityFilter_IgnorePlayers); if (pTraceRay.GetFraction() != 1.0 && pTraceRay.GetEntity() != pLadder) { pTraceRay.Close(); @@ -1092,13 +1066,7 @@ void QueryConVarSafeSet(QueryCookie cookie, int client, ConVarQueryResult result } } -public bool TraceEntityFilter_IgnorePlayers(int iEntIndex, int iMask, any pData) -{ - CBasePlayer pPlayer = CBasePlayer(iEntIndex); - if (pPlayer.IsValid()) - return false; - return (iEntIndex != pData); -} +#if defined PLAYERPATCH_BM_CLIENT_PREDICTION public void SetMovementPredictionConVars() { @@ -1116,6 +1084,8 @@ public void Hook_ConVar_AlwaysRun(const ConVar hConVar, const char[] szOldValue, SetMovementPredictionConVars(); } +#endif // PLAYERPATCH_BM_CLIENT_PREDICTION + // Clears the player out of NPC memories and clears flags. // static void ClearNpcMemoryForPlayer(const CBasePlayer pPlayer) diff --git a/scripting/include/srccoop/public.inc b/scripting/include/srccoop/public.inc index 02500666..2b5c936f 100644 --- a/scripting/include/srccoop/public.inc +++ b/scripting/include/srccoop/public.inc @@ -1,14 +1,14 @@ -#if defined _srccoop_public_included - #endinput -#endif -#define _srccoop_public_included - #pragma newdecls required #pragma semicolon 1 +// Purpose: +// SourceCoop definitions and functionality shared with its addons + + //------------------------------------------------------ // Prefix tags / colors for printing messages //------------------------------------------------------ + #define SRCCOOP_CHAT_COLOR_PRI "\x07e69c12" #define SRCCOOP_CHAT_COLOR_SEC "\x07eb6f28" #define SRCCOOP_CHAT_COLOR_TER "\x07e8b454" @@ -61,11 +61,6 @@ #define SRCCOOP_CONFIG_GAMEDATA_NAME "srccoop_config.games" #define SRCCOOP_LIBRARY "SRCCOOP" /* The library name registered by the core plugin */ -#define CHAR_BIT 8 -#define FLT_MAX 2147483647.0 -#define INT_MIN -2147483648 -#define INT_MAX 2147483647 - enum IntroType { INTRO_NONE = 0, @@ -75,8 +70,8 @@ enum IntroType enum CoopConfigLocation { - CCL_SM_DATA = 0, /* "Path_SM/data/srccoop" | Uses default filesystem */ - CCL_MAPS /* "maps" | Uses valve filesystem */ + CCL_SM_DATA = 0, /* "Path_SM/data/srccoop" | Uses default filesystem */ + CCL_MAPS /* "maps" | Uses valve filesystem */ } enum SurvivalMode @@ -105,3 +100,103 @@ enum struct SpawnOptions this.bUnstuck = true; } } + +//------------------------------------------------------ +// Stocks +//------------------------------------------------------ + +stock GameData LoadSourceCoopConfig() +{ + GameData pGameConfig = LoadGameConfigFile(SRCCOOP_CONFIG_GAMEDATA_NAME); + if (pGameConfig == null) + SetFailState("Couldn't load game config: \"%s\"", SRCCOOP_CONFIG_GAMEDATA_NAME); + return pGameConfig; +} + +stock void Msg(int client, const char[] msg, any ...) +{ + int len = strlen(msg) + 255; + char[] formatMsg = new char[len]; + SetGlobalTransTarget(client); + VFormat(formatMsg, len, msg, 3); + ReplaceMsgColors(formatMsg, len); + PrintToChat(client, "%s%s", SRCCOOP_CHAT_TAG, formatMsg); +} + +stock void MsgReply(int client, const char[] msg, any ...) +{ + int len = strlen(msg) + 255; + char[] formatMsg = new char[len]; + SetGlobalTransTarget(client); + VFormat(formatMsg, len, msg, 3); + if (client && GetCmdReplySource() == SM_REPLY_TO_CHAT) + { + ReplaceMsgColors(formatMsg, len); + ReplyToCommand(client, "%s%s", SRCCOOP_CHAT_TAG, formatMsg); + } + else + { + PurgeMsgColors(formatMsg, len); + ReplyToCommand(client, "%s%s", SRCCOOP_CONSOLE_TAG, formatMsg); + } +} + +stock void MsgAll(const char[] msg, any ...) +{ + int len = strlen(msg) + 255; + char[] formatMsg = new char[len]; + SetGlobalTransTarget(LANG_SERVER); + VFormat(formatMsg, len, msg, 2); + PurgeMsgColors(formatMsg, len); + PrintToServer("%s(chat) %s", SRCCOOP_CONSOLE_TAG, formatMsg); + for (int i = 1; i <= MaxClients; i++) + { + if (IsClientInGame(i)) + { + SetGlobalTransTarget(i); + VFormat(formatMsg, len, msg, 2); + ReplaceMsgColors(formatMsg, len); + PrintToChat(i, "%s%s", SRCCOOP_CHAT_TAG, formatMsg); + } + } +} + +stock void MsgAllNoSrv(const char[] msg, any ...) +{ + int len = strlen(msg) + 255; + char[] formatMsg = new char[len]; + for (int i = 1; i <= MaxClients; i++) + { + if (IsClientInGame(i)) + { + SetGlobalTransTarget(i); + VFormat(formatMsg, len, msg, 2); + ReplaceMsgColors(formatMsg, len); + PrintToChat(i, "%s%s", SRCCOOP_CHAT_TAG, formatMsg); + } + } +} + +stock void MsgSrv(const char[] msg, any ...) +{ + int len = strlen(msg) + 255; + char[] formatMsg = new char[len]; + SetGlobalTransTarget(LANG_SERVER); + VFormat(formatMsg, len, msg, 2); + PurgeMsgColors(formatMsg, len); + PrintToServer("%s%s", SRCCOOP_CONSOLE_TAG, formatMsg); +} + +stock void ReplaceMsgColors(char[] msg, int maxLen) +{ + ReplaceString(msg, maxLen, "{pri}", SRCCOOP_CHAT_COLOR_PRI, false); + ReplaceString(msg, maxLen, "{sec}", SRCCOOP_CHAT_COLOR_SEC, false); + ReplaceString(msg, maxLen, "{ter}", SRCCOOP_CHAT_COLOR_TER, false); +} + +stock void PurgeMsgColors(char[] msg, int maxLen) +{ + ReplaceString(msg, maxLen, "{pri}", "", false); + ReplaceString(msg, maxLen, "{sec}", "", false); + ReplaceString(msg, maxLen, "{ter}", "", false); +} diff --git a/scripting/include/srccoop/typedef.inc b/scripting/include/srccoop/typedef.inc index 4a33abea..fda0ba9f 100644 --- a/scripting/include/srccoop/typedef.inc +++ b/scripting/include/srccoop/typedef.inc @@ -1,13 +1,6 @@ -#if defined _srccoop_typedef_included - #endinput -#endif -#define _srccoop_typedef_included - #pragma newdecls required #pragma semicolon 1 -#define ENTITYSTRING_LENGTH 2097152 - #define MAX_FORMAT 256 #define MAX_KEY 32 #define MAX_VALUE 1024 diff --git a/scripting/include/srccoop/utils.inc b/scripting/include/srccoop/utils.inc deleted file mode 100644 index 1a585eb7..00000000 --- a/scripting/include/srccoop/utils.inc +++ /dev/null @@ -1,1113 +0,0 @@ -#if defined _srccoop_utils_included - #endinput -#endif -#define _srccoop_utils_included - -#pragma newdecls required -#pragma semicolon 1 - -#include -#include - -//------------------------------------------------------ -// Gamedata utils -//------------------------------------------------------ - -/* Macros for loading gamedata key values into configuration structs */ - -// Prefix for keys in gamedata. Define before including. -#if !defined CONF_PREFIX - #define CONF_PREFIX "" -#endif - -// Creates a init func for the struct. Pass in a CONF_TYPE macro for each of the struct's variables. -#define CONF_INIT(%1) void Initialize(GameData pGameConfig) {%1} - -#define CONF_STR(%1) GetGamedataString(pGameConfig, CONF_PREFIX...#%1, this.%1, sizeof(this.%1)); -#define CONF_FLT(%1) this.%1 = GetGamedataFloat(pGameConfig, CONF_PREFIX...#%1); -#define CONF_INT(%1) this.%1 = GetGamedataInt(pGameConfig, CONF_PREFIX...#%1); -#define CONF_CLR(%1) GetGamedataColor(pGameConfig, CONF_PREFIX...#%1, this.%1); - -// Obtains the max formatted length (including the negative sign and null terminator) of a 32-bit signed integer at compile time. -// This will accept both positive and negative values. -#define MAX_CHARS_INT(%1) ( \ -view_as(!!((%1) & (1 << 31))) + \ -1 + \ -view_as(!!((%1) / 10)) + \ -view_as(!!((%1) / 10 / 10)) + \ -view_as(!!((%1) / 10 / 10 / 10)) + \ -view_as(!!((%1) / 10 / 10 / 10 / 10)) + \ -view_as(!!((%1) / 10 / 10 / 10 / 10 / 10)) + \ -view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10)) + \ -view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10 / 10)) + \ -view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10)) + \ -view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10)) + \ -view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10)) + \ -view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10)) + \ -1 \ -) - -stock void GetGamedataString(GameData pGameConfig, const char[] szKey, char[] szVal, int len) -{ - if (!pGameConfig.GetKeyValue(szKey, szVal, len)) - SetFailState("Missing gamedata key: \"%s\"", szKey); -} - -stock float GetGamedataFloat(GameData pGameConfig, const char[] szKey) -{ - char szVal[16]; float flVal; - GetGamedataString(pGameConfig, szKey, szVal, sizeof(szVal)); - - if (!StringToFloatEx(szVal, flVal)) - SetFailState("Value for key: \"%s\" should be a float.", szKey); - - return flVal; -} - -stock int GetGamedataInt(GameData pGameConfig, const char[] szKey) -{ - char szVal[16]; int iVal; - GetGamedataString(pGameConfig, szKey, szVal, sizeof(szVal)); - - if (!StringToIntEx(szVal, iVal)) - SetFailState("Value for key: \"%s\" should be an int.", szKey); - - return iVal; -} - -stock void GetGamedataColor(GameData pGameConfig, const char[] szKey, int color[4], const char[] delimiter = " ") -{ - char szVal[16]; char szColor[4][4]; - GetGamedataString(pGameConfig, szKey, szVal, sizeof(szVal)); - - if (3 > ExplodeString(szVal, delimiter, szColor, sizeof(szColor), sizeof(szColor[]))) - SetFailState("Value for key: \"%s\" is not a valid color.", szKey); - - color[0] = StringToInt(szColor[0]); - color[1] = StringToInt(szColor[1]); - color[2] = StringToInt(szColor[2]); - color[3] = StringToInt(szColor[3]); -} - -stock Address GetInterface(GameData pGameConfig, const char[] szLibrary, const char[] szInterface, bool bExtractIfaceVersion = true) -{ - char szBuffer[64]; - FormatEx(szBuffer, sizeof(szBuffer), "CreateInterface:%s", szLibrary); - - StartPrepSDKCall(SDKCall_Static); - if (!PrepSDKCall_SetFromConf(pGameConfig, SDKConf_Signature, szBuffer)) - SetFailState("Could not obtain game signature %s", szBuffer); - - PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer); - PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Pointer, VDECODE_FLAG_ALLOWNULL); - PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain); - Handle pCreateIfaceCall = EndPrepSDKCall(); - if (!pCreateIfaceCall) - SetFailState("Could not prep SDK call %s", szBuffer); - - Address pIfaceAddr; - if (bExtractIfaceVersion) - { - GetGamedataString(pGameConfig, szInterface, szBuffer, sizeof(szBuffer)); - pIfaceAddr = SDKCall(pCreateIfaceCall, szBuffer, 0); - } - else - { - pIfaceAddr = SDKCall(pCreateIfaceCall, szInterface, 0); - } - - pCreateIfaceCall.Close(); - - return pIfaceAddr; -} - -//------------------------------------------------------ -// DHooks utils -//------------------------------------------------------ -#if defined _dhooks_included -stock void LoadDHookDetour(GameData pGameConfig, DynamicDetour& pHandle, const char[] szFuncName, DHookCallback pCallbackPre = null, DHookCallback pCallbackPost = null) -{ - pHandle = DynamicDetour.FromConf(pGameConfig, szFuncName); - if (!pHandle) - SetFailState("Couldn't create hook %s", szFuncName); - if (pCallbackPre && !pHandle.Enable(Hook_Pre, pCallbackPre)) - SetFailState("Couldn't enable pre detour hook %s", szFuncName); - if (pCallbackPost && !pHandle.Enable(Hook_Post, pCallbackPost)) - SetFailState("Couldn't enable post detour hook %s", szFuncName); -} - -stock void LoadDHookVirtual(GameData pGameConfig, DynamicHook& pHandle, const char[] szFuncName) -{ - pHandle = DynamicHook.FromConf(pGameConfig, szFuncName); - if (pHandle == null) - SetFailState("Couldn't create hook %s", szFuncName); -} -#endif - -//------------------------------------------------------ -// Memory utils -//------------------------------------------------------ -#if defined __sourcescramble_ext_included -stock MemoryPatch LoadMemPatch(GameData pGameConfig, const char[] szName, bool bEnable = true, bool bRequired = true) -{ - MemoryPatch patch = MemoryPatch.CreateFromConf(pGameConfig, szName); - if (!patch.Validate()) - { - if (bRequired) - SetFailState("Failed to verify mempatch \"%s\"", szName); - LogError("Failed to verify mempatch \"%s\"", szName); - } - else if (bEnable) - { - patch.Enable(); - } - return patch; -} -#endif - -stock any Deref(any addr, NumberType type = NumberType_Int32) -{ - return LoadFromAddress(view_as
(addr), type); -} - -// Address arithmetics operators (why is this not included)! - -stock Address operator+(Address oper1, int oper2) -{ - return oper1 + view_as
(oper2); -} - -stock Address operator+(int oper1, Address oper2) -{ - return view_as
(oper1) + oper2; -} - -stock Address operator-(Address oper1, int oper2) -{ - return oper1 - view_as
(oper2); -} - -stock Address operator-(int oper1, Address oper2) -{ - return view_as
(oper1) - oper2; -} - -// The following are attributed to github.com/nosoop/stocksoup - -/** - * Loads a null-terminated string from the given address. - * - * The function will return an empty string if the address corresponds to a nullptr. This - * functionality is present as a workaround for when an SDKCall that expects a char pointer - * receives a nullptr and attempts to dereference it (see alliedmodders/sourcemod/issues/874). - * - * If it is necessary to differentiate between an empty string and a null pointer, check if addr - * is null before calling the function, or pass a reference to bIsNullPointer. - * - * @return Number of bytes written. 0 is returned on an empty string or a null pointer. - */ -stock int LoadStringFromAddress(Address addr, char[] buffer, int maxlen, bool &bIsNullPointer = false) -{ - if (!addr) - { - bIsNullPointer = true; - return 0; - } - - int c; - char ch; - do - { - ch = view_as(Deref(addr + c, NumberType_Int8)); - buffer[c] = ch; - } while (ch && ++c < maxlen - 1); - return c; -} - -/** - * Returns an entity index from its address by attempting to read the - * CBaseEntity::m_RefEHandle member. This assumes the address of a CBaseEntity is - * passed in. - * - * @param pEntity Address of an entity. - * @return Entity index, or -1 if not valid. - */ -stock int GetEntityFromAddress(Address pEntity) -{ - if (!pEntity) - return -1; - - static int offs_RefEHandle; - if (offs_RefEHandle) - return LoadEntityFromHandleAddress(pEntity + offs_RefEHandle); - - // if we don't have it already, attempt to lookup offset based on SDK information - // CWorld is derived from CBaseEntity so it should have both offsets - int offs_angRotation = FindDataMapInfo(0, "m_angRotation"), - offs_vecViewOffset = FindDataMapInfo(0, "m_vecViewOffset"); - - if (offs_angRotation == -1) - { - ThrowError("Could not find offset for ((CBaseEntity) CWorld)::m_angRotation"); - } - else if (offs_vecViewOffset == -1) - { - ThrowError("Could not find offset for ((CBaseEntity) CWorld)::m_vecViewOffset"); - } - else if ((offs_angRotation + 0x0C) != (offs_vecViewOffset - 0x04)) - { - char game[32]; - GetGameFolderName(game, sizeof(game)); - ThrowError("Could not confirm offset of CBaseEntity::m_RefEHandle " - ... "(incorrect assumption for game '%s'?)", game); - } - - // offset seems right, cache it for the next call - offs_RefEHandle = offs_angRotation + 0x0C; - return GetEntityFromAddress(pEntity); -} - -//------------------------------------------------------ -// Text utils -//------------------------------------------------------ -stock void Msg(int client, const char[] msg, any ...) -{ - int len = strlen(msg) + 255; - char[] formatMsg = new char[len]; - SetGlobalTransTarget(client); - VFormat(formatMsg, len, msg, 3); - ReplaceMsgColors(formatMsg, len); - PrintToChat(client, "%s%s", SRCCOOP_CHAT_TAG, formatMsg); -} - -stock void MsgReply(int client, const char[] msg, any ...) -{ - int len = strlen(msg) + 255; - char[] formatMsg = new char[len]; - SetGlobalTransTarget(client); - VFormat(formatMsg, len, msg, 3); - if (client && GetCmdReplySource() == SM_REPLY_TO_CHAT) - { - ReplaceMsgColors(formatMsg, len); - ReplyToCommand(client, "%s%s", SRCCOOP_CHAT_TAG, formatMsg); - } - else - { - PurgeMsgColors(formatMsg, len); - ReplyToCommand(client, "%s%s", SRCCOOP_CONSOLE_TAG, formatMsg); - } -} - -stock void MsgAll(const char[] msg, any ...) -{ - int len = strlen(msg) + 255; - char[] formatMsg = new char[len]; - SetGlobalTransTarget(LANG_SERVER); - VFormat(formatMsg, len, msg, 2); - PurgeMsgColors(formatMsg, len); - PrintToServer("%s(chat) %s", SRCCOOP_CONSOLE_TAG, formatMsg); - for (int i = 1; i <= MaxClients; i++) - { - if (IsClientInGame(i)) - { - SetGlobalTransTarget(i); - VFormat(formatMsg, len, msg, 2); - ReplaceMsgColors(formatMsg, len); - PrintToChat(i, "%s%s", SRCCOOP_CHAT_TAG, formatMsg); - } - } -} - -stock void MsgAllNoSrv(const char[] msg, any ...) -{ - int len = strlen(msg) + 255; - char[] formatMsg = new char[len]; - for (int i = 1; i <= MaxClients; i++) - { - if (IsClientInGame(i)) - { - SetGlobalTransTarget(i); - VFormat(formatMsg, len, msg, 2); - ReplaceMsgColors(formatMsg, len); - PrintToChat(i, "%s%s", SRCCOOP_CHAT_TAG, formatMsg); - } - } -} - -stock void MsgSrv(const char[] msg, any ...) -{ - int len = strlen(msg) + 255; - char[] formatMsg = new char[len]; - SetGlobalTransTarget(LANG_SERVER); - VFormat(formatMsg, len, msg, 2); - PurgeMsgColors(formatMsg, len); - PrintToServer("%s%s", SRCCOOP_CONSOLE_TAG, formatMsg); -} - -stock void ReplaceMsgColors(char[] msg, int maxLen) -{ - ReplaceString(msg, maxLen, "{pri}", SRCCOOP_CHAT_COLOR_PRI, false); - ReplaceString(msg, maxLen, "{sec}", SRCCOOP_CHAT_COLOR_SEC, false); - ReplaceString(msg, maxLen, "{ter}", SRCCOOP_CHAT_COLOR_TER, false); -} - -stock void PurgeMsgColors(char[] msg, int maxLen) -{ - ReplaceString(msg, maxLen, "{pri}", "", false); - ReplaceString(msg, maxLen, "{sec}", "", false); - ReplaceString(msg, maxLen, "{ter}", "", false); -} - -#if defined _regex_included - -/** - * Matches a regex pattern against a string if pattern is enclosed by forward slashes "/". - * Otherwise acts as a regular equals check. - */ -stock bool StrEqualsRegex(const char[] pattern, const char[] str, bool caseSensitive = false) -{ - int patternLength = strlen(pattern); - if (patternLength > 1 && pattern[0] == '/' && pattern[patternLength - 1] == '/') - { - if (str[0] == '\0') - { - // regexing empty string errors out.. - return false; - } - char[] patternStripped = new char[--patternLength]; - strcopy(patternStripped, patternLength, pattern[1]); - int substrings = SimpleRegexMatch(str, patternStripped, caseSensitive? 0 : PCRE_CASELESS); - return (substrings > 0); - } - return strcmp(pattern, str, caseSensitive) == 0; -} - -/** - * Simple * wildcard pattern matching. Best for comparing map names (think maps command), file paths (think gitignore), etc. - * - * Example pattern: *pine* - * Matched strings: pine, pineapple, spines ... - * - */ -stock bool StrEqualsWildcard(const char[] pattern, const char[] str, bool caseSensitive = false) -{ - int regexLen = strlen(pattern) * 2 + 3; - char[] regex = new char[regexLen]; - - EscapeRegex(pattern, regex, regexLen, "*"); - ReplaceString(regex, regexLen, "*", ".*"); - Format(regex, regexLen, "^%s$", regex); - - int substrings = SimpleRegexMatch(str, regex, caseSensitive? 0 : PCRE_CASELESS); - return (substrings > 0); -} - -/** - * Quotes / escapes all special regex characters in a string. - * @param allowedChars Characters that should not be escaped. - * @return Characters written - */ -stock int EscapeRegex(const char[] str, char[] dest, int destLen, const char[] allowedChars = "") -{ - static const char specialChars[] = ".\\+*?[^]$(){}=!<>|:-#"; - int i, j; - while (str[i] != EOS && (j + 1) < destLen) - { - if (FindCharInString(specialChars, str[i]) != -1 && FindCharInString(allowedChars, str[i]) == -1) - { - if (j + 2 >= destLen) - break; - dest[j++] = '\\'; - } - dest[j++] = str[i++]; - } - dest[j] = EOS; - return j; -} - -#endif // defined _regex_included - -stock void FormatTimeLength(int seconds, char[] out, int size) -{ - int hours = seconds / 3600; - int mins = (seconds % 3600) / 60; - int secs = seconds % 60; - if (hours != 0) - { - Format(out, size, "%dh ", hours); - } - if (mins != 0) - { - Format(out, size, "%s%dm ", out, mins); - } - if (secs != 0) - { - Format(out, size, "%s%ds", out, secs); - } -} - -stock void FormatTimeLengthLong(int seconds, char[] out, int size) -{ - int hours = seconds / 3600; - int mins = (seconds % 3600) / 60; - int secs = seconds % 60; - char separator[10]; - if (hours != 0) - { - Format(out, size, "%d hour%s", hours, hours == 1? "" : "s"); - separator = " "; - } - if (mins != 0) - { - Format(out, size, "%s%s%d minute%s", out, separator, mins, mins == 1? "" : "s"); - separator = " "; - } - if (secs != 0) - { - Format(out, size, "%s%s%d second%s", out, mins == 0? separator : " and ", secs, secs == 1? "" : "s"); - } -} - -// Like SplitString but more efficient -stock int SplitByChar(const char[] szSource, char c, char[] szBuffer, int nSize) -{ - int i = 0; - while (szSource[i] != c) - { - if (szSource[i] == '\0') - { - return -1; - } - i++; - } - i++; - strcopy(szBuffer, i < nSize ? i : nSize, szSource); - return i; -} - -stock void LowerCaseString(const char[] szInput, char[] szOutput, int iSize) -{ - iSize--; - int x = 0; - while (szInput[x] != '\0' && x < iSize) - { - szOutput[x] = CharToLower(szInput[x]); - x++; - } - szOutput[x] = '\0'; -} - -stock void UpperCaseString(const char[] szInput, char[] szOutput, int iSize) -{ - iSize--; - int x = 0; - while (szInput[x] != '\0' && x < iSize) - { - szOutput[x] = CharToUpper(szInput[x]); - x++; - } - szOutput[x] = '\0'; -} - -stock bool StrEndsWith(const char[] str, const char[] suffix, bool caseSensitive = true) -{ - return StrEndsWithEx(str, strlen(str), suffix, caseSensitive); -} - -stock bool StrEndsWithEx(const char[] str, int realLen, const char[] suffix, bool caseSensitive = true) -{ - int suffixLen = strlen(suffix); - return (realLen >= suffixLen && StrEqual(str[realLen - suffixLen], suffix, caseSensitive)); -} - -stock bool IsAddSynonym(const char[] str) -{ - return (strcmp(str, "add", false) == 0 || strcmp(str, "create", false) == 0); -} - -stock bool IsRemoveSynonym(const char[] str) -{ - return (strcmp(str, "remove", false) == 0 || strcmp(str, "delete", false) == 0); -} - -stock bool IsModifySynonym(const char[] str) -{ - return (strcmp(str, "modify", false) == 0 || strcmp(str, "edit", false) == 0); -} - -stock bool IsEnableSynonym(const char[] str) -{ - return (strcmp(str, "enable", false) == 0 || strcmp(str, "turnon", false) == 0 || strcmp(str, "on", false) == 0); -} - -stock bool IsDisableSynonym(const char[] str) -{ - return (strcmp(str, "disable", false) == 0 || strcmp(str, "turnoff", false) == 0 || strcmp(str, "off", false) == 0); -} - -//------------------------------------------------------ -// Array utils -//------------------------------------------------------ -stock int FindStringInArrayEx(const char[][] array, int len, const char[] str, bool caseSensitive = true) -{ - for (int i = 0; i < len; i++) - { - if (StrEqual(str, array[i], caseSensitive)) - { - return i; - } - } - return -1; -} - -stock int FindValueInArrayEx(const any[] array, int len, const any val) -{ - for (int i = 0; i < len; i++) - { - if (array[i] == val) - { - return i; - } - } - return -1; -} - -stock int FindCharInArray(const any[] array, int len, const int val, bool caseSensitive = true) -{ - int i = FindValueInArrayEx(array, len, val); - if (!caseSensitive && i == -1) - { - int val2 = IsCharLower(val) ? CharToUpper(val) : CharToLower(val); - if (val2 != val) - { - i = FindValueInArrayEx(array, len, val2); - } - } - return i; -} - -//------------------------------------------------------ -// Entity utils -//------------------------------------------------------ -stock int FindEntityByHammerID(int iHammerID, const char[] szClassname = "*") -{ - int startEnt = -1; - while ((startEnt = FindEntityByClassname(startEnt, szClassname)) != -1) - { - CBaseEntity pEntity = CBaseEntity(startEnt); - if (pEntity.GetHammerID() == iHammerID) - { - return startEnt; - } - } - return -1; -} - -stock int FindEntityByTargetname(int startEnt, const char[] targetname, const char[] szClassname = "*") -{ - while ((startEnt = FindEntityByClassname(startEnt, szClassname)) != -1) - { - CBaseEntity pEntity = CBaseEntity(startEnt); - char szTargetname[MAX_CLASSNAME]; - if (pEntity.GetTargetname(szTargetname, sizeof(szTargetname)) && strcmp(szTargetname, targetname, false) == 0) - { - return startEnt; - } - } - return -1; -} - -stock int FindEntityByOwner(int startEnt, CBaseEntity pOwnerEntity, const char[] szClassname = "*") -{ - while ((startEnt = FindEntityByClassname(startEnt, szClassname)) != -1) - { - CBaseEntity pEntity = CBaseEntity(startEnt); - if (pEntity.GetOwner() == pOwnerEntity) - { - return startEnt; - } - } - return -1; -} - -//------------------------------------------------------ -// Player utils -//------------------------------------------------------ - -/** - * Return nearest alive player if exists, otherwise return nearest player that passes requirements. - */ -stock CBasePlayer GetNearestPlayerPreferAlive(CBaseEntity pOriginEntity, bool bNoSpectators = false) -{ - return GetNearestPlayer(pOriginEntity, false, bNoSpectators, true); -} - -stock CBasePlayer GetNearestPlayerPreferAliveEx(float vecPos[3], bool bNoSpectators = false) -{ - return GetNearestPlayerEx(vecPos, false, bNoSpectators, true); -} - -/** - * Return nearest alive player. - */ -stock CBasePlayer GetNearestPlayerAlive(CBaseEntity pOriginEntity) -{ - return GetNearestPlayer(pOriginEntity, true, true, false); -} - -stock CBasePlayer GetNearestPlayerAliveEx(float vecPos[3]) -{ - return GetNearestPlayerEx(vecPos, true, true, false); -} - -/** - * Return nearest player that passes requirements. - */ -stock CBasePlayer GetNearestPlayer(CBaseEntity pOriginEntity, bool bAliveOnly = true, bool bNoSpectators = true, bool bPreferAlive = false) -{ - float vecEntityPosition[3]; - pOriginEntity.GetAbsOrigin(vecEntityPosition); - return GetNearestPlayerEx(vecEntityPosition, bAliveOnly, bNoSpectators, bPreferAlive); -} - -stock CBasePlayer GetNearestPlayerEx(float vecPos[3], bool bAliveOnly = true, bool bNoSpectators = true, bool bPreferAlive = false) -{ - CBasePlayer pBestPlayer = NULL_CBASEENTITY; - float flBestDistance = FLT_MAX; - bool bFoundAlive; - - for (int i = 1; i <= MaxClients; i++) - { - if (!IsClientInGame(i) || IsFakeClient(i)) - continue; - - bool bAlive = IsPlayerAlive(i); - if (bAliveOnly) - { - if (!bAlive) - continue; - } - else if (bNoSpectators && GetClientTeam(i) == TEAM_SPECTATOR) - { - continue; - } - - if (bPreferAlive) - { - if (bFoundAlive) - { - if (!bAlive) - continue; - } - else if (bAlive) - { - bFoundAlive = true; - flBestDistance = FLT_MAX; - } - } - - CBasePlayer pPlayer = CBasePlayer(i); - float vecPlayerPosition[3]; - pPlayer.GetAbsOrigin(vecPlayerPosition); - - float flDistance = GetVectorDistance(vecPos, vecPlayerPosition, true); - if (flDistance < flBestDistance) - { - pBestPlayer = pPlayer; - flBestDistance = flDistance; - } - } - return pBestPlayer; -} - -stock int GetRealClientCount(bool bInGameOnly, bool bAliveOnly = false, bool bNoSpectators = false) -{ - int clients; - for (int i = 1; i <= MaxClients; i++) - { - if ((bInGameOnly? IsClientInGame(i) : IsClientConnected(i)) - && !IsFakeClient(i) - && (!bAliveOnly || IsPlayerAlive(i)) - && (!bNoSpectators || GetClientTeam(i) != TEAM_SPECTATOR)) - { - clients++; - } - } - return clients; -} - -enum CanTeleportResult -{ - CAN_TP_NO, - CAN_TP_YES, - CAN_TP_MUSTDUCK //🦆// -} - -stock CanTeleportResult CanTeleportPlayer(CBasePlayer pPlayer, float vecOrigin[3], bool bExact = false, bool bDuckCheck = true, bool bOnlyVaried = false) -{ - if (!bOnlyVaried) - { - bool bDidHit; - - TR_TraceHullFilter(vecOrigin, vecOrigin, view_as(VEC_HULL_MIN), view_as(VEC_HULL_MAX), MASK_PLAYERSOLID|CONTENTS_HITBOX, CanTeleportPlayer_TraceFilter); - bDidHit = TR_DidHit(); - if (!bDidHit) return CAN_TP_YES; - - if (bDuckCheck) - { - TR_TraceHullFilter(vecOrigin, vecOrigin, view_as(VEC_DUCK_HULL_MIN), view_as(VEC_DUCK_HULL_MAX), MASK_PLAYERSOLID|CONTENTS_HITBOX, CanTeleportPlayer_TraceFilter); - bDidHit = TR_DidHit(); - if (!bDidHit) return CAN_TP_MUSTDUCK; - } - } - - if (!bExact) - { - // try varying the positions in a radius - static const float yaw[] = {0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0}; - static const float distance[] = {25.0, 50.0}; - static const float zDistance[] = {0.0, 25.0, 50.0}; - - for (int z = 0; z < sizeof(zDistance); z++) - { - for (int d = 0; d < sizeof(distance); d++) - { - for (int y = 0; y < sizeof(yaw); y++) - { - if (CanTeleportPlayer_Offset(vecOrigin, yaw[y], distance[d], zDistance[z])) - { - return CAN_TP_YES; - } - } - } - } - } - - return CAN_TP_NO; -} - -stock bool CanTeleportPlayer_Offset(float vecOrigin[3], float yaw, float distance, float z) -{ - float newPos[3], angles[3]; - newPos = vecOrigin; angles[1] = yaw; - - GetAngleVectors(angles, angles, NULL_VECTOR, NULL_VECTOR); - newPos[0] += angles[0] * distance; - newPos[1] += angles[1] * distance; - newPos[2] += z; - - //TE_SetupGlowSprite(newPos, PrecacheModel("sprites/orangeglow1.vmt"), 60.0, 0.1, 255); TE_SendToAll(); - - TR_TraceHullFilter(newPos, newPos, view_as(VEC_HULL_MIN), view_as(VEC_HULL_MAX), MASK_PLAYERSOLID|CONTENTS_HITBOX, CanTeleportPlayer_TraceFilter); - if (!TR_DidHit()) - { - vecOrigin = newPos; - return true; - } - - return false; -} - -public bool CanTeleportPlayer_TraceFilter(int entity, int mask, any data) -{ - CBaseEntity pEntity = CBaseEntity(entity); - if (pEntity.IsPlayer() || pEntity.IsPickupItem()) - { - return false; - } - return true; -} - -stock float PlayerDotProductToEntity(CBasePlayer pPlayer, CBaseEntity pEnt) -{ - float entOrigin[3]; - pEnt.GetAbsOrigin(entOrigin); - return PlayerDotProductToPoint(pPlayer, entOrigin); -} - -stock float PlayerDotProductToEntityCenter(CBasePlayer pPlayer, CBaseEntity pEnt) -{ - float vecCenter[3]; - pEnt.WorldSpaceCenter(vecCenter); - return PlayerDotProductToPoint(pPlayer, vecCenter); -} - -stock float PlayerDotProductToPoint(CBasePlayer pPlayer, const float vecPoint[3]) -{ - float angles[3], origin[3], fwd[3], targetDir[3]; - pPlayer.GetEyeAngles(angles); - GetAngleVectors(angles, fwd, NULL_VECTOR, NULL_VECTOR); - - pPlayer.GetEyePosition(origin); - MakeVectorFromPoints(origin, vecPoint, targetDir); - NormalizeVector(targetDir, targetDir); - - return GetVectorDotProduct(fwd, targetDir); -} - -/** - * Fades a client's screen to a specified color - * Your adviced to read the FFADE_ Comments - * - * @param client Player for which to fade the screen - * @param duration duration in milliseconds the effect stays - * @param mode fade mode, see FFADE_ defines - * @param holdtime holdtime in milliseconds - * @param r red amount - * @param g green amount - * @param b blue amount - * @param a transparency - * @return True on success, false otherwise - */ -stock bool Client_ScreenFade(int client, int duration, int mode, int holdtime=-1, int r=0, int g=0, int b=0, int a=255, bool reliable=true) -{ - Handle userMessage = StartMessageOne("Fade", client, (reliable?USERMSG_RELIABLE:0)); - - if (userMessage == INVALID_HANDLE) - { - return false; - } - - if (GetFeatureStatus(FeatureType_Native, "GetUserMessageType") == FeatureStatus_Available && - GetUserMessageType() == UM_Protobuf) - { - - int color[4]; - color[0] = r; - color[1] = g; - color[2] = b; - color[3] = a; - - PbSetInt(userMessage, "duration", duration); - PbSetInt(userMessage, "hold_time", holdtime); - PbSetInt(userMessage, "flags", mode); - PbSetColor(userMessage, "clr", color); - } - else - { - BfWriteShort(userMessage, duration); // Fade duration - BfWriteShort(userMessage, holdtime); // Fade hold time - BfWriteShort(userMessage, mode); // What to do - BfWriteByte(userMessage, r); // Color R - BfWriteByte(userMessage, g); // Color G - BfWriteByte(userMessage, b); // Color B - BfWriteByte(userMessage, a); // Color Alpha - } - EndMessage(); - - return true; -} - -//------------------------------------------------------ -// Weapon utils -//------------------------------------------------------ -stock void PreventWeaponFiring(CBaseCombatWeapon pWeapon, float flDelayTime) -{ - pWeapon.SetNextPrimaryAttack(GetGameTime() + flDelayTime); - pWeapon.SetNextSecondaryAttack(GetGameTime() + flDelayTime); -} - -//------------------------------------------------------ -// Math utils -//------------------------------------------------------ -stock void ScaleVectors(const float vecA[3], const float vecB[3], float vecResult[3]) -{ - vecResult[0] = vecA[0] * vecB[0]; - vecResult[1] = vecA[1] * vecB[1]; - vecResult[2] = vecA[2] * vecB[2]; -} - -stock void MoveVector(const float vecStart[3], const float vecEnd[3], float scale, float vecResult[3]) -{ - SubtractVectors(vecEnd, vecStart, vecResult); - ScaleVector(vecResult, scale); - AddVectors(vecStart, vecResult, vecResult); -} - -stock void GetVectorDistanceVector(const float vecA[3], const float vecB[3], float vecResult[3]) -{ - SubtractVectors(vecA, vecB, vecResult); - vecResult[0] = FloatAbs(vecResult[0]); - vecResult[1] = FloatAbs(vecResult[1]); - vecResult[2] = FloatAbs(vecResult[2]); -} - -stock bool VecEqual(const float vecA[3], const float vecB[3]) -{ - return (vecA[0] == vecB[0] && vecA[1] == vecB[1] && vecA[2] == vecB[2]); -} - -// returns true if there's an intersection between two boxes -// borrowed from public/collisionutils.cpp -stock bool IsBoxIntersectingBox(const float boxMin1[3], const float boxMax1[3], const float boxMin2[3], const float boxMax2[3]) -{ - if ((boxMin1[0] > boxMax2[0]) || (boxMax1[0] < boxMin2[0])) - return false; - if ((boxMin1[1] > boxMax2[1]) || (boxMax1[1] < boxMin2[1])) - return false; - if ((boxMin1[2] > boxMax2[2]) || (boxMax1[2] < boxMin2[2])) - return false; - return true; -} - -stock any Min(any val1, any val2) -{ - return val1 < val2 ? val1 : val2; -} - -stock any Max(any val1, any val2) -{ - return val1 > val2 ? val1 : val2; -} - -stock any Clamp(any val, any min, any max) -{ - if (val < min) - val = min; - else if (val > max) - val = max; - return val; -} - -stock bool IsInBounds(any value, any min, any max) -{ - if (value < min || value > max) - return false; - - return true; -} - -//------------------------------------------------------ -// File utils -//------------------------------------------------------ - -/* File copy from SMLIB - * @param source Input file - * @param destination Output file - * @return True on success, false otherwise - */ -stock bool FileCopy(const char[] source, const char[] destination, bool use_valve_fs=false, const char[] valve_path_id="GAME") -{ - File file_source = OpenFile(source, "rb", use_valve_fs, valve_path_id); - - if (file_source == null) - { - return false; - } - - File file_destination = OpenFile(destination, "wb", use_valve_fs, valve_path_id); - - if (file_destination == null) - { - file_source.Close(); - return false; - } - - int buffer[32]; - int cache; - - while (!file_source.EndOfFile()) - { - cache = file_source.Read(buffer, sizeof(buffer), 1); - file_destination.Write(buffer, cache, 1); - } - - delete file_source; - delete file_destination; - - return true; -} - -/** - * This is a workaround for opening existing files, potentially located in the custom folder, with the Valve filesystem, for both reading and writing. - * Normally, opening an existing file with Valve FS using any writable modes ("r+", "a", ..) will only look for files in root game folder. - * This function currently accounts for the custom folder only, other additional Valve search paths are ignored. - * - * https://github.com/alliedmodders/sourcemod/issues/2175 - */ -stock File OpenFileEx(const char[] file, const char[] mode, bool use_valve_fs=false, const char[] valve_path_id="GAME") -{ - if (use_valve_fs && !StrEqual(mode, "r", false) && !StrEqual(mode, "rb", false) && !StrEqual(mode, "rt", false)) - { - char szFullPath[PLATFORM_MAX_PATH]; - if (ResolveValveFile(file, szFullPath, sizeof(szFullPath))) - { - return OpenFile(szFullPath, mode); - } - } - return OpenFile(file, mode, use_valve_fs, valve_path_id); -} - -/** - * Should only be used as last resort. - * See OpenFileEx - */ -stock bool ResolveValveFile(const char[] szFile, char[] szFullPath, int maxLen) -{ - DirectoryListing dir = OpenDirectory("custom"); - if (dir) - { - char buffer[PLATFORM_MAX_PATH]; - FileType ft; - - while (dir.GetNext(buffer, sizeof(buffer), ft)) - { - if (ft == FileType_Directory && !StrEqual(buffer, ".") && !StrEqual(buffer, "..")) - { - Format(buffer, sizeof(buffer), "custom/%s/%s", buffer, szFile); - if (FileExists(buffer)) - { - dir.Close(); - Format(szFullPath, maxLen, buffer); - return true; - } - } - } - - dir.Close(); - } - return false; -} - -stock bool GetBitFromInt(const int i, const int iBitIndex) -{ - if (iBitIndex < 0 || iBitIndex > 31) - ThrowError("Received out of bounds index %d; range is `0..32`", iBitIndex); - - return (i & (1 << iBitIndex)) != 0; -} - -stock void SetBitOnInt(int& i, const int iBitIndex, const bool bSetBit) -{ - if (iBitIndex < 0 || iBitIndex > 31) - ThrowError("Received out of bounds index %d; range is `0..32`", iBitIndex); - - if (bSetBit) - { - i |= (1 << iBitIndex); - } - else - { - i &= ~(1 << iBitIndex); - } -} - -stock void SetClientGamerules(const char[] szGamerulesClass) -{ - int iTable = FindStringTable("GameRulesCreation"); - if (iTable == INVALID_STRING_TABLE) - { - ThrowError("Could not find string table GameRulesCreation !"); - } - SetStringTableData(iTable, 0, szGamerulesClass, strlen(szGamerulesClass) + 1); -} - -stock int GetClientGamerules(char[] szGamerulesClass, int iMaxLength) -{ - int iTable = FindStringTable("GameRulesCreation"); - if (iTable == INVALID_STRING_TABLE) - { - ThrowError("Could not find string table GameRulesCreation !"); - } - return GetStringTableData(iTable, 0, szGamerulesClass, iMaxLength); -} \ No newline at end of file diff --git a/scripting/include/srccoop_addon.inc b/scripting/include/srccoop_addon.inc new file mode 100644 index 00000000..8cfa0017 --- /dev/null +++ b/scripting/include/srccoop_addon.inc @@ -0,0 +1,130 @@ +#pragma newdecls required +#pragma semicolon 1 + +#include + +#include +#include +#include + +public SharedPlugin __pl_srccoop_addon = +{ + name = SRCCOOP_LIBRARY, + file = "srccoop.smx", +#if defined REQUIRE_PLUGIN + required = 1, +#else + required = 0, +#endif +}; + +#if !defined REQUIRE_PLUGIN +public void __pl_srccoop_addon_SetNTVOptional() +{ + MarkNativeAsOptional("SC_GetCoopTopMenu"); + MarkNativeAsOptional("SC_IsCurrentMapCoop"); + MarkNativeAsOptional("SC_Respawn"); + MarkNativeAsOptional("SC_GetSurvivalMode"); + MarkNativeAsOptional("SC_TeleportToCurrentCheckpoint"); + MarkNativeAsOptional("SC_IsCoopFeatureEnabled"); + MarkNativeAsOptional("SC_FixWeaponPrediction"); +} +#endif + +stock GameData InitSourceCoopAddon(bool bCloseGameData = true) +{ + GameData pGameConfig = LoadGameConfigFile(SRCCOOP_GAMEDATA_NAME); + if (pGameConfig == null) + SetFailState("Couldn't load game config: \"%s\"", SRCCOOP_GAMEDATA_NAME); + + InitClassdef(pGameConfig); + if (bCloseGameData) + { + CloseHandle(pGameConfig); + return null; + } + return pGameConfig; +} + +/** + * Global callback after map config is loaded in OnMapStart. + * + * @param kv The configuration file imported into keyvalues. You must call kv.Rewind() first to ensure consistency. + * @param location From where the config was loaded. + */ +forward void SC_OnCoopMapConfigLoaded(KeyValues kv, CoopConfigLocation location); + +/** + * Global callback for when a coop map actually starts, + * that is potentially after the player wait timer completes. + */ +forward void SC_OnCoopMapStart(); + +/** + * Provides an opportunity for intercepting map changes that are handled by the plugin. + * Possible sources of origin that are hooked by the plugin: + * game_end, trigger_changelevel, point_servercommand, point_clientcommand in SP conversions. + * + * @param szNextMap The map that would be changed to if not intercepted. + * @param szReason The reason that would be passed to ForceChangeLevel if not intercepted. Defined in public.inc + * Should be preserved, unless there is a specific reason not to. + * @param isFinal True if a final map of a series just completed. False for all other reasons. + * @return Plugin_Continue to proceed with the mapchange, other values to block it. + */ +forward Action SC_OnCoopMapEnd(const char[] szNextMap, const char[] szReason, bool isFinal); + +/** + * Called when the core plugin creates server-side player ragoll on death. + * The timing of which can vary by game. + */ +forward void SC_OnPlayerRagdollCreated(CBasePlayer pPlayer, CBaseAnimating pRagdoll); + +/** + * Retrieves the handle to the coop TopMenu. + * + * @return Handle to the TopMenu + */ +native TopMenu SC_GetCoopTopMenu(); + +/** + * Returns whether current map is a coop map. + * + */ +native bool SC_IsCurrentMapCoop(); + +/** + * Respawns a dead player. Clears death state in survival. + * + * @param options The spawn options enum struct from public.inc + * @return true if player was dead and respawned + * @error Invalid CBasePlayer + */ +native bool SC_Respawn(CBasePlayer pPlayer, any options[sizeof(SpawnOptions)]); + +/** + * Gets the survival mode. + * + * @return Current survival mode (enum) + */ +native SurvivalMode SC_GetSurvivalMode(); + +/** + * Teleports a player to active checkpoint. + * + * @error Invalid CBasePlayer + * @return true for success, false if there is no checkpoint + */ +native bool SC_TeleportToCurrentCheckpoint(CBasePlayer pPlayer); + +/** + * Checks if a SourceCoop feature is enabled. + */ +native bool SC_IsCoopFeatureEnabled(SourceCoopFeature iFeatureBits); + +/** + * Workaround for weapon prediction errors after the player has returned from third-person. + * Uses equipment pack & restore mechanism. + * @error Invalid or dead CBasePlayer + * @return false if player's equipment has already been stored and is waiting for restore + */ +native bool SC_FixWeaponPrediction(CBasePlayer pPlayer); \ No newline at end of file diff --git a/scripting/include/srccoop_api.inc b/scripting/include/srccoop_api.inc index 1f8702e3..3090d834 100644 --- a/scripting/include/srccoop_api.inc +++ b/scripting/include/srccoop_api.inc @@ -21,116 +21,10 @@ #endif +#include +#include +#include -#include - -#include -#include -#include -#include -#include - -stock GameData InitSourceCoopAddon(bool bCloseGameData = true) -{ - GameData pGameConfig = LoadGameConfigFile(SRCCOOP_GAMEDATA_NAME); - if (pGameConfig == null) - SetFailState("Couldn't load game config: \"%s\"", SRCCOOP_GAMEDATA_NAME); - - InitClassdef(pGameConfig); - if (bCloseGameData) - { - CloseHandle(pGameConfig); - } - return pGameConfig; -} - -stock GameData LoadSourceCoopConfig() -{ - GameData pGameConfig = LoadGameConfigFile(SRCCOOP_CONFIG_GAMEDATA_NAME); - if (pGameConfig == null) - SetFailState("Couldn't load game config: \"%s\"", SRCCOOP_CONFIG_GAMEDATA_NAME); - return pGameConfig; -} - -/** - * Global callback after map config is loaded in OnMapStart. - * - * @param kv The configuration file imported into keyvalues. You must call kv.Rewind() first to ensure consistency. - * @param location From where the config was loaded. - */ -forward void SC_OnCoopMapConfigLoaded(KeyValues kv, CoopConfigLocation location); - -/** - * Global callback for when a coop map actually starts, - * that is potentially after the player wait timer completes. - */ -forward void SC_OnCoopMapStart(); - -/** - * Provides an opportunity for intercepting map changes that are handled by the plugin. - * Possible sources of origin that are hooked by the plugin: - * game_end, trigger_changelevel, point_servercommand, point_clientcommand in SP conversions. - * - * @param szNextMap The map that would be changed to if not intercepted. - * @param szReason The reason that would be passed to ForceChangeLevel if not intercepted. Defined in public.inc - * Should be preserved, unless there is a specific reason not to. - * @param isFinal True if a final map of a series just completed. False for all other reasons. - * @return Plugin_Continue to proceed with the mapchange, other values to block it. - */ -forward Action SC_OnCoopMapEnd(const char[] szNextMap, const char[] szReason, bool isFinal); - -/** - * Called when the core plugin creates server-side player ragoll on death. - * The timing of which can vary by game. - */ -forward void SC_OnPlayerRagdollCreated(CBasePlayer pPlayer, CBaseAnimating pRagdoll); - -/** - * Retrieves the handle to the coop TopMenu. - * - * @return Handle to the TopMenu - */ -native TopMenu SC_GetCoopTopMenu(); - -/** - * Returns whether current map is a coop map. - * - */ -native bool SC_IsCurrentMapCoop(); - -/** - * Respawns a dead player. Clears death state in survival. - * - * @param options The spawn options enum struct from public.inc - * @return true if player was dead and respawned - * @error Invalid CBasePlayer - */ -native bool SC_Respawn(CBasePlayer pPlayer, any options[sizeof(SpawnOptions)]); - -/** - * Gets the survival mode. - * - * @return Current survival mode (enum) - */ -native SurvivalMode SC_GetSurvivalMode(); - -/** - * Teleports a player to active checkpoint. - * - * @error Invalid CBasePlayer - * @return true for success, false if there is no checkpoint - */ -native bool SC_TeleportToCurrentCheckpoint(CBasePlayer pPlayer); - -/** - * Checks if a SourceCoop feature is enabled. - */ -native bool SC_IsCoopFeatureEnabled(SourceCoopFeature iFeatureBits); - -/** - * Workaround for weapon prediction errors after the player has returned from third-person. - * Uses equipment pack & restore mechanism. - * @error Invalid or dead CBasePlayer - * @return false if player's equipment has already been stored and is waiting for restore - */ -native bool SC_FixWeaponPrediction(CBasePlayer pPlayer); \ No newline at end of file +#include +#include +#include \ No newline at end of file diff --git a/scripting/include/srccoop_api/classdef.inc b/scripting/include/srccoop_api/classdef.inc index 303b25bc..f3256df7 100644 --- a/scripting/include/srccoop_api/classdef.inc +++ b/scripting/include/srccoop_api/classdef.inc @@ -1,16 +1,10 @@ -#pragma newdecls required -#pragma semicolon 1 - #if defined _srccoop_api_classdef_included #endinput #endif #define _srccoop_api_classdef_included -#include -#include -#include -#include -#include +#pragma newdecls required +#pragma semicolon 1 #include #include @@ -57,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -102,6 +97,7 @@ stock void InitClassdef(const GameData hGameConfig) CBaseCombatWeapon.InitClassdef(hGameConfig); CBaseCombatCharacter.InitClassdef(hGameConfig); CBaseViewModel.InitClassdef(hGameConfig); + CRagdollProp.InitClassdef(hGameConfig); CPlayerInfoManager.InitClassdef(hGameConfig); AI_CriteriaSet.InitClassdef(hGameConfig); IServerGameClients.InitClassdef(hGameConfig); diff --git a/scripting/include/srccoop_api/classdef/common/CAI_BaseNPC.inc b/scripting/include/srccoop_api/classdef/common/CAI_BaseNPC.inc index d3b5adf1..1a5881fb 100644 --- a/scripting/include/srccoop_api/classdef/common/CAI_BaseNPC.inc +++ b/scripting/include/srccoop_api/classdef/common/CAI_BaseNPC.inc @@ -148,25 +148,16 @@ methodmap CAI_BaseNPC < CBaseCombatCharacter { return GetEntPropFloat(this.entindex, Prop_Data, "m_flWakeRadius"); } - public AI_SleepFlags_t GetSleepFlags() + property AI_SleepFlags_t m_SleepFlags { - return view_as(GetEntProp(this.entindex, Prop_Data, "m_SleepFlags")); - } - public int SetSleepFlags(const AI_SleepFlags_t eSleepFlags) - { - SetEntProp(this.entindex, Prop_Data, "m_SleepFlags", eSleepFlags); - } - public bool HasSleepFlags(const AI_SleepFlags_t eSleepFlags) - { - return (this.GetSleepFlags() & eSleepFlags) == eSleepFlags; - } - public void AddSleepFlags(const AI_SleepFlags_t eSleepFlags) - { - this.SetSleepFlags(this.GetSleepFlags() | eSleepFlags); - } - public void RemoveSleepFlags(const AI_SleepFlags_t eSleepFlags) - { - this.SetSleepFlags(this.GetSleepFlags() & ~eSleepFlags); + public get() + { + return view_as(GetEntProp(this.entindex, Prop_Data, "m_SleepFlags")); + } + public set(const AI_SleepFlags_t eSleepFlags) + { + SetEntProp(this.entindex, Prop_Data, "m_SleepFlags", eSleepFlags); + } } public AI_SleepState_t GetSleepState() { diff --git a/scripting/include/srccoop_api/classdef/common/CBaseCombatWeapon.inc b/scripting/include/srccoop_api/classdef/common/CBaseCombatWeapon.inc index f040c790..7f313b99 100644 --- a/scripting/include/srccoop_api/classdef/common/CBaseCombatWeapon.inc +++ b/scripting/include/srccoop_api/classdef/common/CBaseCombatWeapon.inc @@ -91,6 +91,12 @@ methodmap CBaseCombatWeapon < CBaseAnimating { SetEntPropFloat(this.entindex, Prop_Send, "m_flNextSecondaryAttack", flNextSecondaryAttack); } + public void DelayNextAttack(float flDelay) + { + flDelay += GetGameTime(); + this.SetNextPrimaryAttack(flDelay); + this.SetNextSecondaryAttack(flDelay); + } public bool CanFireUnderwater() { return GetEntProp(this.entindex, Prop_Data, "m_bFiresUnderwater") != 0; diff --git a/scripting/include/srccoop_api/classdef/common/CBaseEntity.inc b/scripting/include/srccoop_api/classdef/common/CBaseEntity.inc index 42f6a764..b40eae06 100644 --- a/scripting/include/srccoop_api/classdef/common/CBaseEntity.inc +++ b/scripting/include/srccoop_api/classdef/common/CBaseEntity.inc @@ -9,7 +9,7 @@ static Handle g_pWorldSpaceCenter; static Handle g_pIsNPC; static Handle g_pSetMinMaxSize; -#define NULL_CBASEENTITY view_as(-1) +const any NULL_CBASEENTITY = -1; methodmap CBaseEntity { @@ -241,27 +241,35 @@ methodmap CBaseEntity Format(szBuffer, sizeof(szBuffer), "%f %f %f", vec3Value[0], vec3Value[1], vec3Value[2]); return this.AcceptInputStr(szInput, szBuffer, pActivator, pCaller, iOutputID); } - public bool OutputAdd(const char[] szOutput, const char[] szTarget, const char[] szTargetInput, const char[] szParameter = "", const float flDelay = 0.0, const int iTimesToFire = -1) + public bool AddOutput(const char[] szOutput, const char[] szTarget, const char[] szTargetInput, const char[] szParameter = "", const float flDelay = 0.0, const int iTimesToFire = -1) { - char szBuffer[256]; - Format(szBuffer, sizeof(szBuffer), "%s %s:%s:%s:%f:%d", szOutput, szTarget, szTargetInput, szParameter, flDelay, iTimesToFire); - return this.AcceptInputStr("AddOutput", szBuffer); + char szBuffer[256]; + Format(szBuffer, sizeof(szBuffer), "%s %s:%s:%s:%f:%d", szOutput, szTarget, szTargetInput, szParameter, flDelay, iTimesToFire); + return this.AcceptInputStr("AddOutput", szBuffer); } - public bool SetKeyValueStr(const char[] szKeyValue, const char[] szValue) + public bool KeyValue(const char[] szKeyValue, const char[] szValue) { return DispatchKeyValue(this.entindex, szKeyValue, szValue); } - public bool SetKeyValueFloat(const char[] szKeyValue, const float flValue) + public bool KeyValueInt(const char[] szKeyValue, const int iValue) + { + return DispatchKeyValueInt(this.entindex, szKeyValue, iValue); + } + public bool KeyValueFloat(const char[] szKeyValue, const float flValue) { return DispatchKeyValueFloat(this.entindex, szKeyValue, flValue); } + public bool KeyValueVector(const char[] szKeyValue, const float vecValue[3]) + { + return DispatchKeyValueVector(this.entindex, szKeyValue, vecValue); + } public bool Kill() { - return this.AcceptInputStr("Kill"); + return this.AcceptInput("Kill"); } - public bool KillAfterTime(const float flTime) + public bool KillDelayed(const float flDelay) { - return this.OutputAdd("OnUser1", "!self", "kill", _, flTime) && this.AcceptInput("FireUser1"); + return this.AddOutput("OnUser1", "!self", "kill", _, flDelay) && this.AcceptInput("FireUser1"); } public int GetTeam() { @@ -475,6 +483,14 @@ methodmap CBaseEntity { return GetEntProp(this.entindex, Prop_Data, "m_nSimulationTick"); } + public float GetLocalTime() + { + return GetEntPropFloat(this.entindex, Prop_Data, "m_flLocalTime"); + } + public void SetLocalTime(const float flTime) + { + SetEntPropFloat(this.entindex, Prop_Data, "m_flLocalTime", flTime); + } public void GetViewOffset(float vec3Buffer[3]) { GetEntPropVector(this.entindex, Prop_Data, "m_vecViewOffset", vec3Buffer); @@ -581,6 +597,14 @@ methodmap CBaseEntity { SetEntPropEnt(this.entindex, Prop_Data, "m_hGroundEntity", pGroundEntity.entindex); } + public CBaseEntity GetEffectEntity() + { + return CBaseEntity(GetEntPropEnt(this.entindex, Prop_Data, "m_hEffectEntity")); + } + public void SetEffectEntity(const CBaseEntity pEffectEntity) + { + SetEntPropEnt(this.entindex, Prop_Data, "m_hEffectEntity", pEffectEntity.entindex); + } public int GetHealth() { return GetEntProp(this.entindex, Prop_Data, "m_iHealth"); diff --git a/scripting/include/srccoop_api/classdef/common/CBasePlayer.inc b/scripting/include/srccoop_api/classdef/common/CBasePlayer.inc index 834af7a2..35702eec 100644 --- a/scripting/include/srccoop_api/classdef/common/CBasePlayer.inc +++ b/scripting/include/srccoop_api/classdef/common/CBasePlayer.inc @@ -148,7 +148,7 @@ methodmap CBasePlayer < CBaseCombatCharacter if (pItem != NULL_CBASEENTITY && pItem.GetOwner() == NULL_CBASEENTITY) { // this would drop on the ground if player cant pick up any more - pItem.KillAfterTime(0.1); + pItem.KillDelayed(0.1); } return pItem; } @@ -388,14 +388,10 @@ methodmap CBasePlayer < CBaseCombatCharacter } public bool SendConVarValueInt(const ConVar hConVar, const int iValue) { - char szValue[13]; + char szValue[MAX_CHARS_INT(INT_MIN)]; IntToString(iValue, szValue, sizeof(szValue)); return this.SendConVarValueStr(hConVar, szValue); } - public bool SendConVarValueBool(const ConVar hConVar, const int bValue) - { - return this.SendConVarValueInt(hConVar, view_as(bValue)); - } public void PlayGameSound(const char[] szSound) { ClientCommand(this.entindex, "playgamesound %s", szSound); @@ -582,6 +578,34 @@ methodmap CBasePlayer < CBaseCombatCharacter { SetEntProp(this.entindex, Prop_Send, "m_nTickBase", iTickBase); } + public bool ScreenFade(int iDuration, RGBA color, ScreenFadeFlags_t eFadeFlags, int iHoldtime = -1, int iMessageFlags = USERMSG_RELIABLE) + { + Handle hMessage = StartMessageOne("Fade", this.entindex, iMessageFlags); + + if (!hMessage) + return false; + + if (GetFeatureStatus(FeatureType_Native, "GetUserMessageType") == FeatureStatus_Available && GetUserMessageType() == UM_Protobuf) + { + PbSetInt(hMessage, "duration", iDuration); + PbSetInt(hMessage, "hold_time", iHoldtime); + PbSetInt(hMessage, "flags", view_as(eFadeFlags)); + PbSetColor(hMessage, "clr", color.ToArray()); + } + else + { + BfWriteShort(hMessage, iDuration); // Fade duration + BfWriteShort(hMessage, iHoldtime); // Fade hold time + BfWriteShort(hMessage, view_as(eFadeFlags)); // What to do + BfWriteByte(hMessage, color.r); // Color R + BfWriteByte(hMessage, color.g); // Color G + BfWriteByte(hMessage, color.b); // Color B + BfWriteByte(hMessage, color.a); // Color Alpha + } + EndMessage(); + + return true; + } } // hermite basis function for smooth interpolation @@ -617,9 +641,4 @@ static bool CanOverrideEnvZoomOwner(CBaseEntity pZoomOwner) if (!pZoomOwner.GetClassname(szClassname, sizeof(szClassname)) || strcmp(szClassname, "env_zoom") != 0) return false; return !!(view_as(pZoomOwner).m_spawnflags & ENV_ZOOM_OVERRIDE); -} - -static bool TraceEntityFilter_IgnoreData(int iEntIndex, int iMask, any pData) -{ - return (iEntIndex != pData); -} +} \ No newline at end of file diff --git a/scripting/include/srccoop_api/classdef/common/CDynamicProp.inc b/scripting/include/srccoop_api/classdef/common/CDynamicProp.inc index b816e767..eafa2492 100644 --- a/scripting/include/srccoop_api/classdef/common/CDynamicProp.inc +++ b/scripting/include/srccoop_api/classdef/common/CDynamicProp.inc @@ -16,7 +16,7 @@ methodmap CDynamicProp < CBreakableProp CDynamicProp pDynamicProp = CDynamicProp.Create(); if (pDynamicProp != NULL_CBASEENTITY) { - pDynamicProp.SetKeyValueStr("model", szModelName); + pDynamicProp.KeyValue("model", szModelName); pDynamicProp.Spawn(); pDynamicProp.Activate(); } diff --git a/scripting/include/srccoop_api/classdef/common/CRagdollProp.inc b/scripting/include/srccoop_api/classdef/common/CRagdollProp.inc index 30ce631f..ba8ca0c5 100644 --- a/scripting/include/srccoop_api/classdef/common/CRagdollProp.inc +++ b/scripting/include/srccoop_api/classdef/common/CRagdollProp.inc @@ -1,10 +1,38 @@ #pragma newdecls required #pragma semicolon 1 +static Handle g_pCreateServerRagdoll; + methodmap CRagdollProp < CBaseAnimating { + public static void InitClassdef(const GameData hGameConfig) + { + char szCreateServerRagdoll[] = "CreateServerRagdoll"; + StartPrepSDKCall(SDKCall_Static); + if (!PrepSDKCall_SetFromConf(hGameConfig, SDKConf_Signature, szCreateServerRagdoll)) + LogMessage("Could not obtain gamedata signature %s", szCreateServerRagdoll); + else + { + PrepSDKCall_SetReturnInfo(SDKType_CBaseEntity, SDKPass_Pointer); + PrepSDKCall_AddParameter(SDKType_CBaseEntity, SDKPass_Pointer); // CBaseAnimating *pAnimating + PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain); // int forceBone + PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain); // const CTakeDamageInfo &info + PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain); // int collisionGroup + PrepSDKCall_AddParameter(SDKType_Bool, SDKPass_Plain); // bool bUseLRURetirement + if (!(g_pCreateServerRagdoll = EndPrepSDKCall())) + SetFailState("Could not prep SDK call %s", szCreateServerRagdoll); + } + } public CRagdollProp(const int iEntIndex = -1) { return view_as(CBaseAnimating(iEntIndex)); } +} + +stock CRagdollProp CreateServerRagdoll(const CBaseAnimating pAnimating, const int iForceBone, const CTakeDamageInfo pInfo, const Collision_Group_t eCollisionGroup, const bool bUseLRURetirement = false) +{ + return CRagdollProp + ( + SDKCall(g_pCreateServerRagdoll, pAnimating.entindex, iForceBone, pInfo, eCollisionGroup, bUseLRURetirement) + ); } \ No newline at end of file diff --git a/scripting/include/srccoop_api/classdef/common/CRevertSaved.inc b/scripting/include/srccoop_api/classdef/common/CRevertSaved.inc new file mode 100644 index 00000000..00d93a7e --- /dev/null +++ b/scripting/include/srccoop_api/classdef/common/CRevertSaved.inc @@ -0,0 +1,23 @@ +#pragma newdecls required +#pragma semicolon 1 + +methodmap CRevertSaved < CBaseEntity +{ + public CRevertSaved(const int iEntIndex = -1) + { + return view_as(CBaseEntity(iEntIndex)); + } + public static CRevertSaved Create() + { + return CRevertSaved(CreateEntityByName("player_loadsaved")); + } + + public float GetDuration() + { + return GetEntPropFloat(this.entindex, Prop_Data, "m_Duration"); + } + public void SetDuration(float flDuration) + { + SetEntPropFloat(this.entindex, Prop_Data, "m_Duration", flDuration); + } +} diff --git a/scripting/include/srccoop_api/classdef/common/CTraceRay.inc b/scripting/include/srccoop_api/classdef/common/CTraceRay.inc index 0c51f6a8..a2eda116 100644 --- a/scripting/include/srccoop_api/classdef/common/CTraceRay.inc +++ b/scripting/include/srccoop_api/classdef/common/CTraceRay.inc @@ -3,7 +3,7 @@ methodmap CTraceRay < Handle { - public CTraceRay(const float vecPosition[3], const float vecRayType[3], const int iTraceMask, const RayType eRayType, const TraceEntityFilter fnFilter, const any pData) + public CTraceRay(const float vecPosition[3], const float vecRayType[3], const int iTraceMask, const RayType eRayType, const TraceEntityFilter fnFilter, const any pData = -1) { return view_as(TR_TraceRayFilterEx(vecPosition, vecRayType, iTraceMask, eRayType, fnFilter, pData)); } @@ -21,3 +21,16 @@ methodmap CTraceRay < Handle return CBaseEntity(TR_GetEntityIndex(this)); } } + +stock bool TraceEntityFilter_IgnoreData(int iEntIndex, int iMask, any pData) +{ + return (iEntIndex != pData); +} + +stock bool TraceEntityFilter_IgnorePlayers(int iEntIndex, int iMask, any pData) +{ + CBasePlayer pPlayer = CBasePlayer(iEntIndex); + if (pPlayer.IsValid()) + return false; + return (iEntIndex != pData); +} \ No newline at end of file diff --git a/scripting/include/srccoop_api/typedef.inc b/scripting/include/srccoop_api/typedef.inc index d030382f..4ed6c1cc 100644 --- a/scripting/include/srccoop_api/typedef.inc +++ b/scripting/include/srccoop_api/typedef.inc @@ -1,16 +1,32 @@ -#pragma newdecls required -#pragma semicolon 1 - #if defined _srccoop_api_typedef_included #endinput #endif #define _srccoop_api_typedef_included +#pragma newdecls required +#pragma semicolon 1 + #include //------------------------------------------------------ // Base definitions //------------------------------------------------------ +#if !defined CHAR_BIT + #define CHAR_BIT 8 +#endif + +#if !defined FLT_MAX + #define FLT_MAX 2147483647.0 +#endif + +#if !defined INT_MIN + #define INT_MIN cellmin +#endif + +#if !defined INT_MAX + #define INT_MAX cellmax +#endif + #define MAX_WEAPONS 48 #define MAX_AMMO_TYPES 32 #define MAX_VIEWMODELS 2 @@ -19,6 +35,7 @@ #define MAX_CLASSNAME 48 #define MAX_MODELNAME 256 #define MAX_TEAMNAME 32 +#define ENTITYSTRING_LENGTH 2097152 #define ACHIEVEMENT_PREFIX "ACHIEVEMENT_EVENT_" @@ -115,14 +132,12 @@ #define SF_PHYSBOX_PREVENT_PLAYER_TOUCH_ENABLE 0x800000 // If set, the player will not cause the object to enable its motion when bumped into */ -#include #include #include #include #include #include #include -#include #include #include #include @@ -145,5 +160,12 @@ #include #if defined SRCCOOP_BLACKMESA +#include #include +#include +#endif + +#if defined SRCCOOP_HL2DM +#include +#include #endif diff --git a/scripting/include/srccoop_api/typedef/common/Activity.inc b/scripting/include/srccoop_api/typedef/bms/Activity.inc similarity index 99% rename from scripting/include/srccoop_api/typedef/common/Activity.inc rename to scripting/include/srccoop_api/typedef/bms/Activity.inc index a78e8271..d14f5b7b 100644 --- a/scripting/include/srccoop_api/typedef/common/Activity.inc +++ b/scripting/include/srccoop_api/typedef/bms/Activity.inc @@ -1,9 +1,6 @@ #pragma newdecls required #pragma semicolon 1 -//------------------------------------------------------ -// BMS specific activity list -//------------------------------------------------------ enum Activity { ACT_INVALID = -1, // So we have something more succint to check for than '-1' diff --git a/scripting/include/srccoop_api/typedef/common/Class_T.inc b/scripting/include/srccoop_api/typedef/bms/Class_T.inc similarity index 88% rename from scripting/include/srccoop_api/typedef/common/Class_T.inc rename to scripting/include/srccoop_api/typedef/bms/Class_T.inc index f478cf4c..57f52355 100644 --- a/scripting/include/srccoop_api/typedef/common/Class_T.inc +++ b/scripting/include/srccoop_api/typedef/bms/Class_T.inc @@ -1,6 +1,7 @@ #pragma newdecls required #pragma semicolon 1 +// For CLASSIFY // ToDo: Need to find all values for BMS enum Class_T { diff --git a/scripting/include/srccoop_api/typedef/common/AI_Schedule_t.inc b/scripting/include/srccoop_api/typedef/common/AI_Schedule_t.inc index 4355dc65..35321fee 100644 --- a/scripting/include/srccoop_api/typedef/common/AI_Schedule_t.inc +++ b/scripting/include/srccoop_api/typedef/common/AI_Schedule_t.inc @@ -105,11 +105,13 @@ enum AI_Schedule_t // ====================================== // IMPORTANT: This must be the last enum // ====================================== - LAST_SHARED_SCHEDULE, + LAST_SHARED_SCHEDULE +} - // `npc_sniper` schedules - // TODO: Find a better way to inherit enums. - SCHED_PSNIPER_SCAN = LAST_SHARED_SCHEDULE, +// `npc_sniper` schedules +enum +{ + SCHED_PSNIPER_SCAN = view_as(LAST_SHARED_SCHEDULE), SCHED_PSNIPER_CAMP, SCHED_PSNIPER_ATTACK, SCHED_PSNIPER_RELOAD, @@ -121,5 +123,5 @@ enum AI_Schedule_t SCHED_PSNIPER_SWEEP_TARGET_NOINTERRUPT, SCHED_PSNIPER_SNAPATTACK, SCHED_PSNIPER_NO_CLEAR_SHOT, - SCHED_PSNIPER_PLAYER_DEAD, -} + SCHED_PSNIPER_PLAYER_DEAD +} \ No newline at end of file diff --git a/scripting/include/srccoop_api/typedef/common/AmmoType_t.inc b/scripting/include/srccoop_api/typedef/common/AmmoType_t.inc index 251a0acd..7a5f29c3 100644 --- a/scripting/include/srccoop_api/typedef/common/AmmoType_t.inc +++ b/scripting/include/srccoop_api/typedef/common/AmmoType_t.inc @@ -1,6 +1,8 @@ #pragma newdecls required #pragma semicolon 1 +// ToDo: This is not an enum. Look this up at runtime. + enum AmmoType_t { AMMO_INVALID = 0, diff --git a/scripting/include/srccoop_api/typedef/common/Team_t.inc b/scripting/include/srccoop_api/typedef/common/Team_t.inc index 217a69dc..d8772417 100644 --- a/scripting/include/srccoop_api/typedef/common/Team_t.inc +++ b/scripting/include/srccoop_api/typedef/common/Team_t.inc @@ -7,6 +7,6 @@ enum TEAM_INVALID = -1, TEAM_UNASSIGNED = 0, TEAM_SPECTATOR = 1, - TEAM_MARINES = 2, - TEAM_SCIENTIST = 3, + TEAM_ONE = 2, // Marine, Combine + TEAM_TWO = 3, // Scientist, Rebels } diff --git a/scripting/include/srccoop_api/typedef/hl2dm/Activity.inc b/scripting/include/srccoop_api/typedef/hl2dm/Activity.inc new file mode 100644 index 00000000..62dc182a --- /dev/null +++ b/scripting/include/srccoop_api/typedef/hl2dm/Activity.inc @@ -0,0 +1,2181 @@ +#pragma newdecls required +#pragma semicolon 1 + +enum Activity +{ + ACT_INVALID = -1, // So we have something more succint to check for than '-1' + ACT_RESET = 0, // Set m_Activity to this invalid value to force a reset to m_IdealActivity + ACT_IDLE, + ACT_TRANSITION, + ACT_COVER, // FIXME: obsolete? redundant with ACT_COVER_LOW? + ACT_COVER_MED, // FIXME: unsupported? + ACT_COVER_LOW, // FIXME: rename ACT_IDLE_CROUCH? + ACT_WALK, + ACT_WALK_AIM, + ACT_WALK_CROUCH, + ACT_WALK_CROUCH_AIM, + ACT_RUN, + ACT_RUN_AIM, + ACT_RUN_CROUCH, + ACT_RUN_CROUCH_AIM, + ACT_RUN_PROTECTED, + ACT_SCRIPT_CUSTOM_MOVE, + ACT_RANGE_ATTACK1, + ACT_RANGE_ATTACK2, + ACT_RANGE_ATTACK1_LOW, // FIXME: not used yet, crouched versions of the range attack + ACT_RANGE_ATTACK2_LOW, // FIXME: not used yet, crouched versions of the range attack + ACT_DIESIMPLE, + ACT_DIEBACKWARD, + ACT_DIEFORWARD, + ACT_DIEVIOLENT, + ACT_DIERAGDOLL, + ACT_FLY, // Fly (and flap if appropriate) + ACT_HOVER, + ACT_GLIDE, + ACT_SWIM, + ACT_JUMP, + ACT_HOP, // vertical jump + ACT_LEAP, // long forward jump + ACT_LAND, + ACT_CLIMB_UP, + ACT_CLIMB_DOWN, + ACT_CLIMB_DISMOUNT, + ACT_SHIPLADDER_UP, + ACT_SHIPLADDER_DOWN, + ACT_STRAFE_LEFT, + ACT_STRAFE_RIGHT, + ACT_ROLL_LEFT, // tuck and roll, left + ACT_ROLL_RIGHT, // tuck and roll, right + ACT_TURN_LEFT, // turn quickly left (stationary) + ACT_TURN_RIGHT, // turn quickly right (stationary) + ACT_CROUCH, // FIXME: obsolete? only used be soldier (the act of crouching down from a standing position) + ACT_CROUCHIDLE, // FIXME: obsolete? only used be soldier (holding body in crouched position (loops)) + ACT_STAND, // FIXME: obsolete? should be transition (the act of standing from a crouched position) + ACT_USE, + ACT_SIGNAL1, + ACT_SIGNAL2, + ACT_SIGNAL3, + + ACT_SIGNAL_ADVANCE, // Squad handsignals, specific. + ACT_SIGNAL_FORWARD, + ACT_SIGNAL_GROUP, + ACT_SIGNAL_HALT, + ACT_SIGNAL_LEFT, + ACT_SIGNAL_RIGHT, + ACT_SIGNAL_TAKECOVER, + + ACT_LOOKBACK_RIGHT, // look back over shoulder without turning around. + ACT_LOOKBACK_LEFT, + ACT_COWER, // FIXME: unused, should be more extreme version of crouching + ACT_SMALL_FLINCH, // FIXME: needed? shouldn't flinching be down with overlays? + ACT_BIG_FLINCH, + ACT_MELEE_ATTACK1, + ACT_MELEE_ATTACK2, + ACT_RELOAD, + ACT_RELOAD_START, + ACT_RELOAD_FINISH, + ACT_RELOAD_LOW, + ACT_ARM, // pull out gun, for instance + ACT_DISARM, // reholster gun + ACT_DROP_WEAPON, + ACT_DROP_WEAPON_SHOTGUN, + ACT_PICKUP_GROUND, // pick up something in front of you on the ground + ACT_PICKUP_RACK, // pick up something from a rack or shelf in front of you. + ACT_IDLE_ANGRY, // FIXME: being used as an combat ready idle? alternate idle animation in which the monster is clearly agitated. (loop) + + ACT_IDLE_RELAXED, + ACT_IDLE_STIMULATED, + ACT_IDLE_AGITATED, + ACT_IDLE_STEALTH, + ACT_IDLE_HURT, + + ACT_WALK_RELAXED, + ACT_WALK_STIMULATED, + ACT_WALK_AGITATED, + ACT_WALK_STEALTH, + + ACT_RUN_RELAXED, + ACT_RUN_STIMULATED, + ACT_RUN_AGITATED, + ACT_RUN_STEALTH, + + ACT_IDLE_AIM_RELAXED, + ACT_IDLE_AIM_STIMULATED, + ACT_IDLE_AIM_AGITATED, + ACT_IDLE_AIM_STEALTH, + + ACT_WALK_AIM_RELAXED, + ACT_WALK_AIM_STIMULATED, + ACT_WALK_AIM_AGITATED, + ACT_WALK_AIM_STEALTH, + + ACT_RUN_AIM_RELAXED, + ACT_RUN_AIM_STIMULATED, + ACT_RUN_AIM_AGITATED, + ACT_RUN_AIM_STEALTH, + + ACT_CROUCHIDLE_STIMULATED, + ACT_CROUCHIDLE_AIM_STIMULATED, + ACT_CROUCHIDLE_AGITATED, + + ACT_WALK_HURT, // limp (loop) + ACT_RUN_HURT, // limp (loop) + ACT_SPECIAL_ATTACK1, // very monster specific special attacks. + ACT_SPECIAL_ATTACK2, + ACT_COMBAT_IDLE, // FIXME: unused? agitated idle. + ACT_WALK_SCARED, + ACT_RUN_SCARED, + ACT_VICTORY_DANCE, // killed a player, do a victory dance. + ACT_DIE_HEADSHOT, // die, hit in head. + ACT_DIE_CHESTSHOT, // die, hit in chest + ACT_DIE_GUTSHOT, // die, hit in gut + ACT_DIE_BACKSHOT, // die, hit in back + ACT_FLINCH_HEAD, + ACT_FLINCH_CHEST, + ACT_FLINCH_STOMACH, + ACT_FLINCH_LEFTARM, + ACT_FLINCH_RIGHTARM, + ACT_FLINCH_LEFTLEG, + ACT_FLINCH_RIGHTLEG, + ACT_FLINCH_PHYSICS, + + ACT_IDLE_ON_FIRE, // ON FIRE animations + ACT_WALK_ON_FIRE, + ACT_RUN_ON_FIRE, + + ACT_RAPPEL_LOOP, // Rappel down a rope! + + ACT_180_LEFT, // 180 degree left turn + ACT_180_RIGHT, + + ACT_90_LEFT, // 90 degree turns + ACT_90_RIGHT, + + ACT_STEP_LEFT, // Single steps + ACT_STEP_RIGHT, + ACT_STEP_BACK, + ACT_STEP_FORE, + + ACT_GESTURE_RANGE_ATTACK1, + ACT_GESTURE_RANGE_ATTACK2, + ACT_GESTURE_MELEE_ATTACK1, + ACT_GESTURE_MELEE_ATTACK2, + ACT_GESTURE_RANGE_ATTACK1_LOW, // FIXME: not used yet, crouched versions of the range attack + ACT_GESTURE_RANGE_ATTACK2_LOW, // FIXME: not used yet, crouched versions of the range attack + + ACT_MELEE_ATTACK_SWING_GESTURE, + + ACT_GESTURE_SMALL_FLINCH, + ACT_GESTURE_BIG_FLINCH, + ACT_GESTURE_FLINCH_BLAST, // Startled by an explosion + ACT_GESTURE_FLINCH_BLAST_SHOTGUN, + ACT_GESTURE_FLINCH_BLAST_DAMAGED, // Damaged by an explosion + ACT_GESTURE_FLINCH_BLAST_DAMAGED_SHOTGUN, + ACT_GESTURE_FLINCH_HEAD, + ACT_GESTURE_FLINCH_CHEST, + ACT_GESTURE_FLINCH_STOMACH, + ACT_GESTURE_FLINCH_LEFTARM, + ACT_GESTURE_FLINCH_RIGHTARM, + ACT_GESTURE_FLINCH_LEFTLEG, + ACT_GESTURE_FLINCH_RIGHTLEG, + + ACT_GESTURE_TURN_LEFT, + ACT_GESTURE_TURN_RIGHT, + ACT_GESTURE_TURN_LEFT45, + ACT_GESTURE_TURN_RIGHT45, + ACT_GESTURE_TURN_LEFT90, + ACT_GESTURE_TURN_RIGHT90, + ACT_GESTURE_TURN_LEFT45_FLAT, + ACT_GESTURE_TURN_RIGHT45_FLAT, + ACT_GESTURE_TURN_LEFT90_FLAT, + ACT_GESTURE_TURN_RIGHT90_FLAT, + + // HALF-LIFE 1 compatability stuff goes here. Temporary! + ACT_BARNACLE_HIT, // barnacle tongue hits a monster + ACT_BARNACLE_PULL, // barnacle is lifting the monster ( loop ) + ACT_BARNACLE_CHOMP, // barnacle latches on to the monster + ACT_BARNACLE_CHEW, // barnacle is holding the monster in its mouth ( loop ) + + // Sometimes, you just want to set an NPC's sequence to a sequence that doesn't actually + // have an activity. The AI will reset the NPC's sequence to whatever its IDEAL activity + // is, though. So if you set ideal activity to DO_NOT_DISTURB, the AI will not interfere + // with the NPC's current sequence. (SJB) + ACT_DO_NOT_DISTURB, + + // viewmodel (weapon) activities + // FIXME: move these to the specific viewmodels, no need to make global + ACT_VM_DRAW, + ACT_VM_HOLSTER, + ACT_VM_IDLE, + ACT_VM_FIDGET, + ACT_VM_PULLBACK, + ACT_VM_PULLBACK_HIGH, + ACT_VM_PULLBACK_LOW, + ACT_VM_THROW, + ACT_VM_PULLPIN, + ACT_VM_PRIMARYATTACK, // fire + ACT_VM_SECONDARYATTACK, // alt. fire + ACT_VM_RELOAD, + ACT_VM_RELOAD_START, + ACT_VM_RELOAD_FINISH, + ACT_VM_DRYFIRE, // fire with no ammo loaded. + ACT_VM_HITLEFT, // bludgeon, swing to left - hit (primary attk) + ACT_VM_HITLEFT2, // bludgeon, swing to left - hit (secondary attk) + ACT_VM_HITRIGHT, // bludgeon, swing to right - hit (primary attk) + ACT_VM_HITRIGHT2, // bludgeon, swing to right - hit (secondary attk) + ACT_VM_HITCENTER, // bludgeon, swing center - hit (primary attk) + ACT_VM_HITCENTER2, // bludgeon, swing center - hit (secondary attk) + ACT_VM_MISSLEFT, // bludgeon, swing to left - miss (primary attk) + ACT_VM_MISSLEFT2, // bludgeon, swing to left - miss (secondary attk) + ACT_VM_MISSRIGHT, // bludgeon, swing to right - miss (primary attk) + ACT_VM_MISSRIGHT2, // bludgeon, swing to right - miss (secondary attk) + ACT_VM_MISSCENTER, // bludgeon, swing center - miss (primary attk) + ACT_VM_MISSCENTER2, // bludgeon, swing center - miss (secondary attk) + ACT_VM_HAULBACK, // bludgeon, haul the weapon back for a hard strike (secondary attk) + ACT_VM_SWINGHARD, // bludgeon, release the hard strike (secondary attk) + ACT_VM_SWINGMISS, + ACT_VM_SWINGHIT, + ACT_VM_IDLE_TO_LOWERED, + ACT_VM_IDLE_LOWERED, + ACT_VM_LOWERED_TO_IDLE, + ACT_VM_RECOIL1, + ACT_VM_RECOIL2, + ACT_VM_RECOIL3, + ACT_VM_PICKUP, + ACT_VM_RELEASE, + + ACT_VM_ATTACH_SILENCER, + ACT_VM_DETACH_SILENCER, + + // TF2 Scout Pack + ACT_VM_DRAW_SPECIAL, + ACT_VM_HOLSTER_SPECIAL, + ACT_VM_IDLE_SPECIAL, + ACT_VM_PULLBACK_SPECIAL, + ACT_VM_PRIMARYATTACK_SPECIAL, + ACT_VM_SECONDARYATTACK_SPECIAL, + ACT_VM_HITCENTER_SPECIAL, + ACT_VM_SWINGHARD_SPECIAL, + ACT_VM_IDLE_TO_LOWERED_SPECIAL, + ACT_VM_IDLE_LOWERED_SPECIAL, + ACT_VM_LOWERED_TO_IDLE_SPECIAL, + + ACT_FISTS_VM_HITLEFT, + ACT_FISTS_VM_HITRIGHT, + ACT_FISTS_VM_SWINGHARD, + ACT_FISTS_VM_IDLE, + ACT_FISTS_VM_DRAW, + +//=========================== +// HL2 Specific Activities +//=========================== + // SLAM Specialty Activities + ACT_SLAM_STICKWALL_IDLE, + ACT_SLAM_STICKWALL_ND_IDLE, + ACT_SLAM_STICKWALL_ATTACH, + ACT_SLAM_STICKWALL_ATTACH2, + ACT_SLAM_STICKWALL_ND_ATTACH, + ACT_SLAM_STICKWALL_ND_ATTACH2, + ACT_SLAM_STICKWALL_DETONATE, + ACT_SLAM_STICKWALL_DETONATOR_HOLSTER, + ACT_SLAM_STICKWALL_DRAW, + ACT_SLAM_STICKWALL_ND_DRAW, + ACT_SLAM_STICKWALL_TO_THROW, + ACT_SLAM_STICKWALL_TO_THROW_ND, + ACT_SLAM_STICKWALL_TO_TRIPMINE_ND, + ACT_SLAM_THROW_IDLE, + ACT_SLAM_THROW_ND_IDLE, + ACT_SLAM_THROW_THROW, + ACT_SLAM_THROW_THROW2, + ACT_SLAM_THROW_THROW_ND, + ACT_SLAM_THROW_THROW_ND2, + ACT_SLAM_THROW_DRAW, + ACT_SLAM_THROW_ND_DRAW, + ACT_SLAM_THROW_TO_STICKWALL, + ACT_SLAM_THROW_TO_STICKWALL_ND, + ACT_SLAM_THROW_DETONATE, + ACT_SLAM_THROW_DETONATOR_HOLSTER, + ACT_SLAM_THROW_TO_TRIPMINE_ND, + ACT_SLAM_TRIPMINE_IDLE, + ACT_SLAM_TRIPMINE_DRAW, + ACT_SLAM_TRIPMINE_ATTACH, + ACT_SLAM_TRIPMINE_ATTACH2, + ACT_SLAM_TRIPMINE_TO_STICKWALL_ND, + ACT_SLAM_TRIPMINE_TO_THROW_ND, + ACT_SLAM_DETONATOR_IDLE, + ACT_SLAM_DETONATOR_DRAW, + ACT_SLAM_DETONATOR_DETONATE, + ACT_SLAM_DETONATOR_HOLSTER, + ACT_SLAM_DETONATOR_STICKWALL_DRAW, + ACT_SLAM_DETONATOR_THROW_DRAW, + + // Shotgun Specialty Activities + ACT_SHOTGUN_RELOAD_START, + ACT_SHOTGUN_RELOAD_FINISH, + ACT_SHOTGUN_PUMP, + + // SMG2 special activities + ACT_SMG2_IDLE2, + ACT_SMG2_FIRE2, + ACT_SMG2_DRAW2, + ACT_SMG2_RELOAD2, + ACT_SMG2_DRYFIRE2, + ACT_SMG2_TOAUTO, + ACT_SMG2_TOBURST, + + // Physcannon special activities + ACT_PHYSCANNON_UPGRADE, + + // weapon override activities + ACT_RANGE_ATTACK_AR1, + ACT_RANGE_ATTACK_AR2, + ACT_RANGE_ATTACK_AR2_LOW, + ACT_RANGE_ATTACK_AR2_GRENADE, + ACT_RANGE_ATTACK_HMG1, + ACT_RANGE_ATTACK_ML, + ACT_RANGE_ATTACK_SMG1, + ACT_RANGE_ATTACK_SMG1_LOW, + ACT_RANGE_ATTACK_SMG2, + ACT_RANGE_ATTACK_SHOTGUN, + ACT_RANGE_ATTACK_SHOTGUN_LOW, + ACT_RANGE_ATTACK_PISTOL, + ACT_RANGE_ATTACK_PISTOL_LOW, + ACT_RANGE_ATTACK_SLAM, + ACT_RANGE_ATTACK_TRIPWIRE, + ACT_RANGE_ATTACK_THROW, + ACT_RANGE_ATTACK_SNIPER_RIFLE, + ACT_RANGE_ATTACK_RPG, + ACT_MELEE_ATTACK_SWING, + + ACT_RANGE_AIM_LOW, + ACT_RANGE_AIM_SMG1_LOW, + ACT_RANGE_AIM_PISTOL_LOW, + ACT_RANGE_AIM_AR2_LOW, + + ACT_COVER_PISTOL_LOW, + ACT_COVER_SMG1_LOW, + + // weapon override activities + ACT_GESTURE_RANGE_ATTACK_AR1, + ACT_GESTURE_RANGE_ATTACK_AR2, + ACT_GESTURE_RANGE_ATTACK_AR2_GRENADE, + ACT_GESTURE_RANGE_ATTACK_HMG1, + ACT_GESTURE_RANGE_ATTACK_ML, + ACT_GESTURE_RANGE_ATTACK_SMG1, + ACT_GESTURE_RANGE_ATTACK_SMG1_LOW, + ACT_GESTURE_RANGE_ATTACK_SMG2, + ACT_GESTURE_RANGE_ATTACK_SHOTGUN, + ACT_GESTURE_RANGE_ATTACK_PISTOL, + ACT_GESTURE_RANGE_ATTACK_PISTOL_LOW, + ACT_GESTURE_RANGE_ATTACK_SLAM, + ACT_GESTURE_RANGE_ATTACK_TRIPWIRE, + ACT_GESTURE_RANGE_ATTACK_THROW, + ACT_GESTURE_RANGE_ATTACK_SNIPER_RIFLE, + ACT_GESTURE_MELEE_ATTACK_SWING, + + ACT_IDLE_RIFLE, + ACT_IDLE_SMG1, + ACT_IDLE_ANGRY_SMG1, + ACT_IDLE_PISTOL, + ACT_IDLE_ANGRY_PISTOL, + ACT_IDLE_ANGRY_SHOTGUN, + ACT_IDLE_STEALTH_PISTOL, + + ACT_IDLE_PACKAGE, + ACT_WALK_PACKAGE, + ACT_IDLE_SUITCASE, + ACT_WALK_SUITCASE, + + ACT_IDLE_SMG1_RELAXED, + ACT_IDLE_SMG1_STIMULATED, + ACT_WALK_RIFLE_RELAXED, + ACT_RUN_RIFLE_RELAXED, + ACT_WALK_RIFLE_STIMULATED, + ACT_RUN_RIFLE_STIMULATED, + + ACT_IDLE_AIM_RIFLE_STIMULATED, + ACT_WALK_AIM_RIFLE_STIMULATED, + ACT_RUN_AIM_RIFLE_STIMULATED, + + ACT_IDLE_SHOTGUN_RELAXED, + ACT_IDLE_SHOTGUN_STIMULATED, + ACT_IDLE_SHOTGUN_AGITATED, + + // Policing activities + ACT_WALK_ANGRY, + ACT_POLICE_HARASS1, + ACT_POLICE_HARASS2, + + // Manned guns + ACT_IDLE_MANNEDGUN, + + // Melee weapon + ACT_IDLE_MELEE, + ACT_IDLE_ANGRY_MELEE, + + // RPG activities + ACT_IDLE_RPG_RELAXED, + ACT_IDLE_RPG, + ACT_IDLE_ANGRY_RPG, + ACT_COVER_LOW_RPG, + ACT_WALK_RPG, + ACT_RUN_RPG, + ACT_WALK_CROUCH_RPG, + ACT_RUN_CROUCH_RPG, + ACT_WALK_RPG_RELAXED, + ACT_RUN_RPG_RELAXED, + + ACT_WALK_RIFLE, + ACT_WALK_AIM_RIFLE, + ACT_WALK_CROUCH_RIFLE, + ACT_WALK_CROUCH_AIM_RIFLE, + ACT_RUN_RIFLE, + ACT_RUN_AIM_RIFLE, + ACT_RUN_CROUCH_RIFLE, + ACT_RUN_CROUCH_AIM_RIFLE, + ACT_RUN_STEALTH_PISTOL, + + ACT_WALK_AIM_SHOTGUN, + ACT_RUN_AIM_SHOTGUN, + + ACT_WALK_PISTOL, + ACT_RUN_PISTOL, + ACT_WALK_AIM_PISTOL, + ACT_RUN_AIM_PISTOL, + ACT_WALK_STEALTH_PISTOL, + ACT_WALK_AIM_STEALTH_PISTOL, + ACT_RUN_AIM_STEALTH_PISTOL, + + // Reloads + ACT_RELOAD_PISTOL, + ACT_RELOAD_PISTOL_LOW, + ACT_RELOAD_SMG1, + ACT_RELOAD_SMG1_LOW, + ACT_RELOAD_SHOTGUN, + ACT_RELOAD_SHOTGUN_LOW, + + ACT_GESTURE_RELOAD, + ACT_GESTURE_RELOAD_PISTOL, + ACT_GESTURE_RELOAD_SMG1, + ACT_GESTURE_RELOAD_SHOTGUN, + + // Busy animations + ACT_BUSY_LEAN_LEFT, + ACT_BUSY_LEAN_LEFT_ENTRY, + ACT_BUSY_LEAN_LEFT_EXIT, + ACT_BUSY_LEAN_BACK, + ACT_BUSY_LEAN_BACK_ENTRY, + ACT_BUSY_LEAN_BACK_EXIT, + ACT_BUSY_SIT_GROUND, + ACT_BUSY_SIT_GROUND_ENTRY, + ACT_BUSY_SIT_GROUND_EXIT, + ACT_BUSY_SIT_CHAIR, + ACT_BUSY_SIT_CHAIR_ENTRY, + ACT_BUSY_SIT_CHAIR_EXIT, + ACT_BUSY_STAND, + ACT_BUSY_QUEUE, + + // Dodge animations + ACT_DUCK_DODGE, + + // For NPCs being lifted/eaten by barnacles: + // being swallowed by a barnacle + ACT_DIE_BARNACLE_SWALLOW, + // being lifted by a barnacle + ACT_GESTURE_BARNACLE_STRANGLE, + + ACT_PHYSCANNON_DETACH, // An activity to be played if we're picking this up with the physcannon + ACT_PHYSCANNON_ANIMATE, // An activity to be played by an object being picked up with the physcannon, but has different behavior to DETACH + ACT_PHYSCANNON_ANIMATE_PRE, // An activity to be played by an object being picked up with the physcannon, before playing the ACT_PHYSCANNON_ANIMATE + ACT_PHYSCANNON_ANIMATE_POST,// An activity to be played by an object being picked up with the physcannon, after playing the ACT_PHYSCANNON_ANIMATE + + ACT_DIE_FRONTSIDE, + ACT_DIE_RIGHTSIDE, + ACT_DIE_BACKSIDE, + ACT_DIE_LEFTSIDE, + + ACT_OPEN_DOOR, + + // Dynamic interactions + ACT_DI_ALYX_ZOMBIE_MELEE, + ACT_DI_ALYX_ZOMBIE_TORSO_MELEE, + ACT_DI_ALYX_HEADCRAB_MELEE, + ACT_DI_ALYX_ANTLION, + + ACT_DI_ALYX_ZOMBIE_SHOTGUN64, + ACT_DI_ALYX_ZOMBIE_SHOTGUN26, + + ACT_READINESS_RELAXED_TO_STIMULATED, + ACT_READINESS_RELAXED_TO_STIMULATED_WALK, + ACT_READINESS_AGITATED_TO_STIMULATED, + ACT_READINESS_STIMULATED_TO_RELAXED, + + ACT_READINESS_PISTOL_RELAXED_TO_STIMULATED, + ACT_READINESS_PISTOL_RELAXED_TO_STIMULATED_WALK, + ACT_READINESS_PISTOL_AGITATED_TO_STIMULATED, + ACT_READINESS_PISTOL_STIMULATED_TO_RELAXED, + + ACT_IDLE_CARRY, + ACT_WALK_CARRY, + +//=========================== +// TF2 Specific Activities +//=========================== + ACT_STARTDYING, + ACT_DYINGLOOP, + ACT_DYINGTODEAD, + + ACT_RIDE_MANNED_GUN, + + // All viewmodels + ACT_VM_SPRINT_ENTER, + ACT_VM_SPRINT_IDLE, + ACT_VM_SPRINT_LEAVE, + + // Looping weapon firing + ACT_FIRE_START, + ACT_FIRE_LOOP, + ACT_FIRE_END, + + ACT_CROUCHING_GRENADEIDLE, + ACT_CROUCHING_GRENADEREADY, + ACT_CROUCHING_PRIMARYATTACK, + ACT_OVERLAY_GRENADEIDLE, + ACT_OVERLAY_GRENADEREADY, + ACT_OVERLAY_PRIMARYATTACK, + ACT_OVERLAY_SHIELD_UP, + ACT_OVERLAY_SHIELD_DOWN, + ACT_OVERLAY_SHIELD_UP_IDLE, + ACT_OVERLAY_SHIELD_ATTACK, + ACT_OVERLAY_SHIELD_KNOCKBACK, + ACT_SHIELD_UP, + ACT_SHIELD_DOWN, + ACT_SHIELD_UP_IDLE, + ACT_SHIELD_ATTACK, + ACT_SHIELD_KNOCKBACK, + ACT_CROUCHING_SHIELD_UP, + ACT_CROUCHING_SHIELD_DOWN, + ACT_CROUCHING_SHIELD_UP_IDLE, + ACT_CROUCHING_SHIELD_ATTACK, + ACT_CROUCHING_SHIELD_KNOCKBACK, + + // turning in place + ACT_TURNRIGHT45, + ACT_TURNLEFT45, + + ACT_TURN, + + ACT_OBJ_ASSEMBLING, + ACT_OBJ_DISMANTLING, + ACT_OBJ_STARTUP, + ACT_OBJ_RUNNING, + ACT_OBJ_IDLE, + ACT_OBJ_PLACING, + ACT_OBJ_DETERIORATING, + ACT_OBJ_UPGRADING, + + // Deploy + ACT_DEPLOY, + ACT_DEPLOY_IDLE, + ACT_UNDEPLOY, + +//=========================== +// HL1 Specific Activities +//=========================== + // Grenades + ACT_GRENADE_ROLL, + ACT_GRENADE_TOSS, + + // Hand grenade + ACT_HANDGRENADE_THROW1, + ACT_HANDGRENADE_THROW2, + ACT_HANDGRENADE_THROW3, + + // Shotgun + ACT_SHOTGUN_IDLE_DEEP, + ACT_SHOTGUN_IDLE4, + + // Glock + ACT_GLOCK_SHOOTEMPTY, + ACT_GLOCK_SHOOT_RELOAD, + + // RPG + ACT_RPG_DRAW_UNLOADED, + ACT_RPG_HOLSTER_UNLOADED, + ACT_RPG_IDLE_UNLOADED, + ACT_RPG_FIDGET_UNLOADED, + + // Crossbow + ACT_CROSSBOW_DRAW_UNLOADED, + ACT_CROSSBOW_IDLE_UNLOADED, + ACT_CROSSBOW_FIDGET_UNLOADED, + + // Gauss + ACT_GAUSS_SPINUP, + ACT_GAUSS_SPINCYCLE, + + // Tripmine + ACT_TRIPMINE_GROUND, + ACT_TRIPMINE_WORLD, + +//=========================== +// CSPort Specific Activities +//=========================== + + ACT_VM_PRIMARYATTACK_SILENCED, // fire + ACT_VM_RELOAD_SILENCED, + ACT_VM_DRYFIRE_SILENCED, // fire with no ammo loaded. + ACT_VM_IDLE_SILENCED, + ACT_VM_DRAW_SILENCED, + ACT_VM_IDLE_EMPTY_LEFT, + ACT_VM_DRYFIRE_LEFT, + + ACT_PLAYER_IDLE_FIRE, + ACT_PLAYER_CROUCH_FIRE, + ACT_PLAYER_CROUCH_WALK_FIRE, + ACT_PLAYER_WALK_FIRE, + ACT_PLAYER_RUN_FIRE, + + ACT_IDLETORUN, + ACT_RUNTOIDLE, + + +//=========================== +// DoD Specific Activities +//=========================== + ACT_SPRINT, + + ACT_GET_DOWN_STAND, + ACT_GET_UP_STAND, + ACT_GET_DOWN_CROUCH, + ACT_GET_UP_CROUCH, + ACT_PRONE_FORWARD, + ACT_PRONE_IDLE, + + ACT_DEEPIDLE1, + ACT_DEEPIDLE2, + ACT_DEEPIDLE3, + ACT_DEEPIDLE4, + + ACT_VM_RELOAD_DEPLOYED, + ACT_VM_RELOAD_IDLE, + + ACT_VM_DRAW_DEPLOYED, + + //Weapon is empty activities + ACT_VM_DRAW_EMPTY, + ACT_VM_PRIMARYATTACK_EMPTY, + ACT_VM_RELOAD_EMPTY, + ACT_VM_IDLE_EMPTY, + ACT_VM_IDLE_DEPLOYED_EMPTY, + + ACT_VM_IDLE_8, + ACT_VM_IDLE_7, + ACT_VM_IDLE_6, + ACT_VM_IDLE_5, + ACT_VM_IDLE_4, + ACT_VM_IDLE_3, + ACT_VM_IDLE_2, + ACT_VM_IDLE_1, + + ACT_VM_IDLE_DEPLOYED, + ACT_VM_IDLE_DEPLOYED_8, + ACT_VM_IDLE_DEPLOYED_7, + ACT_VM_IDLE_DEPLOYED_6, + ACT_VM_IDLE_DEPLOYED_5, + ACT_VM_IDLE_DEPLOYED_4, + ACT_VM_IDLE_DEPLOYED_3, + ACT_VM_IDLE_DEPLOYED_2, + ACT_VM_IDLE_DEPLOYED_1, + + // Animation from prone idle to standing/crouch idle. Number designates bullets left + ACT_VM_UNDEPLOY, + ACT_VM_UNDEPLOY_8, + ACT_VM_UNDEPLOY_7, + ACT_VM_UNDEPLOY_6, + ACT_VM_UNDEPLOY_5, + ACT_VM_UNDEPLOY_4, + ACT_VM_UNDEPLOY_3, + ACT_VM_UNDEPLOY_2, + ACT_VM_UNDEPLOY_1, + ACT_VM_UNDEPLOY_EMPTY, + + // Animation from standing/crouch idle to prone idle. Number designates bullets left + ACT_VM_DEPLOY, + ACT_VM_DEPLOY_8, + ACT_VM_DEPLOY_7, + ACT_VM_DEPLOY_6, + ACT_VM_DEPLOY_5, + ACT_VM_DEPLOY_4, + ACT_VM_DEPLOY_3, + ACT_VM_DEPLOY_2, + ACT_VM_DEPLOY_1, + ACT_VM_DEPLOY_EMPTY, + + // Shooting animations for standing/crouch position. Number designates bullets left at START of animation + ACT_VM_PRIMARYATTACK_8, + ACT_VM_PRIMARYATTACK_7, + ACT_VM_PRIMARYATTACK_6, + ACT_VM_PRIMARYATTACK_5, + ACT_VM_PRIMARYATTACK_4, + ACT_VM_PRIMARYATTACK_3, + ACT_VM_PRIMARYATTACK_2, + ACT_VM_PRIMARYATTACK_1, + + // Shooting animations for prone position. Number designates bullets left at START of animation + ACT_VM_PRIMARYATTACK_DEPLOYED, + ACT_VM_PRIMARYATTACK_DEPLOYED_8, + ACT_VM_PRIMARYATTACK_DEPLOYED_7, + ACT_VM_PRIMARYATTACK_DEPLOYED_6, + ACT_VM_PRIMARYATTACK_DEPLOYED_5, + ACT_VM_PRIMARYATTACK_DEPLOYED_4, + ACT_VM_PRIMARYATTACK_DEPLOYED_3, + ACT_VM_PRIMARYATTACK_DEPLOYED_2, + ACT_VM_PRIMARYATTACK_DEPLOYED_1, + ACT_VM_PRIMARYATTACK_DEPLOYED_EMPTY, + + // Player anim ACTs + ACT_DOD_DEPLOYED, + ACT_DOD_PRONE_DEPLOYED, + ACT_DOD_IDLE_ZOOMED, + ACT_DOD_WALK_ZOOMED, + ACT_DOD_CROUCH_ZOOMED, + ACT_DOD_CROUCHWALK_ZOOMED, + ACT_DOD_PRONE_ZOOMED, + ACT_DOD_PRONE_FORWARD_ZOOMED, + ACT_DOD_PRIMARYATTACK_DEPLOYED, + ACT_DOD_PRIMARYATTACK_PRONE_DEPLOYED, + ACT_DOD_RELOAD_DEPLOYED, + ACT_DOD_RELOAD_PRONE_DEPLOYED, + ACT_DOD_PRIMARYATTACK_PRONE, + ACT_DOD_SECONDARYATTACK_PRONE, + ACT_DOD_RELOAD_CROUCH, + ACT_DOD_RELOAD_PRONE, + ACT_DOD_STAND_IDLE, + ACT_DOD_STAND_AIM, + ACT_DOD_CROUCH_IDLE, + ACT_DOD_CROUCH_AIM, + ACT_DOD_CROUCHWALK_IDLE, + ACT_DOD_CROUCHWALK_AIM, + ACT_DOD_WALK_IDLE, + ACT_DOD_WALK_AIM, + ACT_DOD_RUN_IDLE, + ACT_DOD_RUN_AIM, + + // Positions + ACT_DOD_STAND_AIM_PISTOL, + ACT_DOD_CROUCH_AIM_PISTOL, + ACT_DOD_CROUCHWALK_AIM_PISTOL, + ACT_DOD_WALK_AIM_PISTOL, + ACT_DOD_RUN_AIM_PISTOL, + ACT_DOD_PRONE_AIM_PISTOL, + ACT_DOD_STAND_IDLE_PISTOL, + ACT_DOD_CROUCH_IDLE_PISTOL, + ACT_DOD_CROUCHWALK_IDLE_PISTOL, + ACT_DOD_WALK_IDLE_PISTOL, + ACT_DOD_RUN_IDLE_PISTOL, + ACT_DOD_SPRINT_IDLE_PISTOL, + ACT_DOD_PRONEWALK_IDLE_PISTOL, + + ACT_DOD_STAND_AIM_C96, + ACT_DOD_CROUCH_AIM_C96, + ACT_DOD_CROUCHWALK_AIM_C96, + ACT_DOD_WALK_AIM_C96, + ACT_DOD_RUN_AIM_C96, + ACT_DOD_PRONE_AIM_C96, + ACT_DOD_STAND_IDLE_C96, + ACT_DOD_CROUCH_IDLE_C96, + ACT_DOD_CROUCHWALK_IDLE_C96, + ACT_DOD_WALK_IDLE_C96, + ACT_DOD_RUN_IDLE_C96, + ACT_DOD_SPRINT_IDLE_C96, + ACT_DOD_PRONEWALK_IDLE_C96, + + ACT_DOD_STAND_AIM_RIFLE, + ACT_DOD_CROUCH_AIM_RIFLE, + ACT_DOD_CROUCHWALK_AIM_RIFLE, + ACT_DOD_WALK_AIM_RIFLE, + ACT_DOD_RUN_AIM_RIFLE, + ACT_DOD_PRONE_AIM_RIFLE, + ACT_DOD_STAND_IDLE_RIFLE, + ACT_DOD_CROUCH_IDLE_RIFLE, + ACT_DOD_CROUCHWALK_IDLE_RIFLE, + ACT_DOD_WALK_IDLE_RIFLE, + ACT_DOD_RUN_IDLE_RIFLE, + ACT_DOD_SPRINT_IDLE_RIFLE, + ACT_DOD_PRONEWALK_IDLE_RIFLE, + + ACT_DOD_STAND_AIM_BOLT, + ACT_DOD_CROUCH_AIM_BOLT, + ACT_DOD_CROUCHWALK_AIM_BOLT, + ACT_DOD_WALK_AIM_BOLT, + ACT_DOD_RUN_AIM_BOLT, + ACT_DOD_PRONE_AIM_BOLT, + ACT_DOD_STAND_IDLE_BOLT, + ACT_DOD_CROUCH_IDLE_BOLT, + ACT_DOD_CROUCHWALK_IDLE_BOLT, + ACT_DOD_WALK_IDLE_BOLT, + ACT_DOD_RUN_IDLE_BOLT, + ACT_DOD_SPRINT_IDLE_BOLT, + ACT_DOD_PRONEWALK_IDLE_BOLT, + + ACT_DOD_STAND_AIM_TOMMY, + ACT_DOD_CROUCH_AIM_TOMMY, + ACT_DOD_CROUCHWALK_AIM_TOMMY, + ACT_DOD_WALK_AIM_TOMMY, + ACT_DOD_RUN_AIM_TOMMY, + ACT_DOD_PRONE_AIM_TOMMY, + ACT_DOD_STAND_IDLE_TOMMY, + ACT_DOD_CROUCH_IDLE_TOMMY, + ACT_DOD_CROUCHWALK_IDLE_TOMMY, + ACT_DOD_WALK_IDLE_TOMMY, + ACT_DOD_RUN_IDLE_TOMMY, + ACT_DOD_SPRINT_IDLE_TOMMY, + ACT_DOD_PRONEWALK_IDLE_TOMMY, + + ACT_DOD_STAND_AIM_MP40, + ACT_DOD_CROUCH_AIM_MP40, + ACT_DOD_CROUCHWALK_AIM_MP40, + ACT_DOD_WALK_AIM_MP40, + ACT_DOD_RUN_AIM_MP40, + ACT_DOD_PRONE_AIM_MP40, + ACT_DOD_STAND_IDLE_MP40, + ACT_DOD_CROUCH_IDLE_MP40, + ACT_DOD_CROUCHWALK_IDLE_MP40, + ACT_DOD_WALK_IDLE_MP40, + ACT_DOD_RUN_IDLE_MP40, + ACT_DOD_SPRINT_IDLE_MP40, + ACT_DOD_PRONEWALK_IDLE_MP40, + + ACT_DOD_STAND_AIM_MP44, + ACT_DOD_CROUCH_AIM_MP44, + ACT_DOD_CROUCHWALK_AIM_MP44, + ACT_DOD_WALK_AIM_MP44, + ACT_DOD_RUN_AIM_MP44, + ACT_DOD_PRONE_AIM_MP44, + ACT_DOD_STAND_IDLE_MP44, + ACT_DOD_CROUCH_IDLE_MP44, + ACT_DOD_CROUCHWALK_IDLE_MP44, + ACT_DOD_WALK_IDLE_MP44, + ACT_DOD_RUN_IDLE_MP44, + ACT_DOD_SPRINT_IDLE_MP44, + ACT_DOD_PRONEWALK_IDLE_MP44, + + ACT_DOD_STAND_AIM_GREASE, + ACT_DOD_CROUCH_AIM_GREASE, + ACT_DOD_CROUCHWALK_AIM_GREASE, + ACT_DOD_WALK_AIM_GREASE, + ACT_DOD_RUN_AIM_GREASE, + ACT_DOD_PRONE_AIM_GREASE, + ACT_DOD_STAND_IDLE_GREASE, + ACT_DOD_CROUCH_IDLE_GREASE, + ACT_DOD_CROUCHWALK_IDLE_GREASE, + ACT_DOD_WALK_IDLE_GREASE, + ACT_DOD_RUN_IDLE_GREASE, + ACT_DOD_SPRINT_IDLE_GREASE, + ACT_DOD_PRONEWALK_IDLE_GREASE, + + ACT_DOD_STAND_AIM_MG, + ACT_DOD_CROUCH_AIM_MG, + ACT_DOD_CROUCHWALK_AIM_MG, + ACT_DOD_WALK_AIM_MG, + ACT_DOD_RUN_AIM_MG, + ACT_DOD_PRONE_AIM_MG, + ACT_DOD_STAND_IDLE_MG, + ACT_DOD_CROUCH_IDLE_MG, + ACT_DOD_CROUCHWALK_IDLE_MG, + ACT_DOD_WALK_IDLE_MG, + ACT_DOD_RUN_IDLE_MG, + ACT_DOD_SPRINT_IDLE_MG, + ACT_DOD_PRONEWALK_IDLE_MG, + + ACT_DOD_STAND_AIM_30CAL, + ACT_DOD_CROUCH_AIM_30CAL, + ACT_DOD_CROUCHWALK_AIM_30CAL, + ACT_DOD_WALK_AIM_30CAL, + ACT_DOD_RUN_AIM_30CAL, + ACT_DOD_PRONE_AIM_30CAL, + ACT_DOD_STAND_IDLE_30CAL, + ACT_DOD_CROUCH_IDLE_30CAL, + ACT_DOD_CROUCHWALK_IDLE_30CAL, + ACT_DOD_WALK_IDLE_30CAL, + ACT_DOD_RUN_IDLE_30CAL, + ACT_DOD_SPRINT_IDLE_30CAL, + ACT_DOD_PRONEWALK_IDLE_30CAL, + + ACT_DOD_STAND_AIM_GREN_FRAG, + ACT_DOD_CROUCH_AIM_GREN_FRAG, + ACT_DOD_CROUCHWALK_AIM_GREN_FRAG, + ACT_DOD_WALK_AIM_GREN_FRAG, + ACT_DOD_RUN_AIM_GREN_FRAG, + ACT_DOD_PRONE_AIM_GREN_FRAG, + ACT_DOD_SPRINT_AIM_GREN_FRAG, + ACT_DOD_PRONEWALK_AIM_GREN_FRAG, + ACT_DOD_STAND_AIM_GREN_STICK, + ACT_DOD_CROUCH_AIM_GREN_STICK, + ACT_DOD_CROUCHWALK_AIM_GREN_STICK, + ACT_DOD_WALK_AIM_GREN_STICK, + ACT_DOD_RUN_AIM_GREN_STICK, + ACT_DOD_PRONE_AIM_GREN_STICK, + ACT_DOD_SPRINT_AIM_GREN_STICK, + ACT_DOD_PRONEWALK_AIM_GREN_STICK, + + ACT_DOD_STAND_AIM_KNIFE, + ACT_DOD_CROUCH_AIM_KNIFE, + ACT_DOD_CROUCHWALK_AIM_KNIFE, + ACT_DOD_WALK_AIM_KNIFE, + ACT_DOD_RUN_AIM_KNIFE, + ACT_DOD_PRONE_AIM_KNIFE, + ACT_DOD_SPRINT_AIM_KNIFE, + ACT_DOD_PRONEWALK_AIM_KNIFE, + + ACT_DOD_STAND_AIM_SPADE, + ACT_DOD_CROUCH_AIM_SPADE, + ACT_DOD_CROUCHWALK_AIM_SPADE, + ACT_DOD_WALK_AIM_SPADE, + ACT_DOD_RUN_AIM_SPADE, + ACT_DOD_PRONE_AIM_SPADE, + ACT_DOD_SPRINT_AIM_SPADE, + ACT_DOD_PRONEWALK_AIM_SPADE, + + ACT_DOD_STAND_AIM_BAZOOKA, + ACT_DOD_CROUCH_AIM_BAZOOKA, + ACT_DOD_CROUCHWALK_AIM_BAZOOKA, + ACT_DOD_WALK_AIM_BAZOOKA, + ACT_DOD_RUN_AIM_BAZOOKA, + ACT_DOD_PRONE_AIM_BAZOOKA, + ACT_DOD_STAND_IDLE_BAZOOKA, + ACT_DOD_CROUCH_IDLE_BAZOOKA, + ACT_DOD_CROUCHWALK_IDLE_BAZOOKA, + ACT_DOD_WALK_IDLE_BAZOOKA, + ACT_DOD_RUN_IDLE_BAZOOKA, + ACT_DOD_SPRINT_IDLE_BAZOOKA, + ACT_DOD_PRONEWALK_IDLE_BAZOOKA, + + ACT_DOD_STAND_AIM_PSCHRECK, + ACT_DOD_CROUCH_AIM_PSCHRECK, + ACT_DOD_CROUCHWALK_AIM_PSCHRECK, + ACT_DOD_WALK_AIM_PSCHRECK, + ACT_DOD_RUN_AIM_PSCHRECK, + ACT_DOD_PRONE_AIM_PSCHRECK, + ACT_DOD_STAND_IDLE_PSCHRECK, + ACT_DOD_CROUCH_IDLE_PSCHRECK, + ACT_DOD_CROUCHWALK_IDLE_PSCHRECK, + ACT_DOD_WALK_IDLE_PSCHRECK, + ACT_DOD_RUN_IDLE_PSCHRECK, + ACT_DOD_SPRINT_IDLE_PSCHRECK, + ACT_DOD_PRONEWALK_IDLE_PSCHRECK, + + ACT_DOD_STAND_AIM_BAR, + ACT_DOD_CROUCH_AIM_BAR, + ACT_DOD_CROUCHWALK_AIM_BAR, + ACT_DOD_WALK_AIM_BAR, + ACT_DOD_RUN_AIM_BAR, + ACT_DOD_PRONE_AIM_BAR, + ACT_DOD_STAND_IDLE_BAR, + ACT_DOD_CROUCH_IDLE_BAR, + ACT_DOD_CROUCHWALK_IDLE_BAR, + ACT_DOD_WALK_IDLE_BAR, + ACT_DOD_RUN_IDLE_BAR, + ACT_DOD_SPRINT_IDLE_BAR, + ACT_DOD_PRONEWALK_IDLE_BAR, + + // Zoomed aims + ACT_DOD_STAND_ZOOM_RIFLE, + ACT_DOD_CROUCH_ZOOM_RIFLE, + ACT_DOD_CROUCHWALK_ZOOM_RIFLE, + ACT_DOD_WALK_ZOOM_RIFLE, + ACT_DOD_RUN_ZOOM_RIFLE, + ACT_DOD_PRONE_ZOOM_RIFLE, + + ACT_DOD_STAND_ZOOM_BOLT, + ACT_DOD_CROUCH_ZOOM_BOLT, + ACT_DOD_CROUCHWALK_ZOOM_BOLT, + ACT_DOD_WALK_ZOOM_BOLT, + ACT_DOD_RUN_ZOOM_BOLT, + ACT_DOD_PRONE_ZOOM_BOLT, + + ACT_DOD_STAND_ZOOM_BAZOOKA, + ACT_DOD_CROUCH_ZOOM_BAZOOKA, + ACT_DOD_CROUCHWALK_ZOOM_BAZOOKA, + ACT_DOD_WALK_ZOOM_BAZOOKA, + ACT_DOD_RUN_ZOOM_BAZOOKA, + ACT_DOD_PRONE_ZOOM_BAZOOKA, + + ACT_DOD_STAND_ZOOM_PSCHRECK, + ACT_DOD_CROUCH_ZOOM_PSCHRECK, + ACT_DOD_CROUCHWALK_ZOOM_PSCHRECK, + ACT_DOD_WALK_ZOOM_PSCHRECK, + ACT_DOD_RUN_ZOOM_PSCHRECK, + ACT_DOD_PRONE_ZOOM_PSCHRECK, + + // Deployed Aim + ACT_DOD_DEPLOY_RIFLE, + ACT_DOD_DEPLOY_TOMMY, + ACT_DOD_DEPLOY_MG, + ACT_DOD_DEPLOY_30CAL, + + // Prone Deployed Aim + ACT_DOD_PRONE_DEPLOY_RIFLE , + ACT_DOD_PRONE_DEPLOY_TOMMY, + ACT_DOD_PRONE_DEPLOY_MG, + ACT_DOD_PRONE_DEPLOY_30CAL, + + // Attacks + + // Rifle + ACT_DOD_PRIMARYATTACK_RIFLE, + ACT_DOD_SECONDARYATTACK_RIFLE, + ACT_DOD_PRIMARYATTACK_PRONE_RIFLE, + ACT_DOD_SECONDARYATTACK_PRONE_RIFLE, + ACT_DOD_PRIMARYATTACK_PRONE_DEPLOYED_RIFLE, + ACT_DOD_PRIMARYATTACK_DEPLOYED_RIFLE, + + // Bolt + ACT_DOD_PRIMARYATTACK_BOLT, + ACT_DOD_SECONDARYATTACK_BOLT, + ACT_DOD_PRIMARYATTACK_PRONE_BOLT , + ACT_DOD_SECONDARYATTACK_PRONE_BOLT , + + // Tommy + ACT_DOD_PRIMARYATTACK_TOMMY, + ACT_DOD_PRIMARYATTACK_PRONE_TOMMY, + ACT_DOD_SECONDARYATTACK_TOMMY, + ACT_DOD_SECONDARYATTACK_PRONE_TOMMY, + + // MP40 + ACT_DOD_PRIMARYATTACK_MP40, + ACT_DOD_PRIMARYATTACK_PRONE_MP40 , + ACT_DOD_SECONDARYATTACK_MP40, + ACT_DOD_SECONDARYATTACK_PRONE_MP40 , + + // MP44 + ACT_DOD_PRIMARYATTACK_MP44, + ACT_DOD_PRIMARYATTACK_PRONE_MP44 , + + // Greasegun + ACT_DOD_PRIMARYATTACK_GREASE, + ACT_DOD_PRIMARYATTACK_PRONE_GREASE , + + // Pistols (Colt, Luger) + ACT_DOD_PRIMARYATTACK_PISTOL, + ACT_DOD_PRIMARYATTACK_PRONE_PISTOL , + ACT_DOD_PRIMARYATTACK_C96, + ACT_DOD_PRIMARYATTACK_PRONE_C96, + + // Mgs (mg42, mg34) + ACT_DOD_PRIMARYATTACK_MG, + ACT_DOD_PRIMARYATTACK_PRONE_MG , + ACT_DOD_PRIMARYATTACK_PRONE_DEPLOYED_MG , + ACT_DOD_PRIMARYATTACK_DEPLOYED_MG , + + // 30cal + ACT_DOD_PRIMARYATTACK_30CAL, + ACT_DOD_PRIMARYATTACK_PRONE_30CAL, + ACT_DOD_PRIMARYATTACK_DEPLOYED_30CAL, + ACT_DOD_PRIMARYATTACK_PRONE_DEPLOYED_30CAL , + + // Grenades + ACT_DOD_PRIMARYATTACK_GREN_FRAG, + ACT_DOD_PRIMARYATTACK_PRONE_GREN_FRAG, + ACT_DOD_PRIMARYATTACK_GREN_STICK, + ACT_DOD_PRIMARYATTACK_PRONE_GREN_STICK, + + // Knife + ACT_DOD_PRIMARYATTACK_KNIFE, + ACT_DOD_PRIMARYATTACK_PRONE_KNIFE, + + // Spade + ACT_DOD_PRIMARYATTACK_SPADE, + ACT_DOD_PRIMARYATTACK_PRONE_SPADE, + + // Bazooka + ACT_DOD_PRIMARYATTACK_BAZOOKA, + ACT_DOD_PRIMARYATTACK_PRONE_BAZOOKA, + + // Pschreck + ACT_DOD_PRIMARYATTACK_PSCHRECK, + ACT_DOD_PRIMARYATTACK_PRONE_PSCHRECK , + + // Bar + ACT_DOD_PRIMARYATTACK_BAR, + ACT_DOD_PRIMARYATTACK_PRONE_BAR, + + // Reloads + ACT_DOD_RELOAD_GARAND, + ACT_DOD_RELOAD_K43, + ACT_DOD_RELOAD_BAR, + ACT_DOD_RELOAD_MP40, + ACT_DOD_RELOAD_MP44, + ACT_DOD_RELOAD_BOLT, + ACT_DOD_RELOAD_M1CARBINE, + ACT_DOD_RELOAD_TOMMY, + ACT_DOD_RELOAD_GREASEGUN, + ACT_DOD_RELOAD_PISTOL, + ACT_DOD_RELOAD_FG42, + ACT_DOD_RELOAD_RIFLE, + ACT_DOD_RELOAD_RIFLEGRENADE, + ACT_DOD_RELOAD_C96, + + // Crouch + ACT_DOD_RELOAD_CROUCH_BAR, + ACT_DOD_RELOAD_CROUCH_RIFLE, + ACT_DOD_RELOAD_CROUCH_RIFLEGRENADE, + ACT_DOD_RELOAD_CROUCH_BOLT, + ACT_DOD_RELOAD_CROUCH_MP44, + ACT_DOD_RELOAD_CROUCH_MP40, + ACT_DOD_RELOAD_CROUCH_TOMMY, + ACT_DOD_RELOAD_CROUCH_BAZOOKA, + ACT_DOD_RELOAD_CROUCH_PSCHRECK, + ACT_DOD_RELOAD_CROUCH_PISTOL, + ACT_DOD_RELOAD_CROUCH_M1CARBINE, + ACT_DOD_RELOAD_CROUCH_C96, + + // Bazookas + ACT_DOD_RELOAD_BAZOOKA, + ACT_DOD_ZOOMLOAD_BAZOOKA, + ACT_DOD_RELOAD_PSCHRECK, + ACT_DOD_ZOOMLOAD_PSCHRECK, + + // Deployed + ACT_DOD_RELOAD_DEPLOYED_FG42, + ACT_DOD_RELOAD_DEPLOYED_30CAL, + ACT_DOD_RELOAD_DEPLOYED_MG, + ACT_DOD_RELOAD_DEPLOYED_MG34, + ACT_DOD_RELOAD_DEPLOYED_BAR, + + // Prone + ACT_DOD_RELOAD_PRONE_PISTOL, + ACT_DOD_RELOAD_PRONE_GARAND, + ACT_DOD_RELOAD_PRONE_M1CARBINE, + ACT_DOD_RELOAD_PRONE_BOLT, + ACT_DOD_RELOAD_PRONE_K43, + ACT_DOD_RELOAD_PRONE_MP40, + ACT_DOD_RELOAD_PRONE_MP44, + ACT_DOD_RELOAD_PRONE_BAR, + ACT_DOD_RELOAD_PRONE_GREASEGUN, + ACT_DOD_RELOAD_PRONE_TOMMY, + ACT_DOD_RELOAD_PRONE_FG42, + ACT_DOD_RELOAD_PRONE_RIFLE, + ACT_DOD_RELOAD_PRONE_RIFLEGRENADE, + ACT_DOD_RELOAD_PRONE_C96, + + // Prone bazooka + ACT_DOD_RELOAD_PRONE_BAZOOKA, + ACT_DOD_ZOOMLOAD_PRONE_BAZOOKA, + ACT_DOD_RELOAD_PRONE_PSCHRECK, + ACT_DOD_ZOOMLOAD_PRONE_PSCHRECK, + + // Prone deployed + ACT_DOD_RELOAD_PRONE_DEPLOYED_BAR, + ACT_DOD_RELOAD_PRONE_DEPLOYED_FG42, + ACT_DOD_RELOAD_PRONE_DEPLOYED_30CAL, + ACT_DOD_RELOAD_PRONE_DEPLOYED_MG, + ACT_DOD_RELOAD_PRONE_DEPLOYED_MG34, + + // Prone zoomed aim + ACT_DOD_PRONE_ZOOM_FORWARD_RIFLE, + ACT_DOD_PRONE_ZOOM_FORWARD_BOLT, + ACT_DOD_PRONE_ZOOM_FORWARD_BAZOOKA, + ACT_DOD_PRONE_ZOOM_FORWARD_PSCHRECK, + + // Crouch attack + ACT_DOD_PRIMARYATTACK_CROUCH, + ACT_DOD_PRIMARYATTACK_CROUCH_SPADE, + ACT_DOD_PRIMARYATTACK_CROUCH_KNIFE, + ACT_DOD_PRIMARYATTACK_CROUCH_GREN_FRAG, + ACT_DOD_PRIMARYATTACK_CROUCH_GREN_STICK, + ACT_DOD_SECONDARYATTACK_CROUCH, + ACT_DOD_SECONDARYATTACK_CROUCH_TOMMY, + ACT_DOD_SECONDARYATTACK_CROUCH_MP40, + + // Hand Signals + ACT_DOD_HS_IDLE, + ACT_DOD_HS_CROUCH, + ACT_DOD_HS_IDLE_30CAL, + ACT_DOD_HS_IDLE_BAZOOKA, + ACT_DOD_HS_IDLE_PSCHRECK, + ACT_DOD_HS_IDLE_KNIFE, + ACT_DOD_HS_IDLE_MG42, + ACT_DOD_HS_IDLE_PISTOL, + ACT_DOD_HS_IDLE_STICKGRENADE, + ACT_DOD_HS_IDLE_TOMMY, + ACT_DOD_HS_IDLE_MP44, + ACT_DOD_HS_IDLE_K98, + ACT_DOD_HS_CROUCH_30CAL, + ACT_DOD_HS_CROUCH_BAZOOKA, + ACT_DOD_HS_CROUCH_PSCHRECK, + ACT_DOD_HS_CROUCH_KNIFE, + ACT_DOD_HS_CROUCH_MG42, + ACT_DOD_HS_CROUCH_PISTOL, + ACT_DOD_HS_CROUCH_STICKGRENADE, + ACT_DOD_HS_CROUCH_TOMMY, + ACT_DOD_HS_CROUCH_MP44, + ACT_DOD_HS_CROUCH_K98, + + ACT_DOD_STAND_IDLE_TNT, + ACT_DOD_CROUCH_IDLE_TNT, + ACT_DOD_CROUCHWALK_IDLE_TNT, + ACT_DOD_WALK_IDLE_TNT, + ACT_DOD_RUN_IDLE_TNT, + ACT_DOD_SPRINT_IDLE_TNT, + ACT_DOD_PRONEWALK_IDLE_TNT, + + ACT_DOD_PLANT_TNT, + ACT_DOD_DEFUSE_TNT, + +// HL2MP + ACT_HL2MP_IDLE, + ACT_HL2MP_RUN, + ACT_HL2MP_IDLE_CROUCH, + ACT_HL2MP_WALK_CROUCH, + ACT_HL2MP_GESTURE_RANGE_ATTACK, + ACT_HL2MP_GESTURE_RELOAD, + ACT_HL2MP_JUMP, + + ACT_HL2MP_IDLE_PISTOL, + ACT_HL2MP_RUN_PISTOL, + ACT_HL2MP_IDLE_CROUCH_PISTOL, + ACT_HL2MP_WALK_CROUCH_PISTOL, + ACT_HL2MP_GESTURE_RANGE_ATTACK_PISTOL, + ACT_HL2MP_GESTURE_RELOAD_PISTOL, + ACT_HL2MP_JUMP_PISTOL, + + ACT_HL2MP_IDLE_SMG1, + ACT_HL2MP_RUN_SMG1, + ACT_HL2MP_IDLE_CROUCH_SMG1, + ACT_HL2MP_WALK_CROUCH_SMG1, + ACT_HL2MP_GESTURE_RANGE_ATTACK_SMG1, + ACT_HL2MP_GESTURE_RELOAD_SMG1, + ACT_HL2MP_JUMP_SMG1, + + ACT_HL2MP_IDLE_AR2, + ACT_HL2MP_RUN_AR2, + ACT_HL2MP_IDLE_CROUCH_AR2, + ACT_HL2MP_WALK_CROUCH_AR2, + ACT_HL2MP_GESTURE_RANGE_ATTACK_AR2, + ACT_HL2MP_GESTURE_RELOAD_AR2, + ACT_HL2MP_JUMP_AR2, + + ACT_HL2MP_IDLE_SHOTGUN, + ACT_HL2MP_RUN_SHOTGUN, + ACT_HL2MP_IDLE_CROUCH_SHOTGUN, + ACT_HL2MP_WALK_CROUCH_SHOTGUN, + ACT_HL2MP_GESTURE_RANGE_ATTACK_SHOTGUN, + ACT_HL2MP_GESTURE_RELOAD_SHOTGUN, + ACT_HL2MP_JUMP_SHOTGUN, + + ACT_HL2MP_IDLE_RPG, + ACT_HL2MP_RUN_RPG, + ACT_HL2MP_IDLE_CROUCH_RPG, + ACT_HL2MP_WALK_CROUCH_RPG, + ACT_HL2MP_GESTURE_RANGE_ATTACK_RPG, + ACT_HL2MP_GESTURE_RELOAD_RPG, + ACT_HL2MP_JUMP_RPG, + + ACT_HL2MP_IDLE_GRENADE, + ACT_HL2MP_RUN_GRENADE, + ACT_HL2MP_IDLE_CROUCH_GRENADE, + ACT_HL2MP_WALK_CROUCH_GRENADE, + ACT_HL2MP_GESTURE_RANGE_ATTACK_GRENADE, + ACT_HL2MP_GESTURE_RELOAD_GRENADE, + ACT_HL2MP_JUMP_GRENADE, + + ACT_HL2MP_IDLE_PHYSGUN, + ACT_HL2MP_RUN_PHYSGUN, + ACT_HL2MP_IDLE_CROUCH_PHYSGUN, + ACT_HL2MP_WALK_CROUCH_PHYSGUN, + ACT_HL2MP_GESTURE_RANGE_ATTACK_PHYSGUN, + ACT_HL2MP_GESTURE_RELOAD_PHYSGUN, + ACT_HL2MP_JUMP_PHYSGUN, + + ACT_HL2MP_IDLE_CROSSBOW, + ACT_HL2MP_RUN_CROSSBOW, + ACT_HL2MP_IDLE_CROUCH_CROSSBOW, + ACT_HL2MP_WALK_CROUCH_CROSSBOW, + ACT_HL2MP_GESTURE_RANGE_ATTACK_CROSSBOW, + ACT_HL2MP_GESTURE_RELOAD_CROSSBOW, + ACT_HL2MP_JUMP_CROSSBOW, + + ACT_HL2MP_IDLE_MELEE, + ACT_HL2MP_RUN_MELEE, + ACT_HL2MP_IDLE_CROUCH_MELEE, + ACT_HL2MP_WALK_CROUCH_MELEE, + ACT_HL2MP_GESTURE_RANGE_ATTACK_MELEE, + ACT_HL2MP_GESTURE_RELOAD_MELEE, + ACT_HL2MP_JUMP_MELEE, + + ACT_HL2MP_IDLE_SLAM, + ACT_HL2MP_RUN_SLAM, + ACT_HL2MP_IDLE_CROUCH_SLAM, + ACT_HL2MP_WALK_CROUCH_SLAM, + ACT_HL2MP_GESTURE_RANGE_ATTACK_SLAM, + ACT_HL2MP_GESTURE_RELOAD_SLAM, + ACT_HL2MP_JUMP_SLAM, + +// Portal! + ACT_VM_FIZZLE, + + // Multiplayer + ACT_MP_STAND_IDLE, + ACT_MP_CROUCH_IDLE, + ACT_MP_CROUCH_DEPLOYED_IDLE, + ACT_MP_CROUCH_DEPLOYED, + ACT_MP_CROUCHWALK_DEPLOYED, + ACT_MP_DEPLOYED_IDLE, + ACT_MP_RUN, + ACT_MP_WALK, + ACT_MP_AIRWALK, + ACT_MP_CROUCHWALK, + ACT_MP_SPRINT, + ACT_MP_JUMP, + ACT_MP_JUMP_START, + ACT_MP_JUMP_FLOAT, + ACT_MP_JUMP_LAND, + ACT_MP_DOUBLEJUMP, + ACT_MP_SWIM, + ACT_MP_DEPLOYED, + ACT_MP_SWIM_DEPLOYED, + ACT_MP_VCD, + + ACT_MP_ATTACK_STAND_PRIMARYFIRE, + ACT_MP_ATTACK_STAND_PRIMARYFIRE_DEPLOYED, + ACT_MP_ATTACK_STAND_SECONDARYFIRE, + ACT_MP_ATTACK_STAND_GRENADE, + ACT_MP_ATTACK_CROUCH_PRIMARYFIRE, + ACT_MP_ATTACK_CROUCH_PRIMARYFIRE_DEPLOYED, + ACT_MP_ATTACK_CROUCH_SECONDARYFIRE, + ACT_MP_ATTACK_CROUCH_GRENADE, + ACT_MP_ATTACK_SWIM_PRIMARYFIRE, + ACT_MP_ATTACK_SWIM_SECONDARYFIRE, + ACT_MP_ATTACK_SWIM_GRENADE, + ACT_MP_ATTACK_AIRWALK_PRIMARYFIRE, + ACT_MP_ATTACK_AIRWALK_SECONDARYFIRE, + ACT_MP_ATTACK_AIRWALK_GRENADE, + ACT_MP_RELOAD_STAND, + ACT_MP_RELOAD_STAND_LOOP, + ACT_MP_RELOAD_STAND_END, + ACT_MP_RELOAD_CROUCH, + ACT_MP_RELOAD_CROUCH_LOOP, + ACT_MP_RELOAD_CROUCH_END, + ACT_MP_RELOAD_SWIM, + ACT_MP_RELOAD_SWIM_LOOP, + ACT_MP_RELOAD_SWIM_END, + ACT_MP_RELOAD_AIRWALK, + ACT_MP_RELOAD_AIRWALK_LOOP, + ACT_MP_RELOAD_AIRWALK_END, + ACT_MP_ATTACK_STAND_PREFIRE, + ACT_MP_ATTACK_STAND_POSTFIRE, + ACT_MP_ATTACK_STAND_STARTFIRE, + ACT_MP_ATTACK_CROUCH_PREFIRE, + ACT_MP_ATTACK_CROUCH_POSTFIRE, + ACT_MP_ATTACK_SWIM_PREFIRE, + ACT_MP_ATTACK_SWIM_POSTFIRE, + + // Multiplayer - Primary + ACT_MP_STAND_PRIMARY, + ACT_MP_CROUCH_PRIMARY, + ACT_MP_RUN_PRIMARY, + ACT_MP_WALK_PRIMARY, + ACT_MP_AIRWALK_PRIMARY, + ACT_MP_CROUCHWALK_PRIMARY, + ACT_MP_JUMP_PRIMARY, + ACT_MP_JUMP_START_PRIMARY, + ACT_MP_JUMP_FLOAT_PRIMARY, + ACT_MP_JUMP_LAND_PRIMARY, + ACT_MP_SWIM_PRIMARY, + ACT_MP_DEPLOYED_PRIMARY, + ACT_MP_SWIM_DEPLOYED_PRIMARY, + ACT_MP_CROUCHWALK_DEPLOYED_PRIMARY, + ACT_MP_CROUCH_DEPLOYED_IDLE_PRIMARY, + + ACT_MP_ATTACK_STAND_PRIMARY, // RUN, WALK + ACT_MP_ATTACK_STAND_PRIMARY_DEPLOYED, + ACT_MP_ATTACK_CROUCH_PRIMARY, // CROUCHWALK + ACT_MP_ATTACK_CROUCH_PRIMARY_DEPLOYED, + ACT_MP_ATTACK_SWIM_PRIMARY, + ACT_MP_ATTACK_AIRWALK_PRIMARY, + + ACT_MP_RELOAD_STAND_PRIMARY, // RUN, WALK + ACT_MP_RELOAD_STAND_PRIMARY_LOOP, + ACT_MP_RELOAD_STAND_PRIMARY_END, + ACT_MP_RELOAD_CROUCH_PRIMARY, // CROUCHWALK + ACT_MP_RELOAD_CROUCH_PRIMARY_LOOP, + ACT_MP_RELOAD_CROUCH_PRIMARY_END, + ACT_MP_RELOAD_SWIM_PRIMARY, + ACT_MP_RELOAD_SWIM_PRIMARY_LOOP, + ACT_MP_RELOAD_SWIM_PRIMARY_END, + ACT_MP_RELOAD_AIRWALK_PRIMARY, + ACT_MP_RELOAD_AIRWALK_PRIMARY_LOOP, + ACT_MP_RELOAD_AIRWALK_PRIMARY_END, + + ACT_MP_RELOAD_STAND_PRIMARY_2, + ACT_MP_RELOAD_STAND_PRIMARY_LOOP_2, + ACT_MP_RELOAD_STAND_PRIMARY_END_2, + ACT_MP_RELOAD_CROUCH_PRIMARY_2, + ACT_MP_RELOAD_CROUCH_PRIMARY_LOOP_2, + ACT_MP_RELOAD_CROUCH_PRIMARY_END_2, + ACT_MP_RELOAD_SWIM_PRIMARY_2, + ACT_MP_RELOAD_SWIM_PRIMARY_LOOP_2, + ACT_MP_RELOAD_SWIM_PRIMARY_END_2, + ACT_MP_RELOAD_AIRWALK_PRIMARY_2, + ACT_MP_RELOAD_AIRWALK_PRIMARY_LOOP_2, + ACT_MP_RELOAD_AIRWALK_PRIMARY_END_2, + + // PRIMARY ALT + ACT_MP_ATTACK_STAND_PRIMARY_ALT, + ACT_MP_ATTACK_CROUCH_PRIMARY_ALT, + ACT_MP_ATTACK_SWIM_PRIMARY_ALT, + ACT_MP_RELOAD_STAND_PRIMARY_ALT, + ACT_MP_RELOAD_CROUCH_PRIMARY_ALT, + ACT_MP_RELOAD_AIRWALK_PRIMARY_ALT, + ACT_MP_RELOAD_STAND_PRIMARY_LOOP_ALT, + ACT_MP_RELOAD_CROUCH_PRIMARY_LOOP_ALT, + ACT_MP_RELOAD_AIRWALK_PRIMARY_LOOP_ALT, + ACT_MP_RELOAD_STAND_PRIMARY_END_ALT, + ACT_MP_RELOAD_CROUCH_PRIMARY_END_ALT, + ACT_MP_RELOAD_AIRWALK_PRIMARY_END_ALT, + ACT_MP_RELOAD_SWIM_PRIMARY_ALT, + ACT_MP_ATTACK_STAND_PRIMARY_SUPER, + ACT_MP_ATTACK_CROUCH_PRIMARY_SUPER, + ACT_MP_ATTACK_SWIM_PRIMARY_SUPER, + + ACT_MP_ATTACK_STAND_GRENADE_PRIMARY, // RUN, WALK + ACT_MP_ATTACK_CROUCH_GRENADE_PRIMARY, // CROUCHWALK + ACT_MP_ATTACK_SWIM_GRENADE_PRIMARY, + ACT_MP_ATTACK_AIRWALK_GRENADE_PRIMARY, + + // Secondary + ACT_MP_STAND_SECONDARY, + ACT_MP_CROUCH_SECONDARY, + ACT_MP_RUN_SECONDARY, + ACT_MP_WALK_SECONDARY, + ACT_MP_AIRWALK_SECONDARY, + ACT_MP_CROUCHWALK_SECONDARY, + ACT_MP_JUMP_SECONDARY, + ACT_MP_JUMP_START_SECONDARY, + ACT_MP_JUMP_FLOAT_SECONDARY, + ACT_MP_JUMP_LAND_SECONDARY, + ACT_MP_SWIM_SECONDARY, + + ACT_MP_ATTACK_STAND_SECONDARY, // RUN, WALK + ACT_MP_ATTACK_CROUCH_SECONDARY, // CROUCHWALK + ACT_MP_ATTACK_SWIM_SECONDARY, + ACT_MP_ATTACK_AIRWALK_SECONDARY, + + ACT_MP_RELOAD_STAND_SECONDARY, // RUN, WALK + ACT_MP_RELOAD_STAND_SECONDARY_LOOP, + ACT_MP_RELOAD_STAND_SECONDARY_END, + ACT_MP_RELOAD_CROUCH_SECONDARY, // CROUCHWALK + ACT_MP_RELOAD_CROUCH_SECONDARY_LOOP, + ACT_MP_RELOAD_CROUCH_SECONDARY_END, + ACT_MP_RELOAD_SWIM_SECONDARY, + ACT_MP_RELOAD_SWIM_SECONDARY_LOOP, + ACT_MP_RELOAD_SWIM_SECONDARY_END, + ACT_MP_RELOAD_AIRWALK_SECONDARY, + ACT_MP_RELOAD_AIRWALK_SECONDARY_LOOP, + ACT_MP_RELOAD_AIRWALK_SECONDARY_END, + + ACT_MP_RELOAD_STAND_SECONDARY_2, + ACT_MP_RELOAD_CROUCH_SECONDARY_2, + ACT_MP_RELOAD_SWIM_SECONDARY_2, + ACT_MP_RELOAD_AIRWALK_SECONDARY_2, + + ACT_MP_ATTACK_STAND_GRENADE_SECONDARY, // RUN, WALK + ACT_MP_ATTACK_CROUCH_GRENADE_SECONDARY, // CROUCHWALK + ACT_MP_ATTACK_SWIM_GRENADE_SECONDARY, + ACT_MP_ATTACK_AIRWALK_GRENADE_SECONDARY, + + // Secondary2 + ACT_MP_STAND_SECONDARY2, + ACT_MP_CROUCH_SECONDARY2, + ACT_MP_RUN_SECONDARY2, + ACT_MP_WALK_SECONDARY2, + ACT_MP_AIRWALK_SECONDARY2, + ACT_MP_CROUCHWALK_SECONDARY2, + ACT_MP_JUMP_SECONDARY2, + ACT_MP_JUMP_START_SECONDARY2, + ACT_MP_JUMP_FLOAT_SECONDARY2, + ACT_MP_JUMP_LAND_SECONDARY2, + ACT_MP_SWIM_SECONDARY2, + + ACT_MP_ATTACK_STAND_SECONDARY2, // RUN, WALK + ACT_MP_ATTACK_CROUCH_SECONDARY2, // CROUCHWALK + ACT_MP_ATTACK_SWIM_SECONDARY2, + ACT_MP_ATTACK_AIRWALK_SECONDARY2, + + ACT_MP_RELOAD_STAND_SECONDARY2, // RUN, WALK + ACT_MP_RELOAD_STAND_SECONDARY2_LOOP, + ACT_MP_RELOAD_STAND_SECONDARY2_END, + ACT_MP_RELOAD_CROUCH_SECONDARY2, // CROUCHWALK + ACT_MP_RELOAD_CROUCH_SECONDARY2_LOOP, + ACT_MP_RELOAD_CROUCH_SECONDARY2_END, + ACT_MP_RELOAD_SWIM_SECONDARY2, + ACT_MP_RELOAD_SWIM_SECONDARY2_LOOP, + ACT_MP_RELOAD_SWIM_SECONDARY2_END, + ACT_MP_RELOAD_AIRWALK_SECONDARY2, + ACT_MP_RELOAD_AIRWALK_SECONDARY2_LOOP, + ACT_MP_RELOAD_AIRWALK_SECONDARY2_END, + + // Melee + ACT_MP_STAND_MELEE, + ACT_MP_CROUCH_MELEE, + ACT_MP_RUN_MELEE, + ACT_MP_WALK_MELEE, + ACT_MP_AIRWALK_MELEE, + ACT_MP_CROUCHWALK_MELEE, + ACT_MP_JUMP_MELEE, + ACT_MP_JUMP_START_MELEE, + ACT_MP_JUMP_FLOAT_MELEE, + ACT_MP_JUMP_LAND_MELEE, + ACT_MP_SWIM_MELEE, + + ACT_MP_ATTACK_STAND_MELEE, // RUN, WALK + ACT_MP_ATTACK_STAND_MELEE_SECONDARY, + ACT_MP_ATTACK_CROUCH_MELEE, // CROUCHWALK + ACT_MP_ATTACK_CROUCH_MELEE_SECONDARY, + ACT_MP_ATTACK_SWIM_MELEE, + ACT_MP_ATTACK_AIRWALK_MELEE, + + ACT_MP_ATTACK_STAND_GRENADE_MELEE, // RUN, WALK + ACT_MP_ATTACK_CROUCH_GRENADE_MELEE, // CROUCHWALK + ACT_MP_ATTACK_SWIM_GRENADE_MELEE, + ACT_MP_ATTACK_AIRWALK_GRENADE_MELEE, + + // Item1 + ACT_MP_STAND_ITEM1, + ACT_MP_CROUCH_ITEM1, + ACT_MP_RUN_ITEM1, + ACT_MP_WALK_ITEM1, + ACT_MP_AIRWALK_ITEM1, + ACT_MP_CROUCHWALK_ITEM1, + ACT_MP_JUMP_ITEM1, + ACT_MP_JUMP_START_ITEM1, + ACT_MP_JUMP_FLOAT_ITEM1, + ACT_MP_JUMP_LAND_ITEM1, + ACT_MP_SWIM_ITEM1, + + ACT_MP_ATTACK_STAND_ITEM1, // RUN, WALK + ACT_MP_ATTACK_STAND_ITEM1_SECONDARY, + ACT_MP_ATTACK_CROUCH_ITEM1, // CROUCHWALK + ACT_MP_ATTACK_CROUCH_ITEM1_SECONDARY, + ACT_MP_ATTACK_SWIM_ITEM1, + ACT_MP_ATTACK_AIRWALK_ITEM1, + + ACT_MP_DEPLOYED_ITEM1, + ACT_MP_DEPLOYED_IDLE_ITEM1, + ACT_MP_CROUCHWALK_DEPLOYED_ITEM1, + ACT_MP_CROUCH_DEPLOYED_IDLE_ITEM1, + ACT_MP_ATTACK_STAND_PRIMARY_DEPLOYED_ITEM1, + ACT_MP_ATTACK_CROUCH_PRIMARY_DEPLOYED_ITEM1, + + // Item2 + ACT_MP_STAND_ITEM2, + ACT_MP_CROUCH_ITEM2, + ACT_MP_RUN_ITEM2, + ACT_MP_WALK_ITEM2, + ACT_MP_AIRWALK_ITEM2, + ACT_MP_CROUCHWALK_ITEM2, + ACT_MP_JUMP_ITEM2, + ACT_MP_JUMP_START_ITEM2, + ACT_MP_JUMP_FLOAT_ITEM2, + ACT_MP_JUMP_LAND_ITEM2, + ACT_MP_SWIM_ITEM2, + + ACT_MP_ATTACK_STAND_ITEM2, // RUN, WALK + ACT_MP_ATTACK_STAND_ITEM2_SECONDARY, + ACT_MP_ATTACK_CROUCH_ITEM2, // CROUCHWALK + ACT_MP_ATTACK_CROUCH_ITEM2_SECONDARY, + ACT_MP_ATTACK_SWIM_ITEM2, + ACT_MP_ATTACK_AIRWALK_ITEM2, + + ACT_MP_ATTACK_STAND_HARD_ITEM2, + ACT_MP_ATTACK_CROUCH_HARD_ITEM2, + ACT_MP_ATTACK_SWIM_HARD_ITEM2, + + ACT_MP_DEPLOYED_ITEM2, + ACT_MP_DEPLOYED_IDLE_ITEM2, + ACT_MP_CROUCHWALK_DEPLOYED_ITEM2, + ACT_MP_CROUCH_DEPLOYED_IDLE_ITEM2, + ACT_MP_ATTACK_STAND_PRIMARY_DEPLOYED_ITEM2, + ACT_MP_ATTACK_CROUCH_PRIMARY_DEPLOYED_ITEM2, + + ACT_MP_RELOAD_STAND_ITEM2, // RUN, WALK + ACT_MP_RELOAD_STAND_ITEM2_LOOP, + ACT_MP_RELOAD_STAND_ITEM2_END, + ACT_MP_RELOAD_CROUCH_ITEM2, // CROUCHWALK + ACT_MP_RELOAD_CROUCH_ITEM2_LOOP, + ACT_MP_RELOAD_CROUCH_ITEM2_END, + ACT_MP_RELOAD_SWIM_ITEM2, + ACT_MP_RELOAD_SWIM_ITEM2_LOOP, + ACT_MP_RELOAD_SWIM_ITEM2_END, + ACT_MP_RELOAD_AIRWALK_ITEM2, + ACT_MP_RELOAD_AIRWALK_ITEM2_LOOP, + ACT_MP_RELOAD_AIRWALK_ITEM2_END, + ACT_MP_RELOAD_NO_AMMO_ITEM2, + + ACT_MP_ATTACK_STAND_GRENADE_ITEM2, // RUN, WALK + ACT_MP_ATTACK_CROUCH_GRENADE_ITEM2, // CROUCHWALK + ACT_MP_ATTACK_SWIM_GRENADE_ITEM2, + ACT_MP_ATTACK_AIRWALK_GRENADE_ITEM2, + + // Passtime + ACT_MP_STAND_PASSTIME, + ACT_MP_RUN_PASSTIME, + ACT_MP_CROUCHWALK_PASSTIME, + + // Flinches + ACT_MP_GESTURE_FLINCH, + ACT_MP_GESTURE_FLINCH_PRIMARY, + ACT_MP_GESTURE_FLINCH_SECONDARY, + ACT_MP_GESTURE_FLINCH_MELEE, + ACT_MP_GESTURE_FLINCH_ITEM1, + ACT_MP_GESTURE_FLINCH_ITEM2, + + ACT_MP_GESTURE_FLINCH_HEAD, + ACT_MP_GESTURE_FLINCH_CHEST, + ACT_MP_GESTURE_FLINCH_STOMACH, + ACT_MP_GESTURE_FLINCH_LEFTARM, + ACT_MP_GESTURE_FLINCH_RIGHTARM, + ACT_MP_GESTURE_FLINCH_LEFTLEG, + ACT_MP_GESTURE_FLINCH_RIGHTLEG, + +// Team Fortress specific - medic heal, medic infect, etc..... + ACT_MP_GRENADE1_DRAW, + ACT_MP_GRENADE1_IDLE, + ACT_MP_GRENADE1_ATTACK, + ACT_MP_GRENADE2_DRAW, + ACT_MP_GRENADE2_IDLE, + ACT_MP_GRENADE2_ATTACK, + + ACT_MP_PRIMARY_GRENADE1_DRAW, + ACT_MP_PRIMARY_GRENADE1_IDLE, + ACT_MP_PRIMARY_GRENADE1_ATTACK, + ACT_MP_PRIMARY_GRENADE2_DRAW, + ACT_MP_PRIMARY_GRENADE2_IDLE, + ACT_MP_PRIMARY_GRENADE2_ATTACK, + + ACT_MP_SECONDARY_GRENADE1_DRAW, + ACT_MP_SECONDARY_GRENADE1_IDLE, + ACT_MP_SECONDARY_GRENADE1_ATTACK, + ACT_MP_SECONDARY_GRENADE2_DRAW, + ACT_MP_SECONDARY_GRENADE2_IDLE, + ACT_MP_SECONDARY_GRENADE2_ATTACK, + + ACT_MP_MELEE_GRENADE1_DRAW, + ACT_MP_MELEE_GRENADE1_IDLE, + ACT_MP_MELEE_GRENADE1_ATTACK, + ACT_MP_MELEE_GRENADE2_DRAW, + ACT_MP_MELEE_GRENADE2_IDLE, + ACT_MP_MELEE_GRENADE2_ATTACK, + + ACT_MP_ITEM1_GRENADE1_DRAW, + ACT_MP_ITEM1_GRENADE1_IDLE, + ACT_MP_ITEM1_GRENADE1_ATTACK, + ACT_MP_ITEM1_GRENADE2_DRAW, + ACT_MP_ITEM1_GRENADE2_IDLE, + ACT_MP_ITEM1_GRENADE2_ATTACK, + + ACT_MP_ITEM2_GRENADE1_DRAW, + ACT_MP_ITEM2_GRENADE1_IDLE, + ACT_MP_ITEM2_GRENADE1_ATTACK, + ACT_MP_ITEM2_GRENADE2_DRAW, + ACT_MP_ITEM2_GRENADE2_IDLE, + ACT_MP_ITEM2_GRENADE2_ATTACK, + + // Building + ACT_MP_STAND_BUILDING, + ACT_MP_CROUCH_BUILDING, + ACT_MP_RUN_BUILDING, + ACT_MP_WALK_BUILDING, + ACT_MP_AIRWALK_BUILDING, + ACT_MP_CROUCHWALK_BUILDING, + ACT_MP_JUMP_BUILDING, + ACT_MP_JUMP_START_BUILDING, + ACT_MP_JUMP_FLOAT_BUILDING, + ACT_MP_JUMP_LAND_BUILDING, + ACT_MP_SWIM_BUILDING, + + ACT_MP_ATTACK_STAND_BUILDING, // RUN, WALK + ACT_MP_ATTACK_CROUCH_BUILDING, // CROUCHWALK + ACT_MP_ATTACK_SWIM_BUILDING, + ACT_MP_ATTACK_AIRWALK_BUILDING, + + ACT_MP_ATTACK_STAND_GRENADE_BUILDING, // RUN, WALK + ACT_MP_ATTACK_CROUCH_GRENADE_BUILDING, // CROUCHWALK + ACT_MP_ATTACK_SWIM_GRENADE_BUILDING, + ACT_MP_ATTACK_AIRWALK_GRENADE_BUILDING, + + // Building + ACT_MP_STAND_BUILDING_DEPLOYED, + ACT_MP_CROUCH_BUILDING_DEPLOYED, + ACT_MP_RUN_BUILDING_DEPLOYED, + ACT_MP_WALK_BUILDING_DEPLOYED, + ACT_MP_AIRWALK_BUILDING_DEPLOYED, + ACT_MP_CROUCHWALK_BUILDING_DEPLOYED, + ACT_MP_JUMP_BUILDING_DEPLOYED, + ACT_MP_JUMP_START_BUILDING_DEPLOYED, + ACT_MP_JUMP_FLOAT_BUILDING_DEPLOYED, + ACT_MP_JUMP_LAND_BUILDING_DEPLOYED, + ACT_MP_SWIM_BUILDING_DEPLOYED, + + ACT_MP_ATTACK_STAND_BUILDING_DEPLOYED, // RUN, WALK + ACT_MP_ATTACK_CROUCH_BUILDING_DEPLOYED, // CROUCHWALK + ACT_MP_ATTACK_SWIM_BUILDING_DEPLOYED, + ACT_MP_ATTACK_AIRWALK_BUILDING_DEPLOYED, + + ACT_MP_ATTACK_STAND_GRENADE_BUILDING_DEPLOYED, // RUN, WALK + ACT_MP_ATTACK_CROUCH_GRENADE_BUILDING_DEPLOYED, // CROUCHWALK + ACT_MP_ATTACK_SWIM_GRENADE_BUILDING_DEPLOYED, + ACT_MP_ATTACK_AIRWALK_GRENADE_BUILDING_DEPLOYED, + + ACT_MP_STAND_PDA, + ACT_MP_CROUCH_PDA, + ACT_MP_RUN_PDA, + ACT_MP_WALK_PDA, + ACT_MP_AIRWALK_PDA, + ACT_MP_CROUCHWALK_PDA, + ACT_MP_JUMP_PDA, + ACT_MP_JUMP_START_PDA, + ACT_MP_JUMP_FLOAT_PDA, + ACT_MP_JUMP_LAND_PDA, + ACT_MP_SWIM_PDA, + + ACT_MP_ATTACK_STAND_PDA, + ACT_MP_ATTACK_SWIM_PDA, + + ACT_MP_STAND_LOSERSTATE, + ACT_MP_CROUCH_LOSERSTATE, + ACT_MP_RUN_LOSERSTATE, + ACT_MP_WALK_LOSERSTATE, + ACT_MP_AIRWALK_LOSERSTATE, + ACT_MP_CROUCHWALK_LOSERSTATE, + ACT_MP_JUMP_LOSERSTATE, + ACT_MP_JUMP_START_LOSERSTATE, + ACT_MP_JUMP_FLOAT_LOSERSTATE, + ACT_MP_JUMP_LAND_LOSERSTATE, + ACT_MP_SWIM_LOSERSTATE, + ACT_MP_DOUBLEJUMP_LOSERSTATE, + + ACT_MP_DOUBLEJUMP_CROUCH, + ACT_MP_DOUBLEJUMP_CROUCH_PRIMARY, + ACT_MP_DOUBLEJUMP_CROUCH_SECONDARY, + ACT_MP_DOUBLEJUMP_CROUCH_MELEE, + ACT_MP_DOUBLEJUMP_CROUCH_ITEM1, + ACT_MP_DOUBLEJUMP_CROUCH_ITEM2, + ACT_MP_DOUBLEJUMP_CROUCH_LOSERSTATE, + ACT_MP_DOUBLEJUMP_CROUCH_PASSTIME, + + ACT_MP_GESTURE_VC_HANDMOUTH, + ACT_MP_GESTURE_VC_FINGERPOINT, + ACT_MP_GESTURE_VC_FISTPUMP, + ACT_MP_GESTURE_VC_THUMBSUP, + ACT_MP_GESTURE_VC_NODYES, + ACT_MP_GESTURE_VC_NODNO, + + ACT_MP_GESTURE_VC_HANDMOUTH_PRIMARY, + ACT_MP_GESTURE_VC_FINGERPOINT_PRIMARY, + ACT_MP_GESTURE_VC_FISTPUMP_PRIMARY, + ACT_MP_GESTURE_VC_THUMBSUP_PRIMARY, + ACT_MP_GESTURE_VC_NODYES_PRIMARY, + ACT_MP_GESTURE_VC_NODNO_PRIMARY, + + ACT_MP_GESTURE_VC_HANDMOUTH_SECONDARY, + ACT_MP_GESTURE_VC_FINGERPOINT_SECONDARY, + ACT_MP_GESTURE_VC_FISTPUMP_SECONDARY, + ACT_MP_GESTURE_VC_THUMBSUP_SECONDARY, + ACT_MP_GESTURE_VC_NODYES_SECONDARY, + ACT_MP_GESTURE_VC_NODNO_SECONDARY, + + ACT_MP_GESTURE_VC_HANDMOUTH_MELEE, + ACT_MP_GESTURE_VC_FINGERPOINT_MELEE, + ACT_MP_GESTURE_VC_FISTPUMP_MELEE, + ACT_MP_GESTURE_VC_THUMBSUP_MELEE, + ACT_MP_GESTURE_VC_NODYES_MELEE, + ACT_MP_GESTURE_VC_NODNO_MELEE, + + ACT_MP_GESTURE_VC_HANDMOUTH_ITEM1, + ACT_MP_GESTURE_VC_FINGERPOINT_ITEM1, + ACT_MP_GESTURE_VC_FISTPUMP_ITEM1, + ACT_MP_GESTURE_VC_THUMBSUP_ITEM1, + ACT_MP_GESTURE_VC_NODYES_ITEM1, + ACT_MP_GESTURE_VC_NODNO_ITEM1, + + ACT_MP_GESTURE_VC_HANDMOUTH_ITEM2, + ACT_MP_GESTURE_VC_FINGERPOINT_ITEM2, + ACT_MP_GESTURE_VC_FISTPUMP_ITEM2, + ACT_MP_GESTURE_VC_THUMBSUP_ITEM2, + ACT_MP_GESTURE_VC_NODYES_ITEM2, + ACT_MP_GESTURE_VC_NODNO_ITEM2, + + ACT_MP_GESTURE_VC_HANDMOUTH_BUILDING, + ACT_MP_GESTURE_VC_FINGERPOINT_BUILDING, + ACT_MP_GESTURE_VC_FISTPUMP_BUILDING, + ACT_MP_GESTURE_VC_THUMBSUP_BUILDING, + ACT_MP_GESTURE_VC_NODYES_BUILDING, + ACT_MP_GESTURE_VC_NODNO_BUILDING, + + ACT_MP_GESTURE_VC_HANDMOUTH_PDA, + ACT_MP_GESTURE_VC_FINGERPOINT_PDA, + ACT_MP_GESTURE_VC_FISTPUMP_PDA, + ACT_MP_GESTURE_VC_THUMBSUP_PDA, + ACT_MP_GESTURE_VC_NODYES_PDA, + ACT_MP_GESTURE_VC_NODNO_PDA, + + ACT_MP_STUN_BEGIN, + ACT_MP_STUN_MIDDLE, + ACT_MP_STUN_END, + + ACT_MP_PASSTIME_THROW_BEGIN, + ACT_MP_PASSTIME_THROW_MIDDLE, + ACT_MP_PASSTIME_THROW_END, + ACT_MP_PASSTIME_THROW_CANCEL, + + ACT_VM_UNUSABLE, + ACT_VM_UNUSABLE_TO_USABLE, + ACT_VM_USABLE_TO_UNUSABLE, + + // Specific viewmodel activities for weapon roles + ACT_PRIMARY_VM_DRAW, + ACT_PRIMARY_VM_HOLSTER, + ACT_PRIMARY_VM_IDLE, + ACT_PRIMARY_VM_PULLBACK, + ACT_PRIMARY_VM_PRIMARYATTACK, + ACT_PRIMARY_VM_SECONDARYATTACK, + ACT_PRIMARY_VM_RELOAD, + ACT_PRIMARY_RELOAD_START, + ACT_PRIMARY_RELOAD_FINISH, + ACT_PRIMARY_VM_DRYFIRE, + ACT_PRIMARY_VM_IDLE_TO_LOWERED, + ACT_PRIMARY_VM_IDLE_LOWERED, + ACT_PRIMARY_VM_LOWERED_TO_IDLE, + ACT_PRIMARY_VM_RELOAD_2, + ACT_PRIMARY_RELOAD_START_2, + ACT_PRIMARY_RELOAD_FINISH_2, + ACT_PRIMARY_VM_RELOAD_3, + ACT_PRIMARY_RELOAD_START_3, + ACT_PRIMARY_RELOAD_FINISH_3, + ACT_PRIMARY_VM_PRIMARYATTACK_3, + + ACT_SECONDARY_VM_DRAW, + ACT_SECONDARY_VM_HOLSTER, + ACT_SECONDARY_VM_IDLE, + ACT_SECONDARY_VM_PULLBACK, + ACT_SECONDARY_VM_PRIMARYATTACK, + ACT_SECONDARY_VM_SECONDARYATTACK, + ACT_SECONDARY_VM_RELOAD, + ACT_SECONDARY_RELOAD_START, + ACT_SECONDARY_RELOAD_FINISH, + ACT_SECONDARY_VM_RELOAD2, + ACT_SECONDARY_VM_DRYFIRE, + ACT_SECONDARY_VM_IDLE_TO_LOWERED, + ACT_SECONDARY_VM_IDLE_LOWERED, + ACT_SECONDARY_VM_LOWERED_TO_IDLE, + + ACT_SECONDARY_VM_DRAW_2, + ACT_SECONDARY_VM_IDLE_2, + ACT_SECONDARY_VM_PRIMARYATTACK_2, + ACT_SECONDARY_VM_RELOAD_2, + + ACT_MELEE_VM_DRAW, + ACT_MELEE_VM_HOLSTER, + ACT_MELEE_VM_IDLE, + ACT_MELEE_VM_PULLBACK, + ACT_MELEE_VM_PRIMARYATTACK, + ACT_MELEE_VM_SECONDARYATTACK, + ACT_MELEE_VM_RELOAD, + ACT_MELEE_VM_DRYFIRE, + ACT_MELEE_VM_IDLE_TO_LOWERED, + ACT_MELEE_VM_IDLE_LOWERED, + ACT_MELEE_VM_LOWERED_TO_IDLE, + ACT_MELEE_VM_STUN, + ACT_MELEE_VM_HITCENTER, + ACT_MELEE_VM_SWINGHARD, + + ACT_PDA_VM_DRAW, + ACT_PDA_VM_HOLSTER, + ACT_PDA_VM_IDLE, + ACT_PDA_VM_PULLBACK, + ACT_PDA_VM_PRIMARYATTACK, + ACT_PDA_VM_SECONDARYATTACK, + ACT_PDA_VM_RELOAD, + ACT_PDA_VM_DRYFIRE, + ACT_PDA_VM_IDLE_TO_LOWERED, + ACT_PDA_VM_IDLE_LOWERED, + ACT_PDA_VM_LOWERED_TO_IDLE, + + ACT_ENGINEER_PDA1_VM_DRAW, + ACT_ENGINEER_PDA2_VM_DRAW, + ACT_ENGINEER_BLD_VM_DRAW, + ACT_ENGINEER_PDA1_VM_IDLE, + ACT_ENGINEER_PDA2_VM_IDLE, + ACT_ENGINEER_BLD_VM_IDLE, + + ACT_ITEM1_VM_DRAW, + ACT_ITEM1_VM_HOLSTER, + ACT_ITEM1_VM_IDLE, + ACT_ITEM1_VM_IDLE_2, + ACT_ITEM1_VM_PULLBACK, + ACT_ITEM1_VM_PRIMARYATTACK, + ACT_ITEM1_VM_SECONDARYATTACK, + ACT_ITEM1_VM_RELOAD, + ACT_ITEM1_VM_DRYFIRE, + ACT_ITEM1_VM_IDLE_TO_LOWERED, + ACT_ITEM1_VM_IDLE_LOWERED, + ACT_ITEM1_VM_LOWERED_TO_IDLE, + ACT_ITEM1_RELOAD_START, + ACT_ITEM1_RELOAD_FINISH, + ACT_ITEM1_VM_HITCENTER, + ACT_ITEM1_VM_SWINGHARD, + ACT_ITEM1_BACKSTAB_VM_UP, + ACT_ITEM1_BACKSTAB_VM_DOWN, + ACT_ITEM1_BACKSTAB_VM_IDLE, + ACT_MELEE_VM_ITEM1_STUN, + + ACT_ITEM2_VM_DRAW, + ACT_ITEM2_VM_HOLSTER, + ACT_ITEM2_VM_IDLE, + ACT_ITEM2_VM_PULLBACK, + ACT_ITEM2_VM_PRIMARYATTACK, + ACT_ITEM2_VM_SECONDARYATTACK, + ACT_ITEM2_VM_RELOAD, + ACT_ITEM2_VM_DRYFIRE, + ACT_ITEM2_VM_IDLE_TO_LOWERED, + ACT_ITEM2_VM_IDLE_LOWERED, + ACT_ITEM2_VM_LOWERED_TO_IDLE, + ACT_ITEM2_VM_CHARGE, + ACT_ITEM2_VM_IDLE_2, + ACT_ITEM2_VM_IDLE_3, + ACT_ITEM2_VM_CHARGE_IDLE_3, + ACT_ITEM2_VM_HITCENTER, + ACT_ITEM2_VM_SWINGHARD, + ACT_ITEM2_BACKSTAB_VM_UP, + ACT_ITEM2_BACKSTAB_VM_DOWN, + ACT_ITEM2_BACKSTAB_VM_IDLE, + ACT_MELEE_VM_ITEM2_STUN, + + ACT_ITEM3_VM_DRAW, + ACT_ITEM3_VM_HOLSTER, + ACT_ITEM3_VM_IDLE, + ACT_ITEM3_VM_PULLBACK, + ACT_ITEM3_VM_PRIMARYATTACK, + ACT_ITEM3_VM_SECONDARYATTACK, + ACT_ITEM3_VM_RELOAD, + ACT_ITEM3_VM_DRYFIRE, + ACT_ITEM3_VM_IDLE_TO_LOWERED, + ACT_ITEM3_VM_IDLE_LOWERED, + ACT_ITEM3_VM_LOWERED_TO_IDLE, + ACT_ITEM3_VM_CHARGE, + ACT_ITEM3_VM_IDLE_2, + ACT_ITEM3_VM_IDLE_3, + ACT_ITEM3_VM_CHARGE_IDLE_3, + ACT_ITEM3_VM_HITCENTER, + ACT_ITEM3_VM_SWINGHARD, + + ACT_SECONDARY2_VM_DRAW, + ACT_SECONDARY2_VM_HOLSTER, + ACT_SECONDARY2_VM_IDLE, + ACT_SECONDARY2_VM_PULLBACK, + ACT_SECONDARY2_VM_PRIMARYATTACK, + ACT_SECONDARY2_VM_SECONDARY2ATTACK, + ACT_SECONDARY2_VM_RELOAD, + ACT_SECONDARY2_RELOAD_START, + ACT_SECONDARY2_RELOAD_FINISH, + ACT_SECONDARY2_VM_RELOAD2, + ACT_SECONDARY2_VM_DRYFIRE, + ACT_SECONDARY2_VM_IDLE_TO_LOWERED, + ACT_SECONDARY2_VM_IDLE_LOWERED, + ACT_SECONDARY2_VM_LOWERED_TO_IDLE, + + ACT_BACKSTAB_VM_UP, + ACT_BACKSTAB_VM_DOWN, + ACT_BACKSTAB_VM_IDLE, + + ACT_PRIMARY_ATTACK_STAND_PREFIRE, + ACT_PRIMARY_ATTACK_STAND_POSTFIRE, + ACT_PRIMARY_ATTACK_STAND_STARTFIRE, + ACT_PRIMARY_ATTACK_CROUCH_PREFIRE, + ACT_PRIMARY_ATTACK_CROUCH_POSTFIRE, + ACT_PRIMARY_ATTACK_SWIM_PREFIRE, + ACT_PRIMARY_ATTACK_SWIM_POSTFIRE, + + ACT_SECONDARY_ATTACK_STAND_PREFIRE, + ACT_SECONDARY_ATTACK_STAND_POSTFIRE, + ACT_SECONDARY_ATTACK_STAND_STARTFIRE, + ACT_SECONDARY_ATTACK_CROUCH_PREFIRE, + ACT_SECONDARY_ATTACK_CROUCH_POSTFIRE, + ACT_SECONDARY_ATTACK_SWIM_PREFIRE, + ACT_SECONDARY_ATTACK_SWIM_POSTFIRE, + + ACT_MELEE_ATTACK_STAND_PREFIRE, + ACT_MELEE_ATTACK_STAND_POSTFIRE, + ACT_MELEE_ATTACK_STAND_STARTFIRE, + ACT_MELEE_ATTACK_CROUCH_PREFIRE, + ACT_MELEE_ATTACK_CROUCH_POSTFIRE, + ACT_MELEE_ATTACK_SWIM_PREFIRE, + ACT_MELEE_ATTACK_SWIM_POSTFIRE, + + ACT_ITEM1_ATTACK_STAND_PREFIRE, + ACT_ITEM1_ATTACK_STAND_POSTFIRE, + ACT_ITEM1_ATTACK_STAND_STARTFIRE, + ACT_ITEM1_ATTACK_CROUCH_PREFIRE, + ACT_ITEM1_ATTACK_CROUCH_POSTFIRE, + ACT_ITEM1_ATTACK_SWIM_PREFIRE, + ACT_ITEM1_ATTACK_SWIM_POSTFIRE, + + ACT_ITEM2_ATTACK_STAND_PREFIRE, + ACT_ITEM2_ATTACK_STAND_POSTFIRE, + ACT_ITEM2_ATTACK_STAND_STARTFIRE, + ACT_ITEM2_ATTACK_CROUCH_PREFIRE, + ACT_ITEM2_ATTACK_CROUCH_POSTFIRE, + ACT_ITEM2_ATTACK_SWIM_PREFIRE, + ACT_ITEM2_ATTACK_SWIM_POSTFIRE, + + ACT_MP_STAND_MELEE_ALLCLASS, + ACT_MP_CROUCH_MELEE_ALLCLASS, + ACT_MP_RUN_MELEE_ALLCLASS, + ACT_MP_WALK_MELEE_ALLCLASS, + ACT_MP_AIRWALK_MELEE_ALLCLASS, + ACT_MP_CROUCHWALK_MELEE_ALLCLASS, + ACT_MP_JUMP_MELEE_ALLCLASS, + ACT_MP_JUMP_START_MELEE_ALLCLASS, + ACT_MP_JUMP_FLOAT_MELEE_ALLCLASS, + ACT_MP_JUMP_LAND_MELEE_ALLCLASS, + ACT_MP_SWIM_MELEE_ALLCLASS, + + ACT_MP_ATTACK_STAND_MELEE_ALLCLASS, // RUN, WALK + ACT_MP_ATTACK_STAND_MELEE_SECONDARY_ALLCLASS, + ACT_MP_ATTACK_CROUCH_MELEE_ALLCLASS, // CROUCHWALK + ACT_MP_ATTACK_CROUCH_MELEE_SECONDARY_ALLCLASS, + ACT_MP_ATTACK_SWIM_MELEE_ALLCLASS, + ACT_MP_ATTACK_AIRWALK_MELEE_ALLCLASS, + + ACT_MELEE_ALLCLASS_VM_DRAW, + ACT_MELEE_ALLCLASS_VM_HOLSTER, + ACT_MELEE_ALLCLASS_VM_IDLE, + ACT_MELEE_ALLCLASS_VM_PULLBACK, + ACT_MELEE_ALLCLASS_VM_PRIMARYATTACK, + ACT_MELEE_ALLCLASS_VM_SECONDARYATTACK, + ACT_MELEE_ALLCLASS_VM_RELOAD, + ACT_MELEE_ALLCLASS_VM_DRYFIRE, + ACT_MELEE_ALLCLASS_VM_IDLE_TO_LOWERED, + ACT_MELEE_ALLCLASS_VM_IDLE_LOWERED, + ACT_MELEE_ALLCLASS_VM_LOWERED_TO_IDLE, + ACT_MELEE_ALLCLASS_VM_STUN, + ACT_MELEE_ALLCLASS_VM_HITCENTER, + ACT_MELEE_ALLCLASS_VM_SWINGHARD, + + // BOMB activities for TD mode. + ACT_MP_STAND_BOMB, + ACT_MP_JUMP_START_BOMB, + ACT_MP_JUMP_FLOAT_BOMB, + ACT_MP_JUMP_LAND_BOMB, + ACT_MP_RUN_BOMB, + ACT_MP_SWIM_BOMB, + + // More Primary VM activities for Soldier Quake RL + ACT_VM_DRAW_QRL, + ACT_VM_IDLE_QRL, + ACT_VM_PULLBACK_QRL, + ACT_VM_PRIMARYATTACK_QRL, + ACT_VM_RELOAD_QRL, + ACT_VM_RELOAD_START_QRL, + ACT_VM_RELOAD_FINISH_QRL, + + // Third person anims for the Soldier Quake RL + ACT_MP_RELOAD_STAND_PRIMARY3, + ACT_MP_RELOAD_CROUCH_PRIMARY3, + ACT_MP_RELOAD_AIRWALK_PRIMARY3, + ACT_MP_RELOAD_STAND_PRIMARY3_LOOP, + ACT_MP_RELOAD_CROUCH_PRIMARY3_LOOP, + ACT_MP_RELOAD_AIRWALK_PRIMARY3_LOOP, + ACT_MP_RELOAD_STAND_PRIMARY3_END, + ACT_MP_RELOAD_CROUCH_PRIMARY3_END, + ACT_MP_RELOAD_AIRWALK_PRIMARY3_END, + ACT_MP_RELOAD_SWIM_PRIMARY3, + + // Throwable Animations + ACT_MP_THROW, + ACT_THROWABLE_VM_DRAW, + ACT_THROWABLE_VM_IDLE, + ACT_THROWABLE_VM_FIRE, + + // Spell Animations + ACT_SPELL_VM_DRAW, + ACT_SPELL_VM_IDLE, + ACT_SPELL_VM_ARM, + ACT_SPELL_VM_FIRE, + + // Bread Monster Sapper + ACT_BREADSAPPER_VM_DRAW, + ACT_BREADSAPPER_VM_IDLE, + + // Bread Gloves + ACT_BREADGLOVES_VM_HITLEFT, + ACT_BREADGLOVES_VM_HITRIGHT, + ACT_BREADGLOVES_VM_SWINGHARD, + ACT_BREADGLOVES_VM_IDLE, + ACT_BREADGLOVES_VM_DRAW, + + ACT_BREADMONSTER_GLOVES_IDLE, + ACT_BREADMONSTER_GLOVES_HITRIGHT, + ACT_BREADMONSTER_GLOVES_HITUP, + + ACT_BREADMONSTER_VM_DRAW, + ACT_BREADMONSTER_VM_IDLE, + ACT_BREADMONSTER_VM_PRIMARYATTACK, + + ACT_PARACHUTE_DEPLOY, + ACT_PARACHUTE_DEPLOY_IDLE, + ACT_PARACHUTE_RETRACT, + ACT_PARACHUTE_RETRACT_IDLE, + + ACT_BOT_SPAWN, + ACT_BOT_PANIC, + ACT_BOT_PRIMARY_MOVEMENT, + ACT_BOT_GESTURE_FLINCH, + ACT_BOT_PANIC_START, + ACT_BOT_PANIC_END, + + ACT_ENGINEER_REVOLVER_DRAW, + ACT_ENGINEER_REVOLVER_IDLE, + ACT_ENGINEER_REVOLVER_PRIMARYATTACK, + ACT_ENGINEER_REVOLVER_RELOAD, + + // Kart! + ACT_KART_IDLE, + ACT_KART_ACTION_SHOOT, + ACT_KART_ACTION_DASH, + ACT_KART_JUMP_START, + ACT_KART_JUMP_FLOAT, + ACT_KART_JUMP_LAND, + ACT_KART_IMPACT, + ACT_KART_IMPACT_BIG, + ACT_KART_GESTURE_POSITIVE, + ACT_KART_GESTURE_NEGATIVE, + + // grappling hook + ACT_GRAPPLE_DRAW, + ACT_GRAPPLE_IDLE, + ACT_GRAPPLE_FIRE_START, + ACT_GRAPPLE_FIRE_IDLE, + ACT_GRAPPLE_PULL_START, + ACT_GRAPPLE_PULL_IDLE, + ACT_GRAPPLE_PULL_END, + + // inspect + ACT_PRIMARY_VM_INSPECT_START, + ACT_PRIMARY_VM_INSPECT_IDLE, + ACT_PRIMARY_VM_INSPECT_END, + + ACT_SECONDARY_VM_INSPECT_START, + ACT_SECONDARY_VM_INSPECT_IDLE, + ACT_SECONDARY_VM_INSPECT_END, + + ACT_MELEE_VM_INSPECT_START, + ACT_MELEE_VM_INSPECT_IDLE, + ACT_MELEE_VM_INSPECT_END, + + // this is the end of the global activities, private per-monster activities start here. + LAST_SHARED_ACTIVITY, +} diff --git a/scripting/include/srccoop_api/typedef/hl2dm/Class_T.inc b/scripting/include/srccoop_api/typedef/hl2dm/Class_T.inc new file mode 100644 index 00000000..aedaa6c2 --- /dev/null +++ b/scripting/include/srccoop_api/typedef/hl2dm/Class_T.inc @@ -0,0 +1,37 @@ +#pragma newdecls required +#pragma semicolon 1 + +// For CLASSIFY +enum Class_T +{ + CLASS_NONE=0, + CLASS_PLAYER, + CLASS_PLAYER_ALLY, + CLASS_PLAYER_ALLY_VITAL, + CLASS_ANTLION, + CLASS_BARNACLE, + CLASS_BULLSEYE, + //CLASS_BULLSQUID, + CLASS_CITIZEN_PASSIVE, + CLASS_CITIZEN_REBEL, + CLASS_COMBINE, + CLASS_COMBINE_GUNSHIP, + CLASS_CONSCRIPT, + CLASS_HEADCRAB, + //CLASS_HOUNDEYE, + CLASS_MANHACK, + CLASS_METROPOLICE, + CLASS_MILITARY, + CLASS_SCANNER, + CLASS_STALKER, + CLASS_VORTIGAUNT, + CLASS_ZOMBIE, + CLASS_PROTOSNIPER, + CLASS_MISSILE, + CLASS_FLARE, + CLASS_EARTH_FAUNA, + CLASS_HACKED_ROLLERMINE, + CLASS_COMBINE_HUNTER, + + NUM_AI_CLASSES +}; \ No newline at end of file diff --git a/scripting/include/srccoop_api/util.inc b/scripting/include/srccoop_api/util.inc new file mode 100644 index 00000000..fcb473af --- /dev/null +++ b/scripting/include/srccoop_api/util.inc @@ -0,0 +1,25 @@ +#if defined _srccoop_api_util_included + #endinput +#endif +#define _srccoop_api_util_included + +#pragma newdecls required +#pragma semicolon 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined _dhooks_included +#include +#endif +#if defined _regex_included +#include +#endif \ No newline at end of file diff --git a/scripting/include/srccoop_api/util/common/array.inc b/scripting/include/srccoop_api/util/common/array.inc new file mode 100644 index 00000000..e565002c --- /dev/null +++ b/scripting/include/srccoop_api/util/common/array.inc @@ -0,0 +1,40 @@ +#pragma newdecls required +#pragma semicolon 1 + +stock int FindStringInArrayEx(const char[][] array, int len, const char[] str, bool caseSensitive = true) +{ + for (int i = 0; i < len; i++) + { + if (StrEqual(str, array[i], caseSensitive)) + { + return i; + } + } + return -1; +} + +stock int FindValueInArrayEx(const any[] array, int len, const any val) +{ + for (int i = 0; i < len; i++) + { + if (array[i] == val) + { + return i; + } + } + return -1; +} + +stock int FindCharInArray(const any[] array, int len, const int val, bool caseSensitive = true) +{ + int i = FindValueInArrayEx(array, len, val); + if (!caseSensitive && i == -1) + { + int val2 = IsCharLower(val) ? CharToUpper(val) : CharToLower(val); + if (val2 != val) + { + i = FindValueInArrayEx(array, len, val2); + } + } + return i; +} diff --git a/scripting/include/srccoop/util/assert.inc b/scripting/include/srccoop_api/util/common/assert.inc similarity index 90% rename from scripting/include/srccoop/util/assert.inc rename to scripting/include/srccoop_api/util/common/assert.inc index e3ff9d19..6ece7917 100644 --- a/scripting/include/srccoop/util/assert.inc +++ b/scripting/include/srccoop_api/util/common/assert.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_util_assert_included - #endinput -#endif -#define _srccoop_util_assert_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/include/srccoop_api/util/common/dhooks.inc b/scripting/include/srccoop_api/util/common/dhooks.inc new file mode 100644 index 00000000..646ad659 --- /dev/null +++ b/scripting/include/srccoop_api/util/common/dhooks.inc @@ -0,0 +1,20 @@ +#pragma newdecls required +#pragma semicolon 1 + +stock void LoadDHookDetour(GameData pGameConfig, DynamicDetour& pHandle, const char[] szFuncName, DHookCallback pCallbackPre = null, DHookCallback pCallbackPost = null) +{ + pHandle = DynamicDetour.FromConf(pGameConfig, szFuncName); + if (!pHandle) + SetFailState("Couldn't create hook %s", szFuncName); + if (pCallbackPre && !pHandle.Enable(Hook_Pre, pCallbackPre)) + SetFailState("Couldn't enable pre detour hook %s", szFuncName); + if (pCallbackPost && !pHandle.Enable(Hook_Post, pCallbackPost)) + SetFailState("Couldn't enable post detour hook %s", szFuncName); +} + +stock void LoadDHookVirtual(GameData pGameConfig, DynamicHook& pHandle, const char[] szFuncName) +{ + pHandle = DynamicHook.FromConf(pGameConfig, szFuncName); + if (pHandle == null) + SetFailState("Couldn't create hook %s", szFuncName); +} \ No newline at end of file diff --git a/scripting/include/srccoop_api/util/common/entity.inc b/scripting/include/srccoop_api/util/common/entity.inc new file mode 100644 index 00000000..f0c804ed --- /dev/null +++ b/scripting/include/srccoop_api/util/common/entity.inc @@ -0,0 +1,43 @@ +#pragma newdecls required +#pragma semicolon 1 + +stock int FindEntityByHammerID(int iHammerID, const char[] szClassname = "*") +{ + int startEnt = -1; + while ((startEnt = FindEntityByClassname(startEnt, szClassname)) != -1) + { + CBaseEntity pEntity = CBaseEntity(startEnt); + if (pEntity.GetHammerID() == iHammerID) + { + return startEnt; + } + } + return -1; +} + +stock int FindEntityByTargetname(int startEnt, const char[] targetname, const char[] szClassname = "*") +{ + while ((startEnt = FindEntityByClassname(startEnt, szClassname)) != -1) + { + CBaseEntity pEntity = CBaseEntity(startEnt); + char szTargetname[MAX_CLASSNAME]; + if (pEntity.GetTargetname(szTargetname, sizeof(szTargetname)) && strcmp(szTargetname, targetname, false) == 0) + { + return startEnt; + } + } + return -1; +} + +stock int FindEntityByOwner(int startEnt, CBaseEntity pOwnerEntity, const char[] szClassname = "*") +{ + while ((startEnt = FindEntityByClassname(startEnt, szClassname)) != -1) + { + CBaseEntity pEntity = CBaseEntity(startEnt); + if (pEntity.GetOwner() == pOwnerEntity) + { + return startEnt; + } + } + return -1; +} \ No newline at end of file diff --git a/scripting/include/srccoop_api/util/common/file.inc b/scripting/include/srccoop_api/util/common/file.inc new file mode 100644 index 00000000..984373a1 --- /dev/null +++ b/scripting/include/srccoop_api/util/common/file.inc @@ -0,0 +1,90 @@ +#pragma newdecls required +#pragma semicolon 1 + +/* File copy from SMLIB + * @param source Input file + * @param destination Output file + * @return True on success, false otherwise + */ +stock bool FileCopy(const char[] source, const char[] destination, bool use_valve_fs=false, const char[] valve_path_id="GAME") +{ + File file_source = OpenFile(source, "rb", use_valve_fs, valve_path_id); + + if (file_source == null) + { + return false; + } + + File file_destination = OpenFile(destination, "wb", use_valve_fs, valve_path_id); + + if (file_destination == null) + { + file_source.Close(); + return false; + } + + int buffer[32]; + int cache; + + while (!file_source.EndOfFile()) + { + cache = file_source.Read(buffer, sizeof(buffer), 1); + file_destination.Write(buffer, cache, 1); + } + + delete file_source; + delete file_destination; + + return true; +} + +/** + * This is a workaround for opening existing files, potentially located in the custom folder, with the Valve filesystem, for both reading and writing. + * Normally, opening an existing file with Valve FS using any writable modes ("r+", "a", ..) will only look for files in root game folder. + * This function currently accounts for the custom folder only, other additional Valve search paths are ignored. + * + * https://github.com/alliedmodders/sourcemod/issues/2175 + */ +stock File OpenFileEx(const char[] file, const char[] mode, bool use_valve_fs=false, const char[] valve_path_id="GAME") +{ + if (use_valve_fs && !StrEqual(mode, "r", false) && !StrEqual(mode, "rb", false) && !StrEqual(mode, "rt", false)) + { + char szFullPath[PLATFORM_MAX_PATH]; + if (ResolveValveFile(file, szFullPath, sizeof(szFullPath))) + { + return OpenFile(szFullPath, mode); + } + } + return OpenFile(file, mode, use_valve_fs, valve_path_id); +} + +/** + * Should only be used as last resort. + * See OpenFileEx + */ +stock bool ResolveValveFile(const char[] szFile, char[] szFullPath, int maxLen) +{ + DirectoryListing dir = OpenDirectory("custom"); + if (dir) + { + char buffer[PLATFORM_MAX_PATH]; + FileType ft; + + while (dir.GetNext(buffer, sizeof(buffer), ft)) + { + if (ft == FileType_Directory && !StrEqual(buffer, ".") && !StrEqual(buffer, "..")) + { + Format(buffer, sizeof(buffer), "custom/%s/%s", buffer, szFile); + if (FileExists(buffer)) + { + dir.Close(); + Format(szFullPath, maxLen, buffer); + return true; + } + } + } + + dir.Close(); + } + return false; +} diff --git a/scripting/include/srccoop_api/util/common/gamedata.inc b/scripting/include/srccoop_api/util/common/gamedata.inc new file mode 100644 index 00000000..a6cdc6ea --- /dev/null +++ b/scripting/include/srccoop_api/util/common/gamedata.inc @@ -0,0 +1,98 @@ +#pragma newdecls required +#pragma semicolon 1 + +//------------------------------------------------------ +// Macros for loading gamedata keyvalues into configuration structs +//------------------------------------------------------ + +// Prefix for keys in gamedata. Define before including. +#if !defined CONF_PREFIX + #define CONF_PREFIX "" +#endif + +// Creates a init func for the struct. Pass in a CONF_TYPE macro for each of the struct's variables. +#define CONF_INIT(%1)\ +void Initialize(GameData pGameConfig, bool bAutoClose = true) {\ + %1\ + if (bAutoClose) pGameConfig.Close();\ +} + +#define CONF_STR(%1) GetGamedataString(pGameConfig, CONF_PREFIX...#%1, this.%1, sizeof(this.%1)); +#define CONF_FLT(%1) this.%1 = GetGamedataFloat(pGameConfig, CONF_PREFIX...#%1); +#define CONF_INT(%1) this.%1 = GetGamedataInt(pGameConfig, CONF_PREFIX...#%1); +#define CONF_CLR(%1) this.%1 = GetGamedataColor(pGameConfig, CONF_PREFIX...#%1); + +//------------------------------------------------------ +// Gamedata stocks +//------------------------------------------------------ + +stock void GetGamedataString(GameData pGameConfig, const char[] szKey, char[] szVal, int len) +{ + if (!pGameConfig.GetKeyValue(szKey, szVal, len)) + SetFailState("Missing gamedata key: \"%s\"", szKey); +} + +stock float GetGamedataFloat(GameData pGameConfig, const char[] szKey) +{ + char szVal[16]; float flVal; + GetGamedataString(pGameConfig, szKey, szVal, sizeof(szVal)); + + if (!StringToFloatEx(szVal, flVal)) + SetFailState("Value for key: \"%s\" should be a float.", szKey); + + return flVal; +} + +stock int GetGamedataInt(GameData pGameConfig, const char[] szKey) +{ + char szVal[16]; int iVal; + GetGamedataString(pGameConfig, szKey, szVal, sizeof(szVal)); + + if (!StringToIntEx(szVal, iVal)) + SetFailState("Value for key: \"%s\" should be an int.", szKey); + + return iVal; +} + +stock RGBA GetGamedataColor(GameData pGameConfig, const char[] szKey, const char[] delimiter = " ") +{ + char szVal[16]; char szColor[4][4]; + GetGamedataString(pGameConfig, szKey, szVal, sizeof(szVal)); + + if (3 > ExplodeString(szVal, delimiter, szColor, sizeof(szColor), sizeof(szColor[]))) + SetFailState("Value for key: \"%s\" is not a valid color.", szKey); + + return RGBA(StringToInt(szColor[0]), StringToInt(szColor[1]), StringToInt(szColor[2]), StringToInt(szColor[3])); +} + +stock Address GetInterface(GameData pGameConfig, const char[] szLibrary, const char[] szInterface, bool bExtractIfaceVersion = true) +{ + char szBuffer[64]; + FormatEx(szBuffer, sizeof(szBuffer), "CreateInterface:%s", szLibrary); + + StartPrepSDKCall(SDKCall_Static); + if (!PrepSDKCall_SetFromConf(pGameConfig, SDKConf_Signature, szBuffer)) + SetFailState("Could not obtain game signature %s", szBuffer); + + PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer); + PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Pointer, VDECODE_FLAG_ALLOWNULL); + PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain); + Handle pCreateIfaceCall = EndPrepSDKCall(); + if (!pCreateIfaceCall) + SetFailState("Could not prep SDK call %s", szBuffer); + + Address pIfaceAddr; + if (bExtractIfaceVersion) + { + GetGamedataString(pGameConfig, szInterface, szBuffer, sizeof(szBuffer)); + pIfaceAddr = SDKCall(pCreateIfaceCall, szBuffer, 0); + } + else + { + pIfaceAddr = SDKCall(pCreateIfaceCall, szInterface, 0); + } + + pCreateIfaceCall.Close(); + + return pIfaceAddr; +} \ No newline at end of file diff --git a/scripting/include/srccoop_api/util/common/math.inc b/scripting/include/srccoop_api/util/common/math.inc new file mode 100644 index 00000000..f50de2c8 --- /dev/null +++ b/scripting/include/srccoop_api/util/common/math.inc @@ -0,0 +1,69 @@ +#pragma newdecls required +#pragma semicolon 1 + +stock void ScaleVectors(const float vecA[3], const float vecB[3], float vecResult[3]) +{ + vecResult[0] = vecA[0] * vecB[0]; + vecResult[1] = vecA[1] * vecB[1]; + vecResult[2] = vecA[2] * vecB[2]; +} + +stock void MoveVector(const float vecStart[3], const float vecEnd[3], float scale, float vecResult[3]) +{ + SubtractVectors(vecEnd, vecStart, vecResult); + ScaleVector(vecResult, scale); + AddVectors(vecStart, vecResult, vecResult); +} + +stock void GetVectorDistanceVector(const float vecA[3], const float vecB[3], float vecResult[3]) +{ + SubtractVectors(vecA, vecB, vecResult); + vecResult[0] = FloatAbs(vecResult[0]); + vecResult[1] = FloatAbs(vecResult[1]); + vecResult[2] = FloatAbs(vecResult[2]); +} + +stock bool VecEqual(const float vecA[3], const float vecB[3]) +{ + return (vecA[0] == vecB[0] && vecA[1] == vecB[1] && vecA[2] == vecB[2]); +} + +// returns true if there's an intersection between two boxes +// borrowed from public/collisionutils.cpp +stock bool IsBoxIntersectingBox(const float boxMin1[3], const float boxMax1[3], const float boxMin2[3], const float boxMax2[3]) +{ + if ((boxMin1[0] > boxMax2[0]) || (boxMax1[0] < boxMin2[0])) + return false; + if ((boxMin1[1] > boxMax2[1]) || (boxMax1[1] < boxMin2[1])) + return false; + if ((boxMin1[2] > boxMax2[2]) || (boxMax1[2] < boxMin2[2])) + return false; + return true; +} + +stock any Min(any val1, any val2) +{ + return val1 < val2 ? val1 : val2; +} + +stock any Max(any val1, any val2) +{ + return val1 > val2 ? val1 : val2; +} + +stock any Clamp(any val, any min, any max) +{ + if (val < min) + val = min; + else if (val > max) + val = max; + return val; +} + +stock bool IsInBounds(any value, any min, any max) +{ + if (value < min || value > max) + return false; + + return true; +} diff --git a/scripting/include/srccoop_api/util/common/memory.inc b/scripting/include/srccoop_api/util/common/memory.inc new file mode 100644 index 00000000..80df63fd --- /dev/null +++ b/scripting/include/srccoop_api/util/common/memory.inc @@ -0,0 +1,147 @@ +#pragma newdecls required +#pragma semicolon 1 + +#if defined __sourcescramble_ext_included + +stock MemoryPatch LoadMemPatch(GameData pGameConfig, const char[] szName, bool bEnable = true, bool bRequired = true) +{ + MemoryPatch patch = MemoryPatch.CreateFromConf(pGameConfig, szName); + if (!patch.Validate()) + { + if (bRequired) + SetFailState("Failed to verify mempatch \"%s\"", szName); + LogError("Failed to verify mempatch \"%s\"", szName); + } + else if (bEnable) + { + patch.Enable(); + } + return patch; +} + +#endif // __sourcescramble_ext_included + +stock any Deref(any addr, NumberType type = NumberType_Int32) +{ + return LoadFromAddress(view_as
(addr), type); +} + +// Address arithmetics operators + +stock Address operator+(Address oper1, int oper2) +{ + return oper1 + view_as
(oper2); +} + +stock Address operator+(int oper1, Address oper2) +{ + return view_as
(oper1) + oper2; +} + +stock Address operator-(Address oper1, int oper2) +{ + return oper1 - view_as
(oper2); +} + +stock Address operator-(int oper1, Address oper2) +{ + return view_as
(oper1) - oper2; +} + +stock bool GetBitFromInt(const int i, const int iBitIndex) +{ + if (iBitIndex < 0 || iBitIndex > 31) + ThrowError("Received out of bounds index %d; range is `0..32`", iBitIndex); + + return (i & (1 << iBitIndex)) != 0; +} + +stock void SetBitOnInt(int& i, const int iBitIndex, const bool bSetBit) +{ + if (iBitIndex < 0 || iBitIndex > 31) + ThrowError("Received out of bounds index %d; range is `0..32`", iBitIndex); + + if (bSetBit) + { + i |= (1 << iBitIndex); + } + else + { + i &= ~(1 << iBitIndex); + } +} + +// The following are attributed to github.com/nosoop/stocksoup + +/** + * Loads a null-terminated string from the given address. + * + * The function will return an empty string if the address corresponds to a nullptr. This + * functionality is present as a workaround for when an SDKCall that expects a char pointer + * receives a nullptr and attempts to dereference it (see alliedmodders/sourcemod/issues/874). + * + * If it is necessary to differentiate between an empty string and a null pointer, check if addr + * is null before calling the function, or pass a reference to bIsNullPointer. + * + * @return Number of bytes written. 0 is returned on an empty string or a null pointer. + */ +stock int LoadStringFromAddress(Address addr, char[] buffer, int maxlen, bool &bIsNullPointer = false) +{ + if (!addr) + { + bIsNullPointer = true; + return 0; + } + + int c; + char ch; + do + { + ch = view_as(Deref(addr + c, NumberType_Int8)); + buffer[c] = ch; + } while (ch && ++c < maxlen - 1); + return c; +} + +/** + * Returns an entity index from its address by attempting to read the + * CBaseEntity::m_RefEHandle member. This assumes the address of a CBaseEntity is + * passed in. + * + * @param pEntity Address of an entity. + * @return Entity index, or -1 if not valid. + */ +stock int GetEntityFromAddress(Address pEntity) +{ + if (!pEntity) + return -1; + + static int offs_RefEHandle; + if (offs_RefEHandle) + return LoadEntityFromHandleAddress(pEntity + offs_RefEHandle); + + // if we don't have it already, attempt to lookup offset based on SDK information + // CWorld is derived from CBaseEntity so it should have both offsets + int offs_angRotation = FindDataMapInfo(0, "m_angRotation"), + offs_vecViewOffset = FindDataMapInfo(0, "m_vecViewOffset"); + + if (offs_angRotation == -1) + { + ThrowError("Could not find offset for ((CBaseEntity) CWorld)::m_angRotation"); + } + else if (offs_vecViewOffset == -1) + { + ThrowError("Could not find offset for ((CBaseEntity) CWorld)::m_vecViewOffset"); + } + else if ((offs_angRotation + 0x0C) != (offs_vecViewOffset - 0x04)) + { + char game[32]; + GetGameFolderName(game, sizeof(game)); + ThrowError("Could not confirm offset of CBaseEntity::m_RefEHandle " + ... "(incorrect assumption for game '%s'?)", game); + } + + // offset seems right, cache it for the next call + offs_RefEHandle = offs_angRotation + 0x0C; + return GetEntityFromAddress(pEntity); +} diff --git a/scripting/include/srccoop_api/util/common/player.inc b/scripting/include/srccoop_api/util/common/player.inc new file mode 100644 index 00000000..5a076c78 --- /dev/null +++ b/scripting/include/srccoop_api/util/common/player.inc @@ -0,0 +1,233 @@ +#pragma newdecls required +#pragma semicolon 1 + +/** + * Return nearest alive player if exists, otherwise return nearest player that passes requirements. + */ +stock CBasePlayer GetNearestPlayerPreferAlive(CBaseEntity pOriginEntity, bool bNoSpectators = false) +{ + return GetNearestPlayer(pOriginEntity, false, bNoSpectators, true); +} + +stock CBasePlayer GetNearestPlayerPreferAliveEx(float vecPos[3], bool bNoSpectators = false) +{ + return GetNearestPlayerEx(vecPos, false, bNoSpectators, true); +} + +/** + * Return nearest alive player. + */ +stock CBasePlayer GetNearestPlayerAlive(CBaseEntity pOriginEntity) +{ + return GetNearestPlayer(pOriginEntity, true, true, false); +} + +stock CBasePlayer GetNearestPlayerAliveEx(float vecPos[3]) +{ + return GetNearestPlayerEx(vecPos, true, true, false); +} + +/** + * Return nearest player that passes requirements. + */ +stock CBasePlayer GetNearestPlayer(CBaseEntity pOriginEntity, bool bAliveOnly = true, bool bNoSpectators = true, bool bPreferAlive = false) +{ + float vecEntityPosition[3]; + pOriginEntity.GetAbsOrigin(vecEntityPosition); + return GetNearestPlayerEx(vecEntityPosition, bAliveOnly, bNoSpectators, bPreferAlive); +} + +stock CBasePlayer GetNearestPlayerEx(float vecPos[3], bool bAliveOnly = true, bool bNoSpectators = true, bool bPreferAlive = false) +{ + CBasePlayer pBestPlayer = NULL_CBASEENTITY; + float flBestDistance = FLT_MAX; + bool bFoundAlive; + + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientInGame(i) || IsFakeClient(i)) + continue; + + bool bAlive = IsPlayerAlive(i); + if (bAliveOnly) + { + if (!bAlive) + continue; + } + else if (bNoSpectators && GetClientTeam(i) == TEAM_SPECTATOR) + { + continue; + } + + if (bPreferAlive) + { + if (bFoundAlive) + { + if (!bAlive) + continue; + } + else if (bAlive) + { + bFoundAlive = true; + flBestDistance = FLT_MAX; + } + } + + CBasePlayer pPlayer = CBasePlayer(i); + float vecPlayerPosition[3]; + pPlayer.GetAbsOrigin(vecPlayerPosition); + + float flDistance = GetVectorDistance(vecPos, vecPlayerPosition, true); + if (flDistance < flBestDistance) + { + pBestPlayer = pPlayer; + flBestDistance = flDistance; + } + } + return pBestPlayer; +} + +stock int GetRealClientCount(bool bInGameOnly, bool bAliveOnly = false, bool bNoSpectators = false) +{ + int clients; + for (int i = 1; i <= MaxClients; i++) + { + if ((bInGameOnly? IsClientInGame(i) : IsClientConnected(i)) + && !IsFakeClient(i) + && (!bAliveOnly || IsPlayerAlive(i)) + && (!bNoSpectators || GetClientTeam(i) != TEAM_SPECTATOR)) + { + clients++; + } + } + return clients; +} + +enum CanTeleportResult +{ + CAN_TP_NO, + CAN_TP_YES, + CAN_TP_MUSTDUCK //🦆// +} + +stock CanTeleportResult CanTeleportPlayer(CBasePlayer pPlayer, float vecOrigin[3], bool bExact = false, bool bDuckCheck = true, bool bOnlyVaried = false) +{ + if (!bOnlyVaried) + { + bool bDidHit; + + TR_TraceHullFilter(vecOrigin, vecOrigin, view_as(VEC_HULL_MIN), view_as(VEC_HULL_MAX), MASK_PLAYERSOLID|CONTENTS_HITBOX, CanTeleportPlayer_TraceFilter); + bDidHit = TR_DidHit(); + if (!bDidHit) return CAN_TP_YES; + + if (bDuckCheck) + { + TR_TraceHullFilter(vecOrigin, vecOrigin, view_as(VEC_DUCK_HULL_MIN), view_as(VEC_DUCK_HULL_MAX), MASK_PLAYERSOLID|CONTENTS_HITBOX, CanTeleportPlayer_TraceFilter); + bDidHit = TR_DidHit(); + if (!bDidHit) return CAN_TP_MUSTDUCK; + } + } + + if (!bExact) + { + // try varying the positions in a radius + static const float yaw[] = {0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0}; + static const float distance[] = {25.0, 50.0}; + static const float zDistance[] = {0.0, 25.0, 50.0}; + + for (int z = 0; z < sizeof(zDistance); z++) + { + for (int d = 0; d < sizeof(distance); d++) + { + for (int y = 0; y < sizeof(yaw); y++) + { + if (CanTeleportPlayer_Offset(vecOrigin, yaw[y], distance[d], zDistance[z])) + { + return CAN_TP_YES; + } + } + } + } + } + + return CAN_TP_NO; +} + +static stock bool CanTeleportPlayer_Offset(float vecOrigin[3], float yaw, float distance, float z) +{ + float newPos[3], angles[3]; + newPos = vecOrigin; angles[1] = yaw; + + GetAngleVectors(angles, angles, NULL_VECTOR, NULL_VECTOR); + newPos[0] += angles[0] * distance; + newPos[1] += angles[1] * distance; + newPos[2] += z; + + //TE_SetupGlowSprite(newPos, PrecacheModel("sprites/orangeglow1.vmt"), 60.0, 0.1, 255); TE_SendToAll(); + + TR_TraceHullFilter(newPos, newPos, view_as(VEC_HULL_MIN), view_as(VEC_HULL_MAX), MASK_PLAYERSOLID|CONTENTS_HITBOX, CanTeleportPlayer_TraceFilter); + if (!TR_DidHit()) + { + vecOrigin = newPos; + return true; + } + + return false; +} + +static stock bool CanTeleportPlayer_TraceFilter(int entity, int mask, any data) +{ + CBaseEntity pEntity = CBaseEntity(entity); + if (pEntity.IsPlayer() || pEntity.IsPickupItem()) + { + return false; + } + return true; +} + +stock float PlayerDotProductToEntity(CBasePlayer pPlayer, CBaseEntity pEnt) +{ + float entOrigin[3]; + pEnt.GetAbsOrigin(entOrigin); + return PlayerDotProductToPoint(pPlayer, entOrigin); +} + +stock float PlayerDotProductToEntityCenter(CBasePlayer pPlayer, CBaseEntity pEnt) +{ + float vecCenter[3]; + pEnt.WorldSpaceCenter(vecCenter); + return PlayerDotProductToPoint(pPlayer, vecCenter); +} + +stock float PlayerDotProductToPoint(CBasePlayer pPlayer, const float vecPoint[3]) +{ + float angles[3], origin[3], fwd[3], targetDir[3]; + pPlayer.GetEyeAngles(angles); + GetAngleVectors(angles, fwd, NULL_VECTOR, NULL_VECTOR); + + pPlayer.GetEyePosition(origin); + MakeVectorFromPoints(origin, vecPoint, targetDir); + NormalizeVector(targetDir, targetDir); + + return GetVectorDotProduct(fwd, targetDir); +} + +stock void SetClientGamerules(const char[] szGamerulesClass) +{ + int iTable = FindStringTable("GameRulesCreation"); + if (iTable == INVALID_STRING_TABLE) + { + ThrowError("Could not find string table GameRulesCreation !"); + } + SetStringTableData(iTable, 0, szGamerulesClass, strlen(szGamerulesClass) + 1); +} + +stock int GetClientGamerules(char[] szGamerulesClass, int iMaxLength) +{ + int iTable = FindStringTable("GameRulesCreation"); + if (iTable == INVALID_STRING_TABLE) + { + ThrowError("Could not find string table GameRulesCreation !"); + } + return GetStringTableData(iTable, 0, szGamerulesClass, iMaxLength); +} \ No newline at end of file diff --git a/scripting/include/srccoop_api/util/common/regex.inc b/scripting/include/srccoop_api/util/common/regex.inc new file mode 100644 index 00000000..0d8a6db2 --- /dev/null +++ b/scripting/include/srccoop_api/util/common/regex.inc @@ -0,0 +1,67 @@ +#pragma newdecls required +#pragma semicolon 1 + +/** + * Matches a regex pattern against a string if pattern is enclosed by forward slashes "/". + * Otherwise acts as a regular equals check. + */ +stock bool StrEqualsRegex(const char[] pattern, const char[] str, bool caseSensitive = false) +{ + int patternLength = strlen(pattern); + if (patternLength > 1 && pattern[0] == '/' && pattern[patternLength - 1] == '/') + { + if (str[0] == '\0') + { + // regexing empty string errors out.. + return false; + } + char[] patternStripped = new char[--patternLength]; + strcopy(patternStripped, patternLength, pattern[1]); + int substrings = SimpleRegexMatch(str, patternStripped, caseSensitive? 0 : PCRE_CASELESS); + return (substrings > 0); + } + return strcmp(pattern, str, caseSensitive) == 0; +} + +/** + * Simple * wildcard pattern matching. Best for comparing map names (think maps command), file paths (think gitignore), etc. + * + * Example pattern: *pine* + * Matched strings: pine, pineapple, spines ... + * + */ +stock bool StrEqualsWildcard(const char[] pattern, const char[] str, bool caseSensitive = false) +{ + int regexLen = strlen(pattern) * 2 + 3; + char[] regex = new char[regexLen]; + + EscapeRegex(pattern, regex, regexLen, "*"); + ReplaceString(regex, regexLen, "*", ".*"); + Format(regex, regexLen, "^%s$", regex); + + int substrings = SimpleRegexMatch(str, regex, caseSensitive? 0 : PCRE_CASELESS); + return (substrings > 0); +} + +/** + * Quotes / escapes all special regex characters in a string. + * @param allowedChars Characters that should not be escaped. + * @return Characters written + */ +stock int EscapeRegex(const char[] str, char[] dest, int destLen, const char[] allowedChars = "") +{ + static const char specialChars[] = ".\\+*?[^]$(){}=!<>|:-#"; + int i, j; + while (str[i] != EOS && (j + 1) < destLen) + { + if (FindCharInString(specialChars, str[i]) != -1 && FindCharInString(allowedChars, str[i]) == -1) + { + if (j + 2 >= destLen) + break; + dest[j++] = '\\'; + } + dest[j++] = str[i++]; + } + dest[j] = EOS; + return j; +} \ No newline at end of file diff --git a/scripting/include/srccoop/util/color.inc b/scripting/include/srccoop_api/util/common/rgba.inc similarity index 81% rename from scripting/include/srccoop/util/color.inc rename to scripting/include/srccoop_api/util/common/rgba.inc index b65bad1b..a2ad1d27 100644 --- a/scripting/include/srccoop/util/color.inc +++ b/scripting/include/srccoop_api/util/common/rgba.inc @@ -1,11 +1,6 @@ #pragma newdecls required #pragma semicolon 1 -#if defined _srccoop_api_color_included - #endinput -#endif -#define _srccoop_api_color_included - methodmap RGBA { public RGBA(const int r, const int g, const int b, const int a) @@ -40,4 +35,14 @@ methodmap RGBA return (view_as(this) >> 24) & 0xFF; } } + + public int[] ToArray() + { + int arr[4]; + arr[0] = this.r; + arr[1] = this.g; + arr[2] = this.b; + arr[3] = this.a; + return arr; + } } diff --git a/scripting/include/srccoop_api/util/common/string.inc b/scripting/include/srccoop_api/util/common/string.inc new file mode 100644 index 00000000..6a9a5793 --- /dev/null +++ b/scripting/include/srccoop_api/util/common/string.inc @@ -0,0 +1,144 @@ +#pragma newdecls required +#pragma semicolon 1 + +// Obtains the max formatted length (including the negative sign and null terminator) of a 32-bit signed integer at compile time. +// This will accept both positive and negative values. +#define MAX_CHARS_INT(%1) ( \ +view_as(!!((%1) & (1 << 31))) + \ +1 + \ +view_as(!!((%1) / 10)) + \ +view_as(!!((%1) / 10 / 10)) + \ +view_as(!!((%1) / 10 / 10 / 10)) + \ +view_as(!!((%1) / 10 / 10 / 10 / 10)) + \ +view_as(!!((%1) / 10 / 10 / 10 / 10 / 10)) + \ +view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10)) + \ +view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10 / 10)) + \ +view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10)) + \ +view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10)) + \ +view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10)) + \ +view_as(!!((%1) / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10 / 10)) + \ +1 \ +) + +stock void FormatTimeLength(int seconds, char[] out, int size) +{ + int hours = seconds / 3600; + int mins = (seconds % 3600) / 60; + int secs = seconds % 60; + if (hours != 0) + { + Format(out, size, "%dh ", hours); + } + if (mins != 0) + { + Format(out, size, "%s%dm ", out, mins); + } + if (secs != 0) + { + Format(out, size, "%s%ds", out, secs); + } +} + +stock void FormatTimeLengthLong(int seconds, char[] out, int size) +{ + int hours = seconds / 3600; + int mins = (seconds % 3600) / 60; + int secs = seconds % 60; + char separator[10]; + if (hours != 0) + { + Format(out, size, "%d hour%s", hours, hours == 1? "" : "s"); + separator = " "; + } + if (mins != 0) + { + Format(out, size, "%s%s%d minute%s", out, separator, mins, mins == 1? "" : "s"); + separator = " "; + } + if (secs != 0) + { + Format(out, size, "%s%s%d second%s", out, mins == 0? separator : " and ", secs, secs == 1? "" : "s"); + } +} + +// Like SplitString but more efficient +stock int SplitByChar(const char[] szSource, char c, char[] szBuffer, int nSize) +{ + int i = 0; + while (szSource[i] != c) + { + if (szSource[i] == '\0') + { + return -1; + } + i++; + } + i++; + strcopy(szBuffer, i < nSize ? i : nSize, szSource); + return i; +} + +stock void LowerCaseString(const char[] szInput, char[] szOutput, int iSize) +{ + iSize--; + int x = 0; + while (szInput[x] != '\0' && x < iSize) + { + szOutput[x] = CharToLower(szInput[x]); + x++; + } + szOutput[x] = '\0'; +} + +stock void UpperCaseString(const char[] szInput, char[] szOutput, int iSize) +{ + iSize--; + int x = 0; + while (szInput[x] != '\0' && x < iSize) + { + szOutput[x] = CharToUpper(szInput[x]); + x++; + } + szOutput[x] = '\0'; +} + +stock bool StrStartsWith(const char[] str, const char[] prefix, bool caseSensitive = true) +{ + return strncmp(str, prefix, strlen(prefix), caseSensitive) == 0; +} + +stock bool StrEndsWith(const char[] str, const char[] suffix, bool caseSensitive = true) +{ + return StrEndsWithEx(str, strlen(str), suffix, caseSensitive); +} + +stock bool StrEndsWithEx(const char[] str, int realLen, const char[] suffix, bool caseSensitive = true) +{ + int suffixLen = strlen(suffix); + return (realLen >= suffixLen && StrEqual(str[realLen - suffixLen], suffix, caseSensitive)); +} + +stock bool IsAddSynonym(const char[] str) +{ + return (strcmp(str, "add", false) == 0 || strcmp(str, "create", false) == 0); +} + +stock bool IsRemoveSynonym(const char[] str) +{ + return (strcmp(str, "remove", false) == 0 || strcmp(str, "delete", false) == 0); +} + +stock bool IsModifySynonym(const char[] str) +{ + return (strcmp(str, "modify", false) == 0 || strcmp(str, "edit", false) == 0); +} + +stock bool IsEnableSynonym(const char[] str) +{ + return (strcmp(str, "enable", false) == 0 || strcmp(str, "turnon", false) == 0 || strcmp(str, "on", false) == 0); +} + +stock bool IsDisableSynonym(const char[] str) +{ + return (strcmp(str, "disable", false) == 0 || strcmp(str, "turnoff", false) == 0 || strcmp(str, "off", false) == 0); +} diff --git a/scripting/include/srccoop/util/stringbuilder.inc b/scripting/include/srccoop_api/util/common/stringbuilder.inc similarity index 96% rename from scripting/include/srccoop/util/stringbuilder.inc rename to scripting/include/srccoop_api/util/common/stringbuilder.inc index 8b34bf63..9e47700d 100644 --- a/scripting/include/srccoop/util/stringbuilder.inc +++ b/scripting/include/srccoop_api/util/common/stringbuilder.inc @@ -1,8 +1,3 @@ -#if defined _srccoop_util_stringbuilder_included - #endinput -#endif -#define _srccoop_util_stringbuilder_included - #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/srccoop.sp b/scripting/srccoop.sp index 9d3628cc..96528da6 100644 --- a/scripting/srccoop.sp +++ b/scripting/srccoop.sp @@ -22,23 +22,6 @@ void LoadGameData() // Init SDKCalls for classdef InitClassdef(pGameConfig); - - // Calls - - #if defined PLAYERPATCH_SERVERSIDE_RAGDOLLS - char szCreateServerRagdoll[] = "CreateServerRagdoll"; - StartPrepSDKCall(SDKCall_Static); - if (!PrepSDKCall_SetFromConf(pGameConfig, SDKConf_Signature, szCreateServerRagdoll)) - SetFailState("Could not obtain gamedata signature %s", szCreateServerRagdoll); - PrepSDKCall_SetReturnInfo(SDKType_CBaseEntity, SDKPass_Pointer); - PrepSDKCall_AddParameter(SDKType_CBaseEntity, SDKPass_Pointer); // CBaseAnimating *pAnimating - PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain); // int forceBone - PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain); // const CTakeDamageInfo &info - PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain); // int collisionGroup - PrepSDKCall_AddParameter(SDKType_Bool, SDKPass_Plain); // bool bUseLRURetirement - if (!(g_pCreateServerRagdoll = EndPrepSDKCall())) - SetFailState("Could not prep SDK call %s", szCreateServerRagdoll); - #endif LoadDHookVirtual(pGameConfig, hkLevelInit, "CServerGameDLL::LevelInit"); if (hkLevelInit.HookRaw(Hook_Pre, IServerGameDLL.Get().GetAddress(), Hook_OnLevelInit) == INVALID_HOOK_ID) @@ -226,16 +209,6 @@ void ToggleGlobalPatches(bool bCoopMode) } } -void LoadConfig() -{ - GameData pGameConfig = LoadGameConfigFile(SRCCOOP_CONFIG_GAMEDATA_NAME); - if (pGameConfig == null) - SetFailState("Couldn't load game config: \"%s\"", SRCCOOP_CONFIG_GAMEDATA_NAME); - - Conf.Initialize(pGameConfig); - pGameConfig.Close(); -} - public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { #if defined CHECK_ENGINE @@ -253,7 +226,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max public void OnPluginStart() { - LoadConfig(); + Conf.Initialize(LoadSourceCoopConfig()); LoadGameData(); LoadTranslations("common.phrases"); /* reuse some translations (identified by use of capital letters) */ LoadTranslations("srccoop.phrases"); @@ -263,8 +236,10 @@ public void OnPluginStart() #if defined GAMEPATCH_TEAMSELECT_UI g_pConvarDisableTeamSelect = CreateConVar("sourcecoop_disable_teamselect", "1", "Whether to skip the team select screen and spawn in instantly.", _, true, 0.0, true, 1.0); #endif - g_pConvarCoopRespawnTime = CreateConVar("sourcecoop_respawntime", "2.0", "Sets player respawn time in seconds.", _, true, 0.1); + #if defined SRCCOOP_BLACKMESA g_pConvarCleanHud = CreateConVar("sourcecoop_clean_hud", "1", "Whether to hide non-essential hud elements. (Black Mesa: hides status at top of the screen)", _, true, 0.0, true, 1.0); + #endif + g_pConvarCoopRespawnTime = CreateConVar("sourcecoop_respawntime", "2.0", "Sets player respawn time in seconds.", _, true, 0.1); g_pConvarStartWaitPeriod = CreateConVar("sourcecoop_start_wait_period", "15.0", "The max number of seconds to wait since first player spawned in to start the map. ", _, true, 0.0); g_pConvarStartWaitMode = CreateConVar("sourcecoop_start_wait_mode", "2", "\n0 = The timer is not skipped (exceptions are maps without an intro_type or delayed outputs set).\n1 = The timer is skipped when all players enter the game.\n2 = The timer is skipped when player count matches the previous map's player count.", _, true, 0.0, true, 2.0); g_pConvarEndWaitPeriod = CreateConVar("sourcecoop_end_wait_period", "60.0", "The max number of seconds to wait since first player triggered a changelevel. The timer speed increases each time a new player finishes the level.", _, true, 0.0); @@ -280,11 +255,13 @@ public void OnPluginStart() mp_forcerespawn = FindConVar("mp_forcerespawn"); // Black Mesa ConVars. + #if defined SRCCOOP_BLACKMESA sv_always_run = FindConVar("sv_always_run"); sv_speed_sprint = FindConVar("sv_speed_sprint"); sv_speed_walk = FindConVar("sv_speed_walk"); sv_jump_long_enabled = FindConVar("sv_jump_long_enabled"); sv_long_jump_manacost = FindConVar("sv_long_jump_manacost"); + #endif #if defined PLAYERPATCH_BM_CLIENT_PREDICTION sv_always_run.Flags &= ~FCVAR_REPLICATED; @@ -1102,7 +1079,7 @@ public void Hook_PlayerWeaponEquipPost(int client, int weapon) } } -public MRESReturn Hook_RestoreWorld(Handle hReturn) +public MRESReturn Hook_RestoreWorld(DHookReturn hReturn) { if (CoopManager.IsCoopModeEnabled()) { @@ -1113,7 +1090,7 @@ public MRESReturn Hook_RestoreWorld(Handle hReturn) return MRES_Ignored; } -public MRESReturn Hook_RespawnPlayers(Handle hReturn) +public MRESReturn Hook_RespawnPlayers(DHookReturn hReturn) { if (CoopManager.IsCoopModeEnabled()) { diff --git a/scripting/srccoop_addon_difficulty.sp b/scripting/srccoop_addon_difficulty.sp index 56df66be..f9a6beba 100644 --- a/scripting/srccoop_addon_difficulty.sp +++ b/scripting/srccoop_addon_difficulty.sp @@ -1,7 +1,7 @@ #include #include -#include +#include #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/srccoop_addon_earbleed.sp b/scripting/srccoop_addon_earbleed.sp index 614f4fc4..08e1d766 100644 --- a/scripting/srccoop_addon_earbleed.sp +++ b/scripting/srccoop_addon_earbleed.sp @@ -2,7 +2,7 @@ #include #include -#include +#include #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/srccoop_addon_fpd.sp b/scripting/srccoop_addon_fpd.sp index 2b6a8892..8e3cad6d 100644 --- a/scripting/srccoop_addon_fpd.sp +++ b/scripting/srccoop_addon_fpd.sp @@ -3,7 +3,7 @@ #include #include -#include +#include #pragma newdecls required #pragma semicolon 1 @@ -225,7 +225,7 @@ public void SC_OnPlayerRagdollCreated(CBasePlayer pPlayer, CBaseAnimating pRagdo int fadeDuration = g_pConvarFadeToBlackLength.IntValue; if (fadeDuration) { - Client_ScreenFade(pPlayer.entindex, fadeDuration, view_as(FFADE_OUT | FFADE_STAYOUT)); + pPlayer.ScreenFade(fadeDuration, RGBA(0, 0, 0, 255), FFADE_OUT | FFADE_STAYOUT); } } diff --git a/scripting/srccoop_addon_killsounds.sp b/scripting/srccoop_addon_killsounds.sp index 2c3b9acb..3a88c59b 100644 --- a/scripting/srccoop_addon_killsounds.sp +++ b/scripting/srccoop_addon_killsounds.sp @@ -1,7 +1,7 @@ #include #include -#include +#include #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/srccoop_addon_landing_screen.sp b/scripting/srccoop_addon_landing_screen.sp index 06294372..0e7823e8 100644 --- a/scripting/srccoop_addon_landing_screen.sp +++ b/scripting/srccoop_addon_landing_screen.sp @@ -2,7 +2,7 @@ #include #include -#include +#include #pragma newdecls required #pragma semicolon 1 @@ -66,7 +66,7 @@ public void Event_PlayerChangeTeam(Event hEvent, const char[] szName, bool bDont if (!bHidden[client]) { int iTeam = hEvent.GetInt("team"); - if (iTeam == TEAM_SCIENTIST || iTeam == TEAM_MARINES || iTeam == TEAM_UNASSIGNED) + if (iTeam > TEAM_SPECTATOR || iTeam == TEAM_UNASSIGNED) { ClientCommand(client, "r_screenoverlay 0"); bHidden[client] = true; diff --git a/scripting/srccoop_addon_revive.sp b/scripting/srccoop_addon_revive.sp index a2e37800..ed5378fa 100644 --- a/scripting/srccoop_addon_revive.sp +++ b/scripting/srccoop_addon_revive.sp @@ -4,7 +4,7 @@ #define CONF_PREFIX "REVIVE_" -#include +#include #pragma semicolon 1; #pragma newdecls required; @@ -25,7 +25,7 @@ enum struct ReviveConfig char SND_RESPAWN[PLATFORM_MAX_PATH]; int SND_RESPAWN_PITCH; int SNDLEVEL; - int BAR_COLOR[4]; + RGBA BAR_COLOR; char BAR_MODEL[PLATFORM_MAX_PATH]; char RAGDOLL_PARTICLE[128]; @@ -67,9 +67,7 @@ public void OnPluginStart() LoadTranslations("common.phrases"); InitSourceCoopAddon(); - GameData pConfig = LoadSourceCoopConfig(); - Conf.Initialize(pConfig); - pConfig.Close(); + Conf.Initialize(LoadSourceCoopConfig()); g_pConVarReviveTime = CreateConVar("sourcecoop_revive_time", "4.0", "Sets time that you have to hold E to revive.", _, true, 0.0, false); g_pConVarReviveScore = CreateConVar("sourcecoop_revive_score", "1", "Sets score to give for reviving a player.", _, true, 0.0, false); @@ -182,7 +180,7 @@ public Action Command_Revive(int client, int args) if (SC_Respawn(pTarget, g_pSpawnOptions)) { - Client_ScreenFade(iTarget, 512, view_as(FFADE_PURGE | FFADE_IN), 1, 0, 0, 200, 255); + pTarget.ScreenFade(512, RGBA(0, 0, 200, 255), FFADE_PURGE | FFADE_IN, 1); EmitSoundToClient(iTarget, Conf.SND_RESPAWN, iTarget, SNDCHAN_STATIC, SNDLEVEL_NONE, .pitch = Conf.SND_RESPAWN_PITCH); MsgReply(client, "Respawned '%N'.", iTarget); if (client != iTarget) @@ -252,10 +250,10 @@ public void OnPlayerRunCmdPost(int client, int buttons) if (g_flNextSpriteUpdate[client] <= GetGameTime()) { Client_ProgressBar(pPlayer, + .color = Conf.BAR_COLOR, .flTime = g_pConVarReviveTime.FloatValue, .flBarLength = 30.0, .flBarWidth = 0.3, - .Color = Conf.BAR_COLOR, .flDistFromPlayer = 20.0); g_flNextSpriteUpdate[client] = GetGameTime() + g_pConVarReviveTime.FloatValue; @@ -268,7 +266,7 @@ public void OnPlayerRunCmdPost(int client, int buttons) if (SC_Respawn(pTarget, g_pSpawnOptions)) { - Client_ScreenFade(pTarget.entindex, 512, view_as(FFADE_PURGE | FFADE_IN), 1, 0, 0, 200, 255); + pTarget.ScreenFade(512, RGBA(0, 0, 200, 255), FFADE_PURGE | FFADE_IN, 1); EmitAmbientSound(Conf.SND_RESPAWN, g_pSpawnOptions.vecOrigin, .level = Conf.SNDLEVEL, .pitch = Conf.SND_RESPAWN_PITCH); // Give score to reviver @@ -297,7 +295,7 @@ public void OnPlayerRunCmdPost(int client, int buttons) if (GetVectorDistance(vecEyeOrigin, vecRagdollPosition, false) < 100.0) { - TR_TraceRayFilter(vecEyeOrigin, vecEyeAngles, MASK_SOLID, RayType_Infinite, TraceEntityFilter, client); + TR_TraceRayFilter(vecEyeOrigin, vecEyeAngles, MASK_SOLID, RayType_Infinite, TraceEntityFilter_IgnoreData, client); TR_GetEndPosition(vecEyeOrigin); if (GetVectorDistance(vecEyeOrigin, vecRagdollPosition, false) < 100.0) { @@ -343,13 +341,6 @@ public void OnClientDisconnect_Post(int client) g_pRagdollEffectsTimer[client] = null; } -public bool TraceEntityFilter(int entity, int mask, any data) -{ - if (entity == data) - return false; - return true; -} - public void SC_OnPlayerRagdollCreated(CBasePlayer pPlayer, CBaseAnimating pRagdoll) { int client = pPlayer.entindex; @@ -393,9 +384,9 @@ public void Timer_SetRagdollEffects(Handle timer, CBasePlayer pPlayer) //------------------------------------------------------ // Progress bar rendering //------------------------------------------------------ -CBaseEntity g_pProgressBar[MAXPLAYERS+1] = {NULL_CBASEENTITY, ...}; +CBaseEntity g_pProgressBar[MAXPLAYERS + 1] = {NULL_CBASEENTITY, ...}; -stock void Client_ProgressBar(CBasePlayer pPlayer, float flTime = 4.0, float flBarLength = 30.0, float flBarWidth = 0.3, int Color[4] = {0, 255, 0, 255}, float flDistFromPlayer = 20.0) +stock void Client_ProgressBar(CBasePlayer pPlayer, RGBA color, float flTime = 4.0, float flBarLength = 30.0, float flBarWidth = 0.3, float flDistFromPlayer = 20.0) { // Always remove previous bar if there is one Client_RemoveProgressBar(pPlayer.entindex); @@ -406,61 +397,54 @@ stock void Client_ProgressBar(CBasePlayer pPlayer, float flTime = 4.0, float flB { pPlayer.GetEyePosition(vecEyePosition); - int iBeam = SetupBeamBar(flBarWidth, vecEyePosition, Color, 2); - if (IsValidEntity(iBeam)) - { - int iBarBox = SetupBeamBar(flBarWidth*1.2, vecEyePosition, {255, 255, 255, 80}, 5); - if (IsValidEntity(iBarBox)) - { - SetEntPropEnt(iBeam, Prop_Data, "m_hEffectEntity", iBarBox); - SetEntPropEnt(iBarBox, Prop_Data, "m_hEffectEntity", pPlayer.entindex); - SDKHookEx(iBarBox, SDKHook_SetTransmit, Transmit_ProgressBarBox); - } - - g_pProgressBar[pPlayer.entindex] = CBaseEntity(iBeam); - static float vecStats[3]; - vecStats[0] = flTime; - vecStats[1] = flBarLength; - vecStats[2] = flDistFromPlayer; - SetEntPropVector(iBeam, Prop_Data, "m_vecMaxs", vecStats); - SetEntPropFloat(iBeam, Prop_Data, "m_flLocalTime", GetGameTime() + flTime); + CBeam pBeam = SetupBeamBar(flBarWidth, vecEyePosition, color, 2); + CBeam pBarBox = SetupBeamBar(flBarWidth * 1.2, vecEyePosition, RGBA(255, 255, 255, 80), 5); + + pBeam.SetEffectEntity(pBarBox); + pBarBox.SetEffectEntity(pPlayer); + g_pProgressBar[pPlayer.entindex] = pBeam; - SDKHookEx(iBeam, SDKHook_SetTransmit, Transmit_ProgressBar); - } + float vecStats[3]; + vecStats[0] = flTime; + vecStats[1] = flBarLength; + vecStats[2] = flDistFromPlayer; + pBeam.SetMaxs(vecStats); + pBeam.SetLocalTime(GetGameTime() + flTime); + + SDKHook(pBeam.entindex, SDKHook_SetTransmit, Transmit_ProgressBar); + SDKHook(pBarBox.entindex, SDKHook_SetTransmit, Transmit_ProgressBarBox); } return; } -stock int SetupBeamBar(float flBarWidth, float vecInitOrigin[3], int Color[4], int iRenderMode) +stock CBeam SetupBeamBar(float flBarWidth, float vecInitOrigin[3], RGBA color, int iRenderMode) { - static int iBeam; - iBeam = CreateEntityByName("beam"); - if (IsValidEntity(iBeam)) - { - DispatchKeyValue(iBeam, "model", Conf.BAR_MODEL); - DispatchKeyValue(iBeam, "texture", "sprites/halo01.vmt"); - SetEntProp(iBeam, Prop_Data, "m_nModelIndex", g_iBeamSprite); - SetEntProp(iBeam, Prop_Data, "m_nHaloIndex", 0); - TeleportEntity(iBeam, vecInitOrigin, NULL_VECTOR, NULL_VECTOR); - DispatchSpawn(iBeam); - ActivateEntity(iBeam); - - SetEntityRenderColor(iBeam, Color[0], Color[1], Color[2], Color[3]); - SetEntProp(iBeam, Prop_Data, "m_nBeamType", 1); - SetEntProp(iBeam, Prop_Data, "m_nBeamFlags", 0); - SetEntProp(iBeam, Prop_Data, "m_nNumBeamEnts", 2); - SetEntPropVector(iBeam, Prop_Data, "m_vecEndPos", vecInitOrigin); - SetEntPropFloat(iBeam, Prop_Data, "m_fWidth", flBarWidth); - SetEntPropFloat(iBeam, Prop_Data, "m_fEndWidth", flBarWidth); - SetEntPropFloat(iBeam, Prop_Data, "m_fSpeed", 0.0); - SetEntPropFloat(iBeam, Prop_Data,"m_flFrameRate", 0.0); - SetEntPropFloat(iBeam, Prop_Data,"m_flHDRColorScale", 1.0); - SetEntProp(iBeam, Prop_Data, "m_nDissolveType", -1); - SetEntProp(iBeam, Prop_Data, "m_nRenderMode", iRenderMode); - SetEntPropFloat(iBeam, Prop_Data, "m_fHaloScale", 0.0); - } - return iBeam; + CBeam pBeam = CBeam.Create(); + int iBeam = pBeam.entindex; + DispatchKeyValue(iBeam, "model", Conf.BAR_MODEL); + DispatchKeyValue(iBeam, "texture", "sprites/halo01.vmt"); + SetEntProp(iBeam, Prop_Data, "m_nModelIndex", g_iBeamSprite); + SetEntProp(iBeam, Prop_Data, "m_nHaloIndex", 0); + TeleportEntity(iBeam, vecInitOrigin, NULL_VECTOR, NULL_VECTOR); + DispatchSpawn(iBeam); + ActivateEntity(iBeam); + + pBeam.SetRenderColor(color); + SetEntProp(iBeam, Prop_Data, "m_nBeamType", 1); + SetEntProp(iBeam, Prop_Data, "m_nBeamFlags", 0); + SetEntProp(iBeam, Prop_Data, "m_nNumBeamEnts", 2); + SetEntPropVector(iBeam, Prop_Data, "m_vecEndPos", vecInitOrigin); + SetEntPropFloat(iBeam, Prop_Data, "m_fWidth", flBarWidth); + SetEntPropFloat(iBeam, Prop_Data, "m_fEndWidth", flBarWidth); + SetEntPropFloat(iBeam, Prop_Data, "m_fSpeed", 0.0); + SetEntPropFloat(iBeam, Prop_Data,"m_flFrameRate", 0.0); + SetEntPropFloat(iBeam, Prop_Data,"m_flHDRColorScale", 1.0); + SetEntProp(iBeam, Prop_Data, "m_nDissolveType", -1); + SetEntProp(iBeam, Prop_Data, "m_nRenderMode", iRenderMode); + SetEntPropFloat(iBeam, Prop_Data, "m_fHaloScale", 0.0); + + return pBeam; } stock void Client_RemoveProgressBar(int iPlayer) diff --git a/scripting/srccoop_addon_scoring.sp b/scripting/srccoop_addon_scoring.sp index 698ff101..b6d055bf 100644 --- a/scripting/srccoop_addon_scoring.sp +++ b/scripting/srccoop_addon_scoring.sp @@ -2,7 +2,7 @@ #include #include -#include +#include #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/srccoop_addon_thirdperson.sp b/scripting/srccoop_addon_thirdperson.sp index 34d393c0..6cd96bd5 100644 --- a/scripting/srccoop_addon_thirdperson.sp +++ b/scripting/srccoop_addon_thirdperson.sp @@ -1,5 +1,5 @@ #include -#include +#include #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/srccoop_addon_unstuck.sp b/scripting/srccoop_addon_unstuck.sp index 6f294f60..0c75cefd 100644 --- a/scripting/srccoop_addon_unstuck.sp +++ b/scripting/srccoop_addon_unstuck.sp @@ -1,5 +1,5 @@ #include -#include +#include #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/srccoop_addon_voting.sp b/scripting/srccoop_addon_voting.sp index 89bb9ce1..87fb1d87 100644 --- a/scripting/srccoop_addon_voting.sp +++ b/scripting/srccoop_addon_voting.sp @@ -1,5 +1,5 @@ #include -#include +#include #pragma newdecls required #pragma semicolon 1 diff --git a/scripting/srccoop_addon_workshop_manager.sp b/scripting/srccoop_addon_workshop_manager.sp index b2ead5a0..c66b9e0a 100644 --- a/scripting/srccoop_addon_workshop_manager.sp +++ b/scripting/srccoop_addon_workshop_manager.sp @@ -1,7 +1,7 @@ #include #include -#include +#include #pragma newdecls required #pragma semicolon 1