Compare commits
92
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f008349cbc | ||
|
|
c978f8620e | ||
|
|
ec9a4ab9c5 | ||
|
|
de40e8990f | ||
|
|
ae07dc524d | ||
|
|
31426fb8d0 | ||
|
|
f538a51ef4 | ||
|
|
55ee8af1e6 | ||
|
|
85ed2e01a4 | ||
|
|
9eddf38b92 | ||
|
|
4ca976f883 | ||
|
|
ba9db46290 | ||
|
|
b58fe300ba | ||
|
|
4eb3754afc | ||
|
|
ae6ae0e3ea | ||
|
|
e903810d34 | ||
|
|
b73fd01490 | ||
|
|
af0d46fcc1 | ||
|
|
773216d517 | ||
|
|
ccfdcfb727 | ||
|
|
8bf7f1a00f | ||
|
|
5e99870df0 | ||
|
|
6f8d002404 | ||
|
|
3a94a3268a | ||
|
|
8355efaca4 | ||
|
|
2f388cfdb4 | ||
|
|
272473ed02 | ||
|
|
6e95680838 | ||
|
|
18e089e9d0 | ||
|
|
185e5fe6db | ||
|
|
2b84454e77 | ||
|
|
bb66d660b9 | ||
|
|
3867d70d53 | ||
|
|
144c1a3a13 | ||
|
|
c2197a4422 | ||
|
|
c3c51ff3a3 | ||
|
|
a2d3e1bee5 | ||
|
|
6fa750bffe | ||
|
|
83841cc218 | ||
|
|
5c7e6c79c8 | ||
|
|
b20ff4075a | ||
|
|
f860ef10e6 | ||
|
|
e357a5d650 | ||
|
|
c3bded70c5 | ||
|
|
c11f2569ce | ||
|
|
c56d550333 | ||
|
|
4e96ffb438 | ||
|
|
6b4b5eb0b1 | ||
|
|
74847c5b4f | ||
|
|
116fbe9a7a | ||
|
|
79f412c55c | ||
|
|
d839b83b6b | ||
|
|
9bcc3de922 | ||
|
|
30ebb670f4 | ||
|
|
b702099530 | ||
|
|
dd0339e05b | ||
|
|
88ee039ea6 | ||
|
|
9b965ddfe5 | ||
|
|
6e4dcc9041 | ||
|
|
71925cd3b2 | ||
|
|
82160205e5 | ||
|
|
8307f8fd9b | ||
|
|
a62b783c0e | ||
|
|
2f86fe58aa | ||
|
|
20d9b28df5 | ||
|
|
4c3fe1a1e7 | ||
|
|
e95f0f333e | ||
|
|
129395c896 | ||
|
|
f2eccadff3 | ||
|
|
4eafdc2a1e | ||
|
|
e4fd32609a | ||
|
|
3f43fca3a9 | ||
|
|
0d6b93c5a0 | ||
|
|
bf4bce8250 | ||
|
|
6942614ef9 | ||
|
|
f6c496717c | ||
|
|
9c69e9e66a | ||
|
|
b5b5d7e239 | ||
|
|
6acf264636 | ||
|
|
52ecfd8b0a | ||
|
|
5b6cb0707c | ||
|
|
a29027a4a3 | ||
|
|
94e471192d | ||
|
|
691b9d128e | ||
|
|
c9631c19ac | ||
|
|
893b52a1e9 | ||
|
|
527b98661a | ||
|
|
823b0f9702 | ||
|
|
bcdc2c3933 | ||
|
|
bf84e29c4d | ||
|
|
4b5c62bd2f | ||
|
|
1dd00127a5 |
@@ -7,3 +7,6 @@ ddd707c3454c382db5db9d28148cd19227f44759 sourcemod-1.4.0
|
||||
f74e1dea2ef2c5a12b5238badc0e877106804191 sourcemod-1.4.1
|
||||
0026e1394254c392244c7b140e3075974ab5a6db sourcemod-1.4.2
|
||||
608f4c94872e3624404a1d105284163bc57fadf7 sourcemod-1.4.3
|
||||
29186166cc99e73c61995a0bd0450fc6c36466bc sourcemod-1.4.4
|
||||
9560adae2a7263e6e076d5bc2e1c2838c27d686a sourcemod-1.4.5
|
||||
56a9ba4cd1e2ca8a583f7e150af058ce5d41ca33 sourcemod-1.4.6
|
||||
|
||||
+13
-2
@@ -268,7 +268,15 @@ class SM:
|
||||
else:
|
||||
staticLibs = os.path.join(sdkPath, 'lib', 'linux')
|
||||
workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
|
||||
if sdk in ['ep2v', 'l4d', 'l4d2']:
|
||||
if sdk == 'ep2v':
|
||||
for i in ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib_srv.so', 'libtier0_srv.so']:
|
||||
link = os.path.join(workFolder, i)
|
||||
target = os.path.join(staticLibs, i)
|
||||
try:
|
||||
os.lstat(link)
|
||||
except:
|
||||
job.AddCommand(SymlinkCommand(link, target))
|
||||
elif sdk in ['l4d', 'l4d2']:
|
||||
for i in ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so']:
|
||||
link = os.path.join(workFolder, i)
|
||||
target = os.path.join(staticLibs, i)
|
||||
@@ -354,7 +362,10 @@ class SM:
|
||||
if not noLink:
|
||||
if AMBuild.target['platform'] == 'linux':
|
||||
compiler['POSTLINKFLAGS'][0:0] = ['-lm']
|
||||
if sdk in ['ep2v', 'l4d', 'l4d2']:
|
||||
if sdk == 'ep2v':
|
||||
compiler['POSTLINKFLAGS'][0:0] = ['libtier0_srv.so']
|
||||
compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib_srv.so']
|
||||
elif sdk in ['l4d', 'l4d2']:
|
||||
compiler['POSTLINKFLAGS'][0:0] = ['libtier0.so']
|
||||
compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so']
|
||||
else:
|
||||
|
||||
@@ -1,5 +1,64 @@
|
||||
SourceMod Changelog
|
||||
|
||||
|
||||
|
||||
SourceMod 1.4.7 [2013-02-06]
|
||||
|
||||
URL: http://wiki.alliedmods.net/SourceMod_1.4.7_Release_Notes
|
||||
|
||||
User Changes:
|
||||
|
||||
- Updated support for latest Source 2009 engine changes (CS:S, DoD:S, TF2, HL2DM).
|
||||
- Updated gamedata for Left 4 Dead 2, Nuclear Dawn, No More Room in Hell, Zombie Panic Source, CSPromod, GoldenEye Source, Synergy, The Hidden, and PVKII.
|
||||
- Added system to block malware or illegal plugins (bug 5289).
|
||||
- Fixed a potential crash when a bad entity index is passed to certain functions (bug 5539) (KyleS).
|
||||
- Added an error message for when auto plugin configs fail to be created due to write error (bug 5465) (Drifter).
|
||||
- Fixed an issue where a malformed plugin could cause crashes (bug 5478).
|
||||
|
||||
Developer Changes:
|
||||
|
||||
- Added new values to the TFCond TF2 conditions enum (bug 5537) (FlaminSarge).
|
||||
- Updated TFHoliday TF2 holidays enum (bug 5526) (Powerlord).
|
||||
- Fixed regression in SourceMod 1.3.0 causing GetEntPropEnt, GetEntDataEnt2, and GameRules_GetPropEnt to possibly return stale (incorrect) entity indexes in place of -1.
|
||||
- Added support for < 32-bit unsigned sign extension to GameRules_GetProp lookup (already in GetEntProp since SM 1.4.0).
|
||||
- Fixed < 32-bit unsigned sign extension in GetEntProp not being applied for array prop elements (bug 5591).
|
||||
- Fixed value size auto-detection in GetEntProp and GameRules_GetProp for ep2v's new SPROP_VARINT sendprops.
|
||||
- Fixed Sort_Random sort type not including first value in array sorting functions (bug 4292) (Peace-Maker).
|
||||
- Fixed GameRules_SetPropVector writing data to unexpected addresses instead of to the gamerules proxy entity (bug 5592) (ProdigySim).
|
||||
- Fixed VoteMenuToAll stock adding bots to list (bug 5253 (VoiDeD).
|
||||
|
||||
----------------------------------------------------------
|
||||
SourceMod 1.4.6 [2012-09-04]
|
||||
|
||||
URL: http://wiki.alliedmods.net/SourceMod_1.4.6_Release_Notes
|
||||
|
||||
User Changes:
|
||||
|
||||
- Fixed extraneous errors resulting from a bug in 1.4.5.
|
||||
|
||||
----------------------------------------------------------
|
||||
|
||||
SourceMod 1.4.5 [2012-09-03]
|
||||
|
||||
URL: http://wiki.alliedmods.net/SourceMod_1.4.5_Release_Notes
|
||||
|
||||
User Changes:
|
||||
|
||||
- Updated support for latest Source 2009 engine changes (CS:S, DoD:S, TF2, HL2DM, GMod).
|
||||
- Updated Nuclear Dawn, Dino D-Day, and Zombie Panic gamedata.
|
||||
- Added compatibility for running on Metamod:Source 1.9.0.
|
||||
- Fixed very minor memory leaks in CStrike extension (bug 5456) (KyleS).
|
||||
- Fixed crash from plugins accessing netprops too early (bug 5297) (KyleS).
|
||||
- Fixed crash from plugins trying to access nested datadesc members (bug 5446).
|
||||
|
||||
Developer Changes:
|
||||
|
||||
- Added new TF2 weapon and custom dmg defines.
|
||||
- Added new TF2 TFHoliday value (bug 5436) (Powerlord).
|
||||
- Fixed IClientListener::InterceptClientConnect not being able to properly block connections (bug 5461) (PimpinJuice).
|
||||
- Fixed PrepSDKCall_SetSignature native not working with symbol names on L4D2 linux (bug 5440).
|
||||
- Fixed resolution of GetProfilerTime native on non-Windows platforms.
|
||||
|
||||
-----------------------------
|
||||
|
||||
SourceMod 1.4.4 [2012-07-03]
|
||||
|
||||
@@ -107,4 +107,14 @@
|
||||
* Currently this will log details about the gamedata updating process.
|
||||
*/
|
||||
"DebugSpew" "no"
|
||||
|
||||
/**
|
||||
* Enables or disables whether SourceMod blocks known or potentially malicious plugins from loading.
|
||||
* It is STRONGLY advised that this is left enabled, there have been cases in the past with plugins that
|
||||
* allow anyone to delete files on the server, gain full rcon control, etc.
|
||||
*
|
||||
* "yes" - Block malware or illegal plugins from loading (default)
|
||||
* "no" - Warn about malware or illegal plugins loading
|
||||
*/
|
||||
"BlockBadPlugins" "yes"
|
||||
}
|
||||
|
||||
@@ -452,6 +452,11 @@ bool SM_ExecuteConfig(CPlugin *pl, AutoConfig *cfg, bool can_create)
|
||||
can_create = false;
|
||||
fclose(fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Logger.LogError("Failed to auto generate config for %s, make sure the directory has write permission.", pl->GetFilename());
|
||||
return can_create;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+71
-6
@@ -40,6 +40,7 @@
|
||||
#include <Logger.h>
|
||||
#include "LibrarySys.h"
|
||||
#include "logic_bridge.h"
|
||||
#include <tier0/mem.h>
|
||||
|
||||
|
||||
typedef ICommandLine *(*FakeGetCommandLine)();
|
||||
@@ -51,7 +52,10 @@ typedef ICommandLine *(*FakeGetCommandLine)();
|
||||
#define TIER0_NAME "libtier0.dylib"
|
||||
#define VSTDLIB_NAME "libvstdlib.dylib"
|
||||
#elif defined __linux__
|
||||
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE || SOURCE_ENGINE == SE_LEFT4DEAD || SOURCE_ENGINE == SE_LEFT4DEAD2
|
||||
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
|
||||
#define TIER0_NAME "libtier0_srv.so"
|
||||
#define VSTDLIB_NAME "libvstdlib_srv.so"
|
||||
#elif SOURCE_ENGINE >= SE_LEFT4DEAD
|
||||
#define TIER0_NAME "libtier0.so"
|
||||
#define VSTDLIB_NAME "libvstdlib.so"
|
||||
#else
|
||||
@@ -329,8 +333,13 @@ bool UTIL_FindInSendTable(SendTable *pTable,
|
||||
return false;
|
||||
}
|
||||
|
||||
typedescription_t *UTIL_FindInDataMap(datamap_t *pMap, const char *name)
|
||||
typedescription_t *UTIL_FindInDataMap(datamap_t *pMap, const char *name, bool *isNested)
|
||||
{
|
||||
if (isNested)
|
||||
{
|
||||
*isNested = false;
|
||||
}
|
||||
|
||||
while (pMap)
|
||||
{
|
||||
for (int i=0; i<pMap->dataNumFields; i++)
|
||||
@@ -345,10 +354,21 @@ typedescription_t *UTIL_FindInDataMap(datamap_t *pMap, const char *name)
|
||||
}
|
||||
if (pMap->dataDesc[i].td)
|
||||
{
|
||||
typedescription_t *_td;
|
||||
if ((_td=UTIL_FindInDataMap(pMap->dataDesc[i].td, name)) != NULL)
|
||||
if (isNested)
|
||||
{
|
||||
return _td;
|
||||
*isNested = (UTIL_FindInDataMap(pMap->dataDesc[i].td, name, NULL) != NULL);
|
||||
if (*isNested)
|
||||
{
|
||||
return NULL;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
} else { // Use the old behaviour, we dont want to spring this on extensions - even if they're doing bad things.
|
||||
typedescription_t *_td;
|
||||
if ((_td=UTIL_FindInDataMap(pMap->dataDesc[i].td, name, NULL)) != NULL)
|
||||
{
|
||||
return _td;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -441,6 +461,11 @@ SendProp *CHalfLife2::FindInSendTable(const char *classname, const char *offset)
|
||||
}
|
||||
|
||||
typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset)
|
||||
{
|
||||
return this->FindInDataMap(pMap, offset, NULL);
|
||||
}
|
||||
|
||||
typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset, bool *isNested)
|
||||
{
|
||||
typedescription_t *td = NULL;
|
||||
DataMapTrie &val = m_Maps[pMap];
|
||||
@@ -451,7 +476,7 @@ typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset
|
||||
}
|
||||
if (!sm_trie_retrieve(val.trie, offset, (void **)&td))
|
||||
{
|
||||
if ((td = UTIL_FindInDataMap(pMap, offset)) != NULL)
|
||||
if ((td = UTIL_FindInDataMap(pMap, offset, isNested)) != NULL)
|
||||
{
|
||||
sm_trie_insert(val.trie, offset, td);
|
||||
}
|
||||
@@ -971,6 +996,11 @@ cell_t CHalfLife2::EntityToBCompatRef(CBaseEntity *pEntity)
|
||||
IServerUnknown *pUnknown = (IServerUnknown *)pEntity;
|
||||
CBaseHandle hndl = pUnknown->GetRefEHandle();
|
||||
|
||||
if (hndl == INVALID_EHANDLE_INDEX)
|
||||
{
|
||||
return INVALID_EHANDLE_INDEX;
|
||||
}
|
||||
|
||||
if (hndl.GetEntryIndex() >= MAX_EDICTS)
|
||||
{
|
||||
return (hndl.ToInt() | (1<<31));
|
||||
@@ -1009,3 +1039,38 @@ int CHalfLife2::GetSendPropOffset(SendProp *prop)
|
||||
return prop->GetOffset();
|
||||
}
|
||||
|
||||
const char *CHalfLife2::GetEntityClassname(edict_t * pEdict)
|
||||
{
|
||||
if (pEdict == NULL || pEdict->IsFree())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
IServerUnknown *pUnk = pEdict->GetUnknown();
|
||||
if (pUnk == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CBaseEntity * pEntity = pUnk->GetBaseEntity();
|
||||
|
||||
if (pEntity == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return GetEntityClassname(pEntity);
|
||||
}
|
||||
|
||||
const char *CHalfLife2::GetEntityClassname(CBaseEntity *pEntity)
|
||||
{
|
||||
static int offset = -1;
|
||||
if (offset == -1)
|
||||
{
|
||||
datamap_t *pMap = GetDataMap(pEntity);
|
||||
typedescription_t *pDesc = FindInDataMap(pMap, "m_iClassname");
|
||||
offset = GetTypeDescOffs(pDesc);
|
||||
}
|
||||
|
||||
return *(const char **)(((unsigned char *)pEntity) + offset);
|
||||
}
|
||||
|
||||
@@ -115,6 +115,7 @@ public: //IGameHelpers
|
||||
datamap_t *GetDataMap(CBaseEntity *pEntity);
|
||||
ServerClass *FindServerClass(const char *classname);
|
||||
typedescription_t *FindInDataMap(datamap_t *pMap, const char *offset);
|
||||
typedescription_t *FindInDataMap(datamap_t *pMap, const char *offset, bool *isNested);
|
||||
void SetEdictStateChanged(edict_t *pEdict, unsigned short offset);
|
||||
bool TextMsg(int client, int dest, const char *msg);
|
||||
bool HintTextMsg(int client, const char *msg);
|
||||
@@ -138,6 +139,8 @@ public: //IGameHelpers
|
||||
void *GetGlobalEntityList();
|
||||
int GetSendPropOffset(SendProp *prop);
|
||||
ICommandLine *GetValveCommandLine();
|
||||
const char *GetEntityClassname(edict_t *pEdict);
|
||||
const char *GetEntityClassname(CBaseEntity *pEntity);
|
||||
public:
|
||||
void AddToFakeCliCmdQueue(int client, int userid, const char *cmd);
|
||||
void ProcessFakeCliCmdQueue();
|
||||
|
||||
@@ -451,7 +451,7 @@ bool PlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const
|
||||
pListener = (*iter);
|
||||
if (!pListener->InterceptClientConnect(client, reject, maxrejectlen))
|
||||
{
|
||||
return false;
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+68
-1
@@ -789,6 +789,8 @@ CPluginManager::CPluginManager()
|
||||
m_AllPluginsLoaded = false;
|
||||
m_MyIdent = NULL;
|
||||
m_LoadingLocked = false;
|
||||
|
||||
m_bBlockBadPlugins = true;
|
||||
}
|
||||
|
||||
CPluginManager::~CPluginManager()
|
||||
@@ -1030,6 +1032,41 @@ LoadRes CPluginManager::_LoadPlugin(CPlugin **_plugin, const char *path, bool de
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pPlugin->GetStatus() == Plugin_Created)
|
||||
{
|
||||
unsigned char *pCodeHash = pPlugin->m_pRuntime->GetCodeHash();
|
||||
|
||||
char codeHashBuf[40];
|
||||
UTIL_Format(codeHashBuf, 40, "plugin_");
|
||||
for (int i = 0; i < 16; i++)
|
||||
UTIL_Format(codeHashBuf + 7 + (i * 2), 3, "%02x", pCodeHash[i]);
|
||||
|
||||
const char *bulletinUrl = g_pGameConf->GetKeyValue(codeHashBuf);
|
||||
if (bulletinUrl != NULL)
|
||||
{
|
||||
if (m_bBlockBadPlugins)
|
||||
{
|
||||
if (error)
|
||||
{
|
||||
if (bulletinUrl[0] != '\0')
|
||||
{
|
||||
UTIL_Format(error, maxlength, "Known malware detected and blocked. See %s for more info", bulletinUrl);
|
||||
} else {
|
||||
UTIL_Format(error, maxlength, "Possible malware or illegal plugin detected and blocked");
|
||||
}
|
||||
}
|
||||
pPlugin->m_status = Plugin_BadLoad;
|
||||
} else {
|
||||
if (bulletinUrl[0] != '\0')
|
||||
{
|
||||
g_Logger.LogMessage("%s: Known malware detected. See %s for more info, blocking disabled in core.cfg", pPlugin->GetFilename(), bulletinUrl);
|
||||
} else {
|
||||
g_Logger.LogMessage("%s: Possible malware or illegal plugin detected, blocking disabled in core.cfg", pPlugin->GetFilename());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LoadRes loadFailure = LoadRes_Failure;
|
||||
/* Get the status */
|
||||
@@ -1129,7 +1166,7 @@ void CPluginManager::LoadAutoPlugin(const char *plugin)
|
||||
|
||||
if ((res=_LoadPlugin(&pl, plugin, false, PluginType_MapUpdated, error, sizeof(error))) == LoadRes_Failure)
|
||||
{
|
||||
g_Logger.LogError("[SM] Failed to load plugin \"%s\": %s", plugin, error);
|
||||
g_Logger.LogError("[SM] Failed to load plugin \"%s\": %s.", plugin, error);
|
||||
pl->SetErrorState(
|
||||
pl->GetStatus() <= Plugin_Created ? Plugin_BadLoad : pl->GetStatus(),
|
||||
"%s",
|
||||
@@ -1889,6 +1926,27 @@ void CPluginManager::OnSourceModShutdown()
|
||||
g_ShareSys.DestroyIdentity(m_MyIdent);
|
||||
}
|
||||
|
||||
ConfigResult CPluginManager::OnSourceModConfigChanged(const char *key,
|
||||
const char *value,
|
||||
ConfigSource source,
|
||||
char *error,
|
||||
size_t maxlength)
|
||||
{
|
||||
if (strcmp(key, "BlockBadPlugins") == 0) {
|
||||
if (strcasecmp(value, "yes") == 0)
|
||||
{
|
||||
m_bBlockBadPlugins = true;
|
||||
} else if (strcasecmp(value, "no") == 0) {
|
||||
m_bBlockBadPlugins = false;
|
||||
} else {
|
||||
UTIL_Format(error, maxlength, "Invalid value: must be \"yes\" or \"no\"");
|
||||
return ConfigResult_Reject;
|
||||
}
|
||||
return ConfigResult_Accept;
|
||||
}
|
||||
return ConfigResult_Ignore;
|
||||
}
|
||||
|
||||
void CPluginManager::OnHandleDestroy(HandleType_t type, void *object)
|
||||
{
|
||||
/* We don't care about the internal object, actually */
|
||||
@@ -2269,6 +2327,15 @@ void CPluginManager::OnRootConsoleCommand(const char *cmdname, const CCommand &c
|
||||
{
|
||||
g_RootMenu.ConsolePrint(" Timestamp: %s", pl->m_DateTime);
|
||||
}
|
||||
|
||||
unsigned char *pCodeHash = pl->m_pRuntime->GetCodeHash();
|
||||
unsigned char *pDataHash = pl->m_pRuntime->GetDataHash();
|
||||
|
||||
char combinedHash[33];
|
||||
for (int i = 0; i < 16; i++)
|
||||
UTIL_Format(combinedHash + (i * 2), 3, "%02x", pCodeHash[i] ^ pDataHash[i]);
|
||||
|
||||
g_RootMenu.ConsolePrint(" Hash: %s", combinedHash);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#include "convar_sm.h"
|
||||
#endif
|
||||
#include "ITranslator.h"
|
||||
#include "IGameConfigs.h"
|
||||
#include "NativeOwner.h"
|
||||
#include "ShareSys.h"
|
||||
|
||||
@@ -326,6 +327,7 @@ public: //IPluginManager
|
||||
public: //SMGlobalClass
|
||||
void OnSourceModAllInitialized();
|
||||
void OnSourceModShutdown();
|
||||
ConfigResult OnSourceModConfigChanged(const char *key, const char *value, ConfigSource source, char *error, size_t maxlength);
|
||||
void OnSourceModMaxPlayersChanged(int newvalue);
|
||||
public: //IHandleTypeDispatch
|
||||
void OnHandleDestroy(HandleType_t type, void *object);
|
||||
@@ -470,6 +472,9 @@ private:
|
||||
List<FakeNative *> m_Natives;
|
||||
|
||||
bool m_LoadingLocked;
|
||||
|
||||
// Config
|
||||
bool m_bBlockBadPlugins;
|
||||
};
|
||||
|
||||
extern CPluginManager g_PluginSys;
|
||||
|
||||
@@ -179,7 +179,7 @@ static cell_t GetProfilerTime(IPluginContext *pContext, const cell_t *params)
|
||||
#else
|
||||
int64_t start_us = int64_t(prof->start.tv_sec) * 1000000 + prof->start.tv_usec;
|
||||
int64_t stop_us = int64_t(prof->end.tv_sec) * 1000000 + prof->end.tv_usec;
|
||||
fTime = double((stop_us - start_us) / 1000) / 1000.0;
|
||||
fTime = double(stop_us - start_us) / 1000000.0;
|
||||
#endif
|
||||
|
||||
return sp_ftoc(fTime);
|
||||
|
||||
@@ -94,7 +94,7 @@ void sort_random(cell_t *array, cell_t size)
|
||||
|
||||
for (int i = size-1; i > 0; i--)
|
||||
{
|
||||
int n = (rand() % i) + 1;
|
||||
int n = rand() % (i + 1);
|
||||
|
||||
if (array[i] != array[n])
|
||||
{
|
||||
@@ -435,7 +435,7 @@ void sort_adt_random(CellArray *cArray)
|
||||
|
||||
for (int i = arraysize-1; i > 0; i--)
|
||||
{
|
||||
int n = (rand() % i) + 1;
|
||||
int n = rand() % (i + 1);
|
||||
|
||||
cArray->swap(i, n);
|
||||
}
|
||||
|
||||
+69
-86
@@ -325,7 +325,7 @@ static cell_t GetEdictClassname(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Invalid edict (%d - %d)", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
const char *cls = pEdict->GetClassName();
|
||||
const char *cls = g_HL2.GetEntityClassname(pEdict);
|
||||
|
||||
if (!cls || cls[0] == '\0')
|
||||
{
|
||||
@@ -620,9 +620,12 @@ static cell_t GetEntDataEnt2(IPluginContext *pContext, const cell_t *params)
|
||||
}
|
||||
|
||||
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset);
|
||||
CBaseEntity *pHandleEntity = g_HL2.ReferenceToEntity(hndl.GetEntryIndex());
|
||||
|
||||
int ref = g_HL2.IndexToReference(hndl.GetEntryIndex());
|
||||
return g_HL2.ReferenceToBCompatRef(ref);
|
||||
if (!pHandleEntity || hndl != reinterpret_cast<IHandleEntity *>(pHandleEntity)->GetRefEHandle())
|
||||
return -1;
|
||||
|
||||
return g_HL2.EntityToBCompatRef(pHandleEntity);
|
||||
}
|
||||
|
||||
/* THIS GUY IS DEPRECATED. */
|
||||
@@ -812,9 +815,13 @@ static cell_t FindDataMapOffs(IPluginContext *pContext, const cell_t *params)
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[2], &offset);
|
||||
if ((td=g_HL2.FindInDataMap(pMap, offset)) == NULL)
|
||||
bool isNested = false;
|
||||
if ((td=g_HL2.FindInDataMap(pMap, offset, &isNested)) == NULL)
|
||||
{
|
||||
return -1;
|
||||
if (isNested)
|
||||
return pContext->ThrowNativeError("Property \"%s\" is not safe to access for entity %d", offset, params[1]);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (params[0] == 4)
|
||||
@@ -959,12 +966,22 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
|
||||
{ \
|
||||
return pContext->ThrowNativeError("Could not retrieve datamap"); \
|
||||
} \
|
||||
if ((td = g_HL2.FindInDataMap(pMap, prop)) == NULL) \
|
||||
bool isNested = false; \
|
||||
if ((td = g_HL2.FindInDataMap(pMap, prop, &isNested)) == NULL) \
|
||||
{ \
|
||||
return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)", \
|
||||
prop, \
|
||||
params[1], \
|
||||
class_name); \
|
||||
const char *class_name = g_HL2.GetEntityClassname(pEntity); \
|
||||
if (isNested) \
|
||||
{ \
|
||||
return pContext->ThrowNativeError("Property \"%s\" not safe to access (entity %d/%s)", \
|
||||
prop, \
|
||||
params[1], \
|
||||
((class_name) ? class_name : "")); \
|
||||
} else { \
|
||||
return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)", \
|
||||
prop, \
|
||||
params[1], \
|
||||
((class_name) ? class_name : "")); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define CHECK_SET_PROP_DATA_OFFSET() \
|
||||
@@ -980,6 +997,7 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
|
||||
|
||||
#define FIND_PROP_SEND(type, type_name) \
|
||||
sm_sendprop_info_t info;\
|
||||
SendProp *pProp; \
|
||||
IServerUnknown *pUnk = (IServerUnknown *)pEntity; \
|
||||
IServerNetworkable *pNet = pUnk->GetNetworkable(); \
|
||||
if (!pNet) \
|
||||
@@ -988,16 +1006,18 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
|
||||
} \
|
||||
if (!g_HL2.FindSendPropInfo(pNet->GetServerClass()->GetName(), prop, &info)) \
|
||||
{ \
|
||||
const char *class_name = g_HL2.GetEntityClassname(pEntity); \
|
||||
return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)", \
|
||||
prop, \
|
||||
params[1], \
|
||||
class_name); \
|
||||
((class_name) ? class_name : "")); \
|
||||
} \
|
||||
\
|
||||
offset = info.actual_offset; \
|
||||
bit_count = info.prop->m_nBits; \
|
||||
pProp = info.prop; \
|
||||
bit_count = pProp->m_nBits; \
|
||||
\
|
||||
switch (info.prop->GetType()) \
|
||||
switch (pProp->GetType()) \
|
||||
{ \
|
||||
case type: \
|
||||
{ \
|
||||
@@ -1011,7 +1031,6 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
|
||||
} \
|
||||
case DPT_DataTable: \
|
||||
{ \
|
||||
SendProp *pProp; \
|
||||
FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name); \
|
||||
\
|
||||
offset += pProp->GetOffset(); \
|
||||
@@ -1022,13 +1041,13 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
|
||||
{ \
|
||||
return pContext->ThrowNativeError("SendProp %s type is not " type_name " (%d != %d)", \
|
||||
prop, \
|
||||
info.prop->GetType(), \
|
||||
pProp->GetType(), \
|
||||
type); \
|
||||
} \
|
||||
} \
|
||||
|
||||
#define FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name) \
|
||||
SendTable *pTable = info.prop->GetDataTable(); \
|
||||
SendTable *pTable = pProp->GetDataTable(); \
|
||||
if (!pTable) \
|
||||
{ \
|
||||
return pContext->ThrowNativeError("Error looking up DataTable for prop %s", \
|
||||
@@ -1049,8 +1068,8 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
|
||||
{ \
|
||||
return pContext->ThrowNativeError("SendProp %s type is not " type_name " ([%d,%d] != %d)", \
|
||||
prop, \
|
||||
info.prop->GetType(), \
|
||||
info.prop->m_nBits, \
|
||||
pProp->GetType(), \
|
||||
pProp->m_nBits, \
|
||||
type); \
|
||||
}
|
||||
|
||||
@@ -1082,7 +1101,6 @@ static cell_t GetEntPropArraySize(IPluginContext *pContext, const cell_t *params
|
||||
{
|
||||
CBaseEntity *pEntity;
|
||||
char *prop;
|
||||
const char *class_name;
|
||||
edict_t *pEdict;
|
||||
|
||||
if (!IndexToAThings(params[1], &pEntity, &pEdict))
|
||||
@@ -1090,11 +1108,6 @@ static cell_t GetEntPropArraySize(IPluginContext *pContext, const cell_t *params
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
|
||||
{
|
||||
class_name = "";
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
|
||||
switch (params[2])
|
||||
@@ -1119,10 +1132,11 @@ static cell_t GetEntPropArraySize(IPluginContext *pContext, const cell_t *params
|
||||
}
|
||||
if (!g_HL2.FindSendPropInfo(pNet->GetServerClass()->GetName(), prop, &info))
|
||||
{
|
||||
const char *class_name = g_HL2.GetEntityClassname(pEntity);
|
||||
return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)",
|
||||
prop,
|
||||
params[1],
|
||||
class_name);
|
||||
((class_name) ? class_name : ""));
|
||||
}
|
||||
|
||||
if (info.prop->GetType() != DPT_DataTable)
|
||||
@@ -1152,7 +1166,6 @@ static cell_t GetEntProp(IPluginContext *pContext, const cell_t *params)
|
||||
CBaseEntity *pEntity;
|
||||
char *prop;
|
||||
int offset;
|
||||
const char *class_name;
|
||||
edict_t *pEdict;
|
||||
int bit_count;
|
||||
bool is_unsigned = false;
|
||||
@@ -1168,12 +1181,6 @@ static cell_t GetEntProp(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
/* TODO: Find a way to lookup classname without having an edict - Is this a guaranteed prop? */
|
||||
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
|
||||
{
|
||||
class_name = "";
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
|
||||
switch (params[2])
|
||||
@@ -1198,7 +1205,15 @@ static cell_t GetEntProp(IPluginContext *pContext, const cell_t *params)
|
||||
case Prop_Send:
|
||||
{
|
||||
FIND_PROP_SEND(DPT_Int, "integer");
|
||||
is_unsigned = ((info.prop->GetFlags() & SPROP_UNSIGNED) == SPROP_UNSIGNED);
|
||||
is_unsigned = ((pProp->GetFlags() & SPROP_UNSIGNED) == SPROP_UNSIGNED);
|
||||
|
||||
// This isn't in CS:S yet, but will be, doesn't hurt to add now, and will save us a build later
|
||||
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
|
||||
if (pProp->GetFlags() & SPROP_VARINT)
|
||||
{
|
||||
bit_count = sizeof(int) * 8;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -1251,7 +1266,6 @@ static cell_t SetEntProp(IPluginContext *pContext, const cell_t *params)
|
||||
CBaseEntity *pEntity;
|
||||
char *prop;
|
||||
int offset;
|
||||
const char *class_name;
|
||||
edict_t *pEdict;
|
||||
int bit_count;
|
||||
|
||||
@@ -1266,11 +1280,6 @@ static cell_t SetEntProp(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
|
||||
{
|
||||
class_name = "";
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
|
||||
switch (params[2])
|
||||
@@ -1295,6 +1304,14 @@ static cell_t SetEntProp(IPluginContext *pContext, const cell_t *params)
|
||||
case Prop_Send:
|
||||
{
|
||||
FIND_PROP_SEND(DPT_Int, "integer");
|
||||
|
||||
// This isn't in CS:S yet, but will be, doesn't hurt to add now, and will save us a build later
|
||||
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
|
||||
if (pProp->GetFlags() & SPROP_VARINT)
|
||||
{
|
||||
bit_count = sizeof(int) * 8;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -1339,7 +1356,6 @@ static cell_t GetEntPropFloat(IPluginContext *pContext, const cell_t *params)
|
||||
char *prop;
|
||||
int offset;
|
||||
int bit_count;
|
||||
const char *class_name;
|
||||
edict_t *pEdict;
|
||||
|
||||
int element = 0;
|
||||
@@ -1353,11 +1369,6 @@ static cell_t GetEntPropFloat(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
|
||||
{
|
||||
class_name = "";
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
|
||||
switch (params[2])
|
||||
@@ -1404,7 +1415,6 @@ static cell_t SetEntPropFloat(IPluginContext *pContext, const cell_t *params)
|
||||
char *prop;
|
||||
int offset;
|
||||
int bit_count;
|
||||
const char *class_name;
|
||||
edict_t *pEdict;
|
||||
|
||||
int element = 0;
|
||||
@@ -1418,11 +1428,6 @@ static cell_t SetEntPropFloat(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
|
||||
{
|
||||
class_name = "";
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
|
||||
switch (params[2])
|
||||
@@ -1474,7 +1479,6 @@ static cell_t GetEntPropEnt(IPluginContext *pContext, const cell_t *params)
|
||||
char *prop;
|
||||
int offset;
|
||||
int bit_count;
|
||||
const char *class_name;
|
||||
edict_t *pEdict;
|
||||
|
||||
int element = 0;
|
||||
@@ -1488,11 +1492,6 @@ static cell_t GetEntPropEnt(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
|
||||
{
|
||||
class_name = "";
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
|
||||
switch (params[2])
|
||||
@@ -1527,9 +1526,12 @@ static cell_t GetEntPropEnt(IPluginContext *pContext, const cell_t *params)
|
||||
}
|
||||
|
||||
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset);
|
||||
CBaseEntity *pHandleEntity = g_HL2.ReferenceToEntity(hndl.GetEntryIndex());
|
||||
|
||||
int ref = g_HL2.IndexToReference(hndl.GetEntryIndex());
|
||||
return g_HL2.ReferenceToBCompatRef(ref);
|
||||
if (!pHandleEntity || hndl != reinterpret_cast<IHandleEntity *>(pHandleEntity)->GetRefEHandle())
|
||||
return -1;
|
||||
|
||||
return g_HL2.EntityToBCompatRef(pHandleEntity);
|
||||
}
|
||||
|
||||
static cell_t SetEntPropEnt(IPluginContext *pContext, const cell_t *params)
|
||||
@@ -1538,7 +1540,6 @@ static cell_t SetEntPropEnt(IPluginContext *pContext, const cell_t *params)
|
||||
char *prop;
|
||||
int offset;
|
||||
int bit_count;
|
||||
const char *class_name;
|
||||
edict_t *pEdict;
|
||||
|
||||
int element = 0;
|
||||
@@ -1552,11 +1553,6 @@ static cell_t SetEntPropEnt(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
|
||||
{
|
||||
class_name = "";
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
|
||||
switch (params[2])
|
||||
@@ -1623,7 +1619,6 @@ static cell_t GetEntPropVector(IPluginContext *pContext, const cell_t *params)
|
||||
char *prop;
|
||||
int offset;
|
||||
int bit_count;
|
||||
const char *class_name;
|
||||
edict_t *pEdict;
|
||||
|
||||
int element = 0;
|
||||
@@ -1637,11 +1632,6 @@ static cell_t GetEntPropVector(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
|
||||
{
|
||||
class_name = "";
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
|
||||
switch (params[2])
|
||||
@@ -1695,7 +1685,6 @@ static cell_t SetEntPropVector(IPluginContext *pContext, const cell_t *params)
|
||||
char *prop;
|
||||
int offset;
|
||||
int bit_count;
|
||||
const char *class_name;
|
||||
edict_t *pEdict;
|
||||
|
||||
int element = 0;
|
||||
@@ -1709,11 +1698,6 @@ static cell_t SetEntPropVector(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
|
||||
{
|
||||
class_name = "";
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
|
||||
switch (params[2])
|
||||
@@ -1771,7 +1755,6 @@ static cell_t GetEntPropString(IPluginContext *pContext, const cell_t *params)
|
||||
CBaseEntity *pEntity;
|
||||
char *prop;
|
||||
int offset;
|
||||
const char *class_name;
|
||||
edict_t *pEdict;
|
||||
bool bIsStringIndex;
|
||||
|
||||
@@ -1786,11 +1769,6 @@ static cell_t GetEntPropString(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
|
||||
{
|
||||
class_name = "";
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
|
||||
bIsStringIndex = false;
|
||||
@@ -1849,10 +1827,11 @@ static cell_t GetEntPropString(IPluginContext *pContext, const cell_t *params)
|
||||
}
|
||||
if (!g_HL2.FindSendPropInfo(pNet->GetServerClass()->GetName(), prop, &info))
|
||||
{
|
||||
const char *class_name = g_HL2.GetEntityClassname(pEntity);
|
||||
return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)",
|
||||
prop,
|
||||
params[1],
|
||||
class_name);
|
||||
((class_name) ? class_name : ""));
|
||||
}
|
||||
|
||||
offset = info.actual_offset;
|
||||
@@ -1923,9 +1902,13 @@ static cell_t SetEntPropString(IPluginContext *pContext, const cell_t *params)
|
||||
return pContext->ThrowNativeError("Unable to retrieve GetDataDescMap offset");
|
||||
}
|
||||
pContext->LocalToString(params[3], &prop);
|
||||
if ((td=g_HL2.FindInDataMap(pMap, prop)) == NULL)
|
||||
bool isNested = false;
|
||||
if ((td=g_HL2.FindInDataMap(pMap, prop, &isNested)) == NULL)
|
||||
{
|
||||
return pContext->ThrowNativeError("Property \"%s\" not found for entity %d", prop, params[1]);
|
||||
if (isNested)
|
||||
return pContext->ThrowNativeError("Property \"%s\" is not safe to access for entity %d", prop, params[1]);
|
||||
else
|
||||
return pContext->ThrowNativeError("Property \"%s\" not found for entity %d", prop, params[1]);
|
||||
}
|
||||
if (td->fieldType != FIELD_CHARACTER)
|
||||
{
|
||||
|
||||
@@ -451,6 +451,10 @@ static cell_t smn_IsPlayerAlive(IPluginContext *pContext, const cell_t *params)
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef SOURCE_ENGINE_CSS
|
||||
#define SOURCE_ENGINE_CSS 13
|
||||
#endif
|
||||
|
||||
static cell_t GuessSDKVersion(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
#if defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11
|
||||
@@ -473,6 +477,7 @@ static cell_t GuessSDKVersion(IPluginContext *pContext, const cell_t *params)
|
||||
return 32;
|
||||
case SOURCE_ENGINE_EYE:
|
||||
return 33;
|
||||
case SOURCE_ENGINE_CSS:
|
||||
case SOURCE_ENGINE_ORANGEBOXVALVE:
|
||||
return 35;
|
||||
case SOURCE_ENGINE_LEFT4DEAD:
|
||||
|
||||
@@ -206,18 +206,18 @@ static cell_t CS_DropWeapon(IPluginContext *pContext, const cell_t *params)
|
||||
}
|
||||
|
||||
//Psychonic is awesome for this
|
||||
sm_sendprop_info_t *spi = new sm_sendprop_info_t;
|
||||
sm_sendprop_info_t spi;
|
||||
IServerUnknown *pUnk = (IServerUnknown *)pWeapon;
|
||||
IServerNetworkable *pNet = pUnk->GetNetworkable();
|
||||
|
||||
if (!UTIL_FindDataTable(pNet->GetServerClass()->m_pTable, "DT_WeaponCSBase", spi, 0))
|
||||
if (!UTIL_FindDataTable(pNet->GetServerClass()->m_pTable, "DT_WeaponCSBase", &spi, 0))
|
||||
return pContext->ThrowNativeError("Entity index %d is not a weapon", params[2]);
|
||||
|
||||
if (!gamehelpers->FindSendPropInfo("CBaseCombatWeapon", "m_hOwnerEntity", spi))
|
||||
if (!gamehelpers->FindSendPropInfo("CBaseCombatWeapon", "m_hOwnerEntity", &spi))
|
||||
return pContext->ThrowNativeError("Invalid entity index %d for weapon", params[2]);
|
||||
|
||||
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pWeapon + spi->actual_offset);
|
||||
if (params[1] != hndl.GetEntryIndex())
|
||||
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pWeapon + spi.actual_offset);
|
||||
if (params[1] != hndl.GetEntryIndex() || hndl != ((IServerEntity *)pEntity)->GetRefEHandle())
|
||||
return pContext->ThrowNativeError("Weapon %d is not owned by client %d", params[2], params[1]);
|
||||
|
||||
if (params[4] == 1 && g_pCSWeaponDropDetoured)
|
||||
@@ -312,7 +312,7 @@ static cell_t CS_GetTranslatedWeaponAlias(IPluginContext *pContext, const cell_t
|
||||
pContext->LocalToString(params[2], &dest);
|
||||
pContext->LocalToString(params[1], &weapon);
|
||||
|
||||
char *ret = new char[128];
|
||||
char *ret = NULL;
|
||||
|
||||
unsigned char vstk[sizeof(char *)];
|
||||
unsigned char *vptr = vstk;
|
||||
|
||||
@@ -89,15 +89,17 @@ enum PropFieldType
|
||||
|
||||
#define FIND_PROP_SEND(type, type_name) \
|
||||
sm_sendprop_info_t info;\
|
||||
SendProp *pProp; \
|
||||
if (!gamehelpers->FindSendPropInfo(g_szGameRulesProxy, prop, &info)) \
|
||||
{ \
|
||||
return pContext->ThrowNativeError("Property \"%s\" not found on the gamerules proxy", prop); \
|
||||
} \
|
||||
\
|
||||
offset = info.actual_offset; \
|
||||
bit_count = info.prop->m_nBits; \
|
||||
pProp = info.prop; \
|
||||
bit_count = pProp->m_nBits; \
|
||||
\
|
||||
switch (info.prop->GetType()) \
|
||||
switch (pProp->GetType()) \
|
||||
{ \
|
||||
case type: \
|
||||
{ \
|
||||
@@ -111,7 +113,6 @@ enum PropFieldType
|
||||
} \
|
||||
case DPT_DataTable: \
|
||||
{ \
|
||||
SendProp *pProp; \
|
||||
FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name); \
|
||||
\
|
||||
offset += pProp->GetOffset(); \
|
||||
@@ -122,13 +123,13 @@ enum PropFieldType
|
||||
{ \
|
||||
return pContext->ThrowNativeError("SendProp %s type is not " type_name " (%d != %d)", \
|
||||
prop, \
|
||||
info.prop->GetType(), \
|
||||
pProp->GetType(), \
|
||||
type); \
|
||||
} \
|
||||
} \
|
||||
|
||||
#define FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name) \
|
||||
SendTable *pTable = info.prop->GetDataTable(); \
|
||||
SendTable *pTable = pProp->GetDataTable(); \
|
||||
if (!pTable) \
|
||||
{ \
|
||||
return pContext->ThrowNativeError("Error looking up DataTable for prop %s", \
|
||||
@@ -149,8 +150,8 @@ enum PropFieldType
|
||||
{ \
|
||||
return pContext->ThrowNativeError("SendProp %s type is not " type_name " ([%d,%d] != %d)", \
|
||||
prop, \
|
||||
info.prop->GetType(), \
|
||||
info.prop->m_nBits, \
|
||||
pProp->GetType(), \
|
||||
pProp->m_nBits, \
|
||||
type); \
|
||||
}
|
||||
|
||||
@@ -160,6 +161,7 @@ static cell_t GameRules_GetProp(IPluginContext *pContext, const cell_t *params)
|
||||
int element = params[3];
|
||||
int offset;
|
||||
int bit_count;
|
||||
bool is_unsigned;
|
||||
|
||||
if (!g_pGameRules || !g_szGameRulesProxy || !strcmp(g_szGameRulesProxy, ""))
|
||||
return pContext->ThrowNativeError("Gamerules lookup failed.");
|
||||
@@ -169,6 +171,15 @@ static cell_t GameRules_GetProp(IPluginContext *pContext, const cell_t *params)
|
||||
int elementCount = 1;
|
||||
|
||||
FIND_PROP_SEND(DPT_Int, "integer");
|
||||
is_unsigned = ((pProp->GetFlags() & SPROP_UNSIGNED) == SPROP_UNSIGNED);
|
||||
|
||||
// This isn't in CS:S yet, but will be, doesn't hurt to add now, and will save us a build later
|
||||
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
|
||||
if (pProp->GetFlags() & SPROP_VARINT)
|
||||
{
|
||||
bit_count = sizeof(int) * 8;
|
||||
}
|
||||
#endif
|
||||
␍ if (bit_count < 1)
|
||||
{
|
||||
bit_count = params[2] * 8;
|
||||
@@ -182,11 +193,25 @@ static cell_t GameRules_GetProp(IPluginContext *pContext, const cell_t *params)
|
||||
}
|
||||
else if (bit_count >= 9)
|
||||
{
|
||||
return *(int16_t *)((intptr_t)pGameRules + offset);
|
||||
if (is_unsigned)
|
||||
{
|
||||
return *(uint16_t *)((intptr_t)pGameRules + offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
return *(int16_t *)((intptr_t)pGameRules + offset);
|
||||
}
|
||||
}
|
||||
else if (bit_count >= 2)
|
||||
{
|
||||
return *(int8_t *)((intptr_t)pGameRules + offset);
|
||||
if (is_unsigned)
|
||||
{
|
||||
return *(uint8_t *)((intptr_t)pGameRules + offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
return *(int8_t *)((intptr_t)pGameRules + offset);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -218,6 +243,14 @@ static cell_t GameRules_SetProp(IPluginContext *pContext, const cell_t *params)
|
||||
|
||||
FIND_PROP_SEND(DPT_Int, "integer");
|
||||
|
||||
// This isn't in CS:S yet, but will be, doesn't hurt to add now, and will save us a build later
|
||||
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
|
||||
if (pProp->GetFlags() & SPROP_VARINT)
|
||||
{
|
||||
bit_count = sizeof(int) * 8;
|
||||
}
|
||||
#endif
|
||||
|
||||
void *pGameRules = *g_pGameRules;
|
||||
|
||||
if (bit_count < 1)
|
||||
@@ -339,9 +372,14 @@ static cell_t GameRules_GetPropEnt(IPluginContext *pContext, const cell_t *param
|
||||
void *pGameRules = *g_pGameRules;
|
||||
|
||||
CBaseHandle &hndl = *(CBaseHandle *)((intptr_t)pGameRules + offset);
|
||||
CBaseEntity *pEntity = gamehelpers->ReferenceToEntity(hndl.GetEntryIndex());
|
||||
|
||||
int ref = gamehelpers->IndexToReference(hndl.GetEntryIndex());
|
||||
return gamehelpers->ReferenceToBCompatRef(ref);
|
||||
if (!pEntity || ((IServerEntity *)pEntity)->GetRefEHandle() != hndl)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return gamehelpers->EntityToBCompatRef(pEntity);
|
||||
}
|
||||
|
||||
static cell_t GameRules_SetPropEnt(IPluginContext *pContext, const cell_t *params)
|
||||
@@ -470,7 +508,7 @@ static cell_t GameRules_SetPropVector(IPluginContext *pContext, const cell_t *pa
|
||||
|
||||
if (sendChange)
|
||||
{
|
||||
v = (Vector *)((intptr_t)g_pGameRules + offset);
|
||||
v = (Vector *)((intptr_t)pProxy + offset);
|
||||
v->x = sp_ctof(vec[0]);
|
||||
v->y = sp_ctof(vec[1]);
|
||||
v->z = sp_ctof(vec[2]);
|
||||
|
||||
@@ -129,7 +129,7 @@ static cell_t PrepSDKCall_SetSignature(IPluginContext *pContext, const cell_t *p
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#if (SOURCE_ENGINE == SE_ORANGEBOXVALVE) || (SOURCE_ENGINE == SE_LEFT4DEAD2)
|
||||
#if (SOURCE_ENGINE == SE_ORANGEBOXVALVE) || (SOURCE_ENGINE == SE_LEFT4DEAD) || (SOURCE_ENGINE == SE_LEFT4DEAD2)
|
||||
s_call_addr = memutils->ResolveSymbol(handle, &sig[1]);
|
||||
#else
|
||||
s_call_addr = dlsym(handle, &sig[1]);
|
||||
|
||||
@@ -125,6 +125,7 @@ void GetIServer()
|
||||
int offset;
|
||||
void *vfunc = NULL;
|
||||
|
||||
#if SOURCE_ENGINE != SE_ORANGEBOXVALVE
|
||||
#if defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11
|
||||
/* Get the CreateFakeClient function pointer */
|
||||
if (!(vfunc=SH_GET_ORIG_VFNPTR_ENTRY(engine, &IVEngineServer::CreateFakeClient)))
|
||||
@@ -142,7 +143,8 @@ void GetIServer()
|
||||
void **vtable = *reinterpret_cast<void ***>(enginePatch->GetThisPtr() + info.thisptroffs + info.vtbloffs);
|
||||
vfunc = vtable[info.vtblindex];
|
||||
}
|
||||
#endif
|
||||
#endif // defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11
|
||||
#endif // SOURCE_ENGINE != SE_ORANGEBOXVALVE
|
||||
|
||||
/* Get signature string for IVEngineServer::CreateFakeClient() */
|
||||
sigstr = g_pGameConf->GetKeyValue("CreateFakeClient_Windows");
|
||||
@@ -154,12 +156,20 @@ void GetIServer()
|
||||
|
||||
/* Convert signature string to signature bytes */
|
||||
siglen = UTIL_StringToSignature(sigstr, sig, sizeof(sig));
|
||||
|
||||
|
||||
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
|
||||
vfunc = memutils->FindPattern(engine, sig, siglen);
|
||||
if (!vfunc)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#else
|
||||
/* Check if we're on the expected function */
|
||||
if (!UTIL_VerifySignature(vfunc, sig, siglen))
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Get the offset into CreateFakeClient */
|
||||
if (!g_pGameConf->GetOffset("sv", &offset))
|
||||
|
||||
@@ -39,11 +39,11 @@ cell_t TF2_MakeBleed(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
static ICallWrapper *pWrapper = NULL;
|
||||
|
||||
// CTFPlayerShared::MakeBleed(CTFPlayer*, CTFWeaponBase*, float)
|
||||
// CTFPlayerShared::MakeBleed(CTFPlayer*, CTFWeaponBase*, float, int=4)
|
||||
if(!pWrapper)
|
||||
{
|
||||
REGISTER_NATIVE_ADDR("MakeBleed",
|
||||
PassInfo pass[3]; \
|
||||
PassInfo pass[4]; \
|
||||
pass[0].flags = PASSFLAG_BYVAL; \
|
||||
pass[0].size = sizeof(CBaseEntity *); \
|
||||
pass[0].type = PassType_Basic; \
|
||||
@@ -53,7 +53,10 @@ cell_t TF2_MakeBleed(IPluginContext *pContext, const cell_t *params)
|
||||
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))
|
||||
pass[3].flags = PASSFLAG_BYVAL; \
|
||||
pass[3].size = sizeof(int); \
|
||||
pass[3].type = PassType_Basic; \
|
||||
pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 4))
|
||||
}
|
||||
|
||||
CBaseEntity *pEntity;
|
||||
@@ -80,6 +83,8 @@ cell_t TF2_MakeBleed(IPluginContext *pContext, const cell_t *params)
|
||||
*(CBaseEntity **)vptr = NULL;
|
||||
vptr += sizeof(CBaseEntity *);
|
||||
*(float *)vptr = sp_ctof(params[3]);
|
||||
vptr += sizeof(float);
|
||||
*(int *)vptr = 4;
|
||||
|
||||
pWrapper->Execute(vstk, NULL);
|
||||
|
||||
@@ -449,12 +454,16 @@ cell_t TF2_Regenerate(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
static ICallWrapper *pWrapper = NULL;
|
||||
|
||||
//CTFPlayer::Regenerate()
|
||||
//CTFPlayer::Regenerate( bool=true )
|
||||
|
||||
if (!pWrapper)
|
||||
{
|
||||
REGISTER_NATIVE_ADDR("Regenerate",
|
||||
pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, NULL, 0));
|
||||
PassInfo pass[1]; \
|
||||
pass[0].flags = PASSFLAG_BYVAL; \
|
||||
pass[0].size = sizeof(bool); \
|
||||
pass[0].type = PassType_Basic; \
|
||||
pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 1))
|
||||
}
|
||||
|
||||
CBaseEntity *pEntity;
|
||||
@@ -462,7 +471,15 @@ cell_t TF2_Regenerate(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
|
||||
}
|
||||
pWrapper->Execute(&pEntity, NULL);
|
||||
|
||||
unsigned char vstk[sizeof(void *) + sizeof(bool)];
|
||||
unsigned char *vptr = vstk;
|
||||
|
||||
*(void **)vptr = (void *)pEntity;
|
||||
vptr += sizeof(void *);
|
||||
*(bool *)vptr = true;
|
||||
|
||||
pWrapper->Execute(vstk, NULL);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
* Do not edit this file. Any changes will be overwritten by the gamedata
|
||||
* updater or by upgrading your SourceMod install.
|
||||
*
|
||||
* For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(SourceMod)
|
||||
*/
|
||||
|
||||
"Games"
|
||||
{
|
||||
"#default"
|
||||
{
|
||||
"Keys"
|
||||
{
|
||||
"plugin_541de8d7f577398bad43b75f4ac80b84" "http://forums.alliedmods.net/showpost.php?p=1767388&postcount=7" /* LightRP (Sphex) - Version 1.2.5 */
|
||||
"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_c82200dc10b39ad196fc805e4d4da807" "" /* [L4D] Survivor Upgrades Reloaded (Marcus101RR, Whosat & Jerrith) - Version 1.5.0 */
|
||||
"plugin_4225ffe2fd15d10a730466909a64bd01" "" /* [L4D2] Survivor Upgrades Reloaded (Marcus101RR, Whosat & Jerrith) - Version 1.5.0 */
|
||||
"plugin_862ae600f417a26e6b6d3ab5d702c5e7" "" /* [L4D] Survivor Upgrades Reloaded (Marcus101RR, Whosat & Jerrith) - Version 1.5.0 - Hotfix */
|
||||
"plugin_cdb8b711ff0166791e761d6324b30b4c" "" /* [L4D2] Survivor Upgrades Reloaded (Marcus101RR, Whosat & Jerrith) - Version 1.5.0 - Hotfix */
|
||||
"plugin_fd89ca333467cffe722072a52e7bc752" "" /* L4D SuperVersus (DDRKhat) - Version 1.6.5 - Marcus101RR version */
|
||||
"plugin_33c1c93eaff16f385ef245cb4af80f1a" "" /* Survivor Health & Armor System (Marcus101RR) - Version 1.4.8 */
|
||||
"plugin_895eb68cb2dd5235e29b93452e14e52b" "" /* [L4D(2)] Health & Armor System (Marcus101RR) - Version 1.5.0 */
|
||||
"plugin_56ce0378afbb2cadb06be89dcba76706" "" /* [L4D(2)] Human Director Reloaded (Marcus101RR & lucskywalker) - Version 0.7.0 */
|
||||
"plugin_f405db5491a465b1a30859ee7f7c5080" "" /* UCP Server (Endi) - Version 6.9 */
|
||||
"plugin_6fcb6721fb740b854b0a05bfc9a7984a" "" /* UCP Server (Endi) - Version 7.1 */
|
||||
"plugin_4d320d6c5aba5d31c644fe2847c0662f" "" /* UCP Server (Endi) - Version 7.2 */
|
||||
"plugin_92d7c31873390c254bbcd0c955939aa6" "" /* UCP Server (Endi) - Version 7.7 */
|
||||
"plugin_f99d77668e7aa0adb6a960322ab05568" "" /* UCP Server (Endi) - Version 7.8 */
|
||||
"plugin_78140f1a0f26cd3297767d0598eac4b1" "" /* [Any] PReplay (DarthNinja) - Version 1.0.0 */
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -58,6 +58,9 @@
|
||||
"engine.eye.txt"
|
||||
{
|
||||
"engine" "eye"
|
||||
}
|
||||
|
||||
"blacklist.plugins.txt"
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
"#supported"
|
||||
{
|
||||
"game" "ageofchivalry"
|
||||
"game" "zps"
|
||||
"game" "empires"
|
||||
"game" "synergy"
|
||||
"game" "bg2"
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
"game" "tf"
|
||||
"game" "hl2mp"
|
||||
"game" "cstrike"
|
||||
"game" "garrysmod"
|
||||
}
|
||||
|
||||
"Offsets"
|
||||
@@ -74,8 +73,8 @@
|
||||
"game" "dod"
|
||||
"game" "tf"
|
||||
"game" "hl2mp"
|
||||
"game" "cstrike"
|
||||
"game" "garrysmod"
|
||||
"game" "cstrike"
|
||||
}
|
||||
|
||||
"Signatures"
|
||||
@@ -84,7 +83,7 @@
|
||||
"FindEntityByClassname"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x53\x56\x8B\xF1\x8B\x4D\x2A\x85\xC9\x57\x74\x2A\x8B\x01\x8B\x50\x2A\xFF\xD2\x8B\x00\x25\x2A\x2A\x2A\x2A\x83\xC0\x2A\xC1\xE0\x04\x8B\x3C\x30\xEB\x2A\x8B\xBE\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x5D\x2A\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x15\x2A\x2A\x2A\x2A\x83\xC4\x2A\xEB\x2A\x39"
|
||||
"windows" "\x55\x8B\xEC\x53\x56\x8B\xF1\x8B\x4D\x2A\x57\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\xFF\xD2\x8B\x00\x25\xFF\x0F\x00\x00\x40\x03\xC0\x8B\x3C\xC6\xEB\x2A\x8B"
|
||||
"linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
|
||||
"mac" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
|
||||
}
|
||||
@@ -139,17 +138,22 @@
|
||||
/* IServer interface pointer */
|
||||
"#default"
|
||||
{
|
||||
"#supported"
|
||||
{
|
||||
"game" "dod"
|
||||
"game" "tf"
|
||||
"game" "hl2mp"
|
||||
"game" "garrysmod"
|
||||
"game" "cstrike"
|
||||
}
|
||||
|
||||
"Keys"
|
||||
{
|
||||
/* Signature for the beginning of IVEngineServer::CreateFakeClient.
|
||||
*
|
||||
* The engine binary is not actually scanned in order to look for
|
||||
* this. SourceHook is used to used to determine the address of the
|
||||
* function and this signature is used to verify that it contains
|
||||
* the expected code. A pointer to sv (IServer interface) is used
|
||||
* here.
|
||||
/* Signature for the beginning of IVEngineServer::CreateFakeClientEx.
|
||||
* (Must be unique!)
|
||||
*/
|
||||
"CreateFakeClient_Windows" "\x55\x8B\xEC\x8B\x45\x2A\x50\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0"
|
||||
|
||||
"CreateFakeClient_Windows" "\x55\x8B\xEC\x8B\x2A\x2A\x50\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x75"
|
||||
}
|
||||
|
||||
"Offsets"
|
||||
@@ -176,6 +180,14 @@
|
||||
/* EntityFactoryDictionary function */
|
||||
"#default"
|
||||
{
|
||||
"#supported"
|
||||
{
|
||||
"game" "tf"
|
||||
"game" "dod"
|
||||
"game" "hl2mp"
|
||||
"game" "cstrike"
|
||||
}
|
||||
|
||||
"Signatures"
|
||||
{
|
||||
"EntityFactory"
|
||||
@@ -197,14 +209,13 @@
|
||||
"game" "tf"
|
||||
"game" "hl2mp"
|
||||
"game" "cstrike"
|
||||
"game" "garrysmod"
|
||||
}
|
||||
"Signatures"
|
||||
{
|
||||
"FireOutput"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x81\xEC\x2A\x2A\x2A\x2A\x53\x56\x8B\x71\x2A\x85\xF6"
|
||||
"windows" "\x55\x8B\xEC\x81\x2A\x2A\x2A\x2A\x2A\x53\x56\x8B\x2A\x2A\x57\x89"
|
||||
"linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
|
||||
"mac" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
|
||||
}
|
||||
|
||||
@@ -196,7 +196,6 @@
|
||||
"#supported"
|
||||
{
|
||||
"game" "left4dead2"
|
||||
"game" "nucleardawn"
|
||||
}
|
||||
"Signatures"
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"Games"
|
||||
{
|
||||
/* CSpromod 1.05 */
|
||||
/* CSpromod 1.09 */
|
||||
"cspromod"
|
||||
{
|
||||
"Offsets"
|
||||
@@ -8,47 +8,47 @@
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "353"
|
||||
"linux" "354"
|
||||
"linux" "355"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "239"
|
||||
"windows" "238"
|
||||
"linux" "240"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "237"
|
||||
"windows" "236"
|
||||
"linux" "238"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "194"
|
||||
"windows" "193"
|
||||
"linux" "195"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "198"
|
||||
"windows" "197"
|
||||
"linux" "199"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
"windows" "101"
|
||||
"windows" "100"
|
||||
"linux" "102"
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "389"
|
||||
"linux" "389"
|
||||
"windows" "390"
|
||||
"linux" "391"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
"windows" "131"
|
||||
"linux" "132"
|
||||
"windows" "132"
|
||||
"linux" "134"
|
||||
}
|
||||
"EyeAngles"
|
||||
{
|
||||
"windows" "123"
|
||||
"linux" "124"
|
||||
"windows" "124"
|
||||
"linux" "126"
|
||||
}
|
||||
"AcceptInput"
|
||||
{
|
||||
@@ -57,7 +57,7 @@
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "230"
|
||||
"windows" "229"
|
||||
"linux" "231"
|
||||
}
|
||||
"SetEntityModel"
|
||||
@@ -72,8 +72,8 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "373"
|
||||
"linux" "374"
|
||||
"windows" "374"
|
||||
"linux" "376"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,87 +28,87 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "393"
|
||||
"linux" "394"
|
||||
"mac" "394"
|
||||
"windows" "399"
|
||||
"linux" "400"
|
||||
"mac" "400"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "264"
|
||||
"linux" "265"
|
||||
"mac" "265"
|
||||
"windows" "268"
|
||||
"linux" "269"
|
||||
"mac" "269"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "262"
|
||||
"linux" "263"
|
||||
"mac" "263"
|
||||
"windows" "266"
|
||||
"linux" "267"
|
||||
"mac" "267"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "205"
|
||||
"linux" "206"
|
||||
"mac" "206"
|
||||
"windows" "207"
|
||||
"linux" "208"
|
||||
"mac" "208"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "209"
|
||||
"linux" "210"
|
||||
"mac" "210"
|
||||
"windows" "211"
|
||||
"linux" "212"
|
||||
"mac" "212"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
"windows" "106"
|
||||
"linux" "107"
|
||||
"mac" "107"
|
||||
"windows" "107"
|
||||
"linux" "108"
|
||||
"mac" "108"
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "434"
|
||||
"linux" "434"
|
||||
"mac" "434"
|
||||
"windows" "440"
|
||||
"linux" "440"
|
||||
"mac" "440"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
"windows" "138"
|
||||
"linux" "139"
|
||||
"mac" "139"
|
||||
"windows" "139"
|
||||
"linux" "140"
|
||||
"mac" "140"
|
||||
}
|
||||
"EyeAngles"
|
||||
{
|
||||
"windows" "129"
|
||||
"linux" "130"
|
||||
"mac" "130"
|
||||
"windows" "130"
|
||||
"linux" "131"
|
||||
"mac" "131"
|
||||
}
|
||||
"AcceptInput"
|
||||
{
|
||||
"windows" "35"
|
||||
"linux" "36"
|
||||
"mac" "36"
|
||||
"windows" "36"
|
||||
"linux" "37"
|
||||
"mac" "37"
|
||||
}
|
||||
"SetEntityModel"
|
||||
{
|
||||
"windows" "23"
|
||||
"linux" "24"
|
||||
"mac" "24"
|
||||
"windows" "24"
|
||||
"linux" "25"
|
||||
"mac" "25"
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "255"
|
||||
"linux" "256"
|
||||
"mac" "256"
|
||||
"windows" "259"
|
||||
"linux" "260"
|
||||
"mac" "260"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
"windows" "32"
|
||||
"linux" "33"
|
||||
"mac" "33"
|
||||
"windows" "33"
|
||||
"linux" "34"
|
||||
"mac" "34"
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "411"
|
||||
"linux" "412"
|
||||
"mac" "412"
|
||||
"windows" "417"
|
||||
"linux" "418"
|
||||
"mac" "418"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "423"
|
||||
"windows" "424"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
@@ -31,7 +31,7 @@
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "468"
|
||||
"windows" "469"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
@@ -59,7 +59,7 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "444"
|
||||
"windows" "445"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,87 +18,87 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "392"
|
||||
"linux" "393"
|
||||
"mac" "393"
|
||||
"windows" "398"
|
||||
"linux" "399"
|
||||
"mac" "399"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "264"
|
||||
"linux" "265"
|
||||
"mac" "265"
|
||||
"windows" "268"
|
||||
"linux" "269"
|
||||
"mac" "269"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "262"
|
||||
"linux" "263"
|
||||
"mac" "263"
|
||||
"windows" "266"
|
||||
"linux" "267"
|
||||
"mac" "267"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "205"
|
||||
"linux" "206"
|
||||
"mac" "206"
|
||||
"windows" "207"
|
||||
"linux" "208"
|
||||
"mac" "208"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "209"
|
||||
"linux" "210"
|
||||
"mac" "210"
|
||||
"windows" "211"
|
||||
"linux" "212"
|
||||
"mac" "212"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
"windows" "106"
|
||||
"linux" "107"
|
||||
"mac" "107"
|
||||
"windows" "107"
|
||||
"linux" "108"
|
||||
"mac" "108"
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "430"
|
||||
"linux" "431"
|
||||
"mac" "431"
|
||||
"windows" "436"
|
||||
"linux" "437"
|
||||
"mac" "437"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
"windows" "138"
|
||||
"linux" "139"
|
||||
"mac" "139"
|
||||
"windows" "139"
|
||||
"linux" "140"
|
||||
"mac" "140"
|
||||
}
|
||||
"EyeAngles"
|
||||
{
|
||||
"windows" "129"
|
||||
"linux" "130"
|
||||
"mac" "130"
|
||||
"windows" "130"
|
||||
"linux" "131"
|
||||
"mac" "131"
|
||||
}
|
||||
"AcceptInput"
|
||||
{
|
||||
"windows" "35"
|
||||
"linux" "36"
|
||||
"mac" "36"
|
||||
"windows" "36"
|
||||
"linux" "37"
|
||||
"mac" "37"
|
||||
}
|
||||
"SetEntityModel"
|
||||
{
|
||||
"windows" "23"
|
||||
"linux" "24"
|
||||
"mac" "24"
|
||||
"windows" "24"
|
||||
"linux" "25"
|
||||
"mac" "25"
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "255"
|
||||
"linux" "256"
|
||||
"mac" "256"
|
||||
"windows" "259"
|
||||
"linux" "260"
|
||||
"mac" "260"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
"windows" "32"
|
||||
"linux" "33"
|
||||
"mac" "33"
|
||||
"windows" "33"
|
||||
"linux" "34"
|
||||
"mac" "34"
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "410"
|
||||
"linux" "411"
|
||||
"mac" "411"
|
||||
"windows" "416"
|
||||
"linux" "417"
|
||||
"mac" "417"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,87 +18,163 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "434"
|
||||
"linux" "435"
|
||||
"mac" "435"
|
||||
"windows" "437"
|
||||
"linux" "438"
|
||||
"mac" "438"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "308"
|
||||
"linux" "309"
|
||||
"mac" "309"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "306"
|
||||
"linux" "307"
|
||||
"mac" "307"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "304"
|
||||
"linux" "305"
|
||||
"mac" "305"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "241"
|
||||
"linux" "242"
|
||||
"mac" "242"
|
||||
"windows" "243"
|
||||
"linux" "244"
|
||||
"mac" "244"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "245"
|
||||
"linux" "246"
|
||||
"mac" "246"
|
||||
"windows" "247"
|
||||
"linux" "248"
|
||||
"mac" "248"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
"windows" "107"
|
||||
"linux" "108"
|
||||
"mac" "108"
|
||||
"windows" "108"
|
||||
"linux" "109"
|
||||
"mac" "109"
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "473"
|
||||
"linux" "473"
|
||||
"mac" "473"
|
||||
"windows" "476"
|
||||
"linux" "476"
|
||||
"mac" "476"
|
||||
}
|
||||
"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"
|
||||
{
|
||||
"windows" "35"
|
||||
"linux" "36"
|
||||
"mac" "36"
|
||||
"windows" "36"
|
||||
"linux" "37"
|
||||
"mac" "37"
|
||||
}
|
||||
"SetEntityModel"
|
||||
{
|
||||
"windows" "23"
|
||||
"linux" "24"
|
||||
"mac" "24"
|
||||
"windows" "24"
|
||||
"linux" "25"
|
||||
"mac" "25"
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "297"
|
||||
"linux" "298"
|
||||
"mac" "298"
|
||||
"windows" "299"
|
||||
"linux" "300"
|
||||
"mac" "300"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
"windows" "32"
|
||||
"linux" "33"
|
||||
"mac" "33"
|
||||
"windows" "33"
|
||||
"linux" "34"
|
||||
"mac" "34"
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "452"
|
||||
"linux" "453"
|
||||
"mac" "453"
|
||||
"windows" "455"
|
||||
"linux" "456"
|
||||
"mac" "456"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"garrysmod"
|
||||
{
|
||||
"Offsets"
|
||||
{
|
||||
/* Offset into func at "CBaseTempEntity" signature */
|
||||
"s_pTempEntities"
|
||||
{
|
||||
"windows" "8"
|
||||
}
|
||||
"GetTEName"
|
||||
{
|
||||
"windows" "4"
|
||||
"linux" "4"
|
||||
"mac" "4"
|
||||
}
|
||||
"GetTENext"
|
||||
{
|
||||
"windows" "8"
|
||||
"linux" "8"
|
||||
"mac" "8"
|
||||
}
|
||||
"TE_GetServerClass"
|
||||
{
|
||||
"windows" "0"
|
||||
"linux" "0"
|
||||
"mac" "0"
|
||||
}
|
||||
}
|
||||
|
||||
"Signatures"
|
||||
{
|
||||
/* This isn't CBaseTempEntity::CBaseTempEntity on gmod, it's a randon one of now many, many funcs that have
|
||||
* the s_pTempEntities ptr available due to inlining
|
||||
*/
|
||||
"CBaseTempEntity"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x51\x0F\x57\xC0\xA1\x2A\x2A\x2A\x2A\x8D\x4D\xFC\xA3"
|
||||
}
|
||||
"s_pTempEntities"
|
||||
{
|
||||
"library" "server"
|
||||
"linux" "@_ZN15CBaseTempEntity15s_pTempEntitiesE"
|
||||
"mac" "@_ZN15CBaseTempEntity15s_pTempEntitiesE"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"garrysmod"
|
||||
{
|
||||
"Signatures"
|
||||
{
|
||||
"EntityFactory"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x51\x56\x8D\x2A\x2A\xBE\x2A\x2A\x2A\x2A\xC7\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\xC7\x2A\x2A\x2A\x2A\x2A\x2A\xE8"
|
||||
"linux" "@_Z23EntityFactoryDictionaryv"
|
||||
"mac" "@_Z23EntityFactoryDictionaryv"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"garrysmod"
|
||||
{
|
||||
"Signatures"
|
||||
{
|
||||
"FireOutput"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x83\x2A\x2A\x81\x2A\x2A\x2A\x2A\x2A\x8B\x2A\x2A\x53\x56\x8B\x2A\x2A\x85\xF6\x57"
|
||||
"linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
|
||||
"mac" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,28 +6,28 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "352"
|
||||
"linux" "353"
|
||||
"windows" "354"
|
||||
"linux" "355"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "241"
|
||||
"linux" "242"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "239"
|
||||
"linux" "240"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "237"
|
||||
"linux" "238"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "194"
|
||||
"linux" "195"
|
||||
"windows" "196"
|
||||
"linux" "197"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "198"
|
||||
"linux" "199"
|
||||
"windows" "200"
|
||||
"linux" "201"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
@@ -36,8 +36,8 @@
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "393"
|
||||
"linux" "393"
|
||||
"windows" "395"
|
||||
"linux" "395"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
@@ -61,8 +61,8 @@
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "230"
|
||||
"linux" "231"
|
||||
"windows" "232"
|
||||
"linux" "233"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
@@ -71,8 +71,8 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "372"
|
||||
"linux" "373"
|
||||
"windows" "374"
|
||||
"linux" "375"
|
||||
}
|
||||
"s_pTempEntities"
|
||||
{
|
||||
|
||||
@@ -97,6 +97,11 @@
|
||||
"windows" "198"
|
||||
"linux" "199"
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "364"
|
||||
"linux" "365"
|
||||
}
|
||||
}
|
||||
|
||||
"Signatures"
|
||||
|
||||
@@ -18,87 +18,87 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "392"
|
||||
"linux" "393"
|
||||
"mac" "393"
|
||||
"windows" "398"
|
||||
"linux" "399"
|
||||
"mac" "399"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "264"
|
||||
"linux" "265"
|
||||
"mac" "265"
|
||||
"windows" "268"
|
||||
"linux" "269"
|
||||
"mac" "269"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "262"
|
||||
"linux" "263"
|
||||
"mac" "263"
|
||||
"windows" "266"
|
||||
"linux" "267"
|
||||
"mac" "267"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "205"
|
||||
"linux" "206"
|
||||
"mac" "206"
|
||||
"windows" "207"
|
||||
"linux" "208"
|
||||
"mac" "208"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "209"
|
||||
"linux" "210"
|
||||
"mac" "210"
|
||||
"windows" "211"
|
||||
"linux" "212"
|
||||
"mac" "212"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
"windows" "106"
|
||||
"linux" "107"
|
||||
"mac" "107"
|
||||
"windows" "107"
|
||||
"linux" "108"
|
||||
"mac" "108"
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "431"
|
||||
"linux" "431"
|
||||
"mac" "431"
|
||||
"windows" "437"
|
||||
"linux" "437"
|
||||
"mac" "437"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
"windows" "138"
|
||||
"linux" "139"
|
||||
"mac" "139"
|
||||
"windows" "139"
|
||||
"linux" "140"
|
||||
"mac" "140"
|
||||
}
|
||||
"EyeAngles"
|
||||
{
|
||||
"windows" "129"
|
||||
"linux" "130"
|
||||
"mac" "130"
|
||||
"windows" "130"
|
||||
"linux" "131"
|
||||
"mac" "131"
|
||||
}
|
||||
"AcceptInput"
|
||||
{
|
||||
"windows" "35"
|
||||
"linux" "36"
|
||||
"mac" "36"
|
||||
"windows" "36"
|
||||
"linux" "37"
|
||||
"mac" "37"
|
||||
}
|
||||
"SetEntityModel"
|
||||
{
|
||||
"windows" "23"
|
||||
"linux" "24"
|
||||
"mac" "24"
|
||||
"windows" "24"
|
||||
"linux" "25"
|
||||
"mac" "25"
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "255"
|
||||
"linux" "256"
|
||||
"mac" "256"
|
||||
"windows" "259"
|
||||
"linux" "260"
|
||||
"mac" "260"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
"windows" "32"
|
||||
"linux" "33"
|
||||
"mac" "33"
|
||||
"windows" "33"
|
||||
"linux" "34"
|
||||
"mac" "34"
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "410"
|
||||
"linux" "411"
|
||||
"mac" "411"
|
||||
"windows" "416"
|
||||
"linux" "417"
|
||||
"mac" "417"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,33 +7,33 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "506"
|
||||
"linux" "507"
|
||||
"mac" "507"
|
||||
"windows" "507"
|
||||
"linux" "508"
|
||||
"mac" "508"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "288"
|
||||
"linux" "289"
|
||||
"mac" "289"
|
||||
"windows" "289"
|
||||
"linux" "290"
|
||||
"mac" "290"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "286"
|
||||
"linux" "287"
|
||||
"mac" "287"
|
||||
"windows" "287"
|
||||
"linux" "288"
|
||||
"mac" "288"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "221"
|
||||
"linux" "222"
|
||||
"mac" "222"
|
||||
"windows" "222"
|
||||
"linux" "223"
|
||||
"mac" "223"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "224"
|
||||
"linux" "225"
|
||||
"mac" "225"
|
||||
"windows" "225"
|
||||
"linux" "226"
|
||||
"mac" "226"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
@@ -43,9 +43,9 @@
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "474"
|
||||
"linux" "474"
|
||||
"mac" "474"
|
||||
"windows" "475"
|
||||
"linux" "475"
|
||||
"mac" "475"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
@@ -73,9 +73,9 @@
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "279"
|
||||
"linux" "280"
|
||||
"mac" "280"
|
||||
"windows" "280"
|
||||
"linux" "281"
|
||||
"mac" "281"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
@@ -85,9 +85,9 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "452"
|
||||
"linux" "453"
|
||||
"mac" "453"
|
||||
"windows" "453"
|
||||
"linux" "454"
|
||||
"mac" "454"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,25 +11,25 @@
|
||||
|
||||
"Games"
|
||||
{
|
||||
/* No More Room in Hell 1.02 */
|
||||
/* No More Room in Hell 1.05 */
|
||||
"nmrih"
|
||||
{
|
||||
"Offsets"
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "361"
|
||||
"linux" "362"
|
||||
"windows" "362"
|
||||
"linux" "363"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "240"
|
||||
"linux" "241"
|
||||
"windows" "241"
|
||||
"linux" "242"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "238"
|
||||
"linux" "239"
|
||||
"windows" "239"
|
||||
"linux" "240"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
@@ -48,8 +48,8 @@
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "402"
|
||||
"linux" "402"
|
||||
"windows" "403"
|
||||
"linux" "403"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
@@ -73,8 +73,8 @@
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "231"
|
||||
"linux" "232"
|
||||
"windows" "232"
|
||||
"linux" "233"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
@@ -83,8 +83,8 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "381"
|
||||
"linux" "382"
|
||||
"windows" "382"
|
||||
"linux" "383"
|
||||
}
|
||||
|
||||
/* Offset into CBaseTempEntity constructor (vs2010 moved it!) */
|
||||
|
||||
@@ -7,33 +7,33 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "443"
|
||||
"linux" "444"
|
||||
"mac" "444"
|
||||
"windows" "442"
|
||||
"linux" "443"
|
||||
"mac" "443"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "301"
|
||||
"linux" "302"
|
||||
"mac" "302"
|
||||
"windows" "300"
|
||||
"linux" "301"
|
||||
"mac" "301"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "299"
|
||||
"linux" "300"
|
||||
"mac" "300"
|
||||
"windows" "298"
|
||||
"linux" "299"
|
||||
"mac" "299"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "234"
|
||||
"linux" "235"
|
||||
"mac" "235"
|
||||
"windows" "233"
|
||||
"linux" "234"
|
||||
"mac" "234"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "237"
|
||||
"linux" "238"
|
||||
"mac" "238"
|
||||
"windows" "236"
|
||||
"linux" "237"
|
||||
"mac" "237"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
@@ -43,9 +43,9 @@
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "488"
|
||||
"linux" "488"
|
||||
"mac" "488"
|
||||
"windows" "487"
|
||||
"linux" "487"
|
||||
"mac" "487"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
@@ -73,9 +73,9 @@
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "292"
|
||||
"linux" "293"
|
||||
"mac" "293"
|
||||
"windows" "291"
|
||||
"linux" "292"
|
||||
"mac" "292"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
@@ -85,9 +85,9 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "466"
|
||||
"linux" "467"
|
||||
"mac" "467"
|
||||
"windows" "465"
|
||||
"linux" "466"
|
||||
"mac" "466"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,5 +95,16 @@
|
||||
{
|
||||
"GameRulesProxy" "CNuclearDawnRulesProxy"
|
||||
}
|
||||
|
||||
"Signatures"
|
||||
{
|
||||
"FireOutput"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x81\x2A\x2A\x2A\x2A\x2A\x53\x55\x56\x8B\x2A\x2A\x85"
|
||||
"linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
|
||||
"mac" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,28 +19,28 @@
|
||||
/* CBasePlayer */
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "352"
|
||||
"linux" "353"
|
||||
"windows" "354"
|
||||
"linux" "355"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "241"
|
||||
"linux" "242"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "239"
|
||||
"linux" "240"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "237"
|
||||
"linux" "238"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "194"
|
||||
"linux" "195"
|
||||
"windows" "196"
|
||||
"linux" "197"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "198"
|
||||
"linux" "199"
|
||||
"windows" "200"
|
||||
"linux" "201"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
@@ -49,8 +49,8 @@
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "393"
|
||||
"linux" "393"
|
||||
"windows" "395"
|
||||
"linux" "395"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
@@ -74,8 +74,8 @@
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "230"
|
||||
"linux" "231"
|
||||
"windows" "232"
|
||||
"linux" "233"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
@@ -84,8 +84,8 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "372"
|
||||
"linux" "373"
|
||||
"windows" "374"
|
||||
"linux" "375"
|
||||
}
|
||||
"FireOutputBackup"
|
||||
{
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
/* CBasePlayer */
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "355"
|
||||
"linux" "356"
|
||||
"windows" "356"
|
||||
"linux" "357"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
@@ -49,8 +49,8 @@
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "396"
|
||||
"linux" "396"
|
||||
"windows" "397"
|
||||
"linux" "397"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
@@ -84,18 +84,13 @@
|
||||
}
|
||||
"RemoveAllItems"
|
||||
{
|
||||
"windows" "303"
|
||||
"linux" "304"
|
||||
"windows" "304"
|
||||
"linux" "305"
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "375"
|
||||
"linux" "376"
|
||||
}
|
||||
"FireOutputBackup"
|
||||
{
|
||||
"windows" "6"
|
||||
"linux" "10"
|
||||
"windows" "376"
|
||||
"linux" "377"
|
||||
}
|
||||
}
|
||||
"Signatures"
|
||||
|
||||
@@ -18,33 +18,33 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "393"
|
||||
"linux" "394"
|
||||
"mac" "394"
|
||||
"windows" "398"
|
||||
"linux" "399"
|
||||
"mac" "399"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "265"
|
||||
"linux" "266"
|
||||
"mac" "266"
|
||||
"windows" "268"
|
||||
"linux" "269"
|
||||
"mac" "269"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "263"
|
||||
"linux" "264"
|
||||
"mac" "264"
|
||||
"windows" "266"
|
||||
"linux" "267"
|
||||
"mac" "267"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "206"
|
||||
"linux" "207"
|
||||
"mac" "207"
|
||||
"windows" "207"
|
||||
"linux" "208"
|
||||
"mac" "208"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "210"
|
||||
"linux" "211"
|
||||
"mac" "211"
|
||||
"windows" "211"
|
||||
"linux" "212"
|
||||
"mac" "212"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
@@ -54,9 +54,9 @@
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "434"
|
||||
"linux" "434"
|
||||
"mac" "434"
|
||||
"windows" "439"
|
||||
"linux" "439"
|
||||
"mac" "439"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
@@ -84,9 +84,9 @@
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "256"
|
||||
"linux" "257"
|
||||
"mac" "257"
|
||||
"windows" "259"
|
||||
"linux" "260"
|
||||
"mac" "260"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
@@ -96,9 +96,9 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "411"
|
||||
"linux" "412"
|
||||
"mac" "412"
|
||||
"windows" "416"
|
||||
"linux" "417"
|
||||
"mac" "417"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,48 +18,48 @@
|
||||
{
|
||||
"GiveNamedItem"
|
||||
{
|
||||
"windows" "356"
|
||||
"linux" "357"
|
||||
"windows" "358"
|
||||
"linux" "359"
|
||||
}
|
||||
"RemovePlayerItem"
|
||||
{
|
||||
"windows" "243"
|
||||
"linux" "244"
|
||||
"windows" "247"
|
||||
"linux" "248"
|
||||
}
|
||||
"Weapon_GetSlot"
|
||||
{
|
||||
"windows" "238"
|
||||
"linux" "239"
|
||||
"windows" "242"
|
||||
"linux" "243"
|
||||
}
|
||||
"Ignite"
|
||||
{
|
||||
"windows" "195"
|
||||
"linux" "196"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "199"
|
||||
"linux" "200"
|
||||
}
|
||||
"Extinguish"
|
||||
{
|
||||
"windows" "203"
|
||||
"linux" "204"
|
||||
}
|
||||
"Teleport"
|
||||
{
|
||||
"windows" "103"
|
||||
"linux" "104"
|
||||
"windows" "104"
|
||||
"linux" "105"
|
||||
}
|
||||
"CommitSuicide"
|
||||
{
|
||||
"windows" "399"
|
||||
"linux" "399"
|
||||
"windows" "405"
|
||||
"linux" "405"
|
||||
}
|
||||
"GetVelocity"
|
||||
{
|
||||
"windows" "132"
|
||||
"linux" "133"
|
||||
"windows" "133"
|
||||
"linux" "134"
|
||||
}
|
||||
"EyeAngles"
|
||||
{
|
||||
"windows" "124"
|
||||
"linux" "125"
|
||||
"windows" "125"
|
||||
"linux" "126"
|
||||
}
|
||||
"AcceptInput"
|
||||
{
|
||||
@@ -73,8 +73,8 @@
|
||||
}
|
||||
"WeaponEquip"
|
||||
{
|
||||
"windows" "231"
|
||||
"linux" "232"
|
||||
"windows" "235"
|
||||
"linux" "236"
|
||||
}
|
||||
"Activate"
|
||||
{
|
||||
@@ -83,8 +83,8 @@
|
||||
}
|
||||
"PlayerRunCmd"
|
||||
{
|
||||
"windows" "375"
|
||||
"linux" "376"
|
||||
"windows" "377"
|
||||
"linux" "378"
|
||||
}
|
||||
}
|
||||
"Signatures"
|
||||
@@ -92,15 +92,56 @@
|
||||
"FindEntityByClassname"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x53\x55\x56\x8B\xF1\x8B\x2A\x2A\x2A\x57\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\xFF\xD2\x8B\x00\x25\xFF\x0F\x00\x00\x40\xC1\xE0\x2A\x8B\x3C\x30\xEB\x2A\x8B\xBE\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x2A\x2A\x2A\x8B\x2A\x2A\x2A\x2A\x2A\x8D\x2A\x2A\x2A\x2A\x2A\x2A\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x2A\x83\xC4\x2A\xEB\x2A\x39"
|
||||
"windows" "\x55\x8B\xEC\x53\x56\x8B\xF1\x8B\x4D\x2A\x57\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\xFF\xD2\x8B\x00\x25\x2A\x2A\x2A\x2A\x40\xC1\xE0\x2A\x8B\x3C\x30\xEB\x2A\x8B\x2A\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x5D\x2A\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x2A\x2A\x2A\x2A\x2A\x83\xC4\x2A\xEB\x2A\x39"
|
||||
"linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
|
||||
}
|
||||
"FireOutput"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x81\xEC\x2A\x2A\x2A\x2A\x53\x55\x56\x8B\x71\x2A\x57\x89"
|
||||
"windows" "\x55\x8B\xEC\x81\x2A\x2A\x2A\x2A\x2A\x53\x56\x8B\x71\x2A\x57"
|
||||
"linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"zps"
|
||||
{
|
||||
"Offsets"
|
||||
{
|
||||
/* Offset into CBaseTempEntity constructor */
|
||||
"s_pTempEntities"
|
||||
{
|
||||
"windows" "19"
|
||||
}
|
||||
"GetTEName"
|
||||
{
|
||||
"windows" "4"
|
||||
"linux" "4"
|
||||
}
|
||||
"GetTENext"
|
||||
{
|
||||
"windows" "8"
|
||||
"linux" "8"
|
||||
}
|
||||
"TE_GetServerClass"
|
||||
{
|
||||
"windows" "0"
|
||||
"linux" "0"
|
||||
}
|
||||
}
|
||||
|
||||
"Signatures"
|
||||
{
|
||||
"CBaseTempEntity"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x8B\xC1\x8B\x4D\x2A\xC7\x2A\x2A\x2A\x2A\x2A\x89"
|
||||
}
|
||||
"s_pTempEntities"
|
||||
{
|
||||
"library" "server"
|
||||
"linux" "@_ZN15CBaseTempEntity15s_pTempEntitiesE"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
"ClanTagOffset"
|
||||
{
|
||||
"windows" "24"
|
||||
"linux" "42"
|
||||
"linux" "29"
|
||||
"mac" "29"
|
||||
}
|
||||
}
|
||||
@@ -69,21 +69,21 @@
|
||||
"CSWeaponDrop"//Wildcard first 6 bytes for CS:S DM
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x89\x8D\x5C\x2A\x2A\x2A\xC6\x45\x2A\x2A\x8B\x8D\x5C\x2A\x2A\x2A\xE8"
|
||||
"windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x89\x8D\x2A\x2A\x2A\x2A\xC6\x2A\x2A\x00\x8B\x8D\x2A\x2A\x2A\x2A\xE8"
|
||||
"linux" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb"
|
||||
"mac" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb"
|
||||
}
|
||||
"TerminateRound"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x8B\x2A\x2A\x56\x57\x33\xFF\x83"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x24\x53\x8B\x5D\x0C\x56\x57\x33\xFF"
|
||||
"linux" "@_ZN12CCSGameRules14TerminateRoundEfi"
|
||||
"mac" "@_ZN12CCSGameRules14TerminateRoundEfi"
|
||||
}
|
||||
"GetTranslatedWeaponAlias"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x56\x57\x8B\x2A\x2A\x33\xF6\x8D\x2A\x00\x00\x00\x00\x8B\x04\xF5\x2A\x2A\x2A\x2A\x57\x50\xE8\x2A\x2A\x2A\x2A\x83\xC4\x2A\x85\xC0\x74\x2A\x83\xC6\x01\x83\x2A\x1A"
|
||||
"windows" "\x55\x8B\xEC\x56\x57\x8B\x7D\x08\x33\xF6\x8D\x9B\x00\x00\x00\x00\x8B\x04\xF5\x2A\x2A\x2A\x2A\x57\x50\xE8\x2A\x2A\x2A\x2A\x83\xC4\x08\x85\xC0\x74\x2A\x46\x83\xFE\x1A\x72\x2A\x8B\xC7\x5F"
|
||||
"linux" "@_Z24GetTranslatedWeaponAliasPKc"
|
||||
"mac" "@_Z24GetTranslatedWeaponAliasPKc"
|
||||
}
|
||||
|
||||
+18
-18
@@ -18,14 +18,14 @@
|
||||
"Burn"
|
||||
{
|
||||
"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\x8D"
|
||||
"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"
|
||||
}
|
||||
"RemoveDisguise"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x56\x8B\xF1\x8B\x2A\x2A\x2A\x2A\x2A\x57\x8B"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x57\x8B\xF1\x6A\x2A\x8D\x2A\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x84\xC0"
|
||||
"linux" "@_ZN15CTFPlayerShared14RemoveDisguiseEv"
|
||||
"mac" "@_ZN15CTFPlayerShared14RemoveDisguiseEv"
|
||||
}
|
||||
@@ -41,7 +41,7 @@
|
||||
"library" "server"
|
||||
"linux" "@_ZN13CTFWeaponBase26CalcIsAttackCriticalHelperEv"
|
||||
"mac" "@_ZN13CTFWeaponBase26CalcIsAttackCriticalHelperEv"
|
||||
"windows" "\x53\x8B\xDC\x83\xEC\x08\x83\xE4\x2A\x83\xC4\x2A\x55\x8B\x6B\x2A\x89\x6C\x24\x2A\x8B\xEC\x83\xEC\x2A\x56\x57\x6A\x00"
|
||||
"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"
|
||||
{
|
||||
@@ -60,28 +60,28 @@
|
||||
"Regenerate"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\xF3\x0F\x10\x05\x2A\x2A\x2A\x2A\x53\x56\x8B\xF1\x8B\x86"
|
||||
"linux" "@_ZN9CTFPlayer10RegenerateEv"
|
||||
"mac" "@_ZN9CTFPlayer10RegenerateEv"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\xF3\x0F\x2A\x2A\x2A\x2A\x2A\x2A\x53\x56\x8B\xF1\x8B"
|
||||
"linux" "@_ZN9CTFPlayer10RegenerateEb"
|
||||
"mac" "@_ZN9CTFPlayer10RegenerateEb"
|
||||
}
|
||||
"AddCondition"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x57\x8B\x7D\x2A\x83\xFF\x2A\x8B\xF1\x7C\x2A\x8D\x47\x2A\x8D\x9E\x2A\x2A\x2A\x2A\x89\x45\x2A\xEB\x2A\x8D\x9E\x2A\x2A\x2A\x2A\x89\x7D\x2A\x8B\x8E\x2A\x2A\x2A\x2A\xD9"
|
||||
"linux" "@_ZN15CTFPlayerShared7AddCondE7ETFCondf"
|
||||
"mac" "@_ZN15CTFPlayerShared7AddCondE7ETFCondf"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x57\x8B\x7D\x2A\x8B\xF1\x83\xFF\x2A\x7C\x2A\x8D\x2A\x2A\x8D\x2A\x2A\x2A\x2A\x2A\x89\x2A\x2A\xEB\x2A\x83\xFF\x2A\x7C"
|
||||
"linux" "@_ZN15CTFPlayerShared7AddCondE7ETFCondfP11CBaseEntity"
|
||||
"mac" "@_ZN15CTFPlayerShared7AddCondE7ETFCondfP11CBaseEntity"
|
||||
}
|
||||
"RemoveCondition"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x57\x8B\x7D\x2A\x83\xFF\x2A\x8B\xF1\x7C\x2A\x8D\x47\x2A\x8D\x9E\x2A\x2A\x2A\x2A\x89\x45\x2A\xEB\x2A\x8D\x9E\x2A\x2A\x2A\x2A\x89\x7D\x2A\x8B\x4D"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x8B\x75\x2A\x57\x8B\xF9\x83"
|
||||
"linux" "@_ZN15CTFPlayerShared10RemoveCondE7ETFCondb"
|
||||
"mac" "@_ZN15CTFPlayerShared10RemoveCondE7ETFCondb"
|
||||
}
|
||||
"SetPowerplayEnabled"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x80\x7D\x2A\x2A\x56\x8B\xF1\x74\x2A\x57\x8D\x45"
|
||||
"windows" "\x55\x8B\xEC\x80\x2A\x2A\x2A\x56\x57\x8B\xF1\x74\x2A\x80\x2A\x2A\x2A\x2A\x2A\x2A\x74"
|
||||
"linux" "@_ZN9CTFPlayer19SetPowerplayEnabledEb"
|
||||
"mac" "@_ZN9CTFPlayer19SetPowerplayEnabledEb"
|
||||
}
|
||||
@@ -95,7 +95,7 @@
|
||||
"StunPlayer"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\x55\x8B\xEC\x51\xD9\x05\x2A\x2A\x2A\x2A\x56\x57\x83\xEC\x14"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x56\x8B\xF1\x8B\x86\x2A\x2A\x2A\x2A\x40\x3D\x2A\x2A\x2A\x2A\x0F"
|
||||
"linux" "@_ZN15CTFPlayerShared10StunPlayerEffiP9CTFPlayer"
|
||||
"mac" "@_ZN15CTFPlayerShared10StunPlayerEffiP9CTFPlayer"
|
||||
}
|
||||
@@ -109,9 +109,9 @@
|
||||
"MakeBleed"
|
||||
{
|
||||
"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\x6A\x19"
|
||||
"linux" "@_ZN15CTFPlayerShared9MakeBleedEP9CTFPlayerP13CTFWeaponBasef"
|
||||
"mac" "@_ZN15CTFPlayerShared9MakeBleedEP9CTFPlayerP13CTFWeaponBasef"
|
||||
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x57\x8B\xF9\x8B\x8F\x2A\x2A\x2A\x2A\x8B\x01\x8B"
|
||||
"linux" "@_ZN15CTFPlayerShared9MakeBleedEP9CTFPlayerP13CTFWeaponBasefi"
|
||||
"mac" "@_ZN15CTFPlayerShared9MakeBleedEP9CTFPlayerP13CTFWeaponBasefi"
|
||||
}
|
||||
"IsPlayerInDuel"
|
||||
{
|
||||
@@ -125,9 +125,9 @@
|
||||
{
|
||||
"ForceRespawn"
|
||||
{
|
||||
"windows" "320"
|
||||
"linux" "321"
|
||||
"mac" "321"
|
||||
"windows" "323"
|
||||
"linux" "324"
|
||||
"mac" "324"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,6 +77,11 @@
|
||||
#define FILENAME_1_6_BGT "sourcemod.2.bgt" PLATFORM_EXT
|
||||
#define FILENAME_1_6_EYE "sourcemod.2.eye" PLATFORM_EXT
|
||||
|
||||
// Shim for compatibility with MM:S 1.9.0+
|
||||
#ifndef SOURCE_ENGINE_CSS
|
||||
#define SOURCE_ENGINE_CSS 13
|
||||
#endif
|
||||
|
||||
HINSTANCE g_hCore = NULL;
|
||||
bool load_attempted = false;
|
||||
|
||||
@@ -257,6 +262,11 @@ DLL_EXPORT METAMOD_PLUGIN *CreateInterface_MMS(const MetamodVersionInfo *mvi, co
|
||||
filename = FILENAME_1_6_EYE;
|
||||
break;
|
||||
}
|
||||
case SOURCE_ENGINE_CSS:
|
||||
{
|
||||
filename = FILENAME_1_6_EP2VALVE;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
return NULL;
|
||||
|
||||
@@ -506,7 +506,7 @@ stock bool:VoteMenuToAll(Handle:menu, time, flags=0)
|
||||
|
||||
for (new i=1; i<=MaxClients; i++)
|
||||
{
|
||||
if (!IsClientInGame(i))
|
||||
if (!IsClientInGame(i) || IsFakeClient(i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -66,6 +66,9 @@ enum RoundState {
|
||||
|
||||
//Game is over, doing bonus round stuff
|
||||
RoundState_Bonus,
|
||||
|
||||
//Between rounds
|
||||
RoundState_BetweenRounds,
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
+14
-1
@@ -109,6 +109,7 @@ enum TFCond
|
||||
TFCond_NoHealingDamageBuff,
|
||||
TFCond_SpeedBuffAlly,
|
||||
TFCond_HalloweenCritCandy,
|
||||
TFCond_CritCanteen,
|
||||
|
||||
TFCond_CritHype = 36,
|
||||
TFCond_CritOnFirstBlood,
|
||||
@@ -117,8 +118,18 @@ enum TFCond
|
||||
TFCond_CritOnKill,
|
||||
TFCond_RestrictToMelee,
|
||||
|
||||
TFCond_CritMmmph = 44,
|
||||
TFCond_Reprogrammed = 43,
|
||||
TFCond_CritMmmph,
|
||||
TFCond_DefenseBuffMmmph,
|
||||
TFCond_FocusBuff,
|
||||
TFCond_DisguiseRemoved,
|
||||
TFCond_MarkedForDeathSilent,
|
||||
TFCond_DisguisedAsDispenser,
|
||||
TFCond_Sapped,
|
||||
TFCond_UberchargedHidden,
|
||||
TFCond_UberchargedCanteen,
|
||||
TFCond_HalloweenBombHead,
|
||||
TFCond_HalloweenThriller,
|
||||
};
|
||||
|
||||
enum TFHoliday
|
||||
@@ -126,9 +137,11 @@ enum TFHoliday
|
||||
TFHoliday_Birthday = 1,
|
||||
TFHoliday_Halloween,
|
||||
TFHoliday_Christmas,
|
||||
TFHoliday_ValentinesDay,
|
||||
TFHoliday_MeetThePyro,
|
||||
TFHoliday_FullMoon,
|
||||
TFHoliday_HalloweenOrFullMoon,
|
||||
TFHoliday_HalloweenOrFullMoonOrValentines,
|
||||
};
|
||||
|
||||
enum TFObjectType
|
||||
|
||||
@@ -133,6 +133,11 @@ enum {
|
||||
TF_CUSTOM_PRACTICE_STICKY,
|
||||
TF_CUSTOM_EYEBALL_ROCKET,
|
||||
TF_CUSTOM_HEADSHOT_DECAPITATION,
|
||||
TF_CUSTOM_TAUNT_ARMAGEDDON,
|
||||
TF_CUSTOM_FLARE_PELLET,
|
||||
TF_CUSTOM_CLEAVER,
|
||||
TF_CUSTOM_CLEAVER_CRIT,
|
||||
TF_CUSTOM_SAPPER_RECORDER_DEATH,
|
||||
};
|
||||
|
||||
// Weapon codes as used in some events, such as player_death
|
||||
@@ -224,6 +229,9 @@ enum {
|
||||
TF_WEAPON_GRENADE_ORNAMENT,
|
||||
TF_WEAPON_RAYGUN_REVENGE,
|
||||
TF_WEAPON_PEP_BRAWLER_BLASTER,
|
||||
TF_WEAPON_CLEAVER,
|
||||
TF_WEAPON_GRENADE_CLEAVER,
|
||||
TF_WEAPON_ROCKETPACK,
|
||||
};
|
||||
|
||||
// TF2 Weapon Slots for GetPlayerWeaponSlot
|
||||
|
||||
@@ -37,6 +37,6 @@
|
||||
|
||||
#define SOURCEMOD_V_MAJOR 1 /**< SourceMod Major version */
|
||||
#define SOURCEMOD_V_MINOR 4 /**< SourceMod Minor version */
|
||||
#define SOURCEMOD_V_RELEASE 4 /**< SourceMod Release version */
|
||||
#define SOURCEMOD_V_RELEASE 7 /**< SourceMod Release version */
|
||||
|
||||
#define SOURCEMOD_VERSION "1.4.4" /**< SourceMod version string (major.minor.release.build) */
|
||||
#define SOURCEMOD_VERSION "1.4.7" /**< SourceMod version string (major.minor.release.build) */
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
1.4.4
|
||||
1.4.7
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
/** SourcePawn Engine API Version */
|
||||
#define SOURCEPAWN_ENGINE_API_VERSION 4
|
||||
#define SOURCEPAWN_ENGINE2_API_VERSION 3
|
||||
#define SOURCEPAWN_ENGINE2_API_VERSION 4
|
||||
|
||||
#if !defined SOURCEMOD_BUILD
|
||||
#define SOURCEMOD_BUILD
|
||||
@@ -479,6 +479,20 @@ namespace SourcePawn
|
||||
* @return Memory usage, in bytes.
|
||||
*/
|
||||
virtual size_t GetMemUsage() =0;
|
||||
|
||||
/**
|
||||
* @brief Returns the MD5 hash of the plugin's P-Code.
|
||||
*
|
||||
* @return 16-byte buffer with MD5 hash of the plugin's P-Code.
|
||||
*/
|
||||
virtual unsigned char *GetCodeHash() =0;
|
||||
|
||||
/**
|
||||
* @brief Returns the MD5 hash of the plugin's Data.
|
||||
*
|
||||
* @return 16-byte buffer with MD5 hash of the plugin's Data.
|
||||
*/
|
||||
virtual unsigned char *GetDataHash() =0;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
+3
-1
@@ -34,7 +34,7 @@ On The Patty Winters Show this morning were descendants of members of the Donner
|
||||
Everything outside of this is like a movie I once saw.
|
||||
THIS IS NOT AN EXIT.
|
||||
ABANDON ALL HOPE YE WHO ENTER HERE.
|
||||
egg!
|
||||
egg!!
|
||||
blimey
|
||||
crab
|
||||
jibbly jibbly jibbly
|
||||
@@ -51,3 +51,5 @@ clobstermonkey
|
||||
that thing
|
||||
clobber build because amx.h changed (sigh)
|
||||
a dead fish
|
||||
BuildBot is very well-written, stable, enterprise software.
|
||||
I'm on a plane.
|
||||
@@ -36,6 +36,7 @@ binary.AddSourceFiles('sourcepawn/jit', [
|
||||
'zlib/trees.c',
|
||||
'zlib/uncompr.c',
|
||||
'zlib/zutil.c',
|
||||
'md5/md5.cpp',
|
||||
'../../knight/shared/KeCodeAllocator.cpp'
|
||||
])
|
||||
SM.AutoVersion('sourcepawn/jit', binary)
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include "sp_vm_basecontext.h"
|
||||
#include "engine2.h"
|
||||
|
||||
#include "md5/md5.h"
|
||||
|
||||
using namespace SourcePawn;
|
||||
|
||||
BaseRuntime::BaseRuntime() : m_Debug(&m_plugin), m_pPlugin(&m_plugin), m_pCtx(NULL),
|
||||
@@ -18,6 +20,9 @@ m_PubFuncs(NULL), m_PubJitFuncs(NULL), m_pCo(NULL), m_CompSerial(0)
|
||||
m_FuncCache = NULL;
|
||||
m_MaxFuncs = 0;
|
||||
m_NumFuncs = 0;
|
||||
|
||||
memset(m_CodeHash, 0, sizeof(m_CodeHash));
|
||||
memset(m_DataHash, 0, sizeof(m_DataHash));
|
||||
}
|
||||
|
||||
BaseRuntime::~BaseRuntime()
|
||||
@@ -214,7 +219,11 @@ int BaseRuntime::CreateFromMemory(sp_file_hdr_t *hdr, uint8_t *base)
|
||||
return SP_ERROR_FILE_FORMAT;
|
||||
}
|
||||
|
||||
if ((plugin->flags & SP_FLAG_DEBUG) && (!(plugin->debug.files) || !(plugin->debug.lines) || !(plugin->debug.symbols)))
|
||||
if ((plugin->flags & SP_FLAG_DEBUG) && (
|
||||
!(plugin->debug.files) ||
|
||||
!(plugin->debug.lines) ||
|
||||
!(plugin->debug.symbols) ||
|
||||
!(plugin->debug.stringbase) ))
|
||||
{
|
||||
return SP_ERROR_FILE_FORMAT;
|
||||
}
|
||||
@@ -227,6 +236,16 @@ int BaseRuntime::CreateFromMemory(sp_file_hdr_t *hdr, uint8_t *base)
|
||||
memset(m_PubJitFuncs, 0, sizeof(JitFunction *) * m_pPlugin->num_publics);
|
||||
}
|
||||
|
||||
MD5 md5_pcode;
|
||||
md5_pcode.update(plugin->pcode, plugin->pcode_size);
|
||||
md5_pcode.finalize();
|
||||
md5_pcode.raw_digest(m_CodeHash);
|
||||
|
||||
MD5 md5_data;
|
||||
md5_data.update(plugin->data, plugin->data_size);
|
||||
md5_data.finalize();
|
||||
md5_data.raw_digest(m_DataHash);
|
||||
|
||||
m_pPlugin->profiler = g_engine2.GetProfiler();
|
||||
m_pCtx = new BaseContext(this);
|
||||
m_pCo = g_Jit.StartCompilation(this);
|
||||
@@ -483,6 +502,16 @@ size_t BaseRuntime::GetMemUsage()
|
||||
return mem;
|
||||
}
|
||||
|
||||
unsigned char *BaseRuntime::GetCodeHash()
|
||||
{
|
||||
return m_CodeHash;
|
||||
}
|
||||
|
||||
unsigned char *BaseRuntime::GetDataHash()
|
||||
{
|
||||
return m_DataHash;
|
||||
}
|
||||
|
||||
BaseContext *BaseRuntime::GetBaseContext()
|
||||
{
|
||||
return m_pCtx;
|
||||
|
||||
@@ -48,6 +48,8 @@ public:
|
||||
virtual void SetPauseState(bool paused);
|
||||
virtual bool IsPaused();
|
||||
virtual size_t GetMemUsage();
|
||||
virtual unsigned char *GetCodeHash();
|
||||
virtual unsigned char *GetDataHash();
|
||||
JitFunction *GetJittedFunction(uint32_t idx);
|
||||
uint32_t AddJittedFunction(JitFunction *fn);
|
||||
public:
|
||||
@@ -65,6 +67,9 @@ public:
|
||||
JitFunction **m_PubJitFuncs;
|
||||
ICompilation *m_pCo;
|
||||
unsigned int m_CompSerial;
|
||||
|
||||
unsigned char m_CodeHash[16];
|
||||
unsigned char m_DataHash[16];
|
||||
};
|
||||
|
||||
#endif //_INCLUDE_SOURCEPAWN_JIT_RUNTIME_H_
|
||||
|
||||
@@ -0,0 +1,476 @@
|
||||
// MD5.CC - source code for the C++/object oriented translation and
|
||||
// modification of MD5.
|
||||
|
||||
// Translation and modification (c) 1995 by Mordechai T. Abzug
|
||||
|
||||
// This translation/ modification is provided "as is," without express or
|
||||
// implied warranty of any kind.
|
||||
|
||||
// The translator/ modifier does not claim (1) that MD5 will do what you think
|
||||
// it does; (2) that this translation/ modification is accurate; or (3) that
|
||||
// this software is "merchantible." (Language for this disclaimer partially
|
||||
// copied from the disclaimer below).
|
||||
|
||||
/* based on:
|
||||
|
||||
MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
|
||||
MDDRIVER.C - test driver for MD2, MD4 and MD5
|
||||
|
||||
|
||||
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
||||
rights reserved.
|
||||
|
||||
License to copy and use this software is granted provided that it
|
||||
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
|
||||
Algorithm" in all material mentioning or referencing this software
|
||||
or this function.
|
||||
|
||||
License is also granted to make and use derivative works provided
|
||||
that such works are identified as "derived from the RSA Data
|
||||
Security, Inc. MD5 Message-Digest Algorithm" in all material
|
||||
mentioning or referencing the derived work.
|
||||
|
||||
RSA Data Security, Inc. makes no representations concerning either
|
||||
the merchantability of this software or the suitability of this
|
||||
software for any particular purpose. It is provided "as is"
|
||||
without express or implied warranty of any kind.
|
||||
|
||||
These notices must be retained in any copies of any part of this
|
||||
documentation and/or software.
|
||||
|
||||
*/
|
||||
|
||||
#include "md5.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
// MD5 simple initialization method
|
||||
|
||||
MD5::MD5(){
|
||||
|
||||
init();
|
||||
|
||||
}
|
||||
|
||||
|
||||
// MD5 block update operation. Continues an MD5 message-digest
|
||||
// operation, processing another message block, and updating the
|
||||
// context.
|
||||
|
||||
void MD5::update (uint1 *input, uint4 input_length) {
|
||||
|
||||
uint4 input_index, buffer_index;
|
||||
uint4 buffer_space; // how much space is left in buffer
|
||||
|
||||
if (finalized){ // so we can't update!
|
||||
/*cerr << "MD5::update: Can't update a finalized digest!" << endl;*/
|
||||
return;
|
||||
}
|
||||
|
||||
// Compute number of bytes mod 64
|
||||
buffer_index = (unsigned int)((count[0] >> 3) & 0x3F);
|
||||
|
||||
// Update number of bits
|
||||
if ( (count[0] += ((uint4) input_length << 3))<((uint4) input_length << 3) )
|
||||
count[1]++;
|
||||
|
||||
count[1] += ((uint4)input_length >> 29);
|
||||
|
||||
|
||||
buffer_space = 64 - buffer_index; // how much space is left in buffer
|
||||
|
||||
// Transform as many times as possible.
|
||||
if (input_length >= buffer_space) { // ie. we have enough to fill the buffer
|
||||
// fill the rest of the buffer and transform
|
||||
memcpy (buffer + buffer_index, input, buffer_space);
|
||||
transform (buffer);
|
||||
|
||||
// now, transform each 64-byte piece of the input, bypassing the buffer
|
||||
for (input_index = buffer_space; input_index + 63 < input_length;
|
||||
input_index += 64)
|
||||
transform (input+input_index);
|
||||
|
||||
buffer_index = 0; // so we can buffer remaining
|
||||
}
|
||||
else
|
||||
input_index=0; // so we can buffer the whole input
|
||||
|
||||
|
||||
// and here we do the buffering:
|
||||
memcpy(buffer+buffer_index, input+input_index, input_length-input_index);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// MD5 update for files.
|
||||
// Like above, except that it works on files (and uses above as a primitive.)
|
||||
|
||||
void MD5::update(FILE *file){
|
||||
|
||||
unsigned char buffer[1024];
|
||||
int len;
|
||||
|
||||
while ((len=fread(buffer, 1, 1024, file)))
|
||||
update(buffer, len);
|
||||
|
||||
fclose (file);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// MD5 finalization. Ends an MD5 message-digest operation, writing the
|
||||
// the message digest and zeroizing the context.
|
||||
|
||||
|
||||
void MD5::finalize (){
|
||||
|
||||
unsigned char bits[8];
|
||||
unsigned int index, padLen;
|
||||
static uint1 PADDING[64]={
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
if (finalized){
|
||||
/* cerr << "MD5::finalize: Already finalized this digest!" << endl;*/
|
||||
return;
|
||||
}
|
||||
|
||||
// Save number of bits
|
||||
encode (bits, count, 8);
|
||||
|
||||
// Pad out to 56 mod 64.
|
||||
index = (uint4) ((count[0] >> 3) & 0x3f);
|
||||
padLen = (index < 56) ? (56 - index) : (120 - index);
|
||||
update (PADDING, padLen);
|
||||
|
||||
// Append length (before padding)
|
||||
update (bits, 8);
|
||||
|
||||
// Store state in digest
|
||||
encode (digest, state, 16);
|
||||
|
||||
// Zeroize sensitive information
|
||||
memset (buffer, 0, sizeof(*buffer));
|
||||
|
||||
finalized=1;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
MD5::MD5(FILE *file){
|
||||
|
||||
init(); // must be called be all constructors
|
||||
update(file);
|
||||
finalize ();
|
||||
}
|
||||
|
||||
unsigned char *MD5::raw_digest(){
|
||||
|
||||
uint1 *s = new uint1[16];
|
||||
|
||||
if (!finalized){
|
||||
/* cerr << "MD5::raw_digest: Can't get digest if you haven't "<<
|
||||
"finalized the digest!" <<endl;*/
|
||||
return ( (unsigned char*) "");
|
||||
}
|
||||
|
||||
memcpy(s, digest, 16);
|
||||
return s;
|
||||
}
|
||||
|
||||
unsigned char *MD5::raw_digest(unsigned char buffer[16])
|
||||
{
|
||||
if (!finalized)
|
||||
{
|
||||
return ( (unsigned char*) "");
|
||||
}
|
||||
|
||||
memcpy(buffer, digest, 16);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char *MD5::hex_digest(){
|
||||
|
||||
int i;
|
||||
char *s= new char[33];
|
||||
|
||||
assert(finalized);
|
||||
|
||||
for (i=0; i<16; i++)
|
||||
sprintf(s+i*2, "%02x", digest[i]);
|
||||
|
||||
s[32]='\0';
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
char *MD5::hex_digest(char buffer[33]){
|
||||
|
||||
int i;
|
||||
|
||||
assert(finalized);
|
||||
|
||||
for (i=0; i<16; i++)
|
||||
sprintf(buffer+i*2, "%02x", digest[i]);
|
||||
|
||||
buffer[32]='\0';
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
// PRIVATE METHODS:
|
||||
|
||||
|
||||
|
||||
void MD5::init(){
|
||||
finalized=0; // we just started!
|
||||
|
||||
// Nothing counted, so count=0
|
||||
count[0] = 0;
|
||||
count[1] = 0;
|
||||
|
||||
// Load magic initialization constants.
|
||||
state[0] = 0x67452301;
|
||||
state[1] = 0xefcdab89;
|
||||
state[2] = 0x98badcfe;
|
||||
state[3] = 0x10325476;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Constants for MD5Transform routine.
|
||||
// Although we could use C++ style constants, defines are actually better,
|
||||
// since they let us easily evade scope clashes.
|
||||
|
||||
#define S11 7
|
||||
#define S12 12
|
||||
#define S13 17
|
||||
#define S14 22
|
||||
#define S21 5
|
||||
#define S22 9
|
||||
#define S23 14
|
||||
#define S24 20
|
||||
#define S31 4
|
||||
#define S32 11
|
||||
#define S33 16
|
||||
#define S34 23
|
||||
#define S41 6
|
||||
#define S42 10
|
||||
#define S43 15
|
||||
#define S44 21
|
||||
|
||||
|
||||
|
||||
|
||||
// MD5 basic transformation. Transforms state based on block.
|
||||
void MD5::transform (uint1 block[64]){
|
||||
|
||||
uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
|
||||
|
||||
decode (x, block, 64);
|
||||
|
||||
assert(!finalized); // not just a user error, since the method is private
|
||||
|
||||
/* Round 1 */
|
||||
FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
|
||||
FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
|
||||
FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
|
||||
FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
|
||||
FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
|
||||
FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
|
||||
FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
|
||||
FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
|
||||
FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
|
||||
FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
|
||||
FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
|
||||
FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
|
||||
FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
|
||||
FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
|
||||
FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
|
||||
FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
|
||||
|
||||
/* Round 2 */
|
||||
GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
|
||||
GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
|
||||
GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
|
||||
GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
|
||||
GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
|
||||
GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
|
||||
GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
|
||||
GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
|
||||
GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
|
||||
GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
|
||||
GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
|
||||
GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
|
||||
GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
|
||||
GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
|
||||
GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
|
||||
GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
|
||||
|
||||
/* Round 3 */
|
||||
HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
|
||||
HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
|
||||
HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
|
||||
HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
|
||||
HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
|
||||
HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
|
||||
HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
|
||||
HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
|
||||
HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
|
||||
HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
|
||||
HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
|
||||
HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
|
||||
HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
|
||||
HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
|
||||
HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
|
||||
HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
|
||||
|
||||
/* Round 4 */
|
||||
II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
|
||||
II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
|
||||
II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
|
||||
II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
|
||||
II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
|
||||
II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
|
||||
II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
|
||||
II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
|
||||
II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
|
||||
II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
|
||||
II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
|
||||
II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
|
||||
II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
|
||||
II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
|
||||
II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
|
||||
II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
|
||||
|
||||
state[0] += a;
|
||||
state[1] += b;
|
||||
state[2] += c;
|
||||
state[3] += d;
|
||||
|
||||
// Zeroize sensitive information.
|
||||
memset ( (uint1 *) x, 0, sizeof(x));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Encodes input (UINT4) into output (unsigned char). Assumes len is
|
||||
// a multiple of 4.
|
||||
void MD5::encode (uint1 *output, uint4 *input, uint4 len) {
|
||||
|
||||
unsigned int i, j;
|
||||
|
||||
for (i = 0, j = 0; j < len; i++, j += 4) {
|
||||
output[j] = (uint1) (input[i] & 0xff);
|
||||
output[j+1] = (uint1) ((input[i] >> 8) & 0xff);
|
||||
output[j+2] = (uint1) ((input[i] >> 16) & 0xff);
|
||||
output[j+3] = (uint1) ((input[i] >> 24) & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Decodes input (unsigned char) into output (UINT4). Assumes len is
|
||||
// a multiple of 4.
|
||||
void MD5::decode (uint4 *output, uint1 *input, uint4 len){
|
||||
|
||||
unsigned int i, j;
|
||||
|
||||
for (i = 0, j = 0; j < len; i++, j += 4)
|
||||
output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) |
|
||||
(((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Note: Replace "for loop" with standard memcpy if possible.
|
||||
void MD5::memcpy (uint1 *output, uint1 *input, uint4 len){
|
||||
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
output[i] = input[i];
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Note: Replace "for loop" with standard memset if possible.
|
||||
void MD5::memset (uint1 *output, uint1 value, uint4 len){
|
||||
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
output[i] = value;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ROTATE_LEFT rotates x left n bits.
|
||||
|
||||
inline unsigned int MD5::rotate_left (uint4 x, uint4 n){
|
||||
return (x << n) | (x >> (32-n)) ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// F, G, H and I are basic MD5 functions.
|
||||
|
||||
inline unsigned int MD5::F (uint4 x, uint4 y, uint4 z){
|
||||
return (x & y) | (~x & z);
|
||||
}
|
||||
|
||||
inline unsigned int MD5::G (uint4 x, uint4 y, uint4 z){
|
||||
return (x & z) | (y & ~z);
|
||||
}
|
||||
|
||||
inline unsigned int MD5::H (uint4 x, uint4 y, uint4 z){
|
||||
return x ^ y ^ z;
|
||||
}
|
||||
|
||||
inline unsigned int MD5::I (uint4 x, uint4 y, uint4 z){
|
||||
return y ^ (x | ~z);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
|
||||
// Rotation is separate from addition to prevent recomputation.
|
||||
|
||||
|
||||
inline void MD5::FF(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||
uint4 s, uint4 ac){
|
||||
a += F(b, c, d) + x + ac;
|
||||
a = rotate_left (a, s) +b;
|
||||
}
|
||||
|
||||
inline void MD5::GG(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||
uint4 s, uint4 ac){
|
||||
a += G(b, c, d) + x + ac;
|
||||
a = rotate_left (a, s) +b;
|
||||
}
|
||||
|
||||
inline void MD5::HH(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||
uint4 s, uint4 ac){
|
||||
a += H(b, c, d) + x + ac;
|
||||
a = rotate_left (a, s) +b;
|
||||
}
|
||||
|
||||
inline void MD5::II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||
uint4 s, uint4 ac){
|
||||
a += I(b, c, d) + x + ac;
|
||||
a = rotate_left (a, s) +b;
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
// MD5.CC - source code for the C++/object oriented translation and
|
||||
// modification of MD5.
|
||||
|
||||
// Translation and modification (c) 1995 by Mordechai T. Abzug
|
||||
|
||||
// This translation/ modification is provided "as is," without express or
|
||||
// implied warranty of any kind.
|
||||
|
||||
// The translator/ modifier does not claim (1) that MD5 will do what you think
|
||||
// it does; (2) that this translation/ modification is accurate; or (3) that
|
||||
// this software is "merchantible." (Language for this disclaimer partially
|
||||
// copied from the disclaimer below).
|
||||
|
||||
/* based on:
|
||||
|
||||
MD5.H - header file for MD5C.C
|
||||
MDDRIVER.C - test driver for MD2, MD4 and MD5
|
||||
|
||||
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
||||
rights reserved.
|
||||
|
||||
License to copy and use this software is granted provided that it
|
||||
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
|
||||
Algorithm" in all material mentioning or referencing this software
|
||||
or this function.
|
||||
|
||||
License is also granted to make and use derivative works provided
|
||||
that such works are identified as "derived from the RSA Data
|
||||
Security, Inc. MD5 Message-Digest Algorithm" in all material
|
||||
mentioning or referencing the derived work.
|
||||
|
||||
RSA Data Security, Inc. makes no representations concerning either
|
||||
the merchantability of this software or the suitability of this
|
||||
software for any particular purpose. It is provided "as is"
|
||||
without express or implied warranty of any kind.
|
||||
|
||||
These notices must be retained in any copies of any part of this
|
||||
documentation and/or software.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
//#include <fstream.h>
|
||||
//#include <iostream.h>
|
||||
|
||||
class MD5 {
|
||||
|
||||
public:
|
||||
// methods for controlled operation:
|
||||
MD5 (); // simple initializer
|
||||
void update (unsigned char *input, unsigned int input_length);
|
||||
void update (FILE *file);
|
||||
void finalize ();
|
||||
|
||||
// constructors for special circumstances. All these constructors finalize
|
||||
// the MD5 context.
|
||||
MD5 (unsigned char *string); // digest string, finalize
|
||||
MD5 (FILE *file); // digest file, close, finalize
|
||||
|
||||
// methods to acquire finalized result
|
||||
unsigned char *raw_digest (); // digest as a 16-byte binary array
|
||||
unsigned char *raw_digest(unsigned char buffer[16]);
|
||||
char * hex_digest (); // digest as a 33-byte ascii-hex string
|
||||
char * hex_digest (char buffer[33]); //same as above, passing buffer
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
// first, some types:
|
||||
typedef unsigned int uint4; // assumes integer is 4 words long
|
||||
typedef unsigned short int uint2; // assumes short integer is 2 words long
|
||||
typedef unsigned char uint1; // assumes char is 1 word long
|
||||
|
||||
// next, the private data:
|
||||
uint4 state[4];
|
||||
uint4 count[2]; // number of *bits*, mod 2^64
|
||||
uint1 buffer[64]; // input buffer
|
||||
uint1 digest[16];
|
||||
uint1 finalized;
|
||||
|
||||
// last, the private methods, mostly static:
|
||||
void init (); // called by all constructors
|
||||
void transform (uint1 *buffer); // does the real update work. Note
|
||||
// that length is implied to be 64.
|
||||
|
||||
static void encode (uint1 *dest, uint4 *src, uint4 length);
|
||||
static void decode (uint4 *dest, uint1 *src, uint4 length);
|
||||
static void memcpy (uint1 *dest, uint1 *src, uint4 length);
|
||||
static void memset (uint1 *start, uint1 val, uint4 length);
|
||||
|
||||
static inline uint4 rotate_left (uint4 x, uint4 n);
|
||||
static inline uint4 F (uint4 x, uint4 y, uint4 z);
|
||||
static inline uint4 G (uint4 x, uint4 y, uint4 z);
|
||||
static inline uint4 H (uint4 x, uint4 y, uint4 z);
|
||||
static inline uint4 I (uint4 x, uint4 y, uint4 z);
|
||||
static inline void FF (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||
uint4 s, uint4 ac);
|
||||
static inline void GG (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||
uint4 s, uint4 ac);
|
||||
static inline void HH (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||
uint4 s, uint4 ac);
|
||||
static inline void II (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||
uint4 s, uint4 ac);
|
||||
|
||||
};
|
||||
Reference in New Issue
Block a user