diff --git a/AMBuildScript b/AMBuildScript index bde3dca..8f32be3 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -39,7 +39,7 @@ PossibleSDKs = { # 'hl2dm': SDK('HL2SDKHL2DM', '2.hl2dm', '7', 'HL2DM', WinLinuxMac, 'hl2dm'), # 'dods': SDK('HL2SDKDODS', '2.dods', '8', 'DODS', WinLinuxMac, 'dods'), # 'sdk2013': SDK('HL2SDK2013', '2.sdk2013', '9', 'SDK2013', WinLinuxMac, 'sdk2013'), - 'tf2': SDK('HL2SDKTF2', '2.tf2', '11', 'TF2', WinLinuxMac, 'tf2') + 'tf2': SDK('HL2SDKTF2', '2.tf2', '11', 'TF2', WinLinuxMac, 'tf2'), # 'l4d': SDK('HL2SDKL4D', '2.l4d', '12', 'LEFT4DEAD', WinLinuxMac, 'l4d'), # 'nucleardawn': SDK('HL2SDKND', '2.nd', '13', 'NUCLEARDAWN', WinLinuxMac, 'nucleardawn'), # 'l4d2': SDK('HL2SDKL4D2', '2.l4d2', '15', 'LEFT4DEAD2', WinLinuxMac, 'l4d2'), @@ -53,7 +53,7 @@ PossibleSDKs = { # 'blade': SDK('HL2SDKBLADE', '2.blade', '18', 'BLADE', WinLinux, 'blade'), # 'insurgency': SDK('HL2SDKINSURGENCY', '2.insurgency', '19', 'INSURGENCY', WinLinuxMac, 'insurgency'), # 'contagion': SDK('HL2SDKCONTAGION', '2.contagion', '14', 'CONTAGION', WinOnly, 'contagion'), -# 'bms': SDK('HL2SDKBMS', '2.bms', '10', 'BMS', WinLinux, 'bms'), + 'bms': SDK('HL2SDKBMS', '2.bms', '10', 'BMS', WinLinux, 'bms'), } def ResolveEnvPath(env, folder=None): @@ -545,8 +545,19 @@ class ExtensionConfig(object): for lib in libs: if compiler.target.arch == 'x86': lib_path = os.path.join(sdk.path, 'lib', 'public', 'x86', lib) + '.lib' + + # Older SDK layouts, including BMS, store Win32 libraries + # directly in lib/public rather than lib/public/x86. + if not os.path.isfile(lib_path): + lib_path = os.path.join(sdk.path, 'lib', 'public', lib) + '.lib' elif compiler.target.arch == 'x86_64': lib_path = os.path.join(sdk.path, 'lib', 'public', 'x64', lib) + '.lib' + else: + raise Exception('Unsupported Windows architecture: {0}'.format(compiler.target.arch)) + + if not os.path.isfile(lib_path): + raise Exception('Could not find SDK library: {0}'.format(lib_path)) + compiler.linkflags.append(lib_path) for library in dynamic_libs: diff --git a/PackageScript b/PackageScript index c192d46..1415471 100644 --- a/PackageScript +++ b/PackageScript @@ -12,6 +12,7 @@ folder_list = [ 'addons/sourcemod/scripting/include', 'addons/sourcemod/scripting/include/cbasenpc', 'addons/sourcemod/scripting/include/cbasenpc/tf', + 'addons/sourcemod/scripting/include/cbasenpc/bms', 'addons/sourcemod/scripting/include/cbasenpc/nextbot', 'addons/sourcemod/scripting/include/cbasenpc/nextbot/path', 'addons/sourcemod/gamedata', @@ -47,6 +48,7 @@ for smx_file in Extension.smx_files: CopyDirContent('scripting/include', 'addons/sourcemod/scripting/include') CopyDirContent('scripting/include/cbasenpc', 'addons/sourcemod/scripting/include/cbasenpc') CopyDirContent('scripting/include/cbasenpc/tf', 'addons/sourcemod/scripting/include/cbasenpc/tf') +CopyDirContent('scripting/include/cbasenpc/bms', 'addons/sourcemod/scripting/include/cbasenpc/bms') CopyDirContent('scripting/include/cbasenpc/nextbot', 'addons/sourcemod/scripting/include/cbasenpc/nextbot') CopyDirContent('scripting/include/cbasenpc/nextbot/path', 'addons/sourcemod/scripting/include/cbasenpc/nextbot/path') CopyDirContent('gamedata', 'addons/sourcemod/gamedata') diff --git a/configure.py b/configure.py index dead1fe..445c7a7 100644 --- a/configure.py +++ b/configure.py @@ -20,7 +20,7 @@ default=True, help='Enables the auto versioning script') parser.options.add_argument('-s', '--sdks', default='all', dest='sdks', help='Build against specified SDKs; valid args are "all", "present", or ' - 'comma-delimited list of engine names (default: %default)') + 'comma-delimited list of engine names (default: %(default)s)') parser.options.add_argument('--targets', type=str, dest='targets', default=None, help="Override the target architecture (use commas to separate multiple targets).") parser.options.add_argument('--extension-only', action='store_true', dest='extension_only', default=False, diff --git a/extension/AMBuilder b/extension/AMBuilder index d08da6d..f0cb35e 100644 --- a/extension/AMBuilder +++ b/extension/AMBuilder @@ -36,7 +36,6 @@ project.sources = [ 'sourcesdk/basecombatcharacter.cpp', 'sourcesdk/servernetworkproperty.cpp', 'sourcesdk/collisionproperty.cpp', - 'sourcesdk/tf_gamerules.cpp', 'sourcesdk/tracefilter_simple.cpp', 'sourcesdk/basedoor.cpp', 'sourcesdk/basetoggle.cpp', @@ -66,8 +65,6 @@ project.sources = [ 'natives/nextbot/path/chase.cpp', 'natives/nextbot/path/follower.cpp', 'natives/nextbotplayer.cpp', - 'natives/tf/nav.cpp', - 'natives/tf/nav/area.cpp', os.path.join(Extension.sm_root, 'public', 'smsdk_ext.cpp') ] @@ -79,6 +76,18 @@ for sdk_name in Extension.sdks: continue binary = Extension.HL2ExtConfig(project, builder, cxx, 'cbasenpc.ext.' + sdk.ext, sdk) + + if sdk_name == 'tf2': + binary.sources += [ + 'sourcesdk/tf_gamerules.cpp', + 'natives/tf/nav.cpp', + 'natives/tf/nav/area.cpp', + ] + elif sdk_name == 'bms': + binary.sources += [ + 'natives/bms/nav.cpp', + 'natives/bms/nav/area.cpp', + ] Extension.AddCDetour(binary) binary.compiler.cxxincludes += [ os.path.join(builder.currentSourcePath, 'sourcesdk'), diff --git a/extension/cbasenpc_internal.cpp b/extension/cbasenpc_internal.cpp index 9b337b7..55f25fa 100644 --- a/extension/cbasenpc_internal.cpp +++ b/extension/cbasenpc_internal.cpp @@ -3,7 +3,9 @@ #include "cbasenpc_behavior.h" #include "pluginentityfactory.h" #include "sourcesdk/baseentity.h" -#include "sourcesdk/tf_gamerules.h" +#if SOURCE_ENGINE == SE_TF2 +#include "sourcesdk/tf_gamerules.h" +#endif #include "NextBot/Path/NextBotPathFollow.h" #include #include @@ -160,21 +162,25 @@ void CBaseNPC_Entity::BotThink(void) int CBaseNPC_Entity::OnTakeDamage(const CTakeDamageInfo& info) { CTakeDamageInfo newInfo = info; - if (TFGameRules()) - { - TFGameRules()->ApplyOnDamageModifyRules(newInfo, this, true); - } +#if SOURCE_ENGINE == SE_TF2 + if (TFGameRules()) + { + TFGameRules()->ApplyOnDamageModifyRules(newInfo, this, true); + } +#endif return mOriginalOnTakeDamage(this, newInfo); } int CBaseNPC_Entity::OnTakeDamage_Alive(const CTakeDamageInfo& info) { CTakeDamageInfo newInfo = info; - if (TFGameRules()) - { - CTFGameRules::DamageModifyExtras_t outParams; - newInfo.SetDamage(TFGameRules()->ApplyOnDamageAliveModifyRules(info, this, outParams)); - } +#if SOURCE_ENGINE == SE_TF2 + if (TFGameRules()) + { + CTFGameRules::DamageModifyExtras_t outParams; + newInfo.SetDamage(TFGameRules()->ApplyOnDamageAliveModifyRules(info, this, outParams)); + } +#endif return mOriginalOnTakeDamage_Alive(this, newInfo); } diff --git a/extension/extension.cpp b/extension/extension.cpp index df7ba60..9a00f7a 100644 --- a/extension/extension.cpp +++ b/extension/extension.cpp @@ -4,7 +4,9 @@ #include #include "helpers.h" #include "sourcesdk/nav_mesh.h" -#include "sourcesdk/tf_gamerules.h" +#if SOURCE_ENGINE == SE_TF2 +#include "sourcesdk/tf_gamerules.h" +#endif #include "sourcesdk/basetoggle.h" #include "sourcesdk/funcbrush.h" #include "natives.hpp" @@ -80,12 +82,20 @@ bool CBaseNPCExt::SDK_OnLoad(char* error, size_t maxlength, bool late) { || !CNavMesh::Init(g_pGameConf, error, maxlength) || !CBaseCombatCharacter::Init(g_pGameConf, error, maxlength) || !ToolsTraceFilterSimple::Init(g_pGameConf, error, maxlength) - || !CTFGameRules::Init(g_pGameConf, error, maxlength) +#if SOURCE_ENGINE == SE_TF2 + || !CTFGameRules::Init(g_pGameConf, error, maxlength) +#endif || !CBaseEntityOutput::Init(g_pGameConf, error, maxlength) || !CBaseNPC_Locomotion::Init(g_pGameConf, error, maxlength) || !ToolsNextBot::Init(g_pGameConf, error, maxlength) || !Tools_Refresh_Init(g_pGameConf, error, maxlength) - ) { + ) + { + // Some initialization stages install detours before all later + // stages have succeeded. Roll them back before SourceMod unloads + // the extension DLL. + CNavMesh::SDK_OnUnload(); + CBaseEntity::SDK_OnUnload(); return false; } @@ -284,7 +294,11 @@ void CBaseNPCExt::NotifyInterfaceDrop(SMInterface* interface) { } } -void CBaseNPCExt::SDK_OnUnload() { +void CBaseNPCExt::SDK_OnUnload() +{ + CNavMesh::SDK_OnUnload(); + CBaseEntity::SDK_OnUnload(); + gameconfs->CloseGameConfigFile(g_pGameConf); forwards->ReleaseForward(g_pForwardEventKilled); @@ -299,8 +313,6 @@ void CBaseNPCExt::SDK_OnUnload() { if (g_pSDKHooks) { g_pSDKHooks->RemoveEntityListener(this); } - - CNavMesh::SDK_OnUnload(); FOR_EACH_MAP_FAST(g_EntitiesHooks, iHookID) SH_REMOVE_HOOK_ID(iHookID); diff --git a/extension/helpers.cpp b/extension/helpers.cpp index 2c777c7..6304965 100644 --- a/extension/helpers.cpp +++ b/extension/helpers.cpp @@ -7,19 +7,12 @@ int nothing; IPluginFunction *GetFunctionByNameEx(IPluginContext *pContext, const char *name) { - IPluginRuntime *pRuntime = pContext->GetRuntime(); - for(uint32_t i = 0; i < pRuntime->GetPublicsNum(); i++) + if (!pContext || !name) { - sp_public_t *pub = nullptr; - if(pRuntime->GetPublicByIndex(i, &pub) == SP_ERROR_NONE) - { - if(strstr(pub->name, name) != nullptr) - { - return pRuntime->GetFunctionById(pub->funcid); - } - } + return nullptr; } - return nullptr; + + return pContext->GetRuntime()->GetFunctionByName(name); } void MatrixToPawnMatrix(IPluginContext* context, cell_t* matAddr, const matrix3x4_t& mat) diff --git a/extension/natives.cpp b/extension/natives.cpp index 8c2078f..a01ef6e 100644 --- a/extension/natives.cpp +++ b/extension/natives.cpp @@ -165,7 +165,6 @@ void setup(std::vector& natives) { baseanimating::setup(natives); baseanimatingoverlay::setup(natives); basecombatcharacter::setup(natives); - basecombatcharacter::setup(natives); baseentity::setup(natives); cbasenpc::setup(natives); entityfactory::setup(natives); diff --git a/extension/natives/bms/nav.cpp b/extension/natives/bms/nav.cpp new file mode 100644 index 0000000..c62fe5b --- /dev/null +++ b/extension/natives/bms/nav.cpp @@ -0,0 +1,11 @@ +#include "nav.hpp" +#include "nav/area.hpp" + +namespace natives::bms::nav { + +void setup(std::vector& natives) +{ + area::setup(natives); +} + +} // namespace natives::bms::nav diff --git a/extension/natives/bms/nav.hpp b/extension/natives/bms/nav.hpp new file mode 100644 index 0000000..68785cb --- /dev/null +++ b/extension/natives/bms/nav.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "natives.hpp" + +namespace natives::bms::nav { + +void setup(std::vector& natives); + +} // namespace natives::bms::nav diff --git a/extension/natives/bms/nav/area.cpp b/extension/natives/bms/nav/area.cpp new file mode 100644 index 0000000..af17458 --- /dev/null +++ b/extension/natives/bms/nav/area.cpp @@ -0,0 +1,67 @@ +#include "area.hpp" + +#include + +#include "sourcesdk/bms_nav_area.h" + +namespace natives::bms::nav::area { + +inline CBlackMesaNavArea* Get(IPluginContext* context, const cell_t param) +{ + auto* area = reinterpret_cast(PawnAddressToPtr(param)); + if (!area) + { + context->ThrowNativeError("Black Mesa nav area pointer is null!"); + return nullptr; + } + + return area; +} + +cell_t GetGameAttributes(IPluginContext* context, const cell_t* params) +{ + auto* area = Get(context, params[1]); + return area ? static_cast(area->GetGameAttributes()) : 0; +} + +cell_t SetGameAttribute(IPluginContext* context, const cell_t* params) +{ + auto* area = Get(context, params[1]); + if (area) + { + area->SetGameAttribute(static_cast(params[2])); + } + + return 0; +} + +cell_t ClearGameAttribute(IPluginContext* context, const cell_t* params) +{ + auto* area = Get(context, params[1]); + if (area) + { + area->ClearGameAttribute(static_cast(params[2])); + } + + return 0; +} + +cell_t HasGameAttribute(IPluginContext* context, const cell_t* params) +{ + auto* area = Get(context, params[1]); + return area && area->HasGameAttribute(static_cast(params[2])); +} + +void setup(std::vector& natives) +{ + sp_nativeinfo_t list[] = { + {"CBlackMesaNavArea.GetGameAttributes", GetGameAttributes}, + {"CBlackMesaNavArea.SetGameAttribute", SetGameAttribute}, + {"CBlackMesaNavArea.ClearGameAttribute", ClearGameAttribute}, + {"CBlackMesaNavArea.HasGameAttribute", HasGameAttribute}, + }; + + natives.insert(natives.end(), std::begin(list), std::end(list)); +} + +} // namespace natives::bms::nav::area diff --git a/extension/natives/bms/nav/area.hpp b/extension/natives/bms/nav/area.hpp new file mode 100644 index 0000000..0d654d6 --- /dev/null +++ b/extension/natives/bms/nav/area.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "natives.hpp" + +namespace natives::bms::nav::area { + +void setup(std::vector& natives); + +} // namespace natives::bms::nav::area diff --git a/extension/natives/entityfactory.cpp b/extension/natives/entityfactory.cpp index c153fc2..7021d15 100644 --- a/extension/natives/entityfactory.cpp +++ b/extension/natives/entityfactory.cpp @@ -38,7 +38,7 @@ cell_t CPluginEntityFactory_Ctor(IPluginContext * context, const cell_t * params return context->ThrowNativeError("Entity factory must have a classname"); } - IPlugin* plugin = plsys->FindPluginByContext( context->GetContext() ); + IPlugin* plugin = plsys->FindPluginByContext(context); IPluginFunction *postConstructor = context->GetFunctionById(params[2]); IPluginFunction *onRemove = context->GetFunctionById(params[3]); diff --git a/extension/natives/nav.cpp b/extension/natives/nav.cpp index d968adb..d29b8c9 100644 --- a/extension/natives/nav.cpp +++ b/extension/natives/nav.cpp @@ -1,6 +1,10 @@ #include "nav.hpp" #include "nav/area.hpp" +#if SOURCE_ENGINE == SE_TF2 #include "tf/nav.hpp" +#elif SOURCE_ENGINE == SE_BMS +#include "bms/nav.hpp" +#endif #include "sourcesdk/nav_mesh.h" #include "toolsnav_mesh.h" @@ -257,8 +261,12 @@ cell_t BuildPath(IPluginContext* context, const cell_t* params) { void setup(std::vector& natives) { area::setup(natives); collector::setup(natives); - + +#if SOURCE_ENGINE == SE_TF2 tf::nav::setup(natives); +#elif SOURCE_ENGINE == SE_BMS + bms::nav::setup(natives); +#endif sp_nativeinfo_t list[] = { {"CNavMesh.Address.get", GetAddress}, diff --git a/extension/natives/nextbot/behavior.cpp b/extension/natives/nextbot/behavior.cpp index 707dcc9..2ee76d6 100644 --- a/extension/natives/nextbot/behavior.cpp +++ b/extension/natives/nextbot/behavior.cpp @@ -39,7 +39,7 @@ cell_t NextBotActionFactory_Ctor(IPluginContext* context, const cell_t* params) return context->ThrowNativeError("Action must have a name"); } - IPlugin* plugin = plsys->FindPluginByContext(context->GetContext()); + IPlugin* plugin = plsys->FindPluginByContext(context); CBaseNPCPluginActionFactory* factory = new CBaseNPCPluginActionFactory(plugin, name); return factory->m_Handle; } diff --git a/extension/natives/takedamageinfo.cpp b/extension/natives/takedamageinfo.cpp index b4615d4..1d2cbc5 100644 --- a/extension/natives/takedamageinfo.cpp +++ b/extension/natives/takedamageinfo.cpp @@ -317,7 +317,13 @@ cell_t GetDamageForForceCalc(IPluginContext* context, const cell_t* params) { return 0; } +#if SOURCE_ENGINE == SE_TF2 return sp_ftoc(info->GetDamageForForceCalc()); +#else + return context->ThrowNativeError( + "CTakeDamageInfo.GetDamageForForceCalc is only supported in TF2." + ); +#endif } cell_t SetDamageForForceCalc(IPluginContext* context, const cell_t* params) { @@ -326,8 +332,14 @@ cell_t SetDamageForForceCalc(IPluginContext* context, const cell_t* params) { return 0; } +#if SOURCE_ENGINE == SE_TF2 info->SetDamageForForceCalc(sp_ctof(params[2])); return 0; +#else + return context->ThrowNativeError( + "CTakeDamageInfo.SetDamageForForceCalc is only supported in TF2." + ); +#endif } cell_t GetDamagePosition(IPluginContext* context, const cell_t* params) { diff --git a/extension/pluginentityfactory.h b/extension/pluginentityfactory.h index 33d8562..93da726 100644 --- a/extension/pluginentityfactory.h +++ b/extension/pluginentityfactory.h @@ -27,6 +27,16 @@ enum PluginEntityFactoryBaseClass_t FACTORYBASECLASS_MAX }; +struct CaseInsensitiveCompare { + bool operator()(const std::string& a, const std::string& b) const { +#ifdef __linux__ + return strcasecmp(a.c_str(), b.c_str()) < 0; +#else + return _stricmp(a.c_str(), b.c_str()) < 0; +#endif + } +}; + class PluginFactoryEntityRecord_t { public: @@ -120,8 +130,8 @@ class CPluginEntityFactories : public IPluginsListener, size_t m_BaseClassSizes[ FACTORYBASECLASS_MAX ]; CUtlVector< CPluginEntityFactory* > m_Factories; std::map> m_Records; - std::map m_gameFactories; - std::map m_pluginFactories; + std::map m_gameFactories; + std::map m_pluginFactories; std::vector m_hookIds; }; diff --git a/extension/serialrefresher.cpp b/extension/serialrefresher.cpp index c427853..fb37fe6 100644 --- a/extension/serialrefresher.cpp +++ b/extension/serialrefresher.cpp @@ -84,35 +84,103 @@ void Tools_RefreshEntity(CBaseEntity* entity, int player, bool toggle) { bool Tools_Refresh_Init(SourceMod::IGameConfig* config, char* error, size_t maxlength) { - void* addr = nullptr; - if (!config->GetMemSig("CFrameSnapshotManager::AddExplicitDelete", &addr) || addr == nullptr) { + gFrameSnapshot = nullptr; + + void* addExplicitDeleteAddress = nullptr; + + if (!config->GetMemSig("CFrameSnapshotManager::AddExplicitDelete", &addExplicitDeleteAddress) || !addExplicitDeleteAddress) + { snprintf(error, maxlength, "Failed to get CFrameSnapshotManager::AddExplicitDelete"); + return false; } - add_explicit_delete.Init(addr); - void* manager = nullptr; - if (!config->GetMemSig("framesnapshotmanager", reinterpret_cast(&manager)) || manager == nullptr) { + add_explicit_delete.Init(addExplicitDeleteAddress); + + std::uint8_t* managerAddress = nullptr; + + if (!config->GetMemSig("framesnapshotmanager",reinterpret_cast(&managerAddress)) || !managerAddress) + { snprintf(error, maxlength, "Failed to get framesnapshotmanager signature"); + return false; } - int offset = 0; - if (config->GetOffset("framesnapshotmanager", &offset)) { - if (offset == 0) { - snprintf(error, maxlength, "Failed to get framesnapshotmanager offset!"); + int operandOffset = 0; + + if (config->GetOffset("framesnapshotmanager", &operandOffset)) + { + if (operandOffset <= 0) + { + snprintf(error, maxlength, "Invalid framesnapshotmanager operand offset: %d", operandOffset); + return false; } - gFrameSnapshot = reinterpret_cast(*reinterpret_cast(reinterpret_cast(manager) + offset) + 0x4); - } else { - gFrameSnapshot = *reinterpret_cast(manager); + + int indirectCount = 0; + + if (!config->GetOffset("framesnapshotmanager_indirect", &indirectCount)) + { + snprintf(error, maxlength, "Failed to get framesnapshotmanager_indirect offset!"); + return false; + } + + if (indirectCount < 0 || indirectCount > 4) + { + snprintf(error, maxlength, "Invalid framesnapshotmanager indirect count: %d", indirectCount); + return false; + } + + int pointerOffset = 0; + if (!config->GetOffset("framesnapshotmanager_ptr_offset", &pointerOffset)) + { + snprintf(error, maxlength, "Failed to get framesnapshotmanager_ptr_offset!"); + + return false; + } + + std::uint8_t* resolvedAddress = *reinterpret_cast(managerAddress + operandOffset); + + if (!resolvedAddress) + { + snprintf(error, maxlength, "framesnapshotmanager operand resolved to null!"); + return false; + } + + for (int i = 0; i < indirectCount; ++i) + { + resolvedAddress = *reinterpret_cast(resolvedAddress); + + if (!resolvedAddress) + { + snprintf(error, maxlength, "framesnapshotmanager indirection %d resolved to null!", i + 1); + return false; + } + } + + gFrameSnapshot = reinterpret_cast(resolvedAddress + pointerOffset); + } + else + { + gFrameSnapshot = *reinterpret_cast(managerAddress); } + if (!gFrameSnapshot) + { + snprintf(error, maxlength, "Failed to resolve CFrameSnapshotManager!"); + return false; + } + + g_pSM->LogMessage(myself, "CFrameSnapshotManager: %p", static_cast(gFrameSnapshot)); g_pSM->AddGameFrameHook(&Hook_Frame); + return true; } void Tools_Refresh_Shutdown() { g_pSM->RemoveGameFrameHook(&Hook_Frame); + + gRefreshers.clear(); + gFrameSnapshot = nullptr; } \ No newline at end of file diff --git a/extension/sourcesdk/NextBot/NextBotEventResponderInterface.h b/extension/sourcesdk/NextBot/NextBotEventResponderInterface.h index 6b47cec..caaf7a0 100644 --- a/extension/sourcesdk/NextBot/NextBotEventResponderInterface.h +++ b/extension/sourcesdk/NextBot/NextBotEventResponderInterface.h @@ -57,6 +57,9 @@ class INextBotEventResponder virtual void OnSight(CBaseEntity*); virtual void OnLostSight(CBaseEntity*); +#if SOURCE_ENGINE == SE_BMS + virtual void OnThreatChanged(CBaseEntity*); +#endif virtual void OnSound(CBaseEntity*, const Vector&, KeyValues *); virtual void OnSpokeConcept(CBaseCombatCharacter*, AIConcept_t, AI_Response *); virtual void OnWeaponFired(CBaseCombatCharacter*, CBaseEntity* ); @@ -223,6 +226,16 @@ inline void INextBotEventResponder::OnLostSight(CBaseEntity* subject) } } +#if SOURCE_ENGINE == SE_BMS +inline void INextBotEventResponder::OnThreatChanged(CBaseEntity* threat) +{ + for (INextBotEventResponder* it = FirstContainedResponder(); it; it = NextContainedResponder(it)) + { + it->OnThreatChanged(threat); + } +} +#endif + inline void INextBotEventResponder::OnSound(CBaseEntity* source, const Vector& pos, KeyValues* keys) { for (INextBotEventResponder *it = FirstContainedResponder(); it; it = NextContainedResponder(it)) diff --git a/extension/sourcesdk/NextBot/NextBotGroundLocomotion.h b/extension/sourcesdk/NextBot/NextBotGroundLocomotion.h index e507f40..2eedd66 100644 --- a/extension/sourcesdk/NextBot/NextBotGroundLocomotion.h +++ b/extension/sourcesdk/NextBot/NextBotGroundLocomotion.h @@ -141,6 +141,27 @@ class NextBotGroundLocomotion : public ILocomotion CountdownTimer m_ignorePhysicsPropTimer; // if active, don't collide with physics props (because we got stuck in one) EHANDLE m_ignorePhysicsProp; // which prop to ignore + +#if SOURCE_ENGINE == SE_BMS + /* + * The timer classes in the actual Black Mesa binary contain an + * additional 4-byte vtable pointer which is absent from the SDK + * declarations used to build the extension. + * + * ILocomotion: + * 2 IntervalTimer = 8 missing bytes + * 1 CountdownTimer = 4 missing bytes + * + * NextBotGroundLocomotion: + * 3 CountdownTimer = 12 missing bytes + * + * Total: 24 bytes, or 0x18. + * + * This storage must not be initialized or cleared. The game's + * NextBotGroundLocomotion constructor uses this memory. + */ + unsigned char m_bmsTimerLayoutPadding[0x18]; +#endif public: static int vtable_entries; @@ -151,5 +172,12 @@ class NextBotGroundLocomotion : public ILocomotion static VCall vGetMaxYawRate; }; +#if SOURCE_ENGINE == SE_BMS +static_assert( + sizeof(NextBotGroundLocomotion) == 0x144, + "Invalid BMS NextBotGroundLocomotion size" +); +#endif + #endif diff --git a/extension/sourcesdk/baseanimating.cpp b/extension/sourcesdk/baseanimating.cpp index b20e0aa..55a7a5c 100644 --- a/extension/sourcesdk/baseanimating.cpp +++ b/extension/sourcesdk/baseanimating.cpp @@ -14,7 +14,11 @@ int CBaseAnimating::offset_HandleAnimEvent = 0; VCall CBaseAnimating::vStudioFrameAdvance; VCall CBaseAnimating::vDispatchAnimEvents; VCall< bool, int, matrix3x4_t& > CBaseAnimating::vGetAttachment; -MCall CBaseAnimating::mSequenceDuration; +#if SOURCE_ENGINE == SE_BMS +VCall CBaseAnimating::mSequenceDuration; +#else +MCall CBaseAnimating::mSequenceDuration; +#endif MCall CBaseAnimating::mResetSequence; MCall CBaseAnimating::mLookupPoseParameter; MCall CBaseAnimating::mGetPoseParameter; @@ -62,20 +66,39 @@ bool CBaseAnimating::Init(SourceMod::IGameConfig* config, char* error, size_t ma OFFSETVAR_DATA(CBaseAnimating, m_OnIgnite); OFFSETVAR_SEND(CBaseAnimating, m_nSequence); OFFSETVAR_SEND(CBaseAnimating, m_flModelScale); + // m_pStudioHdr is in front of m_OnIgnite VAR_OFFSET_SET(m_pStudioHdr, VAR_OFFSET(m_OnIgnite) + sizeof(COutputEvent)); END_VAR; - void* aVal = nullptr; - if (!config->GetAddress("GetAnimationEvent", &aVal)) + auto PatchAnimationEventLimit = [&](const char* addressName) -> bool { - snprintf(error, maxlength, "Failed to retrieve GetAnimationEvent address!"); + void* address = nullptr; + if (!config->GetAddress(addressName, &address) || !address) + { + snprintf(error, maxlength, "Failed to retrieve %s address!", addressName); + return false; + } + + uint8_t* patchAddress = reinterpret_cast(address); + SourceHook::SetMemAccess( + patchAddress, + sizeof(uint32_t), + SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC + ); + + *reinterpret_cast(patchAddress) = 9999u; + return true; + }; + + if (!PatchAnimationEventLimit("GetAnimationEvent")) return false; - } - uint8_t* aGetAnimationEvent = reinterpret_cast(aVal); - SourceHook::SetMemAccess(aGetAnimationEvent, sizeof(uint32_t), SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC); - *(uint32_t*)(aGetAnimationEvent) = 9999; +#if SOURCE_ENGINE == SE_BMS && defined(__linux__) + // GCC emitted the same comparison twice in BMS Linux. + if (!PatchAnimationEventLimit("GetAnimationEvent2")) + return false; +#endif return true; } diff --git a/extension/sourcesdk/baseanimating.h b/extension/sourcesdk/baseanimating.h index 3b327bc..d5f4542 100644 --- a/extension/sourcesdk/baseanimating.h +++ b/extension/sourcesdk/baseanimating.h @@ -42,7 +42,12 @@ class CBaseAnimating : public CBaseEntity static VCall vDispatchAnimEvents; void DispatchAnimEvents(CBaseAnimating*); - static MCall mSequenceDuration; +#if SOURCE_ENGINE == SE_BMS + static VCall mSequenceDuration; +#else + static MCall mSequenceDuration; +#endif + float SequenceDuration(CStudioHdr*, int); static MCall mResetSequence; diff --git a/extension/sourcesdk/baseentity.cpp b/extension/sourcesdk/baseentity.cpp index 8e538af..367b820 100644 --- a/extension/sourcesdk/baseentity.cpp +++ b/extension/sourcesdk/baseentity.cpp @@ -157,26 +157,44 @@ bool CBaseEntity::Init(SourceMod::IGameConfig* config, char* error, size_t maxle return false; } - uint8_t* addr = nullptr; - if (config->GetMemSig("CBaseEntity::PhysicsMarkEntitiesAsTouching", (void**)&addr) && addr) - { - int offset; - if (!config->GetOffset("g_TouchTrace", &offset) || !offset) - { - snprintf(error, maxlength, "Couldn't find offset for g_TouchTrace ptr!"); - return false; - } - - g_pTouchTrace = *reinterpret_cast(addr + offset); - } - else - { - snprintf(error, maxlength, "Failed to retrieve g_TouchTrace!"); - return false; - } - - // Any entity that inherits CBaseEntity is good - BEGIN_VAR("trigger_stun"); + uint8_t* addr = nullptr; + if (config->GetMemSig("CBaseEntity::PhysicsMarkEntitiesAsTouching", (void**)&addr) && addr) + { + int offset; + if (config->GetOffset("g_TouchTrace", &offset) && offset) + { + g_pTouchTrace = *reinterpret_cast(addr + offset); + } + else + { + #if SOURCE_ENGINE == SE_BMS && defined(__linux__) + // BMS Linux: g_TouchTrace uses EBX-relative PIC addressing, + // no embedded absolute address in the function — resolve via data symbol directly. + void* gTouchTraceAddr = nullptr; + if (!config->GetMemSig("g_TouchTrace", &gTouchTraceAddr) || !gTouchTraceAddr) + { + snprintf(error, maxlength, "Couldn't find g_TouchTrace symbol!"); + return false; + } + g_pTouchTrace = reinterpret_cast(gTouchTraceAddr); + #else + snprintf(error, maxlength, "Couldn't find offset for g_TouchTrace ptr!"); + return false; + #endif + } + } + else + { + snprintf(error, maxlength, "Failed to retrieve g_TouchTrace!"); + return false; + } + + // Any entity that inherits CBaseEntity is good +#if SOURCE_ENGINE == SE_BMS + BEGIN_VAR("trigger_auto_crouch"); +#else + BEGIN_VAR("trigger_stun"); +#endif OFFSETVAR_DATA(CBaseEntity, m_pfnThink); OFFSETVAR_DATA(CBaseEntity, m_iClassname); OFFSETVAR_DATA(CBaseEntity, m_nModelIndex); @@ -783,4 +801,17 @@ void CBaseEntity::SetLocalAngles(const QAngle& angles) InvalidatePhysicsRecursive(ANGLES_CHANGED); SetSimulationTime(gpGlobals->curtime); } +} + +void CBaseEntity::SDK_OnUnload() +{ +#ifndef __linux__ + if (g_pSimThink_EntityChangedDetour != nullptr) + { + g_pSimThink_EntityChangedDetour->Destroy(); + g_pSimThink_EntityChangedDetour = nullptr; + } + + g_pSimThinkManager = nullptr; +#endif } \ No newline at end of file diff --git a/extension/sourcesdk/baseentity.h b/extension/sourcesdk/baseentity.h index 96edc32..f3a289e 100644 --- a/extension/sourcesdk/baseentity.h +++ b/extension/sourcesdk/baseentity.h @@ -97,6 +97,8 @@ class CBaseEntity : public IServerEntity { public: static bool Init(SourceMod::IGameConfig* config, char* error, size_t maxlength); + + static void SDK_OnUnload(); static const trace_t& GetTouchTrace(void); diff --git a/extension/sourcesdk/bms_nav_area.h b/extension/sourcesdk/bms_nav_area.h new file mode 100644 index 0000000..f969027 --- /dev/null +++ b/extension/sourcesdk/bms_nav_area.h @@ -0,0 +1,84 @@ +#ifndef _BMS_NAV_AREA_H_ +#define _BMS_NAV_AREA_H_ +#pragma once + +#include +#include + +#include "sourcesdk/nav_area.h" + +/** + * Black Mesa game-specific navigation attributes. + * + * These are separate from CNavArea::m_attributeFlags. The current BMS + * server binary only defines PLAYER_BASE (bit 0). + */ +enum BlackMesaNavAttributeType : std::uint32_t +{ + BM_NAV_NONE = 0, + BM_NAV_PLAYER_BASE = (1u << 0), +}; + +/** + * Runtime view of Black Mesa's CBlackMesaNavArea. + * + * We intentionally access m_gameAttributes through a verified binary offset + * instead of reproducing every private field of CNavArea/CBlackMesaNavArea. + * The CNavArea layout differs between MSVC and GCC in the supported BMS + * binaries. + */ +class CBlackMesaNavArea : public CNavArea +{ +public: + std::uint32_t GetGameAttributes() const + { + return GameAttributes(); + } + + void SetGameAttribute(std::uint32_t flags) + { + GameAttributes() |= SanitizeFlags(flags); + } + + void ClearGameAttribute(std::uint32_t flags) + { + GameAttributes() &= ~SanitizeFlags(flags); + } + + bool HasGameAttribute(std::uint32_t flags) const + { + const std::uint32_t sanitized = SanitizeFlags(flags); + return sanitized != 0 && (GameAttributes() & sanitized) != 0; + } + +private: + static constexpr std::uint32_t kKnownGameAttributes = BM_NAV_PLAYER_BASE; + + static constexpr std::uint32_t SanitizeFlags(std::uint32_t flags) + { + return flags & kKnownGameAttributes; + } + + static constexpr std::size_t GameAttributesOffset() + { +#if defined(_WIN32) + return 0x160; +#else + return 0x164; +#endif + } + + std::uint32_t& GameAttributes() + { + auto* bytes = reinterpret_cast(this); + return *reinterpret_cast(bytes + GameAttributesOffset()); + } + + const std::uint32_t& GameAttributes() const + { + const auto* bytes = reinterpret_cast(this); + return *reinterpret_cast(bytes + GameAttributesOffset()); + } +}; + +#endif // _BMS_NAV_AREA_H_ diff --git a/extension/sourcesdk/nav_area.h b/extension/sourcesdk/nav_area.h index f6ab3cc..7287d13 100644 --- a/extension/sourcesdk/nav_area.h +++ b/extension/sourcesdk/nav_area.h @@ -225,6 +225,10 @@ class CNavArea : protected CNavAreaCriticalData virtual void SaveToSelectedSet( KeyValues *areaKey ) const = 0; // (EXTEND) saves attributes for the area to a KeyValues virtual void RestoreFromSelectedSet( KeyValues *areaKey ) = 0; // (EXTEND) restores attributes from a KeyValues + +#if SOURCE_ENGINE == SE_BMS + virtual void Dump( CUtlBuffer &fileBuffer ) const = 0; +#endif unsigned int GetID( void ) const { return m_id; } @@ -271,7 +275,14 @@ class CNavArea : protected CNavAreaCriticalData NavDirType ComputeDirection( Vector *point ) const; //- hiding spots ------------------------------------------------------------------------------------ - const HidingSpotVector *GetHidingSpots( void ) const { return &m_hidingSpots; } + const HidingSpotVector* GetHidingSpots(void) const + { + #if SOURCE_ENGINE == SE_BMS + return reinterpret_cast(reinterpret_cast(this) + 0xCC); + #else + return &m_hidingSpots; + #endif + } //- "danger" ---------------------------------------------------------------------------------------- virtual float GetDangerDecayRate( void ) const = 0; // return danger decay rate per second diff --git a/extension/sourcesdk/nav_mesh.cpp b/extension/sourcesdk/nav_mesh.cpp index cd297fb..8c0abbd 100644 --- a/extension/sourcesdk/nav_mesh.cpp +++ b/extension/sourcesdk/nav_mesh.cpp @@ -21,6 +21,7 @@ DETOUR_DECL_MEMBER0(CNavMesh_Load, NavErrorType) { NavErrorType returnVal = DETOUR_MEMBER_CALL(CNavMesh_Load)(); + TheNavMesh = reinterpret_cast(this); ToolsNavMesh->Load(); return returnVal; @@ -28,61 +29,110 @@ DETOUR_DECL_MEMBER0(CNavMesh_Load, NavErrorType) bool CNavMesh::Init(SourceMod::IGameConfig* config, char* error, size_t maxlength) { - uint8_t* addr = nullptr; - if (config->GetMemSig("CNavMesh::Load", (void**)&addr) && addr) + uint8_t* loadAddress = nullptr; + if (!config->GetMemSig("CNavMesh::Load", reinterpret_cast(&loadAddress)) || !loadAddress) { - int offset; - if (!config->GetOffset("TheNavMesh", &offset) || !offset) - { - snprintf(error, maxlength, "Couldn't find offset for TheNavMesh ptr!"); - return false; - } - - CNavMesh** pTheNavMesh = *reinterpret_cast(addr + offset); - TheNavMesh = *pTheNavMesh; + snprintf(error, maxlength, "Couldn't resolve CNavMesh::Load signature!"); + return false; + } - if (!config->GetOffset("TheNavAreas", &offset) || !offset) - { - snprintf(error, maxlength, "Couldn't find offset for TheNavAreas ptr!"); - return false; - } + CNavMesh* resolvedNavMesh = nullptr; + NavAreaVector* resolvedNavAreas = nullptr; - pTheNavAreas = *reinterpret_cast(addr + offset); +#if SOURCE_ENGINE == SE_BMS && defined(__linux__) + void* navMeshAddress = nullptr; + if (!config->GetMemSig("TheNavMesh_Linux", &navMeshAddress) || !navMeshAddress) + { + snprintf(error, maxlength, "Couldn't resolve TheNavMesh_Linux symbol!"); + return false; } - else + + void* navAreasAddress = nullptr; + if (!config->GetMemSig("TheNavAreas_Linux", &navAreasAddress) || !navAreasAddress) { - snprintf(error, maxlength, "Failed to retrieve TheNavMesh ptr!"); + snprintf(error, maxlength, "Couldn't resolve TheNavAreas_Linux symbol!"); return false; } - g_pNavMeshLoad = DETOUR_CREATE_MEMBER(CNavMesh_Load, "CNavMesh::Load"); - if (g_pNavMeshLoad != nullptr) + // TheNavMesh is a global CNavMesh* variable. + CNavMesh** navMeshGlobal = reinterpret_cast(navMeshAddress); + resolvedNavMesh = *navMeshGlobal; + + // TheNavAreas is the global NavAreaVector object itself. + resolvedNavAreas = reinterpret_cast(navAreasAddress); +#else + int navMeshOffset = 0; + if (!config->GetOffset("TheNavMesh", &navMeshOffset) || navMeshOffset == 0) { - g_pNavMeshLoad->EnableDetour(); + snprintf(error, maxlength, "Couldn't find valid offset for TheNavMesh!"); + return false; } - else + + CNavMesh** navMeshGlobal = + *reinterpret_cast(loadAddress + navMeshOffset); + + if (!navMeshGlobal) { - snprintf(error, maxlength, "Couldn't create CNavMesh::Load detour!"); + snprintf(error, maxlength, "TheNavMesh global address resolved to null!"); return false; } - try + resolvedNavMesh = *navMeshGlobal; + + int navAreasOffset = 0; + if (!config->GetOffset("TheNavAreas", &navAreasOffset) || navAreasOffset == 0) { - if (!config->GetOffset("CNavMesh::m_isLoaded", &CNavMesh::offset_m_isLoaded)) - { - snprintf(error, maxlength, "Couldn't find CNavMesh::m_isLoaded offset!"); - return false; - } + snprintf(error, maxlength, "Couldn't find valid offset for TheNavAreas!"); + return false; + } + + resolvedNavAreas = + *reinterpret_cast(loadAddress + navAreasOffset); +#endif + + if (!resolvedNavAreas) + { + snprintf(error, maxlength, "TheNavAreas address resolved to null!"); + return false; + } + + if (!config->GetOffset("CNavMesh::m_isLoaded", &CNavMesh::offset_m_isLoaded)) + { + snprintf(error, maxlength, "Couldn't find CNavMesh::m_isLoaded offset!"); + return false; + } + try + { mGetGroundHeight.Init(config, "CNavMesh::GetGroundHeight"); } catch (const std::exception& e) { - snprintf(error, maxlength, "%s", e.what()); + snprintf(error, maxlength, "Couldn't initialize CNavMesh::GetGroundHeight: %s", e.what()); return false; } - g_pSM->LogMessage(myself, "NavMesh: 0x%X NavAreas: 0x%X", TheNavMesh, pTheNavAreas); + TheNavMesh = resolvedNavMesh; + pTheNavAreas = resolvedNavAreas; + + g_pNavMeshLoad = DETOUR_CREATE_MEMBER(CNavMesh_Load, "CNavMesh::Load"); + if (!g_pNavMeshLoad) + { + TheNavMesh = nullptr; + pTheNavAreas = nullptr; + snprintf(error, maxlength, "Couldn't create CNavMesh::Load detour!"); + return false; + } + + g_pNavMeshLoad->EnableDetour(); + + g_pSM->LogMessage( + myself, + "NavMesh: %p, NavAreas: %p, CNavMesh::Load: %p", + static_cast(TheNavMesh), + static_cast(pTheNavAreas), + static_cast(loadAddress) + ); ToolsNavMesh->Load(); return true; @@ -94,11 +144,15 @@ void CNavMesh::OnCoreMapEnd() void CNavMesh::SDK_OnUnload() { - if (g_pNavMeshLoad != nullptr) + if (g_pNavMeshLoad) { g_pNavMeshLoad->Destroy(); g_pNavMeshLoad = nullptr; } + + TheNavMesh = nullptr; + pTheNavAreas = nullptr; + CNavMesh::offset_m_isLoaded = 0; } //-------------------------------------------------------------------------------------------------------------- diff --git a/extension/sourcesdk/takedamageinfo.cpp b/extension/sourcesdk/takedamageinfo.cpp index 4b57efe..f221902 100644 --- a/extension/sourcesdk/takedamageinfo.cpp +++ b/extension/sourcesdk/takedamageinfo.cpp @@ -37,9 +37,9 @@ void CTakeDamageInfo::Init( CBaseEntity *pInflictor, CBaseEntity *pAttacker, CBa m_iPlayerPenetrationCount = 0; m_flDamageBonus = 0.f; m_bForceFriendlyFire = false; - m_flDamageForForce = 0.f; #if SOURCE_ENGINE == SE_TF2 + m_flDamageForForce = 0.f; m_eCritType = CRIT_NONE; #endif } diff --git a/extension/toolsnav_mesh.h b/extension/toolsnav_mesh.h index bebd57b..0880b26 100644 --- a/extension/toolsnav_mesh.h +++ b/extension/toolsnav_mesh.h @@ -2,6 +2,7 @@ #include "toolsnav.h" #include "sourcesdk/nav_area.h" +#include "vstdlib/random.h" #include #include diff --git a/gamedata/cbasenpc.txt b/gamedata/cbasenpc.txt index 4cb897a..f2029b9 100644 --- a/gamedata/cbasenpc.txt +++ b/gamedata/cbasenpc.txt @@ -164,6 +164,14 @@ "linux" "111" "windows" "111" } + "framesnapshotmanager_indirect" + { + "windows" "0" + } + "framesnapshotmanager_ptr_offset" + { + "windows" "4" + } } "Signatures" { @@ -387,4 +395,443 @@ } } } + + "bms" + { + "Offsets" + { + "framesnapshotmanager" + { + "windows" "2" + } + // Locate CNavMesh::Load, first dword is TheNavMesh second is TheNavAreas + "TheNavMesh" + { + "windows" "960" + } + "TheNavAreas" + { + "windows" "1103" + } + // Locate CBaseEntity::PhysicsMarkEntitiesAsTouching, first dword is g_TouchTrace + "g_TouchTrace" + { + // On Linux g_TouchTrace is addressed directly through EBX-relative PIC code, + // so baseentity.cpp must resolve the data symbol instead of using an offset. + "windows" "12" + } + "g_EntityListPool" + { + "windows" "1" + } + "CNavMesh::m_isLoaded" + { + "linux" "52" + "windows" "56" + } + "CBaseEntity::Spawn" + { + "linux" "25" + "windows" "24" + } + "CBaseEntity::PostConstructor" + { + "linux" "29" + "windows" "28" + } + "CBaseEntity::GetBaseAnimating" + { + "linux" "56" + "windows" "55" + } + "CBaseEntity::IsAlive" + { + "linux" "72" + "windows" "71" + } + "CBaseEntity::Event_Killed" + { + "linux" "73" + "windows" "72" + } + "CBaseEntity::MyCombatCharacterPointer" + { + "linux" "79" + "windows" "78" + } + "CBaseEntity::MyNextBotPointer" + { + "linux" "80" + "windows" "79" + } + "CBaseEntity::Touch" + { + "linux" "109" + "windows" "108" + } + "CBaseEntity::PhysicsSimulate" + { + "linux" "114" + "windows" "113" + } + "CBaseEntity::UpdateOnRemove" + { + "linux" "116" + "windows" "115" + } + "CBaseEntity::EyeAngles" + { + "linux" "142" + "windows" "141" + } + "CBaseEntity::GetVectors" + { + "linux" "148" + "windows" "147" + } + "CBaseEntity::WorldSpaceCenter" + { + "linux" "161" + "windows" "160" + } + "CBaseAnimating::StudioFrameAdvance" + { + "linux" "206" + "windows" "205" + } + "CBaseAnimating::DispatchAnimEvents" + { + "linux" "221" + "windows" "220" + } + "CBaseAnimating::HandleAnimEvent" + { + "linux" "222" + "windows" "221" + } + "CBaseAnimating::GetAttachment" + { + "linux" "224" + "windows" "223" + } + "CBaseAnimating::SequenceDuration" + { + "linux" "210" + "windows" "209" + } + "CBaseCombatCharacter::Weapon_Equip" + { + "linux" "282" + "windows" "281" + } + "CBaseCombatCharacter::Weapon_Drop" + { + "linux" "284" + "windows" "283" + } + "CBaseCombatCharacter::OnTakeDamage_Alive" + { + "linux" "293" + "windows" "292" + } + "CBaseCombatCharacter::OnTakeDamage_Dying" + { + "linux" "294" + "windows" "293" + } + "CBaseCombatCharacter::GetLastKnownArea" + { + "linux" "335" + "windows" "334" + } + "CBaseCombatCharacter::UpdateLastKnownArea" + { + "linux" "338" + "windows" "337" + } + "CBaseCombatCharacter::OnNavAreaChanged" + { + "linux" "339" + "windows" "338" + } + "CNavMesh::Load" + { + "linux" "9" + "windows" "8" + } + "CTraceFilterSimple::ShouldHitEntity" + { + "linux" "0" + "windows" "0" + } + "NextBotCombatCharacter::vtable_entries" + { + "windows" "347" + "linux" "350" + } + "NextBotGroundLocomotion::vtable_entries" + { + "linux" "111" + "windows" "110" + } + "framesnapshotmanager_indirect" + { + "windows" "1" + } + "framesnapshotmanager_ptr_offset" + { + "windows" "0" + } + } + "Signatures" + { + //how to find: Find ED_Alloc(int*) by string ''ED_Alloc( %d ) - invalid edict index specified.'', + //one of the funcs it calls is what you need + "CFrameSnapshotManager::AddExplicitDelete" + { + "library" "engine" + "windows" "\x55\x8B\xEC\x53\x8B\xD9\x56\x57\x8D\xB3\x9C\x80\x00\x00\xFF\x15\x2A\x2A\x2A\x2A\x8B\xF8\x3B\x3E\x74\x1B\x8B\xD7\x33\xC0\xF0\x0F\xB1\x16" + "linux" "@_ZN21CFrameSnapshotManager17AddExplicitDeleteEi" + } + "framesnapshotmanager" + { + "library" "engine" + "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x56\xE8\x2A\x2A\x2A\x2A\xFF\x0D\x2A\x2A\x2A\x2A\xB8\x01\x00\x00\x00" + "linux" "@framesnapshotmanager" + } + // Find string "Missing command string" which is used by nb_command + // nb_command calls TheNextBots() + "TheNextBots" + { + "library" "server" + "windows" "\xA1\x2A\x2A\x2A\x2A\x85\xC0\x75\x3A\x8B\x0D\x2A\x2A\x2A\x2A\xF6\xC1\x01\x75\x20\x83\xC9\x01\x89\x0D\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\xF9\xEA\xFF\xFF\x68\x2A\x2A\x2A\x2A\xE8\x79\x9C\x29\x00\x83\xC4\x04\xC7\x05\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\xB8\xC0" + "linux" "@_Z11TheNextBotsv" + } + // Find string "Invalid navigation file.\n" + //IS IN VIRTUAL TABLE FOR BM!!!! + "CNavMesh::Load" + { + "library" "server" + "windows" "\x55\x8B\xEC\x81\xEC\x88\x02\x00\x00\xA1\x2A\x2A\x2A\x2A\x33\xC5\x89\x45\xFC\x53\x56\x8B\x35\x2A\x2A\x2A\x2A\x57\x8B\xF9\x89\xB5\xAC\xFD\xFF\xFF\x8B\xCE\x89\xBD\xEC\xFD\xFF\xFF\x8B\x06\xFF\x50\x70\x8B\x07\x8B\xCF\xFF\x50\x18\xC7\x05\x2A\x2A\x2A\x2A\x00\x00\x00\x00" + "linux" "@_ZN8CNavMesh4LoadEv" + } + //how to find: find CNavMesh::UpdateGeneration by string ''Finding light intensity...'', + //you will see 17.5 (something like var = var + 17.5), the func called before 17.5 (something like var = funccall) is what you need + "CNavMesh::GetGroundHeight" + { + "library" "server" + "windows" "\x53\x8B\xDC\x83\xEC\x08\x83\xE4\xF0\x83\xC4\x04\x55\x8B\x6B\x04\x89\x6C\x24\x04\x8B\xEC\x81\xEC\x08\x01\x00\x00\xA1\x2A\x2A\x2A\x2A\x33\xC5\x89\x45\xFC\x8B\x43\x0C\x8D\x8D\xFC\xFE\xFF\xFF\x2A\x2A\x2A\x2A\x57\x6A\x00\x6A\x00\x6A\x00\x89\x45\x8C\xE8\x3E\x6B" + "linux" "@_ZNK8CNavMesh15GetGroundHeightERK6VectorPfPS0_" + } + // Find data xref of string "weapon_*", should be taken to ppszIgnoredClasses static char* array in CTraceFilterValidForDecal::ShouldHitEntity + // CTraceFilterSimple::ShouldHitEntity called with 2 params + //IS IN VIRTUAL TABLE FOR BM!!!! + "CTraceFilterSimple::ShouldHitEntity" + { + "library" "server" + "windows" "\x55\x8B\xEC\x53\x8B\x5D\x0C\x56\x8B\x75\x08\x57\x53\x56\x8B\xF9\xE8\x6B\x01\x00\x00\x83\xC4\x08\x84\xC0\x74\x7E\x8B\x47\x04\x85\xC0\x74\x0E\x50\x56\xE8\xE6\xFB\xFF\xFF\x83\xC4\x08\x84\xC0\x74\x69\x8B\x0D\x2A\x2A\x2A\x2A\x56\x8B\x01\x8B\x40\x0C\xFF\xD0\x84" + "linux" "@_ZN18CTraceFilterSimple15ShouldHitEntityEP13IHandleEntityi" + } + // Go to first data xref of string "%s has changed its model while processing AnimEvents on sequence %d. Aborting dispatch.\n", this is CBaseAnimating::DispatchAnimEvents + // GetAnimationEvent is used in a loop + "__GetAnimationEvent__" + { + "library" "server" + "windows" "\x55\x8B\xEC\x56\x8B\x75\x08\x85\xF6\x0F\x84\x0A\x01\x00\x00\x8B\xCE\xE8\xDA\x73\x1A\x00\x8B\x4D\x0C\x3B\xC8\x0F\x8D\xF8\x00\x00\x2A\x2A\x2A\x2A\x85\xD2\x0F\x84\xED\x00\x00\x00\x57\x51\x8B\xCE\xE8\xAB\x8A\x1A\x00\x8B\xF8\x8B\x4F\x18\x85\xC9\x0F\x84\xD1\x00" + "linux" "@_Z17GetAnimationEventP10CStudioHdriP11animevent_tffi" + } + //how to find: find CAI_BaseNPC::CalculateValidEnemyInteractions() by string '' Found: %s\n'', + //the func that called before Msg() call with this string is CBaseAnimating::LookupSequence, + //the last func it calls is what you need + "Studio_LookupSequence" + { + "library" "server" + "windows" "\x55\x8B\xEC\x57\x8B\x7D\x08\x85\xFF\x75\x05\x33\xC0\x5F\x5D\xC3\x8B\xCF\xE8\xF9\x78\x1A\x00\x84\xC0\x74\xF0\x53\x56\x8B\xCF\x33\xF6\xE8\xCA\x6B\x1A\x00\x8B\x5D\x0C\x85\xC0\x7E\x2A\x8D\x49\x00\x56\x8B\xCF\xE8\xA8\x82\x1A\x00\x53\x8B\x48\x04\x03\xC8\x51\xE8" + "linux" "@_Z14LookupSequenceP10CStudioHdrPKc" + } + "Studio_SelectWeightedSequence" //how to find: find by string ''Server SelectWeightedSequence'' + { + "library" "server" + "windows" "\x55\x8B\xEC\xA1\x2A\x2A\x2A\x2A\xA8\x01\x75\x2D\x8B\x0D\x2A\x2A\x2A\x2A\x83\xC8\x01\x6A\x00\x68\x2A\x2A\x2A\x2A\xA3\x2A\x2A\x2A\x2A\xFF\x15\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\xA3\x2A\x2A\x2A\x2A\xE8\x44\x71\x4A\x00\x83\xC4\x04\xA1\x2A\x2A\x2A\x2A\x56\x8B" + "linux" "@_Z22SelectWeightedSequenceP10CStudioHdrii" + } + // Find "placementOrigin" first subroutine call below it + "Studio_FindAttachment" + { + "library" "server" + "windows" "\x55\x8B\xEC\x53\x56\x57\x8B\x7D\x08\x85\xFF\x74\x41\x8B\xCF\xE8\xFC\x39\x15\x00\x84\xC0\x74\x36\x8B\xCF\x33\xF6\xE8\x6F\x2C\x15\x00\x85\xC0\x7E\x29\x8B\x5D\x0C\x56\x8B\xCF\xE8\x90\x41\x15\x00\x8B\x08\x03\xC8\x51\x53\xE8\x45\x11\x3F\x00\x83\xC4\x08\x85\xC0" + "linux" "@_Z21Studio_FindAttachmentPK10CStudioHdrPKc" + } + //how to find: find CAI_Hint::OnRestore by string ''Warning: AI hint has incorrect or no AI node\n'', + //the very first func it calls is CBaseEntity::OnRestore, one of the funcs it calls is what you need, + //the what you need also calls other func with global object and param_1, and the func is actually what you need, not real SimThink_EntityChanged + "SimThink_EntityChanged" + { + "library" "server" + "windows" "\x55\x8B\xEC\x53\x57\x8B\x7D\x08\x8B\xD9\xF6\x87\x04\x01\x00\x00\x01\x0F\x85\x2A\x2A\x2A\x2A\x8B\x07\x8B\xCF\x56\xFF\x50\x08" + "linux" "@_Z22SimThink_EntityChangedP11CBaseEntity" + } + "CBaseEntity::CBaseEntity" //how to find: find CLensFlare::CLensFlare by string ''sprites/glow02.spr'', the very first func it calls is what you need + { + "library" "server" + "windows" "\x55\x8B\xEC\x53\x56\x8B\xF1\x57\x8D\x4E\x0C\xC7\x06\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x8D\x8E\x8C\x00\x00\x00" + "linux" "@_ZN11CBaseEntityC2Eb" + } + //how to find: find CBaseEntity::PhysicsMarkEntityAsTouched by string ''add 0x%p: %s-%s (%d-%d) [%d in play, %d max]\n'', + //one of the funcs that calls this func is CBaseEntity::PhysicsMarkEntitiesAsTouching, + //the first one is what you need (not sure if it's a rule) + "CBaseEntity::PhysicsMarkEntitiesAsTouching" + { + "library" "server" + "windows" "\x55\x8B\xEC\x53\x56\x8B\x75\x0C\x57\x8B\xF9\xB9\x2A\x2A\x2A\x2A\x56\xE8\x2A\x2A\x2A\x2A\xF3\x0F\x10\x46\x38" + "linux" "@_ZN11CBaseEntity29PhysicsMarkEntitiesAsTouchingEPS_R10CGameTrace" + } + //how to find: find NWCEdit::UpdateEntityPosition by string ''%s\n origin %f %f %f\n angles %f %f %f\n'', + //first 2 calls is the same func, the func is what you need + "CBaseEntity::CalcAbsolutePosition" + { + "library" "server" + "windows" "\x55\x8B\xEC\x83\xEC\x64\xA1\x2A\x2A\x2A\x2A\x33\xC5\x89\x45\xFC\x56\x8B\xF1\x8B\x86\x04\x01\x00\x00\xC1\xE8\x0B\xA8\x01\x0F\x84\x00\x02\x00\x00\x57\x8D\xBE\x40\x03\x00\x00\xFF\x15\x2A\x2A\x2A\x2A\x8B\xD0\x3B\x17\x74\x1B\x8B\xCA\x33\xC0\xF0\x0F\xB1\x0F\x85" + "linux" "@_ZN11CBaseEntity20CalcAbsolutePositionEv" + } + //how to find: find CBaseEntity::ApplyLocalVelocityImpulse by string ''Clamping ApplyLocalVelocityImpulse(%f,%f,%f) on %s\n'', + //it puts this and 4 as params to call one of the funcs, the func is what you need. + //RENAME IT TO NORMAL NAME!!!! You will need it later. + "CBaseEntity::InvalidatePhysicsRecursive" + { + "library" "server" + "windows" "\x55\x8B\xEC\x51\x53\x8B\x5D\x2A\x2A\x2A\x2A\x00\x00\x56\x57\x33\xFF\xC6\x45\xFF\x00\xF6\xC3\x04\x8B\xF1\x0F\x45\xF8\xF6\xC3\x01\x74\x1E\x8B\x46\x18\x81\xCF\x00\x08\x00\x00\x85\xC0\x74\x06\x81\x08\x80\x00\x00\x00\x8D\x8E\x4C\x01\x00\x00\xE8\xA0\xBE\x02\x00" + "linux" "@_ZN11CBaseEntity26InvalidatePhysicsRecursiveEi" + } + //how to find: find CPropXenPushPad::StartTouch by string ''ignoredEntity'', + //if renamed Ghidra placeholder to CBaseEntity::CalcAbsolutePosition before, + //search the func via if statement that contains ''& 1) != 0'', the only not renamed func is what you need + "CBaseEntity::SetGroundEntity" + { + "library" "server" + "windows" "\x55\x8B\xEC\x56\x57\x8B\xF9\x8B\x97\x00\x02\x00\x00\x83\xFA\xFF" + "linux" "@_ZN11CBaseEntity15SetGroundEntityEPS_" + } + // Find string "CBaseEntity::TakeDamage: with inputInfo.GetDamageForce() == vec3_origin\n" + "CBaseEntity::TakeDamage" + { + "library" "server" + "windows" "\x55\x8B\xEC\x83\xEC\x78\x57\x8B\xF9\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x75\x09\x33\xC0\x5F\x8B\xE5\x5D\xC2\x04\x00\x8B\x01\x56\x8B\x75\x08\x8B\x40\x50\xFF\x76\x3C\xFF\xD0\x84\xC0\x0F\x85\x34\x01\x00\x00\x83\x7E\x3C\x00\x0F\x84\x2A\x01\x00\x00\x8B\x06\xF3\x0F" + "linux" "@_ZN11CBaseEntity10TakeDamageERK15CTakeDamageInfo" + } + // "g_EntityListPool" + "g_EntityListPool" + { + "library" "server" + "windows" "\xB9\x2A\x2A\x2A\x2A\x57\xE8\x2A\x2A\x2A\x2A\x8B\xFE\xEB\x09" + "linux" "@g_EntityListPool" + } + //how to find: find CFourWheelPhysics::InitializePoseParameters ''vehicle_wheel_fl_height'', + //it will call the same func with 0.0 as last params, + //it is CFourWheelPhysics::SetPoseParameter, the func calls func with 4 params, the func is what you want + "CBaseAnimating::SetPoseParameter" + { + "library" "server" + "windows" "\x55\x8B\xEC\x8B\x45\x08\xD9\x45\x10\x57\x8B\xF9\x85\xC0\x74\x2A\x56\x8B\x75\x0C\x85\xF6\x78\x2A" + "linux" "@_ZN14CBaseAnimating16SetPoseParameterEP10CStudioHdrif" + } + //how to find: find CBotAI::Update by string ''%s: %f'', one of the funcs it calls is what you need, it is called just before the string used + "CBaseAnimating::GetPoseParameter" + { + "library" "server" + "windows" "\x55\x8B\xEC\x56\x8B\xF1\x57\x80\xBE\x31\x03\x00\x00\x00\x75\x55\x83\xBE\x80\x04\x00\x2A\x2A\x2A\x2A\xE8\x52\x4A\x02\x00\x85\xC0\x74\x07\x8B\xCE\xE8\x47\x14\x00\x00\x8B\xBE\x80\x04\x00\x00\x85\xFF\x74\x32\x83\x3F\x00\x74\x2D\x8B\xCF\xE8\x41\x19\x1A\x00\x84" + "linux" "@_ZN14CBaseAnimating16GetPoseParameterEi" + } + //how to find: find CBasePlayer::OnRestore through the "body_pitch" string, + //near the end of that function, follow the call receiving + //CStudioHdr* and "body_pitch". The callee is CBaseAnimating::LookupPoseParameter. + "CBaseAnimating::LookupPoseParameter" + { + "library" "server" + "windows" "\x55\x8B\xEC\x57\x8B\x7D\x08\x85\xFF\x75\x07\x33\xC0\x5F\x5D\xC2\x08\x00\x8B\xCF\xE8\x2A\x2A\x2A\x2A\x84\xC0\x74\xEE\x53\x56\x8B\xCF\x33\xF6\xE8\x2A\x2A\x2A\x2A\x85\xC0\x7E\x2A\x8B\x5D\x0C" + "linux" "@_ZN14CBaseAnimating19LookupPoseParameterEP10CStudioHdrPKc" + } + //how to find: find by string ''CBaseAnimating::SequenceDuration'' + //IS IN VIRTUAL TABLE FOR BM!!!! + "CBaseAnimating::SequenceDuration" + { + "library" "server" + "windows" "\x55\x8B\xEC\x56\x8B\x75\x08\x57\x8B\xF9\x85\xF6\x75\x2D\x8B\x47\x5C\xB9\x2A\x2A\x2A\x2A\x85\xC0\x0F\x45\xC8\x51\xFF\x75\x0C\x68\x2A\x2A\x2A\x2A\x6A\x02\xFF\x15\x2A\x2A\x2A\x2A\xD9\x05\x2A\x2A\x2A\x2A\x83\xC4\x10\x5F\x5E\x5D\xC2\x08\x00\x8B\xCE\xE8\x2E\xF8" + "linux" "@_ZN14CBaseAnimating16SequenceDurationEP10CStudioHdri" + } + // Go to data xref of string "ResetSequence : %s: %s -> %s\n" + "CBaseAnimating::ResetSequence" + { + "library" "server" + "windows" "\x55\x8B\xEC\xA1\x2A\x2A\x2A\x2A\x53\x56\x8B\xD9\xB9\x2A\x2A\x2A\x2A\x57\xFF\x50\x2C\x8B\x7D\x08\x85\xC0\x74\x45\xF7\x83\xF4\x00\x2A\x2A\x2A\x2A\x00\x00\x74\x39\x8B\x43\x5C\xBF\x2A\x2A\x2A\x2A\xFF\x75\x08\x8B\xB3\xC0\x03\x00\x00\x85\xC0\x8B\xCB\x0F\x45\xF8" + "linux" "@_ZN14CBaseAnimating13ResetSequenceEi" + } + //how to find: find CBlackMesaPlayer::CBlackMesaPlayer by string ''PlayerThink'', + //the func you'll look at should contain both ''PlayerThink'' and ''mp_scientist_hev'', + //open call trees, find empty func that does nothing (it may not appear in C decompiler), + //it is CountdownTimer::NetworkStateChanged, + //open it's call trees, + //find func that contains something like ''NextBotGroundLocomotion::vftable'', + //if you found one, it's the func you want + "NextBotGroundLocomotion::NextBotGroundLocomotion" + { + "library" "server" + "windows" "\x55\x8B\xEC\x56\x57\xFF\x75\x08\x8B\xF1\xE8\xA1\x01\x01\x00\xC7\x06\x2A\x2A\x2A\x2A\x8D\xBE\xF0\x00\x00\x00\xC7\x86\xB8\x00\x00\x00\xFF\xFF\xFF\x2A\x2A\x2A\x2A\x07\x0F\x2E\x05\x2A\x2A\x2A\x2A\xC7\x86\xE8\x00\x00\x00\x2A\x2A\x2A\x2A\x9F\xF6\xC4\x44\x7B\x0F" + "linux" "@_ZN23NextBotGroundLocomotionC2EP8INextBot" + } + //how to find: find object for convar ai_force_serverside_ragdolls, + //the only func in it's xref is CBaseCombatCharacter::CBaseCombatCharacter, + //open call trees for it, find func that contains something like NextBotCombatCharacter::vftable, + //the that contains it is what you need + "NextBotCombatCharacter::NextBotCombatCharacter" + { + "library" "server" + "windows" "\x56\x57\x8B\xF9\xE8\x07\x54\xE0\xFF\x8D\x8F\xB4\x08\x00\x00\xE8\x5C\xFC\x00\x00\xC7\x07\x2A\x2A\x2A\x2A\x8B\xC7\xC7\x87\xB4\x08\x00\x00\x2A\x2A\x2A\x2A\xC7\x87\x18\x09\x00\x00\xFF\xFF\xFF\xFF\xC6\x87\x1C\x09\x00\x00\x00\x5F\x5E\xC3" + "linux" "@_ZN22NextBotCombatCharacterC2Ev" + } + "g_TouchTrace" + { + "library" "server" + "linux" "@g_TouchTrace" + } + "TheNavMesh_Linux" + { + "library" "server" + "linux" "@TheNavMesh" + } + + "TheNavAreas_Linux" + { + "library" "server" + "linux" "@TheNavAreas" + } + } + "Addresses" + { + "GetAnimationEvent" + { + "windows" + { + "signature" "__GetAnimationEvent__" + // Immediate 5000 in: cmp [event + 4], 5000 + "offset" "133" + } + "linux" + { + "signature" "__GetAnimationEvent__" + // First immediate 4999 in the non-wrapping time-range branch. + "offset" "319" + } + } + // GCC emitted the same 4999 comparison twice. baseanimating.cpp must patch this too. + "GetAnimationEvent2" + { + "linux" + { + "signature" "__GetAnimationEvent__" + "offset" "507" + } + } + } + } } diff --git a/scripting/AMBuilder b/scripting/AMBuilder index 7a34dcb..9ccdad9 100644 --- a/scripting/AMBuilder +++ b/scripting/AMBuilder @@ -1,6 +1,7 @@ import os files = [ + 'cbasenpc/bmsnavtest/cbasenpc_bmsnavtest.sp', 'cbasenpc_actiontest.sp', 'cbasenpc_example.sp' ] diff --git a/scripting/cbasenpc/bmsnavtest/cbasenpc_bmsnavtest.sp b/scripting/cbasenpc/bmsnavtest/cbasenpc_bmsnavtest.sp new file mode 100644 index 0000000..9fd9a9a --- /dev/null +++ b/scripting/cbasenpc/bmsnavtest/cbasenpc_bmsnavtest.sp @@ -0,0 +1,404 @@ +//test this on dm_crossfire, it has proper nav mesh (you may need to launch with mp_coop 1) + +#include +#include +#include +#include + +#pragma semicolon 1 +#pragma newdecls required + +public Plugin myinfo = +{ + name = "BMS NavArea Full Demo", + author = "You", + description = "Demonstrates base + BMS CBaseNPC nav natives", + version = "1.0", + url = "" +}; + +// ─── Plugin load ───────────────────────────────────────────────────────────── + +public void OnPluginStart() +{ + RegConsoleCmd("sm_bms_navinfo", Cmd_NavInfo, "Detailed nav area info under your feet"); + RegConsoleCmd("sm_bms_markbase", Cmd_MarkBase, "Toggle BM_NAV_PLAYER_BASE on area under your feet"); + RegConsoleCmd("sm_bms_hidingspots", Cmd_HidingSpots, "List hiding spots in the area under your feet"); + RegConsoleCmd("sm_bms_neighbors", Cmd_Neighbors, "List adjacent areas in all 4 directions"); + RegConsoleCmd("sm_bms_path", Cmd_Path, "sm_bms_path - Build A* path to target player"); + RegConsoleCmd("sm_bms_scanall", Cmd_ScanAll, "Scan ALL nav areas and count player bases"); + RegConsoleCmd("sm_bms_hidingall", Cmd_HidingAll, "List all global hiding spots with cover flags"); +} + +public void OnMapStart() +{ + if (!TheNavMesh.IsLoaded()) + { + LogMessage("[BMS Nav] Nav mesh NOT loaded."); + return; + } + + bool analyzed = TheNavMesh.IsAnalyzed(); + bool outdated = TheNavMesh.IsOutOfDate(); + int areaCount = TheNavMesh.GetNavAreaCount(); + int spotCount = TheHidingSpots.Count; + + LogMessage("[BMS Nav] Loaded. Areas: %d | HidingSpots: %d | Analyzed: %s | OutOfDate: %s", + areaCount, spotCount, + analyzed ? "yes" : "no", + outdated ? "yes" : "no" + ); +} + +// ─── Helpers ───────────────────────────────────────────────────────────────── + +static bool GetAreaUnderClient(int client, CNavArea &area) +{ + int iclient = 1; + float pos[3]; + GetClientAbsOrigin(iclient, pos); + area = TheNavMesh.GetNavArea(pos, 120.0); + return (area != NULL_AREA); +} + +static void NavAttribsToString(int attribs, char[] buf, int maxlen) +{ + buf[0] = '\0'; + if (attribs & NAV_MESH_CROUCH) StrCat(buf, maxlen, "CROUCH "); + if (attribs & NAV_MESH_JUMP) StrCat(buf, maxlen, "JUMP "); + if (attribs & NAV_MESH_PRECISE) StrCat(buf, maxlen, "PRECISE "); + if (attribs & NAV_MESH_NO_JUMP) StrCat(buf, maxlen, "NO_JUMP "); + if (attribs & NAV_MESH_STOP) StrCat(buf, maxlen, "STOP "); + if (attribs & NAV_MESH_RUN) StrCat(buf, maxlen, "RUN "); + if (attribs & NAV_MESH_WALK) StrCat(buf, maxlen, "WALK "); + if (attribs & NAV_MESH_AVOID) StrCat(buf, maxlen, "AVOID "); + if (attribs & NAV_MESH_STAND) StrCat(buf, maxlen, "STAND "); + if (buf[0] == '\0') StrCat(buf, maxlen, "NONE"); +} + +static void HidingFlagsToString(HidingSpotFlags flags, char[] buf, int maxlen) +{ + buf[0] = '\0'; + if (flags & IN_COVER) StrCat(buf, maxlen, "COVER "); + if (flags & GOOD_SNIPER_SPOT) StrCat(buf, maxlen, "SNIPER "); + if (flags & IDEAL_SNIPER_SPOT) StrCat(buf, maxlen, "IDEAL_SNIPER "); + if (flags & EXPOSED) StrCat(buf, maxlen, "EXPOSED "); + if (buf[0] == '\0') StrCat(buf, maxlen, "NONE"); +} + +// ─── sm_bms_navinfo ────────────────────────────────────────────────────────── + +Action Cmd_NavInfo(int client, int args) +{ + int iclient = 1; + if (!TheNavMesh.IsLoaded()) { ReplyToCommand(iclient, "[BMS Nav] Mesh not loaded."); return Plugin_Handled; } + + CNavArea baseArea; + if (!GetAreaUnderClient(iclient, baseArea)) + { + ReplyToCommand(iclient, "[BMS Nav] No area found at your position."); + return Plugin_Handled; + } + + CBlackMesaNavArea area = view_as(baseArea); + + float center[3]; + area.GetCenter(center); + + float nwCorner[3], seCorner[3]; + area.GetExtent(nwCorner, seCorner); + + float normal[3]; + area.ComputeNormal(normal); + + char attribStr[128]; + NavAttribsToString(area.GetAttributes(), attribStr, sizeof(attribStr)); + + BlackMesaNavAttributeType gameAttribs = area.GetGameAttributes(); + char isBase[4]; + isBase = area.HasGameAttribute(BM_NAV_PLAYER_BASE) ? "YES" : "NO"; + + int adjTotal = 0; + for (int d = 0; d < view_as(NUM_DIRECTIONS); d++) + adjTotal += area.GetAdjacentCount(view_as(d)); + + ReplyToCommand(iclient, "--- Area %d ---", area.GetID()); + ReplyToCommand(iclient, " Center: (%.1f, %.1f, %.1f)", center[0], center[1], center[2]); + ReplyToCommand(iclient, " Size: %.1f x %.1f", area.GetSizeX(), area.GetSizeY()); + ReplyToCommand(iclient, " Light: %.2f", area.GetLightIntensity()); + ReplyToCommand(iclient, " Normal: (%.2f, %.2f, %.2f)", normal[0], normal[1], normal[2]); + ReplyToCommand(iclient, " NavAttribs: %s (0x%X)", attribStr, area.GetAttributes()); + ReplyToCommand(iclient, " GameAttribs: 0x%X | PlayerBase: %s", gameAttribs, isBase); + ReplyToCommand(iclient, " HidingSpots: %d | Neighbors: %d", area.GetHidingSpotCount(), adjTotal); + ReplyToCommand(iclient, " Blocked: %s", area.IsBlocked(TEAM_ANY) ? "YES" : "NO"); + + return Plugin_Handled; +} + +// ─── sm_bms_markbase ───────────────────────────────────────────────────────── + +Action Cmd_MarkBase(int client, int args) +{ + int iclient = 1; + if (!TheNavMesh.IsLoaded()) { ReplyToCommand(iclient, "[BMS Nav] Mesh not loaded."); return Plugin_Handled; } + + CNavArea baseArea; + if (!GetAreaUnderClient(iclient, baseArea)) + { + ReplyToCommand(iclient, "[BMS Nav] No area found at your position."); + return Plugin_Handled; + } + + CBlackMesaNavArea area = view_as(baseArea); + + if (area.HasGameAttribute(BM_NAV_PLAYER_BASE)) + { + area.ClearGameAttribute(BM_NAV_PLAYER_BASE); + ReplyToCommand(iclient, "[BMS Nav] Area %d: BM_NAV_PLAYER_BASE cleared.", area.GetID()); + } + else + { + area.SetGameAttribute(BM_NAV_PLAYER_BASE); + ReplyToCommand(iclient, "[BMS Nav] Area %d: BM_NAV_PLAYER_BASE set.", area.GetID()); + } + + return Plugin_Handled; +} + +// ─── sm_bms_hidingspots ────────────────────────────────────────────────────── + +Action Cmd_HidingSpots(int client, int args) +{ + int iclient = 1; + if (!TheNavMesh.IsLoaded()) { ReplyToCommand(iclient, "[BMS Nav] Mesh not loaded."); return Plugin_Handled; } + + CNavArea baseArea; + if (!GetAreaUnderClient(iclient, baseArea)) + { + ReplyToCommand(iclient, "[BMS Nav] No area found at your position."); + return Plugin_Handled; + } + + int count = baseArea.GetHidingSpotCount(); + ReplyToCommand(iclient, "[BMS Nav] Area %d has %d hiding spot(s):", baseArea.GetID(), count); + + for (int i = 0; i < count; i++) + { + HidingSpot spot = baseArea.GetHidingSpot(i); + float pos[3]; + spot.GetPosition(pos); + + char flagStr[64]; + HidingFlagsToString(spot.GetFlags(), flagStr, sizeof(flagStr)); + + ReplyToCommand(iclient, " [%d] ID:%d pos:(%.1f,%.1f,%.1f) flags:%s", + i, spot.GetID(), pos[0], pos[1], pos[2], flagStr); + } + + return Plugin_Handled; +} + +// ─── sm_bms_neighbors ──────────────────────────────────────────────────────── + +Action Cmd_Neighbors(int client, int args) +{ + int iclient = 1; + if (!TheNavMesh.IsLoaded()) { ReplyToCommand(iclient, "[BMS Nav] Mesh not loaded."); return Plugin_Handled; } + + CNavArea baseArea; + if (!GetAreaUnderClient(iclient, baseArea)) + { + ReplyToCommand(iclient, "[BMS Nav] No area found at your position."); + return Plugin_Handled; + } + + static const char dirNames[4][] = { "NORTH", "EAST", "SOUTH", "WEST" }; + + ReplyToCommand(iclient, "[BMS Nav] Neighbors of area %d:", baseArea.GetID()); + + for (int d = 0; d < view_as(NUM_DIRECTIONS); d++) + { + NavDirType dir = view_as(d); + int count = baseArea.GetAdjacentCount(dir); + + for (int i = 0; i < count; i++) + { + CBlackMesaNavArea neighbor = view_as(baseArea.GetAdjacentArea(dir, i)); + float neighborCenter[3]; + neighbor.GetCenter(neighborCenter); + + char isBase[4]; + isBase = neighbor.HasGameAttribute(BM_NAV_PLAYER_BASE) ? "YES" : "NO"; + + ReplyToCommand(iclient, " %s[%d] -> Area %d at (%.1f,%.1f,%.1f) len:%.1f base:%s", + dirNames[d], i, + neighbor.GetID(), + neighborCenter[0], neighborCenter[1], neighborCenter[2], + baseArea.GetAdjacentLength(dir, i), + isBase + ); + } + } + + return Plugin_Handled; +} + +// ─── sm_bms_path ───────────────────────────────────────────────────────────── + +Action Cmd_Path(int client, int args) +{ + int iclient = 1; + if (!TheNavMesh.IsLoaded()) { ReplyToCommand(iclient, "[BMS Nav] Mesh not loaded."); return Plugin_Handled; } + + if (args < 1) + { + ReplyToCommand(iclient, "Usage: sm_bms_path "); + return Plugin_Handled; + } + + char targetName[64]; + GetCmdArg(1, targetName, sizeof(targetName)); + + int target = -1; + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientInGame(i) || !IsPlayerAlive(i)) + continue; + + char name[MAX_NAME_LENGTH]; + GetClientName(i, name, sizeof(name)); + + if (StrContains(name, targetName, false) != -1) + { + target = i; + break; + } + } + + if (target == -1) + { + ReplyToCommand(client, "[BMS Nav] Target '%s' not found or not alive.", targetName); + return Plugin_Handled; + } + + float startPos[3], goalPos[3]; + GetClientAbsOrigin(iclient, startPos); + GetClientAbsOrigin(target, goalPos); + + CNavArea startArea = TheNavMesh.GetNavArea(startPos, 120.0); + CNavArea goalArea = TheNavMesh.GetNavArea(goalPos, 120.0); + + if (startArea == NULL_AREA || goalArea == NULL_AREA) + { + ReplyToCommand(iclient, "[BMS Nav] Could not find nav areas for one or both positions."); + return Plugin_Handled; + } + + CNavArea closestArea; + bool found = TheNavMesh.BuildPath(startArea, goalArea, goalPos, Path_Cost, closestArea); + + if (!found) + { + ReplyToCommand(iclient, "[BMS Nav] No path found to %N (closest area: %d).", target, closestArea.GetID()); + return Plugin_Handled; + } + + // Walk path backwards from goal to start via GetParent() + int stepCount = 0; + float totalDist = 0.0; + CNavArea step = closestArea; + + while (step != NULL_AREA && step != startArea) + { + CNavArea parent = step.GetParent(); + if (parent != NULL_AREA) + { + float stepCenter[3], parentCenter[3]; + step.GetCenter(stepCenter); + parent.GetCenter(parentCenter); + totalDist += GetVectorDistance(stepCenter, parentCenter); + } + stepCount++; + step = parent; + } + + ReplyToCommand(iclient, "[BMS Nav] Path to %N: %d area(s), ~%.1f units.", target, stepCount, totalDist); + + // Print first 5 steps from start + // Collect path into array first (reverse order) + CNavArea pathArr[256]; + int pathLen = 0; + step = closestArea; + while (step != NULL_AREA && pathLen < 256) + { + pathArr[pathLen++] = step; + step = step.GetParent(); + } + + int printCount = pathLen < 5 ? pathLen : 5; + ReplyToCommand(iclient, " First %d steps (from goal):", printCount); + for (int i = 0; i < printCount; i++) + { + CBlackMesaNavArea bmsStep = view_as(pathArr[i]); + float c[3]; + bmsStep.GetCenter(c); + char isBase[8]; // was [4] — needs room for "[BASE]" + null + isBase = bmsStep.HasGameAttribute(BM_NAV_PLAYER_BASE) ? "[BASE]" : ""; + ReplyToCommand(client, " [%d] Area %d at (%.1f,%.1f,%.1f) %s", + i, bmsStep.GetID(), c[0], c[1], c[2], isBase); + } + + return Plugin_Handled; +} + +// ─── sm_bms_scanall ────────────────────────────────────────────────────────── + +Action Cmd_ScanAll(int client, int args) +{ + int iclient = 1; + if (!TheNavMesh.IsLoaded()) { ReplyToCommand(iclient, "[BMS Nav] Mesh not loaded."); return Plugin_Handled; } + + int total = TheNavAreas.Count; + int baseCount = 0; + int blocked = 0; + + for (int i = 0; i < total; i++) + { + CBlackMesaNavArea area = view_as(TheNavAreas.Get(i)); + if (area.HasGameAttribute(BM_NAV_PLAYER_BASE)) + baseCount++; + if (area.IsBlocked(TEAM_ANY)) + blocked++; + } + + ReplyToCommand(iclient, "[BMS Nav] Total areas: %d | Player bases: %d | Blocked: %d", + total, baseCount, blocked); + + return Plugin_Handled; +} + +// ─── sm_bms_hidingall ──────────────────────────────────────────────────────── + +Action Cmd_HidingAll(int client, int args) +{ + int iclient = 1; + if (!TheNavMesh.IsLoaded()) { ReplyToCommand(iclient, "[BMS Nav] Mesh not loaded."); return Plugin_Handled; } + + int total = TheHidingSpots.Count; + int cover = 0; + int sniper = 0; + int exposed = 0; + + for (int i = 0; i < total; i++) + { + HidingSpot spot = TheHidingSpots.Get(i); + if (spot.HasGoodCover()) cover++; + if (spot.IsGoodSniperSpot()) sniper++; + if (spot.IsExposed()) exposed++; + } + + ReplyToCommand(iclient, "[BMS Nav] Global hiding spots: %d | Cover: %d | Sniper: %d | Exposed: %d", + total, cover, sniper, exposed); + + return Plugin_Handled; +} \ No newline at end of file diff --git a/scripting/cbasenpc_example.sp b/scripting/cbasenpc_example.sp index 1b861a9..dba9a7c 100644 --- a/scripting/cbasenpc_example.sp +++ b/scripting/cbasenpc_example.sp @@ -176,7 +176,7 @@ public Action Command_SpawnNPC(int iClient, int iArgs) TR_GetEndPosition(endPos, hTrace); delete hTrace; - CBaseNPC npc = CBaseNPC(); + CBaseNPC npc = new CBaseNPC(); if (npc == INVALID_NPC) { ReplyToCommand(iClient, "Failed to create npc!"); diff --git a/scripting/include/cbasenpc.inc b/scripting/include/cbasenpc.inc index 19df508..33e5d2d 100644 --- a/scripting/include/cbasenpc.inc +++ b/scripting/include/cbasenpc.inc @@ -3,6 +3,21 @@ #endif #define _CBASENPC_EXTENSION_INC_ +#if !defined CBASENPC_CUSTOM_COMPILE + + #if defined CBASENPC_BLACKMESA + //BM-specific feature macros + + #else + #if !defined CBASENPC_TF2 + #define CBASENPC_TF2 + #endif + //TF2-specific feature macros + + #endif + +#endif //!CBASENPC_CUSTOM_COMPILE + #include #define EFL_DIRTY_SURROUNDING_COLLISION_BOUNDS (1<<14) diff --git a/scripting/include/cbasenpc/baseanimating.inc b/scripting/include/cbasenpc/baseanimating.inc index bbb3cfb..814bc95 100644 --- a/scripting/include/cbasenpc/baseanimating.inc +++ b/scripting/include/cbasenpc/baseanimating.inc @@ -3,7 +3,11 @@ #endif #define _CBASENPC_BASEANIMATING_INC_ -#include "activity.inc" +#if defined CBASENPC_BLACKMESA + #include "bms/activity.inc" +#elseif defined CBASENPC_TF2 + #include "tf2/activity.inc" +#endif methodmap CBaseAnimating < CBaseEntity { diff --git a/scripting/include/cbasenpc/bms/activity.inc b/scripting/include/cbasenpc/bms/activity.inc new file mode 100644 index 0000000..177fc42 --- /dev/null +++ b/scripting/include/cbasenpc/bms/activity.inc @@ -0,0 +1,2340 @@ +#if defined _CBASENPC_ACTIVITY_INC_ + #endinput +#endif +#define _CBASENPC_ACTIVITY_INC_ + +//to use, just include this file before cbasenpc include, +//taked from ampreeT/SourceCoop: +//https://github.com/ampreeT/SourceCoop/blob/046528f881f006f0f0390be7998ae7c6b250748c/scripting/include/srccoop_api/typedef/bms/Activity.inc +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, + ACT_GAUSS_SPINCYCLE_NOAMMO, + + // 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_VM_RELOAD_LONG, + ACT_VM_PRIMARYATTACK_LASTROUND, + ACT_VM_PRIMARYATTACK_MP, + ACT_VM_IDLE_IS, + ACT_VM_IDLE_TO_IS, + ACT_VM_IS_TO_IDLE, + ACT_VM_PRIMARYATTACK_IS, + ACT_VM_PRIMARYATTACK_IS_MP, + ACT_VM_PRIMARYATTACK_LASTROUND_IS_MP, + ACT_VM_SECONDARYATTACK_IS, + ACT_CROSSBOW_HOLSTER_UNLOADED, + ACT_CROSSBOW_BOLT_BACK, + ACT_CROSSBOW_BOLT_BACK_UNLOADED, + ACT_CROSSBOW_IDLE_TO_IS_UNLOADED, + ACT_CROSSBOW_IS_TO_IDLE_UNLOADED, + ACT_VM_OVERCHARGE, + ACT_IDLE_SHOTGUN, + ACT_MP_GESTURE_RANGE_ATTACK, + ACT_MP_GESTURE_RELOAD, + ACT_BMMP_JUMP_GLOCK, + ACT_BMMP_JUMP_357, + ACT_BMMP_JUMP_SHOTGUN, + ACT_BMMP_JUMP_MP5, + ACT_BMMP_JUMP_HIVEHAND, + ACT_BMMP_JUMP_TAU, + ACT_BMMP_JUMP_GLUON, + ACT_BMMP_JUMP_GRENADE, + ACT_BMMP_JUMP_RPG, + ACT_BMMP_JUMP_CROSSBOW, + ACT_BMMP_JUMP_CROWBAR, + ACT_BMMP_JUMP_SATCHEL, + ACT_BMMP_JUMP_TRIPMINE, + ACT_BMMP_JUMP_SNARK, + ACT_BMMP_JUMP_LAND, + ACT_BMMP_JUMP_START_GLOCK, + ACT_BMMP_JUMP_START_357, + ACT_BMMP_JUMP_START_SHOTGUN, + ACT_BMMP_JUMP_START_MP5, + ACT_BMMP_JUMP_START_HIVEHAND, + ACT_BMMP_JUMP_START_TAU, + ACT_BMMP_JUMP_START_GLUON, + ACT_BMMP_JUMP_START_GRENADE, + ACT_BMMP_JUMP_START_RPG, + ACT_BMMP_JUMP_START_CROSSBOW, + ACT_BMMP_JUMP_START_CROWBAR, + ACT_BMMP_JUMP_START_SATCHEL, + ACT_BMMP_JUMP_START_TRIPMINE, + ACT_BMMP_JUMP_START_SNARK, + ACT_BMMP_JUMP_FLOAT_GLOCK, + ACT_BMMP_JUMP_FLOAT_357, + ACT_BMMP_JUMP_FLOAT_SHOTGUN, + ACT_BMMP_JUMP_FLOAT_MP5, + ACT_BMMP_JUMP_FLOAT_HIVEHAND, + ACT_BMMP_JUMP_FLOAT_TAU, + ACT_BMMP_JUMP_FLOAT_GLUON, + ACT_BMMP_JUMP_FLOAT_GRENADE, + ACT_BMMP_JUMP_FLOAT_RPG, + ACT_BMMP_JUMP_FLOAT_CROSSBOW, + ACT_BMMP_JUMP_FLOAT_CROWBAR, + ACT_BMMP_JUMP_FLOAT_SATCHEL, + ACT_BMMP_JUMP_FLOAT_TRIPMINE, + ACT_BMMP_JUMP_FLOAT_SNARK, + ACT_BMMP_SWIM_GLOCK, + ACT_BMMP_SWIM_357, + ACT_BMMP_SWIM_SHOTGUN, + ACT_BMMP_SWIM_MP5, + ACT_BMMP_SWIM_HIVEHAND, + ACT_BMMP_SWIM_TAU, + ACT_BMMP_SWIM_GLUON, + ACT_BMMP_SWIM_GRENADE, + ACT_BMMP_SWIM_RPG, + ACT_BMMP_SWIM_CROSSBOW, + ACT_BMMP_SWIM_CROWBAR, + ACT_BMMP_SWIM_SATCHEL, + ACT_BMMP_SWIM_TRIPMINE, + ACT_BMMP_SWIM_SNARK, + ACT_BMMP_IDLE_GLOCK, + ACT_BMMP_IDLE_357, + ACT_BMMP_IDLE_SHOTGUN, + ACT_BMMP_IDLE_MP5, + ACT_BMMP_IDLE_HIVEHAND, + ACT_BMMP_IDLE_TAU, + ACT_BMMP_IDLE_GLUON, + ACT_BMMP_IDLE_GRENADE, + ACT_BMMP_IDLE_RPG, + ACT_BMMP_IDLE_CROSSBOW, + ACT_BMMP_IDLE_CROWBAR, + ACT_BMMP_IDLE_SATCHEL, + ACT_BMMP_IDLE_TRIPMINE, + ACT_BMMP_IDLE_SNARK, + ACT_BMMP_IDLE_CROUCH_GLOCK, + ACT_BMMP_IDLE_CROUCH_357, + ACT_BMMP_IDLE_CROUCH_SHOTGUN, + ACT_BMMP_IDLE_CROUCH_MP5, + ACT_BMMP_IDLE_CROUCH_HIVEHAND, + ACT_BMMP_IDLE_CROUCH_TAU, + ACT_BMMP_IDLE_CROUCH_GLUON, + ACT_BMMP_IDLE_CROUCH_GRENADE, + ACT_BMMP_IDLE_CROUCH_RPG, + ACT_BMMP_IDLE_CROUCH_CROSSBOW, + ACT_BMMP_IDLE_CROUCH_CROWBAR, + ACT_BMMP_IDLE_CROUCH_SATCHEL, + ACT_BMMP_IDLE_CROUCH_TRIPMINE, + ACT_BMMP_IDLE_CROUCH_SNARK, + ACT_BMMP_WALK_CROUCH_GLOCK, + ACT_BMMP_WALK_CROUCH_357, + ACT_BMMP_WALK_CROUCH_SHOTGUN, + ACT_BMMP_WALK_CROUCH_MP5, + ACT_BMMP_WALK_CROUCH_HIVEHAND, + ACT_BMMP_WALK_CROUCH_TAU, + ACT_BMMP_WALK_CROUCH_GLUON, + ACT_BMMP_WALK_CROUCH_GRENADE, + ACT_BMMP_WALK_CROUCH_RPG, + ACT_BMMP_WALK_CROUCH_CROSSBOW, + ACT_BMMP_WALK_CROUCH_CROWBAR, + ACT_BMMP_WALK_CROUCH_SATCHEL, + ACT_BMMP_WALK_CROUCH_TRIPMINE, + ACT_BMMP_WALK_CROUCH_SNARK, + ACT_BMMP_RUN_GLOCK, + ACT_BMMP_RUN_357, + ACT_BMMP_RUN_SHOTGUN, + ACT_BMMP_RUN_MP5, + ACT_BMMP_RUN_HIVEHAND, + ACT_BMMP_RUN_TAU, + ACT_BMMP_RUN_GLUON, + ACT_BMMP_RUN_GRENADE, + ACT_BMMP_RUN_RPG, + ACT_BMMP_RUN_CROSSBOW, + ACT_BMMP_RUN_CROWBAR, + ACT_BMMP_RUN_SATCHEL, + ACT_BMMP_RUN_TRIPMINE, + ACT_BMMP_RUN_SNARK, + ACT_BMMP_GESTURE_RANGE_ATTACK_GLOCK, + ACT_BMMP_GESTURE_RANGE_ATTACK_357, + ACT_BMMP_GESTURE_RANGE_ATTACK_SHOTGUN, + ACT_BMMP_GESTURE_RANGE_ATTACK_MP5, + ACT_BMMP_GESTURE_RANGE_ATTACK_HIVEHAND, + ACT_BMMP_GESTURE_RANGE_ATTACK_TAU, + ACT_BMMP_GESTURE_RANGE_ATTACK_GLUON, + ACT_BMMP_GESTURE_RANGE_ATTACK_GRENADE, + ACT_BMMP_GESTURE_RANGE_ATTACK_RPG, + ACT_BMMP_GESTURE_RANGE_ATTACK_CROSSBOW, + ACT_BMMP_GESTURE_RANGE_ATTACK_CROWBAR, + ACT_BMMP_GESTURE_RANGE_ATTACK_SATCHEL, + ACT_BMMP_GESTURE_RANGE_ATTACK_SNARK, + ACT_BMMP_GESTURE_RELOAD_GLOCK, + ACT_BMMP_GESTURE_RELOAD_357, + ACT_BMMP_GESTURE_RELOAD_SHOTGUN, + ACT_BMMP_GESTURE_RELOAD_MP5, + ACT_BMMP_GESTURE_RELOAD_CROSSBOW, + ACT_BMMP_GESTURE_RELOAD_RPG, + ACT_ENGINEER_REVOLVER_DRAW, + ACT_ENGINEER_REVOLVER_IDLE, + ACT_ENGINEER_REVOLVER_PRIMARYATTACK, + ACT_ENGINEER_REVOLVER_RELOAD, + 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, + 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, + 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, + ACT_BALL_VM_CATCH, + ACT_BALL_VM_PICKUP, + ACT_BALL_VM_IDLE, + ACT_BALL_VM_THROW_START, + ACT_BALL_VM_THROW_LOOP, + ACT_BALL_VM_THROW_END, + ACT_MP_COMPETITIVE_LOSERSTATE, + ACT_MP_COMPETITIVE_WINNERSTATE, + ACT_SECONDARY_VM_ALTATTACK, + ACT_MP_PUSH_STAND_SECONDARY, + ACT_MP_PUSH_CROUCH_SECONDARY, + ACT_MP_PUSH_SWIM_SECONDARY, + ACT_CACTUS_FLINCH +} \ No newline at end of file diff --git a/scripting/include/cbasenpc/bms/nav.inc b/scripting/include/cbasenpc/bms/nav.inc new file mode 100644 index 0000000..b0e0d10 --- /dev/null +++ b/scripting/include/cbasenpc/bms/nav.inc @@ -0,0 +1,27 @@ +#if defined _CBASENPC_BMS_NAV_INC_ + #endinput +#endif +#define _CBASENPC_BMS_NAV_INC_ + +#include "../nav.inc" + +enum BlackMesaNavAttributeType +{ + BM_NAV_NONE = 0, + BM_NAV_PLAYER_BASE = (1 << 0), +}; + +methodmap CBlackMesaNavArea < CNavArea +{ + /** Returns Black Mesa-specific game attributes. */ + public native BlackMesaNavAttributeType GetGameAttributes(); + + /** Adds one or more Black Mesa-specific game attributes. */ + public native void SetGameAttribute(BlackMesaNavAttributeType attributes); + + /** Removes one or more Black Mesa-specific game attributes. */ + public native void ClearGameAttribute(BlackMesaNavAttributeType attributes); + + /** Returns true when at least one requested game attribute is present. */ + public native bool HasGameAttribute(BlackMesaNavAttributeType attributes); +}; diff --git a/scripting/include/cbasenpc/takedamageinfo.inc b/scripting/include/cbasenpc/takedamageinfo.inc index 3ac8f50..526ddc6 100644 --- a/scripting/include/cbasenpc/takedamageinfo.inc +++ b/scripting/include/cbasenpc/takedamageinfo.inc @@ -3,12 +3,14 @@ #endif #define _CBASENPC_TAKEDAMAGEINFO_INC_ +#if defined CBASENPC_TF2 enum TakeDamageInfo_CritType { TakeDamageInfo_CritType_None, TakeDamageInfo_CritType_Mini, TakeDamageInfo_CritType_Full }; +#endif methodmap CTakeDamageInfo { @@ -371,6 +373,7 @@ methodmap CTakeDamageInfo */ public native void SetDamagedOtherPlayers(int value); +#if defined CBASENPC_TF2 /** * Sets the damage crit type. * @@ -386,6 +389,7 @@ methodmap CTakeDamageInfo * @error Invalid takedamageinfo. */ public native TakeDamageInfo_CritType GetCritType(); +#endif }; /** diff --git a/scripting/include/cbasenpc/activity.inc b/scripting/include/cbasenpc/tf/activity.inc similarity index 100% rename from scripting/include/cbasenpc/activity.inc rename to scripting/include/cbasenpc/tf/activity.inc