Compare commits
38
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b635dace11 | ||
|
|
d990f956f9 | ||
|
|
955f1e0d3a | ||
|
|
b4cd559186 | ||
|
|
46e89891e1 | ||
|
|
080e2563c3 | ||
|
|
e1e0c33f2c | ||
|
|
0160d3cc71 | ||
|
|
81f0d82c67 | ||
|
|
b5276b435a | ||
|
|
16aecfb404 | ||
|
|
7054ef56f6 | ||
|
|
bfae78d1ec | ||
|
|
c82f2b4659 | ||
|
|
46d71790be | ||
|
|
647811f930 | ||
|
|
7ca80d1c7c | ||
|
|
8823bab3f3 | ||
|
|
b9d5b59bd1 | ||
|
|
7fc892d38b | ||
|
|
09040231a0 | ||
|
|
16541a5668 | ||
|
|
e1b3b14311 | ||
|
|
300632db86 | ||
|
|
d1776dd641 | ||
|
|
22cee6a2dd | ||
|
|
a2194df273 | ||
|
|
27e20996dd | ||
|
|
b5f16142e5 | ||
|
|
23f1f9e148 | ||
|
|
990f99af5a | ||
|
|
6ca9d86e8f | ||
|
|
fae8b4d49a | ||
|
|
7f2d9dd8eb | ||
|
|
8ae1b3e1e7 | ||
|
|
c77c853c02 | ||
|
|
2b0daba573 | ||
|
|
ba4aa4d37f |
@@ -3,3 +3,5 @@ e6ef5ecdf8d75740ca2685a709bf321f8873bc3b sourcemod-1.1.0
|
||||
e877885fac80be71822641f7a9122cebc9812521 sourcemod-1.1.1
|
||||
b3ffa8a4511c4eadaf533fc790aa6b14f7f0c6ea sourcemod-1.1.2
|
||||
3a73bbf60f34befa9b66be03fa5974b394bb3411 sourcemod-1.2.0
|
||||
78a1f1b1c6fa86fd7691c70ebf48a9fb3dfb3c11 sourcemod-1.5.0
|
||||
5574bfe07731b7dba171c1300f6022319d2dbc89 sourcemod-1.5.1
|
||||
|
||||
@@ -1,5 +1,42 @@
|
||||
SourceMod Changelog
|
||||
|
||||
SourceMod 1.5.2 [2013-10-29]
|
||||
|
||||
URL: http://wiki.alliedmods.net/SourceMod_1.5.2_Release_Notes
|
||||
|
||||
User Changes:
|
||||
- Updated gamedata support for TF2, CS:S, CS:GO, and HL2:DM.
|
||||
- Fixed crash from regression in SDKTools SetClientListening hook refcounting (bug 5956) (KyleS).
|
||||
- Fixed potential crash when having maps with format characters in name.
|
||||
- Fixed some nextmap issues with long map names.
|
||||
- SDKTools no longer requires gamedata for sm_dump_datamaps on TF2, CS:S, HL2:DM, and DoD:S (bug 5968).
|
||||
|
||||
Developer Changes:
|
||||
- Updated TFCond and TF custom dmg enums.
|
||||
- Updated TF2 critical hit detection logic in TF2_OnCalcIsAttackCritical to handle more cases, including when criticals are disabled (bug 5894).
|
||||
- Fixed GetEngineVersion native returning a bad value when running on MM:S 1.9.x or earlier (bug 5697).
|
||||
|
||||
----------------------------------------------------------
|
||||
SourceMod 1.5.1 [2013-09-10]
|
||||
|
||||
URL: http://wiki.alliedmods.net/SourceMod_1.5.1_Release_Notes
|
||||
|
||||
User Changes:
|
||||
- Updated gamedata support for TF2.
|
||||
- Added missing DispatchKeyValue gamedata for HL2 CTF (bug 5114) (peace-maker).
|
||||
- Fixed translations not being loaded if identifier was not two or three characters (fixes Portuguese) (bug 5888).
|
||||
- Fixed runoff voting occurring when receiving the exact number of required votes (bug 5890).
|
||||
- Fixed reserve slot plugin hiding too many slots on Orangebox gamesif SourceTV and/or Replay are present (bug 5499).
|
||||
- Fixed some crashes in TF2 and unexpected behavior in all games with SDKHook_TakeDamage due to uninitialized var.
|
||||
- Fixed attempted triggers from gagged users displaying in chat (bug 5918).
|
||||
- Fixed errors in Italian translation (Oktober).
|
||||
- Added Norwegian translation (checkster).
|
||||
|
||||
Developer Changes:
|
||||
- Added CS_UpdateClientModel native to CStrike extension for CS:S and CS:GO (bug 5905) (Drifter).
|
||||
- Fixed setting weapon param in SDKHook_TakeDamage overwriting attacker instead of setting weapon (bug 5911) (KyleS)
|
||||
|
||||
----------------------------------------------------------
|
||||
SourceMod 1.5.0 [2013-08-25]
|
||||
|
||||
URL: http://wiki.alliedmods.net/SourceMod_1.5.0_Release_Notes
|
||||
|
||||
+3
-3
@@ -184,14 +184,14 @@ void NextMapManager::OnSourceModLevelChange( const char *mapName )
|
||||
m_tempChangeInfo.m_mapName[0] ='\0';
|
||||
m_tempChangeInfo.m_changeReason[0] = '\0';
|
||||
m_tempChangeInfo.startTime = time(NULL);
|
||||
UTIL_Format(lastMap, sizeof(lastMap), mapName);
|
||||
UTIL_Format(lastMap, sizeof(lastMap), "%s", mapName);
|
||||
}
|
||||
|
||||
void NextMapManager::ForceChangeLevel( const char *mapName, const char* changeReason )
|
||||
{
|
||||
/* Store the mapname and reason */
|
||||
UTIL_Format(m_tempChangeInfo.m_mapName, sizeof(m_tempChangeInfo.m_mapName), mapName);
|
||||
UTIL_Format(m_tempChangeInfo.m_changeReason, sizeof(m_tempChangeInfo.m_changeReason), changeReason);
|
||||
UTIL_Format(m_tempChangeInfo.m_mapName, sizeof(m_tempChangeInfo.m_mapName), "%s", mapName);
|
||||
UTIL_Format(m_tempChangeInfo.m_changeReason, sizeof(m_tempChangeInfo.m_changeReason), "%s", changeReason);
|
||||
|
||||
/* Change level and skip our hook */
|
||||
g_forcedChange = true;
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@ struct MapChangeData
|
||||
startTime = 0;
|
||||
}
|
||||
|
||||
char m_mapName[32];
|
||||
char m_mapName[PLATFORM_MAX_PATH];
|
||||
char m_changeReason[100];
|
||||
time_t startTime;
|
||||
};
|
||||
|
||||
@@ -479,13 +479,6 @@ SMCResult CPhraseFile::ReadSMC_KeyValue(const SMCStates *states, const char *key
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t len = strlen(key);
|
||||
if (len < 2 || len > 3)
|
||||
{
|
||||
ParseWarning("Ignoring translation to invalid language \"%s\" on line %d.", key, states->line);
|
||||
return SMCResult_Continue;
|
||||
}
|
||||
|
||||
unsigned int lang;
|
||||
if (!m_pTranslator->GetLanguageByCode(key, &lang))
|
||||
{
|
||||
@@ -498,7 +491,7 @@ SMCResult CPhraseFile::ReadSMC_KeyValue(const SMCStates *states, const char *key
|
||||
/* See how many bytes we need for this string, then allocate.
|
||||
* NOTE: THIS SHOULD GUARANTEE THAT WE DO NOT NEED TO NEED TO SIZE CHECK
|
||||
*/
|
||||
len = strlen(value) + pPhrase->fmt_bytes + 1;
|
||||
size_t len = strlen(value) + pPhrase->fmt_bytes + 1;
|
||||
char *out_buf;
|
||||
int out_idx;
|
||||
|
||||
@@ -921,14 +914,6 @@ SMCResult Translator::ReadSMC_LeavingSection(const SMCStates *states)
|
||||
|
||||
SMCResult Translator::ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value)
|
||||
{
|
||||
size_t len = strlen(key);
|
||||
|
||||
if (len < 2 || len > 3)
|
||||
{
|
||||
smcore.LogError("[SM] Warning encountered parsing languages.cfg file.");
|
||||
smcore.LogError("[SM] Invalid language code \"%s\" is being ignored.", key);
|
||||
}
|
||||
|
||||
AddLanguage(key, value);
|
||||
|
||||
return SMCResult_Continue;
|
||||
|
||||
+17
-1
@@ -509,7 +509,23 @@ static cell_t GuessSDKVersion(IPluginContext *pContext, const cell_t *params)
|
||||
|
||||
static cell_t GetEngineVersion(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
return g_SMAPI->GetSourceEngineBuild();
|
||||
int engineVer = g_SMAPI->GetSourceEngineBuild();
|
||||
#if defined METAMOD_PLAPI_VERSION
|
||||
if (engineVer == SOURCE_ENGINE_ORANGEBOXVALVE_DEPRECATED)
|
||||
{
|
||||
const char *gamedir = g_SourceMod.GetGameFolderName();
|
||||
if (strcmp(gamedir, "tf") == 0)
|
||||
return SOURCE_ENGINE_TF2;
|
||||
else if (strcmp(gamedir, "cstrike") == 0)
|
||||
return SOURCE_ENGINE_CSS;
|
||||
else if (strcmp(gamedir, "dod") == 0)
|
||||
return SOURCE_ENGINE_DODS;
|
||||
else if (strcmp(gamedir, "hl2mp") == 0)
|
||||
return SOURCE_ENGINE_HL2DM;
|
||||
}
|
||||
#endif
|
||||
|
||||
return engineVer;
|
||||
}
|
||||
|
||||
static cell_t IndexToReference(IPluginContext *pContext, const cell_t *params)
|
||||
|
||||
@@ -787,6 +787,25 @@ static cell_t CS_GetClientAssists(IPluginContext *pContext, const cell_t *params
|
||||
#endif
|
||||
}
|
||||
|
||||
static cell_t CS_UpdateClientModel(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
static ICallWrapper *pWrapper = NULL;
|
||||
if (!pWrapper)
|
||||
{
|
||||
REGISTER_NATIVE_ADDR("SetModelFromClass",
|
||||
pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, NULL, 0));
|
||||
}
|
||||
|
||||
CBaseEntity *pEntity;
|
||||
if (!(pEntity=GetCBaseEntity(params[1], true)))
|
||||
{
|
||||
return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
|
||||
}
|
||||
|
||||
pWrapper->Execute(&pEntity, NULL);
|
||||
|
||||
return 1;
|
||||
}
|
||||
sp_nativeinfo_t g_CSNatives[] =
|
||||
{
|
||||
{"CS_RespawnPlayer", CS_RespawnPlayer},
|
||||
@@ -807,6 +826,7 @@ sp_nativeinfo_t g_CSNatives[] =
|
||||
{"CS_SetClientContributionScore", CS_SetClientContributionScore},
|
||||
{"CS_GetClientAssists", CS_GetClientAssists},
|
||||
{"CS_SetClientAssists", CS_SetClientAssists},
|
||||
{"CS_UpdateClientModel", CS_UpdateClientModel},
|
||||
{"CS_IsValidWeaponID", CS_IsValidWeaponID},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
@@ -116,7 +116,7 @@ cell_t Native_TakeDamage(IPluginContext *pContext, const cell_t *params)
|
||||
if (!pInflictor)
|
||||
return pContext->ThrowNativeError("Invalid entity index %d for inflictor", params[2]);
|
||||
|
||||
CBaseEntity *pAttacker = NULL;
|
||||
CBaseEntity *pAttacker;
|
||||
if (params[3] != -1)
|
||||
{
|
||||
pAttacker = UTIL_GetCBaseEntity(params[3]);
|
||||
@@ -125,21 +125,28 @@ cell_t Native_TakeDamage(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Invalid entity index %d for attackerr", params[3]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pAttacker = NULL;
|
||||
}
|
||||
|
||||
float flDamage = sp_ctof(params[4]);
|
||||
int iDamageType = params[5];
|
||||
|
||||
CBaseEntity *pWeapon = NULL;
|
||||
CBaseEntity *pWeapon;
|
||||
if (params[6] != -1)
|
||||
{
|
||||
pAttacker = UTIL_GetCBaseEntity(params[6]);
|
||||
if (!pAttacker)
|
||||
pWeapon = UTIL_GetCBaseEntity(params[6]);
|
||||
if (!pWeapon)
|
||||
{
|
||||
return pContext->ThrowNativeError("Invalid entity index %d for weapon", params[6]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pWeapon = NULL;
|
||||
}
|
||||
|
||||
Vector vecDamageForce = Vector(0.0f, 0.0f, 0.0f);
|
||||
cell_t *addr;
|
||||
int err;
|
||||
if ((err = pContext->LocalToPhysAddr(params[7], &addr)) != SP_ERROR_NONE)
|
||||
@@ -147,26 +154,29 @@ cell_t Native_TakeDamage(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Could not read damageForce vector");
|
||||
}
|
||||
|
||||
Vector vecDamageForce;
|
||||
if (addr != pContext->GetNullRef(SP_NULL_VECTOR))
|
||||
{
|
||||
vecDamageForce = Vector(
|
||||
sp_ctof(addr[0]),
|
||||
sp_ctof(addr[1]),
|
||||
sp_ctof(addr[2]));
|
||||
vecDamageForce.Init(sp_ctof(addr[0]), sp_ctof(addr[1]), sp_ctof(addr[2]));
|
||||
}
|
||||
else
|
||||
{
|
||||
vecDamageForce.Init();
|
||||
}
|
||||
|
||||
Vector vecDamagePosition = vec3_origin;
|
||||
if ((err = pContext->LocalToPhysAddr(params[8], &addr)) != SP_ERROR_NONE)
|
||||
{
|
||||
return pContext->ThrowNativeError("Could not read damagePosition vector");
|
||||
}
|
||||
|
||||
Vector vecDamagePosition;
|
||||
if (addr != pContext->GetNullRef(SP_NULL_VECTOR))
|
||||
{
|
||||
vecDamagePosition = Vector(
|
||||
sp_ctof(addr[0]),
|
||||
sp_ctof(addr[1]),
|
||||
sp_ctof(addr[2]));
|
||||
vecDamagePosition.Init(sp_ctof(addr[0]), sp_ctof(addr[1]), sp_ctof(addr[2]));
|
||||
}
|
||||
else
|
||||
{
|
||||
vecDamagePosition = vec3_origin;
|
||||
}
|
||||
|
||||
CTakeDamageInfoHack info(pInflictor, pAttacker, flDamage, iDamageType, pWeapon, vecDamageForce, vecDamagePosition);
|
||||
|
||||
@@ -62,10 +62,16 @@ CTakeDamageInfoHack::CTakeDamageInfoHack( CBaseEntity *pInflictor, CBaseEntity *
|
||||
m_vecReportedPosition = vec3_origin;
|
||||
m_iAmmoType = -1;
|
||||
|
||||
#if SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_TF2
|
||||
#if SOURCE_ENGINE < SE_ORANGEBOX
|
||||
m_iCustomKillType = 0;
|
||||
#else
|
||||
m_iDamageCustom = 0;
|
||||
#endif
|
||||
|
||||
#if SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_SDK2013 || SOURCE_ENGINE == SE_TF2
|
||||
m_iDamagedOtherPlayers = 0;
|
||||
m_iPlayerPenetrateCount = 0;
|
||||
m_flUnknown = 0.0f;
|
||||
m_iPlayerPenetrationCount = 0;
|
||||
m_flDamageBonus = 0.0f;
|
||||
#endif
|
||||
|
||||
#if SOURCE_ENGINE >= SE_ALIENSWARM
|
||||
|
||||
@@ -516,6 +516,12 @@ CON_COMMAND(sm_dump_classes, "Dumps the class list as a text file")
|
||||
return;
|
||||
}
|
||||
|
||||
CEntityFactoryDictionary *dict = NULL;
|
||||
|
||||
#if SOURCE_ENGINE == SE_TF2 || SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_HL2DM
|
||||
dict = (CEntityFactoryDictionary *)servertools->GetEntityFactoryDictionary();
|
||||
#else
|
||||
|
||||
ICallWrapper *pWrapper = NULL;
|
||||
|
||||
if (!pWrapper)
|
||||
@@ -535,21 +541,13 @@ CON_COMMAND(sm_dump_classes, "Dumps the class list as a text file")
|
||||
pWrapper = g_pBinTools->CreateCall(addr, CallConv_Cdecl, &retData, NULL, 0);
|
||||
}
|
||||
|
||||
|
||||
void *returnData = NULL;
|
||||
|
||||
pWrapper->Execute(NULL, &returnData);
|
||||
pWrapper->Execute(NULL, &dict);
|
||||
|
||||
pWrapper->Destroy();
|
||||
|
||||
if (returnData == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
CEntityFactoryDictionary *dict = ( CEntityFactoryDictionary * )returnData;
|
||||
|
||||
if ( !dict )
|
||||
if (dict == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *)
|
||||
|
||||
bool DecHookCount()
|
||||
{
|
||||
if (g_VoiceHookCount == 0)
|
||||
if (--g_VoiceHookCount == 0)
|
||||
{
|
||||
SH_REMOVE_HOOK_MEMFUNC(IVoiceServer, SetClientListening, voiceserver, &g_SdkTools, &SDKTools::OnSetClientListening, false);
|
||||
return true;
|
||||
|
||||
+141
-187
@@ -30,217 +30,171 @@
|
||||
*/
|
||||
|
||||
#include "criticals.h"
|
||||
#include "util.h"
|
||||
|
||||
IServerGameEnts *gameents = NULL;
|
||||
|
||||
CDetour *calcIsAttackCriticalDetour = NULL;
|
||||
CDetour *calcIsAttackCriticalMeleeDetour = NULL;
|
||||
CDetour *calcIsAttackCriticalBowDetour = NULL;
|
||||
CritManager g_CritManager;
|
||||
|
||||
IForward *g_critForward = NULL;
|
||||
|
||||
enum DetourResult
|
||||
SH_DECL_MANUALHOOK0(CalcIsAttackCriticalHelper, 0, 0, 0, bool);
|
||||
SH_DECL_MANUALHOOK0(CalcIsAttackCriticalHelperNoCrits, 0, 0, 0, bool);
|
||||
|
||||
const char TF_WEAPON_DATATABLE[] = "DT_TFWeaponBase";
|
||||
|
||||
CritManager::CritManager() :
|
||||
m_enabled(false),
|
||||
m_hooksSetup(false)
|
||||
{
|
||||
Result_Ignore,
|
||||
Result_NoCrit,
|
||||
Result_Crit,
|
||||
};
|
||||
|
||||
int CheckBaseHandle(CBaseHandle &hndl)
|
||||
{
|
||||
if (!hndl.IsValid())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
int index = hndl.GetEntryIndex();
|
||||
|
||||
edict_t *pStoredEdict;
|
||||
|
||||
pStoredEdict = engine->PEntityOfEntIndex(index);
|
||||
|
||||
if (pStoredEdict == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
IServerEntity *pSE = pStoredEdict->GetIServerEntity();
|
||||
|
||||
if (pSE == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (pSE->GetRefEHandle() != hndl)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return index;
|
||||
m_entsHooked.Init();
|
||||
}
|
||||
|
||||
DetourResult DetourCallback(CBaseEntity *pEnt)
|
||||
bool CritManager::TryEnable()
|
||||
{
|
||||
edict_t *pEdict = gameents->BaseEntityToEdict((CBaseEntity *)pEnt);
|
||||
|
||||
if (!pEdict)
|
||||
if (!m_hooksSetup)
|
||||
{
|
||||
g_pSM->LogMessage(myself, "Entity Error");
|
||||
return Result_Ignore;
|
||||
int offset;
|
||||
|
||||
if (!g_pGameConf->GetOffset("CalcIsAttackCriticalHelper", &offset))
|
||||
{
|
||||
g_pSM->LogError(myself, "Failed to find CalcIsAttackCriticalHelper offset");
|
||||
return false;
|
||||
}
|
||||
|
||||
SH_MANUALHOOK_RECONFIGURE(CalcIsAttackCriticalHelper, offset, 0, 0);
|
||||
|
||||
if (!g_pGameConf->GetOffset("CalcIsAttackCriticalHelperNoCrits", &offset))
|
||||
{
|
||||
g_pSM->LogError(myself, "Failed to find CalcIsAttackCriticalHelperNoCrits offset");
|
||||
return false;
|
||||
}
|
||||
|
||||
SH_MANUALHOOK_RECONFIGURE(CalcIsAttackCriticalHelperNoCrits, offset, 0, 0);
|
||||
|
||||
m_hooksSetup = true;
|
||||
}
|
||||
|
||||
for (size_t i = playerhelpers->GetMaxClients() + 1; i < MAX_EDICTS; ++i)
|
||||
{
|
||||
CBaseEntity *pEntity = gamehelpers->ReferenceToEntity(i);
|
||||
if (pEntity == NULL)
|
||||
continue;
|
||||
|
||||
IServerUnknown *pUnknown = (IServerUnknown *)pEntity;
|
||||
IServerNetworkable *pNetworkable = pUnknown->GetNetworkable();
|
||||
if (!pNetworkable)
|
||||
continue;
|
||||
|
||||
if (!UTIL_ContainsDataTable(pNetworkable->GetServerClass()->m_pTable, TF_WEAPON_DATATABLE))
|
||||
continue;
|
||||
|
||||
SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
|
||||
SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
|
||||
|
||||
m_entsHooked.Set(i);
|
||||
}
|
||||
|
||||
m_enabled = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CritManager::Disable()
|
||||
{
|
||||
int i = m_entsHooked.FindNextSetBit(playerhelpers->GetMaxClients() + 1);
|
||||
for (i; i != -1; i = m_entsHooked.FindNextSetBit(i))
|
||||
{
|
||||
CBaseEntity *pEntity = gamehelpers->ReferenceToEntity(i);
|
||||
SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
|
||||
SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
|
||||
|
||||
m_entsHooked.Set(i, false);
|
||||
}
|
||||
|
||||
m_enabled = false;
|
||||
}
|
||||
|
||||
void CritManager::OnEntityCreated(CBaseEntity *pEntity, const char *classname)
|
||||
{
|
||||
if (!m_enabled)
|
||||
return;
|
||||
|
||||
IServerUnknown *pUnknown = (IServerUnknown *)pEntity;
|
||||
IServerNetworkable *pNetworkable = pUnknown->GetNetworkable();
|
||||
if (!pNetworkable)
|
||||
return;
|
||||
|
||||
if (!UTIL_ContainsDataTable(pNetworkable->GetServerClass()->m_pTable, TF_WEAPON_DATATABLE))
|
||||
return;
|
||||
|
||||
SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
|
||||
SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
|
||||
|
||||
m_entsHooked.Set(gamehelpers->EntityToBCompatRef(pEntity));
|
||||
}
|
||||
|
||||
void CritManager::OnEntityDestroyed(CBaseEntity *pEntity)
|
||||
{
|
||||
if (!m_enabled)
|
||||
return;
|
||||
|
||||
int index = gamehelpers->EntityToBCompatRef(pEntity);
|
||||
if (index < 0 || index >= MAX_EDICTS)
|
||||
return;
|
||||
|
||||
if (!m_entsHooked.IsBitSet(index))
|
||||
return;
|
||||
|
||||
SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
|
||||
SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
|
||||
|
||||
m_entsHooked.Set(index, false);
|
||||
}
|
||||
|
||||
bool CritManager::Hook_CalcIsAttackCriticalHelpers()
|
||||
{
|
||||
CBaseEntity *pWeapon = META_IFACEPTR(CBaseEntity);
|
||||
|
||||
// If there's an invalid ent or invalid networkable here, we've got issues elsewhere.
|
||||
|
||||
IServerNetworkable *pNetWeapon = ((IServerUnknown *)pWeapon)->GetNetworkable();
|
||||
ServerClass *pServerClass = pNetWeapon->GetServerClass();
|
||||
if (!pServerClass)
|
||||
{
|
||||
g_pSM->LogError(myself, "Invalid server class on weapon.");
|
||||
RETURN_META_VALUE(MRES_IGNORED, false);
|
||||
}
|
||||
|
||||
sm_sendprop_info_t info;
|
||||
|
||||
if (!gamehelpers->FindSendPropInfo(pEdict->GetNetworkable()->GetServerClass()->GetName(), "m_hOwnerEntity", &info))
|
||||
if (!gamehelpers->FindSendPropInfo(pServerClass->GetName(), "m_hOwnerEntity", &info))
|
||||
{
|
||||
g_pSM->LogMessage(myself, "Offset Error");
|
||||
return Result_Ignore;
|
||||
g_pSM->LogError(myself, "Could not find m_hOwnerEntity on %s", pServerClass->GetName());
|
||||
RETURN_META_VALUE(MRES_IGNORED, false);
|
||||
}
|
||||
|
||||
if (!g_critForward)
|
||||
int returnValue = 0;
|
||||
|
||||
int ownerIndex = -1;
|
||||
CBaseHandle &hndl = *(CBaseHandle *) ((intptr_t)pWeapon + info.actual_offset);
|
||||
CBaseEntity *pHandleEntity = gamehelpers->ReferenceToEntity(hndl.GetEntryIndex());
|
||||
|
||||
if (pHandleEntity != NULL && hndl == reinterpret_cast<IHandleEntity *>(pHandleEntity)->GetRefEHandle())
|
||||
{
|
||||
g_pSM->LogMessage(myself, "Invalid Forward");
|
||||
return Result_Ignore;
|
||||
ownerIndex = hndl.GetEntryIndex();
|
||||
}
|
||||
|
||||
int returnValue=0;
|
||||
|
||||
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEnt + info.actual_offset);
|
||||
int index = CheckBaseHandle(hndl);
|
||||
|
||||
g_critForward->PushCell(index); //Client index
|
||||
g_critForward->PushCell(engine->IndexOfEdict(pEdict)); // Weapon index
|
||||
g_critForward->PushString(pEdict->GetClassName()); //Weapon classname
|
||||
g_critForward->PushCell(ownerIndex); //Client index
|
||||
g_critForward->PushCell(gamehelpers->EntityToBCompatRef(pWeapon)); // Weapon index
|
||||
g_critForward->PushString(gamehelpers->GetEntityClassname(pWeapon)); //Weapon classname
|
||||
g_critForward->PushCellByRef(&returnValue); //return value
|
||||
|
||||
cell_t result = 0;
|
||||
|
||||
g_critForward->Execute(&result);
|
||||
|
||||
if (result)
|
||||
if (result && returnValue)
|
||||
{
|
||||
if (returnValue)
|
||||
{
|
||||
return Result_Crit;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Result_NoCrit;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return Result_Ignore;
|
||||
}
|
||||
}
|
||||
|
||||
DETOUR_DECL_MEMBER0(CalcIsAttackCriticalHelperMelee, bool)
|
||||
{
|
||||
DetourResult result = DetourCallback((CBaseEntity *)this);
|
||||
|
||||
if (result == Result_Ignore)
|
||||
{
|
||||
return DETOUR_MEMBER_CALL(CalcIsAttackCriticalHelperMelee)();
|
||||
}
|
||||
else if (result == Result_NoCrit)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
DETOUR_DECL_MEMBER0(CalcIsAttackCriticalHelper, bool)
|
||||
{
|
||||
DetourResult result = DetourCallback((CBaseEntity *)this);
|
||||
|
||||
if (result == Result_Ignore)
|
||||
{
|
||||
return DETOUR_MEMBER_CALL(CalcIsAttackCriticalHelper)();
|
||||
}
|
||||
else if (result == Result_NoCrit)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
DETOUR_DECL_MEMBER0(CalcIsAttackCriticalHelperBow, bool)
|
||||
{
|
||||
DetourResult result = DetourCallback((CBaseEntity *)this);
|
||||
|
||||
if (result == Result_Ignore)
|
||||
{
|
||||
return DETOUR_MEMBER_CALL(CalcIsAttackCriticalHelperBow)();
|
||||
}
|
||||
else if (result == Result_NoCrit)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
bool InitialiseCritDetours()
|
||||
{
|
||||
calcIsAttackCriticalDetour = DETOUR_CREATE_MEMBER(CalcIsAttackCriticalHelper, "CalcCritical");
|
||||
calcIsAttackCriticalMeleeDetour = DETOUR_CREATE_MEMBER(CalcIsAttackCriticalHelperMelee, "CalcCriticalMelee");
|
||||
calcIsAttackCriticalBowDetour = DETOUR_CREATE_MEMBER(CalcIsAttackCriticalHelperBow, "CalcCriticalBow");
|
||||
|
||||
bool HookCreated = false;
|
||||
|
||||
if (calcIsAttackCriticalDetour != NULL)
|
||||
{
|
||||
calcIsAttackCriticalDetour->EnableDetour();
|
||||
HookCreated = true;
|
||||
}
|
||||
|
||||
if (calcIsAttackCriticalMeleeDetour != NULL)
|
||||
{
|
||||
calcIsAttackCriticalMeleeDetour->EnableDetour();
|
||||
HookCreated = true;
|
||||
}
|
||||
|
||||
if (calcIsAttackCriticalBowDetour != NULL)
|
||||
{
|
||||
calcIsAttackCriticalBowDetour->EnableDetour();
|
||||
HookCreated = true;
|
||||
}
|
||||
|
||||
if (HookCreated)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
g_pSM->LogError(myself, "No critical hit forwards could be initialized - Disabled critical hit hooks");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void RemoveCritDetours()
|
||||
{
|
||||
if (calcIsAttackCriticalDetour != NULL)
|
||||
{
|
||||
calcIsAttackCriticalDetour->Destroy();
|
||||
calcIsAttackCriticalDetour = NULL;
|
||||
}
|
||||
|
||||
if (calcIsAttackCriticalMeleeDetour != NULL)
|
||||
{
|
||||
calcIsAttackCriticalMeleeDetour->Destroy();
|
||||
calcIsAttackCriticalMeleeDetour = NULL;
|
||||
}
|
||||
|
||||
if (calcIsAttackCriticalBowDetour != NULL)
|
||||
{
|
||||
calcIsAttackCriticalBowDetour->Destroy();
|
||||
calcIsAttackCriticalBowDetour = NULL;
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, true);
|
||||
}
|
||||
|
||||
RETURN_META_VALUE(MRES_IGNORED, false);
|
||||
}
|
||||
|
||||
@@ -36,12 +36,38 @@
|
||||
#include <jit/jit_helpers.h>
|
||||
#include <jit/x86/x86_macros.h>
|
||||
#include "CDetour/detours.h"
|
||||
#include "ISDKHooks.h"
|
||||
|
||||
bool InitialiseCritDetours();
|
||||
void RemoveCritDetours();
|
||||
class CritManager : public ISMEntityListener
|
||||
{
|
||||
public:
|
||||
CritManager();
|
||||
|
||||
public:
|
||||
bool TryEnable();
|
||||
void Disable();
|
||||
|
||||
// ISMEntityListener
|
||||
public:
|
||||
virtual void OnEntityCreated(CBaseEntity *pEntity, const char *classname);
|
||||
virtual void OnEntityDestroyed(CBaseEntity *pEntity);
|
||||
|
||||
private:
|
||||
void HookEntityIfWeapon(CBaseEntity *pEntity);
|
||||
void UnhookEntityIfHooked(CBaseEntity *pEntity);
|
||||
|
||||
public:
|
||||
// CritHook
|
||||
bool Hook_CalcIsAttackCriticalHelpers();
|
||||
|
||||
private:
|
||||
bool m_enabled;
|
||||
bool m_hooksSetup;
|
||||
CBitVec<MAX_EDICTS> m_entsHooked;
|
||||
};
|
||||
|
||||
extern CritManager g_CritManager;
|
||||
|
||||
extern IForward *g_critForward;
|
||||
|
||||
extern IServerGameEnts *gameents;
|
||||
|
||||
#endif //_INCLUDE_SOURCEMOD_CRITICALS_H_
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include "gameplayrules.h"
|
||||
#include "teleporter.h"
|
||||
#include "CDetour/detours.h"
|
||||
#include "ISDKHooks.h"
|
||||
|
||||
/**
|
||||
* @file extension.cpp
|
||||
@@ -52,6 +53,7 @@ TF2Tools g_TF2Tools;
|
||||
IGameConfig *g_pGameConf = NULL;
|
||||
|
||||
IBinTools *g_pBinTools = NULL;
|
||||
ISDKHooks *g_pSDKHooks = NULL;
|
||||
|
||||
SMEXT_LINK(&g_TF2Tools);
|
||||
|
||||
@@ -91,6 +93,7 @@ bool TF2Tools::SDK_OnLoad(char *error, size_t maxlength, bool late)
|
||||
}
|
||||
|
||||
sharesys->AddDependency(myself, "bintools.ext", true, true);
|
||||
sharesys->AddDependency(myself, "sdkhooks.ext", true, true);
|
||||
|
||||
char conf_error[255] = "";
|
||||
if (!gameconfs->LoadGameConfigFile("sm-tf2.games", &g_pGameConf, conf_error, sizeof(conf_error)))
|
||||
@@ -151,8 +154,6 @@ bool TF2Tools::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlen, bool
|
||||
|
||||
GET_V_IFACE_CURRENT(GetEngineFactory, icvar, ICvar, CVAR_INTERFACE_VERSION);
|
||||
|
||||
GET_V_IFACE_CURRENT(GetServerFactory, gameents, IServerGameEnts, INTERFACEVERSION_SERVERGAMEENTS);
|
||||
|
||||
GET_V_IFACE_CURRENT(GetEngineFactory, m_GameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2);
|
||||
m_GameEventManager->AddListener(this, "teamplay_restart_round", true);
|
||||
|
||||
@@ -177,11 +178,22 @@ void TF2Tools::SDK_OnUnload()
|
||||
forwards->ReleaseForward(g_waitingPlayersStartForward);
|
||||
forwards->ReleaseForward(g_waitingPlayersEndForward);
|
||||
forwards->ReleaseForward(g_teleportForward);
|
||||
|
||||
if (g_pSDKHooks != NULL)
|
||||
{
|
||||
g_pSDKHooks->RemoveEntityListener(&g_CritManager);
|
||||
}
|
||||
}
|
||||
|
||||
void TF2Tools::SDK_OnAllLoaded()
|
||||
{
|
||||
SM_GET_LATE_IFACE(BINTOOLS, g_pBinTools);
|
||||
SM_GET_LATE_IFACE(SDKHOOKS, g_pSDKHooks);
|
||||
|
||||
if (g_pSDKHooks != NULL)
|
||||
{
|
||||
g_pSDKHooks->AddEntityListener(&g_CritManager);
|
||||
}
|
||||
}
|
||||
|
||||
bool TF2Tools::RegisterConCommandBase(ConCommandBase *pVar)
|
||||
@@ -198,6 +210,7 @@ void TF2Tools::FireGameEvent( IGameEvent *event )
|
||||
bool TF2Tools::QueryRunning(char *error, size_t maxlength)
|
||||
{
|
||||
SM_CHECK_IFACE(BINTOOLS, g_pBinTools);
|
||||
SM_GET_LATE_IFACE(SDKHOOKS, g_pSDKHooks);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -209,6 +222,11 @@ bool TF2Tools::QueryInterfaceDrop(SMInterface *pInterface)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pInterface == g_pSDKHooks)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return IExtensionInterface::QueryInterfaceDrop(pInterface);
|
||||
}
|
||||
|
||||
@@ -321,7 +339,7 @@ void TF2Tools::OnPluginLoaded(IPlugin *plugin)
|
||||
{
|
||||
if (!m_CritDetoursEnabled && g_critForward->GetFunctionCount())
|
||||
{
|
||||
m_CritDetoursEnabled = InitialiseCritDetours();
|
||||
m_CritDetoursEnabled = g_CritManager.TryEnable();
|
||||
}
|
||||
|
||||
if (!m_IsHolidayDetourEnabled && g_isHolidayForward->GetFunctionCount())
|
||||
@@ -353,7 +371,7 @@ void TF2Tools::OnPluginUnloaded(IPlugin *plugin)
|
||||
{
|
||||
if (m_CritDetoursEnabled && !g_critForward->GetFunctionCount())
|
||||
{
|
||||
RemoveCritDetours();
|
||||
g_CritManager.Disable();
|
||||
m_CritDetoursEnabled = false;
|
||||
}
|
||||
if (m_IsHolidayDetourEnabled && !g_isHolidayForward->GetFunctionCount())
|
||||
|
||||
@@ -100,14 +100,17 @@ cell_t TF2_Burn(IPluginContext *pContext, const cell_t *params)
|
||||
if (!pWrapper)
|
||||
{
|
||||
REGISTER_NATIVE_ADDR("Burn",
|
||||
PassInfo pass[2]; \
|
||||
PassInfo pass[3]; \
|
||||
pass[0].flags = PASSFLAG_BYVAL; \
|
||||
pass[0].size = sizeof(CBaseEntity *); \
|
||||
pass[0].type = PassType_Basic; \
|
||||
pass[1].flags = PASSFLAG_BYVAL; \
|
||||
pass[1].size = sizeof(CBaseEntity *); \
|
||||
pass[1].type = PassType_Basic; \
|
||||
pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 2))
|
||||
pass[2].flags = PASSFLAG_BYVAL; \
|
||||
pass[2].size = sizeof(float); \
|
||||
pass[2].type = PassType_Basic; \
|
||||
pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 3))
|
||||
}
|
||||
|
||||
CBaseEntity *pEntity;
|
||||
@@ -132,6 +135,8 @@ cell_t TF2_Burn(IPluginContext *pContext, const cell_t *params)
|
||||
*(CBaseEntity **)vptr = pTarget;
|
||||
vptr += sizeof(CBaseEntity *);
|
||||
*(CBaseEntity **)vptr = NULL;
|
||||
vptr += sizeof(CBaseEntity *);
|
||||
*(float *)vptr = -1.0f;
|
||||
|
||||
pWrapper->Execute(vstk, NULL);
|
||||
|
||||
|
||||
@@ -88,6 +88,38 @@ bool UTIL_FindDataTable(SendTable *pTable,
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UTIL_ContainsDataTable(SendTable *pTable, const char *name)
|
||||
{
|
||||
const char *pname = pTable->GetName();
|
||||
int props = pTable->GetNumProps();
|
||||
SendProp *prop;
|
||||
SendTable *table;
|
||||
|
||||
if (pname && strcmp(name, pname) == 0)
|
||||
return true;
|
||||
|
||||
for (int i = 0; i < props; i++)
|
||||
{
|
||||
prop = pTable->GetProp(i);
|
||||
|
||||
if ((table = prop->GetDataTable()) != NULL)
|
||||
{
|
||||
pname = table->GetName();
|
||||
if (pname && strcmp(name, pname) == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (UTIL_ContainsDataTable(table, name))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
ServerClass *UTIL_FindServerClass(const char *classname)
|
||||
{
|
||||
ServerClass *sc = gamedll->GetAllServerClasses();
|
||||
|
||||
@@ -49,6 +49,8 @@ bool UTIL_FindDataTable(SendTable *pTable,
|
||||
sm_sendprop_info_t *info,
|
||||
unsigned int offset);
|
||||
|
||||
bool UTIL_ContainsDataTable(SendTable *pTable, const char *name);
|
||||
|
||||
ServerClass *UTIL_FindServerClass(const char *classname);
|
||||
|
||||
CBaseEntity *UTIL_GetCBaseEntity(int num, bool onlyPlayers);
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
"plugin_e10aab3464312dc0e484bda26b490b3f" "http://forums.alliedmods.net/showpost.php?p=1767388&postcount=7" /* LightRP (Sphex) - Version 1.2.7 */
|
||||
"plugin_a7973ddc4e72aafd0312432568a1806b" "http://forums.alliedmods.net/showpost.php?p=1767388&postcount=7" /* LightRP (Sphex) - Version 1.2.8 */
|
||||
"plugin_39ddd719f74b62e27e8e480871b9d3b6" "http://forums.alliedmods.net/showpost.php?p=1803875&postcount=1" /* Malicious plugin being uploaded to CS:GO servers */
|
||||
"plugin_da397f32bf24c7ef954bd121441a3b0e" "http://forums.alliedmods.net/showpost.php?p=2032419&postcount=1" /* Advertising plugin being uploaded to CS:GO servers */
|
||||
"plugin_ee0bb0aa0d24491feda4235a92779f71" "http://forums.alliedmods.net/showpost.php?p=2032419&postcount=1" /* Advertising plugin being uploaded to CS:GO servers */
|
||||
"plugin_f405db5491a465b1a30859ee7f7c5080" "" /* UCP Server (Endi) - Version 6.9 */
|
||||
"plugin_6fcb6721fb740b854b0a05bfc9a7984a" "" /* UCP Server (Endi) - Version 7.1 */
|
||||
"plugin_4d320d6c5aba5d31c644fe2847c0662f" "" /* UCP Server (Endi) - Version 7.2 */
|
||||
@@ -24,6 +26,7 @@
|
||||
"plugin_24602c74f183cfcd157b3d50dee96c52" "" /* UCP Server (Endi) - Version 7.8.3 */
|
||||
"plugin_78140f1a0f26cd3297767d0598eac4b1" "" /* [Any] PReplay (DarthNinja) - Version 1.0.0 */
|
||||
"plugin_55923ba6bfe41569a3e4fbd7ca4606e5" "" /* VIP Plugin (World-Source.Ru) - Version 2.0 */
|
||||
"plugin_4bf983e1d5b61ba0b1ab9a7e53bfda27" "" /* WarMod CS:GO (Twelve-60) */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,181 +1,8 @@
|
||||
"Games"
|
||||
{
|
||||
// Now this is getting ridiculous
|
||||
"#default"
|
||||
// tf, hl2mp, and dods are in the same file for legacy reasons
|
||||
"tf"
|
||||
{
|
||||
"#supported"
|
||||
{
|
||||
"game" "hl2mp"
|
||||
}
|
||||
|
||||
"Offsets"
|
||||
{
|
||||
"EndTouch"
|
||||
{
|
||||
"windows" "99"
|
||||
"linux" "100"
|
||||
"mac" "100"
|
||||
}
|
||||
"FireBullets"
|
||||
{
|
||||
"windows" "111"
|
||||
"linux" "112"
|
||||
"mac" "112"
|
||||
}
|
||||
"GetMaxHealth"
|
||||
{
|
||||
"windows" "116"
|
||||
"linux" "117"
|
||||
"mac" "117"
|
||||
}
|
||||
"GroundEntChanged"
|
||||
{
|
||||
"windows" "176"
|
||||
"linux" "177"
|
||||
"mac" "177"
|
||||
}
|
||||
"OnTakeDamage"
|
||||
{
|
||||
"windows" "62"
|
||||
"linux" "63"
|
||||
"mac" "63"
|
||||
}
|
||||
"PreThink"
|
||||
{
|
||||
"windows" "330"
|
||||
"linux" "331"
|
||||
"mac" "331"
|
||||
}
|
||||
"PostThink"
|
||||
{
|
||||
"windows" "331"
|
||||
"linux" "332"
|
||||
"mac" "332"
|
||||
}
|
||||
"Reload"
|
||||
{
|
||||
"windows" "274"
|
||||
"linux" "275"
|
||||
"mac" "275"
|
||||
}
|
||||
"SetTransmit"
|
||||
{
|
||||
"windows" "20"
|
||||
"linux" "21"
|
||||
"mac" "21"
|
||||
}
|
||||
"ShouldCollide"
|
||||
{
|
||||
"windows" "16"
|
||||
"linux" "17"
|
||||
"mac" "17"
|
||||
}
|
||||
"Spawn"
|
||||
{
|
||||
"windows" "22"
|
||||
"linux" "23"
|
||||
"mac" "23"
|
||||
}
|
||||
"StartTouch"
|
||||
{
|
||||
"windows" "97"
|
||||
"linux" "98"
|
||||
"mac" "98"
|
||||
}
|
||||
"Think"
|
||||
{
|
||||
"windows" "47"
|
||||
"linux" "48"
|
||||
"mac" "48"
|
||||
}
|
||||
"Touch"
|
||||
{
|
||||
"windows" "98"
|
||||
"linux" "99"
|
||||
"mac" "99"
|
||||
}
|
||||
"TraceAttack"
|
||||
{
|
||||
"windows" "60"
|
||||
"linux" "61"
|
||||
"mac" "61"
|
||||
}
|
||||
"Use"
|
||||
{
|
||||
"windows" "96"
|
||||
"linux" "97"
|
||||
"mac" "97"
|
||||
}
|
||||
"VPhysicsUpdate"
|
||||
{
|
||||
"windows" "156"
|
||||
"linux" "157"
|
||||
"mac" "157"
|
||||
}
|
||||
"Weapon_CanSwitchTo"
|
||||
{
|
||||
"windows" "264"
|
||||
"linux" "265"
|
||||
"mac" "265"
|
||||
}
|
||||
"Weapon_CanUse"
|
||||
{
|
||||
"windows" "258"
|
||||
"linux" "259"
|
||||
"mac" "259"
|
||||
}
|
||||
"Weapon_Drop"
|
||||
{
|
||||
"windows" "261"
|
||||
"linux" "262"
|
||||
"mac" "262"
|
||||
}
|
||||
"Weapon_Equip"
|
||||
{
|
||||
"windows" "259"
|
||||
"linux" "260"
|
||||
"mac" "260"
|
||||
}
|
||||
"Weapon_Switch"
|
||||
{
|
||||
"windows" "262"
|
||||
"linux" "263"
|
||||
"mac" "263"
|
||||
}
|
||||
|
||||
|
||||
// no longer used
|
||||
"UpdateOnRemove"
|
||||
{
|
||||
"windows" "104"
|
||||
"linux" "105"
|
||||
"mac" "105"
|
||||
}
|
||||
//
|
||||
}
|
||||
|
||||
"Signatures"
|
||||
{
|
||||
// no longer used
|
||||
"IEntityFactoryDictionary"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\xB8\x01\x00\x00\x00\x84\x2A\x2A\x2A\x2A\x2A\x75\x1D\x09\x2A\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x04\xB8\x2A\x2A\x2A\x2A\xC3"
|
||||
"linux" "@_Z23EntityFactoryDictionaryv"
|
||||
"mac" "@_Z23EntityFactoryDictionaryv"
|
||||
}
|
||||
//
|
||||
}
|
||||
}
|
||||
// Now this is getting ridiculous
|
||||
"#default"
|
||||
{
|
||||
"#supported"
|
||||
{
|
||||
"game" "tf"
|
||||
"game" "dod"
|
||||
}
|
||||
|
||||
"Offsets"
|
||||
{
|
||||
"EndTouch"
|
||||
@@ -310,46 +137,283 @@
|
||||
"linux" "264"
|
||||
"mac" "264"
|
||||
}
|
||||
|
||||
|
||||
// no longer used
|
||||
"UpdateOnRemove"
|
||||
{
|
||||
"windows" "105"
|
||||
"linux" "106"
|
||||
"mac" "106"
|
||||
}
|
||||
//
|
||||
}
|
||||
|
||||
"Signatures"
|
||||
{
|
||||
// no longer used
|
||||
"IEntityFactoryDictionary"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\xB8\x01\x00\x00\x00\x84\x2A\x2A\x2A\x2A\x2A\x75\x1D\x09\x2A\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x04\xB8\x2A\x2A\x2A\x2A\xC3"
|
||||
"linux" "@_Z23EntityFactoryDictionaryv"
|
||||
"mac" "@_Z23EntityFactoryDictionaryv"
|
||||
}
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
"#default"
|
||||
"hl2mp"
|
||||
{
|
||||
"#supported"
|
||||
{
|
||||
"game" "cstrike"
|
||||
}
|
||||
|
||||
"Offsets"
|
||||
{
|
||||
"EndTouch"
|
||||
{
|
||||
"windows" "100"
|
||||
"linux" "101"
|
||||
"mac" "101"
|
||||
}
|
||||
"FireBullets"
|
||||
{
|
||||
"windows" "112"
|
||||
"linux" "113"
|
||||
"mac" "113"
|
||||
}
|
||||
"GetMaxHealth"
|
||||
{
|
||||
"windows" "117"
|
||||
"linux" "118"
|
||||
"mac" "118"
|
||||
}
|
||||
"GroundEntChanged"
|
||||
{
|
||||
"windows" "178"
|
||||
"linux" "179"
|
||||
"mac" "179"
|
||||
}
|
||||
"OnTakeDamage"
|
||||
{
|
||||
"windows" "62"
|
||||
"linux" "63"
|
||||
"mac" "63"
|
||||
}
|
||||
"PreThink"
|
||||
{
|
||||
"windows" "331"
|
||||
"linux" "332"
|
||||
"mac" "332"
|
||||
}
|
||||
"PostThink"
|
||||
{
|
||||
"windows" "332"
|
||||
"linux" "333"
|
||||
"mac" "333"
|
||||
}
|
||||
"Reload"
|
||||
{
|
||||
"windows" "272"
|
||||
"linux" "273"
|
||||
"mac" "273"
|
||||
"windows" "268"
|
||||
"linux" "269"
|
||||
"mac" "269"
|
||||
}
|
||||
"SetTransmit"
|
||||
{
|
||||
"windows" "20"
|
||||
"linux" "21"
|
||||
"mac" "21"
|
||||
}
|
||||
"ShouldCollide"
|
||||
{
|
||||
"windows" "16"
|
||||
"linux" "17"
|
||||
"mac" "17"
|
||||
}
|
||||
"Spawn"
|
||||
{
|
||||
"windows" "22"
|
||||
"linux" "23"
|
||||
"mac" "23"
|
||||
}
|
||||
"StartTouch"
|
||||
{
|
||||
"windows" "98"
|
||||
"linux" "99"
|
||||
"mac" "99"
|
||||
}
|
||||
"Think"
|
||||
{
|
||||
"windows" "47"
|
||||
"linux" "48"
|
||||
"mac" "48"
|
||||
}
|
||||
"Touch"
|
||||
{
|
||||
"windows" "99"
|
||||
"linux" "100"
|
||||
"mac" "100"
|
||||
}
|
||||
"TraceAttack"
|
||||
{
|
||||
"windows" "60"
|
||||
"linux" "61"
|
||||
"mac" "61"
|
||||
}
|
||||
"Use"
|
||||
{
|
||||
"windows" "97"
|
||||
"linux" "98"
|
||||
"mac" "98"
|
||||
}
|
||||
"VPhysicsUpdate"
|
||||
{
|
||||
"windows" "157"
|
||||
"linux" "158"
|
||||
"mac" "158"
|
||||
}
|
||||
"Weapon_CanSwitchTo"
|
||||
{
|
||||
"windows" "265"
|
||||
"linux" "266"
|
||||
"mac" "266"
|
||||
}
|
||||
"Weapon_CanUse"
|
||||
{
|
||||
"windows" "259"
|
||||
"linux" "260"
|
||||
"mac" "260"
|
||||
}
|
||||
"Weapon_Drop"
|
||||
{
|
||||
"windows" "262"
|
||||
"linux" "263"
|
||||
"mac" "263"
|
||||
}
|
||||
"Weapon_Equip"
|
||||
{
|
||||
"windows" "260"
|
||||
"linux" "261"
|
||||
"mac" "261"
|
||||
}
|
||||
"Weapon_Switch"
|
||||
{
|
||||
"windows" "263"
|
||||
"linux" "264"
|
||||
"mac" "264"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"dod"
|
||||
{
|
||||
"Offsets"
|
||||
{
|
||||
"EndTouch"
|
||||
{
|
||||
"windows" "100"
|
||||
"linux" "101"
|
||||
"mac" "101"
|
||||
}
|
||||
"FireBullets"
|
||||
{
|
||||
"windows" "112"
|
||||
"linux" "113"
|
||||
"mac" "113"
|
||||
}
|
||||
"GetMaxHealth"
|
||||
{
|
||||
"windows" "117"
|
||||
"linux" "118"
|
||||
"mac" "118"
|
||||
}
|
||||
"GroundEntChanged"
|
||||
{
|
||||
"windows" "178"
|
||||
"linux" "179"
|
||||
"mac" "179"
|
||||
}
|
||||
"OnTakeDamage"
|
||||
{
|
||||
"windows" "62"
|
||||
"linux" "63"
|
||||
"mac" "63"
|
||||
}
|
||||
"PreThink"
|
||||
{
|
||||
"windows" "331"
|
||||
"linux" "332"
|
||||
"mac" "332"
|
||||
}
|
||||
"PostThink"
|
||||
{
|
||||
"windows" "332"
|
||||
"linux" "333"
|
||||
"mac" "333"
|
||||
}
|
||||
"Reload"
|
||||
{
|
||||
"windows" "268"
|
||||
"linux" "269"
|
||||
"mac" "269"
|
||||
}
|
||||
"SetTransmit"
|
||||
{
|
||||
"windows" "20"
|
||||
"linux" "21"
|
||||
"mac" "21"
|
||||
}
|
||||
"ShouldCollide"
|
||||
{
|
||||
"windows" "16"
|
||||
"linux" "17"
|
||||
"mac" "17"
|
||||
}
|
||||
"Spawn"
|
||||
{
|
||||
"windows" "22"
|
||||
"linux" "23"
|
||||
"mac" "23"
|
||||
}
|
||||
"StartTouch"
|
||||
{
|
||||
"windows" "98"
|
||||
"linux" "99"
|
||||
"mac" "99"
|
||||
}
|
||||
"Think"
|
||||
{
|
||||
"windows" "47"
|
||||
"linux" "48"
|
||||
"mac" "48"
|
||||
}
|
||||
"Touch"
|
||||
{
|
||||
"windows" "99"
|
||||
"linux" "100"
|
||||
"mac" "100"
|
||||
}
|
||||
"TraceAttack"
|
||||
{
|
||||
"windows" "60"
|
||||
"linux" "61"
|
||||
"mac" "61"
|
||||
}
|
||||
"Use"
|
||||
{
|
||||
"windows" "97"
|
||||
"linux" "98"
|
||||
"mac" "98"
|
||||
}
|
||||
"VPhysicsUpdate"
|
||||
{
|
||||
"windows" "157"
|
||||
"linux" "158"
|
||||
"mac" "158"
|
||||
}
|
||||
"Weapon_CanSwitchTo"
|
||||
{
|
||||
"windows" "265"
|
||||
"linux" "266"
|
||||
"mac" "266"
|
||||
}
|
||||
"Weapon_CanUse"
|
||||
{
|
||||
"windows" "259"
|
||||
"linux" "260"
|
||||
"mac" "260"
|
||||
}
|
||||
"Weapon_Drop"
|
||||
{
|
||||
"windows" "262"
|
||||
"linux" "263"
|
||||
"mac" "263"
|
||||
}
|
||||
"Weapon_Equip"
|
||||
{
|
||||
"windows" "260"
|
||||
"linux" "261"
|
||||
"mac" "261"
|
||||
}
|
||||
"Weapon_Switch"
|
||||
{
|
||||
"windows" "263"
|
||||
"linux" "264"
|
||||
"mac" "264"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,27 +6,27 @@
|
||||
{
|
||||
"EndTouch"
|
||||
{
|
||||
"windows" "99"
|
||||
"linux" "100"
|
||||
"mac" "100"
|
||||
"windows" "100"
|
||||
"linux" "101"
|
||||
"mac" "101"
|
||||
}
|
||||
"FireBullets"
|
||||
{
|
||||
"windows" "111"
|
||||
"linux" "112"
|
||||
"mac" "112"
|
||||
"windows" "112"
|
||||
"linux" "113"
|
||||
"mac" "113"
|
||||
}
|
||||
"GetMaxHealth"
|
||||
{
|
||||
"windows" "116"
|
||||
"linux" "117"
|
||||
"mac" "117"
|
||||
"windows" "117"
|
||||
"linux" "118"
|
||||
"mac" "118"
|
||||
}
|
||||
"GroundEntChanged"
|
||||
{
|
||||
"windows" "177"
|
||||
"linux" "178"
|
||||
"mac" "178"
|
||||
"windows" "178"
|
||||
"linux" "179"
|
||||
"mac" "179"
|
||||
}
|
||||
"OnTakeDamage"
|
||||
{
|
||||
@@ -35,22 +35,22 @@
|
||||
"mac" "63"
|
||||
}
|
||||
"PreThink"
|
||||
{
|
||||
"windows" "330"
|
||||
"linux" "331"
|
||||
"mac" "331"
|
||||
}
|
||||
"PostThink"
|
||||
{
|
||||
"windows" "331"
|
||||
"linux" "332"
|
||||
"mac" "332"
|
||||
}
|
||||
"PostThink"
|
||||
{
|
||||
"windows" "332"
|
||||
"linux" "333"
|
||||
"mac" "333"
|
||||
}
|
||||
"Reload"
|
||||
{
|
||||
"windows" "270"
|
||||
"linux" "276"
|
||||
"mac" "276"
|
||||
"windows" "268"
|
||||
"linux" "269"
|
||||
"mac" "269"
|
||||
}
|
||||
"SetTransmit"
|
||||
{
|
||||
@@ -72,9 +72,9 @@
|
||||
}
|
||||
"StartTouch"
|
||||
{
|
||||
"windows" "97"
|
||||
"linux" "98"
|
||||
"mac" "98"
|
||||
"windows" "98"
|
||||
"linux" "99"
|
||||
"mac" "99"
|
||||
}
|
||||
"Think"
|
||||
{
|
||||
@@ -84,9 +84,9 @@
|
||||
}
|
||||
"Touch"
|
||||
{
|
||||
"windows" "98"
|
||||
"linux" "99"
|
||||
"mac" "99"
|
||||
"windows" "99"
|
||||
"linux" "100"
|
||||
"mac" "100"
|
||||
}
|
||||
"TraceAttack"
|
||||
{
|
||||
@@ -96,54 +96,54 @@
|
||||
}
|
||||
"Use"
|
||||
{
|
||||
"windows" "96"
|
||||
"linux" "97"
|
||||
"mac" "97"
|
||||
"windows" "97"
|
||||
"linux" "98"
|
||||
"mac" "98"
|
||||
}
|
||||
"VPhysicsUpdate"
|
||||
{
|
||||
"windows" "156"
|
||||
"linux" "157"
|
||||
"mac" "157"
|
||||
"windows" "157"
|
||||
"linux" "158"
|
||||
"mac" "158"
|
||||
}
|
||||
"Weapon_CanSwitchTo"
|
||||
{
|
||||
"windows" "264"
|
||||
"linux" "265"
|
||||
"mac" "265"
|
||||
"windows" "265"
|
||||
"linux" "266"
|
||||
"mac" "266"
|
||||
}
|
||||
"Weapon_CanUse"
|
||||
{
|
||||
"windows" "258"
|
||||
"linux" "259"
|
||||
"mac" "259"
|
||||
}
|
||||
"Weapon_Drop"
|
||||
{
|
||||
"windows" "261"
|
||||
"linux" "262"
|
||||
"mac" "262"
|
||||
}
|
||||
"Weapon_Equip"
|
||||
{
|
||||
"windows" "259"
|
||||
"linux" "260"
|
||||
"mac" "260"
|
||||
}
|
||||
"Weapon_Switch"
|
||||
"Weapon_Drop"
|
||||
{
|
||||
"windows" "262"
|
||||
"linux" "263"
|
||||
"mac" "263"
|
||||
}
|
||||
"Weapon_Equip"
|
||||
{
|
||||
"windows" "260"
|
||||
"linux" "261"
|
||||
"mac" "261"
|
||||
}
|
||||
"Weapon_Switch"
|
||||
{
|
||||
"windows" "263"
|
||||
"linux" "264"
|
||||
"mac" "264"
|
||||
}
|
||||
|
||||
|
||||
// no longer used
|
||||
"UpdateOnRemove"
|
||||
{
|
||||
"windows" "104"
|
||||
"linux" "105"
|
||||
"mac" "105"
|
||||
"windows" "105"
|
||||
"linux" "106"
|
||||
"mac" "106"
|
||||
}
|
||||
//
|
||||
}
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
"Games"
|
||||
{
|
||||
/* HL2:CTF 2.1 */
|
||||
"hl2ctf"
|
||||
{
|
||||
"Offsets"
|
||||
{
|
||||
"EndTouch"
|
||||
{
|
||||
"windows" "83"
|
||||
"linux" "84"
|
||||
}
|
||||
"FireBullets"
|
||||
{
|
||||
"windows" "93"
|
||||
"Linux" "94"
|
||||
}
|
||||
"GroundEntChanged"
|
||||
{
|
||||
"windows" "146"
|
||||
"linux" "147"
|
||||
}
|
||||
"OnTakeDamage"
|
||||
{
|
||||
"windows" "54"
|
||||
"linux" "55"
|
||||
}
|
||||
"PreThink"
|
||||
{
|
||||
"windows" "247"
|
||||
"linux" "248"
|
||||
}
|
||||
"PostThink"
|
||||
{
|
||||
"windows" "248"
|
||||
"linux" "249"
|
||||
}
|
||||
"SetTransmit"
|
||||
{
|
||||
"windows" "21"
|
||||
"linux" "22"
|
||||
}
|
||||
"ShouldCollide"
|
||||
{
|
||||
"windows" "17"
|
||||
"linux" "18"
|
||||
}
|
||||
"Spawn"
|
||||
{
|
||||
"windows" "23"
|
||||
"linux" "24"
|
||||
}
|
||||
"StartTouch"
|
||||
{
|
||||
"windows" "81"
|
||||
"linux" "82"
|
||||
}
|
||||
"Think"
|
||||
{
|
||||
"windows" "45"
|
||||
"linux" "46"
|
||||
}
|
||||
"Touch"
|
||||
{
|
||||
"windows" "82"
|
||||
"linux" "83"
|
||||
}
|
||||
"TraceAttack"
|
||||
{
|
||||
"windows" "53"
|
||||
"linux" "54"
|
||||
}
|
||||
"VPhysicsUpdate"
|
||||
{
|
||||
"windows" "130"
|
||||
"linux" "131"
|
||||
}
|
||||
"Weapon_CanSwitchTo"
|
||||
{
|
||||
"windows" "205"
|
||||
"linux" "206"
|
||||
}
|
||||
"Weapon_CanUse"
|
||||
{
|
||||
"windows" "199"
|
||||
"linux" "200"
|
||||
}
|
||||
"Weapon_Drop"
|
||||
{
|
||||
"windows" "202"
|
||||
"linux" "203"
|
||||
}
|
||||
"Weapon_Equip"
|
||||
{
|
||||
"windows" "200"
|
||||
"linux" "201"
|
||||
}
|
||||
"Weapon_Switch"
|
||||
{
|
||||
"windows" "203"
|
||||
"linux" "204"
|
||||
}
|
||||
"Reload"
|
||||
{
|
||||
"windows" "213"
|
||||
"linux" "214"
|
||||
}
|
||||
"Use"
|
||||
{
|
||||
"windows" "80"
|
||||
"linux" "81"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -159,4 +159,9 @@
|
||||
{
|
||||
"game" "synergy"
|
||||
}
|
||||
|
||||
"game.hl2ctf.txt"
|
||||
{
|
||||
"game" "hl2ctf"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -239,9 +239,9 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "441"
|
||||
"linux" "442"
|
||||
"mac" "442"
|
||||
"windows" "442"
|
||||
"linux" "443"
|
||||
"mac" "443"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
@@ -275,9 +275,9 @@
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "491"
|
||||
"linux" "491"
|
||||
"mac" "491"
|
||||
"windows" "492"
|
||||
"linux" "492"
|
||||
"mac" "492"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
@@ -317,9 +317,9 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "461"
|
||||
"linux" "462"
|
||||
"mac" "462"
|
||||
"windows" "462"
|
||||
"linux" "463"
|
||||
"mac" "463"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,57 +28,57 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "399"
|
||||
"linux" "400"
|
||||
"mac" "400"
|
||||
"windows" "400"
|
||||
"linux" "401"
|
||||
"mac" "401"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "268"
|
||||
"linux" "269"
|
||||
"mac" "269"
|
||||
"windows" "269"
|
||||
"linux" "270"
|
||||
"mac" "270"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "266"
|
||||
"linux" "267"
|
||||
"mac" "267"
|
||||
"windows" "267"
|
||||
"linux" "268"
|
||||
"mac" "268"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "207"
|
||||
"linux" "208"
|
||||
"mac" "208"
|
||||
"windows" "208"
|
||||
"linux" "209"
|
||||
"mac" "209"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "211"
|
||||
"linux" "212"
|
||||
"mac" "212"
|
||||
"windows" "212"
|
||||
"linux" "213"
|
||||
"mac" "213"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
"windows" "107"
|
||||
"linux" "108"
|
||||
"mac" "108"
|
||||
"windows" "108"
|
||||
"linux" "109"
|
||||
"mac" "109"
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "438"
|
||||
"linux" "438"
|
||||
"mac" "438"
|
||||
"windows" "439"
|
||||
"linux" "439"
|
||||
"mac" "439"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
"windows" "139"
|
||||
"linux" "140"
|
||||
"mac" "140"
|
||||
"windows" "140"
|
||||
"linux" "141"
|
||||
"mac" "141"
|
||||
}
|
||||
"EyeAngles"
|
||||
{
|
||||
"windows" "130"
|
||||
"linux" "131"
|
||||
"mac" "131"
|
||||
"windows" "131"
|
||||
"linux" "132"
|
||||
"mac" "132"
|
||||
}
|
||||
"AcceptInput"
|
||||
{
|
||||
@@ -94,9 +94,9 @@
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "259"
|
||||
"linux" "260"
|
||||
"mac" "260"
|
||||
"windows" "260"
|
||||
"linux" "261"
|
||||
"mac" "261"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
@@ -106,9 +106,9 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "417"
|
||||
"linux" "418"
|
||||
"mac" "418"
|
||||
"windows" "418"
|
||||
"linux" "419"
|
||||
"mac" "419"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
"Games"
|
||||
{
|
||||
/* HL2:CTF 2.0 RC1 */
|
||||
/* HL2:CTF 2.1 */
|
||||
"hl2ctf"
|
||||
{
|
||||
|
||||
@@ -87,6 +87,21 @@
|
||||
"windows" "0"
|
||||
"linux" "0"
|
||||
}
|
||||
"DispatchKeyValue"
|
||||
{
|
||||
"windows" "30"
|
||||
"linux" "29"
|
||||
}
|
||||
"DispatchKeyValueFloat"
|
||||
{
|
||||
"windows" "29"
|
||||
"linux" "30"
|
||||
}
|
||||
"DispatchKeyValueVector"
|
||||
{
|
||||
"windows" "28"
|
||||
"linux" "31"
|
||||
}
|
||||
}
|
||||
"Signatures"
|
||||
{
|
||||
|
||||
@@ -18,57 +18,57 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "398"
|
||||
"linux" "399"
|
||||
"mac" "399"
|
||||
"windows" "399"
|
||||
"linux" "400"
|
||||
"mac" "400"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "268"
|
||||
"linux" "269"
|
||||
"mac" "269"
|
||||
"windows" "269"
|
||||
"linux" "270"
|
||||
"mac" "270"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "266"
|
||||
"linux" "267"
|
||||
"mac" "267"
|
||||
"windows" "267"
|
||||
"linux" "268"
|
||||
"mac" "268"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "207"
|
||||
"linux" "208"
|
||||
"mac" "208"
|
||||
"windows" "208"
|
||||
"linux" "209"
|
||||
"mac" "209"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "211"
|
||||
"linux" "212"
|
||||
"mac" "212"
|
||||
"windows" "212"
|
||||
"linux" "213"
|
||||
"mac" "213"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
"windows" "107"
|
||||
"linux" "108"
|
||||
"mac" "108"
|
||||
"windows" "108"
|
||||
"linux" "109"
|
||||
"mac" "109"
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "437"
|
||||
"linux" "437"
|
||||
"mac" "437"
|
||||
"windows" "438"
|
||||
"linux" "438"
|
||||
"mac" "438"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
"windows" "139"
|
||||
"linux" "140"
|
||||
"mac" "140"
|
||||
"windows" "140"
|
||||
"linux" "141"
|
||||
"mac" "141"
|
||||
}
|
||||
"EyeAngles"
|
||||
{
|
||||
"windows" "130"
|
||||
"linux" "131"
|
||||
"mac" "131"
|
||||
"windows" "131"
|
||||
"linux" "132"
|
||||
"mac" "132"
|
||||
}
|
||||
"AcceptInput"
|
||||
{
|
||||
@@ -84,9 +84,9 @@
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "259"
|
||||
"linux" "260"
|
||||
"mac" "260"
|
||||
"windows" "260"
|
||||
"linux" "261"
|
||||
"mac" "261"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
@@ -96,9 +96,9 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "416"
|
||||
"linux" "417"
|
||||
"mac" "417"
|
||||
"windows" "417"
|
||||
"linux" "418"
|
||||
"mac" "418"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,14 +33,14 @@
|
||||
"CTTeamScoreOffset"
|
||||
{
|
||||
"windows" "97"
|
||||
"linux" "125"
|
||||
"linux" "124"
|
||||
"mac" "150"
|
||||
}
|
||||
//Offset into CheckRestartRound
|
||||
"TTeamScoreOffset"
|
||||
{
|
||||
"windows" "122"
|
||||
"linux" "160"
|
||||
"linux" "159"
|
||||
"mac" "185"
|
||||
}
|
||||
"ClanTagOffset"
|
||||
@@ -76,7 +76,7 @@
|
||||
"CSWeaponDrop"//Wildcard first 6 bytes for CS:S DM
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x53\x56\x8B\x75\x08\x57\x6A\x00\x68"
|
||||
"windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x53\x56\x57\x8B\x7D\x2A\x6A\x00\x68"
|
||||
"linux" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb"
|
||||
"mac" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb"
|
||||
}
|
||||
@@ -138,6 +138,13 @@
|
||||
"linux" "@_ZNK16FileWeaponInfo_t15GetAttributeIntEPKcPK13CEconItemView"
|
||||
"mac" "@_ZNK16FileWeaponInfo_t15GetAttributeIntEPKcPK13CEconItemView"
|
||||
}
|
||||
"SetModelFromClass"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x51\x53\x56\x8B\xF1\x57\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x8B\xD8"
|
||||
"linux" "@_ZN9CCSPlayer17SetModelFromClassEv"
|
||||
"mac" "@_ZN9CCSPlayer17SetModelFromClassEv"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,16 +170,16 @@
|
||||
{
|
||||
"Keys"
|
||||
{
|
||||
"CScoreBase" "m_bIsLookingAtWeapon"
|
||||
"CScoreBase" "m_bIsHoldingLookAtWeapon"
|
||||
}
|
||||
|
||||
"Offsets"
|
||||
{
|
||||
"CScore"
|
||||
{
|
||||
"windows" "36"
|
||||
"linux" "36"
|
||||
"mac" "36"
|
||||
"windows" "55"
|
||||
"linux" "55"
|
||||
"mac" "55"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
"TerminateRound"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x24\x53\x8B\x5D\x0C\x56\x57\x33\xFF"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x8B\x45\x2A\x53\x56\x57\x33\xFF"
|
||||
"linux" "@_ZN12CCSGameRules14TerminateRoundEfi"
|
||||
"mac" "@_ZN12CCSGameRules14TerminateRoundEfi"
|
||||
}
|
||||
@@ -138,6 +138,13 @@
|
||||
"linux" "@_ZN12CCSGameRules13CheckWinLimitEv"
|
||||
"mac" "@_ZN12CCSGameRules5ThinkEv"
|
||||
}
|
||||
"SetModelFromClass"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2C\x89\x4D\xD4\x8B\x4D\xD4\xE8\x2A\x2A\x2A\x2A\x83\xF8\x02\x0F\x85\x2A\x2A\x2A\x2A\x8B"
|
||||
"linux" "@_ZN9CCSPlayer17SetModelFromClassEv"
|
||||
"mac" "@_ZN9CCSPlayer17SetModelFromClassEv"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+16
-25
@@ -19,8 +19,8 @@
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x51\x56\x8B\xF1\x8B\x2A\x2A\x2A\x2A\x2A\x8B\x01\x8B\x2A\x2A\x2A\x2A\x2A\xFF\xD2\x84\xC0\x0F\x2A\x2A\x2A\x2A\x2A\x57\x6A\x2A\x8D\x2A\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x84\xC0\x0F\x2A\x2A\x2A\x2A\x2A\x8B\x2A\x2A\x2A\x2A\x2A\xC1\x2A\x2A\x24\x01\x0F\x2A\x2A\x2A\x2A\x2A\x8B"
|
||||
"linux" "@_ZN15CTFPlayerShared4BurnEP9CTFPlayerP13CTFWeaponBase"
|
||||
"mac" "@_ZN15CTFPlayerShared4BurnEP9CTFPlayerP13CTFWeaponBase"
|
||||
"linux" "@_ZN15CTFPlayerShared4BurnEP9CTFPlayerP13CTFWeaponBasef"
|
||||
"mac" "@_ZN15CTFPlayerShared4BurnEP9CTFPlayerP13CTFWeaponBasef"
|
||||
}
|
||||
"RemoveDisguise"
|
||||
{
|
||||
@@ -36,38 +36,17 @@
|
||||
"linux" "@_ZN15CTFPlayerShared8DisguiseEiiP9CTFPlayerb"
|
||||
"mac" "@_ZN15CTFPlayerShared8DisguiseEiiP9CTFPlayerb"
|
||||
}
|
||||
"CalcCritical"
|
||||
{
|
||||
"library" "server"
|
||||
"linux" "@_ZN13CTFWeaponBase26CalcIsAttackCriticalHelperEv"
|
||||
"mac" "@_ZN13CTFWeaponBase26CalcIsAttackCriticalHelperEv"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x56\x57\x6A\x00\x68\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\x6A\x00\x8B\xF1\xE8\x2A\x2A\x2A\x2A\x50\xE8\x2A\x2A\x2A\x2A\x8B\xF8\x83\xC4\x2A\x85\xFF\x74\x2A\x8B"
|
||||
}
|
||||
"CalcCriticalMelee"
|
||||
{
|
||||
"library" "server"
|
||||
"linux" "@_ZN18CTFWeaponBaseMelee26CalcIsAttackCriticalHelperEv"
|
||||
"mac" "@_ZN18CTFWeaponBaseMelee26CalcIsAttackCriticalHelperEv"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x08\x53\x56\x8B\xF1\xE8\x2A\x2A\x2A\x2A\x8B\xD8\x85\xDB\x74\x10"
|
||||
}
|
||||
"CalcCriticalBow"
|
||||
{
|
||||
"library" "server"
|
||||
"linux" "@_ZN14CTFCompoundBow26CalcIsAttackCriticalHelperEv"
|
||||
"mac" "@_ZN14CTFCompoundBow26CalcIsAttackCriticalHelperEv"
|
||||
"windows" "\xE8\x2A\x2A\x2A\x2A\x85\xC0\x74\x2A\x8D\x88\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x84\xC0\x74\x2A\xB0"
|
||||
}
|
||||
"Regenerate"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\xF3\x0F\x2A\x2A\x2A\x2A\x2A\x2A\x53\x56\x8B\xF1\x8B"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x8B\xF1\x8B\x06\x8B\x2A\x2A\x2A\x2A\x2A\x57\xFF\xD2\x8B\x8E\x2A\x2A\x2A\x2A\x8D\x9E"
|
||||
"linux" "@_ZN9CTFPlayer10RegenerateEb"
|
||||
"mac" "@_ZN9CTFPlayer10RegenerateEb"
|
||||
}
|
||||
"AddCondition"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x08\x53\x56\x8B\x75\x08\x57\x8B\xD9"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x08\x53\x8B\xD9\x83\xBB\x2A\x2A\x2A\x2A\x00\x0F"
|
||||
"linux" "@_ZN15CTFPlayerShared7AddCondE7ETFCondfP11CBaseEntity"
|
||||
"mac" "@_ZN15CTFPlayerShared7AddCondE7ETFCondfP11CBaseEntity"
|
||||
}
|
||||
@@ -136,6 +115,18 @@
|
||||
"linux" "325"
|
||||
"mac" "325"
|
||||
}
|
||||
"CalcIsAttackCriticalHelper"
|
||||
{
|
||||
"windows" "381"
|
||||
"linux" "388"
|
||||
"mac" "388"
|
||||
}
|
||||
"CalcIsAttackCriticalHelperNoCrits"
|
||||
{
|
||||
"windows" "382"
|
||||
"linux" "389"
|
||||
"mac" "389"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+17
-1
@@ -98,6 +98,22 @@ public OnPluginStart()
|
||||
{
|
||||
OnAdminMenuReady(topmenu);
|
||||
}
|
||||
|
||||
// Normally, OnClientSayCommand would be aqequate and more appropirate here, but it does
|
||||
// not catch attempted chat triggers, which we also want to be blocked if a player is gagged.
|
||||
AddCommandListener(Command_Say, "say");
|
||||
AddCommandListener(Command_Say, "say_team");
|
||||
|
||||
new String:gameDir[64];
|
||||
GetGameFolderName(gameDir, sizeof(gameDir));
|
||||
if (StrEqual(gameDir, "insurgency", false))
|
||||
{
|
||||
AddCommandListener(Command_Say, "say2");
|
||||
}
|
||||
else if (StrEqual(gameDir, "nucleardawn", false))
|
||||
{
|
||||
AddCommandListener(Command_Say, "say_squad");
|
||||
}
|
||||
}
|
||||
|
||||
public OnAdminMenuReady(Handle:topmenu)
|
||||
@@ -151,7 +167,7 @@ public bool:OnClientConnect(client, String:rejectmsg[], maxlen)
|
||||
return true;
|
||||
}
|
||||
|
||||
public Action:OnClientSayCommand(client, const String:command[], const String:sArgs[])
|
||||
public Action:Command_Say(client, const String:command[], argc)
|
||||
{
|
||||
if (client)
|
||||
{
|
||||
|
||||
@@ -367,6 +367,15 @@ native CS_WeaponIDToAlias(CSWeaponID:weaponID, String:destination[], len);
|
||||
*/
|
||||
native bool:CS_IsValidWeaponID(CSWeaponID:id);
|
||||
|
||||
/**
|
||||
* Sets a player's model based on their current class
|
||||
*
|
||||
* @param client Player's index.
|
||||
* @noreturn
|
||||
* @error Invalid client index, client not in game.
|
||||
*/
|
||||
native CS_UpdateClientModel(client);
|
||||
|
||||
/**
|
||||
* Do not edit below this line!
|
||||
*/
|
||||
@@ -404,6 +413,7 @@ public __ext_cstrike_SetNTVOptional()
|
||||
MarkNativeAsOptional("CS_AliasToWeaponID");
|
||||
MarkNativeAsOptional("CS_WeaponIDToAlias");
|
||||
MarkNativeAsOptional("CS_IsValidWeaponID");
|
||||
MarkNativeAsOptional("CS_UpdateClientModel");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -139,6 +139,17 @@ enum TFCond
|
||||
TFCond_SmallBulletResist,
|
||||
TFCond_SmallBlastResist,
|
||||
TFCond_SmallFireResist,
|
||||
TFCond_Stealthed, // 64
|
||||
|
||||
TFCond_StealthedUserBuffFade = 66,
|
||||
|
||||
TFCond_MVMBotRadiowave = 71,
|
||||
TFCond_HalloweenSpeedBoost,
|
||||
TFCond_HalloweenQuickHeal,
|
||||
TFCond_HalloweenGiant,
|
||||
TFCond_HalloweenTiny, // 75
|
||||
|
||||
TFCond_HalloweenGhostMode = 77,
|
||||
};
|
||||
|
||||
enum TFHoliday
|
||||
|
||||
@@ -240,6 +240,13 @@ enum {
|
||||
TF_WEAPON_GRENADE_STICKY_BALL,
|
||||
TF_WEAPON_SHOTGUN_BUILDING_RESCUE,
|
||||
TF_WEAPON_CANNON,
|
||||
TF_WEAPON_THROWABLE,
|
||||
TF_WEAPON_GRENADE_THROWABLE,
|
||||
TF_WEAPON_PDA_SPY_BUILD,
|
||||
TF_WEAPON_GRENADE_WATERBALLOON,
|
||||
TF_WEAPON_HARVESTER_SAW,
|
||||
TF_WEAPON_SPELLBOOK,
|
||||
TF_WEAPON_SPELLBOOK_PROJECTILE,
|
||||
};
|
||||
|
||||
// TF2 Weapon Loadout Slots
|
||||
|
||||
@@ -790,7 +790,7 @@ public Handler_MapVoteFinished(Handle:menu,
|
||||
new Float:winningvotes = float(item_info[0][VOTEINFO_ITEM_VOTES]);
|
||||
new Float:required = num_votes * (GetConVarFloat(g_Cvar_RunOffPercent) / 100.0);
|
||||
|
||||
if (winningvotes <= required)
|
||||
if (winningvotes < required)
|
||||
{
|
||||
/* Insufficient Winning margin - Lets do a runoff */
|
||||
g_VoteMenu = CreateMenu(Handler_MapVoteMenu, MenuAction:MENU_ACTIONS_ALL);
|
||||
|
||||
@@ -55,10 +55,6 @@ new Handle:sm_reserve_type;
|
||||
new Handle:sm_reserve_maxadmins;
|
||||
new Handle:sm_reserve_kicktype;
|
||||
|
||||
new bool:g_BotsSubtractFromMax;
|
||||
new g_SourceTV = -1;
|
||||
new g_Replay = -1;
|
||||
|
||||
enum KickType
|
||||
{
|
||||
Kick_HighestPing,
|
||||
@@ -79,27 +75,6 @@ public OnPluginStart()
|
||||
|
||||
HookConVarChange(sm_reserved_slots, SlotCountChanged);
|
||||
HookConVarChange(sm_hide_slots, SlotHideChanged);
|
||||
|
||||
new EngineVersion:engineVersion = GetEngineVersion();
|
||||
g_BotsSubtractFromMax = engineVersion == Engine_TF2 || engineVersion == Engine_CSS || engineVersion == Engine_DODS || engineVersion == Engine_HL2DM;
|
||||
|
||||
if (g_BotsSubtractFromMax)
|
||||
{
|
||||
for (new i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
if (!IsClientConnected(i))
|
||||
continue;
|
||||
|
||||
if (IsClientSourceTV(i))
|
||||
{
|
||||
g_SourceTV = i;
|
||||
}
|
||||
else if (IsClientReplay(i))
|
||||
{
|
||||
g_Replay = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public OnPluginEnd()
|
||||
@@ -143,18 +118,6 @@ public Action:OnTimedKick(Handle:timer, any:client)
|
||||
|
||||
public OnClientPostAdminCheck(client)
|
||||
{
|
||||
if (g_BotsSubtractFromMax)
|
||||
{
|
||||
if (IsClientSourceTV(client))
|
||||
{
|
||||
g_SourceTV = client;
|
||||
}
|
||||
else if (IsClientReplay(client))
|
||||
{
|
||||
g_Replay = client;
|
||||
}
|
||||
}
|
||||
|
||||
new reserved = GetConVarInt(sm_reserved_slots);
|
||||
|
||||
if (reserved > 0)
|
||||
@@ -235,18 +198,6 @@ public OnClientPostAdminCheck(client)
|
||||
|
||||
public OnClientDisconnect_Post(client)
|
||||
{
|
||||
if (g_BotsSubtractFromMax)
|
||||
{
|
||||
if (client == g_SourceTV)
|
||||
{
|
||||
g_SourceTV = -1;
|
||||
}
|
||||
else if (client == g_Replay)
|
||||
{
|
||||
g_Replay = -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (GetConVarBool(sm_hide_slots))
|
||||
{
|
||||
SetVisibleMaxSlots(GetClientCount(false), GetMaxHumanPlayers() - GetConVarInt(sm_reserved_slots));
|
||||
@@ -297,19 +248,6 @@ SetVisibleMaxSlots(clients, limit)
|
||||
num = limit;
|
||||
}
|
||||
|
||||
if (g_BotsSubtractFromMax)
|
||||
{
|
||||
if (g_SourceTV > -1)
|
||||
{
|
||||
--num;
|
||||
}
|
||||
|
||||
if (g_Replay > -1)
|
||||
{
|
||||
--num;
|
||||
}
|
||||
}
|
||||
|
||||
SetConVarInt(sv_visiblemaxplayers, num);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
1.5.0
|
||||
1.5.2
|
||||
|
||||
@@ -66,3 +66,4 @@ NOT TODAY; MAYBE TOMORROW.
|
||||
s
|
||||
the eggs in spain stay mainly on the plain
|
||||
ur truly fixed
|
||||
im a gentleman honey farmer
|
||||
|
||||
Reference in New Issue
Block a user