Compare commits

...
Author SHA1 Message Date
Nicholas Hastings 4326c3d431 Bump stuff for release build. 2011-12-07 21:11:35 -05:00
Nicholas Hastings dc5aca5f20 Added gamedata support for No More Room in Hell (bug 5162). 2011-12-07 20:17:34 -05:00
Brian Simon 9182d92d86 Increased ServerCommandEx's internal buffer (bug 5169, r=asherkin). 2011-12-07 12:13:52 -05:00
Nicholas Hastings 8dc95a114c Backed out changeset: 294fded6a0d0 (bug 4902, bug 5068). 2011-12-07 11:58:09 -05:00
Nicholas Hastings caf22b7233 Added gamedata support for Adreneline Gamer 2 (bug 5186). 2011-12-07 11:54:53 -05:00
Nicholas Hastings 465bebb170 Fixed typo in basebans ban reason (bug 5188, r=me). 2011-12-06 14:42:30 -05:00
Nicholas Hastings f3006a478f Removed GLIBC_2.7 dependency from spcomp (r=fyren). 2011-12-06 14:29:32 -05:00
Nicholas Hastings 9887f9da48 Updated gamedata for Garry's Mod. 2011-12-02 10:04:28 -05:00
Nicholas Hastings cfe11be9c9 Updated gamedata for HL2MP and DOD:S. 2011-11-29 18:09:51 -05:00
Nicholas Hastings 4118905620 Fixed CS:S gamedata. 2011-11-07 18:23:56 -05:00
Nicholas Hastings 3b7b0d27cb Updated gamedata for today's CS:S update. If wrong, blame gdc! 2011-11-07 18:01:49 -05:00
Nicholas Hastings 9a1713a9f8 Updated TF2_OnIsHolidayActive ret behavior to match doc (bug 5155, r=fyren). 2011-11-04 10:01:33 -04:00
Nicholas Hastings 2995531ca6 Fixed a few minor spacing things in sp incs to not fool API parser. 2011-11-04 10:01:33 -04:00
Nicholas Hastings 46e10e10a0 Fixed sp MaxClients not being updated on map changes after load (bug 5160, r=fyren). 2011-11-04 10:01:28 -04:00
Nicholas Hastings 8fadaff281 Fixed TFHoliday enum (bug 5155, r=asherkin). 2011-11-03 10:03:01 -04:00
Nicholas Hastings fccc1ebb50 Fixed ff trigger printing in triggerer's language to all (bug 5161, r=asherkin). 2011-11-03 09:59:14 -04:00
Nicholas Hastings 03b183e492 Added new TF2 deathflag and dmg custom defines (bug 5157, r=asherkin). 2011-11-03 09:06:59 -04:00
Nicholas Hastings 0e37d2c1bf Registered basecomm as lib to allow requiring it (bug 5156, r=asherkin). 2011-11-03 09:06:22 -04:00
otstrel f7daefc76e Fixed "not connected" error in reserved slots plugin (bug 5158, r=psychonic). 2011-11-03 09:05:40 -04:00
Nicholas Hastings 071b013f5e Preemptive gamedata update for tonight's TF2 update. 2011-11-02 18:24:12 -04:00
Fyren e69d16ff71 Bump to 1.4.1-dev. 2011-10-28 19:50:55 -07:00
Fyren 1f599c8771 Added tag sourcemod-1.4.0 for changeset ddd707c3454c 2011-10-28 19:49:17 -07:00
Fyren 9389a0f138 Bump stuff for release build. 2011-10-28 18:24:01 -07:00
Nicholas Hastings 997687c3ab Updated changelog. 2011-10-28 21:18:51 -04:00
Nicholas Hastings fe05b6c2d0 Updated Dino D-Day gamedata for today's update. 2011-10-28 20:27:44 -04:00
Nicholas Hastings 097ca03761 Added missing EYE def to halflife.inc, updated EYE def# (bug 5151, r=asherkn). 2011-10-28 19:09:40 -04:00
Nicholas Hastings f182cd1d6a TF2 ext fixes for TF2 holiday system changes (bug 5150, r=asherkin). 2011-10-28 19:07:40 -04:00
Nicholas Hastings 4d54bfa6b4 Preemptive gamedata update for tonight's TF2 update. 2011-10-27 20:28:26 -04:00
Nicholas Hastings 28d1dab18a Small fixes to reservedslots, including ep2v Replay/SourceTV fix (bug 5094, r=fyren). 2011-10-20 21:42:18 -04:00
Nicholas Hastings f3d19a860a Added detection of Replay and SourceTV, and natives to query (bug 5124, r=fyren). 2011-10-20 21:39:57 -04:00
Nicholas Hastings 5732e34f50 Added check for element in Get/SetEntProp funcs >= 0 (bug 5141, r=fyren). 2011-10-20 21:35:50 -04:00
Asher Baker ca94a61acf Fixed ServerCommandEx native appending to buffer instead of overwriting (bug 5047, r=fyren). 2011-10-17 11:02:42 -04:00
Brian Simon a875c61b5f Added RootConsoleMenu iface support to sample ext (bug 5021, r=psychonic). 2011-10-17 10:55:44 -04:00
David Anderson 5ec70c9e0d Fixed shutdown bug in SDKTools (created EntOutputMgr shutdown func) (bug 5063, r=fyren). 2011-10-17 10:47:13 -04:00
GoD-Tony 4b0373408d Moved client language detection to be earlier (on connect) (bug 3714, r=psychonic). 2011-10-15 12:07:55 -04:00
Nicholas Hastings 7f8c4eff39 Updated GMod gamedata. 2011-10-14 15:21:12 -04:00
Don 00f152910b Added native to clientprefs to alter data on a disconnected player (bug 3882, r=pred). 2011-10-14 11:28:53 -04:00
Nicholas Hastings 95fdeb03c3 Move marking of mapstarted to before calling of map start notifs. (bug 5119, r=asherkin). 2011-10-14 09:25:42 -04:00
Nicholas Hastings 66e9ef9cf6 Updated HL2DM and DOD:S gamedata. 2011-10-13 20:06:40 -04:00
Peace-Maker 6b3221f1da Updated CS:S gamedata. 2011-10-13 19:15:02 -04:00
GoD-Tony 25ad7bcf5e Updated TF2 gamedata for today's update. 2011-10-13 18:31:24 -04:00
GoD-Tony 9a04a6bdb1 Added optional autoload of sdktools to cstrike ext.(bug 5125, r=psychonic). 2011-10-13 13:17:37 -04:00
Nicholas Hastings 1b9fb906e2 Added CS_GetClanTag and CS_SetClanTag natives to cstrike ext (bug 5122, r=fyren). 2011-10-13 13:17:29 -04:00
Nicholas Hastings e23d7ca51b Added TextMsg destination constants to IGameHelpers header (bug 5123, r=fyren). 2011-10-13 13:17:22 -04:00
Fyren 92773c2e1b Fixed client serials not getting cleared on disconnect (bug 5121, r=psychonic). 2011-10-12 00:51:58 -04:00
Nicholas Hastings 776889cfbb Removed error when optional ext dep is missing (bug 5112, r=fyren). 2011-10-11 22:51:24 -04:00
Nicholas Hastings 67163e14e6 Added checks to avoid crashing in some natives before map start (bug 5119, r=fyren). 2011-10-11 22:50:21 -04:00
Nicholas Hastings 45f68840ed Fixed multiple small issues with KickClient/Ex natives (bug 5120, r=fyren). 2011-10-11 19:50:53 -04:00
Nicholas Hastings 325ae5e977 Added better Nuclear Dawn compatibility to base plugins (bug 5117, r=fyren). 2011-10-11 19:47:20 -04:00
Nicholas Hastings 14919c65d9 Fixed wrong values for unsigned, >= 16-bit props in GetEntProp (bug 5105, r=fyren). 2011-10-11 19:41:56 -04:00
Nicholas Hastings 8888e88dc4 Updated tf2 inc files with more condition and custom dmg defs (bug 5118, r=asherkin). 2011-10-10 21:44:36 -04:00
javalia 0533664f90 Removed non-existant param from SetTrieString function doc (bug 5108, r=dvander). 2011-10-10 16:02:44 -04:00
Peace-Maker 64b824f457 Added gamedata for HL2CTF (bug 5114, r=psychonic). 2011-10-10 15:59:48 -04:00
Nicholas Hastings b6592d799f Updated Nuclear Dawn gamedata to use ShowMenu (now works). 2011-09-26 13:54:17 -04:00
Drifter c89711a863 Updated cstrike ext WeaponPrice offset. 2011-09-20 16:21:17 -04:00
Drifter 91a1292b12 Updated cstrike ext gamedata. 2011-09-16 11:36:37 -04:00
Paul Clothier b2d469cb84 Updated TF2 SetPowerplayEnabled gamedata (bug 5095, r=psychonic). 2011-09-15 18:43:33 -04:00
Nicholas Hastings 4f41da34c6 Merge. 2011-09-10 12:10:05 -04:00
Nicholas Hastings f136f2dcaf Added CheckAccess native to check cmd/override access of AdminId (bug 5083, r=fyren). 2011-09-10 12:08:38 -04:00
Reuben Morais e6df54537a Changed build system so that it no longer requires all SDKs to be available (bug 5023, r=ds). 2011-09-09 18:37:09 -05:00
Nicholas Hastings e62278859e Validate ent index bounds in LookupEntity (bug 5080, r=fyren). 2011-09-09 15:29:17 -04:00
Peace-Maker 51b91bce6d Updated Nuclear Dawn gamedata. 2011-09-08 19:59:09 -04:00
Nicholas Hastings d96a23d4f2 Fixed build. 2011-09-03 14:23:46 -04:00
javalia 98e049b336 Added GetDistGainFromSoundLevel native to SDKTools (bug 5066, r=dvander). 2011-09-03 14:18:08 -04:00
FlaminSarge 3c297f5d1d Fixed typo in tf2_stocks (persistant -> persistent) (bug 5074, r=psychonic). 2011-09-03 14:11:38 -04:00
FlaminSarge d64d196409 Fixed mixup of arrow stab and telefrag defs in tf2_stocks (bug 5074, r=psychonic). 2011-09-03 14:10:24 -04:00
Nicholas Hastings b1638e79c0 Added missing clientnatives files to sdktools proj file (NPOTB). 2011-08-29 13:55:11 -04:00
Nicholas Hastings 13753757d4 Fixed error in sdktools msvc10 proj file (NPOTB). 2011-08-28 16:18:48 -04:00
Nicholas Hastings 739e341218 Fixed Nuclear Dawn menus. 2011-08-25 13:58:12 -04:00
Nicholas Hastings fda282604d Added gamedata support for Nuclear Dawn. 2011-08-25 13:20:26 -04:00
Fyren 2cd7fa68d6 Reshove. 2011-08-20 16:45:44 -07:00
Fyren d78a0c87b8 Backed out changeset 42462959f48d 2011-08-20 16:44:16 -07:00
Fyren 88d4abeaf8 Shove. 2011-08-20 16:41:14 -07:00
Nicholas Hastings 1c0abbfce6 Partially fixed build. 2011-08-20 19:21:27 -04:00
Nicholas Hastings 1492e12ca2 Added support for E.Y.E Divine Cybermancy (bug 5035, r=fyren). 2011-08-20 18:58:37 -04:00
Nicholas Hastings 2b9a39e2eb Updated Fortress Forever gamedata to include support for newer features. 2011-08-20 13:25:38 -04:00
Nicholas Hastings 301ae447b4 Added more new TF2 weapon and custom damage defs (bug 5055, r=asherkin). 2011-08-20 13:25:07 -04:00
Asher Baker 3d47010cbd Fail to load a metamod-enabled extension if it refuses to attach to MM:S (bug 5042, r=dvander). 2011-08-15 20:19:07 +01:00
Asher Baker dd0ff999e4 Backed out changeset: 602945928c23 2011-08-15 20:06:14 +01:00
Asher Baker 05e5c93e91 Fail to load a metamod-enabled extension if it refuses to attach to MM:S (bug 5042, r=dvander). 2011-08-15 19:30:56 +01:00
Asher Baker 1bd97730ce Added a reset argument to 'sm cvars' (bug 5043, r=psychonic). 2011-08-14 21:42:32 +01:00
Fyren 458378be66 Let logic binary access ServerLang value on startup (bug 4675, r=dvander). 2011-07-24 19:52:22 -07:00
David Anderson c01101dbd0 Fix build. 2011-07-24 19:44:15 -07:00
Michael (LumiStance) f7364111f2 Fix corner cases with ExplodeString (bug 4629, r=dvander).
--HG--
extra : rebase_source : ebb338bc93d32544e66c16fcba4494d5eae7ee8e
2011-07-24 19:30:15 -07:00
Nicholas Hastings f3b84b8670 Added gamedata for International Online Soccer: Source (bug 5019). 2011-07-22 13:48:34 -04:00
Asher Baker ec11a31d9d Updated sm_rcon to use new ServerCommandEx native (bug 5018, r=ds). 2011-07-18 03:25:01 +01:00
Asher Baker 2271469d1b Added ServerCommandEx native to get the response when running a command (bug 3873, r=ds). 2011-07-18 03:23:03 +01:00
Asher Baker 7fe92d87c2 Added missing brackets back to l4d and l4d2 gamedata (bug 5016, r=psychonic). 2011-07-16 17:55:43 -04:00
Drifter 6046b8fb79 Fixed CS_GetWeaponPrice for some weapon (bug 4994, r=psychonic). 2011-07-14 12:57:18 -04:00
FlaminSarge a65239a8af Added defines for more new TF2 conditions to tf2.inc (bug 5000, r=psychonic). 2011-07-14 12:53:05 -04:00
Nicholas Hastings 746cd5f49c Merge. 2011-07-12 20:07:51 -04:00
Nicholas Hastings 75c315ad8a Fixed maxClients not being updated correctly in some cases/areas (bug 4986, r=fyren). 2011-07-12 20:06:08 -04:00
Nicholas Hastings c1926c6e25 Added FireOutput gamedata support for The Hidden. 2011-07-12 19:58:37 -04:00
Nicholas Hastings 3f8ba353b7 Updated Fistful of Frags gamedata for FoF 3.6 release. 2011-07-12 19:58:30 -04:00
Nicholas Hastings 39a2152a46 Reverted FindEntityByClassname gamedata obliteration from 7aea1316eff7 per bug 4963. 2011-07-12 19:58:16 -04:00
Nicholas Hastings ddd967534b Sped up native impl. of FindEntityByClassname (bug 4963, r=fyren). 2011-07-12 19:48:28 -04:00
Fyren 4d52fe0490 Revert 3336, try fix #2 (bug 4852, r=dvander) 2011-07-09 20:47:43 -07:00
Nicholas Hastings 264ffa80ce Backed out changeset: b5969264060e 2011-07-08 07:55:20 -04:00
Nicholas Hastings 258a9c636a Backed out changeset: 049c7073d1a4 2011-07-08 07:54:21 -04:00
Nicholas Hastings 8015d1827c Backed out changeset: 9007dacc012d 2011-07-08 07:53:31 -04:00
Nicholas Hastings ae10bc6601 Backed out changeset: 344daca49587 2011-07-08 07:53:14 -04:00
Nicholas Hastings 51c27afcd2 Fixed more crashes related to early, nonzero maxclients (bug 5008, r=dvander). 2011-07-07 21:31:07 -04:00
Nicholas Hastings e09d4f2cf2 Merge. 2011-07-07 19:53:56 -04:00
Nicholas Hastings 7e87f56699 Fixed nonzero maxClients startup crash in SDKTools (bug 5010, r=bee). 2011-07-07 19:51:05 -04:00
Scott Ehlert ca9150a731 Triggering build, ugh. 2011-07-07 11:25:00 -05:00
Nicholas Hastings 5250d819d0 Triggering a build, hoping for luck. 2011-07-07 09:27:24 -04:00
Nicholas Hastings d93413a4ae Fixed use of m_Players before init'd in PlayerManager (bug 5008, r=dvander). 2011-07-06 22:34:23 -04:00
Nicholas Hastings bb7f7eff51 Added native interface for Basecomm plugin (bug 2594, r=fyren). 2011-07-06 22:34:21 -04:00
Brian Simon 838e8c7b35 Added InactivateClient and ReconnectClient natives to SDKTools (bug 4931, r=fyren). 2011-07-06 18:11:02 -04:00
David Anderson bb48a16466 Fix compiler creating bogus arrays when missing a dimension (bug 4902, r=fyren). 2011-07-06 17:56:40 -04:00
David Anderson a02ff01d84 Prevent declaring arrays that the compiler is too buggy to handle (bug 4977, r=fyren). 2011-07-06 17:56:03 -04:00
David Anderson 66d27d6ac5 Fix return omission with else-after-return (bug 4852, r=fyren). 2011-07-06 17:55:14 -04:00
Nicholas Hastings 5ba82ef0fc Removed maxClients caching in core (bug 5007, bug 4986, r=fyren). 2011-07-06 17:50:37 -04:00
David Anderson 053b522aff Fixed some vars not being marked for init on first compile pass (bug 4643, r=fyren). 2011-07-06 17:50:26 -04:00
Nicholas Hastings 4521f80e5a Added ability in SDKTools to get/set prop values on gamerules class (bug 4983, r=fyren). 2011-07-06 17:37:35 -04:00
Nicholas Hastings f24efc17c1 Fixed TF2 OnConditionAdded/Removed forwards to catch all cases (bug 4982, r=fyren). 2011-07-06 17:37:35 -04:00
Nicholas Hastings f32d3849e5 Merge. 2011-07-06 15:30:19 -04:00
Michael Busby f2fb064ea6 Fixed typo in GetEntDataFloat function doc (bug 4993, r=psychonic). 2011-07-06 15:27:41 -04:00
Nicholas Hastings ce5093f91f BaseComm now uses CommandListeners for chat hooks (bug 4991, r=fyren). 2011-07-06 15:24:43 -04:00
David Anderson 75121588c4 Clobber 2011-07-04 15:33:11 -07:00
javalia 1ff0f478d4 Increase symbol name limit to 63 characters (bug 4564, r=dvander). 2011-07-04 15:26:08 -07:00
David Anderson 6c68082359 Fix crash when dynamic arrays run out of memory (bug 4632, r=fyren). 2011-07-04 01:57:19 -07:00
David Anderson a752d220cc Use active, not passive FTP. 2011-06-29 16:05:18 -07:00
Drifter ee1bbd5994 Added new CS_GetWeaponPrice native to cstrike extension (bug 4985, r=psychonic). 2011-06-28 20:32:55 -04:00
Michael Busby 91368e5656 Fixed typo in keyvalues.inc doc (bug 4990, r=psychonic). 2011-06-28 20:26:40 -04:00
Drifter c4c554b420 Added some small fixes for new CStrike patch (2ddc75e24c53) (bug 4732, r=psychonic). 2011-06-28 20:16:05 -04:00
Nicholas Hastings 52ec8bf049 Fixed build. 2011-06-27 09:35:38 -04:00
Nicholas Hastings 5c40e02ee6 Added support for gamedata lookups from matchmaking_ds lib (bug 4158, r=Fyren). 2011-06-27 09:30:52 -04:00
Nicholas Hastings d2a89c5856 Added gamedata for TF2 SetInWaitingForPlayers (bug 4704). 2011-06-27 08:29:11 -04:00
Nicholas Hastings 9ec3f1b89d Fixed TF2_RemoveCondition not always removing conditions (bug 4981, r=asherkin). 2011-06-26 21:00:03 -04:00
Nicholas Hastings 3ab81c764d Added more TF2 condition defines (bug 4979, r=asherkin). 2011-06-26 20:55:18 -04:00
Nicholas Hastings c072ce8f0c Fixed TF2 RemoveCondition gamedata. 2011-06-26 18:10:29 -04:00
Nicholas Hastings e44dbd0e77 Merge. 2011-06-26 18:09:55 -04:00
Nicholas Hastings ec12022550 Added msvc10 project files for TF2 ext (NPOTB). 2011-06-26 10:54:12 -04:00
Drifer e0f670499c Add a number of useful forwards and natives to the cstrike extension (bug 4732, r=fyren). 2011-06-26 01:25:42 -07:00
David Anderson 177cc87985 Doc improvement. 2011-06-25 15:31:11 -07:00
David Anderson 3e387f35e9 Updated credits. 2011-06-25 15:26:09 -07:00
Nicholas Hastings 7037723993 Fixed TF2 identifiers and condition stocks (bug 4974, r=me). 2011-06-24 19:45:16 -04:00
Scott Ehlert b1098d6287 Using gcc 4.4 from Debian 6 for Linux builds now. 2011-06-24 17:29:05 -05:00
Nicholas Hastings be222a16ce Updated TF2 identifiers and condition stocks. 2011-06-24 02:01:03 -04:00
Nicholas Hastings 17f9a3eba6 Updated TF2 gamedata. 2011-06-24 00:53:17 -04:00
Scott Ehlert 0ee77c0e7d Triggering a build. 2011-06-23 21:21:27 -05:00
Nicholas Hastings b92fa45da7 Triggering build. 2011-06-23 19:14:58 -04:00
Nicholas Hastings e64c2fc110 Triggering build. 2011-06-23 18:09:31 -04:00
Nicholas Hastings 49a6508888 Added msvc10 project for SDKTools (NPOTB). 2011-06-22 09:46:56 -04:00
David Anderson 859678536f Fixed crash on plugin unload when two cmds exist with same name, different casing (bug 4698, r=Fyren). 2011-06-20 13:30:14 -04:00
Nicholas Hastings 9a5f788807 Normalized line endings in IGameHelpers.h to appease FYREN. 2011-06-18 14:36:20 -04:00
Nicholas Hastings 84b3b1d29c Added HintTextMsg to IGameHelpers (bug 4950, r=Fyren). 2011-06-18 14:34:17 -04:00
Nicholas Hastings 80eb18a425 Moved GetEntityClassname to end of entity.inc to fix plugin compile errors (bug 4798). 2011-06-18 14:31:46 -04:00
Scott Ehlert 3e1ab53abd Fixed clang OS X build. 2011-06-17 18:21:17 -05:00
Scott Ehlert 18c119b4d5 Removed -static-libgcc for Mac OS X build (no bug, r=dvander).
This fixes the ld warning: could not create compact unwind for __Unwind_Resume: non-standard register 0 being saved in prolog
2011-06-17 18:00:32 -05:00
Nicholas Hastings e67a65c0db Fixed build. 2011-06-16 15:59:27 -04:00
Scott Ehlert 4c878c4963 Fixed crash in MemoryUtils::ResolveSymbol() on OS X Lion (10.7) (bug 4951, r=dvander). 2011-06-15 16:02:05 -05:00
Nicholas Hastings e8fbe0f36c Fixed uninit'ed string and other minor issues in basetriggers (bug 4945, r=fyren). 2011-06-05 23:13:25 -04:00
Nicholas Hastings 243b7e25f8 Added array element selection with Get/SetEntProp* on arrays (bug 4160, r=fyren). 2011-06-05 21:52:36 -04:00
John Schoenick f1a4a08c7f Fixed regression in FindEntityByClassname from bug 4899 (bug 4941, r=predcrab). 2011-06-01 20:36:16 -04:00
Fyren c0fa36b9a1 Added support for language aliases (bug 4858, r=dvander). 2011-05-25 21:10:18 -04:00
Nicholas Hastings 835b2d7ced Slight ep1 gamedata cleanup. 2011-05-25 20:56:30 -04:00
Nicholas Hastings 13c2381ba7 Added gamedata for Eternal Silence (bug 4880). 2011-05-25 20:50:51 -04:00
Fyren fbc8e899dd Forcing build. 2011-05-25 13:57:17 -04:00
Nicholas Hastings 5ee8c8ce91 Backed out changeset: a7a73225f8ee 2011-05-25 13:56:34 -04:00
Nicholas Hastings 971793d6a1 Backed out changeset: 065beec73902 2011-05-25 13:56:13 -04:00
Nicholas Hastings 9d7a905fb1 Backed out changeset: 65eb3df32b1c 2011-05-25 13:31:14 -04:00
Nicholas Hastings 731f002175 Backed out changeset: abe4ce9d3e0e 2011-05-25 13:30:40 -04:00
Nicholas Hastings 7e6f3bfd83 Adjusting the proper set of flags this time. 2011-05-25 11:25:20 -04:00
Nicholas Hastings 3e14739b29 Attempting to fix SDKTools build. 2011-05-25 11:21:16 -04:00
Nicholas Hastings d7fb6b2892 Fixed invalid client errors from late-load of SourceTV (bug 4881, r=fyren). 2011-05-25 08:31:12 -04:00
Nicholas Hastings 7527f441ae Switched to using IServerTools in SDKTools where possible. (bug 4899, r=fyren). 2011-05-25 08:27:27 -04:00
Nicholas Hastings 5228ee1d91 Updated garrysmod gamedata. 2011-05-24 20:36:09 -04:00
Nicholas Hastings 297a98e065 Handle leak notice now prints to error log (as well as fatal) (bug 4929, r=dvander). 2011-05-24 18:37:45 -04:00
Nicholas Hastings 727d8afd94 Updated core msvc10 proj file (no smn_profiler) (NPOTB). 2011-05-24 18:35:09 -04:00
Nicholas Hastings c292fba3df Updated core msvc9 proj file (engine defs, -smn_profiler, mms17 -> mms18) (NPOTB). 2011-05-24 18:34:45 -04:00
Nicholas Hastings 9954ff55f5 Added msvc10 project file for sm logic. (NPOTB). 2011-05-24 14:21:24 -04:00
Fyren fefd84d431 Translator now properly falls back on bad server language (bug 4861, r=dvander). 2011-05-24 13:25:28 -04:00
Fyren b4a7d21b9e Removed compiler double include check (bug 4863, r=dvander). 2011-05-24 10:49:40 -04:00
Nicholas Hastings d03e051611 Fixed var names and docs for TF2_MakeBleed native (bug 4928, r=fyren). 2011-05-24 10:17:48 -04:00
John Schoenick e8c141d775 Make SQL_LastInsertId and SQL_GetAffectedRows work on query handles, allowing their use with threaded queries 2011-05-14 20:21:37 -07:00
David Anderson 5b45e29533 Move profile natives to logic, add linux support (bug 4927, r=ds). 2011-05-22 02:04:34 -07:00
FlaminSarge 024d094459 Added TF2 megaheal cond defines to tf2 incs (bug 4916, r=psychonic). 2011-05-12 11:33:50 -04:00
Gareth Clarke df977577e2 Updated ep2v SetUserCvar gamedata (bug 4904). 2011-05-06 08:07:40 -04:00
Scott Ehlert b63b94bc81 Updated buildbot scripts to support clang builders. 2011-05-01 00:17:11 -05:00
Scott Ehlert 7e514f5d34 Moved -static-libgcc to linker flags. 2011-05-01 00:09:25 -05:00
Scott Ehlert cb2de2e5c4 Avoid depending on __isoc99_sscanf@GLIBC_2.7 when building on Linux with glibc >= 2.7 (bug 4894, r=dvander). 2011-04-28 02:43:55 -05:00
Nicholas Hastings f2fedbc3e6 Merge. 2011-04-25 19:05:48 -04:00
Nicholas Hastings 8ef686fd21 Updated dinodday gamedata for today's game update. 2011-04-25 19:05:01 -04:00
Nicholas Hastings 4c96e9a17d Updated zps gamedata for today's game update. 2011-04-25 19:04:34 -04:00
Scott Ehlert 939bc00b2b Added detection for clang compiler and fixed various warnings triggered by it (bug 4878, r=dvander). 2011-04-23 21:53:53 -05:00
Nicholas Hastings 0b06d3412e Updated Windows signature for GMod CreateEntityByName. 2011-04-17 16:12:45 -04:00
Nicholas Hastings 94f6f60105 Merge. 2011-04-15 15:40:38 -04:00
Nicholas Hastings 4bd6bc9683 Updated Garry's Mod gamedata. 2011-04-15 15:16:47 -04:00
David Anderson 3c59621425 Backed out changeset d6853d8d39fd 2011-04-15 10:59:10 -07:00
David Anderson a37e2ab26a Fix bug where globals can be assigned invalid memory (bug 4643, r=ds). 2011-04-15 10:50:09 -07:00
Nicholas Hastings d099febf7b Added new param to CTFPlayerShared::Disguise call in TF2 ext (bug 4866, r=fyren). 2011-04-15 12:11:32 -04:00
Nicholas Hastings b9f82332c8 Shortened __ext name for ClientPrefs to avoid hitting symbol limit (bug 4839). 2011-04-15 02:06:50 -04:00
Nicholas Hastings c02c4c6d6a Gamedata update for CS:S, TF2, DOD:S, and HL2DM. 2011-04-15 01:34:18 -04:00
Nicholas Hastings 17476ec137 Triggering build to (hopefully) fix load on linux. 2011-04-15 00:34:51 -04:00
Nicholas Hastings ee51a68c6f Triggering build... again. 2011-04-14 23:35:08 -04:00
Nicholas Hastings 0120ce5d7c Merge. 2011-04-14 23:30:04 -04:00
Nicholas Hastings 42c6e640fc Triggering build. 2011-04-14 23:26:39 -04:00
Scott Ehlert bc571316b9 Triggering a build for goodness sake. 2011-04-14 20:53:59 -05:00
Scott Ehlert 3cc1af9618 Triggering a build. 2011-04-13 20:25:10 -05:00
Scott Ehlert 6957bf504b Triggering a build. 2011-04-13 19:05:41 -05:00
Scott Ehlert d47dd70141 Attempt #2 at meaningful bootstrap error message. 2011-04-13 18:37:41 -05:00
Scott Ehlert 86eb2360db Attempt at getting a meaningful error message out of buildbot bootstrap. 2011-04-13 18:30:34 -05:00
Scott Ehlert c55e350cb2 Triggering a build, argh. 2011-04-13 17:08:39 -05:00
Scott Ehlert b0fe032b8d Triggering a build. 2011-04-13 16:44:20 -05:00
Scott Ehlert aa25870fb8 Triggering a build. 2011-04-13 16:09:36 -05:00
Nicholas Hastings a8118ea8f4 Merge. 2011-04-13 08:31:02 -04:00
Nicholas Hastings 1a344c1441 SetEntProp now marks edict state as changed at offset (bug 4855, r=fyren). 2011-04-13 08:13:49 -04:00
Berni 86a1641ac1 Fix compiler hanging when #including a directory (bug 4822, r=dvander) 2011-04-13 04:02:22 -07:00
Nicholas Hastings 10129fa568 Removed gEntList failure notify on Windows. (bug 4832, r=fyren). 2011-04-11 22:30:03 -04:00
David Anderson 935a8d36da Triggering build. 2011-04-09 18:18:59 -07:00
Nicholas Hastings 2516a3af8a Updated hgignore to catch msvc temp files (npotb). 2011-04-09 15:52:58 -04:00
Nicholas Hastings 120a265fc3 Removed core/msvc10/sourcemod_mm.sdf from version control (npotb). 2011-04-09 15:43:10 -04:00
Nicholas Hastings 33aebeb727 Added forwards to TF2 ext for cond addition and removal (bug 4851, r=fyren). 2011-04-09 00:33:55 -04:00
Nicholas Hastings 7e06cfb471 Added gamedata for Dino d-day. 2011-04-09 00:29:57 -04:00
Berni f2bcff69a9 Added GetEntityClassname stock (bug 4798, r=dvander). 2011-04-09 00:29:46 -04:00
Nicholas Hastings 39b7d175b9 Merge 2011-04-07 23:03:51 -04:00
Nicholas Hastings b9cebe8d87 triggering build. 2011-04-07 23:01:16 -04:00
Scott Ehlert 6814cfbcd7 Triggering a build, please. 2011-04-07 15:09:56 -05:00
Scott Ehlert 2884696024 Triggering a build, perhaps. 2011-04-07 14:51:56 -05:00
David Anderson 6930046bc6 Triggering build. 2011-04-07 04:16:38 -05:00
David Anderson 174cbfe3b9 Triggering build. 2011-04-07 04:13:54 -05:00
David Anderson 611c7633cf Triggering build. 2011-04-07 04:05:00 -05:00
David Anderson 822d4269c4 Pushing build. 2011-04-07 04:04:02 -05:00
David Anderson 8fd16efc33 Triggering build. 2011-04-07 03:58:20 -05:00
Nicholas Hastings ef082d855c Fixed some gamedata lookups requiring symbols on linux/mac (bug 4832, r=fyren). 2011-04-04 13:44:19 -04:00
Nicholas Hastings a5c4739804 Added better cross-engine entity flag compatibility. (bug 4809, r=fyren). 2011-04-04 13:37:29 -04:00
Nicholas Hastings d1f1a88ffd Mark clientprefs natives as optional when ext not required. (bug 4839, r=fyren). 2011-03-24 09:48:36 -04:00
David Anderson c05f6b7bf3 Trigger build. 2011-03-22 21:45:20 -07:00
Nicholas Hastings 4b5fa26cd6 Changed some instances of LogMessage to LogAction. (bug 4649, r=fyren). 2011-03-20 19:37:25 -04:00
Nicholas Hastings 0162d18343 Updated SM core vcxproj. MMSOURCE17 -> 18, Removed files moved to logic. (NPOTB) 2011-03-13 14:03:33 -04:00
Nicholas Hastings b6415818f6 Added new TF2 condition defines (bug 4834, r=fyren). 2011-03-13 14:03:26 -04:00
David Anderson e16efbf58b Upgraded symstore. 2011-03-12 23:01:29 -08:00
Nicholas Hastings 46804d0faf SM Central fixes for new language natives (bug 4613). 2011-03-12 23:56:04 -05:00
Dr\!fter a81567e2d6 Add OnClientSettingsChanged to IPlayerHelpers (bug 4812, r=fyren) 2011-03-08 12:59:42 -08:00
databomb 217670b54a Fix precedence of voice mute flag versus specific client overrides (bug 4826, r=fyren) 2011-03-08 12:23:34 -08:00
databomb f2e19c0387 Fix mistaken unhooking of voice hooks (bug 4804, r=fyren) 2011-03-08 12:17:21 -08:00
Fyren 9799970042 Update spcomp Makefile 2011-03-08 12:07:06 -08:00
GoD-Tony ca75d0d765 Added new language natives (bug 4613, r+a13=dvander). 2011-03-08 08:38:21 -05:00
Asher Baker 0824e49000 Added missing files to the spcomp project file (bug 4824, r=dvander). 2011-03-07 15:05:51 +07:00
Nicholas Hastings c3a98db0ea Fixed SetTeamScore not updating score on client (bug 2736, r=fyren). 2011-02-28 19:40:21 -05:00
Nicholas Hastings f27685717b Updated SDKTools vc project file (NPOTB). 2011-03-01 21:25:02 -05:00
Nicholas Hastings 55034bfa6f Merge 2011-03-01 21:22:09 -05:00
Nicholas Hastings 6f8b420d0d Backed out changeset: 6da59ea19165 2011-03-01 21:22:01 -05:00
Nicholas Hastings 2ed7e14a99 Merge. 2011-02-28 19:47:14 -05:00
Nicholas Hastings ee3bcef8ab Updated Empires Mod gamedata for version 2.31a. 2011-02-28 19:45:44 -05:00
Nicholas Hastings adbcb97515 Fixed graphical glitches with funcommands effects in L4D1 (bug 3486, r=fyren). 2011-02-28 19:45:36 -05:00
Nicholas Hastings c667723958 Added identifier for new TF2 flag event, 'returned' (bug 4808, r=fyren). 2011-02-28 19:44:41 -05:00
Nicholas Hastings d94634398e Updated TF2 condition idenifiers (bug 4801, r=fyren).
Added TFCond_InHealRadius (amputator glow) and fixed TFCond_Healing.
2011-02-28 19:43:08 -05:00
Nicholas Hastings f348e58508 Fixed SetTeamScore not updating score on client (bug 2736, r=fyren). 2011-02-28 19:40:21 -05:00
David Anderson 60f16970ac Trigger build. 2011-02-27 23:58:10 -08:00
David Anderson 39c5eafafc Trigger build. 2011-02-27 23:33:15 -08:00
David Anderson b7f6c223d8 Push build. 2011-02-27 23:04:10 -08:00
Nicholas Hastings bf9a65338b Forcing build to see if upload is fixed. 2011-02-27 12:43:13 -05:00
Nicholas Hastings 5b3ae5eff9 Updated ZPS gamedata. 2011-02-07 15:50:27 -05:00
Asher Baker f80a8d306b Added defines for TF2 weapon slots (r=dvander). 2011-02-01 14:45:19 -05:00
Nicholas Hastings 9ed9060940 Updated CSPromod gamedata. 2011-02-01 13:50:17 -05:00
Nicholas Hastings 5453e60099 Updated customkill and deathflag defines in tf2_stocks (bug 4799, r=dvander). 2011-01-16 20:25:44 -05:00
Nicholas Hastings 3de61b69ad Raised MAXPLAYERS from 64 to 65 (bug 4490, r=dvander). 2011-01-16 20:06:55 -05:00
Erik Minekus 322a4ed05d Fixed bug in nominations that could cause "Unknown command" error (bug 4797, r=psychonic). 2011-01-16 20:00:44 -05:00
Nicholas Hastings 8f3b4afcf7 Removed tv_enable hook to fix rare max client count issue (bug 4791, r=fyren). 2011-01-12 18:59:34 -05:00
Nicholas Hastings ebdc6b94fc forcing build. 2011-01-12 06:47:13 -05:00
Nicholas Hastings a7218d2e59 Added missing SOURCE_SDK_BLOODYGOODTIME define to halflife.inc (bug 4780, rs=dvander). 2011-01-12 00:30:47 -05:00
Nicholas Hastings 6d93beac8e maybe i was too impatient... 2011-01-12 00:12:06 -05:00
Nicholas Hastings 1fb1309e77 forcing build 2011-01-12 00:07:20 -05:00
Nicholas Hastings 5916f40b7a Added Bloody Good Time gamedata (bug 4780, r=fyren). 2011-01-11 23:36:32 -05:00
Nicholas Hastings 5226714bbd Added support for Bloody Good Time (bug 4780, r=fyren). 2011-01-11 23:35:58 -05:00
Asher Baker dabf486a9f Added missing MENUFLAG_BUTTON_NOVOTE define to menus.inc (bug 4217, r=psychonic). 2011-01-04 11:02:39 -05:00
Zach Kanzler c78f4407ea Exposed ProcessCommandTarget in IPlayerHelpers (bug 4742, r=fyren). 2010-12-31 20:04:59 -05:00
Asher Baker fae4127ddc Added missing unhooking of ClientConnect in PlayerManager (bug 4749, r=fyren). 2010-12-31 20:02:41 -05:00
Zach Kanzler 9cc1497e9e Fixed namespace-related compile issue in INativeInvoker.h (bug 4750, r=fyren). 2010-12-31 20:00:07 -05:00
Nicholas Hastings cdd64d52eb Updated Garry's Mod gamedata (bug 4762, r=fyren). 2010-12-19 14:10:36 -05:00
Nicholas Hastings 4d319c12f8 Updated TF2 includes with new weapon and condition identifiers (bug 4761, r=fyren). 2010-12-18 17:07:42 -05:00
Nicholas Hastings 8fc3e4ab12 Updated HL2DM gamedata (bug 4756, r=fyren). 2010-12-18 00:11:51 -05:00
Nicholas Hastings ed7d68d6a7 Updated DOD:S gamedata (bug 4755, r=fyren). 2010-12-18 00:03:31 -05:00
Nicholas Hastings 59820519ce Updated CS:S gamedata (bug 4754, r=fyren). 2010-12-18 00:03:04 -05:00
Nicholas Hastings 767c807a40 Updated TF2 gamedata (bug 4753, r=DS). 2010-12-17 23:08:49 -05:00
Nicholas Hastings d25adc1b10 Updated Goldeneye:Source gamedata (bug 4751, r=fyren). 2010-12-17 23:07:54 -05:00
Nicholas Hastings 35f0067fe5 Updated Garry's Mod gamedata (bug 4747, r=fyren). 2010-12-15 21:29:59 -05:00
Nicholas Hastings f1b01dd086 Triggering build to fix bug 4729 on L4D1 now. 2010-12-13 15:37:39 -05:00
Asher Baker 3df08d64e2 Fix permissions check in antiflood (bug 4584, r=dvander). 2010-12-12 18:13:05 -08:00
Erik Minekus f56cc43331 Fixed sm_rtv printing "unknown command" (bug 4730, r=psychonic). 2010-12-04 15:28:15 -05:00
Scott Ehlert b4b37daaf6 Triggering build to fix bug 4729. 2010-12-03 23:58:41 -08:00
Nicholas Hastings 1f187d24c8 Updated TF2_GetPlayerConditionFlags to match Valve's current logic. 2010-12-03 17:12:06 -05:00
Nicholas Hastings 5b806a467b Fixed BanClient always banning by IP address (bug 4626, r=fyren). 2010-11-30 13:09:30 -05:00
Jason Booth 20d14d5a10 Fixed profiler flush not clearing, added 'report' and 'clear' (bug 4674, r=dvander). 2010-11-30 13:08:30 -05:00
Nicholas Hastings 043b2df345 Fixed voting crash when client console, chat, and SourceTV are enabled (bug 4676, r=fyren). 2010-11-30 13:04:13 -05:00
Nicholas Hastings 9ec7feb9ab Fixed CDetour crash in TF2 extension when last plugin using forward is unloaded (bug 4713, r=fyren). 2010-11-28 22:41:48 -05:00
Nicholas Hastings 57cf6db4e0 Fixed TF2 GetHoliday Windows signature (bug 4714, r=fyren). 2010-11-24 20:46:17 -05:00
Nicholas Hastings 61b677c073 Add GetGameRules to ISDKTools (bug 4707, r=fyren) 2010-11-19 23:02:27 -05:00
Nicholas Hastings 264e42a4c5 Merge 2010-11-19 15:52:41 -05:00
Nicholas Hastings 251fd660f9 Backed out changeset: 07fb9b761438 2010-11-19 15:52:33 -05:00
Matt Woodrow 6459f53263 Why, oh why, do you do this to me gcc? 2010-11-19 18:16:24 +13:00
Matt Woodrow 55c8d93862 gcc strikes again with the no newline error. Bustage fix 2010-11-19 18:12:40 +13:00
Matt Woodrow c6f83f8c14 Bustage fix. Thanks for nothing Crimson 2010-11-19 18:07:28 +13:00
Brett Powell c9eaca0e56 Add WaitingForPlayers forwards to TF2 extension (bug 4704, r=pred) 2010-11-19 17:58:46 +13:00
Brett Powell 6267c17c6b Extend Nominations API (bug 4677, r=pred) 2010-11-19 17:39:53 +13:00
Brett Powell 616113d384 Add GetGameRules to ISDKTools (bug 4707, r=pred) 2010-11-19 17:37:26 +13:00
Nicholas Hastings ac738aff10 TF2 GetHoliday detour now detours UTIL_GetHoliday (bug 4700, r=fyren). 2010-11-09 21:12:38 -05:00
A.W. Stanley 7627bf80b9 Added TF2_IsPlayerInDuel native to TF2 extension (bug 4695, r=psychonic). 2010-11-07 19:05:32 -05:00
Scott Ehlert 172abb2710 Added support for L4D on Mac OS X (bug 4684, r=fyren). 2010-10-29 20:04:50 -05:00
Scott Ehlert a643c6ef1e Fixed sample ext makefiles for L4D Linux builds (bug 4681, r=fyren). 2010-10-28 12:42:13 -07:00
Nicholas Hastings 64bfb0961e Updated TF2 customkill defines (bug 4682, r=fyren). 2010-10-28 10:23:30 -04:00
Scott Ehlert 68d822f50a Fixed loading L4D on Linux (bug 4681, r=dvander). 2010-10-27 22:05:56 -07:00
Fyren 56e3bab02a vcproj crap (NPOTB) 2010-10-20 05:13:48 -07:00
Fyren 9dd5ab4ebd Fix Windows entity output hooks (bug 4644, r=dvander) 2010-10-20 05:10:13 -07:00
David Anderson b1ef86de75 Follow-up fixes to database conf reading (bug 4286, r=fyren). 2010-10-16 22:27:34 -07:00
Fyren b4a0d7a5b7 Use SH strings for database configs (bug 4286, r=dvander) 2010-10-16 03:52:36 -07:00
Scott Ehlert e6a93a799a Added support for L4D2 on Mac OS X (bug 4647, r=fyren). 2010-10-14 18:27:37 -05:00
Nicholas Hastings 4e175f9cd6 Updated Gmod gamedata (bug 4652, r=fyren). 2010-10-07 18:35:26 -04:00
Nicholas Hastings 62e3fe1414 Merge. 2010-10-06 20:47:16 -04:00
Nicholas Hastings eeb7285528 Updated CSS/DODS/TF2/HL2DM CommitSuicide offset (bug 4650, r=fyren). 2010-10-06 20:46:29 -04:00
Scott Ehlert 0340b62b7c Triggering build against L4D2 SDK changes.
This should fix sm_kick.
2010-10-05 23:32:27 -07:00
Scott Ehlert 5488f60260 Triggering build against L4D1 SDK changes. 2010-10-05 20:07:14 -07:00
Fyren be7ef860d5 Revert mistaken vsound.cpp change 2010-10-04 19:45:21 -07:00
Zach Kanzler 9aba700d8c Added GetMessageName to IUserMessages (bug 4573, r=pred). 2010-10-02 17:58:06 -04:00
Nicholas Hastings 7972acf5bf Added one more missing enum value in tf2_stocks. 2010-10-01 15:24:30 -04:00
Fyren 430c001d58 Static gamedata checker (NPOTB) 2010-10-01 12:15:43 -07:00
Nicholas Hastings 943777e5d0 Fixed/updated TF2_DisguisePlayer (bug 4641, r=fyren). 2010-10-01 10:46:21 -04:00
Nicholas Hastings c086c3b03b Updated more TF2 gamedata and fixed RemoveCondition call (bug 4641, r=fyren). 2010-10-01 09:07:51 -04:00
Nicholas Hastings e517eceb24 Shortened names of some symbols in tf2_stocks (bug 4642, r=fyren). 2010-10-01 08:50:18 -04:00
Nicholas Hastings 7fb57a4064 Updated TF2 includes with more defined identifiers (bug 4640, r=dvander). 2010-09-30 23:40:42 -04:00
Nicholas Hastings 888bca13c0 Updated HL2DM gamedata (bug 4636, r=fyren). 2010-09-30 20:09:10 -04:00
psychonic 8b39e0631d Updated DODS gamedata (bug 4638, r=fyren). 2010-09-30 17:24:19 -04:00
psychonic d0d0148a58 Updated TF2 gamedata (bug 4635, r=fyren). 2010-09-30 17:23:54 -04:00
psychonic a73b62c5bf Updated CSS gamedata (bug 4637, r=fyren). 2010-09-30 17:23:37 -04:00
Nicholas Hastings bee0afd301 forcing build 2010-08-27 20:15:28 -04:00
Nicholas Hastings 8f37940f4c Updated cstrike ext gamedata for 2010-08-26 update (bug 4595, r=fyren). 2010-08-26 22:23:07 -04:00
Nicholas Hastings 0fa8d8cb51 Updated Gmod gamedata, including linux support (bug 4569, r=fyren). 2010-08-24 19:23:57 -04:00
Nicholas Hastings 1f589d0d5d Added AMXX Pawn geshi generation script. 2010-08-23 13:53:44 -04:00
Nicholas Hastings ad36745a7c Normalized spacing and fixed warnings with newest geshi in (Source)Pawn geshi script. 2010-08-23 13:52:42 -04:00
Scott Ehlert 99b9860ea5 Added Alien Swarm build config for sample extension (bug 4530, r=psychonic). 2010-08-20 10:42:16 -05:00
Scott Ehlert dc5f82cce2 Fixed alignment on a couple of SourcePawn debugging structures on OS X (bug 4578, r=dvander).
This problem only affected plugins compiled with a fairly old version of spcomp.
2010-08-19 22:51:42 -05:00
Nicholas Hastings dc3050537b Fixed timeleft not getting reset on Game_Commencing in CS:S (bug 4557, r=fyren). 2010-08-19 21:57:09 -04:00
Nicholas Hastings 5acd0dd2d1 Fixed Curl lib AMBuilder script failing with vs2010 (bug 4575, r=ds). 2010-08-19 13:03:14 -04:00
Scott Ehlert 0d933a1901 Disabled nextmap plugin on Alien Swarm (bug 4571, r=fyren). 2010-08-16 15:13:47 -05:00
Nicholas Hastings 9f21865caf Fixed typo in edd61d1e1e26 (bug 4542) 2010-08-05 19:24:30 -04:00
Nicholas Hastings 2ba81d3fef Added initial gamedata for Alien Swarm (bug 4530, r=ds). 2010-08-02 12:28:38 -04:00
Erik Minekus bcc1c2e658 Fixed typos in some usage replies (bug 4552, r=dvander). 2010-08-02 09:44:49 -04:00
Nicholas Hastings 5fa8972ae6 Fixed Ignite crash on Fistful of Frags (bug 4556, r=fyren). 2010-08-02 09:37:36 -04:00
Nicholas Hastings 96363a0ce3 Fixed Firearms Source FireOutput signature (bug 4555, r=fyren). 2010-08-02 09:36:10 -04:00
Scott Ehlert 817fa9d9be Oh, fixed package script for new bintools binary (bug 4548). 2010-08-01 15:09:48 -05:00
Scott Ehlert 89334bb459 Bintools extension no longer needs a separate build for each engine (bug 4548, r=dvander). 2010-08-01 14:57:54 -05:00
Scott Ehlert 0ae2d99599 Fixed potential crash with IMemUtils::FindPattern on Linux (bug 4554, r=dvander). 2010-07-31 16:06:22 -05:00
Scott Ehlert e1199a02ee Fixed missing version string and compile date for MySQL extension (bug 4547, r=dvander). 2010-07-28 14:48:51 -05:00
Scott Ehlert 9408a61eb1 Ugh, fixed builds for real. How did that even happen? 2010-07-27 20:28:27 -05:00
Scott Ehlert 78d7e1bdfe Hopefully fixed build. 2010-07-27 18:02:37 -05:00
Scott Ehlert dd44a0aaea Added support for Alien Swarm (bug 4530, r=dvander). 2010-07-27 17:32:32 -05:00
Nicholas Hastings b3144dd19a Added gamedata for Fistful of Frags (bug 3883, r=fyren). 2010-07-26 19:26:32 -04:00
Nicholas Hastings 2722e96fac Two more phrases in ice.sp are now able to use translations (bug 4540, r=fyren). 2010-07-26 19:11:06 -04:00
pheadxdll 488de0014e Added TF2_MakeBleed native to TF2 ext (bug 4542, r=fyren,psychonic). 2010-07-26 11:06:08 -04:00
Zach Callear 9c2e0ebd4c Fixed living players hearing dead players if alltalk is disabled while deadtalk is on (bug 4533, r=fyren). 2010-07-26 08:23:49 -04:00
Nicholas Hastings 28cc96cfd0 Fixed errors and missing effects caused by missing sprites on L4D2 (bug 4512, r=fyren). 2010-07-26 08:15:52 -04:00
Erik Minekus 4ab3b15efd Added TF2 object stocks (bug 4536, r=psychonic). 2010-07-23 21:23:35 -04:00
Nicholas Hastings ff363e3893 Added gamedata for Firearms: Source (bug 4537 r=fyren). 2010-07-23 21:16:15 -04:00
Nicholas Hastings cd2c10b6dc Added support for logical entities to gamedata for Synergy. (bug 4534, r=fyren) 2010-07-22 21:38:55 -04:00
Scott Ehlert 563e981902 Fixed Linux and OS X builds. 2010-07-21 22:23:56 -05:00
Fyren c3e20d5d12 FireOutput detour in SDKTools now uses CDetour (bug 4416, r=pred). 2010-07-21 22:09:03 -05:00
Nicholas Hastings 2802486671 Fixed a couple small things in npp xml generation script. 2010-07-21 08:46:52 -04:00
Nicholas Hastings 1507d03c21 Updated TF2 conditions enum and defines (bug 4526, r=fyren) 2010-07-20 11:21:37 -04:00
Jason Booth fbbf193345 Fixed duplicated entries and unnecessary file locking in ProfViewer (bug 4510, r=dvander) 2010-07-18 21:39:15 -04:00
Jason Booth 78e51e6b11 Fixed problems with ProfViewer project file (bug 4510, r=dvander) 2010-07-18 21:37:18 -04:00
Nicholas Hastings be2bbec526 Fixed PlayerRunCmd being hooked when not used. (bug 3990, r=fyren) 2010-07-18 15:43:56 -04:00
Scott Ehlert a366096ef4 Added MSVC10 project file for sample extension (bug 4521, r=dvander). 2010-07-15 15:19:14 -05:00
Scott Ehlert c72222f718 Updated docs on replicate and notify params for SetConVar* and ResetConVar (bug 4517, r=pred). 2010-07-14 20:29:53 -05:00
Scott Ehlert fba0ec93bf Fixed replicate and notify params not working on old engine games (bug 4516, r=pred).
This also fixes an issue where clients could be notified of convar changes twice on newer engines (Orange Box and later).
2010-07-14 20:29:45 -05:00
Scott Ehlert 86f767e1aa Made name param of GetConVarName() non-const (bug 4515, r=pred). 2010-07-14 20:29:29 -05:00
Scott Ehlert 7e54192713 Added gamedata for DOD:S on Mac OS X. (bug 4513, r=dvander). 2010-07-12 21:03:25 -05:00
David Anderson e76a73e276 Fixed Windows build fo' realz. 2010-07-11 18:06:06 -07:00
David Anderson ccf0490624 Windows build fix. 2010-07-11 17:45:35 -07:00
David Anderson fe2721e04e Merge. 2010-07-11 17:33:09 -07:00
David Anderson fdd1a9afef Use hash table for global name lookups (bug 4496, r=fyren). 2010-07-11 17:32:46 -07:00
Scott Ehlert abf7aed880 Triggering a build to compile against L4D2 SDK changes (bug 4509). 2010-07-11 03:00:30 -05:00
Nicholas Hastings d986c7cdc0 Fixed TF2 sigs that broke with recent update (bug 4506, r=fyren) 2010-07-08 21:07:06 -04:00
Scott Ehlert 9d5e994c01 Bleh, fixed compiler error in console.inc caused by previous changeset. 2010-07-07 02:27:59 -05:00
Scott Ehlert 6f16fc77b8 Added GetConVarDefault() native (bug 4502, r=dvander). 2010-07-06 17:32:58 -05:00
David Anderson 651dfb796c Merge. 2010-07-02 18:17:16 -07:00
David Anderson 4f2fc17a8f Fixed staging buffers reallocating on every operation (bug 3820, r=fyren+fyren). 2010-07-02 18:16:50 -07:00
David Anderson 7bc019547f Fixed O(n) insertion of debug strings (bug 4495, r=fyren). 2010-07-02 18:16:15 -07:00
David Anderson f8c2629a3e Fixed O(n^2) generation of debug info tables (bug 4493, r=fyren). 2010-07-02 18:15:59 -07:00
David Anderson b5b4bff2fc Fixed bogus assert in callfunction (bug 4487, r=fyren). 2010-07-02 18:15:21 -07:00
David Anderson 7054b92a14 Fixed bogus assert about name lengths (bug 4486, r=fyren). 2010-07-02 18:12:31 -07:00
Nicholas Hastings 5856f9a45f Gmod gamedata update (bug 4489, r=fyren) 2010-06-29 18:17:25 -04:00
Fyren cec10060c6 How did I even do that. 2010-06-28 17:25:06 -07:00
Fyren 74a479ab41 Fix build 2010-06-28 16:41:08 -07:00
Nicholas Hastings e51ab09bb1 Backed out changeset: f1bfc4089ce5 2010-06-28 19:17:10 -04:00
Nicholas Hastings 0cd98bc353 Another try at fixing build. 2010-06-28 19:12:37 -04:00
Nicholas Hastings 158f9b0dc7 Backed out changeset: 54086a5d694b 2010-06-28 19:12:05 -04:00
Nicholas Hastings 95fe6eaf86 Fix build. 2010-06-28 19:03:16 -04:00
Nicholas Hastings 40b4859b16 newline 2010-06-28 18:37:43 -04:00
Nicholas Hastings e4832f0d08 Added forward/detour for TF2's GetHoliday function (bug 4462, r=pred) 2010-06-28 17:48:14 -04:00
_KaszpiR_ 5d5400a9ac Added FindFlagChar native. (bug 3776, r=dvander) 2010-06-27 19:17:25 -04:00
David Anderson f439cad46c Removed code now dead from CS:S Orange Box move (bug 4399, r=ds). 2010-06-23 23:35:28 -07:00
Nicholas Hastings 9fe2e8e31a Removed cstrike ep1 and cstrike_beta builds and references. 2010-06-23 23:49:06 -04:00
Erik Minekus 92d3fc3d8c Fixed lack of error checking on sm_motd. (bug 4460, r=dvander) 2010-06-23 23:41:47 -04:00
Nicholas Hastings 5d89599799 Backed out changeset: 6c4d95b625ea 2010-06-23 23:40:53 -04:00
Erik Minekus 2eb5b5eb67 Fixed lack of error checking on sm_motd. 2010-06-23 23:39:39 -04:00
Nicholas Hastings 45549a8173 Cstrike ext now recognizes and loads on cstrike_beta (bug 4399, r=fyren) 2010-06-23 10:08:08 -04:00
devicenull d7ebf2edc1 Fixed inaccuracy in CommandListener documentation 2010-06-23 09:22:49 -04:00
Greyscale a9aed2e557 Removed unnecessary tag from return value of SetArrayCell 2010-06-23 09:17:21 -04:00
Nicholas Hastings d691a0cf24 Ep2v cstrike ext now gets added to package. 2010-06-23 08:54:56 -04:00
Nicholas Hastings cbaa959521 Adding building of cstrike ext for ep2v (bug 4399, r=fyren) 2010-06-23 08:19:19 -04:00
Nicholas Hastings 2f128113b6 Added missing TF2 critcola condflag define (bug 4464, r=fyren) 2010-06-22 19:31:33 -04:00
Nicholas Hastings 70251a8b2e Updated TF2 'Burn' signature (bug 4463, r=fyren) 2010-06-22 19:26:07 -04:00
Fyren e332f4e12b Possible dynamic array dimension fix (bug 4428, r=dvander) 2010-06-19 15:15:23 -07:00
Nicholas Hastings 9a140ff93f Fixed outputname null pointer crash in sdktools (bug 4422, r=fyren) 2010-06-14 09:32:50 -04:00
David Anderson 97ab5dd1b5 Fixed switch case comparisons failing with large numbers (bug 4457, r=pred). 2010-06-13 20:26:58 -07:00
Scott Ehlert 075b4e92a9 Added gamedata for TF2 on Mac OS X. (bug 4455, r=dvander). 2010-06-10 17:12:52 -05:00
Nicholas Hastings f22dcfe03c Added missing FireOutput and PlayerRunCmd gamedata for zombie_master (bug 4452, r=fyren) 2010-06-07 19:35:34 -04:00
Scott Ehlert 124086419e Fixed IMemUtils::ResolveSymbol() on Mac OS X (bug 4448, r=dvander). 2010-06-07 13:26:45 -05:00
Nicholas Hastings 0712db0d29 Merge. 2010-06-06 20:53:13 -04:00
Nicholas Hastings 895f7edd12 Added new player condition (TFCond_CritCola) to tf2.inc. (bug 4447, r=fyren) 2010-06-06 20:51:35 -04:00
Matt Woodrow a3c5c0c23a Merge 2010-06-07 10:33:47 +12:00
Matt Woodrow f7a3a6c17b Fixed clientprefs deleting cookies twice in rare cases (bug 4412, r=Fyren) 2010-06-07 10:30:33 +12:00
Nicholas Hastings 98bec2580e Fixed OnClientConnected forward not firing for bots (bug 4443, r=fyren) 2010-06-06 17:53:38 -04:00
Fyren 5ca2d469a8 Fix sdktools voice memory corruption (bug 4415, r=dvander) 2010-06-05 23:15:29 -07:00
Scott Ehlert b413405876 Added gamedata for CS:S Beta (ep2v) on Mac OS X. (bug 4399, r=dvander). 2010-06-04 17:14:52 -05:00
Nicholas Hastings 330ff93e3e Updated Obsidian Conflict gamedata (bug 4439, r=fyren) 2010-06-02 07:47:00 -04:00
Nicholas Hastings fe08104d18 Fixed tf2.inc incorrectly attempting to load tf2 ext on all games (bug 4197, r=fyren) 2010-05-31 16:31:10 -04:00
Scott Ehlert e518605d69 Fixed various areas where code was being compiled for Linux only, but should actually be used on OS X too (bug 4392, r=dvander). 2010-05-29 18:11:47 -04:00
Scott Ehlert 9a35085ac3 Merge. 2010-05-29 00:38:08 -05:00
Scott Ehlert b0cf41de08 Fixed potential problem when using bintools to call functions that return objects by value on OS X (bug 4392, r=dvander).
Objects are only returned in memory when their sizes are greater than 8 or are not a power of 2.
2010-05-29 00:22:21 -05:00
Nicholas Hastings 00c3dc73f3 Updated/fixed SourceForts gamedata (bug 4429, r=fyren) 2010-05-28 13:28:04 -04:00
Scott Ehlert a73cc93d21 Added version information to Mac OS X binaries (bug 4392, r=dvander). 2010-05-27 21:05:32 -05:00
Scott Ehlert 5a10299074 Added Mac OS X build support to sample extension makefiles (bug 4392, r=dvander). 2010-05-27 21:04:49 -05:00
Scott Ehlert 77d243f87f Merge. 2010-05-27 21:04:22 -05:00
Nicholas Hastings fb4f6406c9 Fixed SDKTools sm_dump_datamaps crash on improperly created entities (bug 4424, r=pred) 2010-05-26 08:30:13 -04:00
Scott Ehlert 3133b9b010 Merge. 2010-05-22 01:08:42 -05:00
Nicholas Hastings 12723167fc Added gamedata for Resistance and Liberation (bug 4418, r=fyren) 2010-05-21 14:04:19 -04:00
Nicholas Hastings 2cc22778b5 Added comment to databases.cfg to denote acceptable "host" types 2010-05-21 14:00:33 -04:00
Nicholas Hastings 790d3f12a6 Empires gamedata fixes (bug 4417, r=fyren). 2010-05-21 13:55:29 -04:00
Scott Ehlert beb1ab81e0 Updated .hgignore to ignore dylib binaries on OS X. 2010-05-19 04:31:10 -05:00
Scott Ehlert e5126b4c65 Added support for "mac" in game data files (bug 4393, r=dvander). 2010-05-16 02:27:53 -04:00
Scott Ehlert a2a4df5d06 Triggering build. 2010-05-15 20:50:24 -04:00
Scott Ehlert ac0bd9714b Triggering build. 2010-05-15 20:00:55 -04:00
David Anderson 60226d9195 Fixed windows build. 2010-05-15 13:01:23 -07:00
David Anderson 64455b9852 Moved gameconf code from core to logic (bug 4406 part 11, r=ds).
--HG--
rename : core/GameConfigs.cpp => core/logic/GameConfigs.cpp
rename : core/GameConfigs.h => core/logic/GameConfigs.h
rename : core/smn_gameconfigs.cpp => core/logic/smn_gameconfigs.cpp
2010-05-14 23:35:42 -07:00
David Anderson 96f6cdf677 Moved datapack natives from core to logic (bug 4406 part 10, r=ds).
--HG--
rename : core/smn_datapacks.cpp => core/logic/smn_datapacks.cpp
2010-05-14 21:16:35 -07:00
David Anderson c188491289 Moved handle natives from core to logic (bug 4406 part 9, r=ds).
--HG--
rename : core/smn_handles.cpp => core/logic/smn_handles.cpp
2010-05-14 21:06:06 -07:00
David Anderson e9e4d566a5 Build fix. 2010-05-14 20:56:40 -07:00
David Anderson 85bedca236 Move string natives from logic to core (bug 4406 part 8, r=fyren).
--HG--
rename : core/smn_string.cpp => core/logic/smn_string.cpp
2010-05-14 20:04:44 -07:00
David Anderson d80191df3d Move replace functions from logic to core (bug 4406 part 7, r=fyren). 2010-05-14 20:04:30 -07:00
David Anderson 9137e92c09 Move translator from logic to core (bug 4406 part 6, r=ds).
--HG--
rename : core/PhraseCollection.cpp => core/logic/PhraseCollection.cpp
rename : core/PhraseCollection.h => core/logic/PhraseCollection.h
rename : core/Translator.cpp => core/logic/Translator.cpp
rename : core/Translator.h => core/logic/Translator.h
rename : core/sm_memtable.h => core/logic/sm_memtable.h
rename : core/smn_lang.cpp => core/logic/smn_lang.cpp
2010-05-14 19:43:53 -07:00
David Anderson 721dae3892 Inline sm_memtable (bug 4406 part 5, r=ds). 2010-05-14 19:43:38 -07:00
David Anderson 1cdacf69be Move some string functions from core to logic (bug 4406 part 4, r=fyren). 2010-05-14 19:28:10 -07:00
David Anderson b5b002aa4b Move banning natives from core to logic (bug 4406 part 3, r=fyren).
--HG--
rename : core/smn_banning.cpp => core/logic/smn_banning.cpp
2010-05-14 18:22:03 -07:00
David Anderson 78f5b513c0 Move admin natives from core to logic (bug 4406 part 2, r=ds).
--HG--
rename : core/smn_admin.cpp => core/logic/smn_admin.cpp
2010-05-14 17:46:19 -07:00
David Anderson 0032fcaa66 Move memutils from core to logic (bug 4406, r=ds).
--HG--
rename : core/MemoryUtils.cpp => core/logic/MemoryUtils.cpp
rename : core/MemoryUtils.h => core/logic/MemoryUtils.h
rename : core/sm_symtable.h => core/logic/sm_symtable.h
2010-05-14 16:14:59 -07:00
Scott Ehlert 0fba0923c8 Changed MSVC compiler flag /Ot to /Ox and added /OPT:REF linker flag. 2010-05-14 02:42:08 -05:00
Scott Ehlert e0169f6696 Fixed loader on Mac OS X (bug 4392, r=dvander). 2010-05-14 01:04:17 -05:00
David Anderson 28217f10cb Added ProcessTargetString simple filter API (bug 4404, r=ds). 2010-05-13 12:28:51 -07:00
Scott Ehlert fb28f4bcd0 Fixed package name for Windows (bug 4395). 2010-05-13 04:54:31 -05:00
Scott Ehlert 8852256ab6 Appended OS names to package archives (bug 4395, r=dvander). 2010-05-13 04:23:43 -05:00
Scott Ehlert 95de453677 Compile and link fixes for Mac OS X (bug 4392, r=dvander). 2010-05-13 04:22:31 -05:00
Scott Ehlert 5ef40e15c4 Add support for Mac OS X to ResolveSymbol() and FindPattern() in IMemUtils (bug 4392, r=dvander). 2010-05-13 04:20:41 -05:00
Scott Ehlert 31f223bff5 Merge. 2010-05-13 04:19:39 -05:00
Scott Ehlert 9fce2b1d8e Only build OB-Valve binaries on Mac OS X for now (bug 4392, r=dvander). 2010-05-13 04:18:58 -05:00
David Anderson a6ceb337b2 Move timer natives into logic binary (bug 4402, r=ds).
--HG--
rename : core/smn_timers.cpp => core/logic/smn_timers.cpp
2010-05-13 01:47:12 -07:00
Scott Ehlert f4e22cb44c Backed out changeset 29e6cc6f2124 (bug 4392). 2010-05-12 04:13:56 -05:00
David Anderson ab9750f8b2 Only build OB-Valve binaries on Mac OS X right now (bug 4392, r=ds). 2010-05-11 23:48:39 -05:00
Nicholas Hastings fe8e0b0e0a Merge 2010-05-11 20:41:19 -04:00
Nicholas Hastings c2565cf3b7 Updated gamedata for ep2v cstrike(_beta) (bug 4399, r=fyren) 2010-05-11 20:40:14 -04:00
David Anderson af82971bf5 Fixed Windows build. 2010-05-11 02:07:35 -07:00
David Anderson 271b52158e Mac build fixes (bug 4392, r=me). 2010-05-11 01:46:55 -07:00
Fyren 26c404adee Mac build fixes (bug 4392, r=dvander). 2010-05-11 01:46:54 -07:00
Scott Ehlert f06af54165 Fixed compiler and linker flags for darwin (r=dvander).
The previous commit by 'me' was a fake atrocity created by dvander. :o
2010-05-11 02:36:03 -05:00
Fyren 2a77dfbcd2 Fixed buildbot scripts for darwin (r=dvander). 2010-05-11 00:16:52 -07:00
David Anderson 738fcb6563 Added pcre-7.9 build for darwin. 2010-05-11 00:10:37 -07:00
Scott Ehlert 3d4754d4ad Fixed master amb script for darwin (r=dvander). 2010-05-11 00:10:36 -07:00
Scott Ehlert b9ea1d1be4 Fixed master amb script for darwin (r=dvander). 2010-05-11 00:10:36 -07:00
Nicholas Hastings b1b0484dae Fixed TF2 natives not being marked optional when ext not required (bug 4389, r=fyren) 2010-05-10 18:18:15 -04:00
Nicholas Hastings 20b79784bf Updated Empires gamedata (bug 4390, r=fyren) 2010-05-08 21:37:21 -04:00
Nicholas Hastings 4baa3358df Updated geshi and npp sp language files for SM 1.3.2
Also fixed typo in geshi generator and added 'default' to list of reserved words.
2010-05-08 21:31:32 -04:00
Scott Ehlert 8fe7f8b8d8 Fixed SendConVarValue() on TF2, DOD:S, L4D, and L4D2 (bug 4273, r=dvander). 2010-05-04 22:53:26 -04:00
Scott Ehlert 6996a0db2b Argh, really fixed HookEntityOutput() crash on TF2 (bug 4375). 2010-04-30 11:18:45 -04:00
Scott Ehlert b89a899c82 Fixed HookEntityOutput() crash with recent updates to TF2 and L4D2 (bug 4375, r=pred, a=blocking). 2010-04-30 03:51:35 -04:00
Fyren bbbbb660b3 Triggering build 2010-04-29 20:48:17 -07:00
Scott Ehlert 6ba29219e5 Updated sample extension makefiles to compile against latest changes for L4D2 and TF2 (bug 4374, r=dvander). 2010-04-29 16:06:32 -04:00
Nicholas Hastings dd97bdcc2c Fixed SetUserCvar offset for ep2v (bug 4371, r=fyren) 2010-04-29 14:12:08 -04:00
Nicholas Hastings b63e0f08bf Backed out changeset 907677755029 2010-04-29 14:11:03 -04:00
Nicholas Hastings c5ae9d45ad Fixed SetUserCvar offset for ep2v (bug 4371, r=fyren) 2010-04-29 14:05:22 -04:00
David Anderson e906a0da8c Merge. 2010-04-29 01:28:27 -07:00
David Anderson 2edfb0aaac Fixed regression when using panels (no bug, r=me). 2010-04-29 01:28:11 -07:00
Nicholas Hastings dc116858a9 ep2v gamedata (bug 4371, r=fyren) 2010-04-29 00:09:35 -07:00
Fyren 1a938f8711 ep2v build changes (bug 4371, r=dvander) 2010-04-29 00:08:08 -07:00
David Anderson fc88cd3cb1 Check return value of GetPlayerNetInfo (bug 4315, r=fyren). 2010-04-27 23:40:04 -07:00
David Anderson 55205e631b Merge. 2010-04-27 21:07:59 -07:00
David Anderson a36fa76d21 Root menu handles in callbacks (bug 4353, r=fyren). 2010-04-27 21:03:20 -07:00
Nicholas Hastings b8d512f5e1 Fixed entity output hooks not working in Insurgency (bug 4365, r=fyren) 2010-04-24 21:10:23 -04:00
Nicholas Hastings d4263b59c6 Added obsidian to list of games which support tempents with ep2 gamedata (thread 75480, r=me). 2010-04-24 21:08:06 -04:00
Nicholas Hastings e5e1507dff Fixed functions.inc not having double-include prevention (bug 4342, r=fyren) 2010-04-24 21:06:10 -04:00
Zach Kanzler 2edf63c5fd Fixed IGamePlayer->GetUserId() returning junk (bug 3916, r=fyren) 2010-04-24 21:00:43 -04:00
Fyren 5ec4b3441e Build stuff for L4D2 DLC (bug 4361, r=SAWCE) 2010-04-23 11:39:12 -07:00
Nicholas Hastings dd1757b3c3 Updated L4D2 gamedata for The Passing update (bug 4361, r=pending) 2010-04-23 14:22:41 -04:00
Nicholas Hastings dda26545e5 Updated Insurgency gamedata for Insurgency 2010-04-19 update (bug 4356, r=fyren) 2010-04-23 10:38:16 -04:00
Nicholas Hastings 410ef8ce96 Merge 2010-04-19 11:18:46 -04:00
Nicholas Hastings ce7cb9cf64 Added Notepad++ userDefineLang.xml generator for Sourcepawn
(based on the SP GeSHi generator)
2010-04-19 11:10:26 -04:00
Nicholas Hastings 31a16375ab Enhanced Sourcepawn GeSHi generation script
* Added a few missing keywords.
* Added better preprocessor, number, and string control char highlighting.
* Added default tab width (of 4 spaces).
* Fixed parsing of some enum values.
* Changed keywords to be case sensitive.
* Changed colors to be more sane.
2010-04-19 11:08:23 -04:00
Nicholas Hastings ec7b47da22 Updated Empires gamedata for Empires 2.25a release (bug 4108, r=fyren) 2010-04-19 10:38:28 -04:00
David Anderson 0124020ba4 Added obsidian to list of games which need menu redraws (thread 123237, r=me). 2010-04-04 23:50:27 -07:00
David Anderson 28f71d18bd Added obsidian to radiotimeout game list (t=123237, r=me). 2010-04-04 23:49:28 -07:00
Nicholas Hastings fe226c1c8d Updated sourcepawn GeSHi colors slightly to appease 2.53% of the haterz. 2010-03-31 18:40:03 -04:00
Nicholas Hastings 18e20de4d6 Added GeSHi language file generator for Sourcepawn 2010-03-31 14:27:09 -04:00
Nicholas Hastings 956d345e17 Added TF2_StunPlayer native and TF2_GetPlayerConditionFlags stock to TF2 ext. (bug 4331, r=pred) 2010-03-31 08:51:25 -04:00
Nicholas Hastings ddfb958647 Added missing semicolon in plugins/include/tf2.inc. 2010-03-23 20:06:13 -04:00
Nicholas Hastings 145d0ef37d Added Gamerules SDKCall support to CSPromod gamedata (bug 4320, r=pred) 2010-03-23 19:42:19 -04:00
Nicholas Hastings 019e3956f7 Fixed bad caller crash with HookEntityOutput (bug 4311, r=fyren) 2010-03-20 11:07:45 -04:00
Nicholas Hastings a72daff4ac Added 4 new natives to TF2 ext. (bug 4166, r=pred)
Added natives for Regenerate, add/remove condition, and SetPlayerPowerPlay. Also updated TF2 test plugin.
2010-03-18 11:35:05 -04:00
Nicholas Hastings 58ce9cd37f Added missing core voting cvars to sourcemod.cfg (bug 4309, r=fyren) 2010-03-11 22:00:46 -05:00
Nicholas Hastings 687bdaff8f Added missing core voting cvars to sourcemod.cfg (bug 4224, r=pred) 2010-03-11 17:43:46 -05:00
Nicholas Hastings 2143a66ad6 Fixed incorrect DispatchSpawn signature for ZPS and added ShowMenu and Hudtext support (bug 4279, r=Fyren) 2010-03-09 20:39:56 -05:00
Nicholas Hastings 74892f1562 Re-enabled ShowMenu support for FortressForever (bug 4028, r=dvander) 2010-03-09 18:50:47 -05:00
Nicholas Hastings 4a59ac011f Fixed FireOutput signature for FortressForever (bug 4062, r=dvander) 2010-03-09 18:47:56 -05:00
Nicholas Hastings e0fd2e8f27 Fixed sm_rename on L4D2 on Windows (bug 4131, r=dvander) 2010-03-09 18:44:18 -05:00
Nicholas Hastings ba76506773 Fixed inaccurate description for sm_unban (bug 4245, r=dvander) 2010-03-09 18:41:25 -05:00
Nicholas Hastings d224827544 Fixed CSPromod SDKTools Support (bug 4255, r=dvander) 2010-03-09 18:36:45 -05:00
Nicholas Hastings 8d35b5bd11 Updated PVKII support for PVKII 2.3 (bug 4276, r=dvander) 2010-03-09 18:29:31 -05:00
Nicholas Hastings 9df28c25d7 Fixed CreateGameRulesObject sig for ZPS (bug 4285, r=dvander). 2010-03-09 18:13:21 -05:00
Matt Woodrow 5f9b2a91fd Added optional 'No Vote' option to vote menu (bug 4217, r=dvander) 2010-02-27 14:56:02 +13:00
Erik Minekus 46a46f5e49 Fixed Insurgency gamedata file (bug 4282, r=dvander). 2010-02-24 23:41:06 -08:00
Liam 4bdc495d01 Corrected a typo in the string.inc file. (bug 4207, r=fyren) 2010-02-13 01:49:39 -05:00
Liam e60d5e6aeb Updated VC2010 files. 2010-02-13 01:13:43 -05:00
UNLOZE 7c3387755d Added MSVC10 files for Visual Studio 2010 support. 2010-02-13 00:40:53 -05:00
Fyren 6f04dad428 maxClients -> MaxClients in sdktools_sound.inc (fix bug 3985, r=psychonicsux) 2010-02-10 11:07:21 -08:00
Nicholas Hastings 6ed4720df3 Added missing file for Battlegrounds support (bug 4146). 2010-02-08 20:47:51 -08:00
Nicholas Hastings ac7b454039 Added SDKTools support for CSProMod (bug 4255, r=dvander) 2010-02-08 20:25:11 -08:00
Nicholas Hastings 0af39de346 Fixed base plugins using GetMaxClients() instead of MaxClients (bug 3985, r=dvander). 2010-02-08 20:14:52 -08:00
Nicholas Hastings d484979fe8 Fixed CreateEntityByName for Insurgency (bug 4180, r=dvander). 2010-02-08 20:10:24 -08:00
Nicholas Hastings 6e87e5c05f Updated Garry's Mod offsets (bug 4230, r=dvander). 2010-02-08 20:08:14 -08:00
Nicholas Hastings 7633c8e76e Fixed nextmap errors on Garry's Mod (bug 4268, r=dvander). 2010-02-08 20:06:48 -08:00
Fyren c78e89c3c1 Compiler confused |any| tag with |String| on array arguments. 2010-02-08 20:00:06 -08:00
David Anderson 1852aaf332 Fixed GetClientCookieTime not being exported (bug 4237, r=fyren). 2010-02-08 19:58:36 -08:00
Nicholas Hastings 8b4c8f63c0 Fixed FindEntityByClassname crash in Synergy (bug 4235, r=dvander). 2010-02-08 19:57:20 -08:00
Fyren d7b64c18c2 Fixed NULL-deref in entity handling code. 2010-02-08 19:55:14 -08:00
Nicholas Hastings 09668c972e Fixed Day of Defeat offsets for 20100203 update (bug 4262, r=dvander). 2010-02-04 19:28:06 -06:00
Scott Ehlert 68a0d10443 Webternet and Updater extensions now load on Windows 2000 (bug 4234, r=dvander). 2010-01-20 15:12:57 -06:00
David Anderson 0708e7f8f6 Fixed accidental hook against garbage offset (bug 4231, r=fyren). 2010-01-20 04:03:46 -08:00
David Anderson 1235e989d4 Added PlayerRunCmd offset for DoD:s (bug 4231 mitigation, r=me). 2010-01-20 04:01:39 -08:00
Scott Ehlert 3a6808e4d8 Updated .hgignore for Explorer files beginning with a lowercase letter (argh!) 2010-01-20 02:40:55 -06:00
David Anderson dbfb034548 Mercurial queues... oh, how terrible. 2010-01-18 03:20:44 -08:00
David Anderson 94d01e9e5a Moved CRC32 from core to logic (no bug, r=me). 2010-01-18 03:08:52 -08:00
David Anderson 5e48b49b7e Updated credits for 1.3 release. 2010-01-14 03:29:31 -08:00
Greyscale 3b0785cae0 Fixed missing #endif in adminmenu.inc (bug 4216, r=dvander). 2010-01-14 00:22:45 -08:00
David Anderson bd3b46d624 Fixed command listener spew on server shutdown (bug 4198, r=fyren). 2010-01-13 21:48:51 -08:00
David Anderson 1cbe996831 Linux build fix (bug 3520 fallout). 2010-01-11 22:50:44 -08:00
Downtown1 18865c44c8 Added a new ValveCallType that allows for arbitrary |this| parameters, as well as associated features in gamedata and for reading/writing memory (bug 3520, r=dvander, sr=fyren). 2010-01-11 22:46:44 -08:00
David Anderson ead6ca73e5 Triggering build. 2010-01-11 20:09:34 -08:00
Nicholas Hastings deb3f6d9c4 Changed basechat to use %N instead of GetClientName (bug 4205, r=dvander). 2010-01-10 17:57:34 -08:00
Nicholas Hastings b1b98c5256 Fixed basechat not using color messages on hl2mp (bug 4204, r=dvander). 2010-01-10 17:51:24 -08:00
Nicholas Hastings 4dc2227f23 Fixed lack of quotes on some basechat log messages (bug 4132, r=dvander). 2010-01-10 17:50:30 -08:00
David Anderson a76f9e11fb Backed out changeset 9a52d61fe6ba (bad commit). 2010-01-10 17:49:44 -08:00
Nicholas Hastings abeb91a5e4 Fixed lack of quotes on some basechat log messages (bug 4132, r=dvander). 2010-01-10 17:47:11 -08:00
Nicholas Hastings 6d5e7cbe08 Added missing SDK define for L4D2 (bug 4209, r=dvander). 2010-01-10 17:38:03 -08:00
Nicholas Hastings c468c26ad6 Follow-up to bug 4194 (r=dvander). 2010-01-10 17:29:32 -08:00
David Anderson a0e940c5a9 Merge. 2010-01-10 17:16:08 -08:00
David Anderson 2f1de22cae Backed out changeset 292be4eb9d0c (bug 4211). 2010-01-10 17:16:02 -08:00
David Anderson 4631282709 Fixed reentrancy problems with iterators, forwards, and function removals (bug
4059, r=fyren).
2010-01-10 16:58:17 -08:00
Fyren 306ac5243a Fixed GuessSDKVersion() not working on ep2v (bug 4194, r=dvander). 2010-01-09 11:33:19 -08:00
Nicholas Hastings 956fe42a6c Fixed SetUserCvar (sm_rename) on TF/DoD Linux (bug 4196, r=dvander). 2010-01-07 01:26:01 -08:00
Nicholas Hastings 1824bdfe7e Add Insurgency to list of games that support HUD messages (bug 4136, r=dvander). 2009-12-19 20:42:32 -08:00
David Anderson 5f53284cbd Fixed build, wrong enum comparison. 2009-12-19 18:25:56 -08:00
David Anderson 7a84b71eb2 Fixed crashes from rare plugin loading errors (bug 4153, r=ds). 2009-12-19 18:19:28 -08:00
David Anderson 85382cd6c2 Fixed SourceMod crashing after flushing the profiler (bug 4149, r=ds). 2009-12-19 18:18:17 -08:00
David Anderson 02a99f1e51 Add ability to change dontBroadcast status on hooked events (bug 3886, r=ds). 2009-12-19 18:16:41 -08:00
Nicholas Hastings fe405df704 Another TF2 gamedata fix (bug 4151, r=dvander). 2009-12-19 12:57:26 -08:00
Nicholas Hastings ac5ee90c9b Battlegrounds 2 gamedata support (bug 4146, r=dvander). 2009-12-19 00:03:57 -08:00
Nicholas Hastings fb6b34e155 TF2 gamedata updates (bug 4147, r=dvander). 2009-12-18 22:01:41 -08:00
Fyren caa8932c9a Improve/fix GetEntity (bug 4092, r=pred) 2009-12-15 23:14:53 -08:00
David Anderson 75611f3bca Fixed profiler being set to NULL (bug 4143, r=fyren). 2009-12-14 23:08:15 -08:00
David Anderson f0f14d8a22 Fixed infinite loop in Windows build failure path (bug 4144, r=ds). 2009-12-14 23:07:54 -08:00
Nicholas Hastings 98ad6cd23b Fixed CreateEntityByName for Insurgency (bug 4046, r=dvander). 2009-12-14 20:31:16 -08:00
Nicholas Hastings bd80d1cd76 Updated Synergy gamedata (bug 3987, r=dvander). 2009-12-14 20:30:44 -08:00
Nicholas Hastings 5a4670ec2f Added HudText support for Zombie Master (bug 4004, r=dvander). 2009-12-14 20:30:04 -08:00
Nicholas Hastings 6fd039925a Added Neotokyo support (bug 4126, r=dvander). 2009-12-14 20:29:23 -08:00
David Anderson cd602ab5e3 Fixed basecomm description spelling (bug 4112, r=me). 2009-12-14 20:27:26 -08:00
Dog f59ead54d3 Fixed CommitSuicide offset on DoD:S (bug 4109, r=dvander). 2009-12-14 20:26:45 -08:00
Fyren 4030f1e40d Merge 2009-11-23 01:50:28 -08:00
Fyren b7ac7452f7 Fix wonky handling of path separators for "sm plugins" commands (bug 3857, r=dvander) 2009-11-23 01:47:32 -08:00
Scott Ehlert 5dd6867408 Updated .hgignore to ignore some Windows and OS X files. 2009-11-22 01:39:29 -06:00
Scott Ehlert 9d410df287 Updated sample_ext and mms_sample_ext for Orange Box Valve and Left 4 Dead 2 (bug 4118, r=pred). 2009-11-22 01:33:08 -06:00
David Anderson fe8dc36074 Use GetVSPInfo() from MM:S 1.8 legacy API (bug 4081, r=ds). 2009-11-20 15:18:58 -06:00
Fyren 0cef3fbf27 Fix leak in nominations plugin (bug 4104, r=pred) 2009-11-18 15:44:51 -08:00
Fyren b5d9b18da4 Fix rare basevotes map vote problem (bug 3905, r=dvander) 2009-11-18 15:42:21 -08:00
Scott Ehlert dc0ea197cd Added IMemoryUtils::ResolveSymbol() for resolving symbols hidden via GCC's -fvisibility=hidden (bug 4091, r=dvander,pred).
Right now, this is only used on L4D2 where it is needed.
2009-11-06 16:24:40 -06:00
David Anderson 5bf17fc5ae Clarified handle invariants in clientprefs.inc (no bug, r=me). 2009-11-04 13:52:12 -05:00
Fyren 33ca5943fa Don't call edict_t::StateChanged(ushort) on L4D2 (bug 4090, r=dvander) 2009-11-01 02:53:34 -08:00
Scott Ehlert edc6591041 Use SOURCE_ENGINE_ORANGEBOXVALVE constant from MM:S 1.8 (bug 4087, r=dvander). 2009-10-30 14:04:43 -05:00
Fyren 113ec33743 More L4D2 gamedata changes 2009-10-30 01:24:55 -07:00
Scott Ehlert 8c297832f6 Fixed Windows build, I think. 2009-10-30 00:03:54 -05:00
Fyren e767b2ff94 Typo fix 2009-10-29 20:34:00 -07:00
Scott Ehlert a1ff408c13 Merge. 2009-10-29 21:47:27 -05:00
Matt Woodrow 440184e83c New sdk uses _linux for vstdlib/tier0 2009-10-30 15:20:48 +13:00
Matt Woodrow 8ee6cad7ea Build Trigger 2009-10-30 15:10:34 +13:00
Matt Woodrow edb17b76f0 AMBuild updated to use new MM:S version 2009-10-30 14:58:17 +13:00
Fyren 31dc5f335d Updated GuessSDKVersion 2009-10-30 14:34:34 +13:00
Matt Woodrow eb68e4c627 SourceMod MSVC project files updated, windows tested and loading, gamedata fix. 2009-10-30 14:29:45 +13:00
Matt Woodrow 98e97920ae AMBuild updated for new L4D2 engine 2009-10-30 13:27:19 +13:00
Matt Woodrow 533723cd8b L4D2 gamedata updates 2009-10-30 13:27:05 +13:00
Fyren 9e69afbbd6 Inital SM fixes for l4d2 and linux makefile updates 2009-10-30 13:26:13 +13:00
Scott Ehlert 2dea76dfa1 Changed name in credits. 2009-10-29 17:35:00 -05:00
David Anderson 8a8bafb199 Use GetSourceEngineBuild() from MM:S 1.8 legacy API (bug 4083, r=ds). 2009-10-29 01:33:57 -07:00
David Anderson 5a21d8c24d Let SourceMod use OnUnlinkConCommandBase from MM:S 1.8 legacy API (bug 4080, r=ds). 2009-10-29 00:53:31 -07:00
David Anderson 5111b4799c Fix iloop race when using AddCommandListener and SourceMod unloads (bug 4077, r=pred). 2009-10-29 00:06:12 -07:00
David Anderson 528bbe0116 Build against MM:S 1.8 with core-legacy (bug 4076, r=ds). 2009-10-28 23:30:52 -07:00
David Anderson 3030ab8664 Fixed crash when activating command listeners on EP1 while inside a command callback (bug 4072, r=pred). 2009-10-28 00:50:48 -07:00
David Anderson 2698ff1a04 Added feature testing functionality (bug 4021, r=pred). 2009-10-28 00:37:34 -07:00
David Anderson 084dd1c8dd Build fix. 2009-10-28 00:31:48 -07:00
David Anderson a8392889de Fix maphistory command not returning a value (bug 4069, r=pred). 2009-10-28 00:08:15 -07:00
David Anderson 3bf5edc2b3 Added @spec target (bug 2718, r=fyren). 2009-10-27 03:41:36 -07:00
David Anderson 97be0ff22a Bumped trunk version. 2009-10-27 03:11:34 -07:00
426 changed files with 34785 additions and 5487 deletions
+11
View File
@@ -1,11 +1,15 @@
# Binaries # Binaries
\.dll$ \.dll$
\.dylib$
\.exe$ \.exe$
\.so$ \.so$
# Files generated by Visual Studio # Files generated by Visual Studio
\.aps$ \.aps$
\.ipch$
\.ncb$ \.ncb$
\.opensdf$
\.sdf$
\.suo$ \.suo$
\.user$ \.user$
@@ -13,3 +17,10 @@
/CrazyDebug.* /CrazyDebug.*
/Debug.* /Debug.*
/Release.* /Release.*
# Files generated by Mac OS X Finder
(^|/)\.DS_Store$
# Files generated by Windows Explorer
(^|/)[dD]esktop\.ini$
(^|/)[tT]humbs\.db$
+1
View File
@@ -3,3 +3,4 @@ e6ef5ecdf8d75740ca2685a709bf321f8873bc3b sourcemod-1.1.0
e877885fac80be71822641f7a9122cebc9812521 sourcemod-1.1.1 e877885fac80be71822641f7a9122cebc9812521 sourcemod-1.1.1
b3ffa8a4511c4eadaf533fc790aa6b14f7f0c6ea sourcemod-1.1.2 b3ffa8a4511c4eadaf533fc790aa6b14f7f0c6ea sourcemod-1.1.2
3a73bbf60f34befa9b66be03fa5974b394bb3411 sourcemod-1.2.0 3a73bbf60f34befa9b66be03fa5974b394bb3411 sourcemod-1.2.0
ddd707c3454c382db5db9d28148cd19227f44759 sourcemod-1.4.0
+136 -31
View File
@@ -8,64 +8,102 @@ class SM:
self.compiler = Cpp.Compiler() self.compiler = Cpp.Compiler()
#Build SDK info #Build SDK info
self.possibleSdks = { }
self.possibleSdks['ep1'] = {'sdk': 'HL2SDK', 'ext': '1.ep1', 'def': '1',
'name': 'EPISODEONE', 'platform': ['windows', 'linux']}
self.possibleSdks['ep2'] = {'sdk': 'HL2SDKOB', 'ext': '2.ep2', 'def': '3',
'name': 'ORANGEBOX', 'platform': ['windows', 'linux']}
self.possibleSdks['ep2v'] = {'sdk': 'HL2SDKOBVALVE', 'ext': '2.ep2v', 'def': '6',
'name': 'ORANGEBOXVALVE', 'platform': ['windows', 'linux', 'darwin']}
self.possibleSdks['l4d'] = {'sdk': 'HL2SDKL4D', 'ext': '2.l4d', 'def': '7',
'name': 'LEFT4DEAD', 'platform': ['windows', 'linux', 'darwin']}
self.possibleSdks['l4d2'] = {'sdk': 'HL2SDKL4D2', 'ext': '2.l4d2', 'def': '8',
'name': 'LEFT4DEAD2', 'platform': ['windows', 'linux', 'darwin']}
self.possibleSdks['darkm'] = {'sdk': 'HL2SDK-DARKM', 'ext': '2.darkm', 'def': '2',
'name': 'DARKMESSIAH', 'platform': ['windows']}
self.possibleSdks['swarm'] = {'sdk': 'HL2SDK-SWARM', 'ext': '2.swarm', 'def': '9',
'name': 'ALIENSWARM', 'platform': ['windows']}
self.possibleSdks['bgt'] = {'sdk': 'HL2SDK-BGT', 'ext': '2.bgt', 'def': '4',
'name': 'BLOODYGOODTIME', 'platform': ['windows']}
self.possibleSdks['eye'] = {'sdk': 'HL2SDK-EYE', 'ext': '2.eye', 'def': '5',
'name': 'EYE', 'platform': ['windows']}
self.sdkInfo = { } self.sdkInfo = { }
self.sdkInfo['ep1'] = {'sdk': 'HL2SDK', 'ext': '1.ep1', 'def': '1',
'name': 'EPISODEONE'}
self.sdkInfo['ep2'] = {'sdk': 'HL2SDKOB', 'ext': '2.ep2', 'def': '3',
'name': 'ORANGEBOX'}
self.sdkInfo['ep2v'] = {'sdk': 'HL2SDKOBVALVE', 'ext': '2.ep2v', 'def': '4',
'name': 'ORANGEBOXVALVE'}
self.sdkInfo['l4d'] = {'sdk': 'HL2SDKL4D', 'ext': '2.l4d', 'def': '5',
'name': 'LEFT4DEAD'}
if AMBuild.target['platform'] == 'windows':
self.sdkInfo['darkm'] = {'sdk': 'HL2SDK-DARKM', 'ext': '2.darkm', 'def': '2',
'name': 'DARKMESSIAH'}
if AMBuild.mode == 'config': if AMBuild.mode == 'config':
#Detect compilers #Detect compilers
self.compiler.DetectAll(AMBuild) self.compiler.DetectAll(AMBuild)
#Detect variables #Detect variables
envvars = { 'MMSOURCE17': 'mmsource-1.7', envvars = { 'MMSOURCE18': 'mmsource-1.8',
'HL2SDK': 'hl2sdk',
'HL2SDKOB': 'hl2sdk-ob',
'HL2SDKL4D': 'hl2sdk-l4d',
'HL2SDKOBVALVE': 'hl2sdk-ob-valve', 'HL2SDKOBVALVE': 'hl2sdk-ob-valve',
'HL2SDKL4D': 'hl2sdk-l4d',
'HL2SDKL4D2': 'hl2sdk-l4d2',
'MYSQL5': 'mysql-5.0' 'MYSQL5': 'mysql-5.0'
} }
if AMBuild.target['platform'] != 'darwin':
envvars['HL2SDK'] = 'hl2sdk'
envvars['HL2SDKOB'] = 'hl2sdk-ob'
#Dark Messiah is Windows-only #Dark Messiah is Windows-only
if AMBuild.target['platform'] == 'windows': if AMBuild.target['platform'] == 'windows':
envvars['HL2SDK-DARKM'] = 'hl2sdk-darkm' envvars['HL2SDK-DARKM'] = 'hl2sdk-darkm'
envvars['HL2SDK-SWARM'] = 'hl2sdk-swarm'
envvars['HL2SDK-BGT'] = 'hl2sdk-bgt'
envvars['HL2SDK-EYE'] = 'hl2sdk-eye'
# Finds if a dict with `key` set to `value` is present on the dict of dicts `dictionary`
def findDictByKey(dictionary, key, value):
for index in dictionary:
elem = dictionary[index]
if elem[key] == value:
return (elem, index)
return None
#Must have a path for each envvar (file a bug if you don't like this)
for i in envvars: for i in envvars:
if i in os.environ: if i in os.environ:
path = os.environ[i] path = os.environ[i]
if not os.path.isdir(path): if not os.path.isdir(path):
raise Exception('Path for {0} was not found: {1}'.format(i, path)) raise Exception('Path for {0} was not found: {1}'.format(i, path))
elif i.startswith('HL2SDK'):
(info, sdk) = findDictByKey(self.possibleSdks, 'sdk', i)
self.sdkInfo[sdk] = info
else: else:
head = os.getcwd() head = os.getcwd()
while head != None and head != '/': oldhead = None
while head != None and head != oldhead:
path = os.path.join(head, envvars[i]) path = os.path.join(head, envvars[i])
if os.path.isdir(path): if os.path.isdir(path):
break break
oldhead = head
head, tail = os.path.split(head) head, tail = os.path.split(head)
if head == None or head == '/': if i.startswith('HL2SDK'):
(info, sdk) = findDictByKey(self.possibleSdks, 'sdk', i)
self.sdkInfo[sdk] = info
elif head == None or head == oldhead:
raise Exception('Could not find a valid path for {0}'.format(i)) raise Exception('Could not find a valid path for {0}'.format(i))
AMBuild.cache.CacheVariable(i, path) AMBuild.cache.CacheVariable(i, path)
if len(self.sdkInfo) < 1:
raise Exception('At least one SDK must be available.')
AMBuild.cache.CacheVariable('sdkInfo', self.sdkInfo)
#Set up defines #Set up defines
cxx = self.compiler.cxx cxx = self.compiler.cxx
if isinstance(cxx, Cpp.CompatGCC):
if isinstance(cxx, Cpp.GCC): if isinstance(cxx, Cpp.GCC):
self.vendor = 'gcc' self.vendor = 'gcc'
elif isinstance(cxx, Cpp.Clang):
self.vendor = 'clang'
self.compiler.AddToListVar('CDEFINES', 'stricmp=strcasecmp') self.compiler.AddToListVar('CDEFINES', 'stricmp=strcasecmp')
self.compiler.AddToListVar('CDEFINES', '_stricmp=strcasecmp') self.compiler.AddToListVar('CDEFINES', '_stricmp=strcasecmp')
self.compiler.AddToListVar('CDEFINES', '_snprintf=snprintf') self.compiler.AddToListVar('CDEFINES', '_snprintf=snprintf')
self.compiler.AddToListVar('CDEFINES', '_vsnprintf=vsnprintf') self.compiler.AddToListVar('CDEFINES', '_vsnprintf=vsnprintf')
self.compiler.AddToListVar('CFLAGS', '-pipe') self.compiler.AddToListVar('CFLAGS', '-pipe')
self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing') self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing')
if cxx.majorVersion >= 4: if (self.vendor == 'gcc' and cxx.majorVersion >= 4) or self.vendor == 'clang':
self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden') self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden')
self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden') self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden')
self.compiler.AddToListVar('CFLAGS', '-Wall') self.compiler.AddToListVar('CFLAGS', '-Wall')
@@ -73,19 +111,23 @@ class SM:
self.compiler.AddToListVar('CFLAGS', '-Wno-uninitialized') self.compiler.AddToListVar('CFLAGS', '-Wno-uninitialized')
self.compiler.AddToListVar('CFLAGS', '-Wno-unused') self.compiler.AddToListVar('CFLAGS', '-Wno-unused')
self.compiler.AddToListVar('CFLAGS', '-Wno-switch') self.compiler.AddToListVar('CFLAGS', '-Wno-switch')
self.compiler.AddToListVar('CFLAGS', '-mfpmath=sse')
self.compiler.AddToListVar('CFLAGS', '-msse') self.compiler.AddToListVar('CFLAGS', '-msse')
self.compiler.AddToListVar('CFLAGS', '-m32') self.compiler.AddToListVar('CFLAGS', '-m32')
self.compiler.AddToListVar('CFLAGS', '-static-libgcc') self.compiler.AddToListVar('POSTLINKFLAGS', '-m32')
self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions') self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions')
self.compiler.AddToListVar('CXXFLAGS', '-fno-rtti') self.compiler.AddToListVar('CXXFLAGS', '-fno-rtti')
self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics') self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics')
self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor') self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
self.compiler.AddToListVar('CDEFINES', 'HAVE_STDINT_H') self.compiler.AddToListVar('CDEFINES', 'HAVE_STDINT_H')
self.compiler.AddToListVar('CDEFINES', 'GNUC')
if self.vendor == 'gcc':
self.compiler.AddToListVar('CFLAGS', '-mfpmath=sse')
elif isinstance(cxx, Cpp.MSVC): elif isinstance(cxx, Cpp.MSVC):
self.vendor = 'msvc' self.vendor = 'msvc'
if AMBuild.options.debug == '1': if AMBuild.options.debug == '1':
self.compiler.AddToListVar('CFLAGS', '/MTd') self.compiler.AddToListVar('CFLAGS', '/MTd')
self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
else: else:
self.compiler.AddToListVar('CFLAGS', '/MT') self.compiler.AddToListVar('CFLAGS', '/MT')
self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE') self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
@@ -116,17 +158,18 @@ class SM:
#Optimization #Optimization
if AMBuild.options.opt == '1': if AMBuild.options.opt == '1':
self.compiler.AddToListVar('CDEFINES', 'NDEBUG') self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
if self.vendor == 'gcc': if self.vendor == 'gcc' or self.vendor == 'clang':
self.compiler.AddToListVar('CFLAGS', '-O3') self.compiler.AddToListVar('CFLAGS', '-O3')
elif self.vendor == 'msvc': elif self.vendor == 'msvc':
self.compiler.AddToListVar('CFLAGS', '/Ot') self.compiler.AddToListVar('CFLAGS', '/Ox')
self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF') self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
#Debugging #Debugging
if AMBuild.options.debug == '1': if AMBuild.options.debug == '1':
self.compiler.AddToListVar('CDEFINES', 'DEBUG') self.compiler.AddToListVar('CDEFINES', 'DEBUG')
self.compiler.AddToListVar('CDEFINES', '_DEBUG') self.compiler.AddToListVar('CDEFINES', '_DEBUG')
if self.vendor == 'gcc': if self.vendor == 'gcc' or self.vendor == 'clang':
self.compiler.AddToListVar('CFLAGS', '-g3') self.compiler.AddToListVar('CFLAGS', '-g3')
elif self.vendor == 'msvc': elif self.vendor == 'msvc':
self.compiler.AddToListVar('CFLAGS', '/Od') self.compiler.AddToListVar('CFLAGS', '/Od')
@@ -135,6 +178,29 @@ class SM:
#Platform-specifics #Platform-specifics
if AMBuild.target['platform'] == 'linux': if AMBuild.target['platform'] == 'linux':
self.compiler.AddToListVar('CDEFINES', '_LINUX') self.compiler.AddToListVar('CDEFINES', '_LINUX')
if self.vendor == 'gcc':
self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
if self.vendor == 'clang':
self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
elif AMBuild.target['platform'] == 'darwin':
self.compiler.AddToListVar('CFLAGS', ['-isysroot',
'/Developer/SDKs/MacOSX10.5.sdk'])
self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
# For OS X dylib versioning
import re
productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
productContents = productFile.read()
productFile.close()
m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
if m == None:
self.version = '1.0.0'
else:
major, minor, release = m.groups()
self.version = '{0}.{1}.{2}'.format(major, minor, release)
AMBuild.cache.CacheVariable('version', self.version)
elif AMBuild.target['platform'] == 'windows': elif AMBuild.target['platform'] == 'windows':
self.compiler.AddToListVar('CDEFINES', 'WIN32') self.compiler.AddToListVar('CDEFINES', 'WIN32')
self.compiler.AddToListVar('CDEFINES', '_WINDOWS') self.compiler.AddToListVar('CDEFINES', '_WINDOWS')
@@ -149,6 +215,7 @@ class SM:
self.targetMap = { } self.targetMap = { }
AMBuild.cache.CacheVariable('targetMap', self.targetMap) AMBuild.cache.CacheVariable('targetMap', self.targetMap)
else: else:
self.sdkInfo = AMBuild.cache['sdkInfo']
self.compiler.FromConfig(AMBuild, 'compiler') self.compiler.FromConfig(AMBuild, 'compiler')
self.targetMap = AMBuild.cache['targetMap'] self.targetMap = AMBuild.cache['targetMap']
@@ -156,7 +223,7 @@ class SM:
self.compiler.AddToListVar('RCINCLUDES', os.path.join(AMBuild.sourceFolder, 'public')) self.compiler.AddToListVar('RCINCLUDES', os.path.join(AMBuild.sourceFolder, 'public'))
self.compiler.AddToListVar('RCINCLUDES', self.compiler.AddToListVar('RCINCLUDES',
os.path.join(AMBuild.outputFolder, 'includes')) os.path.join(AMBuild.outputFolder, 'includes'))
self.mmsPath = AMBuild.cache['MMSOURCE17'] self.mmsPath = AMBuild.cache['MMSOURCE18']
def DefaultCompiler(self): def DefaultCompiler(self):
return self.compiler.Clone() return self.compiler.Clone()
@@ -181,10 +248,14 @@ class SM:
return compiler return compiler
def AutoVersion(self, folder, binary): def AutoVersion(self, folder, binary):
if AMBuild.target['platform'] != 'windows': if AMBuild.target['platform'] == 'windows':
return
env = {'RCDEFINES': ['BINARY_NAME="' + binary.binaryFile + '"', 'SM_GENERATED_BUILD']} env = {'RCDEFINES': ['BINARY_NAME="' + binary.binaryFile + '"', 'SM_GENERATED_BUILD']}
binary.AddResourceFile(os.path.join(folder, 'version.rc' ), env) binary.AddResourceFile(os.path.join(folder, 'version.rc' ), env)
elif AMBuild.target['platform'] == 'darwin' and isinstance(binary, Cpp.LibraryBuilder):
binary.compiler['POSTLINKFLAGS'].extend(['-compatibility_version', '1.0.0'])
binary.compiler['POSTLINKFLAGS'].extend(['-current_version', AMBuild.cache['version']])
else:
return
def PreSetupHL2Job(self, job, builder, sdk): def PreSetupHL2Job(self, job, builder, sdk):
info = self.sdkInfo[sdk] info = self.sdkInfo[sdk]
@@ -195,6 +266,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']:
for i in ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so']:
link = os.path.join(workFolder, i)
target = os.path.join(staticLibs, i)
try:
os.lstat(link)
except:
job.AddCommand(SymlinkCommand(link, target))
else:
for i in ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.so']: for i in ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.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)
@@ -202,14 +282,27 @@ class SM:
os.lstat(link) os.lstat(link)
except: except:
job.AddCommand(SymlinkCommand(link, target)) job.AddCommand(SymlinkCommand(link, target))
elif AMBuild.target['platform'] == 'darwin':
staticLibs = os.path.join(sdkPath, 'lib', 'mac')
workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
for i in ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.dylib', 'libtier0.dylib']:
link = os.path.join(workFolder, i)
target = os.path.join(staticLibs, i)
try:
os.lstat(link)
except:
job.AddCommand(SymlinkCommand(link, target))
elif AMBuild.target['platform'] == 'windows': elif AMBuild.target['platform'] == 'windows':
for lib in ['tier0', 'tier1', 'vstdlib', 'mathlib']: libs = ['tier0', 'tier1', 'vstdlib', 'mathlib']
if sdk == 'swarm':
libs.append('interfaces')
for lib in libs:
libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib' libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib'
builder.RebuildIfNewer(libPath) builder.RebuildIfNewer(libPath)
builder['POSTLINKFLAGS'].append(libPath) builder['POSTLINKFLAGS'].append(libPath)
def PostSetupHL2Job(self, job, builder, sdk): def PostSetupHL2Job(self, job, builder, sdk):
if AMBuild.target['platform'] == 'linux': if AMBuild.target['platform'] in ['linux', 'darwin']:
builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a']) builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a'])
def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'): def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'):
@@ -222,9 +315,8 @@ class SM:
compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms)) compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms))
compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook')) compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook'))
info = self.sdkInfo info = self.possibleSdks
compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info]) compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info])
compiler['CDEFINES'].append('SE_DARKMESSIAH=2')
paths = [['public'], ['public', 'engine'], ['public', 'mathlib'], ['public', 'vstdlib'], paths = [['public'], ['public', 'engine'], ['public', 'mathlib'], ['public', 'vstdlib'],
['public', 'tier0'], ['public', 'tier1']] ['public', 'tier0'], ['public', 'tier1']]
@@ -233,6 +325,7 @@ class SM:
paths.append(['game_shared']) paths.append(['game_shared'])
else: else:
paths.append(['public', 'game', 'server']) paths.append(['public', 'game', 'server'])
paths.append(['public', 'toolframework'])
paths.append(['game', 'shared']) paths.append(['game', 'shared'])
paths.append(['common']) paths.append(['common'])
@@ -241,12 +334,17 @@ class SM:
compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def']) compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def'])
if sdk == 'swarm' and AMBuild.target['platform'] == 'windows':
compiler['CDEFINES'].extend(['COMPILER_MSVC', 'COMPILER_MSVC32'])
if sdk == 'ep1': if sdk == 'ep1':
if AMBuild.target['platform'] == 'linux': if AMBuild.target['platform'] == 'linux':
staticLibs = os.path.join(sdkPath, 'linux_sdk') staticLibs = os.path.join(sdkPath, 'linux_sdk')
else: else:
if AMBuild.target['platform'] == 'linux': if AMBuild.target['platform'] == 'linux':
staticLibs = os.path.join(sdkPath, 'lib', 'linux') staticLibs = os.path.join(sdkPath, 'lib', 'linux')
elif AMBuild.target['platform'] == 'darwin':
staticLibs = os.path.join(sdkPath, 'lib', 'mac')
for i in paths: for i in paths:
compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i)) compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i))
@@ -254,8 +352,15 @@ 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']:
compiler['POSTLINKFLAGS'][0:0] = ['libtier0.so']
compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so']
else:
compiler['POSTLINKFLAGS'][0:0] = ['tier0_i486.so'] compiler['POSTLINKFLAGS'][0:0] = ['tier0_i486.so']
compiler['POSTLINKFLAGS'][0:0] = ['vstdlib_i486.so'] compiler['POSTLINKFLAGS'][0:0] = ['vstdlib_i486.so']
elif AMBuild.target['platform'] == 'darwin':
compiler['POSTLINKFLAGS'][0:0] = ['libtier0.dylib']
compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.dylib']
return compiler return compiler
-1
View File
@@ -3,4 +3,3 @@ CONFIGURE YOUR IDENTITY FOR MERCURIAL!
IF YOU ARE A DEVELOPER WITH PUSH ACCESS, DO IT NOW KPLZTHX. IF YOU ARE A DEVELOPER WITH PUSH ACCESS, DO IT NOW KPLZTHX.
http://wiki.alliedmods.net/Mercurial_Tutorial#Identity http://wiki.alliedmods.net/Mercurial_Tutorial#Identity
+420
View File
@@ -1,5 +1,425 @@
SourceMod Changelog SourceMod Changelog
-----------------------------
SourceMod 1.4.1 [2011-12-07]
URL: http://wiki.alliedmods.net/SourceMod_1.4.1_Release_Notes
User Changes:
- Updated support for latest OrangeBox engine changes (CS:S, DoD:S, TF2, HL2DM, GMod).
- Added gamedata for Adrenaline Gamer 2 and No More Room in Hell.
- Fixed "not connected" error in reserve slots plugin (bug 5158) (ostrel).
- Fixed ff trigger output printing to all in triggerer's language (rather than viewer's language) (bug 5161).
- Fixed typo in one of basebans ban reasons (bug 5188).
- Fixed formatting error in Swedish "Vote Count" phrase (bug 5174).
Developer Changes:
- Fixed sp MaxClients not being updated on map changes after load (bug 5160).
- Removed GLIBC_2.7 dependency from spcomp.
- Increased buffer for sm_rcon command to fit larger responses (bug 5169).
- BaseComm now properly registers a library allowing it to be required by other plugins (bug 5156).
- Fixed TFHoliday enum values (bug 5155).
- Updated TF2_OnIsHolidayActive ret behavior to match doc (bug 5155).
- Added new TF2 deathflag and dmg custom defines (bug 5157).
-----------------------------
SourceMod 1.4.0 [2011-10-28]
URL: http://wiki.alliedmods.net/SourceMod_1.4.0_Release_Notes
User Changes:
- Added support for Max OS X (bug 4392).
- Added support for Bloody Good Time (bug 4780).
- Added support for E.Y.E Divine Cybermancy (bug 5035).
- Added gamedata for Nuclear Dawn.
- Added gamedata for International Online Soccer: Source (bug 5019).
- Added gamedata for Half-Life 2 Capture the Flag (bug 5114).
- Updated mapchooser and other base plugins with Nuclear Dawn specific fixes (bug 5117).
- Fixed ServerLang value not being read properly on startup (bug 4675).
- Added support for aliases in languages.cfg (bug 4858).
- Added output display to sm_rcon command (bug 5018).
- Flood protection bypass access can now be overridden with command name sm_flood_access (bug 4584).
- Added a reset argument to sm cvars command to revset cvar values to default (bug 5043).
- Fixed incorrect language identifiers for Chinese (both Trad. and Simplified) and Brazilian Portuguese not matching cl_language values (bug 5067).
- Added translation support for Bulgarian (bg).
- Fixed incorrect number of slots being hidden for reserve with sm_hideslots on Source 2009 with SourceTV or replay (bug 5094).
- sm_hideslots changes now take effect immediately instead of waiting until a client joins or leaves (bug 5094).
- Fixed sv_visiblemaxplayers getting stuck at previous max clients in some cases with reserves and SourceTV or replay (bug 5094).
- Removed error logging if an optional extension is not found (bug 5112).
- Fixed bots with semicolon in name being unkickable (bug 5120).
- Changed strings in ice-related funcommands to be translatable (bug 4540).
- Changed Bintools extension to use a single build for every engine (bug 4548).
Developer Changes:
- Provided native interface for basecomm (bug 2594).
- Client language detection is too late. (bug 3714) (Tony A. "GoD-Tony").
- Added ServerCommandEx native to execute server command and retrieve output (bug 3873).
- Added ability to update clientprefs cookies values on clients not currently connected (bug 3882) (databomb).
- Added library "matchmaking_ds" support to gamedata lookups (bug 4158).
- Rooted menu handles to callbacks (bug 4353).
- Fixed corner cases with ExplodeString (bug 4629). (Michael "LumiStance").
- Fixed return omission with else-after-return (bug 4852).
- Added OnConditionAdded and OnConditionRemoved forwards to TF2 extension (bug 4851).
- Added new natives and forward to the cstrike extension (bug 4732, bug 4985) (Dr!fter).
- Added WaitingForPlayers forwards to the TF2 extension (bug 4704) (CrimsonGT).
- Updated and added more TF2 condition, weapon, and damagecustom defines (multiple bug#s).
- Fixed TF2_RemoveCondition not always removing conditions (bug 4981).
- Fixed MaxClients not being updated correctly in some places with SourceTV or replay active (bug 4986).
- Fixed some vars not being marked for init on first compile pass (bug 4643).
- Increased symbol name limit to 63 characters (bug 4564) (javalia).
- Fixed crash when dynamic arrays run out of memory (bug 4632).
- Fixed a crash that could happen from looking up out-of-bounds edict or entity indexes (bug 5080).
- Fixed client serials not getting cleared on disconnect (bug 5121).
- Added error on declaring arrays that the compiler is too buggy to handle (bug 4977).
- Removed reliance on gamedata for multiple SDKTools functions in ep2 and later (bug 4899).
- Added InvalidateClient and ReconnectClient natives to SDKTools (bug 4931) (Brian "Afronanny" Simon).
- Added ability to lookup and set values on the gamerules class (bug 4983.
- BaseComm now uses AddCommandListener for chat hooks (bug 4991).
- Fixed shutdown bug in SDKTools (bug 5063).
- Fixed MM-enabled extensions continuing to load after failing MM attach (bug 5042).
- Added GetDistGainFromSoundLevel native to SDKTools (bug 5066) (javalia).
- Added CheckAccess native to check an AdminId's command access (bug 5083).
- Fixed GetEntProp not sign-extending unsigned values less than 32 bits (bug 5105).
- Fixed crashing when calling CreateEntityByName or CreateFakeClient when no map is running (now errors) (bug 5119).
- Fixed erring in kick function (e. bad translation) causing client to become unkickable until disconnect (bug 5120).
- Fixed KickClientEx not immediately kicking client if client was in kick queue (bug 5120).
- Added IsClientSourceTV and IsClientReplay natives (bug 5124).
- Added support for getting and setting individual array elements with Get/Set EntProp functions (bug 4160).
- Added support for threaded query handles to SQL_GetInsertId and SQL_GetAffectedRows (bug 4699) (Nephyrin).
- Added a GetGameRules function to ISDKTools for extensions to easily get the GameRules class pointer (bug 4707).
- Added GetMessageName to IUserMessages (bug 4573) (Zach "theY4Kman" Kanzler)
- Added HintTextMsg to IGameHelpers (bug 4950).
- Added ProcessTargetString simple filter API (bug 4404).
- Moved much functionality from core bins to logic bin (bug 4406, bug 4402).
- Fixed bogus asserts in sp compiler (bug 4486, bug 4487).
- Greatly improved sp compiler performance (~5x overall speedup) (bug 3820, bug 4493, bug 4495).
- Changed entity output detours to use CDetour (bug 4416).
- Enhanced nominations API (bug 4677) (CrimsonGT).
- Added Linux support for profiling natives (bug 4927).
- Added a new ValveCallType that allows for arbitrary |this| parameters, as well as associated features in gamedata and for reading/writing memory (bug 3520) (Downtown1).
- Updated TF2 extension to handle Valve's changes to the "holiday" system (bug 5150).
-----------------------------
SourceMod 1.3.8 [2011-06-23]
URL: http://wiki.alliedmods.net/SourceMod_1.3.8_Release_Notes
User Changes:
- Updated support for latest OrangeBox engine changes (CS:S, DoD:S, TF2, HL2DM, GMod).
- Updated support for various games, including Garry's Mod, Zombie Panic, and Dino D-Day.
- Added gamedata for Eternal Silence.
- Fixed libgcc_s.so.1 load error present on some systems (bug 4876).
- Handle leak notices now print to error log (in addition fatal log) (bug 4929).
- Translator now properly falls back on bad server language (bug 4861).
- Fixed invalid client errors from bad MaxClients value when SourceTV is late-loaded (bug 4881).
- Fixed crash on plugin unload when two commands exist with same name, different casing (bug 4698).
Developer Changes:
- Updated TF2 condition defines (bug 4916).
- Fixed var names and docs for TF2_MakeBleed native (bug 4928).
- Removed compiler double include check (bug 4863).
- Fixed plugin compile errors when using GetEntityClassname (bug 4798).
---------------------------
SourceMod 1.3.7 [2011-04-15]
URL: http://wiki.alliedmods.net/SourceMod_1.3.7_Release_Notes
User Changes:
- Updated support for latest OrangeBox engine changes (CS:S, DoD:S, TF2, HL2DM, GMod).
- Updated support for various games, including Zombie Panic, CS ProMod, Empires, and GoldenEye: Source.
- Added gamedata for Dino D-Day.
- Fix precedence of voice mute flag versus specific client overrides (bug 4826).
- Fix mistaken unhooking of voice hooks (bug 4804).
- Fixed graphical glitches with funcommands effects in L4D1 (bug 3486).
- Fixed bug in nominations that could cause "Unknown command" error (bug 4797).
- Removed tv_enable hook to fix rare max client count issue (bug 4791).
- Added missing unhooking of ClientConnect in PlayerManager (bug 4749).
- Fixed sm_rtv printing "unknown command" (bug 4730).
- Fixed voting crash when client console, chat, and SourceTV are enabled (bug 4676).
- Fixed CDetour crash in TF2 extension when last plugin using forward is unloaded (bug 4713).
Developer Changes:
- SetEntProp now marks edict state as changed (bug 4855).
- Added GetEntityClassname stock (bug 4798).
- Fix compiler hanging when #including a directory (bug 4822).
- Added GetEntityFlags and SetEntityFlags natives for better cross-engine compatibility. (bug 4809).
- Fixed ClientPrefs natives not being marked optional when REQUIRE_EXTENSIONS not defined (bug 4839).
- Changed some instances of LogMessage to LogAction (bug 4649).
- Added some new language natives (bug 4613).
- Fixed SetTeamScore not updating score on client (bug 2736).
- Raised MAXPLAYERS from 64 to 65 (bug 4490).
- Added and updated many TF2-specific defines in tf2.inc and tf2_stocks.inc.
- Fixed TF2_GetPlayerConditionFlags no longer necessarily returning all set flags (bug 4726).
- Fixed profiler flush not clearing, added 'report' and 'clear' (bug 4674).
- Fixed GetPlayerDecalFile crash on L4D and L4D2 (bug 4729).
- Fixed TF2_OnGetHoliday detour no longer firing under all circumstances (bug 4700).
- Added TF2_IsPlayerInDuel native to TF2 extension (bug 4695).
----------------------------
SourceMod 1.3.6 [2010-10-31]
URL: http://wiki.alliedmods.net/SourceMod_1.3.6_Release_Notes
User Changes:
- Updated support for latest Left 4 Dead 1 (bug 4681).
Developer Changes:
- Updated TF2 custom kill defines (bug 4682).
----------------------------
SourceMod 1.3.5 [2010-10-17]
URL: http://wiki.alliedmods.net/SourceMod_1.3.5_Release_Notes
User Changes:
- Updated support for CS:S, Garry's Mod, DoD:S, TF2, HL2DM.
- Added support for Firearms: Source (bug 4537).
- Added support for Fistful of Frags (bug 3883).
- Added support for Alien Swarm (bug 4530).
- Fixed living players hearing dead players if alltalk is disabled while deadtalk is on (bug 4533, thanks Zach Callear).
- Fixed timeleft not getting reset on Game_Commencing in CS:S (bug 4557).
- Fixed PlayerRunCmd being hooked when not used (bug 3990).
- Fixed errors and missing effects caused by missing sprites on L4D2 (bug 4512).
- Fixed 'sm plugins' public command skipping plugins in recommended listing (bug 4501).
- Fixed corruption with large database.cfg files (bug 4286).
Developer Changes:
- Added TF2 object stocks (bug 4536).
- Added TF2_MakeBleed native to TF2 ext (bug 4542).
- Added support for logical entities in Synergy (bug 4534).
- Updated TF2 conditions enum and defines (bug 4526).
- Fixed potential crash with IMemUtils::FindPattern on Linux (bug 4554).
----------------------------
SourceMod 1.3.4 [2010-07-18]
URL: http://wiki.alliedmods.net/SourceMod_1.3.4_Release_Notes
User Changes:
- Support for latest TF update (bug 4506).
- Support for latest L4D2 update (bug 4509).
Developer Changes:
- Added FindFlagChar native (bug 3776).
- Added GetConVarDefault native (bug 4502).
- Added forward for TF's GetHoliday function (bug 4462).
----------------------------
SourceMod 1.3.3 [2010-06-23]
URL: http://wiki.alliedmods.net/SourceMod_1.3.3_Release_Notes
User Changes:
- Added support for CS:S on Orange Box
- Added gamedata for Resistance and Liberation (bug 4418).
- Updated gamedata for SourceForts, Empires, Obsidian Conflict, Zombie Master.
- Fixed memory corruption and leaks with some voice functionality (bug 4415).
- Fixed UI bug in sm_motd (bug 4460).
Developer Changes:
- Added new player condition (TFCond_CritCola, bug 4447).
- Fixed clientprefs deleting cookies twice in rare cases (bug 4412).
- Fixed OnClientConnected forward not firing for bots (bug 4443).
- Fixed sm_dump_datamaps crash (bug 4424).
- Fixed switch case comparisons failing with large numbers (bug 4457).
- Fixed rare crash in output hooks (bug 4422).
- Fixed bug with dynamically sized arrays being sliced (bug 4428).
- Fixed SendConVarValue() on TF2, DOD:S, L4D, and L4D2 (bug 4273).
- Fixed TF2 natives not being marked optional (bug 4389).
----------------------------
SourceMod 1.3.2 [2010-05-02]
URL: http://wiki.alliedmods.net/SourceMod_1.3.2_Release_Notes
User Changes:
- Support for recent TF, DoD, and L4D2 updates (bug 4356, bug 4361, bug 4371, bug 4374, bug 4375).
- Fixed rare crash when replicating cvars to clients (bug 4315).
- Lots of extra game support for Insurgency, ZPS, CSProMod, PVKII, and FortressForever (thanks
Nicholas "psychonic" hastings).
Developer Changes:
- Added TF functions for stunning, conditions, regeneration, and power play (bug 4166, bug 4331).
----------------------------
SourceMod 1.3.1 [2010-02-09]
URL: http://wiki.alliedmods.net/SourceMod_1.3.1_Release_Notes
User Changes:
- Added extended support for CSProMod (bug 4255).
- Fixed client disconnect crash on many third party games (bug 4231).
- Improved support for Battlegrounds 2 (bug 4146).
- Improved support for Insurgency (bug 4180).
- Improved support for Garry's Mod (bug 4230, bug 4268).
- Improved support for Synergy (bug 4235).
- Updated Day of Defeat support for 20010123 update (bug 4262).
- Fixed Webternet extension not loading on Windows 2000 (bug 4234).
Developer Changes:
- Fixed compiler complaints when using |any| tag on array arguments (bug 4274).
- Fixed GetClientCookieTime not being exported (bug 4237).
- Fixed potential crash in entity handling code (bug 4249).
----------------------------
SourceMod 1.3.0 [2010-01-15]
URL: http://wiki.alliedmods.net/SourceMod_1.3.0_Release_Notes
Major Features:
* Left 4 Dead 2 support
* Non-networked entity support
User Changes:
- Added Left 4 Dead 2 support (bug 4075).
- Added much richer voting progress feedback (bug 1997).
- Improved support for various third-party games (Nicholas "psychonic" Hastings).
- Added @spec target (bug 2718).
- Added sm_resetcvar command (bug 3636).
- Added "motd" chat trigger (bug 2694).
- Updated GeoIP to OCT-2009.
- Fixed rare map vote error (bug 3905).
- Fixed small leak in the nominations plugin (bug 4104).
- Fixed last client being excluded from some command effects (bug 3984).
- Fixed crashes in plugin [|un|re]loading (bug 4034, bug 4038, bug 4044, bug 4153).
- Special target "@me" is now filtered for certain statuses properly (bug 4000).
- Improved non-admin to admin chat (bug 3844).
- Removed "auto.*" extension folders (bug 3949).
Developer Changes:
- Added non-networked entity support (bug 2459).
- Added improved random number generator (bug 3831).
- Added GetClientCookieTime native (bug 3736).
- Added AskPluginLoad2 callback (bug 3716).
- Added PlayerRunCmd callback (bug 3289).
- Added PointOutsideWorld native (bug 3906).
- Added API for "blanket" command hooks (bug 4015).
- Added ability to test for SourceMod features (bug 4021).
- Added ability to change broadcast status on hooked events (bug 3886).
- OnClientCommand no longer receives unconnected clients (bug 3732).
- Fixed various bugs in client listening API (bug 3818).
- Fixed crash in BanClient (bug 3912).
- Fixed various crashes in self-removing callbacks (bug 4059).
- Fixed rare HUD text crash on TF (bug 4016).
- Fixed OnConfigsExecuted not running on EP1 games with large configs (bug 3828).
- Fixed entity output hooks not working (bug 3988).
- Gamedata folder matches are now case-insensitive (bug 3913).
- Blocked plugins from hooking "sm" command (bug 4013).
----------------------------
SourceMod 1.2.4 [2009-10-03]
URL: http://wiki.alliedmods.net/SourceMod_1.2.4_Release_Notes
- Updated for L4D changes (bugs 4032, 4033, 4035).
- Updated GeoLite Country database for GeoIP extension.
- Fixed crash when block-loading more than eight plugins (bug 4034).
- Fixed rare crash in hudtext code on TF (bug 4016).
- Fixed crash when reloading a blocked plugin failed (bug 4038).
- Fixed Huntsman not firing critical callback on TF (bug 3927).
- Registering the "sm" command no longer has any effect (bug 4013).
- Fixed translation bug in extension API (bug 4010).
----------------------------
SourceMod 1.2.3 [2009-08-28]
URL: http://wiki.alliedmods.net/SourceMod_1.2.3_Release_Notes
- Fix extension filename lookup. (bug 3975).
----------------------------
SourceMod 1.2.2 [2009-08-28]
URL: http://wiki.alliedmods.net/SourceMod_1.2.2_Release_Notes
- Removed auto folders. (bug 3949).
- Added PointOutsideWorld native to sdktools. (bug 3906).
- Added "motd" chat trigger to basetriggers. (bug 2694).
- Added manual extension reloading command to root console menu. (bug 3934)
- Fixed 'list' type custom menu entries overwriting admin restrictions. (bug 3783).
- Added sm_resetcvar command to basecommands. (bug 3636).
- Updated gamedata for DOD:S. (bug 3948).
- Updated gamedata for TF2. (bug 3948).
- Added new .ep2v build config for valve OB based games. (bug 3948).
- Fixed incorrect escaping in clientprefs SQLite queries. (bug 3904)
- Updated gamedata for Synergy. (bug 3315).
- Upgraded to pcre-7.9 (bug 3923).
- Switched Insurgency chat printing to SayText. (bug 3738).
- Updated gamedata for Insurgency. (bug 3511).
- Updated gamedata for ZM. (bug 3746).
- Updated gamedata for Empires. (bug 3500).
- Updated gamedata for ZPS. (bug 3877).
- Updated gamedata for AoC. (bug 3891).
- Fixed RemovePlayerDisguise signature for TF2. (bug 3892).
----------------------------
SourceMod 1.2.1 [2009-05-31]
URL: http://wiki.alliedmods.net/SourceMod_1.2.1_Release_Notes
- Updated SDKTools for latest Team Fortress update.
- Added L4D handling to GuessSDKVersion() (bug 3842).
- Updated Zombie Panic Source offsets (bug 3632).
- Fixed crash when clientprefs saw disconnect from 64th client (bug 3821).
- Fixed Plugin_Handled acting like a Stop in usermsg hooks (bug 3685).
- Fixed early tv_enable causing crashes (bug 3766).
- Fixed unhook event crash (bug 3814).
- Fixed compiler reading uninitialized strings while processing varargs (bug 3811).
- Fixed compiler choosing whether to emit stradjust.pri on dynamic arrays based on uninitialized memory (bug 3810).
- Fixed Windows L4D CreateFakeClient signature (bug 3792).
- Fixed sm_slap for EP1 games (bug 3768).
- Fixed casting problems in TextParsers breaking TrimString for non-ASCII characters (bug 3800).
- Fixed OnClientConnect rejectmsg handling, improved doc (bug 3690).
- Fixed clientprefs not loading cookies for clients on late load (bug 3735).
- Fixed GetCommandFlags on original engine games (bug 3759).
- Fixed compiler asserting when returning a string literal (bug 3836).
- Fixed compiler erroring when tagging functions for string return (bug 3837).
- Fixed compiler not handling constant chained relational operators correctly (bug 3838).
- Fixed revote bug and inflexibilities in RedrawClientVoteMenu (bug 3834).
- Fixed auto update URL being set too late (bug 3699).
- Disabled nextmap in Synergy and Dystopia (bug 3687, bug 3741).
- Removed unnecessary SSE optimizations from msvc9 project files (bug 3756).
- Removed short-lived tag system (bug 3751).
- Removed the alive check from sm_rename. (bug 3698).
- Switched FortressForever to Valve menus (bug 3819).
---------------------------- ----------------------------
SourceMod 1.2.0 [2009-03-05] SourceMod 1.2.0 [2009-03-05]
+28 -3
View File
@@ -80,21 +80,21 @@ sm_reserve_type 0
sm_reserved_slots 0 sm_reserved_slots 0
// Specifies whether or not reserved slots will be hidden (subtracted from max // Specifies whether or not reserved slots will be hidden (subtracted from max
// slot count). Valid values are 0 (visible) or 1 (hidden). // slot count). Valid values are 0 (Visible) or 1 (Hidden).
// -- // --
// Requires: reservedslots.smx // Requires: reservedslots.smx
// Default: 0 // Default: 0
sm_hide_slots 0 sm_hide_slots 0
// Specifies whether or not non-admins can send messages to admins using // Specifies whether or not non-admins can send messages to admins using
// say_team @<message>. Valid values are 0 (disabled) or 1 (enabled) // say_team @<message>. Valid values are 0 (Disabled) or 1 (Enabled)
// -- // --
// Requires: basechat.smx // Requires: basechat.smx
// Default: 1 // Default: 1
sm_chat_mode 1 sm_chat_mode 1
// Specifies whether or not "timeleft" will automaticly be triggered every // Specifies whether or not "timeleft" will automaticly be triggered every
// x seconds. Valid values are 0 (disabled) to 1800 seconds. // x seconds. Valid values are 0 (Disabled) to 1800 seconds.
// -- // --
// Requires: basetriggers.smx // Requires: basetriggers.smx
// Default: 0 // Default: 0
@@ -107,3 +107,28 @@ sm_timeleft_interval 0
// Requires: basetriggers.smx // Requires: basetriggers.smx
// Default: 1 // Default: 1
sm_trigger_show 1 sm_trigger_show 1
// Specifies whether or not to display vote progress to clients in the
// "hint" box (near the bottom of the screen in most games).
// Valid values are 0 (Disabled) or 1 (Enabled).
// --
// Default: 0
sm_vote_progress_hintbox 0
// Specifies whether or not to display vote progress to clients in the
// chat area. Valid values are 0 (Disabled) or 1 (Enabled).
// --
// Default: 0
sm_vote_progress_chat 0
// Specifies whether or not to display vote progress in the server console.
// Valid values are 0 (Disabled) or 1 (Enabled).
// --
// Default: 0
sm_vote_progress_console 0
// Specifies whether or not to display vote progress to clients in the
// client console. Valid values are 0 (Disabled) or 1 (Enabled).
// --
// Default: 0
sm_vote_progress_client_console 0
+2
View File
@@ -2,6 +2,8 @@
{ {
"driver_default" "mysql" "driver_default" "mysql"
// When specifying "host", you may use an IP address, a hostname, or a socket file path
"default" "default"
{ {
"driver" "default" "driver" "default"
+3 -15
View File
@@ -3,6 +3,9 @@ import os
for i in SM.sdkInfo: for i in SM.sdkInfo:
sdk = SM.sdkInfo[i] sdk = SM.sdkInfo[i]
if AMBuild.target['platform'] not in sdk['platform']:
continue
name = 'sourcemod.' + sdk['ext'] name = 'sourcemod.' + sdk['ext']
compiler = SM.DefaultHL2Compiler('core', i) compiler = SM.DefaultHL2Compiler('core', i)
@@ -14,26 +17,22 @@ for i in SM.sdkInfo:
'AdminCache.cpp', 'AdminCache.cpp',
'ExtensionSys.cpp', 'ExtensionSys.cpp',
'MenuStyle_Valve.cpp', 'MenuStyle_Valve.cpp',
'sm_crc32.cpp',
'logic_bridge.cpp', 'logic_bridge.cpp',
'smn_entities.cpp', 'smn_entities.cpp',
'sm_stringutil.cpp', 'sm_stringutil.cpp',
'ADTFactory.cpp', 'ADTFactory.cpp',
'ForwardSys.cpp', 'ForwardSys.cpp',
'MenuVoting.cpp', 'MenuVoting.cpp',
'sm_memtable.cpp',
'smn_events.cpp', 'smn_events.cpp',
'smn_menus.cpp', 'smn_menus.cpp',
'sm_trie.cpp', 'sm_trie.cpp',
'CDataPack.cpp', 'CDataPack.cpp',
'frame_hooks.cpp', 'frame_hooks.cpp',
'NativeInvoker.cpp', 'NativeInvoker.cpp',
'smn_admin.cpp',
'smn_fakenatives.cpp', 'smn_fakenatives.cpp',
'smn_nextmap.cpp', 'smn_nextmap.cpp',
'sourcemm_api.cpp', 'sourcemm_api.cpp',
'ChatTriggers.cpp', 'ChatTriggers.cpp',
'GameConfigs.cpp',
'NativeOwner.cpp', 'NativeOwner.cpp',
'smn_filesystem.cpp', 'smn_filesystem.cpp',
'smn_player.cpp', 'smn_player.cpp',
@@ -41,28 +40,19 @@ for i in SM.sdkInfo:
'concmd_cleaner.cpp', 'concmd_cleaner.cpp',
'HalfLife2.cpp', 'HalfLife2.cpp',
'NextMap.cpp', 'NextMap.cpp',
'smn_profiler.cpp',
'ConCmdManager.cpp', 'ConCmdManager.cpp',
'HandleSys.cpp', 'HandleSys.cpp',
'PhraseCollection.cpp',
'ConVarManager.cpp', 'ConVarManager.cpp',
'LibrarySys.cpp', 'LibrarySys.cpp',
'PlayerManager.cpp', 'PlayerManager.cpp',
'smn_banning.cpp',
'smn_gameconfigs.cpp',
'smn_string.cpp',
'TimerSys.cpp', 'TimerSys.cpp',
'CoreConfig.cpp', 'CoreConfig.cpp',
'Logger.cpp', 'Logger.cpp',
'PluginInfoDatabase.cpp', 'PluginInfoDatabase.cpp',
'smn_bitbuffer.cpp', 'smn_bitbuffer.cpp',
'smn_halflife.cpp', 'smn_halflife.cpp',
'Translator.cpp',
'MemoryUtils.cpp',
'PluginSys.cpp', 'PluginSys.cpp',
'smn_console.cpp', 'smn_console.cpp',
'smn_handles.cpp',
'smn_timers.cpp',
'UserMessages.cpp', 'UserMessages.cpp',
'Database.cpp', 'Database.cpp',
'MenuManager.cpp', 'MenuManager.cpp',
@@ -78,8 +68,6 @@ for i in SM.sdkInfo:
'EventManager.cpp', 'EventManager.cpp',
'MenuStyle_Radio.cpp', 'MenuStyle_Radio.cpp',
'sm_autonatives.cpp', 'sm_autonatives.cpp',
'smn_datapacks.cpp',
'smn_lang.cpp',
'sm_srvcmds.cpp', 'sm_srvcmds.cpp',
'ConsoleDetours.cpp' 'ConsoleDetours.cpp'
] ]
+2 -2
View File
@@ -1719,7 +1719,7 @@ bool AdminCache::CanAdminUseCommand(int client, const char *cmd)
} }
} }
return g_ConCmds.CheckCommandAccess(client, cmd, bits); return g_ConCmds.CheckClientCommandAccess(client, cmd, bits);
} }
unsigned int AdminCache::SetGroupImmunityLevel(GroupId gid, unsigned int level) unsigned int AdminCache::SetGroupImmunityLevel(GroupId gid, unsigned int level)
@@ -1794,7 +1794,7 @@ bool AdminCache::CheckAccess(int client, const char *cmd, FlagBits flags, bool o
GetCommandOverride(cmd, Override_Command, &bits); GetCommandOverride(cmd, Override_Command, &bits);
} }
return g_ConCmds.CheckCommandAccess(client, cmd, bits) ? 1 : 0; return g_ConCmds.CheckClientCommandAccess(client, cmd, bits) ? 1 : 0;
} }
void iterator_glob_basic_override(Trie *pTrie, const char *key, void **value, void *data) void iterator_glob_basic_override(Trie *pTrie, const char *key, void **value, void *data)
+3 -12
View File
@@ -34,8 +34,8 @@
#include "sm_stringutil.h" #include "sm_stringutil.h"
#include "ConCmdManager.h" #include "ConCmdManager.h"
#include "PlayerManager.h" #include "PlayerManager.h"
#include "Translator.h"
#include "HalfLife2.h" #include "HalfLife2.h"
#include "logic_bridge.h"
/* :HACKHACK: We can't SH_DECL here because ConCmdManager.cpp does. /* :HACKHACK: We can't SH_DECL here because ConCmdManager.cpp does.
* While the OB build only runs on MM:S 1.6.0+ (SH 5+), the older one * While the OB build only runs on MM:S 1.6.0+ (SH 5+), the older one
@@ -113,7 +113,7 @@ void ChatTriggers::OnSourceModAllInitialized()
void ChatTriggers::OnSourceModAllInitialized_Post() void ChatTriggers::OnSourceModAllInitialized_Post()
{ {
g_pCorePhrases->AddPhraseFile("antiflood.phrases"); logicore.AddCorePhraseFile("antiflood.phrases");
} }
void ChatTriggers::OnSourceModGameInitialized() void ChatTriggers::OnSourceModGameInitialized()
@@ -189,17 +189,8 @@ void ChatTriggers::OnSayCommand_Pre()
{ {
char buffer[128]; char buffer[128];
if (!CoreTranslate( if (!logicore.CoreTranslate(buffer, sizeof(buffer), "%T", 2, NULL, "Flooding the server", &client))
buffer,
sizeof(buffer),
"%T",
2,
NULL,
"Flooding the server",
&client))
{
UTIL_Format(buffer, sizeof(buffer), "You are flooding the server!"); UTIL_Format(buffer, sizeof(buffer), "You are flooding the server!");
}
/* :TODO: we should probably kick people who spam too much. */ /* :TODO: we should probably kick people who spam too much. */
+45 -44
View File
@@ -34,9 +34,9 @@
#include "AdminCache.h" #include "AdminCache.h"
#include "sm_stringutil.h" #include "sm_stringutil.h"
#include "PlayerManager.h" #include "PlayerManager.h"
#include "Translator.h"
#include "HalfLife2.h" #include "HalfLife2.h"
#include "ChatTriggers.h" #include "ChatTriggers.h"
#include "logic_bridge.h"
ConCmdManager g_ConCmds; ConCmdManager g_ConCmds;
@@ -226,30 +226,38 @@ void ConCmdManager::SetCommandClient(int client)
m_CmdClient = client + 1; m_CmdClient = client + 1;
} }
ConCmdInfo *ConCmdManager::FindInTrie(const char *name)
{
ConCmdInfo *pInfo;
if (!sm_trie_retrieve(m_pCmds, name, (void **)&pInfo))
return NULL;
return pInfo;
}
ConCmdList::iterator ConCmdManager::FindInList(const char *cmd)
{
List<ConCmdInfo *>::iterator iter = m_CmdList.begin();
while (iter != m_CmdList.end())
{
if (strcasecmp((*iter)->pCmd->GetName(), cmd) == 0)
break;
iter++;
}
return iter;
}
ResultType ConCmdManager::DispatchClientCommand(int client, const char *cmd, int args, ResultType type) ResultType ConCmdManager::DispatchClientCommand(int client, const char *cmd, int args, ResultType type)
{ {
ConCmdInfo *pInfo; ConCmdInfo *pInfo;
if (!sm_trie_retrieve(m_pCmds, cmd, (void **)&pInfo)) if ((pInfo = FindInTrie(cmd)) == NULL)
{
List<ConCmdInfo *>::iterator iter;
pInfo = NULL;
iter = m_CmdList.begin();
while (iter != m_CmdList.end())
{
if (strcasecmp((*iter)->pCmd->GetName(), cmd) == 0)
{
pInfo = (*iter);
break;
}
iter++;
}
if (pInfo == NULL)
{ {
ConCmdList::iterator item = FindInList(cmd);
if (item == m_CmdList.end())
return type; return type;
} pInfo = *item;
} }
cell_t result = type; cell_t result = type;
@@ -314,35 +322,20 @@ void ConCmdManager::InternalDispatch(const CCommand &command)
*/ */
const char *cmd = g_HL2.CurrentCommandName(); const char *cmd = g_HL2.CurrentCommandName();
ConCmdInfo *pInfo; ConCmdInfo *pInfo = FindInTrie(cmd);
if (!sm_trie_retrieve(m_pCmds, cmd, (void **)&pInfo)) if (pInfo == NULL)
{ {
/* Unfortunately, we now have to do a slow lookup because Valve made client commands /* Unfortunately, we now have to do a slow lookup because Valve made client commands
* case-insensitive. We can't even use our sortedness. * case-insensitive. We can't even use our sortedness.
*/ */
if (client == 0 && !engine->IsDedicatedServer()) if (client == 0 && !engine->IsDedicatedServer())
{
return; return;
}
List<ConCmdInfo *>::iterator iter; ConCmdList::iterator item = FindInList(cmd);
if (item == m_CmdList.end())
pInfo = NULL;
iter = m_CmdList.begin();
while (iter != m_CmdList.end())
{
if (strcasecmp((*iter)->pCmd->GetName(), cmd) == 0)
{
pInfo = (*iter);
break;
}
iter++;
}
if (pInfo == NULL)
{
return; return;
}
pInfo = *item;
} }
/* This is a hack to prevent say triggers from firing on messages that were /* This is a hack to prevent say triggers from firing on messages that were
@@ -457,7 +450,7 @@ void ConCmdManager::InternalDispatch(const CCommand &command)
} }
} }
bool ConCmdManager::CheckCommandAccess(int client, const char *cmd, FlagBits cmdflags) bool ConCmdManager::CheckClientCommandAccess(int client, const char *cmd, FlagBits cmdflags)
{ {
if (cmdflags == 0 || client == 0) if (cmdflags == 0 || client == 0)
{ {
@@ -478,7 +471,11 @@ bool ConCmdManager::CheckCommandAccess(int client, const char *cmd, FlagBits cmd
return false; return false;
} }
AdminId adm = player->GetAdminId(); return CheckAdminCommandAccess(player->GetAdminId(), cmd, cmdflags);
}
bool ConCmdManager::CheckAdminCommandAccess(AdminId adm, const char *cmd, FlagBits cmdflags)
{
if (adm != INVALID_ADMIN_ID) if (adm != INVALID_ADMIN_ID)
{ {
FlagBits bits = g_Admins.GetAdminFlags(adm, Access_Effective); FlagBits bits = g_Admins.GetAdminFlags(adm, Access_Effective);
@@ -531,7 +528,7 @@ bool ConCmdManager::CheckCommandAccess(int client, const char *cmd, FlagBits cmd
bool ConCmdManager::CheckAccess(int client, const char *cmd, AdminCmdInfo *pAdmin) bool ConCmdManager::CheckAccess(int client, const char *cmd, AdminCmdInfo *pAdmin)
{ {
if (CheckCommandAccess(client, cmd, pAdmin->eflags)) if (CheckClientCommandAccess(client, cmd, pAdmin->eflags))
{ {
return true; return true;
} }
@@ -540,7 +537,7 @@ bool ConCmdManager::CheckAccess(int client, const char *cmd, AdminCmdInfo *pAdmi
/* If we got here, the command failed... */ /* If we got here, the command failed... */
char buffer[128]; char buffer[128];
if (!CoreTranslate(buffer, sizeof(buffer), "%T", 2, NULL, "No Access", &client)) if (!logicore.CoreTranslate(buffer, sizeof(buffer), "%T", 2, NULL, "No Access", &client))
{ {
UTIL_Format(buffer, sizeof(buffer), "You do not have access to this command"); UTIL_Format(buffer, sizeof(buffer), "You do not have access to this command");
} }
@@ -916,6 +913,10 @@ ConCmdInfo *ConCmdManager::AddOrFindCommand(const char *name, const char *descri
ConCmdInfo *pInfo; ConCmdInfo *pInfo;
if (!sm_trie_retrieve(m_pCmds, name, (void **)&pInfo)) if (!sm_trie_retrieve(m_pCmds, name, (void **)&pInfo))
{ {
ConCmdList::iterator item = FindInList(name);
if (item != m_CmdList.end())
return *item;
pInfo = new ConCmdInfo(); pInfo = new ConCmdInfo();
/* Find the commandopan */ /* Find the commandopan */
ConCommand *pCmd = FindCommand(name); ConCommand *pCmd = FindCommand(name);
+11 -2
View File
@@ -92,6 +92,8 @@ struct ConCmdInfo
bool is_admin_set; /**< Whether or not admin info is set */ bool is_admin_set; /**< Whether or not admin info is set */
}; };
typedef List<ConCmdInfo *> ConCmdList;
class ConCmdManager : class ConCmdManager :
public SMGlobalClass, public SMGlobalClass,
public IRootConsoleCommand, public IRootConsoleCommand,
@@ -128,7 +130,8 @@ public:
void UpdateAdminCmdFlags(const char *cmd, OverrideType type, FlagBits bits, bool remove); void UpdateAdminCmdFlags(const char *cmd, OverrideType type, FlagBits bits, bool remove);
bool LookForSourceModCommand(const char *cmd); bool LookForSourceModCommand(const char *cmd);
bool LookForCommandAdminFlags(const char *cmd, FlagBits *pFlags); bool LookForCommandAdminFlags(const char *cmd, FlagBits *pFlags);
bool CheckCommandAccess(int client, const char *cmd, FlagBits flags); bool CheckClientCommandAccess(int client, const char *cmd, FlagBits flags);
bool CheckAdminCommandAccess(AdminId adm, const char *cmd, FlagBits flags);
private: private:
void InternalDispatch(const CCommand &command); void InternalDispatch(const CCommand &command);
ResultType RunAdminCommand(ConCmdInfo *pInfo, int client, int args); ResultType RunAdminCommand(ConCmdInfo *pInfo, int client, int args);
@@ -139,6 +142,12 @@ private:
void RemoveConCmds(List<CmdHook *> &cmdlist); void RemoveConCmds(List<CmdHook *> &cmdlist);
void RemoveConCmds(List<CmdHook *> &cmdlist, IPluginContext *pContext); void RemoveConCmds(List<CmdHook *> &cmdlist, IPluginContext *pContext);
bool CheckAccess(int client, const char *cmd, AdminCmdInfo *pAdmin); bool CheckAccess(int client, const char *cmd, AdminCmdInfo *pAdmin);
// Case insensitive
ConCmdList::iterator FindInList(const char *name);
// Case sensitive
ConCmdInfo *FindInTrie(const char *name);
public: public:
inline int GetCommandClient() inline int GetCommandClient()
{ {
@@ -151,7 +160,7 @@ public:
private: private:
Trie *m_pCmds; /* command lookup */ Trie *m_pCmds; /* command lookup */
Trie *m_pCmdGrps; /* command group lookup */ Trie *m_pCmdGrps; /* command group lookup */
List<ConCmdInfo *> m_CmdList; /* command list */ ConCmdList m_CmdList; /* command list */
int m_CmdClient; /* current client */ int m_CmdClient; /* current client */
BaseStringTable m_Strings; /* string table */ BaseStringTable m_Strings; /* string table */
}; };
+36 -36
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 sw=4 tw=99 noet : * vim: set ts=4 sw=4 tw=99 noet :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -31,59 +31,59 @@
#ifndef _INCLUDE_SOURCEMOD_CON_COMMAND_BASE_ITERATOR_H_ #ifndef _INCLUDE_SOURCEMOD_CON_COMMAND_BASE_ITERATOR_H_
#define _INCLUDE_SOURCEMOD_CON_COMMAND_BASE_ITERATOR_H_ #define _INCLUDE_SOURCEMOD_CON_COMMAND_BASE_ITERATOR_H_
#if SOURCE_ENGINE >= SE_LEFT4DEAD
class ConCommandBaseIterator class ConCommandBaseIterator
{ {
#if SOURCE_ENGINE == SE_LEFT4DEAD
ICvarIteratorInternal *cvarIter;
#else
ConCommandBase *cvarIter;
#endif
public: public:
ConCommandBaseIterator() inline ConCommandBaseIterator() : iter(icvar)
{ {
#if SOURCE_ENGINE == SE_LEFT4DEAD iter.SetFirst();
cvarIter = icvar->FactoryInternalIterator();
cvarIter->SetFirst();
#else
cvarIter = icvar->GetCommands();
#endif
}
~ConCommandBaseIterator()
{
#if SOURCE_ENGINE == SE_LEFT4DEAD
g_pMemAlloc->Free(cvarIter);
#endif
} }
inline bool IsValid() inline bool IsValid()
{ {
#if SOURCE_ENGINE == SE_LEFT4DEAD return iter.IsValid();
return cvarIter->IsValid();
#else
return cvarIter != NULL;
#endif
} }
inline void Next() inline void Next()
{ {
#if SOURCE_ENGINE == SE_LEFT4DEAD iter.Next();
cvarIter->Next();
#else
cvarIter = const_cast<ConCommandBase*>(cvarIter->GetNext());
#endif
} }
inline ConCommandBase *Get() inline ConCommandBase *Get()
{ {
#if SOURCE_ENGINE == SE_LEFT4DEAD return iter.Get();
return cvarIter->Get();
#else
return cvarIter;
#endif
} }
private:
ICvar::Iterator iter;
}; };
#else
class ConCommandBaseIterator
{
public:
inline ConCommandBaseIterator()
{
iter = icvar->GetCommands();
}
inline bool IsValid()
{
return iter != NULL;
}
inline void Next()
{
iter = const_cast<ConCommandBase *>(iter->GetNext());
}
inline ConCommandBase *Get()
{
return iter;
}
private:
ConCommandBase *iter;
};
#endif
#endif /* _INCLUDE_SOURCEMOD_CON_COMMAND_BASE_ITERATOR_H_ */ #endif /* _INCLUDE_SOURCEMOD_CON_COMMAND_BASE_ITERATOR_H_ */
+62 -5
View File
@@ -58,6 +58,40 @@ const ParamType CONVARCHANGE_PARAMS[] = {Param_Cell, Param_String, Param_String}
typedef List<const ConVar *> ConVarList; typedef List<const ConVar *> ConVarList;
KTrie<ConVarInfo *> convar_cache; KTrie<ConVarInfo *> convar_cache;
class ConVarReentrancyGuard
{
ConVar *cvar;
ConVarReentrancyGuard *up;
public:
static ConVarReentrancyGuard *chain;
ConVarReentrancyGuard(ConVar *cvar)
: cvar(cvar), up(chain)
{
chain = this;
}
~ConVarReentrancyGuard()
{
assert(chain == this);
chain = up;
}
static bool IsCvarInChain(ConVar *cvar)
{
ConVarReentrancyGuard *guard = chain;
while (guard != NULL)
{
if (guard->cvar == cvar)
return true;
guard = guard->up;
}
return false;
}
};
ConVarReentrancyGuard *ConVarReentrancyGuard::chain = NULL;
ConVarManager::ConVarManager() : m_ConVarType(0), m_bIsDLLQueryHooked(false), m_bIsVSPQueryHooked(false) ConVarManager::ConVarManager() : m_ConVarType(0), m_bIsDLLQueryHooked(false), m_bIsVSPQueryHooked(false)
{ {
} }
@@ -182,7 +216,7 @@ void ConVarManager::OnSourceModVSPReceived()
} }
/* For later MM:S versions, use the updated API, since it's cleaner. */ /* For later MM:S versions, use the updated API, since it's cleaner. */
#if defined METAMOD_PLAPI_VERSION #if defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11
int engine = g_SMAPI->GetSourceEngineBuild(); int engine = g_SMAPI->GetSourceEngineBuild();
if (engine == SOURCE_ENGINE_ORIGINAL || vsp_version < 2) if (engine == SOURCE_ENGINE_ORIGINAL || vsp_version < 2)
{ {
@@ -288,8 +322,15 @@ void ConVarManager::OnRootConsoleCommand(const char *cmdname, const CCommand &co
int argcount = command.ArgC(); int argcount = command.ArgC();
if (argcount >= 3) if (argcount >= 3)
{ {
bool wantReset = false;
/* Get plugin index that was passed */ /* Get plugin index that was passed */
const char *arg = command.Arg(2); const char *arg = command.Arg(2);
if (argcount >= 4 && strcmp(arg, "reset") == 0)
{
wantReset = true;
arg = command.Arg(3);
}
/* Get plugin object */ /* Get plugin object */
CPlugin *plugin = g_PluginSys.FindPluginByConsoleArg(arg); CPlugin *plugin = g_PluginSys.FindPluginByConsoleArg(arg);
@@ -314,21 +355,34 @@ void ConVarManager::OnRootConsoleCommand(const char *cmdname, const CCommand &co
return; return;
} }
if (!wantReset)
{
g_RootMenu.ConsolePrint("[SM] Listing %d convars for: %s", pConVarList->size(), plname); g_RootMenu.ConsolePrint("[SM] Listing %d convars for: %s", pConVarList->size(), plname);
g_RootMenu.ConsolePrint(" %-32.31s %s", "[Name]", "[Value]"); g_RootMenu.ConsolePrint(" %-32.31s %s", "[Name]", "[Value]");
}
/* Iterate convar list and display each one */ /* Iterate convar list and display/reset each one */
for (iter = pConVarList->begin(); iter != pConVarList->end(); iter++) for (iter = pConVarList->begin(); iter != pConVarList->end(); iter++)
{ {
const ConVar *pConVar = (*iter); /*const */ConVar *pConVar = const_cast<ConVar *>(*iter);
if (!wantReset)
{
g_RootMenu.ConsolePrint(" %-32.31s %s", pConVar->GetName(), pConVar->GetString()); g_RootMenu.ConsolePrint(" %-32.31s %s", pConVar->GetName(), pConVar->GetString());
} else {
pConVar->Revert();
}
}
if (wantReset)
{
g_RootMenu.ConsolePrint("[SM] Reset %d convars for: %s", pConVarList->size(), plname);
} }
return; return;
} }
/* Display usage of subcommand */ /* Display usage of subcommand */
g_RootMenu.ConsolePrint("[SM] Usage: sm cvars <plugin #>"); g_RootMenu.ConsolePrint("[SM] Usage: sm cvars [reset] <plugin #>");
} }
Handle_t ConVarManager::CreateConVar(IPluginContext *pContext, const char *name, const char *defaultVal, const char *description, int flags, bool hasMin, float min, bool hasMax, float max) Handle_t ConVarManager::CreateConVar(IPluginContext *pContext, const char *name, const char *defaultVal, const char *description, int flags, bool hasMin, float min, bool hasMax, float max)
@@ -536,7 +590,8 @@ void ConVarManager::UnhookConVarChange(ConVar *pConVar, IPluginFunction *pFuncti
} }
/* If the forward now has 0 functions in it... */ /* If the forward now has 0 functions in it... */
if (pForward->GetFunctionCount() == 0) if (pForward->GetFunctionCount() == 0 &&
!ConVarReentrancyGuard::IsCvarInChain(pConVar))
{ {
/* Free this forward */ /* Free this forward */
g_Forwards.ReleaseForward(pForward); g_Forwards.ReleaseForward(pForward);
@@ -647,6 +702,8 @@ void ConVarManager::OnConVarChanged(ConVar *pConVar, const char *oldValue)
if (pForward != NULL) if (pForward != NULL)
{ {
ConVarReentrancyGuard guard(pConVar);
/* Now call forwards in plugins that have hooked this */ /* Now call forwards in plugins that have hooked this */
pForward->PushCell(pInfo->handle); pForward->PushCell(pInfo->handle);
pForward->PushString(oldValue); pForward->PushString(oldValue);
+53 -13
View File
@@ -31,7 +31,7 @@
/** /**
* On SourceHook v4.3 or lower, there are no DVP hooks. Very sad, right? * On SourceHook v4.3 or lower, there are no DVP hooks. Very sad, right?
* Only do this on newer version. For the older code, we'll do an incredibly * Only do this on newer versions. For the older code, we'll do an incredibly
* hacky detour. * hacky detour.
* *
* The idea of the "non-hacky" (yeah... no) code is that every unique * The idea of the "non-hacky" (yeah... no) code is that every unique
@@ -44,13 +44,14 @@
#include "Logger.h" #include "Logger.h"
#include "compat_wrappers.h" #include "compat_wrappers.h"
#include "ConsoleDetours.h" #include "ConsoleDetours.h"
#include "GameConfigs.h" #include <IGameConfigs.h>
#include "sm_stringutil.h" #include "sm_stringutil.h"
#include "ConCmdManager.h" #include "ConCmdManager.h"
#include "HalfLife2.h" #include "HalfLife2.h"
#include "ConCommandBaseIterator.h" #include "ConCommandBaseIterator.h"
#include "ShareSys.h"
#if defined PLATFORM_LINUX #if defined PLATFORM_POSIX
# include <dlfcn.h> # include <dlfcn.h>
# include <sys/mman.h> # include <sys/mman.h>
# include <stdint.h> # include <stdint.h>
@@ -63,8 +64,13 @@
# else # else
SH_DECL_EXTERN0_void(ConCommand, Dispatch, SH_NOATTRIB, false); SH_DECL_EXTERN0_void(ConCommand, Dispatch, SH_NOATTRIB, false);
# endif # endif
#elif SH_IMPL_VERSION == 3 #else
extern bool __SourceHook_FHAddConCommandDispatch(void *, bool, class fastdelegate::FastDelegate0<void>); # if SH_IMPL_VERSION >= 4
extern int __SourceHook_FHVPAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>,bool);
extern int __SourceHook_FHAddConCommandDispatch(void *, bool, class fastdelegate::FastDelegate0<void>);
# else
extern bool __SourceHook_FHAddConCommandDispatch(void *, bool, class fastdelegate::FastDelegate0<void>);
# endif
extern bool __SourceHook_FHRemoveConCommandDispatch(void *, bool, class fastdelegate::FastDelegate0<void>); extern bool __SourceHook_FHRemoveConCommandDispatch(void *, bool, class fastdelegate::FastDelegate0<void>);
#endif #endif
@@ -150,7 +156,10 @@ class GenericCommandHooker : public IConCommandLinkListener
while (iter != vtables.end()) while (iter != vtables.end())
{ {
if ((*iter).refcount) if ((*iter).refcount)
{
iter++;
continue; continue;
}
/* Damn it. This event happens AFTER the plugin has unloaded! /* Damn it. This event happens AFTER the plugin has unloaded!
* There's two options. Remove the hook now and hope SH's memory * There's two options. Remove the hook now and hope SH's memory
* protection will prevent a crash. Otherwise, we can wait until * protection will prevent a crash. Otherwise, we can wait until
@@ -283,6 +292,23 @@ class GenericCommandHooker
Patch cgc; Patch cgc;
public: public:
static void DelayedActivation(void *inparam)
{
GenericCommandHooker *cdtrs = reinterpret_cast<GenericCommandHooker*>(inparam);
/* Safe to re-enter because the frame queue is lock+swapped. */
if ((!cdtrs->ces.applied || !cdtrs->cgc.applied) &&
g_HL2.PeekCommandStack() != NULL)
{
g_SourceMod.AddFrameAction(GenericCommandHooker::DelayedActivation, cdtrs);
return;
}
if (!cdtrs->ces.applied)
cdtrs->ApplyPatch(&cdtrs->ces);
if (!cdtrs->cgc.applied)
cdtrs->ApplyPatch(&cdtrs->cgc);
}
bool Enable() bool Enable()
{ {
const char *platform = NULL; const char *platform = NULL;
@@ -320,6 +346,12 @@ public:
if (!PrepPatch("CGameClient::ExecuteString", "CGC", platform, &cgc)) if (!PrepPatch("CGameClient::ExecuteString", "CGC", platform, &cgc))
return false; return false;
if (g_HL2.PeekCommandStack() != NULL)
{
g_SourceMod.AddFrameAction(GenericCommandHooker::DelayedActivation, this);
return true;
}
ApplyPatch(&ces); ApplyPatch(&ces);
ApplyPatch(&cgc); ApplyPatch(&cgc);
@@ -531,10 +563,12 @@ void DummyHook()
* BEGIN THE ACTUALLY GENERIC CODE. * BEGIN THE ACTUALLY GENERIC CODE.
*/ */
#define FEATURECAP_COMMANDLISTENER "command listener"
static GenericCommandHooker s_GenericHooker; static GenericCommandHooker s_GenericHooker;
ConsoleDetours g_ConsoleDetours; ConsoleDetours g_ConsoleDetours;
ConsoleDetours::ConsoleDetours() : triedToEnable(false), isEnabled(false) ConsoleDetours::ConsoleDetours() : status(FeatureStatus_Unknown)
{ {
} }
@@ -542,6 +576,7 @@ void ConsoleDetours::OnSourceModAllInitialized()
{ {
m_pForward = g_Forwards.CreateForwardEx("OnAnyCommand", ET_Hook, 3, NULL, Param_Cell, m_pForward = g_Forwards.CreateForwardEx("OnAnyCommand", ET_Hook, 3, NULL, Param_Cell,
Param_String, Param_Cell); Param_String, Param_Cell);
g_ShareSys.AddCapabilityProvider(NULL, this, FEATURECAP_COMMANDLISTENER);
} }
void ConsoleDetours::OnSourceModShutdown() void ConsoleDetours::OnSourceModShutdown()
@@ -559,18 +594,23 @@ void ConsoleDetours::OnSourceModShutdown()
s_GenericHooker.Disable(); s_GenericHooker.Disable();
} }
bool ConsoleDetours::IsAvailable() FeatureStatus ConsoleDetours::GetFeatureStatus(FeatureType type, const char *name)
{ {
if (triedToEnable) return GetStatus();
return isEnabled; }
isEnabled = s_GenericHooker.Enable();
triedToEnable = true; FeatureStatus ConsoleDetours::GetStatus()
return isEnabled; {
if (status == FeatureStatus_Unknown)
{
status = s_GenericHooker.Enable() ? FeatureStatus_Available : FeatureStatus_Unavailable;
}
return status;
} }
bool ConsoleDetours::AddListener(IPluginFunction *fun, const char *command) bool ConsoleDetours::AddListener(IPluginFunction *fun, const char *command)
{ {
if (!IsAvailable()) if (GetStatus() != FeatureStatus_Available)
return false; return false;
if (command == NULL) if (command == NULL)
+9 -6
View File
@@ -36,7 +36,9 @@
#include "ForwardSys.h" #include "ForwardSys.h"
#include <sm_trie_tpl.h> #include <sm_trie_tpl.h>
class ConsoleDetours : public SMGlobalClass class ConsoleDetours :
public SMGlobalClass,
public IFeatureProvider
{ {
friend class PlayerManager; friend class PlayerManager;
friend class GenericCommandHooker; friend class GenericCommandHooker;
@@ -50,6 +52,8 @@ public:
public: //SMGlobalClass public: //SMGlobalClass
void OnSourceModAllInitialized(); void OnSourceModAllInitialized();
void OnSourceModShutdown(); void OnSourceModShutdown();
public: //IFeatureProvider
FeatureStatus GetFeatureStatus(FeatureType type, const char *name);
public: public:
bool AddListener(IPluginFunction *fun, const char *command); bool AddListener(IPluginFunction *fun, const char *command);
bool RemoveListener(IPluginFunction *fun, const char *command); bool RemoveListener(IPluginFunction *fun, const char *command);
@@ -60,15 +64,14 @@ private:
#else #else
static cell_t Dispatch(ConCommand *pBase); static cell_t Dispatch(ConCommand *pBase);
#endif #endif
bool IsAvailable();
public: public:
inline bool IsEnabled() FeatureStatus GetStatus();
bool IsEnabled()
{ {
return isEnabled; return status == FeatureStatus_Available;
} }
private: private:
bool triedToEnable; FeatureStatus status;
bool isEnabled;
IChangeableForward *m_pForward; IChangeableForward *m_pForward;
KTrie<Listener*> m_CmdLookup; KTrie<Listener*> m_CmdLookup;
List<Listener*> m_Listeners; List<Listener*> m_Listeners;
+5 -1
View File
@@ -68,7 +68,11 @@ void Hook_ExecDispatchPre(const CCommand &cmd)
SH_DECL_EXTERN0_void(ConCommand, Dispatch, SH_NOATTRIB, false); SH_DECL_EXTERN0_void(ConCommand, Dispatch, SH_NOATTRIB, false);
void Hook_ExecDispatchPre() void Hook_ExecDispatchPre()
#else #else
extern bool __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>); # if SH_IMPL_VERSION >= 4
extern int __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
# else
extern bool __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
# endif
extern bool __SourceHook_FHRemoveConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>); extern bool __SourceHook_FHRemoveConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
void Hook_ExecDispatchPre() void Hook_ExecDispatchPre()
#endif #endif
+40 -31
View File
@@ -47,7 +47,7 @@ DBManager g_DBMan;
static bool s_OneTimeThreaderErrorMsg = false; static bool s_OneTimeThreaderErrorMsg = false;
DBManager::DBManager() DBManager::DBManager()
: m_StrTab(512), m_ParseLevel(0), m_ParseState(0), m_pDefault(NULL) : m_ParseLevel(0), m_ParseState(0), m_pDefault(NULL)
{ {
} }
@@ -104,6 +104,7 @@ void DBManager::OnSourceModShutdown()
m_pQueueLock->DestroyThis(); m_pQueueLock->DestroyThis();
g_HandleSys.RemoveType(m_DatabaseType, g_pCoreIdent); g_HandleSys.RemoveType(m_DatabaseType, g_pCoreIdent);
g_HandleSys.RemoveType(m_DriverType, g_pCoreIdent); g_HandleSys.RemoveType(m_DriverType, g_pCoreIdent);
ClearConfigs();
} }
unsigned int DBManager::GetInterfaceVersion() unsigned int DBManager::GetInterfaceVersion()
@@ -133,13 +134,20 @@ void DBManager::OnHandleDestroy(HandleType_t type, void *object)
void DBManager::ReadSMC_ParseStart() void DBManager::ReadSMC_ParseStart()
{ {
m_confs.clear(); ClearConfigs();
m_ParseLevel = 0; m_ParseLevel = 0;
m_ParseState = DBPARSE_LEVEL_NONE; m_ParseState = DBPARSE_LEVEL_NONE;
m_StrTab.Reset();
m_DefDriver.clear(); m_DefDriver.clear();
} }
void DBManager::ClearConfigs()
{
List<ConfDbInfo *>::iterator iter;
for (iter=m_confs.begin(); iter!=m_confs.end(); iter++)
delete (*iter);
m_confs.clear();
}
ConfDbInfo s_CurInfo; ConfDbInfo s_CurInfo;
SMCResult DBManager::ReadSMC_NewSection(const SMCStates *states, const char *name) SMCResult DBManager::ReadSMC_NewSection(const SMCStates *states, const char *name)
{ {
@@ -159,7 +167,7 @@ SMCResult DBManager::ReadSMC_NewSection(const SMCStates *states, const char *nam
} }
} else if (m_ParseState == DBPARSE_LEVEL_MAIN) { } else if (m_ParseState == DBPARSE_LEVEL_MAIN) {
s_CurInfo = ConfDbInfo(); s_CurInfo = ConfDbInfo();
s_CurInfo.name = m_StrTab.AddString(name); s_CurInfo.name = name;
m_ParseState = DBPARSE_LEVEL_DATABASE; m_ParseState = DBPARSE_LEVEL_DATABASE;
} else if (m_ParseState == DBPARSE_LEVEL_DATABASE) { } else if (m_ParseState == DBPARSE_LEVEL_DATABASE) {
m_ParseLevel++; m_ParseLevel++;
@@ -186,16 +194,16 @@ SMCResult DBManager::ReadSMC_KeyValue(const SMCStates *states, const char *key,
{ {
if (strcmp(value, "default") != 0) if (strcmp(value, "default") != 0)
{ {
s_CurInfo.driver = m_StrTab.AddString(value); s_CurInfo.driver = value;
} }
} else if (strcmp(key, "database") == 0) { } else if (strcmp(key, "database") == 0) {
s_CurInfo.database = m_StrTab.AddString(value); s_CurInfo.database = value;
} else if (strcmp(key, "host") == 0) { } else if (strcmp(key, "host") == 0) {
s_CurInfo.host = m_StrTab.AddString(value); s_CurInfo.host = value;
} else if (strcmp(key, "user") == 0) { } else if (strcmp(key, "user") == 0) {
s_CurInfo.user = m_StrTab.AddString(value); s_CurInfo.user = value;
} else if (strcmp(key, "pass") == 0) { } else if (strcmp(key, "pass") == 0) {
s_CurInfo.pass = m_StrTab.AddString(value); s_CurInfo.pass = value;
} else if (strcmp(key, "timeout") == 0) { } else if (strcmp(key, "timeout") == 0) {
s_CurInfo.info.maxTimeout = atoi(value); s_CurInfo.info.maxTimeout = atoi(value);
} else if (strcmp(key, "port") == 0) { } else if (strcmp(key, "port") == 0) {
@@ -206,13 +214,6 @@ SMCResult DBManager::ReadSMC_KeyValue(const SMCStates *states, const char *key,
return SMCResult_Continue; return SMCResult_Continue;
} }
#define ASSIGN_VAR(var) \
if (s_CurInfo.var == -1) { \
s_CurInfo.info.var = ""; \
} else { \
s_CurInfo.info.var = m_StrTab.GetString(s_CurInfo.var); \
}
SMCResult DBManager::ReadSMC_LeavingSection(const SMCStates *states) SMCResult DBManager::ReadSMC_LeavingSection(const SMCStates *states)
{ {
if (m_ParseLevel) if (m_ParseLevel)
@@ -223,17 +224,26 @@ SMCResult DBManager::ReadSMC_LeavingSection(const SMCStates *states)
if (m_ParseState == DBPARSE_LEVEL_DATABASE) if (m_ParseState == DBPARSE_LEVEL_DATABASE)
{ {
/* Set all of the info members to either a blank string ConfDbInfo *cdb = new ConfDbInfo();
* or the string pointer from the string table.
*/ cdb->name = s_CurInfo.name;
ASSIGN_VAR(driver); cdb->driver = s_CurInfo.driver;
ASSIGN_VAR(database); cdb->host = s_CurInfo.host;
ASSIGN_VAR(host); cdb->user = s_CurInfo.user;
ASSIGN_VAR(user); cdb->pass = s_CurInfo.pass;
ASSIGN_VAR(pass); cdb->database = s_CurInfo.database;
cdb->realDriver = s_CurInfo.realDriver;
cdb->info.maxTimeout = s_CurInfo.info.maxTimeout;
cdb->info.port = s_CurInfo.info.port;
cdb->info.driver = cdb->driver.c_str();
cdb->info.database = cdb->database.c_str();
cdb->info.host = cdb->host.c_str();
cdb->info.user = cdb->user.c_str();
cdb->info.pass = cdb->pass.c_str();
/* Save it.. */ /* Save it.. */
m_confs.push_back(s_CurInfo); m_confs.push_back(cdb);
/* Go up one level */ /* Go up one level */
m_ParseState = DBPARSE_LEVEL_MAIN; m_ParseState = DBPARSE_LEVEL_MAIN;
@@ -244,7 +254,6 @@ SMCResult DBManager::ReadSMC_LeavingSection(const SMCStates *states)
return SMCResult_Continue; return SMCResult_Continue;
} }
#undef ASSIGN_VAR
void DBManager::ReadSMC_ParseEnd(bool halted, bool failed) void DBManager::ReadSMC_ParseEnd(bool halted, bool failed)
{ {
@@ -333,10 +342,10 @@ void DBManager::RemoveDriver(IDBDriver *pDriver)
} }
/* Make sure NOTHING references this! */ /* Make sure NOTHING references this! */
List<ConfDbInfo>::iterator iter; List<ConfDbInfo *>::iterator iter;
for (iter=m_confs.begin(); iter!=m_confs.end(); iter++) for (iter=m_confs.begin(); iter!=m_confs.end(); iter++)
{ {
ConfDbInfo &db = (*iter); ConfDbInfo &db = *(*iter);
if (db.realDriver == pDriver) if (db.realDriver == pDriver)
{ {
db.realDriver = NULL; db.realDriver = NULL;
@@ -448,12 +457,12 @@ const DatabaseInfo *DBManager::FindDatabaseConf(const char *name)
ConfDbInfo *DBManager::GetDatabaseConf(const char *name) ConfDbInfo *DBManager::GetDatabaseConf(const char *name)
{ {
List<ConfDbInfo>::iterator iter; List<ConfDbInfo *>::iterator iter;
for (iter=m_confs.begin(); iter!=m_confs.end(); iter++) for (iter=m_confs.begin(); iter!=m_confs.end(); iter++)
{ {
ConfDbInfo &conf = (*iter); ConfDbInfo &conf = *(*iter);
if (strcmp(m_StrTab.GetString(conf.name), name) == 0) if (conf.name == name)
{ {
return &conf; return &conf;
} }
+9 -10
View File
@@ -47,16 +47,15 @@ using namespace SourceHook;
struct ConfDbInfo struct ConfDbInfo
{ {
ConfDbInfo() : name(-1), driver(-1), host(-1), user(-1), pass(-1), ConfDbInfo() : realDriver(NULL)
database(-1), realDriver(NULL)
{ {
} }
int name; String name;
int driver; String driver;
int host; String host;
int user; String user;
int pass; String pass;
int database; String database;
IDBDriver *realDriver; IDBDriver *realDriver;
DatabaseInfo info; DatabaseInfo info;
}; };
@@ -121,6 +120,7 @@ public:
return m_DatabaseType; return m_DatabaseType;
} }
private: private:
void ClearConfigs();
void KillWorkerThread(); void KillWorkerThread();
private: private:
CVector<IDBDriver *> m_drivers; CVector<IDBDriver *> m_drivers;
@@ -134,11 +134,10 @@ private:
IMutex *m_pQueueLock; /* Queue safety lock */ IMutex *m_pQueueLock; /* Queue safety lock */
IMutex *m_pThinkLock; /* Think-queue lock */ IMutex *m_pThinkLock; /* Think-queue lock */
List<ConfDbInfo> m_confs; List<ConfDbInfo *> m_confs;
HandleType_t m_DriverType; HandleType_t m_DriverType;
HandleType_t m_DatabaseType; HandleType_t m_DatabaseType;
String m_DefDriver; String m_DefDriver;
BaseStringTable m_StrTab;
char m_Filename[PLATFORM_MAX_PATH]; char m_Filename[PLATFORM_MAX_PATH];
unsigned int m_ParseLevel; unsigned int m_ParseLevel;
unsigned int m_ParseState; unsigned int m_ParseState;
+7 -2
View File
@@ -56,11 +56,16 @@ void DebugReport::OnDebugSpew(const char *msg, ...)
void DebugReport::GenerateError(IPluginContext *ctx, cell_t func_idx, int err, const char *message, ...) void DebugReport::GenerateError(IPluginContext *ctx, cell_t func_idx, int err, const char *message, ...)
{ {
va_list ap; va_list ap;
char buffer[512];
va_start(ap, message); va_start(ap, message);
UTIL_FormatArgs(buffer, sizeof(buffer), message, ap); GenerateErrorVA(ctx, func_idx, err, message, ap);
va_end(ap); va_end(ap);
}
void DebugReport::GenerateErrorVA(IPluginContext *ctx, cell_t func_idx, int err, const char *message, va_list ap)
{
char buffer[512];
UTIL_FormatArgs(buffer, sizeof(buffer), message, ap);
const char *plname = g_PluginSys.FindPluginByContext(ctx->GetContext())->GetFilename(); const char *plname = g_PluginSys.FindPluginByContext(ctx->GetContext())->GetFilename();
const char *error = g_pSourcePawn2->GetErrorString(err); const char *error = g_pSourcePawn2->GetErrorString(err);
+1
View File
@@ -46,6 +46,7 @@ public: // IDebugListener
void OnDebugSpew(const char *msg, ...); void OnDebugSpew(const char *msg, ...);
public: public:
void GenerateError(IPluginContext *ctx, cell_t func_idx, int err, const char *message, ...); void GenerateError(IPluginContext *ctx, cell_t func_idx, int err, const char *message, ...);
void GenerateErrorVA(IPluginContext *ctx, cell_t func_idx, int err, const char *message, va_list ap);
void GenerateCodeError(IPluginContext *ctx, uint32_t code_addr, int err, const char *message, ...); void GenerateCodeError(IPluginContext *ctx, uint32_t code_addr, int err, const char *message, ...);
private: private:
int _GetPluginIndex(IPluginContext *ctx); int _GetPluginIndex(IPluginContext *ctx);
+36 -3
View File
@@ -1,8 +1,8 @@
/** /**
* vim: set ts=4 : * vim: set ts=4 sw=4 tw=99 noet :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -42,6 +42,20 @@ SH_DECL_HOOK2(IGameEventManager2, FireEvent, SH_NOATTRIB, 0, bool, IGameEvent *,
const ParamType GAMEEVENT_PARAMS[] = {Param_Cell, Param_String, Param_Cell}; const ParamType GAMEEVENT_PARAMS[] = {Param_Cell, Param_String, Param_Cell};
typedef List<EventHook *> EventHookList; typedef List<EventHook *> EventHookList;
class EventForwardFilter : public IForwardFilter
{
EventInfo *pEventInfo;
public:
EventForwardFilter(EventInfo *pEventInfo) : pEventInfo(pEventInfo)
{
}
void Preprocess(IPluginFunction *fun, FwdParamInfo *params)
{
params[2].val = pEventInfo->bDontBroadcast ? 1 : 0;
}
};
EventManager::EventManager() : m_EventType(0) EventManager::EventManager() : m_EventType(0)
{ {
/* Create an event lookup trie */ /* Create an event lookup trie */
@@ -147,6 +161,13 @@ void EventManager::FireGameEvent(IGameEvent *pEvent)
Just need to add ourselves as a listener to make our hook on IGameEventManager2::FireEvent work */ Just need to add ourselves as a listener to make our hook on IGameEventManager2::FireEvent work */
} }
#if SOURCE_ENGINE >= SE_LEFT4DEAD
int EventManager::GetEventDebugID()
{
return EVENT_DEBUG_ID_INIT;
}
#endif
EventHookError EventManager::HookEvent(const char *name, IPluginFunction *pFunction, EventHookMode mode) EventHookError EventManager::HookEvent(const char *name, IPluginFunction *pFunction, EventHookMode mode)
{ {
EventHook *pHook; EventHook *pHook;
@@ -327,6 +348,7 @@ EventInfo *EventManager::CreateEvent(IPluginContext *pContext, const char *name,
pInfo->pEvent = pEvent; pInfo->pEvent = pEvent;
pInfo->pOwner = pContext->GetIdentity(); pInfo->pOwner = pContext->GetIdentity();
pInfo->bDontBroadcast = false;
return pInfo; return pInfo;
} }
@@ -365,6 +387,7 @@ bool EventManager::OnFireEvent(IGameEvent *pEvent, bool bDontBroadcast)
IChangeableForward *pForward; IChangeableForward *pForward;
const char *name; const char *name;
cell_t res = Pl_Continue; cell_t res = Pl_Continue;
bool broadcast = bDontBroadcast;
/* The engine accepts NULL without crashing, so to prevent a crash in SM we ignore these */ /* The engine accepts NULL without crashing, so to prevent a crash in SM we ignore these */
if (!pEvent) if (!pEvent)
@@ -390,10 +413,16 @@ bool EventManager::OnFireEvent(IGameEvent *pEvent, bool bDontBroadcast)
HandleSecurity sec(NULL, g_pCoreIdent); HandleSecurity sec(NULL, g_pCoreIdent);
Handle_t hndl = g_HandleSys.CreateHandle(m_EventType, &info, NULL, g_pCoreIdent, NULL); Handle_t hndl = g_HandleSys.CreateHandle(m_EventType, &info, NULL, g_pCoreIdent, NULL);
info.bDontBroadcast = bDontBroadcast;
EventForwardFilter filter(&info);
pForward->PushCell(hndl); pForward->PushCell(hndl);
pForward->PushString(name); pForward->PushString(name);
pForward->PushCell(bDontBroadcast); pForward->PushCell(bDontBroadcast);
pForward->Execute(&res, NULL); pForward->Execute(&res, &filter);
broadcast = info.bDontBroadcast;
g_HandleSys.FreeHandle(hndl, &sec); g_HandleSys.FreeHandle(hndl, &sec);
} }
@@ -414,6 +443,9 @@ bool EventManager::OnFireEvent(IGameEvent *pEvent, bool bDontBroadcast)
m_EventStack.push(NULL); m_EventStack.push(NULL);
} }
if (broadcast != bDontBroadcast)
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, true, &IGameEventManager2::FireEvent, (pEvent, broadcast));
RETURN_META_VALUE(MRES_IGNORED, true); RETURN_META_VALUE(MRES_IGNORED, true);
} }
@@ -441,6 +473,7 @@ bool EventManager::OnFireEvent_Post(IGameEvent *pEvent, bool bDontBroadcast)
{ {
if (pHook->postCopy) if (pHook->postCopy)
{ {
info.bDontBroadcast = bDontBroadcast;
info.pEvent = m_EventCopies.front(); info.pEvent = m_EventCopies.front();
info.pOwner = NULL; info.pOwner = NULL;
hndl = g_HandleSys.CreateHandle(m_EventType, &info, NULL, g_pCoreIdent, NULL); hndl = g_HandleSys.CreateHandle(m_EventType, &info, NULL, g_pCoreIdent, NULL);
+5 -1
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 : * vim: set ts=4 :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -53,6 +53,7 @@ struct EventInfo
} }
IGameEvent *pEvent; IGameEvent *pEvent;
IdentityToken_t *pOwner; IdentityToken_t *pOwner;
bool bDontBroadcast;
}; };
struct EventHook struct EventHook
@@ -104,6 +105,9 @@ public: // IPluginsListener
void OnPluginUnloaded(IPlugin *plugin); void OnPluginUnloaded(IPlugin *plugin);
public: // IGameEventListener2 public: // IGameEventListener2
void FireGameEvent(IGameEvent *pEvent); void FireGameEvent(IGameEvent *pEvent);
#if SOURCE_ENGINE >= SE_LEFT4DEAD
int GetEventDebugID();
#endif
public: public:
/** /**
* Get the 'GameEvent' handle type ID. * Get the 'GameEvent' handle type ID.
+53 -7
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 sw=4 tw=99 noet : * vim: set ts=4 sw=4 tw=99 noet :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -63,15 +63,23 @@ CRemoteExtension::CRemoteExtension(IExtensionInterface *pAPI, const char *filena
#if defined METAMOD_PLAPI_VERSION #if defined METAMOD_PLAPI_VERSION
#if SOURCE_ENGINE == SE_LEFT4DEAD #if SOURCE_ENGINE == SE_LEFT4DEAD
#define GAMEFIX "2.l4d" #define GAMEFIX "2.l4d"
#elif SOURCE_ENGINE == SE_LEFT4DEAD2
#define GAMEFIX "2.l4d2"
#elif SOURCE_ENGINE == SE_ALIENSWARM
#define GAMEFIX "2.swarm"
#elif SOURCE_ENGINE == SE_ORANGEBOX #elif SOURCE_ENGINE == SE_ORANGEBOX
#define GAMEFIX "2.ep2" #define GAMEFIX "2.ep2"
#elif SOURCE_ENGINE == SE_BLOODYGOODTIME
#define GAMEFIX "2.bgt"
#elif SOURCE_ENGINE == SE_EYE
#define GAMEFIX "2.eye"
#elif SOURCE_ENGINE == SE_ORANGEBOXVALVE #elif SOURCE_ENGINE == SE_ORANGEBOXVALVE
#define GAMEFIX "2.ep2v" #define GAMEFIX "2.ep2v"
#elif SOURCE_ENGINE == SE_DARKMESSIAH #elif SOURCE_ENGINE == SE_DARKMESSIAH
#define GAMEFIX "2.darkm" #define GAMEFIX "2.darkm"
#else #else
#define GAMEFIX "2.ep1" #define GAMEFIX "2.ep1"
#endif //SOURCE_ENGINE == SE_LEFT4DEAD #endif //(SOURCE_ENGINE == SE_LEFT4DEAD) || (SOURCE_ENGINE == SE_LEFT4DEAD2)
#else //METAMOD_PLAPI_VERSION #else //METAMOD_PLAPI_VERSION
#define GAMEFIX "1.ep1" #define GAMEFIX "1.ep1"
#endif //METAMOD_PLAPI_VERSION #endif //METAMOD_PLAPI_VERSION
@@ -83,6 +91,12 @@ CLocalExtension::CLocalExtension(const char *filename)
char path[PLATFORM_MAX_PATH]; char path[PLATFORM_MAX_PATH];
/* Special case for new bintools binary */
if (strcmp(filename, "bintools.ext") == 0)
{
goto normal;
}
/* Zeroth, see if there is an engine specific build in the new place. */ /* Zeroth, see if there is an engine specific build in the new place. */
g_SourceMod.BuildPath(Path_SM, g_SourceMod.BuildPath(Path_SM,
path, path,
@@ -102,6 +116,7 @@ CLocalExtension::CLocalExtension(const char *filename)
"extensions/auto." GAMEFIX "/%s." PLATFORM_LIB_EXT, "extensions/auto." GAMEFIX "/%s." PLATFORM_LIB_EXT,
filename); filename);
normal:
/* Try the "normal" version */ /* Try the "normal" version */
if (!g_LibSys.IsPathFile(path)) if (!g_LibSys.IsPathFile(path))
{ {
@@ -169,6 +184,28 @@ bool CLocalExtension::Load(char *error, size_t maxlength)
{ {
bool already; bool already;
m_PlId = g_pMMPlugins->Load(m_Path.c_str(), g_PLID, already, error, maxlength); m_PlId = g_pMMPlugins->Load(m_Path.c_str(), g_PLID, already, error, maxlength);
// Check the plugin didn't refuse load
Pl_Status status;
#ifndef METAMOD_PLAPI_VERSION
const char *file;
PluginId source;
#endif
if (!m_PlId || (
#ifndef METAMOD_PLAPI_VERSION
g_pMMPlugins->Query(m_PlId, file, status, source)
#else
g_pMMPlugins->Query(m_PlId, NULL, &status, NULL)
#endif
&& status < Pl_Paused))
{
m_pLib->CloseLibrary();
m_pLib = NULL;
m_pAPI = NULL;
return false;
}
} }
if (!CExtension::Load(error, maxlength)) if (!CExtension::Load(error, maxlength))
@@ -335,6 +372,11 @@ const char *CExtension::GetFilename()
return m_RealFile.c_str(); return m_RealFile.c_str();
} }
const char *CExtension::GetPath() const
{
return m_Path.c_str();
}
IdentityToken_t *CExtension::GetIdentity() IdentityToken_t *CExtension::GetIdentity()
{ {
return m_pIdentToken; return m_pIdentToken;
@@ -543,7 +585,7 @@ void CExtensionManager::TryAutoload()
} }
} }
IExtension *CExtensionManager::LoadAutoExtension(const char *path) IExtension *CExtensionManager::LoadAutoExtension(const char *path, bool bErrorOnMissing)
{ {
/* Remove platform extension if it's there. Compat hack. */ /* Remove platform extension if it's there. Compat hack. */
const char *ext = g_LibSys.GetFileExtension(path); const char *ext = g_LibSys.GetFileExtension(path);
@@ -552,7 +594,7 @@ IExtension *CExtensionManager::LoadAutoExtension(const char *path)
char path2[PLATFORM_MAX_PATH]; char path2[PLATFORM_MAX_PATH];
UTIL_Format(path2, sizeof(path2), "%s", path); UTIL_Format(path2, sizeof(path2), "%s", path);
path2[strlen(path) - strlen(PLATFORM_LIB_EXT) - 1] = '\0'; path2[strlen(path) - strlen(PLATFORM_LIB_EXT) - 1] = '\0';
return LoadAutoExtension(path2); return LoadAutoExtension(path2, bErrorOnMissing);
} }
IExtension *pAlready; IExtension *pAlready;
@@ -570,8 +612,12 @@ IExtension *CExtensionManager::LoadAutoExtension(const char *path)
m_Libs.push_back(p); m_Libs.push_back(p);
if (!p->Load(error, sizeof(error)) || !p->IsLoaded()) if (!p->Load(error, sizeof(error)) || !p->IsLoaded())
{
if (bErrorOnMissing || g_LibSys.IsPathFile(p->GetPath()))
{ {
g_Logger.LogError("[SM] Unable to load extension \"%s\": %s", path, error); g_Logger.LogError("[SM] Unable to load extension \"%s\": %s", path, error);
}
p->SetError(error); p->SetError(error);
} }
@@ -986,7 +1032,7 @@ void CExtensionManager::OnRootConsoleCommand(const char *cmdname, const CCommand
{ {
if (argcount < 4) if (argcount < 4)
{ {
g_RootMenu.ConsolePrint("[SM] Usage: sm info <#>"); g_RootMenu.ConsolePrint("[SM] Usage: sm exts info <#>");
return; return;
} }
@@ -994,7 +1040,7 @@ void CExtensionManager::OnRootConsoleCommand(const char *cmdname, const CCommand
unsigned int id = atoi(sId); unsigned int id = atoi(sId);
if (id <= 0) if (id <= 0)
{ {
g_RootMenu.ConsolePrint("[SM] Usage: sm info <#>"); g_RootMenu.ConsolePrint("[SM] Usage: sm exts info <#>");
return; return;
} }
@@ -1071,7 +1117,7 @@ void CExtensionManager::OnRootConsoleCommand(const char *cmdname, const CCommand
{ {
if (argcount < 4) if (argcount < 4)
{ {
g_RootMenu.ConsolePrint("[SM] Usage: sm unload <#> [code]"); g_RootMenu.ConsolePrint("[SM] Usage: sm exts unload <#> [code]");
return; return;
} }
+2 -1
View File
@@ -66,6 +66,7 @@ public:
public: //IExtension public: //IExtension
IExtensionInterface *GetAPI(); IExtensionInterface *GetAPI();
const char *GetFilename(); const char *GetFilename();
const char *GetPath() const;
IdentityToken_t *GetIdentity(); IdentityToken_t *GetIdentity();
ITERATOR *FindFirstDependency(IExtension **pOwner, SMInterface **pInterface); ITERATOR *FindFirstDependency(IExtension **pOwner, SMInterface **pInterface);
bool FindNextDependency(ITERATOR *iter, IExtension **pOwner, SMInterface **pInterface); bool FindNextDependency(ITERATOR *iter, IExtension **pOwner, SMInterface **pInterface);
@@ -163,7 +164,7 @@ public: //IPluginsListener
public: //IRootConsoleCommand public: //IRootConsoleCommand
void OnRootConsoleCommand(const char *cmdname, const CCommand &command); void OnRootConsoleCommand(const char *cmdname, const CCommand &command);
public: public:
IExtension *LoadAutoExtension(const char *path); IExtension *LoadAutoExtension(const char *path, bool bErrorOnMissing=true);
void BindDependency(IExtension *pOwner, IfaceInfo *pInfo); void BindDependency(IExtension *pOwner, IfaceInfo *pInfo);
void AddInterface(IExtension *pOwner, SMInterface *pInterface); void AddInterface(IExtension *pOwner, SMInterface *pInterface);
void BindChildPlugin(IExtension *pParent, CPlugin *pPlugin); void BindChildPlugin(IExtension *pParent, CPlugin *pPlugin);
+14 -8
View File
@@ -1,5 +1,5 @@
/** /**
* vim: set ts=4 : * vim: set ts=4 sw=4 tw=99 noet :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
@@ -255,6 +255,7 @@ CForward *CForward::CreateForward(const char *name, ExecType et, unsigned int nu
} }
CForward *pForward = g_Forwards.ForwardMake(); CForward *pForward = g_Forwards.ForwardMake();
pForward->m_IterGuard = NULL;
pForward->m_curparam = 0; pForward->m_curparam = 0;
pForward->m_ExecType = et; pForward->m_ExecType = et;
snprintf(pForward->m_name, FORWARDS_NAME_MAX, "%s", name ? name : ""); snprintf(pForward->m_name, FORWARDS_NAME_MAX, "%s", name ? name : "");
@@ -294,7 +295,7 @@ int CForward::Execute(cell_t *result, IForwardFilter *filter)
cell_t high_result = 0; cell_t high_result = 0;
cell_t low_result = 0; cell_t low_result = 0;
int err; int err;
unsigned int failed=0, success=0; unsigned int success=0;
unsigned int num_params = m_curparam; unsigned int num_params = m_curparam;
FwdParamInfo temp_info[SP_MAX_EXEC_PARAMS]; FwdParamInfo temp_info[SP_MAX_EXEC_PARAMS];
FwdParamInfo *param; FwdParamInfo *param;
@@ -304,10 +305,15 @@ int CForward::Execute(cell_t *result, IForwardFilter *filter)
memcpy(temp_info, m_params, sizeof(m_params)); memcpy(temp_info, m_params, sizeof(m_params));
m_curparam = 0; m_curparam = 0;
for (iter=m_functions.begin(); iter!=m_functions.end(); iter++) FuncIteratorGuard guard(&m_IterGuard, &iter);
while (iter != m_functions.end())
{ {
func = (*iter); func = (*iter);
if (filter)
filter->Preprocess(func, temp_info);
for (unsigned int i=0; i<num_params; i++) for (unsigned int i=0; i<num_params; i++)
{ {
int err = SP_ERROR_PARAM; int err = SP_ERROR_PARAM;
@@ -359,11 +365,7 @@ int CForward::Execute(cell_t *result, IForwardFilter *filter)
} }
/* Call the function and deal with the return value. */ /* Call the function and deal with the return value. */
if ((err=func->Execute(&cur_result)) != SP_ERROR_NONE) if ((err=func->Execute(&cur_result)) == SP_ERROR_NONE)
{
failed++;
}
else
{ {
success++; success++;
switch (m_ExecType) switch (m_ExecType)
@@ -403,6 +405,9 @@ int CForward::Execute(cell_t *result, IForwardFilter *filter)
} }
} }
} }
if (!guard.Triggered())
iter++;
} }
done: done:
@@ -682,6 +687,7 @@ bool CForward::RemoveFunction(IPluginFunction *func)
{ {
if ((*iter) == func) if ((*iter) == func)
{ {
m_IterGuard->FixIteratorChain(iter);
found = true; found = true;
lst->erase(iter); lst->erase(iter);
break; break;
+53
View File
@@ -61,6 +61,58 @@ struct FwdParamInfo
ParamType pushedas; ParamType pushedas;
}; };
class SourceMod::IForwardFilter
{
public:
virtual void Preprocess(IPluginFunction *fun, FwdParamInfo *params)
{
}
};
class FuncIteratorGuard
{
bool triggered;
FuncIteratorGuard **pprev;
FuncIter *iter;
FuncIteratorGuard *next;
public:
FuncIteratorGuard(FuncIteratorGuard **pprev, FuncIter *iter)
: triggered(false), pprev(pprev), iter(iter), next(*pprev)
{
*pprev = this;
}
~FuncIteratorGuard()
{
*pprev = next;
}
inline bool Triggered()
{
bool t = triggered;
triggered = false;
return t;
}
/**
* This should not read from |this| before the NULL check, because FwdSys
* can call (NULL)->FixIteratorChain().
*/
void FixIteratorChain(FuncIter &other)
{
FuncIteratorGuard *guard = this;
while (guard != NULL)
{
if (*guard->iter == other)
{
*(guard->iter) = ++(*(guard->iter));
guard->triggered = true;
}
guard = guard->next;
}
}
};
class CForward : public IChangeableForward class CForward : public IChangeableForward
{ {
public: //ICallable public: //ICallable
@@ -103,6 +155,7 @@ protected:
*/ */
mutable List<IPluginFunction *> m_functions; mutable List<IPluginFunction *> m_functions;
mutable List<IPluginFunction *> m_paused; mutable List<IPluginFunction *> m_paused;
FuncIteratorGuard *m_IterGuard;
/* Type and name information */ /* Type and name information */
FwdParamInfo m_params[SP_MAX_EXEC_PARAMS]; FwdParamInfo m_params[SP_MAX_EXEC_PARAMS];
+56 -17
View File
@@ -35,9 +35,10 @@
#include "UserMessages.h" #include "UserMessages.h"
#include "PlayerManager.h" #include "PlayerManager.h"
#include "sm_stringutil.h" #include "sm_stringutil.h"
#include "GameConfigs.h" #include <IGameConfigs.h>
#include <compat_wrappers.h> #include <compat_wrappers.h>
#include <Logger.h> #include <Logger.h>
#include "logic_bridge.h"
CHalfLife2 g_HL2; CHalfLife2 g_HL2;
ConVar *sv_lan = NULL; ConVar *sv_lan = NULL;
@@ -96,14 +97,16 @@ CHalfLife2::~CHalfLife2()
CSharedEdictChangeInfo *g_pSharedChangeInfo = NULL; CSharedEdictChangeInfo *g_pSharedChangeInfo = NULL;
#endif #endif
#if !defined METAMOD_PLAPI_VERSION || PLAPI_VERSION < 11
bool is_original_engine = false; bool is_original_engine = false;
#endif
void CHalfLife2::OnSourceModStartup(bool late) void CHalfLife2::OnSourceModStartup(bool late)
{ {
#if SOURCE_ENGINE != SE_DARKMESSIAH #if SOURCE_ENGINE != SE_DARKMESSIAH
/* The Ship currently is the only known game to use an older version of the engine */ /* The Ship currently is the only known game to use an older version of the engine */
#if defined METAMOD_PLAPI_VERSION #if defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11
if (g_SMAPI->GetSourceEngineBuild() == SOURCE_ENGINE_ORIGINAL) if (g_SMAPI->GetSourceEngineBuild() == SOURCE_ENGINE_ORIGINAL)
#else #else
if (strcasecmp(g_SourceMod.GetGameFolderName(), "ship") == 0) if (strcasecmp(g_SourceMod.GetGameFolderName(), "ship") == 0)
@@ -130,40 +133,61 @@ void CHalfLife2::OnSourceModAllInitialized()
void CHalfLife2::OnSourceModAllInitialized_Post() void CHalfLife2::OnSourceModAllInitialized_Post()
{ {
char *addr = NULL; char *addr = NULL;
#ifdef PLATFORM_WINDOWS
int offset;
/* gEntList and/or g_pEntityList */ /*
* gEntList and/or g_pEntityList
*
* First try to lookup pointer directly for platforms with symbols.
* If symbols aren't present (Windows or stripped Linux/Mac),
* attempt find via LevelShutdown + offset
*/
if (g_pGameConf->GetMemSig("gEntList", (void **)&addr))
{
#if !defined PLATFORM_WINDOWS
if (!addr)
{
// Key exists so notify if lookup fails, but try other method.
g_Logger.LogError("Failed lookup of gEntList directly - Reverting to lookup via LevelShutdown");
}
else
{
#endif
g_EntList = reinterpret_cast<void *>(addr);
#if !defined PLATFORM_WINDOWS
}
#endif
}
if (!g_EntList)
{
if (!g_pGameConf->GetMemSig("LevelShutdown", (void **)&addr)) if (!g_pGameConf->GetMemSig("LevelShutdown", (void **)&addr))
{ {
g_Logger.LogError("Logical Entities not supported by this mod (LevelShutdown) - Reverting to networkable entities only"); g_Logger.LogError("Logical Entities not supported by this mod (LevelShutdown) - Reverting to networkable entities only");
return; return;
} }
if (!addr) if (!addr)
{ {
g_Logger.LogError("Failed lookup of LevelShutdown - Reverting to networkable entities only"); g_Logger.LogError("Failed lookup of LevelShutdown - Reverting to networkable entities only");
return; return;
} }
int offset;
if (!g_pGameConf->GetOffset("gEntList", &offset)) if (!g_pGameConf->GetOffset("gEntList", &offset))
{ {
g_Logger.LogError("Logical Entities not supported by this mod (gEntList) - Reverting to networkable entities only"); g_Logger.LogError("Logical Entities not supported by this mod (gEntList) - Reverting to networkable entities only");
return; return;
} }
g_EntList = *reinterpret_cast<void **>(addr + offset); g_EntList = *reinterpret_cast<void **>(addr + offset);
#elif defined PLATFORM_LINUX
/* gEntList and/or g_pEntityList */
if (!g_pGameConf->GetMemSig("gEntList", (void **)&addr))
{
g_Logger.LogError("Logical Entities not supported by this mod (gEntList) - Reverting to networkable entities only");
return;
} }
if (!addr)
if (!g_EntList)
{ {
g_Logger.LogError("Failed lookup of gEntList - Reverting to networkable entities only"); g_Logger.LogError("Failed lookup of gEntList - Reverting to networkable entities only");
return; return;
} }
g_EntList = reinterpret_cast<void *>(addr);
#endif
if (!g_pGameConf->GetOffset("EntInfo", &entInfoOffset)) if (!g_pGameConf->GetOffset("EntInfo", &entInfoOffset))
{ {
@@ -172,7 +196,7 @@ void CHalfLife2::OnSourceModAllInitialized_Post()
} }
} }
#if !defined METAMOD_PLAPI_VERSION #if !defined METAMOD_PLAPI_VERSION || PLAPI_VERSION < 11
bool CHalfLife2::IsOriginalEngine() bool CHalfLife2::IsOriginalEngine()
{ {
return is_original_engine; return is_original_engine;
@@ -543,7 +567,7 @@ bool CHalfLife2::IsLANServer()
bool CHalfLife2::KVLoadFromFile(KeyValues *kv, IBaseFileSystem *filesystem, const char *resourceName, const char *pathID) bool CHalfLife2::KVLoadFromFile(KeyValues *kv, IBaseFileSystem *filesystem, const char *resourceName, const char *pathID)
{ {
#if defined METAMOD_PLAPI_VERSION #if defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11
if (g_SMAPI->GetSourceEngineBuild() == SOURCE_ENGINE_ORIGINAL) if (g_SMAPI->GetSourceEngineBuild() == SOURCE_ENGINE_ORIGINAL)
#else #else
if (strcasecmp(g_SourceMod.GetGameFolderName(), "ship") == 0) if (strcasecmp(g_SourceMod.GetGameFolderName(), "ship") == 0)
@@ -668,7 +692,10 @@ edict_t *CHalfLife2::GetHandleEntity(CBaseHandle &hndl)
edict_t *pStoredEdict; edict_t *pStoredEdict;
CBaseEntity *pStoredEntity; CBaseEntity *pStoredEntity;
pStoredEdict = GetEntity(index, &pStoredEntity); if (!IndexToAThings(index, &pStoredEntity, &pStoredEdict))
{
return NULL;
}
if (pStoredEdict == NULL || pStoredEntity == NULL) if (pStoredEdict == NULL || pStoredEntity == NULL)
{ {
@@ -760,6 +787,12 @@ CBaseEntity *CHalfLife2::ReferenceToEntity(cell_t entRef)
*/ */
CEntInfo *CHalfLife2::LookupEntity(int entIndex) CEntInfo *CHalfLife2::LookupEntity(int entIndex)
{ {
// Make sure that our index is within the bounds of the global ent array
if (entIndex < 0 || entIndex >= NUM_ENT_ENTRIES)
{
return NULL;
}
if (!g_EntList || entInfoOffset == -1) if (!g_EntList || entInfoOffset == -1)
{ {
/* Attempt to use engine interface instead */ /* Attempt to use engine interface instead */
@@ -881,3 +914,9 @@ void *CHalfLife2::GetGlobalEntityList()
{ {
return g_EntList; return g_EntList;
} }
int CHalfLife2::GetSendPropOffset(SendProp *prop)
{
return prop->GetOffset();
}
+3 -2
View File
@@ -135,6 +135,7 @@ public: //IGameHelpers
CEntInfo *LookupEntity(int entIndex); CEntInfo *LookupEntity(int entIndex);
cell_t EntityToBCompatRef(CBaseEntity *pEntity); cell_t EntityToBCompatRef(CBaseEntity *pEntity);
void *GetGlobalEntityList(); void *GetGlobalEntityList();
int GetSendPropOffset(SendProp *prop);
public: public:
void AddToFakeCliCmdQueue(int client, int userid, const char *cmd); void AddToFakeCliCmdQueue(int client, int userid, const char *cmd);
void ProcessFakeCliCmdQueue(); void ProcessFakeCliCmdQueue();
@@ -145,7 +146,7 @@ public:
const char *CurrentCommandName(); const char *CurrentCommandName();
void AddDelayedKick(int client, int userid, const char *msg); void AddDelayedKick(int client, int userid, const char *msg);
void ProcessDelayedKicks(); void ProcessDelayedKicks();
#if !defined METAMOD_PLAPI_VERSION #if !defined METAMOD_PLAPI_VERSION || PLAPI_VERSION < 11
bool IsOriginalEngine(); bool IsOriginalEngine();
#endif #endif
private: private:
@@ -166,6 +167,6 @@ private:
extern CHalfLife2 g_HL2; extern CHalfLife2 g_HL2;
edict_t *GetEntity(cell_t num, CBaseEntity **pData); bool IndexToAThings(cell_t, CBaseEntity **pEntData, edict_t **pEdictData);
#endif //_INCLUDE_SOURCEMOD_CHALFLIFE2_H_ #endif //_INCLUDE_SOURCEMOD_CHALFLIFE2_H_
+44 -3
View File
@@ -620,6 +620,43 @@ HandleError HandleSystem::CloneHandle(Handle_t handle, Handle_t *newhandle, Iden
return CloneHandle(pHandle, index, newhandle, newOwner); return CloneHandle(pHandle, index, newhandle, newOwner);
} }
Handle_t HandleSystem::FastCloneHandle(QHandle *pHandle, unsigned int index)
{
if (pHandle->clone)
return FastCloneHandle(&m_Handles[pHandle->clone], pHandle->clone);
Handle_t hndl;
if (CloneHandle(pHandle, index, &hndl, g_pCoreIdent) != HandleError_None)
return BAD_HANDLE;
return hndl;
}
Handle_t HandleSystem::FastCloneHandle(Handle_t hndl)
{
QHandle *pHandle;
unsigned int index;
GetHandleUnchecked(hndl, pHandle, index);
return FastCloneHandle(pHandle, index);
}
void HandleSystem::GetHandleUnchecked(Handle_t hndl, QHandle *& pHandle, unsigned int &index)
{
#ifndef NDEBUG
unsigned int serial = (hndl >> 16);
#endif
index = (hndl & HANDLESYS_HANDLE_MASK);
assert(index != 0 && index <= m_HandleTail && index < HANDLESYS_MAX_HANDLES);
pHandle = &m_Handles[index];
assert(pHandle->set && pHandle->set != HandleSet_Freed);
assert(pHandle->serial == serial);
}
HandleError HandleSystem::FreeHandle(QHandle *pHandle, unsigned int index) HandleError HandleSystem::FreeHandle(QHandle *pHandle, unsigned int index)
{ {
QHandleType *pType = &m_Types[pHandle->type]; QHandleType *pType = &m_Types[pHandle->type];
@@ -950,6 +987,10 @@ bool HandleSystem::InitAccessDefaults(TypeAccess *pTypeAccess, HandleAccess *pHa
return true; return true;
} }
#define HANDLE_LOG_VERY_BAD(message, ...) \
g_Logger.LogFatal(message, ##__VA_ARGS__); \
g_Logger.LogError(message, ##__VA_ARGS__);
bool HandleSystem::TryAndFreeSomeHandles() bool HandleSystem::TryAndFreeSomeHandles()
{ {
IPluginIterator *pl_iter = g_PluginSys.GetPluginIterator(); IPluginIterator *pl_iter = g_PluginSys.GetPluginIterator();
@@ -995,9 +1036,9 @@ bool HandleSystem::TryAndFreeSomeHandles()
return false; return false;
} }
g_Logger.LogFatal("[SM] MEMORY LEAK DETECTED IN PLUGIN (file \"%s\")", highest_owner->GetFilename()); HANDLE_LOG_VERY_BAD("[SM] MEMORY LEAK DETECTED IN PLUGIN (file \"%s\")", highest_owner->GetFilename());
g_Logger.LogFatal("[SM] Unloading plugin to free %d handles.", highest_handle_count); HANDLE_LOG_VERY_BAD("[SM] Unloading plugin to free %d handles.", highest_handle_count);
g_Logger.LogFatal("[SM] Contact the author(s) of this plugin to correct this error.", highest_handle_count); HANDLE_LOG_VERY_BAD("[SM] Contact the author(s) of this plugin to correct this error.", highest_handle_count);
highest_owner->GetBaseContext()->ThrowNativeErrorEx(SP_ERROR_MEMACCESS, "Memory leak"); highest_owner->GetBaseContext()->ThrowNativeErrorEx(SP_ERROR_MEMACCESS, "Memory leak");
+29
View File
@@ -160,6 +160,9 @@ public: //IHandleSystem
HandleError *err); HandleError *err);
void Dump(HANDLE_REPORTER rep); void Dump(HANDLE_REPORTER rep);
/* Bypasses security checks. */
Handle_t FastCloneHandle(Handle_t hndl);
protected: protected:
/** /**
* Decodes a handle with sanity and security checking. * Decodes a handle with sanity and security checking.
@@ -170,6 +173,9 @@ protected:
unsigned int *index, unsigned int *index,
bool ignoreFree=false); bool ignoreFree=false);
Handle_t FastCloneHandle(QHandle *pHandle, unsigned int index);
void GetHandleUnchecked(Handle_t hndl, QHandle *& pHandle, unsigned int &index);
/** /**
* Creates a basic handle and sets its reference count to 1. * Creates a basic handle and sets its reference count to 1.
* Does not do any type or security checking. * Does not do any type or security checking.
@@ -222,4 +228,27 @@ private:
extern HandleSystem g_HandleSys; extern HandleSystem g_HandleSys;
struct AutoHandleRooter
{
public:
AutoHandleRooter(Handle_t hndl)
{
if (hndl != BAD_HANDLE)
this->hndl = g_HandleSys.FastCloneHandle(hndl);
else
this->hndl = BAD_HANDLE;
}
~AutoHandleRooter()
{
if (hndl != BAD_HANDLE)
{
HandleSecurity sec(g_pCoreIdent, g_pCoreIdent);
g_HandleSys.FreeHandle(hndl, &sec);
}
}
private:
Handle_t hndl;
};
#endif //_INCLUDE_SOURCEMOD_HANDLESYSTEM_H_ #endif //_INCLUDE_SOURCEMOD_HANDLESYSTEM_H_
+2 -2
View File
@@ -241,7 +241,7 @@ bool LibrarySystem::IsPathDirectory(const char *path)
return true; return true;
} }
#elif defined PLATFORM_LINUX #elif defined PLATFORM_POSIX
struct stat s; struct stat s;
if (stat(path, &s) != 0) if (stat(path, &s) != 0)
@@ -410,7 +410,7 @@ size_t LibrarySystem::GetFileFromPath(char *buffer, size_t maxlength, const char
size_t length = strlen(path); size_t length = strlen(path);
for (size_t i = length - 1; for (size_t i = length - 1;
i >= 0 && i <= length - 1; i <= length - 1;
i--) i--)
{ {
if (path[i] == '/' if (path[i] == '/'
+64 -38
View File
@@ -2,31 +2,30 @@
# Makefile written by David "BAILOPAN" Anderson # Makefile written by David "BAILOPAN" Anderson
SMSDK = .. SMSDK = ..
SRCDS_BASE = ~/srcds
HL2SDK_ORIG = ../../hl2sdk HL2SDK_ORIG = ../../hl2sdk
HL2SDK_OB = ../../hl2sdk-ob HL2SDK_OB = ../../hl2sdk-ob
HL2SDK_OB_VALVE = ../../hl2sdk-ob-valve HL2SDK_OB_VALVE = ../../hl2sdk-ob-valve
HL2SDK_L4D = ../../hl2sdk-l4d HL2SDK_L4D = ../../hl2sdk-l4d
MMSOURCE17 = ../../mmsource-1.7 HL2SDK_L4D2 = ../../hl2sdk-l4d2
MMSOURCE = ../../mmsource-central
##################################### #####################################
### EDIT BELOW FOR OTHER PROJECTS ### ### EDIT BELOW FOR OTHER PROJECTS ###
##################################### #####################################
OBJECTS = AdminCache.cpp CDataPack.cpp ConCmdManager.cpp ConVarManager.cpp CoreConfig.cpp \ OBJECTS = AdminCache.cpp CDataPack.cpp ConCmdManager.cpp ConVarManager.cpp CoreConfig.cpp \
Database.cpp DebugReporter.cpp EventManager.cpp GameConfigs.cpp HalfLife2.cpp Logger.cpp \ Database.cpp DebugReporter.cpp EventManager.cpp HalfLife2.cpp Logger.cpp \
MemoryUtils.cpp PlayerManager.cpp TimerSys.cpp Translator.cpp UserMessages.cpp \ PlayerManager.cpp TimerSys.cpp UserMessages.cpp \
sm_autonatives.cpp sm_memtable.cpp sm_srvcmds.cpp sm_stringutil.cpp sm_trie.cpp \ sm_autonatives.cpp sm_srvcmds.cpp sm_stringutil.cpp sm_trie.cpp \
sourcemm_api.cpp sourcemod.cpp MenuStyle_Base.cpp MenuStyle_Valve.cpp MenuManager.cpp \ sourcemm_api.cpp sourcemod.cpp MenuStyle_Base.cpp MenuStyle_Valve.cpp MenuManager.cpp \
MenuStyle_Radio.cpp ChatTriggers.cpp ADTFactory.cpp MenuVoting.cpp sm_crc32.cpp \ MenuStyle_Radio.cpp ChatTriggers.cpp ADTFactory.cpp MenuVoting.cpp \
frame_hooks.cpp concmd_cleaner.cpp PhraseCollection.cpp NextMap.cpp \ frame_hooks.cpp concmd_cleaner.cpp NextMap.cpp \
NativeOwner.cpp logic_bridge.cpp ConsoleDetours.cpp NativeOwner.cpp logic_bridge.cpp ConsoleDetours.cpp
OBJECTS += smn_admin.cpp smn_bitbuffer.cpp smn_console.cpp smn_core.cpp \ OBJECTS += smn_bitbuffer.cpp smn_console.cpp smn_core.cpp \
smn_datapacks.cpp smn_entities.cpp smn_events.cpp smn_fakenatives.cpp \ smn_entities.cpp smn_events.cpp smn_fakenatives.cpp \
smn_filesystem.cpp smn_gameconfigs.cpp smn_halflife.cpp \ smn_filesystem.cpp smn_halflife.cpp \
smn_handles.cpp smn_keyvalues.cpp smn_banning.cpp \ smn_keyvalues.cpp smn_player.cpp \
smn_lang.cpp smn_player.cpp smn_string.cpp smn_timers.cpp \ smn_usermsgs.cpp smn_menus.cpp smn_vector.cpp \
smn_usermsgs.cpp smn_menus.cpp smn_database.cpp smn_vector.cpp \
smn_hudtext.cpp smn_nextmap.cpp smn_hudtext.cpp smn_nextmap.cpp
OBJECTS += ExtensionSys.cpp \ OBJECTS += ExtensionSys.cpp \
ForwardSys.cpp \ ForwardSys.cpp \
@@ -48,55 +47,81 @@ CPP_GCC4_FLAGS = -fvisibility-inlines-hidden
CPP = gcc CPP = gcc
override ENGSET = false override ENGSET = false
ifneq (,$(filter original orangebox orangeboxvalve left4dead left4dead2,$(ENGINE)))
override ENGSET = true
endif
ifeq "$(ENGINE)" "original" ifeq "$(ENGINE)" "original"
HL2SDK = $(HL2SDK_ORIG) HL2SDK = $(HL2SDK_ORIG)
HL2PUB = $(HL2SDK)/public
HL2LIB = $(HL2SDK)/linux_sdk HL2LIB = $(HL2SDK)/linux_sdk
CFLAGS += -DSOURCE_ENGINE=1 CFLAGS += -DSOURCE_ENGINE=1
METAMOD = $(MMSOURCE17)/core-legacy METAMOD = $(MMSOURCE)/core-legacy
INCLUDE += -I$(HL2SDK)/public/dlls INCLUDE += -I$(HL2SDK)/public/dlls
SRCDS = $(SRCDS_BASE)
BINARY = sourcemod.1.ep1.so BINARY = sourcemod.1.ep1.so
override ENGSET = true
endif endif
ifeq "$(ENGINE)" "orangebox" ifeq "$(ENGINE)" "orangebox"
HL2SDK = $(HL2SDK_OB) HL2SDK = $(HL2SDK_OB)
HL2PUB = $(HL2SDK)/public
HL2LIB = $(HL2SDK)/lib/linux HL2LIB = $(HL2SDK)/lib/linux
CFLAGS += -DSOURCE_ENGINE=3 CFLAGS += -DSOURCE_ENGINE=3
METAMOD = $(MMSOURCE17)/core METAMOD = $(MMSOURCE)/core
INCLUDE += -I$(HL2SDK)/public/game/server INCLUDE += -I$(HL2SDK)/public/game/server
SRCDS = $(SRCDS_BASE)/orangebox
BINARY = sourcemod.2.ep2.so BINARY = sourcemod.2.ep2.so
override ENGSET = true
endif endif
ifeq "$(ENGINE)" "orangeboxvalve" ifeq "$(ENGINE)" "orangeboxvalve"
HL2SDK = $(HL2SDK_OB_VALVE) HL2SDK = $(HL2SDK_OB_VALVE)
HL2PUB = $(HL2SDK)/public
HL2LIB = $(HL2SDK)/lib/linux HL2LIB = $(HL2SDK)/lib/linux
CFLAGS += -DSOURCE_ENGINE=4 CFLAGS += -DSOURCE_ENGINE=6
METAMOD = $(MMSOURCE17)/core METAMOD = $(MMSOURCE)/core
INCLUDE += -I$(HL2SDK)/public/game/server -I$(HL2SDK)/common INCLUDE += -I$(HL2SDK)/public/game/server
SRCDS = $(SRCDS_BASE)/orangebox #-I$(HL2SDK)/common
BINARY = sourcemod.2.ep2v.so BINARY = sourcemod.2.ep2v.so
override ENGSET = true
endif endif
ifeq "$(ENGINE)" "left4dead" ifeq "$(ENGINE)" "left4dead"
HL2SDK = $(HL2SDK_L4D) HL2SDK = $(HL2SDK_L4D)
HL2PUB = $(HL2SDK)/public
HL2LIB = $(HL2SDK)/lib/linux HL2LIB = $(HL2SDK)/lib/linux
CFLAGS += -DSOURCE_ENGINE=5 CFLAGS += -DSOURCE_ENGINE=7
METAMOD = $(MMSOURCE17)/core METAMOD = $(MMSOURCE)/core
INCLUDE += -I$(HL2SDK)/public/game/server INCLUDE += -I$(HL2SDK)/public/game/server
SRCDS = $(SRCDS_BASE)/l4d
BINARY = sourcemod.2.l4d.so BINARY = sourcemod.2.l4d.so
override ENGSET = true endif
ifeq "$(ENGINE)" "left4dead2"
HL2SDK = $(HL2SDK_L4D2)
HL2LIB = $(HL2SDK)/lib/linux
CFLAGS += -DSOURCE_ENGINE=8
METAMOD = $(MMSOURCE)/core
INCLUDE += -I$(HL2SDK)/public/game/server
BINARY = sourcemod.2.l4d2.so
endif endif
CFLAGS += -DSE_EPISODEONE=1 -DSE_DARKMESSIAH=2 -DSE_ORANGEBOX=3 -DSE_ORANGEBOXVALVE=4 -DSE_LEFT4DEAD=5 HL2PUB = $(HL2SDK)/public
LINK += $(HL2LIB)/tier1_i486.a $(HL2LIB)/mathlib_i486.a vstdlib_i486.so \ OS := $(shell uname -s)
tier0_i486.so -static-libgcc
ifeq "$(OS)" "Darwin"
LIB_EXT = dylib
HL2LIB = $(HL2SDK)/lib/mac
else
LIB_EXT = so
ifeq "$(ENGINE)" "original"
HL2LIB = $(HL2SDK)/linux_sdk
else
HL2LIB = $(HL2SDK)/lib/linux
endif
endif
ifneq (,$(filter original orangebox left4dead,$(ENGINE)))
LIB_SUFFIX = _i486.$(LIB_EXT)
else
LIB_PREFIX = lib
LIB_SUFFIX = .$(LIB_EXT)
endif
CFLAGS += -DSE_EPISODEONE=1 -DSE_DARKMESSIAH=2 -DSE_ORANGEBOX=3 -DSE_BLOODYGOODTIME=4 -DSE_EYE=5 \
-DSE_ORANGEBOXVALVE=6 -DSE_LEFT4DEAD=7 -DSE_LEFT4DEAD2=8 -DSE_ALIENSWARM=9
LINK += $(HL2LIB)/tier1_i486.a $(HL2LIB)/mathlib_i486.a $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) \
$(LIB_PREFIX)tier0$(LIB_SUFFIX) -static-libgcc
INCLUDE += -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/mathlib -I$(HL2PUB)/vstdlib \ INCLUDE += -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/mathlib -I$(HL2PUB)/vstdlib \
-I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 -I$(METAMOD) -I$(METAMOD)/sourcehook \ -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 -I$(METAMOD) -I$(METAMOD)/sourcehook \
@@ -136,13 +161,14 @@ $(BIN_DIR)/%.o: %.c
all: check all: check
mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)
ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so; ln -sf $(HL2LIB)/$(LIB_PREFIX)vstdlib$(LIB_SUFFIX)
ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so; ln -sf $(HL2LIB)/$(LIB_PREFIX)tier0$(LIB_SUFFIX)
$(MAKE) -f Makefile sourcemod $(MAKE) -f Makefile sourcemod
check: check:
if [ "$(ENGSET)" = "false" ]; then \ if [ "$(ENGSET)" = "false" ]; then \
echo "You must supply ENGINE=left4dead or ENGINE=orangebox or ENGINE=original"; \ echo "You must supply one of the following values for ENGINE:"; \
echo "left4dead2, left4dead, orangeboxvalve, orangebox, or original"; \
exit 1; \ exit 1; \
fi fi
-220
View File
@@ -1,220 +0,0 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include "MemoryUtils.h"
#include "ShareSys.h"
#ifdef PLATFORM_LINUX
#include <string.h>
#include <elf.h>
#endif
MemoryUtils g_MemUtils;
#if 0
MemoryUtils::MemoryUtils()
{
#ifdef PLATFORM_WINDOWS
SYSTEM_INFO info;
GetSystemInfo(&info);
m_PageSize = info.dwPageSize;
#elif defined PLATFORM_POSIX
m_PageSize = sysconf(_SC_PAGE_SIZE);
#endif
}
#endif
void MemoryUtils::OnSourceModAllInitialized()
{
g_ShareSys.AddInterface(NULL, this);
}
void *MemoryUtils::FindPattern(const void *libPtr, const char *pattern, size_t len)
{
DynLibInfo lib;
bool found;
char *ptr, *end;
memset(&lib, 0, sizeof(DynLibInfo));
if (!GetLibraryInfo(libPtr, lib))
{
return NULL;
}
ptr = reinterpret_cast<char *>(lib.baseAddress);
end = ptr + lib.memorySize;
while (ptr < end)
{
found = true;
for (register size_t i = 0; i < len; i++)
{
if (pattern[i] != '\x2A' && pattern[i] != ptr[i])
{
found = false;
break;
}
}
if (found)
return ptr;
ptr++;
}
return NULL;
}
bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib)
{
unsigned long baseAddr;
if (libPtr == NULL)
{
return false;
}
#ifdef PLATFORM_WINDOWS
MEMORY_BASIC_INFORMATION info;
IMAGE_DOS_HEADER *dos;
IMAGE_NT_HEADERS *pe;
IMAGE_FILE_HEADER *file;
IMAGE_OPTIONAL_HEADER *opt;
if (!VirtualQuery(libPtr, &info, sizeof(MEMORY_BASIC_INFORMATION)))
{
return false;
}
baseAddr = reinterpret_cast<unsigned long>(info.AllocationBase);
/* All this is for our insane sanity checks :o */
dos = reinterpret_cast<IMAGE_DOS_HEADER *>(baseAddr);
pe = reinterpret_cast<IMAGE_NT_HEADERS *>(baseAddr + dos->e_lfanew);
file = &pe->FileHeader;
opt = &pe->OptionalHeader;
/* Check PE magic and signature */
if (dos->e_magic != IMAGE_DOS_SIGNATURE || pe->Signature != IMAGE_NT_SIGNATURE || opt->Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
{
return false;
}
/* Check architecture, which is 32-bit/x86 right now
* Should change this for 64-bit if Valve gets their act together
*/
if (file->Machine != IMAGE_FILE_MACHINE_I386)
{
return false;
}
/* For our purposes, this must be a dynamic library */
if ((file->Characteristics & IMAGE_FILE_DLL) == 0)
{
return false;
}
/* Finally, we can do this */
lib.memorySize = opt->SizeOfImage;
#elif defined PLATFORM_LINUX
Dl_info info;
Elf32_Ehdr *file;
Elf32_Phdr *phdr;
uint16_t phdrCount;
if (!dladdr(libPtr, &info))
{
return false;
}
if (!info.dli_fbase || !info.dli_fname)
{
return false;
}
/* This is for our insane sanity checks :o */
baseAddr = reinterpret_cast<unsigned long>(info.dli_fbase);
file = reinterpret_cast<Elf32_Ehdr *>(baseAddr);
/* Check ELF magic */
if (memcmp(ELFMAG, file->e_ident, SELFMAG) != 0)
{
return false;
}
/* Check ELF version */
if (file->e_ident[EI_VERSION] != EV_CURRENT)
{
return false;
}
/* Check ELF architecture, which is 32-bit/x86 right now
* Should change this for 64-bit if Valve gets their act together
*/
if (file->e_ident[EI_CLASS] != ELFCLASS32 || file->e_machine != EM_386 || file->e_ident[EI_DATA] != ELFDATA2LSB)
{
return false;
}
/* For our purposes, this must be a dynamic library/shared object */
if (file->e_type != ET_DYN)
{
return false;
}
phdrCount = file->e_phnum;
phdr = reinterpret_cast<Elf32_Phdr *>(baseAddr + file->e_phoff);
/* Add up the memory sizes of segments marked as PT_LOAD as those are the only ones that should be in memory */
for (uint16_t i = 0; i < phdrCount; i++)
{
Elf32_Phdr &hdr = phdr[i];
if (hdr.p_type == PT_LOAD)
{
lib.memorySize += hdr.p_memsz;
}
}
#endif
lib.baseAddress = reinterpret_cast<void *>(baseAddr);
return true;
}
+25 -5
View File
@@ -41,7 +41,7 @@
#include "ShareSys.h" #include "ShareSys.h"
#include "HandleSys.h" #include "HandleSys.h"
#include "sourcemm_api.h" #include "sourcemm_api.h"
#include "Translator.h" #include "logic_bridge.h"
MenuManager g_Menus; MenuManager g_Menus;
VoteMenuHandler s_VoteHandler; VoteMenuHandler s_VoteHandler;
@@ -231,6 +231,7 @@ IMenuPanel *MenuManager::RenderMenu(int client, menu_states_t &md, ItemOrder ord
unsigned int pgn = menu->GetPagination(); unsigned int pgn = menu->GetPagination();
unsigned int maxItems = style->GetMaxPageItems(); unsigned int maxItems = style->GetMaxPageItems();
bool exitButton = (menu->GetMenuOptionFlags() & MENUFLAG_BUTTON_EXIT) == MENUFLAG_BUTTON_EXIT; bool exitButton = (menu->GetMenuOptionFlags() & MENUFLAG_BUTTON_EXIT) == MENUFLAG_BUTTON_EXIT;
bool novoteButton = (menu->GetMenuOptionFlags() & MENUFLAG_BUTTON_NOVOTE) == MENUFLAG_BUTTON_NOVOTE;
if (pgn != MENU_NO_PAGINATION) if (pgn != MENU_NO_PAGINATION)
{ {
@@ -241,6 +242,11 @@ IMenuPanel *MenuManager::RenderMenu(int client, menu_states_t &md, ItemOrder ord
maxItems--; maxItems--;
} }
if (novoteButton)
{
maxItems--;
}
/* This is very not allowed! */ /* This is very not allowed! */
if (maxItems < 2) if (maxItems < 2)
{ {
@@ -436,6 +442,20 @@ skip_search:
/* Draw the item according to the order */ /* Draw the item according to the order */
menu_slots_t *slots = md.slots; menu_slots_t *slots = md.slots;
unsigned int position = 0; /* Keep track of the last position */ unsigned int position = 0; /* Keep track of the last position */
if (novoteButton)
{
char text[50];
if (!logicore.CoreTranslate(text, sizeof(text), "%T", 2, NULL, "No Vote", &client))
{
UTIL_Format(text, sizeof(text), "No Vote");
}
ItemDrawInfo dr(text, 0);
position = panel->DrawItem(dr);
slots[position].type = ItemSel_Exit;
position++;
}
if (order == ItemOrder_Ascending) if (order == ItemOrder_Ascending)
{ {
md.item_on_page = drawItems[0].position; md.item_on_page = drawItems[0].position;
@@ -586,7 +606,7 @@ skip_search:
{ {
if (exitBackButton) if (exitBackButton)
{ {
if (!CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Back", &client)) if (!logicore.CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Back", &client))
{ {
UTIL_Format(text, sizeof(text), "Back"); UTIL_Format(text, sizeof(text), "Back");
} }
@@ -596,7 +616,7 @@ skip_search:
} }
else else
{ {
if (!CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Previous", &client)) if (!logicore.CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Previous", &client))
{ {
UTIL_Format(text, sizeof(text), "Previous"); UTIL_Format(text, sizeof(text), "Previous");
} }
@@ -617,7 +637,7 @@ skip_search:
/* NEXT */ /* NEXT */
if (displayNext || canDrawDisabled) if (displayNext || canDrawDisabled)
{ {
if (!CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Next", &client)) if (!logicore.CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Next", &client))
{ {
UTIL_Format(text, sizeof(text), "Next"); UTIL_Format(text, sizeof(text), "Next");
} }
@@ -648,7 +668,7 @@ skip_search:
/* EXIT */ /* EXIT */
if (exitButton) if (exitButton)
{ {
if (!CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Exit", &client)) if (!logicore.CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Exit", &client))
{ {
UTIL_Format(text, sizeof(text), "Exit"); UTIL_Format(text, sizeof(text), "Exit");
} }
+3
View File
@@ -377,6 +377,9 @@ void BaseMenuStyle::ClientPressedKey(int client, unsigned int key_press)
RemoveClientFromWatch(client); RemoveClientFromWatch(client);
} }
Handle_t hndl = menu ? menu->GetHandle() : BAD_HANDLE;
AutoHandleRooter ahr(hndl);
if (cancel) if (cancel)
{ {
mh->OnMenuCancel(menu, client, reason); mh->OnMenuCancel(menu, client, reason);
+2 -1
View File
@@ -32,11 +32,12 @@
#include "MenuStyle_Radio.h" #include "MenuStyle_Radio.h"
#include "sm_stringutil.h" #include "sm_stringutil.h"
#include "UserMessages.h" #include "UserMessages.h"
#include "GameConfigs.h" #include <IGameConfigs.h>
#include "PlayerManager.h" #include "PlayerManager.h"
#if defined MENU_DEBUG #if defined MENU_DEBUG
#include "Logger.h" #include "Logger.h"
#endif #endif
#include "logic_bridge.h"
extern const char *g_RadioNumTable[]; extern const char *g_RadioNumTable[];
CRadioStyle g_RadioMenuStyle; CRadioStyle g_RadioMenuStyle;
-1
View File
@@ -32,7 +32,6 @@
#include "sm_stringutil.h" #include "sm_stringutil.h"
#include "PlayerManager.h" #include "PlayerManager.h"
#include "MenuStyle_Valve.h" #include "MenuStyle_Valve.h"
#include "Translator.h"
#include "PlayerManager.h" #include "PlayerManager.h"
#include "ConCmdManager.h" #include "ConCmdManager.h"
+11 -6
View File
@@ -39,7 +39,8 @@
#include <HalfLife2.h> #include <HalfLife2.h>
#include <mathlib.h> #include <mathlib.h>
#include <const.h> #include <const.h>
#include <Translator.h> #include <ITranslator.h>
#include "logic_bridge.h"
float g_next_vote = 0.0f; float g_next_vote = 0.0f;
@@ -526,7 +527,8 @@ void VoteMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int ite
if (sm_vote_console.GetBool()) if (sm_vote_console.GetBool())
{ {
int target = SOURCEMOD_SERVER_LANGUAGE; int target = SOURCEMOD_SERVER_LANGUAGE;
CoreTranslate(buffer, sizeof(buffer), "[SM] %T", 4, NULL, "Voted For", &target, g_Players.GetPlayerByIndex(client)->GetName(), dr.display); logicore.CoreTranslate(buffer, sizeof(buffer), "[SM] %T", 4, NULL, "Voted For",
&target, g_Players.GetPlayerByIndex(client)->GetName(), dr.display);
Engine_LogPrintWrapper(buffer); Engine_LogPrintWrapper(buffer);
} }
@@ -538,15 +540,17 @@ void VoteMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int ite
CPlayer *pPlayer = g_Players.GetPlayerByIndex(i); CPlayer *pPlayer = g_Players.GetPlayerByIndex(i);
assert(pPlayer); assert(pPlayer);
if (pPlayer->IsInGame()) if (pPlayer->IsInGame() && !pPlayer->IsFakeClient())
{ {
if (m_Revoting[client]) if (m_Revoting[client])
{ {
CoreTranslate(buffer, sizeof(buffer), "[SM] %T", 4, NULL, "Changed Vote", &i, g_Players.GetPlayerByIndex(client)->GetName(), dr.display); logicore.CoreTranslate(buffer, sizeof(buffer), "[SM] %T", 4, NULL, "Changed Vote",
&i, g_Players.GetPlayerByIndex(client)->GetName(), dr.display);
} }
else else
{ {
CoreTranslate(buffer, sizeof(buffer), "[SM] %T", 4, NULL, "Voted For", &i, g_Players.GetPlayerByIndex(client)->GetName(), dr.display); logicore.CoreTranslate(buffer, sizeof(buffer), "[SM] %T", 4, NULL, "Voted For",
&i, g_Players.GetPlayerByIndex(client)->GetName(), dr.display);
} }
if (sm_vote_chat.GetBool()) if (sm_vote_chat.GetBool())
@@ -634,7 +638,8 @@ void VoteMenuHandler::DrawHintProgress()
{ {
if (g_Players.GetPlayerByIndex(i)->IsInGame()) if (g_Players.GetPlayerByIndex(i)->IsInGame())
{ {
CoreTranslate(buffer, sizeof(buffer), "%T%s", 6, NULL, "Vote Count", &i, &m_NumVotes, &m_TotalClients, &iTimeRemaining, &m_leaderList); logicore.CoreTranslate(buffer, sizeof(buffer), "%T%s", 6, NULL, "Vote Count",
&i, &m_NumVotes, &m_TotalClients, &iTimeRemaining, &m_leaderList);
g_HL2.HintTextMsg(i, buffer); g_HL2.HintTextMsg(i, buffer);
} }
} }
+5 -1
View File
@@ -49,7 +49,11 @@ SH_DECL_EXTERN1_void(ConCommand, Dispatch, SH_NOATTRIB, false, const CCommand &)
#elif SOURCE_ENGINE == SE_DARKMESSIAH #elif SOURCE_ENGINE == SE_DARKMESSIAH
SH_DECL_EXTERN0_void(ConCommand, Dispatch, SH_NOATTRIB, false); SH_DECL_EXTERN0_void(ConCommand, Dispatch, SH_NOATTRIB, false);
#else #else
extern bool __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>); # if SH_IMPL_VERSION >= 4
extern int __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
# else
extern bool __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
#endif
extern bool __SourceHook_FHRemoveConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>); extern bool __SourceHook_FHRemoveConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
#endif #endif
+146 -49
View File
@@ -39,23 +39,24 @@
#include "sm_stringutil.h" #include "sm_stringutil.h"
#include "CoreConfig.h" #include "CoreConfig.h"
#include "TimerSys.h" #include "TimerSys.h"
#include "Translator.h"
#include "Logger.h" #include "Logger.h"
#include "ChatTriggers.h" #include "ChatTriggers.h"
#include "HalfLife2.h" #include "HalfLife2.h"
#include <inetchannel.h> #include <inetchannel.h>
#include <iclient.h> #include <iclient.h>
#include "GameConfigs.h" #include <tier0/icommandline.h>
#include <IGameConfigs.h>
#include "ExtensionSys.h" #include "ExtensionSys.h"
#include <sourcemod_version.h> #include <sourcemod_version.h>
#include "ConsoleDetours.h" #include "ConsoleDetours.h"
#include "logic_bridge.h"
PlayerManager g_Players; PlayerManager g_Players;
bool g_OnMapStarted = false; bool g_OnMapStarted = false;
IForward *PreAdminCheck = NULL; IForward *PreAdminCheck = NULL;
IForward *PostAdminCheck = NULL; IForward *PostAdminCheck = NULL;
IForward *PostAdminFilter = NULL; IForward *PostAdminFilter = NULL;
IForward *OnClientConnected = NULL;
const unsigned int *g_NumPlayersToAuth = NULL; const unsigned int *g_NumPlayersToAuth = NULL;
int lifestate_offset = -1; int lifestate_offset = -1;
List<ICommandTargetProcessor *> target_processors; List<ICommandTargetProcessor *> target_processors;
@@ -76,7 +77,11 @@ SH_DECL_EXTERN1_void(ConCommand, Dispatch, SH_NOATTRIB, false, const CCommand &)
#elif SOURCE_ENGINE == SE_DARKMESSIAH #elif SOURCE_ENGINE == SE_DARKMESSIAH
SH_DECL_EXTERN0_void(ConCommand, Dispatch, SH_NOATTRIB, false); SH_DECL_EXTERN0_void(ConCommand, Dispatch, SH_NOATTRIB, false);
#else #else
extern bool __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>); # if SH_IMPL_VERSION >= 4
extern int __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
# else
extern bool __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
# endif
extern bool __SourceHook_FHRemoveConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>); extern bool __SourceHook_FHRemoveConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
#endif #endif
@@ -109,6 +114,9 @@ PlayerManager::PlayerManager()
m_FirstPass = false; m_FirstPass = false;
m_maxClients = 0; m_maxClients = 0;
m_SourceTVUserId = -1;
m_ReplayUserId = -1;
m_UserIdLookUp = new int[USHRT_MAX+1]; m_UserIdLookUp = new int[USHRT_MAX+1];
memset(m_UserIdLookUp, 0, sizeof(int) * (USHRT_MAX+1)); memset(m_UserIdLookUp, 0, sizeof(int) * (USHRT_MAX+1));
} }
@@ -138,6 +146,7 @@ void PlayerManager::OnSourceModAllInitialized()
ParamType p2[] = {Param_Cell}; ParamType p2[] = {Param_Cell};
m_clconnect = g_Forwards.CreateForward("OnClientConnect", ET_LowEvent, 3, p1); m_clconnect = g_Forwards.CreateForward("OnClientConnect", ET_LowEvent, 3, p1);
m_clconnect_post = g_Forwards.CreateForward("OnClientConnected", ET_Ignore, 1, p2);
m_clputinserver = g_Forwards.CreateForward("OnClientPutInServer", ET_Ignore, 1, p2); m_clputinserver = g_Forwards.CreateForward("OnClientPutInServer", ET_Ignore, 1, p2);
m_cldisconnect = g_Forwards.CreateForward("OnClientDisconnect", ET_Ignore, 1, p2); m_cldisconnect = g_Forwards.CreateForward("OnClientDisconnect", ET_Ignore, 1, p2);
m_cldisconnect_post = g_Forwards.CreateForward("OnClientDisconnect_Post", ET_Ignore, 1, p2); m_cldisconnect_post = g_Forwards.CreateForward("OnClientDisconnect_Post", ET_Ignore, 1, p2);
@@ -146,7 +155,6 @@ void PlayerManager::OnSourceModAllInitialized()
m_clauth = g_Forwards.CreateForward("OnClientAuthorized", ET_Ignore, 2, NULL, Param_Cell, Param_String); m_clauth = g_Forwards.CreateForward("OnClientAuthorized", ET_Ignore, 2, NULL, Param_Cell, Param_String);
m_onActivate = g_Forwards.CreateForward("OnServerLoad", ET_Ignore, 0, NULL); m_onActivate = g_Forwards.CreateForward("OnServerLoad", ET_Ignore, 0, NULL);
m_onActivate2 = g_Forwards.CreateForward("OnMapStart", ET_Ignore, 0, NULL); m_onActivate2 = g_Forwards.CreateForward("OnMapStart", ET_Ignore, 0, NULL);
OnClientConnected = g_Forwards.CreateForward("OnClientConnected", ET_Ignore, 1, p2);
PreAdminCheck = g_Forwards.CreateForward("OnClientPreAdminCheck", ET_Event, 1, p1); PreAdminCheck = g_Forwards.CreateForward("OnClientPreAdminCheck", ET_Event, 1, p1);
PostAdminCheck = g_Forwards.CreateForward("OnClientPostAdminCheck", ET_Ignore, 1, p1); PostAdminCheck = g_Forwards.CreateForward("OnClientPostAdminCheck", ET_Ignore, 1, p1);
@@ -155,8 +163,6 @@ void PlayerManager::OnSourceModAllInitialized()
m_bIsListenServer = !engine->IsDedicatedServer(); m_bIsListenServer = !engine->IsDedicatedServer();
m_ListenClient = 0; m_ListenClient = 0;
g_ConVarManager.AddConVarChangeListener("tv_enable", this);
ConCommand *pCmd = FindCommand("maxplayers"); ConCommand *pCmd = FindCommand("maxplayers");
if (pCmd != NULL) if (pCmd != NULL)
{ {
@@ -168,6 +174,7 @@ void PlayerManager::OnSourceModAllInitialized()
void PlayerManager::OnSourceModShutdown() void PlayerManager::OnSourceModShutdown()
{ {
SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &PlayerManager::OnClientConnect, false); SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &PlayerManager::OnClientConnect, false);
SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &PlayerManager::OnClientConnect_Post, true);
SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &PlayerManager::OnClientPutInServer, true); SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &PlayerManager::OnClientPutInServer, true);
SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect, false); SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect, false);
SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect_Post, true); SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect_Post, true);
@@ -177,6 +184,7 @@ void PlayerManager::OnSourceModShutdown()
/* Release forwards */ /* Release forwards */
g_Forwards.ReleaseForward(m_clconnect); g_Forwards.ReleaseForward(m_clconnect);
g_Forwards.ReleaseForward(m_clconnect_post);
g_Forwards.ReleaseForward(m_clputinserver); g_Forwards.ReleaseForward(m_clputinserver);
g_Forwards.ReleaseForward(m_cldisconnect); g_Forwards.ReleaseForward(m_cldisconnect);
g_Forwards.ReleaseForward(m_cldisconnect_post); g_Forwards.ReleaseForward(m_cldisconnect_post);
@@ -185,7 +193,6 @@ void PlayerManager::OnSourceModShutdown()
g_Forwards.ReleaseForward(m_clauth); g_Forwards.ReleaseForward(m_clauth);
g_Forwards.ReleaseForward(m_onActivate); g_Forwards.ReleaseForward(m_onActivate);
g_Forwards.ReleaseForward(m_onActivate2); g_Forwards.ReleaseForward(m_onActivate2);
g_Forwards.ReleaseForward(OnClientConnected);
g_Forwards.ReleaseForward(PreAdminCheck); g_Forwards.ReleaseForward(PreAdminCheck);
g_Forwards.ReleaseForward(PostAdminCheck); g_Forwards.ReleaseForward(PostAdminCheck);
@@ -193,8 +200,6 @@ void PlayerManager::OnSourceModShutdown()
delete [] m_Players; delete [] m_Players;
g_ConVarManager.RemoveConVarChangeListener("tv_enable", this);
if (maxplayersCmd != NULL) if (maxplayersCmd != NULL)
{ {
SH_REMOVE_HOOK_STATICFUNC(ConCommand, Dispatch, maxplayersCmd, CmdMaxplayersCallback, true); SH_REMOVE_HOOK_STATICFUNC(ConCommand, Dispatch, maxplayersCmd, CmdMaxplayersCallback, true);
@@ -231,10 +236,25 @@ ConfigResult PlayerManager::OnSourceModConfigChanged(const char *key,
void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax) void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
{ {
static ConVar *tv_enable = icvar->FindVar("tv_enable");
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
static ConVar *replay_enable = icvar->FindVar("replay_enable");
#endif
// clientMax will not necessarily be correct here (such as on late SourceTV enable)
m_maxClients = gpGlobals->maxClients;
m_bIsSourceTVActive = (tv_enable && tv_enable->GetBool() && CommandLine()->FindParm("-nohltv") == 0);
m_bIsReplayActive = false;
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
m_bIsReplayActive = (replay_enable && replay_enable->GetBool());
#endif
m_PlayersSinceActive = 0;
if (!m_FirstPass) if (!m_FirstPass)
{ {
/* Initialize all players */ /* Initialize all players */
m_maxClients = clientMax;
m_PlayerCount = 0; m_PlayerCount = 0;
m_Players = new CPlayer[ABSOLUTE_PLAYER_LIMIT + 1]; m_Players = new CPlayer[ABSOLUTE_PLAYER_LIMIT + 1];
m_AuthQueue = new unsigned int[ABSOLUTE_PLAYER_LIMIT + 1]; m_AuthQueue = new unsigned int[ABSOLUTE_PLAYER_LIMIT + 1];
@@ -243,10 +263,13 @@ void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int cl
memset(m_AuthQueue, 0, sizeof(unsigned int) * (ABSOLUTE_PLAYER_LIMIT + 1)); memset(m_AuthQueue, 0, sizeof(unsigned int) * (ABSOLUTE_PLAYER_LIMIT + 1));
g_NumPlayersToAuth = &m_AuthQueue[0]; g_NumPlayersToAuth = &m_AuthQueue[0];
g_PluginSys.SyncMaxClients(clientMax);
} }
g_Extensions.CallOnCoreMapStart(pEdictList, edictCount, clientMax);
g_PluginSys.SyncMaxClients(m_maxClients);
g_OnMapStarted = true;
g_Extensions.CallOnCoreMapStart(pEdictList, edictCount, m_maxClients);
m_onActivate->Execute(NULL); m_onActivate->Execute(NULL);
m_onActivate2->Execute(NULL); m_onActivate2->Execute(NULL);
@@ -255,12 +278,10 @@ void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int cl
{ {
if ((*iter)->GetClientListenerVersion() >= 5) if ((*iter)->GetClientListenerVersion() >= 5)
{ {
(*iter)->OnServerActivated(clientMax); (*iter)->OnServerActivated(m_maxClients);
} }
} }
g_OnMapStarted = true;
SMGlobalClass *cls = SMGlobalClass::head; SMGlobalClass *cls = SMGlobalClass::head;
while (cls) while (cls)
{ {
@@ -406,6 +427,22 @@ bool PlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const
{ {
int client = IndexOfEdict(pEntity); int client = IndexOfEdict(pEntity);
CPlayer *pPlayer = &m_Players[client]; CPlayer *pPlayer = &m_Players[client];
++m_PlayersSinceActive;
pPlayer->Initialize(pszName, pszAddress, pEntity);
/* Get the client's language */
if (m_QueryLang)
{
const char *name;
if (!pPlayer->IsFakeClient() && (name=engine->GetClientConVarValue(client, "cl_language")))
{
unsigned int langid;
pPlayer->m_LangId = (translator->GetLanguageByName(name, &langid)) ? langid : translator->GetServerLanguage();
} else {
pPlayer->m_LangId = translator->GetServerLanguage();
}
}
List<IClientListener *>::iterator iter; List<IClientListener *>::iterator iter;
IClientListener *pListener = NULL; IClientListener *pListener = NULL;
@@ -420,7 +457,6 @@ bool PlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const
cell_t res = 1; cell_t res = 1;
pPlayer->Initialize(pszName, pszAddress, pEntity);
m_clconnect->PushCell(client); m_clconnect->PushCell(client);
m_clconnect->PushStringEx(reject, maxrejectlen, SM_PARAM_STRING_UTF8 | SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK); m_clconnect->PushStringEx(reject, maxrejectlen, SM_PARAM_STRING_UTF8 | SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK);
m_clconnect->PushCell(maxrejectlen); m_clconnect->PushCell(maxrejectlen);
@@ -462,7 +498,7 @@ bool PlayerManager::OnClientConnect_Post(edict_t *pEntity, const char *pszName,
pListener->OnClientConnected(client); pListener->OnClientConnected(client);
if (!pPlayer->IsConnected()) if (!pPlayer->IsConnected())
{ {
break; return true;
} }
} }
@@ -474,8 +510,8 @@ bool PlayerManager::OnClientConnect_Post(edict_t *pEntity, const char *pszName,
} }
cell_t res; cell_t res;
OnClientConnected->PushCell(client); m_clconnect_post->PushCell(client);
OnClientConnected->Execute(&res, NULL); m_clconnect_post->Execute(&res, NULL);
} }
else else
{ {
@@ -499,6 +535,40 @@ void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername
const char *authid = engine->GetPlayerNetworkIDString(pEntity); const char *authid = engine->GetPlayerNetworkIDString(pEntity);
pPlayer->Authorize(authid); pPlayer->Authorize(authid);
pPlayer->m_bFakeClient = true; pPlayer->m_bFakeClient = true;
/*
* While we're already filtered to just bots, we'll do other checks to
* make sure that the requisite services are enabled and that the bots
* have joined at the expected time.
*
* Checking playerinfo's IsHLTV and IsReplay would be better and less
* error-prone but will always show false until later in the frame,
* after PutInServer and Activate, and we want it now!
*/
// This doesn't actually get incremented until OnClientConnect. Fake it to check.
int newCount = m_PlayersSinceActive + 1;
int userId = engine->GetPlayerUserId(pEntity);
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
if (m_bIsReplayActive && newCount == 1
&& (m_ReplayUserId == userId || strcmp(playername, "Replay") == 0))
{
pPlayer->m_bIsReplay = true;
m_ReplayUserId = userId;
}
#endif
if (m_bIsSourceTVActive
&& ((!m_bIsReplayActive && newCount == 1)
|| (m_bIsReplayActive && newCount == 2))
&& (m_SourceTVUserId == userId || strcmp(playername, "SourceTV") == 0)
)
{
pPlayer->m_bIsSourceTV = true;
m_SourceTVUserId = userId;
}
if (!OnClientConnect(pEntity, playername, "127.0.0.1", error, sizeof(error))) if (!OnClientConnect(pEntity, playername, "127.0.0.1", error, sizeof(error)))
{ {
/* :TODO: kick the bot if it's rejected */ /* :TODO: kick the bot if it's rejected */
@@ -516,6 +586,11 @@ void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername
return; return;
} }
} }
cell_t res;
m_clconnect_post->PushCell(client);
m_clconnect_post->Execute(&res, NULL);
/* Now do authorization */ /* Now do authorization */
for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++) for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
{ {
@@ -537,19 +612,6 @@ void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername
pPlayer->m_Info = playerinfo->GetPlayerInfo(pEntity); pPlayer->m_Info = playerinfo->GetPlayerInfo(pEntity);
} }
/* Get the client's language */
if (m_QueryLang)
{
const char *name;
if (!pPlayer->IsFakeClient() && (name=engine->GetClientConVarValue(client, "cl_language")))
{
unsigned int langid;
pPlayer->m_LangId = (g_Translator.GetLanguageByName(name, &langid)) ? langid : g_Translator.GetServerLanguage();
} else {
pPlayer->m_LangId = g_Translator.GetServerLanguage();
}
}
pPlayer->Connect(); pPlayer->Connect();
m_PlayerCount++; m_PlayerCount++;
@@ -690,7 +752,7 @@ void PlayerManager::OnClientCommand(edict_t *pEntity)
ClientConsolePrint(pEntity, ClientConsolePrint(pEntity,
" David \"BAILOPAN\" Anderson, Borja \"faluco\" Ferrer"); " David \"BAILOPAN\" Anderson, Borja \"faluco\" Ferrer");
ClientConsolePrint(pEntity, ClientConsolePrint(pEntity,
" Scott \"Damaged Soul\" Ehlert, Matt \"pRED\" Woodrow"); " Scott \"DS\" Ehlert, Matt \"pRED\" Woodrow");
ClientConsolePrint(pEntity, ClientConsolePrint(pEntity,
" Michael \"ferret\" McKoy, Pavol \"PM OnoTo\" Marko"); " Michael \"ferret\" McKoy, Pavol \"PM OnoTo\" Marko");
ClientConsolePrint(pEntity, ClientConsolePrint(pEntity,
@@ -827,6 +889,17 @@ void PlayerManager::OnClientSettingsChanged(edict_t *pEntity)
} }
} }
} }
/* Notify Extensions */
List<IClientListener *>::iterator iter;
IClientListener *pListener = NULL;
for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
{
pListener = (*iter);
if (pListener->GetClientListenerVersion() >= 13)
{
pListener->OnClientSettingsChanged(client);
}
}
} }
int PlayerManager::GetMaxClients() int PlayerManager::GetMaxClients()
@@ -1296,7 +1369,7 @@ void PlayerManager::ProcessCommandTarget(cmd_target_info_t *info)
continue; continue;
} }
if (stristr(pTarget->GetName(), info->pattern) != NULL) if (logicore.stristr(pTarget->GetName(), info->pattern) != NULL)
{ {
if (found_client) if (found_client)
{ {
@@ -1334,18 +1407,6 @@ void PlayerManager::ProcessCommandTarget(cmd_target_info_t *info)
} }
} }
void PlayerManager::OnConVarChanged( ConVar *pConVar, const char *oldValue, float flOldValue )
{
if (pConVar->GetBool() && !atoi(oldValue))
{
MaxPlayersChanged(gpGlobals->maxClients + 1);
}
else
{
MaxPlayersChanged();
}
}
void PlayerManager::OnSourceModMaxPlayersChanged( int newvalue ) void PlayerManager::OnSourceModMaxPlayersChanged( int newvalue )
{ {
m_maxClients = newvalue; m_maxClients = newvalue;
@@ -1437,10 +1498,14 @@ CPlayer::CPlayer()
m_TempAdmin = false; m_TempAdmin = false;
m_Info = NULL; m_Info = NULL;
m_bAdminCheckSignalled = false; m_bAdminCheckSignalled = false;
m_UserId = -1;
m_bIsInKickQueue = false; m_bIsInKickQueue = false;
m_LastPassword.clear(); m_LastPassword.clear();
m_LangId = SOURCEMOD_LANGUAGE_ENGLISH; m_LangId = SOURCEMOD_LANGUAGE_ENGLISH;
m_bFakeClient = false; m_bFakeClient = false;
m_bIsSourceTV = false;
m_bIsReplay = false;
m_Serial.value = -1;
} }
void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity) void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity)
@@ -1450,7 +1515,7 @@ void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity)
m_Ip.assign(ip); m_Ip.assign(ip);
m_pEdict = pEntity; m_pEdict = pEntity;
m_iIndex = IndexOfEdict(pEntity); m_iIndex = IndexOfEdict(pEntity);
m_LangId = g_Translator.GetServerLanguage(); m_LangId = translator->GetServerLanguage();
m_Serial.bits.index = m_iIndex; m_Serial.bits.index = m_iIndex;
m_Serial.bits.serial = g_PlayerSerialCount++; m_Serial.bits.serial = g_PlayerSerialCount++;
@@ -1512,6 +1577,9 @@ void CPlayer::Disconnect()
m_UserId = -1; m_UserId = -1;
m_bIsInKickQueue = false; m_bIsInKickQueue = false;
m_bFakeClient = false; m_bFakeClient = false;
m_bIsSourceTV = false;
m_bIsReplay = false;
m_Serial.value = -1;
} }
void CPlayer::SetName(const char *name) void CPlayer::SetName(const char *name)
@@ -1579,6 +1647,16 @@ bool CPlayer::IsFakeClient()
return m_bFakeClient; return m_bFakeClient;
} }
bool CPlayer::IsSourceTV() const
{
return m_bIsSourceTV;
}
bool CPlayer::IsReplay() const
{
return m_bIsReplay;
}
void CPlayer::SetAdminId(AdminId id, bool temporary) void CPlayer::SetAdminId(AdminId id, bool temporary)
{ {
if (!m_IsConnected) if (!m_IsConnected)
@@ -1614,8 +1692,22 @@ void CPlayer::Kick(const char *str)
{ {
MarkAsBeingKicked(); MarkAsBeingKicked();
INetChannel *pNetChan = static_cast<INetChannel *>(engine->GetPlayerNetInfo(m_iIndex)); INetChannel *pNetChan = static_cast<INetChannel *>(engine->GetPlayerNetInfo(m_iIndex));
if (pNetChan == NULL)
{
/* What does this even mean? Hell if I know. */
int userid = GetUserId();
if (userid > 0)
{
char buffer[255];
UTIL_Format(buffer, sizeof(buffer), "kickid %d %s\n", userid, str);
engine->ServerCommand(buffer);
}
}
else
{
IClient *pClient = static_cast<IClient *>(pNetChan->GetMsgHandler()); IClient *pClient = static_cast<IClient *>(pNetChan->GetMsgHandler());
pClient->Disconnect("%s", str); pClient->Disconnect("%s", str);
}
} }
void CPlayer::Authorize_Post() void CPlayer::Authorize_Post()
@@ -1757,6 +1849,11 @@ unsigned int CPlayer::GetLanguageId()
return m_LangId; return m_LangId;
} }
void CPlayer::SetLanguageId(unsigned int id)
{
m_LangId = id;
}
int CPlayer::GetUserId() int CPlayer::GetUserId()
{ {
if (m_UserId == -1) if (m_UserId == -1)
+12 -4
View File
@@ -76,12 +76,15 @@ public:
bool IsConnected(); bool IsConnected();
bool IsAuthorized(); bool IsAuthorized();
bool IsFakeClient(); bool IsFakeClient();
bool IsSourceTV() const;
bool IsReplay() const;
void SetAdminId(AdminId id, bool temporary); void SetAdminId(AdminId id, bool temporary);
AdminId GetAdminId(); AdminId GetAdminId();
void Kick(const char *str); void Kick(const char *str);
bool IsInKickQueue(); bool IsInKickQueue();
IPlayerInfo *GetPlayerInfo(); IPlayerInfo *GetPlayerInfo();
unsigned int GetLanguageId(); unsigned int GetLanguageId();
void SetLanguageId(unsigned int id);
int GetUserId(); int GetUserId();
bool RunAdminCacheChecks(); bool RunAdminCacheChecks();
void NotifyPostAdminChecks(); void NotifyPostAdminChecks();
@@ -118,13 +121,14 @@ private:
unsigned int m_LangId; unsigned int m_LangId;
int m_UserId; int m_UserId;
bool m_bFakeClient; bool m_bFakeClient;
bool m_bIsSourceTV;
bool m_bIsReplay;
serial_t m_Serial; serial_t m_Serial;
}; };
class PlayerManager : class PlayerManager :
public SMGlobalClass, public SMGlobalClass,
public IPlayerManager, public IPlayerManager
public IConVarChangeListener
{ {
friend class CPlayer; friend class CPlayer;
public: public:
@@ -169,8 +173,6 @@ public: //IPlayerManager
void UnregisterCommandTargetProcessor(ICommandTargetProcessor *pHandler); void UnregisterCommandTargetProcessor(ICommandTargetProcessor *pHandler);
void ProcessCommandTarget(cmd_target_info_t *info); void ProcessCommandTarget(cmd_target_info_t *info);
int GetClientFromSerial(unsigned int serial); int GetClientFromSerial(unsigned int serial);
public: // IConVarChangeListener
void OnConVarChanged(ConVar *pConVar, const char *oldValue, float flOldValue);
public: public:
inline int MaxClients() inline int MaxClients()
{ {
@@ -197,6 +199,7 @@ private:
private: private:
List<IClientListener *> m_hooks; List<IClientListener *> m_hooks;
IForward *m_clconnect; IForward *m_clconnect;
IForward *m_clconnect_post;
IForward *m_cldisconnect; IForward *m_cldisconnect;
IForward *m_cldisconnect_post; IForward *m_cldisconnect_post;
IForward *m_clputinserver; IForward *m_clputinserver;
@@ -209,12 +212,17 @@ private:
int *m_UserIdLookUp; int *m_UserIdLookUp;
int m_maxClients; int m_maxClients;
int m_PlayerCount; int m_PlayerCount;
int m_PlayersSinceActive;
bool m_FirstPass; bool m_FirstPass;
unsigned int *m_AuthQueue; unsigned int *m_AuthQueue;
String m_PassInfoVar; String m_PassInfoVar;
bool m_QueryLang; bool m_QueryLang;
bool m_bIsListenServer; bool m_bIsListenServer;
int m_ListenClient; int m_ListenClient;
bool m_bIsSourceTVActive;
bool m_bIsReplayActive;
int m_SourceTVUserId;
int m_ReplayUserId;
}; };
#if SOURCE_ENGINE >= SE_ORANGEBOX #if SOURCE_ENGINE >= SE_ORANGEBOX
+14 -10
View File
@@ -44,7 +44,7 @@
#include "ConCmdManager.h" #include "ConCmdManager.h"
#include "PlayerManager.h" #include "PlayerManager.h"
#include "CoreConfig.h" #include "CoreConfig.h"
#include "Translator.h" #include "logic_bridge.h"
CPluginManager g_PluginSys; CPluginManager g_PluginSys;
HandleType_t g_PluginType = 0; HandleType_t g_PluginType = 0;
@@ -67,7 +67,7 @@ CPlugin::CPlugin(const char *file)
m_FakeNativesMissing = false; m_FakeNativesMissing = false;
m_LibraryMissing = false; m_LibraryMissing = false;
m_bGotAllLoaded = false; m_bGotAllLoaded = false;
m_pPhrases = g_Translator.CreatePhraseCollection(); m_pPhrases = translator->CreatePhraseCollection();
m_MaxClientsVar = NULL; m_MaxClientsVar = NULL;
} }
@@ -372,7 +372,7 @@ void CPlugin::Call_OnAllPluginsLoaded()
pFunction->Execute(&result); pFunction->Execute(&result);
} }
if (g_OnMapStarted) if (g_SourceMod.IsMapRunning())
{ {
if ((pFunction = m_pRuntime->GetFunctionByName("OnMapStart")) != NULL) if ((pFunction = m_pRuntime->GetFunctionByName("OnMapStart")) != NULL)
{ {
@@ -1125,7 +1125,7 @@ void CPluginManager::LoadAutoPlugin(const char *plugin)
{ {
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_BadLoad ? Plugin_BadLoad : Plugin_Failed, pl->GetStatus() <= Plugin_Created ? Plugin_BadLoad : pl->GetStatus(),
"%s", "%s",
error); error);
} }
@@ -1308,7 +1308,8 @@ bool CPluginManager::LoadOrRequireExtensions(CPlugin *pPlugin, unsigned int pass
if (ext->autoload) if (ext->autoload)
{ {
g_LibSys.PathFormat(path, PLATFORM_MAX_PATH, "%s", file); g_LibSys.PathFormat(path, PLATFORM_MAX_PATH, "%s", file);
g_Extensions.LoadAutoExtension(path); bool bErrorOnMissing = ext->required ? true : false;
g_Extensions.LoadAutoExtension(path, bErrorOnMissing);
} }
} }
else if (pass == 2) else if (pass == 2)
@@ -2052,7 +2053,7 @@ void CPluginManager::OnRootConsoleCommand(const char *cmdname, const CCommand &c
char pluginfile[256]; char pluginfile[256];
const char *ext = g_LibSys.GetFileExtension(filename) ? "" : ".smx"; const char *ext = g_LibSys.GetFileExtension(filename) ? "" : ".smx";
UTIL_Format(pluginfile, sizeof(pluginfile), "%s%s", filename, ext); g_SourceMod.BuildPath(Path_None, pluginfile, sizeof(pluginfile), "%s%s", filename, ext);
IPlugin *pl = LoadPlugin(pluginfile, false, PluginType_MapUpdated, error, sizeof(error), &wasloaded); IPlugin *pl = LoadPlugin(pluginfile, false, PluginType_MapUpdated, error, sizeof(error), &wasloaded);
@@ -2099,7 +2100,7 @@ void CPluginManager::OnRootConsoleCommand(const char *cmdname, const CCommand &c
{ {
char pluginfile[256]; char pluginfile[256];
const char *ext = g_LibSys.GetFileExtension(arg) ? "" : ".smx"; const char *ext = g_LibSys.GetFileExtension(arg) ? "" : ".smx";
UTIL_Format(pluginfile, sizeof(pluginfile), "%s%s", arg, ext); g_SourceMod.BuildPath(Path_None, pluginfile, sizeof(pluginfile), "%s%s", arg, ext);
if (!sm_trie_retrieve(m_LoadLookup, pluginfile, (void **)&pl)) if (!sm_trie_retrieve(m_LoadLookup, pluginfile, (void **)&pl))
{ {
@@ -2189,7 +2190,7 @@ void CPluginManager::OnRootConsoleCommand(const char *cmdname, const CCommand &c
{ {
char pluginfile[256]; char pluginfile[256];
const char *ext = g_LibSys.GetFileExtension(arg) ? "" : ".smx"; const char *ext = g_LibSys.GetFileExtension(arg) ? "" : ".smx";
UTIL_Format(pluginfile, sizeof(pluginfile), "%s%s", arg, ext); g_SourceMod.BuildPath(Path_None, pluginfile, sizeof(pluginfile), "%s%s", arg, ext);
if (!sm_trie_retrieve(m_LoadLookup, pluginfile, (void **)&pl)) if (!sm_trie_retrieve(m_LoadLookup, pluginfile, (void **)&pl))
{ {
@@ -2310,7 +2311,7 @@ void CPluginManager::OnRootConsoleCommand(const char *cmdname, const CCommand &c
{ {
char pluginfile[256]; char pluginfile[256];
const char *ext = g_LibSys.GetFileExtension(arg) ? "" : ".smx"; const char *ext = g_LibSys.GetFileExtension(arg) ? "" : ".smx";
UTIL_Format(pluginfile, sizeof(pluginfile), "%s%s", arg, ext); g_SourceMod.BuildPath(Path_None, pluginfile, sizeof(pluginfile), "%s%s", arg, ext);
if (!sm_trie_retrieve(m_LoadLookup, pluginfile, (void **)&pl)) if (!sm_trie_retrieve(m_LoadLookup, pluginfile, (void **)&pl))
{ {
@@ -2321,7 +2322,10 @@ void CPluginManager::OnRootConsoleCommand(const char *cmdname, const CCommand &c
char name[PLATFORM_MAX_PATH]; char name[PLATFORM_MAX_PATH];
const sm_plugininfo_t *info = pl->GetPublicInfo(); const sm_plugininfo_t *info = pl->GetPublicInfo();
if (pl->GetStatus() <= Plugin_Paused)
strcpy(name, (IS_STR_FILLED(info->name)) ? info->name : pl->GetFilename()); strcpy(name, (IS_STR_FILLED(info->name)) ? info->name : pl->GetFilename());
else
strcpy(name, pl->GetFilename());
if (ReloadPlugin(pl)) if (ReloadPlugin(pl))
{ {
@@ -2738,6 +2742,6 @@ void CPluginManager::ListPluginsToClient(CPlayer *player, const CCommand &args)
/* Do we actually have more plugins? */ /* Do we actually have more plugins? */
if (iter != m_plugins.end()) if (iter != m_plugins.end())
{ {
ClientConsolePrint(e, "To see more, type \"sm plugins %d\"", id + 1); ClientConsolePrint(e, "To see more, type \"sm plugins %d\"", id);
} }
} }
+6 -3
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 : * vim: set ts=4 :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -47,9 +47,11 @@
#include "sm_trie.h" #include "sm_trie.h"
#include "sourcemod.h" #include "sourcemod.h"
#include <IRootConsoleMenu.h> #include <IRootConsoleMenu.h>
#if SOURCE_ENGINE == SE_LEFT4DEAD #if SOURCE_ENGINE == SE_ALIENSWARM
#include "convar_sm_swarm.h"
#elif (SOURCE_ENGINE == SE_LEFT4DEAD) || (SOURCE_ENGINE == SE_LEFT4DEAD2)
#include "convar_sm_l4d.h" #include "convar_sm_l4d.h"
#elif (SOURCE_ENGINE == SE_ORANGEBOX) || (SOURCE_ENGINE == SE_ORANGEBOXVALVE) #elif (SOURCE_ENGINE == SE_ORANGEBOX) || (SOURCE_ENGINE == SE_BLOODYGOODTIME) || (SOURCE_ENGINE == SE_EYE) || (SOURCE_ENGINE == SE_ORANGEBOXVALVE)
#include "convar_sm_ob.h" #include "convar_sm_ob.h"
#else #else
#include "convar_sm.h" #include "convar_sm.h"
@@ -473,3 +475,4 @@ private:
extern CPluginManager g_PluginSys; extern CPluginManager g_PluginSys;
#endif //_INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_ #endif //_INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_
+82
View File
@@ -527,3 +527,85 @@ NativeEntry *ShareSystem::AddFakeNative(IPluginFunction *pFunc, const char *name
return pEntry; return pEntry;
} }
void ShareSystem::AddCapabilityProvider(IExtension *myself, IFeatureProvider *provider,
const char *name)
{
if (m_caps.retrieve(name) != NULL)
return;
Capability cap;
cap.ext = myself;
cap.provider = provider;
m_caps.insert(name, cap);
}
void ShareSystem::DropCapabilityProvider(IExtension *myself, IFeatureProvider *provider,
const char *name)
{
Capability *pCap = m_caps.retrieve(name);
if (pCap == NULL)
return;
if (pCap->ext != myself || pCap->provider != provider)
return;
m_caps.remove(name);
}
FeatureStatus ShareSystem::TestFeature(IPluginRuntime *pRuntime, FeatureType feature,
const char *name)
{
switch (feature)
{
case FeatureType_Native:
return TestNative(pRuntime, name);
case FeatureType_Capability:
return TestCap(name);
default:
break;
}
return FeatureStatus_Unknown;
}
FeatureStatus ShareSystem::TestNative(IPluginRuntime *pRuntime, const char *name)
{
uint32_t index;
if (pRuntime->FindNativeByName(name, &index) == SP_ERROR_NONE)
{
sp_native_t *native;
if (pRuntime->GetNativeByIndex(index, &native) == SP_ERROR_NONE)
{
if (native->status == SP_NATIVE_BOUND)
return FeatureStatus_Available;
else
return FeatureStatus_Unknown;
}
}
NativeEntry *entry = FindNative(name);
if (entry == NULL)
return FeatureStatus_Unknown;
if ((entry->replacement.owner != NULL || entry->owner != NULL) &&
(entry->replacement.func != NULL || entry->func != NULL))
{
return FeatureStatus_Available;
}
else
{
return FeatureStatus_Unavailable;
}
}
FeatureStatus ShareSystem::TestCap(const char *name)
{
Capability *cap = m_caps.retrieve(name);
if (cap == NULL)
return FeatureStatus_Unknown;
return cap->provider->GetFeatureStatus(FeatureType_Capability, name);
}
+14
View File
@@ -87,6 +87,12 @@ struct NativeEntry
FakeNative *fake; FakeNative *fake;
}; };
struct Capability
{
IExtension *ext;
IFeatureProvider *provider;
};
class ShareSystem : class ShareSystem :
public IShareSys, public IShareSys,
public SMGlobalClass, public SMGlobalClass,
@@ -110,6 +116,10 @@ public: //IShareSys
void AddDependency(IExtension *myself, const char *filename, bool require, bool autoload); void AddDependency(IExtension *myself, const char *filename, bool require, bool autoload);
void RegisterLibrary(IExtension *myself, const char *name); void RegisterLibrary(IExtension *myself, const char *name);
void OverrideNatives(IExtension *myself, const sp_nativeinfo_t *natives); void OverrideNatives(IExtension *myself, const sp_nativeinfo_t *natives);
void AddCapabilityProvider(IExtension *myself, IFeatureProvider *provider,
const char *name);
void DropCapabilityProvider(IExtension *myself, IFeatureProvider *provider,
const char *name);
public: //SMGlobalClass public: //SMGlobalClass
/* Pre-empt in case anything tries to register idents early */ /* Pre-empt in case anything tries to register idents early */
void Initialize(); void Initialize();
@@ -119,6 +129,9 @@ public: //IHandleTypeDispatch
public: public:
IdentityToken_t *CreateCoreIdentity(); IdentityToken_t *CreateCoreIdentity();
void RemoveInterfaces(IExtension *pExtension); void RemoveInterfaces(IExtension *pExtension);
FeatureStatus TestFeature(IPluginRuntime *pRuntime, FeatureType feature, const char *name);
FeatureStatus TestNative(IPluginRuntime *pRuntime, const char *name);
FeatureStatus TestCap(const char *name);
public: public:
inline IdentityToken_t *GetIdentRoot() inline IdentityToken_t *GetIdentRoot()
{ {
@@ -143,6 +156,7 @@ private:
HandleType_t m_IfaceType; HandleType_t m_IfaceType;
IdentityType_t m_CoreType; IdentityType_t m_CoreType;
KTrie<NativeEntry *> m_NtvCache; KTrie<NativeEntry *> m_NtvCache;
KTrie<Capability> m_caps;
}; };
extern ShareSystem g_ShareSys; extern ShareSystem g_ShareSys;
+1 -1
View File
@@ -78,11 +78,11 @@ public: //ITimerSystem
float GetTickedTime(); float GetTickedTime();
void NotifyOfGameStart(float offset /* = 0.0f */); void NotifyOfGameStart(float offset /* = 0.0f */);
bool GetMapTimeLeft(float *pTime); bool GetMapTimeLeft(float *pTime);
IMapTimer *GetMapTimer();
public: public:
void RunFrame(); void RunFrame();
void RemoveMapChangeTimers(); void RemoveMapChangeTimers();
void GameFrame(bool simulating); void GameFrame(bool simulating);
IMapTimer *GetMapTimer();
private: private:
List<ITimer *> m_SingleTimers; List<ITimer *> m_SingleTimers;
List<ITimer *> m_LoopTimers; List<ITimer *> m_LoopTimers;
+7 -7
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 : * vim: set ts=4 :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -34,7 +34,7 @@
UserMessages g_UserMsgs; UserMessages g_UserMsgs;
#if SOURCE_ENGINE == SE_LEFT4DEAD #if SOURCE_ENGINE >= SE_LEFT4DEAD
SH_DECL_HOOK3(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int, const char *); SH_DECL_HOOK3(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int, const char *);
#else #else
SH_DECL_HOOK2(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int); SH_DECL_HOOK2(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int);
@@ -168,13 +168,13 @@ bf_write *UserMessages::StartMessage(int msg_id, const cell_t players[], unsigne
if (m_CurFlags & USERMSG_BLOCKHOOKS) if (m_CurFlags & USERMSG_BLOCKHOOKS)
{ {
#if SOURCE_ENGINE == SE_LEFT4DEAD #if SOURCE_ENGINE >= SE_LEFT4DEAD
buffer = ENGINE_CALL(UserMessageBegin)(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, g_SMAPI->GetUserMessage(msg_id)); buffer = ENGINE_CALL(UserMessageBegin)(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, g_SMAPI->GetUserMessage(msg_id));
#else #else
buffer = ENGINE_CALL(UserMessageBegin)(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id); buffer = ENGINE_CALL(UserMessageBegin)(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id);
#endif #endif
} else { } else {
#if SOURCE_ENGINE == SE_LEFT4DEAD #if SOURCE_ENGINE >= SE_LEFT4DEAD
buffer = engine->UserMessageBegin(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, g_SMAPI->GetUserMessage(msg_id)); buffer = engine->UserMessageBegin(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, g_SMAPI->GetUserMessage(msg_id));
#else #else
buffer = engine->UserMessageBegin(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id); buffer = engine->UserMessageBegin(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id);
@@ -316,7 +316,7 @@ void UserMessages::_DecRefCounter()
} }
} }
#if SOURCE_ENGINE == SE_LEFT4DEAD #if SOURCE_ENGINE >= SE_LEFT4DEAD
bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name) bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name)
#else #else
bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type) bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type)
@@ -346,7 +346,7 @@ bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_typ
RETURN_META_VALUE(MRES_IGNORED, NULL); RETURN_META_VALUE(MRES_IGNORED, NULL);
} }
#if SOURCE_ENGINE == SE_LEFT4DEAD #if SOURCE_ENGINE >= SE_LEFT4DEAD
bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name) bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name)
#else #else
bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type) bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type)
@@ -500,7 +500,7 @@ void UserMessages::OnMessageEnd_Pre()
{ {
bf_write *engine_bfw; bf_write *engine_bfw;
#if SOURCE_ENGINE == SE_LEFT4DEAD #if SOURCE_ENGINE >= SE_LEFT4DEAD
engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId, g_SMAPI->GetUserMessage(m_CurId)); engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId, g_SMAPI->GetUserMessage(m_CurId));
#else #else
engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId); engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId);
+2 -2
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 : * vim: set ts=4 :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -79,7 +79,7 @@ public: //IUserMessages
IUserMessageListener *pListener, IUserMessageListener *pListener,
bool intercept=false); bool intercept=false);
public: public:
#if SOURCE_ENGINE == SE_LEFT4DEAD #if SOURCE_ENGINE >= SE_LEFT4DEAD
bf_write *OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name); bf_write *OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name);
bf_write *OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name); bf_write *OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name);
#else #else
+7 -1
View File
@@ -24,7 +24,7 @@
#ifdef _WIN32 #ifdef _WIN32
#define FORCEINLINE_CVAR FORCEINLINE #define FORCEINLINE_CVAR FORCEINLINE
#elif _LINUX #elif defined _LINUX || defined __APPLE__
#define FORCEINLINE_CVAR inline #define FORCEINLINE_CVAR inline
#else #else
#error "implement me" #error "implement me"
@@ -386,6 +386,9 @@ public:
virtual void SetValue( const char *value ); virtual void SetValue( const char *value );
virtual void SetValue( float value ); virtual void SetValue( float value );
virtual void SetValue( int value ); virtual void SetValue( int value );
#if SOURCE_ENGINE >= SE_LEFT4DEAD2
virtual void SetValue( Color value );
#endif
// Reset to default value // Reset to default value
void Revert( void ); void Revert( void );
@@ -401,6 +404,9 @@ private:
// For CVARs marked FCVAR_NEVER_AS_STRING // For CVARs marked FCVAR_NEVER_AS_STRING
virtual void InternalSetFloatValue( float fNewValue ); virtual void InternalSetFloatValue( float fNewValue );
virtual void InternalSetIntValue( int nValue ); virtual void InternalSetIntValue( int nValue );
#if SOURCE_ENGINE >= SE_LEFT4DEAD2
virtual void InternalSetColorValue( Color value );
#endif
virtual bool ClampValue( float& value ); virtual bool ClampValue( float& value );
virtual void ChangeStringValue( const char *tempVal, float flOldValue ); virtual void ChangeStringValue( const char *tempVal, float flOldValue );
+1 -1
View File
@@ -24,7 +24,7 @@
#ifdef _WIN32 #ifdef _WIN32
#define FORCEINLINE_CVAR FORCEINLINE #define FORCEINLINE_CVAR FORCEINLINE
#elif _LINUX #elif defined _LINUX || defined __APPLE__
#define FORCEINLINE_CVAR inline #define FORCEINLINE_CVAR inline
#else #else
#error "implement me" #error "implement me"
File diff suppressed because it is too large Load Diff
+19 -1
View File
@@ -12,6 +12,8 @@ compiler['CDEFINES'].append('SM_LOGIC')
if AMBuild.target['platform'] == 'linux': if AMBuild.target['platform'] == 'linux':
compiler['POSTLINKFLAGS'].append('-lpthread') compiler['POSTLINKFLAGS'].append('-lpthread')
if AMBuild.target['platform'] == 'darwin':
compiler['POSTLINKFLAGS'].extend(['-framework', 'CoreServices'])
extension = AMBuild.AddJob('sourcemod.logic') extension = AMBuild.AddJob('sourcemod.logic')
binary = Cpp.LibraryBuilder('sourcemod.logic', AMBuild, extension, compiler) binary = Cpp.LibraryBuilder('sourcemod.logic', AMBuild, extension, compiler)
@@ -29,7 +31,23 @@ files = [
'smn_textparse.cpp', 'smn_textparse.cpp',
'smn_adt_trie.cpp', 'smn_adt_trie.cpp',
'Profiler.cpp', 'Profiler.cpp',
'smn_functions.cpp' 'smn_functions.cpp',
'smn_timers.cpp',
'smn_players.cpp',
'MemoryUtils.cpp',
'smn_admin.cpp',
'smn_banning.cpp',
'stringutil.cpp',
'Translator.cpp',
'PhraseCollection.cpp',
'smn_lang.cpp',
'smn_string.cpp',
'smn_handles.cpp',
'smn_datapacks.cpp',
'smn_gameconfigs.cpp',
'GameConfigs.cpp',
'sm_crc32.cpp',
'smn_profiler.cpp'
] ]
if AMBuild.target['platform'] == 'windows': if AMBuild.target['platform'] == 'windows':
files.append('thread/WinThreads.cpp') files.append('thread/WinThreads.cpp')
+92
View File
@@ -0,0 +1,92 @@
/**
* vim: set ts=4 sw=4 tw=99 noet :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#ifndef _INCLUDE_SOURCEMOD_AUTO_HANDLE_ROOTER_H_
#define _INCLUDE_SOURCEMOD_AUTO_HANDLE_ROOTER_H_
#include "common_logic.h"
#include <IHandleSys.h>
class AutoHandleRooter
{
public:
AutoHandleRooter(Handle_t hndl)
{
if (hndl != BAD_HANDLE)
this->hndl = handlesys->FastCloneHandle(hndl);
else
this->hndl = BAD_HANDLE;
}
~AutoHandleRooter()
{
if (hndl != BAD_HANDLE)
{
HandleSecurity sec(g_pCoreIdent, g_pCoreIdent);
handlesys->FreeHandle(hndl, &sec);
}
}
Handle_t getHandle()
{
return hndl;
}
private:
Handle_t hndl;
};
class AutoHandleCloner
{
Handle_t original;
HandleSecurity sec;
AutoHandleRooter ahr;
public:
AutoHandleCloner(Handle_t original, HandleSecurity sec)
: original(original), sec(sec), ahr(original)
{
}
~AutoHandleCloner()
{
if (original != BAD_HANDLE)
{
handlesys->FreeHandle(original, &sec);
}
}
Handle_t getClone()
{
return ahr.getHandle();
}
};
#endif /* _INCLUDE_SOURCEMOD_AUTO_HANDLE_ROOTER_H_ */
@@ -1,8 +1,8 @@
/** /**
* vim: set ts=4 : * vim: set ts=4 sw=4 tw=99 noet :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -25,28 +25,30 @@
* this exception to all derivative works. AlliedModders LLC defines further * this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>. * or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/ */
#include "common_logic.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <sh_list.h>
#include <sh_string.h>
#include "GameConfigs.h" #include "GameConfigs.h"
#include "sm_stringutil.h" #include "stringutil.h"
#include "sourcemod.h" #include <IGameHelpers.h>
#include "sourcemm_api.h" #include <ILibrarySys.h>
#include "HalfLife2.h" #include <IHandleSys.h>
#include "Logger.h" #include <IMemoryUtils.h>
#include "ShareSys.h" #include <ISourceMod.h>
#include "MemoryUtils.h" #include "common_logic.h"
#include "LibrarySys.h"
#include "HandleSys.h"
#include "sm_crc32.h" #include "sm_crc32.h"
#include "MemoryUtils.h"
#if defined PLATFORM_LINUX #if defined PLATFORM_POSIX
#include <dlfcn.h> #include <dlfcn.h>
#endif #endif
using namespace SourceHook;
GameConfigManager g_GameConfigs; GameConfigManager g_GameConfigs;
IGameConfig *g_pGameConf = NULL; IGameConfig *g_pGameConf = NULL;
static char g_Game[256]; static char g_Game[256];
@@ -65,6 +67,9 @@ static char g_GameName[256] = {'$', '\0'};
#define PSTATE_GAMEDEFS_CRC 9 #define PSTATE_GAMEDEFS_CRC 9
#define PSTATE_GAMEDEFS_CRC_BINARY 10 #define PSTATE_GAMEDEFS_CRC_BINARY 10
#define PSTATE_GAMEDEFS_CUSTOM 11 #define PSTATE_GAMEDEFS_CUSTOM 11
#define PSTATE_GAMEDEFS_ADDRESSES 12
#define PSTATE_GAMEDEFS_ADDRESSES_ADDRESS 13
#define PSTATE_GAMEDEFS_ADDRESSES_ADDRESS_READ 14
#if defined PLATFORM_WINDOWS #if defined PLATFORM_WINDOWS
#define PLATFORM_NAME "windows" #define PLATFORM_NAME "windows"
@@ -73,8 +78,8 @@ static char g_GameName[256] = {'$', '\0'};
#define PLATFORM_NAME "linux" #define PLATFORM_NAME "linux"
#define PLATFORM_SERVER_BINARY "server_i486.so" #define PLATFORM_SERVER_BINARY "server_i486.so"
#elif defined PLATFORM_APPLE #elif defined PLATFORM_APPLE
#define PLATFORM_NAME "undef" #define PLATFORM_NAME "mac"
#define PLATFORM_SERVER_BINARY "undef.dylib" #define PLATFORM_SERVER_BINARY "server.dylib"
#endif #endif
struct TempSigInfo struct TempSigInfo
@@ -107,32 +112,13 @@ static bool DoesGameMatch(const char *value)
static bool DoesEngineMatch(const char *value) static bool DoesEngineMatch(const char *value)
{ {
#if SOURCE_ENGINE == SE_EPISODEONE return strcmp(value, smcore.GetSourceEngineName()) == 0;
if (strcmp(value, "original") == 0)
#elif SOURCE_ENGINE == SE_DARKMESSIAH
if (strcmp(value, "darkmessiah") == 0)
#elif SOURCE_ENGINE == SE_ORANGEBOX
if (strcmp(value, "orangebox") == 0)
#elif SOURCE_ENGINE == SE_ORANGEBOXVALVE
if (strcmp(value, "orangebox_valve") == 0)
#elif SOURCE_ENGINE == SE_LEFT4DEAD
if (strcmp(value, "left4dead") == 0)
#else
#error "Unknown engine type"
#endif
{
return true;
}
return false;
} }
CGameConfig::CGameConfig(const char *file) CGameConfig::CGameConfig(const char *file)
{ {
strncopy(m_File, file, sizeof(m_File)); strncopy(m_File, file, sizeof(m_File));
m_pOffsets = sm_trie_create(); m_pAddresses = new KTrie<AddressConf>();
m_pProps = sm_trie_create();
m_pKeys = sm_trie_create();
m_pSigs = sm_trie_create();
m_pStrings = new BaseStringTable(512); m_pStrings = new BaseStringTable(512);
m_RefCount = 0; m_RefCount = 0;
@@ -142,10 +128,7 @@ CGameConfig::CGameConfig(const char *file)
CGameConfig::~CGameConfig() CGameConfig::~CGameConfig()
{ {
sm_trie_destroy(m_pOffsets); delete m_pAddresses;
sm_trie_destroy(m_pProps);
sm_trie_destroy(m_pKeys);
sm_trie_destroy(m_pSigs);
delete m_pStrings; delete m_pStrings;
} }
@@ -212,6 +195,10 @@ SMCResult CGameConfig::ReadSMC_NewSection(const SMCStates *states, const char *n
m_ParseState = PSTATE_GAMEDEFS_CRC; m_ParseState = PSTATE_GAMEDEFS_CRC;
bShouldBeReadingDefault = false; bShouldBeReadingDefault = false;
} }
else if (strcmp(name, "Addresses") == 0)
{
m_ParseState = PSTATE_GAMEDEFS_ADDRESSES;
}
else else
{ {
ITextListener_SMC **pListen = g_GameConfigs.m_customHandlers.retrieve(name); ITextListener_SMC **pListen = g_GameConfigs.m_customHandlers.retrieve(name);
@@ -250,17 +237,17 @@ SMCResult CGameConfig::ReadSMC_NewSection(const SMCStates *states, const char *n
error[0] = '\0'; error[0] = '\0';
if (strcmp(name, "server") != 0) if (strcmp(name, "server") != 0)
{ {
UTIL_Format(error, sizeof(error), "Unrecognized library \"%s\"", name); smcore.Format(error, sizeof(error), "Unrecognized library \"%s\"", name);
} }
else if (!s_ServerBinCRC_Ok) else if (!s_ServerBinCRC_Ok)
{ {
FILE *fp; FILE *fp;
char path[PLATFORM_MAX_PATH]; char path[PLATFORM_MAX_PATH];
g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "bin/" PLATFORM_SERVER_BINARY); g_pSM->BuildPath(Path_Game, path, sizeof(path), "bin/" PLATFORM_SERVER_BINARY);
if ((fp = fopen(path, "rb")) == NULL) if ((fp = fopen(path, "rb")) == NULL)
{ {
UTIL_Format(error, sizeof(error), "Could not open binary: %s", path); smcore.Format(error, sizeof(error), "Could not open binary: %s", path);
} else { } else {
size_t size; size_t size;
void *buffer; void *buffer;
@@ -280,8 +267,8 @@ SMCResult CGameConfig::ReadSMC_NewSection(const SMCStates *states, const char *n
if (error[0] != '\0') if (error[0] != '\0')
{ {
m_IgnoreLevel = 1; m_IgnoreLevel = 1;
g_Logger.LogError("[SM] Error while parsing CRC section for \"%s\" (%s):", m_Game, m_CurFile); smcore.LogError("[SM] Error while parsing CRC section for \"%s\" (%s):", m_Game, m_CurFile);
g_Logger.LogError("[SM] %s", error); smcore.LogError("[SM] %s", error);
} else { } else {
m_ParseState = PSTATE_GAMEDEFS_CRC_BINARY; m_ParseState = PSTATE_GAMEDEFS_CRC_BINARY;
} }
@@ -293,12 +280,41 @@ SMCResult CGameConfig::ReadSMC_NewSection(const SMCStates *states, const char *n
return m_CustomHandler->ReadSMC_NewSection(states, name); return m_CustomHandler->ReadSMC_NewSection(states, name);
break; break;
} }
case PSTATE_GAMEDEFS_ADDRESSES:
{
m_Address[0] = '\0';
m_AddressSignature[0] = '\0';
m_AddressReadCount = 0;
strncopy(m_Address, name, sizeof(m_Address));
m_ParseState = PSTATE_GAMEDEFS_ADDRESSES_ADDRESS;
break;
}
case PSTATE_GAMEDEFS_ADDRESSES_ADDRESS:
{
if (strcmp(name, PLATFORM_NAME) == 0)
{
m_ParseState = PSTATE_GAMEDEFS_ADDRESSES_ADDRESS_READ;
}
else
{
if (strcmp(name, "linux") != 0 && strcmp(name, "windows") != 0 && strcmp(name, "mac") != 0)
{
smcore.LogError("[SM] Error while parsing Address section for \"%s\" (%s):", m_Address, m_CurFile);
smcore.LogError("[SM] Unrecognized platform \"%s\"", name);
}
m_IgnoreLevel = 1;
}
break;
}
/* No sub-sections allowed: /* No sub-sections allowed:
case PSTATE_GAMEDEFS_OFFSETS_OFFSET: case PSTATE_GAMEDEFS_OFFSETS_OFFSET:
case PSTATE_GAMEDEFS_KEYS: case PSTATE_GAMEDEFS_KEYS:
case PSTATE_GAMEDEFS_SUPPORTED: case PSTATE_GAMEDEFS_SUPPORTED:
case PSTATE_GAMEDEFS_SIGNATURES_SIG: case PSTATE_GAMEDEFS_SIGNATURES_SIG:
case PSTATE_GAMEDEFS_CRC_BINARY: case PSTATE_GAMEDEFS_CRC_BINARY:
case PSTATE_GAMEDEFS_ADDRESSES_ADDRESS_READ:
*/ */
default: default:
{ {
@@ -326,12 +342,10 @@ SMCResult CGameConfig::ReadSMC_KeyValue(const SMCStates *states, const char *key
} else if (strcmp(key, "prop") == 0) { } else if (strcmp(key, "prop") == 0) {
strncopy(m_Prop, value, sizeof(m_Prop)); strncopy(m_Prop, value, sizeof(m_Prop));
} else if (strcmp(key, PLATFORM_NAME) == 0) { } else if (strcmp(key, PLATFORM_NAME) == 0) {
int val = atoi(value); m_Offsets.replace(m_offset, atoi(value));
sm_trie_replace(m_pOffsets, m_offset, (void *)val);
} }
} else if (m_ParseState == PSTATE_GAMEDEFS_KEYS) { } else if (m_ParseState == PSTATE_GAMEDEFS_KEYS) {
int id = m_pStrings->AddString(value); m_Keys.replace(key, m_pStrings->AddString(value));
sm_trie_replace(m_pKeys, key, (void *)id);
} else if (m_ParseState == PSTATE_GAMEDEFS_SUPPORTED) { } else if (m_ParseState == PSTATE_GAMEDEFS_SUPPORTED) {
if (strcmp(key, "game") == 0) if (strcmp(key, "game") == 0)
{ {
@@ -376,6 +390,21 @@ SMCResult CGameConfig::ReadSMC_KeyValue(const SMCStates *states, const char *key
bShouldBeReadingDefault = true; bShouldBeReadingDefault = true;
} }
} }
} else if (m_ParseState == PSTATE_GAMEDEFS_ADDRESSES_ADDRESS || m_ParseState == PSTATE_GAMEDEFS_ADDRESSES_ADDRESS_READ) {
if (strcmp(key, "read") == 0) {
int limit = sizeof(m_AddressRead)/sizeof(m_AddressRead[0]);
if (m_AddressReadCount < limit)
{
m_AddressRead[m_AddressReadCount] = atoi(value);
m_AddressReadCount++;
}
else
{
smcore.LogError("[SM] Error parsing Address \"%s\", does not support more than %d read offsets (gameconf \"%s\")", m_Address, limit, m_CurFile);
}
} else if (strcmp(key, "signature") == 0) {
strncopy(m_AddressSignature, value, sizeof(m_AddressSignature));
}
} else if (m_ParseState == PSTATE_GAMEDEFS_CUSTOM) { } else if (m_ParseState == PSTATE_GAMEDEFS_CUSTOM) {
return m_CustomHandler->ReadSMC_KeyValue(states, key, value); return m_CustomHandler->ReadSMC_KeyValue(states, key, value);
} }
@@ -428,18 +457,18 @@ SMCResult CGameConfig::ReadSMC_LeavingSection(const SMCStates *states)
if (m_Class[0] != '\0' if (m_Class[0] != '\0'
&& m_Prop[0] != '\0') && m_Prop[0] != '\0')
{ {
SendProp *pProp = g_HL2.FindInSendTable(m_Class, m_Prop); SendProp *pProp = gamehelpers->FindInSendTable(m_Class, m_Prop);
if (pProp) if (pProp)
{ {
int val = pProp->GetOffset(); int val = gamehelpers->GetSendPropOffset(pProp);
sm_trie_replace(m_pOffsets, m_offset, (void *)val); m_Offsets.replace(m_offset, val);
sm_trie_replace(m_pProps, m_offset, pProp); m_Props.replace(m_offset, pProp);
} else { } else {
/* Check if it's a non-default game and no offsets exist */ /* Check if it's a non-default game and no offsets exist */
if (((strcmp(m_Game, "*") != 0) && strcmp(m_Game, "#default") != 0) if (((strcmp(m_Game, "*") != 0) && strcmp(m_Game, "#default") != 0)
&& (!sm_trie_retrieve(m_pOffsets, m_offset, NULL))) && (!m_Offsets.retrieve(m_offset)))
{ {
g_Logger.LogError("[SM] Unable to find property %s.%s (file \"%s\") (mod \"%s\")", smcore.LogError("[SM] Unable to find property %s.%s (file \"%s\") (mod \"%s\")",
m_Class, m_Class,
m_Prop, m_Prop,
m_CurFile, m_CurFile,
@@ -483,18 +512,20 @@ SMCResult CGameConfig::ReadSMC_LeavingSection(const SMCStates *states)
void *addrInBase = NULL; void *addrInBase = NULL;
if (strcmp(s_TempSig.library, "server") == 0) if (strcmp(s_TempSig.library, "server") == 0)
{ {
addrInBase = (void *)g_SMAPI->GetServerFactory(false); addrInBase = smcore.serverFactory;
} else if (strcmp(s_TempSig.library, "engine") == 0) { } else if (strcmp(s_TempSig.library, "engine") == 0) {
addrInBase = (void *)g_SMAPI->GetEngineFactory(false); addrInBase = smcore.engineFactory;
} else if (strcmp(s_TempSig.library, "matchmaking_ds") == 0) {
addrInBase = smcore.matchmakingDSFactory;
} }
void *final_addr = NULL; void *final_addr = NULL;
if (addrInBase == NULL) if (addrInBase == NULL)
{ {
g_Logger.LogError("[SM] Unrecognized library \"%s\" (gameconf \"%s\")", smcore.LogError("[SM] Unrecognized library \"%s\" (gameconf \"%s\")",
s_TempSig.library, s_TempSig.library,
m_CurFile); m_CurFile);
} else { } else {
#if defined PLATFORM_LINUX #if defined PLATFORM_POSIX
if (s_TempSig.sig[0] == '@') if (s_TempSig.sig[0] == '@')
{ {
Dl_info info; Dl_info info;
@@ -504,15 +535,18 @@ SMCResult CGameConfig::ReadSMC_LeavingSection(const SMCStates *states)
void *handle = dlopen(info.dli_fname, RTLD_NOW); void *handle = dlopen(info.dli_fname, RTLD_NOW);
if (handle) if (handle)
{ {
if (smcore.SymbolsAreHidden())
final_addr = g_MemUtils.ResolveSymbol(handle, &s_TempSig.sig[1]);
else
final_addr = dlsym(handle, &s_TempSig.sig[1]); final_addr = dlsym(handle, &s_TempSig.sig[1]);
dlclose(handle); dlclose(handle);
} else { } else {
g_Logger.LogError("[SM] Unable to load library \"%s\" (gameconf \"%s\")", smcore.LogError("[SM] Unable to load library \"%s\" (gameconf \"%s\")",
s_TempSig.library, s_TempSig.library,
m_File); m_File);
} }
} else { } else {
g_Logger.LogError("[SM] Unable to find library \"%s\" in memory (gameconf \"%s\")", smcore.LogError("[SM] Unable to find library \"%s\" in memory (gameconf \"%s\")",
s_TempSig.library, s_TempSig.library,
m_File); m_File);
} }
@@ -538,12 +572,42 @@ SMCResult CGameConfig::ReadSMC_LeavingSection(const SMCStates *states)
} }
} }
#if defined PLATFORM_LINUX #if defined PLATFORM_POSIX
skip_find: skip_find:
#endif #endif
sm_trie_replace(m_pSigs, m_offset, final_addr); m_Sigs.replace(m_offset, final_addr);
m_ParseState = PSTATE_GAMEDEFS_SIGNATURES; m_ParseState = PSTATE_GAMEDEFS_SIGNATURES;
break;
}
case PSTATE_GAMEDEFS_ADDRESSES:
{
m_ParseState = PSTATE_GAMEDEFS;
break;
}
case PSTATE_GAMEDEFS_ADDRESSES_ADDRESS:
{
m_ParseState = PSTATE_GAMEDEFS_ADDRESSES;
if (m_Address[0] == '\0')
{
smcore.LogError("[SM] Address sections must have names (gameconf \"%s\")", m_CurFile);
break;
}
if (m_AddressSignature[0] == '\0')
{
smcore.LogError("[SM] Address section for \"%s\" did not specify a signature (gameconf \"%s\")", m_Address, m_CurFile);
break;
}
AddressConf addrConf(m_AddressSignature, sizeof(m_AddressSignature), m_AddressReadCount, m_AddressRead);
m_pAddresses->replace(m_Address, addrConf);
break;
}
case PSTATE_GAMEDEFS_ADDRESSES_ADDRESS_READ:
{
m_ParseState = PSTATE_GAMEDEFS_ADDRESSES_ADDRESS;
break; break;
} }
} }
@@ -682,18 +746,19 @@ bool CGameConfig::Reparse(char *error, size_t maxlength)
{ {
/* Reset cached data */ /* Reset cached data */
m_pStrings->Reset(); m_pStrings->Reset();
sm_trie_clear(m_pOffsets); m_Offsets.clear();
sm_trie_clear(m_pProps); m_Props.clear();
sm_trie_clear(m_pKeys); m_Keys.clear();
m_pAddresses->clear();
char path[PLATFORM_MAX_PATH]; char path[PLATFORM_MAX_PATH];
/* See if we can use the extended gamedata format. */ /* See if we can use the extended gamedata format. */
g_SourceMod.BuildPath(Path_SM, path, sizeof(path), "gamedata/%s/master.games.txt", m_File); g_pSM->BuildPath(Path_SM, path, sizeof(path), "gamedata/%s/master.games.txt", m_File);
if (!g_LibSys.PathExists(path)) if (!libsys->PathExists(path))
{ {
/* Nope, use the old mechanism. */ /* Nope, use the old mechanism. */
UTIL_Format(path, sizeof(path), "%s.txt", m_File); smcore.Format(path, sizeof(path), "%s.txt", m_File);
return EnterFile(path, error, maxlength); return EnterFile(path, error, maxlength);
} }
@@ -708,8 +773,8 @@ bool CGameConfig::Reparse(char *error, size_t maxlength)
{ {
const char *msg = textparsers->GetSMCErrorString(err); const char *msg = textparsers->GetSMCErrorString(err);
g_Logger.LogError("[SM] Error parsing master gameconf file \"%s\":", path); smcore.LogError("[SM] Error parsing master gameconf file \"%s\":", path);
g_Logger.LogError("[SM] Error %d on line %d, col %d: %s", smcore.LogError("[SM] Error %d on line %d, col %d: %s",
err, err,
state.line, state.line,
state.col, state.col,
@@ -721,7 +786,7 @@ bool CGameConfig::Reparse(char *error, size_t maxlength)
List<String>::iterator iter; List<String>::iterator iter;
for (iter = fileList.begin(); iter != fileList.end(); iter++) for (iter = fileList.begin(); iter != fileList.end(); iter++)
{ {
UTIL_Format(path, sizeof(path), "%s/%s", m_File, (*iter).c_str()); smcore.Format(path, sizeof(path), "%s/%s", m_File, (*iter).c_str());
if (!EnterFile(path, error, maxlength)) if (!EnterFile(path, error, maxlength))
{ {
return false; return false;
@@ -729,8 +794,8 @@ bool CGameConfig::Reparse(char *error, size_t maxlength)
} }
/* Parse the contents of the 'custom' directory */ /* Parse the contents of the 'custom' directory */
g_SourceMod.BuildPath(Path_SM, path, sizeof(path), "gamedata/%s/custom", m_File); g_pSM->BuildPath(Path_SM, path, sizeof(path), "gamedata/%s/custom", m_File);
IDirectory *customDir = g_LibSys.OpenDirectory(path); IDirectory *customDir = libsys->OpenDirectory(path);
if (!customDir) if (!customDir)
{ {
@@ -755,17 +820,17 @@ bool CGameConfig::Reparse(char *error, size_t maxlength)
continue; continue;
} }
UTIL_Format(path, sizeof(path), "%s/custom/%s", m_File, curFile); smcore.Format(path, sizeof(path), "%s/custom/%s", m_File, curFile);
if (!EnterFile(path, error, maxlength)) if (!EnterFile(path, error, maxlength))
{ {
g_LibSys.CloseDirectory(customDir); libsys->CloseDirectory(customDir);
return false; return false;
} }
customDir->NextEntry(); customDir->NextEntry();
} }
g_LibSys.CloseDirectory(customDir); libsys->CloseDirectory(customDir);
return true; return true;
} }
@@ -774,7 +839,7 @@ bool CGameConfig::EnterFile(const char *file, char *error, size_t maxlength)
SMCError err; SMCError err;
SMCStates state = {0, 0}; SMCStates state = {0, 0};
g_SourceMod.BuildPath(Path_SM, m_CurFile, sizeof(m_CurFile), "gamedata/%s", file); g_pSM->BuildPath(Path_SM, m_CurFile, sizeof(m_CurFile), "gamedata/%s", file);
/* Initialize parse states */ /* Initialize parse states */
m_IgnoreLevel = 0; m_IgnoreLevel = 0;
@@ -788,8 +853,8 @@ bool CGameConfig::EnterFile(const char *file, char *error, size_t maxlength)
msg = textparsers->GetSMCErrorString(err); msg = textparsers->GetSMCErrorString(err);
g_Logger.LogError("[SM] Error parsing gameconfig file \"%s\":", m_CurFile); smcore.LogError("[SM] Error parsing gameconfig file \"%s\":", m_CurFile);
g_Logger.LogError("[SM] Error %d on line %d, col %d: %s", smcore.LogError("[SM] Error %d on line %d, col %d: %s",
err, err,
state.line, state.line,
state.col, state.col,
@@ -811,43 +876,91 @@ bool CGameConfig::EnterFile(const char *file, char *error, size_t maxlength)
bool CGameConfig::GetOffset(const char *key, int *value) bool CGameConfig::GetOffset(const char *key, int *value)
{ {
void *obj; int *pvalue;
if ((pvalue = m_Offsets.retrieve(key)) == NULL)
if (!sm_trie_retrieve(m_pOffsets, key, &obj))
{
return false; return false;
}
*value = (int)obj;
*value = *pvalue;
return true; return true;
} }
const char *CGameConfig::GetKeyValue(const char *key) const char *CGameConfig::GetKeyValue(const char *key)
{ {
void *obj; int *pkey;
if (!sm_trie_retrieve(m_pKeys, key, &obj)) if ((pkey = m_Keys.retrieve(key)) == NULL)
{
return NULL; return NULL;
return m_pStrings->GetString(*pkey);
}
//memory addresses below 0x10000 are automatically considered invalid for dereferencing
#define VALID_MINIMUM_MEMORY_ADDRESS 0x10000
bool CGameConfig::GetAddress(const char *key, void **retaddr)
{
AddressConf *addrConf;
addrConf = m_pAddresses->retrieve(key);
if (!addrConf)
{
*retaddr = NULL;
return false;
} }
return m_pStrings->GetString((int)obj);
void *addr;
if (!GetMemSig(addrConf->signatureName, &addr))
{
*retaddr = NULL;
return false;
}
for (int i = 0; i < addrConf->readCount; ++i)
{
int offset = addrConf->read[i];
//NULLs in the middle of an indirection chain are bad, end NULL is ok
if (addr == NULL || reinterpret_cast<uintptr_t>(addr) < VALID_MINIMUM_MEMORY_ADDRESS)
{
*retaddr = NULL;
return false;
}
addr = *(reinterpret_cast<void**>(reinterpret_cast<uint8_t*>(addr) + offset));
}
*retaddr = addr;
return true;
}
static inline unsigned minOf(unsigned a, unsigned b)
{
return a <= b ? a : b;
}
CGameConfig::AddressConf::AddressConf(char *sigName, unsigned sigLength, unsigned readCount, int *read)
{
unsigned readLimit = minOf(readCount, sizeof(this->read) / sizeof(this->read[0]));
strncopy(signatureName, sigName, sizeof(signatureName) / sizeof(signatureName[0]));
this->readCount = readLimit;
memcpy(&this->read[0], read, sizeof(this->read[0])*readLimit);
} }
SendProp *CGameConfig::GetSendProp(const char *key) SendProp *CGameConfig::GetSendProp(const char *key)
{ {
SendProp *pProp; SendProp **pProp;
if (!sm_trie_retrieve(m_pProps, key, (void **)&pProp)) if ((pProp = m_Props.retrieve(key)) == NULL)
{
return NULL; return NULL;
}
return pProp; return *pProp;
} }
bool CGameConfig::GetMemSig(const char *key, void **addr) bool CGameConfig::GetMemSig(const char *key, void **addr)
{ {
return sm_trie_retrieve(m_pSigs, key, addr); void **paddr;
if ((paddr = m_Sigs.retrieve(key)) == NULL)
return false;
*addr = *paddr;
return true;
} }
void CGameConfig::IncRefCount() void CGameConfig::IncRefCount()
@@ -863,31 +976,19 @@ unsigned int CGameConfig::DecRefCount()
GameConfigManager::GameConfigManager() GameConfigManager::GameConfigManager()
{ {
m_pLookup = sm_trie_create();
} }
GameConfigManager::~GameConfigManager() GameConfigManager::~GameConfigManager()
{ {
sm_trie_destroy(m_pLookup);
} }
void GameConfigManager::OnSourceModStartup(bool late) void GameConfigManager::OnSourceModStartup(bool late)
{ {
LoadGameConfigFile("core.games", &g_pGameConf, NULL, 0); LoadGameConfigFile("core.games", &g_pGameConf, NULL, 0);
strncopy(g_Game, g_SourceMod.GetGameFolderName(), sizeof(g_Game)); strncopy(g_Game, g_pSM->GetGameFolderName(), sizeof(g_Game));
strncopy(g_GameDesc + 1, SERVER_CALL(GetGameDescription)(), sizeof(g_GameDesc) - 1); strncopy(g_GameDesc + 1, smcore.GetGameDescription(), sizeof(g_GameDesc) - 1);
smcore.GetGameName(g_GameName + 1, sizeof(g_GameName) - 1);
KeyValues *pGameInfo = new KeyValues("GameInfo");
if (g_HL2.KVLoadFromFile(pGameInfo, basefilesystem, "gameinfo.txt"))
{
const char *str;
if ((str = pGameInfo->GetString("game", NULL)) != NULL)
{
strncopy(g_GameName + 1, str, sizeof(g_GameName) - 1);
}
}
pGameInfo->deleteThis();
} }
void GameConfigManager::OnSourceModAllInitialized() void GameConfigManager::OnSourceModAllInitialized()
@@ -901,7 +1002,7 @@ void GameConfigManager::OnSourceModAllInitialized()
/* :TODO: log */ /* :TODO: log */
} }
g_ShareSys.AddInterface(NULL, this); sharesys->AddInterface(NULL, this);
} }
void GameConfigManager::OnSourceModAllShutdown() void GameConfigManager::OnSourceModAllShutdown()
@@ -921,9 +1022,11 @@ bool GameConfigManager::LoadGameConfigFile(const char *file, IGameConfig **_pCon
#endif #endif
CGameConfig *pConfig; CGameConfig *pConfig;
CGameConfig **ppConfig;
if (sm_trie_retrieve(m_pLookup, file, (void **)&pConfig)) if ((ppConfig = m_Lookup.retrieve(file)) != NULL)
{ {
pConfig = *ppConfig;
pConfig->IncRefCount(); pConfig->IncRefCount();
*_pConfig = pConfig; *_pConfig = pConfig;
return true; return true;
@@ -939,7 +1042,7 @@ bool GameConfigManager::LoadGameConfigFile(const char *file, IGameConfig **_pCon
} }
m_cfgs.push_back(pConfig); m_cfgs.push_back(pConfig);
sm_trie_insert(m_pLookup, file, pConfig); m_Lookup.insert(file, pConfig);
pConfig->IncRefCount(); pConfig->IncRefCount();
@@ -954,18 +1057,18 @@ void GameConfigManager::CloseGameConfigFile(IGameConfig *cfg)
if (pConfig->DecRefCount() == 0) if (pConfig->DecRefCount() == 0)
{ {
sm_trie_delete(m_pLookup, pConfig->m_File); m_Lookup.remove(pConfig->m_File);
delete pConfig; delete pConfig;
} }
} }
extern HandleType_t g_GameConfigsType; extern Handle_t g_GameConfigsType;
IGameConfig *GameConfigManager::ReadHandle(Handle_t hndl, IdentityToken_t *ident, HandleError *err) IGameConfig *GameConfigManager::ReadHandle(Handle_t hndl, IdentityToken_t *ident, HandleError *err)
{ {
HandleSecurity sec(ident, g_pCoreIdent); HandleSecurity sec(ident, g_pCoreIdent);
IGameConfig *conf = NULL; IGameConfig *conf = NULL;
HandleError _err = g_HandleSys.ReadHandle(hndl, g_GameConfigsType, &sec, (void **)&conf); HandleError _err = handlesys->ReadHandle(hndl, g_GameConfigsType, &sec, (void **)&conf);
if (err) if (err)
{ {
@@ -32,13 +32,12 @@
#ifndef _INCLUDE_SOURCEMOD_CGAMECONFIGS_H_ #ifndef _INCLUDE_SOURCEMOD_CGAMECONFIGS_H_
#define _INCLUDE_SOURCEMOD_CGAMECONFIGS_H_ #define _INCLUDE_SOURCEMOD_CGAMECONFIGS_H_
#include "common_logic.h"
#include <IGameConfigs.h> #include <IGameConfigs.h>
#include <ITextParsers.h> #include <ITextParsers.h>
#include <sh_list.h> #include <sh_list.h>
#include "sm_trie.h"
#include "sm_globals.h"
#include "sm_memtable.h" #include "sm_memtable.h"
#include "sm_trie_tpl.h" #include <sm_trie_tpl.h>
using namespace SourceMod; using namespace SourceMod;
using namespace SourceHook; using namespace SourceHook;
@@ -65,6 +64,7 @@ public: //IGameConfig
bool GetOffset(const char *key, int *value); bool GetOffset(const char *key, int *value);
SendProp *GetSendProp(const char *key); SendProp *GetSendProp(const char *key);
bool GetMemSig(const char *key, void **addr); bool GetMemSig(const char *key, void **addr);
bool GetAddress(const char *key, void **addr);
public: public:
void IncRefCount(); void IncRefCount();
unsigned int DecRefCount(); unsigned int DecRefCount();
@@ -72,10 +72,10 @@ private:
BaseStringTable *m_pStrings; BaseStringTable *m_pStrings;
char m_File[PLATFORM_MAX_PATH]; char m_File[PLATFORM_MAX_PATH];
char m_CurFile[PLATFORM_MAX_PATH]; char m_CurFile[PLATFORM_MAX_PATH];
Trie *m_pOffsets; KTrie<int> m_Offsets;
Trie *m_pProps; KTrie<SendProp *> m_Props;
Trie *m_pKeys; KTrie<int> m_Keys;
Trie *m_pSigs; KTrie<void *> m_Sigs;
unsigned int m_RefCount; unsigned int m_RefCount;
/* Parse states */ /* Parse states */
int m_ParseState; int m_ParseState;
@@ -93,6 +93,24 @@ private:
/* Custom Sections */ /* Custom Sections */
unsigned int m_CustomLevel; unsigned int m_CustomLevel;
ITextListener_SMC *m_CustomHandler; ITextListener_SMC *m_CustomHandler;
/* Support for reading Addresses */
struct AddressConf
{
char signatureName[64];
int readCount;
int read[8];
AddressConf(char *sigName, unsigned sigLength, unsigned readCount, int *read);
AddressConf() {}
};
char m_Address[64];
char m_AddressSignature[64];
int m_AddressReadCount;
int m_AddressRead[8];
KTrie<AddressConf> *m_pAddresses;
}; };
class GameConfigManager : class GameConfigManager :
@@ -118,7 +136,7 @@ public: //SMGlobalClass
void OnSourceModAllShutdown(); void OnSourceModAllShutdown();
private: private:
List<CGameConfig *> m_cfgs; List<CGameConfig *> m_cfgs;
Trie *m_pLookup; KTrie<CGameConfig *> m_Lookup;
public: public:
KTrie<ITextListener_SMC *> m_customHandlers; KTrie<ITextListener_SMC *> m_customHandlers;
}; };
+16 -1
View File
@@ -25,7 +25,22 @@ OBJECTS = \
smn_textparse.cpp \ smn_textparse.cpp \
smn_adt_trie.cpp \ smn_adt_trie.cpp \
Profiler.cpp \ Profiler.cpp \
smn_functions.cpp smn_functions.cpp \
sm_crc32.cpp \
smn_timers.cpp \
MemoryUtils.cpp \
smn_admin.cpp \
smn_banning.cpp \
stringutil.cpp \
Translator.cpp \
PhraseCollection.cpp \
smn_lang.cpp \
smn_string.cpp \
smn_handles.cpp \
smn_datapacks.cpp \
smn_gameconfigs.cpp \
GameConfigs.cpp \
smn_players.cpp
############################################## ##############################################
### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### ### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ###
+612
View File
@@ -0,0 +1,612 @@
/**
* vim: set ts=4 sw=4 tw=99 noet :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2011 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*/
#include "MemoryUtils.h"
#ifdef PLATFORM_LINUX
#include <fcntl.h>
#include <link.h>
#include <sys/mman.h>
#define PAGE_SIZE 4096
#define PAGE_ALIGN_UP(x) ((x + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
#endif
#ifdef PLATFORM_APPLE
#include <AvailabilityMacros.h>
#include <mach/task.h>
#include <mach-o/dyld_images.h>
#include <mach-o/loader.h>
#include <mach-o/nlist.h>
/* Define things from 10.6 SDK for older SDKs */
#ifndef MAC_OS_X_VERSION_10_6
struct task_dyld_info
{
mach_vm_address_t all_image_info_addr;
mach_vm_size_t all_image_info_size;
};
typedef struct task_dyld_info task_dyld_info_data_t;
#define TASK_DYLD_INFO 17
#define TASK_DYLD_INFO_COUNT (sizeof(task_dyld_info_data_t) / sizeof(natural_t))
#endif // MAC_OS_X_VERSION_10_6
#endif // PLATFORM_APPLE
MemoryUtils g_MemUtils;
MemoryUtils::MemoryUtils()
{
#ifdef PLATFORM_APPLE
Gestalt(gestaltSystemVersionMajor, &m_OSXMajor);
Gestalt(gestaltSystemVersionMinor, &m_OSXMinor);
/* Get pointer to struct that describes all loaded mach-o images in process */
if ((m_OSXMajor == 10 && m_OSXMinor >= 6) || m_OSXMajor > 10)
{
task_dyld_info_data_t dyld_info;
mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT;
task_info(mach_task_self(), TASK_DYLD_INFO, (task_info_t)&dyld_info, &count);
m_ImageList = (struct dyld_all_image_infos *)dyld_info.all_image_info_addr;
}
else
{
struct nlist list[2];
memset(list, 0, sizeof(list));
list[0].n_un.n_name = (char *)"_dyld_all_image_infos";
nlist("/usr/lib/dyld", list);
m_ImageList = (struct dyld_all_image_infos *)list[0].n_value;
}
#endif
}
MemoryUtils::~MemoryUtils()
{
#if defined PLATFORM_LINUX || defined PLATFORM_APPLE
for (size_t i = 0; i < m_SymTables.size(); i++)
{
delete m_SymTables[i];
}
m_SymTables.clear();
#endif
}
void MemoryUtils::OnSourceModAllInitialized()
{
sharesys->AddInterface(NULL, this);
}
void *MemoryUtils::FindPattern(const void *libPtr, const char *pattern, size_t len)
{
DynLibInfo lib;
bool found;
char *ptr, *end;
memset(&lib, 0, sizeof(DynLibInfo));
if (!GetLibraryInfo(libPtr, lib))
{
return NULL;
}
ptr = reinterpret_cast<char *>(lib.baseAddress);
end = ptr + lib.memorySize;
while (ptr < end)
{
found = true;
for (register size_t i = 0; i < len; i++)
{
if (pattern[i] != '\x2A' && pattern[i] != ptr[i])
{
found = false;
break;
}
}
if (found)
return ptr;
ptr++;
}
return NULL;
}
void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol)
{
#ifdef PLATFORM_WINDOWS
return GetProcAddress((HMODULE)handle, symbol);
#elif defined PLATFORM_LINUX
struct link_map *dlmap;
struct stat dlstat;
int dlfile;
uintptr_t map_base;
Elf32_Ehdr *file_hdr;
Elf32_Shdr *sections, *shstrtab_hdr, *symtab_hdr, *strtab_hdr;
Elf32_Sym *symtab;
const char *shstrtab, *strtab;
uint16_t section_count;
uint32_t symbol_count;
LibSymbolTable *libtable;
SymbolTable *table;
Symbol *symbol_entry;
dlmap = (struct link_map *)handle;
symtab_hdr = NULL;
strtab_hdr = NULL;
table = NULL;
/* See if we already have a symbol table for this library */
for (size_t i = 0; i < m_SymTables.size(); i++)
{
libtable = m_SymTables[i];
if (libtable->lib_base == dlmap->l_addr)
{
table = &libtable->table;
break;
}
}
/* If we don't have a symbol table for this library, then create one */
if (table == NULL)
{
libtable = new LibSymbolTable();
libtable->table.Initialize();
libtable->lib_base = dlmap->l_addr;
libtable->last_pos = 0;
table = &libtable->table;
m_SymTables.push_back(libtable);
}
/* See if the symbol is already cached in our table */
symbol_entry = table->FindSymbol(symbol, strlen(symbol));
if (symbol_entry != NULL)
{
return symbol_entry->address;
}
/* If symbol isn't in our table, then we have open the actual library */
dlfile = open(dlmap->l_name, O_RDONLY);
if (dlfile == -1 || fstat(dlfile, &dlstat) == -1)
{
close(dlfile);
return NULL;
}
/* Map library file into memory */
file_hdr = (Elf32_Ehdr *)mmap(NULL, dlstat.st_size, PROT_READ, MAP_PRIVATE, dlfile, 0);
map_base = (uintptr_t)file_hdr;
if (file_hdr == MAP_FAILED)
{
close(dlfile);
return NULL;
}
close(dlfile);
if (file_hdr->e_shoff == 0 || file_hdr->e_shstrndx == SHN_UNDEF)
{
munmap(file_hdr, dlstat.st_size);
return NULL;
}
sections = (Elf32_Shdr *)(map_base + file_hdr->e_shoff);
section_count = file_hdr->e_shnum;
/* Get ELF section header string table */
shstrtab_hdr = &sections[file_hdr->e_shstrndx];
shstrtab = (const char *)(map_base + shstrtab_hdr->sh_offset);
/* Iterate sections while looking for ELF symbol table and string table */
for (uint16_t i = 0; i < section_count; i++)
{
Elf32_Shdr &hdr = sections[i];
const char *section_name = shstrtab + hdr.sh_name;
if (strcmp(section_name, ".symtab") == 0)
{
symtab_hdr = &hdr;
}
else if (strcmp(section_name, ".strtab") == 0)
{
strtab_hdr = &hdr;
}
}
/* Uh oh, we don't have a symbol table or a string table */
if (symtab_hdr == NULL || strtab_hdr == NULL)
{
munmap(file_hdr, dlstat.st_size);
return NULL;
}
symtab = (Elf32_Sym *)(map_base + symtab_hdr->sh_offset);
strtab = (const char *)(map_base + strtab_hdr->sh_offset);
symbol_count = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
/* Iterate symbol table starting from the position we were at last time */
for (uint32_t i = libtable->last_pos; i < symbol_count; i++)
{
Elf32_Sym &sym = symtab[i];
unsigned char sym_type = ELF32_ST_TYPE(sym.st_info);
const char *sym_name = strtab + sym.st_name;
Symbol *cur_sym;
/* Skip symbols that are undefined or do not refer to functions or objects */
if (sym.st_shndx == SHN_UNDEF || (sym_type != STT_FUNC && sym_type != STT_OBJECT))
{
continue;
}
/* Caching symbols as we go along */
cur_sym = table->InternSymbol(sym_name, strlen(sym_name), (void *)(dlmap->l_addr + sym.st_value));
if (strcmp(symbol, sym_name) == 0)
{
symbol_entry = cur_sym;
libtable->last_pos = ++i;
break;
}
}
munmap(file_hdr, dlstat.st_size);
return symbol_entry ? symbol_entry->address : NULL;
#elif defined PLATFORM_APPLE
uintptr_t dlbase, linkedit_addr;
uint32_t image_count;
struct mach_header *file_hdr;
struct load_command *loadcmds;
struct segment_command *linkedit_hdr;
struct symtab_command *symtab_hdr;
struct nlist *symtab;
const char *strtab;
uint32_t loadcmd_count;
uint32_t symbol_count;
LibSymbolTable *libtable;
SymbolTable *table;
Symbol *symbol_entry;
dlbase = 0;
image_count = m_ImageList->infoArrayCount;
linkedit_hdr = NULL;
symtab_hdr = NULL;
table = NULL;
/* Loop through mach-o images in process.
* We can skip index 0 since that is just the executable.
*/
for (uint32_t i = 1; i < image_count; i++)
{
const struct dyld_image_info &info = m_ImageList->infoArray[i];
/* "Load" each one until we get a matching handle */
void *h = dlopen(info.imageFilePath, RTLD_NOLOAD);
if (h == handle)
{
dlbase = (uintptr_t)info.imageLoadAddress;
dlclose(h);
break;
}
dlclose(h);
}
if (!dlbase)
{
/* Uh oh, we couldn't find a matching handle */
return NULL;
}
/* See if we already have a symbol table for this library */
for (size_t i = 0; i < m_SymTables.size(); i++)
{
libtable = m_SymTables[i];
if (libtable->lib_base == dlbase)
{
table = &libtable->table;
break;
}
}
/* If we don't have a symbol table for this library, then create one */
if (table == NULL)
{
libtable = new LibSymbolTable();
libtable->table.Initialize();
libtable->lib_base = dlbase;
libtable->last_pos = 0;
table = &libtable->table;
m_SymTables.push_back(libtable);
}
/* See if the symbol is already cached in our table */
symbol_entry = table->FindSymbol(symbol, strlen(symbol));
if (symbol_entry != NULL)
{
return symbol_entry->address;
}
/* If symbol isn't in our table, then we have to locate it in memory */
file_hdr = (struct mach_header *)dlbase;
loadcmds = (struct load_command *)(dlbase + sizeof(struct mach_header));
loadcmd_count = file_hdr->ncmds;
/* Loop through load commands until we find the ones for the symbol table */
for (uint32_t i = 0; i < loadcmd_count; i++)
{
if (loadcmds->cmd == LC_SEGMENT && !linkedit_hdr)
{
struct segment_command *seg = (struct segment_command *)loadcmds;
if (strcmp(seg->segname, "__LINKEDIT") == 0)
{
linkedit_hdr = seg;
if (symtab_hdr)
{
break;
}
}
}
else if (loadcmds->cmd == LC_SYMTAB)
{
symtab_hdr = (struct symtab_command *)loadcmds;
if (linkedit_hdr)
{
break;
}
}
/* Load commands are not of a fixed size which is why we add the size */
loadcmds = (struct load_command *)((uintptr_t)loadcmds + loadcmds->cmdsize);
}
if (!linkedit_hdr || !symtab_hdr || !symtab_hdr->symoff || !symtab_hdr->stroff)
{
/* Uh oh, no symbol table */
return NULL;
}
linkedit_addr = dlbase + linkedit_hdr->vmaddr;
symtab = (struct nlist *)(linkedit_addr + symtab_hdr->symoff - linkedit_hdr->fileoff);
strtab = (const char *)(linkedit_addr + symtab_hdr->stroff - linkedit_hdr->fileoff);
symbol_count = symtab_hdr->nsyms;
/* Iterate symbol table starting from the position we were at last time */
for (uint32_t i = libtable->last_pos; i < symbol_count; i++)
{
struct nlist &sym = symtab[i];
/* Ignore the prepended underscore on all symbols, so +1 here */
const char *sym_name = strtab + sym.n_un.n_strx + 1;
Symbol *cur_sym;
/* Skip symbols that are undefined */
if (sym.n_sect == NO_SECT)
{
continue;
}
/* Caching symbols as we go along */
cur_sym = table->InternSymbol(sym_name, strlen(sym_name), (void *)(dlbase + sym.n_value));
if (strcmp(symbol, sym_name) == 0)
{
symbol_entry = cur_sym;
libtable->last_pos = ++i;
break;
}
}
return symbol_entry ? symbol_entry->address : NULL;
#endif
}
bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib)
{
uintptr_t baseAddr;
if (libPtr == NULL)
{
return false;
}
#ifdef PLATFORM_WINDOWS
MEMORY_BASIC_INFORMATION info;
IMAGE_DOS_HEADER *dos;
IMAGE_NT_HEADERS *pe;
IMAGE_FILE_HEADER *file;
IMAGE_OPTIONAL_HEADER *opt;
if (!VirtualQuery(libPtr, &info, sizeof(MEMORY_BASIC_INFORMATION)))
{
return false;
}
baseAddr = reinterpret_cast<uintptr_t>(info.AllocationBase);
/* All this is for our insane sanity checks :o */
dos = reinterpret_cast<IMAGE_DOS_HEADER *>(baseAddr);
pe = reinterpret_cast<IMAGE_NT_HEADERS *>(baseAddr + dos->e_lfanew);
file = &pe->FileHeader;
opt = &pe->OptionalHeader;
/* Check PE magic and signature */
if (dos->e_magic != IMAGE_DOS_SIGNATURE || pe->Signature != IMAGE_NT_SIGNATURE || opt->Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
{
return false;
}
/* Check architecture, which is 32-bit/x86 right now
* Should change this for 64-bit if Valve gets their act together
*/
if (file->Machine != IMAGE_FILE_MACHINE_I386)
{
return false;
}
/* For our purposes, this must be a dynamic library */
if ((file->Characteristics & IMAGE_FILE_DLL) == 0)
{
return false;
}
/* Finally, we can do this */
lib.memorySize = opt->SizeOfImage;
#elif defined PLATFORM_LINUX
Dl_info info;
Elf32_Ehdr *file;
Elf32_Phdr *phdr;
uint16_t phdrCount;
if (!dladdr(libPtr, &info))
{
return false;
}
if (!info.dli_fbase || !info.dli_fname)
{
return false;
}
/* This is for our insane sanity checks :o */
baseAddr = reinterpret_cast<uintptr_t>(info.dli_fbase);
file = reinterpret_cast<Elf32_Ehdr *>(baseAddr);
/* Check ELF magic */
if (memcmp(ELFMAG, file->e_ident, SELFMAG) != 0)
{
return false;
}
/* Check ELF version */
if (file->e_ident[EI_VERSION] != EV_CURRENT)
{
return false;
}
/* Check ELF architecture, which is 32-bit/x86 right now
* Should change this for 64-bit if Valve gets their act together
*/
if (file->e_ident[EI_CLASS] != ELFCLASS32 || file->e_machine != EM_386 || file->e_ident[EI_DATA] != ELFDATA2LSB)
{
return false;
}
/* For our purposes, this must be a dynamic library/shared object */
if (file->e_type != ET_DYN)
{
return false;
}
phdrCount = file->e_phnum;
phdr = reinterpret_cast<Elf32_Phdr *>(baseAddr + file->e_phoff);
for (uint16_t i = 0; i < phdrCount; i++)
{
Elf32_Phdr &hdr = phdr[i];
/* We only really care about the segment with executable code */
if (hdr.p_type == PT_LOAD && hdr.p_flags == (PF_X|PF_R))
{
/* From glibc, elf/dl-load.c:
* c->mapend = ((ph->p_vaddr + ph->p_filesz + GLRO(dl_pagesize) - 1)
* & ~(GLRO(dl_pagesize) - 1));
*
* In glibc, the segment file size is aligned up to the nearest page size and
* added to the virtual address of the segment. We just want the size here.
*/
lib.memorySize = PAGE_ALIGN_UP(hdr.p_filesz);
break;
}
}
#elif defined PLATFORM_APPLE
Dl_info info;
struct mach_header *file;
struct segment_command *seg;
uint32_t cmd_count;
if (!dladdr(libPtr, &info))
{
return false;
}
if (!info.dli_fbase || !info.dli_fname)
{
return false;
}
/* This is for our insane sanity checks :o */
baseAddr = (uintptr_t)info.dli_fbase;
file = (struct mach_header *)baseAddr;
/* Check Mach-O magic */
if (file->magic != MH_MAGIC)
{
return false;
}
/* Check architecture (32-bit/x86) */
if (file->cputype != CPU_TYPE_I386 || file->cpusubtype != CPU_SUBTYPE_I386_ALL)
{
return false;
}
/* For our purposes, this must be a dynamic library */
if (file->filetype != MH_DYLIB)
{
return false;
}
cmd_count = file->ncmds;
seg = (struct segment_command *)(baseAddr + sizeof(struct mach_header));
/* Add up memory sizes of mapped segments */
for (uint32_t i = 0; i < cmd_count; i++)
{
if (seg->cmd == LC_SEGMENT)
{
lib.memorySize += seg->vmsize;
}
seg = (struct segment_command *)((uintptr_t)seg + seg->cmdsize);
}
#endif
lib.baseAddress = reinterpret_cast<void *>(baseAddr);
return true;
}
+90
View File
@@ -0,0 +1,90 @@
/**
* vim: set ts=4 sw=4 tw=99 noet :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2011 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*/
#ifndef _INCLUDE_SOURCEMOD_MEMORYUTILS_H_
#define _INCLUDE_SOURCEMOD_MEMORYUTILS_H_
#include "common_logic.h"
#include <IMemoryUtils.h>
#if defined PLATFORM_LINUX || defined PLATFORM_APPLE
#include <sh_vector.h>
#include "sm_symtable.h"
using namespace SourceHook;
#endif
using namespace SourceMod;
#ifdef PLATFORM_APPLE
#include <CoreServices/CoreServices.h>
#endif
struct DynLibInfo
{
void *baseAddress;
size_t memorySize;
};
#if defined PLATFORM_LINUX || defined PLATFORM_APPLE
struct LibSymbolTable
{
SymbolTable table;
uintptr_t lib_base;
uint32_t last_pos;
};
#endif
class MemoryUtils :
public IMemoryUtils,
public SMGlobalClass
{
public:
MemoryUtils();
~MemoryUtils();
public: // SMGlobalClass
void OnSourceModAllInitialized();
public: // IMemoryUtils
void *FindPattern(const void *libPtr, const char *pattern, size_t len);
void *ResolveSymbol(void *handle, const char *symbol);
public:
bool GetLibraryInfo(const void *libPtr, DynLibInfo &lib);
#if defined PLATFORM_LINUX || defined PLATFORM_APPLE
private:
CVector<LibSymbolTable *> m_SymTables;
#ifdef PLATFORM_APPLE
struct dyld_all_image_infos *m_ImageList;
SInt32 m_OSXMajor;
SInt32 m_OSXMinor;
#endif
#endif
};
extern MemoryUtils g_MemUtils;
#endif // _INCLUDE_SOURCEMOD_MEMORYUTILS_H_
@@ -29,9 +29,9 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "common_logic.h"
#include "PhraseCollection.h" #include "PhraseCollection.h"
#include "Translator.h" #include "Translator.h"
#include "sm_stringutil.h"
CPhraseCollection::CPhraseCollection() CPhraseCollection::CPhraseCollection()
{ {
@@ -54,7 +54,7 @@ IPhraseFile *CPhraseCollection::AddPhraseFile(const char *filename)
char full_name[PLATFORM_MAX_PATH]; char full_name[PLATFORM_MAX_PATH];
/* No compat shim here. The user should have read the doc. */ /* No compat shim here. The user should have read the doc. */
UTIL_Format(full_name, sizeof(full_name), "%s.txt", filename); smcore.Format(full_name, sizeof(full_name), "%s.txt", filename);
fid = g_Translator.FindOrAddPhraseFile(full_name); fid = g_Translator.FindOrAddPhraseFile(full_name);
pFile = g_Translator.GetFileByIndex(fid); pFile = g_Translator.GetFileByIndex(fid);
@@ -113,7 +113,7 @@ bool CPhraseCollection::FormatString(char *buffer,
unsigned int arg; unsigned int arg;
arg = 0; arg = 0;
if (!gnprintf(buffer, maxlength, format, this, params, numparams, arg, pOutLength, pFailPhrase)) if (!smcore.gnprintf(buffer, maxlength, format, this, params, numparams, arg, pOutLength, pFailPhrase))
{ {
return false; return false;
} }
+35 -3
View File
@@ -36,6 +36,7 @@
#include <time.h> #include <time.h>
#endif #endif
#include <IPluginSys.h> #include <IPluginSys.h>
#include "stringutil.h"
ProfileEngine g_Profiler; ProfileEngine g_Profiler;
IProfiler *sm_profiler = &g_Profiler; IProfiler *sm_profiler = &g_Profiler;
@@ -342,14 +343,45 @@ void ProfileEngine::OnRootConsoleCommand2(const char *cmdname, const ICommandArg
fclose(fp); fclose(fp);
Clear();
rootmenu->ConsolePrint("Profiler report generated as: %s\n", path); rootmenu->ConsolePrint("Profiler report generated as: %s\n", path);
return; return;
} }
else if (strcmp(command->Arg(2), "report") == 0)
{
FILE *fp;
char path[256];
g_pSM->BuildPath(Path_SM, path, sizeof(path), "logs/profile_%d.xml", (int)time(NULL));
if ((fp = fopen(path, "wt")) == NULL)
{
rootmenu->ConsolePrint("Failed, could not open file for writing: %s", path);
return;
}
GenerateReport(fp);
fclose(fp);
rootmenu->ConsolePrint("Profiler report generated as: %s\n", path);
return;
}
else if (strcmp(command->Arg(2), "clear") == 0)
{
Clear();
rootmenu->ConsolePrint("Profiler statistics cleared.\n");
return;
}
} }
rootmenu->ConsolePrint("Profiler commands:"); rootmenu->ConsolePrint("Profiler commands:");
rootmenu->DrawGenericOption("flush", "Flushes statistics to disk and starts over"); rootmenu->DrawGenericOption("flush", "Flushes statistics to disk and starts over");
rootmenu->DrawGenericOption("report", "Flushes statistics to disk");
rootmenu->DrawGenericOption("clear", "Clears statistics");
} }
bool ProfileEngine::GenerateReport(FILE *fp) bool ProfileEngine::GenerateReport(FILE *fp)
@@ -386,9 +418,9 @@ void ProfileEngine::WriteReport(FILE *fp, ProfileReport *report, const char *nam
{ {
ar = report->GetReport(i); ar = report->GetReport(i);
smcore.strncopy(new_name, ar->atom_name, sizeof(new_name)); strncopy(new_name, ar->atom_name, sizeof(new_name));
smcore.ReplaceAll(new_name, sizeof(new_name), "<", "&lt;", true); UTIL_ReplaceAll(new_name, sizeof(new_name), "<", "&lt;", true);
smcore.ReplaceAll(new_name, sizeof(new_name), ">", "&gt;", true); UTIL_ReplaceAll(new_name, sizeof(new_name), ">", "&gt;", true);
fprintf(fp, " <item name=\"%s\" numcalls=\"%d\" mintime=\"%f\" maxtime=\"%f\" totaltime=\"%f\"/>\n", fprintf(fp, " <item name=\"%s\" numcalls=\"%d\" mintime=\"%f\" maxtime=\"%f\" totaltime=\"%f\"/>\n",
new_name, new_name,
+1 -1
View File
@@ -126,6 +126,6 @@ private:
prof_point_t m_ProfStart; prof_point_t m_ProfStart;
}; };
extern ProfileEngine g_Profiler; extern IProfiler *sm_profiler;
#endif //_INCLUDE_SOURCEMOD_PLUGIN_PROFILER_H_ #endif //_INCLUDE_SOURCEMOD_PLUGIN_PROFILER_H_
+1 -1
View File
@@ -872,7 +872,7 @@ bool TextParsers::ParseFile_INI(const char *file, ITextListener_INI *ini_listene
ptr = save_ptr; ptr = save_ptr;
/* Lastly, strip ending whitespace off */ /* Lastly, strip ending whitespace off */
for (size_t i=len-1; i>=0 && i<len; i--) for (size_t i=len-1; i<len; i--)
{ {
if (g_ws_chartable[(unsigned char)ptr[i]]) if (g_ws_chartable[(unsigned char)ptr[i]])
{ {
+108 -105
View File
@@ -29,22 +29,24 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "common_logic.h"
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h> #include <ctype.h>
#include <sm_platform.h>
#include "Translator.h" #include "Translator.h"
#include "Logger.h" #include <IPlayerHelpers.h>
#include "LibrarySys.h" #include <ISourceMod.h>
#include "sm_stringutil.h" #include <ILibrarySys.h>
#include "sourcemod.h"
#include "PlayerManager.h"
#include "PhraseCollection.h" #include "PhraseCollection.h"
#include "ShareSys.h" #include "stringutil.h"
Translator g_Translator; Translator g_Translator;
IPhraseCollection *g_pCorePhrases = NULL; IPhraseCollection *g_pCorePhrases = NULL;
unsigned int g_pCorePhraseID = 0; unsigned int g_pCorePhraseID = 0;
using namespace SourceMod;
struct trans_t struct trans_t
{ {
int stridx; int stridx;
@@ -67,15 +69,10 @@ CPhraseFile::CPhraseFile(Translator *pTranslator, const char *file)
m_LangCount = pTranslator->GetLanguageCount(); m_LangCount = pTranslator->GetLanguageCount();
m_File.assign(file); m_File.assign(file);
m_pTranslator = pTranslator; m_pTranslator = pTranslator;
m_pPhraseLookup = NULL;
} }
CPhraseFile::~CPhraseFile() CPhraseFile::~CPhraseFile()
{ {
if (m_pPhraseLookup)
{
sm_trie_destroy(m_pPhraseLookup);
}
} }
void CPhraseFile::ParseError(const char *message, ...) void CPhraseFile::ParseError(const char *message, ...)
@@ -99,20 +96,16 @@ void CPhraseFile::ParseWarning(const char *message, ...)
if (!m_FileLogged) if (!m_FileLogged)
{ {
g_Logger.LogError("[SM] Warning(s) encountered in translation file \"%s\"", m_File.c_str()); smcore.LogError("[SM] Warning(s) encountered in translation file \"%s\"", m_File.c_str());
m_FileLogged = true; m_FileLogged = true;
} }
g_Logger.LogError("[SM] %s", buffer); smcore.LogError("[SM] %s", buffer);
} }
void CPhraseFile::ReparseFile() void CPhraseFile::ReparseFile()
{ {
if (m_pPhraseLookup) m_PhraseLookup.clear();
{
sm_trie_destroy(m_pPhraseLookup);
}
m_pPhraseLookup = sm_trie_create();
m_LangCount = m_pTranslator->GetLanguageCount(); m_LangCount = m_pTranslator->GetLanguageCount();
@@ -123,19 +116,19 @@ void CPhraseFile::ReparseFile()
SMCError err; SMCError err;
char path[PLATFORM_MAX_PATH]; char path[PLATFORM_MAX_PATH];
g_SourceMod.BuildPath(Path_SM, path, PLATFORM_MAX_PATH, "translations/%s", m_File.c_str()); g_pSM->BuildPath(Path_SM, path, PLATFORM_MAX_PATH, "translations/%s", m_File.c_str());
//backwards compatibility shim //backwards compatibility shim
/* :HACKHACK: Change .cfg/.txt and vice versa for compatibility */ /* :HACKHACK: Change .cfg/.txt and vice versa for compatibility */
if (!g_LibSys.PathExists(path)) if (!libsys->PathExists(path))
{ {
if (m_File.compare("common.cfg") == 0) if (m_File.compare("common.cfg") == 0)
{ {
UTIL_ReplaceAll(path, sizeof(path), "common.cfg", "common.phrases.txt"); UTIL_ReplaceAll(path, sizeof(path), "common.cfg", "common.phrases.txt", true);
} else if (strstr(path, ".cfg")) { } else if (strstr(path, ".cfg")) {
UTIL_ReplaceAll(path, sizeof(path), ".cfg", ".txt"); UTIL_ReplaceAll(path, sizeof(path), ".cfg", ".txt", true);
} else if (strstr(path, ".txt")) { } else if (strstr(path, ".txt")) {
UTIL_ReplaceAll(path, sizeof(path), ".txt", ".cfg"); UTIL_ReplaceAll(path, sizeof(path), ".txt", ".cfg", true);
} }
} }
@@ -149,8 +142,8 @@ void CPhraseFile::ReparseFile()
msg = m_ParseError.c_str(); msg = m_ParseError.c_str();
} }
g_Logger.LogError("[SM] Fatal error encountered parsing translation file \"%s\"", m_File.c_str()); smcore.LogError("[SM] Fatal error encountered parsing translation file \"%s\"", m_File.c_str());
g_Logger.LogError("[SM] Error (line %d, column %d): %s", states.line, states.col, msg); smcore.LogError("[SM] Error (line %d, column %d): %s", states.line, states.col, msg);
} }
const char *code; const char *code;
@@ -161,7 +154,7 @@ void CPhraseFile::ReparseFile()
continue; continue;
} }
g_SourceMod.BuildPath(Path_SM, g_pSM->BuildPath(Path_SM,
path, path,
PLATFORM_MAX_PATH, PLATFORM_MAX_PATH,
"translations/%s/%s", "translations/%s/%s",
@@ -169,7 +162,7 @@ void CPhraseFile::ReparseFile()
m_File.c_str()); m_File.c_str());
/* Speculatively load these. */ /* Speculatively load these. */
if (!g_LibSys.PathExists(path)) if (!libsys->PathExists(path))
{ {
continue; continue;
} }
@@ -182,10 +175,10 @@ void CPhraseFile::ReparseFile()
msg = m_ParseError.c_str(); msg = m_ParseError.c_str();
} }
g_Logger.LogError("[SM] Fatal error encountered parsing translation file \"%s/%s\"", smcore.LogError("[SM] Fatal error encountered parsing translation file \"%s/%s\"",
code, code,
m_File.c_str()); m_File.c_str());
g_Logger.LogError("[SM] Error (line %d, column %d): %s", smcore.LogError("[SM] Error (line %d, column %d): %s",
states.line, states.line,
states.col, states.col,
msg); msg);
@@ -217,17 +210,17 @@ SMCResult CPhraseFile::ReadSMC_NewSection(const SMCStates *states, const char *n
m_ParseState = PPS_InPhrase; m_ParseState = PPS_InPhrase;
recognized = true; recognized = true;
void *value; int *pvalue;
if (sm_trie_retrieve(m_pPhraseLookup, name, &value)) if ((pvalue = m_PhraseLookup.retrieve(name)) != NULL)
{ {
m_CurPhrase = reinterpret_cast<int>(value); m_CurPhrase = *pvalue;
} }
else else
{ {
phrase_t *pPhrase; phrase_t *pPhrase;
m_CurPhrase = m_pMemory->CreateMem(sizeof(phrase_t), (void **)&pPhrase); m_CurPhrase = m_pMemory->CreateMem(sizeof(phrase_t), (void **)&pPhrase);
sm_trie_insert(m_pPhraseLookup, name, reinterpret_cast<void *>(m_CurPhrase)); m_PhraseLookup.insert(name, m_CurPhrase);
/* Initialize new phrase */ /* Initialize new phrase */
trans_t *pTrans; trans_t *pTrans;
@@ -639,9 +632,7 @@ SMCResult CPhraseFile::ReadSMC_LeavingSection(const SMCStates *states)
if (m_ParseState == PPS_InPhrase) if (m_ParseState == PPS_InPhrase)
{ {
if (m_CurPhrase == -1 && m_LastPhraseString.size()) if (m_CurPhrase == -1 && m_LastPhraseString.size())
{ m_PhraseLookup.remove(m_LastPhraseString.c_str());
sm_trie_delete(m_pPhraseLookup, m_LastPhraseString.c_str());
}
m_CurPhrase = -1; m_CurPhrase = -1;
m_ParseState = PPS_Phrases; m_ParseState = PPS_Phrases;
m_LastPhraseString.assign(""); m_LastPhraseString.assign("");
@@ -658,9 +649,7 @@ void CPhraseFile::ReadSMC_ParseEnd(bool halted, bool failed)
{ {
/* Check to see if we have any dangling phrases that weren't completed, and scrap them */ /* Check to see if we have any dangling phrases that weren't completed, and scrap them */
if ((halted || failed) && m_LastPhraseString.size()) if ((halted || failed) && m_LastPhraseString.size())
{ m_PhraseLookup.remove(m_LastPhraseString.c_str());
sm_trie_delete(m_pPhraseLookup, m_LastPhraseString.c_str());
}
} }
TransError CPhraseFile::GetTranslation(const char *szPhrase, unsigned int lang_id, Translation *pTrans) TransError CPhraseFile::GetTranslation(const char *szPhrase, unsigned int lang_id, Translation *pTrans)
@@ -670,13 +659,11 @@ TransError CPhraseFile::GetTranslation(const char *szPhrase, unsigned int lang_i
return Trans_BadLanguage; return Trans_BadLanguage;
} }
void *object; int *pvalue;
if (!sm_trie_retrieve(m_pPhraseLookup, szPhrase, &object)) if ((pvalue = m_PhraseLookup.retrieve(szPhrase)) == NULL)
{
return Trans_BadPhrase; return Trans_BadPhrase;
}
phrase_t *pPhrase = (phrase_t *)m_pMemory->GetAddress(reinterpret_cast<int>(object)); phrase_t *pPhrase = (phrase_t *)m_pMemory->GetAddress(*pvalue);
trans_t *trans = (trans_t *)m_pMemory->GetAddress(pPhrase->trans_tbl); trans_t *trans = (trans_t *)m_pMemory->GetAddress(pPhrase->trans_tbl);
trans = &trans[lang_id]; trans = &trans[lang_id];
@@ -705,7 +692,6 @@ const char *CPhraseFile::GetFilename()
Translator::Translator() : m_ServerLang(SOURCEMOD_LANGUAGE_ENGLISH) Translator::Translator() : m_ServerLang(SOURCEMOD_LANGUAGE_ENGLISH)
{ {
m_pStringTab = new BaseStringTable(2048); m_pStringTab = new BaseStringTable(2048);
m_pLCodeLookup = sm_trie_create();
strncopy(m_InitialLang, "en", sizeof(m_InitialLang)); strncopy(m_InitialLang, "en", sizeof(m_InitialLang));
} }
@@ -721,8 +707,6 @@ Translator::~Translator()
delete m_Languages[i]; delete m_Languages[i];
} }
sm_trie_destroy(m_pLCodeLookup);
delete m_pStringTab; delete m_pStringTab;
} }
@@ -739,13 +723,13 @@ ConfigResult Translator::OnSourceModConfigChanged(const char *key,
unsigned int index; unsigned int index;
if (!GetLanguageByCode(value, &index)) if (!GetLanguageByCode(value, &index))
{ {
UTIL_Format(error, maxlength, "Language code \"%s\" is not registered", value); smcore.Format(error, maxlength, "Language code \"%s\" is not registered", value);
return ConfigResult_Reject; return ConfigResult_Reject;
} }
m_ServerLang = index; m_ServerLang = index;
} else { } else {
strncopy(m_InitialLang, value, sizeof(m_InitialLang)); smcore.strncopy(m_InitialLang, value, sizeof(m_InitialLang));
} }
return ConfigResult_Accept; return ConfigResult_Accept;
@@ -758,7 +742,7 @@ void Translator::OnSourceModLevelChange(const char *mapName)
{ {
/* Refresh language stuff */ /* Refresh language stuff */
char path[PLATFORM_MAX_PATH]; char path[PLATFORM_MAX_PATH];
g_SourceMod.BuildPath(Path_SM, path, sizeof(path), "configs/languages.cfg"); g_pSM->BuildPath(Path_SM, path, sizeof(path), "configs/languages.cfg");
RebuildLanguageDatabase(path); RebuildLanguageDatabase(path);
} }
@@ -766,10 +750,16 @@ void Translator::OnSourceModAllInitialized()
{ {
AddLanguage("en", "English"); AddLanguage("en", "English");
const char* lang = smcore.GetCoreConfigValue("ServerLang");
if (lang)
{
strncpy(m_InitialLang, lang, sizeof(m_InitialLang));
}
g_pCorePhrases = CreatePhraseCollection(); g_pCorePhrases = CreatePhraseCollection();
g_pCorePhrases->AddPhraseFile("core.phrases"); g_pCorePhrases->AddPhraseFile("core.phrases");
g_ShareSys.AddInterface(NULL, this); sharesys->AddInterface(NULL, this);
} }
void Translator::OnSourceModShutdown() void Translator::OnSourceModShutdown()
@@ -779,43 +769,38 @@ void Translator::OnSourceModShutdown()
bool Translator::GetLanguageByCode(const char *code, unsigned int *index) bool Translator::GetLanguageByCode(const char *code, unsigned int *index)
{ {
void *_index; unsigned int *pindex;
if (!sm_trie_retrieve(m_pLCodeLookup, code, &_index)) if ((pindex = m_LCodeLookup.retrieve(code)) == NULL)
{
return false; return false;
}
if (index) if (index)
{ *index = *pindex;
*index = reinterpret_cast<unsigned int>(_index);
}
return true; return true;
} }
bool Translator::GetLanguageByName(const char *name, unsigned int *index) bool Translator::GetLanguageByName(const char *name, unsigned int *index)
{ {
CVector<Language *>::iterator iter; char lower[256];
unsigned int id = 0; size_t len = strlen(name);
if (len > 255) len = 255;
for (iter=m_Languages.begin(); iter!=m_Languages.end(); iter++, id++) for (size_t i = 0; i < len; i++)
{ {
if (strcasecmp(m_pStringTab->GetString((*iter)->m_FullName), name) == 0) if (name[i] >= 'A' && name[i] <= 'Z')
{ lower[i] = tolower(name[i]);
break; else
} lower[i] = name[i];
} }
lower[len] = '\0';
if (iter == m_Languages.end()) unsigned int *pIndex;
{
if ((pIndex = m_LAliases.retrieve(lower)) == NULL)
return false; return false;
}
if (index) if (index)
{ *index = *pIndex;
*index = id;
}
return true; return true;
} }
@@ -853,8 +838,8 @@ unsigned int Translator::FindOrAddPhraseFile(const char *phrase_file)
void Translator::RebuildLanguageDatabase(const char *lang_header_file) void Translator::RebuildLanguageDatabase(const char *lang_header_file)
{ {
/* Erase everything we have */ /* Erase everything we have */
sm_trie_destroy(m_pLCodeLookup); m_LCodeLookup.clear();
m_pLCodeLookup = sm_trie_create(); m_LAliases.clear();
m_pStringTab->Reset(); m_pStringTab->Reset();
for (size_t i=0; i<m_Languages.size(); i++) for (size_t i=0; i<m_Languages.size(); i++)
@@ -874,25 +859,27 @@ void Translator::RebuildLanguageDatabase(const char *lang_header_file)
str_err = m_CustomError.c_str(); str_err = m_CustomError.c_str();
} }
g_Logger.LogError("[SM] Failed to parse language header file: \"%s\"", lang_header_file); smcore.LogError("[SM] Failed to parse language header file: \"%s\"", lang_header_file);
g_Logger.LogError("[SM] Parse error (line %d, column %d): %s", states.line, states.col, str_err); smcore.LogError("[SM] Parse error (line %d, column %d): %s", states.line, states.col, str_err);
} }
void *serverLang; unsigned int *pServerLang;
if (!sm_trie_retrieve(m_pLCodeLookup, m_InitialLang, &serverLang)) if ((pServerLang = m_LCodeLookup.retrieve(m_InitialLang)) == NULL)
{ {
g_Logger.LogError("Server language was set to bad language \"%s\" -- reverting to English", m_InitialLang); smcore.LogError("Server language was set to bad language \"%s\" -- reverting to English", m_InitialLang);
strncopy(m_InitialLang, "en", sizeof(m_InitialLang)); smcore.strncopy(m_InitialLang, "en", sizeof(m_InitialLang));
m_ServerLang = SOURCEMOD_LANGUAGE_ENGLISH; m_ServerLang = SOURCEMOD_LANGUAGE_ENGLISH;
} }
else
m_ServerLang = reinterpret_cast<unsigned int>(serverLang); {
m_ServerLang = *pServerLang;
}
if (!m_Languages.size()) if (!m_Languages.size())
{ {
g_Logger.LogError("[SM] Fatal error, no languages found! Translation will not work."); smcore.LogError("[SM] Fatal error, no languages found! Translation will not work.");
} }
for (size_t i=0; i<m_Files.size(); i++) for (size_t i=0; i<m_Files.size(); i++)
@@ -919,7 +906,7 @@ SMCResult Translator::ReadSMC_NewSection(const SMCStates *states, const char *na
if (!m_InLanguageSection) if (!m_InLanguageSection)
{ {
g_Logger.LogError("[SM] Warning: Unrecognized section \"%s\" in languages.cfg", name); smcore.LogError("[SM] Warning: Unrecognized section \"%s\" in languages.cfg", name);
} }
return SMCResult_Continue; return SMCResult_Continue;
@@ -938,8 +925,8 @@ SMCResult Translator::ReadSMC_KeyValue(const SMCStates *states, const char *key,
if (len < 2 || len > 3) if (len < 2 || len > 3)
{ {
g_Logger.LogError("[SM] Warning encountered parsing languages.cfg file."); smcore.LogError("[SM] Warning encountered parsing languages.cfg file.");
g_Logger.LogError("[SM] Invalid language code \"%s\" is being ignored.", key); smcore.LogError("[SM] Invalid language code \"%s\" is being ignored.", key);
} }
AddLanguage(key, value); AddLanguage(key, value);
@@ -949,20 +936,40 @@ SMCResult Translator::ReadSMC_KeyValue(const SMCStates *states, const char *key,
bool Translator::AddLanguage(const char *langcode, const char *description) bool Translator::AddLanguage(const char *langcode, const char *description)
{ {
if (sm_trie_retrieve(m_pLCodeLookup, langcode, NULL)) char lower[256];
size_t len = strlen(description);
if (len > 255) len = 255;
for (size_t i = 0; i < len; i++)
{ {
return false; if (description[i] >= 'A' && description[i] <= 'Z')
lower[i] = tolower(description[i]);
else
lower[i] = description[i];
} }
lower[len] = '\0';
if (m_LAliases.retrieve(lower))
return false;
unsigned int idx;
if (unsigned int *pIdx = m_LCodeLookup.retrieve(langcode))
{
idx = *pIdx;
}
else
{
Language *pLanguage = new Language; Language *pLanguage = new Language;
unsigned int idx = m_Languages.size(); idx = m_Languages.size();
UTIL_Format(pLanguage->m_code2, sizeof(pLanguage->m_code2), "%s", langcode); smcore.Format(pLanguage->m_code2, sizeof(pLanguage->m_code2), "%s", langcode);
pLanguage->m_FullName = m_pStringTab->AddString(description); pLanguage->m_CanonicalName = m_pStringTab->AddString(lower);
sm_trie_insert(m_pLCodeLookup, langcode, reinterpret_cast<void *>(idx)); m_LCodeLookup.insert(langcode, idx);
m_Languages.push_back(pLanguage); m_Languages.push_back(pLanguage);
}
m_LAliases.insert(lower, idx);
return true; return true;
} }
@@ -984,7 +991,7 @@ unsigned int Translator::GetServerLanguage()
unsigned int Translator::GetClientLanguage(int client) unsigned int Translator::GetClientLanguage(int client)
{ {
CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client);
return pPlayer->GetLanguageId(); return pPlayer->GetLanguageId();
} }
@@ -1002,7 +1009,7 @@ bool Translator::GetLanguageInfo(unsigned int number, const char **code, const c
} }
if (name) if (name)
{ {
*name = m_pStringTab->GetString(l->m_FullName); *name = m_pStringTab->GetString(l->m_CanonicalName);
} }
return true; return true;
@@ -1025,20 +1032,16 @@ IPhraseCollection *Translator::CreatePhraseCollection()
int Translator::SetGlobalTarget(int index) int Translator::SetGlobalTarget(int index)
{ {
return g_SourceMod.SetGlobalTarget(index); return g_pSM->SetGlobalTarget(index);
} }
int Translator::GetGlobalTarget() const int Translator::GetGlobalTarget() const
{ {
return g_SourceMod.GetGlobalTarget(); return g_pSM->GetGlobalTarget();
} }
bool CoreTranslate(char *buffer, bool CoreTranslate(char *buffer, size_t maxlength, const char *format, unsigned int numparams,
size_t maxlength, size_t *pOutLength, ...)
const char *format,
unsigned int numparams,
size_t *pOutLength,
...)
{ {
va_list ap; va_list ap;
unsigned int i; unsigned int i;
@@ -1068,11 +1071,11 @@ bool CoreTranslate(char *buffer,
{ {
if (fail_phrase != NULL) if (fail_phrase != NULL)
{ {
g_Logger.LogError("[SM] Could not find core phrase: %s", fail_phrase); smcore.LogError("[SM] Could not find core phrase: %s", fail_phrase);
} }
else else
{ {
g_Logger.LogError("[SM] Unknown fatal error while translating a core phrase."); smcore.LogError("[SM] Unknown fatal error while translating a core phrase.");
} }
return false; return false;
@@ -1093,7 +1096,7 @@ bool Translator::FormatString(char *buffer,
unsigned int arg; unsigned int arg;
arg = 0; arg = 0;
if (!gnprintf(buffer, maxlength, format, pPhrases, params, numparams, arg, pOutLength, pFailPhrase)) if (!smcore.gnprintf(buffer, maxlength, format, pPhrases, params, numparams, arg, pOutLength, pFailPhrase))
{ {
return false; return false;
} }
@@ -32,17 +32,14 @@
#ifndef _INCLUDE_SOURCEMOD_TRANSLATOR_H_ #ifndef _INCLUDE_SOURCEMOD_TRANSLATOR_H_
#define _INCLUDE_SOURCEMOD_TRANSLATOR_H_ #define _INCLUDE_SOURCEMOD_TRANSLATOR_H_
#include "sm_trie.h" #include "common_logic.h"
#include <sm_trie_tpl.h>
#include <sh_string.h> #include <sh_string.h>
#include <sh_vector.h> #include <sh_vector.h>
#include "sm_globals.h"
#include "sm_memtable.h" #include "sm_memtable.h"
#include "ITextParsers.h" #include "ITextParsers.h"
#include <ITranslator.h> #include <ITranslator.h>
#define MAX_TRANSLATE_PARAMS 32
#define CORELANG_ENGLISH 0
/* :TODO: write a templatized version of tries? */ /* :TODO: write a templatized version of tries? */
using namespace SourceHook; using namespace SourceHook;
@@ -58,7 +55,7 @@ enum PhraseParseState
struct Language struct Language
{ {
char m_code2[4]; char m_code2[4];
int m_FullName; int m_CanonicalName;
}; };
class CPhraseFile : class CPhraseFile :
@@ -82,7 +79,7 @@ private:
void ParseError(const char *message, ...); void ParseError(const char *message, ...);
void ParseWarning(const char *message, ...); void ParseWarning(const char *message, ...);
private: private:
Trie *m_pPhraseLookup; KTrie<int> m_PhraseLookup;
String m_File; String m_File;
Translator *m_pTranslator; Translator *m_pTranslator;
PhraseParseState m_ParseState; PhraseParseState m_ParseState;
@@ -155,7 +152,8 @@ private:
CVector<Language *> m_Languages; CVector<Language *> m_Languages;
CVector<CPhraseFile *> m_Files; CVector<CPhraseFile *> m_Files;
BaseStringTable *m_pStringTab; BaseStringTable *m_pStringTab;
Trie *m_pLCodeLookup; KTrie<unsigned int> m_LCodeLookup;
KTrie<unsigned int> m_LAliases;
bool m_InLanguageSection; bool m_InLanguageSection;
String m_CustomError; String m_CustomError;
unsigned int m_ServerLang; unsigned int m_ServerLang;
@@ -175,3 +173,4 @@ extern unsigned int g_pCorePhraseID;
extern Translator g_Translator; extern Translator g_Translator;
#endif //_INCLUDE_SOURCEMOD_TRANSLATOR_H_ #endif //_INCLUDE_SOURCEMOD_TRANSLATOR_H_
+37 -2
View File
@@ -33,8 +33,14 @@
#include <sm_platform.h> #include <sm_platform.h>
#include <string.h> #include <string.h>
#include "common_logic.h" #include "common_logic.h"
#include "ThreadSupport.h"
#include "TextParsers.h" #include "TextParsers.h"
#include "Profiler.h"
#include "sm_crc32.h"
#include "MemoryUtils.h"
#include "stringutil.h"
#include "ThreadSupport.h"
#include "Translator.h"
#include "GameConfigs.h"
sm_core_t smcore; sm_core_t smcore;
IHandleSys *handlesys; IHandleSys *handlesys;
@@ -48,11 +54,35 @@ IShareSys *sharesys;
IRootConsole *rootmenu; IRootConsole *rootmenu;
IPluginManager *pluginsys; IPluginManager *pluginsys;
IForwardManager *forwardsys; IForwardManager *forwardsys;
ITimerSystem *timersys;
ServerGlobals serverGlobals;
IPlayerManager *playerhelpers;
IAdminSystem *adminsys;
IGameHelpers *gamehelpers;
static void AddCorePhraseFile(const char *filename)
{
g_pCorePhrases->AddPhraseFile("antiflood.phrases");
}
static IGameConfig *GetCoreGameConfig()
{
return g_pGameConf;
}
static sm_logic_t logic = static sm_logic_t logic =
{ {
NULL, NULL,
g_pThreader g_pThreader,
sm_profiler,
&g_Translator,
stristr,
CoreTranslate,
AddCorePhraseFile,
UTIL_ReplaceAll,
UTIL_ReplaceEx,
UTIL_DecodeHexString,
GetCoreGameConfig
}; };
static void logic_init(const sm_core_t* core, sm_logic_t* _logic) static void logic_init(const sm_core_t* core, sm_logic_t* _logic)
@@ -61,6 +91,7 @@ static void logic_init(const sm_core_t* core, sm_logic_t* _logic)
memcpy(&smcore, core, sizeof(sm_core_t)); memcpy(&smcore, core, sizeof(sm_core_t));
memcpy(_logic, &logic, sizeof(sm_logic_t)); memcpy(_logic, &logic, sizeof(sm_logic_t));
memcpy(&serverGlobals, core->serverGlobals, sizeof(ServerGlobals));
handlesys = core->handlesys; handlesys = core->handlesys;
libsys = core->libsys; libsys = core->libsys;
@@ -71,6 +102,10 @@ static void logic_init(const sm_core_t* core, sm_logic_t* _logic)
rootmenu = core->rootmenu; rootmenu = core->rootmenu;
pluginsys = core->pluginsys; pluginsys = core->pluginsys;
forwardsys = core->forwardsys; forwardsys = core->forwardsys;
timersys = core->timersys;
playerhelpers = core->playerhelpers;
adminsys = core->adminsys;
gamehelpers = core->gamehelpers;
} }
PLATFORM_EXTERN_C ITextParsers *get_textparsers() PLATFORM_EXTERN_C ITextParsers *get_textparsers()
+5
View File
@@ -47,6 +47,11 @@ extern IShareSys *sharesys;
extern IRootConsole *rootmenu; extern IRootConsole *rootmenu;
extern IPluginManager *pluginsys; extern IPluginManager *pluginsys;
extern IForwardManager *forwardsys; extern IForwardManager *forwardsys;
extern ITimerSystem *timersys;
extern ServerGlobals serverGlobals;
extern IPlayerManager *playerhelpers;
extern IAdminSystem *adminsys;
extern IGameHelpers *gamehelpers;
#endif /* _INCLUDE_SOURCEMOD_COMMON_LOGIC_H_ */ #endif /* _INCLUDE_SOURCEMOD_COMMON_LOGIC_H_ */
+42 -2
View File
@@ -42,7 +42,7 @@ using namespace SourceMod;
* Add 1 to the RHS of this expression to bump the intercom file * Add 1 to the RHS of this expression to bump the intercom file
* This is to prevent mismatching core/logic binaries * This is to prevent mismatching core/logic binaries
*/ */
#define SM_LOGIC_MAGIC (0x0F47C0DE - 2) #define SM_LOGIC_MAGIC (0x0F47C0DE - 17)
#if defined SM_LOGIC #if defined SM_LOGIC
class IVEngineServer class IVEngineServer
@@ -52,6 +52,7 @@ class IVEngineServer_Logic
{ {
public: public:
virtual bool IsMapValid(const char *map) = 0; virtual bool IsMapValid(const char *map) = 0;
virtual void ServerCommand(const char *cmd) = 0;
}; };
namespace SourceMod namespace SourceMod
@@ -63,11 +64,25 @@ namespace SourceMod
class IRootConsole; class IRootConsole;
class IPluginManager; class IPluginManager;
class IForwardManager; class IForwardManager;
class ITimerSystem;
class IPlayerManager;
class IAdminSystem;
class IGameHelpers;
class IPhraseCollection;
class ITranslator;
class IGameConfig;
} }
class IVEngineServer; class IVEngineServer;
class ConVar; class ConVar;
struct ServerGlobals
{
const double *universalTime;
float *interval_per_tick;
float *frametime;
};
struct sm_core_t struct sm_core_t
{ {
/* Objects */ /* Objects */
@@ -80,6 +95,10 @@ struct sm_core_t
IRootConsole *rootmenu; IRootConsole *rootmenu;
IPluginManager *pluginsys; IPluginManager *pluginsys;
IForwardManager *forwardsys; IForwardManager *forwardsys;
ITimerSystem *timersys;
IPlayerManager *playerhelpers;
IAdminSystem *adminsys;
IGameHelpers *gamehelpers;
/* Functions */ /* Functions */
void (*AddNatives)(sp_nativeinfo_t* nlist); void (*AddNatives)(sp_nativeinfo_t* nlist);
ConVar * (*FindConVar)(const char*); ConVar * (*FindConVar)(const char*);
@@ -88,7 +107,20 @@ struct sm_core_t
void (*LogError)(const char*, ...); void (*LogError)(const char*, ...);
const char * (*GetCvarString)(ConVar*); const char * (*GetCvarString)(ConVar*);
size_t (*Format)(char*, size_t, const char*, ...); size_t (*Format)(char*, size_t, const char*, ...);
unsigned int (*ReplaceAll)(char*, size_t, const char *, const char *, bool); void (*GenerateError)(IPluginContext *, cell_t, int, const char *, ...);
bool (*gnprintf)(char *, size_t, const char *, IPhraseCollection *, void **,
unsigned int, unsigned int &, size_t *, const char **);
size_t (*atcprintf)(char *, size_t, const char *, IPluginContext *, const cell_t *, int *);
bool (*GetGameName)(char *buffer, size_t maxlength);
const char * (*GetGameDescription)();
const char * (*GetSourceEngineName)();
bool (*SymbolsAreHidden)();
const char * (*GetCoreConfigValue)(const char*);
/* Data */
ServerGlobals *serverGlobals;
void * serverFactory;
void * engineFactory;
void * matchmakingDSFactory;
}; };
struct sm_logic_t struct sm_logic_t
@@ -96,6 +128,14 @@ struct sm_logic_t
SMGlobalClass *head; SMGlobalClass *head;
IThreader *threader; IThreader *threader;
IProfiler *profiler; IProfiler *profiler;
ITranslator *translator;
const char *(*stristr)(const char *, const char *);
bool (*CoreTranslate)(char *, size_t, const char *, unsigned int, size_t *, ...);
void (*AddCorePhraseFile)(const char *filename);
unsigned int (*ReplaceAll)(char*, size_t, const char *, const char *, bool);
char *(*ReplaceEx)(char *, size_t, const char *, size_t, const char *, size_t, bool);
size_t (*DecodeHexString)(unsigned char *, size_t, const char *);
IGameConfig * (*GetCoreGameConfig)();
}; };
typedef void (*LogicInitFunction)(const sm_core_t *core, sm_logic_t *logic); typedef void (*LogicInitFunction)(const sm_core_t *core, sm_logic_t *logic);
+19
View File
@@ -0,0 +1,19 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logic", "logic.vcxproj", "{6EF06E6E-0ED5-4E2D-A8F3-01DD1EC25BA7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6EF06E6E-0ED5-4E2D-A8F3-01DD1EC25BA7}.Debug|Win32.ActiveCfg = Debug|Win32
{6EF06E6E-0ED5-4E2D-A8F3-01DD1EC25BA7}.Debug|Win32.Build.0 = Debug|Win32
{6EF06E6E-0ED5-4E2D-A8F3-01DD1EC25BA7}.Release|Win32.ActiveCfg = Release|Win32
{6EF06E6E-0ED5-4E2D-A8F3-01DD1EC25BA7}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
+159
View File
@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{6EF06E6E-0ED5-4E2D-A8F3-01DD1EC25BA7}</ProjectGuid>
<RootNamespace>jitx86</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..;$(MMSOURCE18)\core\sourcehook;..\..\..\public;..\..\..\public\sourcepawn;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;JITX86_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SM_DEFAULT_THREADER;SM_LOGIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Link>
<OutputFile>$(OutDir)sourcemod.logic.dll</OutputFile>
<IgnoreSpecificDefaultLibraries>LIBC;LIBCD;LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<AdditionalIncludeDirectories>..;$(MMSOURCE17)\core\sourcehook;..\..\..\public;..\..\..\public\sourcepawn;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;JITX86_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SM_LOGIC;SM_DEFAULT_THREADER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<OutputFile>$(OutDir)sourcemod.logic.dll</OutputFile>
<IgnoreSpecificDefaultLibraries>LIBC;LIBCD;LIBCMTD;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\common_logic.cpp" />
<ClCompile Include="..\GameConfigs.cpp" />
<ClCompile Include="..\MemoryUtils.cpp" />
<ClCompile Include="..\PhraseCollection.cpp" />
<ClCompile Include="..\Profiler.cpp" />
<ClCompile Include="..\sm_crc32.cpp" />
<ClCompile Include="..\smn_admin.cpp" />
<ClCompile Include="..\smn_adt_array.cpp" />
<ClCompile Include="..\smn_adt_stack.cpp" />
<ClCompile Include="..\smn_adt_trie.cpp" />
<ClCompile Include="..\smn_banning.cpp" />
<ClCompile Include="..\smn_datapacks.cpp" />
<ClCompile Include="..\smn_float.cpp" />
<ClCompile Include="..\smn_functions.cpp" />
<ClCompile Include="..\smn_gameconfigs.cpp" />
<ClCompile Include="..\smn_handles.cpp" />
<ClCompile Include="..\smn_lang.cpp" />
<ClCompile Include="..\smn_maplists.cpp" />
<ClCompile Include="..\smn_players.cpp" />
<ClCompile Include="..\smn_sorting.cpp" />
<ClCompile Include="..\smn_string.cpp" />
<ClCompile Include="..\smn_textparse.cpp" />
<ClCompile Include="..\smn_timers.cpp" />
<ClCompile Include="..\stringutil.cpp" />
<ClCompile Include="..\TextParsers.cpp" />
<ClCompile Include="..\ThreadSupport.cpp" />
<ClCompile Include="..\Translator.cpp" />
<ClCompile Include="..\thread\BaseWorker.cpp" />
<ClCompile Include="..\thread\ThreadWorker.cpp" />
<ClCompile Include="..\thread\WinThreads.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\AutoHandleRooter.h" />
<ClInclude Include="..\CellArray.h" />
<ClInclude Include="..\common_logic.h" />
<ClInclude Include="..\GameConfigs.h" />
<ClInclude Include="..\intercom.h" />
<ClInclude Include="..\MemoryUtils.h" />
<ClInclude Include="..\MersenneTwister.h" />
<ClInclude Include="..\PhraseCollection.h" />
<ClInclude Include="..\Profiler.h" />
<ClInclude Include="..\sm_crc32.h" />
<ClInclude Include="..\sm_memtable.h" />
<ClInclude Include="..\sm_symtable.h" />
<ClInclude Include="..\stringutil.h" />
<ClInclude Include="..\svn_version.h" />
<ClInclude Include="..\TextParsers.h" />
<ClInclude Include="..\ThreadSupport.h" />
<ClInclude Include="..\thread\BaseWorker.h" />
<ClInclude Include="..\thread\ThreadWorker.h" />
<ClInclude Include="..\thread\WinThreads.h" />
<ClInclude Include="..\Translator.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\version.rc" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
+188
View File
@@ -0,0 +1,188 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
</Filter>
<Filter Include="Threads">
<UniqueIdentifier>{67c1ebce-c1f8-4d2c-9ef4-33f0ef6343e9}</UniqueIdentifier>
</Filter>
<Filter Include="Threads\Header Files">
<UniqueIdentifier>{c6e2ebb3-4869-4453-9b83-e49f70cb8a05}</UniqueIdentifier>
</Filter>
<Filter Include="Threads\Source Files">
<UniqueIdentifier>{e6d8a9af-1c1b-4f0c-ae06-a9ebd5cd32e4}</UniqueIdentifier>
</Filter>
<Filter Include="Natives">
<UniqueIdentifier>{126462f2-e517-4854-8a94-759e56787536}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\common_logic.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\GameConfigs.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\MemoryUtils.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\PhraseCollection.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\Profiler.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\sm_crc32.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\stringutil.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\TextParsers.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\ThreadSupport.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\Translator.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\thread\BaseWorker.cpp">
<Filter>Threads\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\thread\ThreadWorker.cpp">
<Filter>Threads\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\thread\WinThreads.cpp">
<Filter>Threads\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\smn_admin.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_timers.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_adt_array.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_adt_stack.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_adt_trie.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_banning.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_datapacks.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_float.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_functions.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_gameconfigs.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_handles.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_lang.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_maplists.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_players.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_sorting.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_string.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_textparse.cpp">
<Filter>Natives</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\CellArray.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\common_logic.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\intercom.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\Profiler.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\svn_version.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\TextParsers.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\ThreadSupport.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\thread\BaseWorker.h">
<Filter>Threads\Header Files</Filter>
</ClInclude>
<ClInclude Include="..\thread\ThreadWorker.h">
<Filter>Threads\Header Files</Filter>
</ClInclude>
<ClInclude Include="..\thread\WinThreads.h">
<Filter>Threads\Header Files</Filter>
</ClInclude>
<ClInclude Include="..\AutoHandleRooter.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\GameConfigs.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\MemoryUtils.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\MersenneTwister.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\PhraseCollection.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_crc32.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_memtable.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_symtable.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\stringutil.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\Translator.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\version.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>
</Project>
+69 -13
View File
@@ -42,7 +42,7 @@
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..;&quot;$(MMSOURCE17)\core\sourcehook&quot;;..\..\..\public;..\..\..\public\sourcepawn" AdditionalIncludeDirectories="..;&quot;$(MMSOURCE17)\core\sourcehook&quot;;..\..\..\public;..\..\..\public\sourcepawn"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;JITX86_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SM_DEFAULT_THREADER" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;JITX86_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SM_DEFAULT_THREADER;SM_LOGIC"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
@@ -64,7 +64,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
OutputFile="$(OutDir)\sourcepawn.jit.x86.dll" OutputFile="$(OutDir)\sourcemod.logic.dll"
LinkIncremental="2" LinkIncremental="2"
IgnoreDefaultLibraryNames="LIBC;LIBCD;LIBCMT" IgnoreDefaultLibraryNames="LIBC;LIBCD;LIBCMT"
GenerateDebugInformation="true" GenerateDebugInformation="true"
@@ -185,11 +185,19 @@
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
> >
<File <File
RelativePath="..\smn_functions.cpp" RelativePath="..\common_logic.cpp"
> >
</File> </File>
<File <File
RelativePath="..\smn_adt_trie.cpp" RelativePath="..\GameConfigs.cpp"
>
</File>
<File
RelativePath="..\MemoryUtils.cpp"
>
</File>
<File
RelativePath="..\PhraseCollection.cpp"
> >
</File> </File>
<File <File
@@ -197,7 +205,11 @@
> >
</File> </File>
<File <File
RelativePath="..\common_logic.cpp" RelativePath="..\sm_crc32.cpp"
>
</File>
<File
RelativePath="..\smn_admin.cpp"
> >
</File> </File>
<File <File
@@ -208,22 +220,66 @@
RelativePath="..\smn_adt_stack.cpp" RelativePath="..\smn_adt_stack.cpp"
> >
</File> </File>
<File
RelativePath="..\smn_adt_trie.cpp"
>
</File>
<File
RelativePath="..\smn_banning.cpp"
>
</File>
<File
RelativePath="..\smn_datapacks.cpp"
>
</File>
<File <File
RelativePath="..\smn_float.cpp" RelativePath="..\smn_float.cpp"
> >
</File> </File>
<File
RelativePath="..\smn_functions.cpp"
>
</File>
<File
RelativePath="..\smn_gameconfigs.cpp"
>
</File>
<File
RelativePath="..\smn_handles.cpp"
>
</File>
<File
RelativePath="..\smn_lang.cpp"
>
</File>
<File <File
RelativePath="..\smn_maplists.cpp" RelativePath="..\smn_maplists.cpp"
> >
</File> </File>
<File
RelativePath="..\smn_players.cpp"
>
</File>
<File <File
RelativePath="..\smn_sorting.cpp" RelativePath="..\smn_sorting.cpp"
> >
</File> </File>
<File
RelativePath="..\smn_string.cpp"
>
</File>
<File <File
RelativePath="..\smn_textparse.cpp" RelativePath="..\smn_textparse.cpp"
> >
</File> </File>
<File
RelativePath="..\smn_timers.cpp"
>
</File>
<File
RelativePath="..\stringutil.cpp"
>
</File>
<File <File
RelativePath="..\TextParsers.cpp" RelativePath="..\TextParsers.cpp"
> >
@@ -232,6 +288,10 @@
RelativePath="..\ThreadSupport.cpp" RelativePath="..\ThreadSupport.cpp"
> >
</File> </File>
<File
RelativePath="..\Translator.cpp"
>
</File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
@@ -250,6 +310,10 @@
RelativePath="..\intercom.h" RelativePath="..\intercom.h"
> >
</File> </File>
<File
RelativePath="..\Profiler.h"
>
</File>
<File <File
RelativePath="..\svn_version.h" RelativePath="..\svn_version.h"
> >
@@ -262,10 +326,6 @@
RelativePath="..\ThreadSupport.h" RelativePath="..\ThreadSupport.h"
> >
</File> </File>
<File
RelativePath="..\Profiler.h"
>
</File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"
@@ -276,10 +336,6 @@
RelativePath="..\svn_version.tpl" RelativePath="..\svn_version.tpl"
> >
</File> </File>
<File
RelativePath="..\version.rc"
>
</File>
</Filter> </Filter>
<Filter <Filter
Name="Threads" Name="Threads"
@@ -1,8 +1,8 @@
/** /**
* vim: set ts=4 : * vim: set ts=4 sw=4 tw=99 noet:
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -25,8 +25,6 @@
* this exception to all derivative works. AlliedModders LLC defines further * this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>. * or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/ */
#include "sm_crc32.h" #include "sm_crc32.h"
+1 -3
View File
@@ -1,5 +1,5 @@
/** /**
* vim: set ts=4 : * vim: set ts=4 sw=4 tw=99 noet:
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
@@ -25,8 +25,6 @@
* this exception to all derivative works. AlliedModders LLC defines further * this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>. * or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/ */
#ifndef _INCLUDE_SOURCEMOD_CRC32_H_ #ifndef _INCLUDE_SOURCEMOD_CRC32_H_
+163
View File
@@ -0,0 +1,163 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#ifndef _INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_
#define _INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_
#include <stdlib.h>
#include <string.h>
class BaseMemTable
{
public:
BaseMemTable(unsigned int init_size)
{
membase = (unsigned char *)malloc(init_size);
size = init_size;
tail = 0;
}
~BaseMemTable()
{
free(membase);
membase = NULL;
}
public:
/**
* Allocates 'size' bytes of memory.
* Optionally outputs the address through 'addr'.
* Returns an index >= 0 on success, < 0 on failure.
*/
int CreateMem(unsigned int addsize, void **addr)
{
int idx = (int)tail;
while (tail + addsize >= size) {
size *= 2;
membase = (unsigned char *)realloc(membase, size);
}
tail += addsize;
if (addr)
*addr = (void *)&membase[idx];
return idx;
}
/**
* Given an index into the memory table, returns its address.
* Returns NULL if invalid.
*/
void *GetAddress(int index)
{
if (index < 0 || (unsigned int)index >= tail)
return NULL;
return &membase[index];
}
/**
* Scraps the memory table. For caching purposes, the memory
* is not freed, however subsequent calls to CreateMem() will
* begin at the first index again.
*/
void Reset()
{
tail = 0;
}
inline unsigned int GetMemUsage()
{
return size;
}
inline unsigned int GetActualMemUsed()
{
return tail;
}
private:
unsigned char *membase;
unsigned int size;
unsigned int tail;
};
class BaseStringTable
{
public:
BaseStringTable(unsigned int init_size) : m_table(init_size)
{
}
public:
/**
* Adds a string to the string table and returns its index.
*/
int AddString(const char *string)
{
size_t len = strlen(string) + 1;
int idx;
char *addr;
idx = m_table.CreateMem(len, (void **)&addr);
strcpy(addr, string);
return idx;
}
/**
* Given an index into the string table, returns the associated string.
*/
inline const char *GetString(int str)
{
return (const char *)m_table.GetAddress(str);
}
/**
* Scraps the string table. For caching purposes, the memory
* is not freed, however subsequent calls to AddString() will
* begin at the first index again.
*/
void Reset()
{
m_table.Reset();
}
/**
* Returns the parent BaseMemTable that this string table uses.
*/
inline BaseMemTable *GetMemTable()
{
return &m_table;
}
private:
BaseMemTable m_table;
};
#endif //_INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_
+231
View File
@@ -0,0 +1,231 @@
/**
* vim: set ts=4 sw=4 tw=99 noet :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*/
#ifndef _INCLUDE_SOURCEMOD_CORE_SYMBOLTABLE_H_
#define _INCLUDE_SOURCEMOD_CORE_SYMBOLTABLE_H_
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define KESTRING_TABLE_START_SIZE 65536
struct Symbol
{
size_t length;
uint32_t hash;
void *address;
Symbol *tbl_next;
inline char *buffer()
{
return reinterpret_cast<char *>(this + 1);
}
};
class SymbolTable
{
public:
~SymbolTable()
{
for (uint32_t i = 0; i < nbuckets; i++)
{
Symbol *sym = buckets[i];
while (sym != NULL)
{
Symbol *next = sym->tbl_next;
free(sym);
sym = next;
}
}
free(buckets);
}
bool Initialize()
{
buckets = (Symbol **)malloc(sizeof(Symbol *) * KESTRING_TABLE_START_SIZE);
if (buckets == NULL)
{
return false;
}
memset(buckets, 0, sizeof(Symbol *) * KESTRING_TABLE_START_SIZE);
nbuckets = KESTRING_TABLE_START_SIZE;
nused = 0;
bucketmask = KESTRING_TABLE_START_SIZE - 1;
return true;
}
static inline uint32_t HashString(const char *data, size_t len)
{
#undef get16bits
#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
|| defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
#define get16bits(d) (*((const uint16_t *) (d)))
#endif
#if !defined (get16bits)
#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
+(uint32_t)(((const uint8_t *)(d))[0]) )
#endif
uint32_t hash = len, tmp;
int rem;
if (len <= 0 || data == NULL)
{
return 0;
}
rem = len & 3;
len >>= 2;
/* Main loop */
for (;len > 0; len--) {
hash += get16bits (data);
tmp = (get16bits (data+2) << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2 * sizeof (uint16_t);
hash += hash >> 11;
}
/* Handle end cases */
switch (rem) {
case 3: hash += get16bits (data);
hash ^= hash << 16;
hash ^= data[sizeof (uint16_t)] << 18;
hash += hash >> 11;
break;
case 2: hash += get16bits (data);
hash ^= hash << 11;
hash += hash >> 17;
break;
case 1: hash += *data;
hash ^= hash << 10;
hash += hash >> 1;
}
/* Force "avalanching" of final 127 bits */
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 4;
hash += hash >> 17;
hash ^= hash << 25;
hash += hash >> 6;
return hash;
#undef get16bits
}
Symbol **FindSymbolBucket(const char *str, size_t len, uint32_t hash)
{
uint32_t bucket = hash & bucketmask;
Symbol **pkvs = &buckets[bucket];
Symbol *kvs = *pkvs;
while (kvs != NULL)
{
if (len == kvs->length && memcmp(str, kvs->buffer(), len * sizeof(char)) == 0)
{
return pkvs;
}
pkvs = &kvs->tbl_next;
kvs = *pkvs;
}
return pkvs;
}
void ResizeSymbolTable()
{
uint32_t xnbuckets = nbuckets * 2;
Symbol **xbuckets = (Symbol **)malloc(sizeof(Symbol *) * xnbuckets);
if (xbuckets == NULL)
{
return;
}
memset(xbuckets, 0, sizeof(Symbol *) * xnbuckets);
uint32_t xbucketmask = xnbuckets - 1;
for (uint32_t i = 0; i < nbuckets; i++)
{
Symbol *sym = buckets[i];
while (sym != NULL)
{
Symbol *next = sym->tbl_next;
uint32_t bucket = sym->hash & xbucketmask;
sym->tbl_next = xbuckets[bucket];
xbuckets[bucket] = sym;
sym = next;
}
}
free(buckets);
buckets = xbuckets;
nbuckets = xnbuckets;
bucketmask = xbucketmask;
}
Symbol *FindSymbol(const char *str, size_t len)
{
uint32_t hash = HashString(str, len);
Symbol **pkvs = FindSymbolBucket(str, len, hash);
return *pkvs;
}
Symbol *InternSymbol(const char* str, size_t len, void *address)
{
uint32_t hash = HashString(str, len);
Symbol **pkvs = FindSymbolBucket(str, len, hash);
if (*pkvs != NULL)
{
return *pkvs;
}
Symbol *kvs = (Symbol *)malloc(sizeof(Symbol) + sizeof(char) * (len + 1));
kvs->length = len;
kvs->hash = hash;
kvs->address = address;
kvs->tbl_next = NULL;
memcpy(kvs + 1, str, sizeof(char) * (len + 1));
*pkvs = kvs;
nused++;
if (nused > nbuckets && nbuckets <= INT_MAX / 2)
{
ResizeSymbolTable();
}
return kvs;
}
private:
uint32_t nbuckets;
uint32_t nused;
uint32_t bucketmask;
Symbol **buckets;
};
#endif //_INCLUDE_SOURCEMOD_CORE_SYMBOLTABLE_H_
+67 -48
View File
@@ -29,13 +29,15 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "sm_globals.h" #include "common_logic.h"
#include "AdminCache.h" #include <IAdminSystem.h>
#include "ForwardSys.h" #include <IForwardSys.h>
using namespace SourceMod;
static cell_t DumpAdminCache(IPluginContext *pContext, const cell_t *params) static cell_t DumpAdminCache(IPluginContext *pContext, const cell_t *params)
{ {
g_Admins.DumpAdminCache((AdminCachePart)params[1], (params[2] == 1) ? true : false); adminsys->DumpAdminCache((AdminCachePart)params[1], (params[2] == 1) ? true : false);
return 1; return 1;
} }
@@ -44,7 +46,7 @@ static cell_t AddCommandOverride(IPluginContext *pContext, const cell_t *params)
char *str; char *str;
pContext->LocalToString(params[1], &str); pContext->LocalToString(params[1], &str);
g_Admins.AddCommandOverride(str, (OverrideType)params[2], (AdminFlag)params[3]); adminsys->AddCommandOverride(str, (OverrideType)params[2], (AdminFlag)params[3]);
return 1; return 1;
} }
@@ -56,7 +58,7 @@ static cell_t GetCommandOverride(IPluginContext *pContext, const cell_t *params)
pContext->LocalToString(params[1], &cmd); pContext->LocalToString(params[1], &cmd);
if (!g_Admins.GetCommandOverride(cmd, (OverrideType)params[2], &flags)) if (!adminsys->GetCommandOverride(cmd, (OverrideType)params[2], &flags))
{ {
return 0; return 0;
} }
@@ -75,7 +77,7 @@ static cell_t UnsetCommandOverride(IPluginContext *pContext, const cell_t *param
pContext->LocalToString(params[1], &cmd); pContext->LocalToString(params[1], &cmd);
g_Admins.UnsetCommandOverride(cmd, (OverrideType)params[2]); adminsys->UnsetCommandOverride(cmd, (OverrideType)params[2]);
return 1; return 1;
} }
@@ -86,7 +88,7 @@ static cell_t CreateAdmGroup(IPluginContext *pContext, const cell_t *params)
pContext->LocalToString(params[1], &str); pContext->LocalToString(params[1], &str);
return g_Admins.AddGroup(str); return adminsys->AddGroup(str);
} }
static cell_t FindAdmGroup(IPluginContext *pContext, const cell_t *params) static cell_t FindAdmGroup(IPluginContext *pContext, const cell_t *params)
@@ -95,7 +97,7 @@ static cell_t FindAdmGroup(IPluginContext *pContext, const cell_t *params)
pContext->LocalToString(params[1], &str); pContext->LocalToString(params[1], &str);
return g_Admins.FindGroupByName(str); return adminsys->FindGroupByName(str);
} }
static cell_t SetAdmGroupAddFlag(IPluginContext *pContext, const cell_t *params) static cell_t SetAdmGroupAddFlag(IPluginContext *pContext, const cell_t *params)
@@ -104,7 +106,7 @@ static cell_t SetAdmGroupAddFlag(IPluginContext *pContext, const cell_t *params)
AdminFlag flag = (AdminFlag)params[2]; AdminFlag flag = (AdminFlag)params[2];
bool enabled = params[3] ? 1 : 0; bool enabled = params[3] ? 1 : 0;
g_Admins.SetGroupAddFlag(id, flag, enabled); adminsys->SetGroupAddFlag(id, flag, enabled);
return 1; return 1;
} }
@@ -114,7 +116,7 @@ static cell_t GetAdmGroupAddFlag(IPluginContext *pContext, const cell_t *params)
GroupId id = (GroupId)params[1]; GroupId id = (GroupId)params[1];
AdminFlag flag = (AdminFlag)params[2]; AdminFlag flag = (AdminFlag)params[2];
return g_Admins.GetGroupAddFlag(id, flag) ? 1 : 0; return adminsys->GetGroupAddFlag(id, flag) ? 1 : 0;
} }
static cell_t SetAdmGroupImmunity(IPluginContext *pContext, const cell_t *params) static cell_t SetAdmGroupImmunity(IPluginContext *pContext, const cell_t *params)
@@ -123,7 +125,7 @@ static cell_t SetAdmGroupImmunity(IPluginContext *pContext, const cell_t *params
ImmunityType type = (ImmunityType)params[2]; ImmunityType type = (ImmunityType)params[2];
bool enabled = params[3] ? 1 : 0; bool enabled = params[3] ? 1 : 0;
g_Admins.SetGroupGenericImmunity(id, type, enabled); adminsys->SetGroupGenericImmunity(id, type, enabled);
return 1; return 1;
} }
@@ -133,7 +135,7 @@ static cell_t GetAdmGroupImmunity(IPluginContext *pContext, const cell_t *params
GroupId id = (GroupId)params[1]; GroupId id = (GroupId)params[1];
ImmunityType type = (ImmunityType)params[2]; ImmunityType type = (ImmunityType)params[2];
return g_Admins.GetGroupGenericImmunity(id, type) ? 1 : 0; return adminsys->GetGroupGenericImmunity(id, type) ? 1 : 0;
} }
static cell_t SetAdmGroupImmuneFrom(IPluginContext *pContext, const cell_t *params) static cell_t SetAdmGroupImmuneFrom(IPluginContext *pContext, const cell_t *params)
@@ -141,7 +143,7 @@ static cell_t SetAdmGroupImmuneFrom(IPluginContext *pContext, const cell_t *para
GroupId id = (GroupId)params[1]; GroupId id = (GroupId)params[1];
GroupId other_id = (GroupId)params[2]; GroupId other_id = (GroupId)params[2];
g_Admins.AddGroupImmunity(id, other_id); adminsys->AddGroupImmunity(id, other_id);
return 1; return 1;
} }
@@ -150,14 +152,14 @@ static cell_t GetAdmGroupImmuneCount(IPluginContext *pContext, const cell_t *par
{ {
GroupId id = (GroupId)params[1]; GroupId id = (GroupId)params[1];
return g_Admins.GetGroupImmunityCount(id); return adminsys->GetGroupImmunityCount(id);
} }
static cell_t GetAdmGroupImmuneFrom(IPluginContext *pContext, const cell_t *params) static cell_t GetAdmGroupImmuneFrom(IPluginContext *pContext, const cell_t *params)
{ {
GroupId id = (GroupId)params[1]; GroupId id = (GroupId)params[1];
return g_Admins.GetGroupImmunity(id, params[2]); return adminsys->GetGroupImmunity(id, params[2]);
} }
static cell_t AddAdmGroupCmdOverride(IPluginContext *pContext, const cell_t *params) static cell_t AddAdmGroupCmdOverride(IPluginContext *pContext, const cell_t *params)
@@ -169,7 +171,7 @@ static cell_t AddAdmGroupCmdOverride(IPluginContext *pContext, const cell_t *par
pContext->LocalToString(params[2], &cmd); pContext->LocalToString(params[2], &cmd);
g_Admins.AddGroupCommandOverride(id, cmd, type, rule); adminsys->AddGroupCommandOverride(id, cmd, type, rule);
return 1; return 1;
} }
@@ -183,7 +185,7 @@ static cell_t GetAdmGroupCmdOverride(IPluginContext *pContext, const cell_t *par
pContext->LocalToString(params[2], &cmd); pContext->LocalToString(params[2], &cmd);
if (!g_Admins.GetGroupCommandOverride(id, cmd, type, &rule)) if (!adminsys->GetGroupCommandOverride(id, cmd, type, &rule))
{ {
return 0; return 0;
} }
@@ -198,7 +200,7 @@ static cell_t GetAdmGroupCmdOverride(IPluginContext *pContext, const cell_t *par
static cell_t GetAdmGroupAddFlags(IPluginContext *pContext, const cell_t *params) static cell_t GetAdmGroupAddFlags(IPluginContext *pContext, const cell_t *params)
{ {
GroupId id = (GroupId)params[1]; GroupId id = (GroupId)params[1];
return g_Admins.GetGroupAddFlags(id); return adminsys->GetGroupAddFlags(id);
} }
static cell_t RegisterAuthIdentType(IPluginContext *pContext, const cell_t *params) static cell_t RegisterAuthIdentType(IPluginContext *pContext, const cell_t *params)
@@ -206,7 +208,7 @@ static cell_t RegisterAuthIdentType(IPluginContext *pContext, const cell_t *para
char *type; char *type;
pContext->LocalToString(params[1], &type); pContext->LocalToString(params[1], &type);
g_Admins.RegisterAuthIdentType(type); adminsys->RegisterAuthIdentType(type);
return 1; return 1;
} }
@@ -221,14 +223,14 @@ static cell_t CreateAdmin(IPluginContext *pContext, const cell_t *params)
admin = NULL; admin = NULL;
} }
return g_Admins.CreateAdmin(admin); return adminsys->CreateAdmin(admin);
} }
static cell_t GetAdminUsername(IPluginContext *pContext, const cell_t *params) static cell_t GetAdminUsername(IPluginContext *pContext, const cell_t *params)
{ {
AdminId id = params[1]; AdminId id = params[1];
size_t written; size_t written;
const char *name = g_Admins.GetAdminName(id); const char *name = adminsys->GetAdminName(id);
if (!name) if (!name)
{ {
@@ -248,7 +250,7 @@ static cell_t BindAdminIdentity(IPluginContext *pContext, const cell_t *params)
pContext->LocalToString(params[2], &auth); pContext->LocalToString(params[2], &auth);
pContext->LocalToString(params[3], &ident); pContext->LocalToString(params[3], &ident);
return g_Admins.BindAdminIdentity(id, auth, ident); return adminsys->BindAdminIdentity(id, auth, ident);
} }
static cell_t SetAdminFlag(IPluginContext *pContext, const cell_t *params) static cell_t SetAdminFlag(IPluginContext *pContext, const cell_t *params)
@@ -257,7 +259,7 @@ static cell_t SetAdminFlag(IPluginContext *pContext, const cell_t *params)
AdminFlag flag = (AdminFlag)params[2]; AdminFlag flag = (AdminFlag)params[2];
bool enabled = params[3] ? true : false; bool enabled = params[3] ? true : false;
g_Admins.SetAdminFlag(id, flag, enabled); adminsys->SetAdminFlag(id, flag, enabled);
return 1; return 1;
} }
@@ -268,7 +270,7 @@ static cell_t GetAdminFlag(IPluginContext *pContext, const cell_t *params)
AdminFlag flag = (AdminFlag)params[2]; AdminFlag flag = (AdminFlag)params[2];
AccessMode mode = (AccessMode)params[3]; AccessMode mode = (AccessMode)params[3];
return g_Admins.GetAdminFlag(id, flag, mode); return adminsys->GetAdminFlag(id, flag, mode);
} }
static cell_t GetAdminFlags(IPluginContext *pContext, const cell_t *params) static cell_t GetAdminFlags(IPluginContext *pContext, const cell_t *params)
@@ -276,7 +278,7 @@ static cell_t GetAdminFlags(IPluginContext *pContext, const cell_t *params)
AdminId id = params[1]; AdminId id = params[1];
AccessMode mode = (AccessMode)params[2]; AccessMode mode = (AccessMode)params[2];
return g_Admins.GetAdminFlags(id, mode); return adminsys->GetAdminFlags(id, mode);
} }
static cell_t AdminInheritGroup(IPluginContext *pContext, const cell_t *params) static cell_t AdminInheritGroup(IPluginContext *pContext, const cell_t *params)
@@ -284,14 +286,14 @@ static cell_t AdminInheritGroup(IPluginContext *pContext, const cell_t *params)
AdminId id = params[1]; AdminId id = params[1];
GroupId gid = params[2]; GroupId gid = params[2];
return g_Admins.AdminInheritGroup(id, gid); return adminsys->AdminInheritGroup(id, gid);
} }
static cell_t GetAdminGroupCount(IPluginContext *pContext, const cell_t *params) static cell_t GetAdminGroupCount(IPluginContext *pContext, const cell_t *params)
{ {
AdminId id = params[1]; AdminId id = params[1];
return g_Admins.GetAdminGroupCount(id); return adminsys->GetAdminGroupCount(id);
} }
static cell_t GetAdminGroup(IPluginContext *pContext, const cell_t *params) static cell_t GetAdminGroup(IPluginContext *pContext, const cell_t *params)
@@ -301,7 +303,7 @@ static cell_t GetAdminGroup(IPluginContext *pContext, const cell_t *params)
const char *name; const char *name;
GroupId gid; GroupId gid;
if ((gid=g_Admins.GetAdminGroup(id, index, &name)) == INVALID_GROUP_ID) if ((gid=adminsys->GetAdminGroup(id, index, &name)) == INVALID_GROUP_ID)
{ {
return gid; return gid;
} }
@@ -323,7 +325,7 @@ static cell_t SetAdminPassword(IPluginContext *pContext, const cell_t *params)
pContext->LocalToString(params[2], &password); pContext->LocalToString(params[2], &password);
g_Admins.SetAdminPassword(id, password); adminsys->SetAdminPassword(id, password);
return 1; return 1;
} }
@@ -331,7 +333,7 @@ static cell_t SetAdminPassword(IPluginContext *pContext, const cell_t *params)
static cell_t GetAdminPassword(IPluginContext *pContext, const cell_t *params) static cell_t GetAdminPassword(IPluginContext *pContext, const cell_t *params)
{ {
AdminId id = params[1]; AdminId id = params[1];
const char *password = g_Admins.GetAdminPassword(id); const char *password = adminsys->GetAdminPassword(id);
if (!password) if (!password)
{ {
@@ -350,14 +352,14 @@ static cell_t FindAdminByIdentity(IPluginContext *pContext, const cell_t *params
pContext->LocalToString(params[1], &auth); pContext->LocalToString(params[1], &auth);
pContext->LocalToString(params[2], &ident); pContext->LocalToString(params[2], &ident);
return g_Admins.FindAdminByIdentity(auth, ident); return adminsys->FindAdminByIdentity(auth, ident);
} }
static cell_t RemoveAdmin(IPluginContext *pContext, const cell_t *params) static cell_t RemoveAdmin(IPluginContext *pContext, const cell_t *params)
{ {
AdminId id = params[1]; AdminId id = params[1];
return g_Admins.InvalidateAdmin(id); return adminsys->InvalidateAdmin(id);
} }
static cell_t FlagBitsToBitArray(IPluginContext *pContext, const cell_t *params) static cell_t FlagBitsToBitArray(IPluginContext *pContext, const cell_t *params)
@@ -365,7 +367,7 @@ static cell_t FlagBitsToBitArray(IPluginContext *pContext, const cell_t *params)
FlagBits bits = (FlagBits)params[1]; FlagBits bits = (FlagBits)params[1];
bool array[AdminFlags_TOTAL]; bool array[AdminFlags_TOTAL];
cell_t *addr; cell_t *addr;
unsigned int numWr = g_Admins.FlagBitsToBitArray(bits, array, AdminFlags_TOTAL); unsigned int numWr = adminsys->FlagBitsToBitArray(bits, array, AdminFlags_TOTAL);
pContext->LocalToPhysAddr(params[2], &addr); pContext->LocalToPhysAddr(params[2], &addr);
@@ -391,7 +393,7 @@ static cell_t FlagBitArrayToBits(IPluginContext *pContext, const cell_t *params)
array[i] = addr[i] ? true : false; array[i] = addr[i] ? true : false;
} }
return g_Admins.FlagBitArrayToBits(array, num); return adminsys->FlagBitArrayToBits(array, num);
} }
static cell_t FlagArrayToBits(IPluginContext *pContext, const cell_t *params) static cell_t FlagArrayToBits(IPluginContext *pContext, const cell_t *params)
@@ -401,7 +403,7 @@ static cell_t FlagArrayToBits(IPluginContext *pContext, const cell_t *params)
if (sizeof(AdminFlag) == sizeof(cell_t)) if (sizeof(AdminFlag) == sizeof(cell_t))
{ {
return g_Admins.FlagArrayToBits((const AdminFlag *)addr, params[2]); return adminsys->FlagArrayToBits((const AdminFlag *)addr, params[2]);
} else { } else {
AdminFlag flags[AdminFlags_TOTAL]; AdminFlag flags[AdminFlags_TOTAL];
unsigned int num = ((unsigned)params[2] > AdminFlags_TOTAL ? AdminFlags_TOTAL : params[2]); unsigned int num = ((unsigned)params[2] > AdminFlags_TOTAL ? AdminFlags_TOTAL : params[2]);
@@ -410,7 +412,7 @@ static cell_t FlagArrayToBits(IPluginContext *pContext, const cell_t *params)
{ {
flags[i] = (AdminFlag)addr[i]; flags[i] = (AdminFlag)addr[i];
} }
return g_Admins.FlagArrayToBits(flags, num); return adminsys->FlagArrayToBits(flags, num);
} }
} }
@@ -421,11 +423,11 @@ static cell_t FlagBitsToArray(IPluginContext *pContext, const cell_t *params)
if (sizeof(AdminFlag) == sizeof(cell_t)) if (sizeof(AdminFlag) == sizeof(cell_t))
{ {
return g_Admins.FlagBitsToArray(params[1], (AdminFlag *)addr, params[3]); return adminsys->FlagBitsToArray(params[1], (AdminFlag *)addr, params[3]);
} else { } else {
AdminFlag flags[AdminFlags_TOTAL]; AdminFlag flags[AdminFlags_TOTAL];
unsigned int num = ((unsigned)params[2] > AdminFlags_TOTAL ? AdminFlags_TOTAL : params[2]); unsigned int num = ((unsigned)params[2] > AdminFlags_TOTAL ? AdminFlags_TOTAL : params[2]);
num = g_Admins.FlagBitsToArray(params[1], flags, num); num = adminsys->FlagBitsToArray(params[1], flags, num);
for (unsigned int i=0; i<num; i++) for (unsigned int i=0; i<num; i++)
{ {
@@ -438,36 +440,36 @@ static cell_t FlagBitsToArray(IPluginContext *pContext, const cell_t *params)
static cell_t CanAdminTarget(IPluginContext *pContext, const cell_t *params) static cell_t CanAdminTarget(IPluginContext *pContext, const cell_t *params)
{ {
return g_Admins.CanAdminTarget(params[1], params[2]) ? 1 : 0; return adminsys->CanAdminTarget(params[1], params[2]) ? 1 : 0;
} }
static cell_t CreateAuthMethod(IPluginContext *pContext, const cell_t *params) static cell_t CreateAuthMethod(IPluginContext *pContext, const cell_t *params)
{ {
char *name; char *name;
pContext->LocalToString(params[1], &name); pContext->LocalToString(params[1], &name);
g_Admins.RegisterAuthIdentType(name); adminsys->RegisterAuthIdentType(name);
return 1; return 1;
} }
static cell_t SetAdmGroupImmunityLevel(IPluginContext *pContext, const cell_t *params) static cell_t SetAdmGroupImmunityLevel(IPluginContext *pContext, const cell_t *params)
{ {
return g_Admins.SetGroupImmunityLevel(params[1], params[2]); return adminsys->SetGroupImmunityLevel(params[1], params[2]);
} }
static cell_t GetAdmGroupImmunityLevel(IPluginContext *pContext, const cell_t *params) static cell_t GetAdmGroupImmunityLevel(IPluginContext *pContext, const cell_t *params)
{ {
return g_Admins.GetGroupImmunityLevel(params[1]); return adminsys->GetGroupImmunityLevel(params[1]);
} }
static cell_t SetAdminImmunityLevel(IPluginContext *pContext, const cell_t *params) static cell_t SetAdminImmunityLevel(IPluginContext *pContext, const cell_t *params)
{ {
return g_Admins.SetAdminImmunityLevel(params[1], params[2]); return adminsys->SetAdminImmunityLevel(params[1], params[2]);
} }
static cell_t GetAdminImmunityLevel(IPluginContext *pContext, const cell_t *params) static cell_t GetAdminImmunityLevel(IPluginContext *pContext, const cell_t *params)
{ {
return g_Admins.GetAdminImmunityLevel(params[1]); return adminsys->GetAdminImmunityLevel(params[1]);
} }
static cell_t FindFlagByName(IPluginContext *pContext, const cell_t *params) static cell_t FindFlagByName(IPluginContext *pContext, const cell_t *params)
@@ -479,7 +481,7 @@ static cell_t FindFlagByName(IPluginContext *pContext, const cell_t *params)
pContext->LocalToPhysAddr(params[2], &addr); pContext->LocalToPhysAddr(params[2], &addr);
AdminFlag admflag; AdminFlag admflag;
if (!g_Admins.FindFlag(flag, &admflag)) if (!adminsys->FindFlag(flag, &admflag))
{ {
return 0; return 0;
} }
@@ -495,7 +497,7 @@ static cell_t FindFlagByChar(IPluginContext *pContext, const cell_t *params)
pContext->LocalToPhysAddr(params[2], &addr); pContext->LocalToPhysAddr(params[2], &addr);
AdminFlag admflag; AdminFlag admflag;
if (!g_Admins.FindFlag((char)params[1], &admflag)) if (!adminsys->FindFlag((char)params[1], &admflag))
{ {
return 0; return 0;
} }
@@ -505,6 +507,22 @@ static cell_t FindFlagByChar(IPluginContext *pContext, const cell_t *params)
return 1; return 1;
} }
static cell_t FindFlagChar(IPluginContext *pContext, const cell_t *params)
{
cell_t *addr;
pContext->LocalToPhysAddr(params[2], &addr);
char flagchar;
if (!adminsys->FindFlagChar((AdminFlag)params[1], &flagchar))
{
return 0;
}
*addr = (cell_t)flagchar;
return 1;
}
static cell_t ReadFlagString(IPluginContext *pContext, const cell_t *params) static cell_t ReadFlagString(IPluginContext *pContext, const cell_t *params)
{ {
char *flag; char *flag;
@@ -514,7 +532,7 @@ static cell_t ReadFlagString(IPluginContext *pContext, const cell_t *params)
pContext->LocalToPhysAddr(params[2], &addr); pContext->LocalToPhysAddr(params[2], &addr);
const char *end = flag; const char *end = flag;
FlagBits bits = g_Admins.ReadFlagString(flag, &end); FlagBits bits = adminsys->ReadFlagString(flag, &end);
*addr = end - flag; *addr = end - flag;
@@ -561,6 +579,7 @@ REGISTER_NATIVES(adminNatives)
{"CreateAuthMethod", CreateAuthMethod}, {"CreateAuthMethod", CreateAuthMethod},
{"FindFlagByName", FindFlagByName}, {"FindFlagByName", FindFlagByName},
{"FindFlagByChar", FindFlagByChar}, {"FindFlagByChar", FindFlagByChar},
{"FindFlagChar", FindFlagChar},
{"ReadFlagString", ReadFlagString}, {"ReadFlagString", ReadFlagString},
{"GetAdmGroupImmunityLevel",GetAdmGroupImmunityLevel}, {"GetAdmGroupImmunityLevel",GetAdmGroupImmunityLevel},
{"SetAdmGroupImmunityLevel",SetAdmGroupImmunityLevel}, {"SetAdmGroupImmunityLevel",SetAdmGroupImmunityLevel},
@@ -29,11 +29,12 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "sm_globals.h" #include "common_logic.h"
#include "sm_stringutil.h" #include <string.h>
#include "HalfLife2.h" #include <IGameHelpers.h>
#include "PlayerManager.h" #include <IPlayerHelpers.h>
#include "ForwardSys.h" #include <IForwardSys.h>
#include "stringutil.h"
#define BANFLAG_AUTO (1<<0) /**< Auto-detects whether to ban by steamid or IP */ #define BANFLAG_AUTO (1<<0) /**< Auto-detects whether to ban by steamid or IP */
#define BANFLAG_IP (1<<1) /**< Always ban by IP address */ #define BANFLAG_IP (1<<1) /**< Always ban by IP address */
@@ -50,7 +51,7 @@ class BanNativeHelpers : public SMGlobalClass
public: public:
void OnSourceModAllInitialized() void OnSourceModAllInitialized()
{ {
g_pOnBanClient = g_Forwards.CreateForward( g_pOnBanClient = forwardsys->CreateForward(
"OnBanClient", "OnBanClient",
ET_Event, ET_Event,
7, 7,
@@ -62,7 +63,7 @@ public:
Param_String, Param_String,
Param_String, Param_String,
Param_Cell); Param_Cell);
g_pOnBanIdentity = g_Forwards.CreateForward( g_pOnBanIdentity = forwardsys->CreateForward(
"OnBanIdentity", "OnBanIdentity",
ET_Event, ET_Event,
6, 6,
@@ -73,7 +74,7 @@ public:
Param_String, Param_String,
Param_String, Param_String,
Param_Cell); Param_Cell);
g_pOnRemoveBan = g_Forwards.CreateForward( g_pOnRemoveBan = forwardsys->CreateForward(
"OnRemoveBan", "OnRemoveBan",
ET_Event, ET_Event,
4, 4,
@@ -85,9 +86,9 @@ public:
} }
void OnSourceModShutdown() void OnSourceModShutdown()
{ {
g_Forwards.ReleaseForward(g_pOnBanClient); forwardsys->ReleaseForward(g_pOnBanClient);
g_Forwards.ReleaseForward(g_pOnBanIdentity); forwardsys->ReleaseForward(g_pOnBanIdentity);
g_Forwards.ReleaseForward(g_pOnRemoveBan); forwardsys->ReleaseForward(g_pOnRemoveBan);
g_pOnBanClient = NULL; g_pOnBanClient = NULL;
g_pOnBanIdentity = NULL; g_pOnBanIdentity = NULL;
@@ -118,7 +119,7 @@ static cell_t BanIdentity(IPluginContext *pContext, const cell_t *params)
/* Sanitize the input */ /* Sanitize the input */
char identity[64]; char identity[64];
strncopy(identity, r_identity, sizeof(identity)); strncopy(identity, r_identity, sizeof(identity));
UTIL_ReplaceAll(identity, sizeof(identity), ";", ""); UTIL_ReplaceAll(identity, sizeof(identity), ";", "", true);
cell_t handled = 0; cell_t handled = 0;
if (ban_cmd[0] != '\0' && g_pOnBanIdentity->GetFunctionCount() > 0) if (ban_cmd[0] != '\0' && g_pOnBanIdentity->GetFunctionCount() > 0)
@@ -139,7 +140,7 @@ static cell_t BanIdentity(IPluginContext *pContext, const cell_t *params)
char command[256]; char command[256];
if (ban_by_ip) if (ban_by_ip)
{ {
UTIL_Format( smcore.Format(
command, command,
sizeof(command), sizeof(command),
"addip %d %s\n", "addip %d %s\n",
@@ -152,9 +153,9 @@ static cell_t BanIdentity(IPluginContext *pContext, const cell_t *params)
engine->ServerCommand("writeip\n"); engine->ServerCommand("writeip\n");
} }
} }
else if (!g_HL2.IsLANServer()) else if (!gamehelpers->IsLANServer())
{ {
UTIL_Format( smcore.Format(
command, command,
sizeof(command), sizeof(command),
"banid %d %s\n", "banid %d %s\n",
@@ -195,7 +196,7 @@ static cell_t RemoveBan(IPluginContext *pContext, const cell_t *params)
char identity[64]; char identity[64];
strncopy(identity, r_identity, sizeof(identity)); strncopy(identity, r_identity, sizeof(identity));
UTIL_ReplaceAll(identity, sizeof(identity), ";", ""); UTIL_ReplaceAll(identity, sizeof(identity), ";", "", true);
cell_t handled = 0; cell_t handled = 0;
if (ban_cmd[0] != '\0' && g_pOnRemoveBan->GetFunctionCount() > 0) if (ban_cmd[0] != '\0' && g_pOnRemoveBan->GetFunctionCount() > 0)
@@ -212,7 +213,7 @@ static cell_t RemoveBan(IPluginContext *pContext, const cell_t *params)
{ {
if (!handled) if (!handled)
{ {
UTIL_Format( smcore.Format(
command, command,
sizeof(command), sizeof(command),
"removeip %s\n", "removeip %s\n",
@@ -221,11 +222,11 @@ static cell_t RemoveBan(IPluginContext *pContext, const cell_t *params)
engine->ServerCommand("writeip\n"); engine->ServerCommand("writeip\n");
} }
} }
else if (!g_HL2.IsLANServer()) else if (!gamehelpers->IsLANServer())
{ {
if (!handled) if (!handled)
{ {
UTIL_Format( smcore.Format(
command, command,
sizeof(command), sizeof(command),
"removeid %s\n", "removeid %s\n",
@@ -248,9 +249,9 @@ static cell_t BanClient(IPluginContext *pContext, const cell_t *params)
char *ban_reason, *ban_cmd; char *ban_reason, *ban_cmd;
int client, ban_flags, ban_source, ban_time; int client, ban_flags, ban_source, ban_time;
client = g_HL2.ReferenceToIndex(params[1]); client = gamehelpers->ReferenceToIndex(params[1]);
CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client);
if (!pPlayer || !pPlayer->IsConnected()) if (!pPlayer || !pPlayer->IsConnected())
{ {
return pContext->ThrowNativeError("Client index %d is invalid", client); return pContext->ThrowNativeError("Client index %d is invalid", client);
@@ -268,11 +269,16 @@ static cell_t BanClient(IPluginContext *pContext, const cell_t *params)
ban_flags = params[3]; ban_flags = params[3];
ban_source = params[7]; ban_source = params[7];
#if SOURCE_ENGINE != SE_DARKMESSIAH
/* Check how we should ban the player */ /* Check how we should ban the player */
if ((ban_flags & BANFLAG_AUTO) == BANFLAG_AUTO) if (!strcmp(smcore.GetSourceEngineName(), "darkmessiah"))
{ {
if (g_HL2.IsLANServer() || !pPlayer->IsAuthorized()) /* Dark Messiah doesn't have Steam IDs so there is only one ban method to choose */
ban_flags |= BANFLAG_IP;
ban_flags &= ~BANFLAG_AUTHID;
}
else if ((ban_flags & BANFLAG_AUTO) == BANFLAG_AUTO)
{
if (gamehelpers->IsLANServer() || !pPlayer->IsAuthorized())
{ {
ban_flags |= BANFLAG_IP; ban_flags |= BANFLAG_IP;
ban_flags &= ~BANFLAG_AUTHID; ban_flags &= ~BANFLAG_AUTHID;
@@ -304,11 +310,6 @@ static cell_t BanClient(IPluginContext *pContext, const cell_t *params)
{ {
return pContext->ThrowNativeError("No valid ban method flags specified"); return pContext->ThrowNativeError("No valid ban method flags specified");
} }
#else
/* Dark Messiah doesn't have Steam IDs so there is only one ban method to choose */
ban_flags |= BANFLAG_IP;
ban_flags &= ~BANFLAG_AUTHID;
#endif
cell_t handled = 0; cell_t handled = 0;
if (ban_cmd[0] != '\0' && g_pOnBanClient->GetFunctionCount() > 0) if (ban_cmd[0] != '\0' && g_pOnBanClient->GetFunctionCount() > 0)
@@ -335,7 +336,7 @@ static cell_t BanClient(IPluginContext *pContext, const cell_t *params)
{ {
/* Get the IP address and strip the port */ /* Get the IP address and strip the port */
char ip[24], *ptr; char ip[24], *ptr;
strncopy(ip, pPlayer->GetIPAddress(), sizeof(ip)); smcore.strncopy(ip, pPlayer->GetIPAddress(), sizeof(ip));
if ((ptr = strchr(ip, ':')) != NULL) if ((ptr = strchr(ip, ':')) != NULL)
{ {
*ptr = '\0'; *ptr = '\0';
@@ -343,7 +344,7 @@ static cell_t BanClient(IPluginContext *pContext, const cell_t *params)
/* Tell the server to ban the ip */ /* Tell the server to ban the ip */
char command[256]; char command[256];
UTIL_Format( smcore.Format(
command, command,
sizeof(command), sizeof(command),
"addip %d %s\n", "addip %d %s\n",
@@ -367,7 +368,7 @@ static cell_t BanClient(IPluginContext *pContext, const cell_t *params)
{ {
/* Tell the server to ban the auth string */ /* Tell the server to ban the auth string */
char command[256]; char command[256];
UTIL_Format( smcore.Format(
command, command,
sizeof(command), sizeof(command),
"banid %d %s\n", "banid %d %s\n",
@@ -377,7 +378,7 @@ static cell_t BanClient(IPluginContext *pContext, const cell_t *params)
/* Kick, then ban */ /* Kick, then ban */
if ((ban_flags & BANFLAG_NOKICK) != BANFLAG_NOKICK) if ((ban_flags & BANFLAG_NOKICK) != BANFLAG_NOKICK)
{ {
g_HL2.AddDelayedKick(client, pPlayer->GetUserId(), kick_message); gamehelpers->AddDelayedKick(client, pPlayer->GetUserId(), kick_message);
} }
engine->ServerCommand(command); engine->ServerCommand(command);
@@ -390,7 +391,7 @@ static cell_t BanClient(IPluginContext *pContext, const cell_t *params)
} }
else if ((ban_flags & BANFLAG_NOKICK) != BANFLAG_NOKICK) else if ((ban_flags & BANFLAG_NOKICK) != BANFLAG_NOKICK)
{ {
g_HL2.AddDelayedKick(client, pPlayer->GetUserId(), kick_message); gamehelpers->AddDelayedKick(client, pPlayer->GetUserId(), kick_message);
} }
@@ -1,8 +1,8 @@
/** /**
* vim: set ts=4 : * vim: set ts=4 sw=4 tw=99 noet :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -29,9 +29,10 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "sm_globals.h" #include "common_logic.h"
#include "HandleSys.h" #include <IHandleSys.h>
#include "CDataPack.h" #include <IDataPack.h>
#include <ISourceMod.h>
HandleType_t g_DataPackType; HandleType_t g_DataPackType;
@@ -45,35 +46,35 @@ public:
HandleAccess hacc; HandleAccess hacc;
TypeAccess tacc; TypeAccess tacc;
g_HandleSys.InitAccessDefaults(&tacc, &hacc); handlesys->InitAccessDefaults(&tacc, &hacc);
tacc.access[HTypeAccess_Create] = true; tacc.access[HTypeAccess_Create] = true;
tacc.access[HTypeAccess_Inherit] = true; tacc.access[HTypeAccess_Inherit] = true;
tacc.ident = g_pCoreIdent; tacc.ident = g_pCoreIdent;
hacc.access[HandleAccess_Read] = HANDLE_RESTRICT_OWNER; hacc.access[HandleAccess_Read] = HANDLE_RESTRICT_OWNER;
g_DataPackType = g_HandleSys.CreateType("DataPack", this, 0, &tacc, &hacc, g_pCoreIdent, NULL); g_DataPackType = handlesys->CreateType("DataPack", this, 0, &tacc, &hacc, g_pCoreIdent, NULL);
} }
void OnSourceModShutdown() void OnSourceModShutdown()
{ {
g_HandleSys.RemoveType(g_DataPackType, g_pCoreIdent); handlesys->RemoveType(g_DataPackType, g_pCoreIdent);
g_DataPackType = 0; g_DataPackType = 0;
} }
void OnHandleDestroy(HandleType_t type, void *object) void OnHandleDestroy(HandleType_t type, void *object)
{ {
g_SourceMod.FreeDataPack(reinterpret_cast<IDataPack *>(object)); g_pSM->FreeDataPack(reinterpret_cast<IDataPack *>(object));
} }
}; };
static cell_t smn_CreateDataPack(IPluginContext *pContext, const cell_t *params) static cell_t smn_CreateDataPack(IPluginContext *pContext, const cell_t *params)
{ {
IDataPack *pDataPack = g_SourceMod.CreateDataPack(); IDataPack *pDataPack = g_pSM->CreateDataPack();
if (!pDataPack) if (!pDataPack)
{ {
return 0; return 0;
} }
return g_HandleSys.CreateHandle(g_DataPackType, pDataPack, pContext->GetIdentity(), g_pCoreIdent, NULL); return handlesys->CreateHandle(g_DataPackType, pDataPack, pContext->GetIdentity(), g_pCoreIdent, NULL);
} }
static cell_t smn_WritePackCell(IPluginContext *pContext, const cell_t *params) static cell_t smn_WritePackCell(IPluginContext *pContext, const cell_t *params)
@@ -86,7 +87,7 @@ static cell_t smn_WritePackCell(IPluginContext *pContext, const cell_t *params)
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack)) if ((herr=handlesys->ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr); return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr);
@@ -107,7 +108,7 @@ static cell_t smn_WritePackFloat(IPluginContext *pContext, const cell_t *params)
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack)) if ((herr=handlesys->ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr); return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr);
@@ -129,7 +130,7 @@ static cell_t smn_WritePackString(IPluginContext *pContext, const cell_t *params
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack)) if ((herr=handlesys->ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr); return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr);
@@ -157,7 +158,7 @@ static cell_t smn_ReadPackCell(IPluginContext *pContext, const cell_t *params)
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack)) if ((herr=handlesys->ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr); return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr);
@@ -181,7 +182,7 @@ static cell_t smn_ReadPackFloat(IPluginContext *pContext, const cell_t *params)
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack)) if ((herr=handlesys->ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr); return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr);
@@ -205,7 +206,7 @@ static cell_t smn_ReadPackString(IPluginContext *pContext, const cell_t *params)
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack)) if ((herr=handlesys->ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr); return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr);
@@ -232,7 +233,7 @@ static cell_t smn_ResetPack(IPluginContext *pContext, const cell_t *params)
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack)) if ((herr=handlesys->ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr); return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr);
@@ -257,7 +258,7 @@ static cell_t smn_GetPackPosition(IPluginContext *pContext, const cell_t *params
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack)) if ((herr=handlesys->ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr); return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr);
@@ -276,7 +277,7 @@ static cell_t smn_SetPackPosition(IPluginContext *pContext, const cell_t *params
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack)) if ((herr=handlesys->ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr); return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr);
@@ -300,7 +301,7 @@ static cell_t smn_IsPackReadable(IPluginContext *pContext, const cell_t *params)
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack)) if ((herr=handlesys->ReadHandle(hndl, g_DataPackType, &sec, (void **)&pDataPack))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr); return pContext->ThrowNativeError("Invalid data pack handle %x (error %d)", hndl, herr);
@@ -29,24 +29,24 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "sourcemod.h" #include "common_logic.h"
#include "HandleSys.h" #include <IHandleSys.h>
#include "GameConfigs.h" #include "GameConfigs.h"
HandleType_t g_GameConfigsType; HandleType_t g_GameConfigsType;
class GameConfigsNatives : class GameConfigsNatives :
public IHandleTypeDispatch, public IHandleTypeDispatch,
public SourceModBase public SMGlobalClass
{ {
public: public:
void OnSourceModAllInitialized() void OnSourceModAllInitialized()
{ {
g_GameConfigsType = g_HandleSys.CreateType("GameConfigs", this, 0, NULL, NULL, g_pCoreIdent, NULL); g_GameConfigsType = handlesys->CreateType("GameConfigs", this, 0, NULL, NULL, g_pCoreIdent, NULL);
} }
void OnSourceModShutdown() void OnSourceModShutdown()
{ {
g_HandleSys.RemoveType(g_GameConfigsType, g_pCoreIdent); handlesys->RemoveType(g_GameConfigsType, g_pCoreIdent);
g_GameConfigsType = 0; g_GameConfigsType = 0;
} }
void OnHandleDestroy(HandleType_t type, void *object) void OnHandleDestroy(HandleType_t type, void *object)
@@ -67,7 +67,7 @@ static cell_t smn_LoadGameConfigFile(IPluginContext *pCtx, const cell_t *params)
return pCtx->ThrowNativeError("Unable to open %s: %s", filename, error); return pCtx->ThrowNativeError("Unable to open %s: %s", filename, error);
} }
return g_HandleSys.CreateHandle(g_GameConfigsType, gc, pCtx->GetIdentity(), g_pCoreIdent, NULL); return handlesys->CreateHandle(g_GameConfigsType, gc, pCtx->GetIdentity(), g_pCoreIdent, NULL);
} }
static cell_t smn_GameConfGetOffset(IPluginContext *pCtx, const cell_t *params) static cell_t smn_GameConfGetOffset(IPluginContext *pCtx, const cell_t *params)
@@ -80,7 +80,7 @@ static cell_t smn_GameConfGetOffset(IPluginContext *pCtx, const cell_t *params)
sec.pOwner = NULL; sec.pOwner = NULL;
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_GameConfigsType, &sec, (void **)&gc)) if ((herr=handlesys->ReadHandle(hndl, g_GameConfigsType, &sec, (void **)&gc))
!= HandleError_None) != HandleError_None)
{ {
return pCtx->ThrowNativeError("Invalid game config handle %x (error %d)", hndl, herr); return pCtx->ThrowNativeError("Invalid game config handle %x (error %d)", hndl, herr);
@@ -108,7 +108,7 @@ static cell_t smn_GameConfGetKeyValue(IPluginContext *pCtx, const cell_t *params
sec.pOwner = NULL; sec.pOwner = NULL;
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_GameConfigsType, &sec, (void **)&gc)) if ((herr=handlesys->ReadHandle(hndl, g_GameConfigsType, &sec, (void **)&gc))
!= HandleError_None) != HandleError_None)
{ {
return pCtx->ThrowNativeError("Invalid game config handle %x (error %d)", hndl, herr); return pCtx->ThrowNativeError("Invalid game config handle %x (error %d)", hndl, herr);
@@ -128,6 +128,33 @@ static cell_t smn_GameConfGetKeyValue(IPluginContext *pCtx, const cell_t *params
return 1; return 1;
} }
static cell_t smn_GameConfGetAddress(IPluginContext *pCtx, const cell_t *params)
{
Handle_t hndl = static_cast<Handle_t>(params[1]);
HandleError herr;
HandleSecurity sec;
IGameConfig *gc;
sec.pOwner = NULL;
sec.pIdentity = g_pCoreIdent;
if ((herr=handlesys->ReadHandle(hndl, g_GameConfigsType, &sec, (void **)&gc))
!= HandleError_None)
{
return pCtx->ThrowNativeError("Invalid game config handle %x (error %d)", hndl, herr);
}
char *key;
void* val;
pCtx->LocalToString(params[2], &key);
if (!gc->GetAddress(key, &val))
return 0;
return (cell_t)val;
}
static GameConfigsNatives s_GameConfigsNatives; static GameConfigsNatives s_GameConfigsNatives;
REGISTER_NATIVES(gameconfignatives) REGISTER_NATIVES(gameconfignatives)
@@ -135,5 +162,6 @@ REGISTER_NATIVES(gameconfignatives)
{"LoadGameConfigFile", smn_LoadGameConfigFile}, {"LoadGameConfigFile", smn_LoadGameConfigFile},
{"GameConfGetOffset", smn_GameConfGetOffset}, {"GameConfGetOffset", smn_GameConfGetOffset},
{"GameConfGetKeyValue", smn_GameConfGetKeyValue}, {"GameConfGetKeyValue", smn_GameConfGetKeyValue},
{"GameConfGetAddress", smn_GameConfGetAddress},
{NULL, NULL} {NULL, NULL}
}; };
@@ -29,15 +29,17 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "sm_globals.h" #include "common_logic.h"
#include "HandleSys.h" #include <IHandleSys.h>
#include "PluginSys.h" #include <IPluginSys.h>
using namespace SourceMod;
static cell_t sm_IsValidHandle(IPluginContext *pContext, const cell_t *params) static cell_t sm_IsValidHandle(IPluginContext *pContext, const cell_t *params)
{ {
Handle_t hndl = static_cast<Handle_t>(params[1]); Handle_t hndl = static_cast<Handle_t>(params[1]);
HandleError err = g_HandleSys.ReadHandle(hndl, 0, NULL, NULL); HandleError err = handlesys->ReadHandle(hndl, 0, NULL, NULL);
if (err != HandleError_Access if (err != HandleError_Access
&& err != HandleError_None) && err != HandleError_None)
@@ -56,7 +58,7 @@ static cell_t sm_CloseHandle(IPluginContext *pContext, const cell_t *params)
sec.pIdentity = NULL; sec.pIdentity = NULL;
sec.pOwner = pContext->GetIdentity(); sec.pOwner = pContext->GetIdentity();
HandleError err = g_HandleSys.FreeHandle(hndl, &sec); HandleError err = handlesys->FreeHandle(hndl, &sec);
if (err == HandleError_None) if (err == HandleError_None)
{ {
@@ -80,7 +82,7 @@ static cell_t sm_CloneHandle(IPluginContext *pContext, const cell_t *params)
pNewOwner = pContext->GetIdentity(); pNewOwner = pContext->GetIdentity();
} else { } else {
Handle_t hPlugin = static_cast<Handle_t>(params[2]); Handle_t hPlugin = static_cast<Handle_t>(params[2]);
IPlugin *pPlugin = g_PluginSys.PluginFromHandle(hPlugin, &err); IPlugin *pPlugin = pluginsys->PluginFromHandle(hPlugin, &err);
if (!pPlugin) if (!pPlugin)
{ {
return pContext->ThrowNativeError("Plugin handle %x is invalid (error %d)", hndl, err); return pContext->ThrowNativeError("Plugin handle %x is invalid (error %d)", hndl, err);
@@ -88,7 +90,7 @@ static cell_t sm_CloneHandle(IPluginContext *pContext, const cell_t *params)
pNewOwner = pPlugin->GetIdentity(); pNewOwner = pPlugin->GetIdentity();
} }
err = g_HandleSys.CloneHandle(hndl, &new_hndl, pNewOwner, NULL); err = handlesys->CloneHandle(hndl, &new_hndl, pNewOwner, NULL);
if (err == HandleError_Access) if (err == HandleError_Access)
{ {
@@ -102,7 +104,7 @@ static cell_t sm_CloneHandle(IPluginContext *pContext, const cell_t *params)
static cell_t sm_GetMyHandle(IPluginContext *pContext, const cell_t *params) static cell_t sm_GetMyHandle(IPluginContext *pContext, const cell_t *params)
{ {
CPlugin *pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext()); IPlugin *pPlugin = pluginsys->FindPluginByContext(pContext->GetContext());
return pPlugin->GetMyHandle(); return pPlugin->GetMyHandle();
} }
+51 -8
View File
@@ -29,20 +29,20 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "PluginSys.h" #include "common_logic.h"
#include "Translator.h" #include "Translator.h"
#include "LibrarySys.h" #include <IPlayerHelpers.h>
#include "sm_stringutil.h" #include <IPluginSys.h>
#include "PlayerManager.h" #include <ISourceMod.h>
static cell_t sm_LoadTranslations(IPluginContext *pCtx, const cell_t *params) static cell_t sm_LoadTranslations(IPluginContext *pCtx, const cell_t *params)
{ {
char *filename, *ext; char *filename, *ext;
char buffer[PLATFORM_MAX_PATH]; char buffer[PLATFORM_MAX_PATH];
CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext()); IPlugin *pl = pluginsys->FindPluginByContext(pCtx->GetContext());
pCtx->LocalToString(params[1], &filename); pCtx->LocalToString(params[1], &filename);
UTIL_Format(buffer, sizeof(buffer), "%s", filename); smcore.Format(buffer, sizeof(buffer), "%s", filename);
/* Make sure there is no extension */ /* Make sure there is no extension */
if ((ext = strstr(buffer, ".txt")) != NULL if ((ext = strstr(buffer, ".txt")) != NULL
@@ -62,14 +62,14 @@ static cell_t sm_LoadTranslations(IPluginContext *pCtx, const cell_t *params)
static cell_t sm_SetGlobalTransTarget(IPluginContext *pContext, const cell_t *params) static cell_t sm_SetGlobalTransTarget(IPluginContext *pContext, const cell_t *params)
{ {
g_SourceMod.SetGlobalTarget(params[1]); g_pSM->SetGlobalTarget(params[1]);
return 1; return 1;
} }
static cell_t sm_GetClientLanguage(IPluginContext *pContext, const cell_t *params) static cell_t sm_GetClientLanguage(IPluginContext *pContext, const cell_t *params)
{ {
CPlayer *player = g_Players.GetPlayerByIndex(params[1]); IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
if (!player || !player->IsConnected()) if (!player || !player->IsConnected())
{ {
return pContext->ThrowNativeError("Invalid client index %d", params[1]); return pContext->ThrowNativeError("Invalid client index %d", params[1]);
@@ -104,6 +104,46 @@ static cell_t sm_GetLanguageInfo(IPluginContext *pContext, const cell_t *params)
return 1; return 1;
} }
static cell_t sm_SetClientLanguage(IPluginContext *pContext, const cell_t *params)
{
IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
if (!player || !player->IsConnected())
{
return pContext->ThrowNativeError("Invalid client index %d", params[1]);
}
player->SetLanguageId(params[2]);
return 1;
}
static cell_t sm_GetLanguageByCode(IPluginContext *pContext, const cell_t *params)
{
char *code;
unsigned int langid;
pContext->LocalToString(params[1], &code);
if (g_Translator.GetLanguageByCode(code, &langid))
return langid;
return -1;
}
static cell_t sm_GetLanguageByName(IPluginContext *pContext, const cell_t *params)
{
char *name;
unsigned int langid;
pContext->LocalToString(params[1], &name);
if (g_Translator.GetLanguageByName(name, &langid))
return langid;
return -1;
}
REGISTER_NATIVES(langNatives) REGISTER_NATIVES(langNatives)
{ {
{"LoadTranslations", sm_LoadTranslations}, {"LoadTranslations", sm_LoadTranslations},
@@ -112,5 +152,8 @@ REGISTER_NATIVES(langNatives)
{"GetServerLanguage", sm_GetServerLanguage}, {"GetServerLanguage", sm_GetServerLanguage},
{"GetLanguageCount", sm_GetLanguageCount}, {"GetLanguageCount", sm_GetLanguageCount},
{"GetLanguageInfo", sm_GetLanguageInfo}, {"GetLanguageInfo", sm_GetLanguageInfo},
{"SetClientLanguage", sm_SetClientLanguage},
{"GetLanguageByCode", sm_GetLanguageByCode},
{"GetLanguageByName", sm_GetLanguageByName},
{NULL, NULL}, {NULL, NULL},
}; };
+235
View File
@@ -0,0 +1,235 @@
/**
* vim: set ts=4 sw=4 tw=99 noet :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include "common_logic.h"
#include <IPluginSys.h>
#include <IPlayerHelpers.h>
#include <sh_string.h>
#include <sh_list.h>
#include "AutoHandleRooter.h"
#include "CellArray.h"
using namespace SourceHook;
using namespace SourceMod;
class PlayerLogicHelpers :
public SMGlobalClass,
public IPluginsListener,
public ICommandTargetProcessor
{
struct SimpleMultiTargetFilter
{
IPlugin *plugin;
SourceHook::String pattern;
IPluginFunction *fun;
SourceHook::String phrase;
bool phraseIsML;
SimpleMultiTargetFilter(IPlugin *plugin, const char *pattern, IPluginFunction *fun,
const char *phrase, bool phraseIsML)
: plugin(plugin), pattern(pattern), fun(fun), phrase(phrase), phraseIsML(phraseIsML)
{
}
};
List<SimpleMultiTargetFilter *> simpleMultis;
bool filterEnabled;
public:
void AddMultiTargetFilter(IPlugin *plugin, const char *pattern, IPluginFunction *fun,
const char *phrase, bool phraseIsML)
{
SimpleMultiTargetFilter *smtf = new SimpleMultiTargetFilter(plugin, pattern, fun, phrase,
phraseIsML);
simpleMultis.push_back(smtf);
if (!filterEnabled) {
playerhelpers->RegisterCommandTargetProcessor(this);
filterEnabled = true;
}
}
void RemoveMultiTargetFilter(const char *pattern, IPluginFunction *fun)
{
List<SimpleMultiTargetFilter *>::iterator iter = simpleMultis.begin();
while (iter != simpleMultis.end()) {
if ((*iter)->fun == fun && strcmp((*iter)->pattern.c_str(), pattern) == 0) {
delete (*iter);
iter = simpleMultis.erase(iter);
break;
}
iter++;
}
}
PlayerLogicHelpers()
: filterEnabled(false)
{
}
public: //ICommandTargetProcessor
bool ProcessCommandTarget(cmd_target_info_t *info)
{
List<SimpleMultiTargetFilter *>::iterator iter;
for (iter = simpleMultis.begin(); iter != simpleMultis.end(); iter++) {
SimpleMultiTargetFilter *smtf = (*iter);
if (strcmp(smtf->pattern.c_str(), info->pattern) == 0) {
CellArray *array = new CellArray(1);
HandleSecurity sec(g_pCoreIdent, g_pCoreIdent);
Handle_t hndl = handlesys->CreateHandleEx(htCellArray, array, &sec, NULL, NULL);
AutoHandleCloner ahc(hndl, sec);
if (ahc.getClone() == BAD_HANDLE) {
smcore.LogError("[SM] Could not allocate a handle (%s, %d)", __FILE__, __LINE__);
delete array;
return false;
}
smtf->fun->PushString(info->pattern);
smtf->fun->PushCell(ahc.getClone());
cell_t result = 0;
if (smtf->fun->Execute(&result) != SP_ERROR_NONE || !result)
return false;
IGamePlayer *pAdmin = info->admin
? playerhelpers->GetGamePlayer(info->admin)
: NULL;
info->num_targets = 0;
for (size_t i = 0; i < array->size(); i++) {
cell_t client = *array->at(i);
IGamePlayer *pClient = playerhelpers->GetGamePlayer(client);
if (pClient == NULL || !pClient->IsConnected())
continue;
if (playerhelpers->FilterCommandTarget(pAdmin, pClient, info->flags) ==
COMMAND_TARGET_VALID)
{
info->targets[info->num_targets++] = client;
if (info->num_targets >= unsigned(info->max_targets))
break;
}
}
info->reason = info->num_targets > 0
? COMMAND_TARGET_VALID
: COMMAND_TARGET_EMPTY_FILTER;
if (info->num_targets) {
smcore.strncopy(info->target_name, smtf->phrase.c_str(), info->target_name_maxlength);
info->target_name_style = smtf->phraseIsML
? COMMAND_TARGETNAME_ML
: COMMAND_TARGETNAME_RAW;
}
return true;
}
}
return false;
}
public: //SMGlobalClass
void OnSourceModAllInitialized()
{
pluginsys->AddPluginsListener(this);
}
void OnSourceModShutdown()
{
pluginsys->RemovePluginsListener(this);
if (filterEnabled) {
playerhelpers->UnregisterCommandTargetProcessor(this);
filterEnabled = false;
}
}
public: //IPluginsListener
void OnPluginDestroyed(IPlugin *plugin)
{
List<SimpleMultiTargetFilter *>::iterator iter = simpleMultis.begin();
while (iter != simpleMultis.end()) {
if ((*iter)->plugin != plugin) {
iter++;
} else {
delete (*iter);
iter = simpleMultis.erase(iter);
}
}
}
} s_PlayerLogicHelpers;
static cell_t
AddMultiTargetFilter(IPluginContext *ctx, const cell_t *params)
{
IPluginFunction *fun = ctx->GetFunctionById(funcid_t(params[2]));
if (fun == NULL)
return ctx->ThrowNativeError("Invalid function id (%X)", params[2]);
char *pattern;
char *phrase;
ctx->LocalToString(params[1], &pattern);
ctx->LocalToString(params[3], &phrase);
bool phraseIsML = !!params[4];
IPlugin *plugin = pluginsys->FindPluginByContext(ctx->GetContext());
s_PlayerLogicHelpers.AddMultiTargetFilter(plugin, pattern, fun, phrase, phraseIsML);
return 1;
}
static cell_t
RemoveMultiTargetFilter(IPluginContext *ctx, const cell_t *params)
{
IPluginFunction *fun = ctx->GetFunctionById(funcid_t(params[2]));
if (fun == NULL)
return ctx->ThrowNativeError("Invalid function id (%X)", params[2]);
char *pattern;
ctx->LocalToString(params[1], &pattern);
s_PlayerLogicHelpers.RemoveMultiTargetFilter(pattern, fun);
return 1;
}
REGISTER_NATIVES(playernatives)
{
{"AddMultiTargetFilter", AddMultiTargetFilter},
{"RemoveMultiTargetFilter", RemoveMultiTargetFilter},
{NULL, NULL}
};
@@ -29,12 +29,13 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "sm_globals.h" #include "common_logic.h"
#include "HandleSys.h" #include <IHandleSys.h>
#if !defined PLATFORM_WINDOWS
//Note: Do not add this to Linux yet, i haven't done the HPET timing research (if even available) #include <stddef.h>
//nonetheless we need accurate counting #include <stdint.h>
#if !defined PLATFORM_LINUX #include <sys/time.h>
#endif
struct Profiler struct Profiler
{ {
@@ -47,6 +48,9 @@ struct Profiler
LARGE_INTEGER start; LARGE_INTEGER start;
LARGE_INTEGER end; LARGE_INTEGER end;
double freq; double freq;
#else
struct timeval start;
struct timeval end;
#endif #endif
bool started; bool started;
bool stopped; bool stopped;
@@ -61,11 +65,11 @@ class ProfilerHelpers :
public: public:
void OnSourceModAllInitialized() void OnSourceModAllInitialized()
{ {
g_ProfilerType = g_HandleSys.CreateType("Profiler", this, 0, NULL, NULL, g_pCoreIdent, NULL); g_ProfilerType = handlesys->CreateType("Profiler", this, 0, NULL, NULL, g_pCoreIdent, NULL);
} }
void OnSourceModShutdown() void OnSourceModShutdown()
{ {
g_HandleSys.RemoveType(g_ProfilerType, g_pCoreIdent); handlesys->RemoveType(g_ProfilerType, g_pCoreIdent);
} }
void OnHandleDestroy(HandleType_t type, void *object) void OnHandleDestroy(HandleType_t type, void *object)
{ {
@@ -84,7 +88,7 @@ static cell_t CreateProfiler(IPluginContext *pContext, const cell_t *params)
p->freq = 1.0 / (double)(qpf.QuadPart); p->freq = 1.0 / (double)(qpf.QuadPart);
#endif #endif
Handle_t hndl = g_HandleSys.CreateHandle(g_ProfilerType, p, pContext->GetIdentity(), g_pCoreIdent, NULL); Handle_t hndl = handlesys->CreateHandle(g_ProfilerType, p, pContext->GetIdentity(), g_pCoreIdent, NULL);
if (hndl == BAD_HANDLE) if (hndl == BAD_HANDLE)
{ {
delete p; delete p;
@@ -100,7 +104,7 @@ static cell_t StartProfiling(IPluginContext *pContext, const cell_t *params)
HandleError err; HandleError err;
Profiler *prof; Profiler *prof;
if ((err = g_HandleSys.ReadHandle(hndl, g_ProfilerType, &sec, (void **)&prof)) if ((err = handlesys->ReadHandle(hndl, g_ProfilerType, &sec, (void **)&prof))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err); return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err);
@@ -108,6 +112,8 @@ static cell_t StartProfiling(IPluginContext *pContext, const cell_t *params)
#if defined PLATFORM_WINDOWS #if defined PLATFORM_WINDOWS
QueryPerformanceCounter(&prof->start); QueryPerformanceCounter(&prof->start);
#else
gettimeofday(&prof->start, NULL);
#endif #endif
prof->started = true; prof->started = true;
@@ -123,7 +129,7 @@ static cell_t StopProfiling(IPluginContext *pContext, const cell_t *params)
HandleError err; HandleError err;
Profiler *prof; Profiler *prof;
if ((err = g_HandleSys.ReadHandle(hndl, g_ProfilerType, &sec, (void **)&prof)) if ((err = handlesys->ReadHandle(hndl, g_ProfilerType, &sec, (void **)&prof))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err); return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err);
@@ -136,6 +142,8 @@ static cell_t StopProfiling(IPluginContext *pContext, const cell_t *params)
#if defined PLATFORM_WINDOWS #if defined PLATFORM_WINDOWS
QueryPerformanceCounter(&prof->end); QueryPerformanceCounter(&prof->end);
#else
gettimeofday(&prof->end, NULL);
#endif #endif
prof->started = false; prof->started = false;
@@ -151,7 +159,7 @@ static cell_t GetProfilerTime(IPluginContext *pContext, const cell_t *params)
HandleError err; HandleError err;
Profiler *prof; Profiler *prof;
if ((err = g_HandleSys.ReadHandle(hndl, g_ProfilerType, &sec, (void **)&prof)) if ((err = handlesys->ReadHandle(hndl, g_ProfilerType, &sec, (void **)&prof))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err); return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err);
@@ -168,6 +176,10 @@ static cell_t GetProfilerTime(IPluginContext *pContext, const cell_t *params)
LONGLONG diff = prof->end.QuadPart - prof->start.QuadPart; LONGLONG diff = prof->end.QuadPart - prof->start.QuadPart;
double seconds = diff * prof->freq; double seconds = diff * prof->freq;
fTime = (float)seconds; fTime = (float)seconds;
#else
int64_t start_us = int64_t(prof->start.tv_sec) * 1000000 + prof->start.tv_usec;
int64_t stop_us = int64_t(prof->end.tv_sec) * 1000000 + prof->end.tv_usec;
fTime = double((stop_us - start_us) / 1000) / 1000.0;
#endif #endif
return sp_ftoc(fTime); return sp_ftoc(fTime);
@@ -181,5 +193,4 @@ REGISTER_NATIVES(profilerNatives)
{"StopProfiling", StopProfiling}, {"StopProfiling", StopProfiling},
{NULL, NULL}, {NULL, NULL},
}; };
#endif
@@ -1,5 +1,5 @@
/** /**
* vim: set ts=4 : * vim: set ts=4 sw=4 tw=99 noet :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
@@ -29,12 +29,12 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "common_logic.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "sm_globals.h"
#include "sm_stringutil.h"
#include <ITextParsers.h> #include <ITextParsers.h>
#include <ctype.h> #include <ctype.h>
#include "stringutil.h"
inline const char *_strstr(const char *str, const char *substr) inline const char *_strstr(const char *str, const char *substr)
{ {
@@ -141,7 +141,7 @@ static cell_t sm_numtostr(IPluginContext *pCtx, const cell_t *params)
{ {
char *str; char *str;
pCtx->LocalToString(params[2], &str); pCtx->LocalToString(params[2], &str);
size_t res = UTIL_Format(str, params[3], "%d", params[1]); size_t res = smcore.Format(str, params[3], "%d", params[1]);
return static_cast<cell_t>(res); return static_cast<cell_t>(res);
} }
@@ -174,7 +174,7 @@ static cell_t sm_floattostr(IPluginContext *pCtx, const cell_t *params)
{ {
char *str; char *str;
pCtx->LocalToString(params[2], &str); pCtx->LocalToString(params[2], &str);
size_t res = UTIL_Format(str, params[3], "%f", sp_ctof(params[1])); size_t res = smcore.Format(str, params[3], "%f", sp_ctof(params[1]));
return static_cast<cell_t>(res); return static_cast<cell_t>(res);
} }
@@ -187,7 +187,7 @@ static cell_t sm_formatex(IPluginContext *pCtx, const cell_t *params)
pCtx->LocalToString(params[1], &buf); pCtx->LocalToString(params[1], &buf);
pCtx->LocalToString(params[3], &fmt); pCtx->LocalToString(params[3], &fmt);
res = atcprintf(buf, static_cast<size_t>(params[2]), fmt, pCtx, params, &arg); res = smcore.atcprintf(buf, static_cast<size_t>(params[2]), fmt, pCtx, params, &arg);
return static_cast<cell_t>(res); return static_cast<cell_t>(res);
} }
@@ -256,7 +256,7 @@ static cell_t sm_format(IPluginContext *pCtx, const cell_t *params)
} }
buf = (copy) ? __copy_buf : destbuf; buf = (copy) ? __copy_buf : destbuf;
res = atcprintf(buf, maxlen, fmt, pCtx, params, &arg); res = smcore.atcprintf(buf, maxlen, fmt, pCtx, params, &arg);
if (copy) if (copy)
{ {
@@ -306,7 +306,7 @@ static cell_t sm_vformat(IPluginContext *pContext, const cell_t *params)
pContext->LocalToString(params[3], &format); pContext->LocalToString(params[3], &format);
size_t total = atcprintf(destination, maxlen, format, pContext, local_params, &vargPos); size_t total = smcore.atcprintf(destination, maxlen, format, pContext, local_params, &vargPos);
/* Perform copy-on-write if we need to */ /* Perform copy-on-write if we need to */
if (copy) if (copy)
@@ -29,11 +29,14 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "HandleSys.h" #include "common_logic.h"
#include "TimerSys.h" #include <string.h>
#include "PluginSys.h" #include <IHandleSys.h>
#include "Logger.h" #include <ITimerSystem.h>
#include "DebugReporter.h" #include <IPluginSys.h>
#include <sh_stack.h>
using namespace SourceHook;
#define TIMER_DATA_HNDL_CLOSE (1<<9) #define TIMER_DATA_HNDL_CLOSE (1<<9)
#define TIMER_HNDL_CLOSE (1<<9) #define TIMER_HNDL_CLOSE (1<<9)
@@ -86,15 +89,15 @@ void TimerNatives::OnSourceModAllInitialized()
{ {
HandleAccess sec; HandleAccess sec;
g_HandleSys.InitAccessDefaults(NULL, &sec); handlesys->InitAccessDefaults(NULL, &sec);
sec.access[HandleAccess_Clone] = HANDLE_RESTRICT_IDENTITY; sec.access[HandleAccess_Clone] = HANDLE_RESTRICT_IDENTITY;
g_TimerType = g_HandleSys.CreateType("Timer", this, 0, NULL, &sec, g_pCoreIdent, NULL); g_TimerType = handlesys->CreateType("Timer", this, 0, NULL, &sec, g_pCoreIdent, NULL);
} }
void TimerNatives::OnSourceModShutdown() void TimerNatives::OnSourceModShutdown()
{ {
g_HandleSys.RemoveType(g_TimerType, g_pCoreIdent); handlesys->RemoveType(g_TimerType, g_pCoreIdent);
g_TimerType = 0; g_TimerType = 0;
} }
@@ -102,7 +105,7 @@ void TimerNatives::OnHandleDestroy(HandleType_t type, void *object)
{ {
TimerInfo *pTimer = reinterpret_cast<TimerInfo *>(object); TimerInfo *pTimer = reinterpret_cast<TimerInfo *>(object);
g_Timers.KillTimer(pTimer->Timer); timersys->KillTimer(pTimer->Timer);
} }
TimerInfo *TimerNatives::CreateTimerInfo() TimerInfo *TimerNatives::CreateTimerInfo()
@@ -150,27 +153,23 @@ void TimerNatives::OnTimerEnd(ITimer *pTimer, void *pData)
if (pInfo->Flags & TIMER_DATA_HNDL_CLOSE) if (pInfo->Flags & TIMER_DATA_HNDL_CLOSE)
{ {
if ((herr=g_HandleSys.FreeHandle(usrhndl, &sec)) != HandleError_None) if ((herr=handlesys->FreeHandle(usrhndl, &sec)) != HandleError_None)
{ {
g_DbgReporter.GenerateError(pInfo->pContext, smcore.GenerateError(pInfo->pContext, pInfo->Hook->GetFunctionID(),
pInfo->Hook->GetFunctionID(),
SP_ERROR_NATIVE, SP_ERROR_NATIVE,
"Invalid data handle %x (error %d) passed during timer end with TIMER_DATA_HNDL_CLOSE", "Invalid data handle %x (error %d) passed during timer end with TIMER_DATA_HNDL_CLOSE",
usrhndl, usrhndl, herr);
herr);
} }
} }
if (pInfo->TimerHandle != BAD_HANDLE) if (pInfo->TimerHandle != BAD_HANDLE)
{ {
if ((herr=g_HandleSys.FreeHandle(pInfo->TimerHandle, &sec)) != HandleError_None) if ((herr=handlesys->FreeHandle(pInfo->TimerHandle, &sec)) != HandleError_None)
{ {
g_DbgReporter.GenerateError(pInfo->pContext, smcore.GenerateError(pInfo->pContext, pInfo->Hook->GetFunctionID(),
pInfo->Hook->GetFunctionID(),
SP_ERROR_NATIVE, SP_ERROR_NATIVE,
"Invalid timer handle %x (error %d) during timer end, displayed function is timer callback, not the stack trace", "Invalid timer handle %x (error %d) during timer end, displayed function is timer callback, not the stack trace",
pInfo->TimerHandle, pInfo->TimerHandle, herr);
herr);
} }
} }
@@ -200,7 +199,7 @@ static cell_t smn_CreateTimer(IPluginContext *pCtx, const cell_t *params)
} }
pInfo = s_TimerNatives.CreateTimerInfo(); pInfo = s_TimerNatives.CreateTimerInfo();
pTimer = g_Timers.CreateTimer(&s_TimerNatives, sp_ctof(params[1]), pInfo, flags); pTimer = timersys->CreateTimer(&s_TimerNatives, sp_ctof(params[1]), pInfo, flags);
if (!pTimer) if (!pTimer)
{ {
@@ -208,7 +207,7 @@ static cell_t smn_CreateTimer(IPluginContext *pCtx, const cell_t *params)
return 0; return 0;
} }
hndl = g_HandleSys.CreateHandle(g_TimerType, pInfo, pCtx->GetIdentity(), g_pCoreIdent, NULL); hndl = handlesys->CreateHandle(g_TimerType, pInfo, pCtx->GetIdentity(), g_pCoreIdent, NULL);
/* If we can't get a handle, the timer isn't refcounted against the plugin and /* If we can't get a handle, the timer isn't refcounted against the plugin and
* we need to bail out to prevent a crash. * we need to bail out to prevent a crash.
@@ -219,11 +218,11 @@ static cell_t smn_CreateTimer(IPluginContext *pCtx, const cell_t *params)
if (flags & TIMER_DATA_HNDL_CLOSE) if (flags & TIMER_DATA_HNDL_CLOSE)
{ {
HandleSecurity sec(pCtx->GetIdentity(), g_pCoreIdent); HandleSecurity sec(pCtx->GetIdentity(), g_pCoreIdent);
g_HandleSys.FreeHandle(params[3], &sec); handlesys->FreeHandle(params[3], &sec);
} }
/* Zero everything so there's no conflicts */ /* Zero everything so there's no conflicts */
memset(pInfo, 0, sizeof(TimerInfo)); memset(pInfo, 0, sizeof(TimerInfo));
g_Timers.KillTimer(pTimer); timersys->KillTimer(pTimer);
return pCtx->ThrowNativeError("Could not create timer, no more handles"); return pCtx->ThrowNativeError("Could not create timer, no more handles");
} }
@@ -248,20 +247,20 @@ static cell_t smn_KillTimer(IPluginContext *pCtx, const cell_t *params)
sec.pOwner = pCtx->GetIdentity(); sec.pOwner = pCtx->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_TimerType, &sec, (void **)&pInfo)) if ((herr=handlesys->ReadHandle(hndl, g_TimerType, &sec, (void **)&pInfo))
!= HandleError_None) != HandleError_None)
{ {
return pCtx->ThrowNativeError("Invalid timer handle %x (error %d)", hndl, herr); return pCtx->ThrowNativeError("Invalid timer handle %x (error %d)", hndl, herr);
} }
g_Timers.KillTimer(pInfo->Timer); timersys->KillTimer(pInfo->Timer);
if (params[2] && !(pInfo->Flags & TIMER_DATA_HNDL_CLOSE)) if (params[2] && !(pInfo->Flags & TIMER_DATA_HNDL_CLOSE))
{ {
sec.pOwner = pInfo->pContext->GetIdentity(); sec.pOwner = pInfo->pContext->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.FreeHandle(static_cast<Handle_t>(pInfo->UserData), &sec)) != HandleError_None) if ((herr=handlesys->FreeHandle(static_cast<Handle_t>(pInfo->UserData), &sec)) != HandleError_None)
{ {
return pCtx->ThrowNativeError("Invalid data handle %x (error %d) on timer kill with TIMER_DATA_HNDL_CLOSE", hndl, herr); return pCtx->ThrowNativeError("Invalid data handle %x (error %d) on timer kill with TIMER_DATA_HNDL_CLOSE", hndl, herr);
} }
@@ -280,26 +279,26 @@ static cell_t smn_TriggerTimer(IPluginContext *pCtx, const cell_t *params)
sec.pOwner = pCtx->GetIdentity(); sec.pOwner = pCtx->GetIdentity();
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
if ((herr=g_HandleSys.ReadHandle(hndl, g_TimerType, &sec, (void **)&pInfo)) if ((herr=handlesys->ReadHandle(hndl, g_TimerType, &sec, (void **)&pInfo))
!= HandleError_None) != HandleError_None)
{ {
return pCtx->ThrowNativeError("Invalid timer handle %x (error %d)", hndl, herr); return pCtx->ThrowNativeError("Invalid timer handle %x (error %d)", hndl, herr);
} }
g_Timers.FireTimerOnce(pInfo->Timer, params[2] ? true : false); timersys->FireTimerOnce(pInfo->Timer, params[2] ? true : false);
return 1; return 1;
} }
static cell_t smn_GetTickedTime(IPluginContext *pContext, const cell_t *params) static cell_t smn_GetTickedTime(IPluginContext *pContext, const cell_t *params)
{ {
return sp_ftoc(*g_pUniversalTime); return sp_ftoc(*serverGlobals.universalTime);
} }
static cell_t smn_GetMapTimeLeft(IPluginContext *pContext, const cell_t *params) static cell_t smn_GetMapTimeLeft(IPluginContext *pContext, const cell_t *params)
{ {
float time_left; float time_left;
if (!g_Timers.GetMapTimeLeft(&time_left)) if (!timersys->GetMapTimeLeft(&time_left))
{ {
return 0; return 0;
} }
@@ -313,7 +312,7 @@ static cell_t smn_GetMapTimeLeft(IPluginContext *pContext, const cell_t *params)
static cell_t smn_GetMapTimeLimit(IPluginContext *pContext, const cell_t *params) static cell_t smn_GetMapTimeLimit(IPluginContext *pContext, const cell_t *params)
{ {
IMapTimer *pMapTimer = g_Timers.GetMapTimer(); IMapTimer *pMapTimer = timersys->GetMapTimer();
if (!pMapTimer) if (!pMapTimer)
{ {
@@ -330,7 +329,7 @@ static cell_t smn_GetMapTimeLimit(IPluginContext *pContext, const cell_t *params
static cell_t smn_ExtendMapTimeLimit(IPluginContext *pContext, const cell_t *params) static cell_t smn_ExtendMapTimeLimit(IPluginContext *pContext, const cell_t *params)
{ {
IMapTimer *pMapTimer = g_Timers.GetMapTimer(); IMapTimer *pMapTimer = timersys->GetMapTimer();
if (!pMapTimer) if (!pMapTimer)
{ {
@@ -344,12 +343,12 @@ static cell_t smn_ExtendMapTimeLimit(IPluginContext *pContext, const cell_t *par
static cell_t smn_IsServerProcessing(IPluginContext *pContext, const cell_t *params) static cell_t smn_IsServerProcessing(IPluginContext *pContext, const cell_t *params)
{ {
return (gpGlobals->frametime > 0.0f) ? 1 : 0; return (*serverGlobals.frametime > 0.0f) ? 1 : 0;
} }
static cell_t smn_GetTickInterval(IPluginContext *pContext, const cell_t *params) static cell_t smn_GetTickInterval(IPluginContext *pContext, const cell_t *params)
{ {
return sp_ftoc(gpGlobals->interval_per_tick); return sp_ftoc(*serverGlobals.interval_per_tick);
} }
REGISTER_NATIVES(timernatives) REGISTER_NATIVES(timernatives)
+305
View File
@@ -0,0 +1,305 @@
/**
* vim: set ts=4 sw=4 tw=99 et :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <sm_platform.h>
#include "stringutil.h"
const char *stristr(const char *str, const char *substr)
{
if (!*substr)
{
return ((char *)str);
}
char *needle = (char *)substr;
char *prevloc = (char *)str;
char *haystack = (char *)str;
while (*haystack)
{
if (tolower(*haystack) == tolower(*needle))
{
haystack++;
if (!*++needle)
{
return prevloc;
}
}
else
{
haystack = ++prevloc;
needle = (char *)substr;
}
}
return NULL;
}
unsigned int strncopy(char *dest, const char *src, size_t count)
{
if (!count)
{
return 0;
}
char *start = dest;
while ((*src) && (--count))
{
*dest++ = *src++;
}
*dest = '\0';
return (dest - start);
}
unsigned int UTIL_ReplaceAll(char *subject, size_t maxlength, const char *search, const char *replace, bool caseSensitive)
{
size_t searchLen = strlen(search);
size_t replaceLen = strlen(replace);
char *ptr = subject;
unsigned int total = 0;
while ((ptr = UTIL_ReplaceEx(ptr, maxlength, search, searchLen, replace, replaceLen, caseSensitive)) != NULL)
{
total++;
if (*ptr == '\0')
{
break;
}
}
return total;
}
/**
* NOTE: Do not edit this for the love of god unless you have
* read the test cases and understand the code behind each one.
* While I don't guarantee there aren't mistakes, I do guarantee
* that plugins will end up relying on tiny idiosyncrasies of this
* function, just like they did with AMX Mod X.
*
* There are explicitly more cases than the AMX Mod X version because
* we're not doing a blind copy. Each case is specifically optimized
* for what needs to be done. Even better, we don't have to error on
* bad buffer sizes. Instead, this function will smartly cut off the
* string in a way that pushes old data out.
*/
char *UTIL_ReplaceEx(char *subject, size_t maxLen, const char *search, size_t searchLen, const char *replace, size_t replaceLen, bool caseSensitive)
{
char *ptr = subject;
size_t browsed = 0;
size_t textLen = strlen(subject);
/* It's not possible to search or replace */
if (searchLen > textLen)
{
return NULL;
}
/* Handle the case of one byte replacement.
* It's only valid in one case.
*/
if (maxLen == 1)
{
/* If the search matches and the replace length is 0,
* we can just terminate the string and be done.
*/
if ((caseSensitive ? strcmp(subject, search) : strcasecmp(subject, search)) == 0 && replaceLen == 0)
{
*subject = '\0';
return subject;
}
else
{
return NULL;
}
}
/* Subtract one off the maxlength so we can include the null terminator */
maxLen--;
while (*ptr != '\0' && (browsed <= textLen - searchLen))
{
/* See if we get a comparison */
if ((caseSensitive ? strncmp(ptr, search, searchLen) : strncasecmp(ptr, search, searchLen)) == 0)
{
if (replaceLen > searchLen)
{
/* First, see if we have enough space to do this operation */
if (maxLen - textLen < replaceLen - searchLen)
{
/* First, see if the replacement length goes out of bounds. */
if (browsed + replaceLen >= maxLen)
{
/* EXAMPLE CASE:
* Subject: AABBBCCC
* Buffer : 12 bytes
* Search : BBB
* Replace: DDDDDDDDDD
* OUTPUT : AADDDDDDDDD
* POSITION: ^
*/
/* If it does, we'll just bound the length and do a strcpy. */
replaceLen = maxLen - browsed;
/* Note, we add one to the final result for the null terminator */
strncopy(ptr, replace, replaceLen+1);
}
else
{
/* EXAMPLE CASE:
* Subject: AABBBCCC
* Buffer : 12 bytes
* Search : BBB
* Replace: DDDDDDD
* OUTPUT : AADDDDDDDCC
* POSITION: ^
*/
/* We're going to have some bytes left over... */
size_t origBytesToCopy = (textLen - (browsed + searchLen)) + 1;
size_t realBytesToCopy = (maxLen - (browsed + replaceLen)) + 1;
char *moveFrom = ptr + searchLen + (origBytesToCopy - realBytesToCopy);
char *moveTo = ptr + replaceLen;
/* First, move our old data out of the way. */
memmove(moveTo, moveFrom, realBytesToCopy);
/* Now, do our replacement. */
memcpy(ptr, replace, replaceLen);
}
}
else
{
/* EXAMPLE CASE:
* Subject: AABBBCCC
* Buffer : 12 bytes
* Search : BBB
* Replace: DDDD
* OUTPUT : AADDDDCCC
* POSITION: ^
*/
/* Yes, we have enough space. Do a normal move operation. */
char *moveFrom = ptr + searchLen;
char *moveTo = ptr + replaceLen;
/* First move our old data out of the way. */
size_t bytesToCopy = (textLen - (browsed + searchLen)) + 1;
memmove(moveTo, moveFrom, bytesToCopy);
/* Now do our replacement. */
memcpy(ptr, replace, replaceLen);
}
}
else if (replaceLen < searchLen)
{
/* EXAMPLE CASE:
* Subject: AABBBCCC
* Buffer : 12 bytes
* Search : BBB
* Replace: D
* OUTPUT : AADCCC
* POSITION: ^
*/
/* If the replacement does not grow the string length, we do not
* need to do any fancy checking at all. Yay!
*/
char *moveFrom = ptr + searchLen; /* Start after the search pointer */
char *moveTo = ptr + replaceLen; /* Copy to where the replacement ends */
/* Copy our replacement in, if any */
if (replaceLen)
{
memcpy(ptr, replace, replaceLen);
}
/* Figure out how many bytes to move down, including null terminator */
size_t bytesToCopy = (textLen - (browsed + searchLen)) + 1;
/* Move the rest of the string down */
memmove(moveTo, moveFrom, bytesToCopy);
}
else
{
/* EXAMPLE CASE:
* Subject: AABBBCCC
* Buffer : 12 bytes
* Search : BBB
* Replace: DDD
* OUTPUT : AADDDCCC
* POSITION: ^
*/
/* We don't have to move anything around, just do a straight copy */
memcpy(ptr, replace, replaceLen);
}
return ptr + replaceLen;
}
ptr++;
browsed++;
}
return NULL;
}
size_t UTIL_DecodeHexString(unsigned char *buffer, size_t maxlength, const char *hexstr)
{
size_t written = 0;
size_t length = strlen(hexstr);
for (size_t i = 0; i < length; i++)
{
if (written >= maxlength)
break;
buffer[written++] = hexstr[i];
if (hexstr[i] == '\\' && hexstr[i + 1] == 'x')
{
if (i + 3 >= length)
continue;
/* Get the hex part. */
char s_byte[3];
int r_byte;
s_byte[0] = hexstr[i + 2];
s_byte[1] = hexstr[i + 3];
s_byte[2] = '\0';
/* Read it as an integer */
sscanf(s_byte, "%x", &r_byte);
/* Save the value */
buffer[written - 1] = r_byte;
/* Adjust index */
i += 3;
}
}
return written;
}
+44
View File
@@ -0,0 +1,44 @@
/**
* vim: set ts=4 sw=4 tw=99 et :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#ifndef _INCLUDE_SOURCEMOD_COMMON_STRINGUTIL_H_
#define _INCLUDE_SOURCEMOD_COMMON_STRINGUTIL_H_
const char *stristr(const char *str, const char *substr);
unsigned int strncopy(char *dest, const char *src, size_t count);
unsigned int UTIL_ReplaceAll(char *subject, size_t maxlength, const char *search,
const char *replace, bool caseSensitive = true);
char *UTIL_ReplaceEx(char *subject, size_t maxLen, const char *search, size_t searchLen,
const char *replace, size_t replaceLen, bool caseSensitive = true);
size_t UTIL_DecodeHexString(unsigned char *buffer, size_t maxlength, const char *hexstr);
#endif /* _INCLUDE_SOURCEMOD_COMMON_STRINGUTIL_H_ */
+138 -7
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 sw=4 : * vim: set ts=4 sw=4 :
* ============================================================================= * =============================================================================
* SourceMod * SourceMod
* Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
@@ -43,12 +43,36 @@
#include "ShareSys.h" #include "ShareSys.h"
#include "sm_srvcmds.h" #include "sm_srvcmds.h"
#include "ForwardSys.h" #include "ForwardSys.h"
#include "TimerSys.h"
#include "logic_bridge.h"
#include "DebugReporter.h"
#include "PlayerManager.h"
#include "AdminCache.h"
#include "HalfLife2.h"
#include "CoreConfig.h"
#if defined _WIN32
#define MATCHMAKINGDS_SUFFIX ""
#define MATCHMAKINGDS_EXT "dll"
#elif defined __APPLE__
#define MATCHMAKINGDS_SUFFIX ""
#define MATCHMAKINGDS_EXT "dylib"
#elif defined __linux__
#if SOURCE_ENGINE < SE_LEFT4DEAD2
#define MATCHMAKINGDS_SUFFIX "_i486"
#else
#define MATCHMAKINGDS_SUFFIX ""
#endif
#define MATCHMAKINGDS_EXT "so"
#endif
static ILibrary *g_pLogic = NULL; static ILibrary *g_pLogic = NULL;
static LogicInitFunction logic_init_fn; static LogicInitFunction logic_init_fn;
IThreader *g_pThreader; IThreader *g_pThreader;
ITextParsers *textparsers; ITextParsers *textparsers;
sm_logic_t logicore;
ITranslator *translator;
class VEngineServer_Logic : public IVEngineServer_Logic class VEngineServer_Logic : public IVEngineServer_Logic
{ {
@@ -57,6 +81,11 @@ public:
{ {
return engine->IsMapValid(map); return engine->IsMapValid(map);
} }
virtual void ServerCommand(const char *cmd)
{
engine->ServerCommand(cmd);
}
}; };
static VEngineServer_Logic logic_engine; static VEngineServer_Logic logic_engine;
@@ -80,11 +109,83 @@ static void log_error(const char *fmt, ...)
va_end(ap); va_end(ap);
} }
static void generate_error(IPluginContext *ctx, cell_t func_idx, int err, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
g_DbgReporter.GenerateErrorVA(ctx, func_idx, err, fmt, ap);
va_end(ap);
}
static const char *get_cvar_string(ConVar* cvar) static const char *get_cvar_string(ConVar* cvar)
{ {
return cvar->GetString(); return cvar->GetString();
} }
static bool get_game_name(char *buffer, size_t maxlength)
{
KeyValues *pGameInfo = new KeyValues("GameInfo");
if (g_HL2.KVLoadFromFile(pGameInfo, basefilesystem, "gameinfo.txt"))
{
const char *str;
if ((str = pGameInfo->GetString("game", NULL)) != NULL)
{
strncopy(buffer, str, maxlength);
return true;
}
}
pGameInfo->deleteThis();
return false;
}
static const char *get_game_description()
{
return SERVER_CALL(GetGameDescription)();
}
static const char *get_source_engine_name()
{
#if !defined SOURCE_ENGINE
# error "Unknown engine type"
#endif
#if SOURCE_ENGINE == SE_EPISODEONE
return "original";
#elif SOURCE_ENGINE == SE_DARKMESSIAH
return "darkmessiah";
#elif SOURCE_ENGINE == SE_ORANGEBOX
return "orangebox";
#elif SOURCE_ENGINE == SE_BLOODYGOODTIME
return "bloodygoodtime";
#elif SOURCE_ENGINE == SE_EYE
return "eye";
#elif SOURCE_ENGINE == SE_ORANGEBOXVALVE
return "orangebox_valve";
#elif SOURCE_ENGINE == SE_LEFT4DEAD
return "left4dead";
#elif SOURCE_ENGINE == SE_LEFT4DEAD2
return "left4dead2";
#elif SOURCE_ENGINE == SE_ALIENSWARM
return "alienswarm";
#endif
}
static bool symbols_are_hidden()
{
#if (SOURCE_ENGINE == SE_ORANGEBOXVALVE) || (SOURCE_ENGINE == SE_LEFT4DEAD) || (SOURCE_ENGINE == SE_LEFT4DEAD2)
return true;
#else
return false;
#endif
}
static const char* get_core_config_value(const char* key)
{
return g_CoreConfig.GetCoreConfigValue(key);
}
static ServerGlobals serverGlobals;
static sm_core_t core_bridge = static sm_core_t core_bridge =
{ {
/* Objects */ /* Objects */
@@ -97,6 +198,10 @@ static sm_core_t core_bridge =
&g_RootMenu, &g_RootMenu,
&g_PluginSys, &g_PluginSys,
&g_Forwards, &g_Forwards,
&g_Timers,
&g_Players,
&g_Admins,
&g_HL2,
/* Functions */ /* Functions */
add_natives, add_natives,
find_convar, find_convar,
@@ -104,15 +209,40 @@ static sm_core_t core_bridge =
UTIL_TrimWhitespace, UTIL_TrimWhitespace,
log_error, log_error,
get_cvar_string, get_cvar_string,
UTIL_Format UTIL_Format,
generate_error,
gnprintf,
atcprintf,
get_game_name,
get_game_description,
get_source_engine_name,
symbols_are_hidden,
get_core_config_value,
&serverGlobals
}; };
void InitLogicBridge() void InitLogicBridge()
{ {
sm_logic_t logic; serverGlobals.universalTime = g_pUniversalTime;
serverGlobals.frametime = &gpGlobals->frametime;
serverGlobals.interval_per_tick = &gpGlobals->interval_per_tick;
core_bridge.core_ident = g_pCoreIdent; core_bridge.core_ident = g_pCoreIdent;
logic_init_fn(&core_bridge, &logic); core_bridge.engineFactory = (void *)g_SMAPI->GetEngineFactory(false);
core_bridge.serverFactory = (void *)g_SMAPI->GetServerFactory(false);
ILibrary *mmlib;
char path[PLATFORM_MAX_PATH];
g_LibSys.PathFormat(path, sizeof(path), "%s/bin/matchmaking_ds%s.%s", g_SMAPI->GetBaseDir(), MATCHMAKINGDS_SUFFIX, MATCHMAKINGDS_EXT);
if ((mmlib = g_LibSys.OpenLibrary(path, NULL, 0)))
{
core_bridge.matchmakingDSFactory = mmlib->GetSymbolAddress("CreateInterface");
mmlib->CloseLibrary();
}
logic_init_fn(&core_bridge, &logicore);
/* Add SMGlobalClass instances */ /* Add SMGlobalClass instances */
SMGlobalClass* glob = SMGlobalClass::head; SMGlobalClass* glob = SMGlobalClass::head;
@@ -121,10 +251,11 @@ void InitLogicBridge()
glob = glob->m_pGlobalClassNext; glob = glob->m_pGlobalClassNext;
} }
assert(glob->m_pGlobalClassNext == NULL); assert(glob->m_pGlobalClassNext == NULL);
glob->m_pGlobalClassNext = logic.head; glob->m_pGlobalClassNext = logicore.head;
g_pThreader = logic.threader; g_pThreader = logicore.threader;
g_pSourcePawn2->SetProfiler(logic.profiler); g_pSourcePawn2->SetProfiler(logicore.profiler);
translator = logicore.translator;
} }
bool StartLogicBridge(char *error, size_t maxlength) bool StartLogicBridge(char *error, size_t maxlength)
+8
View File
@@ -31,9 +31,17 @@
#ifndef _INCLUDE_SOURCEMOD_LOGIC_BRIDGE_H_ #ifndef _INCLUDE_SOURCEMOD_LOGIC_BRIDGE_H_
#define _INCLUDE_SOURCEMOD_LOGIC_BRIDGE_H_ #define _INCLUDE_SOURCEMOD_LOGIC_BRIDGE_H_
#include "logic/intercom.h"
void InitLogicBridge(); void InitLogicBridge();
bool StartLogicBridge(char *error, size_t maxlength); bool StartLogicBridge(char *error, size_t maxlength);
void ShutdownLogicBridge(); void ShutdownLogicBridge();
struct sm_logic_t;
extern sm_logic_t logicore;
extern ITranslator *translator;
extern IGameConfig *g_pGameConf;
#endif /* _INCLUDE_SOURCEMOD_LOGIC_BRIDGE_H_ */ #endif /* _INCLUDE_SOURCEMOD_LOGIC_BRIDGE_H_ */
+77
View File
@@ -0,0 +1,77 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemod_mm", "sourcemod_mm.vcxproj", "{E39527CD-7CAB-4420-97CC-DA1B93B260BC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
CrazyDebug - Dark Messiah|Win32 = CrazyDebug - Dark Messiah|Win32
CrazyDebug - Episode 1|Win32 = CrazyDebug - Episode 1|Win32
CrazyDebug - Left 4 Dead 2|Win32 = CrazyDebug - Left 4 Dead 2|Win32
CrazyDebug - Left 4 Dead|Win32 = CrazyDebug - Left 4 Dead|Win32
CrazyDebug - Old Metamod|Win32 = CrazyDebug - Old Metamod|Win32
CrazyDebug - Orange Box Valve|Win32 = CrazyDebug - Orange Box Valve|Win32
CrazyDebug - Orange Box|Win32 = CrazyDebug - Orange Box|Win32
Debug - Dark Messiah|Win32 = Debug - Dark Messiah|Win32
Debug - Episode 1|Win32 = Debug - Episode 1|Win32
Debug - Left 4 Dead 2|Win32 = Debug - Left 4 Dead 2|Win32
Debug - Left 4 Dead|Win32 = Debug - Left 4 Dead|Win32
Debug - Old Metamod|Win32 = Debug - Old Metamod|Win32
Debug - Orange Box Valve|Win32 = Debug - Orange Box Valve|Win32
Debug - Orange Box|Win32 = Debug - Orange Box|Win32
Release - Dark Messiah|Win32 = Release - Dark Messiah|Win32
Release - Episode 1|Win32 = Release - Episode 1|Win32
Release - Left 4 Dead 2|Win32 = Release - Left 4 Dead 2|Win32
Release - Left 4 Dead|Win32 = Release - Left 4 Dead|Win32
Release - Old Metamod|Win32 = Release - Old Metamod|Win32
Release - Orange Box Valve|Win32 = Release - Orange Box Valve|Win32
Release - Orange Box|Win32 = Release - Orange Box|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Dark Messiah|Win32.ActiveCfg = CrazyDebug - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Dark Messiah|Win32.Build.0 = CrazyDebug - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Episode 1|Win32.ActiveCfg = CrazyDebug - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Episode 1|Win32.Build.0 = CrazyDebug - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Left 4 Dead 2|Win32.ActiveCfg = CrazyDebug - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Left 4 Dead 2|Win32.Build.0 = CrazyDebug - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Left 4 Dead|Win32.ActiveCfg = CrazyDebug - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Left 4 Dead|Win32.Build.0 = CrazyDebug - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Old Metamod|Win32.ActiveCfg = CrazyDebug - Old Metamod|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Old Metamod|Win32.Build.0 = CrazyDebug - Old Metamod|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Orange Box Valve|Win32.ActiveCfg = CrazyDebug - Orange Box Valve|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Orange Box Valve|Win32.Build.0 = CrazyDebug - Orange Box Valve|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Orange Box|Win32.ActiveCfg = CrazyDebug - Orange Box|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Orange Box|Win32.Build.0 = CrazyDebug - Orange Box|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Dark Messiah|Win32.ActiveCfg = Debug - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Dark Messiah|Win32.Build.0 = Debug - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Episode 1|Win32.ActiveCfg = Debug - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Episode 1|Win32.Build.0 = Debug - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Left 4 Dead 2|Win32.ActiveCfg = Debug - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Left 4 Dead 2|Win32.Build.0 = Debug - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Left 4 Dead|Win32.ActiveCfg = Debug - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Left 4 Dead|Win32.Build.0 = Debug - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Old Metamod|Win32.ActiveCfg = Debug - Old Metamod|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Old Metamod|Win32.Build.0 = Debug - Old Metamod|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Orange Box Valve|Win32.ActiveCfg = Debug - Orange Box Valve|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Orange Box Valve|Win32.Build.0 = Debug - Orange Box Valve|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Orange Box|Win32.ActiveCfg = Debug - Orange Box|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Orange Box|Win32.Build.0 = Debug - Orange Box|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Dark Messiah|Win32.ActiveCfg = Release - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Dark Messiah|Win32.Build.0 = Release - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Episode 1|Win32.ActiveCfg = Release - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Episode 1|Win32.Build.0 = Release - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Left 4 Dead 2|Win32.ActiveCfg = Release - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Left 4 Dead 2|Win32.Build.0 = Release - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Left 4 Dead|Win32.ActiveCfg = Release - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Left 4 Dead|Win32.Build.0 = Release - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Old Metamod|Win32.ActiveCfg = Release - Old Metamod|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Old Metamod|Win32.Build.0 = Release - Old Metamod|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Orange Box Valve|Win32.ActiveCfg = Release - Orange Box Valve|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Orange Box Valve|Win32.Build.0 = Release - Orange Box Valve|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Orange Box|Win32.ActiveCfg = Release - Orange Box|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Orange Box|Win32.Build.0 = Release - Orange Box|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+467
View File
@@ -0,0 +1,467 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Interfaces">
<UniqueIdentifier>{10C69360-9E8E-4a43-BCEF-E9373B3641BC}</UniqueIdentifier>
</Filter>
<Filter Include="SourcePawn">
<UniqueIdentifier>{C3C3DC6E-E392-4916-B893-7ACB92192DE0}</UniqueIdentifier>
</Filter>
<Filter Include="HL2SDK">
<UniqueIdentifier>{80B56842-7A9F-4d5d-8149-767C285D0EB4}</UniqueIdentifier>
</Filter>
<Filter Include="Natives">
<UniqueIdentifier>{052D6D9B-7B50-4c3c-9B82-32CA908DEF24}</UniqueIdentifier>
</Filter>
<Filter Include="Resources">
<UniqueIdentifier>{2A750240-7C10-455f-A900-B9A9D362356C}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\AdminCache.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\ADTFactory.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\CDataPack.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\ChatTriggers.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\concmd_cleaner.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\ConCmdManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\ConsoleDetours.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\ConVarManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\CoreConfig.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\CrazyDebugger.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\Database.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\DebugReporter.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\EventManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\ExtensionSys.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\ForwardSys.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\frame_hooks.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\HalfLife2.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\HandleSys.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\LibrarySys.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\Logger.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\logic_bridge.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\MenuManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\MenuStyle_Base.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\MenuStyle_Radio.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\MenuStyle_Valve.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\MenuVoting.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\NativeInvoker.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\NativeOwner.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\NextMap.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\PlayerManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\PluginInfoDatabase.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\PluginSys.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\ShareSys.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\sm_autonatives.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\sm_srvcmds.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\sm_stringutil.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\sm_trie.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\sourcemm_api.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\sourcemod.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\TimerSys.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\UserMessages.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\smn_bitbuffer.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_console.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_core.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_database.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_entities.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_events.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_fakenatives.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_filesystem.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_halflife.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_hudtext.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_keyvalues.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_menus.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_nextmap.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_player.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_usermsgs.cpp">
<Filter>Natives</Filter>
</ClCompile>
<ClCompile Include="..\smn_vector.cpp">
<Filter>Natives</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\AdminCache.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\ADTFactory.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\CDataPack.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\CellArray.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\CellRecipientFilter.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\ChatTriggers.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\public\compat_wrappers.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\concmd_cleaner.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\ConCmdManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\ConCommandBaseIterator.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\ConsoleDetours.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\ConVarManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\CoreConfig.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\Database.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\DebugReporter.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\EventManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\ExtensionSys.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\ForwardSys.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\frame_hooks.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\GameConfigs.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\HalfLife2.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\HandleSys.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\LibrarySys.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\Logger.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\logic_bridge.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\MemoryUtils.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\MenuManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\MenuStyle_Base.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\MenuStyle_Radio.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\MenuStyle_Valve.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\MenuVoting.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\NativeInvoker.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\NativeOwner.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\NextMap.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\PhraseCollection.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\PlayerManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\PluginInfoDatabase.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\PluginSys.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\ShareSys.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_autonatives.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_fastlink.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_globals.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_memtable.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\public\sm_platform.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_queue.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_simple_prioqueue.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_srvcmds.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_stringutil.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_symtable.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_trie.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\public\sm_trie_tpl.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_version.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\smn_usermsgs.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sourcemm_api.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sourcemod.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\TimerSys.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\Translator.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\UserMessages.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IAdminSystem.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IADTFactory.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IDataPack.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IDBDriver.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IExtensionSys.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IForwardSys.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IGameConfigs.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IGameHelpers.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IHandleSys.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\ILibrarySys.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IMemoryUtils.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IMenuManager.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\INativeInvoker.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IPlayerHelpers.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IPluginSys.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IRootConsoleMenu.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IShareSys.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\ISourceMod.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\ITextParsers.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\ITimerSystem.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\ITranslator.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\IUserMessages.h">
<Filter>Interfaces</Filter>
</ClInclude>
<ClInclude Include="..\..\public\sourcepawn\sp_file_headers.h">
<Filter>SourcePawn</Filter>
</ClInclude>
<ClInclude Include="..\..\public\sourcepawn\sp_typeutil.h">
<Filter>SourcePawn</Filter>
</ClInclude>
<ClInclude Include="..\..\public\sourcepawn\sp_vm_api.h">
<Filter>SourcePawn</Filter>
</ClInclude>
<ClInclude Include="..\..\public\sourcepawn\sp_vm_base.h">
<Filter>SourcePawn</Filter>
</ClInclude>
<ClInclude Include="..\..\public\sourcepawn\sp_vm_types.h">
<Filter>SourcePawn</Filter>
</ClInclude>
<ClInclude Include="..\convar_sm.h">
<Filter>HL2SDK</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\version.rc">
<Filter>Resources</Filter>
</ResourceCompile>
</ItemGroup>
</Project>
+9
View File
@@ -7,18 +7,21 @@ Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
CrazyDebug - Dark Messiah|Win32 = CrazyDebug - Dark Messiah|Win32 CrazyDebug - Dark Messiah|Win32 = CrazyDebug - Dark Messiah|Win32
CrazyDebug - Episode 1|Win32 = CrazyDebug - Episode 1|Win32 CrazyDebug - Episode 1|Win32 = CrazyDebug - Episode 1|Win32
CrazyDebug - Left 4 Dead 2|Win32 = CrazyDebug - Left 4 Dead 2|Win32
CrazyDebug - Left 4 Dead|Win32 = CrazyDebug - Left 4 Dead|Win32 CrazyDebug - Left 4 Dead|Win32 = CrazyDebug - Left 4 Dead|Win32
CrazyDebug - Old Metamod|Win32 = CrazyDebug - Old Metamod|Win32 CrazyDebug - Old Metamod|Win32 = CrazyDebug - Old Metamod|Win32
CrazyDebug - Orange Box Valve|Win32 = CrazyDebug - Orange Box Valve|Win32 CrazyDebug - Orange Box Valve|Win32 = CrazyDebug - Orange Box Valve|Win32
CrazyDebug - Orange Box|Win32 = CrazyDebug - Orange Box|Win32 CrazyDebug - Orange Box|Win32 = CrazyDebug - Orange Box|Win32
Debug - Dark Messiah|Win32 = Debug - Dark Messiah|Win32 Debug - Dark Messiah|Win32 = Debug - Dark Messiah|Win32
Debug - Episode 1|Win32 = Debug - Episode 1|Win32 Debug - Episode 1|Win32 = Debug - Episode 1|Win32
Debug - Left 4 Dead 2|Win32 = Debug - Left 4 Dead 2|Win32
Debug - Left 4 Dead|Win32 = Debug - Left 4 Dead|Win32 Debug - Left 4 Dead|Win32 = Debug - Left 4 Dead|Win32
Debug - Old Metamod|Win32 = Debug - Old Metamod|Win32 Debug - Old Metamod|Win32 = Debug - Old Metamod|Win32
Debug - Orange Box Valve|Win32 = Debug - Orange Box Valve|Win32 Debug - Orange Box Valve|Win32 = Debug - Orange Box Valve|Win32
Debug - Orange Box|Win32 = Debug - Orange Box|Win32 Debug - Orange Box|Win32 = Debug - Orange Box|Win32
Release - Dark Messiah|Win32 = Release - Dark Messiah|Win32 Release - Dark Messiah|Win32 = Release - Dark Messiah|Win32
Release - Episode 1|Win32 = Release - Episode 1|Win32 Release - Episode 1|Win32 = Release - Episode 1|Win32
Release - Left 4 Dead 2|Win32 = Release - Left 4 Dead 2|Win32
Release - Left 4 Dead|Win32 = Release - Left 4 Dead|Win32 Release - Left 4 Dead|Win32 = Release - Left 4 Dead|Win32
Release - Old Metamod|Win32 = Release - Old Metamod|Win32 Release - Old Metamod|Win32 = Release - Old Metamod|Win32
Release - Orange Box Valve|Win32 = Release - Orange Box Valve|Win32 Release - Orange Box Valve|Win32 = Release - Orange Box Valve|Win32
@@ -29,6 +32,8 @@ Global
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Dark Messiah|Win32.Build.0 = CrazyDebug - Dark Messiah|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Dark Messiah|Win32.Build.0 = CrazyDebug - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Episode 1|Win32.ActiveCfg = CrazyDebug - Episode 1|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Episode 1|Win32.ActiveCfg = CrazyDebug - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Episode 1|Win32.Build.0 = CrazyDebug - Episode 1|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Episode 1|Win32.Build.0 = CrazyDebug - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Left 4 Dead 2|Win32.ActiveCfg = CrazyDebug - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Left 4 Dead 2|Win32.Build.0 = CrazyDebug - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Left 4 Dead|Win32.ActiveCfg = CrazyDebug - Left 4 Dead|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Left 4 Dead|Win32.ActiveCfg = CrazyDebug - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Left 4 Dead|Win32.Build.0 = CrazyDebug - Left 4 Dead|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Left 4 Dead|Win32.Build.0 = CrazyDebug - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Old Metamod|Win32.ActiveCfg = CrazyDebug - Old Metamod|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Old Metamod|Win32.ActiveCfg = CrazyDebug - Old Metamod|Win32
@@ -41,6 +46,8 @@ Global
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Dark Messiah|Win32.Build.0 = Debug - Dark Messiah|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Dark Messiah|Win32.Build.0 = Debug - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Episode 1|Win32.ActiveCfg = Debug - Episode 1|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Episode 1|Win32.ActiveCfg = Debug - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Episode 1|Win32.Build.0 = Debug - Episode 1|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Episode 1|Win32.Build.0 = Debug - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Left 4 Dead 2|Win32.ActiveCfg = Debug - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Left 4 Dead 2|Win32.Build.0 = Debug - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Left 4 Dead|Win32.ActiveCfg = Debug - Left 4 Dead|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Left 4 Dead|Win32.ActiveCfg = Debug - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Left 4 Dead|Win32.Build.0 = Debug - Left 4 Dead|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Left 4 Dead|Win32.Build.0 = Debug - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Old Metamod|Win32.ActiveCfg = Debug - Old Metamod|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Old Metamod|Win32.ActiveCfg = Debug - Old Metamod|Win32
@@ -53,6 +60,8 @@ Global
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Dark Messiah|Win32.Build.0 = Release - Dark Messiah|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Dark Messiah|Win32.Build.0 = Release - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Episode 1|Win32.ActiveCfg = Release - Episode 1|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Episode 1|Win32.ActiveCfg = Release - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Episode 1|Win32.Build.0 = Release - Episode 1|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Episode 1|Win32.Build.0 = Release - Episode 1|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Left 4 Dead 2|Win32.ActiveCfg = Release - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Left 4 Dead 2|Win32.Build.0 = Release - Left 4 Dead 2|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Left 4 Dead|Win32.ActiveCfg = Release - Left 4 Dead|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Left 4 Dead|Win32.ActiveCfg = Release - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Left 4 Dead|Win32.Build.0 = Release - Left 4 Dead|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Left 4 Dead|Win32.Build.0 = Release - Left 4 Dead|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Old Metamod|Win32.ActiveCfg = Release - Old Metamod|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Old Metamod|Win32.ActiveCfg = Release - Old Metamod|Win32
+319 -100
View File
@@ -40,9 +40,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core-legacy&quot;;&quot;$(MMSOURCE17)\core-legacy\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core-legacy&quot;;&quot;$(MMSOURCE18)\core-legacy\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -60,6 +60,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -122,9 +123,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core-legacy&quot;;&quot;$(MMSOURCE17)\core-legacy\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core-legacy&quot;;&quot;$(MMSOURCE18)\core-legacy\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -206,9 +207,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
FavorSizeOrSpeed="1" FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core-legacy&quot;;&quot;$(MMSOURCE17)\core-legacy\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core-legacy&quot;;&quot;$(MMSOURCE18)\core-legacy\sourcehook&quot;"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1"
RuntimeLibrary="0" RuntimeLibrary="0"
EnableEnhancedInstructionSet="0" EnableEnhancedInstructionSet="0"
@@ -224,6 +225,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -288,9 +290,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK-DARKM)\public&quot;;&quot;$(HL2SDK-DARKM)\public\dlls&quot;;&quot;$(HL2SDK-DARKM)\public\engine&quot;;&quot;$(HL2SDK-DARKM)\public\mathlib&quot;;&quot;$(HL2SDK-DARKM)\public\tier0&quot;;&quot;$(HL2SDK-DARKM)\public\tier1&quot;;&quot;$(HL2SDK-DARKM)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK-DARKM)\public&quot;;&quot;$(HL2SDK-DARKM)\public\dlls&quot;;&quot;$(HL2SDK-DARKM)\public\engine&quot;;&quot;$(HL2SDK-DARKM)\public\mathlib&quot;;&quot;$(HL2SDK-DARKM)\public\tier0&quot;;&quot;$(HL2SDK-DARKM)\public\tier1&quot;;&quot;$(HL2SDK-DARKM)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=2" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=2"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -308,6 +310,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -370,9 +373,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK-DARKM)\public&quot;;&quot;$(HL2SDK-DARKM)\public\dlls&quot;;&quot;$(HL2SDK-DARKM)\public\engine&quot;;&quot;$(HL2SDK-DARKM)\public\mathlib&quot;;&quot;$(HL2SDK-DARKM)\public\tier0&quot;;&quot;$(HL2SDK-DARKM)\public\tier1&quot;;&quot;$(HL2SDK-DARKM)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK-DARKM)\public&quot;;&quot;$(HL2SDK-DARKM)\public\dlls&quot;;&quot;$(HL2SDK-DARKM)\public\engine&quot;;&quot;$(HL2SDK-DARKM)\public\mathlib&quot;;&quot;$(HL2SDK-DARKM)\public\tier0&quot;;&quot;$(HL2SDK-DARKM)\public\tier1&quot;;&quot;$(HL2SDK-DARKM)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=2" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=2"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -454,9 +457,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
FavorSizeOrSpeed="1" FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK-DARKM)\public&quot;;&quot;$(HL2SDK-DARKM)\public\dlls&quot;;&quot;$(HL2SDK-DARKM)\public\engine&quot;;&quot;$(HL2SDK-DARKM)\public\mathlib&quot;;&quot;$(HL2SDK-DARKM)\public\tier0&quot;;&quot;$(HL2SDK-DARKM)\public\tier1&quot;;&quot;$(HL2SDK-DARKM)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK-DARKM)\public&quot;;&quot;$(HL2SDK-DARKM)\public\dlls&quot;;&quot;$(HL2SDK-DARKM)\public\engine&quot;;&quot;$(HL2SDK-DARKM)\public\mathlib&quot;;&quot;$(HL2SDK-DARKM)\public\tier0&quot;;&quot;$(HL2SDK-DARKM)\public\tier1&quot;;&quot;$(HL2SDK-DARKM)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=2" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=2"
RuntimeLibrary="0" RuntimeLibrary="0"
EnableEnhancedInstructionSet="0" EnableEnhancedInstructionSet="0"
@@ -472,6 +475,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -536,9 +540,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOB)\public&quot;;&quot;$(HL2SDKOB)\public\engine&quot;;&quot;$(HL2SDKOB)\public\game\server&quot;;&quot;$(HL2SDKOB)\public\mathlib&quot;;&quot;$(HL2SDKOB)\public\tier0&quot;;&quot;$(HL2SDKOB)\public\tier1&quot;;&quot;$(HL2SDKOB)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOB)\public&quot;;&quot;$(HL2SDKOB)\public\engine&quot;;&quot;$(HL2SDKOB)\public\game\server&quot;;&quot;$(HL2SDKOB)\public\mathlib&quot;;&quot;$(HL2SDKOB)\public\tier0&quot;;&quot;$(HL2SDKOB)\public\tier1&quot;;&quot;$(HL2SDKOB)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=3" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=3"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -556,6 +560,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -618,9 +623,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOB)\public&quot;;&quot;$(HL2SDKOB)\public\engine&quot;;&quot;$(HL2SDKOB)\public\game\server&quot;;&quot;$(HL2SDKOB)\public\mathlib&quot;;&quot;$(HL2SDKOB)\public\tier0&quot;;&quot;$(HL2SDKOB)\public\tier1&quot;;&quot;$(HL2SDKOB)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOB)\public&quot;;&quot;$(HL2SDKOB)\public\engine&quot;;&quot;$(HL2SDKOB)\public\game\server&quot;;&quot;$(HL2SDKOB)\public\mathlib&quot;;&quot;$(HL2SDKOB)\public\tier0&quot;;&quot;$(HL2SDKOB)\public\tier1&quot;;&quot;$(HL2SDKOB)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=3" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=3"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -638,6 +643,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -701,9 +707,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
FavorSizeOrSpeed="1" FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOB)\public&quot;;&quot;$(HL2SDKOB)\public\engine&quot;;&quot;$(HL2SDKOB)\public\game\server&quot;;&quot;$(HL2SDKOB)\public\mathlib&quot;;&quot;$(HL2SDKOB)\public\tier0&quot;;&quot;$(HL2SDKOB)\public\tier1&quot;;&quot;$(HL2SDKOB)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOB)\public&quot;;&quot;$(HL2SDKOB)\public\engine&quot;;&quot;$(HL2SDKOB)\public\game\server&quot;;&quot;$(HL2SDKOB)\public\mathlib&quot;;&quot;$(HL2SDKOB)\public\tier0&quot;;&quot;$(HL2SDKOB)\public\tier1&quot;;&quot;$(HL2SDKOB)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=3" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=3"
RuntimeLibrary="0" RuntimeLibrary="0"
EnableEnhancedInstructionSet="0" EnableEnhancedInstructionSet="0"
@@ -719,6 +725,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -783,9 +790,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -803,6 +810,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -865,9 +873,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -885,6 +893,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -948,9 +957,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
FavorSizeOrSpeed="1" FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDK)\public&quot;;&quot;$(HL2SDK)\public\dlls&quot;;&quot;$(HL2SDK)\public\engine&quot;;&quot;$(HL2SDK)\public\mathlib&quot;;&quot;$(HL2SDK)\public\tier0&quot;;&quot;$(HL2SDK)\public\tier1&quot;;&quot;$(HL2SDK)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=1"
RuntimeLibrary="0" RuntimeLibrary="0"
EnableEnhancedInstructionSet="0" EnableEnhancedInstructionSet="0"
@@ -966,6 +975,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -1030,9 +1040,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKL4D)\public&quot;;&quot;$(HL2SDKL4D)\public\engine&quot;;&quot;$(HL2SDKL4D)\public\game\server&quot;;&quot;$(HL2SDKL4D)\public\mathlib&quot;;&quot;$(HL2SDKL4D)\public\tier0&quot;;&quot;$(HL2SDKL4D)\public\tier1&quot;;&quot;$(HL2SDKL4D)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKL4D)\public&quot;;&quot;$(HL2SDKL4D)\public\engine&quot;;&quot;$(HL2SDKL4D)\public\game\server&quot;;&quot;$(HL2SDKL4D)\public\mathlib&quot;;&quot;$(HL2SDKL4D)\public\tier0&quot;;&quot;$(HL2SDKL4D)\public\tier1&quot;;&quot;$(HL2SDKL4D)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=5" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=5"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -1050,6 +1060,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -1112,9 +1123,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKL4D)\public&quot;;&quot;$(HL2SDKL4D)\public\engine&quot;;&quot;$(HL2SDKL4D)\public\game\server&quot;;&quot;$(HL2SDKL4D)\public\mathlib&quot;;&quot;$(HL2SDKL4D)\public\tier0&quot;;&quot;$(HL2SDKL4D)\public\tier1&quot;;&quot;$(HL2SDKL4D)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKL4D)\public&quot;;&quot;$(HL2SDKL4D)\public\engine&quot;;&quot;$(HL2SDKL4D)\public\game\server&quot;;&quot;$(HL2SDKL4D)\public\mathlib&quot;;&quot;$(HL2SDKL4D)\public\tier0&quot;;&quot;$(HL2SDKL4D)\public\tier1&quot;;&quot;$(HL2SDKL4D)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=5" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=5"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -1196,9 +1207,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
FavorSizeOrSpeed="1" FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKL4D)\public&quot;;&quot;$(HL2SDKL4D)\public\engine&quot;;&quot;$(HL2SDKL4D)\public\game\server&quot;;&quot;$(HL2SDKL4D)\public\mathlib&quot;;&quot;$(HL2SDKL4D)\public\tier0&quot;;&quot;$(HL2SDKL4D)\public\tier1&quot;;&quot;$(HL2SDKL4D)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKL4D)\public&quot;;&quot;$(HL2SDKL4D)\public\engine&quot;;&quot;$(HL2SDKL4D)\public\game\server&quot;;&quot;$(HL2SDKL4D)\public\mathlib&quot;;&quot;$(HL2SDKL4D)\public\tier0&quot;;&quot;$(HL2SDKL4D)\public\tier1&quot;;&quot;$(HL2SDKL4D)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=5" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=5"
RuntimeLibrary="0" RuntimeLibrary="0"
EnableEnhancedInstructionSet="0" EnableEnhancedInstructionSet="0"
@@ -1214,6 +1225,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -1278,9 +1290,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOBVALVE)\public&quot;;&quot;$(HL2SDKOBVALVE)\public\engine&quot;;&quot;$(HL2SDKOBVALVE)\public\game\server&quot;;&quot;$(HL2SDKOBVALVE)\public\mathlib&quot;;&quot;$(HL2SDKOBVALVE)\public\tier0&quot;;&quot;$(HL2SDKOBVALVE)\public\tier1&quot;;&quot;$(HL2SDKOBVALVE)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOBVALVE)\public&quot;;&quot;$(HL2SDKOBVALVE)\public\engine&quot;;&quot;$(HL2SDKOBVALVE)\public\game\server&quot;;&quot;$(HL2SDKOBVALVE)\public\mathlib&quot;;&quot;$(HL2SDKOBVALVE)\public\tier0&quot;;&quot;$(HL2SDKOBVALVE)\public\tier1&quot;;&quot;$(HL2SDKOBVALVE)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=4" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=4"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -1298,6 +1310,7 @@
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;" PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
@@ -1360,9 +1373,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOBVALVE)\public&quot;;&quot;$(HL2SDKOBVALVE)\public\engine&quot;;&quot;$(HL2SDKOBVALVE)\public\game\server&quot;;&quot;$(HL2SDKOBVALVE)\public\mathlib&quot;;&quot;$(HL2SDKOBVALVE)\public\tier0&quot;;&quot;$(HL2SDKOBVALVE)\public\tier1&quot;;&quot;$(HL2SDKOBVALVE)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOBVALVE)\public&quot;;&quot;$(HL2SDKOBVALVE)\public\engine&quot;;&quot;$(HL2SDKOBVALVE)\public\game\server&quot;;&quot;$(HL2SDKOBVALVE)\public\mathlib&quot;;&quot;$(HL2SDKOBVALVE)\public\tier0&quot;;&quot;$(HL2SDKOBVALVE)\public\tier1&quot;;&quot;$(HL2SDKOBVALVE)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=4" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=4"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -1444,9 +1457,9 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_ORANGEBOXVALVE=4 /D SE_LEFT4DEAD=5" AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8"
FavorSizeOrSpeed="1" FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOBVALVE)\public&quot;;&quot;$(HL2SDKOBVALVE)\public\engine&quot;;&quot;$(HL2SDKOBVALVE)\public\game\server&quot;;&quot;$(HL2SDKOBVALVE)\public\mathlib&quot;;&quot;$(HL2SDKOBVALVE)\public\tier0&quot;;&quot;$(HL2SDKOBVALVE)\public\tier1&quot;;&quot;$(HL2SDKOBVALVE)\public\vstdlib&quot;;&quot;$(MMSOURCE17)\core&quot;;&quot;$(MMSOURCE17)\core\sourcehook&quot;" AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKOBVALVE)\public&quot;;&quot;$(HL2SDKOBVALVE)\public\engine&quot;;&quot;$(HL2SDKOBVALVE)\public\game\server&quot;;&quot;$(HL2SDKOBVALVE)\public\mathlib&quot;;&quot;$(HL2SDKOBVALVE)\public\tier0&quot;;&quot;$(HL2SDKOBVALVE)\public\tier1&quot;;&quot;$(HL2SDKOBVALVE)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=4" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=4"
RuntimeLibrary="0" RuntimeLibrary="0"
EnableEnhancedInstructionSet="0" EnableEnhancedInstructionSet="0"
@@ -1504,6 +1517,256 @@
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration
Name="CrazyDebug - Left 4 Dead 2|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8 /D SE_LEFT4DEAD2=6"
Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKL4D2)\public&quot;;&quot;$(HL2SDKL4D2)\public\engine&quot;;&quot;$(HL2SDKL4D2)\public\game\server&quot;;&quot;$(HL2SDKL4D2)\public\mathlib&quot;;&quot;$(HL2SDKL4D2)\public\tier0&quot;;&quot;$(HL2SDKL4D2)\public\tier1&quot;;&quot;$(HL2SDKL4D2)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=6"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
EnableEnhancedInstructionSet="0"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="&quot;$(HL2SDKL4D2)\lib\public\tier0.lib&quot; &quot;$(HL2SDKL4D2)\lib\public\tier1.lib&quot; &quot;$(HL2SDKL4D2)\lib\public\vstdlib.lib&quot; &quot;$(HL2SDKL4D2)\lib\public\mathlib.lib&quot; dbghelp.lib &quot;Wsock32.lib&quot;"
OutputFile="$(OutDir)\sourcemod.2.l4d2.dll"
LinkIncremental="2"
IgnoreDefaultLibraryNames="LIBC;LIBCD;LIBCMT"
GenerateDebugInformation="true"
SubSystem="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Debug - Left 4 Dead 2|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8 /D SE_LEFT4DEAD2=6"
Optimization="0"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKL4D2)\public&quot;;&quot;$(HL2SDKL4D2)\public\engine&quot;;&quot;$(HL2SDKL4D2)\public\game\server&quot;;&quot;$(HL2SDKL4D2)\public\mathlib&quot;;&quot;$(HL2SDKL4D2)\public\tier0&quot;;&quot;$(HL2SDKL4D2)\public\tier1&quot;;&quot;$(HL2SDKL4D2)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=6"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
EnableEnhancedInstructionSet="0"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="&quot;$(HL2SDKL4D2)\lib\public\tier0.lib&quot; &quot;$(HL2SDKL4D2)\lib\public\tier1.lib&quot; &quot;$(HL2SDKL4D2)\lib\public\vstdlib.lib&quot; &quot;$(HL2SDKL4D2)\lib\public\mathlib.lib&quot; &quot;Wsock32.lib&quot;"
OutputFile="$(OutDir)\sourcemod.2.l4d2.dll"
LinkIncremental="2"
IgnoreDefaultLibraryNames="LIBC;LIBCD;LIBCMT"
GenerateDebugInformation="true"
SubSystem="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release - Left 4 Dead 2|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_ORANGEBOXVALVE=5 /D SE_LEFT4DEAD=6 /D SE_LEFT4DEAD2=7 /D SE_ALIENSWARM=8 /D SE_LEFT4DEAD2=6"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\;..\systems;..\..\public;..\..\public\sourcepawn;&quot;$(HL2SDKL4D2)\public&quot;;&quot;$(HL2SDKL4D2)\public\engine&quot;;&quot;$(HL2SDKL4D2)\public\game\server&quot;;&quot;$(HL2SDKL4D2)\public\mathlib&quot;;&quot;$(HL2SDKL4D2)\public\tier0&quot;;&quot;$(HL2SDKL4D2)\public\tier1&quot;;&quot;$(HL2SDKL4D2)\public\vstdlib&quot;;&quot;$(MMSOURCE18)\core&quot;;&quot;$(MMSOURCE18)\core\sourcehook&quot;"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SOURCEMOD_MM_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SOURCEMOD_BUILD;SM_DEFAULT_THREADER;SOURCE_ENGINE=6"
RuntimeLibrary="0"
EnableEnhancedInstructionSet="0"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="BINARY_NAME=\&quot;$(TargetFileName)\&quot;"
AdditionalIncludeDirectories="..\..\public"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="&quot;$(HL2SDKL4D2)\lib\public\tier0.lib&quot; &quot;$(HL2SDKL4D2)\lib\public\tier1.lib&quot; &quot;$(HL2SDKL4D2)\lib\public\vstdlib.lib&quot; &quot;$(HL2SDKL4D2)\lib\public\mathlib.lib&quot; &quot;Wsock32.lib&quot;"
OutputFile="$(OutDir)\sourcemod.2.l4d2.dll"
LinkIncremental="1"
IgnoreDefaultLibraryNames="LIBC;LIBCD;LIBCMTD"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations> </Configurations>
<References> <References>
</References> </References>
@@ -1648,6 +1911,22 @@
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration
Name="Debug - Left 4 Dead 2|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Release - Left 4 Dead 2|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
</File> </File>
<File <File
RelativePath="..\Database.cpp" RelativePath="..\Database.cpp"
@@ -1673,10 +1952,6 @@
RelativePath="..\frame_hooks.cpp" RelativePath="..\frame_hooks.cpp"
> >
</File> </File>
<File
RelativePath="..\GameConfigs.cpp"
>
</File>
<File <File
RelativePath="..\HalfLife2.cpp" RelativePath="..\HalfLife2.cpp"
> >
@@ -1697,10 +1972,6 @@
RelativePath="..\logic_bridge.cpp" RelativePath="..\logic_bridge.cpp"
> >
</File> </File>
<File
RelativePath="..\MemoryUtils.cpp"
>
</File>
<File <File
RelativePath="..\MenuManager.cpp" RelativePath="..\MenuManager.cpp"
> >
@@ -1733,10 +2004,6 @@
RelativePath="..\NextMap.cpp" RelativePath="..\NextMap.cpp"
> >
</File> </File>
<File
RelativePath="..\PhraseCollection.cpp"
>
</File>
<File <File
RelativePath="..\PlayerManager.cpp" RelativePath="..\PlayerManager.cpp"
> >
@@ -1757,14 +2024,6 @@
RelativePath="..\sm_autonatives.cpp" RelativePath="..\sm_autonatives.cpp"
> >
</File> </File>
<File
RelativePath="..\sm_crc32.cpp"
>
</File>
<File
RelativePath="..\sm_memtable.cpp"
>
</File>
<File <File
RelativePath="..\sm_srvcmds.cpp" RelativePath="..\sm_srvcmds.cpp"
> >
@@ -1789,10 +2048,6 @@
RelativePath="..\TimerSys.cpp" RelativePath="..\TimerSys.cpp"
> >
</File> </File>
<File
RelativePath="..\Translator.cpp"
>
</File>
<File <File
RelativePath="..\UserMessages.cpp" RelativePath="..\UserMessages.cpp"
> >
@@ -1963,10 +2218,6 @@
RelativePath="..\sm_autonatives.h" RelativePath="..\sm_autonatives.h"
> >
</File> </File>
<File
RelativePath="..\sm_crc32.h"
>
</File>
<File <File
RelativePath="..\sm_fastlink.h" RelativePath="..\sm_fastlink.h"
> >
@@ -1999,6 +2250,10 @@
RelativePath="..\sm_stringutil.h" RelativePath="..\sm_stringutil.h"
> >
</File> </File>
<File
RelativePath="..\sm_symtable.h"
>
</File>
<File <File
RelativePath="..\sm_trie.h" RelativePath="..\sm_trie.h"
> >
@@ -2167,14 +2422,6 @@
Name="Natives" Name="Natives"
UniqueIdentifier="{052D6D9B-7B50-4c3c-9B82-32CA908DEF24}" UniqueIdentifier="{052D6D9B-7B50-4c3c-9B82-32CA908DEF24}"
> >
<File
RelativePath="..\smn_admin.cpp"
>
</File>
<File
RelativePath="..\smn_banning.cpp"
>
</File>
<File <File
RelativePath="..\smn_bitbuffer.cpp" RelativePath="..\smn_bitbuffer.cpp"
> >
@@ -2191,10 +2438,6 @@
RelativePath="..\smn_database.cpp" RelativePath="..\smn_database.cpp"
> >
</File> </File>
<File
RelativePath="..\smn_datapacks.cpp"
>
</File>
<File <File
RelativePath="..\smn_entities.cpp" RelativePath="..\smn_entities.cpp"
> >
@@ -2211,18 +2454,10 @@
RelativePath="..\smn_filesystem.cpp" RelativePath="..\smn_filesystem.cpp"
> >
</File> </File>
<File
RelativePath="..\smn_gameconfigs.cpp"
>
</File>
<File <File
RelativePath="..\smn_halflife.cpp" RelativePath="..\smn_halflife.cpp"
> >
</File> </File>
<File
RelativePath="..\smn_handles.cpp"
>
</File>
<File <File
RelativePath="..\smn_hudtext.cpp" RelativePath="..\smn_hudtext.cpp"
> >
@@ -2231,10 +2466,6 @@
RelativePath="..\smn_keyvalues.cpp" RelativePath="..\smn_keyvalues.cpp"
> >
</File> </File>
<File
RelativePath="..\smn_lang.cpp"
>
</File>
<File <File
RelativePath="..\smn_menus.cpp" RelativePath="..\smn_menus.cpp"
> >
@@ -2247,18 +2478,6 @@
RelativePath="..\smn_player.cpp" RelativePath="..\smn_player.cpp"
> >
</File> </File>
<File
RelativePath="..\smn_profiler.cpp"
>
</File>
<File
RelativePath="..\smn_string.cpp"
>
</File>
<File
RelativePath="..\smn_timers.cpp"
>
</File>
<File <File
RelativePath="..\smn_usermsgs.cpp" RelativePath="..\smn_usermsgs.cpp"
> >
-1
View File
@@ -37,7 +37,6 @@
template <typename T> template <typename T>
class FastLink class FastLink
{ {
friend class iterator;
public: public:
struct FastLinkNode struct FastLinkNode
{ {
+58 -9
View File
@@ -32,31 +32,65 @@
#ifndef _INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_ #ifndef _INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_
#define _INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_ #define _INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_
#include <stdlib.h>
#include <string.h>
class BaseMemTable class BaseMemTable
{ {
public: public:
BaseMemTable(unsigned int init_size); BaseMemTable(unsigned int init_size)
~BaseMemTable(); {
membase = (unsigned char *)malloc(init_size);
size = init_size;
tail = 0;
}
~BaseMemTable()
{
free(membase);
membase = NULL;
}
public: public:
/** /**
* Allocates 'size' bytes of memory. * Allocates 'size' bytes of memory.
* Optionally outputs the address through 'addr'. * Optionally outputs the address through 'addr'.
* Returns an index >= 0 on success, < 0 on failure. * Returns an index >= 0 on success, < 0 on failure.
*/ */
int CreateMem(unsigned int size, void **addr); int CreateMem(unsigned int addsize, void **addr)
{
int idx = (int)tail;
while (tail + addsize >= size) {
size *= 2;
membase = (unsigned char *)realloc(membase, size);
}
tail += addsize;
if (addr)
*addr = (void *)&membase[idx];
return idx;
}
/** /**
* Given an index into the memory table, returns its address. * Given an index into the memory table, returns its address.
* Returns NULL if invalid. * Returns NULL if invalid.
*/ */
void *GetAddress(int index); void *GetAddress(int index)
{
if (index < 0 || (unsigned int)index >= tail)
return NULL;
return &membase[index];
}
/** /**
* Scraps the memory table. For caching purposes, the memory * Scraps the memory table. For caching purposes, the memory
* is not freed, however subsequent calls to CreateMem() will * is not freed, however subsequent calls to CreateMem() will
* begin at the first index again. * begin at the first index again.
*/ */
void Reset(); void Reset()
{
tail = 0;
}
inline unsigned int GetMemUsage() inline unsigned int GetMemUsage()
{ {
@@ -77,13 +111,24 @@ private:
class BaseStringTable class BaseStringTable
{ {
public: public:
BaseStringTable(unsigned int init_size); BaseStringTable(unsigned int init_size) : m_table(init_size)
~BaseStringTable(); {
}
public: public:
/** /**
* Adds a string to the string table and returns its index. * Adds a string to the string table and returns its index.
*/ */
int AddString(const char *string); int AddString(const char *string)
{
size_t len = strlen(string) + 1;
int idx;
char *addr;
idx = m_table.CreateMem(len, (void **)&addr);
strcpy(addr, string);
return idx;
}
/** /**
* Given an index into the string table, returns the associated string. * Given an index into the string table, returns the associated string.
@@ -98,7 +143,10 @@ public:
* is not freed, however subsequent calls to AddString() will * is not freed, however subsequent calls to AddString() will
* begin at the first index again. * begin at the first index again.
*/ */
void Reset(); void Reset()
{
m_table.Reset();
}
/** /**
* Returns the parent BaseMemTable that this string table uses. * Returns the parent BaseMemTable that this string table uses.
@@ -112,3 +160,4 @@ private:
}; };
#endif //_INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_ #endif //_INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_
+9 -8
View File
@@ -324,14 +324,15 @@ void RootConsoleMenu::OnRootConsoleCommand(const char *cmdname, const CCommand &
{ {
ConsolePrint(" SourceMod was developed by AlliedModders, LLC."); ConsolePrint(" SourceMod was developed by AlliedModders, LLC.");
ConsolePrint(" Development would not have been possible without the following people:"); ConsolePrint(" Development would not have been possible without the following people:");
ConsolePrint(" David \"BAILOPAN\" Anderson, lead developer"); ConsolePrint(" David \"BAILOPAN\" Anderson");
ConsolePrint(" Borja \"faluco\" Ferrer, core developer"); ConsolePrint(" Matt \"pRED\" Woodrow");
ConsolePrint(" Scott \"Damaged Soul\" Ehlert, core developer"); ConsolePrint(" Scott \"DS\" Ehlert");
ConsolePrint(" Matt \"pRED\" Woodrow, core developer"); ConsolePrint(" Fyren");
ConsolePrint(" Michael \"ferret\" McKoy, plugin developer"); ConsolePrint(" Nicholas \"psychonic\" Hastings");
ConsolePrint(" Pavol \"PM OnoTo\" Marko, SourceHook developer"); ConsolePrint(" Borja \"faluco\" Ferrer");
ConsolePrint(" Special thanks to Viper of GameConnect"); ConsolePrint(" Pavol \"PM OnoTo\" Marko");
ConsolePrint(" Special thanks to Mani of Mani-Admin-Plugin"); ConsolePrint(" Special thanks to asherkin, Liam, ferret, and Mani");
ConsolePrint(" Special thanks to Viper and SteamFriends");
ConsolePrint(" http://www.sourcemod.net/"); ConsolePrint(" http://www.sourcemod.net/");
} }
else if (strcmp(cmdname, "version") == 0) else if (strcmp(cmdname, "version") == 0)

Some files were not shown because too many files have changed in this diff Show More