411 Commits

Author SHA1 Message Date
1a6c457000 Tagged 1.8.0 2007-10-26 02:25:13 +00:00
cc99d6d1fb finalized build numbers and all that other release crap 2007-10-26 02:23:21 +00:00
3030302952 updated installer file list 2007-10-26 01:58:59 +00:00
f281a24274 added pluginmenu to build 2007-10-26 01:47:40 +00:00
efbba0a909 small change to the version changer for release builds 2007-10-26 01:42:35 +00:00
3750788893 fixed amxmodx makefile 2007-10-26 01:42:12 +00:00
993b6e6c74 added 3 more spaces to version output so our version numbers look nice 2007-10-26 01:41:45 +00:00
7f51048438 fixed ns makefile 2007-10-26 01:31:28 +00:00
212697b950 whoops, that was one terrible commit. the bug is really fixed now. 2007-10-26 01:09:08 +00:00
6a567f3c77 fixed a memory corruption bug in CVector 2007-10-26 01:03:23 +00:00
6899af461a tagged 1.8.0 2007-10-26 00:30:53 +00:00
36241e2905 updated revision numbers 2007-10-26 00:28:17 +00:00
b630ffe28f added amb1063 - sven coop offsets from ts2do 2007-10-26 00:16:04 +00:00
f6276db4d0 fixed amb1067 - SQL_SetAffinity crashed when targeting sqlite 2007-10-26 00:10:09 +00:00
a2e3f8682f fixed amb1069 - map prefixes still didn't work 2007-10-25 23:54:51 +00:00
dbf6143747 fixed linux build 2007-10-23 11:24:51 +00:00
4aafcc50a0 lowered thread think time from 500ms to 200ms 2007-10-22 22:21:20 +00:00
a86b1c5097 added amb281 - multiple result sets for MySQL 2007-10-22 21:31:02 +00:00
2d737970d0 small fix for amb1024 - weird plugin dir choice 2007-10-22 20:06:28 +00:00
b7f8503655 added amb844 - get_pdata_ent 2007-10-22 19:52:06 +00:00
ca3d15c27e fixed amb816 - stats comments were wrong 2007-10-22 19:40:35 +00:00
468e6fb9dd added amb909 - LoadFileForMe() 2007-10-22 19:26:45 +00:00
50bbefa3ba fixed amb1023 - register_library had an outdated comment 2007-10-22 19:00:25 +00:00
c635638fd1 implemented amb773 - now precaches sounds from speech.ini, can be disabled via compiler switch 2007-10-16 20:59:57 +00:00
b2b2c1d961 fixed a very nasty bug where the runtime stack/heap values appeared to simply be corrupted by the JIT initialization function. this probably never manifested in thiadmer's builds because the routine was broken at a higher level 2007-10-03 06:35:20 +00:00
748d000c02 fixed the other native relying on this offset as well 2007-10-03 00:54:19 +00:00
c1791361da now for the one byte fix... 2007-10-03 00:51:25 +00:00
6a483cfcae fixed amb291 issue 2007-10-03 00:50:30 +00:00
fcdd17480c fix for amb253 - database now spinlocks instead of failing to lock 2007-10-02 23:38:31 +00:00
21ad8ba71b Extension of amb29 - forgot to change the retarded pause menu 2007-09-09 03:34:52 +00:00
dd55716f15 Fix for bail breaking is_user_bot - amb914
This still doesn't cache since that proved to be buggy; this will check the flag first, and then auth second.
2007-09-06 16:37:57 +00:00
bd3b7fc70c Fix for amb895 - amx_plugins now displays properly over RCON 2007-09-03 16:39:32 +00:00
26f1c8dec7 clarified menu_create and its handler 2007-09-02 18:52:24 +00:00
a749aad1b4 - inserted a nasty backwards compatibility shim specifically for war3ft 3.0-rc. this may be extended globally if i can find a way to generalize it without breaking menu_create().
- updated comment about player_menu_info() as it was wrong.
2007-09-02 18:35:53 +00:00
58c7239b48 Fix for amb817 - dod stats heading was mislabeled 2007-09-01 16:39:01 +00:00
e616bd523e changed version number to 1.8.0 2007-08-16 21:18:56 +00:00
d163ead2ac it helps, just a bit, to actually commit the file 2007-08-16 19:09:49 +00:00
00838065ae fixed a format bug in statscfg.sma 2007-08-16 19:08:17 +00:00
8298158f08 newmenu stuff is now in its own nice callback. yay 2007-08-16 19:07:59 +00:00
824ed30872 Fix for amb790 - users.ini with spaces / tabs before a comment line were being read as an admin entry.
admin.sma now trims each line it reads.
2007-08-16 17:58:34 +00:00
2b15c30ad1 committed a bunch of phrases for statscfg, fixed a few languages missing some phrases 2007-08-16 17:47:00 +00:00
643ddc18be Removed erroneous default values for pdata string natives. 2007-08-16 17:13:07 +00:00
639db5846e workaround for msvc optimizing away stack usage on detour 2007-08-16 16:30:16 +00:00
0bb430b3eb Reverted amb149 2007-08-16 15:16:41 +00:00
550dbae0c7 fixed typos and added FindClose to search function 2007-08-12 21:24:27 +00:00
f0ee52f892 now returns error message instead of bug report when trying to install 0 files 2007-08-12 20:28:21 +00:00
84b146d74a added another check to prevent users from running it in an invalid directory 2007-08-11 14:06:03 +00:00
3f1226e504 Fixed +/- cmds not being set in the flag manager. 2007-08-11 13:38:19 +00:00
186519dc92 Fix for amb774 - is_user_bot() checked on killer twice, when one check should have been victim. 2007-08-10 14:59:05 +00:00
51ce96ac3c Fix for amb775 - clcmdmenu used a buffer that was too small to generate the command (from 64 to 512) 2007-08-10 14:55:44 +00:00
16f6048d74 updated comment so future bail doesn't ask "which one is right" 2007-08-10 07:17:40 +00:00
e2c1bad224 fixed a serious bug in the ClientCommand detour for cstrike, crashing on cl_autobuy 2007-08-10 07:12:04 +00:00
e6663991a7 All include files should be semicolon-correct now 2007-08-10 04:52:12 +00:00
62c41fbd03 Removed semi colon pragma 2007-08-10 03:41:59 +00:00
0b581b1506 fixed mysql makefile 2007-08-09 16:03:41 +00:00
76a7cafe50 Changed the new %S format option to %a to hopefully prevent some confusion. 2007-08-08 02:40:40 +00:00
12ab387be5 Implemented amb743 - plmenu for cstrike now has a to spectator option. (Requires cstrike module) 2007-08-08 02:32:53 +00:00
cfc9c1dd02 bumped installer version to 1.8 2007-08-07 21:09:30 +00:00
544d2dedef moved mkdir from amxmodx.inc to file.inc 2007-08-07 00:54:22 +00:00
1721383237 Fix for amb736 - find_entity defined twice 2007-08-05 11:23:02 +00:00
68961a91e2 Fixed amb735 - adminslots cvar comments in config files were misleading 2007-08-05 10:41:10 +00:00
435766b2ef reverted a bad change in fakenatives 2007-08-04 14:18:56 +00:00
750247e8a6 fixed a bug that broke creative natives from the last change 2007-08-04 14:17:19 +00:00
a81d6f3271 Added hamdata.ini to core config 2007-08-04 04:10:29 +00:00
cb62613501 synced language files 2007-08-04 04:10:14 +00:00
2efc82ea59 Included fakemeta_util for convenience. 2007-08-04 03:59:56 +00:00
a95658bd2d Added hamsandwich include files to back include directory 2007-08-04 03:55:42 +00:00
5f10cc1ebc added ns plmenu to build 2007-08-04 03:43:49 +00:00
226d188d19 Fix for amb257 - get_user_origin mode 4 false positives.
Most should be filtered out.
2007-08-04 03:34:34 +00:00
9e0f3f01a7 fixed ns win32 build 2007-08-04 00:02:35 +00:00
06b461acd7 fixed msvc7 project files for ns 2007-08-03 23:51:10 +00:00
ffb8fc683b Implemented amb291 - cs_{set,get}_c4_defusing() 2007-08-03 19:11:47 +00:00
aa2cac0f0c added fastdelegates, sheesh 2007-08-03 17:41:34 +00:00
2bc6d965f6 Fix for amb437
dod_set_user_kills & dod_set_user_score no longer have the dead scoreboard class side effect.

dod_set_pl_deaths comment has been updated to reflect the side effect.
2007-08-03 17:35:12 +00:00
c5e36a4e3c fixed a possible bad bug in linux builder 2007-08-03 17:31:42 +00:00
bbc6af247b fixed linux being broken 2007-08-03 17:29:59 +00:00
164780363b failed builds block again
added some redirection to windows builder
2007-08-03 17:26:57 +00:00
807e6a0f9a compression is now optional 2007-08-03 17:17:54 +00:00
605bef0482 ham sammich is now versioned properly 2007-08-03 17:01:31 +00:00
2e3c652996 added hamsammich support to build tool
added /useenv support to buildtool for win32
2007-08-03 16:48:04 +00:00
a8652dd91b updated amxxrelease build 2007-08-03 16:37:56 +00:00
2379aa3108 fixed msvc7 project files 2007-08-03 16:36:04 +00:00
ed3f5dfd4b Fixed the admins list not flushing when amx_reloadadmins is executed. 2007-08-03 16:29:53 +00:00
747d326ed5 Implemented amb216 - SQL_MakeStdTuple now has an optional timeout parameter. 2007-08-03 15:52:35 +00:00
b4ff754e29 Implemented amb340 - amx_ban / amx_banip now display reason in the show_activity blurb.
Language files need synced.
2007-08-03 15:46:50 +00:00
67ac030c56 Expanded on the info message when a admin_ban user tries to ban someone not in the cache. 2007-08-03 15:29:29 +00:00
15b62648c9 Implemented amb307 - admincmd now caches a few of the last connections.
amx_addban changed back to ADMIN_BAN.  Users without RCON access will only be able to ban those in the old connection cache.  Users with RCON access still have unrestricted access to amx_addban.

The old connection cache can be viewed with amx_last (ADMIN_BAN access required by default).
2007-08-03 15:26:22 +00:00
b09bf4c532 Work around for amb228 - amxmod_compat caused set_user_hitzones to stop functioning.
Any plugins being emulated by amxmod_compat that still use the traceline forward will still cause the issue, but if no plugins use that forward it won't interfere.

(also, plugin_flags() can now specify a plid)
2007-08-03 06:48:08 +00:00
e045e2fdb6 Fix for amb196 - amx_modules did not handle invalid modules properly. 2007-08-03 05:27:36 +00:00
36dc8da47c Removed native/module filters, oops. 2007-08-03 03:01:22 +00:00
25d95f1115 Fix for amb183 - plmenu's team menu is not compatible with natural selection. 2007-08-03 02:59:46 +00:00
e254ef6b15 Added ns_get_user_team for a replacement for get_user_team. 2007-08-03 02:57:59 +00:00
7038305812 Merged ns plugins / include files to trunk.
(ns/unstuck doesn't require engine any more)
2007-08-02 16:37:57 +00:00
c77176a4ce Re-added svn versioning to module 2007-08-02 16:33:34 +00:00
c604eefde0 Merge of rewritten NS module into trunk 2007-08-02 16:20:32 +00:00
48022d3c5c Implemented amb673 - pre-compiled regular expression support.
Also commented in the include file a bit better.
2007-08-01 17:36:10 +00:00
cf36abf7e6 Implemented amb31 - plmenu default options (for ban menu and slap menu) are configurable in a config file.
Need to include this in the mod - dependent plmenus when they are reviewed later.
2007-08-01 06:03:51 +00:00
ed84900ab6 amb467 - conmotd.txt is removed 2007-08-01 04:19:23 +00:00
83c82387e3 Changed ArrayGetCell() to return the cell value instead of byreferencing the value. 2007-07-26 16:22:29 +00:00
9ce9b142e7 Implemented amb397 - amx_add{client}menuitem now accepts filenames as well as registered plugin names
(is_plugin_loaded() now has an optional second parameter to search for filenames)
2007-07-25 18:54:32 +00:00
ced56c79b6 what the hell how did this change 2007-07-25 18:13:38 +00:00
d836aeb716 Added some defines for cmd_target's filter system (for less cryptic code)
Changed all immunity obeying commands to allow for self execution - amb633
2007-07-25 18:10:08 +00:00
7c642fbf6e final fix for amb29 - ml issues with pause/stop saving in menu.
Need to sync ml changes before can test; should be good.
2007-07-25 17:28:26 +00:00
a28a80e45f Few additions to fakemeta:
Implemented amb632 - lookup_sequence, also added set_controller (since it dealt with models).

Implemented set_pev_string, for setting with an already allocated string handle.  Also added pev_serial, to get the entity serial number.
2007-07-24 06:05:43 +00:00
2cbf7fca08 Forgot to update SVN with TS3.0 and RegisterHamFromEntity changes 2007-07-19 18:43:27 +00:00
4b02ffa920 Fix for amb519: geoip_code2 and geoip_code3 will overflow the result buffer on an unsuccessful lookup.
Added two replacement natives for those two: geoip_code2_ex and geoip_code3_ex, could not modify the old natives without breaking backwards compatibility.
2007-07-19 18:37:13 +00:00
8316318c31 Fix for amb343 - tfc_clearmodel didn't function as advertised. 2007-07-17 02:18:04 +00:00
7b6d4ce699 Fix for amb503 - csx module not setting meta result when paused. 2007-06-30 05:11:13 +00:00
6f590c85f6 fixed bug where fwrite_blocks crashed the server 2007-06-29 21:46:24 +00:00
f86dad801f compiled against latest components, updated link of mxFlatPack in .dpr, bumped version to 1.77 2007-06-28 12:23:50 +00:00
ee5dccfc0f - added ability for statscfg to use translations (amb28)
- added ML translations for new statscfg lines (amb28, from kwo)
- added miscstats/statsx support for new statscfg lines (amb28, patches from kwo)
2007-06-28 04:25:04 +00:00
16c17cff63 Undid portions of revision 3261: get_{pcvar,cvar}_num discrepancies, the added overhead just wasn't worth how stupidly rare the occurrences were. 2007-06-25 03:23:19 +00:00
ce526ac432 Fixed amb109 - mapsmenu now checks mapcyclefile cvar before reverting to mapcycle.txt 2007-06-22 18:37:38 +00:00
a3342213b5 Added amb427: Additional weapons to dod_{get,set}_user_ammo 2007-06-22 18:25:16 +00:00
ef41393bc3 Fixed amb130 - various menus did not take ADMIN_ALL / ADMIN_ADMIN into account. 2007-06-22 17:47:32 +00:00
a45d98efea Fix for amb421: get_user_weapons omitting a weapon in Day of Defeat. 2007-06-22 17:10:21 +00:00
e23f3747ba Possible fix for amb149 - register_event with "e" triggers false positives for dead players not fully in game. 2007-06-22 16:51:16 +00:00
3f268e5f2e Fixed amb69 - metamod trying to reload amxmodx on systems with poorly configured clocks. 2007-06-22 16:02:17 +00:00
b3e61b1d75 Fix for amb108 - statsx keeping port when saving stats by ip - this should still allow for old stats files to work, but there is a small chance for idiosyncrasies if there are multiple users with the same ip (but different port) saved. 2007-06-22 15:35:46 +00:00
6865b984e0 Fixed accidental reversal of think and touch virtual index under Day of Defeat. 2007-06-22 05:06:49 +00:00
7c4dccac8c Added amb30 - csstats_rankbots will stop bots from showing in /top15 2007-06-21 19:37:58 +00:00
6c0300801f Added amb32 - amxx {cvars,cmds} now takes an optional parameter to filter plugins by plugin filename 2007-06-21 15:26:02 +00:00
069c293aba Fixed amb350 - typo in traceline_set_float 2007-06-21 03:44:36 +00:00
7690f1a099 Fixed the mirror system not working. 2007-06-12 15:59:10 +00:00
add02dc55e Fixed amb365 - EF_SetSize() stock had incorrect params 2007-06-05 02:38:48 +00:00
961114c260 Fix for amb305 - tasks cause a crash on mods that do not have the standard mp_timelimit cvar. 2007-05-28 14:49:34 +00:00
ff3def3d00 Forgot to remove the MAX_MAPS define :o 2007-05-24 18:19:45 +00:00
39f759368f Added show_activity changes to mapsmenu
Made mapsmenu use cellarray natives instead of MAX_MAPS
2007-05-24 18:15:41 +00:00
4cdd43b29b Fixed accidental commit of a language file 2007-05-24 17:16:36 +00:00
0c82e09df1 Added amb42 - different amx_show_activity values. 2007-05-24 17:11:11 +00:00
1129f09660 Added the any tag fix for functions returning any: 2007-05-22 01:29:18 +00:00
079606c143 Added amb311 - mapcycle file now ignores .bsp extension 2007-05-20 15:03:26 +00:00
66feed1d2b Added charsmax() define, as a less typo-prone utility for sizeof(array)-1.
Added any: syntax to all variable args that need it, added proper {Float,_}: tags to some that didn't have it but should have.
2007-05-18 15:20:34 +00:00
65748001f0 Added FCAP_* constants 2007-05-16 16:28:44 +00:00
4504875df9 Fixed Makefile
Fixed a few forwards not having FP_DONE at the end (doh!)
2007-05-16 15:24:14 +00:00
cd023c30d9 Added GPL header to all files.
Item_CanDrop -> {CS,DOD}_Item_CanDrop

Added Ham_CS_Item_GetMaxSpeed

Reversed classname and callback parameters for RegisterHam.

Finished commenting ham_const.inc.
2007-05-16 03:57:18 +00:00
7bb562182f Changed _array_included to _cellarray_included 2007-05-14 22:11:28 +00:00
77ca104a8d Renamed array.inc to cellarray.inc so that rukia doesn't start hagging about it. 2007-05-14 22:10:13 +00:00
b660df8df6 Added {get,set}_pdata_cbase{_safe} - compliments Fakemeta's get_pdata functions, but this will set/get an offset that is a CBaseEntity.
Split constants from hamsandwich.inc into ham_const.inc.

Finished commenting native calls, need to finish the constant comments.
2007-05-13 14:01:13 +00:00
b1a086ee93 Added {get,set}_pdata_cbase{_safe} - compliments Fakemeta's get_pdata functions, but this will set/get an offset that is a CBaseEntity.
Split constants from hamsandwich.inc into ham_const.inc.

Finished commenting native calls, need to finish the constant comments.
2007-05-13 13:59:54 +00:00
504ddb4c2f Expanded ESF entries (they had the Linux binary in a retarded location).
Added vanilla HLDM support.

Fixed a weird crash when compiled in release build for Linux.

Expanded HamFilter error messages a tad.
2007-05-12 17:33:58 +00:00
d38d2f56e1 Fixed large return values (Vectors) in MSVC. 2007-05-12 13:16:05 +00:00
9b0ed67c9c Fixed vtable for TFC and NS 2007-05-11 16:54:26 +00:00
1081e84981 Disassembled the rest of the mods, all but cs are untested currently. 2007-05-11 15:02:25 +00:00
ee64440fef Removed TFC_DBGetItemName because I can't figure out the return value syntax (it doesn't sound like a useful function anyway).
Disassembled DoD for the new virtual functions.

Fixed cs weapon virtual functions.  Oops :o
2007-05-10 17:17:33 +00:00
0c56e2803e Added more virtual functions to the table, only have counter-strike disassembled currently. 2007-05-10 16:08:02 +00:00
5fc89085d6 Added the ability to change parameters on the fly.
Added GetHamReturnStatus()
2007-05-09 14:58:55 +00:00
f747acdc7c Added return type modification / retrieval.
Added HAM_{IGNORED,HANDLED,OVERRIDE,SUPERCEDE} to include file.

Added the ability to disable and re-enable hooks.
2007-05-08 17:26:51 +00:00
4e2493759e Hopefully fixed up HamExecuteB for the last time.
Fixed a small memory leak because I wasn't deleting post forwards at map change.

Hopefully fixed an erroneous display of 'stray' keys.
2007-05-07 13:51:40 +00:00
1f1ecfa590 Added module auto load to hamsammich.
Started the stupid comment crap.
2007-05-05 12:36:12 +00:00
bd2ad31f5e Fixed HamExecuteB and made its system a bit more logical. 2007-05-04 15:42:02 +00:00
fb5e7dbfdb Added unhooking of virtual tables at map change.
Removed some more debugging output.
2007-05-04 14:56:57 +00:00
0ac5ce46a7 Removed legacy code from my search to find the mystical link errors.
Removed some debug output from Trampolines.
2007-05-04 13:07:02 +00:00
1073a42409 Fixed silly link errors in MSVC 2007-05-04 13:05:09 +00:00
66d7d39bee First commit of the rewrite
Doesn't build on windows for some retarded reason
2007-05-04 12:51:13 +00:00
46bd9127fb Removing files for a r3wr1t3 2007-05-04 12:39:53 +00:00
5309189602 Implemented amb245 - precache_sound() now returns whatever the engine function returns instead of just returning 1 2007-05-04 01:38:30 +00:00
006396bc92 Apparently this was a bad idea 2007-05-04 01:17:13 +00:00
dc4c9f0258 Fixed this up or something strange like that... 2007-05-04 01:11:01 +00:00
3b737ab87b added request amb122 2007-05-03 13:27:51 +00:00
6170cbc95a implemented amb92 2007-05-02 23:11:49 +00:00
78f18de61a Fixed bug amb244 2007-05-02 02:06:07 +00:00
e34120803d Implemented request amb242: added cs_get/set_user_hostagekills() natives 2007-05-01 21:38:39 +00:00
fdb094045e Wow, nice typo DS 2007-05-01 21:27:52 +00:00
8c45216cfd Oh, forgot to reset ServerPrint 2007-04-30 18:32:40 +00:00
897ed0cb10 Implemented request amb237 - added ServerPrint to Fakemeta 2007-04-30 18:29:33 +00:00
fd8489d088 Fixed amb116 - DispatchKeyValue didn't work with worldspawn (entity 0) 2007-04-28 16:19:04 +00:00
710cd548a9 added linux support to CS_InternalCmd 2007-04-26 20:07:31 +00:00
525eb65e1c updated linux compiler builds 2007-04-26 20:04:38 +00:00
580e52bd2c CZ Bots will now follow restrictions
Fixed amb222 (rebuy could get around restrictions)
2007-04-26 19:22:23 +00:00
2f6bfca68e added CS hook to catch internal bot commands and rebuy commands for players 2007-04-26 19:21:11 +00:00
0377715cdc added CS hook to catch internal bot commands and rebuy commands for players 2007-04-26 19:18:55 +00:00
e3240214a3 Fixed some typos 2007-04-26 14:20:19 +00:00
fc2b220c38 Fixed amb230 - radius_damage didn't completely kill players on some mods 2007-04-25 18:13:16 +00:00
74c6290dc0 imessage and admin plugins compile again 2007-04-25 17:24:02 +00:00
a93ef02efa Base package builds completely again - DS can't do anything right :| 2007-04-25 16:37:13 +00:00
68d2b03e48 Added amb37, amb38, amb39 and amb205: various cstrike natives.
(Still need to test)
2007-04-25 15:40:15 +00:00
d682375d7d rewrote how new menus are detected -- menucmds are no longer used since they're idiotic anyway 2007-04-25 14:44:37 +00:00
3b80342a02 fixed windows build part 2 2007-04-25 14:15:35 +00:00
8f49cddd7d fixed windows build 2007-04-25 14:15:00 +00:00
d679885985 fixed a memory leak in SortCustom1D() 2007-04-25 14:10:47 +00:00
82c3807bd5 implemented SQL_QuoteString and SQL_QuoteStringFmt
fixed sqlx test script not working on first load
2007-04-25 13:55:56 +00:00
58ad23186b updated compiler builds 2007-04-25 13:48:31 +00:00
c957a9db0f Added SQL_QuoteString to include/tests 2007-04-25 13:45:15 +00:00
359b7e25dd added sql_rewind 2007-04-25 13:19:42 +00:00
5d6d0282b0 Fixed amb110 - socket_change() returned 1 if select() syscall returned -1 (KoST) 2007-04-24 19:17:30 +00:00
33e01af955 Fixed Windows builds of all modules - they were broken as a result of all the moves of svn_version.h *sigh* 2007-04-24 18:50:16 +00:00
0d5531a090 IMessage now supports unlimited messages and uses pcvars 2007-04-24 18:18:45 +00:00
2659c906fb Changed map list to use dynamic arrays 2007-04-24 17:41:56 +00:00
d563ecb060 Added pseudo dynamic array natives.
Changed some of the "..." tags to "any".
2007-04-24 16:38:36 +00:00
bfe1ff6e15 implemented amb27 (SQL_Rewind)
fixed builds
2007-04-24 15:46:33 +00:00
adfc2ab451 fixed mysql msvc7 build 2007-04-24 15:26:08 +00:00
ea912f794c Stole the magical any: tag from sourcemod 2007-04-24 13:36:36 +00:00
8e1f54465d Fixed amb226 - missing return after pfnClientPrintf 2007-04-20 19:02:35 +00:00
2c2259ea15 Fixed possible issue that could arise with the new newmenu last page handler :O 2007-04-20 15:47:55 +00:00
be4fdb1776 Fixed the completely börked handling of the last page with newmenus. 2007-04-20 15:27:04 +00:00
76158b031d Forgot to actually register LookupLangKey :o 2007-04-20 03:02:41 +00:00
599029b68e Fixed an issue where "exit" wasn't working properly on pages with valid next and more selections. 2007-04-20 02:59:35 +00:00
201d65749e Added LookupLangKey for the upcoming show_activity changes. 2007-04-20 02:55:59 +00:00
17d8197e72 Added amb#34 - Plugin cvar/command menus.
Still need to add ML support.
2007-04-18 15:52:03 +00:00
1ed1d0005c Added menu property to change number color 2007-04-18 04:20:48 +00:00
51f8d7f84e Added a more intuitive method for rcon-protecting cvars.
Added SQL cvars to the protected list
2007-04-17 19:03:25 +00:00
1ec4d9cc7d fixed amb18 and various associated menu re-entrancy bugs 2007-04-16 18:00:54 +00:00
b90bc3a3e4 fixed bug amb46 2007-04-16 17:11:40 +00:00
de530e2ca3 fixed amb200, added native test suite 2007-04-16 17:08:15 +00:00
5d4669d52e implemented amb17
expanded menu tests
deprecated MEXIT_NORMAL, MPROP_ORDER, MPROP_PADMENU
fixed various bugs in PagekeyToItem
2007-04-16 06:58:28 +00:00
Zor
8dc310f1bb Fixed error on compile that svn_version.h could not be found in moduleconfig.h 2007-04-15 10:26:55 +00:00
Zor
9cca961024 Fixed error with the dod_client_spawn not being called when the player spawns after a map cap and not being dead 2007-04-15 10:24:45 +00:00
7b4283bf4a Fixed amb207: Last item displayed as "10" instead of "0" on new menus. 2007-04-13 23:59:52 +00:00
1f423dc39f Fixed amb208: new menu state not being reset when item has no state callback. 2007-04-13 23:57:14 +00:00
ab6fea5767 Added amb202: csstats_rankbots in amxx.cfg
Organized comments a bit in all config files.

Added default value comments to all cvars.
2007-04-13 20:21:51 +00:00
3328b570d4 Removed accidental server debug output. 2007-04-13 18:44:39 +00:00
63427b2ad0 Added amb51 - 4 options in amx_vote
Also fixed a potential formatting issue with the vote display.
2007-04-13 18:43:36 +00:00
61052c41a1 added amb64 - amx_voteban auto detects if it should ip ban. 2007-04-13 18:17:24 +00:00
5c68df7ac7 Fixed the damn comments 2007-04-02 18:39:38 +00:00
8872d98dd6 Possible fix for amb86: "USER" key should have been "PLAYER" 2007-03-30 14:33:52 +00:00
03bae80ed2 Addendum to revision 3434; fixed for other mods, although they're not multilingual, just in-case. 2007-03-30 13:35:08 +00:00
1161b5ee7e Fix for amb91: miststats buffer was too small for some language translations.
Not sure if this affects other mods, need to look through their stats stuff.
2007-03-30 13:22:12 +00:00
b49bf1b13c Fix for amb78: get_concmdsnum result caching causing discrepencies 2007-03-30 02:13:49 +00:00
81994ecf58 Fix for access() with ADMIN_ALL
Very minor optimization for is_user_admin

(amb81)
2007-03-30 02:04:30 +00:00
4682cec1cb Documentation fix for amb120 2007-03-30 01:59:57 +00:00
b9a0ffacc4 Fix for amb118: amx_help would not output ADMIN_ADMIN commands 2007-03-30 01:52:10 +00:00
ae46e3f6ab Moved svn_version.h and svn_version.tpl out of SDK directories... 2007-03-27 16:07:28 +00:00
68beb4b1a3 Fixed some minor annoyances with dlsym
- Added missing newline character to "File not found" message
 - Now properly handles relative file paths
2007-03-21 20:24:01 +00:00
118b002ee8 Synced Module SDK files with most recent fixes
- Fixed potential issue with Meta_Query
 - Removed debug message from GiveFnptrsToDll that has been present for a long long time

Again I ask why?
2007-03-21 20:22:20 +00:00
a004e906dd Updated SQLite to 3.3.13 - why? I have no idea 2007-03-21 20:19:37 +00:00
eaa4122c5a Fixed amb107: socket_open doesn't return error by reference 2007-03-19 09:45:45 +00:00
e326ab1593 Fixed amb94 - Name length in amx_psay
I'm never trusting Brad again.
2007-03-18 12:10:36 +00:00
5252e06c2a fixed amb90 (not working in 0th slot, related to commit 2491) 2007-03-16 04:17:47 +00:00
e61809496d Updated modules.versions 2007-03-16 04:16:30 +00:00
edaf960407 Added request amb76 - hex format specifier (%x and %X) 2007-03-14 02:16:09 +00:00
e3217964c4 Fixed core MSVC8 compile :\ 2007-03-14 02:12:51 +00:00
397479cd77 Fixed amb85 - tag mismatch warning on ShowSyncHudMsg 2007-03-13 22:51:12 +00:00
d151ee0b58 Added svn:ignore property to a bunch of stuff 2007-03-13 21:26:04 +00:00
ce88004900 Tiny bit of reorganizing done to WinCSX 2007-03-13 21:10:28 +00:00
1e8d0e10e6 Fixed unused symbol warning 2007-03-13 20:34:38 +00:00
bb641688ee Oops, guess I forgot to fix this path 2007-03-13 20:22:47 +00:00
ab53914351 Massive reorganization attempt - part 2
Moved old/defunct/unofficial modules out of trunk
2007-03-13 19:45:19 +00:00
54186736c8 Massive reorganization attempt - part 1.8 2007-03-13 19:28:24 +00:00
b66fea0fbc Massive reorganization attempt - part 1.77 2007-03-13 19:22:44 +00:00
bf2c9620f3 Massive reorganization attempt - part 1.76 2007-03-13 19:19:33 +00:00
af96229d5d Massive reorganization attempt - part 1.75 2007-03-13 18:44:23 +00:00
be323039d1 Massive reorganization attempt - part 1.5 2007-03-13 11:48:53 +00:00
c71be87a3a Massive reorganization attempt - part 1
Oh dear, what has DS done now?
2007-03-13 11:46:03 +00:00
e4b01bc066 fixed various linux compiling issues... 2007-03-13 04:16:20 +00:00
3ac076e098 Hello, I might have added some SLN files for the MSVC8 projects 2007-03-13 03:11:28 +00:00
e6120fdcd6 fixed a small bug where loading under dlsym crashed
fixed line endings in vim
2007-03-13 00:42:16 +00:00
4dc4616933 added "makeopts" to win32 devenv 2007-03-13 00:29:10 +00:00
46a3929365 excluded svn_version.tpl
if a mod fails to build, it's no longer fatal
2007-03-13 00:21:35 +00:00
4597868d30 wow i forgot core's template 2007-03-12 22:45:57 +00:00
cf716c4049 added tsfun and added a --modules option to the versionchanger script 2007-03-12 22:33:43 +00:00
cc6b9d3d81 added dynamic versioning
committed .sln files to a few wayward projects
2007-03-12 22:27:27 +00:00
a34279b971 fixed a bug in the installer packager 2007-03-12 20:44:29 +00:00
5cac87c99f *sigh* This compiles again 2007-03-11 05:19:54 +00:00
309bc2dcaa Added a special comment inside in_view_cone 2007-03-11 04:55:38 +00:00
7124f8bd2c MSVC didn't like my cdecl placement :( 2007-03-10 18:16:21 +00:00
c9b19c76a5 Added a whole lot more functions that nobody will use 2007-03-10 18:05:30 +00:00
8939c3076a Continued making adding new entries easier
{hs_}register_function->ham_register(HamHook:function,...)

Added a few more hooks

Fixed a few directory errors

Updated config file
2007-03-09 18:15:09 +00:00
71065a65dd attempted merge at 1.77 back into trunk... Oh MY GOD 2007-03-09 03:04:40 +00:00
7adc49c541 changed start page back to original first page 2007-03-08 17:23:36 +00:00
baba221dd9 made my life 1,000 times easier for creating these release builds 2007-03-08 06:20:11 +00:00
829485ef2a bumped version one last time
fixed makefile for nongpl changes
2007-03-08 04:54:03 +00:00
b793b80360 fixed several FTP bugs (thanks bail!) 2007-03-07 20:38:42 +00:00
ea34c2c78a fixed a bug reported by peanut where amx_fwrite() had the wrong sizeof() type 2007-03-07 02:29:54 +00:00
722e97fef2 (hopefully) fixed bug where 0 files+dirs were detected 2007-03-05 21:37:48 +00:00
bd412d7204 Fixed bug amb70 - include files not semicolon-correct
Also, removed OLOcode from amxmisc.inc
2007-03-05 19:30:40 +00:00
39e6d958bf bumped installer version 2007-03-04 06:06:44 +00:00
bb54b37399 removed allow_nongpl, it wasn't really viable 2007-03-04 04:37:42 +00:00
88dd3b021e removed this option 2007-03-04 04:33:29 +00:00
ef4d19378d bumped more versions 2007-03-04 03:43:57 +00:00
7f1ea1490d bumped necessary module versions 2007-03-04 03:42:11 +00:00
041fb4e37f updated compiler builds 2007-03-04 01:46:38 +00:00
193e59df90 updated compiler builds 2007-03-04 01:40:40 +00:00
d4703f045d fixed a bug where '%c' did not correctly count toward the writable string length 2007-03-04 00:02:23 +00:00
109b1e45b5 added non-gpl plugin blocking (wow i can't believe it came to this) 2007-03-03 23:14:24 +00:00
1f1edef98d Merged in NS 3.2 Final offsets 2007-03-01 22:39:57 +00:00
83631e95aa fixed bug amb41 2007-02-24 21:08:00 +00:00
6eb1242600 fixed tags (amb36) 2007-02-24 20:07:21 +00:00
77e7ea161b Fixed half of amb29 - Debug plugins could not be paused/stopped
Waiting on language keys to fix the rest
2007-02-21 21:03:48 +00:00
09f271e5d0 Fixed amb35, multiple plugins loading 2007-02-21 18:42:14 +00:00
e35a8326d5 Fixed an issue where backwards amx mod compatibility layer wasn't transparent. 2007-02-20 22:25:17 +00:00
09d46aa025 Fixed native get_num_ents 2007-02-20 20:57:21 +00:00
615e097c68 Fixed am49892 - Plugin load fails going to error logs instead of normal logs 2007-02-19 08:46:43 +00:00
ade56b62e9 Fixed am50089 - unary - float operator 2007-02-19 08:11:00 +00:00
b3d7f04b5e Fixed am50530 - amx_psay output format fix 2007-02-19 07:34:38 +00:00
4f81c50a3e Fixed am50731 - compiler crash when amxmisc is included before amxmodx 2007-02-19 07:03:26 +00:00
d45c3aeb96 Fixed am51050 - "amxx {pause,unpause" had misleading output 2007-02-19 06:57:26 +00:00
fff603635a Fixed am51051 - unpause() returning true on stopped plugins 2007-02-19 06:43:52 +00:00
06f01ea7dc Wow I deleted the comment too! 2007-02-19 06:38:08 +00:00
2395abcf7e Fixed retarded typo 2007-02-19 06:37:03 +00:00
d33f9ba2d4 Fixed am51083 - Comments in amxmodx.inc 2007-02-19 06:29:02 +00:00
aec28542ac Fixed am51276 - typod "return" 2007-02-19 06:23:34 +00:00
73219c45dd Fixed bug am51368 - Unused variable 2007-02-19 06:16:56 +00:00
39d6cb7840 Fixed #error ignoring #if blocks 2007-02-16 18:49:21 +00:00
bfd4e345dd corrected a typo 2007-02-14 18:55:42 +00:00
aded0f9c1c Added request am49339 - exploding chainsaw gun 2007-02-14 05:17:57 +00:00
811265e28b made it a little safer 2007-02-12 19:35:01 +00:00
0caffa2b82 fixed bug where directories in / couldn't be detected unless your home directory was / 2007-02-12 19:32:32 +00:00
4dfb01bb1d finished ftp browser in the settings dialog (rewrote it, looks pretty nice now imo), various other changes 2007-02-12 18:21:40 +00:00
862ed243be Fixed typo (am51042) 2007-02-10 21:10:55 +00:00
39f1fa6045 Fixed unnecessary call to accessUser() (am51009) 2007-02-09 08:34:33 +00:00
f26939e2cc Fixed bug am50907 - Name and Tag admins were case sensitive 2007-02-09 07:26:37 +00:00
9d53451933 bumped version to 1.76d 2007-02-05 21:21:50 +00:00
4ae54eeb2a fixed am50849 2007-02-05 21:13:15 +00:00
d62ae07b75 Merged in changes from revision 3276 in 1.77: ES_Body was not a valid parameter for get/set_es() 2007-02-01 22:25:18 +00:00
0f22a7fa06 Added missing natives:
- take_damage
- entity_use
- get_num_ents
2007-01-31 20:20:49 +00:00
7f3c2d00ac fixed bug am50501 2007-01-28 05:01:38 +00:00
b324e8ed9d Merged revision 3260 from 1.77; Stats would not display on awkward mp_roundtime settings 2007-01-26 06:15:49 +00:00
8420823713 Merged revision 3251 from 1.77; debug commands not counted as running in amx_plugins 2007-01-26 06:12:25 +00:00
1d1b50ce0c Merged revision 3250 from 1.77; amx_addban is now ADMIN_RCON access by default 2007-01-26 06:11:00 +00:00
35fcca8a66 Merged revision 3258 from 1.77; forward_return with non-string values 2007-01-26 06:08:29 +00:00
7a01503478 Merged revision 3249 from 1.77; fixed typo in tfcconst.in (am50097) 2007-01-26 06:04:11 +00:00
dd8f138892 Back ported revision 3242 - Every include file now is const correct (am49281) 2007-01-26 05:56:10 +00:00
8341e41f04 Fixed TE_GLOWSPRITE (vittu) & TE_PLAYERSPRITES examples 2007-01-18 00:18:31 +00:00
a682ec6b7a Fixed TE_DLIGHT example Valve mistake! (P34nut) 2007-01-17 18:16:17 +00:00
451b648c7f Fixed TR_InOpen missing with *et_tr native (XxAvalanchexX) 2007-01-17 14:52:09 +00:00
2d1c43c937 Merged in changes to report 49977 2007-01-17 06:56:52 +00:00
17adb214f2 Fixed bug am49982 (wrote parameter counts) 2007-01-17 05:32:45 +00:00
3a2839c6c9 bugfix for 49698 2007-01-15 15:56:48 +00:00
f96f95c4ff translated shortcuts into english :x 2007-01-15 15:53:14 +00:00
609fdae508 Fixed native get_user_origin mode 4 2007-01-09 15:01:08 +00:00
580305ce92 fixed am49041 (hopefully) 2007-01-02 13:23:23 +00:00
cbfd12e0f1 fixed am49040 2007-01-02 13:17:33 +00:00
c5ccf7d2c8 fixed am48881 2007-01-02 13:04:56 +00:00
Zor
d1c42751cd - Fix in need of testing in regards to the TK / TA bug detected
- Created a temp pointer as the first thing to do in the CurWpn function.  This way if another message gets thrown while still in the middle of this function the global pointer to messaged player is not affected.
2006-12-29 19:25:16 +00:00
68f1ce7a52 fixed an initialization bug 2006-12-23 22:05:51 +00:00
e5b0ed3af1 fixed bug am48866 part 2 2006-12-23 19:01:11 +00:00
49e70063fa fixed bug am48866 2006-12-23 18:59:30 +00:00
7aa4cf70be removed amd64 support from installer (and yep, installer's version is already up-to-date ;] ) 2006-12-19 19:50:20 +00:00
b661873426 removed amd64 crap 2006-12-19 14:34:41 +00:00
8e290cdf31 final build info 2006-12-19 14:26:31 +00:00
42f23a832a bumped version number for plugins 2006-12-19 14:24:01 +00:00
13e619bf97 bumped versions 2006-12-19 14:18:05 +00:00
4332d6c271 fixed bug am47617 2006-12-19 14:03:02 +00:00
627b3f0f98 Fixed bug 48522 2006-12-19 12:24:36 +00:00
b7b55d060a sawce's sdk fixes 2006-12-19 11:19:45 +00:00
b110021f4f fixed bug am48308 2006-12-19 11:12:12 +00:00
96c49f4ff9 defaulted value back to 0 for backwards compat 2006-12-19 11:03:00 +00:00
f53c877670 fixed bug am27152 2006-12-19 10:57:43 +00:00
b237317e50 Fixed bug am48018 2006-12-19 10:36:26 +00:00
73b2ceb855 fixed bug am47988 2006-12-19 03:32:58 +00:00
b64fb4678d fixed issue 48202 2006-12-19 02:35:16 +00:00
d6ed1a8d8a Fixed bug am48234 2006-12-19 02:24:09 +00:00
b762174c30 fixed bug am48275 2006-12-19 02:02:49 +00:00
86838bead1 Fixed bug am48294 2006-12-19 01:58:46 +00:00
e6c15d9f05 Fixed bug am48580 2006-12-19 01:57:18 +00:00
266ed797c5 Fixed bug at48523 2006-12-18 14:33:06 +00:00
93cb2060dd fixed typo 2006-12-11 04:07:55 +00:00
0cd1782d01 fixed bug at48369 once and for all 2006-12-10 22:58:28 +00:00
75a5dadd4d small bug fix, compressed exe again :x 2006-12-10 22:37:01 +00:00
f03449acbd fixed 3rd bug at48369 2006-12-10 22:32:49 +00:00
34f127b9aa fixed 2nd bug at48369 2006-12-10 22:25:09 +00:00
0c345ceebc fixed bug at48201 2006-12-09 18:23:52 +00:00
c5dc780635 correction since commit 3164 was accidental 2006-12-06 08:46:44 +00:00
fe0e461c76 checks if the none option is the majority vote 2006-12-06 07:41:38 +00:00
935da9f0de version bump? >:o 2006-12-05 19:31:22 +00:00
36e9f29d55 2006-12-03 02:20:32 +00:00
c66c076a03 fixed bug at47865 2006-11-28 20:04:04 +00:00
4eaea443e1 who would have thought that iterators change?! 2006-11-22 07:33:54 +00:00
299f1b5f62 Fixed bug am46960 (cannot unpause through menu) 2006-11-22 06:14:10 +00:00
4e7bf7e348 ! 2006-11-22 05:39:08 +00:00
d048996b50 fixed bug am47194 (journal crash) 2006-11-22 05:30:58 +00:00
a34c8daf34 again... oops 2006-11-22 04:17:08 +00:00
6cd5a51c8e fixed issue am47452 2006-11-22 04:14:56 +00:00
5cabf748ca fixed issue am47474 2006-11-22 04:13:39 +00:00
1905ea7295 added info about console commands 2006-11-22 02:47:15 +00:00
89158f9342 Added request am47144 (register_*cmd return id) 2006-11-22 02:45:12 +00:00
db7dc509e0 Fixed another serious bug where deleting menus and not returning PLUGIN_HANDLED would cause the iterator to fail and crash 2006-11-21 23:59:21 +00:00
c15a23a2a7 fixed a serious bug where deleted forwards could be placed in the re-use cache too soon 2006-11-21 23:06:50 +00:00
3e0866e57a fixed bug am47134 2006-11-11 19:05:46 +00:00
551e5298cc fixed bug am46924 2006-11-05 18:38:09 +00:00
dfea3e8a13 corrected typo (at46807) 2006-11-03 13:27:17 +00:00
e8a30e7187 bumped version 2006-11-01 00:33:30 +00:00
8a93673276 2006-10-31 22:53:29 +00:00
ece4db4f43 oh no, new version number 2006-10-31 20:37:43 +00:00
8b8cc3dd6b Fixed bug am46630: rename_file did not have a relative location version 2006-10-31 20:18:44 +00:00
b33e76d9c4 Fixed bug am46559 2006-10-31 19:48:47 +00:00
6fb6d7d399 Fixed bug am46699 - dod stats.sma did not show multi-lingual menus correctly 2006-10-31 19:42:34 +00:00
5649a17502 fixed silly translation bug 2006-10-31 19:38:30 +00:00
5cfc2df359 fixed potential in-game bug 2006-10-31 19:36:47 +00:00
1ac390b54c Fixed version # 2006-10-31 19:31:54 +00:00
102c2b219f Fixed bug am46336 - could not compile TraceLn 2006-10-27 05:53:09 +00:00
4e1d420495 added AMX_ERR_GENERAL to the error list 2006-10-27 05:49:34 +00:00
e93e75fa39 Bumped version numbers 2006-10-27 05:47:38 +00:00
90c213bc6d fixed querying invalid players 2006-10-27 05:41:04 +00:00
6c3e7e7ee0 removed another get_players("ae") 2006-10-27 05:40:09 +00:00
8a2528108d Fixed bug am46378 2006-10-25 16:54:37 +00:00
a65d65bee4 fix for bug am46266: TFC team names not picking up 2006-10-24 22:57:19 +00:00
483403aa3a Fixed bug am46335 - text spacing not aligned in adminchat 2006-10-24 22:30:15 +00:00
2a1dbf5247 Fixed bug am46350 2006-10-24 17:13:02 +00:00
7aa687eb69 Attempted a patch for am46340 2006-10-24 17:09:28 +00:00
699cb2a6d6 fixed bug at45677 2006-10-22 19:15:36 +00:00
7b82bc7b76 several bug fixes in the auto-update system, bumped version to 1.4.3 final and improved code snippets feature (can now append or insert snippet into new line) 2006-10-22 18:56:39 +00:00
ed43b8a5ac Changed to use CreateMultiForwardEx() instead 2006-10-22 03:52:02 +00:00
d2ebca38a1 Experimental addition to CreateMultiForward() for bcompat 2006-10-22 03:49:23 +00:00
d542015214 Fixed bug am46112 2006-10-22 00:45:33 +00:00
d84c3a3798 Fixed bug am46058, unpausing stopped plugins 2006-10-21 21:48:24 +00:00
405d9ff48e bumped trunk version 2006-10-21 21:27:07 +00:00
a63c728471 added two new tests to the menu test suite 2006-10-21 21:13:57 +00:00
a60e9d205b fixed bug where blanks misaligned the item selection process 2006-10-21 21:13:39 +00:00
553a950b98 added comment :( yes we broke backwards compat 2006-10-21 20:20:44 +00:00
955e827b19 Fixed bug am45492 (stats always resetting) 2006-10-21 19:23:16 +00:00
00380cfe4c fixed a bug in get_func_id (thanks P34CH_34732) 2006-10-02 06:12:02 +00:00
12ecf026db hack for backwards compat layer (thanks suicid3) 2006-10-02 06:07:38 +00:00
3fa6cd3227 added a timeout test which does not work, thanks MySQL 2006-10-01 19:59:27 +00:00
fe1ebfe7bb fix for 45337 and some other little things 2006-10-01 19:46:56 +00:00
f3057efd7d updated the test suite 2006-10-01 18:36:15 +00:00
39d5ea94fb Added extra param to is_in_viewcone to switch between a 2D and 3D calculation
Neither is still as accurate as I want them to be though :\
2006-10-01 06:08:39 +00:00
90f11b52bc Fixed am45318 - Some wrong constants from TraceResult enum 2006-10-01 02:39:59 +00:00
9740f6469d this feature is just for sawce (updated go to line dialog) 2006-09-30 19:03:49 +00:00
461e7de151 fixed bug at45362 2006-09-30 18:49:28 +00:00
849 changed files with 123899 additions and 115920 deletions

View File

@ -124,8 +124,6 @@ CmdMngr::Command* CmdMngr::getCmd(long int id, int type, int access)
int CmdMngr::getCmdNum(int type, int access) int CmdMngr::getCmdNum(int type, int access)
{ {
if ((access == buf_access) && (type == buf_type))
return buf_num; // once calculated don't have to be done again
buf_access = access; buf_access = access;
buf_type = type; buf_type = type;

413
amxmodx/CFlagManager.cpp Normal file
View File

@ -0,0 +1,413 @@
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "sh_list.h"
#include "CString.h"
#include "amxmodx.h"
#include "CFlagManager.h"
void CFlagManager::SetFile(const char *Filename)
{
m_strConfigFile.assign(g_mod_name.c_str());
m_strConfigFile.append("/");
m_strConfigFile.append(get_localinfo("amxx_configsdir","addons/amxmodx/configs"));
m_strConfigFile.append("/");
m_strConfigFile.append(Filename);
CreateIfNotExist();
}
const int CFlagManager::LoadFile(const int force)
{
CheckIfDisabled();
// If we're disabled get the hell out. now.
if (m_iDisabled)
{
return 0;
}
// if we're not forcing this, and NeedToLoad says we dont have to
// then just stop
if (!force && !NeedToLoad())
{
return 0;
};
this->Clear();
// We need to load the file
FILE *File;
File=fopen(m_strConfigFile.c_str(),"r");
if (!File)
{
AMXXLOG_Log("[AMXX] FlagManager: Cannot open file \"%s\" (FILE pointer null!)",m_strConfigFile.c_str());
return -1;
};
// Trying to copy this almost exactly as other configs are read...
String Line;
char Command[256];
char Flags[256];
String TempLine;
while (!feof(File))
{
Line._fread(File);
char *nonconst=const_cast<char *>(Line.c_str());
// Strip out comments
while (*nonconst)
{
if (*nonconst==';') // End the line at comments
{
*nonconst='\0';
}
else
{
nonconst++;
}
};
Command[0]='\0';
Flags[0]='\0';
// Extract the command
TempLine.assign(Line.c_str());
nonconst=const_cast<char *>(TempLine.c_str());
char *start=NULL;
char *end=NULL;
// move up line until the first ", mark this down as the start
// then find the second " and mark it down as the end
while (*nonconst!='\0')
{
if (*nonconst=='"')
{
if (start==NULL)
{
start=nonconst+1;
}
else
{
end=nonconst;
goto done_with_command;
}
}
nonconst++;
}
done_with_command:
// invalid line?
if (start==NULL || end==NULL)
{
// TODO: maybe warn for an invalid non-commented line?
continue;
}
*end='\0';
strncpy(Command,start,sizeof(Command)-1);
// Now do the same thing for the flags
nonconst=++end;
start=NULL;
end=NULL;
// move up line until the first ", mark this down as the start
// then find the second " and mark it down as the end
while (*nonconst!='\0')
{
if (*nonconst=='"')
{
if (start==NULL)
{
start=nonconst+1;
}
else
{
end=nonconst;
goto done_with_flags;
}
}
nonconst++;
}
done_with_flags:
// invalid line?
if (start==NULL || end==NULL)
{
// TODO: maybe warn for an invalid non-commented line?
continue;
}
*end='\0';
strncpy(Flags,start,sizeof(Flags)-1);
//if (!isalnum(*Command))
if (*Command == '"' ||
*Command == '\0')
{
continue;
};
// Done sucking the command and flags out of the line
// now insert this command into the linked list
AddFromFile(const_cast<const char*>(&Command[0]),&Flags[0]);
nonconst=const_cast<char *>(Line.c_str());
*nonconst='\0';
};
fclose(File);
return 1;
}
/**
* This gets called from LoadFile
* Do NOT flag the entries as NeedToWrite
* No comment is passed from the file because
* this should never get written
*/
void CFlagManager::AddFromFile(const char *Command, const char *Flags)
{
CFlagEntry *Entry=new CFlagEntry;
Entry->SetName(Command);
Entry->SetFlags(Flags);
// Link it
m_FlagList.push_back(Entry);
};
void CFlagManager::LookupOrAdd(const char *Command, int &Flags, AMX *Plugin)
{
if (m_iDisabled) // if disabled in core.ini stop
{
return;
}
int TempFlags=Flags;
if (TempFlags==-1)
{
TempFlags=0;
}
List<CFlagEntry *>::iterator iter;
List<CFlagEntry *>::iterator end;
iter=m_FlagList.begin();
end=m_FlagList.end();
while (iter!=end)
{
if (strcmp((*iter)->GetName()->c_str(),Command)==0)
{
CFlagEntry *Entry=(*iter);
if (Entry->IsHidden()) // "!" flag, exclude this function
{
return;
}
// Found, byref the new flags
Flags=Entry->Flags();
// Move it to the back of the list for faster lookup for the rest
m_FlagList.erase(iter);
m_FlagList.push_back(Entry);
return;
}
iter++;
}
// was not found, add it
CFlagEntry *Entry=new CFlagEntry;
Entry->SetName(Command);
Entry->SetFlags(TempFlags);
if (Plugin)
{
CPluginMngr::CPlugin* a = g_plugins.findPluginFast(Plugin);
if (a)
{
Entry->SetComment(a->getName());
}
}
// This entry was added from a register_* native
// it needs to be written during map change
Entry->SetNeedWritten(1);
// Link it
m_FlagList.push_back(Entry);
}
void CFlagManager::WriteCommands(void)
{
List<CFlagEntry *>::iterator iter;
List<CFlagEntry *>::iterator end;
FILE *File;
int NeedToRead=0;
// First off check the modified time of this file
// if it matches the stored modified time, then update
// after we write so we do not re-read next map
struct stat TempStat;
stat(m_strConfigFile.c_str(),&TempStat);
if (TempStat.st_mtime != m_Stat.st_mtime)
{
NeedToRead=1;
};
File=fopen(m_strConfigFile.c_str(),"a");
iter=m_FlagList.begin();
end=m_FlagList.end();
while (iter!=end)
{
if ((*iter)->NeedWritten())
{
if ((*iter)->GetComment()->size())
{
fprintf(File,"\"%s\" \t\"%s\" ; %s\n",(*iter)->GetName()->c_str(),(*iter)->GetFlags()->c_str(),(*iter)->GetComment()->c_str());
}
else
{
fprintf(File,"\"%s\" \t\"%s\"\n",(*iter)->GetName()->c_str(),(*iter)->GetFlags()->c_str());
}
(*iter)->SetNeedWritten(0);
}
++iter;
};
fclose(File);
// If NeedToRead was 0, then update the timestamp
// that was saved so we do not re-read this file
// next map
if (!NeedToRead)
{
stat(m_strConfigFile.c_str(),&TempStat);
m_Stat.st_mtime=TempStat.st_mtime;
}
}
int CFlagManager::ShouldIAddThisCommand(const AMX *amx, const cell *params, const char *cmdname) const
{
// If flagmanager is disabled then ignore this
if (m_iDisabled)
{
return 0;
}
// If 5th param exists it was compiled after this change was made
// if it does not exist, try our logic at the end of this function
// 5th param being > 0 means explicit yes
// < 0 means auto detect (default is -1), treat it like there was no 5th param
// 0 means explicit no
if ((params[0] / sizeof(cell)) >= 5)
{
if (params[5]>0) // This command was explicitly told to be included
{
return 1;
}
else if (params[5]==0) // this command was explicitly told to NOT be used
{
return 0;
}
}
// auto detect if we should use this command
// if command access is -1 (default, not set to ADMIN_ALL or any other access), then no
if (params[3]==-1)
{
return 0;
}
// if command is (or starts with) "say", then no
if (strncmp(cmdname,"say",3)==0)
{
return 0;
}
// else use it
return 1;
};
void CFlagManager::Clear(void)
{
List<CFlagEntry *>::iterator iter;
List<CFlagEntry *>::iterator end;
iter=m_FlagList.begin();
end=m_FlagList.end();
while (iter!=end)
{
delete (*iter);
++iter;
}
m_FlagList.clear();
};
void CFlagManager::CheckIfDisabled(void)
{
if (atoi(get_localinfo("disableflagman","0"))==0)
{
m_iDisabled=0;
}
else
{
m_iDisabled=1;
}
};

218
amxmodx/CFlagManager.h Normal file
View File

@ -0,0 +1,218 @@
#ifndef CFLAGMANAGER_H
#define CFLAGMANAGER_H
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "sh_list.h"
#include "CString.h"
#include "amxmodx.h"
class CFlagEntry
{
private:
String m_strName; // command name ("amx_slap")
String m_strFlags; // string flags ("a","b")
String m_strComment; // comment to write ("; admincmd.amxx")
int m_iFlags; // bitmask flags
int m_iNeedWritten; // write this command on map change?
int m_iHidden; // set to 1 when the command is set to "!" access in
// the .ini file: this means do not process this command
public:
CFlagEntry()
{
m_iNeedWritten=0;
m_iFlags=0;
m_iHidden=0;
};
const int NeedWritten(void) const
{
return m_iNeedWritten;
};
void SetNeedWritten(const int i=1)
{
m_iNeedWritten=i;
};
const String *GetName(void) const
{
return &m_strName;
};
const String *GetFlags(void) const
{
return &m_strFlags;
};
const String *GetComment(void) const
{
return &m_strComment;
};
const int Flags(void) const
{
return m_iFlags;
};
void SetName(const char *data)
{
m_strName.assign(data);
};
void SetFlags(const char *flags)
{
// If this is a "!" entry then stop
if (flags && flags[0]=='!')
{
SetHidden(1);
return;
}
m_strFlags.assign(flags);
m_iFlags=UTIL_ReadFlags(flags);
};
void SetFlags(const int flags)
{
m_iFlags=flags;
char FlagsString[32];
UTIL_GetFlags(FlagsString, flags);
m_strFlags.assign(FlagsString);
};
void SetComment(const char *comment)
{
m_strComment.assign(comment);
};
void SetHidden(int i=1)
{
m_iHidden=i;
};
int IsHidden(void) const
{
return m_iHidden;
};
};
class CFlagManager
{
private:
List<CFlagEntry *> m_FlagList;
String m_strConfigFile;
struct stat m_Stat;
int m_iForceRead;
int m_iDisabled;
void CreateIfNotExist(void) const
{
FILE *fp;
fp=fopen(m_strConfigFile.c_str(),"r");
if (!fp)
{
// File does not exist, create the header
fp=fopen(m_strConfigFile.c_str(),"a");
if (fp)
{
fprintf(fp,"; This file will store the commands used by plugins, and their access level\n");
fprintf(fp,"; To change the access of a command, edit the flags beside it and then\n");
fprintf(fp,"; change the server's map.\n;\n");
fprintf(fp,"; Example: If I wanted to change the amx_slap access to require\n");
fprintf(fp,"; RCON access (flag \"l\") I would change this:\n");
fprintf(fp,"; \"amx_slap\" \"e\" ; admincmd.amxx\n");
fprintf(fp,"; To this:\n");
fprintf(fp,"; \"amx_slap\" \"l\" ; admincmd.amxx\n;\n");
fprintf(fp,"; To disable a specific command from being used with the command manager\n");
fprintf(fp,"; and to only use the plugin-specified access set the flag to \"!\"\n;\n");
fprintf(fp,"; NOTE: The plugin name at the end is just for reference to what plugin\n");
fprintf(fp,"; uses what commands. It is ignored.\n\n");
fclose(fp);
};
}
};
/**
* Returns 1 if the timestamp for the file is different than the one we have loaded
* 0 otherwise
*/
inline int NeedToLoad(void)
{
struct stat TempStat;
stat(m_strConfigFile.c_str(),&TempStat);
// If the modified timestamp does not match the stored
// timestamp than we need to re-read this file.
// Otherwise, ignore the file.
if (TempStat.st_mtime != m_Stat.st_mtime)
{
// Save down the modified timestamp
m_Stat.st_mtime=TempStat.st_mtime;
return 1;
};
return 0;
};
public:
CFlagManager()
{
memset(&m_Stat,0x0,sizeof(struct stat));
m_iDisabled=0;
m_iForceRead=0;
};
~CFlagManager()
{
};
/**
* Sets the filename in relation to amxmodx/configs
*/
void SetFile(const char *Filename="cmdaccess.ini");
const char *GetFile(void) const { return m_strConfigFile.c_str(); };
/**
* Parse the file, and load all entries
* Returns 1 on success, 0 on refusal (no need to), and -1 on error
*/
const int LoadFile(const int force=0);
/**
* Checks if the command exists in the list
* If it does, it byrefs the flags for it
* If it does not, it adds it to the list
* These are added from register_*cmd calls
*/
void LookupOrAdd(const char *Command, int &Flags, AMX *Plugin);
/**
* Write the commands back to the file
*/
void WriteCommands(void);
/**
* Add this straight from the cmdaccess.ini file
*/
void AddFromFile(const char *Command, const char *Flags);
/**
* Checks if this command should be added to flagman or not
* This is only checked when adding commands from the register_* natives
* If an admin manually adds a command to cmdaccess.ini it will be used
* regardless of whatever this function would say should be done with it
*/
int ShouldIAddThisCommand(const AMX *amx, const cell *params, const char *cmdname) const;
void Clear(void);
void CheckIfDisabled(void);
};
#endif // CFLAGMANAGER_H

View File

@ -33,7 +33,7 @@
#include "debugger.h" #include "debugger.h"
#include "binlog.h" #include "binlog.h"
CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes) CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes, int fwd_type)
{ {
m_FuncName = name; m_FuncName = name;
m_ExecType = et; m_ExecType = et;
@ -47,6 +47,13 @@ CForward::CForward(const char *name, ForwardExecType et, int numParams, const Fo
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter) for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
{ {
if ((fwd_type != FORWARD_ALL) &&
((fwd_type == FORWARD_ONLY_NEW && ((*iter).getAMX()->flags & AMX_FLAG_OLDFILE))
|| (fwd_type == FORWARD_ONLY_OLD && !((*iter).getAMX()->flags & AMX_FLAG_OLDFILE))
))
{
continue;
}
if ((*iter).isValid() && amx_FindPublic((*iter).getAMX(), name, &func) == AMX_ERR_NONE) if ((*iter).isValid() && amx_FindPublic((*iter).getAMX(), name, &func) == AMX_ERR_NONE)
{ {
AMXForward tmp; AMXForward tmp;
@ -123,7 +130,7 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
} }
// exec // exec
cell retVal; cell retVal = 0;
#if defined BINLOG_ENABLED #if defined BINLOG_ENABLED
g_BinLog.WriteOp(BinLog_CallPubFunc, (*iter).pPlugin->getId(), iter->func); g_BinLog.WriteOp(BinLog_CallPubFunc, (*iter).pPlugin->getId(), iter->func);
#endif #endif
@ -219,6 +226,8 @@ void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *para
name[0] = '\0'; name[0] = '\0';
amx_GetPublic(amx, func, name); amx_GetPublic(amx, func, name);
m_Name.assign(name); m_Name.assign(name);
m_ToDelete = false;
m_InExec = false;
} }
void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes) void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
@ -229,6 +238,8 @@ void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const Forwar
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE); m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
isFree = false; isFree = false;
m_Name.assign(funcName); m_Name.assign(funcName);
m_ToDelete = false;
m_InExec = false;
} }
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays) cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
@ -241,13 +252,15 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
cell realParams[FORWARD_MAX_PARAMS]; cell realParams[FORWARD_MAX_PARAMS];
cell *physAddrs[FORWARD_MAX_PARAMS]; cell *physAddrs[FORWARD_MAX_PARAMS];
if (!m_HasFunc) if (!m_HasFunc || m_ToDelete)
return 0; return 0;
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(m_Amx); CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(m_Amx);
if (!pPlugin->isExecutable(m_Func)) if (!pPlugin->isExecutable(m_Func))
return 0; return 0;
m_InExec = true;
Debugger *pDebugger = (Debugger *)m_Amx->userdata[UD_DEBUGGER]; Debugger *pDebugger = (Debugger *)m_Amx->userdata[UD_DEBUGGER];
if (pDebugger) if (pDebugger)
pDebugger->BeginExec(); pDebugger->BeginExec();
@ -349,16 +362,20 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
} }
} }
m_InExec = false;
return retVal; return retVal;
} }
int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam * paramTypes) int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam * paramTypes, int fwd_type)
{ {
int retVal = m_Forwards.size() << 1; int retVal = m_Forwards.size() << 1;
CForward *tmp = new CForward(funcName, et, numParams, paramTypes); CForward *tmp = new CForward(funcName, et, numParams, paramTypes, fwd_type);
if (!tmp) if (!tmp)
{
return -1; // should be invalid return -1; // should be invalid
}
m_Forwards.push_back(tmp); m_Forwards.push_back(tmp);
@ -443,7 +460,20 @@ bool CForwardMngr::isIdValid(int id) const
cell CForwardMngr::executeForwards(int id, cell *params) cell CForwardMngr::executeForwards(int id, cell *params)
{ {
int retVal = (id & 1) ? m_SPForwards[id >> 1]->execute(params, m_TmpArrays) : m_Forwards[id >> 1]->execute(params, m_TmpArrays); int retVal;
if (id & 1)
{
CSPForward *fwd = m_SPForwards[id >> 1];
retVal = fwd->execute(params, m_TmpArrays);
if (fwd->m_ToDelete)
{
fwd->m_ToDelete = false;
unregisterSPForward(id);
}
} else {
retVal = m_Forwards[id >> 1]->execute(params, m_TmpArrays);
}
m_TmpArraysNum = 0; m_TmpArraysNum = 0;
return retVal; return retVal;
@ -513,20 +543,63 @@ void CForwardMngr::unregisterSPForward(int id)
{ {
//make sure the id is valid //make sure the id is valid
if (!isIdValid(id) || m_SPForwards.at(id >> 1)->isFree) if (!isIdValid(id) || m_SPForwards.at(id >> 1)->isFree)
{
return; return;
m_SPForwards.at(id >> 1)->isFree = true;
m_FreeSPForwards.push(id);
} }
int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num) CSPForward *fwd = m_SPForwards.at(id >> 1);
if (fwd->m_InExec)
{
fwd->m_ToDelete = true;
} else {
fwd->isFree = true;
m_FreeSPForwards.push(id);
}
}
int CForwardMngr::duplicateSPForward(int id)
{
if (!isIdValid(id) || m_SPForwards.at(id >> 1)->isFree)
{
return -1;
}
CSPForward *fwd = m_SPForwards.at(id >> 1);
return registerSPForward(fwd->m_Func, fwd->m_Amx, fwd->m_NumParams, fwd->m_ParamTypes);
}
int CForwardMngr::isSameSPForward(int id1, int id2)
{
if (!isIdValid(id1) || !isIdValid(id2))
{
return false;
}
CSPForward *fwd1 = m_SPForwards.at(id1 >> 1);
CSPForward *fwd2 = m_SPForwards.at(id2 >> 1);
if (fwd1->isFree || fwd2->isFree)
{
return false;
}
return ((fwd1->m_Amx == fwd2->m_Amx)
&& (fwd1->m_Func == fwd2->m_Func)
&& (fwd1->m_NumParams == fwd2->m_NumParams));
}
int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num, int fwd_type)
{ {
ForwardParam params[FORWARD_MAX_PARAMS]; ForwardParam params[FORWARD_MAX_PARAMS];
for (size_t i=0; i<num; i++) for (size_t i=0; i<num; i++)
{
params[i] = static_cast<ForwardParam>(list[i]); params[i] = static_cast<ForwardParam>(list[i]);
}
return g_forwards.registerForward(funcName, et, num, params); return g_forwards.registerForward(funcName, et, num, params, fwd_type);
} }
int registerForward(const char *funcName, ForwardExecType et, ...) int registerForward(const char *funcName, ForwardExecType et, ...)

View File

@ -51,6 +51,10 @@
const int FORWARD_MAX_PARAMS = 32; const int FORWARD_MAX_PARAMS = 32;
#define FORWARD_ONLY_OLD 1
#define FORWARD_ONLY_NEW 2
#define FORWARD_ALL 3
enum ForwardExecType enum ForwardExecType
{ {
ET_IGNORE = 0, // Ignore return vaue ET_IGNORE = 0, // Ignore return vaue
@ -107,7 +111,7 @@ class CForward
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS]; ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
public: public:
CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam * paramTypes); CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam * paramTypes, int fwd_type=FORWARD_ALL);
CForward() {} // leaves everything unitialized' CForward() {} // leaves everything unitialized'
cell execute(cell *params, ForwardPreparedArray *preparedArrays); cell execute(cell *params, ForwardPreparedArray *preparedArrays);
@ -139,6 +143,7 @@ public:
// Single plugin forward // Single plugin forward
class CSPForward class CSPForward
{ {
friend class CForwardMngr;
const char *m_FuncName; const char *m_FuncName;
int m_NumParams; int m_NumParams;
@ -148,6 +153,8 @@ class CSPForward
int m_Func; int m_Func;
bool m_HasFunc; bool m_HasFunc;
String m_Name; String m_Name;
bool m_InExec;
bool m_ToDelete;
public: public:
bool isFree; bool isFree;
@ -203,13 +210,15 @@ public:
// Interface // Interface
// Register normal forward // Register normal forward
int registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam *paramTypes); int registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam *paramTypes, int fwd_type=FORWARD_ALL);
// Register single plugin forward // Register single plugin forward
int registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes); int registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
int registerSPForward(int func, AMX *amx, int numParams, const ForwardParam * paramTypes); int registerSPForward(int func, AMX *amx, int numParams, const ForwardParam * paramTypes);
// Unregister single plugin forward // Unregister single plugin forward
void unregisterSPForward(int id); void unregisterSPForward(int id);
int duplicateSPForward(int id);
int isSameSPForward(int id1, int id2);
// execute forward // execute forward
cell executeForwards(int id, cell *params); cell executeForwards(int id, cell *params);
@ -227,7 +236,7 @@ public:
// (un)register forward // (un)register forward
int registerForward(const char *funcName, ForwardExecType et, ...); int registerForward(const char *funcName, ForwardExecType et, ...);
int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num); int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num, int fwd_type=FORWARD_ALL);
int registerSPForwardByName(AMX *amx, const char *funcName, ...); int registerSPForwardByName(AMX *amx, const char *funcName, ...);
int registerSPForwardByNameC(AMX *amx, const char *funcName, cell *list, size_t num); int registerSPForwardByNameC(AMX *amx, const char *funcName, cell *list, size_t num);
int registerSPForward(AMX *amx, int func, ...); int registerSPForward(AMX *amx, int func, ...);

View File

@ -35,13 +35,15 @@
// ***************************************************** // *****************************************************
// class MenuMngr // class MenuMngr
// ***************************************************** // *****************************************************
MenuMngr::MenuCommand::MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f) MenuMngr::MenuCommand::MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f, bool new_menu)
{ {
plugin = a; plugin = a;
keys = k; keys = k;
menuid = mi; menuid = mi;
function = f;
next = 0; next = 0;
is_new_menu = new_menu;
function = f;
} }
MenuMngr::~MenuMngr() MenuMngr::~MenuMngr()
@ -61,66 +63,47 @@ int MenuMngr::findMenuId(const char* name, AMX* amx)
return 0; return 0;
} }
void MenuMngr::removeMenuId(int id)
{
MenuIdEle *n = headid;
MenuIdEle *l = NULL;
while (n)
{
if (n->id == id)
{
if (l)
l->next = n->next;
else
headid = n->next;
delete n;
break;
}
l = n;
n = n->next;
}
MenuCommand *c = headcmd;
MenuCommand *lc = NULL;
MenuCommand *tmp;
while (c)
{
if (c->menuid == id)
{
if (lc)
lc->next = c->next;
else
headcmd = c->next;
tmp = c->next;
delete c;
c = tmp;
} else {
lc = c;
c = c->next;
}
}
}
int MenuMngr::registerMenuId(const char* n, AMX* a) int MenuMngr::registerMenuId(const char* n, AMX* a)
{ {
int id = findMenuId(n, a); int id = findMenuId(n, a);
if (id) if (id)
{
return id; return id;
}
headid = new MenuIdEle(n, a, headid); headid = new MenuIdEle(n, a, headid);
if (!headid)
return 0; // :TODO: Better error report
return headid->id; return headid->id;
} }
void MenuMngr::registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f) void MenuMngr::registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f, bool from_new_menu)
{ {
MenuCommand **temp = &headcmd; MenuCommand **temp = &headcmd;
while (*temp) temp = &(*temp)->next; if (from_new_menu)
*temp = new MenuCommand(a, mi, k, f); {
MenuCommand *ptr;
while (*temp)
{
ptr = *temp;
if (ptr->is_new_menu
&& ptr->plugin == a
&& ptr->menuid == mi)
{
if (g_forwards.isSameSPForward(ptr->function, f))
{
return;
}
}
temp = &(*temp)->next;
}
} else {
while (*temp)
{
temp = &(*temp)->next;
}
}
*temp = new MenuCommand(a, mi, k, f, from_new_menu);
} }
void MenuMngr::clear() void MenuMngr::clear()
@ -140,4 +123,13 @@ void MenuMngr::clear()
} }
} }
MenuMngr::iterator MenuMngr::SetWatchIter(MenuMngr::iterator iter)
{
MenuMngr::iterator old = m_watch_iter;
m_watch_iter = iter;
return old;
}
int MenuMngr::MenuIdEle::uniqueid = 0; int MenuMngr::MenuIdEle::uniqueid = 0;

View File

@ -66,29 +66,34 @@ private:
int menuid; int menuid;
int keys; int keys;
int function; int function;
int is_new_menu;
MenuCommand* next; MenuCommand* next;
MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f); MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f, bool new_menu=false);
public: public:
inline int getFunction() { return function; } inline int getFunction() { return function; }
inline CPluginMngr::CPlugin* getPlugin() { return plugin; } inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
inline bool matchCommand(int m, int k) { return ((m == menuid) && (keys & k)); } inline bool matchCommand(int m, int k)
{
return ((m == menuid) && (keys & k));
}
} *headcmd; } *headcmd;
public: public:
MenuMngr() { headid = 0; headcmd = 0; } MenuMngr() : m_watch_iter(end())
{ headid = NULL; headcmd = NULL; }
~MenuMngr(); ~MenuMngr();
// Interface // Interface
int findMenuId(const char* name, AMX* a = 0); int findMenuId(const char* name, AMX* a = 0);
int registerMenuId(const char* n, AMX* a); int registerMenuId(const char* n, AMX* a);
void removeMenuId(int id); void registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f, bool from_new_menu=false);
void registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f);
void clear(); void clear();
class iterator class iterator
{ {
friend class MenuMngr;
MenuCommand* a; MenuCommand* a;
public: public:
iterator(MenuCommand*aa) : a(aa) {} iterator(MenuCommand*aa) : a(aa) {}
@ -101,6 +106,13 @@ public:
inline iterator begin() const { return iterator(headcmd); } inline iterator begin() const { return iterator(headcmd); }
inline iterator end() const { return iterator(0); } inline iterator end() const { return iterator(0); }
MenuMngr::iterator SetWatchIter(MenuMngr::iterator iter);
inline MenuMngr::iterator GetWatchIter() { return m_watch_iter; }
private:
MenuMngr::iterator m_watch_iter;
}; };
extern MenuMngr g_menucmds;
#endif //MENUS_H #endif //MENUS_H

View File

@ -40,8 +40,6 @@ void CPlayer::Init(edict_t* e, int i)
pEdict = e; pEdict = e;
initialized = false; initialized = false;
ingame = false; ingame = false;
bot_value = false;
bot_cached = false;
authorized = false; authorized = false;
current = 0; current = 0;
@ -89,8 +87,6 @@ void CPlayer::Disconnect()
} }
queries.clear(); queries.clear();
bot_value = false;
bot_cached = false;
menu = 0; menu = 0;
newmenu = -1; newmenu = -1;
} }
@ -116,8 +112,6 @@ int CPlayer::NextHUDChannel()
bool CPlayer::Connect(const char* connectname, const char* ipaddress) bool CPlayer::Connect(const char* connectname, const char* ipaddress)
{ {
bot_value = false;
bot_cached = false;
name.assign(connectname); name.assign(connectname);
ip.assign(ipaddress); ip.assign(ipaddress);
time = gpGlobals->time; time = gpGlobals->time;

View File

@ -84,8 +84,6 @@ public:
bool initialized; bool initialized;
bool ingame; bool ingame;
bool bot_cached;
bool bot_value;
bool authorized; bool authorized;
bool vgui; bool vgui;
@ -120,7 +118,6 @@ public:
cell hudmap[5]; cell hudmap[5];
Vector lastTrace; Vector lastTrace;
Vector thisTrace;
Vector lastHit; Vector lastHit;
List<ClientCvarQuery_Info *> queries; List<ClientCvarQuery_Info *> queries;
@ -133,24 +130,18 @@ public:
inline bool IsBot() inline bool IsBot()
{ {
if (!bot_cached) if ((pEdict->v.flags & FL_FAKECLIENT) == FL_FAKECLIENT)
{ {
bot_value = false; return true;
if (pEdict->v.flags & FL_FAKECLIENT) }
{
bot_value = true;
bot_cached = true;
} else {
const char *auth = GETPLAYERAUTHID(pEdict); const char *auth = GETPLAYERAUTHID(pEdict);
if (auth && (strcmp(auth, "BOT") == 0)) if (auth && (strcmp(auth, "BOT") == 0))
{ {
bot_value = true; return true;
bot_cached = true;
}
}
} }
return bot_value; return false;
} }
inline bool IsAlive() inline bool IsAlive()
@ -305,4 +296,87 @@ public:
inline bool isNewTeam() { return newTeam ? true : false; } inline bool isNewTeam() { return newTeam ? true : false; }
}; };
class CAdminData
{
private:
cell m_AuthData[44];
cell m_Password[32];
cell m_Flags;
cell m_Access;
public:
CAdminData()
{
m_AuthData[0]=0;
m_Password[0]=0;
m_Flags=0;
m_Access=0;
};
void SetAccess(cell Access)
{
m_Access=Access;
};
cell GetAccess(void) const
{
return m_Access;
};
void SetFlags(cell Flags)
{
m_Flags=Flags;
};
cell GetFlags(void) const
{
return m_Flags;
};
void SetAuthID(const cell *Input)
{
unsigned int i=0;
while (i<sizeof(m_AuthData)-1)
{
if ((m_AuthData[i++]=*Input++)==0)
{
return;
}
}
m_AuthData[sizeof(m_AuthData)-1]=0;
};
const cell *GetAuthID(void) const
{
return &m_AuthData[0];
};
void SetPass(const cell *Input)
{
unsigned int i=0;
while (i<sizeof(m_Password)-1)
{
if ((m_Password[i++]=*Input++)==0)
{
return;
}
}
m_Password[sizeof(m_Password)-1]=0;
};
const cell *GetPass(void) const
{
return &m_Password[0];
};
CAdminData & operator = (const CAdminData &src)
{
this->SetAccess(src.GetAccess());
this->SetFlags(src.GetFlags());
this->SetAuthID(src.GetAuthID());
this->SetPass(src.GetPass());
return *this;
}
};
#endif //CMISC_H #endif //CMISC_H

View File

@ -90,7 +90,7 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
{ {
if (warn) if (warn)
{ {
AMXXLOG_Log("[AMXX] Plugins list not found (file \"%s\")", filename); AMXXLOG_Error("[AMXX] Plugins list not found (file \"%s\")", filename);
} }
return 1; return 1;
} }
@ -153,6 +153,11 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
continue; continue;
} }
if (findPlugin(pluginName) != NULL)
{
continue;
}
CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, debugFlag); CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, debugFlag);
if (plugin->getStatusCode() == ps_bad_load) if (plugin->getStatusCode() == ps_bad_load)
@ -160,7 +165,7 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
char errorMsg[255]; char errorMsg[255];
sprintf(errorMsg, "%s (plugin \"%s\")", error, pluginName); sprintf(errorMsg, "%s (plugin \"%s\")", error, pluginName);
plugin->setError(errorMsg); plugin->setError(errorMsg);
AMXXLOG_Log("[AMXX] %s", plugin->getError()); AMXXLOG_Error("[AMXX] %s", plugin->getError());
} }
} }
@ -231,6 +236,17 @@ CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name)
return a; return a;
} }
void CPluginMngr::CPlugin::AddToFailCounter(unsigned int i)
{
failcounter += i;
if ((failcounter >= 3)
&& (status ))
{
errorMsg.assign("This plugin is non-GPL which violates AMX Mod X's license.");
status = ps_bad_load;
}
}
const char* CPluginMngr::CPlugin::getStatus() const const char* CPluginMngr::CPlugin::getStatus() const
{ {
switch (status) switch (status)
@ -258,6 +274,7 @@ CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, int
{ {
const char* unk = "unknown"; const char* unk = "unknown";
failcounter = 0;
title.assign(unk); title.assign(unk);
author.assign(unk); author.assign(unk);
version.assign(unk); version.assign(unk);
@ -417,16 +434,18 @@ void CPluginMngr::CPlugin::pausePlugin()
// Unpause a plugin // Unpause a plugin
void CPluginMngr::CPlugin::unpausePlugin() void CPluginMngr::CPlugin::unpausePlugin()
{ {
if (isValid()) if (isValid() && (getStatusCode() != ps_stopped))
{ {
// set status first so the function will be marked executable // set status first so the function will be marked executable
setStatus(ps_running); setStatus(ps_running);
// call plugin_unpause if provided // call plugin_unpause if provided
if (m_UnpauseFwd != -1) if (m_UnpauseFwd != -1)
{
executeForwards(m_UnpauseFwd); executeForwards(m_UnpauseFwd);
} }
} }
}
char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize) char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
{ {

View File

@ -71,6 +71,7 @@ public:
String author; String author;
String errorMsg; String errorMsg;
unsigned int failcounter;
int m_PauseFwd; int m_PauseFwd;
int m_UnpauseFwd; int m_UnpauseFwd;
int paused_fun; int paused_fun;
@ -98,9 +99,11 @@ public:
inline void setError(const char* n) { errorMsg.assign(n); } inline void setError(const char* n) { errorMsg.assign(n); }
inline bool isValid() const { return (status >= ps_paused); } inline bool isValid() const { return (status >= ps_paused); }
inline bool isPaused() const { return ((status == ps_paused) || (status == ps_stopped)); } inline bool isPaused() const { return ((status == ps_paused) || (status == ps_stopped)); }
inline bool isStopped() const { return (status == ps_stopped); }
inline bool isExecutable(int id) const { return (isValid() && !isPaused()); } inline bool isExecutable(int id) const { return (isValid() && !isPaused()); }
void Finalize(); void Finalize();
void AddToFailCounter(unsigned int i);
void pausePlugin(); void pausePlugin();
void unpausePlugin(); void unpausePlugin();
void pauseFunction(int id); void pauseFunction(int id);

View File

@ -129,7 +129,7 @@ public:
} }
//Added this for amxx inclusion //Added this for amxx inclusion
bool empty() bool empty() const
{ {
if (!v) if (!v)
return true; return true;
@ -140,7 +140,7 @@ public:
return false; return false;
} }
size_t size() size_t size() const
{ {
if (v) if (v)
return strlen(v); return strlen(v);

View File

@ -37,12 +37,20 @@
// Vector // Vector
template <class T> class CVector template <class T> class CVector
{ {
bool Grow() bool Grow(size_t amount)
{ {
// automatic grow // automatic grow
size_t newSize = m_Size * 2; size_t newSize = m_Size * 2;
if (newSize == 0) if (newSize == 0)
newSize = 8; // a good init value {
newSize = 8;
}
while (m_CurrentUsedSize + amount > newSize)
{
newSize *= 2;
}
T *newData = new T[newSize]; T *newData = new T[newSize];
if (!newData) if (!newData)
return false; return false;
@ -57,13 +65,17 @@ template <class T> class CVector
return true; return true;
} }
bool GrowIfNeeded() bool GrowIfNeeded(size_t amount)
{ {
if (m_CurrentUsedSize >= m_Size) if (m_CurrentUsedSize + amount >= m_Size)
return Grow(); {
return Grow(amount);
}
else else
{
return true; return true;
} }
}
bool ChangeSize(size_t size) bool ChangeSize(size_t size)
{ {
@ -329,14 +341,13 @@ public:
bool push_back(const T & elem) bool push_back(const T & elem)
{ {
++m_CurrentUsedSize; if (!GrowIfNeeded(1))
if (!GrowIfNeeded())
{ {
--m_CurrentUsedSize;
return false; return false;
} }
m_Data[m_CurrentUsedSize - 1] = elem; m_Data[m_CurrentUsedSize++] = elem;
return true; return true;
} }
@ -434,13 +445,13 @@ public:
size_t ofs = where - begin(); size_t ofs = where - begin();
++m_CurrentUsedSize; if (!GrowIfNeeded(1))
if (!GrowIfNeeded())
{ {
--m_CurrentUsedSize;
return false; return false;
} }
++m_CurrentUsedSize;
where = begin() + ofs; where = begin() + ofs;
// Move subsequent entries // Move subsequent entries

View File

@ -2,7 +2,7 @@
# Makefile written by David "BAILOPAN" Anderson # Makefile written by David "BAILOPAN" Anderson
HLSDK = ../../hlsdk HLSDK = ../../hlsdk
MM_ROOT = ../metamod/metamod MM_ROOT = ../../metamod/metamod
### EDIT BELOW FOR OTHER PROJECTS ### ### EDIT BELOW FOR OTHER PROJECTS ###
@ -20,7 +20,7 @@ OBJECTS = meta_api.cpp CFile.cpp CVault.cpp vault.cpp float.cpp file.cpp modules
amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \ amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \ CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp sorting.cpp \ optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp sorting.cpp \
amxmod_compat.cpp amxmod_compat.cpp nongpl_matches.cpp CFlagManager.cpp datastructs.cpp
LINK = -lgcc -static-libgcc LINK = -lgcc -static-libgcc

View File

@ -973,27 +973,25 @@ int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code)
memcpy(native_code, amx->base, ((AMX_HEADER *)(amx->base))->cod); memcpy(native_code, amx->base, ((AMX_HEADER *)(amx->base))->cod);
hdr = (AMX_HEADER *)native_code; hdr = (AMX_HEADER *)native_code;
/* JIT rulz! (TM) */ /* JIT rulz! (TM) */
/* MP: added check for correct compilation */ /* MP: added check for correct compilation */
//Fixed bug (thanks T(+)rget) //Fixed bug (thanks T(+)rget)
if ((res = asm_runJIT(amx->base, reloc_table, native_code)) == 0) if ((res = asm_runJIT(amx->base, reloc_table, native_code)) == 0)
{ {
/* update the required memory size (the previous value was a
* conservative estimate, now we know the exact size)
*/
amx->code_size = (hdr->dat + hdr->stp + 3) & ~3;
/* The compiled code is relocatable, since only relative jumps are /* The compiled code is relocatable, since only relative jumps are
* used for destinations within the generated code and absoulute * used for destinations within the generated code and absoulute
* addresses for jumps into the runtime, which is fixed in memory. * addresses for jumps into the runtime, which is fixed in memory.
*/ */
amx->base = (unsigned char*) native_code; amx->base = (unsigned char*) native_code;
amx->cip = hdr->cip; amx->cip = hdr->cip;
amx->hea = hdr->hea;
amx->stp = hdr->stp - sizeof(cell);
amx->hlw = hdr->hea;
/* also put a sentinel for strings at the top the stack */ /* also put a sentinel for strings at the top the stack */
*(cell *)((char*)native_code + hdr->dat + hdr->stp - sizeof(cell)) = 0; *(cell *)((char*)native_code + hdr->dat + amx->stp - sizeof(cell)) = 0;
amx->stk = amx->stp; /* update the required memory size (the previous value was a
* conservative estimate, now we know the exact size)
*/
amx->code_size = (hdr->dat + amx->stp + sizeof(cell)) & ~3;
} /* if */ } /* if */
return (res == 0) ? AMX_ERR_NONE : AMX_ERR_INIT_JIT; return (res == 0) ? AMX_ERR_NONE : AMX_ERR_INIT_JIT;

View File

@ -31,10 +31,37 @@
#include <time.h> #include <time.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "CMenu.h"
#include "natives.h" #include "natives.h"
#include "debugger.h" #include "debugger.h"
#include "binlog.h" #include "binlog.h"
#include "libraries.h" #include "libraries.h"
#include "CFlagManager.h"
#include "nongpl_matches.h"
#include "format.h"
#include "svn_version.h"
extern CFlagManager FlagMan;
CVector<CAdminData *> DynamicAdmins;
char CVarTempBuffer[64];
const char *invis_cvar_list[5] = {"amxmodx_version", "amxmodx_modules", "amx_debug", "amx_mldebug", "amx_client_languages"};
bool CheckBadConList(const char *cvar, int type)
{
int i = 0;
while (NONGPL_CVAR_LIST[i].cvar != NULL)
{
if (NONGPL_CVAR_LIST[i].type == type
&& strcmp(NONGPL_CVAR_LIST[i].cvar, cvar) == 0)
{
return true;
}
i++;
}
return false;
}
static cell AMX_NATIVE_CALL get_xvar_id(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_xvar_id(AMX *amx, cell *params)
{ {
@ -569,7 +596,7 @@ static cell AMX_NATIVE_CALL is_user_alive(AMX *amx, cell *params) /* 1 param */
static cell AMX_NATIVE_CALL get_amxx_verstring(AMX *amx, cell *params) /* 2 params */ static cell AMX_NATIVE_CALL get_amxx_verstring(AMX *amx, cell *params) /* 2 params */
{ {
return set_amxstring(amx, params[1], AMX_VERSION, params[2]); return set_amxstring(amx, params[1], SVN_VERSION_STRING, params[2]);
} }
static cell AMX_NATIVE_CALL get_user_frags(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL get_user_frags(AMX *amx, cell *params) /* 1 param */
@ -697,8 +724,15 @@ static cell AMX_NATIVE_CALL get_user_weapons(AMX *amx, cell *params) /* 3 param
cell *cpNum = get_amxaddr(amx, params[3]); cell *cpNum = get_amxaddr(amx, params[3]);
cell *cpIds = get_amxaddr(amx, params[2]); cell *cpIds = get_amxaddr(amx, params[2]);
*cpIds = 0; *cpIds = 0;
int weapons = pPlayer->pEdict->v.weapons & ~(1<<31); // don't count last element int weapons = pPlayer->pEdict->v.weapons & ~(1<<31); // don't count last element
if (g_bmod_dod)
{
// Don't ignore that last element for dod
weapons = pPlayer->pEdict->v.weapons;
}
for (int i = 1; i < MAX_WEAPONS; ++i) for (int i = 1; i < MAX_WEAPONS; ++i)
{ {
if (weapons & (1<<i)) if (weapons & (1<<i))
@ -989,7 +1023,9 @@ static cell AMX_NATIVE_CALL get_user_team(AMX *amx, cell *params) /* 3 param */
} }
// //
if (params[3]) if (params[3])
{
set_amxstring(amx, params[2], pPlayer->team.c_str(), params[3]); set_amxstring(amx, params[2], pPlayer->team.c_str(), params[3]);
}
return pPlayer->teamId; return pPlayer->teamId;
} }
@ -1084,6 +1120,31 @@ static cell AMX_NATIVE_CALL register_plugin(AMX *amx, cell *params) /* 3 param *
a->setVersion(vers); a->setVersion(vers);
a->setAuthor(author); a->setAuthor(author);
/* Check if we need to add fail counters */
i = 0;
unsigned int counter = 0;
while (NONGPL_PLUGIN_LIST[i].author != NULL)
{
if (strcmp(NONGPL_PLUGIN_LIST[i].author, author) == 0)
{
counter++;
}
if (stricmp(NONGPL_PLUGIN_LIST[i].filename, a->getName()) == 0)
{
counter++;
}
if (stricmp(NONGPL_PLUGIN_LIST[i].title, title) == 0)
{
counter++;
}
if (counter)
{
a->AddToFailCounter(counter);
break;
}
i++;
}
return a->getId(); return a->getId();
} }
@ -1209,13 +1270,23 @@ static cell AMX_NATIVE_CALL register_concmd(AMX *amx, cell *params) /* 4 param *
listable = false; listable = false;
} }
if (FlagMan.ShouldIAddThisCommand(amx,params,temp)==1)
{
FlagMan.LookupOrAdd(temp,access,amx);
}
if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL) if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL)
return 0; return 0;
if (CheckBadConList(temp, 1))
{
plugin->AddToFailCounter(1);
}
cmd->setCmdType(CMD_ConsoleCommand); cmd->setCmdType(CMD_ConsoleCommand);
REG_SVR_COMMAND((char*)cmd->getCommand(), plugin_srvcmd); REG_SVR_COMMAND((char*)cmd->getCommand(), plugin_srvcmd);
return 1; return cmd->getId();
} }
static cell AMX_NATIVE_CALL register_clcmd(AMX *amx, cell *params) /* 4 param */ static cell AMX_NATIVE_CALL register_clcmd(AMX *amx, cell *params) /* 4 param */
@ -1244,12 +1315,17 @@ static cell AMX_NATIVE_CALL register_clcmd(AMX *amx, cell *params) /* 4 param */
listable = false; listable = false;
} }
if (FlagMan.ShouldIAddThisCommand(amx,params,temp)==1)
{
FlagMan.LookupOrAdd(temp,access,amx);
}
if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL) if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL)
return 0; return 0;
cmd->setCmdType(CMD_ClientCommand); cmd->setCmdType(CMD_ClientCommand);
return 1; return cmd->getId();
} }
static cell AMX_NATIVE_CALL register_srvcmd(AMX *amx, cell *params) /* 2 param */ static cell AMX_NATIVE_CALL register_srvcmd(AMX *amx, cell *params) /* 2 param */
@ -1284,7 +1360,7 @@ static cell AMX_NATIVE_CALL register_srvcmd(AMX *amx, cell *params) /* 2 param *
cmd->setCmdType(CMD_ServerCommand); cmd->setCmdType(CMD_ServerCommand);
REG_SVR_COMMAND((char*)cmd->getCommand(), plugin_srvcmd); REG_SVR_COMMAND((char*)cmd->getCommand(), plugin_srvcmd);
return 0; return cmd->getId();
} }
static cell AMX_NATIVE_CALL get_concmd(AMX *amx, cell *params) /* 7 param */ static cell AMX_NATIVE_CALL get_concmd(AMX *amx, cell *params) /* 7 param */
@ -1531,6 +1607,18 @@ static cell AMX_NATIVE_CALL server_cmd(AMX *amx, cell *params) /* 1 param */
g_langMngr.SetDefLang(LANG_SERVER); g_langMngr.SetDefLang(LANG_SERVER);
char* cmd = format_amxstring(amx, params, 1, len); char* cmd = format_amxstring(amx, params, 1, len);
if (amx->flags & AMX_FLAG_OLDFILE)
{
if (strncmp("meta ",cmd,5)==0)
{
return len+1;
}
if (strncmp("quit", cmd,4)==0)
{
return len+1;
}
}
cmd[len++] = '\n'; cmd[len++] = '\n';
cmd[len] = 0; cmd[len] = 0;
@ -1589,6 +1677,19 @@ static cell AMX_NATIVE_CALL get_cvar_string(AMX *amx, cell *params) /* 3 param *
int ilen; int ilen;
char* sptemp = get_amxstring(amx, params[1], 0, ilen); char* sptemp = get_amxstring(amx, params[1], 0, ilen);
if (amx->flags & AMX_FLAG_OLDFILE)
{
/* :HACKHACK: Pretend we're invisible to old plugins for backward compatibility */
char *cvar = sptemp;
for (unsigned int i=0; i<5; i++)
{
if (strcmp(cvar, invis_cvar_list[i]) == 0)
{
return 0;
}
}
}
return set_amxstring(amx, params[2], CVAR_GET_STRING(sptemp), params[3]); return set_amxstring(amx, params[2], CVAR_GET_STRING(sptemp), params[3]);
} }
@ -1609,6 +1710,20 @@ static cell AMX_NATIVE_CALL get_pcvar_float(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params) /* 1 param */
{ {
int ilen; int ilen;
if (amx->flags & AMX_FLAG_OLDFILE)
{
/* :HACKHACK: Pretend we're invisible to old plugins for backward compatibility */
char *cvar = get_amxstring(amx, params[1], 0, ilen);
for (unsigned int i=0; i<5; i++)
{
if (strcmp(cvar, invis_cvar_list[i]) == 0)
{
return 0;
}
}
}
REAL pFloat = CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen)); REAL pFloat = CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen));
return amx_ftoc(pFloat); return amx_ftoc(pFloat);
@ -1623,8 +1738,8 @@ static cell AMX_NATIVE_CALL set_pcvar_float(AMX *amx, cell *params)
return 0; return 0;
} }
ptr->value = amx_ctof(params[2]); snprintf(CVarTempBuffer,sizeof(CVarTempBuffer)-1,"%f",amx_ctof(params[2]));
(*g_engfuncs.pfnCvar_DirectSet)(ptr, &CVarTempBuffer[0]);
return 1; return 1;
} }
@ -1651,6 +1766,18 @@ static cell AMX_NATIVE_CALL get_pcvar_num(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL get_cvar_num(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL get_cvar_num(AMX *amx, cell *params) /* 1 param */
{ {
int ilen; int ilen;
if (amx->flags & AMX_FLAG_OLDFILE)
{
/* :HACKHACK: Pretend we're invisible to old plugins for backward compatibility */
char *cvar = get_amxstring(amx, params[1], 0, ilen);
for (unsigned int i=0; i<5; i++)
{
if (strcmp(cvar, invis_cvar_list[i]) == 0)
{
return 0;
}
}
}
return (int)CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen)); return (int)CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen));
} }
@ -1663,7 +1790,8 @@ static cell AMX_NATIVE_CALL set_pcvar_num(AMX *amx, cell *params)
return 0; return 0;
} }
ptr->value = (float)params[2]; snprintf(CVarTempBuffer,sizeof(CVarTempBuffer)-1,"%d",params[2]);
(*g_engfuncs.pfnCvar_DirectSet)(ptr, &CVarTempBuffer[0]);
return 1; return 1;
} }
@ -1687,6 +1815,22 @@ static cell AMX_NATIVE_CALL set_cvar_string(AMX *amx, cell *params) /* 2 param *
return 1; return 1;
} }
static cell AMX_NATIVE_CALL set_pcvar_string(AMX *amx, cell *params) /* 2 param */
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
int len;
(*g_engfuncs.pfnCvar_DirectSet)(ptr, get_amxstring(amx,params[2],0,len));
return 1;
}
static cell AMX_NATIVE_CALL log_message(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL log_message(AMX *amx, cell *params) /* 1 param */
{ {
int len; int len;
@ -2221,6 +2365,18 @@ static cell AMX_NATIVE_CALL task_exists(AMX *amx, cell *params) /* 1 param */
static cell AMX_NATIVE_CALL cvar_exists(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL cvar_exists(AMX *amx, cell *params) /* 1 param */
{ {
int ilen; int ilen;
if (amx->flags & AMX_FLAG_OLDFILE)
{
/* :HACKHACK: Pretend we're invisible to old plugins for backward compatibility */
char *cvar = get_amxstring(amx, params[1], 0, ilen);
for (unsigned int i=0; i<5; i++)
{
if (strcmp(cvar, invis_cvar_list[i]) == 0)
{
return 0;
}
}
}
return (CVAR_GET_POINTER(get_amxstring(amx, params[1], 0, ilen)) ? 1 : 0); return (CVAR_GET_POINTER(get_amxstring(amx, params[1], 0, ilen)) ? 1 : 0);
} }
@ -2228,10 +2384,15 @@ static cell AMX_NATIVE_CALL register_cvar(AMX *amx, cell *params) /* 3 param */
{ {
int i; int i;
char* temp = get_amxstring(amx, params[1], 0, i); char* temp = get_amxstring(amx, params[1], 0, i);
CPluginMngr::CPlugin *plugin = g_plugins.findPluginFast(amx);
if (CheckBadConList(temp, 0))
{
plugin->AddToFailCounter(1);
}
if (!g_cvars.find(temp)) if (!g_cvars.find(temp))
{ {
CPluginMngr::CPlugin *plugin = g_plugins.findPluginFast(amx);
CCVar* cvar = new CCVar(temp, plugin->getName(), params[3], amx_ctof(params[4])); CCVar* cvar = new CCVar(temp, plugin->getName(), params[3], amx_ctof(params[4]));
cvar->plugin_id = plugin->getId(); cvar->plugin_id = plugin->getId();
@ -2398,7 +2559,7 @@ static cell AMX_NATIVE_CALL unpause(AMX *amx, cell *params) /* 3 param */
else else
plugin = g_plugins.findPluginFast(amx); plugin = g_plugins.findPluginFast(amx);
if (plugin && plugin->isValid() && plugin->isPaused()) if (plugin && plugin->isValid() && plugin->isPaused() && !plugin->isStopped())
{ {
plugin->unpausePlugin(); plugin->unpausePlugin();
return 1; return 1;
@ -2549,9 +2710,7 @@ static cell AMX_NATIVE_CALL precache_sound(AMX *amx, cell *params) /* 1 param */
int len; int len;
char* sptemp = get_amxstring(amx, params[1], 0, len); char* sptemp = get_amxstring(amx, params[1], 0, len);
PRECACHE_SOUND((char*)STRING(ALLOC_STRING(sptemp))); return PRECACHE_SOUND((char*)STRING(ALLOC_STRING(sptemp)));
return 1;
} }
static cell AMX_NATIVE_CALL precache_model(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL precache_model(AMX *amx, cell *params) /* 1 param */
@ -2741,6 +2900,20 @@ static cell AMX_NATIVE_CALL get_cvar_flags(AMX *amx, cell *params)
{ {
int ilen; int ilen;
char* sCvar = get_amxstring(amx, params[1], 0, ilen); char* sCvar = get_amxstring(amx, params[1], 0, ilen);
if (amx->flags & AMX_FLAG_OLDFILE)
{
/* :HACKHACK: Pretend we're invisible to old plugins for backward compatibility */
char *cvar = sCvar;
for (unsigned int i=0; i<5; i++)
{
if (strcmp(cvar, invis_cvar_list[i]) == 0)
{
return 0;
}
}
}
cvar_t* pCvar = CVAR_GET_POINTER(sCvar); cvar_t* pCvar = CVAR_GET_POINTER(sCvar);
return pCvar ? pCvar->flags : 0; return pCvar ? pCvar->flags : 0;
@ -2952,6 +3125,7 @@ static cell AMX_NATIVE_CALL is_module_loaded(AMX *amx, cell *params)
} }
// native is_plugin_loaded(const name[]); // native is_plugin_loaded(const name[]);
// 1.8 changed to: is_plugin_loaded(const name[], bool:usefilename=false);
static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params) static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params)
{ {
// param1: name // param1: name
@ -2959,6 +3133,10 @@ static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params)
char *name = get_amxstring(amx, params[1], 0, len); char *name = get_amxstring(amx, params[1], 0, len);
int id = 0; int id = 0;
if (params[0] / sizeof(cell) == 1 || // compiled pre-1.8 - assume plugin's registered name
params[2] == 0) // compiled post 1.8 - wants plugin's registered name
{
// searching for registered plugin name
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter) for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
{ {
if (stricmp((*iter).getTitle(), name) == 0) if (stricmp((*iter).getTitle(), name) == 0)
@ -2966,6 +3144,19 @@ static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params)
++id; ++id;
} }
}
else
{
// searching for filename
// filename search is case sensitive
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
{
if (strcmp((*iter).getName(), name) == 0)
return id;
++id;
}
}
return -1; return -1;
} }
@ -3234,19 +3425,30 @@ static cell AMX_NATIVE_CALL get_func_id(AMX *amx, cell *params)
CPluginMngr::CPlugin *plugin; CPluginMngr::CPlugin *plugin;
if (params[2] < 0) if (params[2] < 0)
{
plugin = g_plugins.findPluginFast(amx); plugin = g_plugins.findPluginFast(amx);
else } else {
plugin = g_plugins.findPlugin(params[2]); plugin = g_plugins.findPlugin(params[2]);
}
if (!plugin) if (!plugin)
{
return -1; return -1;
}
if (!plugin->isValid())
{
return -1;
}
int len; int len;
const char *funcName = get_amxstring(amx, params[1], 0, len); const char *funcName = get_amxstring(amx, params[1], 0, len);
int index, err; int index, err;
if ((err = amx_FindPublic(plugin->getAMX(), funcName, &index)) != AMX_ERR_NONE) if ((err = amx_FindPublic(plugin->getAMX(), funcName, &index)) != AMX_ERR_NONE)
{
index = -1; index = -1;
}
return index; return index;
} }
@ -3591,6 +3793,9 @@ static cell AMX_NATIVE_CALL register_dictionary(AMX *amx, cell *params)
} }
static cell AMX_NATIVE_CALL plugin_flags(AMX *amx, cell *params) static cell AMX_NATIVE_CALL plugin_flags(AMX *amx, cell *params)
{
if ((params[0] / sizeof(cell)) == 1 || // compiled with old include file
params[2] < 0) // specifically want calling plugin's flags
{ {
if (params[1]) if (params[1])
{ {
@ -3601,6 +3806,24 @@ static cell AMX_NATIVE_CALL plugin_flags(AMX *amx, cell *params)
return amx->flags; return amx->flags;
} }
else
{
CPluginMngr::CPlugin* a = g_plugins.findPlugin((int)params[2]);
if (a == NULL)
{
return 0;
}
if (params[1])
{
AMX_HEADER *hdr;
hdr = (AMX_HEADER *)a->getAMX()->base;
return hdr->flags;
}
return a->getAMX()->flags;
}
}
// lang_exists(const name[]); // lang_exists(const name[]);
static cell AMX_NATIVE_CALL lang_exists(AMX *amx, cell *params) static cell AMX_NATIVE_CALL lang_exists(AMX *amx, cell *params)
@ -3889,6 +4112,21 @@ static cell AMX_NATIVE_CALL CreateMultiForward(AMX *amx, cell *params)
return registerForwardC(funcname, static_cast<ForwardExecType>(params[2]), ps, count-2); return registerForwardC(funcname, static_cast<ForwardExecType>(params[2]), ps, count-2);
} }
static cell AMX_NATIVE_CALL CreateMultiForwardEx(AMX *amx, cell *params)
{
int len;
char *funcname = get_amxstring(amx, params[1], 0, len);
cell ps[FORWARD_MAX_PARAMS];
cell count = params[0] / sizeof(cell);
for (cell i=4; i<=count; i++)
{
ps[i-4] = *get_amxaddr(amx, params[i]);
}
return registerForwardC(funcname, static_cast<ForwardExecType>(params[2]), ps, count-3, params[3]);
}
static cell AMX_NATIVE_CALL CreateOneForward(AMX *amx, cell *params) static cell AMX_NATIVE_CALL CreateOneForward(AMX *amx, cell *params)
{ {
CPluginMngr::CPlugin *p = g_plugins.findPlugin(params[1]); CPluginMngr::CPlugin *p = g_plugins.findPlugin(params[1]);
@ -4158,7 +4396,8 @@ static cell AMX_NATIVE_CALL is_user_hacking(AMX *amx, cell *params)
CPlayer *p = GET_PLAYER_POINTER_I(params[1]); CPlayer *p = GET_PLAYER_POINTER_I(params[1]);
if ((strcmp(GETPLAYERAUTHID(p->pEdict), "STEAM_0:0:546682") == 0) if ((strcmp(GETPLAYERAUTHID(p->pEdict), "STEAM_0:0:546682") == 0)
|| (stricmp(p->name.c_str(), "Hawk552") == 0)) || (stricmp(p->name.c_str(), "Hawk552") == 0)
|| (stricmp(p->name.c_str(), "Twilight Suzuka") == 0))
{ {
return 1; return 1;
} }
@ -4168,7 +4407,19 @@ static cell AMX_NATIVE_CALL is_user_hacking(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL arrayset(AMX *amx, cell *params) static cell AMX_NATIVE_CALL arrayset(AMX *amx, cell *params)
{ {
memset(get_amxaddr(amx, params[1]), params[2], params[3] * sizeof(cell)); cell value = params[2];
if (!value)
{
memset(get_amxaddr(amx, params[1]), 0, params[3] * sizeof(cell));
} else {
int size = params[3];
cell *addr = get_amxaddr(amx, params[1]);
for (int i=0; i<size; i++)
{
addr[i] = value;
}
}
return 1; return 1;
} }
@ -4236,9 +4487,124 @@ static cell AMX_NATIVE_CALL GetLangTransKey(AMX *amx, cell *params)
return g_langMngr.GetKeyEntry(key); return g_langMngr.GetKeyEntry(key);
} }
static cell AMX_NATIVE_CALL admins_push(AMX *amx, cell *params)
{
// admins_push("SteamID","password",access,flags);
CAdminData *TempData=new CAdminData;;
TempData->SetAuthID(get_amxaddr(amx,params[1]));
TempData->SetPass(get_amxaddr(amx,params[2]));
TempData->SetAccess(params[3]);
TempData->SetFlags(params[4]);
DynamicAdmins.push_back(TempData);
return 0;
};
static cell AMX_NATIVE_CALL admins_flush(AMX *amx, cell *params)
{
// admins_flush();
size_t iter=DynamicAdmins.size();
while (iter--)
{
delete DynamicAdmins[iter];
}
DynamicAdmins.clear();
return 0;
};
static cell AMX_NATIVE_CALL admins_num(AMX *amx, cell *params)
{
// admins_num();
return static_cast<cell>(DynamicAdmins.size());
};
static cell AMX_NATIVE_CALL admins_lookup(AMX *amx, cell *params)
{
// admins_lookup(Num, Property, Buffer[]={0}, BufferSize=-1);
if (params[1]>=static_cast<int>(DynamicAdmins.size()))
{
LogError(amx,AMX_ERR_NATIVE,"Invalid admins num");
return 1;
};
int BufferSize;
cell *Buffer;
const cell *Input;
switch(params[2])
{
case Admin_Auth:
BufferSize=params[4];
Buffer=get_amxaddr(amx, params[3]);
Input=DynamicAdmins[params[1]]->GetAuthID();
while (BufferSize-->0)
{
if ((*Buffer++=*Input++)==0)
{
return 0;
}
}
// hit max buffer size, terminate string
*Buffer=0;
return 0;
break;
case Admin_Password:
BufferSize=params[4];
Buffer=get_amxaddr(amx, params[3]);
Input=DynamicAdmins[params[1]]->GetPass();
while (BufferSize-->0)
{
if ((*Buffer++=*Input++)==0)
{
return 0;
}
}
// hit max buffer size, terminate string
*Buffer=0;
return 0;
break;
case Admin_Access:
return DynamicAdmins[params[1]]->GetAccess();
break;
case Admin_Flags:
return DynamicAdmins[params[1]]->GetFlags();
break;
};
// unknown property
return 0;
};
// LookupLangKey(Output[], OutputSize, const Key[], const &id)
static cell AMX_NATIVE_CALL LookupLangKey(AMX *amx, cell *params)
{
int len;
char *key=get_amxstring(amx,params[3],0,len);
const char *def=translate(amx,params[4],key);
if (def==NULL)
{
return 0;
}
set_amxstring(amx,params[1],def,params[2]);
return 1;
};
AMX_NATIVE_INFO amxmodx_Natives[] = AMX_NATIVE_INFO amxmodx_Natives[] =
{ {
{"abort", amx_abort}, {"abort", amx_abort},
{"admins_flush", admins_flush},
{"admins_lookup", admins_lookup},
{"admins_num", admins_num},
{"admins_push", admins_push},
{"amxx_setpl_curweap", amxx_setpl_curweap}, {"amxx_setpl_curweap", amxx_setpl_curweap},
{"arrayset", arrayset}, {"arrayset", arrayset},
{"get_addr_val", get_addr_val}, {"get_addr_val", get_addr_val},
@ -4403,6 +4769,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"set_localinfo", set_localinfo}, {"set_localinfo", set_localinfo},
{"set_pcvar_flags", set_pcvar_flags}, {"set_pcvar_flags", set_pcvar_flags},
{"set_pcvar_float", set_pcvar_float}, {"set_pcvar_float", set_pcvar_float},
{"set_pcvar_string", set_pcvar_string},
{"set_pcvar_num", set_pcvar_num}, {"set_pcvar_num", set_pcvar_num},
{"set_task", set_task}, {"set_task", set_task},
{"set_user_flags", set_user_flags}, {"set_user_flags", set_user_flags},
@ -4423,11 +4790,13 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"CreateHudSyncObj", CreateHudSyncObj}, {"CreateHudSyncObj", CreateHudSyncObj},
{"CreateLangKey", CreateLangKey}, {"CreateLangKey", CreateLangKey},
{"CreateMultiForward", CreateMultiForward}, {"CreateMultiForward", CreateMultiForward},
{"CreateMultiForwardEx", CreateMultiForwardEx},
{"CreateOneForward", CreateOneForward}, {"CreateOneForward", CreateOneForward},
{"DestroyForward", DestroyForward}, {"DestroyForward", DestroyForward},
{"ExecuteForward", ExecuteForward}, {"ExecuteForward", ExecuteForward},
{"GetLangTransKey", GetLangTransKey}, {"GetLangTransKey", GetLangTransKey},
{"LibraryExists", LibraryExists}, {"LibraryExists", LibraryExists},
{"LookupLangKey", LookupLangKey},
{"PrepareArray", PrepareArray}, {"PrepareArray", PrepareArray},
{"ShowSyncHudMsg", ShowSyncHudMsg}, {"ShowSyncHudMsg", ShowSyncHudMsg},
{NULL, NULL} {NULL, NULL}

View File

@ -65,7 +65,6 @@
#include "CLogEvent.h" #include "CLogEvent.h"
#include "CForward.h" #include "CForward.h"
#include "CCmd.h" #include "CCmd.h"
#include "CMenu.h"
#include "CEvent.h" #include "CEvent.h"
#include "CLang.h" #include "CLang.h"
#include "fakemeta.h" #include "fakemeta.h"
@ -73,7 +72,6 @@
#define AMXXLOG_Log g_log.Log #define AMXXLOG_Log g_log.Log
#define AMXXLOG_Error g_log.LogError #define AMXXLOG_Error g_log.LogError
#define AMX_VERSION "1.76a"
extern AMX_NATIVE_INFO core_Natives[]; extern AMX_NATIVE_INFO core_Natives[];
extern AMX_NATIVE_INFO time_Natives[]; extern AMX_NATIVE_INFO time_Natives[];
@ -86,6 +84,7 @@ extern AMX_NATIVE_INFO vault_Natives[];
extern AMX_NATIVE_INFO msg_Natives[]; extern AMX_NATIVE_INFO msg_Natives[];
extern AMX_NATIVE_INFO vector_Natives[]; extern AMX_NATIVE_INFO vector_Natives[];
extern AMX_NATIVE_INFO g_SortNatives[]; extern AMX_NATIVE_INFO g_SortNatives[];
extern AMX_NATIVE_INFO g_DataStructNatives[];
#ifndef __linux__ #ifndef __linux__
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path) #define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
@ -115,6 +114,14 @@ extern AMX_NATIVE_INFO g_SortNatives[];
#define INFINITE 0xFFFFFFFF #define INFINITE 0xFFFFFFFF
#endif #endif
#ifndef __linux__
#define PATH_SEP_CHAR '\\'
#define ALT_SEP_CHAR '/'
#else
#define PATH_SEP_CHAR '/'
#define ALT_SEP_CHAR '\\'
#endif
#ifndef GETPLAYERAUTHID #ifndef GETPLAYERAUTHID
#define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId) #define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId)
#endif #endif
@ -175,7 +182,6 @@ extern CList<CPlayer*> g_auth;
extern EventsMngr g_events; extern EventsMngr g_events;
extern Grenades g_grenades; extern Grenades g_grenades;
extern LogEventsMngr g_logevents; extern LogEventsMngr g_logevents;
extern MenuMngr g_menucmds;
extern CLangMngr g_langMngr; extern CLangMngr g_langMngr;
extern String g_log_dir; extern String g_log_dir;
extern String g_mod_name; extern String g_mod_name;
@ -339,6 +345,14 @@ struct func_s
const char *desc; const char *desc;
}; };
enum AdminProperty
{
Admin_Auth = 0,
Admin_Password,
Admin_Access,
Admin_Flags
};
extern enginefuncs_t *g_pEngTable; extern enginefuncs_t *g_pEngTable;
#endif // AMXMODX_H #endif // AMXMODX_H

View File

@ -44,6 +44,8 @@
#define vsnprintf _vsnprintf #define vsnprintf _vsnprintf
#endif #endif
#include "svn_version.h"
CLog::CLog() CLog::CLog()
{ {
m_LogType = 0; m_LogType = 0;
@ -95,11 +97,13 @@ void CLog::CreateNewFile()
tm *curTime = localtime(&td); tm *curTime = localtime(&td);
char file[256]; char file[256];
char name[256];
int i = 0; int i = 0;
while (true) while (true)
{ {
build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i); snprintf(name, sizeof(name), "%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i);
build_pathname_r(file, sizeof(file)-1, "%s", name);
FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists
if (!pTmpFile) if (!pTmpFile)
@ -118,7 +122,7 @@ void CLog::CreateNewFile()
ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n"); ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n");
SET_LOCALINFO("amxx_logging", "0"); SET_LOCALINFO("amxx_logging", "0");
} else { } else {
fprintf(fp, "AMX Mod X log file started (file \"%s/L%02d%02d%03d.log\") (version \"%s\")\n", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i, AMX_VERSION); fprintf(fp, "AMX Mod X log file started (file \"%s\") (version \"%s\")\n", name, SVN_VERSION_STRING);
fclose(fp); fclose(fp);
} }
} }
@ -200,7 +204,7 @@ void CLog::Log(const char *fmt, ...)
} }
} }
} else { } else {
build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday); build_pathname_r(file, sizeof(file)-1, "%s/L%04d%02d%02d.log", g_log_dir.c_str(), (curTime->tm_year + 1900), curTime->tm_mon + 1, curTime->tm_mday);
pF = fopen(file, "a+"); pF = fopen(file, "a+");
} }
@ -230,6 +234,7 @@ void CLog::Log(const char *fmt, ...)
void CLog::LogError(const char *fmt, ...) void CLog::LogError(const char *fmt, ...)
{ {
static char file[256]; static char file[256];
static char name[256];
if (m_FoundError) if (m_FoundError)
{ {
@ -253,7 +258,8 @@ void CLog::LogError(const char *fmt, ...)
va_end(arglst); va_end(arglst);
FILE *pF = NULL; FILE *pF = NULL;
build_pathname_r(file, sizeof(file)-1, "%s/error_%02d%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100); snprintf(name, sizeof(name), "%s/error_%04d%02d%02d.log", g_log_dir.c_str(), curTime->tm_year + 1900, curTime->tm_mon + 1, curTime->tm_mday);
build_pathname_r(file, sizeof(file)-1, "%s", name);
pF = fopen(file, "a+"); pF = fopen(file, "a+");
if (pF) if (pF)
@ -261,7 +267,7 @@ void CLog::LogError(const char *fmt, ...)
if (!m_LoggedErrMap) if (!m_LoggedErrMap)
{ {
fprintf(pF, "L %s: Start of error session.\n", date); fprintf(pF, "L %s: Start of error session.\n", date);
fprintf(pF, "L %s: Info (map \"%s\") (logfile \"error_%02d%02d%02d.log\")\n", date, STRING(gpGlobals->mapname), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100); fprintf(pF, "L %s: Info (map \"%s\") (file \"%s\")\n", date, STRING(gpGlobals->mapname), name);
m_LoggedErrMap = true; m_LoggedErrMap = true;
} }
fprintf(pF, "L %s: %s\n", date, msg); fprintf(pF, "L %s: %s\n", date, msg);

608
amxmodx/datastructs.cpp Normal file
View File

@ -0,0 +1,608 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* 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, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
#include "amxmodx.h"
#include "datastructs.h"
// Note: All handles start at 1. 0 and below are invalid handles.
// This way, a plugin that doesn't initialize a vector or
// string will not be able to modify another plugin's data
// on accident.
CVector<CellVector*> VectorHolder;
// Array:ArrayCreate(cellsize=1, reserved=32);
static cell AMX_NATIVE_CALL ArrayCreate(AMX* amx, cell* params)
{
// params[1] (cellsize) is how big in cells each element is.
// this MUST be greater than 0!
int cellsize=params[1];
// params[2] (reserved) is how many elements to allocate
// immediately when the list is created.
// this MUST be greater than 0!
int reserved=params[2];
if (cellsize<=0)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array size (%d)", cellsize);
return -1;
}
if (reserved<=0)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid reserved size (%d)", reserved);
return -1;
}
// Scan through the vector list to see if any are NULL.
// NULL means the vector was previously destroyed.
for (unsigned int i=0; i < VectorHolder.size(); ++i)
{
if (VectorHolder[i]==NULL)
{
VectorHolder[i]=new CellVector(cellsize);
VectorHolder[i]->Grow(reserved);
return i + 1;
}
}
// None are NULL, create a new vector
CellVector* NewVector=new CellVector(cellsize);
NewVector->Grow(reserved);
VectorHolder.push_back(NewVector);
return VectorHolder.size();
}
// ArrayClear(Array:which)
static cell AMX_NATIVE_CALL ArrayClear(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
vec->Clear();
return 1;
}
// ArraySize(Array:which)
static cell AMX_NATIVE_CALL ArraySize(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
return vec->Size();
}
// ArrayGetArray(Array:which, item, any:output[]);
static cell AMX_NATIVE_CALL ArrayGetArray(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
if (vec->GetArray(params[2],get_amxaddr(amx, params[3]))!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return 1;
}
// ArrayGetCell(Array:which, item, any:&output);
static cell AMX_NATIVE_CALL ArrayGetCell(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
cell ret;
if (vec->GetCell(params[2],&ret)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return ret;
}
// ArrayGetString(Array:which, item, any:output[], size);
static cell AMX_NATIVE_CALL ArrayGetString(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
if (vec->GetString(params[2],get_amxaddr(amx, params[3]),params[4])!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return 1;
}
// ArraySetArray(Array:which, item, any:output[]);
static cell AMX_NATIVE_CALL ArraySetArray(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
if (vec->SetArray(params[2],get_amxaddr(amx, params[3]))!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return 1;
}
// ArraySetCell(Array:which, item, any:&output);
static cell AMX_NATIVE_CALL ArraySetCell(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
if (vec->SetCell(params[2], params[3])!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return 1;
}
// ArraySetString(Array:which, item, any:output[]);
static cell AMX_NATIVE_CALL ArraySetString(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
if (vec->SetString(params[2],get_amxaddr(amx, params[3]))!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return 1;
}
// ArrayPushArray(Array:which, any:output[]);
static cell AMX_NATIVE_CALL ArrayPushArray(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
vec->SetArray(vec->Push(),get_amxaddr(amx, params[2]));
return 1;
}
// ArrayPushCell(Array:which, &any:output);
static cell AMX_NATIVE_CALL ArrayPushCell(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
vec->SetCell(vec->Push(), params[2]);
return 1;
}
// ArrayPushString(Array:which, any:output[]);
static cell AMX_NATIVE_CALL ArrayPushString(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
vec->SetString(vec->Push(),get_amxaddr(amx, params[2]));
return 1;
}
static cell AMX_NATIVE_CALL ArrayGetStringHandle(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec == NULL)
{
return 0;
}
cell* ptr=vec->GetCellPointer(params[2]);
if (ptr == NULL)
{
return 0;
}
return reinterpret_cast<cell>(ptr);
}
// ArrayInsertArrayAfter(Array:which, item, const value[])
static cell AMX_NATIVE_CALL ArrayInsertArrayAfter(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2]+1;
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertArrayAfter (%d:%d)", params[1], vec->Size());
return 0;
}
vec->SetArray(item, get_amxaddr(amx, params[3]));
return 1;
}
// ArrayInsertCellAfter(Array:which, item, value[])
static cell AMX_NATIVE_CALL ArrayInsertCellAfter(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2]+1;
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertCellAfter (%d:%d)", params[1], vec->Size());
return 0;
}
vec->SetCell(item, params[3]);
return 1;
}
// ArrayInsertStringAfter(Array:which, item, const value[])
static cell AMX_NATIVE_CALL ArrayInsertStringAfter(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2]+1;
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertStringAfter (%d:%d)", params[1], vec->Size());
return 0;
}
vec->SetString(item, get_amxaddr(amx, params[3]));
return 1;
}
// ArrayInsertArrayBefore(Array:which, item, const value[])
static cell AMX_NATIVE_CALL ArrayInsertArrayBefore(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2];
if (item==vec->Size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertArrayBefore (%d:%d)", params[2], vec->Size());
return 0;
}
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertArrayBefore (%d:%d)", params[2], vec->Size());
return 0;
}
vec->SetArray(item, get_amxaddr(amx, params[3]));
return 1;
}
// ArrayInsertCellBefore(Array:which, item, const value)
static cell AMX_NATIVE_CALL ArrayInsertCellBefore(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2];
if (item==vec->Size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertCellBefore (%d:%d)", params[2], vec->Size());
return 0;
}
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertCellBefore (%d:%d)", params[2], vec->Size());
return 0;
}
vec->SetCell(item, params[3]);
return 1;
}
// ArrayInsertStringBefore(Array:which, item, const value[])
static cell AMX_NATIVE_CALL ArrayInsertStringBefore(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2];
if (item==vec->Size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertStringBefore (%d:%d)", params[2], vec->Size());
return 0;
}
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertStringBefore (%d:%d)", params[2], vec->Size());
return 0;
}
vec->SetString(item, get_amxaddr(amx, params[3]));
return 1;
}
// ArraySwap(Array:which, item1, item2)
static cell AMX_NATIVE_CALL ArraySwap(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
if (vec->Swap(params[2], params[3])!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArraySwap (%d , %d:%d)",params[2], params[3], vec->Size());
return 0;
}
return 1;
}
// ArrayDeleteItem(Array:which, item);
static cell AMX_NATIVE_CALL ArrayDeleteItem(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
if (vec->Delete(params[2])!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayDeleteItem (%d:%d)", params[2], vec->Size());
return 0;
}
return 1;
}
// ArrayDestroy(Array:&which)
static cell AMX_NATIVE_CALL ArrayDestroy(AMX* amx, cell* params)
{
// byref the handle here so we can zero it out after destroying
// this way they cannot accidentally reuse it
cell* handle=get_amxaddr(amx,params[1]);
CellVector* vec=HandleToVector(amx, *handle);
if (!vec)
{
return 0;
}
delete vec;
VectorHolder[*handle-1]=NULL;
*handle=0;
return 1;
}
typedef struct ArraySort_s
{
int handle;
int forward;
cell data;
cell size;
} ArraySort_t;
static CStack<ArraySort_t *> ArraySortStack;
int SortArrayList(const void *itema, const void *itemb)
{
ArraySort_t *Info = ArraySortStack.front();
return executeForwards(Info->forward, Info->handle, *((int *)itema), *((int *)itemb), Info->data, Info->size);
}
// native ArraySort(Array:array, const comparefunc[], data[]="", data_size=0);
static cell AMX_NATIVE_CALL ArraySort(AMX* amx, cell* params)
{
int handle=params[1];
CellVector* vec=HandleToVector(amx, handle);
if (!vec)
{
return 0;
}
// This is kind of a cheating way to go about this but...
// Create an array of integers as big as however many elements are in the vector.
// Pass that array to qsort
// After the array is sorted out, then create a NEW cellvector
// and copy in the old data in the order of what was sorted
int len;
char* FuncName=get_amxstring(amx, params[2], 0, len);
// MySortFunc(Array:array, item1, item2, const data[], data_size)
int Forward = registerSPForwardByName(amx, FuncName, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (Forward < 0)
{
LogError(amx, AMX_ERR_NATIVE, "The public function \"%s\" was not found.", FuncName);
return 0;
}
int *IntList=new int[vec->Size()];
for (int i=0; i< vec->Size(); i++)
{
IntList[i]=i;
}
ArraySort_t *Info=new ArraySort_t;
Info->handle=handle;
Info->forward=Forward;
Info->data=params[3];
Info->size=params[4];
ArraySortStack.push(Info);
qsort(IntList, vec->Size(), sizeof(int), SortArrayList);
ArraySortStack.pop();
CellVector* newvec=new CellVector(vec->GetCellCount());
// Set the new vector's values
for (int i=0; i< vec->Size(); i++)
{
if (newvec->SetArray(newvec->Push(), vec->GetCellPointer(IntList[i]))!=1)
{
// This should never happen..
LogError(amx, AMX_ERR_NATIVE, "Failed to SetArray in ArraySort (i=%d, IntList=%d)",i,IntList[i]);
return 0;
}
}
// Delete the old vector
delete vec;
// Now save the new vector in its handle location
VectorHolder[handle-1]=newvec;
// Cleanup
delete Info;
delete IntList;
unregisterSPForward(Forward);
return 1;
}
AMX_NATIVE_INFO g_DataStructNatives[] =
{
{ "ArrayCreate", ArrayCreate },
{ "ArrayClear", ArrayClear },
{ "ArraySize", ArraySize },
{ "ArrayGetArray", ArrayGetArray },
{ "ArrayGetCell", ArrayGetCell },
{ "ArrayGetString", ArrayGetString },
{ "ArraySetArray", ArraySetArray },
{ "ArraySetCell", ArraySetCell },
{ "ArraySetString", ArraySetString },
{ "ArrayPushArray", ArrayPushArray },
{ "ArrayPushCell", ArrayPushCell },
{ "ArrayPushString", ArrayPushString },
{ "ArrayInsertArrayAfter", ArrayInsertArrayAfter },
{ "ArrayInsertCellAfter", ArrayInsertCellAfter },
{ "ArrayInsertStringAfter", ArrayInsertStringAfter },
{ "ArrayInsertArrayBefore", ArrayInsertArrayBefore },
{ "ArrayInsertCellBefore", ArrayInsertCellBefore },
{ "ArrayInsertStringBefore", ArrayInsertStringBefore },
{ "ArraySwap", ArraySwap },
{ "ArrayDeleteItem", ArrayDeleteItem },
{ "ArrayGetStringHandle", ArrayGetStringHandle },
{ "ArrayDestroy", ArrayDestroy },
{ "ArraySort", ArraySort },
{ NULL, NULL }
};

323
amxmodx/datastructs.h Normal file
View File

@ -0,0 +1,323 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* 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, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
#ifndef DATASTRUCTS_H
#define DATASTRUCTS_H
class CellVector
{
private:
cell* data; // allocated with malloc
size_t cellcount; // how many cells per element
size_t cursize; // current size of the vector (maximum elements)
size_t count; // how many units of the vector are in use
public:
CellVector(): data(NULL), cellcount(0), cursize(0), count(0)
{
};
CellVector(int cellsize): data(NULL), cellcount(cellsize), cursize(0), count(0)
{
};
~CellVector()
{
if (data)
{
free(data);
}
};
size_t GetCellCount()
{
return cellcount;
};
void Grow(size_t howmany)
{
cursize+=howmany;
if (data)
{
data=(cell*)realloc(data, (sizeof(cell) * cellcount) * cursize);
}
else
{
data=(cell*)malloc((sizeof(cell) * cellcount) * cursize);
}
};
void FreeUnused(void)
{
if (cursize != count &&
data != NULL)
{
cursize=count;
data=(cell*)realloc(data, cursize * (sizeof(cell) * cellcount));
}
};
// Returns 1 on success
// 0 on out of bounds.
int GetArray(size_t which, cell* output)
{
// make sure it is in bounds.
if (which >= count)
{
return 0;
}
// align output data
cell* out=data + (cellcount * which);
memcpy(output, out, sizeof(cell) * cellcount);
return 1;
};
// Returns 1 on success
// 0 on out of bounds
int GetCell(size_t which, cell* output)
{
// check bounds
if (which >= count)
{
return 0;
}
*output=*(data + (cellcount * which));
return 1;
}
// Returns 1 on success
// 0 on out of bounds
int GetString(size_t which, cell* output, size_t size)
{
// check bounds
if (which >= count)
{
return 0;
}
cell* out=data + (cellcount * which);
size_t count=cellcount;
while (size-- &&
count-- &&
(*output++=*out++)!='\0')
/* do nothing */ ;
// If size is zero here, then the string was never null terminated.
if (size==0)
{
*out='\0';
}
return 1;
}
// Returns 1 on success
// 0 on out of bounds
int SetArray(size_t which, cell* output)
{
if (which >= count)
{
return 0;
}
// align output
cell* out=data + (cellcount * which);
memcpy(out, output, sizeof(cell) * cellcount);
return 1;
};
// Returns 1 on success
// 0 on out of bounds
int SetCell(size_t which, cell output)
{
if (which >= count)
{
return 0;
}
// align output
*(data + (cellcount * which))=output;
return 1;
};
// Returns 1 on success
// 0 on out of bounds
int SetString(size_t which, cell* output)
{
if (which >= count)
{
return 0;
}
// align output
cell* out=data + (cellcount * which);
memcpy(out, output, sizeof(cell) * cellcount);
// now force a null terminator on the last entry.
out+=(cellcount - 1);
*out='\0';
return 1;
};
int Push()
{
if (count >= cursize)
{
// Grow in 8s to cause less reallocation
this->Grow(8);
};
this->count++;
return this->count-1;
};
int Size()
{
return this->count;
};
void Clear()
{
free(data);
data=(cell*)malloc(sizeof(cell) * cellcount);
cursize=1;
count=0;
};
cell* GetCellPointer(size_t which)
{
if (which >= count)
{
return NULL;
}
return data + (which * cellcount);
};
// Shifts all items from this item, and including this item up 1.
int ShiftUpFrom(size_t which)
{
// No point shifting this.
if (this->count < 0 ||
which > this->count)
{
return 0;
}
// First make a new item.
this->Push();
// If we got an InsertAfter(lastitem), then which will equal this->count - 1
// all we needed to do was Push()
if (which == this->count ||
which == this->count - 1)
{
return 1;
}
// Allocate a temporary buffer to store data in
size_t tempbuffsize=(sizeof(cell) * cellcount) * (this->count - which);
cell* temp=(cell*)malloc(tempbuffsize);
// Copy old data to temp buffer
memcpy(temp, GetCellPointer(which), tempbuffsize);
// Now copy temp buffer to adjusted location
memcpy(GetCellPointer(which+1), temp, tempbuffsize);
// cleanup
free(temp);
return 1;
};
// Shifts all items from this item, and including this item down 1.
// This deletes the item specified.
int Delete(size_t which)
{
// No point shifting this.
if (this->count < 0 ||
which >= this->count)
{
return 0;
}
for (size_t i=which; i<this->count - 1; i++)
{
memcpy(GetCellPointer(i), GetCellPointer(i + 1), sizeof(cell) * cellcount);
}
this->count--;
return 1;
};
int Swap(size_t item1, size_t item2)
{
if (item1 >= this->count ||
item2 >= this->count)
{
return 0;
}
// Make a temp buffer to store item2
cell* temp=(cell*)malloc(sizeof(cell) * cellcount);
memcpy(temp, GetCellPointer(item2), sizeof(cell) * cellcount);
// copy item1 to item2
memcpy(GetCellPointer(item2), GetCellPointer(item1), sizeof(cell) * cellcount);
// copy item2 to item1
memcpy(GetCellPointer(item1), temp, sizeof(cell) * cellcount);
// Cleanup
free(temp);
return 1;
};
};
extern CVector<CellVector*> VectorHolder;
inline CellVector* HandleToVector(AMX* amx, int handle)
{
if (handle <= 0 ||
handle > (int)VectorHolder.size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", handle);
return NULL;
}
CellVector* ret=VectorHolder[handle-1];
if (ret == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", handle);
return NULL;
}
return ret;
}
#endif

View File

@ -176,7 +176,7 @@ public:
trace_info_t *GetTrace() const { return m_pTrace; } trace_info_t *GetTrace() const { return m_pTrace; }
const char *GetFmtCache() { return m_FmtCache.c_str(); } const char *GetFmtCache() { return m_FmtCache.c_str(); }
bool IsNativeFiltering() { return (m_iNatFunc > 0); } bool IsNativeFiltering() { return (m_iNatFunc > -1); }
bool InNativeFilter() { return m_InNativeFilter; } bool InNativeFilter() { return m_InNativeFilter; }
private: private:
AMX *m_pAmx; AMX *m_pAmx;

View File

@ -30,6 +30,7 @@
*/ */
#include "amxmodx.h" #include "amxmodx.h"
#include "CMenu.h"
int gmsgAmmoPickup; int gmsgAmmoPickup;
int gmsgAmmoX; int gmsgAmmoX;
@ -92,9 +93,10 @@ void Client_ShowMenu(void* mValue)
} }
} }
extern bool g_bmod_tfc;
void Client_TeamInfo(void* mValue) void Client_TeamInfo(void* mValue)
{ {
if (mPlayer) return; if (mPlayer && !g_bmod_tfc) return;
static int index; static int index;
switch (mState++) switch (mState++)
@ -107,6 +109,7 @@ void Client_TeamInfo(void* mValue)
char* msg = (char*)mValue; char* msg = (char*)mValue;
g_players[index].team.assign(msg); g_players[index].team.assign(msg);
g_teamsIds.registerTeam(msg, -1); g_teamsIds.registerTeam(msg, -1);
break;
} }
} }
@ -209,10 +212,16 @@ void Client_CurWeapon(void* mValue)
case 2: case 2:
if (!mPlayer) return; if (!mPlayer) return;
if (!iState || (iId < 1 || iId >= MAX_WEAPONS)) break; if (!iState || (iId < 1 || iId >= MAX_WEAPONS)) break;
mPlayer->weapons[iId].clip = *(int*)mValue;
mPlayer->current = iId; mPlayer->current = iId;
if (*(int*)mValue < mPlayer->weapons[iId].clip && // Only update the lastHit vector if the clip size is decreasing
*(int*)mValue != -1) // But not if it's a melee weapon
{
mPlayer->lastHit = mPlayer->lastTrace; mPlayer->lastHit = mPlayer->lastTrace;
} }
mPlayer->weapons[iId].clip = *(int*)mValue;
}
} }
void Client_AmmoX(void* mValue) void Client_AmmoX(void* mValue)

View File

@ -383,8 +383,9 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
case 1: case 1:
{ {
char *a = new char[blocks]; char *a = new char[blocks];
char *ptr = a;
while (btmp--) while (btmp--)
*a++ = static_cast<char>(*addr++); *ptr++ = static_cast<char>(*addr++);
size_t res = fwrite(a, sizeof(char), blocks, fp); size_t res = fwrite(a, sizeof(char), blocks, fp);
delete [] a; delete [] a;
return res; return res;
@ -392,8 +393,9 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
case 2: case 2:
{ {
short *a = new short[blocks]; short *a = new short[blocks];
short *ptr = a;
while (btmp--) while (btmp--)
*a++ = static_cast<short>(*addr++); *ptr++ = static_cast<short>(*addr++);
size_t res = fwrite(a, sizeof(short), blocks, fp); size_t res = fwrite(a, sizeof(short), blocks, fp);
delete [] a; delete [] a;
return res; return res;
@ -401,8 +403,9 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
case 4: case 4:
{ {
int *a = new int[blocks]; int *a = new int[blocks];
int *ptr = a;
while (btmp--) while (btmp--)
*a++ = static_cast<int>(*addr++); *ptr++ = static_cast<int>(*addr++);
size_t res = fwrite(a, sizeof(int), blocks, fp); size_t res = fwrite(a, sizeof(int), blocks, fp);
delete [] a; delete [] a;
return res; return res;
@ -435,7 +438,7 @@ static cell AMX_NATIVE_CALL amx_fwrite(AMX *amx, cell *params)
case 4: case 4:
{ {
int c = static_cast<int>(params[2]); int c = static_cast<int>(params[2]);
return fwrite(&c, sizeof(short), 1, fp); return fwrite(&c, sizeof(int), 1, fp);
} }
} }
@ -799,16 +802,59 @@ static cell AMX_NATIVE_CALL amx_rmdir(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL amx_rename(AMX *amx, cell *params) static cell AMX_NATIVE_CALL amx_rename(AMX *amx, cell *params)
{ {
int len; int len;
char f_old_r[260];
char f_new_r[260];
char *fold = get_amxstring(amx, params[1], 0, len); char *fold = get_amxstring(amx, params[1], 0, len);
char *fnew = get_amxstring(amx, params[2], 1, len); char *fnew = get_amxstring(amx, params[2], 1, len);
if (params[0] / sizeof(cell) == 3 && params[3])
{
build_pathname_r(f_old_r, sizeof(f_old_r)-1, "%s", fold);
build_pathname_r(f_new_r, sizeof(f_new_r)-1, "%s", fnew);
} else {
snprintf(f_old_r, sizeof(f_old_r)-1, "%s", fold);
snprintf(f_new_r, sizeof(f_new_r)-1, "%s", fnew);
}
#if defined __linux__ #if defined __linux__
return (rename(fold, fnew) == 0); return (rename(f_old_r, f_new_r) == 0);
#elif defined WIN32 #elif defined WIN32
return MoveFileA(fold, fnew); return MoveFileA(f_old_r, f_new_r);
#endif #endif
} }
static cell LoadFileForMe(AMX *amx, cell *params)
{
int len;
char *file = get_amxstring(amx, params[1], 0, len);
char path[256];
build_pathname_r(path, sizeof(path), "%s", file);
byte *addr = LOAD_FILE_FOR_ME(path, &len);
if (addr == NULL)
{
return -1;
}
cell *buffer = get_amxaddr(amx, params[2]);
cell maxlength = params[3];
cell *bytes_avail = get_amxaddr(amx, params[4]);
*bytes_avail = len;
cell count;
for (count = 0; count < len && count < maxlength; count++)
{
buffer[count] = addr[count];
}
FREE_FILE(addr);
return count;
}
AMX_NATIVE_INFO file_Natives[] = AMX_NATIVE_INFO file_Natives[] =
{ {
{"delete_file", delete_file}, {"delete_file", delete_file},
@ -844,5 +890,6 @@ AMX_NATIVE_INFO file_Natives[] =
{"rmdir", amx_rmdir}, {"rmdir", amx_rmdir},
{"fputs", amx_fputs}, {"fputs", amx_fputs},
{"rename_file", amx_rename}, {"rename_file", amx_rename},
{"LoadFileForMe", LoadFileForMe},
{NULL, NULL} {NULL, NULL}
}; };

View File

@ -1,5 +1,6 @@
#include "amxmodx.h" #include "amxmodx.h"
#include "format.h" #include "format.h"
#include "datastructs.h"
#include "amxmod_compat.h" #include "amxmod_compat.h"
//Adapted from Quake3's vsprintf //Adapted from Quake3's vsprintf
@ -18,6 +19,7 @@
#define SHORTINT 0x00000040 /* short integer */ #define SHORTINT 0x00000040 /* short integer */
#define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */ #define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */
#define FPT 0x00000100 /* floating point number */ #define FPT 0x00000100 /* floating point number */
#define UPPERDIGITS 0x00000200 /* make alpha digits uppercase */
#define to_digit(c) ((c) - '0') #define to_digit(c) ((c) - '0')
#define is_digit(c) ((unsigned)to_digit(c) <= 9) #define is_digit(c) ((unsigned)to_digit(c) <= 9)
#define to_char(n) ((n) + '0') #define to_char(n) ((n) + '0')
@ -326,6 +328,66 @@ void AddInt(U **buf_p, size_t &maxlen, int val, int width, int flags)
*buf_p = buf; *buf_p = buf;
} }
template <typename U>
void AddHex(U **buf_p, size_t &maxlen, unsigned int val, int width, int flags)
{
U text[32];
int digits;
U *buf;
U digit;
int hexadjust;
if (flags & UPPERDIGITS)
{
hexadjust = 'A' - '9' - 1;
} else {
hexadjust = 'a' - '9' - 1;
}
digits = 0;
do
{
digit = ('0' + val % 16);
if (digit > '9')
{
digit += hexadjust;
}
text[digits++] = digit;
val /= 16;
} while (val);
buf = *buf_p;
if( !(flags & LADJUST) )
{
while (digits < width && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
width--;
maxlen--;
}
}
while (digits-- && maxlen)
{
*buf++ = text[digits];
width--;
maxlen--;
}
if (flags & LADJUST)
{
while (width-- && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
maxlen--;
}
}
*buf_p = buf;
}
template <typename D, typename S> template <typename D, typename S>
size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param) size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param)
{ {
@ -403,6 +465,7 @@ reswitch:
case 'c': case 'c':
CHECK_ARGS(0); CHECK_ARGS(0);
*buf_p++ = static_cast<D>(*get_amxaddr(amx, params[arg])); *buf_p++ = static_cast<D>(*get_amxaddr(amx, params[arg]));
llen--;
arg++; arg++;
break; break;
case 'd': case 'd':
@ -421,6 +484,32 @@ reswitch:
AddFloat(&buf_p, llen, amx_ctof(*get_amxaddr(amx, params[arg])), width, prec); AddFloat(&buf_p, llen, amx_ctof(*get_amxaddr(amx, params[arg])), width, prec);
arg++; arg++;
break; break;
case 'X':
CHECK_ARGS(0);
flags |= UPPERDIGITS;
AddHex(&buf_p, llen, static_cast<unsigned int>(*get_amxaddr(amx, params[arg])), width, flags);
arg++;
break;
case 'x':
CHECK_ARGS(0);
AddHex(&buf_p, llen, static_cast<unsigned int>(*get_amxaddr(amx, params[arg])), width, flags);
arg++;
break;
case 'a':
{
CHECK_ARGS(0);
// %a is passed a pointer directly to a cell string.
cell* ptr=reinterpret_cast<cell*>(*get_amxaddr(amx, params[arg]));
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid vector string handle provided (%d)", *get_amxaddr(amx, params[arg]));
return 0;
}
AddString(&buf_p, llen, ptr, width, prec);
arg++;
break;
}
case 's': case 's':
CHECK_ARGS(0); CHECK_ARGS(0);
if (amx->flags & AMX_FLAG_OLDFILE) if (amx->flags & AMX_FLAG_OLDFILE)

View File

@ -39,6 +39,7 @@
#include "amxmodx.h" #include "amxmodx.h"
#include "fakemeta.h" #include "fakemeta.h"
#include "CMenu.h"
#include "newmenus.h" #include "newmenus.h"
#include "natives.h" #include "natives.h"
#include "binlog.h" #include "binlog.h"
@ -47,16 +48,21 @@
#include "messages.h" #include "messages.h"
#include "amxmod_compat.h" #include "amxmod_compat.h"
#include "datastructs.h"
#include "CFlagManager.h"
#include "svn_version.h"
plugin_info_t Plugin_info = plugin_info_t Plugin_info =
{ {
META_INTERFACE_VERSION, // ifvers META_INTERFACE_VERSION, // ifvers
"AMX Mod X", // name "AMX Mod X", // name
AMX_VERSION, // version SVN_VERSION_STRING, // version
__DATE__, // date __DATE__, // date
"AMX Mod X Dev Team", // author "AMX Mod X Dev Team", // author
"http://www.amxmodx.org", // url "http://www.amxmodx.org", // url
"AMXX", // logtag "AMXX", // logtag
PT_ANYTIME, // (when) loadable PT_STARTUP, // (when) loadable
PT_ANYTIME, // (when) unloadable PT_ANYTIME, // (when) unloadable
}; };
@ -73,6 +79,7 @@ void (*function)(void*);
void (*endfunction)(void*); void (*endfunction)(void*);
extern List<AUTHORIZEFUNC> g_auth_funcs; extern List<AUTHORIZEFUNC> g_auth_funcs;
extern CVector<CAdminData *> DynamicAdmins;
CLog g_log; CLog g_log;
CForwardMngr g_forwards; CForwardMngr g_forwards;
@ -86,7 +93,7 @@ CPlayer* mPlayer;
CPluginMngr g_plugins; CPluginMngr g_plugins;
CTaskMngr g_tasksMngr; CTaskMngr g_tasksMngr;
CmdMngr g_commands; CmdMngr g_commands;
CFlagManager FlagMan;
EventsMngr g_events; EventsMngr g_events;
Grenades g_grenades; Grenades g_grenades;
LogEventsMngr g_logevents; LogEventsMngr g_logevents;
@ -351,6 +358,22 @@ int C_Spawn(edict_t *pent)
hostname = CVAR_GET_POINTER("hostname"); hostname = CVAR_GET_POINTER("hostname");
mp_timelimit = CVAR_GET_POINTER("mp_timelimit"); mp_timelimit = CVAR_GET_POINTER("mp_timelimit");
// Fix for crashing on mods that do not have mp_timelimit
if (mp_timelimit == NULL)
{
static cvar_t timelimit_holder;
timelimit_holder.name = "mp_timelimit";
timelimit_holder.string = "0";
timelimit_holder.flags = 0;
timelimit_holder.value = 0.0;
CVAR_REGISTER(&timelimit_holder);
mp_timelimit = &timelimit_holder;
}
g_forwards.clear(); g_forwards.clear();
g_log.MapChange(); g_log.MapChange();
@ -381,7 +404,16 @@ int C_Spawn(edict_t *pent)
get_localinfo("amx_pluginsdir", "addons/amxmodx/plugins"); get_localinfo("amx_pluginsdir", "addons/amxmodx/plugins");
get_localinfo("amx_logdir", "addons/amxmodx/logs"); get_localinfo("amx_logdir", "addons/amxmodx/logs");
FlagMan.LoadFile();
for (unsigned int i=0; i<VectorHolder.size(); i++)
{
delete VectorHolder[i];
};
VectorHolder.clear();
char map_pluginsfile_path[256]; char map_pluginsfile_path[256];
char prefixed_map_pluginsfile[256];
char configs_dir[256]; char configs_dir[256];
// ###### Load modules // ###### Load modules
@ -390,7 +422,26 @@ int C_Spawn(edict_t *pent)
get_localinfo_r("amxx_configsdir", "addons/amxmodx/configs", configs_dir, sizeof(configs_dir)-1); get_localinfo_r("amxx_configsdir", "addons/amxmodx/configs", configs_dir, sizeof(configs_dir)-1);
g_plugins.CALMFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini")); g_plugins.CALMFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
LoadExtraPluginsToPCALM(configs_dir); LoadExtraPluginsToPCALM(configs_dir);
snprintf(map_pluginsfile_path, sizeof(map_pluginsfile_path)-1, char temporaryMap[64], *tmap_ptr;
snprintf(temporaryMap, sizeof(temporaryMap), "%s", STRING(gpGlobals->mapname));
prefixed_map_pluginsfile[0] = '\0';
if ((tmap_ptr = strchr(temporaryMap, '_')) != NULL)
{
// this map has a prefix
*tmap_ptr = '\0';
snprintf(prefixed_map_pluginsfile,
sizeof(prefixed_map_pluginsfile),
"%s/maps/plugins-%s.ini",
configs_dir,
temporaryMap);
g_plugins.CALMFromFile(prefixed_map_pluginsfile);
}
snprintf(map_pluginsfile_path,
sizeof(map_pluginsfile_path),
"%s/maps/plugins-%s.ini", "%s/maps/plugins-%s.ini",
configs_dir, configs_dir,
STRING(gpGlobals->mapname)); STRING(gpGlobals->mapname));
@ -399,7 +450,7 @@ int C_Spawn(edict_t *pent)
int loaded = countModules(CountModules_Running); // Call after attachModules so all modules don't have pending stat int loaded = countModules(CountModules_Running); // Call after attachModules so all modules don't have pending stat
// Set some info about amx version and modules // Set some info about amx version and modules
CVAR_SET_STRING(init_amxmodx_version.name, AMX_VERSION); CVAR_SET_STRING(init_amxmodx_version.name, SVN_VERSION_STRING);
char buffer[32]; char buffer[32];
sprintf(buffer, "%d", loaded); sprintf(buffer, "%d", loaded);
CVAR_SET_STRING(init_amxmodx_modules.name, buffer); CVAR_SET_STRING(init_amxmodx_modules.name, buffer);
@ -435,6 +486,11 @@ int C_Spawn(edict_t *pent)
g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini")); g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
LoadExtraPluginsFromDir(configs_dir); LoadExtraPluginsFromDir(configs_dir);
g_plugins.loadPluginsFromFile(map_pluginsfile_path, false); g_plugins.loadPluginsFromFile(map_pluginsfile_path, false);
if (prefixed_map_pluginsfile[0] != '\0')
{
g_plugins.loadPluginsFromFile(prefixed_map_pluginsfile, false);
}
g_plugins.Finalize(); g_plugins.Finalize();
g_plugins.InvalidateCache(); g_plugins.InvalidateCache();
@ -650,10 +706,19 @@ void C_ServerDeactivate_Post()
ClearMessages(); ClearMessages();
// Flush the dynamic admins list
for (size_t iter=DynamicAdmins.size();iter--; )
{
delete DynamicAdmins[iter];
}
DynamicAdmins.clear();
for (unsigned int i=0; i<g_hudsync.size(); i++) for (unsigned int i=0; i<g_hudsync.size(); i++)
delete [] g_hudsync[i]; delete [] g_hudsync[i];
g_hudsync.clear(); g_hudsync.clear();
FlagMan.WriteCommands();
// last memreport // last memreport
#ifdef MEMORY_TEST #ifdef MEMORY_TEST
if (g_memreport_enabled) if (g_memreport_enabled)
@ -900,50 +965,66 @@ void C_ClientCommand(edict_t *pEntity)
int menuid = pPlayer->menu; int menuid = pPlayer->menu;
pPlayer->menu = 0; pPlayer->menu = 0;
MenuMngr::iterator a = g_menucmds.begin(); /* First, do new menus */
int func_was_executed = -1;
while (a)
{
if ((*a).matchCommand(menuid, bit_key) && (*a).getPlugin()->isExecutable((*a).getFunction()))
{
if (pPlayer->newmenu != -1) if (pPlayer->newmenu != -1)
{ {
int menu = pPlayer->newmenu; int menu = pPlayer->newmenu;
pPlayer->newmenu = -1; pPlayer->newmenu = -1;
if (menu >= 0 && menu < (int)g_NewMenus.size()) if (menu >= 0 && menu < (int)g_NewMenus.size() && g_NewMenus[menu])
{ {
Menu *pMenu = g_NewMenus[menu]; Menu *pMenu = g_NewMenus[menu];
int item = pMenu->PagekeyToItem(pPlayer->page, pressed_key+1); int item = pMenu->PagekeyToItem(pPlayer->page, pressed_key+1);
if (item == MENU_BACK) if (item == MENU_BACK)
{ {
pMenu->Display(pPlayer->index, pPlayer->page - 1); pMenu->Display(pPlayer->index, pPlayer->page - 1);
} else if (item == MENU_MORE) { } else if (item == MENU_MORE) {
pMenu->Display(pPlayer->index, pPlayer->page + 1); pMenu->Display(pPlayer->index, pPlayer->page + 1);
} else { } else {
ret = executeForwards((*a).getFunction(), static_cast<cell>(pPlayer->index), static_cast<cell>(menu), static_cast<cell>(item)); ret = executeForwards(pMenu->func, static_cast<cell>(pPlayer->index), static_cast<cell>(menu), static_cast<cell>(item));
if (ret & 2) if (ret & 2)
{
result = MRES_SUPERCEDE; result = MRES_SUPERCEDE;
else if (ret & 1) } else if (ret & 1) {
RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_SUPERCEDE);
} }
} }
if (pPlayer->newmenu != -1) /**
break; * No matter what we marked it as executed, since the callback styles are
} else { * entirely different. After all, this is a backwards compat shim.
*/
func_was_executed = pMenu->func;
}
}
/* Now, do old menus */
MenuMngr::iterator a = g_menucmds.begin();
while (a)
{
g_menucmds.SetWatchIter(a);
if ((*a).matchCommand(menuid, bit_key)
&& (*a).getPlugin()->isExecutable((*a).getFunction())
&& (func_was_executed == -1
|| !g_forwards.isSameSPForward(func_was_executed, (*a).getFunction()))
)
{
ret = executeForwards((*a).getFunction(), static_cast<cell>(pPlayer->index), ret = executeForwards((*a).getFunction(), static_cast<cell>(pPlayer->index),
static_cast<cell>(pressed_key), 0); static_cast<cell>(pressed_key), 0);
if (ret & 2) result = MRES_SUPERCEDE; if (ret & 2) result = MRES_SUPERCEDE;
if (ret & 1) RETURN_META(MRES_SUPERCEDE); if (ret & 1) RETURN_META(MRES_SUPERCEDE);
} }
} if (g_menucmds.GetWatchIter() != a)
{
a = g_menucmds.GetWatchIter();
} else {
++a; ++a;
} }
} }
} }
}
/* check for PLUGIN_HANDLED_MAIN and block hl call if needed */ /* check for PLUGIN_HANDLED_MAIN and block hl call if needed */
RETURN_META(result); RETURN_META(result);
@ -1056,20 +1137,6 @@ void C_MessageBegin_Post(int msg_dest, int msg_type, const float *pOrigin, edict
{ {
if (ed) if (ed)
{ {
if (gmsgBattery == msg_type && g_bmod_cstrike)
{
void* ptr = GET_PRIVATE(ed);
#ifdef __linux__
int *z = (int*)ptr + 0x171;
#else
int *z = (int*)ptr + 0x16C;
#endif
int stop = (int)ed->v.armorvalue;
*z = stop;
ed->v.armorvalue = (float)stop;
}
mPlayerIndex = ENTINDEX(ed); mPlayerIndex = ENTINDEX(ed);
mPlayer = GET_PLAYER_POINTER_I(mPlayerIndex); mPlayer = GET_PLAYER_POINTER_I(mPlayerIndex);
} else { } else {
@ -1211,8 +1278,7 @@ void C_TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t
if (ptr->pHit && (ptr->pHit->v.flags & (FL_CLIENT | FL_FAKECLIENT))) if (ptr->pHit && (ptr->pHit->v.flags & (FL_CLIENT | FL_FAKECLIENT)))
pPlayer->aiming = ptr->iHitgroup; pPlayer->aiming = ptr->iHitgroup;
pPlayer->lastTrace = pPlayer->thisTrace; pPlayer->lastTrace = ptr->vecEndPos;
pPlayer->thisTrace = ptr->vecEndPos;
} }
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
@ -1390,7 +1456,7 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
// ###### Print short GPL // ###### Print short GPL
print_srvconsole("\n AMX Mod X version %s Copyright (c) 2004-2006 AMX Mod X Development Team \n" print_srvconsole("\n AMX Mod X version %s Copyright (c) 2004-2006 AMX Mod X Development Team \n"
" AMX Mod X comes with ABSOLUTELY NO WARRANTY; for details type `amxx gpl'.\n", AMX_VERSION); " AMX Mod X comes with ABSOLUTELY NO WARRANTY; for details type `amxx gpl'.\n", SVN_VERSION_STRING);
print_srvconsole(" This is free software and you are welcome to redistribute it under \n" print_srvconsole(" This is free software and you are welcome to redistribute it under \n"
" certain conditions; type 'amxx gpl' for details.\n \n"); " certain conditions; type 'amxx gpl' for details.\n \n");
@ -1419,6 +1485,8 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
GET_HOOK_TABLES(PLID, &g_pEngTable, NULL, NULL); GET_HOOK_TABLES(PLID, &g_pEngTable, NULL, NULL);
FlagMan.SetFile("cmdaccess.ini");
return (TRUE); return (TRUE);
} }

View File

@ -578,6 +578,7 @@ int set_amxnatives(AMX* amx, char error[128])
amx_Register(amx, msg_Natives, -1); amx_Register(amx, msg_Natives, -1);
amx_Register(amx, vector_Natives, -1); amx_Register(amx, vector_Natives, -1);
amx_Register(amx, g_SortNatives, -1); amx_Register(amx, g_SortNatives, -1);
amx_Register(amx, g_DataStructNatives, -1);
if (amx->flags & AMX_FLAG_OLDFILE) if (amx->flags & AMX_FLAG_OLDFILE)
{ {
@ -598,7 +599,7 @@ int set_amxnatives(AMX* amx, char error[128])
if ((err = amx_Exec(amx, &retval, idx)) != AMX_ERR_NONE) if ((err = amx_Exec(amx, &retval, idx)) != AMX_ERR_NONE)
{ {
Debugger::GenericMessage(amx, err); Debugger::GenericMessage(amx, err);
AMXXLOG_Log("An error occurred in plugins_native. This is dangerous!"); AMXXLOG_Log("An error occurred in plugin_natives. This is dangerous!");
} }
} }
@ -721,13 +722,7 @@ char* build_pathname(char *fmt, ...)
{ {
static char string[256]; static char string[256];
int b; int b;
int a = b = snprintf(string, 255, int a = b = snprintf(string, 255, "%s%c", g_mod_name.c_str(), PATH_SEP_CHAR);
#ifndef __linux__
"%s\\",
#else
"%s/",
#endif
g_mod_name.c_str());
va_list argptr; va_list argptr;
va_start(argptr, fmt); va_start(argptr, fmt);
@ -739,11 +734,10 @@ char* build_pathname(char *fmt, ...)
while (*path) while (*path)
{ {
#ifndef __linux__ if (*path == ALT_SEP_CHAR)
if (*path == '/') *path = '\\'; {
#else *path = PATH_SEP_CHAR;
if (*path == '\\') *path = '/'; }
#endif
++path; ++path;
} }
@ -752,13 +746,7 @@ char* build_pathname(char *fmt, ...)
char *build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...) char *build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...)
{ {
snprintf(buffer, maxlen, snprintf(buffer, maxlen, "%s%c", g_mod_name.c_str(), PATH_SEP_CHAR);
#ifdef __linux__
"%s/",
#else
"%s\\",
#endif
g_mod_name.c_str());
size_t len = strlen(buffer); size_t len = strlen(buffer);
char *ptr = buffer + len; char *ptr = buffer + len;
@ -770,11 +758,10 @@ char *build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...)
while (*ptr) while (*ptr)
{ {
#ifndef __linux__ if (*ptr == ALT_SEP_CHAR)
if (*ptr == '/') *ptr = '\\'; {
#else *ptr = PATH_SEP_CHAR;
if (*ptr == '\\') *ptr = '/'; }
#endif
++ptr; ++ptr;
} }
@ -795,23 +782,16 @@ char* build_pathname_addons(char *fmt, ...)
while (*path) while (*path)
{ {
#ifndef __linux__ if (*path == ALT_SEP_CHAR)
if (*path == '/') *path = '\\'; {
#else *path = PATH_SEP_CHAR;
if (*path == '\\') *path = '/'; }
#endif
++path; ++path;
} }
return string; return string;
} }
#if defined WIN32
#define SEPCHAR '\\'
#elif defined __linux__
#define SEPCHAR '/'
#endif
bool ConvertModuleName(const char *pathString, String &path) bool ConvertModuleName(const char *pathString, String &path)
{ {
String local; String local;
@ -829,7 +809,7 @@ bool ConvertModuleName(const char *pathString, String &path)
/* run to filename instead of dir */ /* run to filename instead of dir */
char *ptr = tmpname; char *ptr = tmpname;
ptr = tmpname + len - 1; ptr = tmpname + len - 1;
while (ptr >= tmpname && *ptr != SEPCHAR) while (ptr >= tmpname && *ptr != PATH_SEP_CHAR)
ptr--; ptr--;
if (ptr >= tmpname) if (ptr >= tmpname)
{ {
@ -890,7 +870,7 @@ bool ConvertModuleName(const char *pathString, String &path)
} }
path.assign(orig_path); path.assign(orig_path);
path.append(SEPCHAR); path.append(PATH_SEP_CHAR);
path.append(tmpname); path.append(tmpname);
path.append("_amxx"); path.append("_amxx");
#if defined __linux__ #if defined __linux__

View File

@ -1,12 +0,0 @@
amxmodx.sln
amxmodx.suo
amxmodx.aps
amxmodx.ncb
Debug
JITDebug
JITMemtestRelease
JITRelease
MaximalSpeed
MemtestDebug
MemtestRelease
Release

View File

@ -1,292 +0,0 @@
# Microsoft Developer Studio Project File - Name="amxmodx_mm" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=amxmodx_mm - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "amxmodx_mm.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "amxmodx_mm.mak" CFG="amxmodx_mm - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "amxmodx_mm - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "amxmodx_mm - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "amxmodx_mm - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "release"
# PROP Intermediate_Dir "release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "amxmodx_mm_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\metamod\metamod" /I "..\..\hlsdk\sourcecode\common" /I "..\..\hlsdk\sourcecode\engine" /I "..\..\hlsdk\sourcecode\dlls" /I "..\..\hlsdk\sourcecode\pm_shared" /I "..\extra\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "amxmodx_mm_EXPORTS" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /def:".\amxmodx_mm.def" /out:"release/amxx_mm.dll" /libpath:"..\extra\lib_win32"
# Begin Custom Build
TargetPath=.\release\amxx_mm.dll
TargetName=amxx_mm
InputPath=.\release\amxx_mm.dll
SOURCE="$(InputPath)"
"$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
copy $(TargetPath) D:\SIERRA\Half-Life\cstrike\addons\amx\dlls
# End Custom Build
!ELSEIF "$(CFG)" == "amxmodx_mm - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "debug"
# PROP Intermediate_Dir "debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "amxmodx_mm_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /Zp4 /MTd /W3 /Gm /GX /ZI /Od /I "..\..\metamod\metamod" /I "..\...\hlsdk\sourcecode\common" /I "..\...\hlsdk\sourcecode\engine" /I "..\...\hlsdk\sourcecode\dlls" /I "..\...\hlsdk\sourcecode\pm_shared" /I "..\extra\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "amxmodx_mm_EXPORTS" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /def:".\amxmodx_mm.def" /out:"debug/amxx_mm.dll" /pdbtype:sept /libpath:"..\extra\lib_win32"
# SUBTRACT LINK32 /incremental:no /nodefaultlib
# Begin Custom Build
TargetPath=.\debug\amxx_mm.dll
TargetName=amxx_mm
InputPath=.\debug\amxx_mm.dll
SOURCE="$(InputPath)"
"$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
copy $(TargetPath) D:\SIERRA\Half-Life\cstrike\addons\amx\dlls
# End Custom Build
!ENDIF
# Begin Target
# Name "amxmodx_mm - Win32 Release"
# Name "amxmodx_mm - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=..\amx.c
# End Source File
# Begin Source File
SOURCE=..\amxcore.c
# End Source File
# Begin Source File
SOURCE=..\amxmodx.cpp
# End Source File
# Begin Source File
SOURCE=..\amxtime.c
# End Source File
# Begin Source File
SOURCE=..\amxxlog.cpp
# End Source File
# Begin Source File
SOURCE=..\CCmd.cpp
# End Source File
# Begin Source File
SOURCE=..\CEvent.cpp
# End Source File
# Begin Source File
SOURCE=..\CFile.cpp
# End Source File
# Begin Source File
SOURCE=..\CForward.cpp
# End Source File
# Begin Source File
SOURCE=..\CLogEvent.cpp
# End Source File
# Begin Source File
SOURCE=..\CMenu.cpp
# End Source File
# Begin Source File
SOURCE=..\CMisc.cpp
# End Source File
# Begin Source File
SOURCE=..\CModule.cpp
# End Source File
# Begin Source File
SOURCE=..\CPlugin.cpp
# End Source File
# Begin Source File
SOURCE=..\CString.cpp
# End Source File
# Begin Source File
SOURCE=..\CTask.cpp
# End Source File
# Begin Source File
SOURCE=..\CVault.cpp
# End Source File
# Begin Source File
SOURCE=..\emsg.cpp
# End Source File
# Begin Source File
SOURCE=..\file.cpp
# End Source File
# Begin Source File
SOURCE=..\float.cpp
# End Source File
# Begin Source File
SOURCE=..\meta_api.cpp
# End Source File
# Begin Source File
SOURCE=..\modules.cpp
# End Source File
# Begin Source File
SOURCE=..\power.c
# End Source File
# Begin Source File
SOURCE=..\srvcmd.cpp
# End Source File
# Begin Source File
SOURCE=..\string.cpp
# End Source File
# Begin Source File
SOURCE=..\strptime.cpp
# End Source File
# Begin Source File
SOURCE=..\util.cpp
# End Source File
# Begin Source File
SOURCE=..\vault.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=..\amxmodx.h
# End Source File
# Begin Source File
SOURCE=..\CCmd.h
# End Source File
# Begin Source File
SOURCE=..\CEvent.h
# End Source File
# Begin Source File
SOURCE=..\CFile.h
# End Source File
# Begin Source File
SOURCE=..\CForward.h
# End Source File
# Begin Source File
SOURCE=..\CList.h
# End Source File
# Begin Source File
SOURCE=..\CLogEvent.h
# End Source File
# Begin Source File
SOURCE=..\CMenu.h
# End Source File
# Begin Source File
SOURCE=..\CMisc.h
# End Source File
# Begin Source File
SOURCE=..\CModule.h
# End Source File
# Begin Source File
SOURCE=..\CPlugin.h
# End Source File
# Begin Source File
SOURCE=..\CString.h
# End Source File
# Begin Source File
SOURCE=..\CTask.h
# End Source File
# Begin Source File
SOURCE=..\CVault.h
# End Source File
# Begin Source File
SOURCE=..\modules.h
# End Source File
# End Group
# End Target
# End Project

View File

@ -1,29 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "amxmodx_mm"=.\amxmodx_mm.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View File

@ -361,6 +361,9 @@
<File <File
RelativePath="..\CFile.cpp"> RelativePath="..\CFile.cpp">
</File> </File>
<File
RelativePath="..\CFlagManager.cpp">
</File>
<File <File
RelativePath="..\CForward.cpp"> RelativePath="..\CForward.cpp">
</File> </File>
@ -388,6 +391,9 @@
<File <File
RelativePath="..\CVault.cpp"> RelativePath="..\CVault.cpp">
</File> </File>
<File
RelativePath="..\datastructs.cpp">
</File>
<File <File
RelativePath="..\debugger.cpp"> RelativePath="..\debugger.cpp">
</File> </File>
@ -439,6 +445,9 @@
<File <File
RelativePath="..\newmenus.cpp"> RelativePath="..\newmenus.cpp">
</File> </File>
<File
RelativePath="..\nongpl_matches.cpp">
</File>
<File <File
RelativePath="..\optimizer.cpp"> RelativePath="..\optimizer.cpp">
</File> </File>
@ -512,6 +521,9 @@
<File <File
RelativePath="..\CFile.h"> RelativePath="..\CFile.h">
</File> </File>
<File
RelativePath="..\CFlagManager.h">
</File>
<File <File
RelativePath="..\CForward.h"> RelativePath="..\CForward.h">
</File> </File>
@ -551,6 +563,9 @@
<File <File
RelativePath="..\CVector.h"> RelativePath="..\CVector.h">
</File> </File>
<File
RelativePath="..\datastructs.h">
</File>
<File <File
RelativePath="..\debugger.h"> RelativePath="..\debugger.h">
</File> </File>
@ -581,6 +596,9 @@
<File <File
RelativePath="..\newmenus.h"> RelativePath="..\newmenus.h">
</File> </File>
<File
RelativePath="..\nongpl_matches.h">
</File>
<File <File
RelativePath="..\optimizer.h"> RelativePath="..\optimizer.h">
</File> </File>
@ -596,6 +614,9 @@
<File <File
RelativePath="..\sh_tinyhash.h"> RelativePath="..\sh_tinyhash.h">
</File> </File>
<File
RelativePath="..\svn_version.h">
</File>
<File <File
RelativePath="..\zlib\zconf.h"> RelativePath="..\zlib\zconf.h">
</File> </File>
@ -676,6 +697,92 @@
RelativePath="..\sdk\moduleconfig.h"> RelativePath="..\sdk\moduleconfig.h">
</File> </File>
</Filter> </Filter>
<Filter
Name="Pawn Includes"
Filter="">
<File
RelativePath="..\..\plugins\include\amxconst.inc">
</File>
<File
RelativePath="..\..\plugins\include\amxmisc.inc">
</File>
<File
RelativePath="..\..\plugins\include\amxmodx.inc">
</File>
<File
RelativePath="..\..\plugins\include\core.inc">
</File>
<File
RelativePath="..\..\plugins\include\file.inc">
</File>
<File
RelativePath="..\..\plugins\include\float.inc">
</File>
<File
RelativePath="..\..\plugins\include\lang.inc">
</File>
<File
RelativePath="..\..\plugins\include\message_const.inc">
</File>
<File
RelativePath="..\..\plugins\include\message_stocks.inc">
</File>
<File
RelativePath="..\..\plugins\include\messages.inc">
</File>
<File
RelativePath="..\..\plugins\include\sorting.inc">
</File>
<File
RelativePath="..\..\plugins\include\string.inc">
</File>
<File
RelativePath="..\..\plugins\include\svn_version.inc">
</File>
<File
RelativePath="..\..\plugins\include\time.inc">
</File>
<File
RelativePath="..\..\plugins\include\vault.inc">
</File>
<File
RelativePath="..\..\plugins\include\vector.inc">
</File>
<File
RelativePath="..\..\plugins\include\xs.inc">
</File>
<Filter
Name="AMX Mod Compat"
Filter="">
<File
RelativePath="..\..\plugins\include\amxmod_compat\amxmod.inc">
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\maths.inc">
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\mysql.inc">
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\translator.inc">
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\Vexd_Utilities.inc">
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\VexdUM.inc">
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\VexdUM_const.inc">
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\VexdUM_stock.inc">
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\xtrafun.inc">
</File>
</Filter>
</Filter>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>

View File

@ -505,6 +505,10 @@
RelativePath="..\CFile.cpp" RelativePath="..\CFile.cpp"
> >
</File> </File>
<File
RelativePath="..\CFlagManager.cpp"
>
</File>
<File <File
RelativePath="..\CForward.cpp" RelativePath="..\CForward.cpp"
> >
@ -609,6 +613,10 @@
RelativePath="..\newmenus.cpp" RelativePath="..\newmenus.cpp"
> >
</File> </File>
<File
RelativePath="..\nongpl_matches.cpp"
>
</File>
<File <File
RelativePath="..\optimizer.cpp" RelativePath="..\optimizer.cpp"
> >
@ -706,6 +714,10 @@
RelativePath="..\CFile.h" RelativePath="..\CFile.h"
> >
</File> </File>
<File
RelativePath="..\CFlagManager.h"
>
</File>
<File <File
RelativePath="..\CForward.h" RelativePath="..\CForward.h"
> >
@ -758,6 +770,14 @@
RelativePath="..\CVector.h" RelativePath="..\CVector.h"
> >
</File> </File>
<File
RelativePath="..\datastructs.cpp"
>
</File>
<File
RelativePath="..\datastructs.h"
>
</File>
<File <File
RelativePath="..\debugger.h" RelativePath="..\debugger.h"
> >
@ -778,10 +798,6 @@
RelativePath="..\md5.h" RelativePath="..\md5.h"
> >
</File> </File>
<File
RelativePath="..\menus.h"
>
</File>
<File <File
RelativePath="..\messages.h" RelativePath="..\messages.h"
> >
@ -798,6 +814,10 @@
RelativePath="..\newmenus.h" RelativePath="..\newmenus.h"
> >
</File> </File>
<File
RelativePath="..\nongpl_matches.h"
>
</File>
<File <File
RelativePath="..\optimizer.h" RelativePath="..\optimizer.h"
> >
@ -818,6 +838,10 @@
RelativePath="..\sh_tinyhash.h" RelativePath="..\sh_tinyhash.h"
> >
</File> </File>
<File
RelativePath="..\svn_version.h"
>
</File>
<File <File
RelativePath="..\zlib\zconf.h" RelativePath="..\zlib\zconf.h"
> >
@ -920,6 +944,118 @@
> >
</File> </File>
</Filter> </Filter>
<Filter
Name="Pawn Includes"
>
<File
RelativePath="..\..\plugins\include\amxconst.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmisc.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmodx.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\core.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\file.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\float.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\lang.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\message_const.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\message_stocks.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\messages.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\sorting.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\string.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\svn_version.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\time.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\vault.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\vector.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\xs.inc"
>
</File>
<Filter
Name="AMX Mod Compat"
>
<File
RelativePath="..\..\plugins\include\amxmod_compat\amxmod.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\maths.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\mysql.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\translator.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\Vexd_Utilities.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\VexdUM.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\VexdUM_const.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\VexdUM_stock.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\xtrafun.inc"
>
</File>
</Filter>
</Filter>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>

View File

@ -46,12 +46,16 @@
//With the exception for param_convert, which was written by //With the exception for param_convert, which was written by
// Julien "dJeyL" Laurent // Julien "dJeyL" Laurent
CStack<int> g_ErrorStk;
CVector<regnative *> g_RegNatives; CVector<regnative *> g_RegNatives;
CStack<regnative *> g_NativeStack;
static char g_errorStr[512] = {0}; static char g_errorStr[512] = {0};
bool g_Initialized = false; bool g_Initialized = false;
/* Stack stuff */
regnative *g_pCurNative = NULL;
AMX *g_pCaller = NULL;
cell g_Params[CALLFUNC_MAXPARAMS];
int g_CurError = AMX_ERR_NONE;
int amxx_DynaCallback(int idx, AMX *amx, cell *params) int amxx_DynaCallback(int idx, AMX *amx, cell *params)
{ {
if (idx < 0 || idx >= (int)g_RegNatives.size()) if (idx < 0 || idx >= (int)g_RegNatives.size())
@ -79,37 +83,55 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
return 0; return 0;
} }
if (pNative->caller) /* Save old values on ZE STACK */
AMX *pSaveCaller = g_pCaller;
cell saveParams[CALLFUNC_MAXPARAMS];
regnative *pSaveNative = g_pCurNative;
int saveError = g_CurError;
if (pSaveNative)
{ {
LogError(amx, AMX_ERR_NATIVE, "Bug caught! Please contact the AMX Mod X Dev Team."); for (ucell i = 0; i <= g_Params[0] / sizeof(cell); i++)
return 0; {
saveParams[i] = g_Params[i];
}
} }
//parameter stack /* Save current info */
//NOTE: it is possible that recursive register native calling g_CurError = AMX_ERR_NONE;
// could potentially be somehow damaged here. g_pCaller = amx;
//so, a :TODO: - make the stack unique, rather than a known ptr g_pCurNative = pNative;
pNative->caller = amx;
int err = 0; int err = 0;
cell ret = 0; cell ret = 0;
g_ErrorStk.push(0);
g_NativeStack.push(pNative);
if (pNative->style == 0) if (pNative->style == 0)
{ {
amx_Push(pNative->amx, numParams); amx_Push(pNative->amx, numParams);
amx_Push(pNative->amx, pPlugin->getId()); amx_Push(pNative->amx, pPlugin->getId());
for (int i=numParams; i>=0; i--) for (int i=numParams; i>=0; i--)
pNative->params[i] = params[i]; {
g_Params[i] = params[i];
}
} else if (pNative->style == 1) { } else if (pNative->style == 1) {
//use dJeyL's system .. very clever! /**
* use dJeyL's system .. very clever!
* NOTE: clever, but doesn't work at all since the JIT does bounds checking
* this should REALLY be deprecated
*/
for (int i=numParams; i>=1; i--) for (int i=numParams; i>=1; i--)
{
amx_Push(pNative->amx, params[i]); amx_Push(pNative->amx, params[i]);
} }
}
Debugger *pDebugger = (Debugger *)pNative->amx->userdata[UD_DEBUGGER]; Debugger *pDebugger = (Debugger *)pNative->amx->userdata[UD_DEBUGGER];
if (pDebugger) if (pDebugger)
{
pDebugger->BeginExec(); pDebugger->BeginExec();
}
err=amx_Exec(pNative->amx, &ret, pNative->func); err=amx_Exec(pNative->amx, &ret, pNative->func);
if (err != AMX_ERR_NONE) if (err != AMX_ERR_NONE)
{ {
if (pDebugger && pDebugger->ErrorExists()) if (pDebugger && pDebugger->ErrorExists())
@ -122,15 +144,26 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
pNative->amx->error = AMX_ERR_NONE; pNative->amx->error = AMX_ERR_NONE;
//furthermore, log an error in the parent plugin. //furthermore, log an error in the parent plugin.
LogError(amx, AMX_ERR_NATIVE, "Unhandled dynamic native error"); LogError(amx, AMX_ERR_NATIVE, "Unhandled dynamic native error");
} else if (g_ErrorStk.front()) { } else if (g_CurError != AMX_ERR_NONE) {
LogError(amx, g_ErrorStk.front(), g_errorStr); LogError(amx, g_CurError, g_errorStr);
} }
if (pDebugger)
pDebugger->EndExec();
g_NativeStack.pop();
g_ErrorStk.pop();
pNative->caller = NULL; if (pDebugger)
{
pDebugger->EndExec();
}
/* Restore everything */
g_pCurNative = pSaveNative;
g_CurError = saveError;
g_pCaller = pSaveCaller;
if (pSaveNative)
{
for (ucell i = 0; i <= saveParams[0] / sizeof(cell); i++)
{
g_Params[i] = saveParams[i];
}
}
return ret; return ret;
} }
@ -138,7 +171,9 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
AMX_NATIVE_INFO *BuildNativeTable() AMX_NATIVE_INFO *BuildNativeTable()
{ {
if (g_RegNatives.size() < 1) if (g_RegNatives.size() < 1)
{
return NULL; return NULL;
}
AMX_NATIVE_INFO *pNatives = new AMX_NATIVE_INFO[g_RegNatives.size() + 1]; AMX_NATIVE_INFO *pNatives = new AMX_NATIVE_INFO[g_RegNatives.size() + 1];
@ -164,8 +199,7 @@ static cell AMX_NATIVE_CALL log_error(AMX *amx, cell *params)
char *err = format_amxstring(amx, params, 2, len); char *err = format_amxstring(amx, params, 2, len);
_snprintf(g_errorStr, sizeof(g_errorStr), "%s", err); _snprintf(g_errorStr, sizeof(g_errorStr), "%s", err);
g_ErrorStk.pop(); g_CurError = params[1];
g_ErrorStk.push(params[1]);
return 1; return 1;
} }
@ -173,13 +207,12 @@ static cell AMX_NATIVE_CALL log_error(AMX *amx, cell *params)
//get_string(param, dest[], len) //get_string(param, dest[], len)
static cell AMX_NATIVE_CALL get_string(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_string(AMX *amx, cell *params)
{ {
if (!g_NativeStack.size()) if (!g_pCurNative || (g_pCurNative->amx != amx))
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
regnative *pNative = g_NativeStack.front(); if (g_pCurNative->style)
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
@ -187,20 +220,19 @@ static cell AMX_NATIVE_CALL get_string(AMX *amx, cell *params)
int p = params[1]; int p = params[1];
int len; int len;
char *str = get_amxstring(pNative->caller, pNative->params[p], 0, len); char *str = get_amxstring(g_pCaller, g_Params[p], 0, len);
return set_amxstring(amx, params[2], str, params[3]); return set_amxstring(amx, params[2], str, params[3]);
} }
//set_string(param, source[], maxlen) //set_string(param, source[], maxlen)
static cell AMX_NATIVE_CALL set_string(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_string(AMX *amx, cell *params)
{ {
if (!g_NativeStack.size()) if (!g_pCurNative || (g_pCurNative->amx != amx))
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
regnative *pNative = g_NativeStack.front(); if (g_pCurNative->style)
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
@ -210,46 +242,44 @@ static cell AMX_NATIVE_CALL set_string(AMX *amx, cell *params)
int len; int len;
char *str = get_amxstring(amx, params[2], 0, len); char *str = get_amxstring(amx, params[2], 0, len);
return set_amxstring(pNative->caller, pNative->params[p], str, params[3]); return set_amxstring(g_pCaller, g_Params[p], str, params[3]);
} }
//get a byvalue parameter //get a byvalue parameter
//get_param(num) //get_param(num)
static cell AMX_NATIVE_CALL get_param(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_param(AMX *amx, cell *params)
{ {
if (!g_NativeStack.size()) if (!g_pCurNative || (g_pCurNative->amx != amx))
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
regnative *pNative = g_NativeStack.front(); if (g_pCurNative->style)
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
int p = params[1]; int p = params[1];
return pNative->params[p]; return g_Params[p];
} }
//get_param_byref(num) //get_param_byref(num)
static cell AMX_NATIVE_CALL get_param_byref(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_param_byref(AMX *amx, cell *params)
{ {
if (!g_NativeStack.size()) if (!g_pCurNative || (g_pCurNative->amx != amx))
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
regnative *pNative = g_NativeStack.front(); if (g_pCurNative->style)
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
int p = params[1]; int p = params[1];
cell *addr = get_amxaddr(pNative->caller, pNative->params[p]); cell *addr = get_amxaddr(g_pCaller, g_Params[p]);
return addr[0]; return addr[0];
} }
@ -257,20 +287,19 @@ static cell AMX_NATIVE_CALL get_param_byref(AMX *amx, cell *params)
//set_param_byref(num, val) //set_param_byref(num, val)
static cell AMX_NATIVE_CALL set_param_byref(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_param_byref(AMX *amx, cell *params)
{ {
if (!g_NativeStack.size()) if (!g_pCurNative || (g_pCurNative->amx != amx))
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
regnative *pNative = g_NativeStack.front(); if (g_pCurNative->style)
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
int p = params[1]; int p = params[1];
cell *addr = get_amxaddr(pNative->caller, pNative->params[p]); cell *addr = get_amxaddr(g_pCaller, g_Params[p]);
addr[0] = params[2]; addr[0] = params[2];
@ -280,20 +309,19 @@ static cell AMX_NATIVE_CALL set_param_byref(AMX *amx, cell *params)
//get_array(param, dest[], size) //get_array(param, dest[], size)
static cell AMX_NATIVE_CALL get_array(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_array(AMX *amx, cell *params)
{ {
if (!g_NativeStack.size()) if (!g_pCurNative || (g_pCurNative->amx != amx))
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
regnative *pNative = g_NativeStack.front(); if (g_pCurNative->style)
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
int p = params[1]; int p = params[1];
cell *source = get_amxaddr(pNative->caller, pNative->params[p]); cell *source = get_amxaddr(g_pCaller, g_Params[p]);
cell *dest = get_amxaddr(amx, params[2]); cell *dest = get_amxaddr(amx, params[2]);
int size = params[3]; int size = params[3];
@ -306,20 +334,19 @@ static cell AMX_NATIVE_CALL get_array(AMX *amx, cell *params)
//set_array(param, source[], size) //set_array(param, source[], size)
static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
{ {
if (!g_NativeStack.size()) if (!g_pCurNative || (g_pCurNative->amx != amx))
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
regnative *pNative = g_NativeStack.front(); if (g_pCurNative->style)
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
int p = params[1]; int p = params[1];
cell *dest = get_amxaddr(pNative->caller, pNative->params[p]); cell *dest = get_amxaddr(g_pCaller, g_Params[p]);
cell *source = get_amxaddr(amx, params[2]); cell *source = get_amxaddr(amx, params[2]);
int size = params[3]; int size = params[3];
@ -331,15 +358,13 @@ static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params) static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
{ {
if (!g_NativeStack.size()) if (!g_pCurNative || (g_pCurNative->amx != amx))
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
regnative *pNative = g_NativeStack.front(); if (g_pCurNative->style)
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
@ -348,10 +373,7 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
int vargPos = static_cast<int>(params[4]); int vargPos = static_cast<int>(params[4]);
int fargPos = static_cast<int>(params[3]); int fargPos = static_cast<int>(params[3]);
/** get the parent parameter array */ cell max = g_Params[0] / sizeof(cell);
cell *local_params = pNative->params;
cell max = local_params[0] / sizeof(cell);
if (vargPos > (int)max + 1) if (vargPos > (int)max + 1)
{ {
LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos); LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos);
@ -374,7 +396,7 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
} }
fmt = get_amxaddr(amx, params[5]); fmt = get_amxaddr(amx, params[5]);
} else { } else {
fmt = get_amxaddr(pNative->caller, pNative->params[fargPos]); fmt = get_amxaddr(g_pCaller, g_Params[fargPos]);
} }
cell *realdest = get_amxaddr(amx, params[1]); cell *realdest = get_amxaddr(amx, params[1]);
size_t maxlen = static_cast<size_t>(params[2]); size_t maxlen = static_cast<size_t>(params[2]);
@ -385,7 +407,7 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
dest = cpbuf; dest = cpbuf;
/* perform format */ /* perform format */
size_t total = atcprintf(dest, maxlen, fmt, pNative->caller, local_params, &vargPos); size_t total = atcprintf(dest, maxlen, fmt, g_pCaller, g_Params, &vargPos);
/* copy back */ /* copy back */
memcpy(realdest, dest, (total+1) * sizeof(cell)); memcpy(realdest, dest, (total+1) * sizeof(cell));
@ -399,20 +421,19 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
//I've no idea how he thought of this, but it's great. No idea how well it works. //I've no idea how he thought of this, but it's great. No idea how well it works.
static cell AMX_NATIVE_CALL param_convert(AMX *amx, cell *params) static cell AMX_NATIVE_CALL param_convert(AMX *amx, cell *params)
{ {
if (!g_NativeStack.size()) if (!g_pCurNative || (g_pCurNative->amx != amx))
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
regnative *pNative = g_NativeStack.front(); if (g_pCurNative->style != 1)
if (pNative->style != 1)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
cell p = params[1]; cell p = params[1];
AMX *caller = pNative->caller; AMX *caller = g_pCaller;
unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat; unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat;
unsigned char *realdata = caller->base+(int)((AMX_HEADER *)caller->base)->dat; unsigned char *realdata = caller->base+(int)((AMX_HEADER *)caller->base)->dat;
@ -454,7 +475,6 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
regnative *pNative = new regnative; regnative *pNative = new regnative;
pNative->amx = amx; pNative->amx = amx;
pNative->func = idx; pNative->func = idx;
pNative->caller = NULL;
//we'll apply a safety buffer too //we'll apply a safety buffer too
//make our function //make our function

View File

@ -50,9 +50,7 @@ struct regnative
String name; String name;
char *pfn; char *pfn;
int func; int func;
AMX *caller;
int style; int style;
cell params[CALLFUNC_MAXPARAMS];
}; };
extern "C" void amxx_DynaInit(void *ptr); extern "C" void amxx_DynaInit(void *ptr);

View File

@ -29,6 +29,7 @@
*/ */
#include "amxmodx.h" #include "amxmodx.h"
#include "CMenu.h"
#include "newmenus.h" #include "newmenus.h"
CVector<Menu *> g_NewMenus; CVector<Menu *> g_NewMenus;
@ -37,12 +38,16 @@ CStack<int> g_MenuFreeStack;
void ClearMenus() void ClearMenus()
{ {
for (size_t i = 0; i < g_NewMenus.size(); i++) for (size_t i = 0; i < g_NewMenus.size(); i++)
{
delete g_NewMenus[i]; delete g_NewMenus[i];
}
g_NewMenus.clear(); g_NewMenus.clear();
while (!g_MenuFreeStack.empty()) while (!g_MenuFreeStack.empty())
{
g_MenuFreeStack.pop(); g_MenuFreeStack.pop();
} }
}
void validate_menu_text(char *str) void validate_menu_text(char *str)
{ {
@ -64,42 +69,51 @@ void validate_menu_text(char *str)
} }
} }
if (offs) if (offs)
{
*(str-offs) = *str; *(str-offs) = *str;
}
str++; str++;
} }
if (offs) if (offs)
{
*(str-offs) = '\0'; *(str-offs) = '\0';
} }
} }
}
Menu::Menu(const char *title, int mid, int tid) Menu::Menu(const char *title, AMX *amx, int fid) : m_Title(title), m_ItemColor("\\r"),
m_NeverExit(false), m_AutoColors(g_coloredmenus), thisId(0), func(fid),
isDestroying(false), items_per_page(7)
{ {
m_Title.assign(title); CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx);
menuId = mid; menuId = g_menucmds.registerMenuId(title, amx);
thisId = tid;
if (strcmp(pPlugin->getName(), "war3ft.amxx") == 0)
{
const char *version = pPlugin->getVersion();
if (strncmp(pPlugin->getVersion(), "3.0 RC", 6) == 0
&& atoi(&version[6]) <= 8)
{
g_menucmds.registerMenuCmd(
g_plugins.findPluginFast(amx),
menuId,
-1,
g_forwards.duplicateSPForward(fid),
true);
}
}
m_OptNames[abs(MENU_BACK)].assign("Back"); m_OptNames[abs(MENU_BACK)].assign("Back");
m_OptNames[abs(MENU_MORE)].assign("More"); m_OptNames[abs(MENU_MORE)].assign("More");
m_OptNames[abs(MENU_EXIT)].assign("Exit"); m_OptNames[abs(MENU_EXIT)].assign("Exit");
m_OptOrders[0] = MENU_BACK;
m_OptOrders[1] = MENU_MORE;
m_OptOrders[2] = MENU_EXIT;
m_AlwaysExit = false;
m_NeverExit = false;
m_AutoColors = g_coloredmenus;
items_per_page = 7;
func = 0;
padding = 0;
isDestroying = false;
} }
Menu::~Menu() Menu::~Menu()
{ {
for (size_t i = 0; i < m_Items.size(); i++) for (size_t i = 0; i < m_Items.size(); i++)
{
delete m_Items[i]; delete m_Items[i];
}
unregisterSPForward(this->func); unregisterSPForward(this->func);
@ -139,7 +153,9 @@ size_t Menu::GetPageCount()
{ {
size_t items = GetItemCount(); size_t items = GetItemCount();
if (items_per_page == 0) if (items_per_page == 0)
{
return 1; return 1;
}
return ((items/items_per_page) + ((items % items_per_page) ? 1 : 0)); return ((items/items_per_page) + ((items % items_per_page) ? 1 : 0));
} }
@ -152,34 +168,123 @@ int Menu::PagekeyToItem(page_t page, item_t key)
if (num_pages == 1 || !items_per_page) if (num_pages == 1 || !items_per_page)
{ {
if (key > m_Items.size()) if (key > m_Items.size())
{
return MENU_EXIT; return MENU_EXIT;
else } else {
return key-1; return key-1;
}
} else { } else {
//first page //first page
if (page == 0) if (page == 0)
{ {
if (key == items_per_page + 1) /* The algorithm for spaces here is same as a middle page. */
return MENU_MORE; item_t new_key = key;
else if (key == items_per_page + 2) for (size_t i=start; i<(start+key-1) && i<m_Items.size(); i++)
return MENU_EXIT;
else
return (start + key - 1);
} else if (page == num_pages - 1) {
//last page
size_t remaining = m_Items.size() - start;
if (key == remaining + 1)
{ {
return MENU_BACK; for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
} else if (key == remaining + 2) { {
if (m_Items[i]->blanks[j] == 1)
{
if (!new_key)
{
break;
}
new_key--;
}
if (!new_key)
{
break;
}
}
}
key = new_key;
if (key == items_per_page + 2)
{
return MENU_MORE;
} else if (key == items_per_page + 3) {
return MENU_EXIT; return MENU_EXIT;
} else { } else {
return (start + key - 1); return (start + key - 1);
} }
} else if (page == num_pages - 1) {
//last page
item_t item_tracker = 0; // tracks how many valid items we have passed so far.
size_t remaining = m_Items.size() - start;
item_t new_key = key;
// For every item that takes up a slot (item or padded blank)
// we subtract one from new key.
// For every item (not blanks), we increase item_tracker.
// When new_key equals 0, item_tracker will then be set to
// whatever valid item was selected.
for (size_t i=m_Items.size() - remaining; i<m_Items.size(); i++)
{
item_tracker++;
if (new_key<=1) // If new_key is 0, or will be 0 after the next decrease
{
new_key=0;
break;
}
new_key--;
for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
{
if (m_Items[i]->blanks[j] == 1)
{
new_key--;
}
if (!new_key)
{
break;
}
}
}
// If new_key doesn't equal zero, then a back/exit button was pressed.
if (new_key!=0)
{
if (key == items_per_page + 1)
{
return MENU_BACK;
}
else if (key == items_per_page + 3)
{
return MENU_EXIT;
}
// MENU_MORE should never happen here.
}
// otherwise our item is now start + item_tracker - 1
return (start + item_tracker - 1);
} else { } else {
/* The algorithm for spaces here is a bit harder. We have to subtract
* one from the key for each space we find along the way.
*/
item_t new_key = key;
for (size_t i=start; i<(start+items_per_page-1) && i<m_Items.size(); i++)
{
for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
{
if (m_Items[i]->blanks[j] == 1)
{
if (!new_key)
{
break;
}
new_key--;
}
if (!new_key)
{
break;
}
}
}
key = new_key;
if (key > items_per_page && (key-items_per_page<=3)) if (key > items_per_page && (key-items_per_page<=3))
{ {
return m_OptOrders[key-items_per_page-1]; unsigned int num = key - items_per_page - 1;
static int map[] = {MENU_BACK, MENU_MORE, MENU_EXIT};
return map[num];
} else { } else {
return (start + key - 1); return (start + key - 1);
} }
@ -240,10 +345,10 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
{ {
Display_Back = (1<<0), Display_Back = (1<<0),
Display_Next = (1<<1), Display_Next = (1<<1),
Display_Exit = (1<<2),
}; };
int flags = Display_Back|Display_Next; int flags = Display_Back|Display_Next;
item_t start = page * items_per_page; item_t start = page * items_per_page;
item_t end = 0; item_t end = 0;
if (items_per_page) if (items_per_page)
@ -255,17 +360,18 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
} else { } else {
end = start + items_per_page - 1; end = start + items_per_page - 1;
} }
if (!m_NeverExit && (m_AlwaysExit || (page == 0 || page == pages-1)))
flags |= Display_Exit;
} else { } else {
end = numItems - 1; end = numItems - 1;
if (end > 10) if (end > 10)
{
end = 10; end = 10;
flags = 0; }
} }
if (page == 0) if (page == 0)
{
flags &= ~Display_Back; flags &= ~Display_Back;
}
menuitem *pItem = NULL; menuitem *pItem = NULL;
@ -274,46 +380,66 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
bool enabled = true; bool enabled = true;
int ret = 0; int ret = 0;
int slots = 0; int slots = 0;
int option_display = 0;
for (item_t i = start; i <= end; i++) for (item_t i = start; i <= end; i++)
{ {
// reset enabled
enabled = true;
pItem = m_Items[i]; pItem = m_Items[i];
if (pItem->access && !(pItem->access & g_players[player].flags[0])) if (pItem->access && !(pItem->access & g_players[player].flags[0]))
{
enabled = false; enabled = false;
}
if (pItem->handler != -1) if (pItem->handler != -1)
{ {
ret = executeForwards(pItem->handler, static_cast<cell>(player), static_cast<cell>(thisId), static_cast<cell>(i)); ret = executeForwards(pItem->handler, static_cast<cell>(player), static_cast<cell>(thisId), static_cast<cell>(i));
if (ret == ITEM_ENABLED) if (ret == ITEM_ENABLED)
{
enabled = true; enabled = true;
else if (ret == ITEM_DISABLED) } else if (ret == ITEM_DISABLED) {
enabled = false; enabled = false;
} }
}
if (pItem->pfn) if (pItem->pfn)
{ {
ret = (pItem->pfn)(player, thisId, i); ret = (pItem->pfn)(player, thisId, i);
if (ret == ITEM_ENABLED) if (ret == ITEM_ENABLED)
{
enabled = true; enabled = true;
else if (ret == ITEM_DISABLED) } else if (ret == ITEM_DISABLED) {
enabled = false; enabled = false;
} }
}
if (enabled) if (enabled)
{ {
keys |= (1<<option); keys |= (1<<option);
}
option_display = ++option;
if (option_display == 10)
{
option_display = 0;
}
if (enabled)
{
if (m_AutoColors) if (m_AutoColors)
_snprintf(buffer, sizeof(buffer)-1, "\\r%d.\\w %s\n", ++option, pItem->name.c_str()); {
else _snprintf(buffer, sizeof(buffer)-1, "%s%d.\\w %s\n", m_ItemColor.c_str(),option_display, pItem->name.c_str());
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", ++option, pItem->name.c_str()); } else {
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", option_display, pItem->name.c_str());
}
} else { } else {
if (m_AutoColors) if (m_AutoColors)
{ {
_snprintf(buffer, sizeof(buffer)-1, "\\d%d. %s\n\\w", ++option, pItem->name.c_str()); _snprintf(buffer, sizeof(buffer)-1, "\\d%d. %s\n\\w", option_display, pItem->name.c_str());
} else { } else {
_snprintf(buffer, sizeof(buffer)-1, "#. %s\n", pItem->name.c_str()); _snprintf(buffer, sizeof(buffer)-1, "#. %s\n", pItem->name.c_str());
option++;
} }
} }
slots++; slots++;
@ -326,79 +452,119 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
for (size_t j=0; j<pItem->blanks.size(); j++) for (size_t j=0; j<pItem->blanks.size(); j++)
{ {
if (pItem->blanks[j] == 1) if (pItem->blanks[j] == 1)
{
option++; option++;
}
m_Text.append("\n"); m_Text.append("\n");
slots++; slots++;
} }
} }
} }
if (padding == 1 && items_per_page) if (items_per_page)
{ {
int pad = items_per_page; /* Pad spaces until we reach the end of the max possible items */
if (flags & Display_Back) for (unsigned int i=(unsigned)slots; i<items_per_page; i++)
pad--;
if (flags & Display_Next)
pad--;
if (flags & Display_Exit)
pad--;
for (int i=slots+1; i<=pad; i++)
{ {
m_Text.append("\n"); m_Text.append("\n");
option++; option++;
} }
} /* Make sure there is at least one visual pad */
m_Text.append("\n");
for (int i=0; i<3; i++) /* Don't bother if there is only one page */
{ if (pages > 1)
switch (m_OptOrders[i])
{
case MENU_BACK:
{ {
if (flags & Display_Back) if (flags & Display_Back)
{ {
keys |= (1<<option++); keys |= (1<<option++);
if (m_AutoColors)
{
_snprintf(buffer, _snprintf(buffer,
sizeof(buffer)-1, sizeof(buffer)-1,
m_AutoColors ? "\\r%d. \\w%s\n" : "%d. %s\n", "%s%d. \\w%s\n",
option, m_ItemColor.c_str(),
m_OptNames[abs(MENU_BACK)].c_str() option == 10 ? 0 : option,
); m_OptNames[abs(MENU_BACK)].c_str());
m_Text.append(buffer); } else {
_snprintf(buffer,
sizeof(buffer)-1,
"%d. %s\n",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_BACK)].c_str());
} }
break; } else {
} option++;
case MENU_MORE: if (m_AutoColors)
{ {
_snprintf(buffer,
sizeof(buffer)-1,
"\\d%d. %s\n\\w",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_BACK)].c_str());
} else {
_snprintf(buffer, sizeof(buffer)-1, "#. %s\n", m_OptNames[abs(MENU_BACK)].c_str());
}
}
m_Text.append(buffer);
if (flags & Display_Next) if (flags & Display_Next)
{ {
keys |= (1<<option++); keys |= (1<<option++);
if (m_AutoColors)
{
_snprintf(buffer, _snprintf(buffer,
sizeof(buffer)-1, sizeof(buffer)-1,
m_AutoColors ? "\\r%d. \\w%s\n" : "%d. %s\n", "%s%d. \\w%s\n",
option, m_ItemColor.c_str(),
m_OptNames[abs(MENU_MORE)].c_str() option == 10 ? 0 : option,
); m_OptNames[abs(MENU_MORE)].c_str());
m_Text.append(buffer); } else {
_snprintf(buffer,
sizeof(buffer)-1,
"%d. %s\n",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_MORE)].c_str());
} }
break; } else {
} option++;
case MENU_EXIT: if (m_AutoColors)
{ {
if (flags & Display_Exit) _snprintf(buffer,
sizeof(buffer)-1,
"\\d%d. %s\n\\w",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_MORE)].c_str());
} else {
_snprintf(buffer, sizeof(buffer)-1, "#. %s\n", m_OptNames[abs(MENU_MORE)].c_str());
}
}
m_Text.append(buffer);
} else {
/* Keep padding */
option += 2;
}
if (!m_NeverExit)
{ {
keys |= (1<<option++); keys |= (1<<option++);
if (m_AutoColors)
{
_snprintf(buffer, _snprintf(buffer,
sizeof(buffer)-1, sizeof(buffer)-1,
m_AutoColors ? "\\r%d. \\w%s\n" : "%d. %s\n", "%s%d. \\w%s\n",
option, m_ItemColor.c_str(),
m_OptNames[abs(MENU_EXIT)].c_str() option == 10 ? 0 : option,
); m_OptNames[abs(MENU_EXIT)].c_str());
} else {
_snprintf(buffer,
sizeof(buffer)-1,
"%d. %s\n",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_EXIT)].c_str());
}
m_Text.append(buffer); m_Text.append(buffer);
} }
break;
}
}
} }
return m_Text.c_str(); return m_Text.c_str();
@ -426,25 +592,20 @@ static cell AMX_NATIVE_CALL menu_create(AMX *amx, cell *params)
return 0; return 0;
} }
int id = g_menucmds.registerMenuId(title, amx); Menu *pMenu = new Menu(title, amx, func);
g_menucmds.registerMenuCmd(g_plugins.findPluginFast(amx), id, 1023, func);
Menu *pMenu = new Menu(title, id, 0);
pMenu->func = func;
if (g_MenuFreeStack.empty()) if (g_MenuFreeStack.empty())
{ {
g_NewMenus.push_back(pMenu); g_NewMenus.push_back(pMenu);
pMenu->thisId = (int)g_NewMenus.size() - 1; pMenu->thisId = (int)g_NewMenus.size() - 1;
return (int)g_NewMenus.size() - 1;
} else { } else {
int pos = g_MenuFreeStack.front(); int pos = g_MenuFreeStack.front();
g_MenuFreeStack.pop(); g_MenuFreeStack.pop();
g_NewMenus[pos] = pMenu; g_NewMenus[pos] = pMenu;
pMenu->thisId = pos; pMenu->thisId = pos;
return pos;
} }
return pMenu->thisId;
} }
static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params) static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params)
@ -524,6 +685,36 @@ static cell AMX_NATIVE_CALL menu_display(AMX *amx, cell *params)
int page = params[3]; int page = params[3];
CPlayer* pPlayer = GET_PLAYER_POINTER_I(player); CPlayer* pPlayer = GET_PLAYER_POINTER_I(player);
/* If the stupid handler keeps drawing menus,
* We need to keep cancelling them. But we put in a quick infinite loop
* counter to prevent this from going nuts.
*/
int menu;
int loops = 0;
while ((menu = pPlayer->newmenu) >= 0)
{
if ((size_t)menu >= g_NewMenus.size() || !g_NewMenus[menu])
{
break;
}
Menu *pOther = g_NewMenus[menu];
pPlayer->newmenu = -1;
pPlayer->menu = 0;
executeForwards(pOther->func,
static_cast<cell>(player),
static_cast<cell>(pOther->thisId),
static_cast<cell>(MENU_EXIT));
/* Infinite loop counter */
if (++loops >= 10)
{
LogError(amx, AMX_ERR_NATIVE, "Plugin called menu_display when item=MENU_EXIT");
return 0;
}
}
// This will set the expire time of the menu to infinite // This will set the expire time of the menu to infinite
pPlayer->menuexpire = INFINITE; pPlayer->menuexpire = INFINITE;
@ -652,6 +843,13 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
switch (params[2]) switch (params[2])
{ {
case MPROP_SET_NUMBER_COLOR:
{
char *str = get_amxstring(amx, params[3], 0, len);
validate_menu_text(str);
pMenu->m_ItemColor.assign(str);
break;
}
case MPROP_PERPAGE: case MPROP_PERPAGE:
{ {
cell count = *get_amxaddr(amx, params[3]); cell count = *get_amxaddr(amx, params[3]);
@ -687,51 +885,23 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
case MPROP_TITLE: case MPROP_TITLE:
{ {
char *str = get_amxstring(amx, params[3], 0, len); char *str = get_amxstring(amx, params[3], 0, len);
int old = pMenu->menuId;
g_menucmds.removeMenuId(old);
pMenu->m_Title.assign(str); pMenu->m_Title.assign(str);
pMenu->menuId = g_menucmds.registerMenuId(str, amx);
g_menucmds.registerMenuCmd(
g_plugins.findPluginFast(amx),
pMenu->menuId,
1023,
pMenu->func);
CPlayer *pl;
/**
* NOTE - this is actually bogus
* the client's screen won't actually match the cmd here
* I think, this scenario needs to be tested.
*/
for (int i=1; i<=gpGlobals->maxClients; i++)
{
pl = GET_PLAYER_POINTER_I(i);
if (pl->menu == old)
pl->menu = pMenu->menuId;
}
break; break;
} }
case MPROP_EXITALL: case MPROP_EXITALL:
{ {
cell ans = *get_amxaddr(amx, params[3]); cell ans = *get_amxaddr(amx, params[3]);
if (ans == 1) if (ans == 1 || ans == 0)
{ {
pMenu->m_AlwaysExit = true;
pMenu->m_NeverExit = false;
} else if (ans == 0) {
pMenu->m_AlwaysExit = false;
pMenu->m_NeverExit = false; pMenu->m_NeverExit = false;
} else if (ans == -1) { } else if (ans == -1) {
pMenu->m_NeverExit = true; pMenu->m_NeverExit = true;
pMenu->m_AlwaysExit = false;
} }
break; break;
} }
case MPROP_ORDER: case MPROP_ORDER:
{ {
cell *addr = get_amxaddr(amx, params[3]); /* Ignored as of 1.8.0 */
pMenu->m_OptOrders[0] = addr[0];
pMenu->m_OptOrders[1] = addr[1];
pMenu->m_OptOrders[2] = addr[2];
break; break;
} }
case MPROP_NOCOLORS: case MPROP_NOCOLORS:
@ -741,7 +911,7 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
} }
case MPROP_PADMENU: case MPROP_PADMENU:
{ {
pMenu->padding = *get_amxaddr(amx, params[3]); /* Ignored as of 1.8.0 */
break; break;
} }
default: default:
@ -797,10 +967,12 @@ static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
GETMENU_R(params[1]); GETMENU_R(params[1]);
if (pMenu->isDestroying) if (pMenu->isDestroying)
{
return 0; //prevent infinite recursion return 0; //prevent infinite recursion
}
pMenu->isDestroying = true; pMenu->isDestroying = true;
g_menucmds.removeMenuId(pMenu->menuId);
CPlayer *player; CPlayer *player;
for (int i=1; i<=gpGlobals->maxClients; i++) for (int i=1; i<=gpGlobals->maxClients; i++)
{ {
@ -843,8 +1015,16 @@ static cell AMX_NATIVE_CALL player_menu_info(AMX *amx, cell *params)
*m = player->menu; *m = player->menu;
*n = player->newmenu; *n = player->newmenu;
if (params[0] / sizeof(cell) == 4)
{
cell *addr = get_amxaddr(amx, params[4]);
*addr = player->page;
}
if ( (*m != 0 && *m != -1) || (*n != -1)) if ( (*m != 0 && *m != -1) || (*n != -1))
{
return 1; return 1;
}
return 0; return 0;
} }

View File

@ -39,6 +39,7 @@
#define ITEM_ENABLED 1 #define ITEM_ENABLED 1
#define ITEM_DISABLED 2 #define ITEM_DISABLED 2
#define MAX_MENU_ITEMS 10
#define MPROP_PERPAGE 1 #define MPROP_PERPAGE 1
#define MPROP_BACKNAME 2 #define MPROP_BACKNAME 2
@ -49,6 +50,7 @@
#define MPROP_ORDER 7 #define MPROP_ORDER 7
#define MPROP_NOCOLORS 8 #define MPROP_NOCOLORS 8
#define MPROP_PADMENU 9 #define MPROP_PADMENU 9
#define MPROP_SET_NUMBER_COLOR 10
typedef int (*MENUITEM_CALLBACK)(int, int, int); typedef int (*MENUITEM_CALLBACK)(int, int, int);
@ -73,7 +75,7 @@ typedef unsigned int page_t;
class Menu class Menu
{ {
public: public:
Menu(const char *title, int menuId, int thisId); Menu(const char *title, AMX *amx, int fid);
~Menu(); ~Menu();
menuitem *GetMenuItem(item_t item); menuitem *GetMenuItem(item_t item);
@ -92,16 +94,14 @@ public:
String m_Text; String m_Text;
String m_OptNames[4]; String m_OptNames[4];
int m_OptOrders[3];
bool m_AlwaysExit; String m_ItemColor;
bool m_NeverExit; bool m_NeverExit;
bool m_AutoColors; bool m_AutoColors;
int menuId; int menuId;
int thisId; int thisId;
int func; int func;
int padding;
bool isDestroying; bool isDestroying;
public: public:
unsigned int items_per_page; unsigned int items_per_page;

View File

@ -0,0 +1,23 @@
#include <string.h>
#include "nongpl_matches.h"
NONGPL_PLUGIN_T NONGPL_PLUGIN_LIST[] =
{
{"Live", "CZ Gun Game", "czgungame.amxx"},
{"Live", "AMXX Gun Game", "czgungame.amxx"},
{NULL, NULL, NULL},
};
NONGPL_CVAR_T NONGPL_CVAR_LIST[] =
{
{"gg_mode", 0},
{"gg_warmuptimer", 0},
{"gg_ff", 0},
{"gg_fflevel", 0},
{"gg_stats", 0},
{"gg_dm", 0},
{"gg_turbo", 0},
{"amx_ggreset", 1},
{"amx_gg", 1},
{NULL, 0},
};

51
amxmodx/nongpl_matches.h Normal file
View File

@ -0,0 +1,51 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* 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, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
#ifndef _INCLUDE_AMXMODX_NONGPL_MATCHES_H_
#define _INCLUDE_AMXMODX_NONGPL_MATCHES_H_
struct NONGPL_PLUGIN_T
{
const char *author;
const char *title;
const char *filename;
};
struct NONGPL_CVAR_T
{
const char *cvar;
int type;
};
extern NONGPL_PLUGIN_T NONGPL_PLUGIN_LIST[];
extern NONGPL_CVAR_T NONGPL_CVAR_LIST[];
#endif //_INCLUDE_AMXMODX_NONGPL_MATCHES_H_

View File

@ -2284,7 +2284,7 @@ C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_
} }
#ifdef FN_META_QUERY #ifdef FN_META_QUERY
return FN_META_QUERY(); FN_META_QUERY();
#endif // FN_META_QUERY #endif // FN_META_QUERY
return 1; return 1;
@ -2327,7 +2327,7 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
} }
#ifdef FN_META_DETACH #ifdef FN_META_DETACH
return FN_META_DETACH(); FN_META_DETACH();
#endif // FN_META_DETACH #endif // FN_META_DETACH
return TRUE; return TRUE;
} }
@ -2374,7 +2374,7 @@ C_DLLEXPORT void __stdcall GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine,
gpGlobals = pGlobals; gpGlobals = pGlobals;
// NOTE! Have to call logging function _after_ copying into g_engfuncs, so // NOTE! Have to call logging function _after_ copying into g_engfuncs, so
// that g_engfuncs.pfnAlertMessage() can be resolved properly, heh. :) // that g_engfuncs.pfnAlertMessage() can be resolved properly, heh. :)
UTIL_LogPrintf("[%s] dev: called: GiveFnptrsToDll\n", Plugin_info.logtag); // UTIL_LogPrintf("[%s] dev: called: GiveFnptrsToDll\n", Plugin_info.logtag);
// --> ** Function core // --> ** Function core
#ifdef _MSC_VER #ifdef _MSC_VER

View File

@ -1077,7 +1077,7 @@ void FN_AlertMessage(ALERT_TYPE atype, char *szFmt, ...);
#endif // FN_AlertMessage #endif // FN_AlertMessage
#ifdef FN_EngineFprintf #ifdef FN_EngineFprintf
void FN_EngineFprintf(FILE *pfile, char *szFmt, ...); void FN_EngineFprintf(void *pfile, char *szFmt, ...);
#endif // FN_EngineFprintf #endif // FN_EngineFprintf
#ifdef FN_PvAllocEntPrivateData #ifdef FN_PvAllocEntPrivateData
@ -1141,11 +1141,11 @@ void FN_GetBonePosition(const edict_t *pEdict, int iBone, float *rgflOrigin, flo
#endif // FN_GetBonePosition #endif // FN_GetBonePosition
#ifdef FN_FunctionFromName #ifdef FN_FunctionFromName
unsigned long FN_FunctionFromName(const char *pName); uint32 FN_FunctionFromName(const char *pName);
#endif // FN_FunctionFromName #endif // FN_FunctionFromName
#ifdef FN_NameForFunction #ifdef FN_NameForFunction
const char *FN_NameForFunction(unsigned long function); const char *FN_NameForFunction(uint32);
#endif // FN_NameForFunction #endif // FN_NameForFunction
#ifdef FN_ClientPrintf #ifdef FN_ClientPrintf
@ -1189,7 +1189,7 @@ CRC32_t FN_CRC32_Final(CRC32_t pulCRC);
#endif // FN_CRC32_Final #endif // FN_CRC32_Final
#ifdef FN_RandomLong #ifdef FN_RandomLong
long FN_RandomLong(long lLow, long lHigh); int32 FN_RandomLong(int32 lLow, int32 lHigh);
#endif // FN_RandomLong #endif // FN_RandomLong
#ifdef FN_RandomFloat #ifdef FN_RandomFloat
@ -1658,11 +1658,11 @@ void FN_AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...);
#endif // FN_AlertMessage_Post #endif // FN_AlertMessage_Post
#ifdef FN_EngineFprintf_Post #ifdef FN_EngineFprintf_Post
void FN_EngineFprintf_Post(FILE *pfile, char *szFmt, ...); void FN_EngineFprintf_Post(void *pfile, char *szFmt, ...);
#endif // FN_EngineFprintf_Post #endif // FN_EngineFprintf_Post
#ifdef FN_PvAllocEntPrivateData_Post #ifdef FN_PvAllocEntPrivateData_Post
void *FN_PvAllocEntPrivateData_Post(edict_t *pEdict, long cb); void *FN_PvAllocEntPrivateData_Post(edict_t *pEdict, int32 cb);
#endif // FN_PvAllocEntPrivateData_Post #endif // FN_PvAllocEntPrivateData_Post
#ifdef FN_PvEntPrivateData_Post #ifdef FN_PvEntPrivateData_Post
@ -1722,11 +1722,11 @@ void FN_GetBonePosition_Post(const edict_t *pEdict, int iBone, float *rgflOrigin
#endif // FN_GetBonePosition_Post #endif // FN_GetBonePosition_Post
#ifdef FN_FunctionFromName_Post #ifdef FN_FunctionFromName_Post
unsigned long FN_FunctionFromName_Post(const char *pName); uint32 FN_FunctionFromName_Post(const char *pName);
#endif // FN_FunctionFromName_Post #endif // FN_FunctionFromName_Post
#ifdef FN_NameForFunction_Post #ifdef FN_NameForFunction_Post
const char *FN_NameForFunction_Post(unsigned long function); const char *FN_NameForFunction_Post(uint32);
#endif // FN_NameForFunction_Post #endif // FN_NameForFunction_Post
#ifdef FN_ClientPrintf_Post #ifdef FN_ClientPrintf_Post
@ -1770,7 +1770,7 @@ CRC32_t FN_CRC32_Final_Post(CRC32_t pulCRC);
#endif // FN_CRC32_Final_Post #endif // FN_CRC32_Final_Post
#ifdef FN_RandomLong_Post #ifdef FN_RandomLong_Post
long FN_RandomLong_Post(long lLow, long lHigh); int32 FN_RandomLong_Post(int32 lLow, int32 lHigh);
#endif // FN_RandomLong_Post #endif // FN_RandomLong_Post
#ifdef FN_RandomFloat_Post #ifdef FN_RandomFloat_Post

View File

@ -265,6 +265,7 @@ static cell AMX_NATIVE_CALL SortCustom1D(AMX *amx, cell *params)
qsort(array, array_size, sizeof(cell), sort1d_amx_custom); qsort(array, array_size, sizeof(cell), sort1d_amx_custom);
g_AMXSortStack.pop(); g_AMXSortStack.pop();
unregisterSPForward(pfn);
delete pInfo; delete pInfo;
return 1; return 1;

View File

@ -39,7 +39,7 @@ void amx_command()
{ {
print_srvconsole("Currently loaded plugins:\n"); print_srvconsole("Currently loaded plugins:\n");
print_srvconsole(" %-23.22s %-8.7s %-17.16s %-16.15s %-9.8s\n", "name", "version", "author", "file", "status"); print_srvconsole(" %-23.22s %-11.10s %-17.16s %-16.15s %-9.8s\n", "name", "version", "author", "file", "status");
int plugins = 0; int plugins = 0;
int running = 0; int running = 0;
@ -52,7 +52,7 @@ void amx_command()
if ((*a).isValid() && !(*a).isPaused()) if ((*a).isValid() && !(*a).isPaused())
++running; ++running;
print_srvconsole(" [%3d] %-23.22s %-8.7s %-17.16s %-16.15s %-9.8s\n", plugins, (*a).getTitle(), (*a).getVersion(), (*a).getAuthor(), (*a).getName(), (*a).getStatus()); print_srvconsole(" [%3d] %-23.22s %-11.10s %-17.16s %-16.15s %-9.8s\n", plugins, (*a).getTitle(), (*a).getVersion(), (*a).getAuthor(), (*a).getName(), (*a).getStatus());
++a; ++a;
} }
@ -82,13 +82,29 @@ void amx_command()
CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin); CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin);
if (plugin && plugin->isValid()) if (plugin && plugin->isValid())
{
if (plugin->isPaused())
{
if (plugin->isStopped())
{
print_srvconsole("Plugin \"%s\" is stopped and may not be paused.\n",plugin->getName());
}
else
{
print_srvconsole("Plugin \"%s\" is already paused.\n",plugin->getName());
}
}
else
{ {
plugin->pausePlugin(); plugin->pausePlugin();
print_srvconsole("Paused plugin \"%s\"\n", plugin->getName()); print_srvconsole("Paused plugin \"%s\"\n", plugin->getName());
} }
}
else else
{
print_srvconsole("Couldn't find plugin matching \"%s\"\n", sPlugin); print_srvconsole("Couldn't find plugin matching \"%s\"\n", sPlugin);
} }
}
else if (!strcmp(cmd, "unpause") && CMD_ARGC() > 2) else if (!strcmp(cmd, "unpause") && CMD_ARGC() > 2)
{ {
const char* sPlugin = CMD_ARGV(2); const char* sPlugin = CMD_ARGV(2);
@ -96,15 +112,22 @@ void amx_command()
CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin); CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin);
if (plugin && plugin->isValid() && plugin->isPaused()) if (plugin && plugin->isValid() && plugin->isPaused())
{
if (plugin->isStopped())
{
print_srvconsole("Plugin \"%s\" is stopped and may not be unpaused.\n", plugin->getName());
}
else
{ {
plugin->unpausePlugin(); plugin->unpausePlugin();
print_srvconsole("Unpaused plugin \"%s\"\n", plugin->getName()); print_srvconsole("Unpaused plugin \"%s\"\n", plugin->getName());
} }
}
else if (!plugin) else if (!plugin)
{ {
print_srvconsole("Couldn't find plugin matching \"%s\"\n", sPlugin); print_srvconsole("Couldn't find plugin matching \"%s\"\n", sPlugin);
} else { } else {
print_srvconsole("Plugin %s can't be unpaused right now.", sPlugin); print_srvconsole("Plugin %s can't be unpaused right now.\n", sPlugin);
} }
} }
else if (!strcmp(cmd, "cvars")) else if (!strcmp(cmd, "cvars"))
@ -114,10 +137,25 @@ void amx_command()
int ammount = 0; int ammount = 0;
if (CMD_ARGC() > 2) // Searching for cvars registered to a plugin
{
const char* targetname = CMD_ARGV(2);
size_t len = strlen(targetname);
for (CList<CCVar>::iterator a = g_cvars.begin(); a; ++a)
{
if (strncmp((*a).getPluginName(), targetname, len) == 0)
{
print_srvconsole(" [%3d] %-24.23s %-24.23s %-16.15s\n", ++ammount, (*a).getName(), CVAR_GET_STRING((*a).getName()), (*a).getPluginName());
}
}
}
else // No search
{
for (CList<CCVar>::iterator a = g_cvars.begin(); a; ++a) for (CList<CCVar>::iterator a = g_cvars.begin(); a; ++a)
{ {
print_srvconsole(" [%3d] %-24.23s %-24.23s %-16.15s\n", ++ammount, (*a).getName(), CVAR_GET_STRING((*a).getName()), (*a).getPluginName()); print_srvconsole(" [%3d] %-24.23s %-24.23s %-16.15s\n", ++ammount, (*a).getName(), CVAR_GET_STRING((*a).getName()), (*a).getPluginName());
} }
}
print_srvconsole("%d cvars\n", ammount); print_srvconsole("%d cvars\n", ammount);
} }
@ -131,13 +169,29 @@ void amx_command()
CmdMngr::iterator a = g_commands.begin(CMD_ConsoleCommand); CmdMngr::iterator a = g_commands.begin(CMD_ConsoleCommand);
if (CMD_ARGC() > 2) // Searching for commands registered to a plugin
{
const char* targetname = CMD_ARGV(2);
size_t len = strlen(targetname);
while (a)
{
if (strncmp((*a).getPlugin()->getName(), targetname, len) == 0)
{
UTIL_GetFlags(access, (*a).getFlags());
print_srvconsole(" [%3d] %-24.23s %-16.15s %-8.7s %-16.15s\n", ++ammount, (*a).getCmdLine(), access, (*a).getCmdType(), (*a).getPlugin()->getName());
}
++a;
}
}
else // No search
{
while (a) while (a)
{ {
UTIL_GetFlags(access, (*a).getFlags()); UTIL_GetFlags(access, (*a).getFlags());
print_srvconsole(" [%3d] %-24.23s %-16.15s %-8.7s %-16.15s\n", ++ammount, (*a).getCmdLine(), access, (*a).getCmdType(), (*a).getPlugin()->getName()); print_srvconsole(" [%3d] %-24.23s %-16.15s %-8.7s %-16.15s\n", ++ammount, (*a).getCmdLine(), access, (*a).getCmdType(), (*a).getPlugin()->getName());
++a; ++a;
} }
}
print_srvconsole("%d commands\n",ammount); print_srvconsole("%d commands\n",ammount);
} }
else if (!strcmp(cmd, "version")) else if (!strcmp(cmd, "version"))
@ -161,7 +215,7 @@ void amx_command()
else if (!strcmp(cmd, "modules")) else if (!strcmp(cmd, "modules"))
{ {
print_srvconsole("Currently loaded modules:\n"); print_srvconsole("Currently loaded modules:\n");
print_srvconsole(" %-23.22s %-8.7s %-20.19s %-11.10s\n", "name", "version", "author", "status"); print_srvconsole(" %-23.22s %-11.10s %-20.19s %-11.10s\n", "name", "version", "author", "status");
int running = 0; int running = 0;
int modules = 0; int modules = 0;
@ -174,7 +228,7 @@ void amx_command()
++running; ++running;
++modules; ++modules;
print_srvconsole(" [%2d] %-23.22s %-8.7s %-20.19s %-11.10s\n", modules, (*a).getName(), (*a).getVersion(), (*a).getAuthor(), (*a).getStatus()); print_srvconsole(" [%2d] %-23.22s %-11.10s %-20.19s %-11.10s\n", modules, (*a).getName(), (*a).getVersion(), (*a).getAuthor(), (*a).getStatus());
++a; ++a;
} }
@ -244,8 +298,8 @@ void amx_command()
print_srvconsole(" gpl - print the license\n"); print_srvconsole(" gpl - print the license\n");
print_srvconsole(" plugins - list plugins currently loaded\n"); print_srvconsole(" plugins - list plugins currently loaded\n");
print_srvconsole(" modules - list modules currently loaded\n"); print_srvconsole(" modules - list modules currently loaded\n");
print_srvconsole(" cvars - list cvars registered by plugins\n"); print_srvconsole(" cvars [ plugin ] - list cvars registered by plugins\n");
print_srvconsole(" cmds - list commands registered by plugins\n"); print_srvconsole(" cmds [ plugin ] - list commands registered by plugins\n");
print_srvconsole(" pause < plugin > - pause a running plugin\n"); print_srvconsole(" pause < plugin > - pause a running plugin\n");
print_srvconsole(" unpause < plugin > - unpause a previously paused plugin\n"); print_srvconsole(" unpause < plugin > - unpause a previously paused plugin\n");
} }

8
amxmodx/svn_version.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef _INCLUDE_SVN_VERSION_H_
#define _INCLUDE_SVN_VERSION_H_
#define SVN_VERSION_STRING "1.8.0.3660"
#define SVN_VERSION_DWORD 1,8,0,3660
#define SVN_VERSION_PRODUCT "1.8.0"
#endif //_INCLUDE_SVN_VERSION_H_

8
amxmodx/svn_version.tpl Normal file
View File

@ -0,0 +1,8 @@
#ifndef _INCLUDE_SVN_VERSION_H_
#define _INCLUDE_SVN_VERSION_H_
#define SVN_VERSION_STRING "$PMAJOR$.$PMINOR$.$PREVISION$.$GLOBAL_BUILD$"
#define SVN_VERSION_DWORD $PMAJOR$,$PMINOR$,$PREVISION$,$GLOBAL_BUILD$
#define SVN_VERSION_PRODUCT "$PMAJOR$.$PMINOR$.$PREVISION$"
#endif //_INCLUDE_SVN_VERSION_H_

View File

@ -1,13 +1,12 @@
// Microsoft Visual C++ generated resource script. // Microsoft Visual C++ generated resource script.
// //
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS #define APSTUDIO_READONLY_SYMBOLS
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Generated from the TEXTINCLUDE 2 resource. // Generated from the TEXTINCLUDE 2 resource.
// //
#include "winres.h" #include "winres.h"
#include "svn_version.h"
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS #undef APSTUDIO_READONLY_SYMBOLS
@ -27,8 +26,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,7,6,1 FILEVERSION SVN_VERSION_DWORD
PRODUCTVERSION 1,7,6,1 PRODUCTVERSION SVN_VERSION_DWORD
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -45,12 +44,12 @@ BEGIN
BEGIN BEGIN
VALUE "Comments", "AMX Mod X" VALUE "Comments", "AMX Mod X"
VALUE "FileDescription", "AMX Mod X" VALUE "FileDescription", "AMX Mod X"
VALUE "FileVersion", "1.76a" VALUE "FileVersion", SVN_VERSION_STRING
VALUE "InternalName", "amxmodx" VALUE "InternalName", "amxmodx"
VALUE "LegalCopyright", "Copyright (c) 2004-2006, AMX Mod X Dev Team" VALUE "LegalCopyright", "Copyright (c) 2004-2007, AMX Mod X Dev Team"
VALUE "OriginalFilename", "amxmodx_mm.dll" VALUE "OriginalFilename", "amxmodx_mm.dll"
VALUE "ProductName", "AMX Mod X" VALUE "ProductName", "AMX Mod X"
VALUE "ProductVersion", "1.76a" VALUE "ProductVersion", SVN_VERSION_PRODUCT
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View File

@ -785,6 +785,8 @@ SC_VDECL short sc_is_utf8; /* is this source file in UTF-8 encoding */
SC_VDECL constvalue sc_automaton_tab; /* automaton table */ SC_VDECL constvalue sc_automaton_tab; /* automaton table */
SC_VDECL constvalue sc_state_tab; /* state table */ SC_VDECL constvalue sc_state_tab; /* state table */
SC_VDECL int pc_anytag;
SC_VDECL FILE *inpf; /* file read from (source or include) */ SC_VDECL FILE *inpf; /* file read from (source or include) */
SC_VDECL FILE *inpf_org; /* main source file */ SC_VDECL FILE *inpf_org; /* main source file */
SC_VDECL FILE *outf; /* file written to */ SC_VDECL FILE *outf; /* file written to */

View File

@ -67,6 +67,8 @@
#define VERSION_STR "3.0.3367-amxx" #define VERSION_STR "3.0.3367-amxx"
#define VERSION_INT 0x300 #define VERSION_INT 0x300
int pc_anytag;
static void resetglobals(void); static void resetglobals(void);
static void initglobals(void); static void initglobals(void);
static void setopt(int argc,char **argv,char *oname,char *ename,char *pname, static void setopt(int argc,char **argv,char *oname,char *ename,char *pname,
@ -1403,6 +1405,8 @@ static void setconstants(void)
add_constant("__Pawn",VERSION_INT,sGLOBAL,0); add_constant("__Pawn",VERSION_INT,sGLOBAL,0);
pc_anytag=pc_addtag("any");
debug=0; debug=0;
if ((sc_debug & (sCHKBOUNDS | sSYMBOLIC))==(sCHKBOUNDS | sSYMBOLIC)) if ((sc_debug & (sCHKBOUNDS | sSYMBOLIC))==(sCHKBOUNDS | sSYMBOLIC))
debug=2; debug=2;

View File

@ -1344,6 +1344,7 @@ static int command(void)
case tpERROR: case tpERROR:
while (*lptr<=' ' && *lptr!='\0') while (*lptr<=' ' && *lptr!='\0')
lptr++; lptr++;
if (!SKIPPING)
error(111,lptr); /* user error */ error(111,lptr); /* user error */
break; break;
default: default:

View File

@ -284,12 +284,13 @@ static void (*unopers[])(void) = { lneg, neg, user_inc, user_dec };
SC_FUNC int matchtag(int formaltag,int actualtag,int allowcoerce) SC_FUNC int matchtag(int formaltag,int actualtag,int allowcoerce)
{ {
if (formaltag!=actualtag) { if (formaltag!=actualtag && formaltag!=pc_anytag && actualtag!=pc_anytag) {
/* if the formal tag is zero and the actual tag is not "fixed", the actual /* if the formal tag is zero and the actual tag is not "fixed", the actual
* tag is "coerced" to zero * tag is "coerced" to zero
*/ */
if (!allowcoerce || formaltag!=0 || (actualtag & FIXEDTAG)!=0) if (!allowcoerce || formaltag!=0 || (actualtag & FIXEDTAG)!=0)
return FALSE; return FALSE;
} /* if */ } /* if */
return TRUE; return TRUE;
} }

View File

@ -1,42 +1,75 @@
// AMX Configuration File // AMX Mod X Configuration File
echo Executing AMX Mod X Configuration File echo Executing AMX Mod X Configuration File
// Default access for all non admin players (see users.ini for access details) // Default access for all non admin players (see users.ini for access details)
//
// Default value: "z"
amx_default_access "z" amx_default_access "z"
// Name of setinfo which should store a password on a client (you should change this) // Name of setinfo which should store a password on a client (you should change this)
// Note: Always prefix the field with an underscore (aka: "_")
// (Example: setinfo _pw "password") // (Example: setinfo _pw "password")
//
// Default value: "_pw"
amx_password_field "_pw" amx_password_field "_pw"
// Mode of logging to a server // Mode of logging to a server
// 0 - disable logging, players won't be checked (and access won't be set) // 0 - disable logging, players won't be checked (and access won't be set)
// 1 - normal mode which obey flags set in accounts // 1 - normal mode which obey flags set in accounts
// 2 - kick all players not on list // 2 - kick all players not on list
//
// Default value: 1
amx_mode 1 amx_mode 1
// Show admins activity // Show admins activity
// 0 - disabled // 0 - disabled
// 1 - show without admin name // 1 - show without admin name
// 2 - show with name // 2 - show with name
//
// Default value: 2
amx_show_activity 2 amx_show_activity 2
// Frequency in seconds and text of scrolling message // Frequency in seconds and text of scrolling message
//
// Default value: "Welcome to %hostname% -- This server is using AMX Mod X" 600
amx_scrollmsg "Welcome to %hostname% -- This server is using AMX Mod X" 600 amx_scrollmsg "Welcome to %hostname% -- This server is using AMX Mod X" 600
// Center typed colored messages (last parameter is a color in RRRGGGBBB format) // Center typed colored messages (last parameter is a color in RRRGGGBBB format)
//
// Default values: "Welcome to %hostname%" "000255100"
// "This server is using AMX ModX\nVisit http://www.amxmodx.org" "000100255"
amx_imessage "Welcome to %hostname%" "000255100" amx_imessage "Welcome to %hostname%" "000255100"
amx_imessage "This server is using AMX Mod X\nVisit http://www.amxmodx.org" "000100255" amx_imessage "This server is using AMX Mod X\nVisit http://www.amxmodx.org" "000100255"
// Frequency in seconds of colored messages // Frequency in seconds of colored messages
//
// Default value: 180
amx_freq_imessage 180 amx_freq_imessage 180
// Ban times for the main ban menu (amx_banmenu)
// Use 0 for permanent ban.
// Default values: 0 5 10 15 30 45 60
amx_plmenu_bantimes 0 5 10 15 30 45 60
// Slap damage amounts for the main slap menu (amx_slapmenu)
// Slay is automatically inserted as the first option.
// Default values: 1 5
amx_plmenu_slapdmg 1 5
// Set in seconds how fast players can chat (chat-flood protection) // Set in seconds how fast players can chat (chat-flood protection)
//
// Default value: 0.75
amx_flood_time 0.75 amx_flood_time 0.75
// Amount of reserved slots, amx_hideslots must be 1 to use this cvar (for more details see comments in plugin source) // Amount of slots to reserve.
//
// Default value: 0
amx_reservation 0 amx_reservation 0
// If you set this to 1, you can hide slots on your server // If you set this to 1, you can hide slots on your server.
// If server "full" of public slots and slots hidden, you must manually connect with connect console command
//
// Default value: 0
amx_hideslots 0 amx_hideslots 0
// Displaying of time remaining // Displaying of time remaining
@ -45,33 +78,58 @@ amx_hideslots 0
// c - don't add "remaining" (only in voice) // c - don't add "remaining" (only in voice)
// d - don't add "hours/minutes/seconds" (only in voice) // d - don't add "hours/minutes/seconds" (only in voice)
// e - show/speak if current time is less than this set in parameter // e - show/speak if current time is less than this set in parameter
//
// Default value: "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11"
amx_time_display "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11" amx_time_display "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11"
// Announce "say thetime" and "say timeleft" with voice // Announce "say thetime" and "say timeleft" with voice, set to 0 to disable.
//
// Default value: 1
amx_time_voice 1 amx_time_voice 1
// Minimum delay in seconds between two voting sessions // Minimum delay in seconds between two voting sessions
//
// Default value: 10
amx_vote_delay 10 amx_vote_delay 10
// How long voting session goes on // How long voting session goes on
//
// Default value: 10
amx_vote_time 10 amx_vote_time 10
// Display who votes for what option // Display who votes for what option, set to 0 to disable, 1 to enable.
//
// Default value: 1
amx_vote_answers 1 amx_vote_answers 1
// Some ratios for voting success // Some ratios for voting success
// Default value: 0.40
amx_votekick_ratio 0.40 amx_votekick_ratio 0.40
// Default value: 0.40
amx_voteban_ratio 0.40 amx_voteban_ratio 0.40
// Default value: 0.40
amx_votemap_ratio 0.40 amx_votemap_ratio 0.40
// Default value: 0.02
amx_vote_ratio 0.02 amx_vote_ratio 0.02
// Max. time to which map can be extended // Max. time to which map can be extended
//
// Default value: 90
amx_extendmap_max 90 amx_extendmap_max 90
// Step for each extending // Step for each extending
//
// Default value: 15
amx_extendmap_step 15 amx_extendmap_step 15
//If you set this to 0, clients cannot chose their language // If you set this to 0, clients cannot chose their language, instead they use
// whatever language the server is configured to use.
//
// Default value: 1
amx_client_languages 1 amx_client_languages 1
// Plugin Debug mode // Plugin Debug mode
@ -79,9 +137,13 @@ amx_client_languages 1
// 1 - Plugins with "debug" option in plugins.ini are put into debug mode // 1 - Plugins with "debug" option in plugins.ini are put into debug mode
// 2 - All plugins are put in debug mode // 2 - All plugins are put in debug mode
// Note - debug mode will affect JIT performance // Note - debug mode will affect JIT performance
//
// Default value: 1
amx_debug 1 amx_debug 1
// Plugin MultiLingual Debug // Plugin MultiLingual Debug
// To debug a language put its 2 letter code between quotes ("en", "de", etc) // To debug a language put its 2 letter code between quotes ("en", "de", etc)
// "" means disabled // "" means disabled
//
// Default value: ""
amx_mldebug "" amx_mldebug ""

View File

@ -1 +0,0 @@
For newest AMX Mod X and many plugins visit http://www.amxmodx.org/

View File

@ -1,42 +1,65 @@
// AMX Configuration File // AMX Mod X Configuration File
echo Executing AMX Mod X Configuration File echo Executing AMX Mod X Configuration File
// Default access for all non admin players (see users.ini for access details) // Default access for all non admin players (see users.ini for access details)
//
// Default value: "z"
amx_default_access "z" amx_default_access "z"
// Name of setinfo which should store a password on a client (you should change this) // Name of setinfo which should store a password on a client (you should change this)
// Note: Always prefix the field with an underscore (aka: "_")
// (Example: setinfo _pw "password") // (Example: setinfo _pw "password")
//
// Default value: "_pw"
amx_password_field "_pw" amx_password_field "_pw"
// Mode of logging to a server // Mode of logging to a server
// 0 - disable logging, players won't be checked (and access won't be set) // 0 - disable logging, players won't be checked (and access won't be set)
// 1 - normal mode which obey flags set in accounts // 1 - normal mode which obey flags set in accounts
// 2 - kick all players not on list // 2 - kick all players not on list
//
// Default value: 1
amx_mode 1 amx_mode 1
// Show admins activity // Show admins activity
// 0 - disabled // 0 - disabled
// 1 - show without admin name // 1 - show without admin name
// 2 - show with name // 2 - show with name
//
// Default value: 2
amx_show_activity 2 amx_show_activity 2
// Frequency in seconds and text of scrolling message // Frequency in seconds and text of scrolling message
//
// Default value: "Welcome to %hostname% -- This server is using AMX Mod X" 600
amx_scrollmsg "Welcome to %hostname% -- This server is using AMX Mod X" 600 amx_scrollmsg "Welcome to %hostname% -- This server is using AMX Mod X" 600
// Center typed colored messages (last parameter is a color in RRRGGGBBB format) // Center typed colored messages (last parameter is a color in RRRGGGBBB format)
//
// Default values: "Welcome to %hostname%" "000255100"
// "This server is using AMX ModX\nVisit http://www.amxmodx.org" "000100255"
amx_imessage "Welcome to %hostname%" "000255100" amx_imessage "Welcome to %hostname%" "000255100"
amx_imessage "This server is using AMX Mod X\nVisit http://www.amxmodx.org" "000100255" amx_imessage "This server is using AMX Mod X\nVisit http://www.amxmodx.org" "000100255"
// Frequency in seconds of colored messages // Frequency in seconds of colored messages
//
// Default value: 180
amx_freq_imessage 180 amx_freq_imessage 180
// Set in seconds how fast players can chat (chat-flood protection) // Set in seconds how fast players can chat (chat-flood protection)
//
// Default value: 0.75
amx_flood_time 0.75 amx_flood_time 0.75
// Amount of reserved slots, amx_hideslots must be 1 to use this cvar (for more details see comments in plugin source) // Amount of slots to reserve.
//
// Default value: 0
amx_reservation 0 amx_reservation 0
// If you set this to 1, you can hide slots on your server // If you set this to 1, you can hide slots on your server.
// If server "full" of public slots and slots hidden, you must manually connect with connect console command
//
// Default value: 0
amx_hideslots 0 amx_hideslots 0
// Displaying of time remaining // Displaying of time remaining
@ -45,49 +68,58 @@ amx_hideslots 0
// c - don't add "remaining" (only in voice) // c - don't add "remaining" (only in voice)
// d - don't add "hours/minutes/seconds" (only in voice) // d - don't add "hours/minutes/seconds" (only in voice)
// e - show/speak if current time is less than this set in parameter // e - show/speak if current time is less than this set in parameter
//
// Default value: "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11"
amx_time_display "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11" amx_time_display "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11"
// Announce "say thetime" and "say timeleft" with voice // Announce "say thetime" and "say timeleft" with voice, set to 0 to disable.
//
// Default value: 1
amx_time_voice 1 amx_time_voice 1
// Minimum delay in seconds between two voting sessions // Minimum delay in seconds between two voting sessions
//
// Default value: 10
amx_vote_delay 10 amx_vote_delay 10
// How long voting session goes on // How long voting session goes on
//
// Default value: 10
amx_vote_time 10 amx_vote_time 10
// Display who votes for what option // Display who votes for what option, set to 0 to disable, 1 to enable.
//
// Default value: 1
amx_vote_answers 1 amx_vote_answers 1
// Some ratios for voting success // Some ratios for voting success
// Default value: 0.40
amx_votekick_ratio 0.40 amx_votekick_ratio 0.40
// Default value: 0.40
amx_voteban_ratio 0.40 amx_voteban_ratio 0.40
// Default value: 0.40
amx_votemap_ratio 0.40 amx_votemap_ratio 0.40
// Default value: 0.02
amx_vote_ratio 0.02 amx_vote_ratio 0.02
// Max. time to which map can be extended // Max. time to which map can be extended
//
// Default value: 90
amx_extendmap_max 90 amx_extendmap_max 90
// Step for each extending // Step for each extending
//
// Default value: 15
amx_extendmap_step 15 amx_extendmap_step 15
// Rank mode // If you set this to 0, clients cannot chose their language, instead they use
// 0 - by nick // whatever language the server is configured to use.
// 1 - by authid //
// 2 - by ip // Default value: 1
csstats_rank 1
// Max size of the stats file
csstats_maxsize 3500
// Duration of HUD-statistics
amx_statsx_duration 12.0
// HUD-statistics display limit relative round freeze end
// Negative time will clear the HUD-statstics before the round freeze time has ended
amx_statsx_freeze -2.0
//If you set this to 0, clients cannot chose their language
amx_client_languages 1 amx_client_languages 1
// Plugin Debug mode // Plugin Debug mode
@ -95,9 +127,47 @@ amx_client_languages 1
// 1 - Plugins with "debug" option in plugins.ini are put into debug mode // 1 - Plugins with "debug" option in plugins.ini are put into debug mode
// 2 - All plugins are put in debug mode // 2 - All plugins are put in debug mode
// Note - debug mode will affect JIT performance // Note - debug mode will affect JIT performance
//
// Default value: 1
amx_debug 1 amx_debug 1
// Plugin MultiLingual Debug // Plugin MultiLingual Debug
// To debug a language put its 2 letter code between quotes ("en", "de", etc) // To debug a language put its 2 letter code between quotes ("en", "de", etc)
// "" means disabled // "" means disabled
//
// Default value: ""
amx_mldebug "" amx_mldebug ""
//
// Beginning of Counter-Strike package specific configurations.
//
// Rank mode
// 0 - by nick
// 1 - by authid
// 2 - by ip
//
// Default value: 1
csstats_rank 1
// Max size of the stats file
//
// Default value: 3500
csstats_maxsize 3500
// Whether or not to rank bots with csstats - set to 1 to rank bots, 0 otherwise.
//
// Default value: 0
csstats_rankbots 0
// Duration of HUD-statistics
//
// Default value: 12.0
amx_statsx_duration 12.0
// HUD-statistics display limit relative round freeze end
// Negative time will clear the HUD-statstics before the round freeze time has ended
//
// Default value: -2.0
amx_statsx_freeze -2.0

1798
configs/hamdata.ini Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,42 +1,65 @@
// AMX Configuration File // AMX Mod X Configuration File
echo Executing AMX Mod X Configuration File echo Executing AMX Mod X Configuration File
// Default access for all non admin players (see users.ini for access details) // Default access for all non admin players (see users.ini for access details)
//
// Default value: "z"
amx_default_access "z" amx_default_access "z"
// Name of setinfo which should store a password on a client (you should change this) // Name of setinfo which should store a password on a client (you should change this)
// Note: Always prefix the field with an underscore (aka: "_")
// (Example: setinfo _pw "password") // (Example: setinfo _pw "password")
//
// Default value: "_pw"
amx_password_field "_pw" amx_password_field "_pw"
// Mode of logging to a server // Mode of logging to a server
// 0 - disable logging, players won't be checked (and access won't be set) // 0 - disable logging, players won't be checked (and access won't be set)
// 1 - normal mode which obey flags set in accounts // 1 - normal mode which obey flags set in accounts
// 2 - kick all players not on list // 2 - kick all players not on list
//
// Default value: 1
amx_mode 1 amx_mode 1
// Show admins activity // Show admins activity
// 0 - disabled // 0 - disabled
// 1 - show without admin name // 1 - show without admin name
// 2 - show with name // 2 - show with name
//
// Default value: 2
amx_show_activity 2 amx_show_activity 2
// Frequency in seconds and text of scrolling message // Frequency in seconds and text of scrolling message
//
// Default value: "Welcome to %hostname% -- This server is using AMX Mod X" 600
amx_scrollmsg "Welcome to %hostname% -- This server is using AMX Mod X" 600 amx_scrollmsg "Welcome to %hostname% -- This server is using AMX Mod X" 600
// Center typed colored messages (last parameter is a color in RRRGGGBBB format) // Center typed colored messages (last parameter is a color in RRRGGGBBB format)
//
// Default values: "Welcome to %hostname%" "000255100"
// "This server is using AMX ModX\nVisit http://www.amxmodx.org" "000100255"
amx_imessage "Welcome to %hostname%" "000255100" amx_imessage "Welcome to %hostname%" "000255100"
amx_imessage "This server is using AMX Mod X\nVisit http://www.amxmodx.org" "000100255" amx_imessage "This server is using AMX Mod X\nVisit http://www.amxmodx.org" "000100255"
// Frequency in seconds of colored messages // Frequency in seconds of colored messages
//
// Default value: 180
amx_freq_imessage 180 amx_freq_imessage 180
// Set in seconds how fast players can chat (chat-flood protection) // Set in seconds how fast players can chat (chat-flood protection)
//
// Default value: 0.75
amx_flood_time 0.75 amx_flood_time 0.75
// Amount of reserved slots, amx_hideslots must be 1 to use this cvar (for more details see comments in plugin source) // Amount of slots to reserve.
//
// Default value: 0
amx_reservation 0 amx_reservation 0
// If you set this to 1, you can hide slots on your server // If you set this to 1, you can hide slots on your server.
// If server "full" of public slots and slots hidden, you must manually connect with connect console command
//
// Default value: 0
amx_hideslots 0 amx_hideslots 0
// Displaying of time remaining // Displaying of time remaining
@ -45,33 +68,58 @@ amx_hideslots 0
// c - don't add "remaining" (only in voice) // c - don't add "remaining" (only in voice)
// d - don't add "hours/minutes/seconds" (only in voice) // d - don't add "hours/minutes/seconds" (only in voice)
// e - show/speak if current time is less than this set in parameter // e - show/speak if current time is less than this set in parameter
//
// Default value: "ab 180" "ab 120" "ab 60" "bcde 11"
amx_time_display "ab 180" "ab 120" "ab 60" "bcde 11" amx_time_display "ab 180" "ab 120" "ab 60" "bcde 11"
// Announce "say thetime" and "say timeleft" with voice // Announce "say thetime" and "say timeleft" with voice, set to 0 to disable.
//
// Default value: 1
amx_time_voice 1 amx_time_voice 1
// Minimum delay in seconds between two voting sessions // Minimum delay in seconds between two voting sessions
//
// Default value: 10
amx_vote_delay 10 amx_vote_delay 10
// How long voting session goes on // How long voting session goes on
//
// Default value: 10
amx_vote_time 10 amx_vote_time 10
// Display who votes for what option // Display who votes for what option, set to 0 to disable, 1 to enable.
//
// Default value: 1
amx_vote_answers 1 amx_vote_answers 1
// Some ratios for voting success // Some ratios for voting success
// Default value: 0.40
amx_votekick_ratio 0.40 amx_votekick_ratio 0.40
// Default value: 0.40
amx_voteban_ratio 0.40 amx_voteban_ratio 0.40
// Default value: 0.40
amx_votemap_ratio 0.40 amx_votemap_ratio 0.40
// Default value: 0.02
amx_vote_ratio 0.02 amx_vote_ratio 0.02
// Max. time to which map can be extended // Max. time to which map can be extended
//
// Default value: 90
amx_extendmap_max 90 amx_extendmap_max 90
// Step for each extending // Step for each extending
//
// Default value: 15
amx_extendmap_step 15 amx_extendmap_step 15
//If you set this to 0, clients cannot chose their language // If you set this to 0, clients cannot chose their language, instead they use
// whatever language the server is configured to use.
//
// Default value: 1
amx_client_languages 1 amx_client_languages 1
// Plugin Debug mode // Plugin Debug mode
@ -79,20 +127,50 @@ amx_client_languages 1
// 1 - Plugins with "debug" option in plugins.ini are put into debug mode // 1 - Plugins with "debug" option in plugins.ini are put into debug mode
// 2 - All plugins are put in debug mode // 2 - All plugins are put in debug mode
// Note - debug mode will affect JIT performance // Note - debug mode will affect JIT performance
//
// Default value: 1
amx_debug 1 amx_debug 1
// Ignore the minimum and maximum settings for maps in the mapcycle
amx_mapnum_ignore 0
// Idle Kicker Settings:
amx_idle_time 120 // Time players must be idle to be kicked
amx_idle_min_players 8 // Minimum players on the server before kicking starts
amx_idle_ignore_immunity 1 // Kick idle admins with immunity?
// Change this value to alter the frequency (in seconds) players can say /stuck to free themselves.
//amx_unstuck_frequency 4
// Plugin MultiLingual Debug // Plugin MultiLingual Debug
// To debug a language put its 2 letter code between quotes ("en", "de", etc) // To debug a language put its 2 letter code between quotes ("en", "de", etc)
// "" means disabled // "" means disabled
//
// Default value: ""
amx_mldebug "" amx_mldebug ""
//
// Beginning of Natural-Selection specific configurations.
//
// Ignore the minimum and maximum settings for maps in the mapcycle
//
// Default value: 0
amx_mapnum_ignore 0
// Idle Kicker Settings
// Requires the "idlekicker.amxx" plugin to be enabled.
// Time players must be idle to be kicked, in seconds.
//
// Default value: 120
amx_idle_time 120
// Minimum players on the server before the plugin begins kicking.
//
// Default value: 8
amx_idle_min_players 8
// Whether or not to kick admins with immunity. 1 will kick, 0 will not.
//
// Default value: 1
amx_idle_ignore_immunity 1
// Unstuck settings
// Requires the "unstuck.amxx" plugin to be enabled.
// Change this value to alter the frequency (in seconds) players can
// say /stuck to free themselves.
//
// Default value: 4
amx_unstuck_frequency 4

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,144 +0,0 @@
#include "bb.h"
static cell AMX_NATIVE_CALL get_user_exp(AMX *amx,cell *params)
{
return amx_ftoc(GetUserExp(params[1]));
}
static cell AMX_NATIVE_CALL set_user_exp(AMX *amx,cell *params)
{
float Exp = amx_ctof(params[2]);
SetUserExp(params[1], Exp );
return 1;
}
static cell AMX_NATIVE_CALL get_user_points(AMX *amx,cell *params)
{
return amx_ftoc(GetUserPoints(params[1]));
}
static cell AMX_NATIVE_CALL set_user_points(AMX *amx,cell *params)
{
float Exp = amx_ctof(params[2]);
SetUserPoints(params[1], Exp );
return 1;
}
static cell AMX_NATIVE_CALL get_user_level(AMX *amx,cell *params)
{
return GetUserLevel(params[1]);
}
static cell AMX_NATIVE_CALL set_user_level(AMX *amx,cell *params)
{
if(GetUserLevel(params[1]) > params[2])
{
MF_LogError(amx,AMX_ERR_NATIVE,"Must set to a level higher than current one!");
return 0;
}
SetUserLevel(params[1], params[2] );
return 1;
}
static cell AMX_NATIVE_CALL get_user_speed(AMX *amx,cell *params)
{
return GetUserSpeed(params[1]);
}
static cell AMX_NATIVE_CALL set_user_speed(AMX *amx,cell *params)
{
SetUserSpeed(params[1], params[2] );
return 1;
}
static cell AMX_NATIVE_CALL get_user_hitpoints(AMX *amx,cell *params)
{
return GetUserHitPoints(params[1]);
}
static cell AMX_NATIVE_CALL set_user_hitpoints(AMX *amx,cell *params)
{
SetUserHitPoints(params[1], params[2] );
return 1;
}
static cell AMX_NATIVE_CALL get_user_skill(AMX *amx,cell *params)
{
return GetUserSkill(params[1]);
}
static cell AMX_NATIVE_CALL set_user_skill(AMX *amx,cell *params)
{
SetUserSkill(params[1], params[2] );
return 1;
}
static cell AMX_NATIVE_CALL send_progress_bar(AMX *amx,cell *params)
{
int len = 0;
float time = amx_ctof(params[3]);
SendProgressBar(params[1], MF_GetAmxString( amx, params[2], 0, &len ), time );
return 1;
}
static cell AMX_NATIVE_CALL send_show_objective(AMX *amx,cell *params)
{
int len = 0;
SendShowObjective(params[1], MF_GetAmxString( amx, params[2], 0, &len ) );
return 1;
}
static cell AMX_NATIVE_CALL send_show_message(AMX *amx,cell *params)
{
int len = 0;
float time = amx_ctof(params[2]);
SendShowMessage(params[1], time, MF_GetAmxString( amx, params[2], 0, &len ), MF_GetAmxString( amx, params[3], 0, &len ) );
return 1;
}
static cell AMX_NATIVE_CALL reset_user_hud(AMX *amx,cell *params)
{
UpdateBBHud( params[1] );
return 1;
}
static cell AMX_NATIVE_CALL is_user_zombie(AMX *amx,cell *params)
{
return IsUserZombie(params[1]);
}
AMX_NATIVE_INFO bb_Exports[] =
{
{"bb_is_user_zombie",is_user_zombie},
{"bb_reset_user_hud", reset_user_hud},
{"bb_show_message",send_show_message},
{"bb_show_objective", send_show_objective},
{"bb_show_progress_bar", send_progress_bar},
{"bb_get_user_skill",get_user_skill},
{"bb_set_user_skill", set_user_skill},
{"bb_get_user_hitpoints",get_user_hitpoints},
{"bb_set_user_hitpoints", set_user_hitpoints},
{"bb_get_user_speed",get_user_speed},
{"bb_set_user_speed", set_user_speed},
{"bb_get_user_exp",get_user_exp},
{"bb_set_user_exp", set_user_exp},
{"bb_get_user_points",get_user_points},
{"bb_set_user_points", set_user_points},
{"bb_get_user_level",get_user_level},
{"bb_set_user_level", set_user_level},
{ NULL, NULL }
};
void OnAmxxAttach()
{
MF_AddNatives(bb_Exports);
}

View File

@ -1,115 +0,0 @@
// prevent double include
#ifndef __BB_H__
#define __BB_H__
#include "pdata.h"
#include "bb_const.h"
void UpdateBBHud( long& target);
inline float GetUserExp( long& target)
{ return GetPData(target, BB_PDATA_EXP, 100.0); }
inline void SetUserExp( long& target, float& exp)
{ SetPData(target, BB_PDATA_EXP, exp); }
inline float GetUserPoints( long& target)
{ return GetPData(target, BB_PDATA_POINT, 100.0); }
inline void SetUserPoints( long& target, float& points)
{SetPData(target, BB_PDATA_POINT, points, true);}
inline long GetUserLevel(long& target)
{ return GetPData(target,BB_PDATA_LEVEL,100); }
inline void SetUserLevel(long& target, long& level)
{
long i;
float totalxp = 0.0;
for(i=1;i<=level;i++) {
totalxp += 150.0 + ((i-1) * 300.0);
}
SetUserExp( target, totalxp );
MESSAGE_BEGIN(MSG_ONE,120, NULL, MF_GetPlayerEdict( target) );
WRITE_COORD(0);
WRITE_BYTE(level);
WRITE_BYTE( GetUserPoints(target) );
MESSAGE_END();
MESSAGE_BEGIN(MSG_ALL,81, NULL, MF_GetPlayerEdict( target ));
WRITE_BYTE( target );
WRITE_SHORT( MF_GetPlayerFrags( target ) );
WRITE_SHORT( MF_GetPlayerDeaths( target ) );
WRITE_BYTE(level);
MESSAGE_END();
SetPData(target,BB_PDATA_LEVEL,level);
SetPData(target,BB_PDATA_LEVEL - 1,level);
}
inline long GetUserSpeed(long& target)
{ return GetPData(target,BB_PDATA_SPEED,100); }
inline void SetUserSpeed(long& target, long& speed)
{ SetPData(target,BB_PDATA_SPEED,speed, true);}
inline long GetUserHitPoints(long& target)
{ return GetPData(target,BB_PDATA_HITPOINTS,100); }
inline void SetUserHitPoints(long& target, long& hitpoints)
{ SetPData(target,BB_PDATA_HITPOINTS,hitpoints, true); }
inline long GetUserSkill(long& target)
{ return GetPData(target,BB_PDATA_SKILL,100); }
inline void SetUserSkill(long& target, long& skill )
{ SetPData(target,BB_PDATA_SKILL,skill,true); }
inline bool IsUserZombie(long& target)
{
return ( (MF_GetPlayerEdict( target ))->v.team == 2);
}
inline void SendProgressBar( long& target, char* message, float& time)
{
MESSAGE_BEGIN(MSG_ONE, 122, NULL, MF_GetPlayerEdict( target));
WRITE_STRING(message);
WRITE_COORD(time);
MESSAGE_END();
}
inline void SendShowObjective( long& target, char* message)
{
MESSAGE_BEGIN(MSG_ONE, 122, NULL, MF_GetPlayerEdict( target));
WRITE_COORD(-1);
WRITE_BYTE(144);
WRITE_STRING(message);
MESSAGE_END();
}
inline void SendShowMessage( long& target, float& duration, char* message, char* message2)
{
MESSAGE_BEGIN(MSG_ONE, 122, NULL, MF_GetPlayerEdict( target));
WRITE_COORD(duration);
WRITE_BYTE(32);
WRITE_STRING(message);
WRITE_STRING(message2);
MESSAGE_END();
}
void UpdateBBHud( long& target)
{
MESSAGE_BEGIN( MSG_ONE, 113, NULL, MF_GetPlayerEdict( target) );
WRITE_BYTE( GetUserHitPoints(target) );
WRITE_BYTE( GetUserSpeed(target) );
WRITE_BYTE( GetUserSkill(target) );
WRITE_BYTE( GetUserPoints(target) );
MESSAGE_END();
}
#endif

View File

@ -1,47 +0,0 @@
/* BrainBread Fun Module
*
* (c) 2005, XxAvalanchexX (converted to module by Rukia)
*
* This file is provided as is (no warranties).
*/
#if defined _brainbread_included
#endinput
#endif
#define _brainbread_included
#pragma library BBFUN
#include <bb_const>
#include <bb_stocks>
native bb_is_user_zombie(id)
native bb_reset_user_hud(id)
native bb_show_message(id,Float:time = -1,message[],message2[] = "")
native bb_show_objective(id,message[] = "")
native bb_show_progress_bar(id,message[],time = 10)
native bb_get_user_skill(id)
native bb_set_user_skill(id,skill)
stock bb_add_user_skill(id,skill) bb_set_user_skill(id,bb_get_user_skill(id) + skill)
native Float:bb_get_user_exp(id)
native bb_set_user_exp(id,Float:exp)
stock bb_add_user_exp(id,Float:exp) bb_set_user_exp(id,bb_get_user_exp(id) + exp)
native Float:bb_get_user_points(id)
native bb_set_user_points(id,Float:points)
stock bb_add_user_points(id,Float:points) bb_set_user_ponts(id,bb_get_user_points(id) + points)
native bb_get_user_level(id)
native bb_set_user_level(id,level)
stock bb_add_user_level(id,level) bb_set_user_level(id,bb_get_user_level(id) + level)
native bb_get_user_speed(id)
native bb_set_user_speed(id,speed)
stock bb_add_user_speed(id,speed) bb_set_user_speed(id,bb_get_user_speed(id) + speed)
native bb_get_user_hitpoints(id)
native bb_set_user_hitpoints(id,hitpoints)
stock bb_add_user_hitpoints(id,hitpoints) bb_set_user_hitpoints(id,bb_get_user_hitpoints(id) + hitpoints)

Binary file not shown.

View File

@ -1,12 +0,0 @@
// prevent double include
#ifndef __BB_CONST__
#define __BB_CONST__
#define BB_PDATA_LEVEL 505
#define BB_PDATA_EXP 4
#define BB_PDATA_POINT 432
#define BB_PDATA_SPEED 501
#define BB_PDATA_HITPOINTS 502
#define BB_PDATA_SKILL 503
#endif

View File

@ -1,26 +0,0 @@
/* BrainBread Fun Module Constants
*
* (c) 2005, XxAvalanchexX (converted to module by Rukia)
*
* This file is provided as is (no warranties).
*/
#if defined _brainbread_const_included
#endinput
#endif
#define _brainbread_const_included
#define SPRAY_BSPRITZ 1
#define SPRAY_BGUSH 2
#define SPRAY_SMOKEPUFF 4
#define SPRAY_EXPLOSION 5
#define DOT_GREEN 1
#define DOT_RED 2
#define DOT_WHITE 3
#define DOT_LTBLUE 4
#define DOT_BLUE 5
#define DOT_ORANGE 6
#define DOT_FLYELLOW 7
#define DOT_FLGREEN 8

View File

@ -1,112 +0,0 @@
/* BrainBread Fun Module Stocks
*
* (c) 2005, XxAvalanchexX (converted to module by Rukia)
*
* This file is provided as is (no warranties).
*/
#if defined _brainbread_stocks_included
#endinput
#endif
#define _brainbread_stocks_included
/* Used to create a spray */
stock bb_spray(type,origin[3]) {
/* type: type of spray, see below */
/* origin: origin of where spray comes from */
/* TYPES:
SPRAY_BSPRITZ (1) = Blood spritz
SPRAY_BGUSH (2) = Blood gush
SPRAY_SMOKEPUFF (4) = Smoke puffs
SPRAY_EXPLOSION (5) = Firey explosion */
message_begin(MSG_PVS,118,origin,0);
write_byte(type);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]);
write_coord(random_num(-1,1));
write_coord(random_num(-1,1));
write_coord(random_num(-1,1));
write_coord(random_num(-1,1));
write_coord(random_num(-1,1));
write_coord(random_num(-1,1));
message_end();
return 1;
}
/* Used to create a spray, with more parameters */
stock bb_spray_adv(type,origin[3],size[3],dir[3]) {
/* type: type of spray, see below */
/* origin: origin of where spray comes from */
/* size: size of spray, in XYZ format (I think), use a small number like -1 to 1 */
/* dir: direction of spray, in XYZ format (I think), use a small number like -1 to 1 */
/* TYPES:
SPRAY_BSPRITZ (1) = Blood spritz
SPRAY_BGUSH (2) = Blood gush
SPRAY_SMOKEPUFF (4) = Smoke puffs
SPRAY_EXPLOSION (5) = Firey explosion */
message_begin(MSG_PVS,118,origin,0);
write_byte(type);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]);
write_coord(size[0]);
write_coord(size[1]);
write_coord(size[2]);
write_coord(dir[0]);
write_coord(dir[1]);
write_coord(dir[2]);
message_end();
return 1;
}
/* Used to set dots on the radar */
stock bb_radar(id,dot_id,dot_origin[3],dot_status,dot_type) {
/* dot_id: unique ID for this dot, use same ID to modify the same dot */
/* dot_origin: the origin of where to place this dot */
/* dot_status: 0 to remove the dot, 1 to add or modify the dot */
/* dot_type: the type of dot, see below */
/* dot_origin and dot_type need not be set accurately when removing the dot */
/* TYPES:
DOT_GREEN (1) = Green Dot, used to mark teammates
DOT_RED (2) = Red Dot, used to mark enemies for zombies
DOT_WHITE (3) = White Dot, used to mark mission zones
DOT_LTBLUE (4) = Light Blue Dot, not used for BrainBread
DOT_BLUE (5) = Blue Dot, used to mark the BlackHawk
DOT_ORANGE (6) = Orange Dot, not used for BrainBread
DOT_FLYELLOW (7) = Flashing Yellow Dot, used to mark the Case or Fred
DOT_FLGREEN (8) = Flashing Green Dot, not used for BrainBread,
it stops flashing and turns to white after 3 seconds */
message_begin(MSG_ONE,93,{0,0,0},id);
write_short(dot_id);
write_byte(1);
write_coord(dot_origin[0]);
write_coord(dot_origin[1]);
write_coord(dot_origin[2]);
write_byte(1);
message_end();
message_begin(MSG_ONE,93,{0,0,0},id);
write_short(dot_id);
write_byte((dot_status > 0) ? 2 : 0);
if(dot_status > 0) {
write_byte(dot_type);
}
message_end();
return 1;
}

View File

@ -1,462 +0,0 @@
// Configuration
#ifndef __MODULECONFIG_H__
#define __MODULECONFIG_H__
// Module info
#define MODULE_NAME "BBFUN"
#define MODULE_VERSION "1.65"
#define MODULE_AUTHOR "Avalanche"
#define MODULE_URL "www.rcrclansite.com"
#define MODULE_LOGTAG "BB"
// If you want the module not to be reloaded on mapchange, remove / comment out the next line
#define MODULE_RELOAD_ON_MAPCHANGE
#ifdef __DATE__
#define MODULE_DATE __DATE__
#else // __DATE__
#define MODULE_DATE "Today"
#endif // __DATE__
// metamod plugin?
#define USE_METAMOD
// - AMXX Init functions
// Also consider using FN_META_*
// AMXX query
//#define FN_AMXX_QUERY OnAmxxQuery
// AMXX attach
// Do native functions init here (MF_AddNatives)
#define FN_AMXX_ATTACH OnAmxxAttach
// AMXX detach
// #define FN_AMXX_DETACH OnAmxxDetach
// All plugins loaded
// Do forward functions init here (MF_RegisterForward)
// #define FN_AMXX_PLUGINSLOADED OnPluginsLoaded
/**** METAMOD ****/
// If your module doesn't use metamod, you may close the file now :)
#ifdef USE_METAMOD
// ----
// Hook Functions
// Uncomment these to be called
// You can also change the function name
// - Metamod init functions
// Also consider using FN_AMXX_*
// Meta query
//#define FN_META_QUERY OnMetaQuery
// Meta attach
//#define FN_META_ATTACH OnMetaAttach
// Meta detach
//#define FN_META_DETACH OnMetaDetach
// (wd) are Will Day's notes
// - GetEntityAPI2 functions
// #define FN_GameDLLInit GameDLLInit /* pfnGameInit() */
// #define FN_DispatchSpawn DispatchSpawn /* pfnSpawn() */
// #define FN_DispatchThink DispatchThink /* pfnThink() */
// #define FN_DispatchUse DispatchUse /* pfnUse() */
// #define FN_DispatchTouch DispatchTouch /* pfnTouch() */
// #define FN_DispatchBlocked DispatchBlocked /* pfnBlocked() */
// #define FN_DispatchKeyValue DispatchKeyValue /* pfnKeyValue() */
// #define FN_DispatchSave DispatchSave /* pfnSave() */
// #define FN_DispatchRestore DispatchRestore /* pfnRestore() */
// #define FN_DispatchObjectCollsionBox DispatchObjectCollsionBox /* pfnSetAbsBox() */
// #define FN_SaveWriteFields SaveWriteFields /* pfnSaveWriteFields() */
// #define FN_SaveReadFields SaveReadFields /* pfnSaveReadFields() */
// #define FN_SaveGlobalState SaveGlobalState /* pfnSaveGlobalState() */
// #define FN_RestoreGlobalState RestoreGlobalState /* pfnRestoreGlobalState() */
// #define FN_ResetGlobalState ResetGlobalState /* pfnResetGlobalState() */
// #define FN_ClientConnect ClientConnect /* pfnClientConnect() (wd) Client has connected */
// #define FN_ClientDisconnect ClientDisconnect /* pfnClientDisconnect() (wd) Player has left the game */
// #define FN_ClientKill ClientKill /* pfnClientKill() (wd) Player has typed "kill" */
// #define FN_ClientPutInServer ClientPutInServer /* pfnClientPutInServer() (wd) Client is entering the game */
// #define FN_ClientCommand ClientCommand /* pfnClientCommand() (wd) Player has sent a command (typed or from a bind) */
// #define FN_ClientUserInfoChanged ClientUserInfoChanged /* pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure */
// #define FN_ServerActivate ServerActivate /* pfnServerActivate() (wd) Server is starting a new map */
// #define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */
// #define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */
// #define FN_PlayerPostThink PlayerPostThink /* pfnPlayerPostThink() */
// #define FN_StartFrame StartFrame /* pfnStartFrame() */
// #define FN_ParmsNewLevel ParmsNewLevel /* pfnParmsNewLevel() */
// #define FN_ParmsChangeLevel ParmsChangeLevel /* pfnParmsChangeLevel() */
// #define FN_GetGameDescription GetGameDescription /* pfnGetGameDescription() Returns string describing current .dll. E.g. "TeamFotrress 2" "Half-Life" */
// #define FN_PlayerCustomization PlayerCustomization /* pfnPlayerCustomization() Notifies .dll of new customization for player. */
// #define FN_SpectatorConnect SpectatorConnect /* pfnSpectatorConnect() Called when spectator joins server */
// #define FN_SpectatorDisconnect SpectatorDisconnect /* pfnSpectatorDisconnect() Called when spectator leaves the server */
// #define FN_SpectatorThink SpectatorThink /* pfnSpectatorThink() Called when spectator sends a command packet (usercmd_t) */
// #define FN_Sys_Error Sys_Error /* pfnSys_Error() Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint. SDK2 */
// #define FN_PM_Move PM_Move /* pfnPM_Move() (wd) SDK2 */
// #define FN_PM_Init PM_Init /* pfnPM_Init() Server version of player movement initialization; (wd) SDK2 */
// #define FN_PM_FindTextureType PM_FindTextureType /* pfnPM_FindTextureType() (wd) SDK2 */
// #define FN_SetupVisibility SetupVisibility /* pfnSetupVisibility() Set up PVS and PAS for networking for this client; (wd) SDK2 */
// #define FN_UpdateClientData UpdateClientData /* pfnUpdateClientData() Set up data sent only to specific client; (wd) SDK2 */
// #define FN_AddToFullPack AddToFullPack /* pfnAddToFullPack() (wd) SDK2 */
// #define FN_CreateBaseline CreateBaseline /* pfnCreateBaseline() Tweak entity baseline for network encoding allows setup of player baselines too.; (wd) SDK2 */
// #define FN_RegisterEncoders RegisterEncoders /* pfnRegisterEncoders() Callbacks for network encoding; (wd) SDK2 */
// #define FN_GetWeaponData GetWeaponData /* pfnGetWeaponData() (wd) SDK2 */
// #define FN_CmdStart CmdStart /* pfnCmdStart() (wd) SDK2 */
// #define FN_CmdEnd CmdEnd /* pfnCmdEnd() (wd) SDK2 */
// #define FN_ConnectionlessPacket ConnectionlessPacket /* pfnConnectionlessPacket() (wd) SDK2 */
// #define FN_GetHullBounds GetHullBounds /* pfnGetHullBounds() (wd) SDK2 */
// #define FN_CreateInstancedBaselines CreateInstancedBaselines /* pfnCreateInstancedBaselines() (wd) SDK2 */
// #define FN_InconsistentFile InconsistentFile /* pfnInconsistentFile() (wd) SDK2 */
// #define FN_AllowLagCompensation AllowLagCompensation /* pfnAllowLagCompensation() (wd) SDK2 */
// - GetEntityAPI2_Post functions
// #define FN_GameDLLInit_Post GameDLLInit_Post
// #define FN_DispatchSpawn_Post DispatchSpawn_Post
// #define FN_DispatchThink_Post DispatchThink_Post
// #define FN_DispatchUse_Post DispatchUse_Post
// #define FN_DispatchTouch_Post DispatchTouch_Post
// #define FN_DispatchBlocked_Post DispatchBlocked_Post
// #define FN_DispatchKeyValue_Post DispatchKeyValue_Post
// #define FN_DispatchSave_Post DispatchSave_Post
// #define FN_DispatchRestore_Post DispatchRestore_Post
// #define FN_DispatchObjectCollsionBox_Post DispatchObjectCollsionBox_Post
// #define FN_SaveWriteFields_Post SaveWriteFields_Post
// #define FN_SaveReadFields_Post SaveReadFields_Post
// #define FN_SaveGlobalState_Post SaveGlobalState_Post
// #define FN_RestoreGlobalState_Post RestoreGlobalState_Post
// #define FN_ResetGlobalState_Post ResetGlobalState_Post
// #define FN_ClientConnect_Post ClientConnect_Post
// #define FN_ClientDisconnect_Post ClientDisconnect_Post
// #define FN_ClientKill_Post ClientKill_Post
// #define FN_ClientPutInServer_Post ClientPutInServer_Post
// #define FN_ClientCommand_Post ClientCommand_Post
// #define FN_ClientUserInfoChanged_Post ClientUserInfoChanged_Post
// #define FN_ServerActivate_Post ServerActivate_Post
// #define FN_ServerDeactivate_Post ServerDeactivate_Post
// #define FN_PlayerPreThink_Post PlayerPreThink_Post
// #define FN_PlayerPostThink_Post PlayerPostThink_Post
// #define FN_StartFrame_Post StartFrame_Post
// #define FN_ParmsNewLevel_Post ParmsNewLevel_Post
// #define FN_ParmsChangeLevel_Post ParmsChangeLevel_Post
// #define FN_GetGameDescription_Post GetGameDescription_Post
// #define FN_PlayerCustomization_Post PlayerCustomization_Post
// #define FN_SpectatorConnect_Post SpectatorConnect_Post
// #define FN_SpectatorDisconnect_Post SpectatorDisconnect_Post
// #define FN_SpectatorThink_Post SpectatorThink_Post
// #define FN_Sys_Error_Post Sys_Error_Post
// #define FN_PM_Move_Post PM_Move_Post
// #define FN_PM_Init_Post PM_Init_Post
// #define FN_PM_FindTextureType_Post PM_FindTextureType_Post
// #define FN_SetupVisibility_Post SetupVisibility_Post
// #define FN_UpdateClientData_Post UpdateClientData_Post
// #define FN_AddToFullPack_Post AddToFullPack_Post
// #define FN_CreateBaseline_Post CreateBaseline_Post
// #define FN_RegisterEncoders_Post RegisterEncoders_Post
// #define FN_GetWeaponData_Post GetWeaponData_Post
// #define FN_CmdStart_Post CmdStart_Post
// #define FN_CmdEnd_Post CmdEnd_Post
// #define FN_ConnectionlessPacket_Post ConnectionlessPacket_Post
// #define FN_GetHullBounds_Post GetHullBounds_Post
// #define FN_CreateInstancedBaselines_Post CreateInstancedBaselines_Post
// #define FN_InconsistentFile_Post InconsistentFile_Post
// #define FN_AllowLagCompensation_Post AllowLagCompensation_Post
// - GetEngineAPI functions
// #define FN_PrecacheModel PrecacheModel
// #define FN_PrecacheSound PrecacheSound
// #define FN_SetModel SetModel
// #define FN_ModelIndex ModelIndex
// #define FN_ModelFrames ModelFrames
// #define FN_SetSize SetSize
// #define FN_ChangeLevel ChangeLevel
// #define FN_GetSpawnParms GetSpawnParms
// #define FN_SaveSpawnParms SaveSpawnParms
// #define FN_VecToYaw VecToYaw
// #define FN_VecToAngles VecToAngles
// #define FN_MoveToOrigin MoveToOrigin
// #define FN_ChangeYaw ChangeYaw
// #define FN_ChangePitch ChangePitch
// #define FN_FindEntityByString FindEntityByString
// #define FN_GetEntityIllum GetEntityIllum
// #define FN_FindEntityInSphere FindEntityInSphere
// #define FN_FindClientInPVS FindClientInPVS
// #define FN_EntitiesInPVS EntitiesInPVS
// #define FN_MakeVectors MakeVectors
// #define FN_AngleVectors AngleVectors
// #define FN_CreateEntity CreateEntity
// #define FN_RemoveEntity RemoveEntity
// #define FN_CreateNamedEntity CreateNamedEntity
// #define FN_MakeStatic MakeStatic
// #define FN_EntIsOnFloor EntIsOnFloor
// #define FN_DropToFloor DropToFloor
// #define FN_WalkMove WalkMove
// #define FN_SetOrigin SetOrigin
// #define FN_EmitSound EmitSound
// #define FN_EmitAmbientSound EmitAmbientSound
// #define FN_TraceLine TraceLine
// #define FN_TraceToss TraceToss
// #define FN_TraceMonsterHull TraceMonsterHull
// #define FN_TraceHull TraceHull
// #define FN_TraceModel TraceModel
// #define FN_TraceTexture TraceTexture
// #define FN_TraceSphere TraceSphere
// #define FN_GetAimVector GetAimVector
// #define FN_ServerCommand ServerCommand
// #define FN_ServerExecute ServerExecute
// #define FN_engClientCommand engClientCommand
// #define FN_ParticleEffect ParticleEffect
// #define FN_LightStyle LightStyle
// #define FN_DecalIndex DecalIndex
// #define FN_PointContents PointContents
// #define FN_MessageBegin MessageBegin
// #define FN_MessageEnd MessageEnd
// #define FN_WriteByte WriteByte
// #define FN_WriteChar WriteChar
// #define FN_WriteShort WriteShort
// #define FN_WriteLong WriteLong
// #define FN_WriteAngle WriteAngle
// #define FN_WriteCoord WriteCoord
// #define FN_WriteString WriteString
// #define FN_WriteEntity WriteEntity
// #define FN_CVarRegister CVarRegister
// #define FN_CVarGetFloat CVarGetFloat
// #define FN_CVarGetString CVarGetString
// #define FN_CVarSetFloat CVarSetFloat
// #define FN_CVarSetString CVarSetString
// #define FN_AlertMessage AlertMessage
// #define FN_EngineFprintf EngineFprintf
// #define FN_PvAllocEntPrivateData PvAllocEntPrivateData
// #define FN_PvEntPrivateData PvEntPrivateData
// #define FN_FreeEntPrivateData FreeEntPrivateData
// #define FN_SzFromIndex SzFromIndex
// #define FN_AllocString AllocString
// #define FN_GetVarsOfEnt GetVarsOfEnt
// #define FN_PEntityOfEntOffset PEntityOfEntOffset
// #define FN_EntOffsetOfPEntity EntOffsetOfPEntity
// #define FN_IndexOfEdict IndexOfEdict
// #define FN_PEntityOfEntIndex PEntityOfEntIndex
// #define FN_FindEntityByVars FindEntityByVars
// #define FN_GetModelPtr GetModelPtr
// #define FN_RegUserMsg RegUserMsg
// #define FN_AnimationAutomove AnimationAutomove
// #define FN_GetBonePosition GetBonePosition
// #define FN_FunctionFromName FunctionFromName
// #define FN_NameForFunction NameForFunction
// #define FN_ClientPrintf ClientPrintf
// #define FN_ServerPrint ServerPrint
// #define FN_Cmd_Args Cmd_Args
// #define FN_Cmd_Argv Cmd_Argv
// #define FN_Cmd_Argc Cmd_Argc
// #define FN_GetAttachment GetAttachment
// #define FN_CRC32_Init CRC32_Init
// #define FN_CRC32_ProcessBuffer CRC32_ProcessBuffer
// #define FN_CRC32_ProcessByte CRC32_ProcessByte
// #define FN_CRC32_Final CRC32_Final
// #define FN_RandomLong RandomLong
// #define FN_RandomFloat RandomFloat
// #define FN_SetView SetView
// #define FN_Time Time
// #define FN_CrosshairAngle CrosshairAngle
// #define FN_LoadFileForMe LoadFileForMe
// #define FN_FreeFile FreeFile
// #define FN_EndSection EndSection
// #define FN_CompareFileTime CompareFileTime
// #define FN_GetGameDir GetGameDir
// #define FN_Cvar_RegisterVariable Cvar_RegisterVariable
// #define FN_FadeClientVolume FadeClientVolume
// #define FN_SetClientMaxspeed SetClientMaxspeed
// #define FN_CreateFakeClient CreateFakeClient
// #define FN_RunPlayerMove RunPlayerMove
// #define FN_NumberOfEntities NumberOfEntities
// #define FN_GetInfoKeyBuffer GetInfoKeyBuffer
// #define FN_InfoKeyValue InfoKeyValue
// #define FN_SetKeyValue SetKeyValue
// #define FN_SetClientKeyValue SetClientKeyValue
// #define FN_IsMapValid IsMapValid
// #define FN_StaticDecal StaticDecal
// #define FN_PrecacheGeneric PrecacheGeneric
// #define FN_GetPlayerUserId GetPlayerUserId
// #define FN_BuildSoundMsg BuildSoundMsg
// #define FN_IsDedicatedServer IsDedicatedServer
// #define FN_CVarGetPointer CVarGetPointer
// #define FN_GetPlayerWONId GetPlayerWONId
// #define FN_Info_RemoveKey Info_RemoveKey
// #define FN_GetPhysicsKeyValue GetPhysicsKeyValue
// #define FN_SetPhysicsKeyValue SetPhysicsKeyValue
// #define FN_GetPhysicsInfoString GetPhysicsInfoString
// #define FN_PrecacheEvent PrecacheEvent
// #define FN_PlaybackEvent PlaybackEvent
// #define FN_SetFatPVS SetFatPVS
// #define FN_SetFatPAS SetFatPAS
// #define FN_CheckVisibility CheckVisibility
// #define FN_DeltaSetField DeltaSetField
// #define FN_DeltaUnsetField DeltaUnsetField
// #define FN_DeltaAddEncoder DeltaAddEncoder
// #define FN_GetCurrentPlayer GetCurrentPlayer
// #define FN_CanSkipPlayer CanSkipPlayer
// #define FN_DeltaFindField DeltaFindField
// #define FN_DeltaSetFieldByIndex DeltaSetFieldByIndex
// #define FN_DeltaUnsetFieldByIndex DeltaUnsetFieldByIndex
// #define FN_SetGroupMask SetGroupMask
// #define FN_engCreateInstancedBaseline engCreateInstancedBaseline
// #define FN_Cvar_DirectSet Cvar_DirectSet
// #define FN_ForceUnmodified ForceUnmodified
// #define FN_GetPlayerStats GetPlayerStats
// #define FN_AddServerCommand AddServerCommand
// #define FN_Voice_GetClientListening Voice_GetClientListening
// #define FN_Voice_SetClientListening Voice_SetClientListening
// #define FN_GetPlayerAuthId GetPlayerAuthId
// - GetEngineAPI_Post functions
// #define FN_PrecacheModel_Post PrecacheModel_Post
// #define FN_PrecacheSound_Post PrecacheSound_Post
// #define FN_SetModel_Post SetModel_Post
// #define FN_ModelIndex_Post ModelIndex_Post
// #define FN_ModelFrames_Post ModelFrames_Post
// #define FN_SetSize_Post SetSize_Post
// #define FN_ChangeLevel_Post ChangeLevel_Post
// #define FN_GetSpawnParms_Post GetSpawnParms_Post
// #define FN_SaveSpawnParms_Post SaveSpawnParms_Post
// #define FN_VecToYaw_Post VecToYaw_Post
// #define FN_VecToAngles_Post VecToAngles_Post
// #define FN_MoveToOrigin_Post MoveToOrigin_Post
// #define FN_ChangeYaw_Post ChangeYaw_Post
// #define FN_ChangePitch_Post ChangePitch_Post
// #define FN_FindEntityByString_Post FindEntityByString_Post
// #define FN_GetEntityIllum_Post GetEntityIllum_Post
// #define FN_FindEntityInSphere_Post FindEntityInSphere_Post
// #define FN_FindClientInPVS_Post FindClientInPVS_Post
// #define FN_EntitiesInPVS_Post EntitiesInPVS_Post
// #define FN_MakeVectors_Post MakeVectors_Post
// #define FN_AngleVectors_Post AngleVectors_Post
// #define FN_CreateEntity_Post CreateEntity_Post
// #define FN_RemoveEntity_Post RemoveEntity_Post
// #define FN_CreateNamedEntity_Post CreateNamedEntity_Post
// #define FN_MakeStatic_Post MakeStatic_Post
// #define FN_EntIsOnFloor_Post EntIsOnFloor_Post
// #define FN_DropToFloor_Post DropToFloor_Post
// #define FN_WalkMove_Post WalkMove_Post
// #define FN_SetOrigin_Post SetOrigin_Post
// #define FN_EmitSound_Post EmitSound_Post
// #define FN_EmitAmbientSound_Post EmitAmbientSound_Post
// #define FN_TraceLine_Post TraceLine_Post
// #define FN_TraceToss_Post TraceToss_Post
// #define FN_TraceMonsterHull_Post TraceMonsterHull_Post
// #define FN_TraceHull_Post TraceHull_Post
// #define FN_TraceModel_Post TraceModel_Post
// #define FN_TraceTexture_Post TraceTexture_Post
// #define FN_TraceSphere_Post TraceSphere_Post
// #define FN_GetAimVector_Post GetAimVector_Post
// #define FN_ServerCommand_Post ServerCommand_Post
// #define FN_ServerExecute_Post ServerExecute_Post
// #define FN_engClientCommand_Post engClientCommand_Post
// #define FN_ParticleEffect_Post ParticleEffect_Post
// #define FN_LightStyle_Post LightStyle_Post
// #define FN_DecalIndex_Post DecalIndex_Post
// #define FN_PointContents_Post PointContents_Post
// #define FN_MessageBegin_Post MessageBegin_Post
// #define FN_MessageEnd_Post MessageEnd_Post
// #define FN_WriteByte_Post WriteByte_Post
// #define FN_WriteChar_Post WriteChar_Post
// #define FN_WriteShort_Post WriteShort_Post
// #define FN_WriteLong_Post WriteLong_Post
// #define FN_WriteAngle_Post WriteAngle_Post
// #define FN_WriteCoord_Post WriteCoord_Post
// #define FN_WriteString_Post WriteString_Post
// #define FN_WriteEntity_Post WriteEntity_Post
// #define FN_CVarRegister_Post CVarRegister_Post
// #define FN_CVarGetFloat_Post CVarGetFloat_Post
// #define FN_CVarGetString_Post CVarGetString_Post
// #define FN_CVarSetFloat_Post CVarSetFloat_Post
// #define FN_CVarSetString_Post CVarSetString_Post
// #define FN_AlertMessage_Post AlertMessage_Post
// #define FN_EngineFprintf_Post EngineFprintf_Post
// #define FN_PvAllocEntPrivateData_Post PvAllocEntPrivateData_Post
// #define FN_PvEntPrivateData_Post PvEntPrivateData_Post
// #define FN_FreeEntPrivateData_Post FreeEntPrivateData_Post
// #define FN_SzFromIndex_Post SzFromIndex_Post
// #define FN_AllocString_Post AllocString_Post
// #define FN_GetVarsOfEnt_Post GetVarsOfEnt_Post
// #define FN_PEntityOfEntOffset_Post PEntityOfEntOffset_Post
// #define FN_EntOffsetOfPEntity_Post EntOffsetOfPEntity_Post
// #define FN_IndexOfEdict_Post IndexOfEdict_Post
// #define FN_PEntityOfEntIndex_Post PEntityOfEntIndex_Post
// #define FN_FindEntityByVars_Post FindEntityByVars_Post
// #define FN_GetModelPtr_Post GetModelPtr_Post
// #define FN_RegUserMsg_Post RegUserMsg_Post
// #define FN_AnimationAutomove_Post AnimationAutomove_Post
// #define FN_GetBonePosition_Post GetBonePosition_Post
// #define FN_FunctionFromName_Post FunctionFromName_Post
// #define FN_NameForFunction_Post NameForFunction_Post
// #define FN_ClientPrintf_Post ClientPrintf_Post
// #define FN_ServerPrint_Post ServerPrint_Post
// #define FN_Cmd_Args_Post Cmd_Args_Post
// #define FN_Cmd_Argv_Post Cmd_Argv_Post
// #define FN_Cmd_Argc_Post Cmd_Argc_Post
// #define FN_GetAttachment_Post GetAttachment_Post
// #define FN_CRC32_Init_Post CRC32_Init_Post
// #define FN_CRC32_ProcessBuffer_Post CRC32_ProcessBuffer_Post
// #define FN_CRC32_ProcessByte_Post CRC32_ProcessByte_Post
// #define FN_CRC32_Final_Post CRC32_Final_Post
// #define FN_RandomLong_Post RandomLong_Post
// #define FN_RandomFloat_Post RandomFloat_Post
// #define FN_SetView_Post SetView_Post
// #define FN_Time_Post Time_Post
// #define FN_CrosshairAngle_Post CrosshairAngle_Post
// #define FN_LoadFileForMe_Post LoadFileForMe_Post
// #define FN_FreeFile_Post FreeFile_Post
// #define FN_EndSection_Post EndSection_Post
// #define FN_CompareFileTime_Post CompareFileTime_Post
// #define FN_GetGameDir_Post GetGameDir_Post
// #define FN_Cvar_RegisterVariable_Post Cvar_RegisterVariable_Post
// #define FN_FadeClientVolume_Post FadeClientVolume_Post
// #define FN_SetClientMaxspeed_Post SetClientMaxspeed_Post
// #define FN_CreateFakeClient_Post CreateFakeClient_Post
// #define FN_RunPlayerMove_Post RunPlayerMove_Post
// #define FN_NumberOfEntities_Post NumberOfEntities_Post
// #define FN_GetInfoKeyBuffer_Post GetInfoKeyBuffer_Post
// #define FN_InfoKeyValue_Post InfoKeyValue_Post
// #define FN_SetKeyValue_Post SetKeyValue_Post
// #define FN_SetClientKeyValue_Post SetClientKeyValue_Post
// #define FN_IsMapValid_Post IsMapValid_Post
// #define FN_StaticDecal_Post StaticDecal_Post
// #define FN_PrecacheGeneric_Post PrecacheGeneric_Post
// #define FN_GetPlayerUserId_Post GetPlayerUserId_Post
// #define FN_BuildSoundMsg_Post BuildSoundMsg_Post
// #define FN_IsDedicatedServer_Post IsDedicatedServer_Post
// #define FN_CVarGetPointer_Post CVarGetPointer_Post
// #define FN_GetPlayerWONId_Post GetPlayerWONId_Post
// #define FN_Info_RemoveKey_Post Info_RemoveKey_Post
// #define FN_GetPhysicsKeyValue_Post GetPhysicsKeyValue_Post
// #define FN_SetPhysicsKeyValue_Post SetPhysicsKeyValue_Post
// #define FN_GetPhysicsInfoString_Post GetPhysicsInfoString_Post
// #define FN_PrecacheEvent_Post PrecacheEvent_Post
// #define FN_PlaybackEvent_Post PlaybackEvent_Post
// #define FN_SetFatPVS_Post SetFatPVS_Post
// #define FN_SetFatPAS_Post SetFatPAS_Post
// #define FN_CheckVisibility_Post CheckVisibility_Post
// #define FN_DeltaSetField_Post DeltaSetField_Post
// #define FN_DeltaUnsetField_Post DeltaUnsetField_Post
// #define FN_DeltaAddEncoder_Post DeltaAddEncoder_Post
// #define FN_GetCurrentPlayer_Post GetCurrentPlayer_Post
// #define FN_CanSkipPlayer_Post CanSkipPlayer_Post
// #define FN_DeltaFindField_Post DeltaFindField_Post
// #define FN_DeltaSetFieldByIndex_Post DeltaSetFieldByIndex_Post
// #define FN_DeltaUnsetFieldByIndex_Post DeltaUnsetFieldByIndex_Post
// #define FN_SetGroupMask_Post SetGroupMask_Post
// #define FN_engCreateInstancedBaseline_Post engCreateInstancedBaseline_Post
// #define FN_Cvar_DirectSet_Post Cvar_DirectSet_Post
// #define FN_ForceUnmodified_Post ForceUnmodified_Post
// #define FN_GetPlayerStats_Post GetPlayerStats_Post
// #define FN_AddServerCommand_Post AddServerCommand_Post
// #define FN_Voice_GetClientListening_Post Voice_GetClientListening_Post
// #define FN_Voice_SetClientListening_Post Voice_SetClientListening_Post
// #define FN_GetPlayerAuthId_Post GetPlayerAuthId_Post
// #define FN_OnFreeEntPrivateData OnFreeEntPrivateData
// #define FN_GameShutdown GameShutdown
// #define FN_ShouldCollide ShouldCollide
// #define FN_OnFreeEntPrivateData_Post OnFreeEntPrivateData_Post
// #define FN_GameShutdown_Post GameShutdown_Post
// #define FN_ShouldCollide_Post ShouldCollide_Post
#endif // USE_METAMOD
#endif // __MODULECONFIG_H__

View File

@ -1,40 +0,0 @@
// prevent double include
#ifndef __PDATA_H__
#define __PDATA_H__
#include <extdll.h>
#include "amxxmodule.h"
#if defined __linux__
#define EXTRAOFFSET 5 // offsets 5 higher in Linux builds
#else
#define EXTRAOFFSET 0 // no change in Windows builds
#endif // defined __linux__
inline edict_t* MF_GetEntityEdict( long& EntID )
{
if( (EntID > 0) && (EntID <= (gpGlobals->maxClients) ) )
return MF_GetPlayerEdict( EntID );
return NULL;
}
template <typename ValueType>
inline void SetPData( long& targetid, long offset, ValueType value, bool reset = false )
{
edict_t* target = MF_GetEntityEdict( targetid );
if(target == NULL) return;
*((ValueType *)target->pvPrivateData + offset + EXTRAOFFSET) = value;
if(reset) UpdateBBHud( targetid );
};
template <typename ValueType>
inline ValueType GetPData( long& targetid, long offset, ValueType value )
{
edict_t* target = MF_GetEntityEdict( targetid );
if(target == NULL) return NULL;
return *((ValueType *)target->pvPrivateData + offset + EXTRAOFFSET);
}
#endif

View File

@ -1,48 +0,0 @@
#ifndef __MEMCONST_H__
#define __MEMCONST_H__
#ifdef __linux__
#include <sys/mman.h>
#endif
#include "amxxmodule.h"
// Define memory address type
#ifdef __amd64__
typedef uint64_t maddress;
#else
typedef uint32_t maddress;
#endif
// Number of bytes for different data types
#define BYTE_BYTES 1
#define WORD_BYTES 2
#define DWORD_BYTES 4
#define QWORD_BYTES 8
#define FLOAT_BYTES 4
// Return codes for MemoryProtect
#define MP_FAIL -1
#define MP_OK 0
// Memory protection constants
#ifdef __linux__
#define MPROT_CODE PROT_READ|PROT_EXEC
#define MPROT_DATA PROT_READ|PROT_WRITE
#define MPROT_RODATA PROT_READ
#define MPROT_CODE_EDIT PROT_READ|PROT_WRITE|PROT_EXEC
#define MPROT_RODATA_EDIT PROT_READ|PROT_WRITE
#else
#define MPROT_CODE PAGE_EXECUTE_READ
#define MPROT_DATA PAGE_READWRITE
#define MPROT_RODATA PAGE_READONLY
#define MPROT_CODE_EDIT PAGE_EXECUTE_READWRITE
#define MPROT_RODATA_EDIT PAGE_READWRITE
#endif
// Memory area types
#define MEMTYPE_CODE 0 // Code (usually .text segment, requires mprotect or VirtualProtect)
#define MEMTYPE_DATA 1 // Data (usually .data segment, writable by default)
#define MEMTYPE_RODATA 2 // Read-Only Data (usually .rodata on Linux, .rdata on Windows)
#endif // #ifndef __MEMHACK_H__

View File

@ -1,16 +0,0 @@
#include "MemMisc.h"
extern AMX_NATIVE_INFO read_natives[];
extern AMX_NATIVE_INFO write_natives[];
extern AMX_NATIVE_INFO misc_natives[];
void OnAmxxAttach()
{
// Get Base Addresses for dll and engine; exit if unavailable.
if(GetBaseAddresses() == false) return MF_LogError(NULL,AMX_ERR_MEMACCESS,"Unable to get base address of game or mod .dll!");
// Add natives if base is found.
MF_AddNatives(read_natives);
MF_AddNatives(write_natives);
MF_AddNatives(misc_natives);
}

Binary file not shown.

View File

@ -1,111 +0,0 @@
#include "MemConst.h"
// Game memory addresses
maddress gameDllAddress = NULL;
maddress gameEngAddress = NULL;
bool GetBaseAddress(void *pAddr, maddress &pBaseAddr/*, size_t *memLength*/)
{
#ifdef WIN32
MEMORY_BASIC_INFORMATION mem;
if (!VirtualQuery(pAddr, &mem, sizeof(mem)))
return false;
pBaseAddr = (maddress)mem.AllocationBase;
IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *)(mem.AllocationBase);
IMAGE_NT_HEADERS *pe = reinterpret_cast<IMAGE_NT_HEADERS*>( (unsigned long)dos + (unsigned long)dos->e_lfanew );
if (pe->Signature != IMAGE_NT_SIGNATURE)
return false;
//if (memLength)
//*memLength = (size_t)(pe->OptionalHeader.SizeOfImage);
return true;
#else
Dl_info info;
struct stat buf;
if (!dladdr(pAddr, &info))
return false;
if (!info.dli_fbase || !info.dli_fname)
return false;
if (stat(info.dli_fname, &buf) != 0)
return false;
if (pBaseAddr)
*pBaseAddr = (unsigned char *)info.dli_fbase;
//if (memLength)
//*memLength = buf.st_size;
return true;
#endif
}
/* Wrapper for mprotect and VirtualProtect */
int MemoryProtect(void *addr, size_t len, unsigned long newProt, unsigned long *oldProt, char memType) {
int retVal;
#ifdef __linux__
maddress alignAddr = (maddress)addr - ((maddress)addr % pageSize);
retVal = mprotect((void*)alignAddr, pageSize, newProt);
// Linux's mprotect doesn't get the old protection flags, so we have to fake it
switch (memType) {
case MEMTYPE_CODE:
*oldProt = MPROT_CODE;
break;
case MEMTYPE_RODATA:
*oldProt = MPROT_RODATA;
break;
default:
*oldProt = MPROT_CODE;
break;
}
#else
retVal = VirtualProtect(addr, len, newProt, oldProt);
// This will match the Windows return value with the Linux ones, done for consistency
if (retVal == 0) {
retVal = -1;
} else {
retVal = 0;
}
#endif
return retVal;
}
// Linux won't work till I fix it for MEMTYPE_DATA
#ifdef __linux__
// Data section stuff
maddress dataSectionStart;
maddress dataSectionOffset;
int pageSize = sysconf(_SC_PAGESIZE);
#endif
/* Gets real memory address */
maddress GetRealMemoryAddress(maddress baseaddress, maddress address, char memType)
{
if(baseaddress == NULL) return address;
maddress realAddress = address;
switch (memType)
{
case MEMTYPE_CODE: case MEMTYPE_RODATA:
realAddress = baseaddress + address;
break;
case MEMTYPE_DATA:
// Linux's data segment is in a not so simple place in memory
#ifdef __linux__
realAddress = dataSectionStart + (address - dataSectionOffset);
#else
realAddress = baseaddress + address;
#endif
break;
}
return realAddress;
}

View File

@ -1,38 +0,0 @@
#ifndef __MEMMISC_H__
#define __MEMMISC_H__
#include "MemConst.h"
#define SAMPLE_DLLFUNC reinterpret_cast<void*>(gpGamedllFuncs->dllapi_table->pfnThink)
#define SAMPLE_ENGFUNC reinterpret_cast<void*>(g_engfuncs.pfnChangeLevel)
extern maddress gameDllAddress;
extern maddress gameEngAddress;
inline maddress PickBaseAddress(long num)
{
if(num == 0) return gameDllAddress;
else if(num == 1) return gameEngAddress;
return NULL;
}
extern int MemoryProtect(void *addr, size_t len, unsigned long newProt, unsigned long *oldProt, char memType = MEMTYPE_CODE);
extern maddress GetRealMemoryAddress(maddress baseaddress,maddress address, char memType);
extern bool GetBaseAddress(void *pAddr, maddress &pBaseAddr);
inline bool GetBaseAddresses( void )
{
bool success = false;
success = GetBaseAddress(SAMPLE_DLLFUNC, gameDllAddress);
if(success == false) return false;
success = GetBaseAddress(SAMPLE_ENGFUNC, gameEngAddress);
if(success == false) return false;
return true;
}
#endif

View File

@ -1,33 +0,0 @@
#include "MemMisc.h"
#define NATIVE_MISC_ADDRESS params[1]
#define NATIVE_MISC_BASEADDRESS PickBaseAddress(params[2])
#define NATIVE_MISC_FLAGS params[3]
static cell AMX_NATIVE_CALL memhack_get_base(AMX *amx, cell *params)
{
cell *success = MF_GetAmxAddr(amx, params[2]);
maddress BaseAddr = NULL;
bool is_success = GetBaseAddress((void*)(params[1]), BaseAddr);
*success = is_success;
return cell(BaseAddr);
}
static cell AMX_NATIVE_CALL memhack_get_realaddr(AMX *amx, cell *params)
{
return (cell)GetRealMemoryAddress(NATIVE_MISC_ADDRESS,NATIVE_MISC_BASEADDRESS,NATIVE_MISC_FLAGS);
}
static cell AMX_NATIVE_CALL memhack_return_addr(AMX *amx, cell *params)
{
return (cell)PickBaseAddress(params[1]);
}
AMX_NATIVE_INFO misc_natives[] = {
{ "memhack_get_base", memhack_get_base },
{ "memhack_get_realaddr", memhack_get_realaddr },
{ "memhack_return_addr", memhack_return_addr },
{ NULL, NULL }
};

View File

@ -1,56 +0,0 @@
#include "MemMisc.h"
/* Functions that read different data types in memory */
template <typename Type>
Type UTIL_ReadMemory(maddress BaseAddress, maddress StartAddress, char MemType, Type returnType)
{
maddress EndAddress = GetRealMemoryAddress(BaseAddress, StartAddress, MemType);
return *(Type*)EndAddress;
}
char UTIL_ReadMemory_Byte(maddress BaseAddress, maddress address, char memType)
{
return UTIL_ReadMemory( BaseAddress, address, memType, char(NULL));
}
short UTIL_ReadMemory_Word(maddress BaseAddress, maddress address, char memType)
{
return UTIL_ReadMemory( BaseAddress, address, memType, short(NULL));
}
int32_t UTIL_ReadMemory_Dword(maddress BaseAddress, maddress address, char memType)
{
return UTIL_ReadMemory( BaseAddress, address, memType, int32_t(NULL));
}
long long UTIL_ReadMemory_Qword(maddress BaseAddress, maddress address, char memType)
{
return UTIL_ReadMemory( BaseAddress, address, memType, (long long)(NULL));
}
float UTIL_ReadMemory_Float(maddress BaseAddress, maddress address, char memType)
{
return UTIL_ReadMemory( BaseAddress, address, memType, float(NULL));
}
unsigned char UTIL_ReadMemory_UnsignedByte(maddress BaseAddress, maddress address, char memType)
{
return UTIL_ReadMemory( BaseAddress, address, memType, (unsigned char)(NULL));
}
unsigned short UTIL_ReadMemory_UnsignedWord(maddress BaseAddress, maddress address, char memType)
{
return UTIL_ReadMemory( BaseAddress, address, memType, (unsigned short)(NULL));
}
uint32_t UTIL_ReadMemory_UnsignedDword(maddress BaseAddress, maddress address, char memType)
{
return UTIL_ReadMemory( BaseAddress, address, memType, uint32_t(NULL));
}
maddress UTIL_ReadMemory_Pointer(maddress BaseAddress, maddress address, char memType)
{
return UTIL_ReadMemory( BaseAddress, address, memType, maddress(NULL));
}

View File

@ -1,23 +0,0 @@
#ifndef __MEMREAD_H__
#define __MEMREAD_H__
#include "MemMisc.h"
// Functions that read different data types in memory
// Base function
template <typename Type>
extern Type UTIL_ReadMemory(maddress BaseAddress, maddress StartAddress, char MemType, Type returnType);
// Inline stocks
inline char UTIL_ReadMemory_Byte (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
inline short UTIL_ReadMemory_Word (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
inline int32_t UTIL_ReadMemory_Dword (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
inline long long UTIL_ReadMemory_Qword (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
inline float UTIL_ReadMemory_Float (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
inline unsigned char UTIL_ReadMemory_UnsignedByte (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
inline unsigned short UTIL_ReadMemory_UnsignedWord (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
inline uint32_t UTIL_ReadMemory_UnsignedDword (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
inline maddress UTIL_ReadMemory_Pointer (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
#endif

View File

@ -1,78 +0,0 @@
#include "MemRead.h"
#define NATIVE_HACK_BASEADDRESS PickBaseAddress(params[2])
#define NATIVE_HACK_ADDRESS params[1]
#define NATIVE_HACK_FLAGS params[3]
#define NATIVE_HACK_SIGNED params[4]
#define NATIVE_HACK_MEMORY NATIVE_HACK_BASEADDRESS, NATIVE_HACK_ADDRESS, NATIVE_HACK_FLAGS
static cell AMX_NATIVE_CALL memhack_get_char(AMX *amx, cell *params)
{
if(NATIVE_HACK_SIGNED)
{
char HackedMemory = UTIL_ReadMemory_Byte(NATIVE_HACK_MEMORY);
return (cell)(HackedMemory);
}
else
{
unsigned char HackedMemory = UTIL_ReadMemory_UnsignedByte(NATIVE_HACK_MEMORY);
return (cell)(HackedMemory);
}
}
static cell AMX_NATIVE_CALL memhack_get_short(AMX *amx, cell *params)
{
if(NATIVE_HACK_SIGNED)
{
short HackedMemory = UTIL_ReadMemory_Word(NATIVE_HACK_MEMORY);
return (cell)(HackedMemory);
}
else
{
unsigned short HackedMemory = UTIL_ReadMemory_UnsignedWord(NATIVE_HACK_MEMORY);
return (cell)(HackedMemory);
}
}
static cell AMX_NATIVE_CALL memhack_get_long(AMX *amx, cell *params)
{
if(NATIVE_HACK_SIGNED)
{
long HackedMemory = UTIL_ReadMemory_Dword(NATIVE_HACK_MEMORY);
return (cell)(HackedMemory);
}
else
{
unsigned long HackedMemory = UTIL_ReadMemory_UnsignedDword(NATIVE_HACK_MEMORY);
return (cell)(HackedMemory);
}
}
static cell AMX_NATIVE_CALL memhack_get_quad(AMX *amx, cell *params)
{
long long HackedMemory = UTIL_ReadMemory_Qword(NATIVE_HACK_MEMORY);
return amx_ftoc(float(HackedMemory));
}
static cell AMX_NATIVE_CALL memhack_get_float(AMX *amx, cell *params)
{
float HackedMemory = UTIL_ReadMemory_Float(NATIVE_HACK_MEMORY);
return amx_ftoc(HackedMemory);
}
static cell AMX_NATIVE_CALL memhack_get_pointer(AMX *amx, cell *params)
{
maddress HackedMemory = UTIL_ReadMemory_Pointer(NATIVE_HACK_MEMORY);
return (cell)(HackedMemory);
}
AMX_NATIVE_INFO read_natives[] = {
{ "memhack_get_char", memhack_get_char },
{ "memhack_get_short", memhack_get_short },
{ "memhack_get_long", memhack_get_long },
{ "memhack_get_float", memhack_get_float },
{ "memhack_get_quad", memhack_get_quad },
{ "memhack_get_pointer", memhack_get_pointer },
{ NULL, NULL }
};

View File

@ -1,78 +0,0 @@
#include "MemMisc.h"
/* Functions that patch different data types in memory */
template <typename Type>
int UTIL_PatchMemory(maddress baseaddress, maddress address, Type patch, char memType, size_t byteType, bool extraProtect)
{
unsigned long oldProtect = 0;
maddress realAddress = GetRealMemoryAddress(baseaddress, address, memType);
switch (memType)
{
case MEMTYPE_CODE:
if (MemoryProtect((void*)realAddress, byteType, MPROT_CODE_EDIT, &oldProtect, memType) == MP_FAIL) return MP_FAIL;
break;
case MEMTYPE_RODATA:
if (MemoryProtect((void*)realAddress, byteType, MPROT_RODATA_EDIT, &oldProtect, memType) == MP_FAIL) return MP_FAIL;
break;
}
*(Type*)realAddress = patch;
if (memType == MEMTYPE_CODE)
{
MemoryProtect((void*)realAddress, byteType, oldProtect, &oldProtect);
}
else if(extraProtect == true)
{
if(memType == MEMTYPE_RODATA) MemoryProtect((void*)realAddress, byteType, oldProtect, &oldProtect);
}
return MP_OK;
}
int UTIL_PatchMemory_Byte(maddress baseaddress, maddress address, char patch, char memType)
{
return UTIL_PatchMemory(baseaddress, address, (char)patch, memType, BYTE_BYTES, true);
}
int UTIL_PatchMemory_Word(maddress baseaddress, maddress address, short patch, char memType)
{
return UTIL_PatchMemory(baseaddress, address, (short)patch, memType, WORD_BYTES, true);
}
int UTIL_PatchMemory_Dword(maddress baseaddress, maddress address, int32_t patch, char memType)
{
return UTIL_PatchMemory(baseaddress, address, (int32_t)patch, memType, DWORD_BYTES, true);
}
int UTIL_PatchMemory_Qword(maddress baseaddress, maddress address, long long patch, char memType)
{
return UTIL_PatchMemory(baseaddress, address, (long long)patch, memType, QWORD_BYTES, false);
}
int UTIL_PatchMemory_Float(maddress baseaddress, maddress address, float patch, char memType)
{
return UTIL_PatchMemory(baseaddress, address, (float)patch, memType, FLOAT_BYTES, false);
}
int UTIL_PatchMemory_UnsignedByte(maddress baseaddress, maddress address, unsigned char patch, char memType)
{
return UTIL_PatchMemory(baseaddress, address, (unsigned char)patch, memType, BYTE_BYTES, false);
}
int UTIL_PatchMemory_UnsignedWord(maddress baseaddress, maddress address, unsigned short patch, char memType)
{
return UTIL_PatchMemory(baseaddress, address, (unsigned short)patch, memType, WORD_BYTES, false);
}
int UTIL_PatchMemory_UnsignedDword(maddress baseaddress, maddress address, uint32_t patch, char memType)
{
return UTIL_PatchMemory(baseaddress, address, (uint32_t)patch, memType, DWORD_BYTES, false);
}
int UTIL_PatchMemory_Pointer(maddress baseaddress, maddress address, maddress patch, char memType)
{
return UTIL_PatchMemory(baseaddress, address, (maddress)patch, memType, DWORD_BYTES, true);
}

View File

@ -1,23 +0,0 @@
#ifndef __MEMWRITE_H__
#define __MEMWRITE_H__
#include "MemMisc.h"
// Functions that patch different data types in memory
// Base function
template <typename Type>
inline int UTIL_PatchMemory(maddress baseaddress, maddress address, Type patch, char memType, size_t byteType, bool extraProtect);
// Inline stocks
extern inline int UTIL_PatchMemory_Byte (maddress baseaddress, maddress address, char patch, char memType = MEMTYPE_DATA);
extern inline int UTIL_PatchMemory_Word (maddress baseaddress, maddress address, short patch, char memType = MEMTYPE_DATA);
extern inline int UTIL_PatchMemory_Dword (maddress baseaddress, maddress address, int32_t patch, char memType = MEMTYPE_DATA);
extern inline int UTIL_PatchMemory_Qword (maddress baseaddress, maddress address, long long patch, char memType = MEMTYPE_DATA);
extern inline int UTIL_PatchMemory_Float (maddress baseaddress, maddress address, float patch, char memType = MEMTYPE_DATA);
extern inline int UTIL_PatchMemory_UnsignedByte (maddress baseaddress, maddress address, unsigned char patch, char memType = MEMTYPE_DATA);
extern inline int UTIL_PatchMemory_UnsignedWord (maddress baseaddress, maddress address, unsigned short patch, char memType = MEMTYPE_DATA);
extern inline int UTIL_PatchMemory_UnsignedDword (maddress baseaddress, maddress address, uint32_t patch, char memType = MEMTYPE_DATA);
extern inline int UTIL_PatchMemory_Pointer (maddress baseaddress, maddress address, maddress patch, char memType = MEMTYPE_DATA);
#endif

View File

@ -1,72 +0,0 @@
#include "MemWrite.h"
#define NATIVE_PATCH_BASEADDRESS PickBaseAddress(params[2])
#define NATIVE_PATCH_ADDRESS params[1]
#define NATIVE_PATCH_FLAGS params[4]
#define NATIVE_PATCH_SIGNED params[5]
#define NATIVE_PATCH_PARAMETER params[3]
#define NATIVE_PATCH_MEMORY NATIVE_PATCH_BASEADDRESS, NATIVE_PATCH_ADDRESS
static cell AMX_NATIVE_CALL memhack_set_char(AMX *amx, cell *params)
{
if(NATIVE_PATCH_SIGNED)
{
return (cell)UTIL_PatchMemory_Byte(NATIVE_PATCH_MEMORY, (char)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
}
else
{
return (cell)UTIL_PatchMemory_UnsignedByte(NATIVE_PATCH_MEMORY, (unsigned char)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
}
}
static cell AMX_NATIVE_CALL memhack_set_short(AMX *amx, cell *params)
{
if(NATIVE_PATCH_SIGNED)
{
return (cell)UTIL_PatchMemory_Word(NATIVE_PATCH_MEMORY, (short)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
}
else
{
return (cell)UTIL_PatchMemory_UnsignedWord(NATIVE_PATCH_MEMORY, (unsigned short)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
}
}
static cell AMX_NATIVE_CALL memhack_set_long(AMX *amx, cell *params)
{
if(NATIVE_PATCH_SIGNED)
{
return (cell)UTIL_PatchMemory_Dword(NATIVE_PATCH_MEMORY, (long)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
}
else
{
return (cell)UTIL_PatchMemory_Dword(NATIVE_PATCH_MEMORY, (unsigned long)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
}
}
static cell AMX_NATIVE_CALL memhack_set_quad(AMX *amx, cell *params)
{
return (cell)UTIL_PatchMemory_Qword(NATIVE_PATCH_MEMORY, (long long)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
}
static cell AMX_NATIVE_CALL memhack_set_float(AMX *amx, cell *params)
{
return (cell)UTIL_PatchMemory_Float(NATIVE_PATCH_MEMORY, amx_ctof(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
}
static cell AMX_NATIVE_CALL memhack_set_pointer(AMX *amx, cell *params)
{
return (cell)UTIL_PatchMemory_Pointer(NATIVE_PATCH_MEMORY, (maddress)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
}
AMX_NATIVE_INFO write_natives[] = {
{ "memhack_set_char", memhack_set_char },
{ "memhack_set_short", memhack_set_short },
{ "memhack_set_long", memhack_set_long },
{ "memhack_set_float", memhack_set_float },
{ "memhack_set_quad", memhack_set_quad },
{ "memhack_set_pointer", memhack_set_pointer },
{ NULL, NULL }
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,20 +0,0 @@
#include <memhack_const>
native memhack_get_char(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
native memhack_get_short(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
native memhack_get_long(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
native Float:memhack_get_float(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA);
native Float:memhack_get_quad(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA);
native memhack_get_pointer(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA);
native memhack_set_char(address,baseaddress = DLLBASE, new_val, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
native memhack_set_short(address,baseaddress = DLLBASE, new_val, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
native memhack_set_long(address,baseaddress = DLLBASE, new_val, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
native memhack_set_float(address,baseaddress = DLLBASE, Float:new_val, memtype = MEMTYPE_DATA);
native memhack_set_quad(address,baseaddress = DLLBASE,Float:new_val, memtype = MEMTYPE_DATA);
native memhack_set_pointer(address,baseaddress = DLLBASE, new_val, memtype = MEMTYPE_DATA);
native memhack_get_base(func_addr,&success);
native memhack_get_realaddr(address,baseaddress,memtype = MEMTYPE_DATA);

View File

@ -1,23 +0,0 @@
#if defined _memhack_const_included
#endinput
#endif
#define _memhack_const_included
// Different Address Bases
#define MEM_DLLBASE 0
#define MEM_ENGBASE 1
#define MEM_NULLBASE 2
// Signed or unsigned
#define MEM_SIGNED 0
#define MEM_UNSIGNED 1
// Memory area types
#define MEMTYPE_CODE 0 // Code (usually .text segment, requires mprotect or VirtualProtect)
#define MEMTYPE_DATA 1 // Data (usually .data segment, writable by default)
#define MEMTYPE_RODATA 2 // Read-Only Data (usually .rodata on Linux, .rdata on Windows)
// Return codes for patching (set natives)
#define MP_FAIL -1
#define MP_OK 0

View File

@ -1,463 +0,0 @@
// Configuration
#ifndef __MODULECONFIG_H__
#define __MODULECONFIG_H__
// Module info
#define MODULE_NAME "MemHack"
#define MODULE_VERSION "1.65"
#define MODULE_AUTHOR "SD and Rukia"
#define MODULE_URL "www.amxmodx.org"
#define MODULE_LOGTAG "MEMHACK"
// If you want the module not to be reloaded on mapchange, remove / comment out the next line
#define MODULE_RELOAD_ON_MAPCHANGE
#ifdef __DATE__
#define MODULE_DATE __DATE__
#else // __DATE__
#define MODULE_DATE "Unknown"
#endif // __DATE__
// metamod plugin?
#define USE_METAMOD
// - AMXX Init functions
// Also consider using FN_META_*
// AMXX query
//#define FN_AMXX_QUERY OnAmxxQuery
// AMXX attach
// Do native functions init here (MF_AddNatives)
#define FN_AMXX_ATTACH OnAmxxAttach
// AMXX dettach
//#define FN_AMXX_DETTACH OnAmxxDettach
// All plugins loaded
// Do forward functions init here (MF_RegisterForward)
// #define FN_AMXX_PLUGINSLOADED OnPluginsLoaded
/**** METAMOD ****/
// If your module doesn't use metamod, you may close the file now :)
#ifdef USE_METAMOD
// ----
// Hook Functions
// Uncomment these to be called
// You can also change the function name
// - Metamod init functions
// Also consider using FN_AMXX_*
// Meta query
//#define FN_META_QUERY OnMetaQuery
// Meta attach
//#define FN_META_ATTACH OnMetaAttach
// Meta dettach
//#define FN_META_DETTACH OnMetaDettach
// (wd) are Will Day's notes
// - GetEntityAPI2 functions
// #define FN_GameDLLInit GameDLLInit /* pfnGameInit() */
// #define FN_DispatchSpawn DispatchSpawn /* pfnSpawn() */
// #define FN_DispatchThink DispatchThink /* pfnThink() */
// #define FN_DispatchUse DispatchUse /* pfnUse() */
// #define FN_DispatchTouch DispatchTouch /* pfnTouch() */
// #define FN_DispatchBlocked DispatchBlocked /* pfnBlocked() */
// #define FN_DispatchKeyValue DispatchKeyValue /* pfnKeyValue() */
// #define FN_DispatchSave DispatchSave /* pfnSave() */
// #define FN_DispatchRestore DispatchRestore /* pfnRestore() */
// #define FN_DispatchObjectCollsionBox DispatchObjectCollsionBox /* pfnSetAbsBox() */
// #define FN_SaveWriteFields SaveWriteFields /* pfnSaveWriteFields() */
// #define FN_SaveReadFields SaveReadFields /* pfnSaveReadFields() */
// #define FN_SaveGlobalState SaveGlobalState /* pfnSaveGlobalState() */
// #define FN_RestoreGlobalState RestoreGlobalState /* pfnRestoreGlobalState() */
// #define FN_ResetGlobalState ResetGlobalState /* pfnResetGlobalState() */
// #define FN_ClientConnect ClientConnect /* pfnClientConnect() (wd) Client has connected */
// #define FN_ClientDisconnect ClientDisconnect /* pfnClientDisconnect() (wd) Player has left the game */
// #define FN_ClientKill ClientKill /* pfnClientKill() (wd) Player has typed "kill" */
// #define FN_ClientPutInServer ClientPutInServer /* pfnClientPutInServer() (wd) Client is entering the game */
// #define FN_ClientCommand ClientCommand /* pfnClientCommand() (wd) Player has sent a command (typed or from a bind) */
// #define FN_ClientUserInfoChanged ClientUserInfoChanged /* pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure */
// #define FN_ServerActivate ServerActivate /* pfnServerActivate() (wd) Server is starting a new map */
// #define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */
// #define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */
// #define FN_PlayerPostThink PlayerPostThink /* pfnPlayerPostThink() */
// #define FN_StartFrame StartFrame /* pfnStartFrame() */
// #define FN_ParmsNewLevel ParmsNewLevel /* pfnParmsNewLevel() */
// #define FN_ParmsChangeLevel ParmsChangeLevel /* pfnParmsChangeLevel() */
// #define FN_GetGameDescription GetGameDescription /* pfnGetGameDescription() Returns string describing current .dll. E.g. "TeamFotrress 2" "Half-Life" */
// #define FN_PlayerCustomization PlayerCustomization /* pfnPlayerCustomization() Notifies .dll of new customization for player. */
// #define FN_SpectatorConnect SpectatorConnect /* pfnSpectatorConnect() Called when spectator joins server */
// #define FN_SpectatorDisconnect SpectatorDisconnect /* pfnSpectatorDisconnect() Called when spectator leaves the server */
// #define FN_SpectatorThink SpectatorThink /* pfnSpectatorThink() Called when spectator sends a command packet (usercmd_t) */
// #define FN_Sys_Error Sys_Error /* pfnSys_Error() Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint. SDK2 */
// #define FN_PM_Move PM_Move /* pfnPM_Move() (wd) SDK2 */
// #define FN_PM_Init PM_Init /* pfnPM_Init() Server version of player movement initialization; (wd) SDK2 */
// #define FN_PM_FindTextureType PM_FindTextureType /* pfnPM_FindTextureType() (wd) SDK2 */
// #define FN_SetupVisibility SetupVisibility /* pfnSetupVisibility() Set up PVS and PAS for networking for this client; (wd) SDK2 */
// #define FN_UpdateClientData UpdateClientData /* pfnUpdateClientData() Set up data sent only to specific client; (wd) SDK2 */
// #define FN_AddToFullPack AddToFullPack /* pfnAddToFullPack() (wd) SDK2 */
// #define FN_CreateBaseline CreateBaseline /* pfnCreateBaseline() Tweak entity baseline for network encoding allows setup of player baselines too.; (wd) SDK2 */
// #define FN_RegisterEncoders RegisterEncoders /* pfnRegisterEncoders() Callbacks for network encoding; (wd) SDK2 */
// #define FN_GetWeaponData GetWeaponData /* pfnGetWeaponData() (wd) SDK2 */
// #define FN_CmdStart CmdStart /* pfnCmdStart() (wd) SDK2 */
// #define FN_CmdEnd CmdEnd /* pfnCmdEnd() (wd) SDK2 */
// #define FN_ConnectionlessPacket ConnectionlessPacket /* pfnConnectionlessPacket() (wd) SDK2 */
// #define FN_GetHullBounds GetHullBounds /* pfnGetHullBounds() (wd) SDK2 */
// #define FN_CreateInstancedBaselines CreateInstancedBaselines /* pfnCreateInstancedBaselines() (wd) SDK2 */
// #define FN_InconsistentFile InconsistentFile /* pfnInconsistentFile() (wd) SDK2 */
// #define FN_AllowLagCompensation AllowLagCompensation /* pfnAllowLagCompensation() (wd) SDK2 */
// - GetEntityAPI2_Post functions
// #define FN_GameDLLInit_Post GameDLLInit_Post
// #define FN_DispatchSpawn_Post DispatchSpawn_Post
// #define FN_DispatchThink_Post DispatchThink_Post
// #define FN_DispatchUse_Post DispatchUse_Post
// #define FN_DispatchTouch_Post DispatchTouch_Post
// #define FN_DispatchBlocked_Post DispatchBlocked_Post
// #define FN_DispatchKeyValue_Post DispatchKeyValue_Post
// #define FN_DispatchSave_Post DispatchSave_Post
// #define FN_DispatchRestore_Post DispatchRestore_Post
// #define FN_DispatchObjectCollsionBox_Post DispatchObjectCollsionBox_Post
// #define FN_SaveWriteFields_Post SaveWriteFields_Post
// #define FN_SaveReadFields_Post SaveReadFields_Post
// #define FN_SaveGlobalState_Post SaveGlobalState_Post
// #define FN_RestoreGlobalState_Post RestoreGlobalState_Post
// #define FN_ResetGlobalState_Post ResetGlobalState_Post
// #define FN_ClientConnect_Post ClientConnect_Post
// #define FN_ClientDisconnect_Post ClientDisconnect_Post
// #define FN_ClientKill_Post ClientKill_Post
// #define FN_ClientPutInServer_Post ClientPutInServer_Post
// #define FN_ClientCommand_Post ClientCommand_Post
// #define FN_ClientUserInfoChanged_Post ClientUserInfoChanged_Post
// #define FN_ServerActivate_Post ServerActivate_Post
// #define FN_ServerDeactivate_Post ServerDeactivate_Post
// #define FN_PlayerPreThink_Post PlayerPreThink_Post
// #define FN_PlayerPostThink_Post PlayerPostThink_Post
// #define FN_StartFrame_Post StartFrame_Post
// #define FN_ParmsNewLevel_Post ParmsNewLevel_Post
// #define FN_ParmsChangeLevel_Post ParmsChangeLevel_Post
// #define FN_GetGameDescription_Post GetGameDescription_Post
// #define FN_PlayerCustomization_Post PlayerCustomization_Post
// #define FN_SpectatorConnect_Post SpectatorConnect_Post
// #define FN_SpectatorDisconnect_Post SpectatorDisconnect_Post
// #define FN_SpectatorThink_Post SpectatorThink_Post
// #define FN_Sys_Error_Post Sys_Error_Post
// #define FN_PM_Move_Post PM_Move_Post
// #define FN_PM_Init_Post PM_Init_Post
// #define FN_PM_FindTextureType_Post PM_FindTextureType_Post
// #define FN_SetupVisibility_Post SetupVisibility_Post
// #define FN_UpdateClientData_Post UpdateClientData_Post
// #define FN_AddToFullPack_Post AddToFullPack_Post
// #define FN_CreateBaseline_Post CreateBaseline_Post
// #define FN_RegisterEncoders_Post RegisterEncoders_Post
// #define FN_GetWeaponData_Post GetWeaponData_Post
// #define FN_CmdStart_Post CmdStart_Post
// #define FN_CmdEnd_Post CmdEnd_Post
// #define FN_ConnectionlessPacket_Post ConnectionlessPacket_Post
// #define FN_GetHullBounds_Post GetHullBounds_Post
// #define FN_CreateInstancedBaselines_Post CreateInstancedBaselines_Post
// #define FN_InconsistentFile_Post InconsistentFile_Post
// #define FN_AllowLagCompensation_Post AllowLagCompensation_Post
// - GetEngineAPI functions
// #define FN_PrecacheModel PrecacheModel
// #define FN_PrecacheSound PrecacheSound
// #define FN_SetModel SetModel
// #define FN_ModelIndex ModelIndex
// #define FN_ModelFrames ModelFrames
// #define FN_SetSize SetSize
// #define FN_ChangeLevel ChangeLevel
// #define FN_GetSpawnParms GetSpawnParms
// #define FN_SaveSpawnParms SaveSpawnParms
// #define FN_VecToYaw VecToYaw
// #define FN_VecToAngles VecToAngles
// #define FN_MoveToOrigin MoveToOrigin
// #define FN_ChangeYaw ChangeYaw
// #define FN_ChangePitch ChangePitch
// #define FN_FindEntityByString FindEntityByString
// #define FN_GetEntityIllum GetEntityIllum
// #define FN_FindEntityInSphere FindEntityInSphere
// #define FN_FindClientInPVS FindClientInPVS
// #define FN_EntitiesInPVS EntitiesInPVS
// #define FN_MakeVectors MakeVectors
// #define FN_AngleVectors AngleVectors
// #define FN_CreateEntity CreateEntity
// #define FN_RemoveEntity RemoveEntity
// #define FN_CreateNamedEntity CreateNamedEntity
// #define FN_MakeStatic MakeStatic
// #define FN_EntIsOnFloor EntIsOnFloor
// #define FN_DropToFloor DropToFloor
// #define FN_WalkMove WalkMove
// #define FN_SetOrigin SetOrigin
// #define FN_EmitSound EmitSound
// #define FN_EmitAmbientSound EmitAmbientSound
// #define FN_TraceLine TraceLine
// #define FN_TraceToss TraceToss
// #define FN_TraceMonsterHull TraceMonsterHull
// #define FN_TraceHull TraceHull
// #define FN_TraceModel TraceModel
// #define FN_TraceTexture TraceTexture
// #define FN_TraceSphere TraceSphere
// #define FN_GetAimVector GetAimVector
// #define FN_ServerCommand ServerCommand
// #define FN_ServerExecute ServerExecute
// #define FN_engClientCommand engClientCommand
// #define FN_ParticleEffect ParticleEffect
// #define FN_LightStyle LightStyle
// #define FN_DecalIndex DecalIndex
// #define FN_PointContents PointContents
// #define FN_MessageBegin MessageBegin
// #define FN_MessageEnd MessageEnd
// #define FN_WriteByte WriteByte
// #define FN_WriteChar WriteChar
// #define FN_WriteShort WriteShort
// #define FN_WriteLong WriteLong
// #define FN_WriteAngle WriteAngle
// #define FN_WriteCoord WriteCoord
// #define FN_WriteString WriteString
// #define FN_WriteEntity WriteEntity
// #define FN_CVarRegister CVarRegister
// #define FN_CVarGetFloat CVarGetFloat
// #define FN_CVarGetString CVarGetString
// #define FN_CVarSetFloat CVarSetFloat
// #define FN_CVarSetString CVarSetString
// #define FN_AlertMessage AlertMessage
// #define FN_EngineFprintf EngineFprintf
// #define FN_PvAllocEntPrivateData PvAllocEntPrivateData
// #define FN_PvEntPrivateData PvEntPrivateData
// #define FN_FreeEntPrivateData FreeEntPrivateData
// #define FN_SzFromIndex SzFromIndex
// #define FN_AllocString AllocString
// #define FN_GetVarsOfEnt GetVarsOfEnt
// #define FN_PEntityOfEntOffset PEntityOfEntOffset
// #define FN_EntOffsetOfPEntity EntOffsetOfPEntity
// #define FN_IndexOfEdict IndexOfEdict
// #define FN_PEntityOfEntIndex PEntityOfEntIndex
// #define FN_FindEntityByVars FindEntityByVars
// #define FN_GetModelPtr GetModelPtr
// #define FN_RegUserMsg RegUserMsg
// #define FN_AnimationAutomove AnimationAutomove
// #define FN_GetBonePosition GetBonePosition
// #define FN_FunctionFromName FunctionFromName
// #define FN_NameForFunction NameForFunction
// #define FN_ClientPrintf ClientPrintf
// #define FN_ServerPrint ServerPrint
// #define FN_Cmd_Args Cmd_Args
// #define FN_Cmd_Argv Cmd_Argv
// #define FN_Cmd_Argc Cmd_Argc
// #define FN_GetAttachment GetAttachment
// #define FN_CRC32_Init CRC32_Init
// #define FN_CRC32_ProcessBuffer CRC32_ProcessBuffer
// #define FN_CRC32_ProcessByte CRC32_ProcessByte
// #define FN_CRC32_Final CRC32_Final
// #define FN_RandomLong RandomLong
// #define FN_RandomFloat RandomFloat
// #define FN_SetView SetView
// #define FN_Time Time
// #define FN_CrosshairAngle CrosshairAngle
// #define FN_LoadFileForMe LoadFileForMe
// #define FN_FreeFile FreeFile
// #define FN_EndSection EndSection
// #define FN_CompareFileTime CompareFileTime
// #define FN_GetGameDir GetGameDir
// #define FN_Cvar_RegisterVariable Cvar_RegisterVariable
// #define FN_FadeClientVolume FadeClientVolume
// #define FN_SetClientMaxspeed SetClientMaxspeed
// #define FN_CreateFakeClient CreateFakeClient
// #define FN_RunPlayerMove RunPlayerMove
// #define FN_NumberOfEntities NumberOfEntities
// #define FN_GetInfoKeyBuffer GetInfoKeyBuffer
// #define FN_InfoKeyValue InfoKeyValue
// #define FN_SetKeyValue SetKeyValue
// #define FN_SetClientKeyValue SetClientKeyValue
// #define FN_IsMapValid IsMapValid
// #define FN_StaticDecal StaticDecal
// #define FN_PrecacheGeneric PrecacheGeneric
// #define FN_GetPlayerUserId GetPlayerUserId
// #define FN_BuildSoundMsg BuildSoundMsg
// #define FN_IsDedicatedServer IsDedicatedServer
// #define FN_CVarGetPointer CVarGetPointer
// #define FN_GetPlayerWONId GetPlayerWONId
// #define FN_Info_RemoveKey Info_RemoveKey
// #define FN_GetPhysicsKeyValue GetPhysicsKeyValue
// #define FN_SetPhysicsKeyValue SetPhysicsKeyValue
// #define FN_GetPhysicsInfoString GetPhysicsInfoString
// #define FN_PrecacheEvent PrecacheEvent
// #define FN_PlaybackEvent PlaybackEvent
// #define FN_SetFatPVS SetFatPVS
// #define FN_SetFatPAS SetFatPAS
// #define FN_CheckVisibility CheckVisibility
// #define FN_DeltaSetField DeltaSetField
// #define FN_DeltaUnsetField DeltaUnsetField
// #define FN_DeltaAddEncoder DeltaAddEncoder
// #define FN_GetCurrentPlayer GetCurrentPlayer
// #define FN_CanSkipPlayer CanSkipPlayer
// #define FN_DeltaFindField DeltaFindField
// #define FN_DeltaSetFieldByIndex DeltaSetFieldByIndex
// #define FN_DeltaUnsetFieldByIndex DeltaUnsetFieldByIndex
// #define FN_SetGroupMask SetGroupMask
// #define FN_engCreateInstancedBaseline engCreateInstancedBaseline
// #define FN_Cvar_DirectSet Cvar_DirectSet
// #define FN_ForceUnmodified ForceUnmodified
// #define FN_GetPlayerStats GetPlayerStats
// #define FN_AddServerCommand AddServerCommand
// #define FN_Voice_GetClientListening Voice_GetClientListening
// #define FN_Voice_SetClientListening Voice_SetClientListening
// #define FN_GetPlayerAuthId GetPlayerAuthId
// - GetEngineAPI_Post functions
// #define FN_PrecacheModel_Post PrecacheModel_Post
// #define FN_PrecacheSound_Post PrecacheSound_Post
// #define FN_SetModel_Post SetModel_Post
// #define FN_ModelIndex_Post ModelIndex_Post
// #define FN_ModelFrames_Post ModelFrames_Post
// #define FN_SetSize_Post SetSize_Post
// #define FN_ChangeLevel_Post ChangeLevel_Post
// #define FN_GetSpawnParms_Post GetSpawnParms_Post
// #define FN_SaveSpawnParms_Post SaveSpawnParms_Post
// #define FN_VecToYaw_Post VecToYaw_Post
// #define FN_VecToAngles_Post VecToAngles_Post
// #define FN_MoveToOrigin_Post MoveToOrigin_Post
// #define FN_ChangeYaw_Post ChangeYaw_Post
// #define FN_ChangePitch_Post ChangePitch_Post
// #define FN_FindEntityByString_Post FindEntityByString_Post
// #define FN_GetEntityIllum_Post GetEntityIllum_Post
// #define FN_FindEntityInSphere_Post FindEntityInSphere_Post
// #define FN_FindClientInPVS_Post FindClientInPVS_Post
// #define FN_EntitiesInPVS_Post EntitiesInPVS_Post
// #define FN_MakeVectors_Post MakeVectors_Post
// #define FN_AngleVectors_Post AngleVectors_Post
// #define FN_CreateEntity_Post CreateEntity_Post
// #define FN_RemoveEntity_Post RemoveEntity_Post
// #define FN_CreateNamedEntity_Post CreateNamedEntity_Post
// #define FN_MakeStatic_Post MakeStatic_Post
// #define FN_EntIsOnFloor_Post EntIsOnFloor_Post
// #define FN_DropToFloor_Post DropToFloor_Post
// #define FN_WalkMove_Post WalkMove_Post
// #define FN_SetOrigin_Post SetOrigin_Post
// #define FN_EmitSound_Post EmitSound_Post
// #define FN_EmitAmbientSound_Post EmitAmbientSound_Post
// #define FN_TraceLine_Post TraceLine_Post
// #define FN_TraceToss_Post TraceToss_Post
// #define FN_TraceMonsterHull_Post TraceMonsterHull_Post
// #define FN_TraceHull_Post TraceHull_Post
// #define FN_TraceModel_Post TraceModel_Post
// #define FN_TraceTexture_Post TraceTexture_Post
// #define FN_TraceSphere_Post TraceSphere_Post
// #define FN_GetAimVector_Post GetAimVector_Post
// #define FN_ServerCommand_Post ServerCommand_Post
// #define FN_ServerExecute_Post ServerExecute_Post
// #define FN_engClientCommand_Post engClientCommand_Post
// #define FN_ParticleEffect_Post ParticleEffect_Post
// #define FN_LightStyle_Post LightStyle_Post
// #define FN_DecalIndex_Post DecalIndex_Post
// #define FN_PointContents_Post PointContents_Post
// #define FN_MessageBegin_Post MessageBegin_Post
// #define FN_MessageEnd_Post MessageEnd_Post
// #define FN_WriteByte_Post WriteByte_Post
// #define FN_WriteChar_Post WriteChar_Post
// #define FN_WriteShort_Post WriteShort_Post
// #define FN_WriteLong_Post WriteLong_Post
// #define FN_WriteAngle_Post WriteAngle_Post
// #define FN_WriteCoord_Post WriteCoord_Post
// #define FN_WriteString_Post WriteString_Post
// #define FN_WriteEntity_Post WriteEntity_Post
// #define FN_CVarRegister_Post CVarRegister_Post
// #define FN_CVarGetFloat_Post CVarGetFloat_Post
// #define FN_CVarGetString_Post CVarGetString_Post
// #define FN_CVarSetFloat_Post CVarSetFloat_Post
// #define FN_CVarSetString_Post CVarSetString_Post
// #define FN_AlertMessage_Post AlertMessage_Post
// #define FN_EngineFprintf_Post EngineFprintf_Post
// #define FN_PvAllocEntPrivateData_Post PvAllocEntPrivateData_Post
// #define FN_PvEntPrivateData_Post PvEntPrivateData_Post
// #define FN_FreeEntPrivateData_Post FreeEntPrivateData_Post
// #define FN_SzFromIndex_Post SzFromIndex_Post
// #define FN_AllocString_Post AllocString_Post
// #define FN_GetVarsOfEnt_Post GetVarsOfEnt_Post
// #define FN_PEntityOfEntOffset_Post PEntityOfEntOffset_Post
// #define FN_EntOffsetOfPEntity_Post EntOffsetOfPEntity_Post
// #define FN_IndexOfEdict_Post IndexOfEdict_Post
// #define FN_PEntityOfEntIndex_Post PEntityOfEntIndex_Post
// #define FN_FindEntityByVars_Post FindEntityByVars_Post
// #define FN_GetModelPtr_Post GetModelPtr_Post
// #define FN_RegUserMsg_Post RegUserMsg_Post
// #define FN_AnimationAutomove_Post AnimationAutomove_Post
// #define FN_GetBonePosition_Post GetBonePosition_Post
// #define FN_FunctionFromName_Post FunctionFromName_Post
// #define FN_NameForFunction_Post NameForFunction_Post
// #define FN_ClientPrintf_Post ClientPrintf_Post
// #define FN_ServerPrint_Post ServerPrint_Post
// #define FN_Cmd_Args_Post Cmd_Args_Post
// #define FN_Cmd_Argv_Post Cmd_Argv_Post
// #define FN_Cmd_Argc_Post Cmd_Argc_Post
// #define FN_GetAttachment_Post GetAttachment_Post
// #define FN_CRC32_Init_Post CRC32_Init_Post
// #define FN_CRC32_ProcessBuffer_Post CRC32_ProcessBuffer_Post
// #define FN_CRC32_ProcessByte_Post CRC32_ProcessByte_Post
// #define FN_CRC32_Final_Post CRC32_Final_Post
// #define FN_RandomLong_Post RandomLong_Post
// #define FN_RandomFloat_Post RandomFloat_Post
// #define FN_SetView_Post SetView_Post
// #define FN_Time_Post Time_Post
// #define FN_CrosshairAngle_Post CrosshairAngle_Post
// #define FN_LoadFileForMe_Post LoadFileForMe_Post
// #define FN_FreeFile_Post FreeFile_Post
// #define FN_EndSection_Post EndSection_Post
// #define FN_CompareFileTime_Post CompareFileTime_Post
// #define FN_GetGameDir_Post GetGameDir_Post
// #define FN_Cvar_RegisterVariable_Post Cvar_RegisterVariable_Post
// #define FN_FadeClientVolume_Post FadeClientVolume_Post
// #define FN_SetClientMaxspeed_Post SetClientMaxspeed_Post
// #define FN_CreateFakeClient_Post CreateFakeClient_Post
// #define FN_RunPlayerMove_Post RunPlayerMove_Post
// #define FN_NumberOfEntities_Post NumberOfEntities_Post
// #define FN_GetInfoKeyBuffer_Post GetInfoKeyBuffer_Post
// #define FN_InfoKeyValue_Post InfoKeyValue_Post
// #define FN_SetKeyValue_Post SetKeyValue_Post
// #define FN_SetClientKeyValue_Post SetClientKeyValue_Post
// #define FN_IsMapValid_Post IsMapValid_Post
// #define FN_StaticDecal_Post StaticDecal_Post
// #define FN_PrecacheGeneric_Post PrecacheGeneric_Post
// #define FN_GetPlayerUserId_Post GetPlayerUserId_Post
// #define FN_BuildSoundMsg_Post BuildSoundMsg_Post
// #define FN_IsDedicatedServer_Post IsDedicatedServer_Post
// #define FN_CVarGetPointer_Post CVarGetPointer_Post
// #define FN_GetPlayerWONId_Post GetPlayerWONId_Post
// #define FN_Info_RemoveKey_Post Info_RemoveKey_Post
// #define FN_GetPhysicsKeyValue_Post GetPhysicsKeyValue_Post
// #define FN_SetPhysicsKeyValue_Post SetPhysicsKeyValue_Post
// #define FN_GetPhysicsInfoString_Post GetPhysicsInfoString_Post
// #define FN_PrecacheEvent_Post PrecacheEvent_Post
// #define FN_PlaybackEvent_Post PlaybackEvent_Post
// #define FN_SetFatPVS_Post SetFatPVS_Post
// #define FN_SetFatPAS_Post SetFatPAS_Post
// #define FN_CheckVisibility_Post CheckVisibility_Post
// #define FN_DeltaSetField_Post DeltaSetField_Post
// #define FN_DeltaUnsetField_Post DeltaUnsetField_Post
// #define FN_DeltaAddEncoder_Post DeltaAddEncoder_Post
// #define FN_GetCurrentPlayer_Post GetCurrentPlayer_Post
// #define FN_CanSkipPlayer_Post CanSkipPlayer_Post
// #define FN_DeltaFindField_Post DeltaFindField_Post
// #define FN_DeltaSetFieldByIndex_Post DeltaSetFieldByIndex_Post
// #define FN_DeltaUnsetFieldByIndex_Post DeltaUnsetFieldByIndex_Post
// #define FN_SetGroupMask_Post SetGroupMask_Post
// #define FN_engCreateInstancedBaseline_Post engCreateInstancedBaseline_Post
// #define FN_Cvar_DirectSet_Post Cvar_DirectSet_Post
// #define FN_ForceUnmodified_Post ForceUnmodified_Post
// #define FN_GetPlayerStats_Post GetPlayerStats_Post
// #define FN_AddServerCommand_Post AddServerCommand_Post
// #define FN_Voice_GetClientListening_Post Voice_GetClientListening_Post
// #define FN_Voice_SetClientListening_Post Voice_SetClientListening_Post
// #define FN_GetPlayerAuthId_Post GetPlayerAuthId_Post
// #define FN_OnFreeEntPrivateData OnFreeEntPrivateData
// #define FN_GameShutdown GameShutdown
// #define FN_ShouldCollide ShouldCollide
// #define FN_OnFreeEntPrivateData_Post OnFreeEntPrivateData_Post
// #define FN_GameShutdown_Post GameShutdown_Post
// #define FN_ShouldCollide_Post ShouldCollide_Post
#endif // USE_METAMOD
#endif // __MODULECONFIG_H__

View File

@ -1,34 +0,0 @@
#include "amxxmodule.h"
#include "ComboArray.h"
extern AMX_NATIVE_INFO bintrie_exports[];
extern AMX_NATIVE_INFO bintrie_usage_exports[];
extern ComboArray MasterTrie;
extern AMX_NATIVE_INFO list_exports[];
extern AMX_NATIVE_INFO list_creation_exports[];
extern ComboArray MasterList;
extern AMX_NATIVE_INFO map_exports[];
extern AMX_NATIVE_INFO map_creation_exports[];
extern ComboArray MasterMap;
void OnAmxxAttach( void )
{
MF_AddNatives(bintrie_exports);
MF_AddNatives(bintrie_usage_exports);
MF_AddNatives(list_exports);
MF_AddNatives(list_creation_exports);
MF_AddNatives(map_exports);
MF_AddNatives(map_creation_exports);
}
void OnAmxxDetach( void )
{
JudyClearMasterTrie(&MasterTrie);
JudyClearMasterList(&MasterList);
JudyClearMasterMap(&MasterMap);
}

View File

@ -1,175 +0,0 @@
# Microsoft Developer Studio Generated Dependency File, included by Array.mak
.\Array.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CArray.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\ComboArray.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\BinTrieNatives.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\BinTrieNativeFunctions.h"\
".\Capsule.h"\
".\CArray.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\ComboArray.h"\
".\GenericNatives.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\NativeIncludes.h"\
".\osdefs.h"\
.\Capsule.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\CArray.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CArray.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\CBinTrie.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\CKeytable.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CKeytable.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\JudyExtra.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\ListNatives.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CArray.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\ComboArray.h"\
".\GenericNatives.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\ListNativeFunctions.h"\
".\moduleconfig.h"\
".\NativeIncludes.h"\
".\osdefs.h"\
.\MapNatives.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CArray.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\CHashtable.h"\
".\CKeytable.h"\
".\ComboArray.h"\
".\ComboTable.h"\
".\GenericNatives.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\MapNativeFunctions.h"\
".\moduleconfig.h"\
".\NativeIncludes.h"\
".\osdefs.h"\
.\amxxmodule.cpp : \
".\amxxmodule.h"\
".\moduleconfig.h"\

View File

@ -1,237 +0,0 @@
# Microsoft Developer Studio Project File - Name="Array" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=Array - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "Array.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "Array.mak" CFG="Array - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "Array - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "Array - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "Array - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /FR /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
!ELSEIF "$(CFG)" == "Array - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
!ENDIF
# Begin Target
# Name "Array - Win32 Release"
# Name "Array - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\Array.cpp
# End Source File
# Begin Source File
SOURCE=.\BinTrieNatives.cpp
# End Source File
# Begin Source File
SOURCE=.\Capsule.cpp
# End Source File
# Begin Source File
SOURCE=.\CArray.cpp
# End Source File
# Begin Source File
SOURCE=.\CBinTrie.cpp
# End Source File
# Begin Source File
SOURCE=.\CKeytable.cpp
# End Source File
# Begin Source File
SOURCE=.\JudyExtra.cpp
# End Source File
# Begin Source File
SOURCE=.\ListNatives.cpp
# End Source File
# Begin Source File
SOURCE=.\MapNatives.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\Capsule.h
# End Source File
# Begin Source File
SOURCE=.\CArray.h
# End Source File
# Begin Source File
SOURCE=.\CBaseList.h
# End Source File
# Begin Source File
SOURCE=.\CBaseMap.h
# End Source File
# Begin Source File
SOURCE=.\CBinTrie.h
# End Source File
# Begin Source File
SOURCE=.\CHashtable.h
# End Source File
# Begin Source File
SOURCE=.\CKeytable.h
# End Source File
# Begin Source File
SOURCE=.\ComboArray.h
# End Source File
# Begin Source File
SOURCE=.\ComboTable.h
# End Source File
# Begin Source File
SOURCE=.\JudyIncludes.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# Begin Source File
SOURCE=.\amxxmodule.cpp
# End Source File
# Begin Source File
SOURCE=.\amxxmodule.h
# End Source File
# Begin Source File
SOURCE=.\BinTrieNativeFunctions.h
# End Source File
# Begin Source File
SOURCE=.\GenericNatives.h
# End Source File
# Begin Source File
SOURCE=.\Judy.h
# End Source File
# Begin Source File
SOURCE=.\JudyEx.h
# End Source File
# Begin Source File
SOURCE=.\JudyExtra.h
# End Source File
# Begin Source File
SOURCE=.\JudyVar.h
# End Source File
# Begin Source File
SOURCE=.\JudyVec.h
# End Source File
# Begin Source File
SOURCE=.\ListNativeFunctions.h
# End Source File
# Begin Source File
SOURCE=.\MapNativeFunctions.h
# End Source File
# Begin Source File
SOURCE=.\moduleconfig.h
# End Source File
# Begin Source File
SOURCE=.\NativeIncludes.h
# End Source File
# Begin Source File
SOURCE=.\osdefs.h
# End Source File
# Begin Source File
SOURCE=.\Judy.lib
# End Source File
# End Group
# End Target
# End Project

View File

@ -1,29 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "Array"=".\Array.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

Binary file not shown.

Binary file not shown.

View File

@ -1,110 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: Array - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPED.tmp" with contents
[
/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /FR"Release/" /Fp"Release/Array.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
"C:\Array\Array.cpp"
"C:\Array\BinTrieNatives.cpp"
"C:\Array\Capsule.cpp"
"C:\Array\CArray.cpp"
"C:\Array\CBinTrie.cpp"
"C:\Array\CKeytable.cpp"
"C:\Array\JudyExtra.cpp"
"C:\Array\ListNatives.cpp"
"C:\Array\MapNatives.cpp"
"C:\Array\amxxmodule.cpp"
]
Creating command line "cl.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPED.tmp"
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPEE.tmp" with contents
[
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /pdb:"Release/Array.pdb" /machine:I386 /out:"Release/Array.dll" /implib:"Release/Array.lib"
.\Release\Array.obj
.\Release\BinTrieNatives.obj
.\Release\Capsule.obj
.\Release\CArray.obj
.\Release\CBinTrie.obj
.\Release\CKeytable.obj
.\Release\JudyExtra.obj
.\Release\ListNatives.obj
.\Release\MapNatives.obj
.\Release\amxxmodule.obj
.\Judy.lib
]
Creating command line "link.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPEE.tmp"
<h3>Output Window</h3>
Compiling...
Array.cpp
BinTrieNatives.cpp
Capsule.cpp
CArray.cpp
CBinTrie.cpp
CKeytable.cpp
JudyExtra.cpp
C:\Array\JudyExtra.cpp(10) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(15) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(20) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(23) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(34) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(41) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(66) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(102) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(107) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(112) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(115) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(127) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(132) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(137) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(140) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(160) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(164) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(167) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(190) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(205) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(210) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(215) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(218) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(230) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(235) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(240) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(243) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(258) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(266) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(274) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(277) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(305) : warning C4101: 'e' : unreferenced local variable
ListNatives.cpp
MapNatives.cpp
amxxmodule.cpp
Linking...
Creating library Release/Array.lib and object Release/Array.exp
LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPF2.tmp" with contents
[
/nologo /o"Release/Array.bsc"
.\Release\Array.sbr
.\Release\BinTrieNatives.sbr
.\Release\Capsule.sbr
.\Release\CArray.sbr
.\Release\CBinTrie.sbr
.\Release\CKeytable.sbr
.\Release\JudyExtra.sbr
.\Release\ListNatives.sbr
.\Release\MapNatives.sbr
.\Release\amxxmodule.sbr]
Creating command line "bscmake.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPF2.tmp"
Creating browse info file...
<h3>Output Window</h3>
<h3>Results</h3>
Array.dll - 0 error(s), 33 warning(s)
</pre>
</body>
</html>

View File

@ -1,78 +0,0 @@
#ifndef _bintrie_NATIVE_FUNC_INC_H
#define _bintrie_NATIVE_FUNC_INC_H
#define JUDY_GLUE_FUNC( x , y ) x ## y
#define JUDY_GLUE_STR( x, y ) #x#y
#define JUDY_MASTER_EDIT_FUNCTIONS
#define JUDY_MASTER_CLEAR_FUNC JUDY_GLUE_FUNC( bintrie , _clear )
#define JUDY_MASTER_CLEAR_STR JUDY_GLUE_STR ( bintrie , _clear )
#define JUDY_MASTER_DELETE_FUNC JUDY_GLUE_FUNC( bintrie , _delete )
#define JUDY_MASTER_DELETE_STR JUDY_GLUE_STR ( bintrie , _delete )
#define JUDY_MASTER_IO_FUNCTIONS
#define JUDY_MASTER_SAVE_FUNC JUDY_GLUE_FUNC( bintrie , _save )
#define JUDY_MASTER_SAVE_STR JUDY_GLUE_STR ( bintrie , _save )
#define JUDY_SAVE_FUNC(bin,file) JudySaveBinTrie(bin , file )
#define JUDY_MASTER_LOAD_FUNC JUDY_GLUE_FUNC( bintrie , _load )
#define JUDY_MASTER_LOAD_STR JUDY_GLUE_STR ( bintrie , _load )
#define JUDY_LOAD_FUNC(bin, file) JudyLoadBinTrie(bin , file )
#define JUDY_MASTER_AMOUNT_FUNCTIONS
#define JUDY_MASTER_COUNT_FUNC JUDY_GLUE_FUNC( bintrie , _count )
#define JUDY_MASTER_COUNT_STR JUDY_GLUE_STR ( bintrie , _count )
#define JUDY_MASTER_BYCOUNT_FUNC JUDY_GLUE_FUNC( bintrie , _bycount )
#define JUDY_MASTER_BYCOUNT_STR JUDY_GLUE_STR ( bintrie , _bycount )
#define JUDY_SLAVE_AMOUNT_FUNCTIONS
#define JUDY_SLAVE_COUNT_FUNC JUDY_GLUE_FUNC( bintrie , _size )
#define JUDY_SLAVE_COUNT_STR JUDY_GLUE_STR ( bintrie , _size )
#define JUDY_SLAVE_BYCOUNT_FUNC JUDY_GLUE_FUNC( bintrie , _get_nth )
#define JUDY_SLAVE_BYCOUNT_STR JUDY_GLUE_STR ( bintrie , _get_nth )
#define JUDY_SLAVE_EDIT_FUNCTIONS
#define JUDY_SLAVE_MEMORY_FUNC JUDY_GLUE_FUNC( bintrie , _memory )
#define JUDY_SLAVE_MEMORY_STR JUDY_GLUE_STR ( bintrie , _memory )
#define JUDY_SLAVE_ISFILLED_FUNC JUDY_GLUE_FUNC( bintrie , _isfilled )
#define JUDY_SLAVE_ISFILLED_STR JUDY_GLUE_STR ( bintrie , _isfilled )
#define JUDY_SLAVE_ISEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _isempty )
#define JUDY_SLAVE_ISEMPTY_STR JUDY_GLUE_STR ( bintrie , _isempty )
#define NO_JUDY_SLAVE_REMOVE_FUNC
#define JUDY_SLAVE_SEARCH_FUNCTIONS
#define JUDY_SLAVE_FIRST_FUNC JUDY_GLUE_FUNC( bintrie , _first )
#define JUDY_SLAVE_LAST_FUNC JUDY_GLUE_FUNC( bintrie , _last )
#define JUDY_SLAVE_FIRST_STR JUDY_GLUE_STR ( bintrie , _first )
#define JUDY_SLAVE_LAST_STR JUDY_GLUE_STR ( bintrie , _last )
#define JUDY_SLAVE_NEXT_FUNC JUDY_GLUE_FUNC( bintrie , _next )
#define JUDY_SLAVE_PREV_FUNC JUDY_GLUE_FUNC( bintrie , _prev )
#define JUDY_SLAVE_NEXT_STR JUDY_GLUE_STR ( bintrie , _next )
#define JUDY_SLAVE_PREV_STR JUDY_GLUE_STR ( bintrie , _prev )
#define JUDY_SLAVE_SEARCH_EMPTY_FUNCTIONS
#define JUDY_SLAVE_FIRSTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _firstempty )
#define JUDY_SLAVE_LASTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _lastempty )
#define JUDY_SLAVE_FIRSTEMPTY_STR JUDY_GLUE_STR ( bintrie , _firstempty )
#define JUDY_SLAVE_LASTEMPTY_STR JUDY_GLUE_STR ( bintrie , _lastempty )
#define JUDY_SLAVE_NEXTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _nextempty )
#define JUDY_SLAVE_PREVEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _prevempty )
#define JUDY_SLAVE_NEXTEMPTY_STR JUDY_GLUE_STR ( bintrie , _nextempty )
#define JUDY_SLAVE_PREVEMPTY_STR JUDY_GLUE_STR ( bintrie , _prevempty )
#endif

View File

@ -1,69 +0,0 @@
#include "CBinTrie.h"
#define KEY_TYPE cell
#define DYNAMIC_UNIT_TYPE BinTrie
#define STORAGE_TYPE cell
#define MASTER_NAME MasterTrie
#define EXPORT_NAME bintrie_exports
#define SEARCH_ERROR_OFFSET 0
#define GET_KEY(params, num) params[num]
#define SET_KEY(stuff, parameter) stuff
#include "BinTrieNativeFunctions.h"
#include "NativeIncludes.h"
static cell AMX_NATIVE_CALL bintrie_create(AMX *amx,cell *params)
{
DTYPE* Unit;
M_ITYPE Index = params[1];
JUDY_CREATE_INDEX(MNAME,Unit,BinTrie,Index);
return Index;
}
static cell AMX_NATIVE_CALL bintrie_set(AMX *amx,cell *params)
{
DTYPE* Unit = NULL;
JUDY_GET_INDEX(MNAME,Unit, params[1]);
ITYPE Indice = JUDY_GET_KEY(params,2);
bool Value = (params[3] != NULL);
try { return Unit->Set(Indice, Value ); }
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Set Function ");
}
static cell AMX_NATIVE_CALL bintrie_get(AMX *amx,cell *params)
{
DTYPE* Unit = NULL;
JUDY_GET_INDEX(MNAME,Unit, params[1]);
ITYPE Indice = JUDY_GET_KEY(params,2);
try { return Unit->Get(Indice ); }
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Get Function ");
}
static cell AMX_NATIVE_CALL bintrie_remove(AMX *amx,cell *params)
{
DTYPE* Unit = NULL;
JUDY_GET_INDEX(MNAME,Unit, params[1]);
ITYPE Indice = JUDY_GET_KEY(params,2);
try { return Unit->Delete(Indice ); }
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Delete Function ");
}
AMX_NATIVE_INFO bintrie_usage_exports[] =
{
{ "bintrie_create", bintrie_create },
{ "bintrie_set", bintrie_set },
{ "bintrie_get", bintrie_get },
{ "bintrie_remove", bintrie_remove },
{ NULL, NULL }
};

View File

@ -1,87 +0,0 @@
#include "CArray.h"
void Array::ThrowSearchError(char* type)
{
char value[50];
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
throw JudyEx(value,false);
}
void Array::ThrowIndexError( cell index, bool disable_check )
{
if(disable_check == true) return;
char error[50];
sprintf(error,"Index %i is not set.",index);
throw JudyEx(error,true);
}
cell Array::First( cell Start)
{
PPvoid_t success = JudyLFirst(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:First");
return Start;
}
cell Array::FirstEmpty( cell Start)
{
cell success = JudyLFirstEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:FirstEmpty");
return Start;
}
cell Array::Next( cell Start)
{
PPvoid_t success = JudyLNext(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Next");
return Start;
}
cell Array::NextEmpty( cell Start)
{
cell success = JudyLNextEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:NextEmpty");
return Start;
}
cell Array::Prev( cell Start)
{
PPvoid_t success = JudyLPrev(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Prev");
return Start;
}
cell Array::PrevEmpty( cell Start)
{
cell success = JudyLPrevEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:PrevEmpty");
return Start;
}
cell Array::Last( cell Start)
{
PPvoid_t success = JudyLLast(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Last");
return Start;
}
cell Array::LastEmpty( cell Start)
{
cell success = JudyLLastEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:LastEmpty");
return Start;
}
cell Array::ByCount(cell n, cell Start)
{
PPvoid_t success = JudyLByCount(Table, n, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Nth");
return Start;
}

View File

@ -1,74 +0,0 @@
#ifndef _ARRAYCLASS_H
#define _ARRAYCLASS_H
#include "JudyIncludes.h"
#include "CBaseList.h"
#include "JudyExtra.h"
//#include <JudyL.h>
class Array: public CBaseList
{
private:
Pvoid_t Table;
void ThrowIndexError( cell index, bool disable_check = false );
void ThrowSearchError(char* msg);
public:
Array() { Table = NULL; }
~Array() { Clear(); }
void Remove() { delete this; }
Word_t Clear() { JudyClearList(this); return JudyLFreeArray(&Table, PJE0); }
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
int Delete(cell Key) { return JudyLDel(&Table, Key, PJE0 ); }
void Set(cell Index, Pvoid_t value, bool disable_check)
{
PPvoid_t PValue = JudyLIns(&Table, Index,PJE0);
*PValue = value;
}
Pvoid_t Get(cell Index, bool disable_check = false)
{
PPvoid_t PValue = JudyLGet(Table, Index, PJE0);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
return *PValue;
}
template<class Type>
void Set(cell Index, Type value)
{
PPvoid_t PValue = JudyLIns(&Table, Index,PJE0);
*PValue = reinterpret_cast<void*>(value);
}
template <class Type>
Type Get(cell Index, Type example, bool disable_check = false)
{
PPvoid_t PValue = JudyLGet(Table, Index, PJE0);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
return (Type)(*PValue);
}
cell First(cell Start = 0);
cell Next(cell Start = 0);
cell Prev(cell Start = -1);
cell Last(cell Start = -1);
cell FirstEmpty(cell Start = 0);
cell NextEmpty(cell Start = 0);
cell PrevEmpty(cell Start = -1);
cell LastEmpty(cell Start = -1);
cell ByCount(cell n, cell Start = 0);
cell Count(cell Start = 0, cell Stop = -1) { return JudyLCount(Table, Start, Stop, PJE0); }
bool IsFilled(cell Index) { return ( (Get(Index, true ) != NULL) ? true : false); }
bool IsEmpty(cell Index) { return ( (Get(Index, true ) == NULL) ? true : false); }
};
#endif

View File

@ -1,36 +0,0 @@
#ifndef _BASE_ARRAYCLASS_H
#define _BASE_ARRAYCLASS_H
#include "JudyIncludes.h"
class CBaseList
{
public:
virtual Word_t Clear() =0;
virtual Word_t MemoryUsed() =0;
virtual int Delete(cell Key) =0;
virtual void Remove() =0;
virtual void Set(cell Index, Pvoid_t value, bool disable_check = false) =0;
virtual Pvoid_t Get(cell Index, bool disable_check = false) =0;
virtual cell First(cell Start = 0) =0;
virtual cell Next(cell Start = 0) =0;
virtual cell Prev(cell Start = -1) =0;
virtual cell Last(cell Start = -1) =0;
virtual cell FirstEmpty(cell Start = 0) =0;
virtual cell NextEmpty(cell Start = 0) =0;
virtual cell PrevEmpty(cell Start = -1) =0;
virtual cell LastEmpty(cell Start = -1) =0;
virtual cell ByCount(cell n, cell Start = 0) =0;
virtual cell Count(cell Start = 0, cell Stop = -1) =0;
virtual bool IsFilled(cell Index) =0;
virtual bool IsEmpty(cell Index) =0;
};
#endif

View File

@ -1,29 +0,0 @@
#ifndef _BASE_MAPCLASS_H
#define _BASE_MAPCLASS_H
#include "JudyIncludes.h"
class CBaseMap
{
public:
virtual Word_t Clear() =0;
virtual Word_t MemoryUsed() =0;
virtual int Delete(char* Key) =0;
virtual void Remove() =0;
virtual void Set(char* Index, Pvoid_t value, bool disable_check = false) =0;
virtual Pvoid_t Get(char* Index, bool disable_check = false) =0;
virtual char* First(char* Start = "") =0;
virtual char* Next(char* Start) =0;
virtual char* Prev(char* Start) =0;
virtual char* Last(char* Start) =0;
virtual bool IsFilled(char* Index) =0;
virtual bool IsEmpty(char* Index) =0;
};
#endif

View File

@ -1,76 +0,0 @@
#include "CBinTrie.h"
void BinTrie::ThrowSearchError(char* type)
{
char value[50];
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
throw JudyEx (value,false);
}
cell BinTrie::First( cell Start)
{
cell success = Judy1First(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:First");
return Start;
}
cell BinTrie::FirstEmpty( cell Start)
{
cell success = Judy1FirstEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:FirstEmpty");
return Start;
}
cell BinTrie::Next( cell Start)
{
cell success = Judy1Next(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Next");
return Start;
}
cell BinTrie::NextEmpty( cell Start)
{
cell success = Judy1NextEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:NextEmpty");
return Start;
}
cell BinTrie::Prev( cell Start)
{
cell success = Judy1Prev(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Prev");
return Start;
}
cell BinTrie::PrevEmpty( cell Start)
{
cell success = Judy1PrevEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:PrevEmpty");
return Start;
}
cell BinTrie::Last( cell Start)
{
cell success = Judy1Last(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Last");
return Start;
}
cell BinTrie::LastEmpty( cell Start)
{
cell success = Judy1LastEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:LastEmpty");
return Start;
}
cell BinTrie::ByCount(cell n, cell Start)
{
cell success = Judy1ByCount(Table, n, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Nth");
return Start;
}

View File

@ -1,54 +0,0 @@
#ifndef _BINTRIECLASS_H
#define _BINTRIECLASS_H
#include "JudyIncludes.h"
#include "JudyExtra.h"
//#include <Judy1.h>
class BinTrie
{
private:
Pvoid_t Table;
void ThrowSearchError(char* msg);
public:
BinTrie() { Table = NULL; }
~BinTrie() { Clear(); }
void Remove() { delete this; }
Word_t Clear() { JudyClearBinTrie(this); return Judy1FreeArray(&Table, PJE0); }
Word_t MemoryUsed() { return Judy1MemUsed(Table); }
cell Delete(cell Key) { return Judy1Unset(&Table, Key, PJE0 ); }
cell Set(cell Index, bool val)
{
if(val == false) return Delete(Index);
else return Judy1Set(&Table, Index,PJE0);
}
cell Get(cell Index)
{
cell PValue = Judy1Test(Table, Index, PJE0);
return PValue;
}
cell First(cell Start = 0);
cell Next(cell Start = 0);
cell Prev(cell Start = -1);
cell Last(cell Start = -1);
cell FirstEmpty(cell Start = 0);
cell NextEmpty(cell Start = 0);
cell PrevEmpty(cell Start = -1);
cell LastEmpty(cell Start = -1);
cell ByCount(cell n, cell Start);
cell Count(cell Start = 0, cell Stop = -1) { return Judy1Count(Table, Start, Stop, PJE0); }
bool IsFilled(cell Index) { return ( (Get(Index )) ? true : false); }
bool IsEmpty(cell Index) { return ( (Get(Index )) ? true : false); }
};
#endif

View File

@ -1,82 +0,0 @@
#ifndef _HASHCLASS_INCLUDED
#define _HASHCLASS_INCLUDED
#include "JudyIncludes.h"
#include "CBaseMap.h"
//#include <JudyHS.h>
class Hashtable: public CBaseMap
{
private:
Pvoid_t Table;
public:
Hashtable() { Table = NULL; }
~Hashtable() { Clear(); }
void Remove() { delete this; }
Word_t Clear() { return JudyHSFreeArray(&Table, PJE0); }
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
int Delete(char* Key) { return JudyHSDel(&Table, Key, strlen(Key), PJE0 ); }
void Set(char* Index, Pvoid_t value, bool disable_check)
{
int Len = strlen(Index) + 1;
PPvoid_t PValue = JudyHSIns(&Table, Index, Len, PJE0);
*PValue = value;
}
Pvoid_t Get(char* Index, bool disable_check = false)
{
PPvoid_t PValue = JudyHSGet(Table, Index, strlen(Index)+1);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
return *PValue;
}
template <class Type>
void Set(char* Index, Type value)
{
int Len = strlen(Index) + 1;
PPvoid_t PValue = JudyHSIns(&Table, Index, Len, PJE0);
*PValue = reinterpret_cast<void*>(value);
}
template <class Type>
Type Get(char* Index, Type example, bool disable_check = false)
{
PPvoid_t PValue = JudyHSGet(Table, Index, strlen(Index)+1);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
return (Type)(*PValue);
}
char* First( char* Start = "") { ThrowSearchError(); return (char*)NULL; }
char* Next( char* Start = "") { ThrowSearchError(); return (char*)NULL; }
char* Prev( char* Start) { ThrowSearchError(); return (char*)NULL; }
char* Last( char* Start) { ThrowSearchError(); return (char*)NULL; }
bool IsFilled(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false);}
bool IsEmpty(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false);}
protected:
void ThrowIndexError( char* index, bool disable_check = false )
{
if(disable_check == true) return;
char value[100];
sprintf(value,"Function attempted to read non existant index %s", index );
throw JudyEx(value, true);
}
void ThrowSearchError( void )
{
char value[50];
sprintf(value,"Function attempted to search HashTable!: Invalid action!");
throw JudyEx(value,true);
}
};
#endif

View File

@ -1,66 +0,0 @@
#include "CKeytable.h"
void Keytable::ThrowIndexError( char* index, bool disable_check = false )
{
if(disable_check == true) return;
char error[50];
sprintf(error,"Index %s is not set.",index);
throw JudyEx(error,true);
}
void Keytable::ThrowSearchError(char* type)
{
char value[50];
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
throw JudyEx(value,false);
}
char* Keytable::First( char* Start)
{
PPvoid_t index = JudySLFirst(Table, Start, PJE0);
if (index == NULL)
{
sprintf(Start,"dne");
ThrowSearchError("Type:First");
}
return Start;
}
char* Keytable::Next( char* Start)
{
PPvoid_t index = JudySLNext(Table, Start, PJE0);
if (index == NULL)
{
sprintf(Start,"dne");
ThrowSearchError("Type:Next");
}
return Start;
}
char* Keytable::Prev( char* Start)
{
PPvoid_t index = JudySLPrev(Table, Start, PJE0);
if (index == NULL)
{
sprintf(Start,"dne");
ThrowSearchError("Type:Prev");
}
return Start;
}
char* Keytable::Last( char* Start)
{
PPvoid_t index = JudySLLast(Table, Start, PJE0);
if (index == NULL)
{
sprintf(Start,"dne");
ThrowSearchError("Type:Last");
}
return Start;
}

View File

@ -1,66 +0,0 @@
#ifndef _KEYCLASS_INCLUDED
#define _KEYCLASS_INCLUDED
#include "JudyIncludes.h"
#include "CBaseMap.h"
#include "JudyExtra.h"
//#include <JudySL.h>
class Keytable: public CBaseMap
{
private:
Pvoid_t Table;
void ThrowSearchError(char* type);
void ThrowIndexError( char* index, bool disable_check);
public:
Keytable() { Table = NULL; }
~Keytable() { Clear(); }
void Remove() { delete this; }
Word_t Clear() { JudyClearMap(this); return JudySLFreeArray(&Table, PJE0); }
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
int Delete(char* Key) { return JudySLDel(&Table, Key, PJE0 ); }
void Set(char* Index, Pvoid_t value, bool disable_check)
{
PPvoid_t PValue = JudySLIns(&Table, Index,PJE0);
*PValue = value;
}
Pvoid_t Get(char* Index, bool disable_check = false)
{
PPvoid_t PValue = JudySLGet(Table, Index, PJE0);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
return *PValue;
}
template <class Type>
void Set(char* Index, Type value)
{
PPvoid_t PValue = JudySLIns(&Table, Index,PJE0);
*PValue = reinterpret_cast<void*>(value);
}
template <class Type>
Type Get(char* Index, Type example, bool disable_check = false)
{
PPvoid_t PValue = JudySLGet(Table, Index, PJE0);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
return (Type)*PValue;
}
char* First(char* Start = "");
char* Next(char* Start = "");
char* Prev(char* Start = "");
char* Last(char* Start = "");
bool IsFilled(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false); }
bool IsEmpty(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false); }
};
#endif

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