Compare commits

...
Author SHA1 Message Date
Nicholas Hastings f008349cbc Updated versioning for 1.4.7 release. 2013-02-06 20:40:45 -05:00
Nicholas Hastings c978f8620e Updated changelog. 2013-02-06 20:39:27 -05:00
Nicholas Hastings ec9a4ab9c5 Updated more CS:S gamedata. 2013-02-06 17:43:02 -05:00
Nicholas Hastings de40e8990f Updated core to compile for new ep2v lib names (bug 5524). 2013-02-05 23:32:56 -05:00
Nicholas Hastings ae07dc524d Updated CS:S gamedata. 2013-02-05 17:20:00 -05:00
Nicholas Hastings 31426fb8d0 Fixed VARINT & UNSIGNED flags being read from dt instead of member in SendProp arrays (bug 5591, r=prodigysim). 2013-02-04 07:42:38 -05:00
Michael Busby f538a51ef4 Fix GameRules_SetPropVector writing data to unexpected addresses instead of to the proxy entity (bug 5592, r=psychonic). 2013-01-27 14:59:14 -08:00
Nicholas Hastings 55ee8af1e6 Updated more TF2 gamedata. 2012-12-20 18:24:47 -05:00
Nicholas Hastings 85ed2e01a4 Updated TF2 gamedata. 2012-12-19 07:55:03 -05:00
Peace-Maker 9eddf38b92 Fixed Sort_Random not including first value in array sorting functions (bug 4292, r=psychonic). 2013-01-23 12:51:19 -05:00
Nicholas Hastings 4ca976f883 Fixed gamedata offsets for CSPromod, GESource, and Synergy. 2013-01-06 09:35:22 -05:00
Nicholas Hastings ba9db46290 Updated gamedata offsets for CSPromod, GESource, and Synergy. 2012-12-31 18:15:25 -05:00
Nicholas Hastings b58fe300ba Removed SE_CSS references that snuck in with merge from central. 2012-12-20 18:42:15 -05:00
Nicholas Hastings 4eb3754afc Added support for new SPROP_VARINT sendprops. 2012-12-18 17:58:45 -05:00
Nicholas Hastings ae6ae0e3ea Ported GetEntProp's unsigned prop support to GameRules_GetProp. 2012-12-18 17:53:45 -05:00
Nicholas Hastings e903810d34 Updated DOD:S and HL2DM gamedata. 2012-12-20 17:58:43 -05:00
Nicholas Hastings b73fd01490 Validate entity in GameRules_GetPropEnt and in CS_DropWeapon safety checks. 2012-12-17 14:34:44 -05:00
Nicholas Hastings af0d46fcc1 Fixed regressions in 3d66ab8565c1:
* Fixed crash when prop/data ent is invalid.
* Restored GetEntPropEnt/GetEntDataEnt2 functionality when logical ent support is not available.
2012-12-17 14:33:57 -05:00
Nicholas Hastings 773216d517 Validate entity in GetEntPropEnt, GetEntDataEnt2 (r=me). 2012-12-16 19:52:31 -05:00
Powerlord ccfdcfb727 Updated TFHoliday enum (bug 5526, r=psychonic). 2012-12-15 14:40:51 -05:00
Ryan Stecker 8bf7f1a00f Fixed VoteMenuToAll stock adding bots to list (bug 5253, r=asherkin). 2012-12-14 15:18:30 -05:00
GoD-Tony 5e99870df0 Added PlayerRunCmd gamedata for The Hidden: Source (bug 5534, r=psychonic). 2012-12-14 15:07:47 -05:00
FlaminSarge 6f8d002404 Added new values to TFCond(ition) enum (bug 5537, r=asherkin). 2012-12-14 15:01:28 -05:00
Nicholas Hastings 3a94a3268a Updated CSPromod gamedata. 2012-12-10 23:35:57 -05:00
Kyle Sanderson 8355efaca4 Added a sanity check on handle index in EntityToBCompatRef (bug 5539, r=psychonic). 2012-12-01 13:41:00 -05:00
Drifter 2f388cfdb4 AutoExecConfig now logs an error when it cannot create cfg (bug 5465, r=asherkin). 2012-11-24 09:53:44 -05:00
Nicholas Hastings 272473ed02 Updated more L4D2 gamedata. 2012-11-21 08:30:08 -05:00
Nicholas Hastings 6e95680838 Updated L4D2 gamedata. 2012-11-20 20:55:28 -05:00
Nicholas Hastings 18e089e9d0 Fixed typo in game.nucleardawn.txt. 2012-11-08 12:56:19 -05:00
Nicholas Hastings 185e5fe6db Updated ZPS gamedata (bug 5536). 2012-11-02 13:39:33 -04:00
Nicholas Hastings 2b84454e77 Updated Nuclear Dawn gamedata. 2012-10-31 09:58:13 -04:00
Nicholas Hastings bb66d660b9 Updated ambuilder script for ep2v lib name changes (bug 5524). 2012-10-27 11:33:32 -04:00
Nicholas Hastings 3867d70d53 Updated last piece of gamedata for today's TF2 update. 2012-10-26 22:59:20 -04:00
Nicholas Hastings 144c1a3a13 Updated more ep2v gamedata. 2012-10-26 22:02:46 -04:00
Nicholas Hastings c2197a4422 Fixing ep2v build against sdk update. 2012-10-26 21:45:53 -04:00
Nicholas Hastings c3c51ff3a3 Updated TF2 extension gamedata. 2012-10-26 20:06:50 -04:00
Nicholas Hastings a2d3e1bee5 Updated PVKII gamedata. 2012-10-24 13:55:07 -04:00
Nicholas Hastings 6fa750bffe Merge. 2012-10-14 18:32:44 -04:00
Nicholas Hastings 83841cc218 Updated NMRiH gamedata (bug 5482). 2012-10-14 18:25:59 -04:00
Asher Baker 5c7e6c79c8 Updated plugin blacklist. 2012-10-12 02:25:53 +01:00
Asher Baker b20ff4075a Updated plugin blacklist. 2012-09-22 12:59:16 +01:00
Drifter f860ef10e6 Updated CS:S gamedata for CStrike extension. 2012-09-11 18:48:10 -04:00
Nicholas Hastings e357a5d650 Updated CS:S SDKTools gamedata. 2012-09-11 18:47:44 -04:00
Asher Baker c3bded70c5 Check the debug stringbase when loading plugins, lest it be null and cause crashes down the line (bug 5478, r=dvander). 2012-09-08 17:31:31 +01:00
Nicholas Hastings c11f2569ce Updated TF2 gamedata. 2012-09-06 18:46:38 -04:00
Nicholas Hastings c56d550333 Merge. 2012-09-06 17:43:19 -04:00
Nicholas Hastings 4e96ffb438 Updated ep2v gamedata. 2012-09-06 17:42:57 -04:00
Asher Baker 6b4b5eb0b1 Bumping version. 2012-09-04 12:56:31 +01:00
Asher Baker 74847c5b4f Added tag sourcemod-1.4.6 for changeset 56a9ba4cd1e2 2012-09-04 12:54:31 +01:00
Asher Baker 116fbe9a7a Updated versioning for 1.4.6 release. 2012-09-04 12:46:12 +01:00
Asher Baker 79f412c55c Updated changelog. 2012-09-04 12:45:37 +01:00
Asher Baker d839b83b6b Fixed extraneous errors related to accessing nested props (bug 5446, r=me). 2012-09-04 11:41:35 +01:00
Nicholas Hastings 9bcc3de922 Bumping version. 2012-09-03 23:07:23 -04:00
Nicholas Hastings 30ebb670f4 Added tag sourcemod-1.4.5 for changeset 9560adae2a72 2012-09-03 23:06:27 -04:00
Nicholas Hastings b702099530 Merge. 2012-09-03 21:21:07 -04:00
Nicholas Hastings dd0339e05b Updated versioning for 1.4.5 release. 2012-09-03 21:20:44 -04:00
Nicholas Hastings 88ee039ea6 Updated changelog. 2012-09-03 21:20:29 -04:00
Asher Baker 9b965ddfe5 Merge 2012-09-03 20:29:02 +01:00
Asher Baker 6e4dcc9041 Error on access to nested datamap props (bug 5446, r=psychonic). 2012-09-03 20:26:39 +01:00
Nicholas Hastings 71925cd3b2 Updated non-CS:S ep2v gamedata for IServer lookup (bug 5450). 2012-09-03 14:39:26 -04:00
Nicholas Hastings 82160205e5 Fixed typo causing IServer lookup to still fail (bug 5450). 2012-09-03 14:37:45 -04:00
Asher Baker 8307f8fd9b Fixed resolution of GetProfilerTime on non-Windows platforms (r=me). 2012-08-29 16:35:10 +01:00
Nicholas Hastings a62b783c0e riggering build. 2012-08-28 17:49:57 -04:00
Kyle Sanderson 2f86fe58aa Fixed crash in EntProp natives (bug 5297, r=psychonic). 2012-08-28 16:22:33 -04:00
Nicholas Hastings 20d9b28df5 Updated SDKCall SetSignature to use same hidden-symbols engine list as core (bug 5440, r=me). 2012-08-27 19:31:44 -04:00
Nicholas Hastings 4c3fe1a1e7 Updated GMod gamedata (bug 5408). 2012-08-27 18:59:00 -04:00
Nicholas Hastings e95f0f333e Compatibility shim to fix IServer lookup on CS:S (bug 5450, r=asherkin). 2012-08-27 17:52:15 -04:00
Kyle Sanderson 129395c896 Fixed minor memory leaks in cstrike ext (bug 5456, r=psychonic). 2012-08-27 00:57:25 -04:00
Anthony Iacono f2eccadff3 Fixed OnClientConnect blocking not actually functioning (bug 5461, r=psychonic). 2012-08-26 23:33:04 -04:00
Nicholas Hastings 4eafdc2a1e Really fixed issues for today's TF2 engine update (bug 5450). 2012-08-24 01:38:01 -04:00
Nicholas Hastings e4fd32609a Updated gamedata for today's TF2 engine update. 2012-08-24 00:53:26 -04:00
Nicholas Hastings 3f43fca3a9 Fixed GuessSDKVersion output on CS:S with MM:S 1.9+ (r=asherkin). 2012-08-23 13:55:48 -04:00
Nicholas Hastings 0d6b93c5a0 Updated SDKTools IServer finding on Windows for Ep2v and CSS (bug 5450, r=me). 2012-08-23 07:47:44 -04:00
Asher Baker bf4bce8250 Updated cstrike gamedata. 2012-08-22 23:27:16 +01:00
Powerlord 6942614ef9 Updated TFHoliday enum (bug 5436, r=asherkin). 2012-08-21 00:44:44 -04:00
Nicholas Hastings f6c496717c Merge. 2012-08-20 21:56:45 -04:00
Nicholas Hastings 9c69e9e66a Added compatibility shim for MM:S 1.9.0+ (bug 5370, r=asherkin). 2012-08-20 21:56:18 -04:00
Asher Baker b5b5d7e239 Force build. 2012-08-16 02:10:14 +01:00
Nicholas Hastings 6acf264636 Updated HL2DM and DODS gamedata for today's game update. 2012-08-15 23:35:53 +01:00
Nicholas Hastings 52ecfd8b0a Updated tf2 weapon and dmg custom defines, added new round state. 2012-08-15 23:35:53 +01:00
Nicholas Hastings 5b6cb0707c Updated gamedata for latest TF2 update. 2012-08-15 23:35:53 +01:00
Nicholas Hastings a29027a4a3 Updated TF2 ext MakeBleed and Regenerate natives for latest TF2 update. 2012-08-15 23:35:53 +01:00
Asher Baker 94e471192d Added system to block malware or illegal plugins (bug 5289, r=dvander). 2012-08-09 01:54:43 +01:00
Nicholas Hastings 691b9d128e Updated defines in tf2_stocks.inc. 2012-08-03 07:56:31 -04:00
Ryan Stecker c9631c19ac Updated TF2 gamedata. 2012-08-02 20:11:02 -04:00
Nicholas Hastings 893b52a1e9 Updated Dino D-Day gamedata (bug 5410). 2012-08-01 22:23:03 -04:00
Nicholas Hastings 527b98661a Updated ZPS gamedata. 2012-07-26 14:09:34 -04:00
Nicholas Hastings 823b0f9702 Triggering build for bug 5391. 2012-07-21 20:43:22 -04:00
Nicholas Hastings bcdc2c3933 Updated DoD:S and HL2:DM gamedata. 2012-07-20 15:43:15 -04:00
Nicholas Hastings bf84e29c4d Updated Nuclear Dawn gamedata. 2012-07-19 20:13:47 -04:00
Nicholas Hastings 4b5c62bd2f Bumping version. 2012-07-03 20:34:50 -04:00
Nicholas Hastings 1dd00127a5 Added tag sourcemod-1.4.4 for changeset 29186166cc99 2012-07-03 20:33:45 -04:00
Nicholas Hastings 8c0a53cfdb Updating versioning for 1.4.4 release. 2012-07-03 18:30:05 -04:00
Nicholas Hastings 5d485df4b8 Updating changelog. 2012-07-03 18:29:39 -04:00
Powerlord 0656857960 Updated TFHoliday enum for latest TF2 updates (bug 5364, r=psychonic). 2012-07-03 18:03:06 -04:00
Nicholas Hastings af69434738 Fixed clientprefs prefab menu double free crash (bug 5374, r=asherkin). 2012-07-03 07:51:12 -04:00
Nicholas Hastings d713c52524 Updated CS:S gamedata. 2012-07-02 23:27:22 -04:00
Brian Simon ef59237dad Fixed NULL ninvoke ptr in sample ext when SMEXT_ENABLE_NINVOKE defined (bug 5340, r=psychonic). 2012-07-01 12:05:21 -04:00
Nicholas Hastings 049f99a658 Updated GMod gamedata. 2012-06-30 09:08:06 -04:00
Nicholas Hastings ffe50ed9f1 Added new TF2 weapon and custom dmg defines. 2012-06-28 11:27:31 -04:00
Nicholas Hastings f2266b45a3 Updated EmitSentence native for sdk change on ep2v. 2012-06-28 11:29:07 -04:00
Nicholas Hastings c5f57cb3e4 Updated TF2, DOD:S, and HL2:DM gamedata. 2012-06-27 23:24:38 -04:00
Nicholas Hastings 21a645e1c6 Another build fix. 2012-06-27 23:17:44 -04:00
Nicholas Hastings e4505b981b Build fix. 2012-06-27 23:14:26 -04:00
Nicholas Hastings 30c9d56e3f Updated Core and SDK Tools for ep2v EmitSound sdk change. 2012-06-27 23:08:54 -04:00
Nicholas Hastings e29cf999a9 Triggering a build. 2012-06-27 22:19:04 -04:00
Nicholas Hastings df9ae818db Updated TF2 gamedata. 2012-06-27 21:41:04 -04:00
Nicholas Hastings f725ee4fb4 Updated Nuclear Dawn gamedata. 2012-06-20 21:00:53 -04:00
Nicholas Hastings ce51189e9a Re-adding -dev tag and bumping version. 2012-06-09 21:45:20 -04:00
Nicholas Hastings 84ffb3de43 Added tag sourcemod-1.4.3 for changeset 608f4c94872e 2012-06-09 21:43:58 -04:00
63 changed files with 1789 additions and 532 deletions
+4
View File
@@ -6,3 +6,7 @@ b3ffa8a4511c4eadaf533fc790aa6b14f7f0c6ea sourcemod-1.1.2
ddd707c3454c382db5db9d28148cd19227f44759 sourcemod-1.4.0 ddd707c3454c382db5db9d28148cd19227f44759 sourcemod-1.4.0
f74e1dea2ef2c5a12b5238badc0e877106804191 sourcemod-1.4.1 f74e1dea2ef2c5a12b5238badc0e877106804191 sourcemod-1.4.1
0026e1394254c392244c7b140e3075974ab5a6db sourcemod-1.4.2 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
View File
@@ -268,7 +268,15 @@ class SM:
else: else:
staticLibs = os.path.join(sdkPath, 'lib', 'linux') staticLibs = os.path.join(sdkPath, 'lib', 'linux')
workFolder = os.path.join(AMBuild.outputFolder, job.workFolder) 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']: for i in ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so']:
link = os.path.join(workFolder, i) link = os.path.join(workFolder, i)
target = os.path.join(staticLibs, i) target = os.path.join(staticLibs, i)
@@ -354,7 +362,10 @@ class SM:
if not noLink: if not noLink:
if AMBuild.target['platform'] == 'linux': if AMBuild.target['platform'] == 'linux':
compiler['POSTLINKFLAGS'][0:0] = ['-lm'] 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] = ['libtier0.so']
compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so'] compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so']
else: else:
+77
View File
@@ -1,5 +1,82 @@
SourceMod Changelog 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]
URL: http://wiki.alliedmods.net/SourceMod_1.4.4_Release_Notes
User Changes:
- Updated support for latest Source 2009 engine changes (CS:S, DoD:S, TF2, HL2DM, GMod).
- Updated Nuclear Dawn gamedata.
- Fixed a crash that could occur when selecting an option on a clientprefs prefab menu (bug 5374).
Developer Changes:
- Added new TF2 weapon and custom dmg defines.
- Added new TF2 TFHoliday value (bug 5364) (Powerlord).
- Updated sample extension to properly fill ninvoke with INativeInvoker ptr (bug 5340) (Afronanny).
----------------------------- -----------------------------
SourceMod 1.4.3 [2012-06-09] SourceMod 1.4.3 [2012-06-09]
+10
View File
@@ -107,4 +107,14 @@
* Currently this will log details about the gamedata updating process. * Currently this will log details about the gamedata updating process.
*/ */
"DebugSpew" "no" "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"
} }
+5
View File
@@ -452,6 +452,11 @@ bool SM_ExecuteConfig(CPlugin *pl, AutoConfig *cfg, bool can_create)
can_create = false; can_create = false;
fclose(fp); 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
View File
@@ -40,6 +40,7 @@
#include <Logger.h> #include <Logger.h>
#include "LibrarySys.h" #include "LibrarySys.h"
#include "logic_bridge.h" #include "logic_bridge.h"
#include <tier0/mem.h>
typedef ICommandLine *(*FakeGetCommandLine)(); typedef ICommandLine *(*FakeGetCommandLine)();
@@ -51,7 +52,10 @@ typedef ICommandLine *(*FakeGetCommandLine)();
#define TIER0_NAME "libtier0.dylib" #define TIER0_NAME "libtier0.dylib"
#define VSTDLIB_NAME "libvstdlib.dylib" #define VSTDLIB_NAME "libvstdlib.dylib"
#elif defined __linux__ #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 TIER0_NAME "libtier0.so"
#define VSTDLIB_NAME "libvstdlib.so" #define VSTDLIB_NAME "libvstdlib.so"
#else #else
@@ -329,8 +333,13 @@ bool UTIL_FindInSendTable(SendTable *pTable,
return false; 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) while (pMap)
{ {
for (int i=0; i<pMap->dataNumFields; i++) 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) if (pMap->dataDesc[i].td)
{ {
typedescription_t *_td; if (isNested)
if ((_td=UTIL_FindInDataMap(pMap->dataDesc[i].td, name)) != NULL)
{ {
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) 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; typedescription_t *td = NULL;
DataMapTrie &val = m_Maps[pMap]; 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 (!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); sm_trie_insert(val.trie, offset, td);
} }
@@ -971,6 +996,11 @@ cell_t CHalfLife2::EntityToBCompatRef(CBaseEntity *pEntity)
IServerUnknown *pUnknown = (IServerUnknown *)pEntity; IServerUnknown *pUnknown = (IServerUnknown *)pEntity;
CBaseHandle hndl = pUnknown->GetRefEHandle(); CBaseHandle hndl = pUnknown->GetRefEHandle();
if (hndl == INVALID_EHANDLE_INDEX)
{
return INVALID_EHANDLE_INDEX;
}
if (hndl.GetEntryIndex() >= MAX_EDICTS) if (hndl.GetEntryIndex() >= MAX_EDICTS)
{ {
return (hndl.ToInt() | (1<<31)); return (hndl.ToInt() | (1<<31));
@@ -1009,3 +1039,38 @@ int CHalfLife2::GetSendPropOffset(SendProp *prop)
return prop->GetOffset(); 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);
}
+3
View File
@@ -115,6 +115,7 @@ public: //IGameHelpers
datamap_t *GetDataMap(CBaseEntity *pEntity); datamap_t *GetDataMap(CBaseEntity *pEntity);
ServerClass *FindServerClass(const char *classname); ServerClass *FindServerClass(const char *classname);
typedescription_t *FindInDataMap(datamap_t *pMap, const char *offset); 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); void SetEdictStateChanged(edict_t *pEdict, unsigned short offset);
bool TextMsg(int client, int dest, const char *msg); bool TextMsg(int client, int dest, const char *msg);
bool HintTextMsg(int client, const char *msg); bool HintTextMsg(int client, const char *msg);
@@ -138,6 +139,8 @@ public: //IGameHelpers
void *GetGlobalEntityList(); void *GetGlobalEntityList();
int GetSendPropOffset(SendProp *prop); int GetSendPropOffset(SendProp *prop);
ICommandLine *GetValveCommandLine(); ICommandLine *GetValveCommandLine();
const char *GetEntityClassname(edict_t *pEdict);
const char *GetEntityClassname(CBaseEntity *pEntity);
public: public:
void AddToFakeCliCmdQueue(int client, int userid, const char *cmd); void AddToFakeCliCmdQueue(int client, int userid, const char *cmd);
void ProcessFakeCliCmdQueue(); void ProcessFakeCliCmdQueue();
+3
View File
@@ -331,6 +331,9 @@ void BaseMenuStyle::ClientPressedKey(int client, unsigned int key_press)
ATTN_NORM, ATTN_NORM,
0, 0,
PITCH_NORM, PITCH_NORM,
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
0,
#endif
&pos); &pos);
} }
} }
+1 -1
View File
@@ -451,7 +451,7 @@ bool PlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const
pListener = (*iter); pListener = (*iter);
if (!pListener->InterceptClientConnect(client, reject, maxrejectlen)) if (!pListener->InterceptClientConnect(client, reject, maxrejectlen))
{ {
return false; RETURN_META_VALUE(MRES_SUPERCEDE, false);
} }
} }
+68 -1
View File
@@ -789,6 +789,8 @@ CPluginManager::CPluginManager()
m_AllPluginsLoaded = false; m_AllPluginsLoaded = false;
m_MyIdent = NULL; m_MyIdent = NULL;
m_LoadingLocked = false; m_LoadingLocked = false;
m_bBlockBadPlugins = true;
} }
CPluginManager::~CPluginManager() 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; LoadRes loadFailure = LoadRes_Failure;
/* Get the status */ /* 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) 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->SetErrorState(
pl->GetStatus() <= Plugin_Created ? Plugin_BadLoad : pl->GetStatus(), pl->GetStatus() <= Plugin_Created ? Plugin_BadLoad : pl->GetStatus(),
"%s", "%s",
@@ -1889,6 +1926,27 @@ void CPluginManager::OnSourceModShutdown()
g_ShareSys.DestroyIdentity(m_MyIdent); 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) void CPluginManager::OnHandleDestroy(HandleType_t type, void *object)
{ {
/* We don't care about the internal object, actually */ /* 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); 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 else
{ {
+5
View File
@@ -57,6 +57,7 @@
#include "convar_sm.h" #include "convar_sm.h"
#endif #endif
#include "ITranslator.h" #include "ITranslator.h"
#include "IGameConfigs.h"
#include "NativeOwner.h" #include "NativeOwner.h"
#include "ShareSys.h" #include "ShareSys.h"
@@ -326,6 +327,7 @@ public: //IPluginManager
public: //SMGlobalClass public: //SMGlobalClass
void OnSourceModAllInitialized(); void OnSourceModAllInitialized();
void OnSourceModShutdown(); void OnSourceModShutdown();
ConfigResult OnSourceModConfigChanged(const char *key, const char *value, ConfigSource source, char *error, size_t maxlength);
void OnSourceModMaxPlayersChanged(int newvalue); void OnSourceModMaxPlayersChanged(int newvalue);
public: //IHandleTypeDispatch public: //IHandleTypeDispatch
void OnHandleDestroy(HandleType_t type, void *object); void OnHandleDestroy(HandleType_t type, void *object);
@@ -470,6 +472,9 @@ private:
List<FakeNative *> m_Natives; List<FakeNative *> m_Natives;
bool m_LoadingLocked; bool m_LoadingLocked;
// Config
bool m_bBlockBadPlugins;
}; };
extern CPluginManager g_PluginSys; extern CPluginManager g_PluginSys;
+1 -1
View File
@@ -179,7 +179,7 @@ static cell_t GetProfilerTime(IPluginContext *pContext, const cell_t *params)
#else #else
int64_t start_us = int64_t(prof->start.tv_sec) * 1000000 + prof->start.tv_usec; 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; 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 #endif
return sp_ftoc(fTime); return sp_ftoc(fTime);
+2 -2
View File
@@ -94,7 +94,7 @@ void sort_random(cell_t *array, cell_t size)
for (int i = size-1; i > 0; i--) for (int i = size-1; i > 0; i--)
{ {
int n = (rand() % i) + 1; int n = rand() % (i + 1);
if (array[i] != array[n]) if (array[i] != array[n])
{ {
@@ -435,7 +435,7 @@ void sort_adt_random(CellArray *cArray)
for (int i = arraysize-1; i > 0; i--) for (int i = arraysize-1; i > 0; i--)
{ {
int n = (rand() % i) + 1; int n = rand() % (i + 1);
cArray->swap(i, n); cArray->swap(i, n);
} }
+69 -86
View File
@@ -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]); 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') 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); CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset);
CBaseEntity *pHandleEntity = g_HL2.ReferenceToEntity(hndl.GetEntryIndex());
int ref = g_HL2.IndexToReference(hndl.GetEntryIndex()); if (!pHandleEntity || hndl != reinterpret_cast<IHandleEntity *>(pHandleEntity)->GetRefEHandle())
return g_HL2.ReferenceToBCompatRef(ref); return -1;
return g_HL2.EntityToBCompatRef(pHandleEntity);
} }
/* THIS GUY IS DEPRECATED. */ /* THIS GUY IS DEPRECATED. */
@@ -812,9 +815,13 @@ static cell_t FindDataMapOffs(IPluginContext *pContext, const cell_t *params)
} }
pContext->LocalToString(params[2], &offset); 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) 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"); \ 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)", \ const char *class_name = g_HL2.GetEntityClassname(pEntity); \
prop, \ if (isNested) \
params[1], \ { \
class_name); \ 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() \ #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) \ #define FIND_PROP_SEND(type, type_name) \
sm_sendprop_info_t info;\ sm_sendprop_info_t info;\
SendProp *pProp; \
IServerUnknown *pUnk = (IServerUnknown *)pEntity; \ IServerUnknown *pUnk = (IServerUnknown *)pEntity; \
IServerNetworkable *pNet = pUnk->GetNetworkable(); \ IServerNetworkable *pNet = pUnk->GetNetworkable(); \
if (!pNet) \ 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)) \ 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)", \ return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)", \
prop, \ prop, \
params[1], \ params[1], \
class_name); \ ((class_name) ? class_name : "")); \
} \ } \
\ \
offset = info.actual_offset; \ 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: \ case type: \
{ \ { \
@@ -1011,7 +1031,6 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
} \ } \
case DPT_DataTable: \ case DPT_DataTable: \
{ \ { \
SendProp *pProp; \
FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name); \ FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name); \
\ \
offset += pProp->GetOffset(); \ 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)", \ return pContext->ThrowNativeError("SendProp %s type is not " type_name " (%d != %d)", \
prop, \ prop, \
info.prop->GetType(), \ pProp->GetType(), \
type); \ type); \
} \ } \
} \ } \
#define FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name) \ #define FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name) \
SendTable *pTable = info.prop->GetDataTable(); \ SendTable *pTable = pProp->GetDataTable(); \
if (!pTable) \ if (!pTable) \
{ \ { \
return pContext->ThrowNativeError("Error looking up DataTable for prop %s", \ 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)", \ return pContext->ThrowNativeError("SendProp %s type is not " type_name " ([%d,%d] != %d)", \
prop, \ prop, \
info.prop->GetType(), \ pProp->GetType(), \
info.prop->m_nBits, \ pProp->m_nBits, \
type); \ type); \
} }
@@ -1082,7 +1101,6 @@ static cell_t GetEntPropArraySize(IPluginContext *pContext, const cell_t *params
{ {
CBaseEntity *pEntity; CBaseEntity *pEntity;
char *prop; char *prop;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
if (!IndexToAThings(params[1], &pEntity, &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]); 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); pContext->LocalToString(params[3], &prop);
switch (params[2]) 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)) 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)", return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)",
prop, prop,
params[1], params[1],
class_name); ((class_name) ? class_name : ""));
} }
if (info.prop->GetType() != DPT_DataTable) if (info.prop->GetType() != DPT_DataTable)
@@ -1152,7 +1166,6 @@ static cell_t GetEntProp(IPluginContext *pContext, const cell_t *params)
CBaseEntity *pEntity; CBaseEntity *pEntity;
char *prop; char *prop;
int offset; int offset;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int bit_count; int bit_count;
bool is_unsigned = false; 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]); 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); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1198,7 +1205,15 @@ static cell_t GetEntProp(IPluginContext *pContext, const cell_t *params)
case Prop_Send: case Prop_Send:
{ {
FIND_PROP_SEND(DPT_Int, "integer"); 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; break;
} }
default: default:
@@ -1251,7 +1266,6 @@ static cell_t SetEntProp(IPluginContext *pContext, const cell_t *params)
CBaseEntity *pEntity; CBaseEntity *pEntity;
char *prop; char *prop;
int offset; int offset;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int bit_count; 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]); 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); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1295,6 +1304,14 @@ static cell_t SetEntProp(IPluginContext *pContext, const cell_t *params)
case Prop_Send: case Prop_Send:
{ {
FIND_PROP_SEND(DPT_Int, "integer"); 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; break;
} }
default: default:
@@ -1339,7 +1356,6 @@ static cell_t GetEntPropFloat(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; 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]); 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); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1404,7 +1415,6 @@ static cell_t SetEntPropFloat(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; 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]); 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); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1474,7 +1479,6 @@ static cell_t GetEntPropEnt(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; 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]); 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); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1527,9 +1526,12 @@ static cell_t GetEntPropEnt(IPluginContext *pContext, const cell_t *params)
} }
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset); CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset);
CBaseEntity *pHandleEntity = g_HL2.ReferenceToEntity(hndl.GetEntryIndex());
int ref = g_HL2.IndexToReference(hndl.GetEntryIndex()); if (!pHandleEntity || hndl != reinterpret_cast<IHandleEntity *>(pHandleEntity)->GetRefEHandle())
return g_HL2.ReferenceToBCompatRef(ref); return -1;
return g_HL2.EntityToBCompatRef(pHandleEntity);
} }
static cell_t SetEntPropEnt(IPluginContext *pContext, const cell_t *params) 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; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; 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]); 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); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1623,7 +1619,6 @@ static cell_t GetEntPropVector(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; 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]); 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); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1695,7 +1685,6 @@ static cell_t SetEntPropVector(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; 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]); 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); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1771,7 +1755,6 @@ static cell_t GetEntPropString(IPluginContext *pContext, const cell_t *params)
CBaseEntity *pEntity; CBaseEntity *pEntity;
char *prop; char *prop;
int offset; int offset;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
bool bIsStringIndex; 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]); 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); pContext->LocalToString(params[3], &prop);
bIsStringIndex = false; 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)) 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)", return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)",
prop, prop,
params[1], params[1],
class_name); ((class_name) ? class_name : ""));
} }
offset = info.actual_offset; 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"); return pContext->ThrowNativeError("Unable to retrieve GetDataDescMap offset");
} }
pContext->LocalToString(params[3], &prop); 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) if (td->fieldType != FIELD_CHARACTER)
{ {
+5
View File
@@ -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) static cell_t GuessSDKVersion(IPluginContext *pContext, const cell_t *params)
{ {
#if defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11 #if defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11
@@ -473,6 +477,7 @@ static cell_t GuessSDKVersion(IPluginContext *pContext, const cell_t *params)
return 32; return 32;
case SOURCE_ENGINE_EYE: case SOURCE_ENGINE_EYE:
return 33; return 33;
case SOURCE_ENGINE_CSS:
case SOURCE_ENGINE_ORANGEBOXVALVE: case SOURCE_ENGINE_ORANGEBOXVALVE:
return 35; return 35;
case SOURCE_ENGINE_LEFT4DEAD: case SOURCE_ENGINE_LEFT4DEAD:
+15 -2
View File
@@ -105,6 +105,7 @@ bool ClientPrefs::SDK_OnLoad(char *error, size_t maxlength, bool late)
sharesys->AddNatives(myself, g_ClientPrefNatives); sharesys->AddNatives(myself, g_ClientPrefNatives);
sharesys->RegisterLibrary(myself, "clientprefs"); sharesys->RegisterLibrary(myself, "clientprefs");
identity = sharesys->CreateIdentity(sharesys->CreateIdentType("ClientPrefs"), this);
g_CookieManager.cookieDataLoadedForward = forwards->CreateForward("OnClientCookiesCached", ET_Ignore, 1, NULL, Param_Cell); g_CookieManager.cookieDataLoadedForward = forwards->CreateForward("OnClientCookiesCached", ET_Ignore, 1, NULL, Param_Cell);
g_CookieType = handlesys->CreateType("Cookie", g_CookieType = handlesys->CreateType("Cookie",
@@ -124,7 +125,7 @@ bool ClientPrefs::SDK_OnLoad(char *error, size_t maxlength, bool late)
NULL); NULL);
IMenuStyle *style = menus->GetDefaultStyle(); IMenuStyle *style = menus->GetDefaultStyle();
g_CookieManager.clientMenu = style->CreateMenu(&g_Handler, NULL); g_CookieManager.clientMenu = style->CreateMenu(&g_Handler, identity);
g_CookieManager.clientMenu->SetDefaultTitle("Client Settings:"); g_CookieManager.clientMenu->SetDefaultTitle("Client Settings:");
plsys->AddPluginsListener(&g_CookieManager); plsys->AddPluginsListener(&g_CookieManager);
@@ -191,10 +192,17 @@ void ClientPrefs::SDK_OnUnload()
forwards->ReleaseForward(g_CookieManager.cookieDataLoadedForward); forwards->ReleaseForward(g_CookieManager.cookieDataLoadedForward);
g_CookieManager.clientMenu->Destroy(); HandleSecurity sec = HandleSecurity(identity, identity);
HandleError err = handlesys->FreeHandle(g_CookieManager.clientMenu->GetHandle(), &sec);
if (HandleError_None != err)
{
g_pSM->LogError(myself, "Error %d when attempting to free client menu handle", err);
}
phrases->Destroy(); phrases->Destroy();
sharesys->DestroyIdentity( identity );
plsys->RemovePluginsListener(&g_CookieManager); plsys->RemovePluginsListener(&g_CookieManager);
playerhelpers->RemoveClientListener(&g_CookieManager); playerhelpers->RemoveClientListener(&g_CookieManager);
@@ -470,6 +478,11 @@ bool Translate(char *buffer,
return true; return true;
} }
IdentityToken_t *ClientPrefs::GetIdentity() const
{
return identity;
}
const char *ClientPrefs::GetExtensionVerString() const char *ClientPrefs::GetExtensionVerString()
{ {
return SM_FULL_VERSION; return SM_FULL_VERSION;
+3
View File
@@ -140,6 +140,8 @@ public:
*/ */
//virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength); //virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength);
#endif #endif
public:
IdentityToken_t *GetIdentity() const;
public: public:
IDBDriver *Driver; IDBDriver *Driver;
IDatabase *Database; IDatabase *Database;
@@ -152,6 +154,7 @@ public:
private: private:
SourceHook::List<TQueryOp *> cachedQueries; SourceHook::List<TQueryOp *> cachedQueries;
IMutex *queryMutex; IMutex *queryMutex;
IdentityToken_t *identity;
}; };
class CookieTypeHandler : public IHandleTypeDispatch class CookieTypeHandler : public IHandleTypeDispatch
+7 -2
View File
@@ -57,7 +57,7 @@ void ClientMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int i
return; return;
} }
IBaseMenu *submenu = menus->GetDefaultStyle()->CreateMenu(&g_AutoHandler, NULL); IBaseMenu *submenu = menus->GetDefaultStyle()->CreateMenu(&g_AutoHandler, g_ClientPrefs.GetIdentity());
char message[256]; char message[256];
@@ -175,5 +175,10 @@ void AutoMenuHandler::OnMenuSelect(SourceMod::IBaseMenu *menu, int client, unsig
void AutoMenuHandler::OnMenuEnd(IBaseMenu *menu, MenuEndReason reason) void AutoMenuHandler::OnMenuEnd(IBaseMenu *menu, MenuEndReason reason)
{ {
menu->Destroy(true); HandleSecurity sec = HandleSecurity(g_ClientPrefs.GetIdentity(), g_ClientPrefs.GetIdentity());
HandleError err = handlesys->FreeHandle(menu->GetHandle(), &sec);
if (HandleError_None != err)
{
g_pSM->LogError(myself, "Error %d when attempting to free automenu handle", err);
}
} }
+6 -6
View File
@@ -206,18 +206,18 @@ static cell_t CS_DropWeapon(IPluginContext *pContext, const cell_t *params)
} }
//Psychonic is awesome for this //Psychonic is awesome for this
sm_sendprop_info_t *spi = new sm_sendprop_info_t; sm_sendprop_info_t spi;
IServerUnknown *pUnk = (IServerUnknown *)pWeapon; IServerUnknown *pUnk = (IServerUnknown *)pWeapon;
IServerNetworkable *pNet = pUnk->GetNetworkable(); 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]); 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]); return pContext->ThrowNativeError("Invalid entity index %d for weapon", params[2]);
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pWeapon + spi->actual_offset); CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pWeapon + spi.actual_offset);
if (params[1] != hndl.GetEntryIndex()) if (params[1] != hndl.GetEntryIndex() || hndl != ((IServerEntity *)pEntity)->GetRefEHandle())
return pContext->ThrowNativeError("Weapon %d is not owned by client %d", params[2], params[1]); return pContext->ThrowNativeError("Weapon %d is not owned by client %d", params[2], params[1]);
if (params[4] == 1 && g_pCSWeaponDropDetoured) 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[2], &dest);
pContext->LocalToString(params[1], &weapon); pContext->LocalToString(params[1], &weapon);
char *ret = new char[128]; char *ret = NULL;
unsigned char vstk[sizeof(char *)]; unsigned char vstk[sizeof(char *)];
unsigned char *vptr = vstk; unsigned char *vptr = vstk;
+50 -12
View File
@@ -89,15 +89,17 @@ enum PropFieldType
#define FIND_PROP_SEND(type, type_name) \ #define FIND_PROP_SEND(type, type_name) \
sm_sendprop_info_t info;\ sm_sendprop_info_t info;\
SendProp *pProp; \
if (!gamehelpers->FindSendPropInfo(g_szGameRulesProxy, prop, &info)) \ if (!gamehelpers->FindSendPropInfo(g_szGameRulesProxy, prop, &info)) \
{ \ { \
return pContext->ThrowNativeError("Property \"%s\" not found on the gamerules proxy", prop); \ return pContext->ThrowNativeError("Property \"%s\" not found on the gamerules proxy", prop); \
} \ } \
\ \
offset = info.actual_offset; \ 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: \ case type: \
{ \ { \
@@ -111,7 +113,6 @@ enum PropFieldType
} \ } \
case DPT_DataTable: \ case DPT_DataTable: \
{ \ { \
SendProp *pProp; \
FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name); \ FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name); \
\ \
offset += pProp->GetOffset(); \ offset += pProp->GetOffset(); \
@@ -122,13 +123,13 @@ enum PropFieldType
{ \ { \
return pContext->ThrowNativeError("SendProp %s type is not " type_name " (%d != %d)", \ return pContext->ThrowNativeError("SendProp %s type is not " type_name " (%d != %d)", \
prop, \ prop, \
info.prop->GetType(), \ pProp->GetType(), \
type); \ type); \
} \ } \
} \ } \
#define FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name) \ #define FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name) \
SendTable *pTable = info.prop->GetDataTable(); \ SendTable *pTable = pProp->GetDataTable(); \
if (!pTable) \ if (!pTable) \
{ \ { \
return pContext->ThrowNativeError("Error looking up DataTable for prop %s", \ 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)", \ return pContext->ThrowNativeError("SendProp %s type is not " type_name " ([%d,%d] != %d)", \
prop, \ prop, \
info.prop->GetType(), \ pProp->GetType(), \
info.prop->m_nBits, \ pProp->m_nBits, \
type); \ type); \
} }
@@ -160,6 +161,7 @@ static cell_t GameRules_GetProp(IPluginContext *pContext, const cell_t *params)
int element = params[3]; int element = params[3];
int offset; int offset;
int bit_count; int bit_count;
bool is_unsigned;
if (!g_pGameRules || !g_szGameRulesProxy || !strcmp(g_szGameRulesProxy, "")) if (!g_pGameRules || !g_szGameRulesProxy || !strcmp(g_szGameRulesProxy, ""))
return pContext->ThrowNativeError("Gamerules lookup failed."); return pContext->ThrowNativeError("Gamerules lookup failed.");
@@ -169,6 +171,15 @@ static cell_t GameRules_GetProp(IPluginContext *pContext, const cell_t *params)
int elementCount = 1; int elementCount = 1;
FIND_PROP_SEND(DPT_Int, "integer"); 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) if (bit_count < 1)
{ {
bit_count = params[2] * 8; 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) 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) 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 else
{ {
@@ -218,6 +243,14 @@ static cell_t GameRules_SetProp(IPluginContext *pContext, const cell_t *params)
FIND_PROP_SEND(DPT_Int, "integer"); 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; void *pGameRules = *g_pGameRules;
if (bit_count < 1) if (bit_count < 1)
@@ -339,9 +372,14 @@ static cell_t GameRules_GetPropEnt(IPluginContext *pContext, const cell_t *param
void *pGameRules = *g_pGameRules; void *pGameRules = *g_pGameRules;
CBaseHandle &hndl = *(CBaseHandle *)((intptr_t)pGameRules + offset); CBaseHandle &hndl = *(CBaseHandle *)((intptr_t)pGameRules + offset);
CBaseEntity *pEntity = gamehelpers->ReferenceToEntity(hndl.GetEntryIndex());
int ref = gamehelpers->IndexToReference(hndl.GetEntryIndex()); if (!pEntity || ((IServerEntity *)pEntity)->GetRefEHandle() != hndl)
return gamehelpers->ReferenceToBCompatRef(ref); {
return -1;
}
return gamehelpers->EntityToBCompatRef(pEntity);
} }
static cell_t GameRules_SetPropEnt(IPluginContext *pContext, const cell_t *params) 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) if (sendChange)
{ {
v = (Vector *)((intptr_t)g_pGameRules + offset); v = (Vector *)((intptr_t)pProxy + offset);
v->x = sp_ctof(vec[0]); v->x = sp_ctof(vec[0]);
v->y = sp_ctof(vec[1]); v->y = sp_ctof(vec[1]);
v->z = sp_ctof(vec[2]); v->z = sp_ctof(vec[2]);
+1 -1
View File
@@ -129,7 +129,7 @@ static cell_t PrepSDKCall_SetSignature(IPluginContext *pContext, const cell_t *p
{ {
return 0; 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]); s_call_addr = memutils->ResolveSymbol(handle, &sig[1]);
#else #else
s_call_addr = dlsym(handle, &sig[1]); s_call_addr = dlsym(handle, &sig[1]);
+12 -2
View File
@@ -125,6 +125,7 @@ void GetIServer()
int offset; int offset;
void *vfunc = NULL; void *vfunc = NULL;
#if SOURCE_ENGINE != SE_ORANGEBOXVALVE
#if defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11 #if defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11
/* Get the CreateFakeClient function pointer */ /* Get the CreateFakeClient function pointer */
if (!(vfunc=SH_GET_ORIG_VFNPTR_ENTRY(engine, &IVEngineServer::CreateFakeClient))) 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); void **vtable = *reinterpret_cast<void ***>(enginePatch->GetThisPtr() + info.thisptroffs + info.vtbloffs);
vfunc = vtable[info.vtblindex]; vfunc = vtable[info.vtblindex];
} }
#endif #endif // defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11
#endif // SOURCE_ENGINE != SE_ORANGEBOXVALVE
/* Get signature string for IVEngineServer::CreateFakeClient() */ /* Get signature string for IVEngineServer::CreateFakeClient() */
sigstr = g_pGameConf->GetKeyValue("CreateFakeClient_Windows"); sigstr = g_pGameConf->GetKeyValue("CreateFakeClient_Windows");
@@ -154,12 +156,20 @@ void GetIServer()
/* Convert signature string to signature bytes */ /* Convert signature string to signature bytes */
siglen = UTIL_StringToSignature(sigstr, sig, sizeof(sig)); 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 */ /* Check if we're on the expected function */
if (!UTIL_VerifySignature(vfunc, sig, siglen)) if (!UTIL_VerifySignature(vfunc, sig, siglen))
{ {
return; return;
} }
#endif
/* Get the offset into CreateFakeClient */ /* Get the offset into CreateFakeClient */
if (!g_pGameConf->GetOffset("sv", &offset)) if (!g_pGameConf->GetOffset("sv", &offset))
+5
View File
@@ -528,7 +528,12 @@ static cell_t SlapPlayer(IPluginContext *pContext, const cell_t *params)
CellRecipientFilter rf; CellRecipientFilter rf;
rf.SetToReliable(true); rf.SetToReliable(true);
rf.Initialize(player_list, total_players); rf.Initialize(player_list, total_players);
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
engsound->EmitSound(rf, params[1], CHAN_AUTO, sound_name, VOL_NORM, ATTN_NORM, 0, PITCH_NORM, 0, &pos);
#else
engsound->EmitSound(rf, params[1], CHAN_AUTO, sound_name, VOL_NORM, ATTN_NORM, 0, PITCH_NORM, &pos); engsound->EmitSound(rf, params[1], CHAN_AUTO, sound_name, VOL_NORM, ATTN_NORM, 0, PITCH_NORM, &pos);
#endif
} }
} }
+128
View File
@@ -33,8 +33,13 @@
#include <IForwardSys.h> #include <IForwardSys.h>
SH_DECL_HOOK8_void(IVEngineServer, EmitAmbientSound, SH_NOATTRIB, 0, int, const Vector &, const char *, float, soundlevel_t, int, int, float); SH_DECL_HOOK8_void(IVEngineServer, EmitAmbientSound, SH_NOATTRIB, 0, int, const Vector &, const char *, float, soundlevel_t, int, int, float);
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
SH_DECL_HOOK15_void(IEngineSound, EmitSound, SH_NOATTRIB, 0, IRecipientFilter &, int, int, const char *, float, float, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int);
SH_DECL_HOOK15_void(IEngineSound, EmitSound, SH_NOATTRIB, 1, IRecipientFilter &, int, int, const char *, float, soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int);
#else
SH_DECL_HOOK14_void(IEngineSound, EmitSound, SH_NOATTRIB, 0, IRecipientFilter &, int, int, const char *, float, float, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int); SH_DECL_HOOK14_void(IEngineSound, EmitSound, SH_NOATTRIB, 0, IRecipientFilter &, int, int, const char *, float, float, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int);
SH_DECL_HOOK14_void(IEngineSound, EmitSound, SH_NOATTRIB, 1, IRecipientFilter &, int, int, const char *, float, soundlevel_t, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int); SH_DECL_HOOK14_void(IEngineSound, EmitSound, SH_NOATTRIB, 1, IRecipientFilter &, int, int, const char *, float, soundlevel_t, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int);
#endif
bool g_InSoundHook = false; bool g_InSoundHook = false;
@@ -252,10 +257,17 @@ void SoundHooks::OnEmitAmbientSound(int entindex, const Vector &pos, const char
} }
} }
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
void SoundHooks::OnEmitSound(IRecipientFilter &filter, int iEntIndex, int iChannel, const char *pSample,
float flVolume, soundlevel_t iSoundlevel, int iFlags, int iPitch, int iSpecialDSP, const Vector *pOrigin,
const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions,
float soundtime, int speakerentity)
#else
void SoundHooks::OnEmitSound(IRecipientFilter &filter, int iEntIndex, int iChannel, const char *pSample, void SoundHooks::OnEmitSound(IRecipientFilter &filter, int iEntIndex, int iChannel, const char *pSample,
float flVolume, soundlevel_t iSoundlevel, int iFlags, int iPitch, const Vector *pOrigin, float flVolume, soundlevel_t iSoundlevel, int iFlags, int iPitch, const Vector *pOrigin,
const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions, const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions,
float soundtime, int speakerentity) float soundtime, int speakerentity)
#endif
{ {
SoundHookIter iter; SoundHookIter iter;
IPluginFunction *pFunc; IPluginFunction *pFunc;
@@ -293,6 +305,15 @@ void SoundHooks::OnEmitSound(IRecipientFilter &filter, int iEntIndex, int iChann
{ {
CellRecipientFilter crf; CellRecipientFilter crf;
crf.Initialize(players, size); crf.Initialize(players, size);
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
RETURN_META_NEWPARAMS(
MRES_IGNORED,
static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, soundlevel_t,
int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)>(&IEngineSound::EmitSound),
(crf, iEntIndex, iChannel, buffer, flVolume, iSoundlevel, iFlags, iPitch, iSpecialDSP, pOrigin,
pDirection, pUtlVecOrigins, bUpdatePositions, soundtime, speakerentity)
);
#else
RETURN_META_NEWPARAMS( RETURN_META_NEWPARAMS(
MRES_IGNORED, MRES_IGNORED,
static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, soundlevel_t, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, soundlevel_t,
@@ -300,15 +321,23 @@ void SoundHooks::OnEmitSound(IRecipientFilter &filter, int iEntIndex, int iChann
(crf, iEntIndex, iChannel, buffer, flVolume, iSoundlevel, iFlags, iPitch, pOrigin, (crf, iEntIndex, iChannel, buffer, flVolume, iSoundlevel, iFlags, iPitch, pOrigin,
pDirection, pUtlVecOrigins, bUpdatePositions, soundtime, speakerentity) pDirection, pUtlVecOrigins, bUpdatePositions, soundtime, speakerentity)
); );
#endif
} }
} }
} }
} }
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
void SoundHooks::OnEmitSound2(IRecipientFilter &filter, int iEntIndex, int iChannel, const char *pSample,
float flVolume, float flAttenuation, int iFlags, int iPitch, int iSpecialDSP, const Vector *pOrigin,
const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions,
float soundtime, int speakerentity)
#else
void SoundHooks::OnEmitSound2(IRecipientFilter &filter, int iEntIndex, int iChannel, const char *pSample, void SoundHooks::OnEmitSound2(IRecipientFilter &filter, int iEntIndex, int iChannel, const char *pSample,
float flVolume, float flAttenuation, int iFlags, int iPitch, const Vector *pOrigin, float flVolume, float flAttenuation, int iFlags, int iPitch, const Vector *pOrigin,
const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions, const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions,
float soundtime, int speakerentity) float soundtime, int speakerentity)
#endif
{ {
SoundHookIter iter; SoundHookIter iter;
IPluginFunction *pFunc; IPluginFunction *pFunc;
@@ -347,6 +376,15 @@ void SoundHooks::OnEmitSound2(IRecipientFilter &filter, int iEntIndex, int iChan
{ {
CellRecipientFilter crf; CellRecipientFilter crf;
crf.Initialize(players, size); crf.Initialize(players, size);
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
RETURN_META_NEWPARAMS(
MRES_IGNORED,
static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, float,
int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)>(&IEngineSound::EmitSound),
(crf, iEntIndex, iChannel, buffer, flVolume, SNDLVL_TO_ATTN(static_cast<soundlevel_t>(sndlevel)),
iFlags, iPitch, iSpecialDSP, pOrigin, pDirection, pUtlVecOrigins, bUpdatePositions, soundtime, speakerentity)
);
#else
RETURN_META_NEWPARAMS( RETURN_META_NEWPARAMS(
MRES_IGNORED, MRES_IGNORED,
static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, float, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, float,
@@ -354,6 +392,7 @@ void SoundHooks::OnEmitSound2(IRecipientFilter &filter, int iEntIndex, int iChan
(crf, iEntIndex, iChannel, buffer, flVolume, SNDLVL_TO_ATTN(static_cast<soundlevel_t>(sndlevel)), (crf, iEntIndex, iChannel, buffer, flVolume, SNDLVL_TO_ATTN(static_cast<soundlevel_t>(sndlevel)),
iFlags, iPitch, pOrigin, pDirection, pUtlVecOrigins, bUpdatePositions, soundtime, speakerentity) iFlags, iPitch, pOrigin, pDirection, pUtlVecOrigins, bUpdatePositions, soundtime, speakerentity)
); );
#endif
} }
} }
} }
@@ -547,6 +586,48 @@ static cell_t EmitSound(IPluginContext *pContext, const cell_t *params)
player[0] = cl_array[i]; player[0] = cl_array[i];
crf.Reset(); crf.Reset();
crf.Initialize(player, 1); crf.Initialize(player, 1);
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
if (g_InSoundHook)
{
SH_CALL(enginesoundPatch,
static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float,
soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)>
(&IEngineSound::EmitSound))
(crf,
player[0],
channel,
sample,
vol,
(soundlevel_t)level,
flags,
pitch,
0,
pOrigin,
pDir,
pOrigVec,
updatePos,
soundtime,
speakerentity);
}
else
{
engsound->EmitSound(crf,
player[0],
channel,
sample,
vol,
(soundlevel_t)level,
flags,
pitch,
0,
pOrigin,
pDir,
pOrigVec,
updatePos,
soundtime,
speakerentity);
}
#else
if (g_InSoundHook) if (g_InSoundHook)
{ {
SH_CALL(enginesoundPatch, SH_CALL(enginesoundPatch,
@@ -585,8 +666,51 @@ static cell_t EmitSound(IPluginContext *pContext, const cell_t *params)
soundtime, soundtime,
speakerentity); speakerentity);
} }
#endif
} }
} else { } else {
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
if (g_InSoundHook)
{
SH_CALL(enginesoundPatch,
static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float,
soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)>
(&IEngineSound::EmitSound))
(crf,
entity,
channel,
sample,
vol,
(soundlevel_t)level,
flags,
pitch,
0,
pOrigin,
pDir,
pOrigVec,
updatePos,
soundtime,
speakerentity);
}
else
{
engsound->EmitSound(crf,
entity,
channel,
sample,
vol,
(soundlevel_t)level,
flags,
pitch,
0,
pOrigin,
pDir,
pOrigVec,
updatePos,
soundtime,
speakerentity);
}
#else
if (g_InSoundHook) if (g_InSoundHook)
{ {
SH_CALL(enginesoundPatch, SH_CALL(enginesoundPatch,
@@ -625,6 +749,7 @@ static cell_t EmitSound(IPluginContext *pContext, const cell_t *params)
soundtime, soundtime,
speakerentity); speakerentity);
} }
#endif
} }
return 1; return 1;
@@ -714,6 +839,9 @@ static cell_t EmitSentence(IPluginContext *pContext, const cell_t *params)
(soundlevel_t)level, (soundlevel_t)level,
flags, flags,
pitch, pitch,
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
0,
#endif
pOrigin, pOrigin,
pDir, pDir,
pOrigVec, pOrigVec,
+11
View File
@@ -52,6 +52,16 @@ public:
bool RemoveHook(int type, IPluginFunction *pFunc); bool RemoveHook(int type, IPluginFunction *pFunc);
void OnEmitAmbientSound(int entindex, const Vector &pos, const char *samp, float vol, void OnEmitAmbientSound(int entindex, const Vector &pos, const char *samp, float vol,
soundlevel_t soundlevel, int fFlags, int pitch, float delay); soundlevel_t soundlevel, int fFlags, int pitch, float delay);
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
void OnEmitSound(IRecipientFilter& filter, int iEntIndex, int iChannel, const char *pSample, float flVolume,
soundlevel_t iSoundlevel, int iFlags, int iPitch, int iSpecialDSP, const Vector *pOrigin,
const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions,
float soundtime, int speakerentity);
void OnEmitSound2(IRecipientFilter& filter, int iEntIndex, int iChannel, const char *pSample, float flVolume,
float flAttenuation, int iFlags, int iPitch, int iSpecialDSP, const Vector *pOrigin,
const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions,
float soundtime, int speakerentity);
#else
void OnEmitSound(IRecipientFilter& filter, int iEntIndex, int iChannel, const char *pSample, float flVolume, void OnEmitSound(IRecipientFilter& filter, int iEntIndex, int iChannel, const char *pSample, float flVolume,
soundlevel_t iSoundlevel, int iFlags, int iPitch, const Vector *pOrigin, soundlevel_t iSoundlevel, int iFlags, int iPitch, const Vector *pOrigin,
const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions, const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions,
@@ -60,6 +70,7 @@ public:
float flAttenuation, int iFlags, int iPitch, const Vector *pOrigin, float flAttenuation, int iFlags, int iPitch, const Vector *pOrigin,
const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions, const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions,
float soundtime, int speakerentity); float soundtime, int speakerentity);
#endif
private: private:
size_t _FillInPlayers(int *pl_array, IRecipientFilter *pFilter); size_t _FillInPlayers(int *pl_array, IRecipientFilter *pFilter);
void _IncRefCounter(int type); void _IncRefCounter(int type);
+23 -6
View File
@@ -39,11 +39,11 @@ cell_t TF2_MakeBleed(IPluginContext *pContext, const cell_t *params)
{ {
static ICallWrapper *pWrapper = NULL; static ICallWrapper *pWrapper = NULL;
// CTFPlayerShared::MakeBleed(CTFPlayer*, CTFWeaponBase*, float) // CTFPlayerShared::MakeBleed(CTFPlayer*, CTFWeaponBase*, float, int=4)
if(!pWrapper) if(!pWrapper)
{ {
REGISTER_NATIVE_ADDR("MakeBleed", REGISTER_NATIVE_ADDR("MakeBleed",
PassInfo pass[3]; \ PassInfo pass[4]; \
pass[0].flags = PASSFLAG_BYVAL; \ pass[0].flags = PASSFLAG_BYVAL; \
pass[0].size = sizeof(CBaseEntity *); \ pass[0].size = sizeof(CBaseEntity *); \
pass[0].type = PassType_Basic; \ 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].flags = PASSFLAG_BYVAL; \
pass[2].size = sizeof(float); \ pass[2].size = sizeof(float); \
pass[2].type = PassType_Basic; \ 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; CBaseEntity *pEntity;
@@ -80,6 +83,8 @@ cell_t TF2_MakeBleed(IPluginContext *pContext, const cell_t *params)
*(CBaseEntity **)vptr = NULL; *(CBaseEntity **)vptr = NULL;
vptr += sizeof(CBaseEntity *); vptr += sizeof(CBaseEntity *);
*(float *)vptr = sp_ctof(params[3]); *(float *)vptr = sp_ctof(params[3]);
vptr += sizeof(float);
*(int *)vptr = 4;
pWrapper->Execute(vstk, NULL); pWrapper->Execute(vstk, NULL);
@@ -449,12 +454,16 @@ cell_t TF2_Regenerate(IPluginContext *pContext, const cell_t *params)
{ {
static ICallWrapper *pWrapper = NULL; static ICallWrapper *pWrapper = NULL;
//CTFPlayer::Regenerate() //CTFPlayer::Regenerate( bool=true )
if (!pWrapper) if (!pWrapper)
{ {
REGISTER_NATIVE_ADDR("Regenerate", 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; 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]); 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; return 1;
} }
+34
View File
@@ -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 */
}
}
}
+4 -1
View File
@@ -58,6 +58,9 @@
"engine.eye.txt" "engine.eye.txt"
{ {
"engine" "eye" "engine" "eye"
}
"blacklist.plugins.txt"
{
} }
} }
-1
View File
@@ -17,7 +17,6 @@
"#supported" "#supported"
{ {
"game" "ageofchivalry" "game" "ageofchivalry"
"game" "zps"
"game" "empires" "game" "empires"
"game" "synergy" "game" "synergy"
"game" "bg2" "game" "bg2"
+24 -10
View File
@@ -73,6 +73,7 @@
"game" "dod" "game" "dod"
"game" "tf" "game" "tf"
"game" "hl2mp" "game" "hl2mp"
"game" "garrysmod"
"game" "cstrike" "game" "cstrike"
} }
@@ -82,7 +83,7 @@
"FindEntityByClassname" "FindEntityByClassname"
{ {
"library" "server" "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" "linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
"mac" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc" "mac" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
} }
@@ -137,17 +138,22 @@
/* IServer interface pointer */ /* IServer interface pointer */
"#default" "#default"
{ {
"#supported"
{
"game" "dod"
"game" "tf"
"game" "hl2mp"
"game" "garrysmod"
"game" "cstrike"
}
"Keys" "Keys"
{ {
/* Signature for the beginning of IVEngineServer::CreateFakeClient. /* Signature for the beginning of IVEngineServer::CreateFakeClientEx.
* * (Must be unique!)
* 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.
*/ */
"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" "Offsets"
@@ -174,6 +180,14 @@
/* EntityFactoryDictionary function */ /* EntityFactoryDictionary function */
"#default" "#default"
{ {
"#supported"
{
"game" "tf"
"game" "dod"
"game" "hl2mp"
"game" "cstrike"
}
"Signatures" "Signatures"
{ {
"EntityFactory" "EntityFactory"
@@ -201,7 +215,7 @@
"FireOutput" "FireOutput"
{ {
"library" "server" "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" "linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
"mac" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f" "mac" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
} }
-1
View File
@@ -196,7 +196,6 @@
"#supported" "#supported"
{ {
"game" "left4dead2" "game" "left4dead2"
"game" "nucleardawn"
} }
"Signatures" "Signatures"
{ {
+16 -16
View File
@@ -1,6 +1,6 @@
"Games" "Games"
{ {
/* CSpromod 1.05 */ /* CSpromod 1.09 */
"cspromod" "cspromod"
{ {
"Offsets" "Offsets"
@@ -8,47 +8,47 @@
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "353" "windows" "353"
"linux" "354" "linux" "355"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
"windows" "239" "windows" "238"
"linux" "240" "linux" "240"
} }
"Weapon_GetSlot" "Weapon_GetSlot"
{ {
"windows" "237" "windows" "236"
"linux" "238" "linux" "238"
} }
"Ignite" "Ignite"
{ {
"windows" "194" "windows" "193"
"linux" "195" "linux" "195"
} }
"Extinguish" "Extinguish"
{ {
"windows" "198" "windows" "197"
"linux" "199" "linux" "199"
} }
"Teleport" "Teleport"
{ {
"windows" "101" "windows" "100"
"linux" "102" "linux" "102"
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "389" "windows" "390"
"linux" "389" "linux" "391"
} }
"GetVelocity" "GetVelocity"
{ {
"windows" "131" "windows" "132"
"linux" "132" "linux" "134"
} }
"EyeAngles" "EyeAngles"
{ {
"windows" "123" "windows" "124"
"linux" "124" "linux" "126"
} }
"AcceptInput" "AcceptInput"
{ {
@@ -57,7 +57,7 @@
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "230" "windows" "229"
"linux" "231" "linux" "231"
} }
"SetEntityModel" "SetEntityModel"
@@ -72,8 +72,8 @@
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "373" "windows" "374"
"linux" "374" "linux" "376"
} }
} }
} }
+42 -42
View File
@@ -28,87 +28,87 @@
{ {
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "392" "windows" "399"
"linux" "393" "linux" "400"
"mac" "393" "mac" "400"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
"windows" "263" "windows" "268"
"linux" "264" "linux" "269"
"mac" "264" "mac" "269"
} }
"Weapon_GetSlot" "Weapon_GetSlot"
{ {
"windows" "261" "windows" "266"
"linux" "262" "linux" "267"
"mac" "262" "mac" "267"
} }
"Ignite" "Ignite"
{ {
"windows" "204" "windows" "207"
"linux" "205" "linux" "208"
"mac" "205" "mac" "208"
} }
"Extinguish" "Extinguish"
{ {
"windows" "208" "windows" "211"
"linux" "209" "linux" "212"
"mac" "209" "mac" "212"
} }
"Teleport" "Teleport"
{ {
"windows" "106" "windows" "107"
"linux" "107" "linux" "108"
"mac" "107" "mac" "108"
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "433" "windows" "440"
"linux" "433" "linux" "440"
"mac" "433" "mac" "440"
} }
"GetVelocity" "GetVelocity"
{ {
"windows" "138" "windows" "139"
"linux" "139" "linux" "140"
"mac" "139" "mac" "140"
} }
"EyeAngles" "EyeAngles"
{ {
"windows" "129" "windows" "130"
"linux" "130" "linux" "131"
"mac" "130" "mac" "131"
} }
"AcceptInput" "AcceptInput"
{ {
"windows" "35" "windows" "36"
"linux" "36" "linux" "37"
"mac" "36" "mac" "37"
} }
"SetEntityModel" "SetEntityModel"
{ {
"windows" "23" "windows" "24"
"linux" "24" "linux" "25"
"mac" "24" "mac" "25"
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "254" "windows" "259"
"linux" "255" "linux" "260"
"mac" "255" "mac" "260"
} }
"Activate" "Activate"
{ {
"windows" "32" "windows" "33"
"linux" "33" "linux" "34"
"mac" "33" "mac" "34"
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "410" "windows" "417"
"linux" "411" "linux" "418"
"mac" "411" "mac" "418"
} }
} }
} }
+3 -3
View File
@@ -7,7 +7,7 @@
{ {
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "423" "windows" "424"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
@@ -31,7 +31,7 @@
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "468" "windows" "469"
} }
"GetVelocity" "GetVelocity"
{ {
@@ -59,7 +59,7 @@
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "444" "windows" "445"
} }
} }
+42 -42
View File
@@ -18,87 +18,87 @@
{ {
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "391" "windows" "398"
"linux" "392" "linux" "399"
"mac" "392" "mac" "399"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
"windows" "263" "windows" "268"
"linux" "264" "linux" "269"
"mac" "264" "mac" "269"
} }
"Weapon_GetSlot" "Weapon_GetSlot"
{ {
"windows" "261" "windows" "266"
"linux" "262" "linux" "267"
"mac" "262" "mac" "267"
} }
"Ignite" "Ignite"
{ {
"windows" "204" "windows" "207"
"linux" "205" "linux" "208"
"mac" "205" "mac" "208"
} }
"Extinguish" "Extinguish"
{ {
"windows" "208" "windows" "211"
"linux" "209" "linux" "212"
"mac" "209" "mac" "212"
} }
"Teleport" "Teleport"
{ {
"windows" "106" "windows" "107"
"linux" "107" "linux" "108"
"mac" "107" "mac" "108"
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "429" "windows" "436"
"linux" "430" "linux" "437"
"mac" "430" "mac" "437"
} }
"GetVelocity" "GetVelocity"
{ {
"windows" "138" "windows" "139"
"linux" "139" "linux" "140"
"mac" "139" "mac" "140"
} }
"EyeAngles" "EyeAngles"
{ {
"windows" "129" "windows" "130"
"linux" "130" "linux" "131"
"mac" "130" "mac" "131"
} }
"AcceptInput" "AcceptInput"
{ {
"windows" "35" "windows" "36"
"linux" "36" "linux" "37"
"mac" "36" "mac" "37"
} }
"SetEntityModel" "SetEntityModel"
{ {
"windows" "23" "windows" "24"
"linux" "24" "linux" "25"
"mac" "24" "mac" "25"
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "254" "windows" "259"
"linux" "255" "linux" "260"
"mac" "255" "mac" "260"
} }
"Activate" "Activate"
{ {
"windows" "32" "windows" "33"
"linux" "33" "linux" "34"
"mac" "33" "mac" "34"
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "409" "windows" "416"
"linux" "410" "linux" "417"
"mac" "410" "mac" "417"
} }
} }
+77 -62
View File
@@ -18,115 +18,99 @@
{ {
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "433" "windows" "437"
"linux" "434" "linux" "438"
"mac" "434" "mac" "438"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
"windows" "305" "windows" "308"
"linux" "306" "linux" "309"
"mac" "306" "mac" "309"
} }
"Weapon_GetSlot" "Weapon_GetSlot"
{ {
"windows" "303" "windows" "306"
"linux" "304" "linux" "307"
"mac" "304" "mac" "307"
} }
"Ignite" "Ignite"
{ {
"windows" "240" "windows" "243"
"linux" "241" "linux" "244"
"mac" "241" "mac" "244"
} }
"Extinguish" "Extinguish"
{ {
"windows" "244" "windows" "247"
"linux" "245" "linux" "248"
"mac" "245" "mac" "248"
} }
"Teleport" "Teleport"
{ {
"windows" "107" "windows" "108"
"linux" "108" "linux" "109"
"mac" "108" "mac" "109"
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "472" "windows" "476"
"linux" "472" "linux" "476"
"mac" "472" "mac" "476"
} }
"GetVelocity" "GetVelocity"
{ {
"windows" "139" "windows" "140"
"linux" "140" "linux" "141"
"mac" "140" "mac" "141"
} }
"EyeAngles" "EyeAngles"
{ {
"windows" "130" "windows" "131"
"linux" "131" "linux" "132"
"mac" "131" "mac" "132"
} }
"AcceptInput" "AcceptInput"
{ {
"windows" "35" "windows" "36"
"linux" "36" "linux" "37"
"mac" "36" "mac" "37"
} }
"SetEntityModel" "SetEntityModel"
{ {
"windows" "23" "windows" "24"
"linux" "24" "linux" "25"
"mac" "24" "mac" "25"
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "296" "windows" "299"
"linux" "297" "linux" "300"
"mac" "297" "mac" "300"
} }
"Activate" "Activate"
{ {
"windows" "32" "windows" "33"
"linux" "33" "linux" "34"
"mac" "33" "mac" "34"
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "451" "windows" "455"
"linux" "452" "linux" "456"
"mac" "452" "mac" "456"
}
}
"Signatures"
{
"FindEntityByClassname"
{
"library" "server"
"windows" "\x53\x55\x56\x8B\xF1\x8B\x2A\x2A\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\x2A\x8B\x3C\x30\xEB\x2A\x8B\x2A\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x2A\x2A\x2A\x8B\x2A\x2A\x2A\x2A\x2A\xEB\x2A\x8D\x2A\x2A\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x2A\x83\x2A\x2A\xEB\x2A\x39"
"linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
"mac" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
}
"FireOutput"
{
"library" "server"
"windows" "\x81\xEC\x2A\x2A\x2A\x2A\x53\x55\x56\x8B\x71\x2A\x85\xF6"
"linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
"mac" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
} }
} }
} }
"#default" "garrysmod"
{ {
"Offsets" "Offsets"
{ {
/* Offset into func at "CBaseTempEntity" signature */
"s_pTempEntities" "s_pTempEntities"
{ {
"windows" "17" "windows" "8"
} }
"GetTEName" "GetTEName"
{ {
@@ -150,10 +134,13 @@
"Signatures" "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" "CBaseTempEntity"
{ {
"library" "server" "library" "server"
"windows" "\x8B\xC1\x8B\x4C\x24\x04\xC7\x00\x2A\x2A\x2A\x2A\x89\x48\x04\x8B\x15\x2A\x2A\x2A\x2A\x89\x50\x08\xA3\x2A\x2A\x2A\x2A\xC2\x04\x00" "windows" "\x55\x8B\xEC\x51\x0F\x57\xC0\xA1\x2A\x2A\x2A\x2A\x8D\x4D\xFC\xA3"
} }
"s_pTempEntities" "s_pTempEntities"
{ {
@@ -163,4 +150,32 @@
} }
} }
} }
"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"
}
}
}
} }
+17 -17
View File
@@ -6,28 +6,28 @@
{ {
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "352" "windows" "354"
"linux" "353" "linux" "355"
} }
"RemovePlayerItem" "RemovePlayerItem"
{
"windows" "241"
"linux" "242"
}
"Weapon_GetSlot"
{ {
"windows" "239" "windows" "239"
"linux" "240" "linux" "240"
} }
"Weapon_GetSlot"
{
"windows" "237"
"linux" "238"
}
"Ignite" "Ignite"
{ {
"windows" "194" "windows" "196"
"linux" "195" "linux" "197"
} }
"Extinguish" "Extinguish"
{ {
"windows" "198" "windows" "200"
"linux" "199" "linux" "201"
} }
"Teleport" "Teleport"
{ {
@@ -36,8 +36,8 @@
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "393" "windows" "395"
"linux" "393" "linux" "395"
} }
"GetVelocity" "GetVelocity"
{ {
@@ -61,8 +61,8 @@
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "230" "windows" "232"
"linux" "231" "linux" "233"
} }
"Activate" "Activate"
{ {
@@ -71,8 +71,8 @@
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "372" "windows" "374"
"linux" "373" "linux" "375"
} }
"s_pTempEntities" "s_pTempEntities"
{ {
+5
View File
@@ -97,6 +97,11 @@
"windows" "198" "windows" "198"
"linux" "199" "linux" "199"
} }
"PlayerRunCmd"
{
"windows" "364"
"linux" "365"
}
} }
"Signatures" "Signatures"
+42 -42
View File
@@ -18,87 +18,87 @@
{ {
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "391" "windows" "398"
"linux" "392" "linux" "399"
"mac" "392" "mac" "399"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
"windows" "263" "windows" "268"
"linux" "264" "linux" "269"
"mac" "264" "mac" "269"
} }
"Weapon_GetSlot" "Weapon_GetSlot"
{ {
"windows" "261" "windows" "266"
"linux" "262" "linux" "267"
"mac" "262" "mac" "267"
} }
"Ignite" "Ignite"
{ {
"windows" "204" "windows" "207"
"linux" "205" "linux" "208"
"mac" "205" "mac" "208"
} }
"Extinguish" "Extinguish"
{ {
"windows" "208" "windows" "211"
"linux" "209" "linux" "212"
"mac" "209" "mac" "212"
} }
"Teleport" "Teleport"
{ {
"windows" "106" "windows" "107"
"linux" "107" "linux" "108"
"mac" "107" "mac" "108"
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "430" "windows" "437"
"linux" "430" "linux" "437"
"mac" "430" "mac" "437"
} }
"GetVelocity" "GetVelocity"
{ {
"windows" "138" "windows" "139"
"linux" "139" "linux" "140"
"mac" "139" "mac" "140"
} }
"EyeAngles" "EyeAngles"
{ {
"windows" "129" "windows" "130"
"linux" "130" "linux" "131"
"mac" "130" "mac" "131"
} }
"AcceptInput" "AcceptInput"
{ {
"windows" "35" "windows" "36"
"linux" "36" "linux" "37"
"mac" "36" "mac" "37"
} }
"SetEntityModel" "SetEntityModel"
{ {
"windows" "23" "windows" "24"
"linux" "24" "linux" "25"
"mac" "24" "mac" "25"
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "254" "windows" "259"
"linux" "255" "linux" "260"
"mac" "255" "mac" "260"
} }
"Activate" "Activate"
{ {
"windows" "32" "windows" "33"
"linux" "33" "linux" "34"
"mac" "33" "mac" "34"
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "409" "windows" "416"
"linux" "410" "linux" "417"
"mac" "410" "mac" "417"
} }
} }
} }
+24 -24
View File
@@ -7,33 +7,33 @@
{ {
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "506" "windows" "507"
"linux" "507" "linux" "508"
"mac" "507" "mac" "508"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
"windows" "288" "windows" "289"
"linux" "289" "linux" "290"
"mac" "289" "mac" "290"
} }
"Weapon_GetSlot" "Weapon_GetSlot"
{ {
"windows" "286" "windows" "287"
"linux" "287" "linux" "288"
"mac" "287" "mac" "288"
} }
"Ignite" "Ignite"
{ {
"windows" "221" "windows" "222"
"linux" "222" "linux" "223"
"mac" "222" "mac" "223"
} }
"Extinguish" "Extinguish"
{ {
"windows" "224" "windows" "225"
"linux" "225" "linux" "226"
"mac" "225" "mac" "226"
} }
"Teleport" "Teleport"
{ {
@@ -43,9 +43,9 @@
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "474" "windows" "475"
"linux" "474" "linux" "475"
"mac" "474" "mac" "475"
} }
"GetVelocity" "GetVelocity"
{ {
@@ -73,9 +73,9 @@
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "279" "windows" "280"
"linux" "280" "linux" "281"
"mac" "280" "mac" "281"
} }
"Activate" "Activate"
{ {
@@ -85,9 +85,9 @@
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "452" "windows" "453"
"linux" "453" "linux" "454"
"mac" "453" "mac" "454"
} }
} }
+13 -13
View File
@@ -11,25 +11,25 @@
"Games" "Games"
{ {
/* No More Room in Hell 1.02 */ /* No More Room in Hell 1.05 */
"nmrih" "nmrih"
{ {
"Offsets" "Offsets"
{ {
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "361" "windows" "362"
"linux" "362" "linux" "363"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
"windows" "240" "windows" "241"
"linux" "241" "linux" "242"
} }
"Weapon_GetSlot" "Weapon_GetSlot"
{ {
"windows" "238" "windows" "239"
"linux" "239" "linux" "240"
} }
"Ignite" "Ignite"
{ {
@@ -48,8 +48,8 @@
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "402" "windows" "403"
"linux" "402" "linux" "403"
} }
"GetVelocity" "GetVelocity"
{ {
@@ -73,8 +73,8 @@
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "231" "windows" "232"
"linux" "232" "linux" "233"
} }
"Activate" "Activate"
{ {
@@ -83,8 +83,8 @@
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "381" "windows" "382"
"linux" "382" "linux" "383"
} }
/* Offset into CBaseTempEntity constructor (vs2010 moved it!) */ /* Offset into CBaseTempEntity constructor (vs2010 moved it!) */
@@ -95,5 +95,16 @@
{ {
"GameRulesProxy" "CNuclearDawnRulesProxy" "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"
}
}
} }
} }
+17 -17
View File
@@ -19,28 +19,28 @@
/* CBasePlayer */ /* CBasePlayer */
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "352" "windows" "354"
"linux" "353" "linux" "355"
} }
"RemovePlayerItem" "RemovePlayerItem"
{
"windows" "241"
"linux" "242"
}
"Weapon_GetSlot"
{ {
"windows" "239" "windows" "239"
"linux" "240" "linux" "240"
} }
"Weapon_GetSlot"
{
"windows" "237"
"linux" "238"
}
"Ignite" "Ignite"
{ {
"windows" "194" "windows" "196"
"linux" "195" "linux" "197"
} }
"Extinguish" "Extinguish"
{ {
"windows" "198" "windows" "200"
"linux" "199" "linux" "201"
} }
"Teleport" "Teleport"
{ {
@@ -49,8 +49,8 @@
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "393" "windows" "395"
"linux" "393" "linux" "395"
} }
"GetVelocity" "GetVelocity"
{ {
@@ -74,8 +74,8 @@
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "230" "windows" "232"
"linux" "231" "linux" "233"
} }
"Activate" "Activate"
{ {
@@ -84,8 +84,8 @@
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "372" "windows" "374"
"linux" "373" "linux" "375"
} }
"FireOutputBackup" "FireOutputBackup"
{ {
+8 -13
View File
@@ -19,8 +19,8 @@
/* CBasePlayer */ /* CBasePlayer */
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "355" "windows" "356"
"linux" "356" "linux" "357"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
@@ -49,8 +49,8 @@
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "396" "windows" "397"
"linux" "396" "linux" "397"
} }
"GetVelocity" "GetVelocity"
{ {
@@ -84,18 +84,13 @@
} }
"RemoveAllItems" "RemoveAllItems"
{ {
"windows" "303" "windows" "304"
"linux" "304" "linux" "305"
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "375" "windows" "376"
"linux" "376" "linux" "377"
}
"FireOutputBackup"
{
"windows" "6"
"linux" "10"
} }
} }
"Signatures" "Signatures"
+42 -42
View File
@@ -18,87 +18,87 @@
{ {
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "391" "windows" "398"
"linux" "392" "linux" "399"
"mac" "392" "mac" "399"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
"windows" "263" "windows" "268"
"linux" "264" "linux" "269"
"mac" "264" "mac" "269"
} }
"Weapon_GetSlot" "Weapon_GetSlot"
{ {
"windows" "261" "windows" "266"
"linux" "262" "linux" "267"
"mac" "262" "mac" "267"
} }
"Ignite" "Ignite"
{ {
"windows" "204" "windows" "207"
"linux" "205" "linux" "208"
"mac" "205" "mac" "208"
} }
"Extinguish" "Extinguish"
{ {
"windows" "208" "windows" "211"
"linux" "209" "linux" "212"
"mac" "209" "mac" "212"
} }
"Teleport" "Teleport"
{ {
"windows" "106" "windows" "107"
"linux" "107" "linux" "108"
"mac" "107" "mac" "108"
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "432" "windows" "439"
"linux" "432" "linux" "439"
"mac" "432" "mac" "439"
} }
"GetVelocity" "GetVelocity"
{ {
"windows" "138" "windows" "139"
"linux" "139" "linux" "140"
"mac" "139" "mac" "140"
} }
"EyeAngles" "EyeAngles"
{ {
"windows" "129" "windows" "130"
"linux" "130" "linux" "131"
"mac" "130" "mac" "131"
} }
"SetEntityModel" "SetEntityModel"
{ {
"windows" "23" "windows" "24"
"linux" "24" "linux" "25"
"mac" "24" "mac" "25"
} }
"AcceptInput" "AcceptInput"
{ {
"windows" "35" "windows" "36"
"linux" "36" "linux" "37"
"mac" "36" "mac" "37"
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "254" "windows" "259"
"linux" "255" "linux" "260"
"mac" "255" "mac" "260"
} }
"Activate" "Activate"
{ {
"windows" "32" "windows" "33"
"linux" "33" "linux" "34"
"mac" "33" "mac" "34"
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "409" "windows" "416"
"linux" "410" "linux" "417"
"mac" "410" "mac" "417"
} }
} }
+66 -25
View File
@@ -18,48 +18,48 @@
{ {
"GiveNamedItem" "GiveNamedItem"
{ {
"windows" "356" "windows" "358"
"linux" "357" "linux" "359"
} }
"RemovePlayerItem" "RemovePlayerItem"
{ {
"windows" "243" "windows" "247"
"linux" "244" "linux" "248"
} }
"Weapon_GetSlot" "Weapon_GetSlot"
{ {
"windows" "238" "windows" "242"
"linux" "239" "linux" "243"
} }
"Ignite" "Ignite"
{
"windows" "195"
"linux" "196"
}
"Extinguish"
{ {
"windows" "199" "windows" "199"
"linux" "200" "linux" "200"
} }
"Extinguish"
{
"windows" "203"
"linux" "204"
}
"Teleport" "Teleport"
{ {
"windows" "103" "windows" "104"
"linux" "104" "linux" "105"
} }
"CommitSuicide" "CommitSuicide"
{ {
"windows" "399" "windows" "405"
"linux" "399" "linux" "405"
} }
"GetVelocity" "GetVelocity"
{ {
"windows" "132" "windows" "133"
"linux" "133" "linux" "134"
} }
"EyeAngles" "EyeAngles"
{ {
"windows" "124" "windows" "125"
"linux" "125" "linux" "126"
} }
"AcceptInput" "AcceptInput"
{ {
@@ -73,8 +73,8 @@
} }
"WeaponEquip" "WeaponEquip"
{ {
"windows" "231" "windows" "235"
"linux" "232" "linux" "236"
} }
"Activate" "Activate"
{ {
@@ -83,8 +83,8 @@
} }
"PlayerRunCmd" "PlayerRunCmd"
{ {
"windows" "375" "windows" "377"
"linux" "376" "linux" "378"
} }
} }
"Signatures" "Signatures"
@@ -92,15 +92,56 @@
"FindEntityByClassname" "FindEntityByClassname"
{ {
"library" "server" "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" "linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
} }
"FireOutput" "FireOutput"
{ {
"library" "server" "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" "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"
}
}
}
} }
+4 -4
View File
@@ -32,7 +32,7 @@
"ClanTagOffset" "ClanTagOffset"
{ {
"windows" "24" "windows" "24"
"linux" "42" "linux" "29"
"mac" "29" "mac" "29"
} }
} }
@@ -69,21 +69,21 @@
"CSWeaponDrop"//Wildcard first 6 bytes for CS:S DM "CSWeaponDrop"//Wildcard first 6 bytes for CS:S DM
{ {
"library" "server" "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" "linux" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb"
"mac" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb" "mac" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb"
} }
"TerminateRound" "TerminateRound"
{ {
"library" "server" "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" "linux" "@_ZN12CCSGameRules14TerminateRoundEfi"
"mac" "@_ZN12CCSGameRules14TerminateRoundEfi" "mac" "@_ZN12CCSGameRules14TerminateRoundEfi"
} }
"GetTranslatedWeaponAlias" "GetTranslatedWeaponAlias"
{ {
"library" "server" "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" "linux" "@_Z24GetTranslatedWeaponAliasPKc"
"mac" "@_Z24GetTranslatedWeaponAliasPKc" "mac" "@_Z24GetTranslatedWeaponAliasPKc"
} }
+18 -18
View File
@@ -18,14 +18,14 @@
"Burn" "Burn"
{ {
"library" "server" "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" "linux" "@_ZN15CTFPlayerShared4BurnEP9CTFPlayerP13CTFWeaponBase"
"mac" "@_ZN15CTFPlayerShared4BurnEP9CTFPlayerP13CTFWeaponBase" "mac" "@_ZN15CTFPlayerShared4BurnEP9CTFPlayerP13CTFWeaponBase"
} }
"RemoveDisguise" "RemoveDisguise"
{ {
"library" "server" "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" "linux" "@_ZN15CTFPlayerShared14RemoveDisguiseEv"
"mac" "@_ZN15CTFPlayerShared14RemoveDisguiseEv" "mac" "@_ZN15CTFPlayerShared14RemoveDisguiseEv"
} }
@@ -41,7 +41,7 @@
"library" "server" "library" "server"
"linux" "@_ZN13CTFWeaponBase26CalcIsAttackCriticalHelperEv" "linux" "@_ZN13CTFWeaponBase26CalcIsAttackCriticalHelperEv"
"mac" "@_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" "CalcCriticalMelee"
{ {
@@ -60,28 +60,28 @@
"Regenerate" "Regenerate"
{ {
"library" "server" "library" "server"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\xF3\x0F\x10\x05\x2A\x2A\x2A\x2A\x53\x56\x8B\xF1\x8B\x86" "windows" "\x55\x8B\xEC\x83\xEC\x2A\xF3\x0F\x2A\x2A\x2A\x2A\x2A\x2A\x53\x56\x8B\xF1\x8B"
"linux" "@_ZN9CTFPlayer10RegenerateEv" "linux" "@_ZN9CTFPlayer10RegenerateEb"
"mac" "@_ZN9CTFPlayer10RegenerateEv" "mac" "@_ZN9CTFPlayer10RegenerateEb"
} }
"AddCondition" "AddCondition"
{ {
"library" "server" "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" "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" "@_ZN15CTFPlayerShared7AddCondE7ETFCondf" "linux" "@_ZN15CTFPlayerShared7AddCondE7ETFCondfP11CBaseEntity"
"mac" "@_ZN15CTFPlayerShared7AddCondE7ETFCondf" "mac" "@_ZN15CTFPlayerShared7AddCondE7ETFCondfP11CBaseEntity"
} }
"RemoveCondition" "RemoveCondition"
{ {
"library" "server" "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" "linux" "@_ZN15CTFPlayerShared10RemoveCondE7ETFCondb"
"mac" "@_ZN15CTFPlayerShared10RemoveCondE7ETFCondb" "mac" "@_ZN15CTFPlayerShared10RemoveCondE7ETFCondb"
} }
"SetPowerplayEnabled" "SetPowerplayEnabled"
{ {
"library" "server" "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" "linux" "@_ZN9CTFPlayer19SetPowerplayEnabledEb"
"mac" "@_ZN9CTFPlayer19SetPowerplayEnabledEb" "mac" "@_ZN9CTFPlayer19SetPowerplayEnabledEb"
} }
@@ -95,7 +95,7 @@
"StunPlayer" "StunPlayer"
{ {
"library" "server" "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" "linux" "@_ZN15CTFPlayerShared10StunPlayerEffiP9CTFPlayer"
"mac" "@_ZN15CTFPlayerShared10StunPlayerEffiP9CTFPlayer" "mac" "@_ZN15CTFPlayerShared10StunPlayerEffiP9CTFPlayer"
} }
@@ -109,9 +109,9 @@
"MakeBleed" "MakeBleed"
{ {
"library" "server" "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" "windows" "\x55\x8B\xEC\x83\xEC\x2A\x57\x8B\xF9\x8B\x8F\x2A\x2A\x2A\x2A\x8B\x01\x8B"
"linux" "@_ZN15CTFPlayerShared9MakeBleedEP9CTFPlayerP13CTFWeaponBasef" "linux" "@_ZN15CTFPlayerShared9MakeBleedEP9CTFPlayerP13CTFWeaponBasefi"
"mac" "@_ZN15CTFPlayerShared9MakeBleedEP9CTFPlayerP13CTFWeaponBasef" "mac" "@_ZN15CTFPlayerShared9MakeBleedEP9CTFPlayerP13CTFWeaponBasefi"
} }
"IsPlayerInDuel" "IsPlayerInDuel"
{ {
@@ -125,9 +125,9 @@
{ {
"ForceRespawn" "ForceRespawn"
{ {
"windows" "318" "windows" "323"
"linux" "319" "linux" "324"
"mac" "319" "mac" "324"
} }
} }
} }
+10
View File
@@ -77,6 +77,11 @@
#define FILENAME_1_6_BGT "sourcemod.2.bgt" PLATFORM_EXT #define FILENAME_1_6_BGT "sourcemod.2.bgt" PLATFORM_EXT
#define FILENAME_1_6_EYE "sourcemod.2.eye" 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; HINSTANCE g_hCore = NULL;
bool load_attempted = false; bool load_attempted = false;
@@ -257,6 +262,11 @@ DLL_EXPORT METAMOD_PLUGIN *CreateInterface_MMS(const MetamodVersionInfo *mvi, co
filename = FILENAME_1_6_EYE; filename = FILENAME_1_6_EYE;
break; break;
} }
case SOURCE_ENGINE_CSS:
{
filename = FILENAME_1_6_EP2VALVE;
break;
}
default: default:
{ {
return NULL; return NULL;
+1 -1
View File
@@ -506,7 +506,7 @@ stock bool:VoteMenuToAll(Handle:menu, time, flags=0)
for (new i=1; i<=MaxClients; i++) for (new i=1; i<=MaxClients; i++)
{ {
if (!IsClientInGame(i)) if (!IsClientInGame(i) || IsFakeClient(i))
{ {
continue; continue;
} }
+3
View File
@@ -66,6 +66,9 @@ enum RoundState {
//Game is over, doing bonus round stuff //Game is over, doing bonus round stuff
RoundState_Bonus, RoundState_Bonus,
//Between rounds
RoundState_BetweenRounds,
}; };
/** /**
+15 -1
View File
@@ -109,6 +109,7 @@ enum TFCond
TFCond_NoHealingDamageBuff, TFCond_NoHealingDamageBuff,
TFCond_SpeedBuffAlly, TFCond_SpeedBuffAlly,
TFCond_HalloweenCritCandy, TFCond_HalloweenCritCandy,
TFCond_CritCanteen,
TFCond_CritHype = 36, TFCond_CritHype = 36,
TFCond_CritOnFirstBlood, TFCond_CritOnFirstBlood,
@@ -117,8 +118,18 @@ enum TFCond
TFCond_CritOnKill, TFCond_CritOnKill,
TFCond_RestrictToMelee, TFCond_RestrictToMelee,
TFCond_CritMmmph = 44, TFCond_Reprogrammed = 43,
TFCond_CritMmmph,
TFCond_DefenseBuffMmmph, TFCond_DefenseBuffMmmph,
TFCond_FocusBuff,
TFCond_DisguiseRemoved,
TFCond_MarkedForDeathSilent,
TFCond_DisguisedAsDispenser,
TFCond_Sapped,
TFCond_UberchargedHidden,
TFCond_UberchargedCanteen,
TFCond_HalloweenBombHead,
TFCond_HalloweenThriller,
}; };
enum TFHoliday enum TFHoliday
@@ -126,8 +137,11 @@ enum TFHoliday
TFHoliday_Birthday = 1, TFHoliday_Birthday = 1,
TFHoliday_Halloween, TFHoliday_Halloween,
TFHoliday_Christmas, TFHoliday_Christmas,
TFHoliday_ValentinesDay,
TFHoliday_MeetThePyro,
TFHoliday_FullMoon, TFHoliday_FullMoon,
TFHoliday_HalloweenOrFullMoon, TFHoliday_HalloweenOrFullMoon,
TFHoliday_HalloweenOrFullMoonOrValentines,
}; };
enum TFObjectType enum TFObjectType
+10
View File
@@ -132,6 +132,12 @@ enum {
TF_CUSTOM_PLASMA_GIB, TF_CUSTOM_PLASMA_GIB,
TF_CUSTOM_PRACTICE_STICKY, TF_CUSTOM_PRACTICE_STICKY,
TF_CUSTOM_EYEBALL_ROCKET, 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 // Weapon codes as used in some events, such as player_death
@@ -222,6 +228,10 @@ enum {
TF_WEAPON_BAT_GIFTWRAP, TF_WEAPON_BAT_GIFTWRAP,
TF_WEAPON_GRENADE_ORNAMENT, TF_WEAPON_GRENADE_ORNAMENT,
TF_WEAPON_RAYGUN_REVENGE, TF_WEAPON_RAYGUN_REVENGE,
TF_WEAPON_PEP_BRAWLER_BLASTER,
TF_WEAPON_CLEAVER,
TF_WEAPON_GRENADE_CLEAVER,
TF_WEAPON_ROCKETPACK,
}; };
// TF2 Weapon Slots for GetPlayerWeaponSlot // TF2 Weapon Slots for GetPlayerWeaponSlot
+2 -2
View File
@@ -37,6 +37,6 @@
#define SOURCEMOD_V_MAJOR 1 /**< SourceMod Major version */ #define SOURCEMOD_V_MAJOR 1 /**< SourceMod Major version */
#define SOURCEMOD_V_MINOR 4 /**< SourceMod Minor version */ #define SOURCEMOD_V_MINOR 4 /**< SourceMod Minor version */
#define SOURCEMOD_V_RELEASE 3 /**< SourceMod Release version */ #define SOURCEMOD_V_RELEASE 7 /**< SourceMod Release version */
#define SOURCEMOD_VERSION "1.4.3" /**< SourceMod version string (major.minor.release.build) */ #define SOURCEMOD_VERSION "1.4.7" /**< SourceMod version string (major.minor.release.build) */
+1 -1
View File
@@ -1 +1 @@
1.4.3 1.4.7
+3
View File
@@ -191,6 +191,9 @@ bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error,
#if defined SMEXT_ENABLE_TRANSLATOR #if defined SMEXT_ENABLE_TRANSLATOR
SM_GET_IFACE(TRANSLATOR, translator); SM_GET_IFACE(TRANSLATOR, translator);
#endif #endif
#if defined SMEXT_ENABLE_NINVOKE
SM_GET_IFACE(NINVOKE, ninvoke);
#endif
#if defined SMEXT_ENABLE_ROOTCONSOLEMENU #if defined SMEXT_ENABLE_ROOTCONSOLEMENU
SM_GET_IFACE(ROOTCONSOLE, rootconsole); SM_GET_IFACE(ROOTCONSOLE, rootconsole);
#endif #endif
+15 -1
View File
@@ -40,7 +40,7 @@
/** SourcePawn Engine API Version */ /** SourcePawn Engine API Version */
#define SOURCEPAWN_ENGINE_API_VERSION 4 #define SOURCEPAWN_ENGINE_API_VERSION 4
#define SOURCEPAWN_ENGINE2_API_VERSION 3 #define SOURCEPAWN_ENGINE2_API_VERSION 4
#if !defined SOURCEMOD_BUILD #if !defined SOURCEMOD_BUILD
#define SOURCEMOD_BUILD #define SOURCEMOD_BUILD
@@ -479,6 +479,20 @@ namespace SourcePawn
* @return Memory usage, in bytes. * @return Memory usage, in bytes.
*/ */
virtual size_t GetMemUsage() =0; 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;
}; };
/** /**
+4 -2
View File
@@ -20,7 +20,7 @@ Pants will save us from certain death.
Invaders' blood marches through my veins, like GIANT RADIOACTIVE RUBBER PANTS! Invaders' blood marches through my veins, like GIANT RADIOACTIVE RUBBER PANTS!
THE PANTS COMMAND COMMAND ME! DO NOT IGNORE MY VEINS. THE PANTS COMMAND COMMAND ME! DO NOT IGNORE MY VEINS.
This file sure has gotten big. This file sure has gotten big.
sawce loves anime, sushi, and macs applesawce loves anime, sushi, and macs
u u
not me not me
skull man was here skull man was here
@@ -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. Everything outside of this is like a movie I once saw.
THIS IS NOT AN EXIT. THIS IS NOT AN EXIT.
ABANDON ALL HOPE YE WHO ENTER HERE. ABANDON ALL HOPE YE WHO ENTER HERE.
egg! egg!!
blimey blimey
crab crab
jibbly jibbly jibbly jibbly jibbly jibbly
@@ -51,3 +51,5 @@ clobstermonkey
that thing that thing
clobber build because amx.h changed (sigh) clobber build because amx.h changed (sigh)
a dead fish a dead fish
BuildBot is very well-written, stable, enterprise software.
I'm on a plane.
+1
View File
@@ -36,6 +36,7 @@ binary.AddSourceFiles('sourcepawn/jit', [
'zlib/trees.c', 'zlib/trees.c',
'zlib/uncompr.c', 'zlib/uncompr.c',
'zlib/zutil.c', 'zlib/zutil.c',
'md5/md5.cpp',
'../../knight/shared/KeCodeAllocator.cpp' '../../knight/shared/KeCodeAllocator.cpp'
]) ])
SM.AutoVersion('sourcepawn/jit', binary) SM.AutoVersion('sourcepawn/jit', binary)
+30 -1
View File
@@ -8,6 +8,8 @@
#include "sp_vm_basecontext.h" #include "sp_vm_basecontext.h"
#include "engine2.h" #include "engine2.h"
#include "md5/md5.h"
using namespace SourcePawn; using namespace SourcePawn;
BaseRuntime::BaseRuntime() : m_Debug(&m_plugin), m_pPlugin(&m_plugin), m_pCtx(NULL), 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_FuncCache = NULL;
m_MaxFuncs = 0; m_MaxFuncs = 0;
m_NumFuncs = 0; m_NumFuncs = 0;
memset(m_CodeHash, 0, sizeof(m_CodeHash));
memset(m_DataHash, 0, sizeof(m_DataHash));
} }
BaseRuntime::~BaseRuntime() BaseRuntime::~BaseRuntime()
@@ -214,7 +219,11 @@ int BaseRuntime::CreateFromMemory(sp_file_hdr_t *hdr, uint8_t *base)
return SP_ERROR_FILE_FORMAT; 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; 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); 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_pPlugin->profiler = g_engine2.GetProfiler();
m_pCtx = new BaseContext(this); m_pCtx = new BaseContext(this);
m_pCo = g_Jit.StartCompilation(this); m_pCo = g_Jit.StartCompilation(this);
@@ -483,6 +502,16 @@ size_t BaseRuntime::GetMemUsage()
return mem; return mem;
} }
unsigned char *BaseRuntime::GetCodeHash()
{
return m_CodeHash;
}
unsigned char *BaseRuntime::GetDataHash()
{
return m_DataHash;
}
BaseContext *BaseRuntime::GetBaseContext() BaseContext *BaseRuntime::GetBaseContext()
{ {
return m_pCtx; return m_pCtx;
+5
View File
@@ -48,6 +48,8 @@ public:
virtual void SetPauseState(bool paused); virtual void SetPauseState(bool paused);
virtual bool IsPaused(); virtual bool IsPaused();
virtual size_t GetMemUsage(); virtual size_t GetMemUsage();
virtual unsigned char *GetCodeHash();
virtual unsigned char *GetDataHash();
JitFunction *GetJittedFunction(uint32_t idx); JitFunction *GetJittedFunction(uint32_t idx);
uint32_t AddJittedFunction(JitFunction *fn); uint32_t AddJittedFunction(JitFunction *fn);
public: public:
@@ -65,6 +67,9 @@ public:
JitFunction **m_PubJitFuncs; JitFunction **m_PubJitFuncs;
ICompilation *m_pCo; ICompilation *m_pCo;
unsigned int m_CompSerial; unsigned int m_CompSerial;
unsigned char m_CodeHash[16];
unsigned char m_DataHash[16];
}; };
#endif //_INCLUDE_SOURCEPAWN_JIT_RUNTIME_H_ #endif //_INCLUDE_SOURCEPAWN_JIT_RUNTIME_H_
+476
View File
@@ -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;
}
+106
View File
@@ -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);
};