1130 Commits

Author SHA1 Message Date
cf6c73e82f Tagged 0.20-RC6 2006-07-20 04:44:12 +00:00
95b638dbcd sync 2004-09-20 03:53:01 +00:00
c42fef6d48 *** empty log message *** 2004-09-20 01:26:31 +00:00
d60d19a3d7 Added amx_banip and removed id/ip to banning easier. 2004-09-19 23:58:15 +00:00
3f1c730863 changed amx_ban/amx_banip to only require 3 args 2004-09-19 23:44:48 +00:00
89f5a45e1d added amx_banip and removed id/ip from amx_ban 2004-09-19 23:41:04 +00:00
2b2149b643 Initial import from base package. (no changes) 2004-09-19 23:07:53 +00:00
f074af039b (>'.')------P(x_@<) 2004-09-19 22:01:23 +00:00
30ec1eec60 fixed meta result error in player prethink 2004-09-19 19:44:47 +00:00
0e279c5bc9 change [UnStuck] to [AMXX] 2004-09-19 18:05:13 +00:00
525dfceb1d added unstuck cvar 2004-09-19 17:34:02 +00:00
83fa1aea27 *** empty log message *** 2004-09-19 17:32:55 +00:00
6e3f2f9616 added unstuck.amxx 2004-09-19 17:31:22 +00:00
6a77edfa97 Added full HUD stats option again 2004-09-19 17:30:36 +00:00
b24f44896c New plugin to allow players to un stick themselves. 2004-09-19 17:29:08 +00:00
e23726ac54 added amx_strtok for jtp10181 2004-09-19 17:25:51 +00:00
fb2be2256f added amx_strtok for jtp10181 2004-09-19 17:20:14 +00:00
1ef7f8dd72 new defaults 2004-09-19 16:47:18 +00:00
4008743091 Fixed GetPlayerTeam 2004-09-19 16:43:55 +00:00
bff11bc18e Fixed method of illegal buying 2004-09-19 16:32:15 +00:00
6ada631aaf added commenting for ACCESS_H ns commands 2004-09-19 16:06:25 +00:00
9042efd195 Synced 2004-09-19 15:22:50 +00:00
04b88c16a9 many changes , bomb countdown fix, custom_weapon_add fix, bomb damage support in death,damage forwards, added gasnades plugin with custom weapon support so gas damage/kills will be detected by csstats. 2004-09-19 09:51:05 +00:00
1c6636b106 Fixed bug where memory allocated for FP_ARRAY parameters was not released. 2004-09-19 09:32:52 +00:00
a6a03bf51e added comments for new plugins 2004-09-19 01:31:34 +00:00
b05cf94a23 added nscommands.amxx 2004-09-19 01:29:35 +00:00
b641192e73 NS commands by sawce 2004-09-19 01:28:38 +00:00
d14c107db1 Fixed some include bugs
Fixed adminslots not showing right slots on connect
Fixed RTEs on wrong team
2004-09-19 00:52:15 +00:00
2e24077b77 Added idle kicker 2004-09-19 00:41:47 +00:00
d819c76024 Fixed formatting bugs 2004-09-19 00:37:58 +00:00
89b5496dfb New alignment (y0shi) 2004-09-19 00:33:50 +00:00
de44b4382a Added idle kicker cvars 2004-09-19 00:27:06 +00:00
c71fc25a9d New plugin, it kicks those damn idle players. 2004-09-19 00:03:23 +00:00
5527afc91e Added MF_Prepare*ArrayA functions
The MF_Prepare*ArrayA functions have a third "bool copyBack" parameter which defaults to false and specifies whether the array should be copied from plugin space to module space after function execution (=whether the original array should be updated)
The MF_Prepare*Array are equivalent to MF_Prepare*ArrayA(ptr, size, false);
2004-09-18 16:54:04 +00:00
47eb690a89 disabled fun module (only telemenu uses it) enabled ns module (required for amx_slay) 2004-09-18 14:03:35 +00:00
bb662770e0 Removed the statscfg plugin from base package. 2004-09-18 13:41:53 +00:00
4d04072672 Added MF_Prepare*ArrayA functions
The MF_Prepare*ArrayA functions have a third "bool copyBack" parameter which defaults to false and specifies whether the array should be copied from plugin space to module space after function execution (=whether the original array should be updated)
The MF_Prepare*Array are equivalent to MF_Prepare*ArrayA(ptr, size, false);
2004-09-18 13:37:46 +00:00
4c00d8b95d Changes were merged into the base package so this version is no longer required. 2004-09-18 13:35:07 +00:00
f828e1c8a0 small changes 2004-09-18 13:34:39 +00:00
34abaa1d56 The prepare*Array functions now have a third "bool copyBack" parameter which defaults to false and specifies whether the array should be copied from plugin space to core / module space after function execution (=whether the original array should be updated) 2004-09-18 13:33:21 +00:00
768ea7519f get_info_keybuffer() now works in client_authorized 2004-09-18 13:14:20 +00:00
3eed3b7f07 Removed CString references 2004-09-18 05:39:14 +00:00
3419aa4dc5 Fix for isspace 2004-09-17 19:04:44 +00:00
54a00466e8 debug mode default 2004-09-17 19:00:11 +00:00
5133915e9c Fixed crashbug in get_module: if a not-new-api or bad-file module didn't load, it crashed 2004-09-17 18:33:15 +00:00
895948ca45 fixed bug where 'v' was considered a whitespace character 2004-09-17 18:32:00 +00:00
d0c51bd637 Removed compact encoding - fixes compaction errors on OP_FILE 2004-09-17 18:21:49 +00:00
2e028ebe20 new compile script from malex 2004-09-17 06:11:14 +00:00
26349730e5 Fixed locking issue with lang files 2004-09-17 01:59:27 +00:00
c0374c5fe5 COFF fix 2004-09-17 01:26:42 +00:00
ab2794d4bd Fixed files not fclose()ing
Module no longer reloads on mapchange
2004-09-17 01:19:03 +00:00
e0af113cac Fixed bug reported by kexz 2004-09-17 00:51:20 +00:00
f9a57a83a0 Changed how plugins.ini is read 2004-09-17 00:46:33 +00:00
b7c0c47c05 New "debug" status for amxx plugins.
Correctly switches between amx_opcodelist and nodebug.
Fixed metamod and amxmodx GPL alignment.
Fixed debug mode not being set for non-JIT.
2004-09-17 00:27:28 +00:00
2d9ec5295d Synced translations 2004-09-16 22:43:51 +00:00
b3f01faf38 Message if menu is disabled 2004-09-16 22:39:07 +00:00
58578690ad Fixed server_changelevel (fsfod)
Added dod deathmsg stock (Pimp_Daddy)
2004-09-16 22:35:12 +00:00
4754ccdd1d Removed co_rebirth (Emanon) 2004-09-16 22:33:55 +00:00
f6facb5349 Removed old code 2004-09-16 22:15:07 +00:00
1728c02561 Added debug info to OP_RETN in JIT 2004-09-16 22:14:05 +00:00
c90d922443 Added some notes about how the JIT works 2004-09-16 20:31:38 +00:00
2f1de39dd3 JIT's OP_CALL now supports a debug hook 2004-09-16 20:08:11 +00:00
ec5f944c03 added csx module 2004-09-16 18:15:20 +00:00
d43807a248 Added get_string() to engine:
/* Converts a string offset into a real string. Some of the forwards in fakemeta
   uses string offsets. (FM_CreateNamedEntity) */
native get_string(_string, _returnString[], _len);
2004-09-16 11:02:51 +00:00
1980c524d3 fix 2004-09-16 02:42:40 +00:00
31604d44a8 exported debug engine 2004-09-15 21:34:06 +00:00
dba30f7ee6 Exported error logger to modules 2004-09-15 21:28:20 +00:00
1aaf540be4 converted core to new debugging engine 2004-09-15 21:27:35 +00:00
d3751054da New debugging engine 2004-09-15 21:21:46 +00:00
0c2dbdbc47 Minor check in get_tr added 2004-09-15 18:55:30 +00:00
1485014229 Fixed traceresults and trace hooks.. 2004-09-15 18:40:18 +00:00
0ea68c81dc test dlls 2004-09-15 16:09:58 +00:00
8fbbda13c6 added FNullEntity check 2004-09-15 15:17:52 +00:00
a96d26d573 *** empty log message *** 2004-09-15 08:33:39 +00:00
fb7d1c0a7d fixed wrong kills and deaths number 2004-09-15 08:25:07 +00:00
d7d8ba1398 no message 2004-09-15 07:31:53 +00:00
36c78421ae OP_FILE is now always generated 2004-09-15 05:42:33 +00:00
083fe35188 New AMX headers 2004-09-15 04:18:35 +00:00
9e4a611b7f Removed old debugging engine 2004-09-15 04:09:47 +00:00
4ed906248d Fixed traceresults (Freecode) 2004-09-14 23:39:22 +00:00
44bb871f7e amx_debug is now set correctly. 2004-09-14 19:27:55 +00:00
c1a138f370 Experimentally changed back to old g_initialized method 2004-09-14 19:01:44 +00:00
569ef4d494 fix for tracelien forward 2004-09-14 18:02:32 +00:00
26465afbf7 Fixed cs_set_hostage_follow for amd64 2004-09-14 17:57:34 +00:00
e287a2f202 fixed "BACK" : "EXIT" format bug 2004-09-14 17:04:19 +00:00
91decabfde Added MNF_GetPlayerTeam for mahnsawce 2004-09-14 16:18:52 +00:00
9a21e3e9d3 Removed some debugging output 2004-09-14 15:41:55 +00:00
60940512e2 Fixed amd64 offsets... cs_get_hostage_follow works, cs_set_hostage_follow doesn't yet :-( 2004-09-14 09:58:45 +00:00
d4e69d97e0 Added amd64 offsets. They aren't 100% tested to work (but should work...) 2004-09-14 09:35:52 +00:00
f171842cf8 added traceresult stuff 2004-09-14 06:16:52 +00:00
3d9bf8bc93 Fixed modules.ini (EKS) 2004-09-13 20:01:41 +00:00
d7325f4209 amx_logging -> amxx_logging 2004-09-13 16:42:28 +00:00
5c177aada0 fixed -o bug 2004-09-13 14:40:59 +00:00
5c6289e1f0 Fixed -o bug 2004-09-13 14:18:08 +00:00
844fbf581e for autobuilder 2004-09-13 06:58:54 +00:00
22bac3c8f4 strip user flags on reload (mrhunt) 2004-09-13 06:17:47 +00:00
35ffbf8ca6 Fixed API error 2004-09-12 22:16:56 +00:00
926f995a3a Added 64bit simulator 2004-09-12 20:58:27 +00:00
8589f0bcf5 fixed null weapon problems in get_user_astats 2004-09-12 18:00:53 +00:00
1a2ef38588 Renamed anglevector to angle_vector because that's its name in module... 2004-09-12 17:00:33 +00:00
fed8228712 Fixed small bug where the behaviour of a CTask object would be undefined if a plugin delted the task when it executes 2004-09-12 17:00:22 +00:00
09d0ba039d deleted menufront plugins .. 2004-09-12 11:05:24 +00:00
f2dcb89609 possible bad library 2004-09-12 07:24:35 +00:00
69e7cbc722 removed debug info 2004-09-12 07:18:54 +00:00
54e88bf8a8 Fixed path handling for plugins 2004-09-12 07:13:41 +00:00
b0315f5d56 Added more error reporting 2004-09-12 04:35:24 +00:00
ec55a2ab97 possible fix for dbi bug 2004-09-12 04:03:54 +00:00
1082ef31c7 Modules no longer need to have the correct extension (requested by UgLyPuNk) 2004-09-12 03:48:21 +00:00
ee28532c53 *** empty log message *** 2004-09-12 00:52:18 +00:00
e4294da5bd no more stdc++ 2004-09-12 00:48:36 +00:00
1ba9a39b3f removed iostream 2004-09-12 00:44:15 +00:00
5453b55bdc *** empty log message *** 2004-09-12 00:38:17 +00:00
16f51ea619 *** empty log message *** 2004-09-12 00:32:11 +00:00
b209d92a2a Fixed bug noted by JJKiller 2004-09-12 00:20:00 +00:00
0def8c9354 wow 2004-09-12 00:17:21 +00:00
ac59f75523 Fixed memory allocation 2004-09-12 00:14:34 +00:00
f2faf990a0 Fixed bug reported by JJKiller 2004-09-12 00:13:46 +00:00
7f6e9f5e20 *** empty log message *** 2004-09-11 22:46:28 +00:00
c12b04d302 new SDK 2004-09-11 21:58:46 +00:00
9922b5016f Fixed stdc errors 2004-09-11 21:55:33 +00:00
77fffb46b2 Added allocator / reallocator / reallocator funcs in not-memtest builds so modules can use them 2004-09-11 21:52:18 +00:00
e7cd31b1d5 *** empty log message *** 2004-09-11 21:13:02 +00:00
9006673b09 amd64 now does lstdc++ 2004-09-11 19:38:58 +00:00
96271810d8 no g++ 2004-09-11 17:42:50 +00:00
8377680989 memory test 2004-09-11 17:42:08 +00:00
00582481c6 stdc++ errors 2004-09-11 17:36:45 +00:00
c2255016d2 stdc++ errors 2004-09-11 17:32:25 +00:00
9e1c5f2808 amd64 zlib 2004-09-11 17:20:59 +00:00
897d93a892 amd64 2004-09-11 17:17:08 +00:00
04be9fb703 fixed libz linking 2004-09-11 16:47:29 +00:00
acf722e855 Hopefully fixed SDK 2004-09-11 16:35:14 +00:00
d2fe1dc043 Updated to September 2004-09-11 00:23:00 +00:00
dafc8bb678 added libz 2004-09-11 00:18:07 +00:00
d303a2e0b7 *** empty log message *** 2004-09-10 23:06:29 +00:00
7c8e9509ce fixed bug actually 2004-09-10 22:00:07 +00:00
7334f968a8 added MF_GetPlayerEdict (replacement for INDEXENT on players) and MF_Format. 2004-09-10 21:17:05 +00:00
f5a997069d Added new compiler frontend :) 2004-09-10 21:13:20 +00:00
c7f8b3f965 Added the Format function for C style strings 2004-09-10 21:00:42 +00:00
316ddad7ab Added the Format function to the module api 2004-09-10 20:58:55 +00:00
4d34270ee9 Ok, then 2004-09-10 18:43:37 +00:00
2573c9c4d2 Added pev_ideal_yaw 2004-09-10 16:28:27 +00:00
d72b8de045 DLLFunc_ClientUserInfoChanged 2004-09-10 16:09:32 +00:00
49d24f6829 oops 2004-09-10 16:06:30 +00:00
6f9ec854dc Added DLLFunc_Clientinfo something or other 2004-09-10 16:05:21 +00:00
9a3e713a69 Moved ns plugins 2004-09-10 15:57:24 +00:00
3ec4ccd9da Added new "amxx plugins" plugin fail message 2004-09-10 15:52:48 +00:00
5867e3398f Added client_spawn(id) & client_changeteam(id,newteam,oldteam) forwards 2004-09-10 13:57:10 +00:00
07ed1baee9 added ts plugins 2004-09-10 11:57:56 +00:00
1e1d479d76 added tfc plugins 2004-09-10 11:57:26 +00:00
78c191b4c9 added dod plugins 2004-09-10 11:47:43 +00:00
cf65ebf647 added DoD include files 2004-09-10 10:08:22 +00:00
7b626ab632 fixed 2004-09-10 05:38:16 +00:00
90eafe59a6 register_module -> require_module 2004-09-10 05:18:57 +00:00
a055d3d373 Upgraded CVector 2004-09-10 03:31:36 +00:00
267db7cc2b Removed include files 2004-09-10 03:16:30 +00:00
5043a40c51 Synced include files 2004-09-10 03:12:38 +00:00
0a74f09273 blah 2004-09-10 02:58:41 +00:00
767795b91e Added cstrike plugins 2004-09-10 00:33:41 +00:00
8089d42eda Cleanup, added new module forcing to plugins 2004-09-09 22:09:55 +00:00
6b9c8ac1ea Added dlsym handler 2004-09-09 21:47:32 +00:00
3c037270a6 Anti-flood is now enabled by default 2004-09-09 21:37:45 +00:00
6ac682cc5b Organized Cstrike stuff 2004-09-09 21:36:47 +00:00
e378c45be7 Fixed bug where the first registered forward would be automatically unregistered on unregisterForward too 2004-09-09 20:32:34 +00:00
66da3375ba fixed bugs in set/get user ammo natives 2004-09-09 19:51:00 +00:00
1df654c6a1 registerSPForward now returing -1 if no func found 2004-09-09 15:05:06 +00:00
388915e6f8 Fixes 2004-09-09 13:44:43 +00:00
4d8a927ff7 Fixed cells 2004-09-09 13:43:08 +00:00
b8721e0123 Fixed module correction output 2004-09-09 06:04:50 +00:00
59880371e1 Changes 2004-09-09 05:17:28 +00:00
6c73a7d8d1 New module registering ability 2004-09-09 05:16:53 +00:00
4232d68c92 New module registering ability 2004-09-09 04:53:37 +00:00
17faf3af1f woops 2004-09-08 22:05:01 +00:00
1c3a871831 Possible fix for forward unregister bug 2004-09-08 21:43:50 +00:00
a313c5b95b updated strings 2004-09-08 21:13:04 +00:00
b23eba293d fixed 64 bit bugs with float-to-bool conversion and unary - operator 2004-09-08 18:35:22 +00:00
08682ab378 SQL fallback to users.ini 2004-09-08 18:34:48 +00:00
39cb15cc56 nothing 2004-09-08 18:27:39 +00:00
c5d7417f8e added client_score forward 2004-09-08 18:09:01 +00:00
4c202dadb0 *** empty log message *** 2004-09-08 09:38:59 +00:00
78dc3ffd39 Re-added util functions 2004-09-08 09:38:05 +00:00
1d3dd15e61 Upgraded amxscript format 2004-09-08 07:48:23 +00:00
02446ac5f1 Fixed LoadAmxScript 2004-09-08 07:47:01 +00:00
2601879c0b Upgraded SDKs 2004-09-08 07:37:34 +00:00
313e0603e9 LoadAmxScript change 2004-09-08 07:35:51 +00:00
1d145d6c79 Linux port 2004-09-08 07:22:48 +00:00
213b0e65dc Added amx_debug 2004-09-08 07:11:13 +00:00
079a3e8bcd Fixed JIT line op problem 2004-09-08 07:05:16 +00:00
3010241fbd Fixed JIT line op problem 2004-09-08 06:45:32 +00:00
f3ea36c5d7 Grr, line formatting! 2004-09-08 05:31:01 +00:00
55dfbefb40 Fix for line ops parsing 2004-09-07 21:52:03 +00:00
1aee2c6f81 Fixed format tags 2004-09-07 09:26:20 +00:00
226c7300be Made memory management optional 2004-09-07 08:24:03 +00:00
f2af6ad1e6 Cleaned up float bugs 2004-09-07 06:18:20 +00:00
02d60ded5d Made memory management optional 2004-09-07 06:17:50 +00:00
3d0e25a8ef Made memory management optional 2004-09-07 06:11:17 +00:00
baef3362ed Fixed a bug that caused crashes on registering a forward after unregistering a forward 2004-09-07 05:43:55 +00:00
8903bc7f04 *** empty log message *** 2004-09-07 04:14:24 +00:00
fe2e3a1468 *** empty log message *** 2004-09-07 04:11:26 +00:00
3cbcebae56 possible bug fix 2004-09-07 02:16:05 +00:00
0fe010f4f0 fixed header 2004-09-07 01:58:18 +00:00
cd6e51271c Added more build information 2004-09-06 22:27:55 +00:00
711ad7b3dc endif bug 2004-09-06 22:25:43 +00:00
7ed66f0b38 Fixed line errors in JIT
Fixed externs in amx.cpp
2004-09-06 22:18:58 +00:00
3c67dcd326 added danish translation 2004-09-06 20:30:20 +00:00
8d0b5360c2 Fix for find_ent 2004-09-06 18:59:59 +00:00
44c5265757 SDK JIT fix 2004-09-06 09:18:23 +00:00
3297cf2e9b Added assembler implementation 2004-09-06 09:09:36 +00:00
b040f4474b Fixed sending 0 to find_ent_by_owner. 2004-09-06 08:21:13 +00:00
5094bba5e9 added MNF_GetPlayerEdict 2004-09-05 22:09:45 +00:00
e0e4f5cb34 heh oops 2004-09-05 20:06:26 +00:00
c0d73ce572 Fixed a bug where SP forwards were not unregistered
Fixed a bug where pfn_touch might not be called correctly
2004-09-05 20:03:01 +00:00
7d3d04b13d Tweaked register_impulse 2004-09-05 19:53:40 +00:00
88e199ff10 fixed registered impulses 2004-09-05 19:12:35 +00:00
ec3ade999a Added hull defines 2004-09-05 18:13:52 +00:00
57e93ef281 Added a fixed user_kill 2004-09-05 17:29:11 +00:00
6122364a24 catched -> caught 2004-09-05 17:28:48 +00:00
ff1be08b8a Updated 2004-09-05 15:54:38 +00:00
a66d04d26f Removed ns_*_icon 2004-09-05 15:53:46 +00:00
d20e9527f7 Updated all offsets for NS 3.0 beta 5 2004-09-05 13:54:09 +00:00
5c72931b94 NS b5 stuffs 2004-09-05 12:33:35 +00:00
276886022e Fixed small display bug with amx_who 2004-09-05 09:17:46 +00:00
8df987cf95 minor changes 2004-09-04 18:31:59 +00:00
de30d647d4 added the %c formatting sequence (untested) 2004-09-04 17:50:03 +00:00
7f70805e63 added [de] ([pc]Raba) and [tr] (Deagle) translations 2004-09-04 16:17:35 +00:00
1822261046 sanaell's frenchie changes 2004-09-03 08:01:28 +00:00
2a622424a0 new sdk 2004-09-03 06:59:56 +00:00
37a5a38be5 Changed amx structure for compatibility 2004-09-03 06:53:00 +00:00
580b20e720 1.02 linux build 2004-09-03 01:23:53 +00:00
9a4f15e4ad Added makefile 2004-09-02 19:50:19 +00:00
dd5c75888a Added forwardmacros.h to project 2004-09-02 18:24:48 +00:00
e8ec0ad5bf Improved error reporting 2004-09-02 10:26:00 +00:00
961b92db2c Backported mysql changes 2004-09-02 09:07:07 +00:00
af6349454d Updated for 0.20, fixed makefiles 2004-09-02 08:35:58 +00:00
32b07e4c0c Fixed JIT on Linux 2004-09-02 08:25:48 +00:00
e73b3bbbb7 New locations 2004-09-02 02:44:39 +00:00
fbb7c0bb92 Changed addons/amxx to addons/amxmodx 2004-09-02 02:16:38 +00:00
04c43f8589 Fixed a bug reported by kama - recommend not use -wait for rewrite 2004-09-02 01:31:39 +00:00
9d733d7a6b CVS terrorist strikes again! 2004-09-02 01:14:16 +00:00
30ddeda877 oops 2004-09-02 01:13:17 +00:00
72e5e9885f new makefile 2004-09-02 01:12:29 +00:00
5c6b34b1d8 Fixed some bugs in CLang 2004-09-02 00:22:56 +00:00
7a627f75cf Removed references to _snprintf() - math wrong but compatibility of snprintf() unknown 2004-09-01 22:03:44 +00:00
02cb4b94f5 Commited new SDK 2004-09-01 21:13:30 +00:00
0b5c02f678 fixed warning 2004-09-01 20:58:03 +00:00
ec5f9ec5ca Added buffer overflow (stack corruption) checking. To be tested! 2004-09-01 17:02:24 +00:00
551d51ea42 When AMXX can't open the logfile it outputs an error rather than crashing 2004-09-01 17:01:52 +00:00
560cd184cc Fixed JIT issues 2004-09-01 16:46:27 +00:00
14297c8408 Bad commit?!
New make
2004-09-01 15:56:31 +00:00
385fa07884 sql.cfg is always executed 2004-09-01 11:47:20 +00:00
35fdb8aa6e fixed compiler warning 2004-09-01 11:41:07 +00:00
34c6a1d4be stop removing my changes *evil* 2004-09-01 11:34:48 +00:00
745c595fc8 Now uses fakemeta for pdata stocks 2004-09-01 08:39:30 +00:00
e979252742 More fixes from malex 2004-08-31 22:40:30 +00:00
90b7dc2b9c updated dod stats file to ML 2004-08-31 22:00:15 +00:00
66bed5a1ab max cvars changed to 48 , DoD has too many cvars ... 2004-08-31 21:59:09 +00:00
8575c9a637 Added some description. hopefully they are right :-) 2004-08-31 16:43:58 +00:00
e73acf4fe4 Renamed is_jit_enabled from jit_enabled 2004-08-31 15:37:22 +00:00
2f37ab7ede Fixed bug where radians were not converted properly (malex) 2004-08-31 15:16:16 +00:00
b1dd324354 Fixed client_command forward 2004-08-31 15:10:12 +00:00
5f00f09314 Moved stocks 2004-08-31 15:02:51 +00:00
f06796c275 Changed so that a MOTD will also display when there is no ServerName message (as proposed by karlos on the forums). 2004-08-31 13:20:29 +00:00
e15c151167 minor fix from karlos 2004-08-31 12:45:11 +00:00
0b2eae8e0a Fixed a bug where remove_task() crashed
amxx_mm -> amxmodx_mm
2004-08-31 06:49:22 +00:00
4fff936626 amxx_mm -> amxmodx_mm 2004-08-31 06:46:44 +00:00
e2c9dbaa62 fixes 2004-08-31 06:39:08 +00:00
b2f3a52884 Attempt at reverting set_user_hitzones() 2004-08-31 06:32:38 +00:00
a720b62aaa Oh small compiler, how I hate thee
(Fixed issue where SC warned and truncated an enum entry)
2004-08-31 06:26:41 +00:00
71e6ce30a3 Fixed amx_say bug 2004-08-31 05:50:06 +00:00
4ee0573203 Changed to 2.5.1 compiler 2004-08-31 05:30:44 +00:00
68354f8964 Reverted to 2.5.1 2004-08-31 05:30:27 +00:00
d0b37726d5 Backwards compatibility bug found by karlos 2004-08-31 05:27:31 +00:00
51e8519d96 Fixed a bug fsfod made because i'm never wrong 2004-08-31 05:23:49 +00:00
c6d2516df8 fixed all registered forwards 2004-08-31 05:02:19 +00:00
813bc1a212 Removed pvPrivateData manipulation - see fakemeta_amxx 2004-08-31 02:58:28 +00:00
aa3c8fa377 sql cvars register by default 2004-08-31 02:53:06 +00:00
8cb5ad18f5 Removed some messiness 2004-08-31 02:29:31 +00:00
b34179e997 Fixed memory leak in detach 2004-08-31 02:05:27 +00:00
91aacb1036 Fixed bug where file stats were incorrect (malex) 2004-08-30 23:29:37 +00:00
2134a7e36d Messages can now be registered by multiple plugins (thanks fsfod) 2004-08-30 22:24:43 +00:00
6da1dc3e4a Fixed bug in set_msg_arg_int() reported by fsfod 2004-08-30 16:14:41 +00:00
b33a53d258 fixed bug where expressions like %02d would not be evaluated correctly 2004-08-30 15:14:50 +00:00
bec1e418e7 removed "J" from amxmodx_version cvar again 2004-08-30 15:02:07 +00:00
5c6db6d743 added missing zlib.lib 2004-08-30 14:41:32 +00:00
ac25c5fc60 %% in a format input string now produces one % in the output string correctly 2004-08-30 14:35:16 +00:00
1e36d0ca39 *** empty log message *** 2004-08-30 06:38:11 +00:00
945900605d Backported SDK changes 2004-08-30 03:34:13 +00:00
3b6d22d3bf Added amx_client_languages option 2004-08-30 03:31:00 +00:00
b254f14285 Fixed bug where MF_GetScriptName() was NULL 2004-08-30 02:00:01 +00:00
38e89f11f4 Fixed possible bug for %% 2004-08-30 01:39:15 +00:00
f4960433bc Fixed possible formatting bug 2004-08-30 01:37:25 +00:00
ebe778d0ee Fixed bug where meta tables would not be NULL'd correctly 2004-08-30 01:11:48 +00:00
36ad12b6b3 fixed bugs 2004-08-30 00:07:55 +00:00
0c022b1543 Fixed some bugs in admin_sql
Changed some things in dbi
2004-08-29 23:42:35 +00:00
4e9de62da6 Added new SDK version 2004-08-29 19:51:38 +00:00
727c798892 fixed crash bug 2004-08-29 19:49:08 +00:00
d9b768e2cf Added new SDK version 2004-08-29 19:39:18 +00:00
c1d75857f3 fixed crash bug 2004-08-29 18:51:25 +00:00
6d91af30b8 fixed memory leak 2004-08-29 18:50:38 +00:00
a1d36ff75d possible fix for the : issue 2004-08-29 18:00:16 +00:00
9a3e53478e Added better error reporting
Added new SDK version
2004-08-29 17:55:11 +00:00
7703c36a90 DoD cvars update 2004-08-29 17:37:37 +00:00
a3d048880f oops 2004-08-29 17:15:32 +00:00
53f8d12237 Switched tasks to forward system 2004-08-29 17:11:08 +00:00
54fb9fbfef registerSPForwardByName now automatically unregisters the forward again and returns -1 if the function is not found 2004-08-29 16:52:54 +00:00
5a80d24780 Fixed NewDLL heap corruption 2004-08-29 16:48:31 +00:00
b8bbe4ae8f Fixed small NewDLL issues 2004-08-29 13:32:55 +00:00
da13f4797d Reenabled NewDLL functions 2004-08-29 13:32:31 +00:00
6d35912c67 Removed debug info 2004-08-28 22:34:54 +00:00
02be09dd00 Removed inline notation. 2004-08-28 22:34:02 +00:00
93cd6dbed5 Fixed problem with pack not popped (=> hlsdk structures should be aligned correctly again) 2004-08-28 21:29:25 +00:00
8c8ccc51c4 Probably fixed problem with forwards getting garbage parameters 2004-08-28 21:25:29 +00:00
c7982c2bc3 Probably fixed problem with forwards getting garbage parameters 2004-08-28 21:25:03 +00:00
4015655141 added 4byte struct alignment (fsfod) 2004-08-28 03:57:29 +00:00
980ccfddf5 fixed building in debug mode issues 2004-08-26 21:27:39 +00:00
891be11032 register_impulse fix 2004-08-26 18:58:46 +00:00
269a0e4305 Sawce, the master of stupid mistakes strikes again!
(Fixed small bug)
2004-08-25 04:26:32 +00:00
9fb04f552c Moved includes to /plugins/include 2004-08-24 21:40:51 +00:00
19101470fd Added fakemeta includes (from dlls/fakemeta/)
Updated ns includes
2004-08-24 21:36:39 +00:00
fb8a883eec Removed old include files (now located in plugins/include) 2004-08-24 21:06:45 +00:00
8d714dd84e Added "ns_give_item"
Fixed SPForward registers
2004-08-24 21:05:01 +00:00
c6c958db2d Fixed another small error 2004-08-24 09:27:20 +00:00
185070a9ad Fixed a small error because I'm an idiot 2004-08-24 09:21:07 +00:00
a86c892af2 Fixed pointcontents stock 2004-08-24 09:04:27 +00:00
5464977fb7 New makefiles 2004-08-24 05:50:59 +00:00
f5fc9d026f newlines fixed 2004-08-24 05:44:31 +00:00
d5cb120ab4 Quick fix 2004-08-24 05:29:32 +00:00
7cbe114cf0 Fixed a message bug 2004-08-24 05:07:14 +00:00
84771f11a7 updated makefile 2004-08-24 05:00:23 +00:00
8b35ce2145 Added amx_FindNative to module API 2004-08-24 04:46:15 +00:00
9d3ea5513b Fixed a crash bug in FormatAmxString()
Added amx_FindNative to module API
Changed LZO->GZ in .amxx format
2004-08-24 04:30:13 +00:00
94219ae71a New compiler (compression changed, dependencies removed) 2004-08-23 21:57:37 +00:00
f4130105b0 fixed team menu 2004-08-23 21:17:59 +00:00
e4d11b321d Small fix for backwards compat 2004-08-23 18:25:45 +00:00
c53f54fe20 Changed from LZO to GZ compression 2004-08-23 18:21:09 +00:00
c95e1d8ae3 fixed: plmenu and get_user_team bugs 2004-08-23 18:10:50 +00:00
4ee81cd1ca New compiler 2004-08-23 17:13:12 +00:00
9a98b20d1b gcc 2004-08-23 14:25:31 +00:00
ff9bce89f2 new makefile 2004-08-23 14:22:25 +00:00
2d9e405b18 Important bug fixes 2004-08-23 14:14:58 +00:00
4a74dce0cd updated for karlos's changes 2004-08-23 13:38:09 +00:00
473699e7c8 updated for mahnsawce's changes 2004-08-23 12:35:21 +00:00
a23712bb19 updated is_plugin_loaded() to expect the plugin title 2004-08-22 20:59:46 +00:00
586fcbc21a 64bit library 2004-08-22 18:10:28 +00:00
91f0f8786e new makefile 2004-08-22 17:57:42 +00:00
2e247acdad Updates 2004-08-22 17:57:23 +00:00
909460a58f Fixed a bug that gcc 3 picks up 2004-08-22 17:56:58 +00:00
5d8353326a updated 2004-08-22 16:36:06 +00:00
a0562ce437 added Portuguese 2004-08-22 15:58:50 +00:00
ed5093ae42 fixed accidental -lstdc++ 2004-08-22 15:17:32 +00:00
160f52ec39 better detection for available menus 2004-08-22 14:54:07 +00:00
293486ff12 new cvar 2004-08-22 14:50:35 +00:00
d101d94209 fix error 2004-08-22 14:49:04 +00:00
9b5ce4c2bb added eng/callfunc 2004-08-22 14:46:13 +00:00
628993f249 how about now 2004-08-22 12:44:29 +00:00
4112c78c11 Bad merge! 2004-08-22 12:42:47 +00:00
ae01b71078 new makefile 2004-08-22 12:41:00 +00:00
d966983354 Fixed makefiles for 64bit error, clean error, and output error
ADDED NEWLINES!! OMG
Corrected some AMD64 casts on ns_amxx
2004-08-22 12:40:24 +00:00
c392f3cbbc fixed description of is_module_loaded() and is_plugin_loaded() 2004-08-22 12:31:37 +00:00
9419fdecc9 fixed a tiny bug 2004-08-22 11:49:12 +00:00
b822b91c75 Fixed makefile bugs
Fixed newline bug
Removed some unnecessary stuff from amx.cpp
2004-08-22 11:46:04 +00:00
c003f90713 removed type from "amxx modules" 2004-08-22 11:36:24 +00:00
19fb29c688 Added new CVAR 2004-08-22 10:53:49 +00:00
e94e4ce068 new makefiles 2004-08-22 10:37:00 +00:00
141336817e new makefile 2004-08-22 10:11:15 +00:00
6be1f51be2 added new makefile 2004-08-22 10:07:47 +00:00
db48f4c382 Added new makefile 2004-08-22 09:58:22 +00:00
1cfd5a587a fixed bad merge? 2004-08-22 09:47:40 +00:00
72a7e9d849 Fixed bugs 2004-08-22 09:43:35 +00:00
3818987c33 Fixed a few bugs, added new Makefile in perl 2004-08-22 09:28:09 +00:00
6f8c2b828a Added JIT object file (thanks malex) 2004-08-22 08:22:33 +00:00
f1a6938441 dupe bugs 2004-08-22 04:47:03 +00:00
9b12979b05 More duplication bugs 2004-08-22 04:41:03 +00:00
ff8eec09e1 More duplication fixes 2004-08-22 04:36:44 +00:00
a9cb464a33 Fixed duplicate keys 2004-08-22 04:25:55 +00:00
3a78aff06d Added includes and some other mysterious changes 2004-08-22 03:58:31 +00:00
51caf26399 Fixed a couple issues with gcc 2004-08-22 02:52:27 +00:00
722cd23065 Added NS module incs 2004-08-21 21:55:57 +00:00
e9ebf6bf59 fixes 2004-08-21 21:54:04 +00:00
d4ad09619e Prevented keys from overwriting each other 2004-08-21 21:39:21 +00:00
11952467e1 Initial import 2004-08-21 21:12:15 +00:00
b63ae4eed8 added GetLangR, which doesn't construct a CLang object when not found;
GetDef now uses GetLangR, so when users set their language to an invalid value, no such language is created.
2004-08-21 21:08:30 +00:00
2f3950b548 Added sasm 2004-08-21 21:04:58 +00:00
a653808e9b Added fakemeta 2004-08-21 20:59:11 +00:00
a2cf062aeb New AMXxSTL files 2004-08-21 20:35:52 +00:00
67f81dec2a Added 1.02 binary for linux
Fixed ending newlines
2004-08-21 18:57:47 +00:00
4bf0a0c6c3 removed 2004-08-21 18:47:33 +00:00
2b87e6d585 many more fixes 2004-08-21 16:55:39 +00:00
cf6e1598d5 Updated for -o.. fix 2004-08-21 06:41:31 +00:00
1d860645c2 Fixed -o.. bug 2004-08-21 06:38:30 +00:00
051657714c Fixed queue prediction bug for labels and procs
Fixed problem parsing "-" with single number expressions
Uploaded 1.02 win32 binary
2004-08-21 06:20:27 +00:00
49ee255fa4 fixed amx_reloadadmins output 2004-08-20 21:40:17 +00:00
bb9160e21f various improvements 2004-08-20 20:54:47 +00:00
b35214cce9 fixed many bugs 2004-08-20 20:53:19 +00:00
dca58b7356 Single-threaded 2004-08-20 17:23:19 +00:00
c4af0ff664 Initial import 2004-08-20 14:05:46 +00:00
09b3306dc2 added version information to the dll 2004-08-20 13:25:19 +00:00
8d86d078c3 new always up-to-date project file 2004-08-20 13:24:23 +00:00
d9f5d9dc32 removed 2004-08-20 13:23:33 +00:00
f512ff25d8 added default file pathes 2004-08-20 13:20:53 +00:00
40b5e7e817 updated plugin extension to .amxx 2004-08-20 13:18:04 +00:00
f2a2b95013 Initial import 2004-08-20 12:27:13 +00:00
ee1144338b small fix 2004-08-20 12:26:39 +00:00
58422ceb29 better German translations 2004-08-20 12:26:24 +00:00
d50ede5492 removed "J" from amxmodx_version cvar 2004-08-19 22:27:47 +00:00
25071dce26 small changes 2004-08-19 22:21:53 +00:00
4f371ccb6c fixed missing menu text 2004-08-19 22:21:11 +00:00
d19d570758 fixed show_menu (thx PM :) 2004-08-19 20:34:16 +00:00
b6d142f481 Lang strings can now contain ^n (newline), ^t (tabulator) and ^^ (^). 2004-08-19 19:34:49 +00:00
16c406fe1a Fixed bugs 2004-08-19 18:35:18 +00:00
3af9ae8927 Fixed bugs 2004-08-19 16:37:55 +00:00
213694cccc Added comments 2004-08-19 16:37:32 +00:00
008474fbe5 Fixed bugs:
client_print: if used with index=0, the message was printed many times
 show_hudmessage: correct language handling for index index=0
2004-08-19 16:37:15 +00:00
36aa331530 updated module name 2004-08-19 16:11:32 +00:00
204e8b7850 Single-threaded 2004-08-19 16:09:27 +00:00
ef0fb41bfd updated module info 2004-08-19 16:03:53 +00:00
e648b19651 Single-threaded 2004-08-19 15:06:21 +00:00
365d3ab538 updated module info 2004-08-19 14:59:57 +00:00
ada99a3067 updated module info 2004-08-18 17:13:08 +00:00
0899098cd8 fixed compiling errors when using sql 2004-08-18 16:08:16 +00:00
2c13271b10 Initial import 2004-08-18 15:50:53 +00:00
e6dbc065d1 now really updated to use the multi-lingual system 2004-08-18 15:50:12 +00:00
c622e1b6c7 More error reporting 2004-08-18 15:30:06 +00:00
5f4d791129 Updated to August 2004-08-18 15:12:03 +00:00
bf553e6ce0 Linux fix of -o bug (devnull reported) 2004-08-18 14:32:29 +00:00
9fc68b6d94 Fixed -o bug (reported by devnull) 2004-08-18 14:15:46 +00:00
73516f8772 updated so everyone can use it 2004-08-18 13:07:15 +00:00
f0c7c37a59 added msvc 7 project file 2004-08-18 12:59:34 +00:00
480fbd7aaa fixed an error | updated filename 2004-08-18 12:56:36 +00:00
560be731f2 added pdata.cpp 2004-08-18 12:43:25 +00:00
b5accd4d7a added msvc 7 project file 2004-08-18 12:39:29 +00:00
7799bde73d added 2 new languages | removed non English chars 2004-08-17 01:08:56 +00:00
5ecd986d9b MULTILINGUAL - ALL BUGS FIXED
Reversed Makefile
Changed memreport file names
2004-08-16 21:34:50 +00:00
1bd7ab3a95 Binary code nearly complete
(save works, load does not)
2004-08-15 15:26:46 +00:00
46adfaedd3 Fixed almost all CLang bugs: (mem leaks?, parsing, key system, etc)
Warning - caching is still broken!
Fixed bug in ucfirst()
2004-08-15 13:49:59 +00:00
3bbfca6d08 Dear me, many changes
Rewrote Lang (still does not work though!)
New String class funcs+name
Added Queue class
Added MD5 class + functions
2004-08-15 10:53:48 +00:00
76684e68c2 Fixed parameter bug 2004-08-15 06:20:01 +00:00
c032415d35 Added linux version of compiler 2004-08-15 02:55:21 +00:00
d1f082eb1b Fixed "Done" bug
Removed callfunc/dllfunc natives
2004-08-15 02:28:48 +00:00
5e3acc30c4 buffer increase :] 2004-08-15 01:25:20 +00:00
0db3ec3460 Added hostile intent weapons (EKS) 2004-08-15 00:15:51 +00:00
216136c5ce Added md5 2004-08-15 00:05:22 +00:00
7961bae20b fixed log messages 2004-08-13 16:23:55 +00:00
7aa6902e36 Switched LANG_SERVER/LANG_PLAYER
Fixed show_menu (param count is always the same)
2004-08-13 16:21:15 +00:00
93851f289f synced (removed welcomemsg.amxx) 2004-08-13 16:09:48 +00:00
484bb04f1c removed welcomemsg.amxx 2004-08-13 16:08:50 +00:00
9d15fa1ef7 removed 2004-08-13 15:59:35 +00:00
8ae116b6c4 added version information 2004-08-13 15:59:09 +00:00
c4c1ba9a91 Initial import 2004-08-13 15:58:49 +00:00
0181a491d8 some changes 2004-08-13 15:34:50 +00:00
27bb44a7fe new values for LANG_* defines 2004-08-13 15:26:48 +00:00
d79dfd9884 sync (added multilingual.amxx) 2004-08-13 15:19:05 +00:00
9408fb274e added multilingual.amxx 2004-08-13 15:18:44 +00:00
b96eaf1650 forgot something :) 2004-08-13 15:02:38 +00:00
ae893f79f1 small fix 2004-08-13 15:01:14 +00:00
310ad81849 Initial import of 8 languages 2004-08-13 14:58:43 +00:00
9a0d61ac27 Possible fix for output redirection 2004-08-13 14:15:47 +00:00
7035a79e56 Fixed some string stuff 2004-08-13 13:01:45 +00:00
7ccc346f31 now really synced 2004-08-13 12:31:39 +00:00
170331b0c3 clean-up 2004-08-13 12:23:28 +00:00
03b2afc7e4 Committed new compiler 2004-08-13 12:06:32 +00:00
0bb4e1bfff added TYPE_LANGMENU 2004-08-13 11:58:32 +00:00
21b20dedbb AMX Mod X SDK/MDK Version 0.20.5 2004-08-13 11:33:43 +00:00
d01ae06199 sync 2004-08-13 11:26:03 +00:00
de71cfb4e8 fixed line formatting 2004-08-13 11:25:39 +00:00
79a7b7967c added message on join 2004-08-13 11:20:32 +00:00
e42aef8714 added #define DISPLAY_MSG 2004-08-13 11:20:12 +00:00
9f1bb9345c REALLY fixed bug this time (thanks fsfod and mahnsawce) 2004-08-13 11:20:05 +00:00
f12680f179 Fixed a bug noted by mahnsawce 2004-08-13 11:05:38 +00:00
58f13e887c Fixed a bug noted by mahnsawce 2004-08-13 10:46:13 +00:00
1efbb0f65e Updated AMXX Template Library 2004-08-13 10:41:39 +00:00
7f255b2b7f Removed debugging 2004-08-13 10:11:19 +00:00
060a0a565c Fixed default language errors 2004-08-13 10:01:41 +00:00
5469f70dba Fixed FormatAmxString bugs 2004-08-13 09:39:59 +00:00
eadd0a8317 Changed plugins.ini/modules.ini locations
Removed non-existant "mssql_amxx_i386.so" from modules.ini
2004-08-13 09:00:04 +00:00
955fcb8549 Rewrote CString 2004-08-13 08:46:04 +00:00
2a00a62bcb Fixed some label issues
Added PROC queueing (to prevent symbol
2004-08-12 16:31:50 +00:00
796a7ad4d7 some changes in bot's code 2004-08-12 13:22:34 +00:00
3155a300c6 Minor bug with PlayerPostThink fixed 2004-08-12 04:21:03 +00:00
f4ed94a9da INDEXENT() fix (Use INDEXENT2() now)
Stop forwarding after ServerActivate() has been called (until next map)
2004-08-12 04:14:47 +00:00
b41a3631aa Updates on Null function table
Renamed:
 - VelocityByAim->velocity_by_aim
 - RadiusDamage->radius_damage
 - PointContents->point_contents

Backwards compatibility stocks will be included.

Made precache_event a little bit more... logical.
2004-08-12 03:31:51 +00:00
1335de63b7 Committed 1.01 linux build 2004-08-11 14:36:57 +00:00
89807bc80e Added windows build of 1.10 2004-08-11 14:34:17 +00:00
81b3e662cf Added Compact Encoding (-c)
Added second pass optimization (-h)
2004-08-11 14:31:26 +00:00
c9a0a3f9be Null tabled some forwards
Removed pfnUse hook (pointless)
Changed a couple native names
2004-08-11 12:17:39 +00:00
2a1ee3fd37 Added GNU GCC support, linux binary 2004-08-11 10:01:56 +00:00
bd11b5eb90 Improved CLI interface 2004-08-11 09:42:15 +00:00
7fad1802cf Improved CLI interface 2004-08-11 09:32:24 +00:00
b5ef654987 Added win32 binary 2004-08-11 09:11:11 +00:00
3a04fa0788 Fixed a crash/logic bug in algebraic parser stack underflow
Removed some debug code
2004-08-11 09:06:00 +00:00
c47eb57871 Bogus sync 2004-08-11 08:18:14 +00:00
7acc70ee62 Rewrote core algebraic parser
Added trivial float support
Added local labels and vastly improved label support
Fixed some crash bugs
2004-08-11 08:14:54 +00:00
74d278d1c6 Update 2004-08-11 05:06:27 +00:00
f90ab9d732 small fix 2004-08-09 12:56:24 +00:00
edfb24bcd1 Fixed Strip() bugs 2004-08-09 10:07:33 +00:00
85afb2a823 Fixed labels so they can be referenced before creation.
Cleaned up symbol parsing code.
Reversed order of public table.
Fixed bug with macro arguments.
2004-08-09 08:43:27 +00:00
b14708d6f2 Fixed some more bugs, added #if/#else/#endif and more opcodes, and .DATA stat 2004-08-09 05:23:32 +00:00
1dc16b835e Fixed AMX_ERR_MEMACCESS 2004-08-09 02:33:56 +00:00
9bed70c543 small changes in damage event 2004-08-08 13:29:31 +00:00
1709408ea7 Added some comments 2004-08-08 11:14:26 +00:00
175c5767f1 customizable table name 2004-08-08 11:05:59 +00:00
70a1afe05e added amx_sql_table 2004-08-08 11:05:09 +00:00
7b111a179e Added bytecode output. 2004-08-08 10:15:08 +00:00
023f9b43ea small fix 2004-08-07 23:07:03 +00:00
c7df3853d5 corrected typing mistake 2004-08-07 17:08:04 +00:00
e61fa39515 Fixed many parsing and logic bugs.
Finished more opcodes.
2004-08-07 17:07:50 +00:00
a1e955370b updated to use the multi-lingual system 2004-08-07 10:48:05 +00:00
a3f5ffdcda Initial import 2004-08-07 10:47:44 +00:00
d4bcbf586a fixed compiling errors 2004-08-07 10:47:08 +00:00
574189468b fixed compiling errors 2004-08-07 10:47:08 +00:00
d81f4af4c9 small fix 2004-08-07 10:43:39 +00:00
94474b57c1 added dictionary common.txt 2004-08-06 18:44:37 +00:00
0eb04ba899 updated to use the multi-lingual system 2004-08-06 18:40:59 +00:00
a8dab8993e updated to use the multi-lingual system | better code style 2004-08-06 18:40:41 +00:00
80a32b6d08 added entries for amxmisc 2004-08-06 18:40:20 +00:00
fbfb43b7d2 Initial import 2004-08-06 18:39:19 +00:00
27f5e72afe small changes in natives 2004-08-06 13:58:20 +00:00
06098e3bf1 Imported: AMXXSC, LIBSC, SCASM 2004-08-06 08:46:59 +00:00
e2b83f8bf5 Initial import 2004-08-06 04:30:49 +00:00
2c4be26756 Removed un-needed calls
Added a few more calls (over 50% are done!)
2004-08-06 04:30:10 +00:00
9d3ffda996 Support for Post calls added
Now resets functions on map change
2004-08-06 03:01:45 +00:00
2cd6ea9de3 Added a few more calls (+macros)
Added support for game dll func hooking
Fixed table pointer...
2004-08-06 00:56:48 +00:00
7f41ac3410 Added set_pev
Added punchangle to pev/set_pev
Added INDEXENT fix (fixed all occurances of INDEXENT as well)
Added pev_natives on amxx_attach
2004-08-05 20:57:03 +00:00
5dd3fe742c xmod_is_custom_wpn added 2004-08-05 12:45:25 +00:00
3bedaa95e4 removed <xmod> compatibility from csstats as requested by SniperBeamer 2004-08-05 11:56:33 +00:00
d692d8a4fb Removed support for ns_*_menu 2004-08-05 11:37:55 +00:00
ee7a14faa2 forgot to remove g_pluginMatch[] 2004-08-05 11:16:30 +00:00
402c51582f Initial import 2004-08-05 11:10:21 +00:00
f88ce70892 some optimizations 2004-08-05 11:09:42 +00:00
89b4ef92b5 updated to use the multi-lingual system | better code style 2004-08-05 11:09:16 +00:00
9276dbb086 small fix 2004-08-05 11:06:49 +00:00
b98478a3ee amx_ instead of amxx_ commands 2004-08-05 11:04:51 +00:00
5bf3577d9c xmod shared natives 2004-08-05 01:02:39 +00:00
ffad9e7af4 removed dod_get_user_team ( fixed core native ) 2004-08-04 15:46:31 +00:00
f2bfee294e fixed get_user_team to work with DoD 2004-08-04 15:32:48 +00:00
ee2c5c4f8b custom weapon natives/code update 2004-08-04 10:42:29 +00:00
245932a825 Minor fix for pev() 2004-08-04 08:26:41 +00:00
525f13662e yet another fix 2004-08-03 23:59:05 +00:00
fdbcb8b9df Fixed show_menu 2004-08-03 23:55:43 +00:00
597b6dfd32 added new parameter to show_menu() 2004-08-03 23:14:35 +00:00
e7444ddb97 small fix 2004-08-03 21:47:36 +00:00
4d1d2b5527 better code style 2004-08-03 20:36:33 +00:00
a073c4ae3c changed calculation 2004-08-03 20:33:17 +00:00
d88b8a28a7 Initial import 2004-08-03 20:30:53 +00:00
321fe54d81 updated to use the multi-lingual system | better code style 2004-08-03 20:30:19 +00:00
e4713629d9 fixed compiling errors 2004-08-03 20:27:28 +00:00
515659c29e added RES_REF 2004-08-03 20:27:07 +00:00
0be7ddcbd9 updated to use the multi-lingual system | better code style 2004-08-03 20:11:16 +00:00
b25d3a081f added more entries 2004-08-03 20:09:47 +00:00
403f22340f Initial import 2004-08-03 20:09:32 +00:00
98f946c544 Continued work on the forward registering stuff 2004-08-03 19:45:48 +00:00
453d8d8f47 "lang" insted of "_language" 2004-08-01 22:40:57 +00:00
296208dcb9 small fix 2004-08-01 22:34:04 +00:00
d2576d3801 added LANG_ defines 2004-08-01 16:50:12 +00:00
2ca6e3382e added ucfirst() 2004-08-01 16:49:24 +00:00
65a5e34d38 Initial import 2004-08-01 13:48:53 +00:00
739b2b8e80 sync 2004-08-01 13:46:27 +00:00
3eae9a1699 removed some cvars 2004-08-01 13:44:50 +00:00
f5f2592ef4 Fixed assertion bugs 2004-07-31 20:13:11 +00:00
ca3bd4d118 nothing important 2004-07-31 10:14:35 +00:00
414b19cc7a moved restmenu to Counter-Strike section 2004-07-31 10:06:57 +00:00
29674d9c75 removed restmenu 2004-07-31 10:06:30 +00:00
a5ca11f88f removed (will be replaced by compile.exe) 2004-07-31 09:54:59 +00:00
fca13d171f removed 2004-07-31 09:54:07 +00:00
91618c5272 use AMXX_VERSION_STR 2004-07-31 09:51:34 +00:00
02611efe76 Initial import 2004-07-31 09:48:45 +00:00
13effdeab7 Initial import 2004-07-31 01:06:58 +00:00
af69e24eaf added register_menu() | fixed a compiler warning in access() 2004-07-31 01:00:20 +00:00
4fccdd676b use AMXX_VERSION_STR 2004-07-30 23:39:39 +00:00
ac910f9e56 added AMXX_VERSION_STR 2004-07-30 23:38:49 +00:00
c768788f4e Added 2.6.0 machine, fixed project file 2004-07-30 22:42:06 +00:00
f566d95b4b small fix 2004-07-30 21:52:13 +00:00
1551f500e3 fixed bugs in dod_get_user_weapon 2004-07-30 15:20:40 +00:00
c6c95f2443 initial import of fakemeta_amxx 2004-07-30 14:29:20 +00:00
4d843e0792 removed forward server_changelevel() 2004-07-30 14:17:28 +00:00
8e23ca757a dod_get_user_weapon added. Compile options for old/new forwards system 2004-07-30 12:49:11 +00:00
77c887d514 added AMXX icon 2004-07-29 20:40:41 +00:00
adb57a102e Initial import 2004-07-29 20:40:26 +00:00
134ac453c0 DoD 1.3 maps added 2004-07-29 19:47:33 +00:00
bf786ef950 Initial import 2004-07-29 19:46:56 +00:00
2f5c5e0d50 .amxx instead of .amx 2004-07-29 19:40:43 +00:00
0dee2be6be Initial import 2004-07-29 19:37:26 +00:00
e57742e9de removed sv_restartround 2004-07-29 19:34:29 +00:00
7a77ac7704 nothing important 2004-07-29 19:25:35 +00:00
50877bc846 Initial import 2004-07-29 18:20:35 +00:00
786cfd0512 fixed statscfg 2004-07-29 18:19:47 +00:00
705eaac795 Initial import 2004-07-29 17:46:15 +00:00
d8b1f0b64a removed csstats | moved vault.ini to data dir 2004-07-29 17:41:44 +00:00
3e2772b698 removed allow_spectators 2004-07-29 17:33:25 +00:00
868f6dbc57 nothing important 2004-07-29 17:32:45 +00:00
edb6e0896f better code formatting | small optimizations 2004-07-29 14:56:47 +00:00
ecde670a4a fixed line formatting 2004-07-29 13:28:59 +00:00
25901fb737 Initial import 2004-07-29 13:13:56 +00:00
8b49efed59 added linux modules 2004-07-29 13:12:52 +00:00
e15bbcfb50 Initial import 2004-07-29 11:55:14 +00:00
bf79e177e3 better formatting | .amxx instead of .amx 2004-07-29 11:49:02 +00:00
8b60695829 better formatting 2004-07-29 11:48:09 +00:00
9a88c0e240 using MENU_KEY defines 2004-07-29 10:58:54 +00:00
5874a313e4 SQL disabled by default 2004-07-29 10:41:55 +00:00
265ef9ab88 removed auto-print to server console 2004-07-29 10:40:46 +00:00
7bd087281a added MNF_MergeDefinitionFile 2004-07-28 19:28:36 +00:00
9b2a1d204c Fixed bugs 2004-07-28 19:26:38 +00:00
8811b56756 changed to use the new language system 2004-07-28 18:33:20 +00:00
286a0d0d02 New version 2004-07-28 18:31:30 +00:00
7801cde7f0 bye bye WON .. 2004-07-28 17:06:01 +00:00
2fb9a5d4b5 initial import of fakemeta_amxx 2004-07-28 03:14:07 +00:00
166bbc1101 fixed compiler errors 2004-07-27 22:13:48 +00:00
123262235e added "cs13" to cstrike_running() 2004-07-27 21:06:36 +00:00
2f4c021217 Initial release
TODO: Formatting on cells
2004-07-27 19:54:21 +00:00
4f64d4daad Fixed small bug 2004-07-27 19:53:38 +00:00
04781dd75d uses cstrike_running() now 2004-07-27 16:45:00 +00:00
6d74c31597 added cstrike_running 2004-07-27 16:42:59 +00:00
d7caf3803e :o 2004-07-27 01:17:58 +00:00
53332dbe76 Added ns_set_fov
Began porting ns_show_menu, having problems though.
2004-07-27 01:15:10 +00:00
5915a18b3c use coloredMenus instead of cstrikeRunning | better code formatting 2004-07-26 15:49:10 +00:00
9d0481e7df use coloredMenus instead of cstrikeRunning 2004-07-26 15:48:12 +00:00
db726a5ba2 added MENU_KEY defines 2004-07-26 15:43:51 +00:00
0cb1aabb90 added colored_menus() 2004-07-26 15:07:25 +00:00
15b12e7a55 Reenabled engclient_cmd code 2004-07-25 18:52:09 +00:00
538876a82c Reenabled engclient_cmd code 2004-07-25 18:45:44 +00:00
26d5f430e2 Fixed big bug where non-void functions could not be overriden / superceded 2004-07-25 18:44:30 +00:00
a2edcc38b1 Fixed minor bug 2004-07-25 13:18:38 +00:00
5e14f93868 removed amx_clexec on request of some people 2004-07-24 23:45:31 +00:00
1417434533 fixed bug in trim() 2004-07-24 16:22:18 +00:00
52b9b7f04d PM removed debugging stuff 2004-07-24 15:50:17 +00:00
b409769f2b added amx_clexec and amx_nick 2004-07-24 13:33:39 +00:00
0338fe0343 added header output 2004-07-24 11:41:22 +00:00
3910dfce12 *** empty log message *** 2004-07-24 11:33:02 +00:00
132c4dd9e4 *** empty log message *** 2004-07-24 11:25:00 +00:00
65df08c363 added amx_logging 2004-07-24 11:06:15 +00:00
17c00abbde flag y (ADMIN_ADMIN) is not set anymore 2004-07-24 11:03:51 +00:00
5a93f4a80b fixed is_user_admin()
changed access functions to new ADMIN_ADMIN
2004-07-24 11:02:49 +00:00
3a904ed05c added trim() 2004-07-24 01:52:45 +00:00
b70eac0461 added trim() 2004-07-24 01:31:22 +00:00
53d860a47e *** empty log message *** 2004-07-24 00:36:38 +00:00
30ca720920 changed file extension to .amxx 2004-07-24 00:36:17 +00:00
afce6de801 register_statsfwd 2004-07-23 23:18:50 +00:00
2a57fa02ca removed rescode() 2004-07-23 19:52:55 +00:00
221375b730 fixed compiler warnings 2004-07-23 18:11:25 +00:00
bbf8a21693 Removed debug info from 64 bit porting
Fixed minor bugs
2004-07-23 17:29:03 +00:00
6dc00f64f8 PM: Added 64bit compatibility
dvander: Fixed minor bugs
2004-07-23 16:55:53 +00:00
8e8633a49a Fixed team native tags 2004-07-22 21:01:39 +00:00
c39b5d1ec6 Fixed bugs 2004-07-22 14:55:38 +00:00
82d5b42356 added handlers for 3 new error messages from CAmxxReader 2004-07-22 14:55:16 +00:00
cfbf4bf5b5 Nothing important. 2004-07-22 13:13:41 +00:00
98d1644ade Removing support for NS 2.01. 2004-07-22 13:11:12 +00:00
521d6ee7d2 Removing support for NS 2.01.
(Ignore last commit comment.  I'm a CVS newbie.)
2004-07-22 13:09:28 +00:00
9f868f27ff Forgot to remove this. 2004-07-22 13:07:43 +00:00
bcb2adf95a Uploaded the source of the miniLZO compression library used in the .amxx (ABL) file format 2004-07-22 13:06:46 +00:00
b7e9f34471 Changed to use the miniLZO compression library 2004-07-22 13:05:03 +00:00
1a9d55a0f4 Forgot to remove this. 2004-07-22 12:55:06 +00:00
0aa11dcae7 Forgot to remove this. 2004-07-22 12:48:12 +00:00
6cd5790ea8 Initial import of mostly re-written NS module (also synced with ns2amx).
Renamed module to simply "ns".

Module is mostly untested until NS beta 5 is release.
2004-07-22 12:46:35 +00:00
6236590aed included amxxfile.* 2004-07-22 09:19:25 +00:00
138e984e66 Initial release
To be changed to use the miniLZO library instead of using the RLE compression
2004-07-21 20:03:24 +00:00
bd93ea88a5 Added "J" to amx_version if compiled with JIT
Changed memreport interval to 5 minutes
2004-07-21 20:01:46 +00:00
1c7aa62db1 changed to work with the .amxx files 2004-07-21 20:00:10 +00:00
1cd4dc20dc Added native
is_jit_enabled
2004-07-21 19:59:39 +00:00
18490e545c Removed
#define JIT
2004-07-21 19:58:09 +00:00
594edabac0 amxx sdk update 2004-07-21 14:18:01 +00:00
0b9f3d8e8c map change crash fixed 2004-07-21 11:51:18 +00:00
064853d9d5 added jit_enabled() 2004-07-20 13:37:15 +00:00
c504df473d Removed PM's original "GCC JIT" implementations. 2004-07-20 03:53:49 +00:00
5daf73e3d5 Using Grum's NASM JIT - from acquired August 1st. 2004-07-20 03:51:57 +00:00
011d9ecc33 Fixed bug with FG42 detection 2004-07-19 23:57:05 +00:00
7b14a4bb4e added ADMIN_ALL 2004-07-19 19:21:37 +00:00
0f8ec91e00 removed NO_STEAM 2004-07-19 15:03:45 +00:00
ef11026195 removed WON support
fixed some bugs
2004-07-19 14:33:17 +00:00
bcc8292730 Fixed DBI tags. 2004-07-19 14:28:42 +00:00
3439fac417 added get/set_user_ammo natives 2004-07-19 00:31:38 +00:00
287720c4e4 changed to work with new tasks 2004-07-18 18:49:34 +00:00
fa7dc91449 Added a new overloaded find function where the caller can set where to start searching 2004-07-18 18:48:54 +00:00
a6f7742e86 rewritten 2004-07-18 18:48:20 +00:00
59bb24e791 Removed WON specific offsets. 2004-07-18 14:11:07 +00:00
09da646086 Added DBI tags. 2004-07-18 10:22:55 +00:00
fd9666d068 Added change_task()
Added server_changelevel forward
Added is_user_admin()
2004-07-18 08:19:20 +00:00
41c7d041df Added change_task()
Added server_changelevel forward
2004-07-18 08:07:50 +00:00
8ea1c7f486 Fixed callfunc_begin(): Wrote "filename" instead of just "name" to make it more clear... 2004-07-16 08:36:08 +00:00
63c2c0a322 Fixed callfunc_begin(): The order of the params was wrong!!! 2004-07-16 08:24:10 +00:00
c00fffa444 MSVC 7.1 project file... 2004-07-16 07:38:58 +00:00
78a88d90a0 fixed self damage stats 2004-07-14 23:57:21 +00:00
aaa1e781c2 Hopefully fixes the "bots can't harm" bug. 2004-07-13 21:26:38 +00:00
4003204ffe simplified, should work on linux too now 2004-07-13 16:17:38 +00:00
60c6b1703d Possible fix to the overflow of edicts... 2004-07-13 15:19:36 +00:00
06dd58e7a4 Nothing important 2004-07-13 15:07:21 +00:00
fc58946ffa Nothing important 2004-07-13 08:35:04 +00:00
5b7e96532d Fixed inc link 2004-07-13 08:33:19 +00:00
228d3a13c8 Fixed pdata int stocks 2004-07-12 08:25:48 +00:00
7c9be9c348 Fixed for NO_STEAM builds (removed STEAM autobuy code from build) 2004-07-10 10:02:13 +00:00
919953b661 a fix for an error? 2004-07-08 18:53:58 +00:00
f0f6dc88b1 Rewritten; The whole log system is now finally a class 2004-07-08 16:02:40 +00:00
4878c66032 added file 2004-07-08 16:02:21 +00:00
9656eac079 Changed to support rewritten amxxlog 2004-07-08 16:02:01 +00:00
8973af479c Fixed ent bugs from JGHG
Changed MAKE_STRING to ALLOC_STRING
2004-07-06 17:02:31 +00:00
221d5b623d Fixed ent bugs from JGHG
Changed MAKE_STRING to ALLOC_STRING
2004-07-06 16:48:20 +00:00
1d555a66f8 Removed debugging info 2004-07-06 06:28:42 +00:00
0dd5024408 changes in health event 2004-07-05 21:24:31 +00:00
e0f1b56363 added spectator support to dod_set_user_team native 2004-07-04 21:09:03 +00:00
8dceb45567 fixed bug in CList::put 2004-07-04 14:59:21 +00:00
ab6909a60c fixed bug where modules were queried / attached more times 2004-07-03 13:48:53 +00:00
dc971460ff adapted for new CList 2004-07-03 13:47:03 +00:00
f5eb46d234 rewritten 2004-07-03 13:46:35 +00:00
67b13237d6 fixed memory leaks caused by using a CVector instead of a CList 2004-07-03 13:45:56 +00:00
994e41d7cf ts 2.1 weapon awards 2004-07-03 00:25:01 +00:00
7ed7d37914 custom weapon array fix 2004-07-02 23:58:41 +00:00
28b21550d4 update.. 2004-07-02 16:25:36 +00:00
f413bf37a2 Initial import 2004-07-01 17:57:12 +00:00
b5e960ed3b FN_AMXX_DETTACH removed 2004-07-01 17:24:21 +00:00
3c99a32272 forwards change 2004-07-01 10:12:50 +00:00
ed7b584b49 Removed possible inappopriate language 2004-06-30 19:04:04 +00:00
e4a735d447 new(old) register forwards system 2004-06-30 17:37:36 +00:00
e0a9c60bf1 added new colors orange, ocean and maroon 2004-06-30 17:08:52 +00:00
9ccddad1cf update.. 2004-06-30 13:03:24 +00:00
59b03740c9 csstats with <mod>x functions 2004-06-30 13:01:07 +00:00
325afaa612 updated version number 2004-06-30 08:36:31 +00:00
017c94eae1 Re-added -C- compiler. 2004-06-30 08:34:56 +00:00
93f6a136fa added double-include prevention 2004-06-30 08:34:52 +00:00
413f02ab2a Re-added -C- compiler 2004-06-30 08:32:51 +00:00
5b8f7e471f Fixed bug in CVector 2004-06-30 08:10:25 +00:00
3dedf9976b Fixed incorrect forward orders
Fixed bug in CVector
2004-06-30 08:04:12 +00:00
ff23a74e9c wtf, get_module() uncommitted again
fixed typo
2004-06-30 04:27:55 +00:00
7083c898f0 Fixed CString bug 2004-06-30 03:21:14 +00:00
5ea3af0b2b Fixed SQL side bug 2004-06-30 03:19:31 +00:00
b67da6965f Fixed field lookup bug.
Fixed bug in CString.
2004-06-30 03:14:39 +00:00
75c5bebc41 Fixed line problem 2004-06-30 01:14:25 +00:00
42c187fa33 Fixed register_plugin bug found by Zor 2004-06-30 00:19:24 +00:00
09e13f5dd9 Changed antiflood to be more intelligent. 2004-06-29 20:29:40 +00:00
3c22ae73a1 added custom map configs 2004-06-29 20:17:25 +00:00
feda453e6d Added backwards compatibility for NS2AMXx
Changed most stocks to natives.
2004-06-29 19:38:03 +00:00
1b09d4e3fc Fixes bug with get_msg_arg_type 2004-06-29 16:53:49 +00:00
721f86001e removed amxx_customdir
added amxx_datadir
changed "custom" to "data"
2004-06-29 16:51:25 +00:00
5b9a7451c3 added description of plugin_pause and plugin_unpause 2004-06-29 16:39:06 +00:00
3b2d711c4f added get_datadir
changed get_customdir (backwards compatibility)
2004-06-29 16:38:27 +00:00
667d06b126 added "return" 2004-06-29 16:15:24 +00:00
88cc9156fe added "gpl" to the "amxx" comand list 2004-06-29 15:58:44 +00:00
c6813d1f18 Fixes bug with get_msg_arg_type 2004-06-29 15:26:35 +00:00
e6fc5904b5 Added .NET project file 2004-06-29 09:16:18 +00:00
6b89c12f73 new CString 2004-06-29 08:14:44 +00:00
429c295738 Removed STD code 2004-06-29 08:09:53 +00:00
743767610a Removed std::string 2004-06-29 06:56:31 +00:00
47dd28bd63 Removed std::vector 2004-06-29 06:45:52 +00:00
285a4ffed8 Fixed a few bugs. 2004-06-29 06:26:56 +00:00
e8d33e1379 Bug fix, added correct cpp file 2004-06-29 05:54:53 +00:00
e1a3b158d0 Added makefile 2004-06-29 05:33:13 +00:00
6e9b836767 Added libraries 2004-06-29 05:31:05 +00:00
552e82861b Fixed Makefile for 0.20. 2004-06-29 05:22:13 +00:00
4adb119f8e Fixed Makefile for 0.20. 2004-06-29 05:16:18 +00:00
502d006e84 Changed optimizations and metamod dir. 2004-06-29 05:04:27 +00:00
feedb222f8 Removed cstrike defaults. 2004-06-29 03:45:51 +00:00
67d8042df1 Fixed line formatting errors.
Removed cstrike defaults.
2004-06-29 03:44:36 +00:00
f520743aa2 Defaults to mapcycle.txt now. 2004-06-29 03:40:32 +00:00
67fbc56618 Added Vexd Compatibility back in. 2004-06-29 03:22:38 +00:00
de668db307 Fixed server_frame forward.
Fixed server_changelevel forward.
2004-06-29 03:16:45 +00:00
de8e8e699b New DBI API. 2004-06-29 02:51:40 +00:00
4f3be95a36 New DBI API. 2004-06-29 02:50:39 +00:00
527ca0efb7 New DBI API. 2004-06-28 23:20:04 +00:00
8671c25b2e all lower case natives now 2004-06-28 22:41:24 +00:00
cf137b54ad PM's fix: engclient_cmd is now client_cmd 2004-06-28 18:54:58 +00:00
eeebee0e18 Changed report_error behavior 2004-06-28 18:12:26 +00:00
b5e9fe2d49 commited makefile on BAILOPAN's wish :)
watch out: -libstdc++ option used
memtest included
JIT not included
2004-06-28 15:54:19 +00:00
1b43105658 added ts support 2004-06-28 13:57:10 +00:00
f69da4341b Fixed TraceLine problems after map change 2004-06-28 11:13:07 +00:00
fc3b165e57 TraceLine tweaks 2004-06-27 16:31:40 +00:00
8885714465 TraceLine tweaks 2004-06-27 16:22:52 +00:00
9c24b9ae05 Updated to June 2004-06-26 23:07:30 +00:00
f4de83c31a Fixed a bug where blocking a message would crash the server. 2004-06-26 22:46:54 +00:00
8477d8834a nothing important 2004-06-26 21:46:24 +00:00
d4aef1a60b Fixed some things 2004-06-26 19:37:31 +00:00
8fa1a42c1b Added sockets module. 2004-06-26 17:31:20 +00:00
e60d1c815c Added new natives. 2004-06-26 04:48:32 +00:00
9c59ece7a4 New registers for impulse, think, and touch.
Fixed DispatchKeyValue related natives and forwards.
2004-06-25 22:51:18 +00:00
932dec9dee New engine natives 2004-06-25 22:50:43 +00:00
136873b9ea Fixed meta set bug in ServerActivate
Added linux options to pvPrivateData natives
2004-06-25 20:51:48 +00:00
60da2d5621 Bug fix with sql.cfg 2004-06-25 19:18:24 +00:00
9057043180 weapon logging support 2004-06-25 12:25:23 +00:00
6d8f61c4e0 weapon logging support 2004-06-25 12:21:47 +00:00
a9c5228c31 small tweaks .. 2004-06-25 01:00:29 +00:00
45a3493256 Added math native definitions. 2004-06-24 22:11:32 +00:00
ca24deb6b9 *** empty log message *** 2004-06-24 19:04:50 +00:00
7741f8f6a9 added MaximalPerformance build option 2004-06-24 18:52:06 +00:00
bf1340cf14 changed HLSDK_3_2_OLD_EIF to HLSDK_2_3_OLD_EIFACE
changed ClientCommand to use the FAKEMETA_DLL_HANDLE_void macro
2004-06-24 18:47:00 +00:00
35c2c41a41 fixed typos, maybe a player disconnect problem 2004-06-24 18:44:30 +00:00
8e227f4f54 Removed default slot reservation.
Enhanced modules and plugins descriptions.
2004-06-24 18:23:12 +00:00
3d521e5d30 Added backwards MySQL compatibility. 2004-06-24 08:37:34 +00:00
4ab6b083c1 Updated version numbers.
Fixed Condition-Zero support.
Replaced Stats with StatsX.
2004-06-24 08:10:52 +00:00
0d07a13dbe Removed admin_sql, merged with admin 2004-06-24 07:57:55 +00:00
d17945c087 Fixed inhook bug.
Fixed entity_set_size bug.
Switched non-blocking forwards to POST.
2004-06-24 07:36:43 +00:00
42ff533d65 Fixing more incorrect merges 2004-06-24 07:11:52 +00:00
4b3d2d3133 Fixing accidental commit 2004-06-24 07:09:17 +00:00
37d144abe5 Changed from cell->pointer casts to reference handles.
Fixed a memory leak.
2004-06-24 07:02:29 +00:00
553f1872a5 Fixed some minor errors. 2004-06-24 06:59:16 +00:00
ab03ce077e Added strip_user_weapons (thx to SidLuke) 2004-06-21 09:16:14 +00:00
1af005a047 Added cs_get_no_knives, cs_set_no_knives 2004-06-17 15:42:43 +00:00
0660f872eb Added support for TFC weapons in give_item 2004-06-16 19:02:00 +00:00
07ecc9f6fe added tfc support 2004-06-15 13:49:19 +00:00
8cff99c7f4 New DBI (not tested!) 2004-06-14 06:52:15 +00:00
f7e0baa45e New DBI 2004-06-11 21:03:45 +00:00
259a9d70ec added run time error reporting 2004-06-10 13:19:41 +00:00
d3bb65eec7 added a memreport before mapchange
fixed possible crash bug where Cmd_Args would return NULL
2004-06-10 13:18:58 +00:00
8840c03dff Fixed a couple more typos dettach -> detach 2004-06-09 07:59:32 +00:00
5cbc863f33 Added cs_get_user_hasprim() 2004-06-07 15:33:45 +00:00
667b15787d Fixed some typos and stuff. 2004-06-07 11:13:20 +00:00
577c8c5f61 Fixed cs_set_hostage_foll() 2004-06-03 09:01:42 +00:00
5ce181a995 Fixed a lot of MF_IsPlayerInGame that was done on non-player entities 2004-06-03 08:44:43 +00:00
175e3ed1cd added
bot = false;
in Disconnect()

(hoping it will fix some problems where AMXX doesn't recognize players as proper clients)
2004-05-30 13:30:00 +00:00
ce15e9a3ba Fixed a bug where the last module in modules.ini would not be attached to metamod. 2004-05-30 13:29:13 +00:00
c6b0c75b72 Added many new DBI functions 2004-05-30 09:58:51 +00:00
ca0a32a546 AMXX won't crash now on invalid plugin path 2004-05-29 12:22:33 +00:00
b4107e3523 Fixed a bug where menus would not work 2004-05-29 12:21:57 +00:00
9e99831fb2 added a declaration of a local variable. The file will compile now :] 2004-05-29 12:20:57 +00:00
e620debd1f The Core is now a fake plugin.
Fixed a bug where core could not supercede functions.
2004-05-29 12:20:01 +00:00
549e9d6b55 Fixed another memory leak... 2004-05-29 12:18:41 +00:00
9307994060 Cleaned up some code, added checks for msgid != 0 (so AMXX doesn't crash mods which don't support text based menus for example) 2004-05-28 11:29:44 +00:00
8c600f90c3 nothing important 2004-05-28 11:28:42 +00:00
14e59c6967 Fixed bug where a file handle would stay opened on error; added id validations to MNF player natives 2004-05-28 11:27:50 +00:00
7695d24a50 Cleaned up some code, added comments 2004-05-28 11:26:05 +00:00
86b1021f45 Fixed memory leaks in amx_fget* natives 2004-05-28 11:25:28 +00:00
642eb769b2 Added a check for memory allocation failure 2004-05-28 11:24:59 +00:00
3d3775ec00 Fixed get_module (which would crash on modules with new interface) 2004-05-28 11:22:56 +00:00
a6af81e359 Added more support for JIT on Linux 2004-05-28 11:21:31 +00:00
e0a9729b47 Added dbi_type() 2004-05-28 10:10:16 +00:00
9627b4803d Added dbi_type() 2004-05-28 09:21:11 +00:00
55b57ca0cb Initial import 2004-05-28 08:51:23 +00:00
9df4374195 mssql_error fix 2004-05-28 06:31:53 +00:00
8afd62a7c9 Rewrite. Note: untested 2004-05-28 06:28:49 +00:00
997a79a692 Fixed connection bugs 2004-05-28 05:05:58 +00:00
5a91f05748 Added license info 2004-05-28 04:35:02 +00:00
6ae66d39b8 Added license info 2004-05-28 04:24:15 +00:00
54bc9cb10e Fix for nextrow 2004-05-28 03:57:48 +00:00
9e852deb17 Initial Import 2004-05-28 01:48:22 +00:00
5c3ce78c58 Fixed typo: Dettach --> Detach 2004-05-26 12:58:58 +00:00
c3d50a293d Fixed typo: dettach --> detach 2004-05-26 12:14:17 +00:00
c74ebdf401 nothing 2004-05-26 08:44:15 +00:00
23c4f0b666 Added user_has_weapon() native 2004-05-26 08:29:17 +00:00
f88bd58919 Added user_has_weapon() native 2004-05-26 08:28:54 +00:00
7853e0c3e8 Small update 2004-05-26 08:20:09 +00:00
af29e2fb81 Updated engine includes
Added natural selection includes
2004-05-26 07:59:33 +00:00
8b256eb8bb Some minor changes:
Changed offsets from linux to windows.
Removed DispatchKeyValue forward.
2004-05-26 07:54:01 +00:00
86598d3582 Fix-up changes. 2004-05-26 06:28:59 +00:00
2ee078bada Nothing important 2004-05-26 06:21:37 +00:00
a21537f644 Made linux compatible. 2004-05-26 06:19:50 +00:00
e45e0c9634 Fixed some small things 2004-05-26 05:18:34 +00:00
86fb009e43 New version of Engine. 2004-05-26 05:16:59 +00:00
37a08f66b0 New version of Engine. 2004-05-26 05:15:40 +00:00
7bb4c78a33 Small update. Added 2nd parameter to amx_help for server. Server can type "amx_help 1 150" to view 150 help cmds at once. 2004-05-16 11:31:41 +00:00
2cf4801f6b Fixed a memory leak I made :-) 2004-05-14 20:48:34 +00:00
af1242415c added iterator() constructor 2004-05-06 19:18:55 +00:00
104514f988 added SinglePluginForward support 2004-05-05 19:03:38 +00:00
ecd0c53ca1 added files for JIT on windows 2004-05-05 18:45:35 +00:00
836e6267dc new project files for MSVC 7.0 2004-05-05 18:44:08 +00:00
58cf8a1416 changed include files order 2004-05-05 18:43:47 +00:00
1f31c6e309 added SinglePluginForward functions to the module interface 2004-05-05 18:43:33 +00:00
e9e4b380cb added SinglePlugin forwards 2004-05-05 18:42:16 +00:00
7c4324b963 use of const functions 2004-05-05 18:41:36 +00:00
90f777d593 stuff 2004-05-03 20:01:23 +00:00
e2ff797de4 changed set_new_handler to std::ser_new_handler 2004-05-03 20:00:41 +00:00
5ce096457a not important 2004-05-03 19:48:40 +00:00
d7a8292419 added DLL Post Functions calling 2004-05-03 19:47:36 +00:00
be5276dde6 stuff 2004-05-03 19:46:49 +00:00
18abdd8149 added support for MODULE_NOT64BIT status 2004-05-03 19:45:19 +00:00
c3661e8bb3 linux memtest support 2004-05-03 19:40:49 +00:00
b9b2a2581e removed def file 2004-05-03 15:50:29 +00:00
7b5b6195c2 Changed to 0.20 API 2004-05-03 14:10:52 +00:00
771a16db26 Changed to 0.20 API 2004-05-03 14:01:40 +00:00
e6d53c4666 Header fix 2004-05-03 13:34:00 +00:00
863805ff6f SDK Fix for Metamod 1.18 2004-05-03 13:33:26 +00:00
ccf02c9484 RETURN_META_VALUE in client connect 2004-05-03 08:55:48 +00:00
a019ef2d52 Now compiles to singlethreaded module (ML/MLd) 2004-05-03 08:51:11 +00:00
eead209a39 Volatite commit of new API changes 2004-05-03 07:24:00 +00:00
16867d6f24 Volatite commit of new API changes 2004-05-03 07:24:00 +00:00
1b263d13aa Initial release 2004-04-29 17:41:44 +00:00
807e3f04bf new stuff:
Build Configurations:
 Debug
 Release
 JITDebug
 JITRelease
 MemtestDebug
 MemtestRelease
2004-04-29 17:23:46 +00:00
4b517fe1ad - some indent stuff
- added support for MODULE_NOT64BIT status
2004-04-29 17:16:28 +00:00
dd4bc05952 not very important stuff 2004-04-29 17:13:41 +00:00
a04df29f22 fixed a bug where the post engine functions table was copied to the "normal" engine functions table 2004-04-29 17:13:36 +00:00
de5bdad8de modules with old interface don't load if SMALL_CELL_SIZE is 64. Reason: float/cell conversions. 2004-04-29 17:09:57 +00:00
7aa98c9038 added
MODULE_NOT64BIT status
2004-04-29 17:09:26 +00:00
7c2fc26c4f #define JIT will be defined in compiler command line 2004-04-29 17:08:54 +00:00
97e2c3b902 removed old files 2004-04-29 12:28:00 +00:00
8cb40e903e added entity_is_on_ground 2004-04-29 09:42:00 +00:00
32efef099c Implemented old ?et_user_hitzones functionality 2004-04-27 10:08:46 +00:00
0cb086eb6b Updated comment 2004-04-26 15:30:45 +00:00
2a7709d680 preparations for JIT on Linux 2004-04-24 20:06:16 +00:00
4e7209eeab stuff 2004-04-24 20:05:08 +00:00
3b0d52c8d3 fixed cmdstart bug! oops! 2004-04-24 03:41:27 +00:00
4549115165 fixed memory leaks from bug 935801 (these were from original vexd) 2004-04-23 08:38:48 +00:00
acc0439d3c new project files 2004-04-23 07:04:11 +00:00
6faef3b75a mmgr added 2004-04-23 06:59:00 +00:00
91eacb7464 fixed memory leaks from bug 935801 (these were from original vexd) 2004-04-23 03:55:53 +00:00
3a3acb517b removed .c files 2004-04-22 15:13:55 +00:00
de3dbd8a1d cs_set_user_vip - changes to VIP model + updates scoreboard when appropriate 2004-04-22 12:38:57 +00:00
f508690552 initial release 2004-04-22 10:54:09 +00:00
7921f93335 these files are now cpp to support the memory manager 2004-04-22 10:53:18 +00:00
c088c4835f fakemeta support
memory reports
printing GPL on startup
no .def file needed under windows anymore
2004-04-22 10:50:47 +00:00
81e7de4a2e nothing important 2004-04-22 10:46:58 +00:00
fc4e813d9a memory manager support
g_FakeMeta global
global natives declared extern "C" (because .C files changed to .cpp)
2004-04-22 10:46:45 +00:00
3120b750f4 pause & unpause added 2004-04-22 10:42:49 +00:00
72a0a37f74 cs_set_user_team - should now update model+scoreboard right away 2004-04-22 09:38:30 +00:00
79a87f4cc8 better float support 2004-04-22 08:20:10 +00:00
85b0e04ca3 nothing important 2004-04-22 08:18:23 +00:00
72aeebfeb7 added type REAL (float on 32bit, double on 64bit) 2004-04-22 08:14:33 +00:00
21287f4f3a 64 bit float compatibility 2004-04-22 08:13:52 +00:00
607da4d4a2 nothing important 2004-04-22 08:10:29 +00:00
81cd9b4449 amx_logging cvar:
0 : no logging
   1 : standard logging; new file per mapchange (default)
   2 : standard logging; daily logfiles
   3 : logging into HL log files
2004-04-22 08:09:17 +00:00
8c4e8e20a5 stuff 2004-04-22 08:07:22 +00:00
8eae80c6e9 memory manager compatibility 2004-04-22 08:05:06 +00:00
29e36fdee2 nothing important 2004-04-22 07:52:26 +00:00
c2784feb71 moved pause/unpause to .cpp file 2004-04-22 07:47:55 +00:00
f51ca46646 added to register_message 2004-04-21 21:18:42 +00:00
f8f553d485 nothing important 2004-04-21 19:14:16 +00:00
992d863436 new module interface; changed to work with fakemeta 2004-04-21 19:11:20 +00:00
f75cf50eac Fixed small bug in make_deathmsg 2004-04-21 09:47:06 +00:00
8f96e95d07 *** empty log message *** 2004-04-20 17:47:05 +00:00
4d01d5625c Removed block from Autobuy and rebuy. Blocked items are stripped from autobuy calls. 2004-04-19 11:25:26 +00:00
aaf8bd7af9 engine can now catch impulses 2004-04-16 05:01:32 +00:00
add9b1126a updated engine stock 2004-04-16 04:57:38 +00:00
1d9cba3fcf Added trivial? czero support 2004-04-08 16:30:36 +00:00
2a460d8c18 Added math functions recommended by AssKicr
Little bug fixes
2004-04-07 04:06:55 +00:00
8f63a1a7b9 confirmed offset OFFSET_INTERNALMODEL for won 2004-04-06 08:19:56 +00:00
24791ac315 Updated cs_set_user_team to include model 2004-04-06 07:40:51 +00:00
8ef66cee8c added natives 2004-04-03 20:05:27 +00:00
205f3734cd quick fix to file functions 2004-04-03 20:04:59 +00:00
9441505ab3 Fixed strbreak(), added Sanji's file natives 2004-04-03 19:50:20 +00:00
82e2cf7741 new globals 2004-04-03 19:21:07 +00:00
d98d6af9e3 removed amx_version cvar
added amxmodx_modules cvar
using new forward functions
2004-04-03 19:20:54 +00:00
dab5306655 using new forward functions 2004-04-03 19:18:46 +00:00
284ec17eea nothing important 2004-04-03 19:16:59 +00:00
0483e491b3 read_data(0) returns msg id now 2004-04-03 19:16:26 +00:00
7d13e8cd01 added getCurrentMsgType member 2004-04-03 19:15:43 +00:00
b9c9e9d100 added some support for the new module interface 2004-04-03 19:15:06 +00:00
79e214a6ea added (simple vector implementation) 2004-04-03 19:14:34 +00:00
06da72658b rewritten 2004-04-03 19:14:03 +00:00
64bf40aaa3 velocity stocks 2004-04-03 05:23:12 +00:00
1fa97936ff strbreak() added 2004-04-03 03:00:57 +00:00
74d424c2a3 DBI 2004-04-03 01:33:25 +00:00
23bea839da error checking 2004-04-03 01:04:57 +00:00
1f178b916f Changed to DBI 2004-04-03 00:57:49 +00:00
c1291e7504 DBI Changes
fixed possible memory leak
2004-04-03 00:52:53 +00:00
2a1e246658 DBI changes 2004-04-02 23:45:26 +00:00
70e3d68643 changes 2004-04-02 21:35:18 +00:00
688e986999 linux build again 2004-04-02 21:18:48 +00:00
35f04bd679 no message 2004-04-02 21:10:50 +00:00
f25a4cc22c Linux build 2004-04-02 21:01:50 +00:00
15123043fe no message 2004-04-02 20:58:38 +00:00
3042aef82e Fixed access level bug 2004-04-02 20:58:12 +00:00
611135de3d Initial import of PgSQL module. 2004-04-02 19:54:21 +00:00
8e351d74d0 fixed g_aNum 2004-04-02 12:36:46 +00:00
204fa550c3 changed amx_mode to 1 by default 2004-04-02 11:48:12 +00:00
4f4c87d9b2 Removed all warnings. 2004-04-01 05:53:22 +00:00
b0e6ea16ce removed amx_version cvar 2004-03-31 18:07:18 +00:00
b677e5c164 correct use of const functions 2004-03-31 18:05:07 +00:00
b01c6a27f6 removed PACKED after struct names; => gcc 3.3 compatibility? 2004-03-31 18:04:48 +00:00
5889743b3e added some globals 2004-03-31 18:04:22 +00:00
b300c1dfe2 get_user_weapons sets the third parameter to 0 before counting 2004-03-31 18:04:03 +00:00
32b0c93539 support for the new module interface 2004-03-31 18:03:06 +00:00
97bf30cb2a partial support for the new module interface 2004-03-31 18:02:37 +00:00
23200da401 partial support for the new module interface; rewritten 2004-03-31 18:02:20 +00:00
9037291791 renamed from amx.cfg to amxx.cfg 2004-03-31 11:45:08 +00:00
93cb272d45 no message 2004-03-31 11:44:11 +00:00
b008438e6c test 2004-03-31 07:23:45 +00:00
b9530d538b test 2004-03-31 07:21:01 +00:00
773e358596 Fixed setting players online once again 2004-03-31 06:15:27 +00:00
52722d7ebf Fixed 2004-03-29 14:57:15 +00:00
75c3cd90e0 Fixed 2004-03-29 14:49:50 +00:00
ffae6da15e Fixed so that player must pass one ClientInfoChanged before cs_set_user* works. 2004-03-29 14:19:02 +00:00
1428a87edc Added amxxlog.cpp to project 2004-03-29 10:50:50 +00:00
56de4677b8 fixed localinfo for users.ini 2004-03-28 16:08:12 +00:00
fd9cc48bad better support for czero 2004-03-28 14:26:39 +00:00
bfdd7db2a7 no message 2004-03-27 23:48:09 +00:00
5866200876 no message 2004-03-27 23:42:12 +00:00
eaf5384522 fixed if NO_STEAM is defined 2004-03-27 22:13:41 +00:00
f499dd947b added amxxlog.cpp file 2004-03-27 20:00:25 +00:00
0cc0253f5c added newlines to logging mode 2 (HL Logs) 2004-03-27 17:40:06 +00:00
2fa8e1fa1b using new function names and parameters;
added wrapper functions for the new small abstract machine / the old module interface
2004-03-27 17:06:33 +00:00
0612e67e2d using new function names and parameters 2004-03-27 17:06:08 +00:00
bada4d4336 file from the new abstract machine;
floats are actually doubles in 64 bit
2004-03-27 17:03:20 +00:00
9902faa81c new function names (AMXXLOG_*, countModules, CountModulesMode enum) 2004-03-27 17:01:56 +00:00
cdbfcdc4c4 logging functions moved from util.cpp to amxxlog.cpp; renamed to AMXXLOG_*; AMXXLOG_Init added (called from Meta_Attach)
UTIL_GetModulesNum moved to modules.cpp and renamed to countModules
2004-03-27 17:01:18 +00:00
5c1287bbfb new abstract machine; adapted a bit 2004-03-27 16:58:13 +00:00
05cf53e1b9 nothing important 2004-03-25 18:37:02 +00:00
a3c9489360 plugins using localinfo paths now 2004-03-25 16:52:04 +00:00
63e1d7e43b added password description 2004-03-25 14:30:33 +00:00
a82b5383d7 added amxx_customdir and amxx_configsdir 2004-03-25 13:35:24 +00:00
9b551916f1 making sure amxx_customdir and amxx_configsdir are set 2004-03-25 13:35:02 +00:00
64a7afa371 added localinfo stocks 2004-03-25 13:34:27 +00:00
c7981eb54b added build_path() 2004-03-25 13:33:58 +00:00
a6473737a2 entity_set_model should take const strings 2004-03-25 11:42:34 +00:00
3fc4049b0a Placed meta_api.cpp under right folder in workspace 2004-03-25 08:33:48 +00:00
4f6450abf0 amxx_pluginsdir and amxx_modulesdir added 2004-03-24 19:00:03 +00:00
130f274f86 more localinfos 2004-03-24 18:59:37 +00:00
98c63e8efd new localinfos 2004-03-24 18:39:25 +00:00
2b7b1a844c get_modulesnum function updated (using UTIL_GetModulesNum now) 2004-03-24 18:35:42 +00:00
012507c38a fixed getline function 2004-03-24 18:35:04 +00:00
a9a46e20b2 fixed size() function, added empty() function 2004-03-24 18:34:47 +00:00
ab110d3d27 added localinfo paths, fixed amx_version and amxmodx_version cvars (module count) 2004-03-24 18:34:18 +00:00
cfb45c1302 added UTIL_GetModulesNum function 2004-03-24 18:33:41 +00:00
e40daf1315 another fix 2004-03-24 12:56:21 +00:00
5967f7d951 fixed entity_set_string to take const strings 2004-03-24 08:53:40 +00:00
ca0c0bfce2 disabled restrictmenu by default 2004-03-24 08:30:49 +00:00
079f824a81 updated version information 2004-03-24 08:30:08 +00:00
d850e62a02 updated amxx version 2004-03-24 08:24:35 +00:00
10b887147e added [AMXX] before messages 2004-03-24 08:24:19 +00:00
df2a96e2d7 removed map descriptions 2004-03-24 08:21:13 +00:00
63bc246264 changed ban commands 2004-03-24 08:20:35 +00:00
16e3582ef5 nothing important 2004-03-24 08:19:08 +00:00
0a582d4635 Didn't work - fixed a lot of stuff 2004-03-24 08:18:07 +00:00
cd3f57987b updated to new ban command 2004-03-24 08:16:43 +00:00
ecbf698486 removed descriptions 2004-03-24 08:16:29 +00:00
64a0c95bfa Engine is deactivated by default 2004-03-24 08:16:14 +00:00
894d650593 welcomemsg and stats_logging are deactivated by default 2004-03-24 08:15:58 +00:00
8d89be8de3 confirmed WON offset: OFFSET_CLIPAMMO as 51 2004-03-24 07:54:15 +00:00
b9bb70d410 fixed maxclients bug 2004-03-24 07:54:13 +00:00
8c7938d47a Fixed workspace 2004-03-24 07:28:49 +00:00
c78e2bcf7e new makefile 2004-03-24 06:33:39 +00:00
0bea18ca9f New makefile 2004-03-24 06:33:03 +00:00
7937c77eed imported jghg2 support 2004-03-24 05:10:11 +00:00
8110271bdd imported jghg2 support 2004-03-24 05:01:33 +00:00
f566ac2eb7 new file names+headers 2004-03-24 03:39:37 +00:00
b311a9ccc3 new file names+headers 2004-03-24 02:10:20 +00:00
2a7b5b714d Fixed header files in makefile. 2004-03-24 01:40:10 +00:00
f711baf3df new file names 2004-03-24 01:35:44 +00:00
5c82095e81 removed useless hook 2004-03-24 01:10:38 +00:00
15904761e8 compiles now 2004-03-24 00:54:35 +00:00
6d58afcedb undid some stuff 2004-03-23 13:25:59 +00:00
1b0cc63b5b amx.cfg --> amxx.cfg 2004-03-23 10:15:26 +00:00
94b9bc9939 fixed give_item 2004-03-23 01:18:22 +00:00
95445293a2 Fixed anim after cs_set_weapon_silenc 2004-03-22 12:20:00 +00:00
431bfbb4d9 Updated set_entity_visibility 2004-03-22 11:44:47 +00:00
e47104aa29 Fixed reference to find_ent_by_classname in find_ent
Added set_entity_visibility and get_entity_visibility
2004-03-22 11:29:29 +00:00
180fa52acb Added cs_get_weapon_ammo/cs_set_weapon_ammo 2004-03-22 09:10:11 +00:00
bbbe0cda78 Added cs_get_weapon_ammo/cs_set_weapon_ammo 2004-03-22 08:57:23 +00:00
b21bbcbf90 Fixed prototype of set_offset_short
Fixed all offset natives (they checked ent index above maxClients, should've been maxEntities (some also checked if player is online))
Added s/get_offset_char()
Fixed set_pdata_float to set float value from parameter properly
Fixed set_pdata_short to set short value from parameter properly
Reimplemented find_ent_by_owner
2004-03-22 08:27:52 +00:00
66a1f11387 Shortened all natives that had longer names than old compiler limit of 19 characters. 2004-03-22 07:23:47 +00:00
2b366a354c fixed amx_show_activity 2004-03-22 06:33:11 +00:00
cebf782a90 amx_show_activity is now registered 2004-03-22 06:30:37 +00:00
4ffa954055 Fixed bug with get_offset 2004-03-22 05:43:47 +00:00
556e9cee57 removed a forgotten debug message 2004-03-21 17:10:35 +00:00
421c62c6a0 Added native support for set_speak and get_speak and SetSpeak 2004-03-21 09:17:55 +00:00
9bec921fd8 Added set_speak and get_speak 2004-03-21 09:13:55 +00:00
b7b2d59613 Changed set_user_maxspeed 2004-03-21 08:59:18 +00:00
db41e1830a Added CSW_GALI for backwards support 2004-03-21 07:14:40 +00:00
9061e13e11 Fixed access level bug. 2004-03-21 06:32:27 +00:00
a72b749fac Fixed fun include from amxmodx and cs_set_user_nvg 2004-03-20 23:58:26 +00:00
cd0cd140ac Fixed native character length for cs_set_user_nvgoggles 2004-03-20 23:57:24 +00:00
7fef5aad34 Includes were broken - it is fixed. 2004-03-18 01:32:39 +00:00
38af364744 fixed filters bug 2004-03-17 18:57:36 +00:00
a7c4f5a147 typo fix courtesy of pimp daddy 2004-03-17 11:38:23 +00:00
96b79cd24f fixed find_entity 2004-03-17 07:30:07 +00:00
bbb5adc70f added get_user_wonid() 2004-03-16 19:40:02 +00:00
a4eccaa4bb removed get_user_wonid() 2004-03-16 19:39:48 +00:00
6a10397641 Fixed xtrafun include 2004-03-16 05:21:42 +00:00
398773849c Fixed get_global_int bug 2004-03-16 01:12:24 +00:00
41c8013adf Removed bad lstdc++ line. 2004-03-16 01:00:22 +00:00
93a4d8a0d3 Fixed call_think 2004-03-16 00:48:37 +00:00
bf35c8f079 *** empty log message *** 2004-03-15 22:13:43 +00:00
1425615e20 Fixed headers. 2004-03-15 21:05:08 +00:00
ee947b1673 Redid lots of destruction stuff. 2004-03-15 20:27:53 +00:00
439550c2ac Moved msg functions 2004-03-15 19:55:29 +00:00
35fe033d53 Fixed controller, blending, and reduced view lag.
(T(+)rget suggestions)
2004-03-15 18:23:23 +00:00
8b81138800 *** empty log message *** 2004-03-14 20:14:51 +00:00
308e77d3b1 *** empty log message *** 2004-03-14 19:14:29 +00:00
e6ad1b5b65 *** empty log message *** 2004-03-14 19:07:32 +00:00
b70fb5b525 *** empty log message *** 2004-03-14 19:06:52 +00:00
1dfe40c135 *** empty log message *** 2004-03-14 19:00:43 +00:00
29f31e808f version changed to 0.15 2004-03-14 17:45:09 +00:00
f4a729e85a cpp std lib depedencies removed 2004-03-14 14:05:44 +00:00
d3839db6f8 message_begin, message_end, write_* functions added back to core 2004-03-14 13:57:53 +00:00
41a56a8fda not using c++ std lib 2004-03-14 13:57:27 +00:00
812ee46260 commented message_begin() etc 2004-03-14 12:47:16 +00:00
5ddb726a12 Added VS7 project file 2004-03-14 08:31:36 +00:00
5b56c27e67 Added new ENGINE stocks and natives 2004-03-14 08:23:42 +00:00
faafdf9498 fixed reference to "find_entity_by_class" -> "find_ent_by_class" 2004-03-14 08:20:13 +00:00
d9b84087d9 Removed messaging code.
Fixed last argument bug in set/get msg arg funcs.
2004-03-13 20:48:00 +00:00
79b2095932 switched back to old compiler 2004-03-13 10:06:52 +00:00
5679cb285a removed fun's version cvar 2004-03-12 19:04:02 +00:00
47a2ecaa81 fixed find_entity should return value warning 2004-03-12 13:41:16 +00:00
1e78c58aa9 Removed botrelated code 2004-03-12 11:19:44 +00:00
d819a55802 version says 0.1 WON for won and 0.1 STEAM for steam 2004-03-12 09:49:49 +00:00
7d1a26e4ca fixed so it's now possible to shoot and break func_breakable:s again :-) 2004-03-12 07:42:54 +00:00
d0965d38c8 removed stock get_user_hitzones 2004-03-11 14:56:08 +00:00
6a8380fb0f another bugfix :) 2004-03-11 14:22:06 +00:00
cecb04944f updated paths 2004-03-11 14:05:01 +00:00
d47ed6c48c another bugfix 2004-03-11 13:48:57 +00:00
4656bb246e possible fix of the events bug 2004-03-11 12:35:13 +00:00
fe3977ee61 #include <string> added 2004-03-11 12:15:15 +00:00
486e8da7a8 updated paths 2004-03-11 10:13:01 +00:00
d65d599b2c removed debug msg 2004-03-11 10:10:49 +00:00
655c5a5db3 Updated cs_set_user_vip/cs_get_user_vip (bug in cs_get_user_vip fixed)
cs_set_user_deaths now updates ingame scoreboard (sending ScoreInfo message).
2004-03-11 09:29:08 +00:00
3598791060 fixed small comment mistake 2004-03-11 08:10:12 +00:00
b505bdb7e8 updated set_user_hitzones, added get_user_hitzones 2004-03-10 22:32:10 +00:00
1e69aaff18 removed set_hitzones 2004-03-10 21:59:21 +00:00
fa725d1838 added set_user_hitzones, remove set_hitzones 2004-03-10 21:58:47 +00:00
be58c942c0 Linux small compiler. 2004-03-10 18:53:29 +00:00
bed1df8237 using __linux__ instead of LINUX 2004-03-10 16:28:38 +00:00
7206639ef9 directory paths should be ok now (not using localinfos) 2004-03-10 16:28:17 +00:00
fbb6b260a6 Removed get_user_wonid 2004-03-10 16:26:18 +00:00
753426440d nothing important 2004-03-10 13:46:21 +00:00
de0cf4da9a making sure basedir is set 2004-03-10 08:31:51 +00:00
923f3a987f removed get_user_wonid 2004-03-09 20:36:22 +00:00
145455ecfb removed one of the two set_user_money stocks 2004-03-09 20:35:50 +00:00
21dbe183e3 added get_user_wonid 2004-03-09 17:12:58 +00:00
0bdc09d3d9 hardcoded pathes 2004-03-09 15:53:40 +00:00
31f59ea92e changed to find_entity_by_class where stock used find_entity 2004-03-09 14:12:10 +00:00
513a005f3d removed so as to not accidentally use old builds 2004-03-09 10:26:40 +00:00
91d4d821ec fixed link to plugins.ini (was in amxx/configs, now is in amxx/) 2004-03-09 09:39:09 +00:00
acb2ebaaf9 fixed link to modules.ini (was in amxx/configs, now is in amxx/) 2004-03-09 09:38:36 +00:00
6385e00106 removed #define LINUX 2004-03-09 09:36:54 +00:00
666bc67f3d updated to use find_entity_by_class 2004-03-09 08:54:12 +00:00
2d327e8d14 backwards comp. intitial version 2004-03-09 08:53:06 +00:00
d1379bb671 renamed find_entity in engine to find_ent_by_class (find_ent_by_classname works too) 2004-03-09 08:32:50 +00:00
0f4c470e67 added status to amx_modules 2004-03-08 17:44:49 +00:00
af26dc83a5 changed to str_to_num/num_to_str 2004-03-08 17:34:37 +00:00
87378017fd fixed conmotd.txt path 2004-03-08 17:33:55 +00:00
e25aadd7a3 fixed /rank, /stats and /statsme | changed to str_to_num/num_to_str 2004-03-08 17:33:06 +00:00
a26606f799 amx_plugins, amx_modules: switched to console ouput instead of motd window 2004-03-08 17:30:30 +00:00
b938e955f5 removed stocks: int_to_str, str_to_int, numtostr and strtonum 2004-03-08 17:28:57 +00:00
864c6d6aa4 added status to get_module 2004-03-08 17:27:18 +00:00
96ab54a107 added Status for get_module() 2004-03-08 17:26:38 +00:00
d37bdc026c added numtostr() and strtonum() 2004-03-08 17:19:41 +00:00
10a28dcde9 changed to str_to_num/num_to_str 2004-03-08 17:18:34 +00:00
57747fff55 changed to str_to_num/num_to_str | fixed get_modules 2004-03-08 16:06:11 +00:00
5cb9cb1c05 fixed potencial logging crashes in Meta_Attach 2004-03-08 15:12:53 +00:00
db278c390d log_amx: remove .amx from plugin names 2004-03-08 15:12:16 +00:00
8ffcb98ce7 hardcoded directory names 2004-03-08 14:09:44 +00:00
c2879eafab get_module returns module status too 2004-03-08 14:09:09 +00:00
214f914547 this is steamid/wonid 2004-03-08 10:27:51 +00:00
1e880869e7 Fixed amxmod.inc 2004-03-08 10:24:10 +00:00
d3a58298c9 fixed find_entity 2004-03-08 10:07:55 +00:00
0b129c3a9f Updated explanation of find_entity saying "will return 0 if nothing is found" 2004-03-08 09:28:30 +00:00
da149e4580 Confirmed hostage follow offset for WON, tidied up csplayerclass 2004-03-08 09:18:06 +00:00
913b72451d fixed return create_entity(szClassname[]) 2004-03-08 08:36:23 +00:00
591 changed files with 197265 additions and 11844 deletions

View File

@ -29,9 +29,7 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "amxmod.h"
#include "CCmd.h" #include "CCmd.h"
// ***************************************************** // *****************************************************
@ -58,8 +56,8 @@ CmdMngr::Command::Command( CPluginMngr::CPlugin* pplugin,const char* pcmd,
char szCmd[64], szArg[64]; char szCmd[64], szArg[64];
*szCmd = 0; *szArg=0; *szCmd = 0; *szArg=0;
sscanf(pcmd,"%s %s",szCmd,szArg); sscanf(pcmd,"%s %s",szCmd,szArg);
command.set(szCmd); command.assign(szCmd);
argument.set(szArg); argument.assign(szArg);
plugin = pplugin; plugin = pplugin;
flags = pflags; flags = pflags;
cmdtype = 0; cmdtype = 0;
@ -240,7 +238,7 @@ void CmdMngr::registerPrefix( const char* nn )
CmdMngr::CmdPrefix** CmdMngr::findPrefix( const char* nn ){ CmdMngr::CmdPrefix** CmdMngr::findPrefix( const char* nn ){
CmdPrefix** aa = &prefixHead; CmdPrefix** aa = &prefixHead;
while(*aa){ while(*aa){
if ( !strncmp( (*aa)->name.str(), nn, (*aa)->name.size() ) ) if ( !strncmp( (*aa)->name.c_str(), nn, (*aa)->name.size() ) )
break; break;
aa=&(*aa)->next; aa=&(*aa)->next;
} }

View File

@ -67,12 +67,12 @@ public:
~Command(); ~Command();
public: public:
inline const char* getCommand() const{ return command.str(); } inline const char* getCommand() { return command.c_str(); }
inline const char* getArgument() const{ return argument.str(); } inline const char* getArgument() { return argument.c_str(); }
inline const char* getCmdInfo() const{ return info.str(); } inline const char* getCmdInfo() { return info.c_str(); }
inline const char* getCmdLine() const{ return commandline.str(); } inline const char* getCmdLine() { return commandline.c_str(); }
inline bool matchCommandLine(const char* cmd, const char* arg) { return (!stricmp(command.str()+prefix, cmd+prefix ) && (argument.empty() || !stricmp(argument.str() , arg ))); } inline bool matchCommandLine(const char* cmd, const char* arg) { return (!stricmp(command.c_str()+prefix, cmd+prefix ) && (argument.empty() || !stricmp(argument.c_str() , arg ))); }
inline bool matchCommand(const char* cmd) { return (!strcmp(command.str(), cmd )); } inline bool matchCommand(const char* cmd) { return (!strcmp(command.c_str(), cmd )); }
inline int getFunction() const { return function; } inline int getFunction() const { return function; }
inline bool gotAccess(int f) const { return (!flags||((flags & f)==flags)); } inline bool gotAccess(int f) const { return (!flags||((flags & f)==flags)); }
inline CPluginMngr::CPlugin* getPlugin() { return plugin; } inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
@ -100,8 +100,8 @@ private:
CmdLink* clcmdlist; CmdLink* clcmdlist;
struct CmdPrefix { struct CmdPrefix {
CmdMngr* parent;
String name; String name;
CmdMngr* parent;
CmdLink* list; CmdLink* list;
CmdPrefix* next; CmdPrefix* next;
CmdPrefix( const char* nn , CmdMngr* pp) : name(nn),parent(pp),list(0),next(0){} CmdPrefix( const char* nn , CmdMngr* pp) : name(nn),parent(pp),list(0),next(0){}

View File

@ -29,9 +29,7 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "amxmod.h"
#include "CEvent.h" #include "CEvent.h"
// ***************************************************** // *****************************************************
@ -44,6 +42,9 @@ EventsMngr::ClEvent::ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags)
m_Func = func; m_Func = func;
// flags // flags
m_FlagAlive = true;
m_FlagDead = true;
m_FlagWorld = (flags & 1) ? true : false; // flag a m_FlagWorld = (flags & 1) ? true : false; // flag a
m_FlagPlayer = (flags & 2) ? true : false; // flag b m_FlagPlayer = (flags & 2) ? true : false; // flag b
m_FlagOnce = (flags & 4) ? true : false; // flag c m_FlagOnce = (flags & 4) ? true : false; // flag c
@ -55,11 +56,58 @@ EventsMngr::ClEvent::ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags)
m_Stamp = 0.0f; m_Stamp = 0.0f;
m_Done = false; m_Done = false;
m_Conditions = NULL;
} }
EventsMngr::ClEvent::~ClEvent() EventsMngr::ClEvent::~ClEvent()
{ {
cond_t *tmp1 = m_Conditions;
cond_t *tmp2 = NULL;
while (tmp1)
{
tmp2 = tmp1->next;
delete tmp1;
tmp1 = tmp2;
}
m_Conditions = NULL;
}
void EventsMngr::NextParam()
{
const int INITIAL_PARSEVAULT_SIZE = 32;
if (m_ParsePos < m_ParseVaultSize)
return;
MsgDataEntry *tmp = NULL;
int tmpSize = 0;
if (m_ParseVault)
{
// copy to tmp
tmp = new MsgDataEntry[m_ParseVaultSize];
if (!tmp)
{
return; // :TODO: Error report !!
}
memcpy(tmp, m_ParseVault, m_ParseVaultSize * sizeof(MsgDataEntry));
tmpSize = m_ParseVaultSize;
delete [] m_ParseVault;
m_ParseVault = NULL;
}
if (m_ParseVaultSize > 0)
m_ParseVaultSize *= 2;
else
m_ParseVaultSize = INITIAL_PARSEVAULT_SIZE;
m_ParseVault = new MsgDataEntry[m_ParseVaultSize];
if (tmp)
{
memcpy(m_ParseVault, tmp, tmpSize * sizeof(MsgDataEntry));
delete [] tmp;
tmp = NULL;
}
} }
int EventsMngr::ClEvent::getFunction() int EventsMngr::ClEvent::getFunction()
@ -69,6 +117,9 @@ int EventsMngr::ClEvent::getFunction()
EventsMngr::EventsMngr() EventsMngr::EventsMngr()
{ {
m_ParseVault = NULL;
m_ParseVaultSize = 0;
m_CurrentMsgType = -1;
clearEvents(); clearEvents();
} }
@ -106,23 +157,34 @@ void EventsMngr::ClEvent::registerFilter(char *filter)
if (!*value) if (!*value)
return; return;
CondMapPair pair; cond_t *tmpCond = new cond_t;
if (!tmpCond)
return;
// type character // type character
pair.second.type = *value; tmpCond->type = *value;
// set a null here so param id can be recognized later // set a null here so param id can be recognized, and save it
*value++ = 0; *value++ = 0;
tmpCond->paramId = atoi(filter);
// rest of line // rest of line
pair.second.sValue = value; tmpCond->sValue.assign(value);
pair.second.fValue = atof(value); tmpCond->fValue = atof(value);
pair.second.iValue = atoi(value); tmpCond->iValue = atoi(value);
// param id tmpCond->next = NULL;
pair.first = atoi(filter);
m_Conditions.insert(pair); if (m_Conditions)
{
cond_t *tmp = m_Conditions;
while (tmp->next)
tmp = tmp->next;
tmp->next = tmpCond;
}
else
m_Conditions = tmpCond;
} }
EventsMngr::ClEvent* EventsMngr::registerEvent(CPluginMngr::CPlugin* plugin, int func, int flags, int msgid) EventsMngr::ClEvent* EventsMngr::registerEvent(CPluginMngr::CPlugin* plugin, int func, int flags, int msgid)
@ -135,7 +197,7 @@ EventsMngr::ClEvent* EventsMngr::registerEvent(CPluginMngr::CPlugin* plugin, int
if (!event) if (!event)
return NULL; return NULL;
m_Events[msgid].push_back(event); m_Events[msgid].put(event);
return event; return event;
} }
@ -145,41 +207,44 @@ void EventsMngr::parserInit(int msg_type, float* timer, CPlayer* pPlayer, int in
if (msg_type < 0 || msg_type > MAX_AMX_REG_MSG) if (msg_type < 0 || msg_type > MAX_AMX_REG_MSG)
return; return;
m_CurrentMsgType = msg_type;
m_ParseNotDone = false; m_ParseNotDone = false;
m_Timer = timer; m_Timer = timer;
// don't parse if nothing to do // don't parse if nothing to do
if (m_Events[msg_type].empty()) if (!m_Events[msg_type].size())
return; return;
for(ClEventVecIter iter = m_Events[msg_type].begin(); iter != m_Events[msg_type].end(); ++iter) for(ClEventVecIter iter = m_Events[msg_type].begin(); iter; ++iter)
{ {
if ((*iter)->m_Done) if ((*iter).m_Done)
continue; continue;
if (!(*iter)->m_Plugin->isExecutable((*iter)->m_Func))
if (!(*iter).m_Plugin->isExecutable((*iter).m_Func))
{ {
(*iter)->m_Done = true; (*iter).m_Done = true;
continue; continue;
} }
if (pPlayer) if (pPlayer)
{ {
if (!(*iter)->m_FlagPlayer || (pPlayer->IsAlive() ? !(*iter)->m_FlagAlive : !(*iter)->m_FlagDead ) ) if (!(*iter).m_FlagPlayer || (pPlayer->IsAlive() ? !(*iter).m_FlagAlive : !(*iter).m_FlagDead ) )
{ {
(*iter)->m_Done = true; (*iter).m_Done = true;
continue; continue;
} }
} }
else if (!(*iter)->m_FlagWorld) else if (!(*iter).m_FlagWorld)
{ {
(*iter)->m_Done = true; (*iter).m_Done = true;
continue; continue;
} }
if ((*iter)->m_FlagOnce && (*iter)->m_Stamp == (float)(*timer)) if ((*iter).m_FlagOnce && (*iter).m_Stamp == (float)(*timer))
{ {
(*iter)->m_Done = true; (*iter).m_Done = true;
continue; continue;
} }
m_ParseNotDone = true; m_ParseNotDone = true;
@ -187,15 +252,10 @@ void EventsMngr::parserInit(int msg_type, float* timer, CPlayer* pPlayer, int in
if (m_ParseNotDone) if (m_ParseNotDone)
{ {
// we don't clear it (performance)
if (m_ParseVault.size() < 1)
{
m_ParseVault.reserve(32); // 32 as default
m_ParseVault.push_back(MsgDataVault());
}
m_ParsePos = 0; m_ParsePos = 0;
m_ParseVault[m_ParsePos].type = MSG_INTEGER; NextParam();
m_ParseVault[m_ParsePos].iValue = index; m_ParseVault[0].type = MSG_INTEGER;
m_ParseVault[0].iValue = index;
} }
m_ParseFun = &m_Events[msg_type]; m_ParseFun = &m_Events[msg_type];
} }
@ -206,45 +266,43 @@ void EventsMngr::parseValue(int iValue)
if (!m_ParseNotDone || !m_ParseFun) if (!m_ParseNotDone || !m_ParseFun)
return; return;
// grow if needed // grow if needed
if (m_ParseVault.size() <= static_cast<size_t>(++m_ParsePos)) ++m_ParsePos;
{ NextParam();
MsgDataVault tmp;
m_ParseVault.push_back(tmp);
}
m_ParseVault[m_ParsePos].type = MSG_INTEGER; m_ParseVault[m_ParsePos].type = MSG_INTEGER;
m_ParseVault[m_ParsePos].iValue = iValue; m_ParseVault[m_ParsePos].iValue = iValue;
// loop through the registered funcs, and decide whether they have to be called // loop through the registered funcs, and decide whether they have to be called or not
bool skip; // if they shouldnt, their m_Done is set to true
for (ClEventVecIter iter = m_ParseFun->begin(); iter != m_ParseFun->end(); ++iter) for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++iter)
{ {
if ((*iter)->m_Done) if ((*iter).m_Done)
continue; continue; // already skipped; don't bother with parsing
skip = false; // loop through conditions
ClEvent::CondMapIter condIter = (*iter)->m_Conditions.find(m_ParsePos); bool execute = false;
if (condIter == (*iter)->m_Conditions.end()) bool anyConditions = false;
continue; for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next)
do
{ {
switch(condIter->second.type) if (condIter->paramId == m_ParsePos)
{ {
case '=': if (condIter->second.iValue == iValue) skip=true; break; anyConditions = true;
case '!': if (condIter->second.iValue != iValue) skip=true; break; switch(condIter->type)
case '&': if (iValue & condIter->second.iValue) skip=true; break; {
case '<': if (iValue < condIter->second.iValue) skip=true; break; case '=': if (condIter->iValue == iValue) execute=true; break;
case '>': if (iValue > condIter->second.iValue) skip=true; break; case '!': if (condIter->iValue != iValue) execute=true; break;
case '&': if (iValue & condIter->iValue) execute=true; break;
case '<': if (iValue < condIter->iValue) execute=true; break;
case '>': if (iValue > condIter->iValue) execute=true; break;
} }
if (skip) if (execute)
break; break;
} while ( ++condIter != (*iter)->m_Conditions.end() ); }
}
if (skip) if (anyConditions && !execute)
continue; (*iter).m_Done = true; // don't execute
(*iter)->m_Done = true;
} }
} }
@ -254,44 +312,42 @@ void EventsMngr::parseValue(float fValue)
if (!m_ParseNotDone || !m_ParseFun) if (!m_ParseNotDone || !m_ParseFun)
return; return;
// grow if needed // grow if needed
if (m_ParseVault.size() <= static_cast<size_t>(++m_ParsePos)) ++m_ParsePos;
{ NextParam();
MsgDataVault tmp;
m_ParseVault.push_back(tmp);
}
m_ParseVault[m_ParsePos].type = MSG_FLOAT; m_ParseVault[m_ParsePos].type = MSG_FLOAT;
m_ParseVault[m_ParsePos].fValue = fValue; m_ParseVault[m_ParsePos].fValue = fValue;
// loop through the registered funcs, and decide whether they have to be called // loop through the registered funcs, and decide whether they have to be called or not
bool skip; // if they shouldnt, their m_Done is set to true
for (ClEventVecIter iter = m_ParseFun->begin(); iter != m_ParseFun->end(); ++iter) for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++iter)
{ {
if ((*iter)->m_Done) if ((*iter).m_Done)
continue; continue; // already skipped; don't bother with parsing
skip = false; // loop through conditions
ClEvent::CondMapIter condIter = (*iter)->m_Conditions.find(m_ParsePos); bool execute = false;
if (condIter == (*iter)->m_Conditions.end()) bool anyConditions = false;
continue; for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next)
do
{ {
switch(condIter->second.type) if (condIter->paramId == m_ParsePos)
{ {
case '=': if (condIter->second.fValue == fValue) skip=true; break; anyConditions = true;
case '!': if (condIter->second.fValue != fValue) skip=true; break; switch(condIter->type)
case '<': if (fValue < condIter->second.fValue) skip=true; break; {
case '>': if (fValue > condIter->second.fValue) skip=true; break; case '=': if (condIter->fValue == fValue) execute=true; break;
case '!': if (condIter->fValue != fValue) execute=true; break;
case '<': if (fValue < condIter->fValue) execute=true; break;
case '>': if (fValue > condIter->fValue) execute=true; break;
} }
if (skip) if (execute)
break; break;
} while ( ++condIter != (*iter)->m_Conditions.end() ); }
}
if (skip) if (anyConditions && !execute)
continue; (*iter).m_Done = true; // don't execute
(*iter)->m_Done = true;
} }
} }
@ -302,42 +358,39 @@ void EventsMngr::parseValue(const char *sz)
return; return;
// grow if needed // grow if needed
if (m_ParseVault.size() <= static_cast<size_t>(++m_ParsePos)) ++m_ParsePos;
{ NextParam();
MsgDataVault tmp;
m_ParseVault.push_back(tmp);
}
m_ParseVault[m_ParsePos].type = MSG_STRING; m_ParseVault[m_ParsePos].type = MSG_STRING;
m_ParseVault[m_ParsePos].sValue = sz; m_ParseVault[m_ParsePos].sValue = sz;
// loop through the registered funcs, and decide whether they have to be called // loop through the registered funcs, and decide whether they have to be called or not
bool skip; // if they shouldnt, their m_Done is set to true
for (ClEventVecIter iter = m_ParseFun->begin(); iter != m_ParseFun->end(); ++iter) for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++iter)
{ {
if ((*iter)->m_Done) if ((*iter).m_Done)
continue; continue; // already skipped; don't bother with parsing
skip = false; // loop through conditions
ClEvent::CondMapIter condIter = (*iter)->m_Conditions.find(m_ParsePos); bool execute = false;
if (condIter == (*iter)->m_Conditions.end()) bool anyConditions = false;
continue; for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next)
do
{ {
switch(condIter->second.type) if (condIter->paramId == m_ParsePos)
{ {
case '=': if (!strcmp(sz, condIter->second.sValue.c_str())) skip=true; break; anyConditions = true;
case '!': if (!strstr(sz, condIter->second.sValue.c_str())) skip=true; break; switch(condIter->type)
case '&': if (strstr(sz, condIter->second.sValue.c_str())) skip=true; break; {
case '=': if (!strcmp(sz, condIter->sValue.c_str())) execute=true; break;
case '!': if (strcmp(sz, condIter->sValue.c_str())) execute=true; break;
case '&': if (strstr(sz, condIter->sValue.c_str())) execute=true; break;
} }
if (skip) if (execute)
break; break;
} while ( ++condIter != (*iter)->m_Conditions.end() ); }
}
if (skip) if (anyConditions && !execute)
continue; (*iter).m_Done = true; // don't execute
(*iter)->m_Done = true;
} }
} }
@ -354,20 +407,19 @@ void EventsMngr::executeEvents()
try try
{ {
#endif // #ifdef ENABLEEXEPTIONS #endif // #ifdef ENABLEEXEPTIONS
for (ClEventVecIter iter = m_ParseFun->begin(); iter != m_ParseFun->end(); ++iter) for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++iter)
{ {
if ( (*iter)->m_Done ) if ( (*iter).m_Done )
{ {
(*iter)->m_Done = false; (*iter).m_Done = false;
continue; continue;
} }
(*iter)->m_Stamp = *m_Timer; (*iter).m_Stamp = (float)*m_Timer;
if ((err = amx_Exec((*iter)->m_Plugin->getAMX(), NULL, (*iter)->m_Func, 1, m_ParseVault.size() ? m_ParseVault[0].iValue : 0)) != AMX_ERR_NONE) if ((err = amx_Exec((*iter).m_Plugin->getAMX(), NULL, (*iter).m_Func, 1, m_ParseVault ? m_ParseVault[0].iValue : 0)) != AMX_ERR_NONE)
{ {
UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err, LogError((*iter).m_Plugin->getAMX(), err, "");
(*iter)->m_Plugin->getAMX()->curline, (*iter)->m_Plugin->getName());
} }
} }
@ -375,17 +427,20 @@ void EventsMngr::executeEvents()
} }
catch( ... ) catch( ... )
{ {
UTIL_Log( "[AMXX] fatal error at event execution"); AMXXLOG_Log( "[AMXX] fatal error at event execution");
} }
#endif // #ifdef ENABLEEXEPTIONS #endif // #ifdef ENABLEEXEPTIONS
m_CurrentMsgType = -1;
m_ParseFun = NULL;
} }
int EventsMngr::getArgNum() int EventsMngr::getArgNum() const
{ {
return m_ParsePos + 1; return m_ParsePos + 1;
} }
const char* EventsMngr::getArgString(int a) const char* EventsMngr::getArgString(int a) const
{ {
if ( a < 0 || a > m_ParsePos ) if ( a < 0 || a > m_ParsePos )
return ""; return "";
@ -405,7 +460,7 @@ const char* EventsMngr::getArgString(int a)
} }
} }
int EventsMngr::getArgInteger(int a) int EventsMngr::getArgInteger(int a) const
{ {
if ( a < 0 || a > m_ParsePos ) if ( a < 0 || a > m_ParsePos )
return 0; return 0;
@ -421,7 +476,7 @@ int EventsMngr::getArgInteger(int a)
} }
} }
float EventsMngr::getArgFloat(int a) float EventsMngr::getArgFloat(int a) const
{ {
if ( a < 0 || a > m_ParsePos ) if ( a < 0 || a > m_ParsePos )
return 0.0f; return 0.0f;
@ -441,13 +496,15 @@ void EventsMngr::clearEvents(void)
{ {
for (int i = 0; i < MAX_AMX_REG_MSG; ++i) for (int i = 0; i < MAX_AMX_REG_MSG; ++i)
{ {
for (ClEventVecIter iter = m_Events[i].begin(); iter != m_Events[i].end(); ++iter)
{
if (*iter)
delete *iter;
}
m_Events[i].clear(); m_Events[i].clear();
} }
// delete parsevault
if (m_ParseVault)
{
delete [] m_ParseVault;
m_ParseVault = NULL;
m_ParseVaultSize = 0;
}
} }
int EventsMngr::getEventId(const char* msg) int EventsMngr::getEventId(const char* msg)
@ -479,3 +536,8 @@ int EventsMngr::getEventId(const char* msg)
// find the id of the message // find the id of the message
return pos = GET_USER_MSG_ID(PLID, msg , 0 ); return pos = GET_USER_MSG_ID(PLID, msg , 0 );
} }
int EventsMngr::getCurrentMsgType()
{
return m_CurrentMsgType;
}

View File

@ -32,10 +32,6 @@
#ifndef __CEVENTS_H__ #ifndef __CEVENTS_H__
#define __CEVENTS_H__ #define __CEVENTS_H__
#include <vector>
#include <map>
#include <string>
#define MAX_AMX_REG_MSG MAX_REG_MSGS+16 #define MAX_AMX_REG_MSG MAX_REG_MSGS+16
enum { enum {
@ -90,50 +86,53 @@ public:
// conditions // conditions
struct cond_t struct cond_t
{ {
std::string sValue; // value int paramId; // the message parameter id
float fValue;
int iValue; String sValue; // value (string)
int type; float fValue; // value (float)
int iValue; // value (int)
int type; // type (can be int, float, string)
cond_t *next;
}; };
typedef std::pair<int, cond_t> CondMapPair; cond_t *m_Conditions;
typedef std::map<int, cond_t> CondMap;
typedef CondMap::iterator CondMapIter;
CondMap m_Conditions;
public:
// constructors & destructors // constructors & destructors
ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags); ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags);
~ClEvent(); ~ClEvent();
public:
inline CPluginMngr::CPlugin* getPlugin(); inline CPluginMngr::CPlugin* getPlugin();
inline int getFunction(); inline int getFunction();
void registerFilter(char* filter); // add a condition void registerFilter(char* filter); // add a condition
}; };
private: private:
struct MsgDataVault struct MsgDataEntry
{ {
float fValue; float fValue;
int iValue; int iValue;
const char* sValue; const char* sValue;
MsgParamType type; MsgParamType type;
}; };
typedef std::vector<MsgDataVault> MsgDataVaultVec; MsgDataEntry *m_ParseVault;
typedef MsgDataVaultVec::iterator MsgDataVaultVecIter; int m_ParseVaultSize;
MsgDataVaultVec m_ParseVault; void NextParam(); // make sure a new parameter can be added
typedef std::vector<ClEvent*> ClEventVec; typedef CList<ClEvent> ClEventVec;
typedef ClEventVec::iterator ClEventVecIter; typedef ClEventVec::iterator ClEventVecIter;
ClEventVec m_Events[MAX_AMX_REG_MSG]; ClEventVec m_Events[MAX_AMX_REG_MSG];
ClEventVec *m_ParseFun; // current Event vector ClEventVec *m_ParseFun; // current Event vector
bool m_ParseNotDone; bool m_ParseNotDone;
int m_ParsePos; // is -1 less then args. num. int m_ParsePos; // is args. num. - 1
float* m_Timer; float* m_Timer;
ClEvent* getValidEvent(ClEvent* a ); ClEvent* getValidEvent(ClEvent* a );
int m_CurrentMsgType;
public: public:
EventsMngr(); EventsMngr();
~EventsMngr(); ~EventsMngr();
@ -146,12 +145,15 @@ public:
void parseValue(float fValue); void parseValue(float fValue);
void parseValue(const char *sz); void parseValue(const char *sz);
void executeEvents(); void executeEvents();
int getArgNum(); //{ return (parsePos+1); } int getArgNum() const; //{ return (parsePos+1); }
const char* getArgString(int a); const char* getArgString(int a) const;
int getArgInteger(int a); int getArgInteger(int a) const;
float getArgFloat(int a); float getArgFloat(int a) const;
void clearEvents(void); void clearEvents(void);
static int getEventId( const char* msg ); static int getEventId( const char* msg );
int getCurrentMsgType();
}; };
#endif // #ifdef __CEVENTS_H__ #endif // #ifdef __CEVENTS_H__

View File

@ -29,8 +29,9 @@
* version. * version.
*/ */
#include "CFile.h"
#include <ctype.h> #include <ctype.h>
#include "amxmodx.h"
#include "CFile.h"
// ***************************************************** // *****************************************************
// class File // class File
@ -53,7 +54,7 @@ File::operator bool ( ) const
File& operator<<( File& f, const String& n ) File& operator<<( File& f, const String& n )
{ {
if ( f ) fputs( n.str() , f.fp ) ; if ( f ) fputs( n.c_str() , f.fp ) ;
return f; return f;
} }
@ -81,7 +82,7 @@ File& operator>>( File& f, String& n )
if ( !f ) return f; if ( !f ) return f;
char temp[1024]; char temp[1024];
fscanf( f.fp , "%s", temp ); fscanf( f.fp , "%s", temp );
n.set(temp); n.assign(temp);
return f; return f;
} }
@ -94,6 +95,7 @@ File& operator>>( File& f, char* n )
int File::getline( char* buf, int sz ) int File::getline( char* buf, int sz )
{ {
int a = sz; int a = sz;
char *origBuf = buf;
if ( *this ) if ( *this )
{ {
int c; int c;
@ -101,6 +103,15 @@ int File::getline( char* buf, int sz )
*buf++ = c; *buf++ = c;
*buf = 0; *buf = 0;
} }
// trim 0x0a and 0x0d characters at the end
while (buf != origBuf)
{
if (*buf == 0x0a || *buf == 0x0d)
*buf = 0;
--buf;
}
return a - sz; return a - sz;
} }

View File

@ -29,52 +29,497 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "amxmod.h"
#include "CForward.h"
void CForwardMngr::registerForward( CPluginMngr::CPlugin* p, int func , int type ){
CForward** a = &head[ type ];
while(*a) a = &(*a)->next;
*a = new CForward( p , func );
CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes)
{
m_FuncName = name;
m_ExecType = et;
m_NumParams = numParams;
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
// find funcs
int func;
AMXForward *tmp = NULL;
m_Funcs.clear();
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
{
if ((*iter).isValid() && amx_FindPublic((*iter).getAMX(), name, &func) == AMX_ERR_NONE)
{
AMXForward tmp;
tmp.pPlugin = &(*iter);
tmp.func = func;
m_Funcs.push_back(tmp);
}
}
} }
void CForwardMngr::clearForwards( CForward** a ){ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
while( *a ) { {
CForward* b = (*a)->next; cell realParams[FORWARD_MAX_PARAMS];
delete *a; cell *physAddrs[FORWARD_MAX_PARAMS];
*a = b;
const int STRINGEX_MAXLENGTH = 128;
cell globRetVal = 0;
unsigned int id = 0;
AMXForwardList::iterator iter;
for (iter = m_Funcs.begin(); iter != m_Funcs.end(); iter++)
{
if (iter->pPlugin->isExecutable(iter->func))
{
// handle strings & arrays
int i;
for (i = 0; i < m_NumParams; ++i)
{
if (m_ParamTypes[i] == FP_STRING || m_ParamTypes[i] == FP_STRINGEX)
{
cell *tmp;
amx_Allot(iter->pPlugin->getAMX(),
(m_ParamTypes[i] == FP_STRING) ? strlen(reinterpret_cast<const char*>(params[i]))+1 : STRINGEX_MAXLENGTH,
&realParams[i], &tmp);
amx_SetString(tmp, (const char *)(params[i]), 0, 0);
physAddrs[i] = tmp;
} }
else if (m_ParamTypes[i] == FP_ARRAY)
{
cell *tmp;
amx_Allot(iter->pPlugin->getAMX(), preparedArrays[params[i]].size,
&realParams[i], &tmp);
physAddrs[i] = tmp;
if (preparedArrays[params[i]].type == Type_Cell)
{
memcpy(tmp, preparedArrays[params[i]].ptr, preparedArrays[params[i]].size * sizeof(cell));
}
else
{
char *data = (char*)preparedArrays[params[i]].ptr;
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
*tmp++ = (static_cast<cell>(*data++)) & 0xFF;
}
}
else
{
realParams[i] = params[i];
}
}
// exec
cell retVal;
int err = amx_Execv(iter->pPlugin->getAMX(), &retVal, iter->func, m_NumParams, realParams);
// log runtime error, if any
if (err != AMX_ERR_NONE)
LogError(iter->pPlugin->getAMX(), err, "");
// cleanup strings & arrays
for (i = 0; i < m_NumParams; ++i)
{
if (m_ParamTypes[i] == FP_STRING)
{
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
}
else if (m_ParamTypes[i] == FP_STRINGEX)
{
// copy back
amx_GetString(reinterpret_cast<char*>(params[i]), physAddrs[i], 0);
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
}
else if (m_ParamTypes[i] == FP_ARRAY)
{
// copy back
if (preparedArrays[params[i]].copyBack)
{
cell *tmp = physAddrs[i];
if (preparedArrays[params[i]].type == Type_Cell)
{
memcpy(preparedArrays[params[i]].ptr, tmp, preparedArrays[params[i]].size * sizeof(cell));
}
else
{
char *data = (char*)preparedArrays[params[i]].ptr;
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
*data++ = static_cast<char>(*tmp++ & 0xFF);
}
}
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
}
}
// decide what to do (based on exectype and retval)
switch (m_ExecType)
{
case ET_IGNORE:
break;
case ET_STOP:
if (retVal > 0)
return retVal;
case ET_STOP2:
if (retVal == 1)
return 1;
else if (retVal > globRetVal)
globRetVal = retVal;
break;
case ET_CONTINUE:
if (retVal > globRetVal)
globRetVal = retVal;
break;
}
}
}
return globRetVal;
}
void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *paramTypes)
{
m_Func = func;
m_Amx = amx;
m_NumParams = numParams;
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
m_HasFunc = true;
isFree = false;
}
void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
{
m_Amx = amx;
m_NumParams = numParams;
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
isFree = false;
}
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
{
if (isFree)
return 0;
const int STRINGEX_MAXLENGTH = 128;
cell realParams[FORWARD_MAX_PARAMS];
cell *physAddrs[FORWARD_MAX_PARAMS];
if (!m_HasFunc)
return 0;
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(m_Amx);
if (!pPlugin->isExecutable(m_Func))
return 0;
// handle strings & arrays
int i;
for (i = 0; i < m_NumParams; ++i)
{
if (m_ParamTypes[i] == FP_STRING || m_ParamTypes[i] == FP_STRINGEX)
{
cell *tmp;
amx_Allot(m_Amx,
(m_ParamTypes[i] == FP_STRING) ? strlen(reinterpret_cast<const char*>(params[i]))+1 : STRINGEX_MAXLENGTH,
&realParams[i], &tmp);
amx_SetString(tmp, (const char *)(params[i]), 0, 0);
physAddrs[i] = tmp;
}
else if (m_ParamTypes[i] == FP_ARRAY)
{
cell *tmp;
amx_Allot(m_Amx, preparedArrays[params[i]].size,
&realParams[i], &tmp);
physAddrs[i] = tmp;
if (preparedArrays[params[i]].type == Type_Cell)
{
memcpy(tmp, preparedArrays[params[i]].ptr, preparedArrays[params[i]].size * sizeof(cell));
}
else
{
char *data = (char*)preparedArrays[params[i]].ptr;
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
*tmp++ = (static_cast<cell>(*data++)) & 0xFF;
}
}
else
{
realParams[i] = params[i];
}
}
// exec
cell retVal;
amx_Execv(m_Amx, &retVal, m_Func, m_NumParams, realParams);
// cleanup strings & arrays
for (i = 0; i < m_NumParams; ++i)
{
if (m_ParamTypes[i] == FP_STRING)
{
amx_Release(m_Amx, realParams[i]);
}
else if (m_ParamTypes[i] == FP_STRINGEX)
{
// copy back
amx_GetString(reinterpret_cast<char*>(params[i]), physAddrs[i], 0);
amx_Release(m_Amx, realParams[i]);
}
else if (m_ParamTypes[i] == FP_ARRAY)
{
// copy back
if (preparedArrays[params[i]].copyBack)
{
cell *tmp = physAddrs[i];
if (preparedArrays[params[i]].type == Type_Cell)
{
memcpy(preparedArrays[params[i]].ptr, tmp, preparedArrays[params[i]].size * sizeof(cell));
}
else
{
char *data = (char*)preparedArrays[params[i]].ptr;
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
*data++ = static_cast<char>(*tmp++ & 0xFF);
}
}
amx_Release(m_Amx, realParams[i]);
}
}
return retVal;
}
int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam * paramTypes)
{
int retVal = m_Forwards.size() << 1;
CForward *tmp = new CForward(funcName, et, numParams, paramTypes);
if (!tmp)
return -1; // should be invalid
m_Forwards.push_back(tmp);
return retVal;
}
int CForwardMngr::registerSPForward(int func, AMX *amx, int numParams, const ForwardParam *paramTypes)
{
int retVal = -1;
CSPForward *pForward;
if (!m_FreeSPForwards.empty())
{
retVal = m_FreeSPForwards.front();
pForward = m_SPForwards[retVal >> 1];
pForward->Set(func, amx, numParams, paramTypes);
if (pForward->getFuncsNum() == 0)
return -1;
m_FreeSPForwards.pop();
}
else
{
retVal = (m_SPForwards.size() << 1) | 1;
pForward = new CSPForward();
if (!pForward)
return -1;
pForward->Set(func, amx, numParams, paramTypes);
if (pForward->getFuncsNum() == 0)
{
return -1;
delete pForward;
}
m_SPForwards.push_back(pForward);
}
return retVal;
}
int CForwardMngr::registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
{
int retVal = (m_SPForwards.size() << 1) | 1;
CSPForward *pForward;
if (!m_FreeSPForwards.empty())
{
retVal = m_FreeSPForwards.front();
pForward = m_SPForwards[retVal>>1]; // >>1 because unregisterSPForward pushes the id which contains the sp flag
pForward->Set(funcName, amx, numParams, paramTypes);
if (pForward->getFuncsNum() == 0)
return -1;
m_FreeSPForwards.pop();
}
else
{
pForward = new CSPForward();
if (!pForward)
return -1;
pForward->Set(funcName, amx, numParams, paramTypes);
if (pForward->getFuncsNum() == 0)
{
delete pForward;
return -1;
}
m_SPForwards.push_back(pForward);
}
return retVal;
}
bool CForwardMngr::isIdValid(int id) const
{
return (id >= 0) && ((id & 1) ?
(static_cast<size_t>(id >> 1) < m_SPForwards.size()) :
(static_cast<size_t>(id >> 1) < m_Forwards.size()));
}
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);
m_TmpArraysNum = 0;
return retVal;
}
int CForwardMngr::getParamsNum(int id) const
{
return (id & 1) ? m_SPForwards[id >> 1]->getParamsNum() :
m_Forwards[id >> 1]->getParamsNum();
}
ForwardParam CForwardMngr::getParamType(int id, int paramNum) const
{
return (id & 1) ? m_SPForwards[id >> 1]->getParamType(paramNum) :
m_Forwards[id >> 1]->getParamType(paramNum);
} }
void CForwardMngr::clear() void CForwardMngr::clear()
{ {
for ( int a = 0; a < FORWARD_NUM; ++a ) for (ForwardVec::iterator iter = m_Forwards.begin(); iter != m_Forwards.end(); ++iter)
clearForwards( &head[ a ] ); {
delete *iter;
}
SPForwardVec::iterator spIter;
for (spIter = m_SPForwards.begin(); spIter != m_SPForwards.end(); ++spIter)
{
delete (*spIter);
}
m_Forwards.clear();
m_SPForwards.clear();
while (!m_FreeSPForwards.empty())
m_FreeSPForwards.pop();
m_TmpArraysNum = 0;
} }
void CForwardMngr::executeForwards( int type , int num , int player ) { bool CForwardMngr::isSPForward(int id) const
{
return ((id & 1) == 0) ? false : true;
}
cell ret = 0; void CForwardMngr::unregisterSPForward(int id)
int err; {
CForward* a = head[ type ]; //make sure the id is valid
if ( !isIdValid(id) || m_SPForwards.at(id >> 1)->isFree )
return;
while ( a ) m_SPForwards.at(id >> 1)->isFree = true;
m_FreeSPForwards.push(id);
}
int registerForward(const char *funcName, ForwardExecType et, ...)
{
int curParam = 0;
va_list argptr;
va_start(argptr, et);
ForwardParam params[FORWARD_MAX_PARAMS];
ForwardParam tmp;
while (true)
{ {
if ( a->getPlugin()->isExecutable( a->getFunction() ) ) if (curParam == FORWARD_MAX_PARAMS)
{
if ((err = amx_Exec(a->getPlugin()->getAMX(), &ret, a->getFunction() , num, player)) != AMX_ERR_NONE)
UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err,a->getPlugin()->getAMX()->curline,a->getPlugin()->getName());
if ( ret )
break; break;
tmp = (ForwardParam)va_arg(argptr, int);
} if (tmp == FP_DONE)
break;
a = a->next; params[curParam] = tmp;
++curParam;
} }
va_end(argptr);
return g_forwards.registerForward(funcName, et, curParam, params);
}
int registerSPForwardByName(AMX *amx, const char *funcName, ...)
{
int curParam = 0;
va_list argptr;
va_start(argptr, funcName);
ForwardParam params[FORWARD_MAX_PARAMS];
ForwardParam tmp;
while (true)
{
if (curParam == FORWARD_MAX_PARAMS)
break;
tmp = (ForwardParam)va_arg(argptr, int);
if (tmp == FP_DONE)
break;
params[curParam] = tmp;
++curParam;
}
va_end(argptr);
return g_forwards.registerSPForward(funcName, amx, curParam, params);
}
int registerSPForward(AMX *amx, int func, ...)
{
int curParam = 0;
va_list argptr;
va_start(argptr, func);
ForwardParam params[FORWARD_MAX_PARAMS];
ForwardParam tmp;
while (true)
{
if (curParam == FORWARD_MAX_PARAMS)
break;
tmp = (ForwardParam)va_arg(argptr, int);
if (tmp == FP_DONE)
break;
params[curParam] = tmp;
++curParam;
}
va_end(argptr);
return g_forwards.registerSPForward(func, amx, curParam, params);
}
cell executeForwards(int id, ...)
{
if (!g_forwards.isIdValid(id))
return -1;
cell params[FORWARD_MAX_PARAMS];
int paramsNum = g_forwards.getParamsNum(id);
va_list argptr;
va_start(argptr, id);
for (int i = 0; i < paramsNum && i < FORWARD_MAX_PARAMS; ++i)
{
if (g_forwards.getParamType(id, i) == FP_FLOAT)
{
REAL tmp = (REAL)va_arg(argptr, double); // floats get converted to doubles
params[i] = *(cell*)&tmp;
}
params[i] = (cell)va_arg(argptr, cell);
}
va_end(argptr);
return g_forwards.executeForwards(id, params);
}
cell CForwardMngr::prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type, bool copyBack)
{
m_TmpArrays[m_TmpArraysNum].ptr = ptr;
m_TmpArrays[m_TmpArraysNum].size = size;
m_TmpArrays[m_TmpArraysNum].type = type;
m_TmpArrays[m_TmpArraysNum].copyBack = copyBack;
return m_TmpArraysNum++;
}
cell prepareCellArray(cell *ptr, unsigned int size, bool copyBack)
{
return g_forwards.prepareArray((void*)ptr, size, Type_Cell, copyBack);
}
cell prepareCharArray(char *ptr, unsigned int size, bool copyBack)
{
return g_forwards.prepareArray((void*)ptr, size, Type_Char, copyBack);
}
void unregisterSPForward(int id)
{
g_forwards.unregisterSPForward(id);
} }

View File

@ -29,87 +29,178 @@
* version. * version.
*/ */
/*
CForward.h
forwards
1) normal forwards: called in all plugins
2) single plugin (sp) forwards: called in one plugin
The SP Forwards are handled differently because they are expected to be created / deleted
often, but the "normal" forwards are expected to be initialized at start up.
Note about forward ids:
for normal forwards: <index to vector> << 1
for sp forwards: (<index to vector> << 1) | 1
*/
#ifndef FORWARD_H #ifndef FORWARD_H
#define FORWARD_H #define FORWARD_H
// ***************************************************** const int FORWARD_MAX_PARAMS = 16;
// class CmdMngr
// *****************************************************
#define FORWARD_NUM 12 enum ForwardExecType
{
ET_IGNORE = 0, // Ignore return vaue
ET_STOP, // Stop on PLUGIN_HANDLED
ET_STOP2, // Stop on PLUGIN_HANDLED, continue on other values, return biggest return value
ET_CONTINUE, // Continue; return biggest return value
};
enum { enum ForwardParam
FF_ClientCommand, {
FF_ClientConnect, FP_DONE = -1, // specify this as the last argument
FF_ClientDisconnect, // only tells the function that there are no more arguments
FF_ClientInfoChanged, FP_CELL, // normal cell
FF_ClientPutInServer, FP_FLOAT, // float; used as normal cell though
FF_PluginInit, FP_STRING, // string
FF_PluginCfg, FP_STRINGEX, // string; will be updated to the last function's value
FF_PluginPrecache, FP_ARRAY, // array; use the return value of prepareArray.
FF_PluginLog, };
FF_PluginEnd,
FF_InconsistentFile, // for prepareArray
FF_ClientAuthorized, enum ForwardArrayElemType
{
Type_Cell = 0,
Type_Char
};
struct ForwardPreparedArray
{
void *ptr;
ForwardArrayElemType type;
unsigned int size;
bool copyBack;
};
// Normal forward
class CForward
{
const char *m_FuncName;
ForwardExecType m_ExecType;
int m_NumParams;
struct AMXForward
{
CPluginMngr::CPlugin *pPlugin;
int func;
};
typedef CVector<AMXForward> AMXForwardList;
AMXForwardList m_Funcs;
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
public:
CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam * paramTypes);
CForward()
{ } // leaves everything unitialized'
cell execute(cell *params, ForwardPreparedArray *preparedArrays);
int getParamsNum() const
{
return m_NumParams;
}
int getFuncsNum() const
{
return m_Funcs.size();
}
ForwardParam getParamType(int paramId) const
{
if (paramId < 0 || paramId >= m_NumParams)
return FP_DONE;
return m_ParamTypes[paramId];
}
};
// Single plugin forward
class CSPForward
{
const char *m_FuncName;
int m_NumParams;
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
AMX *m_Amx;
int m_Func;
bool m_HasFunc;
public:
bool isFree;
public:
CSPForward() { m_HasFunc = false; }
void Set(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
void Set(int func, AMX *amx, int numParams, const ForwardParam * paramTypes);
cell execute(cell *params, ForwardPreparedArray *preparedArrays);
int getParamsNum() const
{
return m_NumParams;
}
int getFuncsNum() const
{
return (m_HasFunc) ? 1 : 0;
}
ForwardParam getParamType(int paramId) const
{
if (paramId < 0 || paramId >= m_NumParams)
return FP_DONE;
return m_ParamTypes[paramId];
}
}; };
class CForwardMngr class CForwardMngr
{ {
typedef CVector<CForward*> ForwardVec;
typedef CVector<CSPForward*> SPForwardVec;
typedef CQueue<int> FreeSPVec; // Free SP Forwards
ForwardVec m_Forwards;
SPForwardVec m_SPForwards;
FreeSPVec m_FreeSPForwards; // so we don't have to free memory
ForwardPreparedArray m_TmpArrays[FORWARD_MAX_PARAMS]; // used by prepareArray
int m_TmpArraysNum;
public: public:
class iterator; CForwardMngr()
{ m_TmpArraysNum = 0; }
class CForward ~CForwardMngr()
{ { }
friend class iterator;
friend class CForwardMngr;
CPluginMngr::CPlugin* plugin;
int function;
CForward* next;
CForward( CPluginMngr::CPlugin* p, int func ) : plugin(p) , function(func) {next=0;}
public:
inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
inline int getFunction() { return function; }
};
private:
CForward *head[ FORWARD_NUM ];
void clearForwards( CForward** a );
public:
CForwardMngr() {memset( head, 0, sizeof(head));}
~CForwardMngr() { clear(); }
// Interface // Interface
// Register normal forward
void registerForward( CPluginMngr::CPlugin* p, int func , int type ); int registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam *paramTypes);
void executeForwards( int type , int num = 0, int player = 0 ); // Register single plugin forward
void clear(); int registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
int registerSPForward(int func, AMX *amx, int numParams, const ForwardParam * paramTypes);
// Unregister single plugin forward
class iterator { void unregisterSPForward(int id);
CForward *a; // execute forward
public: cell executeForwards(int id, cell *params);
iterator(CForward*aa) : a(aa) {} void clear(); // delete all forwards
iterator& operator++() { a = a->next; return *this; } bool isIdValid(int id) const; // check whether forward id is valid
bool operator==(const iterator& b) const { return a == b.a; } bool isSPForward(int id) const; // check whether forward is single plugin
bool operator!=(const iterator& b) const { return !operator==(b); } int getParamsNum(int id) const; // get num of params of a forward
operator bool () const { return a ? true : false; } int getFuncsNum(int id) const; // get num of found functions of a forward
CForward& operator*() { return *a; } ForwardParam getParamType(int id, int paramId) const;
}; cell prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type,
inline iterator begin( int type ) const { return iterator(head[(int)type]); } bool copyBack); // prepare array
inline iterator end() const { return iterator(0); }
inline bool forwardsExist( int type ) {return head[(int)type]?true:false;}
}; };
// (un)register forward
int registerForward(const char *funcName, ForwardExecType et, ...);
int registerSPForwardByName(AMX *amx, const char *funcName, ...);
int registerSPForward(AMX *amx, int func, ...);
void unregisterSPForward(int id);
// execute forwards
cell executeForwards(int id, ...);
// prepare array
cell prepareCellArray(cell *ptr, unsigned int size, bool copyBack = false);
cell prepareCharArray(char *ptr, unsigned int size, bool copyBack = false);
#endif #endif

1438
amxmodx/CLang.cpp Executable file

File diff suppressed because it is too large Load Diff

210
amxmodx/CLang.h Executable file
View File

@ -0,0 +1,210 @@
/* 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_CLANG_H
#define _INCLUDE_CLANG_H
#define LANG_SERVER 0
#define LANG_PLAYER -1
struct md5Pair
{
String file;
String val;
};
struct keyEntry
{
String key;
uint32_t hash;
};
struct sKeyDef
{
sKeyDef() { key = -1; def = 0; }
~sKeyDef() { if (def) delete def; }
int key;
String *def;
};
class CLangMngr
{
class CLang
{
public:
// Construct an empty CLang object
CLang();
// Construct a CLang object initialized with a language name
CLang(const char *lang);
// Destructor
~CLang();
// Get the definition
const char *GetDef(const char *key);
// Add definitions to this language
void MergeDefinitions(CQueue <sKeyDef*> & vec);
// Reset this language
void Clear();
// compare this language to a language name
friend bool operator == (const CLang &left, const char *right)
{
return strcmp(left.m_LanguageName, right)==0 ? true : false;
}
// Get language name
const char *GetName() { return m_LanguageName; }
// Save to file
bool Save(FILE *fp, int &defOffset, uint32_t &curOffset);
bool SaveDefinitions(FILE *fp, uint32_t &curOffset);
// Load
bool Load(FILE *fp);
void SetMngr(CLangMngr *l) { m_LMan = l; }
// Get number of entries
int Entries() { return m_LookUpTable.size(); }
// Make a hash from a string; convert to lowercase first if needed
static uint32_t MakeHash(const char *src, bool makeLower = false);
protected:
// An entry in the language
class LangEntry
{
// the definition hash
uint32_t m_DefHash;
// index into the lookup table?
int key;
// the definition
String m_pDef;
// is this from the cache or not?
bool m_isCache;
public:
// Set
void SetKey(int key);
void SetDef(const char *pDef);
void SetCache(bool c);
// Get
uint32_t GetDefHash();
int GetKey();
const char *GetDef();
int GetDefLength();
bool GetCache();
// Constructors / destructors
LangEntry();
LangEntry(int key);
LangEntry(int key, const char *pDef);
LangEntry(const LangEntry &other);
LangEntry(int pKey, uint32_t defHash, const char *pDef);
// Reset
void Clear();
};
// Get (construct if needed) an entry
LangEntry * GetEntry(int key);
typedef CVector<LangEntry*> LookUpVec;
typedef LookUpVec::iterator LookUpVecIter;
char m_LanguageName[3];
// our lookup table
LookUpVec m_LookUpTable;
CLangMngr *m_LMan;
public:
LangEntry *AddEntry(int pKey, uint32_t defHash, const char *def, bool cache);
};
// Merge definitions into a language
void MergeDefinitions(const char *lang, CQueue <sKeyDef*> &tmpVec);
// strip lowercase; make lower if needed
static size_t strip(char *str, char *newstr, bool makelower=false);
typedef CVector<CLang*> LangVec;
typedef CVector<CLang*>::iterator LangVecIter;
LangVec m_Languages;
CVector<md5Pair *> FileList;
CVector<keyEntry*> KeyList;
// Get a lang object (construct if needed)
CLang * GetLang(const char *name);
CLang * GetLangR(const char *name);
// Current global client-id for functions like client_print with first parameter 0
int m_CurGlobId;
public:
// Merge a definitions file
int MergeDefinitionFile(const char *file);
// Get a definition from a lang name and a kyer
const char *GetDef(const char *langName, const char *key);
// Format a string
const char *Format(const char *src, ...);
// Format a string for an AMX plugin
char *FormatAmxString(AMX *amx, cell *params, int parm, int &len);
char *FormatString(const char *fmt, va_list &ap);
// Save
bool Save(const char *filename);
// Load
bool Load(const char *filename);
// Cache
bool LoadCache(const char *filename);
bool SaveCache(const char *filename);
// Get index
int GetKeyEntry(String &key);
int GetKeyEntry(const char *key);
int GetKeyHash(int key);
// Get key from index
const char *GetKey(int key);
// Add key
int AddKeyEntry(String &key);
// Make a hash from a string; convert to lowercase first if needed
uint32_t MakeHash(const char *src, bool makeLower);
// Get the number of languages
int GetLangsNum();
// Get the name of a language
const char *GetLangName(int langId);
// Check if a language exists
bool LangExists(const char *langName);
// When a language id in a format string in FormatAmxString is LANG_PLAYER, the glob id decides which language to take.
void SetDefLang(int id);
// Reset
void Clear();
CLangMngr();
~CLangMngr();
};
#endif //_INCLUDE_CLANG_H

View File

@ -35,76 +35,279 @@
// ***************************************************** // *****************************************************
// class CList // class CList
// ***************************************************** // *****************************************************
// Linked list
template <typename T, typename F = char* > template <typename T, typename F = char* >
class CList { class CList
public: {
class iterator;
class CListEle {
friend class CList<T,F>;
friend class iterator;
T* obj;
CListEle* next;
CListEle( T* a , CListEle* nn ) : obj(a) , next(nn) {}
public:
T& operator* () { return *obj; }
};
private: private:
CListEle *head; // One list element
int cur_size; class CElement
public: {
CList<T,F>() { head = 0; cur_size = 0; } T *m_pObject; // pointer to the object
~CList<T,F>() { clear(); } CElement *m_pNext; // pointer to the next element
void clear() { CElement *m_pPrev; // pointer to the previous element
iterator a = begin();
while( a ) a.remove();
cur_size = 0;
}
void put( T* a ) {
head = new CListEle( a , head );
++cur_size;
}
int size() {
return cur_size;
}
class iterator {
CListEle** a;
public: public:
iterator(CListEle** i=0) : a(i){} // dereference operator
T& operator*() const { return *(*a)->obj;} T& operator* ()
inline operator bool () const { return (a && *a); } {
inline iterator& operator++() { return *m_pObject;
a = &(*a)->next; }
// constructor
CElement(T *pObj)
{
m_pObject = pObj;
m_pNext = NULL;
m_pPrev = NULL;
}
// destructor
~CElement()
{
delete m_pObject;
if (m_pNext)
m_pNext->m_pPrev = m_pPrev;
if (m_pPrev)
m_pPrev->m_pNext = m_pNext;
}
// returns object pointer
T *GetObj()
{
return m_pObject;
}
// returns next element pointer
CElement *GetNext()
{
return m_pNext;
}
// sets next element
void SetNext(CElement *newNext)
{
m_pNext = newNext;
}
// returns previous element pointer
CElement *GetPrev()
{
return m_pPrev;
}
// sets previous element
void SetPrev(CElement *newPrev)
{
m_pPrev = newPrev;
}
};
// CList<T,F> class
CElement *m_pHead; // head of the linked list
CElement *m_pTail; // tail of the linked list
public:
// iterator class
class iterator
{
friend class CList<T,F>;
CList<T,F> *m_pList; // The list that created this iterator
CElement *m_CurPos; // Current position in the list
public:
iterator()
{
m_pList = NULL;
m_CurPos = NULL;
}
// constructor based on list, element
iterator(CList<T,F> *pList, CElement *startPos)
{
m_pList = pList;
m_CurPos = startPos;
}
// constructor based on other iterator
iterator(const iterator &other)
{
m_pList = other.m_pList;
m_CurPos = other.m_CurPos;
}
// dereference operator
T & operator* () const
{
return *m_CurPos->GetObj();
}
T * operator-> () const
{
return m_CurPos->GetObj();
}
// validity check operator
inline operator bool () const
{
return m_pList!=NULL && m_CurPos!=NULL && m_CurPos->GetObj()!=NULL;
}
// pre increment operator
inline iterator& operator ++ ()
{
m_CurPos = m_CurPos->GetNext();
return *this; return *this;
} }
inline iterator operator++(int) {
iterator tmp(a); // post increment operator
a = &(*a)->next; inline iterator operator++(int)
{
iterator tmp(*this);
m_CurPos = m_CurPos->next;
return tmp; return tmp;
} }
iterator& remove(){
CListEle* aa = (*a)->next; // returns iterator that points to next element
delete (*a)->obj; iterator GetNext()
delete *a; {
*a = aa; iterator tmp(*this);
return *this; return ++tmp;
} }
iterator& put( T* aa ){
*a = new CListEle( aa , *a ); iterator remove()
return *this; {
return m_pList->remove(*this);
}
iterator put(T *obj)
{
return m_pList->put(obj, *this);
} }
}; };
inline iterator begin() { return iterator(&head); }
iterator find( F a ){ CList<T,F>()
iterator cc = begin(); {
while(cc){ m_pHead = NULL;
if ( *cc == a ) m_pTail = NULL;
break;
++cc;
} }
return cc; ~CList<T,F>()
{
clear();
}
// removes the object referenced by where
// sets where to the next object
// returns an iterator pointing to the next object
iterator remove(iterator &where)
{
iterator tmp(where.GetNext());
if (where.m_CurPos == m_pHead)
m_pHead = where.m_CurPos->GetNext();
if (where.m_CurPos == m_pTail)
m_pTail = where.m_CurPos->GetPrev();
delete where.m_CurPos;
where = tmp;
return tmp;
}
// puts an element to the end of the list
// returns an iterator pointing to it
iterator put_back(T *pObj)
{
CElement *pTmp = new CElement(pObj);
if (!m_pHead)
{
m_pHead = pTmp;
m_pTail = pTmp;
}
else
{
pTmp->SetNext(NULL);
pTmp->SetPrev(m_pTail);
m_pTail->SetNext(pTmp);
m_pTail = pTmp;
}
return iterator(this, pTmp);
}
iterator put_front(T *pObj)
{
CElement *pTmp = new CElement(pObj);
if (!m_pHead)
{
m_pHead = pTmp;
m_pTail = pTmp;
}
else
{
pTmp->SetNext(m_pHead);
pTmp->SetPrev(NULL);
m_pHead->SetPrev(pTmp);
m_pHead = pTmp;
}
return iterator(this, pTmp);
}
// alias for put_back
iterator put(T *pObj)
{
return put_back(pObj);
}
// puts an element after where
// alters where to point to the new element
// returns an iterator pointing to the new element
iterator put(T *pObj, iterator &where)
{
CElement *pTmp = new CElement(pObj);
if (where.m_CurPos->GetNext())
where.m_CurPos->GetNext()->SetPrev(pTmp);
else // where = tail
m_pTail = pTmp;
pTmp->SetPrev(where.m_CurPos);
pTmp->SetNext(where.m_CurPos->GetNext());
where.m_CurPos->SetNext(pTmp);
return ++where;
}
iterator begin()
{
return iterator(this, m_pHead);
}
void clear()
{
iterator iter = begin();
while (iter) iter.remove();
}
iterator find(iterator startOn, const F &desc)
{
iterator iter = startOn;
while(iter)
{
if (*iter == desc)
break;
++iter;
}
return iter;
}
iterator find(const F &desc)
{
return find(begin(), desc);
}
int size()
{
iterator iter = begin();
int i=0;
while (iter)
{
++i;
++iter;
}
return i;
} }
}; };
#endif #endif

View File

@ -29,9 +29,7 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "amxmod.h"
#include "CLogEvent.h" #include "CLogEvent.h"
// ***************************************************** // *****************************************************
@ -52,8 +50,8 @@ int LogEventsMngr::CLogCmp::compareCondition(const char* string){
if ( logid == parent->logCounter ) if ( logid == parent->logCounter )
return result; return result;
logid = parent->logCounter; logid = parent->logCounter;
if ( in ) return result = strstr( string , text.str() ) ? 0 : 1; if ( in ) return result = strstr( string , text.c_str() ) ? 0 : 1;
return result = strcmp(string,text.str()); return result = strcmp(string,text.c_str());
} }
LogEventsMngr::CLogCmp* LogEventsMngr::registerCondition(char* filter){ LogEventsMngr::CLogCmp* LogEventsMngr::registerCondition(char* filter){
@ -67,7 +65,7 @@ LogEventsMngr::CLogCmp* LogEventsMngr::registerCondition(char* filter){
if ( pos < 0 || pos >= MAX_LOGARGS) pos = 0; if ( pos < 0 || pos >= MAX_LOGARGS) pos = 0;
CLogCmp* c = logcmplist; CLogCmp* c = logcmplist;
while( c ) { while( c ) {
if ( (c->pos==pos) && (c->in==in) && !strcmp(c->text.str(), filter)) if ( (c->pos==pos) && (c->in==in) && !strcmp(c->text.c_str(), filter))
return c; return c;
c = c->next; c = c->next;
} }
@ -175,15 +173,14 @@ void LogEventsMngr::executeLogEvents()
if (valid){ if (valid){
if ((err = amx_Exec(a->plugin->getAMX(), NULL , a->func , 0)) != AMX_ERR_NONE) if ((err = amx_Exec(a->plugin->getAMX(), NULL , a->func , 0)) != AMX_ERR_NONE)
UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", LogError(a->plugin->getAMX(), err, "");
err,a->plugin->getAMX()->curline,a->plugin->getName());
} }
#ifdef ENABLEEXEPTIONS #ifdef ENABLEEXEPTIONS
} }
catch( ... ) catch( ... )
{ {
UTIL_Log( "[AMXX] fatal error at log forward function execution"); AMXXLOG_Log( "[AMXX] fatal error at log forward function execution");
} }
#endif #endif

View File

@ -96,23 +96,22 @@ public:
LogCondEle(CLogCmp *c, LogCondEle *n): cmp(c) , next(n) { } LogCondEle(CLogCmp *c, LogCondEle *n): cmp(c) , next(n) { }
}; };
struct LogCond { struct LogCond {
LogCondEle *list;
int argnum; int argnum;
LogCondEle *list;
LogCond *next; LogCond *next;
LogCond( int a , LogCondEle* ee , LogCond* n ) : argnum(a) , list(ee), next(n) {} LogCond( int a , LogCondEle* ee , LogCond* n ) : argnum(a) , list(ee), next(n) {}
~LogCond(); ~LogCond();
}; };
CPluginMngr::CPlugin *plugin; CPluginMngr::CPlugin *plugin;
int func; int func;
LogEventsMngr* parent;
LogCond *filters; LogCond *filters;
LogEventsMngr* parent;
CLogEvent *next; CLogEvent *next;
CLogEvent(CPluginMngr::CPlugin *p,int f, LogEventsMngr* ppp) : plugin(p),func(f), filters(0),parent(ppp) ,next(0) { } CLogEvent(CPluginMngr::CPlugin *p,int f, LogEventsMngr* ppp) : plugin(p),func(f), filters(0),parent(ppp) ,next(0) { }
~CLogEvent(); ~CLogEvent();
public: public:
void registerFilter( char* filter );
inline CPluginMngr::CPlugin *getPlugin() { return plugin; } inline CPluginMngr::CPlugin *getPlugin() { return plugin; }
void registerFilter( char* filter );
inline int getFunction() { return func; } inline int getFunction() { return func; }
}; };
@ -144,8 +143,8 @@ public:
class iterator { class iterator {
LogEventsMngr* b;
CLogEvent* a; CLogEvent* a;
LogEventsMngr* b;
public: public:
inline iterator(CLogEvent*aa,LogEventsMngr* bb) : a(aa), b(bb) {} inline iterator(CLogEvent*aa,LogEventsMngr* bb) : a(aa), b(bb) {}
inline iterator& operator++() { inline iterator& operator++() {

View File

@ -29,9 +29,7 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "amxmod.h"
#include "CMenu.h" #include "CMenu.h"
// ***************************************************** // *****************************************************
@ -53,7 +51,7 @@ MenuMngr::~MenuMngr()
int MenuMngr::findMenuId(const char* name, AMX* amx) int MenuMngr::findMenuId(const char* name, AMX* amx)
{ {
for( MenuIdEle* b = headid; b ; b = b->next) { for( MenuIdEle* b = headid; b ; b = b->next) {
if ( (!b->amx || amx == b->amx) && strstr(name,b->name.str()) ) if ( (!b->amx || amx == b->amx) && strstr(name,b->name.c_str()) )
return b->id; return b->id;
} }
return 0; return 0;
@ -64,6 +62,8 @@ int MenuMngr::registerMenuId(const char* n, AMX* a )
int id = findMenuId( n, a ); int id = findMenuId( n, a );
if (id) return id; if (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;
} }

View File

@ -28,14 +28,11 @@
* you do not wish to do so, delete this exception statement from your * you do not wish to do so, delete this exception statement from your
* version. * version.
*/ */
#include "amxmodx.h"
#include <extdll.h>
#include <meta_api.h>
#include "amxmod.h"
// ***************************************************** // *****************************************************
// class CPlayer // class CPlayer
// ***************************************************** // *****************************************************
void CPlayer::Init( edict_t* e , int i ) void CPlayer::Init( edict_t* e , int i )
{ {
index = i; index = i;
@ -62,14 +59,16 @@ void CPlayer::Disconnect() {
ingame = false; ingame = false;
initialized = false; initialized = false;
authorized = false; authorized = false;
bot = 0;
} }
void CPlayer::PutInServer() { void CPlayer::PutInServer() {
playtime = gpGlobals->time; playtime = gpGlobals->time;
ingame = true; ingame = true;
} }
bool CPlayer::Connect(const char* connectname,const char* ipaddress) { bool CPlayer::Connect(const char* connectname,const char* ipaddress) {
name.set(connectname); name.assign(connectname);
ip.set(ipaddress); ip.assign(ipaddress);
time = gpGlobals->time; time = gpGlobals->time;
bot = IsBot(); bot = IsBot();
death_killer = 0; death_killer = 0;
@ -120,6 +119,7 @@ bool Grenades::find( edict_t* enemy, CPlayer** p, int& type )
Obj* b = (*a)->next; Obj* b = (*a)->next;
delete *a; delete *a;
*a = b; *a = b;
continue; continue;
} }
@ -192,7 +192,7 @@ void TeamIds::registerTeam( const char* n ,int s )
{ {
TeamEle** a = &head; TeamEle** a = &head;
while( *a ){ while( *a ){
if ( strcmp((*a)->name.str(),n) == 0 ){ if ( strcmp((*a)->name.c_str(),n) == 0 ){
if (s != -1){ if (s != -1){
(*a)->id = s; (*a)->id = s;
newTeam &= ~(1<<(*a)->tid); newTeam &= ~(1<<(*a)->tid);
@ -210,7 +210,7 @@ int TeamIds::findTeamId( const char* n )
{ {
TeamEle* a = head; TeamEle* a = head;
while( a ){ while( a ){
if ( !strcmpi(a->name.str(),n) ) if ( !strcmpi(a->name.c_str(),n) )
return a->id; return a->id;
a = a->next; a = a->next;
} }
@ -221,7 +221,7 @@ int TeamIds::findTeamIdCase( const char* n)
{ {
TeamEle* a = head; TeamEle* a = head;
while( a ){ while( a ){
if ( !strcmp(a->name.str(), n) ) if ( !strcmp(a->name.c_str(), n) )
return a->id; return a->id;
a = a->next; a = a->next;
} }

View File

@ -33,7 +33,6 @@
#define CMISC_H #define CMISC_H
#include "CList.h" #include "CList.h"
#include "string.h"
// ***************************************************** // *****************************************************
// class CCVar // class CCVar
@ -46,15 +45,15 @@ class CCVar
public: public:
CCVar( const char* pname, const char* pplugin, CCVar( const char* pname, const char* pplugin,
int pflags, float pvalue ) : name(pname) , plugin(pplugin ) { int pflags, float pvalue ) : name(pname) , plugin(pplugin ) {
cvar.name = (char*)name.str(); cvar.name = (char*)name.c_str();
cvar.flags = pflags; cvar.flags = pflags;
cvar.string = ""; cvar.string = "";
cvar.value = pvalue; cvar.value = pvalue;
} }
inline cvar_t* getCvar() { return &cvar; } inline cvar_t* getCvar() { return &cvar; }
inline const char* getPluginName() { return plugin.str(); } inline const char* getPluginName() { return plugin.c_str(); }
inline const char* getName() { return name.str(); } inline const char* getName() { return name.c_str(); }
inline bool operator == ( const char* string ) const { return (strcmp(name.str(),string)==0); } inline bool operator == ( const char* string ) { return (strcmp(name.c_str(),string)==0); }
}; };
@ -111,8 +110,7 @@ public:
bool Connect(const char* connectname,const char* ipaddress); bool Connect(const char* connectname,const char* ipaddress);
inline bool IsBot(){ inline bool IsBot(){
const char* auth= (*g_engfuncs.pfnGetPlayerAuthId)(pEdict); return ((pEdict->v.flags & FL_FAKECLIENT)?true:false);
return ( auth && !strcmp( auth , "BOT" ) );
} }
inline bool IsAlive(){ inline bool IsAlive(){
@ -151,15 +149,15 @@ public:
// class ForceObject // class ForceObject
// ***************************************************** // *****************************************************
class ForceObject { class ForceObject {
AMX* amx;
String filename; String filename;
FORCE_TYPE type; FORCE_TYPE type;
Vector mins; Vector mins;
Vector maxs; Vector maxs;
AMX* amx;
public: public:
ForceObject(const char* n, FORCE_TYPE c,Vector& mi, Vector& ma, AMX* a) : ForceObject(const char* n, FORCE_TYPE c,Vector& mi, Vector& ma, AMX* a) :
filename(n) , type(c), mins(mi), maxs(ma), amx(a) {} filename(n) , type(c), mins(mi), maxs(ma), amx(a) {}
inline const char* getFilename() { return filename.str(); } inline const char* getFilename() { return filename.c_str(); }
inline AMX* getAMX() { return amx; } inline AMX* getAMX() { return amx; }
Vector& getMin() { return mins; } Vector& getMin() { return mins; }
Vector& getMax() { return maxs; } Vector& getMax() { return maxs; }
@ -211,7 +209,7 @@ class CScript
public: public:
CScript(AMX* aa, void* cc,const char* ff):filename(ff),amx(aa),code(cc){} CScript(AMX* aa, void* cc,const char* ff):filename(ff),amx(aa),code(cc){}
inline AMX* getAMX() { return amx; } inline AMX* getAMX() { return amx; }
inline const char* getName() { return filename.str(); } inline const char* getName() { return filename.c_str(); }
inline bool operator==( void* a ) { return (amx == (AMX*)a); } inline bool operator==( void* a ) { return (amx == (AMX*)a); }
inline void* getCode() { return code; } inline void* getCode() { return code; }
}; };

View File

@ -29,23 +29,40 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "amxmod.h"
#ifndef FAR // PM: Test: FAR #ifndef FAR
#define FAR #define FAR
#endif #endif
// Old
typedef int (FAR *QUERYMOD)(module_info_s**); typedef int (FAR *QUERYMOD)(module_info_s**);
typedef int (FAR *ATTACHMOD)(pfnamx_engine_g*,pfnmodule_engine_g*); typedef int (FAR *ATTACHMOD)(pfnamx_engine_g*,pfnmodule_engine_g*);
typedef int (FAR *DETACHMOD)(void); typedef int (FAR *DETACHMOD)(void);
QUERYMOD QueryModule; // New
ATTACHMOD AttachModule; typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
DETACHMOD DetachModule; typedef int (FAR *QUERYMOD_NEW)(int * /*ifvers*/, amxx_module_info_s * /*modInfo*/);
typedef int (FAR *ATTACHMOD_NEW)(PFN_REQ_FNPTR /*reqFnptrFunc*/);
typedef int (FAR *DETACHMOD_NEW)(void);
typedef void (FAR *PLUGINSLOADED_NEW)(void);
// Old
// These functions are needed since Small Abstract Machine 2.5.0
int wamx_FindPublic(AMX *amx, char *name, int *index)
{ return amx_FindPublic(amx, name, index); }
int wamx_FindPubVar(AMX *amx, char *varname, cell *amx_addr)
{ return amx_FindPubVar(amx, varname, amx_addr); }
int wamx_GetString(char *dest, cell *source)
{ return amx_GetString(dest, source, 0); }
AMX_NATIVE_INFO *wamx_NativeInfo(char *name, AMX_NATIVE func)
{ return amx_NativeInfo(name, func); }
int wamx_SetString(cell *dest, char *source, int pack)
{ return amx_SetString(dest, source, pack, 0); }
pfnamx_engine_g engAmxFunc = { pfnamx_engine_g engAmxFunc = {
amx_Align16, amx_Align16,
@ -56,21 +73,21 @@ pfnamx_engine_g engAmxFunc = {
amx_Debug, amx_Debug,
amx_Exec, amx_Exec,
amx_Execv, amx_Execv,
amx_FindPublic, wamx_FindPublic,
amx_FindPubVar, wamx_FindPubVar,
amx_FindTagId, amx_FindTagId,
amx_Flags, amx_Flags,
amx_GetAddr, amx_GetAddr,
amx_GetPublic, amx_GetPublic,
amx_GetPubVar, amx_GetPubVar,
amx_GetString, wamx_GetString,
amx_GetTag, amx_GetTag,
amx_GetUserData, amx_GetUserData,
amx_Init, amx_Init,
amx_InitJIT, amx_InitJIT,
amx_MemInfo, amx_MemInfo,
amx_NameLength, amx_NameLength,
amx_NativeInfo, wamx_NativeInfo,
amx_NumPublics, amx_NumPublics,
amx_NumPubVars, amx_NumPubVars,
amx_NumTags, amx_NumTags,
@ -79,7 +96,7 @@ pfnamx_engine_g engAmxFunc = {
amx_Release, amx_Release,
amx_SetCallback, amx_SetCallback,
amx_SetDebugHook, amx_SetDebugHook,
amx_SetString, wamx_SetString,
amx_SetUserData, amx_SetUserData,
amx_StrLen, amx_StrLen,
}; };
@ -109,84 +126,252 @@ pfnmodule_engine_g engModuleFunc = {
// class CModule // class CModule
// ***************************************************** // *****************************************************
CModule::CModule(const char* fname) : filename(fname) CModule::CModule(const char* fname)
{ {
metamod = false; m_Filename.assign(fname);
info = 0; clear(false);
module = 0;
status = MODULE_NONE;
} }
CModule::~CModule() CModule::~CModule()
{ {
if ( module ) DLFREE(module); // old & new
natives.clear(); if ( m_Handle )
DLFREE(m_Handle);
clear();
} }
void CModule::clear(bool clearFilename)
{
// old & new
m_Metamod = false;
m_Handle = NULL;
m_Status = MODULE_NONE;
if (clearFilename)
m_Filename.assign("unknown");
// old
m_InfoOld = NULL;
// new
m_Amxx = false;
m_InfoNew.author = "unknown";
m_InfoNew.name = "unknown";
m_InfoNew.version = "unknown";
m_InfoNew.reload = 0;
m_MissingFunc = NULL;
m_Natives.clear();
}
bool CModule::attachModule() bool CModule::attachModule()
{ {
if ( status != MODULE_QUERY ) // old & new
if (m_Status != MODULE_QUERY || !m_Handle)
return false; return false;
AttachModule = (ATTACHMOD)DLPROC(module,"AMX_Attach");
if ( AttachModule ) (*AttachModule)(&engAmxFunc,&engModuleFunc); if (m_Amxx)
status = MODULE_LOADED; {
// new
ATTACHMOD_NEW AttachFunc_New = (ATTACHMOD_NEW)DLPROC(m_Handle, "AMXX_Attach");
if (!AttachFunc_New)
return false;
g_ModuleCallReason = ModuleCall_Attach;
g_CurrentlyCalledModule = this;
int retVal = (*AttachFunc_New)(Module_ReqFnptr);
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
switch (retVal)
{
case AMXX_OK:
m_Status = MODULE_LOADED;
return true; return true;
case AMXX_PARAM:
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
m_Status = MODULE_INTERROR;
return false;
case AMXX_FUNC_NOT_PRESENT:
m_Status = MODULE_FUNCNOTPRESENT;
m_MissingFunc = g_LastRequestedFunc;
return false;
default:
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an invalid code.", m_Filename.c_str(), getVersion());
m_Status = MODULE_BADLOAD;
return false;
}
}
else
{
// old
ATTACHMOD AttachFunc = (ATTACHMOD)DLPROC(m_Handle, "AMX_Attach");
if (AttachFunc)
(*AttachFunc)(&engAmxFunc,&engModuleFunc);
m_Status = MODULE_LOADED;
return true;
}
} }
bool CModule::queryModule() bool CModule::queryModule()
{ {
if ( status != MODULE_NONE ) // don't check if already quried if (m_Status != MODULE_NONE) // don't check if already queried
return false; return false;
module = DLLOAD( filename.str() ); // link dll
if ( !module ){
status = MODULE_BADLOAD;
return false;
}
int meta = (int)DLPROC(module,"Meta_Attach"); // check if also MM
if ( meta ) metamod = true;
QueryModule = (QUERYMOD)DLPROC(module,"AMX_Query"); // check what version m_Handle = DLLOAD(m_Filename.c_str()); // load file
if (QueryModule == 0) { if (!m_Handle)
status = MODULE_NOQUERY; {
m_Status = MODULE_BADLOAD;
return false; return false;
} }
(*QueryModule)( &info );
if ( info == 0 ){ // Check whether the module uses metamod (for auto attach)
status = MODULE_NOINFO; if (DLPROC(m_Handle, "Meta_Attach"))
m_Metamod = true;
// Try new interface first
QUERYMOD_NEW queryFunc_New = (QUERYMOD_NEW)DLPROC(m_Handle, "AMXX_Query");
if (queryFunc_New)
{
m_Amxx = true;
int ifVers = AMXX_INTERFACE_VERSION;
g_ModuleCallReason = ModuleCall_Query;
g_CurrentlyCalledModule = this;
int retVal = (*queryFunc_New)(&ifVers, &m_InfoNew);
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
switch (retVal)
{
case AMXX_PARAM:
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
m_Status = MODULE_INTERROR;
return false;
case AMXX_IFVERS:
if (ifVers < AMXX_INTERFACE_VERSION)
m_Status = MODULE_OLD;
else
m_Status = MODULE_NEWER;
return false;
case AMXX_OK:
break;
default:
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an invalid code.", m_Filename.c_str(), getVersion());
m_Status = MODULE_BADLOAD;
return false; return false;
} }
if ( info->ivers != AMX_INTERFACE_VERSION ) {
status = MODULE_OLD; // Check for attach
if (!DLPROC(m_Handle, "AMXX_Attach"))
{
m_Status = MODULE_NOATTACH;
return false; return false;
} }
AttachModule = (ATTACHMOD)DLPROC(module,"AMX_Attach"); // check for attach
if ( AttachModule == 0) { m_Status = MODULE_QUERY;
status = MODULE_NOATTACH;
return false;
}
info->serial = (long int)this;
status = MODULE_QUERY;
return true; return true;
}
else
{
// old interface not 64 bit compatible
#if SMALL_CELL_SIZE == 64
m_Status = MODULE_NOT64BIT;
return false;
#else
// Try old interface
QUERYMOD queryFunc_Old = (QUERYMOD)DLPROC(m_Handle,"AMX_Query"); // check what version
if (!queryFunc_Old)
{
m_Status = MODULE_NOQUERY;
return false;
}
(*queryFunc_Old)(&m_InfoOld);
if (!m_InfoOld)
{
m_Status = MODULE_NOINFO;
return false;
}
if (m_InfoOld->ivers != AMX_INTERFACE_VERSION)
{
m_Status = MODULE_OLD;
return false;
}
// Check for attach
if (!DLPROC(m_Handle, "AMX_Attach"))
{
m_Status = MODULE_NOATTACH;
return false;
}
m_InfoOld->serial = (long int)this;
m_Status = MODULE_QUERY;
return true;
#endif
}
} }
bool CModule::detachModule() bool CModule::detachModule()
{ {
if ( status != MODULE_LOADED ) if (m_Status != MODULE_LOADED)
return false; return false;
DetachModule = (DETACHMOD)DLPROC(module,"AMX_Detach");
if (DetachModule) (*DetachModule)(); if (m_Amxx)
DLFREE(module); {
module = 0; DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
natives.clear(); if (detachFunc_New)
status = MODULE_NONE; {
g_ModuleCallReason = ModuleCall_Detach;
g_CurrentlyCalledModule = this;
(*detachFunc_New)();
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
}
}
else
{
DETACHMOD detachFunc_Old = (DETACHMOD)DLPROC(m_Handle, "AMX_Detach");
if (detachFunc_Old)
(*detachFunc_Old)();
}
DLFREE(m_Handle);
clear();
return true; return true;
} }
const char* CModule::getStatus() const {
switch(status){ void CModule::CallPluginsLoaded()
{
if (m_Status != MODULE_LOADED)
return;
if (!m_Handle)
return;
PLUGINSLOADED_NEW func = (PLUGINSLOADED_NEW)DLPROC(m_Handle, "AMXX_PluginsLoaded");
if (!func)
return;
func();
}
const char* CModule::getStatus() const
{
switch(m_Status)
{
case MODULE_NONE: return "error"; case MODULE_NONE: return "error";
case MODULE_QUERY: return "pending"; case MODULE_QUERY: return "pending";
case MODULE_BADLOAD:return "bad load"; case MODULE_BADLOAD: return "bad load";
case MODULE_LOADED:return "running"; case MODULE_LOADED: return "running";
case MODULE_NOINFO:return "no info"; case MODULE_NOINFO: return "no info";
case MODULE_NOQUERY:return "no query"; case MODULE_NOQUERY: return "no query";
case MODULE_NOATTACH:return "no attach"; case MODULE_NOATTACH: return "no attach";
case MODULE_OLD:return "old"; case MODULE_OLD: return "old";
case MODULE_FUNCNOTPRESENT:
case MODULE_NEWER: return "newer";
case MODULE_INTERROR: return "internal err";
case MODULE_NOT64BIT: return "not 64bit";
default: break;
} }
return "unknown"; return "unknown";
} }

View File

@ -37,26 +37,49 @@
#define CMODULE_H #define CMODULE_H
enum MODULE_STATUS { enum MODULE_STATUS {
MODULE_NONE, MODULE_NONE, // No module loaded
MODULE_QUERY, MODULE_QUERY, // Query failed
MODULE_BADLOAD, MODULE_BADLOAD, // Bad file or the module writer messed something up ;]
MODULE_LOADED, MODULE_LOADED, // Loaded
MODULE_NOINFO, MODULE_NOINFO, // No info
MODULE_NOQUERY, MODULE_NOQUERY, // No query function present
MODULE_NOATTACH, MODULE_NOATTACH, // No attach function present
MODULE_OLD MODULE_OLD, // Old interface
MODULE_NEWER, // newer interface
MODULE_INTERROR, // Internal error
MODULE_FUNCNOTPRESENT, // Function not present
MODULE_NOT64BIT // Not 64 bit compatible
}; };
struct amxx_module_info_s
{
const char *name;
const char *author;
const char *version;
int reload; // reload on mapchange when nonzero
};
#define AMXX_OK 0 /* no error */
#define AMXX_IFVERS 1 /* interface version */
#define AMXX_PARAM 2 /* Invalid parameter */
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
#define AMXX_INTERFACE_VERSION 1
class CModule class CModule
{ {
String filename; String m_Filename; // Filename
bool metamod; bool m_Metamod; // Using metamod?
module_info_s* info; bool m_Amxx; // Using new module interface?
DLHANDLE module; module_info_s* m_InfoOld; // module info (old module interface)
MODULE_STATUS status; amxx_module_info_s m_InfoNew; // module info (new module interface)
DLHANDLE m_Handle; // handle
MODULE_STATUS m_Status; // status
const char *m_MissingFunc; // missing function; only set on MODULE_FUNCNOTPRESENT status
void clear(bool clearFilename = true);
public: public:
CModule(const char* fname); CModule(const char* fname);
~CModule(); ~CModule();
@ -65,15 +88,21 @@ public:
bool queryModule(); bool queryModule();
bool detachModule(); bool detachModule();
const char* getStatus() const; const char* getStatus() const;
inline const char* getType() const { return metamod ? "amx&mm" : "amx"; } inline const char* getType() const { return m_Amxx ? "amxx" : (m_Metamod ? "amx&mm" : "amx"); }
inline const char* getAuthor() const { return info ? info->author : "unknown"; } inline const char* getAuthor() const { return m_Amxx ? (m_InfoNew.author) : (m_InfoOld ? m_InfoOld->author : "unknown"); }
inline const char* getVersion() const { return info ? info->version : "unknown"; } inline const char* getVersion() const { return m_Amxx ? (m_InfoNew.version) : (m_InfoOld ? m_InfoOld->version : "unknown"); }
inline const char* getName() const { return info ? info->name : "unknown"; } inline const char* getName() const { return m_Amxx ? (m_InfoNew.name) : (m_InfoOld ? m_InfoOld->name : "unknown"); }
inline module_info_s* getInfo() const { return info; } inline module_info_s* getInfo() const { return m_InfoOld; } // old
inline int getStatusValue() { return status; } inline const amxx_module_info_s* getInfoNew() const { return &m_InfoNew; } // new
inline bool operator==( void* fname ) { return !strcmp( filename.str() , (char*)fname ); } inline int getStatusValue() { return m_Status; }
inline bool isReloadable() { return ( (status==MODULE_LOADED) && (info->type==RELOAD_MODULE)); } inline bool operator==( const char* fname ) { return !strcmp( m_Filename.c_str() , fname ); }
CList<AMX_NATIVE_INFO*> natives; inline bool isReloadable() { return m_Amxx ? ((m_Status == MODULE_LOADED) && (m_InfoNew.reload != 0)) : ( (m_Status==MODULE_LOADED) && (m_InfoOld->type==RELOAD_MODULE)); }
inline bool isAmxx() const { return m_Amxx; }
inline const char *getMissingFunc() const { return m_MissingFunc; }
inline const char *getFilename() { return m_Filename.c_str(); }
void CModule::CallPluginsLoaded();
CList<AMX_NATIVE_INFO*> m_Natives;
}; };

View File

@ -29,18 +29,16 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "amxmod.h"
#include "CPlugin.h" #include "CPlugin.h"
#include "CForward.h" #include "CForward.h"
#include "CFile.h" #include "CFile.h"
CPluginMngr::CPlugin* CPluginMngr::loadPlugin(const char* path, const char* name, char* error) { CPluginMngr::CPlugin* CPluginMngr::loadPlugin(const char* path, const char* name, char* error, int debug) {
CPlugin** a = &head; CPlugin** a = &head;
while( *a ) a = &(*a)->next; while( *a ) a = &(*a)->next;
*a = new CPlugin( pCounter++ ,path,name,error); *a = new CPlugin( pCounter++ ,path,name,error, debug);
return *error ? 0 : *a; return (*a);
} }
void CPluginMngr::unloadPlugin( CPlugin** a ) { void CPluginMngr::unloadPlugin( CPlugin** a ) {
@ -52,63 +50,49 @@ void CPluginMngr::unloadPlugin( CPlugin** a ) {
int CPluginMngr::loadPluginsFromFile( const char* filename ) int CPluginMngr::loadPluginsFromFile( const char* filename )
{ {
File fp( build_pathname("%s",filename) , "r" ); FILE *fp = fopen(build_pathname("%s",filename) , "rt");
if ( !fp ) if ( !fp )
{ {
UTIL_Log( "[AMXX] Plugins list not found (file \"%s\")",filename); AMXXLOG_Log( "[AMXX] Plugins list not found (file \"%s\")",filename);
return 1; return 1;
} }
// Find now folder // Find now folder
char pluginName[256], line[256], error[256]; char pluginName[256], error[256], debug[256];
const char pluginsDir[] = "addons/amxx/plugins"; // hardcoded; :TODO: make it localinfo int debugFlag = 0;
const char *pluginsDir = get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins");
String line;
while ( fp.getline(line , 255 ) ) while ( !feof(fp) )
{ {
*pluginName = 0; *pluginName = 0;
sscanf(line,"%s",pluginName); *debug = 0;
debugFlag = 0;
line.clear();
line._fread(fp);
sscanf(line.c_str(),"%s %s",pluginName, debug);
if (!isalnum(*pluginName)) continue; if (!isalnum(*pluginName)) continue;
CPlugin* plugin = loadPlugin( pluginsDir , pluginName , error ); if (isalnum(*debug) && strcmp(debug, "debug") == 0)
if ( plugin != 0 ) // load_amxscript fills it with info in case of error
{ {
AMX* amx = plugin->getAMX(); debugFlag = 1;
int iFunc; }
if(amx_FindPublic(amx, "client_command" , &iFunc) == AMX_ERR_NONE) CPlugin* plugin = loadPlugin( pluginsDir , pluginName , error, debugFlag);
g_forwards.registerForward( plugin , iFunc , FF_ClientCommand);
if(amx_FindPublic(amx, "client_connect" , &iFunc) == AMX_ERR_NONE) if (plugin->getStatusCode() == ps_bad_load)
g_forwards.registerForward( plugin , iFunc , FF_ClientConnect);
if(amx_FindPublic(amx, "client_disconnect" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_ClientDisconnect);
if(amx_FindPublic(amx, "client_infochanged" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_ClientInfoChanged);
if(amx_FindPublic(amx, "client_putinserver" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_ClientPutInServer);
if(amx_FindPublic(amx, "plugin_init" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_PluginInit);
if(amx_FindPublic(amx, "plugin_cfg" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_PluginCfg);
if(amx_FindPublic(amx, "plugin_precache" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_PluginPrecache);
if(amx_FindPublic(amx, "plugin_log" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_PluginLog);
if(amx_FindPublic(amx, "plugin_end" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_PluginEnd);
if(amx_FindPublic(amx, "inconsistent_file" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_InconsistentFile);
if(amx_FindPublic(amx, "client_authorized" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_ClientAuthorized);
}
else
{ {
UTIL_Log("[AMXX] %s (plugin \"%s\")", error, pluginName ); char errorMsg[255];
sprintf(errorMsg, "%s (plugin \"%s\")", error, pluginName);
plugin->setError(errorMsg);
AMXXLOG_Log("[AMXX] %s", plugin->getError());
} }
} }
fclose(fp);
return pCounter; return pCounter;
} }
@ -121,10 +105,6 @@ void CPluginMngr::clear() {
CPluginMngr::CPlugin* CPluginMngr::findPluginFast(AMX *amx) CPluginMngr::CPlugin* CPluginMngr::findPluginFast(AMX *amx)
{ {
return (CPlugin*)(amx->userdata[3]); return (CPlugin*)(amx->userdata[3]);
/*CPlugin*a = head;
while ( a && &a->amx != amx )
a=a->next;
return a;*/
} }
CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx) { CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx) {
@ -146,14 +126,23 @@ CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name) {
int len = strlen(name); int len = strlen(name);
if (!len) return 0; if (!len) return 0;
CPlugin*a = head; CPlugin*a = head;
while( a && strncmp(a->name.str(), name,len) ) while( a && strncmp(a->name.c_str(), name,len) )
a=a->next; a=a->next;
return a; return a;
} }
const char* CPluginMngr::CPlugin::getStatus() const { const char* CPluginMngr::CPlugin::getStatus() const {
switch(status){ switch(status){
case ps_running: return "running"; case ps_running:
{
if (getAMX()->flags & AMX_FLAG_DEBUG)
{
return "debug";
} else {
return "running";
}
break;
}
case ps_paused: return "paused"; case ps_paused: return "paused";
case ps_bad_load: return "bad load"; case ps_bad_load: return "bad load";
case ps_stopped: return "stopped"; case ps_stopped: return "stopped";
@ -162,16 +151,20 @@ const char* CPluginMngr::CPlugin::getStatus() const {
return "error"; return "error";
} }
CPluginMngr::CPlugin::CPlugin(int i, const char* p,const char* n, char* e) : name(n), title(n) { CPluginMngr::CPlugin::CPlugin(int i, const char* p,const char* n, char* e, int d) : name(n), title(n) {
const char* unk = "unknown"; const char* unk = "unknown";
title.set(unk); title.assign(unk);
author.set(unk); author.assign(unk);
version.set(unk); version.assign(unk);
char* path = build_pathname("%s/%s",p,n); char* path = build_pathname("%s/%s",p,n);
code = 0; code = 0;
int err = load_amxscript(&amx,&code,path,e ); int err = load_amxscript(&amx,&code,path,e, d);
if ( err == AMX_ERR_NONE ) status = ps_running; if ( err == AMX_ERR_NONE )
else status = ps_bad_load; {
status = ps_running;
} else {
status = ps_bad_load;
}
amx.userdata[3] = this; amx.userdata[3] = this;
paused_fun = 0; paused_fun = 0;
next = 0; next = 0;
@ -194,9 +187,50 @@ void CPluginMngr::CPlugin::unpauseFunction( int id ) {
g_commands.clearBufforedInfo(); g_commands.clearBufforedInfo();
} }
} }
void CPluginMngr::CPlugin::setStatus( int a ) { void CPluginMngr::CPlugin::setStatus( int a ) {
status = a; status = a;
g_commands.clearBufforedInfo(); // ugly way g_commands.clearBufforedInfo(); // ugly way
} }
// Pause a plugin
void CPluginMngr::CPlugin::pausePlugin()
{
if (isValid())
{
// call plugin_pause if provided
int func;
cell retval;
if (amx_FindPublic(&amx, "plugin_pause", &func) == AMX_ERR_NONE)
{
if (isExecutable(func))
{
amx_Exec(&amx, &retval, func, 0);
}
}
setStatus(ps_paused);
}
}
// Unpause a plugin
void CPluginMngr::CPlugin::unpausePlugin()
{
if (isValid())
{
// set status first so the function will be marked executable
setStatus(ps_running);
// call plugin_unpause if provided
int func;
cell retval;
if (amx_FindPublic(&amx, "plugin_unpause", &func) == AMX_ERR_NONE)
{
if (isExecutable(func))
{
amx_Exec(&amx, &retval, func, 0);
}
}
}
}

View File

@ -63,30 +63,35 @@ public:
String version; String version;
String title; String title;
String author; String author;
String errorMsg;
int paused_fun; int paused_fun;
int status; int status;
CPlugin* next; CPlugin* next;
int id; int id;
CPlugin(int i , const char* p,const char* n, char* e); CPlugin(int i , const char* p,const char* n, char* e, int d);
~CPlugin( ); ~CPlugin( );
public: public:
inline const char* getName() const { return name.str();} inline const char* getName() { return name.c_str();}
inline const char* getVersion() const { return version.str();} inline const char* getVersion() { return version.c_str();}
inline const char* getTitle() const { return title.str();} inline const char* getTitle() { return title.c_str();}
inline const char* getAuthor()const { return author.str();} inline const char* getAuthor() { return author.c_str();}
inline const char* getError() { return errorMsg.c_str();}
inline int getStatusCode() { return status; }
inline int getId() const { return id; } inline int getId() const { return id; }
inline AMX* getAMX() { return &amx; } inline AMX* getAMX() { return &amx; }
inline void setTitle( const char* n ) { title.set(n); } inline const AMX* getAMX() const { return &amx; }
inline void setAuthor( const char* n ) { author.set(n); } inline void setTitle( const char* n ) { title.assign(n); }
inline void setVersion( const char* n ) { version.set(n); } inline void setAuthor( const char* n ) { author.assign(n); }
inline void setVersion( const char* n ) { version.assign(n); }
inline void setError( const char* n ) { errorMsg.assign(n); }
inline bool isValid() const { return ((status != ps_bad_load) && (status != ps_locked)); } inline bool isValid() const { return ((status != ps_bad_load) && (status != ps_locked)); }
inline bool isPaused() const { return ( (status == ps_paused) || (status == ps_stopped)); } inline bool isPaused() const { return ( (status == ps_paused) || (status == ps_stopped)); }
inline bool isFunctionPaused( int id ) const { return (paused_fun & (1<<id)) ? true : false; } inline bool isFunctionPaused( int id ) const { return (paused_fun & (1<<id)) ? true : false; }
inline bool isExecutable(int id) const { return (isValid() && !isPaused() && !isFunctionPaused(id)); } inline bool isExecutable(int id) const { return (isValid() && !isPaused() && !isFunctionPaused(id)); }
inline void pausePlugin( ) { if ( isValid() ) setStatus(ps_paused); } void pausePlugin();
inline void unpausePlugin( ) { if ( isValid() ) setStatus(ps_running); } void unpausePlugin();
void pauseFunction( int id ); void pauseFunction( int id );
void unpauseFunction( int id ); void unpauseFunction( int id );
void setStatus( int a ); void setStatus( int a );
@ -104,7 +109,7 @@ public:
// Interface // Interface
CPlugin* loadPlugin(const char* path, const char* name, char* error); CPlugin* loadPlugin(const char* path, const char* name, char* error, int debug);
void unloadPlugin( CPlugin** a ); void unloadPlugin( CPlugin** a );
int loadPluginsFromFile( const char* filename ); int loadPluginsFromFile( const char* filename );
CPlugin* findPluginFast(AMX *amx); CPlugin* findPluginFast(AMX *amx);

126
amxmodx/CQueue.h Executable file
View File

@ -0,0 +1,126 @@
/* 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.
*/
//by David "BAILOPAN" Anderson
#ifndef _INCLUDE_CQUEUE_H
#define _INCLUDE_CQUEUE_H
template <class T>
class CQueue
{
public:
class CQueueItem
{
public:
CQueueItem(const T &i, CQueueItem *n)
{
item = i;
next = n;
}
CQueueItem *GetNext()
{
return next;
}
T & GetItem()
{
return item;
}
void SetNext(CQueueItem *n)
{
next = n;
}
private:
T item;
CQueueItem *next;
};
public:
CQueue()
{
mSize = 0;
mFirst = NULL;
mLast = NULL;
}
bool empty()
{
return ((mSize==0)?true:false);
}
void push(const T &v)
{
CQueueItem *p = new CQueueItem(v, NULL);
if (empty())
{
mFirst = p;
} else {
mLast->SetNext(p);
}
mLast = p;
mSize++;
}
void pop()
{
if (mFirst == mLast)
{
delete mFirst;
mFirst = NULL;
mLast = NULL;
} else {
CQueueItem *p = mFirst->GetNext();
delete mFirst;
mFirst = p;
}
mSize--;
}
T & front()
{
return mFirst->GetItem();
}
T & back()
{
return mLast->GetItem();
}
unsigned int size()
{
return mSize;
}
private:
CQueueItem *mFirst;
CQueueItem *mLast;
unsigned int mSize;
};
#endif //_INCLUDE_CQUEUE_H

View File

@ -29,30 +29,376 @@
* version. * version.
*/ */
#ifndef STRING_CUSTOM_H #ifndef _INCLUDE_CSTRING_H
#define STRING_CUSTOM_H #define _INCLUDE_CSTRING_H
// *****************************************************
// class String
// *****************************************************
//by David "BAILOPAN" Anderson
class String class String
{ {
char* napis;
short int len;
public: public:
String(); String()
String( const char* n ); {
~String(); v = NULL;
void set( const char* n ); mSize = 0;
inline bool empty() const { return (len == 0); } cSize = 0;
inline const char* str() const { return napis ? napis : "(null)"; } Grow(2);
inline short int size() const { return len; } assign("");
void clear(); }
~String()
{
if (v)
delete [] v;
}
String(const char *src)
{
v = NULL;
mSize = 0;
cSize = 0; assign(src);
}
String(String &src)
{
v = NULL;
mSize = 0;
cSize = 0;
assign(src.c_str());
}
const char *c_str() { return v?v:""; }
const char *c_str() const { return v?v:""; }
void append(const char *t)
{
Grow(cSize + strlen(t) + 1);
strcat(v, t);
cSize = strlen(v);
}
void append(const char c)
{
Grow(cSize + 2);
v[cSize] = c;
v[++cSize] = 0;
}
void append(String &d)
{
const char *t = d.c_str();
Grow(cSize + strlen(t));
strcat(v, t);
cSize = strlen(v);
}
void assign(const String &src)
{
assign(src.c_str());
}
void assign(const char *d)
{
if (!d)
{
Grow(1);
cSize = 0;
strcpy(v, "");
return;
}
Grow(strlen(d));
if (v)
{
strcpy(v, d);
cSize = strlen(v);
} else {
cSize = 0;
}
}
void clear()
{
if (v)
{
v[0] = 0;
cSize = 0;
}
}
int compare (const char *d)
{
if (v) {
if (d) {
return strcmp(v, d);
} else {
return strlen(v);
}
} else {
if (d) {
return strlen(d);
} else {
return 0;
}
}
}
//Added this for amxx inclusion
bool empty()
{
if (!v || !cSize)
return true;
return false;
}
int size()
{
if (!v)
return 0;
return cSize;
}
const char * _fread(FILE *fp)
{
Grow(512);
char * ret = fgets(v, 511, fp);
cSize = strlen(v);
return ret;
}
int find(const char c, int index = 0)
{
if (!v)
return npos;
if (index >= (int)cSize || index < 0)
return npos;
unsigned int i = 0;
for (i=index; i<cSize; i++)
{
if (v[i] == c)
{
return i;
}
}
return npos;
}
bool is_space(int c)
{
if (c == '\f' || c == '\n' ||
c == '\t' || c == '\r' ||
c == '\v' || c == ' ')
{
return true;
}
return false;
}
void trim()
{
if (!v)
return;
unsigned int i = 0;
unsigned int j = 0;
if (cSize == 1)
{
if (is_space(v[i]))
{
clear();
return;
}
}
unsigned char c0 = v[0];
if (is_space(c0))
{
for (i=0; i<cSize; i++)
{
if (!is_space(v[i]) || (is_space(v[i]) && ((unsigned char)i==cSize-1)))
{
erase(0, i);
break;
}
}
}
cSize = strlen(v);
if (cSize < 1)
{
return;
}
if (is_space(v[cSize-1]))
{
for (i=cSize-1; i>=0; i--)
{
if (!is_space(v[i])
|| (is_space(v[i]) && i==0))
{
erase(i+1, j);
break;
}
j++;
}
}
if (cSize == 1)
{
if (is_space(v[0]))
{
clear();
return;
}
}
}
String & erase(unsigned int start, int num = npos)
{
if (!v)
return (*this);
unsigned int i = 0;
//check for bounds
if (num == npos || start+num > cSize-num+1)
num = cSize - start;
//do the erasing
bool copyflag = false;
for (i=0; i<cSize; i++)
{
if (i>=start && i<start+num)
{
if (i+num < cSize)
{
v[i] = v[i+num];
} else {
v[i] = 0;
}
copyflag = true;
} else if (copyflag) {
if (i+num < cSize)
{
v[i] = v[i+num];
} else {
v[i] = 0;
}
}
}
cSize -= num;
v[cSize] = 0;
return (*this);
}
String substr(unsigned int index, int num = npos)
{
String ns;
if (index >= cSize || !v)
return ns;
if (num == npos)
{
num = cSize - index;
} else if (index+num >= cSize) {
num = cSize - index;
}
unsigned int i = 0, j=0;
char *s = new char[cSize+1];
for (i=index; i<index+num; i++)
{
s[j++] = v[i];
}
s[j] = 0;
ns.assign(s);
delete [] s;
return ns;
}
void toLower()
{
if (!v)
return;
unsigned int i = 0;
for (i=0; i<cSize; i++)
{
if (v[i] >= 65 && v[i] <= 90)
v[i] |= 32;
}
}
String & operator = (const String &src)
{
assign(src);
return *this;
}
String & operator = (const char *src)
{
assign(src);
return *this;
}
char operator [] (unsigned int index)
{
if (index > cSize)
{
return -1;
} else {
return v[index];
}
}
int at(int a)
{
if (a < 0 || a >= (int)cSize)
return -1;
return v[a];
}
bool at(int at, char c)
{
if (at < 0 || at >= (int)cSize)
return false;
v[at] = c;
return true;
}
private:
void Grow(unsigned int d)
{
if (d<1)
return;
if (d > mSize)
{
mSize = d + 16; // allocate a buffer
char *t = new char[d+1];
if (v) {
strcpy(t, v);
t[cSize] = 0;
delete [] v;
}
v = t;
mSize = d;
}
}
char *v;
unsigned int mSize;
unsigned int cSize;
public:
static const int npos = -1;
}; };
#endif #endif //_INCLUDE_CSTRING_H

View File

@ -29,164 +29,211 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "amxmod.h"
#include "CTask.h" #include "CTask.h"
/*********************** CTask ***********************/
int CTaskMngr::CTask::getTaskId() const
{
return m_iId;
}
CTaskMngr::CTask::CTask( CPluginMngr::CPlugin* p, int f, int flags, CPluginMngr::CPlugin *CTaskMngr::CTask::getPlugin() const
int i, float base, float exec, int parlen , {
const cell* par, int r){ return m_pPlugin;
plugin = p; }
func = f;
id = i;
next = 0;
prev = 0;
param_len = 0;
param = 0;
base_time = base;
exec_time = exec;
repeat = (flags & 1) ? r : 0;
loop = (flags & 2) ? true : false;
afterstart = (flags & 4) ? true : false;
beforeend = (flags & 8) ? true : false;
if ( parlen ) void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime)
{
m_bFree = false;
m_pPlugin = pPlugin;
m_iFunc = iFunc;
m_iId = iId;
m_fBase = fBase;
m_iRepeat = (iFlags & 1) ? iRepeat : 0;
m_bLoop = (iFlags & 2) ? true : false;
m_bAfterStart = (iFlags & 4) ? true : false;
m_bBeforeEnd = (iFlags & 8) ? true : false;
m_fNextExecTime = fCurrentTime + m_fBase;
if (iParamsLen)
{ {
param = new cell[ parlen + 1 ]; m_iParamLen = iParamsLen + 1;
m_pParams = new cell[m_iParamLen];
memcpy(m_pParams, pParams, sizeof(cell)*iParamsLen);
m_pParams[iParamsLen] = 0;
} else {
m_iParamLen = 0;
m_pParams = NULL;
}
}
if ( param ){ void CTaskMngr::CTask::clear()
param_len = parlen + 1; {
memcpy( param , par , sizeof( cell ) * parlen ); if (m_iFunc >= 0)
param[ parlen ] = 0; {
unregisterSPForward(m_iFunc);
m_iFunc = -1;
}
m_bFree = true;
if (m_pParams)
{
delete [] m_pParams;
m_pParams = NULL;
}
}
bool CTaskMngr::CTask::isFree() const
{
return m_bFree;
}
void CTaskMngr::CTask::changeBase(float fNewBase)
{
m_fBase = fNewBase;
}
void CTaskMngr::CTask::resetNextExecTime(float fCurrentTime)
{
m_fNextExecTime = fCurrentTime + m_fBase;
}
void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft)
{
bool execute=false;
if (m_bAfterStart)
{
if (fCurrentTime - fTimeLeft + 1.0f >= m_fBase)
execute = true;
}
else if (m_bBeforeEnd)
{
if (fTimeLimit != 0.0f && (fTimeLeft + fTimeLimit * 60.0f) - fCurrentTime - 1.0f <= m_fBase)
execute = true;
}
else if (m_fNextExecTime <= fCurrentTime)
execute = true;
if (execute)
{
if (m_iParamLen) // call with parameters
{
cell arr = prepareCellArray(m_pParams, m_iParamLen);
executeForwards(m_iFunc, arr, m_iId);
} else {
executeForwards(m_iFunc, m_iId);
}
if (isFree())
return;
// set new exec time OR remove the task if needed
if (m_bLoop || (--m_iRepeat > 0))
{
m_fNextExecTime += m_fBase;
}
else
{
unregisterSPForward(m_iFunc);
m_iFunc = -1;
m_bFree = true;
} }
} }
} }
CTaskMngr::CTask* CTaskMngr::getFirstValidTask(CTask* h){ CTaskMngr::CTask::CTask()
CTask* a = h; {
while( a ) { m_bFree = true;
if ( a->isRemoved() ) {
CTask* b = a->next;
unlink( a );
delete a;
a = b;
continue;
}
else if ( a->afterstart ){
if ( *m_timer - *m_timeleft + 1 < a->base_time ) {
a = a->next;
continue;
}
}
else if ( a->beforeend ){
if ( *m_timelimit == 0 ){
a = a->next;
continue;
}
if ( (*m_timeleft + *m_timelimit * 60.0) - *m_timer - 1 >
a->base_time ){
a = a->next;
continue;
}
}
else if ( a->exec_time > *m_timer ) {
a = a->next;
continue;
}
return a;
}
return 0;
} }
CTaskMngr::CTask* CTaskMngr::getNextTask(CTask* a) { CTaskMngr::CTask::~CTask()
if ( a->isRemoved() ) {
return a->next;
if ( a->loop || a->isToReply() ){
a->exec_time = *m_timer + a->base_time;
return a->next;
}
a->setToRemove();
return a->next;
}
CTaskMngr::CTaskMngr() {
head = 0;
tail = 0;
m_timer = 0;
m_timelimit = 0;
m_timeleft = 0;
}
CTaskMngr::~CTaskMngr() {
clear(); clear();
} }
void CTaskMngr::clear() { /*********************** CTaskMngr ***********************/
while ( head ) { CTaskMngr::CTaskMngr()
tail = head->next;
delete head;
head = tail;
}
}
void CTaskMngr::registerTimers( float* timer , float* timelimit, float* timeleft ) {
m_timer = timer;
m_timelimit = timelimit;
m_timeleft = timeleft;
}
void CTaskMngr::registerTask( CPluginMngr::CPlugin* plugin, int func,
int flags, int i, float base, float exec,
int parlen , const cell* par, int repeat ){
CTask* a = new CTask(plugin,func,flags,i,base,exec,parlen,par,repeat );
if ( a == 0 ) return;
if ( tail )
{
tail->next = a;
a->prev = tail;
tail = a;
}
else {
head = a;
tail = a;
}
}
CTaskMngr::CTask* CTaskMngr::findTask( int id , AMX* amx )
{ {
for (CTask* a = head; a ; a = a->next) m_pTmr_CurrentTime = NULL;
{ m_pTmr_TimeLimit = NULL;
if ( !a->isRemoved() && (a->getTaskId() == id) && (!amx || m_pTmr_TimeLeft = NULL;
(a->getPlugin()->getAMX() == amx)) )
return a;
}
return 0;
} }
void CTaskMngr::unlink(CTask* a){ void CTaskMngr::registerTimers(float *pCurrentTime, float *pTimeLimit, float *pTimeLeft)
if ( a->prev ) a->prev->next = a->next;
else head = a->next;
if ( a->next ) a->next->prev = a->prev;
else tail = a->prev;
}
int CTaskMngr::removeTasks( int id , AMX* amx )
{ {
CTask* a; m_pTmr_CurrentTime = pCurrentTime;
int i = 0; m_pTmr_TimeLimit = pTimeLimit;
m_pTmr_TimeLeft = pTimeLeft;
}
while ( (a = findTask(id, amx )) != 0 ) { void CTaskMngr::registerTask(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat)
a->setToRemove(); {
// first, search for free tasks
TaskListIter iter = m_Tasks.find(CTaskDescriptor(0, NULL, true));
if (iter)
{
// found: reuse it
iter->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
}
else
{
// not found: make a new one
CTask *pTmp = new CTask;
if (!pTmp)
return;
pTmp->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
m_Tasks.put(pTmp);
}
}
int CTaskMngr::removeTasks(int iId, AMX *pAmx)
{
CTaskDescriptor descriptor(iId, pAmx);
TaskListIter iter = m_Tasks.find(descriptor);
int i=0;
while (iter)
{
iter->clear();
++i; ++i;
iter = m_Tasks.find(++iter, descriptor);
} }
return i; return i;
} }
int CTaskMngr::changeTasks(int iId, AMX *pAmx, float fNewBase)
{
CTaskDescriptor descriptor(iId, pAmx);
TaskListIter iter = m_Tasks.find(descriptor);
int i=0;
while (iter)
{
iter->changeBase(fNewBase);
iter->resetNextExecTime(*m_pTmr_CurrentTime);
++i;
iter = m_Tasks.find(++iter, descriptor);
}
return i;
}
bool CTaskMngr::taskExists(int iId, AMX *pAmx)
{
return m_Tasks.find(CTaskDescriptor(iId, pAmx));
}
void CTaskMngr::startFrame()
{
for (TaskListIter iter = m_Tasks.begin(); iter; ++iter)
{
if (iter->isFree())
continue;
iter->executeIfRequired(*m_pTmr_CurrentTime, *m_pTmr_TimeLimit, *m_pTmr_TimeLeft);
}
}
void CTaskMngr::clear()
{
m_Tasks.clear();
}

View File

@ -32,95 +32,88 @@
#ifndef CTASK_H #ifndef CTASK_H
#define CTASK_H #define CTASK_H
// *****************************************************
// class CTaskMngr
// *****************************************************
class CTaskMngr class CTaskMngr
{ {
public: private:
/*** class CTask ***/
class iterator;
class CTask class CTask
{ {
// task settings
CPluginMngr::CPlugin *m_pPlugin;
int m_iId;
int m_iFunc;
int m_iRepeat;
bool m_bLoop;
bool m_bAfterStart;
bool m_bBeforeEnd;
float m_fBase; // for normal tasks, stores the interval, for the others, stores the amount of time before start / after end
int m_iParamLen;
cell *m_pParams;
bool m_bFree;
friend class iterator; // execution
friend class CTaskMngr; float m_fNextExecTime;
CPluginMngr::CPlugin* plugin;
int id;
int func;
int repeat;
bool loop;
bool afterstart;
bool beforeend;
float base_time;
float exec_time;
int param_len;
cell* param;
CTask* next;
CTask* prev;
inline void setToRemove() { exec_time = -1.0f; }
inline bool isToReply() { return (repeat-- > 0); }
inline bool isRemoved() { return (exec_time == -1.0f); }
CTask( CPluginMngr::CPlugin* p, int f, int flags, int i,
float base, float exec, int parlen , const cell* par, int r );
~CTask() { if ( param_len ) delete[] param; }
public: public:
void set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime);
inline int getParamLen() { return param_len; }
inline int getTaskId() { return id; }
inline int getFunction() { return func; }
cell* getParam() { return param; }
CPluginMngr::CPlugin* getPlugin() { return plugin; }
};
private:
friend class iterator;
CTask *head;
CTask *tail;
float* m_timer;
float* m_timelimit;
float* m_timeleft;
CTask* getFirstValidTask(CTask* a);
CTask* getNextTask(CTask* a);
CTask* findTask( int id , AMX* amx );
void unlink(CTask* a);
public:
CTaskMngr();
~CTaskMngr();
// Interface
void registerTimers( float* timer , float* timelimit, float* timeleft );
void registerTask( CPluginMngr::CPlugin* plugin, int func, int flags, int i, float base, float exec, int parlen , const cell* par, int repeat );
inline int taskExists( int id ,AMX* amx) { return findTask(id,amx ) ? 1 : 0; }
int removeTasks( int id , AMX* amx );
void clear(); void clear();
bool isFree() const;
class iterator { CPluginMngr::CPlugin *getPlugin() const;
CTaskMngr* b; int getTaskId() const;
CTask* a;
public: void executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft); // also removes the task if needed
iterator(CTask*aa,CTaskMngr* bb) : a(aa), b(bb) {}
iterator& operator++() { void changeBase(float fNewBase);
a = b->getNextTask( a ); void resetNextExecTime(float fCurrentTime);
a = b->getFirstValidTask( a );
return *this; bool shouldRepeat();
}
CTask& operator*() { return *a; } CTask();
operator bool ( ) const { return a ? true : false; } ~CTask();
}; };
inline iterator begin() { return iterator(getFirstValidTask(head),this); }
class CTaskDescriptor
{
public:
int m_iId;
AMX *m_pAmx;
bool m_bFree;
CTaskDescriptor(int iId, AMX *pAmx, bool bFree = false)
{
m_iId = iId;
m_pAmx = pAmx;
m_bFree = bFree;
}
friend bool operator == (const CTask &left, const CTaskDescriptor &right)
{
if (right.m_bFree)
return left.isFree();
return !left.isFree() &&
(right.m_pAmx ? left.getPlugin()->getAMX() == right.m_pAmx : true) &&
left.getTaskId() == right.m_iId;
}
};
/*** CTaskMngr priv members ***/
typedef CList<CTask, CTaskDescriptor> TaskList;
typedef TaskList::iterator TaskListIter;
TaskList m_Tasks;
float *m_pTmr_CurrentTime;
float *m_pTmr_TimeLimit;
float *m_pTmr_TimeLeft;
public:
CTaskMngr();
void registerTimers(float *pCurrentTime, float *pTimeLimit, float *pTimeLeft); // The timers will always point to the right value
void registerTask(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat);
int removeTasks(int iId, AMX *pAmx); // remove all tasks that match the id and amx
int changeTasks(int iId, AMX *pAmx, float fNewBase); // change all tasks that match the id and amx
bool taskExists(int iId, AMX *pAmx);
void startFrame();
void clear();
}; };
#endif #endif

View File

@ -29,11 +29,12 @@
* version. * version.
*/ */
#include "CVault.h"
#include "CFile.h"
#include <ctype.h> #include <ctype.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "amxmodx.h"
#include "CVault.h"
#include "CFile.h"
// ***************************************************** // *****************************************************
// class Vault // class Vault
@ -59,7 +60,7 @@ void Vault::put( const char* k, const char* v )
if ( *a ) if ( *a )
{ {
(*a)->value.set(v); (*a)->value.assign(v);
(*a)->number = atoi( v ); (*a)->number = atoi( v );
} }
else else
@ -77,7 +78,7 @@ Vault::Obj** Vault::find( const char* n )
while( *a ) while( *a )
{ {
if ( strcmp((*a)->key.str(), n) == 0 ) if ( strcmp((*a)->key.c_str(), n) == 0 )
return a; return a;
a = &(*a)->next; a = &(*a)->next;
@ -106,7 +107,7 @@ const char* Vault::get( const char* n )
if ( b == 0 ) return ""; if ( b == 0 ) return "";
return b->value.str(); return b->value.c_str();
} }
void Vault::clear() void Vault::clear()
@ -132,7 +133,7 @@ void Vault::remove( const char* n )
void Vault::setSource( const char* n ) void Vault::setSource( const char* n )
{ {
path.set(n); path.assign(n);
} }
@ -142,7 +143,7 @@ bool Vault::loadVault( )
clear(); clear();
File a( path.str() , "r" ); File a( path.c_str() , "r" );
if ( !a ) return false; if ( !a ) return false;
@ -164,7 +165,7 @@ bool Vault::saveVault( )
{ {
if ( path.empty() ) return false; if ( path.empty() ) return false;
File a( path.str() , "w" ); File a( path.c_str() , "w" );
if ( !a ) return false; if ( !a ) return false;

444
amxmodx/CVector.h Executable file
View File

@ -0,0 +1,444 @@
/* 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 __CVECTOR_H__
#define __CVECTOR_H__
#include <assert.h>
// Vector
template <class T> class CVector
{
bool Grow()
{
// automatic grow
size_t newSize = m_Size * 2;
if (newSize == 0)
newSize = 8; // a good init value
T *newData = new T[newSize];
if (!newData)
return false;
if (m_Data)
{
memcpy(newData, m_Data, m_Size * sizeof(T));
delete [] m_Data;
}
m_Data = newData;
m_Size = newSize;
return true;
}
bool GrowIfNeeded()
{
if (m_CurrentUsedSize >= m_Size)
return Grow();
else
return true;
}
bool ChangeSize(size_t size)
{
// change size
if (size == m_Size)
return true;
T *newData = new T[size];
if (!newData)
return false;
if (m_Data)
{
memcpy(newData, m_Data, (m_Size < size) ? (m_Size * sizeof(T)) : (size * sizeof(T)));
delete [] m_Data;
}
if (m_Size < size)
m_CurrentSize = size;
m_Data = newData;
m_Size = size;
return true;
}
void FreeMemIfPossible()
{
}
protected:
T *m_Data;
size_t m_Size;
size_t m_CurrentUsedSize;
size_t m_CurrentSize;
public:
class iterator
{
protected:
T *m_Ptr;
public:
// constructors / destructors
iterator()
{
m_Ptr = NULL;
}
iterator(T * ptr)
{
m_Ptr = ptr;
}
// member functions
T * base()
{
return m_Ptr;
}
const T * base() const
{
return m_Ptr;
}
// operators
T & operator*()
{
return *m_Ptr;
}
T * operator->()
{
return m_Ptr;
}
iterator & operator++() // preincrement
{
++m_Ptr;
return (*this);
}
iterator operator++(int) // postincrement
{
iterator tmp = *this;
++m_Ptr;
return tmp;
}
iterator & operator--() // predecrement
{
--m_Ptr;
return (*this);
}
iterator operator--(int) // postdecrememnt
{
iterator tmp = *this;
--m_Ptr;
return tmp;
}
bool operator==(T * right) const
{
return (m_Ptr == right);
}
bool operator==(const iterator & right) const
{
return (m_Ptr == right.m_Ptr);
}
bool operator!=(T * right) const
{
return (m_Ptr != right);
}
bool operator!=(const iterator & right) const
{
return (m_Ptr != right.m_Ptr);
}
iterator & operator+=(size_t offset)
{
m_Ptr += offset;
return (*this);
}
iterator & operator-=(size_t offset)
{
m_Ptr += offset;
return (*this);
}
iterator operator+(size_t offset) const
{
iterator tmp(*this);
tmp.m_Ptr += offset;
return tmp;
}
iterator operator-(size_t offset) const
{
iterator tmp(*this);
tmp.m_Ptr += offset;
return tmp;
}
T & operator[](size_t offset)
{
return (*(*this + offset));
}
const T & operator[](size_t offset) const
{
return (*(*this + offset));
}
bool operator<(const iterator & right) const
{
return m_Ptr < right.m_Ptr;
}
bool operator>(const iterator & right) const
{
return m_Ptr > right.m_Ptr;
}
bool operator<=(const iterator & right) const
{
return m_Ptr <= right.m_Ptr;
}
bool operator>=(const iterator & right) const
{
return m_Ptr >= right.m_Ptr;
}
size_t operator-(const iterator & right) const
{
return m_Ptr - right.m_Ptr;
}
};
// constructors / destructors
CVector<T>()
{
m_Size = 0;
m_CurrentUsedSize = 0;
m_Data = NULL;
}
CVector<T>(const CVector<T> & other)
{
// copy data
m_Data = new T [other.m_Size];
m_Size = other.m_Size;
m_CurrentUsedSize = other.m_CurrentUsedSize;
memcpy(m_Data, other.m_Data, m_CurrentUsedSize * sizeof(T));
}
~CVector<T>()
{
clear();
}
// interface
size_t size() const
{
return m_CurrentUsedSize;
}
size_t capacity() const
{
return m_Size;
}
iterator begin()
{
return iterator(m_Data);
}
iterator end()
{
return iterator(m_Data + m_CurrentUsedSize);
}
iterator iterAt(size_t pos)
{
if (pos > m_CurrentUsedSize)
assert(0);
return iterator(m_Data + pos);
}
bool reserve(size_t newSize)
{
return ChangeSize(newSize);
}
bool push_back(const T & elem)
{
++m_CurrentUsedSize;
if (!GrowIfNeeded())
{
--m_CurrentUsedSize;
return false;
}
m_Data[m_CurrentUsedSize - 1] = elem;
return true;
}
void pop_back()
{
--m_CurrentUsedSize;
if (m_CurrentUsedSize < 0)
m_CurrentUsedSize = 0;
// :TODO: free memory sometimes
}
bool resize(size_t newSize)
{
if (!ChangeSize(newSize))
return false;
FreeMemIfPossible();
return true;
}
bool empty() const
{
return (m_CurrentUsedSize == 0);
}
T & at(size_t pos)
{
if (pos > m_CurrentUsedSize)
{
assert(0);
}
return m_Data[pos];
}
const T & at(size_t pos) const
{
if (pos > m_CurrentUsedSize)
{
assert(0);
}
return m_Data[pos];
}
T & operator[](size_t pos)
{
return at(pos);
}
const T & operator[](size_t pos) const
{
return at(pos);
}
T & front()
{
if (m_CurrentUsedSize < 1)
{
assert(0);
}
return m_Data[0];
}
const T & front() const
{
if (m_CurrentUsedSize < 1)
{
assert(0);
}
return m_Data[0];
}
T & back()
{
if (m_CurrentUsedSize < 1)
{
assert(0);
}
return m_Data[m_CurrentUsedSize - 1];
}
const T & back() const
{
if (m_CurrentUsedSize < 1)
{
assert(0);
}
return m_Data[m_CurrentUsedSize - 1];
}
bool insert(iterator where, const T & value)
{
// we have to insert before
// if it is begin, don't decrement
if (where != m_Data)
--where;
// validate iter
if (where < m_Data || where >= (m_Data + m_CurrentUsedSize))
return false;
++m_CurrentUsedSize;
if (!GrowIfNeeded())
{
--m_CurrentUsedSize;
return false;
}
memmove(where.base() + 1, where.base(), m_CurrentUsedSize - (where - m_Data));
memcpy(where.base(), &value, sizeof(T));
return true;
}
void erase(iterator where)
{
// validate iter
if (where < m_Data || where >= (m_Data + m_CurrentUsedSize))
return false;
if (m_CurrentUsedSize > 1)
{
// move
memmove(where.base(), where.base() + 1, m_CurrentUsedSize - 1);
}
--m_CurrentUsedSize;
// :TODO: free memory sometimes
}
void clear()
{
m_Size = 0;
m_CurrentUsedSize = 0;
delete [] m_Data;
m_Data = NULL;
}
};
#endif // __CVECTOR_H__

2564
amxmodx/JIT/jits.asm Executable file

File diff suppressed because it is too large Load Diff

BIN
amxmodx/JIT/jits.o Executable file

Binary file not shown.

BIN
amxmodx/JIT/jits.obj Executable file

Binary file not shown.

View File

@ -1,9 +1,13 @@
MODNAME = amx_mm MODNAME = amxx_mm
SRCFILES = meta_api.cpp CFile.cpp CString.cpp CVault.cpp vault.cpp\ SRCFILES = meta_api.cpp CFile.cpp CString.cpp CVault.cpp vault.cpp\
float.cpp file.cpp modules.cpp CMisc.cpp CTask.cpp string.cpp\ float.cpp file.cpp modules.cpp CMisc.cpp CTask.cpp string.cpp\
amxmod.cpp CEvent.cpp CCmd.cpp CLogEvent.cpp srvcmd.cpp strptime.cpp\ amxmodx.cpp CEvent.cpp CCmd.cpp CLogEvent.cpp srvcmd.cpp strptime.cpp\
CForward.cpp CPlugin.cpp CModule.cpp CMenu.cpp emsg.cpp util.cpp CForward.cpp CPlugin.cpp CModule.cpp CMenu.cpp emsg.cpp util.cpp \
CSRCFILES = amx.c amxcore.c amxtime.c power.c amxcore.cpp amxtime.cpp power.cpp amxxlog.cpp fakemeta.cpp mmgr/mmgr.cpp \
amxxfile.cpp CLang.cpp md5.cpp amx.cpp
#use this for amd64, remove the above amx.cpp, and rename amx.cpp to amx.c
#CSRCFILES = amx.c minilzo/minilzo.c
CSRCFILES = minilzo/minilzo.c
EXTRA_LIBS_LINUX = EXTRA_LIBS_LINUX =
EXTRA_LIBS_WIN32 = EXTRA_LIBS_WIN32 =
@ -15,7 +19,7 @@ EXTRA_INCLUDEDIRS = -Iextra/include
EXTRA_FLAGS = -Dstrcmpi=strcasecmp EXTRA_FLAGS = -Dstrcmpi=strcasecmp
SDKTOP=../hlsdk SDKTOP=../hlsdk
METADIR=../metamodx METADIR=../metamod/metamod
SDKSRC=$(SDKTOP)/SourceCode SDKSRC=$(SDKTOP)/SourceCode
@ -43,7 +47,8 @@ else
endif endif
#use this for AMD64
#LIBFILE_LINUX = $(MODNAME)_amd64.so
LIBFILE_LINUX = $(MODNAME)_i386.so LIBFILE_LINUX = $(MODNAME)_i386.so
LIBFILE_WIN32 = $(MODNAME).dll LIBFILE_WIN32 = $(MODNAME).dll
TARGET_LINUX = $(OBJDIR_LINUX)/$(LIBFILE_LINUX) TARGET_LINUX = $(OBJDIR_LINUX)/$(LIBFILE_LINUX)
@ -60,10 +65,9 @@ OBJC_LINUX := $(CSRCFILES:%.c=$(OBJDIR_LINUX)/%.o)
OBJ_WIN32 := $(SRCFILES:%.cpp=$(OBJDIR_WIN32)/%.o) OBJ_WIN32 := $(SRCFILES:%.cpp=$(OBJDIR_WIN32)/%.o)
OBJC_WIN32 := $(CSRCFILES:%.c=$(OBJDIR_WIN32)/%.o) OBJC_WIN32 := $(CSRCFILES:%.c=$(OBJDIR_WIN32)/%.o)
#use this for amd64
CCOPT = -march=i586 -O6 -ffast-math -funroll-loops \ #CCOPT = -m64 -g -ggdb3 -DHAVE_I64 -DSMALL_CELL_SIZE=64
-fomit-frame-pointer -fexpensive-optimizations -malign-loops=2 \ CCOPT = -march=i386 -s -DNDEBUG -O2 -fomit-frame-pointer -fno-exceptions -fno-rtti -ffast math
-malign-jumps=2 -malign-functions=2 -s -DNDEBUG
INCLUDEDIRS=-I../curl/include -I$(SRCDIR) -I$(METADIR) -I$(SDKSRC)/engine -I$(SDKSRC)/common -I$(SDKSRC)/pm_shared -I$(SDKSRC)/dlls -I$(SDKSRC) $(EXTRA_INCLUDEDIRS) INCLUDEDIRS=-I../curl/include -I$(SRCDIR) -I$(METADIR) -I$(SDKSRC)/engine -I$(SDKSRC)/common -I$(SDKSRC)/pm_shared -I$(SDKSRC)/dlls -I$(SDKSRC) $(EXTRA_INCLUDEDIRS)
CFLAGS=-Wall -Wno-unknown-pragmas CFLAGS=-Wall -Wno-unknown-pragmas
@ -72,7 +76,7 @@ CFLAGS:=$(CCOPT) $(CFLAGS) $(ODEF) $(EXTRA_FLAGS)
DO_CC_LINUX=$(CC_LINUX) $(CFLAGS) -fPIC $(INCLUDEDIRS) -o $@ -c $< DO_CC_LINUX=$(CC_LINUX) $(CFLAGS) -fPIC $(INCLUDEDIRS) -o $@ -c $<
DO_CC_WIN32=$(CC_WIN32) $(CFLAGS) $(INCLUDEDIRS) -o $@ -c $< DO_CC_WIN32=$(CC_WIN32) $(CFLAGS) $(INCLUDEDIRS) -o $@ -c $<
LINK_LINUX=$(CC_LINUX) $(CFLAGS) -lstdc++ -shared -ldl -lm $(OBJ_LINUX) $(OBJC_LINUX) $(EXTRA_LIBDIRS_LINUX) $(EXTRA_LIBS_LINUX) -o $@ LINK_LINUX=$(CC_LINUX) $(CFLAGS) -shared -ldl -lm $(OBJ_LINUX) $(OBJC_LINUX) $(EXTRA_LIBDIRS_LINUX) $(EXTRA_LIBS_LINUX) -o $@
LINK_WIN32=$(LD_WINDLL) -mwindows --def $(MODNAME).def --add-stdcall-alias $(OBJ_WIN32) $(OBJC_WIN32) $(EXTRA_LIBDIRS_WIN32) $(EXTRA_LIBS_WIN32) -o $@ LINK_WIN32=$(LD_WINDLL) -mwindows --def $(MODNAME).def --add-stdcall-alias $(OBJ_WIN32) $(OBJC_WIN32) $(EXTRA_LIBDIRS_WIN32) $(EXTRA_LIBS_WIN32) -o $@
$(OBJDIR_LINUX)/%.o: $(SRCDIR)/%.c $(OBJDIR_LINUX)/%.o: $(SRCDIR)/%.c
@ -97,9 +101,11 @@ $(TARGET_WIN32): $(OBJDIR_WIN32) $(OBJ_WIN32) $(OBJC_WIN32)
$(OBJDIR_LINUX): $(OBJDIR_LINUX):
mkdir $@ mkdir $@
mkdir $@/mmgr
$(OBJDIR_WIN32): $(OBJDIR_WIN32):
mkdir $@ mkdir $@
mkdir $@/mmgr
win32: $(TARGET_WIN32) win32: $(TARGET_WIN32)
@ -114,3 +120,4 @@ clean_both:
clean_win32: clean_win32:
del /q $(OBJDIR_WIN32) del /q $(OBJDIR_WIN32)

256
amxmodx/Makefile.pl Executable file
View File

@ -0,0 +1,256 @@
#!/usr/bin/perl
#(C)2004 AMX Mod X Development Team
# by David "BAILOPAN" Anderson
# output will occur in bin.x.proc
# where x is debug or opt and proc is ix86 or amd64
# You must use this script from the amxmodx src dir
#options =
# jit - use the JIT
# debug - enable gdb debugging
# amd64 - compile for AMD64 (impiles no jit)
# proc=ix86 - assumed not amd64
# clean - clean the specifications above
# asm - for ASM implementation
# !! TODO - add memory mananger support
# lineop - for JIT only, uses slow version
$PROJECT = "amxmodx_mm";
$sdk = "../hlsdk/SourceCode";
$mm = "../metamod/metamod";
$gccf = "gcc";
$ccf = "cc";
$amd64_lstdc = "-lstdc++";
@CPP_SOURCE_FILES = ("meta_api.cpp", "CFile.cpp", "CVault.cpp", "vault.cpp", "float.cpp", "file.cpp", "modules.cpp", "CMisc.cpp", "CTask.cpp", "string.cpp", "amxmodx.cpp", "CEvent.cpp", "CCmd.cpp", "CLogEvent.cpp", "srvcmd.cpp", "strptime.cpp", "amxcore.cpp", "amxtime.cpp", "power.cpp", "amxxlog.cpp", "fakemeta.cpp", "amxxfile.cpp", "CLang.cpp", "md5.cpp", "emsg.cpp", "CForward.cpp", "CPlugin.cpp", "CModule.cpp", "CMenu.cpp", "util.cpp");
@C_SOURCE_FILES = ();
my %OPTIONS, %OPT;
$OPT{"debug"} = "-g -ggdb";
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\" -fno-exceptions -fno-rtti";
$OPTIONS{"include"} = "-I$sdk -I. -I$mm -I$sdk/engine -I$sdk/common -I$sdk/pm_shared -I$sdk/dlls";
while ($cmd = shift)
{
if ($cmd =~ /asm/)
{
if ($OPTIONS{"amd64"})
{
die "You cannot compile the ASM core with AMD64 yet.\n";
} else {
$OPTIONS{"asm"} = 1;
}
}
if ($cmd =~ /jit/)
{
if ($OPTIONS{"amd64"})
{
die "You cannot compile the JIT and AMD64 yet.\n";
} else {
$OPTIONS{"jit"} = 1;
}
} elsif ($cmd =~ /amd64/) {
if ($OPTIONS{"jit"} || $OPTIONS{"asm"})
{
die "You cannot compile the JIT or ASM and AMD64 yet.\n";
} else {
$OPTIONS{"amd64"} = 1;
}
} elsif ($cmd =~ /debug/) {
$OPTIONS{"debug"} = 1;
} elsif ($cmd =~ /proc=i(\d)86/) {
$proc = $1;
if ($OPTIONS{"amd64"})
{
die "You cannot compile for i".$proc."86 and AMD64.\n";
} else {
$OPTIONS{"proc"} = "i".$proc."86";
}
} elsif ($cmd =~ /clean/) {
$OPTIONS{"clean"} = 1;
} elsif ($cmd =~ /lineop/) {
$OPTIONS{"lineop"} = 1;
}
}
$gcc = `$gccf --version`;
if ($gcc =~ /2\.9/)
{
#if ($OPTIONS{"jit"})
#{
# push(@CPP_SOURCE_FILES, "amx.cpp");
# $OPT{"opt"} .= " -malign-loops=2 -malign-jumps=2 -malign-functions=2";
# } else {
`ln -s amx.cpp amx.c`;
push(@C_SOURCE_FILES, "amx.c");
# }
} else {
if ($OPTIONS{"amd64"})
{
`ln -s amx.cpp amx.c`;
push(@C_SOURCE_FILES, "amx.c");
} else {
push(@CPP_SOURCE_FILES, "amx.cpp");
}
$OPT{"opt"} .= " -falign-loops=2 -falign-jumps=2 -falign-functions=2";
}
if ($OPTIONS{"debug"})
{
$cflags = $OPT{"debug"};
} else {
if (!$OPTIONS{"amd64"})
{
$proc = $OPTIONS{"proc"};
if (!$proc)
{
$proc = 3;
}
$cflags = "-march=i".$proc."86 ".$OPT{"opt"};
} else {
$cflags = $OPT{"opt"};
}
}
if ($OPTIONS{"amd64"})
{
$cflags = " -m64 -DSMALL_CELL_SIZE=64 -DHAVE_I64 $cflags";
}
if ($OPTIONS{"jit"})
{
$cflags .= " -DJIT";
}
if ($OPTIONS{"asm"})
{
$cflags .= " -DASM32";
}
if ($OPTIONS{"debug"})
{
$outdir = "bin.debug";
} else {
$outdir = "bin.opt";
}
if ($OPTIONS{"amd64"})
{
$outdir .= ".amd64";
$bin = $PROJECT."_amd64.so";
} else {
$proc = $OPTIONS{"proc"};
if ($proc)
{
$outdir .= ".i".$proc."86";
$bin = $PROJECT."_i".$proc."86.so";
} else {
$outdir .= ".i386";
$bin = $PROJECT."_i386.so";
}
}
if ($OPTIONS{"clean"})
{
`rm $outdir/*.o`;
`rm $outdir/$bin`;
die("Project cleaned.\n");
}
#create the dirs
#build link list
my @LINK;
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
{
$file = $CPP_SOURCE_FILES[$i];
$file =~ s/\.cpp/\.o/;
push(@LINK, $outdir."/".$file);
}
for ($i=0; $i<=$#C_SOURCE_FILES; $i++)
{
$file = $C_SOURCE_FILES[$i];
$file =~ s/\.c/\.o/;
push(@LINK, $outdir."/".$file);
}
if ($OPTIONS{"jit"})
{
if ($OPTIONS{"lineop"}) {
push(@LINK, "JIT/jits-lineop.o");
} else {
push(@LINK, "JIT/jits.o");
}
}
if ($OPTIONS{"amd64"})
{
push(@LINK, "zlib/libz64.a");
push(@LINK, $amd64_lstdc);
} else {
push(@LINK, "zlib/libz.a");
}
if ($OPTIONS{"asm"})
{
push(@LINK, "amxexecn.o");
}
if (!(-d $outdir))
{
mkdir($outdir);
}
if (!(-d "$outdir/JIT"))
{
mkdir("$outdir/JIT");
}
$inc = $OPTIONS{"include"};
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
{
$file = $CPP_SOURCE_FILES[$i];
$ofile = $file;
$ofile =~ s/\.cpp/\.o/;
$ofile = "$outdir/$ofile";
$gcc = "$gccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
if (-e $ofile)
{
$file_time = (stat($file))[9];
$ofile_time = (stat($ofile))[9];
if ($file_time > $ofile_time)
{
`rm $ofile`;
print "$gcc\n";
`$gcc`;
}
} else {
print "$gcc\n";
`$gcc`;
}
}
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
{
$file = $C_SOURCE_FILES[$i];
$ofile = $file;
$ofile =~ s/\.c/\.o/;
$ofile = "$outdir/$ofile";
$gcc = "$ccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
if (-e $ofile)
{
$file_time = (stat($file))[9];
$ofile_time = (stat($ofile))[9];
if ($file_time > $ofile_time)
{
print "$gcc\n";
`$gcc`;
}
} else {
print "$gcc\n";
`$gcc`;
}
}
$gcc = "$gccf $cflags -shared -ldl -lm @LINK -o $outdir/$bin";
print "$gcc\n";
`$gcc`;

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/* Abstract Machine for the Small compiler /* Abstract Machine for the Small compiler
* *
* Copyright (c) ITB CompuPhase, 1997-2003 * Copyright (c) ITB CompuPhase, 1997-2004
* *
* This software is provided "as-is", without any express or implied warranty. * This software is provided "as-is", without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from * In no event will the authors be held liable for any damages arising from
@ -10,20 +10,32 @@
* including commercial applications, and to alter it and redistribute it * including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions: * freely, subject to the following restrictions:
* *
* PM: Whole file changed * 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software in
* a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/ */
#define LINUX
#if defined LINUX #if defined __linux__
#include <sclinux.h> #include <sclinux.h>
#endif #endif
#ifndef __AMX_H
#define __AMX_H #ifndef AMX_H_INCLUDED
#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L #define AMX_H_INCLUDED
#if defined __LCC__ || defined __DMC__ || defined __linux__
#include <stdint.h>
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
/* The ISO C99 defines the int16_t and int_32t types. If the compiler got /* The ISO C99 defines the int16_t and int_32t types. If the compiler got
* here, these types are probably undefined. * here, these types are probably undefined.
*/ */
#if defined __LCC__ || defined LINUX #if defined __FreeBSD__
#include <stdint.h> #include <inttypes.h>
#else #else
typedef short int int16_t; typedef short int int16_t;
typedef unsigned short int uint16_t; typedef unsigned short int uint16_t;
@ -34,16 +46,28 @@
typedef long int int32_t; typedef long int int32_t;
typedef unsigned long int uint32_t; typedef unsigned long int uint32_t;
#endif #endif
#if defined __WIN32__ || defined _WIN32 || defined WIN32
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
#define HAVE_I64
#elif defined __GNUC__
typedef long long int64_t;
typedef unsigned long long uint64_t;
#define HAVE_I64
#endif
#endif #endif
#endif #endif
#if defined __WIN32__ || defined _WIN32 || defined WIN32 || defined __MSDOS__
#if defined __WIN32__ || defined _WIN32 || defined WIN32 /* || defined __MSDOS__ */
#if !defined alloca #if !defined alloca
#define alloca(n) _alloca(n) #define alloca(n) _alloca(n)
#endif #endif
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* calling convention for native functions */ /* calling convention for native functions */
#if !defined AMX_NATIVE_CALL #if !defined AMX_NATIVE_CALL
#define AMX_NATIVE_CALL #define AMX_NATIVE_CALL
@ -61,6 +85,7 @@ extern "C" {
#if !defined AMXEXPORT #if !defined AMXEXPORT
#define AMXEXPORT #define AMXEXPORT
#endif #endif
/* File format version Required AMX version /* File format version Required AMX version
* 0 (original version) 0 * 0 (original version) 0
* 1 (opcodes JUMP.pri, SWITCH and CASETBL) 1 * 1 (opcodes JUMP.pri, SWITCH and CASETBL) 1
@ -74,42 +99,67 @@ extern "C" {
#define CUR_FILE_VERSION 7 /* current file version; also the current AMX version */ #define CUR_FILE_VERSION 7 /* current file version; also the current AMX version */
#define MIN_FILE_VERSION 6 /* lowest supported file format version for the current AMX version */ #define MIN_FILE_VERSION 6 /* lowest supported file format version for the current AMX version */
#define MIN_AMX_VERSION 7 /* minimum AMX version needed to support the current file format */ #define MIN_AMX_VERSION 7 /* minimum AMX version needed to support the current file format */
#if !defined CELL_TYPE
#define CELL_TYPE #if defined BIT16
#if defined(BIT16) #define SMALL_CELL_SIZE 16 /* for backward compatibility */
typedef uint16_t ucell; /* only for type casting */ #endif
#if !defined SMALL_CELL_SIZE
#define SMALL_CELL_SIZE 32 /* by default, use 32-bit cells */
#endif
#if SMALL_CELL_SIZE==16
typedef uint16_t ucell;
typedef int16_t cell; typedef int16_t cell;
#else #elif SMALL_CELL_SIZE==32
typedef uint32_t ucell; typedef uint32_t ucell;
typedef int32_t cell; typedef int32_t cell;
#endif #elif SMALL_CELL_SIZE==64
typedef uint64_t ucell;
typedef int64_t cell;
#else
#error Unsupported cell size (SMALL_CELL_SIZE)
#endif #endif
#if SMALL_CELL_SIZE==32
#define REAL float
#elif SMALL_CELL_SIZE==64
#define REAL double
#else
#error Unsupported cell size
#endif
#define UNPACKEDMAX ((1 << (sizeof(cell)-1)*8) - 1)
struct tagAMX; struct tagAMX;
typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, cell *params); typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, cell *params);
typedef int (AMXAPI *AMX_CALLBACK)(struct tagAMX *amx, cell index, typedef int (AMXAPI *AMX_CALLBACK)(struct tagAMX *amx, cell index,
cell *result, cell *params); cell *result, cell *params);
typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx); typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
typedef int (AMXAPI *AMX_DEBUGCALL)(struct tagAMX *amx, int mode);
#if !defined _FAR #if !defined _FAR
#define _FAR #define _FAR
#endif #endif
#if defined _MSC_VER #if defined _MSC_VER
#pragma warning(disable:4103) /* disable warning message 4103 that complains #pragma warning(disable:4103) /* disable warning message 4103 that complains
* about pragma pack in a header file */ * about pragma pack in a header file */
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */ #pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
#endif #endif
/* Some compilers do not support the #pragma align, which should be fine. Some /* Some compilers do not support the #pragma align, which should be fine. Some
* compilers give a warning on unknown #pragmas, which is not so fine... * compilers give a warning on unknown #pragmas, which is not so fine...
*/ */
#if defined SN_TARGET_PS2 || defined __GNUC__ #if defined SN_TARGET_PS2 || defined __GNUC__
#define AMX_NO_ALIGN #define AMX_NO_ALIGN
#endif #endif
#if defined __GNUC__ #if defined __GNUC__
#define PACKED __attribute__((packed)) #define PACKED __attribute__((packed))
#else #else
#define PACKED #define PACKED
#endif #endif
#if !defined AMX_NO_ALIGN #if !defined AMX_NO_ALIGN
#if defined LINUX #if defined __linux__
#pragma pack(1) /* structures must be packed (byte-aligned) */ #pragma pack(1) /* structures must be packed (byte-aligned) */
#else #else
#pragma pack(push) #pragma pack(push)
@ -119,17 +169,21 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
#endif #endif
#endif #endif
#endif #endif
typedef struct { typedef struct {
char _FAR *name PACKED; const char _FAR *name PACKED;
AMX_NATIVE func PACKED; AMX_NATIVE func PACKED;
} AMX_NATIVE_INFO PACKED; } AMX_NATIVE_INFO;
#define AMX_USERNUM 4 #define AMX_USERNUM 4
#define sEXPMAX 19 /* maximum name length for file version <= 6 */ #define sEXPMAX 19 /* maximum name length for file version <= 6 */
#define sNAMEMAX 31 /* maximum name length of symbol name */ #define sNAMEMAX 31 /* maximum name length of symbol name */
typedef struct tagAMX_FUNCSTUB { typedef struct tagAMX_FUNCSTUB {
uint32_t address PACKED; ucell address PACKED;
char name[sEXPMAX+1] PACKED; const char name[sEXPMAX+1] PACKED;
} AMX_FUNCSTUB PACKED; } AMX_FUNCSTUB;
/* The AMX structure is the internal structure for many functions. Not all /* The AMX structure is the internal structure for many functions. Not all
* fields are valid at all times; many fields are cached in local variables. * fields are valid at all times; many fields are cached in local variables.
*/ */
@ -163,13 +217,12 @@ typedef struct tagAMX {
cell alt PACKED; cell alt PACKED;
cell reset_stk PACKED; cell reset_stk PACKED;
cell reset_hea PACKED; cell reset_hea PACKED;
cell _FAR *syscall_d PACKED; /* relocated value/address for the SYSCALL.D opcode */ cell sysreq_d PACKED; /* relocated address/value for the SYSREQ.D opcode */
#if defined JIT
/* support variables for the JIT */ /* support variables for the JIT */
int reloc_size PACKED; /* required temporary buffer for relocations */ int reloc_size PACKED; /* required temporary buffer for relocations */
long code_size PACKED; /* estimated memory footprint of the native code */ long code_size PACKED; /* estimated memory footprint of the native code */
#endif } AMX;
} AMX PACKED;
/* The AMX_HEADER structure is both the memory format as the file format. The /* The AMX_HEADER structure is both the memory format as the file format. The
* structure is used internaly. * structure is used internaly.
*/ */
@ -193,6 +246,24 @@ typedef struct tagAMX_HEADER {
int32_t nametable PACKED; /* name table, file version 7 only */ int32_t nametable PACKED; /* name table, file version 7 only */
} AMX_HEADER PACKED; } AMX_HEADER PACKED;
#define AMX_MAGIC 0xf1e0 #define AMX_MAGIC 0xf1e0
//double linked list for stack
typedef struct tagAMX_TRACE
{
cell line PACKED;
cell file PACKED;
struct tagAMX_TRACE *next PACKED;
struct tagAMX_TRACE *prev PACKED;
} AMX_TRACE PACKED;
typedef struct tagAMX_DBG
{
int32_t numFiles PACKED; /* number of chars in array */
char **files PACKED; /* array of files */
AMX_TRACE *head PACKED; /* begin of link list */
AMX_TRACE *tail PACKED; /* end of link list */
} AMX_DBG PACKED;
enum { enum {
AMX_ERR_NONE, AMX_ERR_NONE,
/* reserve the first 15 error codes for exit codes of the abstract machine */ /* reserve the first 15 error codes for exit codes of the abstract machine */
@ -208,6 +279,7 @@ enum {
AMX_ERR_NATIVE, /* native function failed */ AMX_ERR_NATIVE, /* native function failed */
AMX_ERR_DIVIDE, /* divide by zero */ AMX_ERR_DIVIDE, /* divide by zero */
AMX_ERR_SLEEP, /* go into sleepmode - code can be restarted */ AMX_ERR_SLEEP, /* go into sleepmode - code can be restarted */
AMX_ERR_MEMORY = 16, /* out of memory */ AMX_ERR_MEMORY = 16, /* out of memory */
AMX_ERR_FORMAT, /* invalid file format */ AMX_ERR_FORMAT, /* invalid file format */
AMX_ERR_VERSION, /* file is for a newer version of the AMX */ AMX_ERR_VERSION, /* file is for a newer version of the AMX */
@ -220,6 +292,7 @@ enum {
AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_PARAMS, /* parameter error */
AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */
}; };
enum { enum {
DBG_INIT, /* query/initialize */ DBG_INIT, /* query/initialize */
DBG_FILE, /* file number in curfile, filename in name */ DBG_FILE, /* file number in curfile, filename in name */
@ -232,58 +305,88 @@ enum {
DBG_SRANGE, /* symbol size and dimensions (arrays); level in dbgaddr (!); length in dbgparam */ DBG_SRANGE, /* symbol size and dimensions (arrays); level in dbgaddr (!); length in dbgparam */
DBG_SYMTAG, /* tag of the most recent symbol (if non-zero), tag in dbgparam */ DBG_SYMTAG, /* tag of the most recent symbol (if non-zero), tag in dbgparam */
}; };
#define AMX_FLAG_CHAR16 0x01 /* characters are 16-bit */
/* AMX_FLAG_CHAR16 0x01 no longer used */
#define AMX_FLAG_DEBUG 0x02 /* symbolic info. available */ #define AMX_FLAG_DEBUG 0x02 /* symbolic info. available */
#define AMX_FLAG_COMPACT 0x04 /* compact encoding */ #define AMX_FLAG_COMPACT 0x04 /* compact encoding */
#define AMX_FLAG_BIGENDIAN 0x08 /* big endian encoding */ #define AMX_FLAG_BIGENDIAN 0x08 /* big endian encoding */
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking */ #define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking */
#define AMX_FLAG_LINEOPS 0x20 /* line ops are parsed by the JIT [loadtime only flag] */
#define AMX_FLAG_TRACED 0x40 /* the file has already been traced */
#define AMX_FLAG_BROWSE 0x4000 /* browsing/relocating or executing */ #define AMX_FLAG_BROWSE 0x4000 /* browsing/relocating or executing */
#define AMX_FLAG_RELOC 0x8000 /* jump/call addresses relocated */ #define AMX_FLAG_RELOC 0x8000 /* jump/call addresses relocated */
#define AMX_EXEC_MAIN -1 /* start at program entry point */ #define AMX_EXEC_MAIN -1 /* start at program entry point */
#define AMX_EXEC_CONT -2 /* continue from last address */ #define AMX_EXEC_CONT -2 /* continue from last address */
#define AMX_USERTAG(a,b,c,d) ((a) | ((b)<<8) | ((long)(c)<<16) | ((long)(d)<<24)) #define AMX_USERTAG(a,b,c,d) ((a) | ((b)<<8) | ((long)(c)<<16) | ((long)(d)<<24))
#define AMX_EXPANDMARGIN 64 #define AMX_EXPANDMARGIN 64
/* for native functions that use floating point parameters, the following /* for native functions that use floating point parameters, the following
* two macros are convenient for casting a "cell" into a "float" type _without_ * two macros are convenient for casting a "cell" into a "float" type _without_
* changing the bit pattern * changing the bit pattern
*/ */
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */ #if SMALL_CELL_SIZE==32
#define amx_ctof(c) ( * ((float*)&c) ) /* cell to float */ #define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
#define amx_StrParam(amx,param,result) { \ #define amx_ctof(c) ( * ((float*)&c) ) /* cell to float */
#elif SMALL_CELL_SIZE==64
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
#define amx_ctof(c) ( * ((double*)&c) ) /* cell to float */
#else
#error Unsupported cell size
#endif
#define amx_StrParam(amx,param,result) \
do { \
cell *amx_cstr_; int amx_length_; \ cell *amx_cstr_; int amx_length_; \
amx_GetAddr((amx), (param), &amx_cstr_); \ amx_GetAddr((amx), (param), &amx_cstr_); \
amx_StrLen(amx_cstr_, &amx_length_); \ amx_StrLen(amx_cstr_, &amx_length_); \
if (amx_length_ > 0 && \ if (amx_length_ > 0 && \
((result) = (char*)alloca(amx_length_ + 1)) != NULL) \ ((result) = (void*)alloca((amx_length_ + 1) * sizeof(*(result)))) != NULL) \
amx_GetString((result), amx_cstr_); \ amx_GetString((char*)(result), amx_cstr_, sizeof(*(result))>1); \
else (result) = NULL; \ else (result) = NULL; \
} } while (0)
uint16_t * AMXAPI amx_Align16(uint16_t *v); uint16_t * AMXAPI amx_Align16(uint16_t *v);
uint32_t * AMXAPI amx_Align32(uint32_t *v); uint32_t * AMXAPI amx_Align32(uint32_t *v);
#if defined _I64_MAX || defined HAVE_I64
uint64_t * AMXAPI amx_Align64(uint64_t *v);
#endif
#if SMALL_CELL_SIZE==32
#define amx_AlignCell amx_Align32
#elif SMALL_CELL_SIZE==64
#define amx_AlignCell amx_Align64
#else
#error Unsupported cell size
#endif
int AMXAPI amx_Allot(AMX *amx, int cells, cell *amx_addr, cell **phys_addr); int AMXAPI amx_Allot(AMX *amx, int cells, cell *amx_addr, cell **phys_addr);
int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params); int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params);
int AMXAPI amx_Cleanup(AMX *amx); int AMXAPI amx_Cleanup(AMX *amx);
int AMXAPI amx_Clone(AMX *amxClone, AMX *amxSource, void *data); int AMXAPI amx_Clone(AMX *amxClone, AMX *amxSource, void *data);
int AMXAPI amx_Debug(AMX *amx); /* default debug procedure, does nothing */ int AMXAPI amx_Debug(AMX *amx); /* default debug procedure, does nothing */
int AMXAPI amx_DebugCall(AMX *amx, int mode);
int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...); int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...);
int AMXAPI amx_Execv(AMX *amx, cell *retval, int index, int numparams, cell params[]); int AMXAPI amx_Execv(AMX *amx, cell *retval, int index, int numparams, cell params[]);
int AMXAPI amx_FindNative(AMX *amx, char *name, int *index); int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index);
int AMXAPI amx_FindPublic(AMX *amx, char *funcname, int *index); int AMXAPI amx_FindPublic(AMX *amx, const char *funcname, int *index);
int AMXAPI amx_FindPubVar(AMX *amx, char *varname, cell *amx_addr); int AMXAPI amx_FindPubVar(AMX *amx, const char *varname, cell *amx_addr);
int AMXAPI amx_FindTagId(AMX *amx, cell tag_id, char *tagname); int AMXAPI amx_FindTagId(AMX *amx, cell tag_id, char *tagname);
int AMXAPI amx_Flags(AMX *amx,uint16_t *flags); int AMXAPI amx_Flags(AMX *amx,uint16_t *flags);
int AMXAPI amx_GetAddr(AMX *amx,cell amx_addr,cell **phys_addr); int AMXAPI amx_GetAddr(AMX *amx,cell amx_addr,cell **phys_addr);
int AMXAPI amx_GetNative(AMX *amx, int index, char *funcname); int AMXAPI amx_GetNative(AMX *amx, int index, char *funcname);
int AMXAPI amx_GetPublic(AMX *amx, int index, char *funcname); int AMXAPI amx_GetPublic(AMX *amx, int index, char *funcname);
int AMXAPI amx_GetPubVar(AMX *amx, int index, char *varname, cell *amx_addr); int AMXAPI amx_GetPubVar(AMX *amx, int index, char *varname, cell *amx_addr);
int AMXAPI amx_GetString(char *dest,cell *source); int AMXAPI amx_GetString(char *dest,const cell *source, int use_wchar);
int AMXAPI amx_GetTag(AMX *amx, int index, char *tagname, cell *tag_id); int AMXAPI amx_GetTag(AMX *amx, int index, char *tagname, cell *tag_id);
int AMXAPI amx_GetUserData(AMX *amx, long tag, void **ptr); int AMXAPI amx_GetUserData(AMX *amx, long tag, void **ptr);
int AMXAPI amx_Init(AMX *amx, void *program); int AMXAPI amx_Init(AMX *amx, void *program);
int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code); int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code);
int AMXAPI amx_MemInfo(AMX *amx, long *codesize, long *datasize, long *stackheap); int AMXAPI amx_MemInfo(AMX *amx, long *codesize, long *datasize, long *stackheap);
int AMXAPI amx_NameLength(AMX *amx, int *length); int AMXAPI amx_NameLength(AMX *amx, int *length);
AMX_NATIVE_INFO * AMXAPI amx_NativeInfo(char *name,AMX_NATIVE func); AMX_NATIVE_INFO * AMXAPI amx_NativeInfo(const char *name,AMX_NATIVE func);
int AMXAPI amx_NumNatives(AMX *amx, int *number); int AMXAPI amx_NumNatives(AMX *amx, int *number);
int AMXAPI amx_NumPublics(AMX *amx, int *number); int AMXAPI amx_NumPublics(AMX *amx, int *number);
int AMXAPI amx_NumPubVars(AMX *amx, int *number); int AMXAPI amx_NumPubVars(AMX *amx, int *number);
@ -293,18 +396,24 @@ int AMXAPI amx_Register(AMX *amx, AMX_NATIVE_INFO *nativelist, int number);
int AMXAPI amx_Release(AMX *amx, cell amx_addr); int AMXAPI amx_Release(AMX *amx, cell amx_addr);
int AMXAPI amx_SetCallback(AMX *amx, AMX_CALLBACK callback); int AMXAPI amx_SetCallback(AMX *amx, AMX_CALLBACK callback);
int AMXAPI amx_SetDebugHook(AMX *amx, AMX_DEBUG debug); int AMXAPI amx_SetDebugHook(AMX *amx, AMX_DEBUG debug);
int AMXAPI amx_SetString(cell *dest, char *source, int pack); int AMXAPI amx_SetString(cell *dest, const char *source, int pack, int use_wchar);
int AMXAPI amx_SetUserData(AMX *amx, long tag, void *ptr); int AMXAPI amx_SetUserData(AMX *amx, long tag, void *ptr);
char * AMXAPI amx_StrError(int errnum);
int AMXAPI amx_StrLen(cell *cstring, int *length); int AMXAPI amx_StrLen(cell *cstring, int *length);
int AMXAPI amx_UTF8Get(const char *string, const char **endptr, cell *value);
int AMXAPI amx_UTF8Put(char *string, char **endptr, int maxchars, cell value);
int AMXAPI amx_UTF8Check(const char *string);
void amx_NullNativeTable(AMX *amx);
#if !defined AMX_NO_ALIGN #if !defined AMX_NO_ALIGN
#if defined LINUX #if defined __linux__
#pragma pack() /* reset default packing */ #pragma pack() /* reset default packing */
#else #else
#pragma pack(pop) /* reset previous packing */ #pragma pack(pop) /* reset previous packing */
#endif #endif
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* __AMX_H */
#endif /* AMX_H_INCLUDED */

View File

@ -1,24 +1,69 @@
/* Core module for the Small AMX /* Core module for the Small AMX
* *
* Copyright (c) ITB CompuPhase, 1997-2002 * Copyright (c) ITB CompuPhase, 1997-2004
* This file may be freely used. No warranties of any kind. *
* This software is provided "as-is", without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from
* the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software in
* a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
* *
* Version: $Id$ * Version: $Id$
*/ */
#if defined _UNICODE || defined __UNICODE__ || defined UNICODE
# if !defined UNICODE /* for Windows */
# define UNICODE
# endif
# if !defined _UNICODE /* for C library */
# define _UNICODE
# endif
#endif
#include <ctype.h> #include <ctype.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#include <assert.h> #include <assert.h>
// this file does not include amxmodx.h, so we have to include the memory manager here
#ifdef MEMORY_TEST
#include "mmgr/mmgr.h"
#endif // MEMORY_TEST
#include "amx.h" #include "amx.h"
#define NOPROPLIST #if defined __WIN32__ || defined _WIN32 || defined WIN32 || defined _Windows
#include <windows.h>
#endif
/* A few compilers do not provide the ANSI C standard "time" functions */ /* A few compilers do not provide the ANSI C standard "time" functions */
#if !defined SN_TARGET_PS2 && !defined _WIN32_WCE #if !defined SN_TARGET_PS2 && !defined _WIN32_WCE
#include <time.h> #include <time.h>
#endif #endif
#if defined _UNICODE
# include <tchar.h>
#elif !defined __T
typedef char TCHAR;
# define __T(string) string
# define _tcschr strchr
# define _tcscpy strcpy
# define _tcsdup strdup
# define _tcslen strlen
# define _stprintf sprintf
#endif
#define CHARBITS (8*sizeof(char)) #define CHARBITS (8*sizeof(char))
typedef unsigned char uchar; typedef unsigned char uchar;
@ -28,6 +73,7 @@ typedef struct _property_list {
cell id; cell id;
char *name; char *name;
cell value; cell value;
//??? safe AMX (owner of the property)
} proplist; } proplist;
static proplist proproot = { NULL }; static proplist proproot = { NULL };
@ -106,7 +152,7 @@ static cell AMX_NATIVE_CALL numargs(AMX *amx, cell *params)
cell bytes; cell bytes;
hdr=(AMX_HEADER *)amx->base; hdr=(AMX_HEADER *)amx->base;
data=amx->base+(int)hdr->dat; data=amx->data ? amx->data : amx->base+(int)hdr->dat;
/* the number of bytes is on the stack, at "frm + 2*cell" */ /* the number of bytes is on the stack, at "frm + 2*cell" */
bytes= * (cell *)(data+(int)amx->frm+2*sizeof(cell)); bytes= * (cell *)(data+(int)amx->frm+2*sizeof(cell));
/* the number of arguments is the number of bytes divided /* the number of arguments is the number of bytes divided
@ -121,7 +167,7 @@ static cell AMX_NATIVE_CALL getarg(AMX *amx, cell *params)
cell value; cell value;
hdr=(AMX_HEADER *)amx->base; hdr=(AMX_HEADER *)amx->base;
data=amx->base+(int)hdr->dat; data=amx->data ? amx->data : amx->base+(int)hdr->dat;
/* get the base value */ /* get the base value */
value= * (cell *)(data+(int)amx->frm+((int)params[1]+3)*sizeof(cell)); value= * (cell *)(data+(int)amx->frm+((int)params[1]+3)*sizeof(cell));
/* adjust the address in "value" in case of an array access */ /* adjust the address in "value" in case of an array access */
@ -138,13 +184,13 @@ static cell AMX_NATIVE_CALL setarg(AMX *amx, cell *params)
cell value; cell value;
hdr=(AMX_HEADER *)amx->base; hdr=(AMX_HEADER *)amx->base;
data=amx->base+(int)hdr->dat; data=amx->data ? amx->data : amx->base+(int)hdr->dat;
/* get the base value */ /* get the base value */
value= * (cell *)(data+(int)amx->frm+((int)params[1]+3)*sizeof(cell)); value= * (cell *)(data+(int)amx->frm+((int)params[1]+3)*sizeof(cell));
/* adjust the address in "value" in case of an array access */ /* adjust the address in "value" in case of an array access */
value+=params[2]*sizeof(cell); value+=params[2]*sizeof(cell);
/* verify the address */ /* verify the address */
if (value<0 || value>=amx->hea && value<amx->stk) if (value<0 || (value>=amx->hea && value<amx->stk))
return 0; return 0;
/* set the value indirectly */ /* set the value indirectly */
* (cell *)(data+(int)value) = params[3]; * (cell *)(data+(int)value) = params[3];
@ -174,7 +220,7 @@ static cell AMX_NATIVE_CALL funcidx(AMX *amx,cell *params)
return 0; return 0;
} /* if */ } /* if */
amx_GetString(name,cstr); amx_GetString(name,cstr,0);
err=amx_FindPublic(amx,name,&index); err=amx_FindPublic(amx,name,&index);
if (err!=AMX_ERR_NONE) if (err!=AMX_ERR_NONE)
index=-1; /* this is not considered a fatal error */ index=-1; /* this is not considered a fatal error */
@ -186,7 +232,7 @@ int amx_StrPack(cell *dest,cell *source)
int len; int len;
amx_StrLen(source,&len); amx_StrLen(source,&len);
if ((ucell)*source>UCHAR_MAX) { if ((ucell)*source>UNPACKEDMAX) {
/* source string is already packed */ /* source string is already packed */
while (len >= 0) { while (len >= 0) {
*dest++ = *source++; *dest++ = *source++;
@ -214,7 +260,7 @@ int amx_StrPack(cell *dest,cell *source)
int amx_StrUnpack(cell *dest,cell *source) int amx_StrUnpack(cell *dest,cell *source)
{ {
if ((ucell)*source>UCHAR_MAX) { if ((ucell)*source>UNPACKEDMAX) {
/* unpack string, from top down (so string can be unpacked in place) */ /* unpack string, from top down (so string can be unpacked in place) */
cell c; cell c;
int i,len; int i,len;
@ -256,14 +302,15 @@ static cell AMX_NATIVE_CALL core_strlen(AMX *amx,cell *params)
static cell AMX_NATIVE_CALL strpack(AMX *amx,cell *params) static cell AMX_NATIVE_CALL strpack(AMX *amx,cell *params)
{ {
cell *cdest,*csrc; cell *cdest,*csrc;
int len,needed,lastaddr,err; int len,needed,err;
size_t lastaddr;
/* calculate number of cells needed for (packed) destination */ /* calculate number of cells needed for (packed) destination */
amx_GetAddr(amx,params[2],&csrc); amx_GetAddr(amx,params[2],&csrc);
amx_StrLen(csrc,&len); amx_StrLen(csrc,&len);
needed=(len+sizeof(cell))/sizeof(cell); /* # of cells needed */ needed=(len+sizeof(cell))/sizeof(cell); /* # of cells needed */
assert(needed>0); assert(needed>0);
lastaddr=params[1]+sizeof(cell)*needed-1; lastaddr=(size_t)(params[1]+sizeof(cell)*needed-1);
if (verify_addr(amx,(cell)lastaddr)!=AMX_ERR_NONE) if (verify_addr(amx,(cell)lastaddr)!=AMX_ERR_NONE)
return 0; return 0;
@ -278,13 +325,14 @@ static cell AMX_NATIVE_CALL strpack(AMX *amx,cell *params)
static cell AMX_NATIVE_CALL strunpack(AMX *amx,cell *params) static cell AMX_NATIVE_CALL strunpack(AMX *amx,cell *params)
{ {
cell *cdest,*csrc; cell *cdest,*csrc;
int len,err,lastaddr; int len,err;
size_t lastaddr;
/* calculate number of cells needed for (packed) destination */ /* calculate number of cells needed for (packed) destination */
amx_GetAddr(amx,params[2],&csrc); amx_GetAddr(amx,params[2],&csrc);
amx_StrLen(csrc,&len); amx_StrLen(csrc,&len);
assert(len>=0); assert(len>=0);
lastaddr=params[1]+sizeof(cell)*(len+1)-1; lastaddr=(size_t)(params[1]+sizeof(cell)*(len+1)-1);
if (verify_addr(amx,(cell)lastaddr)!=AMX_ERR_NONE) if (verify_addr(amx,(cell)lastaddr)!=AMX_ERR_NONE)
return 0; return 0;
@ -303,27 +351,46 @@ static cell AMX_NATIVE_CALL swapchars(AMX *amx,cell *params)
{ {
union { union {
cell c; cell c;
#if defined BIT16 #if SMALL_CELL_SIZE==16
uchar b[2]; uchar b[2];
#else #elif SMALL_CELL_SIZE==32
uchar b[4]; uchar b[4];
#elif SMALL_CELL_SIZE==64
uchar b[8];
#else
#error Unsupported cell size
#endif #endif
} value; } value;
uchar t; uchar t;
assert((size_t)params[0]==sizeof(cell)); assert((size_t)params[0]==sizeof(cell));
value.c = params[1]; value.c = params[1];
#if defined BIT16 #if SMALL_CELL_SIZE==16
t = value.b[0]; t = value.b[0];
value.b[0] = value.b[1]; value.b[0] = value.b[1];
value.b[1] = t; value.b[1] = t;
#else #elif SMALL_CELL_SIZE==32
t = value.b[0]; t = value.b[0];
value.b[0] = value.b[3]; value.b[0] = value.b[3];
value.b[3] = t; value.b[3] = t;
t = value.b[1]; t = value.b[1];
value.b[1] = value.b[2]; value.b[1] = value.b[2];
value.b[2] = t; value.b[2] = t;
#elif SMALL_CELL_SIZE==64
t = value.b[0];
value.b[0] = value.b[7];
value.b[7] = t;
t = value.b[1];
value.b[1] = value.b[6];
value.b[6] = t;
t = value.b[2];
value.b[2] = value.b[5];
value.b[5] = t;
t = value.b[3];
value.b[3] = value.b[4];
value.b[4] = t;
#else
#error Unsupported cell size
#endif #endif
return value.c; return value.c;
} }
@ -333,8 +400,13 @@ static cell AMX_NATIVE_CALL swapchars(AMX *amx,cell *params)
#endif #endif
static cell AMX_NATIVE_CALL core_tolower(AMX *amx,cell *params) static cell AMX_NATIVE_CALL core_tolower(AMX *amx,cell *params)
{ {
assert((size_t)params[0]==sizeof(cell)); #if defined __WIN32__ || defined _WIN32 || defined WIN32
return (cell)CharLower((LPTSTR)params[1]);
#elif defined _Windows
return (cell)AnsiLower((LPSTR)params[1]);
#else
return tolower((int)params[1]); return tolower((int)params[1]);
#endif
} }
#if defined __BORLANDC__ || defined __WATCOMC__ #if defined __BORLANDC__ || defined __WATCOMC__
@ -342,8 +414,13 @@ static cell AMX_NATIVE_CALL core_tolower(AMX *amx,cell *params)
#endif #endif
static cell AMX_NATIVE_CALL core_toupper(AMX *amx,cell *params) static cell AMX_NATIVE_CALL core_toupper(AMX *amx,cell *params)
{ {
assert((size_t)params[0]==sizeof(cell)); #if defined __WIN32__ || defined _WIN32 || defined WIN32
return (cell)CharUpper((LPTSTR)params[1]);
#elif defined _Windows
return (cell)AnsiUpper((LPSTR)params[1]);
#else
return toupper((int)params[1]); return toupper((int)params[1]);
#endif
} }
#if defined __BORLANDC__ || defined __WATCOMC__ #if defined __BORLANDC__ || defined __WATCOMC__
@ -382,7 +459,7 @@ static char *MakePackedString(cell *cptr)
amx_StrLen(cptr,&len); amx_StrLen(cptr,&len);
dest=(char *)malloc(len+sizeof(cell)); dest=(char *)malloc(len+sizeof(cell));
amx_GetString(dest,cptr); amx_GetString(dest,cptr,0);
return dest; return dest;
} }
@ -403,7 +480,7 @@ static cell AMX_NATIVE_CALL getproperty(AMX *amx,cell *params)
return 0; return 0;
} /* if */ } /* if */
amx_GetAddr(amx,params[4],&cstr); amx_GetAddr(amx,params[4],&cstr);
amx_SetString(cstr,item->name,1); amx_SetString(cstr,item->name,1,0);
} /* if */ } /* if */
free(name); free(name);
return (item!=NULL) ? item->value : 0; return (item!=NULL) ? item->value : 0;
@ -503,22 +580,6 @@ static cell AMX_NATIVE_CALL core_random(AMX *amx,cell *params)
return (cell)result; return (cell)result;
} }
#if 0
void core_Init(void)
{
/* reduced to a do-nothing routine */
}
void core_Exit(void)
{
#if !defined NOPROPLIST
while (proproot.next!=NULL)
list_delete(&proproot,proproot.next);
#endif
}
#endif
AMX_NATIVE_INFO core_Natives[] = { AMX_NATIVE_INFO core_Natives[] = {
{ "numargs", numargs }, { "numargs", numargs },
@ -545,4 +606,20 @@ AMX_NATIVE_INFO core_Natives[] = {
{ NULL, NULL } /* terminator */ { NULL, NULL } /* terminator */
}; };
int AMXEXPORT amx_CoreInit(AMX *amx)
{
return amx_Register(amx, core_Natives, -1);
}
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
int AMXEXPORT amx_CoreCleanup(AMX *amx)
{
#if !defined NOPROPLIST
//??? delete only the properties owned by the AMX
while (proproot.next!=NULL)
list_delete(&proproot,proproot.next);
#endif
return AMX_ERR_NONE;
}

2110
amxmodx/amxexecn.asm Executable file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -29,12 +29,24 @@
* version. * version.
*/ */
#ifndef AMXMOD_H #ifndef AMXMODX_H
#define AMXMOD_H #define AMXMODX_H
#include "string.h"
#include <extdll.h>
#include <meta_api.h>
#ifdef MEMORY_TEST
#include "mmgr/mmgr.h"
#endif
#include "md5.h"
#include "CVector.h"
#include "CList.h"
#include "CQueue.h"
#include "modules.h" #include "modules.h"
#include "CString.h" #include "CString.h"
#include "CList.h"
#include "CPlugin.h" #include "CPlugin.h"
#include "CMisc.h" #include "CMisc.h"
#include "CVault.h" #include "CVault.h"
@ -45,18 +57,16 @@
#include "CCmd.h" #include "CCmd.h"
#include "CMenu.h" #include "CMenu.h"
#include "CEvent.h" #include "CEvent.h"
#include "CLang.h"
#include "fakemeta.h"
#include "amxxlog.h"
#define AMX_VERSION "0.1" #define AMXXLOG_Log g_log.Log
#define AMX_VERSION "0.2"
#ifdef __cplusplus extern AMX_NATIVE_INFO core_Natives[];
extern "C" { extern AMX_NATIVE_INFO time_Natives[];
#endif extern AMX_NATIVE_INFO power_Natives[];
extern AMX_NATIVE_INFO core_Natives[];
extern AMX_NATIVE_INFO time_Natives[];
extern AMX_NATIVE_INFO power_Natives[];
#ifdef __cplusplus
}
#endif
extern AMX_NATIVE_INFO amxmod_Natives[]; extern AMX_NATIVE_INFO amxmod_Natives[];
extern AMX_NATIVE_INFO file_Natives[]; extern AMX_NATIVE_INFO file_Natives[];
extern AMX_NATIVE_INFO float_Natives[]; extern AMX_NATIVE_INFO float_Natives[];
@ -65,13 +75,13 @@ extern AMX_NATIVE_INFO vault_Natives[];
#ifndef __linux__ #ifndef __linux__
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path); #define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
#define DLPROC(m,func) GetProcAddress(m,func); #define DLPROC(m,func) GetProcAddress(m,func)
#define DLFREE(m) FreeLibrary(m); #define DLFREE(m) FreeLibrary(m)
#else #else
#define DLLOAD(path) (DLHANDLE)dlopen(path, RTLD_NOW); #define DLLOAD(path) (DLHANDLE)dlopen(path, RTLD_NOW)
#define DLPROC(m,func) dlsym(m,func); #define DLPROC(m,func) dlsym(m,func)
#define DLFREE(m) dlclose(m); #define DLFREE(m) dlclose(m)
#endif #endif
#ifndef __linux__ #ifndef __linux__
@ -100,8 +110,7 @@ void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pM
void UTIL_IntToString(int value, char *output); void UTIL_IntToString(int value, char *output);
void UTIL_ShowMOTD( edict_t *client , char *motd, int mlen, const char *name); void UTIL_ShowMOTD( edict_t *client , char *motd, int mlen, const char *name);
void UTIL_ShowMenu( edict_t* pEntity, int slots, int time, char *menu, int mlen ); void UTIL_ShowMenu( edict_t* pEntity, int slots, int time, char *menu, int mlen );
void UTIL_MakeNewLogFile();
void UTIL_Log(const char *fmt, ...);
#define GET_PLAYER_POINTER(e) (&g_players[ENTINDEX(e)]) #define GET_PLAYER_POINTER(e) (&g_players[ENTINDEX(e)])
//#define GET_PLAYER_POINTER(e) (&g_players[(((int)e-g_edict_point)/sizeof(edict_t ))]) //#define GET_PLAYER_POINTER(e) (&g_players[(((int)e-g_edict_point)/sizeof(edict_t ))])
@ -121,7 +130,7 @@ struct fakecmd_t {
bool fake; bool fake;
}; };
extern CLog g_log;
extern CPluginMngr g_plugins; extern CPluginMngr g_plugins;
extern CTaskMngr g_tasksMngr; extern CTaskMngr g_tasksMngr;
extern CPlayer g_players[33]; extern CPlayer g_players[33];
@ -131,12 +140,13 @@ extern CList<CCVar> g_cvars;
extern CList<ForceObject> g_forcemodels; extern CList<ForceObject> g_forcemodels;
extern CList<ForceObject> g_forcesounds; extern CList<ForceObject> g_forcesounds;
extern CList<ForceObject> g_forcegeneric; extern CList<ForceObject> g_forcegeneric;
extern CList<CModule> g_modules; extern CList<CModule,const char *> g_modules;
extern CList<CPlayer*> g_auth; 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 MenuMngr g_menucmds;
extern CLangMngr g_langMngr;
extern String g_log_dir; extern String g_log_dir;
extern String g_mod_name; extern String g_mod_name;
extern TeamIds g_teamsIds; extern TeamIds g_teamsIds;
@ -147,9 +157,7 @@ extern XVars g_xvars;
extern bool g_bmod_cstrike; extern bool g_bmod_cstrike;
extern bool g_bmod_dod; extern bool g_bmod_dod;
extern bool g_dontprecache; extern bool g_dontprecache;
extern bool g_initialized;
extern int g_srvindex; extern int g_srvindex;
extern cvar_t* amx_version;
extern cvar_t* amxmodx_version; extern cvar_t* amxmodx_version;
extern cvar_t* hostname; extern cvar_t* hostname;
extern cvar_t* mp_timelimit; extern cvar_t* mp_timelimit;
@ -210,11 +218,21 @@ const char* stristr(const char* a,const char* b);
char *strptime(const char *buf, const char *fmt, struct tm *tm, short addthem); char *strptime(const char *buf, const char *fmt, struct tm *tm, short addthem);
int loadModules(const char* filename); int loadModules(const char* filename);
void dettachModules(); void detachModules();
void dettachReloadModules(); void detachReloadModules();
void attachModules(); void attachModules();
void attachMetaModModules( const char* filename ); void attachMetaModModules(PLUG_LOADTIME now, const char* filename);
void dettachMetaModModules( const char* filename );
// Count modules
enum CountModulesMode
{
CountModules_Running = 0,
CountModules_All,
CountModules_Stopped
};
int countModules(CountModulesMode mode);
void modules_callPluginsLoaded();
int add_amxnatives(module_info_s* info,AMX_NATIVE_INFO*natives); int add_amxnatives(module_info_s* info,AMX_NATIVE_INFO*natives);
cell* get_amxaddr(AMX *amx,cell amx_addr); cell* get_amxaddr(AMX *amx,cell amx_addr);
@ -224,7 +242,7 @@ AMX* get_amxscript(int, void**,const char**);
const char* get_amxscriptname(AMX* amx); const char* get_amxscriptname(AMX* amx);
char* get_amxstring(AMX *amx,cell amx_addr,int id,int& len); char* get_amxstring(AMX *amx,cell amx_addr,int id,int& len);
int amxstring_len(cell* cstr); int amxstring_len(cell* cstr);
int load_amxscript(AMX* amx, void** program, const char* path, char error[64]); int load_amxscript(AMX* amx, void** program, const char* path, char error[64], int debug);
int set_amxnatives(AMX* amx,char error[64]); int set_amxnatives(AMX* amx,char error[64]);
int set_amxstring(AMX *amx,cell amx_addr,const char *source,int max); int set_amxstring(AMX *amx,cell amx_addr,const char *source,int max);
int unload_amxscript(AMX* amx,void** program); int unload_amxscript(AMX* amx,void** program);
@ -234,7 +252,41 @@ void print_srvconsole( char *fmt, ... );
void report_error( int code, char* fmt, ... ); void report_error( int code, char* fmt, ... );
void* alloc_amxmemory(void**, int size); void* alloc_amxmemory(void**, int size);
void free_amxmemory(void **ptr); void free_amxmemory(void **ptr);
// get_localinfo
const char* get_localinfo( const char* name , const char* def );
cell AMX_NATIVE_CALL require_module(AMX *amx, cell *params);
void LogError(AMX *amx, int err, const char *fmt, ...);
enum ModuleCallReason
{
ModuleCall_NotCalled = 0, // nothing
ModuleCall_Query, // in Query func
ModuleCall_Attach, // in Attach func
ModuleCall_Detach, // in Detach func
};
#endif // AMXMOD_H extern ModuleCallReason g_ModuleCallReason; // modules.cpp
extern CModule *g_CurrentlyCalledModule; // modules.cpp
extern const char *g_LastRequestedFunc; // modules.cpp
extern CQueue<String> CurModuleList;
void *Module_ReqFnptr(const char *funcName); // modules.cpp
// standard forwards
// defined in meta_api.cpp
extern int FF_ClientCommand;
extern int FF_ClientConnect;
extern int FF_ClientDisconnect;
extern int FF_ClientInfoChanged;
extern int FF_ClientPutInServer;
extern int FF_PluginInit;
extern int FF_PluginCfg;
extern int FF_PluginPrecache;
extern int FF_PluginLog;
extern int FF_PluginEnd;
extern int FF_InconsistentFile;
extern int FF_ClientAuthorized;
extern CFakeMeta g_FakeMeta;
#endif // AMXMODX_H

View File

@ -11,6 +11,18 @@
#include <windows.h> #include <windows.h>
#include <mmsystem.h> #include <mmsystem.h>
#endif #endif
#ifdef __GNUC__
# ifndef CLK_TCK
# define CLK_TCK CLOCKS_PER_SEC
# endif
#endif
// this file does not include amxmodx.h, so we have to include the memory manager here
#ifdef MEMORY_TEST
#include "mmgr/mmgr.h"
#endif // MEMORY_TEST
#include "amx.h" #include "amx.h"
#if defined __BORLANDC__ || defined __WATCOMC__ #if defined __BORLANDC__ || defined __WATCOMC__

11
amxmodx/amxx_mm.def Executable file
View File

@ -0,0 +1,11 @@
; /usr/local/cross-tools/bin/i386-mingw32msvc-dlltool --base-file /tmp/cc4kB6s0.base --output-exp amx_mm.exp --dllname amx_mm.dll --output-def amx_mm.def --add-stdcall-alias --exclude-symbol=DllMainCRTStartup@12 --def /tmp/ccyI7I7K.def
EXPORTS
GetEngineFunctions @ 1 ;
GetEngineFunctions_Post @ 2 ;
GetEntityAPI2 @ 3 ;
GetEntityAPI2_Post @ 4 ;
GiveFnptrsToDll = GiveFnptrsToDll@8 @ 5 ;
GiveFnptrsToDll@8 @ 6 ;
Meta_Attach @ 7 ;
Meta_Detach @ 8 ;
Meta_Query @ 9 ;

281
amxmodx/amxxfile.cpp Executable file
View File

@ -0,0 +1,281 @@
/* 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 "amxxfile.h"
#include "zlib/zlib.h"
/**********************
****** AMXXFILE ******
**********************/
#if defined __GNUC__
#define PACKED __attribute__((packed))
#else
#define PACKED
#endif
#if defined __linux__
#pragma pack(1) /* structures must be packed (byte-aligned) */
#else
#pragma pack(1) /* structures must be packed (byte-aligned) */
#if defined __TURBOC__
#pragma option -a- /* "pack" pragma for older Borland compilers */
#endif
#endif
typedef char mint8_t;
typedef int16_t mint16_t;
typedef int32_t mint32_t;
struct TableEntry
{
mint8_t cellSize PACKED;
mint32_t origSize PACKED; // contains AMX_HEADER->stp
mint32_t offset PACKED;
};
#define DATAREAD(addr, itemsize, itemcount) \
if (fread((addr), (itemsize), (itemcount), (m_pFile)) != (itemcount)) \
{ \
if (feof(m_pFile)) \
m_Status = Err_FileInvalid; \
else \
m_Status = Err_FileRead; \
fclose(m_pFile); \
m_pFile = NULL; \
return; \
}
CAmxxReader::CAmxxReader(const char *filename, int cellsize)
{
if (!filename)
{
m_Status = Err_InvalidParam;
return;
}
m_Status = Err_None;
m_CellSize = cellsize;
m_pFile = fopen(filename, "rb");
if (!m_pFile)
{
m_Status = Err_FileOpen;
return;
}
mint32_t magic;
DATAREAD(&magic, sizeof(magic), 1);
m_OldFile = false;
if (magic != 0x414D5842)
{
// check for old file
AMX_HEADER hdr;
rewind(m_pFile);
fread(&hdr, sizeof(hdr), 1, m_pFile);
amx_Align16(&hdr.magic);
if (hdr.magic == AMX_MAGIC)
{
if (cellsize != 4)
{
m_Status = Err_SectionNotFound;
fclose(m_pFile);
m_pFile = NULL;
return;
}
m_OldFile = true;
return;
}
else
{
// no known file format
m_Status = Err_FileInvalid;
fclose(m_pFile);
m_pFile = NULL;
return;
}
} else if ( magic == 0x524C4542 ) {
//we have an invalid, old, RLEB file
m_Status = Err_OldFile;
fclose(m_pFile);
m_pFile = NULL;
return;
} else {
// try to find the section
mint8_t numOfPlugins;
DATAREAD(&numOfPlugins, sizeof(numOfPlugins), 1);
TableEntry entry;
m_SectionHdrOffset = 0;
int i = 0;
for (i = 0; i < static_cast<int>(numOfPlugins); ++i)
{
DATAREAD(&entry, sizeof(entry), 1);
if (entry.cellSize == m_CellSize)
{
m_SectionHdrOffset = ftell(m_pFile) - sizeof(entry);
break;
}
}
if (!m_SectionHdrOffset)
{
m_Status = Err_SectionNotFound;
fclose(m_pFile);
m_pFile = NULL;
return;
}
// compute section length
if ((i+1) < static_cast<int>(numOfPlugins))
{
// there is a next section
TableEntry nextEntry;
DATAREAD(&nextEntry, sizeof(nextEntry), 1);
m_SectionLength = nextEntry.offset - entry.offset;
}
else
{
fseek(m_pFile, 0, SEEK_END);
m_SectionLength = ftell(m_pFile) - (long)entry.offset;
}
}
}
CAmxxReader::~CAmxxReader()
{
if (m_pFile)
{
fclose(m_pFile);
m_pFile = NULL;
}
}
CAmxxReader::Error CAmxxReader::GetStatus()
{
return m_Status;
}
#undef DATAREAD
#define DATAREAD(addr, itemsize, itemcount) \
if (fread(addr, itemsize, itemcount, m_pFile) != itemcount) \
{ \
if (feof(m_pFile)) \
m_Status = Err_FileInvalid; \
else \
m_Status = Err_FileRead; \
fclose(m_pFile); \
m_pFile = NULL; \
return 0; \
}
size_t CAmxxReader::GetBufferSize()
{
if (!m_pFile)
return 0;
long save = ftell(m_pFile);
if (m_OldFile)
{
rewind(m_pFile);
AMX_HEADER hdr;
DATAREAD(&hdr, sizeof(hdr), 1);
fseek(m_pFile, save, SEEK_SET);
return hdr.stp;
}
fseek(m_pFile, m_SectionHdrOffset, SEEK_SET);
TableEntry entry;
DATAREAD(&entry, sizeof(entry), 1);
fseek(m_pFile, save, SEEK_SET);
return entry.origSize + 1; // +1 : safe
}
#undef DATAREAD
#define DATAREAD(addr, itemsize, itemcount) \
if (fread(addr, itemsize, itemcount, m_pFile) != itemcount) \
{ \
if (feof(m_pFile)) \
m_Status = Err_FileInvalid; \
else \
m_Status = Err_FileRead; \
fclose(m_pFile); \
m_pFile = NULL; \
return m_Status; \
}
CAmxxReader::Error CAmxxReader::GetSection(void *buffer)
{
if (!m_pFile)
return m_Status;
if (m_OldFile)
{
// get file size
fseek(m_pFile, 0, SEEK_END);
long filesize = ftell(m_pFile);
rewind(m_pFile);
DATAREAD(buffer, 1, filesize);
m_Status = Err_None;
return m_Status;
}
// new file type: go to the section table entry
fseek(m_pFile, m_SectionHdrOffset, SEEK_SET);
// go to the offset
TableEntry entry;
DATAREAD(&entry, sizeof(entry), 1);
fseek(m_pFile, entry.offset, SEEK_SET);
// AMXXLOG_Log("|||| Offset needed: %d At: %d", entry.offset, ftell(m_pFile));
uLongf destLen = GetBufferSize();
// read the data to a temporary buffer
char *tempBuffer = new char[m_SectionLength + 1];
//fread(tempBuffer, sizeof(char), m_SectionLength, m_pFile);
DATAREAD((void*)tempBuffer, 1, m_SectionLength);
// decompress
// AMXXLOG_Log("|||| First Bytes: %d %d %d %d", tempBuffer[0], tempBuffer[1], tempBuffer[2], tempBuffer[3]);
int result = uncompress((Bytef *)buffer, &destLen,
(Bytef *)tempBuffer, m_SectionLength);
delete [] tempBuffer;
// AMXXLOG_Log("|||| Result: %d, m_SectionLength=%d, destLen=%d", result, m_SectionLength, destLen);
if (result != Z_OK)
{
m_Status = Err_Decompress;
return Err_Decompress;
}
return Err_None;
}

71
amxmodx/amxxfile.h Executable file
View File

@ -0,0 +1,71 @@
/* 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 __AMXXFILE_H__
#define __AMXXFILE_H__
class CAmxxReader
{
public:
enum Error
{
Err_None=0,
Err_InvalidParam,
Err_FileOpen,
Err_FileRead,
Err_FileInvalid,
Err_SectionNotFound,
Err_DecompressorInit,
Err_Decompress,
Err_OldFile,
};
private:
Error m_Status;
FILE *m_pFile;
bool m_OldFile; // old .amx file
int m_CellSize;
int m_SectionHdrOffset; // offset to the table in the header that describes the required section
int m_SectionLength;
public:
CAmxxReader(const char *filename, int cellsize);
~CAmxxReader();
Error GetStatus(); // Get the current status
size_t GetBufferSize(); // Get the size for the buffer
Error GetSection(void *buffer); // Copy the currently selected section to the buffer
};
#endif // __AMXXFILE_H__

214
amxmodx/amxxlog.cpp Executable file
View File

@ -0,0 +1,214 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
*
*
* 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.
*/
// amxx_logging localinfo:
// 0 = no logging
// 1 = one logfile / day
// 2 = one logfile / map
// 3 = HL Logs
#include <time.h>
#ifndef __linux__
#include <io.h>
#endif
#include "amxmodx.h"
#ifndef __linux__
#define vsnprintf _vsnprintf
#endif
CLog::CLog()
{
m_LogType = 0;
m_LogFile.clear();
}
CLog::~CLog()
{
CloseFile();
}
void CLog::CloseFile()
{
// log "log file closed" to old file, if any
if (!m_LogFile.empty())
{
FILE *fp = fopen(m_LogFile.c_str(), "r");
if (fp)
{
fclose(fp);
fopen(m_LogFile.c_str(), "a+");
// get time
time_t td;
time(&td);
tm *curTime = localtime(&td);
char date[32];
strftime(date, 31, "%m/%d/%Y - %H:%M:%S", curTime);
fprintf(fp, "L %s: %s\n", date, "Log file closed.");
fclose(fp);
}
m_LogFile.clear();
}
}
void CLog::CreateNewFile()
{
CloseFile();
// build filename
time_t td;
time(&td);
tm *curTime = localtime(&td);
int i = 0;
while (true)
{
m_LogFile.assign(build_pathname("%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i));
FILE *pTmpFile = fopen(m_LogFile.c_str(), "r"); // open for reading to check whether the file exists
if (!pTmpFile)
break;
fclose(pTmpFile);
++i;
}
// Log logfile start
FILE *fp = fopen(m_LogFile.c_str(), "w");
if (!fp)
{
ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n");
SET_LOCALINFO("amxx_logging", "0");
}
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);
fclose(fp);
}
void CLog::UseFile(const String &fileName)
{
m_LogFile.assign(build_pathname("%s/%s", g_log_dir.c_str(), fileName.c_str()));
}
void CLog::MapChange()
{
// create dir if not existing
#ifdef __linux
mkdir(build_pathname("%s", g_log_dir.c_str()), 0700);
#else
mkdir(build_pathname("%s", g_log_dir.c_str()));
#endif
m_LogType = atoi(get_localinfo("amxx_logging", "1"));
if (m_LogType < 0 || m_LogType > 3)
{
SET_LOCALINFO("amxx_logging", "1");
m_LogType = 1;
print_srvconsole("[AMXX] Invalid amxx_logging value; setting back to 1...");
}
if (m_LogType == 2)
{
// create new logfile
CreateNewFile();
}
else if (m_LogType == 1)
{
Log("-------- Mapchange --------");
}
else
return;
}
void CLog::Log(const char *fmt, ...)
{
if (m_LogType == 1 || m_LogType == 2)
{
// get time
time_t td;
time(&td);
tm *curTime = localtime(&td);
char date[32];
strftime(date, 31, "%m/%d/%Y - %H:%M:%S", curTime);
// msg
char msg[3072];
va_list arglst;
va_start(arglst, fmt);
vsnprintf(msg, 3071, fmt, arglst);
va_end(arglst);
FILE *pF;
if (m_LogType == 2)
{
pF = fopen(m_LogFile.c_str(), "a+");
if (!pF)
{
CreateNewFile();
pF = fopen(m_LogFile.c_str(), "a+");
if (!pF)
{
ALERT(at_logged, "[AMXX] Unexpected fatal logging error (couldn't open %s for a+). AMXX Logging disabled for this map.\n", m_LogFile.c_str());
m_LogType = 0;
return;
}
}
}
else
{
pF = fopen(build_pathname("%s/L%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday), "a+");
}
if (pF)
{
fprintf(pF, "L %s: %s\n", date, msg);
fclose(pF);
}
else
{
ALERT(at_logged, "[AMXX] Unexpected fatal logging error (couldn't open %s for a+). AMXX Logging disabled for this map.\n", m_LogFile.c_str());
m_LogType = 0;
return;
}
// print on server console
print_srvconsole("L %s: %s\n", date, msg);
}
else if (m_LogType == 3)
{
// build message
// :TODO: Overflow possible here
char msg[3072];
va_list arglst;
va_start(arglst, fmt);
vsnprintf(msg, 3071, fmt, arglst);
va_end(arglst);
ALERT(at_logged, "%s\n", msg);
}
}

View File

@ -1,7 +1,6 @@
/* AMX Mod X /* AMX Mod X
* *
* by the AMX Mod X Development Team * by the AMX Mod X Development Team
* originally developed by OLO
* *
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
@ -29,41 +28,25 @@
* version. * version.
*/ */
#include "CString.h" #ifndef __AMXXLOG_H__
#include "string.h" #define __AMXXLOG_H__
#include "CFile.h"
String::String() class CLog
{ {
len = 0; private:
napis = 0; String m_LogFile;
} int m_LogType;
String::String( const char* n ) void GetLastFile(int &outMonth, int &outDay, String &outFilename);
{ void UseFile(const String &fileName);
napis = 0; public:
set(n); CLog();
} ~CLog();
void CreateNewFile();
void CloseFile();
void MapChange();
void Log(const char *fmt, ...);
};
String::~String() #endif // __AMXXLOG_H__
{
clear();
}
void String::set( const char* n )
{
clear();
if ( n != 0 ){
len = strlen( n );
napis = new char[ len + 1 ];
if ( napis ) strcpy( napis , n );
else len = 0;
}
}
void String::clear() {
delete[] napis;
napis = 0;
len = 0;
}

View File

@ -29,9 +29,7 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "amxmod.h"
int gmsgAmmoPickup; int gmsgAmmoPickup;
int gmsgAmmoX; int gmsgAmmoX;
@ -92,7 +90,7 @@ void Client_TeamInfo(void* mValue)
case 1: case 1:
if ( index < 1 || index > gpGlobals->maxClients ) break; if ( index < 1 || index > gpGlobals->maxClients ) break;
char* msg = (char*)mValue; char* msg = (char*)mValue;
g_players[ index ].team.set( msg ); g_players[ index ].team.assign( msg );
g_teamsIds.registerTeam( msg , -1 ); g_teamsIds.registerTeam( msg , -1 );
} }
} }
@ -171,7 +169,7 @@ void Client_WeaponList(void* mValue)
wpnList |= (1<<iId); wpnList |= (1<<iId);
g_weaponsData[iId].iId = iId; g_weaponsData[iId].iId = iId;
g_weaponsData[iId].ammoSlot = iSlot; g_weaponsData[iId].ammoSlot = iSlot;
g_weaponsData[iId].fullName.set(wpnName); g_weaponsData[iId].fullName.assign(wpnName);
} }
} }
@ -245,7 +243,7 @@ void Client_ScoreInfo(void* mValue)
pPlayer->deaths = deaths; pPlayer->deaths = deaths;
pPlayer->teamId = *(int*)mValue; pPlayer->teamId = *(int*)mValue;
if ( g_teamsIds.isNewTeam() ) if ( g_teamsIds.isNewTeam() )
g_teamsIds.registerTeam( pPlayer->team.str() , pPlayer->teamId ); g_teamsIds.registerTeam( pPlayer->team.c_str() , pPlayer->teamId );
} }
} }
@ -259,7 +257,7 @@ void Client_DamageEnd(void* mValue)
g_events.parseValue( dead->death_killer ); g_events.parseValue( dead->death_killer );
g_events.parseValue( dead->index ); g_events.parseValue( dead->index );
g_events.parseValue( dead->death_headshot ); g_events.parseValue( dead->death_headshot );
g_events.parseValue( dead->death_weapon.str() ); g_events.parseValue( dead->death_weapon.c_str() );
g_events.parseValue( dead->death_tk ? 1 : 0 ); g_events.parseValue( dead->death_tk ? 1 : 0 );
g_events.executeEvents(); g_events.executeEvents();
dead->death_killer = 0; dead->death_killer = 0;
@ -293,7 +291,7 @@ void Client_DeathMsg(void* mValue)
if ( !killer || !victim ) break; if ( !killer || !victim ) break;
victim->death_killer = killer_id; victim->death_killer = killer_id;
victim->death_weapon.set((char*)mValue); victim->death_weapon.assign((char*)mValue);
victim->death_headshot = hs; victim->death_headshot = hs;
victim->death_tk = (killer->teamId == victim->teamId); victim->death_tk = (killer->teamId == victim->teamId);
} }

2759
amxmodx/fakemeta.cpp Executable file

File diff suppressed because it is too large Load Diff

229
amxmodx/fakemeta.h Executable file
View File

@ -0,0 +1,229 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
*
*
* 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 __FAKEMETA_H__
#define __FAKEMETA_H__
// Fake metamod api for modules
#include "CList.h"
// from mplugin.h (metamod)
// Flags to indicate current "load" state of plugin.
// NOTE: order is important, as greater/less comparisons are made.
typedef enum {
PL_EMPTY = 0, // empty slot
PL_VALID, // has valid info in it
PL_BADFILE, // nonexistent file (open failed),
// or not a valid plugin file (query failed)
PL_OPENED, // dlopened and queried
PL_FAILED, // opened, but failed to attach or unattach
PL_RUNNING, // attached and running
PL_PAUSED, // attached but paused
} PLUG_STATUS;
// from h_export.h (metamod)
// Our GiveFnptrsToDll, called by engine.
typedef void (WINAPI *GIVE_ENGINE_FUNCTIONS_FN) (enginefuncs_t
*pengfuncsFromEngine, globalvars_t *pGlobals);
// *** CFakeMeta
class CFakeMeta
{
private:
// Core tables
/* DLL_FUNCTIONS m_CoreDllFuncTable;
enginefuncs_t m_CoreEngineFuncTable;
NEW_DLL_FUNCTIONS m_CoreNewDllFuncTable;
DLL_FUNCTIONS m_CoreDllFuncTable_Post;
enginefuncs_t m_CoreEngineFuncTable_Post;
NEW_DLL_FUNCTIONS m_CoreNewDllFuncTable_Post; */
bool AddCorePlugin(); // Adds the core plugin if needed
public:
class CFakeMetaPlugin
{
private:
// plugin info
String m_Path;
PLUG_STATUS m_Status;
plugin_info_t *m_Info;
// Function tables
META_FUNCTIONS m_MetaFuncTable;
DLL_FUNCTIONS m_DllFuncTable;
enginefuncs_t m_EngineFuncTable;
NEW_DLL_FUNCTIONS m_NewDllFuncTable;
DLL_FUNCTIONS m_DllFuncTable_Post;
enginefuncs_t m_EngineFuncTable_Post;
NEW_DLL_FUNCTIONS m_NewDllFuncTable_Post;
// OS dep handle
DLHANDLE m_Handle;
public:
inline PLUG_STATUS GetStatus() const
{ return m_Status; }
inline void SetStatus(PLUG_STATUS newStatus)
{ m_Status = newStatus; }
inline plugin_info_t * GetInfo()
{ return m_Info; }
inline const plugin_info_t * GetInfo() const
{ return m_Info; }
inline void SetInfo(plugin_info_t *newInfo)
{ m_Info = newInfo; }
inline const char * GetPath()
{ return m_Path.c_str(); }
inline const META_FUNCTIONS &GetMetaFunctions() const
{ return m_MetaFuncTable; }
// Get
inline DLL_FUNCTIONS &GetDllFuncTable()
{ return m_DllFuncTable; }
inline enginefuncs_t &GetEngineFuncTable()
{ return m_EngineFuncTable; }
inline NEW_DLL_FUNCTIONS &GetNewDllFuncTable()
{ return m_NewDllFuncTable; }
// Get const
inline const DLL_FUNCTIONS &GetDllFuncTable() const
{ return m_DllFuncTable; }
inline const enginefuncs_t &GetEngineFuncTable() const
{ return m_EngineFuncTable; }
inline const NEW_DLL_FUNCTIONS &GetNewDllFuncTable() const
{ return m_NewDllFuncTable; }
// Get post
inline DLL_FUNCTIONS &GetDllFuncTable_Post()
{ return m_DllFuncTable_Post; }
inline enginefuncs_t &GetEngineFuncTable_Post()
{ return m_EngineFuncTable_Post; }
inline NEW_DLL_FUNCTIONS &GetNewDllFuncTable_Post()
{ return m_NewDllFuncTable_Post; }
// Get post const
inline const DLL_FUNCTIONS &GetDllFuncTable_Post() const
{ return m_DllFuncTable_Post; }
inline const enginefuncs_t &GetEngineFuncTable_Post() const
{ return m_EngineFuncTable_Post; }
inline const NEW_DLL_FUNCTIONS &GetNewDllFuncTable_Post() const
{ return m_NewDllFuncTable_Post; }
int Query(mutil_funcs_t *pMetaUtilFuncs); // Also calls GiveFnPtrsToDll
int Attach(PLUG_LOADTIME now, meta_globals_t *pMGlobals, gamedll_funcs_t *pGameDllFuncs);
int Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
int GetEntityAPI2(int interfaceVersion);
int GetEntityAPI2_Post(int interfaceVersion);
int GetEngineFunctions(int interfaceVersion);
int GetEngineFunctions_Post(int interfaceVersion);
int GetNewDLLFunctions(int interfaceVersion);
int GetNewDLLFunctions_Post(int interfaceVersion);
CFakeMetaPlugin(const char *path);
~CFakeMetaPlugin();
}; // CFakeMetaPlugin
CFakeMeta();
~CFakeMeta();
bool AddPlugin(const char *path /*path relative to moddir*/);
void ReleasePlugins();
// This is public because i don't want to declare all the functions as friends :)
// :NOTE: The core is now a special, first plugin!
CList<CFakeMetaPlugin> m_Plugins;
// ****** Meta functions ******
// Query all added plugins
void Meta_Query(mutil_funcs_t *pMetaUtilFuncs);
// Attach all added plugins
void Meta_Attach(PLUG_LOADTIME now, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs);
// Detach all added plugins
void Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
// :NOTE: Meta_Init currently not supported
int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable /*from metamod*/, int *interfaceVersion /*from metamod*/,
DLL_FUNCTIONS *pAMXXFunctionTable /*Functions amxx needs*/);
int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable /*from metamod*/, int *interfaceVersion /*from metamod*/,
DLL_FUNCTIONS *pAMXXFunctionTable /*Functions amxx needs*/);
int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion,
enginefuncs_t *pAMXXFunctionTable /*Fucntions amxx needs*/);
int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion,
enginefuncs_t *pAMXXFunctionTable /*Fucntions amxx needs*/);
int GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion,
NEW_DLL_FUNCTIONS *pAMXXFunctionTable);
int GetNewDLLFunctions_Post(NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion,
NEW_DLL_FUNCTIONS *pAMXXFunctionTable);
// Get
/*inline DLL_FUNCTIONS &GetDllFuncTable()
{ return m_CoreDllFuncTable; }
inline enginefuncs_t &GetEngineFuncTable()
{ return m_CoreEngineFuncTable; }
inline NEW_DLL_FUNCTIONS &GetNewDllFuncTable()
{ return m_CoreNewDllFuncTable; }
// Get const
inline const DLL_FUNCTIONS &GetDllFuncTable() const
{ return m_CoreDllFuncTable; }
inline const enginefuncs_t &GetEngineFuncTable() const
{ return m_CoreEngineFuncTable; }
inline const NEW_DLL_FUNCTIONS &GetNewDllFuncTable() const
{ return m_CoreNewDllFuncTable; }
// Get post
inline DLL_FUNCTIONS &GetDllFuncTable_Post()
{ return m_CoreDllFuncTable_Post; }
inline enginefuncs_t &GetEngineFuncTable_Post()
{ return m_CoreEngineFuncTable_Post; }
inline NEW_DLL_FUNCTIONS &GetNewDllFuncTable_Post()
{ return m_CoreNewDllFuncTable_Post; }
// Get post const
inline const DLL_FUNCTIONS &GetDllFuncTable_Post() const
{ return m_CoreDllFuncTable_Post; }
inline const enginefuncs_t &GetEngineFuncTable_Post() const
{ return m_CoreEngineFuncTable_Post; }
inline const NEW_DLL_FUNCTIONS &GetNewDllFuncTable_Post() const
{ return m_CoreNewDllFuncTable_Post; } */
}; // CFakeMeta
// Fake Metamod
// defined in meta_api.cpp
extern CFakeMeta g_FakeMeta;
#endif // #ifndef __FAKEMETA_H__

View File

@ -35,17 +35,6 @@
#define _INTPTR_T_DEFINED #define _INTPTR_T_DEFINED
#endif #endif
#include <extdll.h>
#include <meta_api.h>
#include "amxmod.h"
// header file for unlink()
#ifdef __linux__
#include <unistd.h>
#else
#include <io.h>
#endif
#ifdef __GNUC__ #ifdef __GNUC__
//#include <stddef.h> //#include <stddef.h>
@ -55,6 +44,19 @@
#endif #endif
// header file for unlink()
#ifdef __linux__
#include <unistd.h>
#else
#include <io.h>
#endif
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h"
CVector<FILE *> FileList;
static cell AMX_NATIVE_CALL read_dir(AMX *amx, cell *params) static cell AMX_NATIVE_CALL read_dir(AMX *amx, cell *params)
{ {
#ifdef __GNUC__ #ifdef __GNUC__
@ -263,6 +265,327 @@ static cell AMX_NATIVE_CALL file_size(AMX *amx, cell *params) /* 1 param */
return -1; return -1;
} }
//ported from Sanji's file access module by BAILOPAN
// Important update - now uses new handles
static cell AMX_NATIVE_CALL amx_fopen(AMX *amx, cell *params)
{
unsigned int i;
int len, j=-1;
char *file = build_pathname("%s", get_amxstring(amx, params[1], 1, len));
char *flags = get_amxstring(amx, params[2], 0, len);
FILE *fp = fopen(file, flags);
for (i=0; i<FileList.size(); i++)
{
if (FileList.at(i) == NULL)
{
j = i;
break;
}
}
if (j==-1)
{
FileList.push_back(fp);
j = FileList.size() - 1;
} else {
FileList.at(j) = fp;
}
return j+1;
}
static cell AMX_NATIVE_CALL amx_fclose(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
if (fp) {
return fclose(fp);
} else {
return -1;
}
}
static cell AMX_NATIVE_CALL amx_fgetc(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
if (fp) {
return fgetc(fp);
} else {
return -1;
}
}
static cell AMX_NATIVE_CALL amx_fread(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
char *buffer;
if (fp) {
buffer = new char[params[3]]; // SLOW!!! :TODO: Find a better way (auto pointers?)
fread(buffer, sizeof(char), params[3], fp);
set_amxstring(amx, params[2], buffer, params[3]);
delete [] buffer;
return 1;
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fwrite(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
char *buf;
int len;
if (fp) {
buf = format_amxstring(amx, params, 2, len);
return fwrite(buf, sizeof(char), strlen(buf), fp);
}
return -1;
}
static cell AMX_NATIVE_CALL amx_feof(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
if (fp) {
if (feof(fp)) {
return 1;
}
return 0;
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fseek(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
if (fp) {
return fseek(fp, (long)params[2], params[3]);
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fputc(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
if (fp) {
return fputc(params[2], fp);
}
return -1;
}
static cell AMX_NATIVE_CALL amx_rewind(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
if (fp) {
rewind(fp);
return 1;
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fflush(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
if (fp) {
return fflush(fp);
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fscanf(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
char *buf;
int len;
buf = format_amxstring(amx, params, 2, len);
if (fp) {
return fscanf(fp, "%s", buf);
}
return -1;
}
static cell AMX_NATIVE_CALL amx_ftell(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
if (fp) {
return ftell(fp);
}
return -1;
}
static cell AMX_NATIVE_CALL amx_filesize(AMX *amx, cell *params)
{
int len;
char *file = build_pathname("%s", format_amxstring(amx, params, 1, len));
long size;
FILE *fp = fopen(file, "rb");
if (fp) {
fseek(fp, 0, SEEK_END);
size = ftell(fp);
return size;
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fgetl(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
long t;
if (fp) {
fread(&t, sizeof(long), 1, fp);
return t;
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fgeti(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
int t;
if (fp) {
fread(&t, sizeof(int), 1, fp);
return t;
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fgets(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
short t;
if (fp) {
fread(&t, sizeof(short), 1, fp);
return t;
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fputs(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
short size = params[2];
if (fp) {
return fwrite(&size, sizeof(short), 1, fp);
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fputl(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
long size = params[2];
if (fp) {
return fwrite(&size, sizeof(long), 1, fp);
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fputi(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
int size = params[2];
if (fp) {
return fwrite(&size, sizeof(int), 1, fp);
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fgetf(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
float t;
if (fp) {
fread(&t, sizeof(float), 1, fp);
return *(cell*)&t;
}
return -1;
}
static cell AMX_NATIVE_CALL amx_fputf(AMX *amx, cell *params)
{
unsigned int id = params[1] - 1;
if (id >= FileList.size() || FileList.at(id) == NULL)
return 0;
FILE *fp = FileList.at(id);
float size = *(float *)((void *)&params[2]);
if (fp) {
return fwrite(&size, sizeof(float), 1, fp);
}
return -1;
}
static cell AMX_NATIVE_CALL amx_build_pathname(AMX *amx, cell *params)
{
int len;
char *szPath = get_amxstring(amx, params[1], 0, len);
return set_amxstring(amx, params[2], build_pathname("%s", szPath), params[3]);
}
AMX_NATIVE_INFO file_Natives[] = { AMX_NATIVE_INFO file_Natives[] = {
{ "delete_file", delete_file }, { "delete_file", delete_file },
{ "file_exists", file_exists }, { "file_exists", file_exists },
@ -270,6 +593,32 @@ AMX_NATIVE_INFO file_Natives[] = {
{ "read_dir", read_dir }, { "read_dir", read_dir },
{ "read_file", read_file }, { "read_file", read_file },
{ "write_file", write_file }, { "write_file", write_file },
//Sanji's File Natives
{ "fopen", amx_fopen },
{ "fclose", amx_fclose },
{ "fgetc", amx_fgetc },
{ "fread", amx_fread },
{ "fwrite", amx_fwrite },
{ "feof", amx_feof },
{ "fseek", amx_fseek },
{ "fputc", amx_fputc },
{ "rewind", amx_rewind },
{ "fflush", amx_fflush },
{ "fscanf", amx_fscanf },
{ "ftell", amx_ftell },
{ "filesize", amx_filesize },
{ "fgetl", amx_fgetl },
{ "fgeti", amx_fgeti },
{ "fgets", amx_fgets },
{ "fputs", amx_fputs },
{ "fputl", amx_fputl },
{ "fputi", amx_fputi },
{ "unlink", delete_file },
{ "fgetf", amx_fgetf },
{ "fputf", amx_fputf },
{ "build_pathname", amx_build_pathname},
{ NULL, NULL } { NULL, NULL }
}; };

View File

@ -14,11 +14,19 @@
* 2003-11-24: A few more native functions (geometry), plus minor modifications, * 2003-11-24: A few more native functions (geometry), plus minor modifications,
* mostly to be compatible with dynamically loadable extension * mostly to be compatible with dynamically loadable extension
* modules, by Thiadmer Riemersma * modules, by Thiadmer Riemersma
* 2004-01-09: Adaptions for 64-bit cells (using "double precision"), by
* Thiadmer Riemersma
*/ */
#include <stdlib.h> /* for atof() */ #include <stdlib.h> /* for atof() */
#include <stdio.h> /* for NULL */ #include <stdio.h> /* for NULL */
#include <assert.h> #include <assert.h>
#include <math.h> #include <math.h>
// this file does not include amxmodx.h, so we have to include the memory manager here
#ifdef MEMORY_TEST
#include "mmgr/mmgr.h"
#endif // MEMORY_TEST
#include "amx.h" #include "amx.h"
/* /*
@ -29,6 +37,19 @@
#define PI 3.1415926535897932384626433832795 #define PI 3.1415926535897932384626433832795
static REAL FromRadians(REAL angle, int radix)
{
switch (radix)
{
case 1: /* degrees, sexagesimal system (technically: degrees/minutes/seconds) */
return (REAL)(angle / PI * 180.0);
case 2: /* grades, centesimal system */
return (REAL)(angle / PI * 200.0);
default: /* assume already radian */
return angle;
} /* switch */
}
#if defined __BORLANDC__ || defined __WATCOMC__ #if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused #pragma argsused
#endif #endif
@ -39,10 +60,10 @@ static cell AMX_NATIVE_CALL n_float(AMX *amx,cell *params)
* params[0] = number of bytes * params[0] = number of bytes
* params[1] = long value to convert to a float * params[1] = long value to convert to a float
*/ */
float fValue; REAL fValue;
/* Convert to a float. Calls the compilers long to float conversion. */ /* Convert to a float. Calls the compilers long to float conversion. */
fValue = (float) params[1]; fValue = (REAL) params[1];
/* Return the cell. */ /* Return the cell. */
return amx_ftoc(fValue); return amx_ftoc(fValue);
@ -60,7 +81,7 @@ static cell AMX_NATIVE_CALL n_floatstr(AMX *amx,cell *params)
*/ */
char szSource[60]; char szSource[60];
cell *pString; cell *pString;
float fNum; REAL fNum;
int nLen; int nLen;
/* They should have sent us 1 cell. */ /* They should have sent us 1 cell. */
@ -71,14 +92,14 @@ static cell AMX_NATIVE_CALL n_floatstr(AMX *amx,cell *params)
/* Find out how long the string is in characters. */ /* Find out how long the string is in characters. */
amx_StrLen(pString, &nLen); amx_StrLen(pString, &nLen);
if (nLen == 0 || nLen >= sizeof szSource) if (nLen == 0 || (unsigned int)nLen >= sizeof szSource)
return 0; return 0;
/* Now convert the Small String into a C type null terminated string */ /* Now convert the Small String into a C type null terminated string */
amx_GetString(szSource, pString); amx_GetString(szSource, pString, 0);
/* Now convert this to a float. */ /* Now convert this to a float. */
fNum = (float)atof(szSource); fNum = (REAL)atof(szSource);
return amx_ftoc(fNum); return amx_ftoc(fNum);
} }
@ -94,7 +115,7 @@ static cell AMX_NATIVE_CALL n_floatmul(AMX *amx,cell *params)
* params[1] = float operand 1 * params[1] = float operand 1
* params[2] = float operand 2 * params[2] = float operand 2
*/ */
float fRes = amx_ctof(params[1]) * amx_ctof(params[2]); REAL fRes = amx_ctof(params[1]) * amx_ctof(params[2]);
return amx_ftoc(fRes); return amx_ftoc(fRes);
} }
@ -109,7 +130,7 @@ static cell AMX_NATIVE_CALL n_floatdiv(AMX *amx,cell *params)
* params[1] = float dividend (top) * params[1] = float dividend (top)
* params[2] = float divisor (bottom) * params[2] = float divisor (bottom)
*/ */
float fRes = amx_ctof(params[1]) / amx_ctof(params[2]); REAL fRes = amx_ctof(params[1]) / amx_ctof(params[2]);
return amx_ftoc(fRes); return amx_ftoc(fRes);
} }
@ -124,7 +145,7 @@ static cell AMX_NATIVE_CALL n_floatadd(AMX *amx,cell *params)
* params[1] = float operand 1 * params[1] = float operand 1
* params[2] = float operand 2 * params[2] = float operand 2
*/ */
float fRes = amx_ctof(params[1]) + amx_ctof(params[2]); REAL fRes = amx_ctof(params[1]) + amx_ctof(params[2]);
return amx_ftoc(fRes); return amx_ftoc(fRes);
} }
@ -139,7 +160,7 @@ static cell AMX_NATIVE_CALL n_floatsub(AMX *amx,cell *params)
* params[1] = float operand 1 * params[1] = float operand 1
* params[2] = float operand 2 * params[2] = float operand 2
*/ */
float fRes = amx_ctof(params[1]) - amx_ctof(params[2]); REAL fRes = amx_ctof(params[1]) - amx_ctof(params[2]);
return amx_ftoc(fRes); return amx_ftoc(fRes);
} }
@ -154,8 +175,8 @@ static cell AMX_NATIVE_CALL n_floatfract(AMX *amx,cell *params)
* params[0] = number of bytes * params[0] = number of bytes
* params[1] = float operand * params[1] = float operand
*/ */
float fA = amx_ctof(params[1]); REAL fA = amx_ctof(params[1]);
fA = fA - (float)(floor((double)fA)); fA = fA - (REAL)(floor((double)fA));
return amx_ftoc(fA); return amx_ftoc(fA);
} }
@ -171,24 +192,24 @@ static cell AMX_NATIVE_CALL n_floatround(AMX *amx,cell *params)
* params[1] = float operand * params[1] = float operand
* params[2] = Type of rounding (long) * params[2] = Type of rounding (long)
*/ */
float fA = amx_ctof(params[1]); REAL fA = amx_ctof(params[1]);
switch (params[2]) switch (params[2])
{ {
case 1: /* round downwards (truncate) */ case 1: /* round downwards (truncate) */
fA = (float)(floor((double)fA)); fA = (REAL)(floor((double)fA));
break; break;
case 2: /* round upwards */ case 2: /* round upwards */
fA = (float)(ceil((double)fA)); fA = (REAL)(ceil((double)fA));
break; break;
case 3: /* round towards zero */ case 3: /* round towards zero */
if ( fA>=0.0 ) if ( fA>=0.0 )
fA = (float)(floor((double)fA)); fA = (REAL)(floor((double)fA));
else else
fA = (float)(ceil((double)fA)); fA = (REAL)(ceil((double)fA));
break; break;
default: /* standard, round to nearest */ default: /* standard, round to nearest */
fA = (float)(floor((double)fA+.5)); fA = (REAL)(floor((double)fA+.5));
break; break;
} }
@ -206,7 +227,7 @@ static cell AMX_NATIVE_CALL n_floatcmp(AMX *amx,cell *params)
* params[1] = float operand 1 * params[1] = float operand 1
* params[2] = float operand 2 * params[2] = float operand 2
*/ */
float fA, fB; REAL fA, fB;
fA = amx_ctof(params[1]); fA = amx_ctof(params[1]);
fB = amx_ctof(params[2]); fB = amx_ctof(params[2]);
@ -226,8 +247,8 @@ static cell AMX_NATIVE_CALL n_floatsqroot(AMX *amx,cell *params)
* params[0] = number of bytes * params[0] = number of bytes
* params[1] = float operand * params[1] = float operand
*/ */
float fA = amx_ctof(params[1]); REAL fA = amx_ctof(params[1]);
fA = (float)sqrt(fA); fA = (REAL)sqrt(fA);
if (fA < 0) if (fA < 0)
return amx_RaiseError(amx, AMX_ERR_DOMAIN); return amx_RaiseError(amx, AMX_ERR_DOMAIN);
return amx_ftoc(fA); return amx_ftoc(fA);
@ -244,9 +265,9 @@ static cell AMX_NATIVE_CALL n_floatpower(AMX *amx,cell *params)
* params[1] = float operand 1 (base) * params[1] = float operand 1 (base)
* params[2] = float operand 2 (exponent) * params[2] = float operand 2 (exponent)
*/ */
float fA = amx_ctof(params[1]); REAL fA = amx_ctof(params[1]);
float fB = amx_ctof(params[2]); REAL fB = amx_ctof(params[2]);
fA = (float)pow(fA, fB); fA = (REAL)pow(fA, fB);
return amx_ftoc(fA); return amx_ftoc(fA);
} }
@ -261,25 +282,25 @@ static cell AMX_NATIVE_CALL n_floatlog(AMX *amx,cell *params)
* params[1] = float operand 1 (value) * params[1] = float operand 1 (value)
* params[2] = float operand 2 (base) * params[2] = float operand 2 (base)
*/ */
float fValue = amx_ctof(params[1]); REAL fValue = amx_ctof(params[1]);
float fBase = amx_ctof(params[2]); REAL fBase = amx_ctof(params[2]);
if (fValue <= 0.0 || fBase <= 0) if (fValue <= 0.0 || fBase <= 0)
return amx_RaiseError(amx, AMX_ERR_DOMAIN); return amx_RaiseError(amx, AMX_ERR_DOMAIN);
if (fBase == 10.0) // ??? epsilon if (fBase == 10.0) // ??? epsilon
fValue = (float)log10(fValue); fValue = (REAL)log10(fValue);
else else
fValue = (float)(log(fValue) / log(fBase)); fValue = (REAL)(log(fValue) / log(fBase));
return amx_ftoc(fValue); return amx_ftoc(fValue);
} }
static float ToRadians(float angle, int radix) static REAL ToRadians(REAL angle, int radix)
{ {
switch (radix) switch (radix)
{ {
case 1: /* degrees, sexagesimal system (technically: degrees/minutes/seconds) */ case 1: /* degrees, sexagesimal system (technically: degrees/minutes/seconds) */
return (float)(angle * PI / 180.0); return (REAL)(angle * PI / 180.0);
case 2: /* grades, centesimal system */ case 2: /* grades, centesimal system */
return (float)(angle * PI / 200.0); return (REAL)(angle * PI / 200.0);
default: /* assume already radian */ default: /* assume already radian */
return angle; return angle;
} /* switch */ } /* switch */
@ -296,9 +317,9 @@ static cell AMX_NATIVE_CALL n_floatsin(AMX *amx,cell *params)
* params[1] = float operand 1 (angle) * params[1] = float operand 1 (angle)
* params[2] = float operand 2 (radix) * params[2] = float operand 2 (radix)
*/ */
float fA = amx_ctof(params[1]); REAL fA = amx_ctof(params[1]);
fA = ToRadians(fA, params[2]); fA = ToRadians(fA, params[2]);
fA = sinf(fA); // PM: using the float version of sin fA = sin(fA);
return amx_ftoc(fA); return amx_ftoc(fA);
} }
@ -313,9 +334,9 @@ static cell AMX_NATIVE_CALL n_floatcos(AMX *amx,cell *params)
* params[1] = float operand 1 (angle) * params[1] = float operand 1 (angle)
* params[2] = float operand 2 (radix) * params[2] = float operand 2 (radix)
*/ */
float fA = amx_ctof(params[1]); REAL fA = amx_ctof(params[1]);
fA = ToRadians(fA, params[2]); fA = ToRadians(fA, params[2]);
fA = cosf(fA); // PM: using the float version of cos fA = cos(fA);
return amx_ftoc(fA); return amx_ftoc(fA);
} }
@ -330,19 +351,87 @@ static cell AMX_NATIVE_CALL n_floattan(AMX *amx,cell *params)
* params[1] = float operand 1 (angle) * params[1] = float operand 1 (angle)
* params[2] = float operand 2 (radix) * params[2] = float operand 2 (radix)
*/ */
float fA = amx_ctof(params[1]); REAL fA = amx_ctof(params[1]);
fA = ToRadians(fA, params[2]); fA = ToRadians(fA, params[2]);
fA = tanf(fA); // PM: using the float version of tan fA = tan(fA);
return amx_ftoc(fA); return amx_ftoc(fA);
} }
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
/* Added by BAILOPAN */
static cell AMX_NATIVE_CALL n_floatatan(AMX *amx, cell *params)
{
/*
* params[1] = angle
* params[2] = radix
*/
REAL fA = amx_ctof(params[1]);
fA = ToRadians(fA, params[2]);
fA = atan(fA);
fA = FromRadians(fA, params[2]);
return amx_ftoc(fA);
}
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
/* Added by BAILOPAN */
static cell AMX_NATIVE_CALL n_floatacos(AMX *amx, cell *params)
{
/*
* params[1] = angle
* params[2] = radix
*/
REAL fA = amx_ctof(params[1]);
fA = acos(fA);
fA = FromRadians(fA, params[2]);
return amx_ftoc(fA);
}
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
/* Added by BAILOPAN */
static cell AMX_NATIVE_CALL n_floatasin(AMX *amx, cell *params)
{
/*
* params[1] = angle
* params[2] = radix
*/
REAL fA = amx_ctof(params[1]);
fA = asin(fA);
fA = FromRadians(fA, params[2]);
return amx_ftoc(fA);
}
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
/* Added by BAILOPAN */
static cell AMX_NATIVE_CALL n_floatatan2(AMX *amx, cell *params)
{
/*
* params[1] = x
* params[2] = y
* params[3] = radix
*/
REAL fA = amx_ctof(params[1]);
REAL fB = amx_ctof(params[2]);
REAL fC;
fC = atan2(fA, fB);
fC = FromRadians(fC, params[3]);
return amx_ftoc(fC);
}
#if defined __BORLANDC__ || defined __WATCOMC__ #if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused #pragma argsused
#endif #endif
/******************************************************************/ /******************************************************************/
static cell AMX_NATIVE_CALL n_floatabs(AMX *amx,cell *params) static cell AMX_NATIVE_CALL n_floatabs(AMX *amx,cell *params)
{ {
float fA = amx_ctof(params[1]); REAL fA = amx_ctof(params[1]);
fA = (fA >= 0) ? fA : -fA; fA = (fA >= 0) ? fA : -fA;
return amx_ftoc(fA); return amx_ftoc(fA);
} }
@ -364,6 +453,10 @@ AMX_NATIVE_INFO float_Natives[] = {
{ "floatcos", n_floatcos }, { "floatcos", n_floatcos },
{ "floattan", n_floattan }, { "floattan", n_floattan },
{ "floatabs", n_floatabs }, { "floatabs", n_floatabs },
{ "floatasin", n_floatasin },
{ "floatacos", n_floatacos },
{ "floatatan", n_floatatan },
{ "floatatan2", n_floatatan2 },
{ NULL, NULL } /* terminator */ { NULL, NULL } /* terminator */
}; };

474
amxmodx/md5.cpp Executable file
View File

@ -0,0 +1,474 @@
// MD5.CC - source code for the C++/object oriented translation and
// modification of MD5.
// Translation and modification (c) 1995 by Mordechai T. Abzug
// This translation/ modification is provided "as is," without express or
// implied warranty of any kind.
// The translator/ modifier does not claim (1) that MD5 will do what you think
// it does; (2) that this translation/ modification is accurate; or (3) that
// this software is "merchantible." (Language for this disclaimer partially
// copied from the disclaimer below).
/* based on:
MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
MDDRIVER.C - test driver for MD2, MD4 and MD5
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.
License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.
License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this
documentation and/or software.
*/
#include "md5.h"
#include <assert.h>
#include <string.h>
// MD5 simple initialization method
MD5::MD5(){
init();
}
// MD5 block update operation. Continues an MD5 message-digest
// operation, processing another message block, and updating the
// context.
void MD5::update (uint1 *input, uint4 input_length) {
uint4 input_index, buffer_index;
uint4 buffer_space; // how much space is left in buffer
if (finalized){ // so we can't update!
/*cerr << "MD5::update: Can't update a finalized digest!" << endl;*/
return;
}
// Compute number of bytes mod 64
buffer_index = (unsigned int)((count[0] >> 3) & 0x3F);
// Update number of bits
if ( (count[0] += ((uint4) input_length << 3))<((uint4) input_length << 3) )
count[1]++;
count[1] += ((uint4)input_length >> 29);
buffer_space = 64 - buffer_index; // how much space is left in buffer
// Transform as many times as possible.
if (input_length >= buffer_space) { // ie. we have enough to fill the buffer
// fill the rest of the buffer and transform
memcpy (buffer + buffer_index, input, buffer_space);
transform (buffer);
// now, transform each 64-byte piece of the input, bypassing the buffer
for (input_index = buffer_space; input_index + 63 < input_length;
input_index += 64)
transform (input+input_index);
buffer_index = 0; // so we can buffer remaining
}
else
input_index=0; // so we can buffer the whole input
// and here we do the buffering:
memcpy(buffer+buffer_index, input+input_index, input_length-input_index);
}
// MD5 update for files.
// Like above, except that it works on files (and uses above as a primitive.)
void MD5::update(FILE *file){
unsigned char buffer[1024];
int len;
while (len=fread(buffer, 1, 1024, file))
update(buffer, len);
fclose (file);
}
// MD5 finalization. Ends an MD5 message-digest operation, writing the
// the message digest and zeroizing the context.
void MD5::finalize (){
unsigned char bits[8];
unsigned int index, padLen;
static uint1 PADDING[64]={
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
if (finalized){
/* cerr << "MD5::finalize: Already finalized this digest!" << endl;*/
return;
}
// Save number of bits
encode (bits, count, 8);
// Pad out to 56 mod 64.
index = (uint4) ((count[0] >> 3) & 0x3f);
padLen = (index < 56) ? (56 - index) : (120 - index);
update (PADDING, padLen);
// Append length (before padding)
update (bits, 8);
// Store state in digest
encode (digest, state, 16);
// Zeroize sensitive information
memset (buffer, 0, sizeof(*buffer));
finalized=1;
}
MD5::MD5(FILE *file){
init(); // must be called be all constructors
update(file);
finalize ();
}
unsigned char *MD5::raw_digest(){
uint1 *s = new uint1[16];
if (!finalized){
/* cerr << "MD5::raw_digest: Can't get digest if you haven't "<<
"finalized the digest!" <<endl;*/
return ( (unsigned char*) "");
}
memcpy(s, digest, 16);
return s;
}
char *MD5::hex_digest(){
int i;
char *s= new char[33];
if (!finalized){
/* cerr << "MD5::hex_digest: Can't get digest if you haven't "<<
"finalized the digest!" <<endl;*/
return "";
}
for (i=0; i<16; i++)
sprintf(s+i*2, "%02x", digest[i]);
s[32]='\0';
return s;
}
char *MD5::hex_digest(char buffer[33]){
int i;
if (!finalized)
{
/* cerr << "MD5::hex_digest: Can't get digest if you haven't "<<
"finalized the digest!" <<endl;*/
return "";
}
for (i=0; i<16; i++)
sprintf(buffer+i*2, "%02x", digest[i]);
buffer[32]='\0';
return buffer;
}
// PRIVATE METHODS:
void MD5::init(){
finalized=0; // we just started!
// Nothing counted, so count=0
count[0] = 0;
count[1] = 0;
// Load magic initialization constants.
state[0] = 0x67452301;
state[1] = 0xefcdab89;
state[2] = 0x98badcfe;
state[3] = 0x10325476;
}
// Constants for MD5Transform routine.
// Although we could use C++ style constants, defines are actually better,
// since they let us easily evade scope clashes.
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
// MD5 basic transformation. Transforms state based on block.
void MD5::transform (uint1 block[64]){
uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
decode (x, block, 64);
assert(!finalized); // not just a user error, since the method is private
/* Round 1 */
FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
/* Round 2 */
GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
/* Round 3 */
HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
/* Round 4 */
II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
// Zeroize sensitive information.
memset ( (uint1 *) x, 0, sizeof(x));
}
// Encodes input (UINT4) into output (unsigned char). Assumes len is
// a multiple of 4.
void MD5::encode (uint1 *output, uint4 *input, uint4 len) {
unsigned int i, j;
for (i = 0, j = 0; j < len; i++, j += 4) {
output[j] = (uint1) (input[i] & 0xff);
output[j+1] = (uint1) ((input[i] >> 8) & 0xff);
output[j+2] = (uint1) ((input[i] >> 16) & 0xff);
output[j+3] = (uint1) ((input[i] >> 24) & 0xff);
}
}
// Decodes input (unsigned char) into output (UINT4). Assumes len is
// a multiple of 4.
void MD5::decode (uint4 *output, uint1 *input, uint4 len){
unsigned int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) |
(((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24);
}
// Note: Replace "for loop" with standard memcpy if possible.
void MD5::memcpy (uint1 *output, uint1 *input, uint4 len){
unsigned int i;
for (i = 0; i < len; i++)
output[i] = input[i];
}
// Note: Replace "for loop" with standard memset if possible.
void MD5::memset (uint1 *output, uint1 value, uint4 len){
unsigned int i;
for (i = 0; i < len; i++)
output[i] = value;
}
// ROTATE_LEFT rotates x left n bits.
inline unsigned int MD5::rotate_left (uint4 x, uint4 n){
return (x << n) | (x >> (32-n)) ;
}
// F, G, H and I are basic MD5 functions.
inline unsigned int MD5::F (uint4 x, uint4 y, uint4 z){
return (x & y) | (~x & z);
}
inline unsigned int MD5::G (uint4 x, uint4 y, uint4 z){
return (x & z) | (y & ~z);
}
inline unsigned int MD5::H (uint4 x, uint4 y, uint4 z){
return x ^ y ^ z;
}
inline unsigned int MD5::I (uint4 x, uint4 y, uint4 z){
return y ^ (x | ~z);
}
// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
// Rotation is separate from addition to prevent recomputation.
inline void MD5::FF(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac){
a += F(b, c, d) + x + ac;
a = rotate_left (a, s) +b;
}
inline void MD5::GG(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac){
a += G(b, c, d) + x + ac;
a = rotate_left (a, s) +b;
}
inline void MD5::HH(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac){
a += H(b, c, d) + x + ac;
a = rotate_left (a, s) +b;
}
inline void MD5::II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac){
a += I(b, c, d) + x + ac;
a = rotate_left (a, s) +b;
}

105
amxmodx/md5.h Executable file
View File

@ -0,0 +1,105 @@
// MD5.CC - source code for the C++/object oriented translation and
// modification of MD5.
// Translation and modification (c) 1995 by Mordechai T. Abzug
// This translation/ modification is provided "as is," without express or
// implied warranty of any kind.
// The translator/ modifier does not claim (1) that MD5 will do what you think
// it does; (2) that this translation/ modification is accurate; or (3) that
// this software is "merchantible." (Language for this disclaimer partially
// copied from the disclaimer below).
/* based on:
MD5.H - header file for MD5C.C
MDDRIVER.C - test driver for MD2, MD4 and MD5
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.
License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.
License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this
documentation and/or software.
*/
#include <stdio.h>
//#include <fstream.h>
//#include <iostream.h>
class MD5 {
public:
// methods for controlled operation:
MD5 (); // simple initializer
void update (unsigned char *input, unsigned int input_length);
void update (FILE *file);
void finalize ();
// constructors for special circumstances. All these constructors finalize
// the MD5 context.
MD5 (unsigned char *string); // digest string, finalize
MD5 (FILE *file); // digest file, close, finalize
// methods to acquire finalized result
unsigned char *raw_digest (); // digest as a 16-byte binary array
char * hex_digest (); // digest as a 33-byte ascii-hex string
char * hex_digest (char buffer[33]); //same as above, passing buffer
private:
// first, some types:
typedef unsigned int uint4; // assumes integer is 4 words long
typedef unsigned short int uint2; // assumes short integer is 2 words long
typedef unsigned char uint1; // assumes char is 1 word long
// next, the private data:
uint4 state[4];
uint4 count[2]; // number of *bits*, mod 2^64
uint1 buffer[64]; // input buffer
uint1 digest[16];
uint1 finalized;
// last, the private methods, mostly static:
void init (); // called by all constructors
void transform (uint1 *buffer); // does the real update work. Note
// that length is implied to be 64.
static void encode (uint1 *dest, uint4 *src, uint4 length);
static void decode (uint4 *dest, uint1 *src, uint4 length);
static void memcpy (uint1 *dest, uint1 *src, uint4 length);
static void memset (uint1 *start, uint1 val, uint4 length);
static inline uint4 rotate_left (uint4 x, uint4 n);
static inline uint4 F (uint4 x, uint4 y, uint4 z);
static inline uint4 G (uint4 x, uint4 y, uint4 z);
static inline uint4 H (uint4 x, uint4 y, uint4 z);
static inline uint4 I (uint4 x, uint4 y, uint4 z);
static inline void FF (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac);
static inline void GG (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac);
static inline void HH (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac);
static inline void II (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac);
};

File diff suppressed because it is too large Load Diff

1605
amxmodx/mmgr/mmgr.cpp Executable file

File diff suppressed because it is too large Load Diff

146
amxmodx/mmgr/mmgr.h Executable file
View File

@ -0,0 +1,146 @@
// ---------------------------------------------------------------------------------------------------------------------------------
// Copyright 2000, Paul Nettle. All rights reserved.
//
// You are free to use this source code in any commercial or non-commercial product.
//
// mmgr.h - Memory manager & tracking software
//
// The most recent version of this software can be found at: ftp://ftp.GraphicsPapers.com/pub/ProgrammingTools/MemoryManagers/
//
// [NOTE: Best when viewed with 8-character tabs]
// ---------------------------------------------------------------------------------------------------------------------------------
#ifndef _H_MMGR
#define _H_MMGR
// ---------------------------------------------------------------------------------------------------------------------------------
// For systems that don't have the __FUNCTION__ variable, we can just define it here
// ---------------------------------------------------------------------------------------------------------------------------------
#ifndef __FUNCTION__
#define __FUNCTION__ "??"
#endif // #ifndef __FUNCTION__
// ---------------------------------------------------------------------------------------------------------------------------------
// Types
// ---------------------------------------------------------------------------------------------------------------------------------
typedef struct tag_au
{
size_t actualSize;
size_t reportedSize;
void *actualAddress;
void *reportedAddress;
char sourceFile[40];
char sourceFunc[40];
unsigned int sourceLine;
unsigned int allocationType;
bool breakOnDealloc;
bool breakOnRealloc;
unsigned int allocationNumber;
struct tag_au *next;
struct tag_au *prev;
} sAllocUnit;
typedef struct
{
unsigned int totalReportedMemory;
unsigned int totalActualMemory;
unsigned int peakReportedMemory;
unsigned int peakActualMemory;
unsigned int accumulatedReportedMemory;
unsigned int accumulatedActualMemory;
unsigned int accumulatedAllocUnitCount;
unsigned int totalAllocUnitCount;
unsigned int peakAllocUnitCount;
} sMStats;
// ---------------------------------------------------------------------------------------------------------------------------------
// External constants
// ---------------------------------------------------------------------------------------------------------------------------------
extern const unsigned int m_alloc_unknown;
extern const unsigned int m_alloc_new;
extern const unsigned int m_alloc_new_array;
extern const unsigned int m_alloc_malloc;
extern const unsigned int m_alloc_calloc;
extern const unsigned int m_alloc_realloc;
extern const unsigned int m_alloc_delete;
extern const unsigned int m_alloc_delete_array;
extern const unsigned int m_alloc_free;
// ---------------------------------------------------------------------------------------------------------------------------------
// Used by the macros
// ---------------------------------------------------------------------------------------------------------------------------------
void m_setOwner(const char *file, const unsigned int line, const char *func);
// ---------------------------------------------------------------------------------------------------------------------------------
// Allocation breakpoints
// ---------------------------------------------------------------------------------------------------------------------------------
bool &m_breakOnRealloc(void *reportedAddress);
bool &m_breakOnDealloc(void *reportedAddress);
// ---------------------------------------------------------------------------------------------------------------------------------
// The meat of the memory tracking software
// ---------------------------------------------------------------------------------------------------------------------------------
void *m_allocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc,
const unsigned int allocationType, const size_t reportedSize);
void *m_reallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc,
const unsigned int reallocationType, const size_t reportedSize, void *reportedAddress);
void m_deallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc,
const unsigned int deallocationType, const void *reportedAddress);
// ---------------------------------------------------------------------------------------------------------------------------------
// Utilitarian functions
// ---------------------------------------------------------------------------------------------------------------------------------
bool m_validateAddress(const void *reportedAddress);
bool m_validateAllocUnit(const sAllocUnit *allocUnit);
bool m_validateAllAllocUnits();
// ---------------------------------------------------------------------------------------------------------------------------------
// Unused RAM calculations
// ---------------------------------------------------------------------------------------------------------------------------------
unsigned int m_calcUnused(const sAllocUnit *allocUnit);
unsigned int m_calcAllUnused();
// ---------------------------------------------------------------------------------------------------------------------------------
// Logging and reporting
// ---------------------------------------------------------------------------------------------------------------------------------
void m_dumpAllocUnit(const sAllocUnit *allocUnit, const char *prefix = "");
void m_dumpMemoryReport(const char *filename = "memreport.log", const bool overwrite = true);
sMStats m_getMemoryStatistics();
// ---------------------------------------------------------------------------------------------------------------------------------
// Variations of global operators new & delete
// ---------------------------------------------------------------------------------------------------------------------------------
void *operator new(size_t reportedSize);
void *operator new[](size_t reportedSize);
void *operator new(size_t reportedSize, const char *sourceFile, int sourceLine);
void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine);
void operator delete(void *reportedAddress);
void operator delete[](void *reportedAddress);
#endif // _H_MMGR
// ---------------------------------------------------------------------------------------------------------------------------------
// Macros -- "Kids, please don't try this at home. We're trained professionals here." :)
// ---------------------------------------------------------------------------------------------------------------------------------
#include "nommgr.h"
#define new (m_setOwner (__FILE__,__LINE__,__FUNCTION__),false) ? NULL : new
#define delete (m_setOwner (__FILE__,__LINE__,__FUNCTION__),false) ? m_setOwner("",0,"") : delete
#define malloc(sz) m_allocator (__FILE__,__LINE__,__FUNCTION__,m_alloc_malloc,sz)
#define calloc(sz) m_allocator (__FILE__,__LINE__,__FUNCTION__,m_alloc_calloc,sz)
#define realloc(ptr,sz) m_reallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_realloc,sz,ptr)
#define free(ptr) m_deallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_free,ptr)
// ---------------------------------------------------------------------------------------------------------------------------------
// mmgr.h - End of file
// ---------------------------------------------------------------------------------------------------------------------------------

39
amxmodx/mmgr/nommgr.h Executable file
View File

@ -0,0 +1,39 @@
// ---------------------------------------------------------------------------------------------------------------------------------
// Copyright 2000, Paul Nettle. All rights reserved.
//
// You are free to use this source code in any commercial or non-commercial product.
//
// nommgr.h - Memory manager & tracking software
//
// The most recent version of this software can be found at: ftp://ftp.GraphicsPapers.com/pub/ProgrammingTools/MemoryManagers/
//
// [NOTE: Best when viewed with 8-character tabs]
// ---------------------------------------------------------------------------------------------------------------------------------
#ifdef new
#undef new
#endif
#ifdef delete
#undef delete
#endif
#ifdef malloc
#undef malloc
#endif
#ifdef calloc
#undef calloc
#endif
#ifdef realloc
#undef realloc
#endif
#ifdef free
#undef free
#endif
// ---------------------------------------------------------------------------------------------------------------------------------
// nommgr.h - End of file
// ---------------------------------------------------------------------------------------------------------------------------------

File diff suppressed because it is too large Load Diff

View File

@ -144,7 +144,7 @@ struct pfnmodule_engine_g {
const char* (*pfnget_amxscriptname)(AMX* amx); // amx const char* (*pfnget_amxscriptname)(AMX* amx); // amx
char* (*pfnget_amxstring)(AMX*,cell,int, int&); // amx, src, buffer (0-3), len char* (*pfnget_amxstring)(AMX*,cell,int, int&); // amx, src, buffer (0-3), len
void (*pfnget_modname)(char*); // modname void (*pfnget_modname)(char*); // modname
int (*pfnload_amxscript)(AMX*, void**, const char*, char[64]); // amx, code, path, error info int (*pfnload_amxscript)(AMX*, void**, const char*, char[64], int); // amx, code, path, error info
void (*pfnprint_console)(char*, ...); // format, .... void (*pfnprint_console)(char*, ...); // format, ....
void (*pfnreport_error)(int code, char*, ... ); void (*pfnreport_error)(int code, char*, ... );
int (*pfnset_amxnatives)(AMX*,char[64]); // amx, error info int (*pfnset_amxnatives)(AMX*,char[64]); // amx, error info

12
amxmodx/msvc/.cvsignore Executable file
View File

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

804
amxmodx/msvc/amxmodx.vcproj Executable file
View File

@ -0,0 +1,804 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="amxmodx"
ProjectGUID="{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
SccProjectName=""
SccLocalPath="">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\Debug"
IntermediateDirectory=".\Debug"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\dlls&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\engine&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\common&quot;;C:\Files\Programming\metamod\metamod"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
StructMemberAlignment="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\debug/amxmodx.pch"
AssemblerListingLocation=".\debug/"
ObjectFile=".\debug/"
ProgramDataBaseFileName=".\debug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
OutputFile="debug/amxmodx_mm.dll"
Version="0.1"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\debug/amxx_mm.pdb"
ImportLibrary=".\debug/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\release/amxmodx.pch"
AssemblerListingLocation=".\release/"
ObjectFile=".\release/"
ProgramDataBaseFileName=".\release/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
OutputFile="release/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\release/amxx_mm.pdb"
ImportLibrary=".\release/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="MemtestDebug|Win32"
OutputDirectory="MemtestDebug"
IntermediateDirectory="MemtestDebug"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\dlls&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\engine&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\common&quot;;C:\Files\Programming\metamod\metamod"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
StructMemberAlignment="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\memtestdebug/amxmodx.pch"
AssemblerListingLocation=".\memtestdebug/"
ObjectFile=".\memtestdebug/"
ProgramDataBaseFileName=".\memtestdebug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
OutputFile="memtestdebug/amxmodx_mm.dll"
Version="0.1"
LinkIncremental="2"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\memtestdebug/amxx_mm.pdb"
ImportLibrary=".\memtestdebug/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="MemtestRelease|Win32"
OutputDirectory="MemtestRelease"
IntermediateDirectory="MemtestRelease"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\memtestrelease/amxmodx.pch"
AssemblerListingLocation=".\memtestrelease/"
ObjectFile=".\memtestrelease/"
ProgramDataBaseFileName=".\memtestrelease/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
OutputFile="memtestrelease/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\memtestrelease/amxx_mm.pdb"
ImportLibrary=".\memtestrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="JITDebug|Win32"
OutputDirectory="JITDebug"
IntermediateDirectory="JITDebug"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\dlls&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\engine&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\common&quot;;C:\Files\Programming\metamod\metamod"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
StructMemberAlignment="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitdebug/amxmodx.pch"
AssemblerListingLocation=".\jitdebug/"
ObjectFile=".\jitdebug/"
ProgramDataBaseFileName=".\jitdebug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
OutputFile="jitdebug/amxmodx_mm.dll"
Version="0.1"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
ImportLibrary=".\jitdebug/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="JITRelease|Win32"
OutputDirectory="JITRelease"
IntermediateDirectory="JITRelease"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitrelease/amxmodx.pch"
AssemblerListingLocation=".\jitrelease/"
ObjectFile=".\jitrelease/"
ProgramDataBaseFileName=".\jitrelease/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="..\jit\jits.obj ..\zlib\zlib.lib"
OutputFile="jitrelease/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\jitrelease/amxx_mm.pdb"
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="JITMemtestRelease|Win32"
OutputDirectory="JITMemtestRelease"
IntermediateDirectory="JITMemtestRelease"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST;JIT"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitmemtestrelease/amxmodx.pch"
AssemblerListingLocation=".\jitmemtestrelease/"
ObjectFile=".\jitmemtestrelease/"
ProgramDataBaseFileName=".\jitmemtestrelease/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
OutputFile="jitmemtestrelease/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\jitmemtestrelease/amxx_mm.pdb"
ImportLibrary=".\jitmemtestrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="MaximalSpeed|Win32"
OutputDirectory="MaximalSpeed"
IntermediateDirectory="MaximalSpeed"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
EnableIntrinsicFunctions="TRUE"
FavorSizeOrSpeed="1"
OptimizeForProcessor="2"
OptimizeForWindowsApplication="TRUE"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\MaximalSpeed/amxmodx.pch"
AssemblerListingLocation=".\MaximalSpeed/"
ObjectFile=".\MaximalSpeed/"
ProgramDataBaseFileName=".\MaximalSpeed/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
OutputFile="MaximalSpeed/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\MaximalSpeede/amxx_mm.pdb"
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File
RelativePath="..\amx.cpp">
</File>
<File
RelativePath="..\amxcore.cpp">
</File>
<File
RelativePath="..\amxmodx.cpp">
</File>
<File
RelativePath="..\amxtime.cpp">
</File>
<File
RelativePath="..\amxxfile.cpp">
</File>
<File
RelativePath="..\amxxlog.cpp">
</File>
<File
RelativePath="..\CCmd.cpp">
</File>
<File
RelativePath="..\CEvent.cpp">
</File>
<File
RelativePath="..\CFile.cpp">
</File>
<File
RelativePath="..\CForward.cpp">
</File>
<File
RelativePath="..\CLang.cpp">
</File>
<File
RelativePath="..\CLogEvent.cpp">
</File>
<File
RelativePath="..\CMenu.cpp">
</File>
<File
RelativePath="..\CMisc.cpp">
</File>
<File
RelativePath="..\CModule.cpp">
</File>
<File
RelativePath="..\CPlugin.cpp">
</File>
<File
RelativePath="..\CTask.cpp">
</File>
<File
RelativePath="..\CVault.cpp">
</File>
<File
RelativePath="..\emsg.cpp">
</File>
<File
RelativePath="..\fakemeta.cpp">
<FileConfiguration
Name="MemtestDebug|Win32">
<Tool
Name="VCCLCompilerTool"
GeneratePreprocessedFile="0"/>
</FileConfiguration>
</File>
<File
RelativePath="..\file.cpp">
</File>
<File
RelativePath="..\float.cpp">
</File>
<File
RelativePath="..\md5.cpp">
</File>
<File
RelativePath="..\meta_api.cpp">
</File>
<File
RelativePath="..\modules.cpp">
</File>
<File
RelativePath="..\power.cpp">
</File>
<File
RelativePath="..\srvcmd.cpp">
</File>
<File
RelativePath="..\string.cpp">
</File>
<File
RelativePath="..\strptime.cpp">
</File>
<File
RelativePath="..\util.cpp">
</File>
<File
RelativePath="..\vault.cpp">
</File>
<Filter
Name="mmgr"
Filter="">
<File
RelativePath="..\mmgr\mmgr.cpp">
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="JITDebug|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="JITRelease|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="MaximalSpeed|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
</File>
</Filter>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl">
<File
RelativePath="..\amx.h">
</File>
<File
RelativePath="..\amxmodx.h">
</File>
<File
RelativePath="..\amxxfile.h">
</File>
<File
RelativePath="..\amxxlog.h">
</File>
<File
RelativePath="..\CCmd.h">
</File>
<File
RelativePath="..\CEvent.h">
</File>
<File
RelativePath="..\CFile.h">
</File>
<File
RelativePath="..\CForward.h">
</File>
<File
RelativePath="..\CLang.h">
</File>
<File
RelativePath="..\CList.h">
</File>
<File
RelativePath="..\CLogEvent.h">
</File>
<File
RelativePath="..\CMenu.h">
</File>
<File
RelativePath="..\CMisc.h">
</File>
<File
RelativePath="..\CModule.h">
</File>
<File
RelativePath="..\CPlugin.h">
</File>
<File
RelativePath="..\CQueue.h">
</File>
<File
RelativePath="..\CRList.h">
</File>
<File
RelativePath="..\CString.h">
</File>
<File
RelativePath="..\CTask.h">
</File>
<File
RelativePath="..\CVault.h">
</File>
<File
RelativePath="..\CVector.h">
</File>
<File
RelativePath="..\fakemeta.h">
</File>
<File
RelativePath="..\md5.h">
</File>
<File
RelativePath="..\modules.h">
</File>
<Filter
Name="mmgr"
Filter="">
<File
RelativePath="..\mmgr\mmgr.h">
</File>
<File
RelativePath="..\mmgr\nommgr.h">
</File>
</Filter>
</Filter>
<Filter
Name="Resource Files"
Filter="rc">
<File
RelativePath="..\version.rc">
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,4 +1,4 @@
LIBRARY amx_mm LIBRARY amxx_mm
EXPORTS EXPORTS
GiveFnptrsToDll @1 GiveFnptrsToDll @1

View File

@ -1,24 +1,24 @@
# Microsoft Developer Studio Project File - Name="amxmod_mm" - Package Owner=<4> # Microsoft Developer Studio Project File - Name="amxmodx_mm" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00 # Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT ** # ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=amxmod_mm - Win32 Debug CFG=amxmodx_mm - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run !MESSAGE use the Export Makefile command and run
!MESSAGE !MESSAGE
!MESSAGE NMAKE /f "amxmod_mm.mak". !MESSAGE NMAKE /f "amxmodx_mm.mak".
!MESSAGE !MESSAGE
!MESSAGE You can specify a configuration when running NMAKE !MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE !MESSAGE
!MESSAGE NMAKE /f "amxmod_mm.mak" CFG="amxmod_mm - Win32 Debug" !MESSAGE NMAKE /f "amxmodx_mm.mak" CFG="amxmodx_mm - Win32 Debug"
!MESSAGE !MESSAGE
!MESSAGE Possible choices for configuration are: !MESSAGE Possible choices for configuration are:
!MESSAGE !MESSAGE
!MESSAGE "amxmod_mm - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "amxmodx_mm - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "amxmod_mm - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "amxmodx_mm - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE !MESSAGE
# Begin Project # Begin Project
@ -29,7 +29,7 @@ CPP=cl.exe
MTL=midl.exe MTL=midl.exe
RSC=rc.exe RSC=rc.exe
!IF "$(CFG)" == "amxmod_mm - Win32 Release" !IF "$(CFG)" == "amxmodx_mm - Win32 Release"
# PROP BASE Use_MFC 0 # PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0 # PROP BASE Use_Debug_Libraries 0
@ -42,8 +42,8 @@ RSC=rc.exe
# PROP Intermediate_Dir "release" # PROP Intermediate_Dir "release"
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "amxmod_mm_EXPORTS" /YX /FD /c # 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 "amxmod_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 BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD BASE RSC /l 0x409 /d "NDEBUG"
@ -53,11 +53,11 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe 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 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:".\amxmod_mm.def" /out:"release/amx_mm.dll" /libpath:"..\extra\lib_win32" # 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 # Begin Custom Build
TargetPath=.\release\amx_mm.dll TargetPath=.\release\amxx_mm.dll
TargetName=amx_mm TargetName=amxx_mm
InputPath=.\release\amx_mm.dll InputPath=.\release\amxx_mm.dll
SOURCE="$(InputPath)" SOURCE="$(InputPath)"
"$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" "$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
@ -65,7 +65,7 @@ SOURCE="$(InputPath)"
# End Custom Build # End Custom Build
!ELSEIF "$(CFG)" == "amxmod_mm - Win32 Debug" !ELSEIF "$(CFG)" == "amxmodx_mm - Win32 Debug"
# PROP BASE Use_MFC 0 # PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1 # PROP BASE Use_Debug_Libraries 1
@ -78,8 +78,8 @@ SOURCE="$(InputPath)"
# PROP Intermediate_Dir "debug" # PROP Intermediate_Dir "debug"
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "amxmod_mm_EXPORTS" /YX /FD /GZ /c # 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 "amxmod_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 BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD BASE RSC /l 0x409 /d "_DEBUG"
@ -89,12 +89,12 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe 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 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:".\amxmod_mm.def" /out:"debug/amx_mm.dll" /pdbtype:sept /libpath:"..\extra\lib_win32" # 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 # SUBTRACT LINK32 /incremental:no /nodefaultlib
# Begin Custom Build # Begin Custom Build
TargetPath=.\debug\amx_mm.dll TargetPath=.\debug\amxx_mm.dll
TargetName=amx_mm TargetName=amxx_mm
InputPath=.\debug\amx_mm.dll InputPath=.\debug\amxx_mm.dll
SOURCE="$(InputPath)" SOURCE="$(InputPath)"
"$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" "$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
@ -106,8 +106,8 @@ SOURCE="$(InputPath)"
# Begin Target # Begin Target
# Name "amxmod_mm - Win32 Release" # Name "amxmodx_mm - Win32 Release"
# Name "amxmod_mm - Win32 Debug" # Name "amxmodx_mm - Win32 Debug"
# Begin Group "Source Files" # Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
@ -121,7 +121,7 @@ SOURCE=..\amxcore.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\amxmod.cpp SOURCE=..\amxmodx.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -129,6 +129,10 @@ SOURCE=..\amxtime.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\amxxlog.cpp
# End Source File
# Begin Source File
SOURCE=..\CCmd.cpp SOURCE=..\CCmd.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -225,7 +229,7 @@ SOURCE=..\vault.cpp
# PROP Default_Filter "h;hpp;hxx;hm;inl" # PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File # Begin Source File
SOURCE=..\amxmod.h SOURCE=..\amxmodx.h
# End Source File # End Source File
# Begin Source File # Begin Source File

29
amxmodx/msvc/amxmodx_mm.dsw Executable file
View File

@ -0,0 +1,29 @@
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>
{{{
}}}
###############################################################################

804
amxmodx/msvc/amxmodx_mm.vcproj Executable file
View File

@ -0,0 +1,804 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="amxmodx"
ProjectGUID="{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
SccProjectName=""
SccLocalPath="">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\Debug"
IntermediateDirectory=".\Debug"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\dlls&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\engine&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\common&quot;;C:\Files\Programming\metamod\metamod"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
StructMemberAlignment="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\debug/amxmodx.pch"
AssemblerListingLocation=".\debug/"
ObjectFile=".\debug/"
ProgramDataBaseFileName=".\debug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
OutputFile="debug/amxmodx_mm.dll"
Version="0.1"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\debug/amxx_mm.pdb"
ImportLibrary=".\debug/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\release/amxmodx.pch"
AssemblerListingLocation=".\release/"
ObjectFile=".\release/"
ProgramDataBaseFileName=".\release/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
OutputFile="release/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\release/amxx_mm.pdb"
ImportLibrary=".\release/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="MemtestDebug|Win32"
OutputDirectory="MemtestDebug"
IntermediateDirectory="MemtestDebug"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\dlls&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\engine&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\common&quot;;C:\Files\Programming\metamod\metamod"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
StructMemberAlignment="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\memtestdebug/amxmodx.pch"
AssemblerListingLocation=".\memtestdebug/"
ObjectFile=".\memtestdebug/"
ProgramDataBaseFileName=".\memtestdebug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
OutputFile="memtestdebug/amxmodx_mm.dll"
Version="0.1"
LinkIncremental="2"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\memtestdebug/amxx_mm.pdb"
ImportLibrary=".\memtestdebug/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="MemtestRelease|Win32"
OutputDirectory="MemtestRelease"
IntermediateDirectory="MemtestRelease"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\memtestrelease/amxmodx.pch"
AssemblerListingLocation=".\memtestrelease/"
ObjectFile=".\memtestrelease/"
ProgramDataBaseFileName=".\memtestrelease/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
OutputFile="memtestrelease/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\memtestrelease/amxx_mm.pdb"
ImportLibrary=".\memtestrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="JITDebug|Win32"
OutputDirectory="JITDebug"
IntermediateDirectory="JITDebug"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\dlls&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\engine&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\common&quot;;C:\Files\Programming\metamod\metamod"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
StructMemberAlignment="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitdebug/amxmodx.pch"
AssemblerListingLocation=".\jitdebug/"
ObjectFile=".\jitdebug/"
ProgramDataBaseFileName=".\jitdebug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
OutputFile="jitdebug/amxmodx_mm.dll"
Version="0.1"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
ImportLibrary=".\jitdebug/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="JITRelease|Win32"
OutputDirectory="JITRelease"
IntermediateDirectory="JITRelease"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitrelease/amxmodx.pch"
AssemblerListingLocation=".\jitrelease/"
ObjectFile=".\jitrelease/"
ProgramDataBaseFileName=".\jitrelease/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="..\jit\jits.obj ..\zlib\zlib.lib"
OutputFile="jitrelease/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\jitrelease/amxx_mm.pdb"
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="JITMemtestRelease|Win32"
OutputDirectory="JITMemtestRelease"
IntermediateDirectory="JITMemtestRelease"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST;JIT"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitmemtestrelease/amxmodx.pch"
AssemblerListingLocation=".\jitmemtestrelease/"
ObjectFile=".\jitmemtestrelease/"
ProgramDataBaseFileName=".\jitmemtestrelease/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
OutputFile="jitmemtestrelease/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\jitmemtestrelease/amxx_mm.pdb"
ImportLibrary=".\jitmemtestrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="MaximalSpeed|Win32"
OutputDirectory="MaximalSpeed"
IntermediateDirectory="MaximalSpeed"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
EnableIntrinsicFunctions="TRUE"
FavorSizeOrSpeed="1"
OptimizeForProcessor="2"
OptimizeForWindowsApplication="TRUE"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\MaximalSpeed/amxmodx.pch"
AssemblerListingLocation=".\MaximalSpeed/"
ObjectFile=".\MaximalSpeed/"
ProgramDataBaseFileName=".\MaximalSpeed/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
OutputFile="MaximalSpeed/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\MaximalSpeede/amxx_mm.pdb"
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File
RelativePath="..\amx.cpp">
</File>
<File
RelativePath="..\amxcore.cpp">
</File>
<File
RelativePath="..\amxmodx.cpp">
</File>
<File
RelativePath="..\amxtime.cpp">
</File>
<File
RelativePath="..\amxxfile.cpp">
</File>
<File
RelativePath="..\amxxlog.cpp">
</File>
<File
RelativePath="..\CCmd.cpp">
</File>
<File
RelativePath="..\CEvent.cpp">
</File>
<File
RelativePath="..\CFile.cpp">
</File>
<File
RelativePath="..\CForward.cpp">
</File>
<File
RelativePath="..\CLang.cpp">
</File>
<File
RelativePath="..\CLogEvent.cpp">
</File>
<File
RelativePath="..\CMenu.cpp">
</File>
<File
RelativePath="..\CMisc.cpp">
</File>
<File
RelativePath="..\CModule.cpp">
</File>
<File
RelativePath="..\CPlugin.cpp">
</File>
<File
RelativePath="..\CTask.cpp">
</File>
<File
RelativePath="..\CVault.cpp">
</File>
<File
RelativePath="..\emsg.cpp">
</File>
<File
RelativePath="..\fakemeta.cpp">
<FileConfiguration
Name="MemtestDebug|Win32">
<Tool
Name="VCCLCompilerTool"
GeneratePreprocessedFile="0"/>
</FileConfiguration>
</File>
<File
RelativePath="..\file.cpp">
</File>
<File
RelativePath="..\float.cpp">
</File>
<File
RelativePath="..\md5.cpp">
</File>
<File
RelativePath="..\meta_api.cpp">
</File>
<File
RelativePath="..\modules.cpp">
</File>
<File
RelativePath="..\power.cpp">
</File>
<File
RelativePath="..\srvcmd.cpp">
</File>
<File
RelativePath="..\string.cpp">
</File>
<File
RelativePath="..\strptime.cpp">
</File>
<File
RelativePath="..\util.cpp">
</File>
<File
RelativePath="..\vault.cpp">
</File>
<Filter
Name="mmgr"
Filter="">
<File
RelativePath="..\mmgr\mmgr.cpp">
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="JITDebug|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="JITRelease|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="MaximalSpeed|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
</File>
</Filter>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl">
<File
RelativePath="..\amx.h">
</File>
<File
RelativePath="..\amxmodx.h">
</File>
<File
RelativePath="..\amxxfile.h">
</File>
<File
RelativePath="..\amxxlog.h">
</File>
<File
RelativePath="..\CCmd.h">
</File>
<File
RelativePath="..\CEvent.h">
</File>
<File
RelativePath="..\CFile.h">
</File>
<File
RelativePath="..\CForward.h">
</File>
<File
RelativePath="..\CLang.h">
</File>
<File
RelativePath="..\CList.h">
</File>
<File
RelativePath="..\CLogEvent.h">
</File>
<File
RelativePath="..\CMenu.h">
</File>
<File
RelativePath="..\CMisc.h">
</File>
<File
RelativePath="..\CModule.h">
</File>
<File
RelativePath="..\CPlugin.h">
</File>
<File
RelativePath="..\CQueue.h">
</File>
<File
RelativePath="..\CRList.h">
</File>
<File
RelativePath="..\CString.h">
</File>
<File
RelativePath="..\CTask.h">
</File>
<File
RelativePath="..\CVault.h">
</File>
<File
RelativePath="..\CVector.h">
</File>
<File
RelativePath="..\fakemeta.h">
</File>
<File
RelativePath="..\md5.h">
</File>
<File
RelativePath="..\modules.h">
</File>
<Filter
Name="mmgr"
Filter="">
<File
RelativePath="..\mmgr\mmgr.h">
</File>
<File
RelativePath="..\mmgr\nommgr.h">
</File>
</Filter>
</Filter>
<Filter
Name="Resource Files"
Filter="rc">
<File
RelativePath="..\version.rc">
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -5,6 +5,12 @@
* Copyright (c) ITB CompuPhase, 1998, 1999 * Copyright (c) ITB CompuPhase, 1998, 1999
* This file may be freely used. No warranties of any kind. * This file may be freely used. No warranties of any kind.
*/ */
// this file does not include amxmodx.h, so we have to include the memory manager here
#ifdef MEMORY_TEST
#include "mmgr/mmgr.h"
#endif // MEMORY_TEST
#include "amx.h" #include "amx.h"
static cell power(AMX *amx, cell *params) static cell power(AMX *amx, cell *params)

3015
amxmodx/sdk/amxxmodule.cpp Executable file

File diff suppressed because it is too large Load Diff

2197
amxmodx/sdk/amxxmodule.h Executable file

File diff suppressed because it is too large Load Diff

34
amxmodx/sdk/howto.txt Executable file
View File

@ -0,0 +1,34 @@
**** HOWTO MAKE A MODULE ****
* STEP 1
Download the AMXX Sdk, and place all files into your module source dir.
Don't edit amxxmodule.h or amxxmodule.cpp
Go through the moduleconfig.h file and do what it says
If you want to have natives in your module, uncomment line 30
( // #define FN_AMXX_ATTACH OnAmxxAttach )
If you want to have forwards in your module, uncomment line 35
( // #define FN_AMXX_PLUGINSLOADED OnPluginsLoaded )
If you want your module to use metamod, uncomment line 22
( // #define USE_METAMOD ) and set up metamod hooks (starting an line 54)
You only have to uncomment the line (you may change the function name if you want to).
* STEP 2
Add an another source file.
At the beginning, add the short GPL and
#include "amxxmodule.h"
If you have uncommented any hooks in moduleconfig.h (metamod hooks or Metamod init functions or amxx init functions),
define the functions here (or you will get unresolved externals).
If you want native functions, add a call to MF_AddNatives into the OnAmxxAttach function.
If you want forward functions add (a) call(s) to MF_RegisterForward into the OnPluginsLoaded function.
* NOTES
Include files order in your cpp file(s):
standard files
amxxmodule.h
your files
Example:
#include <stdlib.h>
#include <string>
#include <stdio.h>
#include "amxxmodule.h"
#include "mymoduleutils.h"

462
amxmodx/sdk/moduleconfig.h Executable file
View File

@ -0,0 +1,462 @@
// Configuration
#ifndef __MODULECONFIG_H__
#define __MODULECONFIG_H__
// Module info
#define MODULE_NAME "--ENTER NAME HERE--"
#define MODULE_VERSION "--ENTER VERSION HERE--"
#define MODULE_AUTHOR "--ENTER AUTHOR HERE--"
#define MODULE_URL "--ENTER URL HERE--"
#define MODULE_LOGTAG "--ENTER LOGTAG HERE--"
// 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 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

@ -29,9 +29,7 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "amxmod.h"
void amx_command(){ void amx_command(){
@ -64,6 +62,18 @@ void amx_command(){
++a; ++a;
} }
a = g_plugins.begin();
while (a)
{
if ( (*a).getStatusCode() == ps_bad_load )
{
//error
print_srvconsole("Load fails: %s\n", (*a).getError());
}
++a;
}
print_srvconsole( "%d plugins, %d running\n",plugins,running ); print_srvconsole( "%d plugins, %d running\n",plugins,running );
} }
@ -140,18 +150,26 @@ void amx_command(){
print_srvconsole( "%s %s\n", Plugin_info.name, Plugin_info.version); print_srvconsole( "%s %s\n", Plugin_info.name, Plugin_info.version);
print_srvconsole( "author: %s (%s)\n", Plugin_info.author, Plugin_info.url); print_srvconsole( "author: %s (%s)\n", Plugin_info.author, Plugin_info.url);
print_srvconsole( "compiled: %s\n", __DATE__ ", " __TIME__); print_srvconsole( "compiled: %s\n", __DATE__ ", " __TIME__);
#ifdef JIT
print_srvconsole( "Core mode: JIT\n");
#else
#ifdef ASM32
print_srvconsole( "Core mode: ASM\n");
#else
print_srvconsole( "Core mode: Normal\n");
#endif
#endif
} }
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 %-7.8s %-8.7s %-20.19s %-11.10s\n", print_srvconsole( " %-23.22s %-8.7s %-20.19s %-11.10s\n",
"name","type","version", "author", "status"); "name", "version", "author", "status");
int running = 0; int running = 0;
int modules = 0; int modules = 0;
CList<CModule>::iterator a = g_modules.begin(); CList<CModule,const char *>::iterator a = g_modules.begin();
while ( a ) while ( a )
{ {
@ -160,13 +178,70 @@ void amx_command(){
++modules; ++modules;
print_srvconsole( " [%2d] %-23.22s %-7.6s %-8.7s %-20.19s %-11.10s\n",modules, print_srvconsole( " [%2d] %-23.22s %-8.7s %-20.19s %-11.10s\n", modules,
(*a).getName(), (*a).getType(), (*a).getVersion(), (*a).getAuthor() , (*a).getStatus() ); (*a).getName(), (*a).getVersion(), (*a).getAuthor() , (*a).getStatus() );
++a; ++a;
} }
print_srvconsole( "%d modules, %d correct\n",modules,running); print_srvconsole( "%d modules, %d correct\n",modules,running);
} else if (!strcmp(cmd, "gpl"))
{
print_srvconsole("AMX Mod X\n");
print_srvconsole("\n");
print_srvconsole(" by the AMX Mod X Development Team\n");
print_srvconsole(" originally developed by OLO\n");
print_srvconsole("\n");
print_srvconsole("\n");
print_srvconsole(" This program is free software; you can redistribute it and/or modify it\n");
print_srvconsole(" under the terms of the GNU General Public License as published by the\n");
print_srvconsole(" Free Software Foundation; either version 2 of the License, or (at\n");
print_srvconsole(" your option) any later version.\n");
print_srvconsole("\n");
print_srvconsole(" This program is distributed in the hope that it will be useful, but\n");
print_srvconsole(" WITHOUT ANY WARRANTY; without even the implied warranty of\n");
print_srvconsole(" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n");
print_srvconsole(" General Public License for more details.\n");
print_srvconsole("\n");
print_srvconsole(" You should have received a copy of the GNU General Public License\n");
print_srvconsole(" along with this program; if not, write to the Free Software Foundation,\n");
print_srvconsole(" Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n");
print_srvconsole("\n");
print_srvconsole(" In addition, as a special exception, the author gives permission to\n");
print_srvconsole(" link the code of this program with the Half-Life Game Engine (\"HL\n");
print_srvconsole(" Engine\") and Modified Game Libraries (\"MODs\") developed by Valve,\n");
print_srvconsole(" L.L.C (\"Valve\"). You must obey the GNU General Public License in all\n");
print_srvconsole(" respects for all of the code used other than the HL Engine and MODs\n");
print_srvconsole(" from Valve. If you modify this file, you may extend this exception\n");
print_srvconsole(" to your version of the file, but you are not obligated to do so. If\n");
print_srvconsole(" you do not wish to do so, delete this exception statement from your\n");
print_srvconsole(" version.\n");
print_srvconsole("\n");
}
else if (!strcmp(cmd, "\x74\x75\x72\x74\x6C\x65")) // !! Hidden Command :D !!
{
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2E\x2E\x3A\x3A\x3E\x3E\x3A\x3A\x3B\x3E\x5E\x27\x2E\x27\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x27\x3A\x3A\x3F\x3D\x3E\x3E\x3E\x3E\x3E\x3D\x3F\x3E\x78\x2B\x3F\x3E\x3E\x3E\x3D\x3E\x3F\x2B\x3F\x3E\x3B\x2E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x2E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x27\x2C\x3A\x3E\x3B\x3F\x3D\x3E\x3B\x2E\x27\x5E\x5E\x3B\x3B\x2C\x3A\x3F\x3F\x3D\x78\x3F\x3B\x3E\x3A\x3B\x3A\x5E\x3B\x3D\x3E\x2B\x2B\x2B\x2B\x3D\x2C\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x2C\x3E\x37\x24\x24\x78\x3D\x3D\x3D\x3F\x3A\x27\x20\x20\x20\x20\x20\x20\x20\x2E\x3A\x3B\x3D\x3E\x3A\x3A\x3A\x3A\x3F\x3F\x3F\x3E\x5E\x2C\x2E\x2E\x2C\x2C\x2C\x2C\x3A\x3B\x3D\x3D\x3B\x5E\x2C\x2C\x2C\x3A\x5E\x3A\x3F\x3F\x3E\x3D\x3D\x3E\x3E\x2B\x3B\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
print_srvconsole("\x2C\x3D\x2B\x3E\x2C\x5E\x3D\x79\x24\x33\x78\x33\x24\x5A\x24\x3B\x20\x20\x3A\x3E\x2B\x3E\x3D\x3F\x5E\x2C\x2C\x2C\x5E\x5E\x3E\x3D\x3E\x3B\x3B\x3A\x5E\x5E\x3E\x3F\x3D\x2B\x37\x3D\x3F\x3E\x3E\x3E\x3F\x3D\x3F\x3F\x3D\x3D\x3D\x3D\x3E\x3F\x3D\x3E\x3E\x3E\x3D\x5A\x78\x3E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
print_srvconsole("\x3D\x5A\x24\x37\x78\x66\x68\x78\x5A\x5A\x24\x79\x79\x71\x23\x23\x4D\x71\x3B\x3A\x3B\x3A\x3E\x3B\x3B\x2C\x5E\x3E\x3F\x3D\x3F\x3A\x2C\x2C\x3A\x3B\x3B\x3E\x3E\x3D\x2B\x3D\x3E\x3D\x3B\x3A\x3E\x3D\x2B\x3D\x2B\x37\x2B\x3D\x2B\x37\x37\x2B\x2B\x33\x33\x33\x37\x37\x24\x5A\x79\x3A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x5E\x2B\x5A\x2B\x3E\x3D\x37\x5A\x66\x40\x40\x23\x40\x48\x23\x23\x23\x38\x5E\x3B\x3D\x3F\x2B\x3E\x3B\x3E\x5E\x5E\x2C\x27\x2E\x27\x2E\x2E\x5E\x3F\x3D\x3D\x3F\x3A\x3B\x3A\x3A\x3A\x5E\x5E\x3E\x3E\x3F\x3D\x37\x37\x3D\x3D\x37\x2B\x3D\x37\x2B\x37\x78\x24\x79\x38\x68\x45\x48\x79\x3E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x2C\x3E\x3E\x78\x33\x68\x48\x23\x23\x40\x40\x48\x45\x66\x33\x20\x2C\x3A\x3E\x3E\x3E\x3B\x3B\x3A\x3A\x2C\x2E\x2C\x5E\x3A\x2C\x5E\x3B\x3E\x37\x37\x3F\x3B\x3A\x2E\x3A\x3A\x3B\x3D\x3B\x3B\x3D\x2B\x3D\x78\x33\x37\x3E\x3D\x3D\x2B\x37\x2B\x78\x78\x78\x78\x5A\x66\x71\x68\x38\x45\x27\x20\x20\x20\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x3A\x37\x37\x24\x66\x71\x45\x45\x71\x45\x3A\x3A\x2C\x5E\x3A\x3E\x3A\x3A\x3B\x3B\x5E\x3A\x2C\x5E\x5E\x2C\x2C\x5E\x3A\x3E\x2B\x33\x3D\x3E\x3A\x3A\x3A\x3D\x2B\x2B\x3D\x3F\x3F\x37\x37\x2B\x37\x3D\x3D\x5A\x33\x78\x33\x37\x78\x24\x5A\x33\x37\x38\x40\x71\x38\x66\x40\x2C\x20\x20\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x2B\x5A\x45\x40\x5E\x5E\x5E\x3A\x2C\x3A\x3B\x3E\x3A\x5E\x5E\x2C\x2E\x2E\x2C\x5E\x3B\x3B\x3A\x2B\x3E\x3F\x3B\x3F\x3F\x3F\x3F\x3E\x3F\x3D\x37\x3B\x3B\x3D\x33\x2B\x3D\x3D\x78\x78\x5A\x78\x33\x78\x5A\x5A\x5A\x24\x71\x48\x79\x5A\x24\x79\x45\x3E\x20\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x27\x3B\x2C\x2C\x27\x5E\x5E\x2C\x3A\x5E\x3A\x3A\x5E\x3A\x3B\x3F\x3E\x3F\x3E\x3B\x3E\x3E\x3F\x3D\x2B\x37\x37\x2B\x2B\x3D\x2B\x37\x2B\x37\x37\x2B\x3B\x3D\x33\x2B\x2B\x37\x37\x2B\x3D\x78\x78\x66\x78\x78\x37\x33\x66\x78\x38\x23\x23\x27\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3A\x3F\x3B\x5E\x2C\x3B\x3F\x3D\x3F\x3F\x3B\x3A\x3A\x3A\x3E\x3F\x3E\x3E\x3F\x3A\x3F\x33\x78\x78\x33\x24\x24\x33\x2B\x37\x78\x24\x78\x33\x3D\x2B\x2B\x5A\x24\x78\x24\x78\x33\x33\x24\x5A\x79\x24\x24\x24\x68\x45\x48\x38\x68\x45\x40\x3E\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2C\x3A\x3E\x3F\x37\x3D\x3E\x3F\x2B\x3F\x3F\x3E\x3F\x3F\x3F\x3D\x3F\x3E\x3F\x3D\x37\x2B\x3E\x3E\x2B\x37\x37\x33\x37\x33\x78\x33\x33\x33\x78\x37\x37\x37\x78\x5A\x78\x5A\x79\x79\x5A\x24\x79\x79\x79\x79\x79\x68\x71\x38\x38\x71\x23\x23\x45\x37\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x2B\x2B\x3F\x2B\x78\x40\x38\x3F\x3B\x3E\x3B\x3B\x3E\x3F\x37\x2B\x3F\x3F\x3D\x3D\x3E\x3F\x2B\x37\x37\x37\x37\x33\x33\x78\x78\x33\x37\x24\x5A\x78\x5A\x5A\x78\x24\x33\x3D\x37\x37\x37\x78\x24\x5A\x78\x37\x37\x78\x66\x79\x66\x71\x66\x40\x45\x40\x3A\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2B\x3A\x3F\x2B\x3D\x2B\x79\x23\x79\x3B\x2C\x3A\x3A\x3A\x37\x78\x3F\x3E\x3B\x3E\x3B\x3E\x3D\x37\x24\x33\x37\x33\x37\x78\x78\x33\x24\x68\x79\x33\x24\x78\x2B\x33\x33\x5A\x79\x24\x5A\x79\x24\x5A\x37\x24\x5A\x5A\x66\x38\x66\x79\x66\x40\x71\x45\x48\x5A\x3A\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x37\x3D\x37\x37\x33\x37\x37\x66\x45\x5A\x3F\x5E\x5E\x78\x37\x3D\x3F\x3E\x3B\x3B\x3E\x2B\x2B\x24\x78\x37\x2B\x37\x2B\x37\x78\x78\x71\x79\x33\x33\x24\x24\x78\x24\x5A\x3F\x37\x78\x24\x78\x79\x66\x5A\x78\x79\x66\x79\x68\x79\x66\x5A\x33\x3F\x3D\x3D\x20\x20\x20\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x2B\x3D\x3F\x37\x37\x78\x33\x5A\x4E\x4D\x23\x38\x33\x3F\x3E\x3B\x3E\x3B\x3D\x3D\x33\x66\x24\x78\x33\x2B\x78\x24\x5A\x24\x5A\x71\x79\x78\x33\x33\x78\x79\x5A\x5A\x33\x66\x24\x78\x78\x24\x79\x5A\x24\x79\x5A\x37\x66\x24\x3D\x3B\x66\x23\x4D\x4D\x4D\x79\x3B\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3A\x33\x37\x37\x24\x78\x66\x79\x48\x4D\x4D\x4D\x4D\x23\x71\x68\x5A\x24\x5A\x79\x68\x68\x5A\x5A\x24\x79\x66\x68\x78\x5A\x4E\x45\x66\x66\x45\x45\x45\x24\x5A\x40\x71\x68\x5A\x68\x5A\x37\x66\x79\x78\x37\x78\x37\x68\x38\x38\x71\x48\x40\x23\x45\x3A\x3D\x37\x45\x27\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x37\x37\x78\x37\x33\x38\x45\x45\x71\x20\x5E\x3D\x2B\x3F\x2B\x2B\x79\x71\x45\x48\x40\x45\x45\x45\x45\x45\x71\x40\x40\x71\x38\x38\x79\x66\x38\x68\x48\x48\x45\x66\x37\x2B\x3A\x37\x3F\x3B\x3A\x2C\x27\x2C\x27\x78\x4D\x23\x48\x48\x48\x79\x2B\x3A\x3F\x79\x27\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3A\x78\x78\x24\x40\x4E\x4E\x4D\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x3E\x3E\x3F\x3E\x3E\x3E\x3E\x3B\x3B\x3B\x3A\x3A\x3F\x3E\x3A\x2E\x2E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2E\x45\x4D\x40\x45\x78\x5E\x33\x68\x33\x2B\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x24\x48\x45\x48\x78\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2B\x4E\x40\x2B\x66\x33\x78\x20\x20\n");
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2B\x2C\x20\x3A\x20\x20\n");
} }
else else
{ {
@ -175,6 +250,7 @@ void amx_command(){
print_srvconsole("Usage: amxx < command > [ argument ]\n"); print_srvconsole("Usage: amxx < command > [ argument ]\n");
print_srvconsole("Commands:\n"); print_srvconsole("Commands:\n");
print_srvconsole(" version - display amxx version info\n"); print_srvconsole(" version - display amxx version info\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 - list cvars registered by plugins\n");
@ -182,7 +258,6 @@ void amx_command(){
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");
} }
} }
@ -208,10 +283,9 @@ void plugin_srvcmd()
if ((err = amx_Exec( (*a).getPlugin()->getAMX(), &ret , (*a).getFunction() if ((err = amx_Exec( (*a).getPlugin()->getAMX(), &ret , (*a).getFunction()
, 3 , g_srvindex , (*a).getFlags() , (*a).getId() )) != AMX_ERR_NONE) , 3 , g_srvindex , (*a).getFlags() , (*a).getId() )) != AMX_ERR_NONE)
{
UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", LogError((*a).getPlugin()->getAMX(), err, "");
err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName()); }
if ( ret ) break; if ( ret ) break;
} }
@ -221,7 +295,7 @@ void plugin_srvcmd()
#ifdef ENABLEEXEPTIONS #ifdef ENABLEEXEPTIONS
}catch( ... ) }catch( ... )
{ {
UTIL_Log( "[AMXX] fatal error at forward function execution"); AMXXLOG_Log( "[AMXX] fatal error at forward function execution");
} }
#endif #endif

View File

@ -29,10 +29,8 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include <ctype.h> #include <ctype.h>
#include "amxmod.h" #include "amxmodx.h"
const char* stristr(const char* str,const char* substr) const char* stristr(const char* str,const char* substr)
{ {
@ -57,39 +55,7 @@ const char* stristr(const char* str,const char* substr)
char* format_amxstring(AMX *amx, cell *params, int parm,int& len) char* format_amxstring(AMX *amx, cell *params, int parm,int& len)
{ {
static char buffer[2][3072]; return g_langMngr.FormatAmxString(amx, params, parm, len);
static char format[16];
char *ptr,*arg;
char *dest = *buffer;
cell *src = get_amxaddr(amx, params[parm++]);
int numparam = *params/sizeof(cell);
while(*src) {
if (*src=='%'&&*(src+1)) {
ptr = format;
*ptr++ = *src++;
if (*src=='%'){
*dest++=*src++;
continue;
}
while (!isalpha(*ptr++=*src++))
;
*ptr=0;
if (numparam < parm) continue;
arg = buffer[1];
switch(*(ptr-1)){
case 's': sprintf(arg,format,get_amxstring(amx, params[parm++],2,len)); break;
case 'f': case 'g': sprintf(arg,format,*(float*)get_amxaddr(amx, params[parm++])); break;
default: sprintf(arg,format,(int)*get_amxaddr(amx, params[parm++]));
}
while(*arg) *dest++=*arg++;
continue;
}
*dest++=*src++;
}
*dest=0;
len = dest - *buffer;
return *buffer;
} }
int amxstring_len(cell* a) int amxstring_len(cell* a)
@ -123,7 +89,7 @@ char* get_amxstring(AMX *amx,cell amx_addr,int id, int& len)
register cell* source = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr)); register cell* source = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
register char* dest = buffor[id]; register char* dest = buffor[id];
char* start = dest; char* start = dest;
while (*dest++=(char)*source++) while ((*dest++=(char)(*source++)))
; ;
len = --dest - start; len = --dest - start;
return start; return start;
@ -427,7 +393,7 @@ float fo_getargfloat(AMX *amx, int pos)
unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat; unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat;
cell value = * (cell *)(data+(int)amx->frm+(pos+3)*sizeof(cell)); cell value = * (cell *)(data+(int)amx->frm+(pos+3)*sizeof(cell));
cell number = *(cell *)(data+(int)value); cell number = *(cell *)(data+(int)value);
return *(float *)((void *)&number); return *(REAL *)((void *)&number);
} }
char* fo_getargstr(AMX *amx, int swap, int pos) char* fo_getargstr(AMX *amx, int swap, int pos)
@ -482,6 +448,119 @@ char* format_arguments(AMX *amx, int parm,int& len)
return *buffer; return *buffer;
} }
//added by BAILOPAN for jtp10181
//takes a string and breaks it into a 1st param and rest params
//different from strbreak because it's more crafted for control
static cell AMX_NATIVE_CALL amx_strtok(AMX *amx, cell *params)
{
int left_pos = 0;
int right_pos = 0;
unsigned int i = 0;
bool done_flag = false;
int len = 0;
//string[]
char *string = get_amxstring(amx, params[1], 0, len);
//left[]
char *left = new char[len+1];
//right[]
char *right = new char[len+1];
int leftMax = params[3];
int rightMax = params[5];
//token
char token = params[6];
//trim
int trim = params[7];
for (i=0; i<len; i++)
{
if (trim && !done_flag)
{
if (isspace(string[i]))
{
while (isspace(string[++i]));
done_flag = true;
}
}
if (!done_flag && string[i] == token)
{
done_flag = true;
i++;
}
if (done_flag)
{
right[right_pos++] = string[i];
} else {
left[left_pos++] = string[i];
}
}
right[right_pos] = 0;
left[left_pos] = 0;
set_amxstring(amx, params[2], left, leftMax);
set_amxstring(amx, params[4], right, rightMax);
delete [] left;
delete [] right;
return 1;
}
//added by BAILOPAN
//Takes a string and breaks it into a 1st param and rest params
//strbreak(String[], First[], FirstLen, Rest[], RestLen)
static cell AMX_NATIVE_CALL strbreak(AMX *amx, cell *params) /* 5 param */
{
bool quote_flag = false;
bool done_flag = false;
int left_pos = 0;
int right_pos = 0;
int l=0;
unsigned int i=0;
char hold = '"';
char *string = get_amxstring(amx, params[1], 0, l);
char *left = new char[strlen(string)+1];
char *right = new char[strlen(string)+1];
int LeftMax = params[3];
int RightMax = params[5];
for (i=0; i<l; i++) {
if (string[i] == '"' && !quote_flag) {
quote_flag = true;
} else if (string[i] == '"' && quote_flag) {
quote_flag = false;
}
if ((string[i] == ' ') && !quote_flag && !done_flag) {
done_flag = true;
i++;
}
if (!done_flag && string[i]!='"') {
if (left_pos < LeftMax) {
left[left_pos] = string[i];
if (left[left_pos] == '\'') {
left[left_pos] = hold;
}
left_pos++;
} else {
done_flag = true;
}
} else {
if (right_pos < RightMax && string[i]!='"') {
right[right_pos] = string[i];
if (right[right_pos] == '\'') {
right[right_pos] = hold;
}
right_pos++;
}
}
}
left[left_pos] = '\0';
right[right_pos] = '\0';
set_amxstring(amx, params[2], left, params[3]);
set_amxstring(amx, params[4], right, params[5]);
delete [] left;
delete [] right;
return 1;
}
static cell AMX_NATIVE_CALL format_args(AMX *amx, cell *params) static cell AMX_NATIVE_CALL format_args(AMX *amx, cell *params)
{ {
int len; int len;
@ -514,6 +593,54 @@ static cell AMX_NATIVE_CALL is_alpha(AMX *amx, cell *params)
return isalpha( params[1] ); return isalpha( params[1] );
} }
static cell AMX_NATIVE_CALL amx_ucfirst(AMX *amx, cell *params)
{
int len = 0;
cell *str = get_amxaddr(amx, params[1]);
if (!isalpha((char)str[0]) || !(str[0]&(1<<5)))
return 0;
str[0] &= ~(1<<5);
return 1;
}
static cell AMX_NATIVE_CALL amx_trim(AMX *amx, cell *params)
{
cell *asdf = get_amxaddr(amx, params[1]);
cell *cptr = asdf;
int len = 0;
while (*cptr++) len++;
int flag = 0, incr = 0;
register int i = 0;
for (i=len-1; i>=0; i--)
{
if (!isspace(asdf[i]))
{
break;
} else {
asdf[i] = 0;
len--;
}
}
for (i=0; i<len; i++)
{
if (isspace(asdf[i]) && !flag)
{
incr++;
if (incr+i<len)
asdf[i] = asdf[incr+i];
} else {
if (!flag)
flag = 1;
if (incr)
asdf[i] = asdf[incr+i];
}
}
asdf[len] = 0;
return incr;
}
AMX_NATIVE_INFO string_Natives[] = { AMX_NATIVE_INFO string_Natives[] = {
{ "add", add }, { "add", add },
{ "contain", contain }, { "contain", contain },
@ -532,8 +659,12 @@ AMX_NATIVE_INFO string_Natives[] = {
{ "parse", parse }, { "parse", parse },
{ "replace", replace }, { "replace", replace },
{ "setc", setc }, { "setc", setc },
{ "strbreak", strbreak},
{ "strtolower", strtolower }, { "strtolower", strtolower },
{ "strtoupper", strtoupper }, { "strtoupper", strtoupper },
{ "str_to_num", strtonum }, { "str_to_num", strtonum },
{ "trim", amx_trim },
{ "ucfirst", amx_ucfirst },
{ "strtok", amx_strtok },
{ NULL, NULL } { NULL, NULL }
}; };

View File

@ -14,6 +14,11 @@
#define strnicmp strncasecmp #define strnicmp strncasecmp
#endif #endif
// this file does not include amxmodx.h, so we have to include the memory manager here
#ifdef MEMORY_TEST
#include "mmgr/mmgr.h"
#endif // MEMORY_TEST
const char *_lc_Wday_ [2][ 7], const char *_lc_Wday_ [2][ 7],
*_lc_Month_[2][12], *_lc_Month_[2][12],
*_lc_AmPm_ [2][ 2]; *_lc_AmPm_ [2][ 2];

View File

@ -29,11 +29,9 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include <time.h> #include <time.h>
#include "amxmod.h" #include "amxmodx.h"
int UTIL_ReadFlags(const char* c) int UTIL_ReadFlags(const char* c)
{ {
@ -58,6 +56,9 @@ void UTIL_ShowMenu( edict_t* pEdict, int slots, int time, char *menu, int mlen )
char c = 0; char c = 0;
int a; int a;
if (!gmsgShowMenu)
return; // some games don't support ShowMenu (Firearms)
while ( *n ) { while ( *n ) {
a = mlen; a = mlen;
if ( a > 175 ) a = 175; if ( a > 175 ) a = 175;
@ -78,9 +79,15 @@ void UTIL_ShowMenu( edict_t* pEdict, int slots, int time, char *menu, int mlen )
/* warning - don't pass here const string */ /* warning - don't pass here const string */
void UTIL_ShowMOTD( edict_t *client , char *motd, int mlen, const char *name) void UTIL_ShowMOTD( edict_t *client , char *motd, int mlen, const char *name)
{ {
if (!gmsgMOTD)
return; // :TODO: Maybe output a warning log?
if (gmsgServerName)
{
MESSAGE_BEGIN( MSG_ONE , gmsgServerName, NULL, client ); MESSAGE_BEGIN( MSG_ONE , gmsgServerName, NULL, client );
WRITE_STRING(name); WRITE_STRING(name);
MESSAGE_END(); MESSAGE_END();
}
char *n = motd; char *n = motd;
char c = 0; char c = 0;
@ -100,9 +107,12 @@ void UTIL_ShowMOTD( edict_t *client , char *motd, int mlen, const char *name)
motd = n; motd = n;
} }
if (gmsgServerName)
{
MESSAGE_BEGIN( MSG_ONE , gmsgServerName, NULL, client ); MESSAGE_BEGIN( MSG_ONE , gmsgServerName, NULL, client );
WRITE_STRING( hostname->string ); WRITE_STRING( hostname->string );
MESSAGE_END(); MESSAGE_END();
}
} }
void UTIL_IntToString(int value, char *output) void UTIL_IntToString(int value, char *output)
@ -169,7 +179,7 @@ char* UTIL_SplitHudMessage(const char *src)
unsigned short FixedUnsigned16( float value, float scale ) unsigned short FixedUnsigned16( float value, float scale )
{ {
int output = value * scale; int output = (int)(value * scale);
if ( output < 0 ) if ( output < 0 )
output = 0; output = 0;
@ -181,7 +191,7 @@ unsigned short FixedUnsigned16( float value, float scale )
short FixedSigned16( float value, float scale ) short FixedSigned16( float value, float scale )
{ {
int output = value * scale; int output = (int)(value * scale);
if ( output > 32767 ) if ( output > 32767 )
output = 32767; output = 32767;
@ -221,9 +231,12 @@ void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pM
} }
/* warning - buffer of msg must be longer than 190 chars! /* warning - buffer of msg must be longer than 190 chars!
(here in AMX it is always longer) */ (here in AMX it is always longer) */
void UTIL_ClientPrint( edict_t *pEntity, int msg_dest, char *msg ) void UTIL_ClientPrint( edict_t *pEntity, int msg_dest, char *msg )
{ {
if (!gmsgTextMsg)
return; // :TODO: Maybe output a warning log?
char c = msg[190]; char c = msg[190];
msg[190] = 0; // truncate without checking with strlen() msg[190] = 0; // truncate without checking with strlen()
if ( pEntity ) if ( pEntity )
@ -236,97 +249,67 @@ void UTIL_ClientPrint( edict_t *pEntity, int msg_dest, char *msg )
msg[190] = c; msg[190] = c;
} }
void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1, const char *arg2) { // UTIL_FakeClientCommand
if (!cmd) return; // PURPOSE: Sends a fake client command to GameDLL
//strncpy(g_fakecmd.argv[0], cmd, 127 ); // HOW DOES IT WORK:
//g_fakecmd.argv[0][ 127 ] = 0; // 1) Stores command and arguments into a global and sets the global "fake" flag to true
// 2) Invokes ClientCommand in GameDLL
// 3) meta_api.cpp overrides Cmd_Args, Cmd_Argv, Cmd_Argc and gives them fake values if the "fake" flag is set
// 4) unsets the global "fake" flag
void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1, const char *arg2)
{
if (!cmd)
return; // no command
/*
char clCmd[256];
snprintf(g_fakecmd.args, 255, "%s%s%s%s%s", cmd,
arg1 ? " " : "", arg1 ? arg1 : "",
arg2 ? " " : "", arg2 ? arg2 : "");
clCmd[255] = 0;
CLIENT_COMMAND(pEdict, clCmd);
return;
*/
if (!cmd)
return; // no command
// store command
g_fakecmd.argv[0] = cmd; g_fakecmd.argv[0] = cmd;
if (arg2){ // if only arg2 is passed, swap the arguments
g_fakecmd.argc = 3; if (!arg1 && arg2)
{
arg1 = arg2;
arg2 = NULL;
}
// store arguments
if (arg2)
{ // both arguments passed
g_fakecmd.argc = 3; // 2 arguments + 1 command
// store arguments
g_fakecmd.argv[1] = arg1; g_fakecmd.argv[1] = arg1;
g_fakecmd.argv[2] = arg2; g_fakecmd.argv[2] = arg2;
snprintf( g_fakecmd.args ,255 , "%s %s",arg1,arg2 ); // build argument line
snprintf(g_fakecmd.args, 255, "%s %s", arg1, arg2);
// if snprintf reached 255 chars limit, this will make sure there will be no access violation
g_fakecmd.args[255] = 0; g_fakecmd.args[255] = 0;
//strncpy(g_fakecmd.argv[1], arg1 , 127 );
//g_fakecmd.argv[1][ 127 ] = 0;
//strncpy(g_fakecmd.argv[2], arg2 , 127 );
//g_fakecmd.argv[2][ 127 ] = 0;
//snprintf(g_fakecmd.args, 255 , "%s %s",arg1,arg2);
//g_fakecmd.args[255] = 0;
} }
else if (arg1){ else if (arg1)
g_fakecmd.argc = 2; { // only one argument passed
g_fakecmd.argc = 2; // 1 argument + 1 command
// store argument
g_fakecmd.argv[1] = arg1; g_fakecmd.argv[1] = arg1;
snprintf( g_fakecmd.args ,255 , "%s" , arg1 ); // build argument line
snprintf( g_fakecmd.args, 255, "%s", arg1);
// if snprintf reached 255 chars limit, this will make sure there will be no access violation
g_fakecmd.args[255] = 0; g_fakecmd.args[255] = 0;
//strncpy(g_fakecmd.argv[1], arg1, 127 );
//g_fakecmd.argv[1][ 127 ] = 0;
//*g_fakecmd.argv[2] = 0;
//snprintf(g_fakecmd.args, 255 ,"%s",arg1);
//g_fakecmd.args[255] = 0;
} }
else else
g_fakecmd.argc = 1; g_fakecmd.argc = 1; // no argmuents -> only one command
// set the global "fake" flag so the Cmd_Arg* functions will be superceded
g_fakecmd.fake = true; g_fakecmd.fake = true;
// tell the GameDLL that the client sent a command
MDLL_ClientCommand(pEdict); MDLL_ClientCommand(pEdict);
// unset the global "fake" flag
g_fakecmd.fake = false; g_fakecmd.fake = false;
} }
std::string g_UTIL_LogFile;
void UTIL_MakeNewLogFile()
{
// build filename
time_t td;
time(&td);
tm *curTime = localtime(&td);
// create dir if not existing
#ifdef __linux
mkdir(build_pathname("%s", g_log_dir.str()), 0700);
#else
mkdir(build_pathname("%s", g_log_dir.str()));
#endif
int i = 0;
while (true)
{
g_UTIL_LogFile = build_pathname("%s/L%02d%02d%03d.log", g_log_dir.str(), curTime->tm_mon + 1, curTime->tm_mday, i);
FILE *pTmpFile = fopen(g_UTIL_LogFile.c_str(), "r"); // open for reading to check whether the file exists
if (!pTmpFile)
break;
fclose(pTmpFile);
++i;
}
// Log logfile start
UTIL_Log("AMX Mod X log file started (file \"%s/L%02d%02d%03d.log\") (version \"%s\")", g_log_dir.str(), curTime->tm_mon + 1, curTime->tm_mday, i, AMX_VERSION);
}
void UTIL_Log(const char *fmt, ...)
{
// build message
// :TODO: Overflow possible here
char msg[3072];
va_list arglst;
va_start(arglst, fmt);
vsprintf(msg, fmt, arglst);
va_end(arglst);
// get time
time_t td;
time(&td);
tm *curTime = localtime(&td);
char date[32];
strftime(date, 31, "%m/%d/%Y - %H:%M:%S", curTime);
// log msg now
FILE *pF = fopen(g_UTIL_LogFile.c_str(), "a+");
if (!pF)
return; // don't try to create a new logfile to prevent recursion crashes if there is an unforseen error
fprintf(pF, "L %s: %s\n", date, msg);
fclose(pF);
print_srvconsole("L %s: %s\n", date, msg);
}

View File

@ -29,10 +29,8 @@
* version. * version.
*/ */
#include <extdll.h> #include "amxmodx.h"
#include <meta_api.h>
#include "CVault.h" #include "CVault.h"
#include "amxmod.h"
Vault g_vault; Vault g_vault;
@ -83,3 +81,5 @@ AMX_NATIVE_INFO vault_Natives[] = {
{ "vaultdata_exists", vaultdata_exists }, { "vaultdata_exists", vaultdata_exists },
{ 0, 0 } { 0, 0 }
}; };

34
amxmodx/version.rc Executable file
View File

@ -0,0 +1,34 @@
#include "winres.h"
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,2,0,0
PRODUCTVERSION 0,2,0,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "000004b0"
BEGIN
VALUE "Comments", "AMX Mod X\0"
VALUE "FileDescription", "AMX Mod X\0"
VALUE "FileVersion", "0.20\0"
VALUE "InternalName", "amxmodx\0"
VALUE "LegalCopyright", "Copyright (c) 2004, AMX Mod X Dev Team\0"
VALUE "OriginalFilename", "amxx_mm.dll\0"
VALUE "ProductName", "AMX Mod X\0"
VALUE "ProductVersion", "0.20\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0, 1200
END
END

BIN
amxmodx/zlib/libz.a Executable file

Binary file not shown.

BIN
amxmodx/zlib/libz64.a Executable file

Binary file not shown.

323
amxmodx/zlib/zconf.h Executable file
View File

@ -0,0 +1,323 @@
/* zconf.h -- configuration of the zlib compression library
* Copyright (C) 1995-2003 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/* @(#) $Id$ */
#ifndef ZCONF_H
#define ZCONF_H
/*
* If you *really* need a unique prefix for all types and library functions,
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
*/
#ifdef Z_PREFIX
# define deflateInit_ z_deflateInit_
# define deflate z_deflate
# define deflateEnd z_deflateEnd
# define inflateInit_ z_inflateInit_
# define inflate z_inflate
# define inflateEnd z_inflateEnd
# define deflateInit2_ z_deflateInit2_
# define deflateSetDictionary z_deflateSetDictionary
# define deflateCopy z_deflateCopy
# define deflateReset z_deflateReset
# define deflatePrime z_deflatePrime
# define deflateParams z_deflateParams
# define deflateBound z_deflateBound
# define inflateInit2_ z_inflateInit2_
# define inflateSetDictionary z_inflateSetDictionary
# define inflateSync z_inflateSync
# define inflateSyncPoint z_inflateSyncPoint
# define inflateCopy z_inflateCopy
# define inflateReset z_inflateReset
# define compress z_compress
# define compress2 z_compress2
# define compressBound z_compressBound
# define uncompress z_uncompress
# define adler32 z_adler32
# define crc32 z_crc32
# define get_crc_table z_get_crc_table
# define Byte z_Byte
# define uInt z_uInt
# define uLong z_uLong
# define Bytef z_Bytef
# define charf z_charf
# define intf z_intf
# define uIntf z_uIntf
# define uLongf z_uLongf
# define voidpf z_voidpf
# define voidp z_voidp
#endif
#if defined(__MSDOS__) && !defined(MSDOS)
# define MSDOS
#endif
#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
# define OS2
#endif
#if defined(_WINDOWS) && !defined(WINDOWS)
# define WINDOWS
#endif
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
# define WIN32
#endif
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
# ifndef SYS16BIT
# define SYS16BIT
# endif
# endif
#endif
/*
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more
* than 64k bytes at a time (needed on systems with 16-bit int).
*/
#ifdef SYS16BIT
# define MAXSEG_64K
#endif
#ifdef MSDOS
# define UNALIGNED_OK
#endif
#ifdef __STDC_VERSION__
# ifndef STDC
# define STDC
# endif
# if __STDC_VERSION__ >= 199901L
# ifndef STDC99
# define STDC99
# endif
# endif
#endif
#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
# define STDC
#endif
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
# define STDC
#endif
#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
# define STDC
#endif
#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
# define STDC
#endif
#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
# define STDC
#endif
#ifndef STDC
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
# define const /* note: need a more gentle solution here */
# endif
#endif
/* Some Mac compilers merge all .h files incorrectly: */
#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
# define NO_DUMMY_DECL
#endif
/* Maximum value for memLevel in deflateInit2 */
#ifndef MAX_MEM_LEVEL
# ifdef MAXSEG_64K
# define MAX_MEM_LEVEL 8
# else
# define MAX_MEM_LEVEL 9
# endif
#endif
/* Maximum value for windowBits in deflateInit2 and inflateInit2.
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
* created by gzip. (Files created by minigzip can still be extracted by
* gzip.)
*/
#ifndef MAX_WBITS
# define MAX_WBITS 15 /* 32K LZ77 window */
#endif
/* The memory requirements for deflate are (in bytes):
(1 << (windowBits+2)) + (1 << (memLevel+9))
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
plus a few kilobytes for small objects. For example, if you want to reduce
the default memory requirements from 256K to 128K, compile with
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
Of course this will generally degrade compression (there's no free lunch).
The memory requirements for inflate are (in bytes) 1 << windowBits
that is, 32K for windowBits=15 (default value) plus a few kilobytes
for small objects.
*/
/* Type declarations */
#ifndef OF /* function prototypes */
# ifdef STDC
# define OF(args) args
# else
# define OF(args) ()
# endif
#endif
/* The following definitions for FAR are needed only for MSDOS mixed
* model programming (small or medium model with some far allocations).
* This was tested only with MSC; for other MSDOS compilers you may have
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
* just define FAR to be empty.
*/
#ifdef SYS16BIT
# if defined(M_I86SM) || defined(M_I86MM)
/* MSC small or medium model */
# define SMALL_MEDIUM
# ifdef _MSC_VER
# define FAR _far
# else
# define FAR far
# endif
# endif
# if (defined(__SMALL__) || defined(__MEDIUM__))
/* Turbo C small or medium model */
# define SMALL_MEDIUM
# ifdef __BORLANDC__
# define FAR _far
# else
# define FAR far
# endif
# endif
#endif
#if defined(WINDOWS) || defined(WIN32)
/* If building or using zlib as a DLL, define ZLIB_DLL.
* This is not mandatory, but it offers a little performance increase.
*/
# ifdef ZLIB_DLL
# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
# ifdef ZLIB_INTERNAL
# define ZEXTERN extern __declspec(dllexport)
# else
# define ZEXTERN extern __declspec(dllimport)
# endif
# endif
# endif /* ZLIB_DLL */
/* If building or using zlib with the WINAPI/WINAPIV calling convention,
* define ZLIB_WINAPI.
* Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
*/
# ifdef ZLIB_WINAPI
# ifdef FAR
# undef FAR
# endif
# include <windows.h>
/* No need for _export, use ZLIB.DEF instead. */
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
# define ZEXPORT WINAPI
# ifdef WIN32
# define ZEXPORTVA WINAPIV
# else
# define ZEXPORTVA FAR CDECL
# endif
# endif
#endif
#if defined (__BEOS__)
# ifdef ZLIB_DLL
# ifdef ZLIB_INTERNAL
# define ZEXPORT __declspec(dllexport)
# define ZEXPORTVA __declspec(dllexport)
# else
# define ZEXPORT __declspec(dllimport)
# define ZEXPORTVA __declspec(dllimport)
# endif
# endif
#endif
#ifndef ZEXTERN
# define ZEXTERN extern
#endif
#ifndef ZEXPORT
# define ZEXPORT
#endif
#ifndef ZEXPORTVA
# define ZEXPORTVA
#endif
#ifndef FAR
# define FAR
#endif
#if !defined(__MACTYPES__)
typedef unsigned char Byte; /* 8 bits */
#endif
typedef unsigned int uInt; /* 16 bits or more */
typedef unsigned long uLong; /* 32 bits or more */
#ifdef SMALL_MEDIUM
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
# define Bytef Byte FAR
#else
typedef Byte FAR Bytef;
#endif
typedef char FAR charf;
typedef int FAR intf;
typedef uInt FAR uIntf;
typedef uLong FAR uLongf;
#ifdef STDC
typedef void const *voidpc;
typedef void FAR *voidpf;
typedef void *voidp;
#else
typedef Byte const *voidpc;
typedef Byte FAR *voidpf;
typedef Byte *voidp;
#endif
#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
# include <sys/types.h> /* for off_t */
# include <unistd.h> /* for SEEK_* and off_t */
# ifdef VMS
# include <unixio.h> /* for off_t */
# endif
# define z_off_t off_t
#endif
#ifndef SEEK_SET
# define SEEK_SET 0 /* Seek from beginning of file. */
# define SEEK_CUR 1 /* Seek from current position. */
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
#endif
#ifndef z_off_t
# define z_off_t long
#endif
#if defined(__OS400__)
#define NO_vsnprintf
#endif
#if defined(__MVS__)
# define NO_vsnprintf
# ifdef FAR
# undef FAR
# endif
#endif
/* MVS linker does not support external names larger than 8 bytes */
#if defined(__MVS__)
# pragma map(deflateInit_,"DEIN")
# pragma map(deflateInit2_,"DEIN2")
# pragma map(deflateEnd,"DEEND")
# pragma map(deflateBound,"DEBND")
# pragma map(inflateInit_,"ININ")
# pragma map(inflateInit2_,"ININ2")
# pragma map(inflateEnd,"INEND")
# pragma map(inflateSync,"INSY")
# pragma map(inflateSetDictionary,"INSEDI")
# pragma map(compressBound,"CMBND")
# pragma map(inflate_table,"INTABL")
# pragma map(inflate_fast,"INFA")
# pragma map(inflate_copyright,"INCOPY")
#endif
#endif /* ZCONF_H */

1200
amxmodx/zlib/zlib.h Executable file

File diff suppressed because it is too large Load Diff

BIN
amxmodx/zlib/zlib.lib Executable file

Binary file not shown.

38
compiler/compile/compile.cfg Executable file
View File

@ -0,0 +1,38 @@
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"..\Bpl"
-LN"..\Bpl"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST

132
compiler/compile/compile.dof Executable file
View File

@ -0,0 +1,132 @@
[FileVersion]
Version=7.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
NamespacePrefix=
SymbolDeprecated=1
SymbolLibrary=1
SymbolPlatform=1
UnitLibrary=1
UnitPlatform=1
UnitDeprecated=1
HResultCompat=1
HidingMember=1
HiddenVirtual=1
Garbage=1
BoundsError=1
ZeroNilCompat=1
StringConstTruncated=1
ForLoopVarVarPar=1
TypedConstVarPar=1
AsgToTypedConst=1
CaseLabelRange=1
ForVariable=1
ConstructingAbstract=1
ComparisonFalse=1
ComparisonTrue=1
ComparingSignedUnsigned=1
CombiningSignedUnsigned=1
UnsupportedConstruct=1
FileOpen=1
FileOpenUnitSrc=1
BadGlobalSymbol=1
DuplicateConstructorDestructor=1
InvalidDirective=1
PackageNoLink=1
PackageThreadVar=1
ImplicitImport=1
HPPEMITIgnored=1
NoRetVal=1
UseBeforeDef=1
ForLoopVarUndef=1
UnitNameMismatch=1
NoCFGFileFound=1
MessageDirective=1
ImplicitVariants=1
UnicodeToLocale=1
LocaleToUnicode=1
ImagebaseMultiple=1
SuspiciousTypecast=1
PrivatePropAccessor=1
UnsafeType=0
UnsafeCode=0
UnsafeCast=0
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1031
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=

88
compiler/compile/compile.dpr Executable file
View File

@ -0,0 +1,88 @@
(* AMX Mod X
* compile.exe
*
* by the AMX Mod X Development Team
*
*
* 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.
*)
program compile;
{$APPTYPE CONSOLE}
{$R version.res}
{$R icon.res}
uses
SysUtils, Classes,
uFunc in 'uFunc.pas';
var
sr: TSearchRec;
i: Word;
begin
WriteLn('//AMXXSC compile.exe');
WriteLn('// by the AMX Mod X Dev Team');
WriteLn;
if not FileExists(ExtractFilePath(ParamStr(0))+'amxxsc.exe') then
begin
WriteLn('// Could not find amxxsc.exe');
AppExit;
end;
if not DirectoryExists(ExtractFilePath(ParamStr(0))+'compiled') then
CreateDir(ExtractFilePath(ParamStr(0))+'compiled');
if ( ParamCount > 0 ) then
begin
for i := 1 to ParamCount do
begin
if FileExists(ParamStr(i)) then
CompilePlugin(ParamStr(i))
else
begin
WriteLn;
WriteLn('// File not found.');
end;
end;
end
else
begin
if ( FindFirst('*.sma',faAnyFile,sr) = 0 ) then
begin
repeat
CompilePlugin(sr.Name);
until ( FindNext(sr) <> 0 );
end
else
begin
WriteLn('// No file found.');
end;
FindClose(sr);
end;
AppExit;
end.

BIN
compiler/compile/favicon.ico Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

1
compiler/compile/icon.rc Executable file
View File

@ -0,0 +1 @@
AMXX ICON "favicon.ico"

201
compiler/compile/uFunc.pas Executable file
View File

@ -0,0 +1,201 @@
(* AMX Mod X
* compile.exe
*
* by the AMX Mod X Development Team
*
*
* 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.
*)
unit uFunc;
interface
uses
Windows, SysUtils, Classes, Math, IniFiles;
procedure AppExit;
procedure CompilePlugin(const Name: String);
function GetAgeFromDat(const FileName: String): Integer;
procedure SetAgeToDat(const FileName: String; const Age: Integer);
function GetConsoleOutput(const Command: String; var Output: TStringList): Boolean;
implementation
procedure AppExit;
begin
WriteLn;
Write('Press enter to exit ...');
ReadLn;
Halt;
end;
procedure CompilePlugin(const Name: String);
var
Output: TStringList;
i: Word;
cStart,cEnd: Longword;
FileName, FilePath, Compiled: String;
begin
FileName := ExtractFileName(Name);
FilePath := ExtractFilePath(Name);
Compiled := FilePath+'compiled\'+ChangeFileExt(Filename,'.amxx');
if (FilePath='') then
FilePath := ExtractFilePath(ParamStr(0));
WriteLn;
WriteLn('//// '+ExtractFileName(FileName));
if FileExists(Compiled) and ( GetAgeFromDat(FileName)=FileAge(Name) ) then
begin
WriteLn('// Already compiled.');
WriteLn('// ----------------------------------------');
Exit;
end;
Output := TStringList.Create;
try
cStart := GetTickCount;
if not GetConsoleOutput(ExtractFilePath(ParamStr(0))+'amxxsc.exe "'+FilePath+FileName+'" "-o'+Compiled+'"',Output) then
begin
WriteLn('// Internal error.');
AppExit;
end;
cEnd := GetTickCount;
for i := 3 to (Output.Count-1) do
begin
WriteLn('// '+Output.Strings[i]);
end;
WriteLn('//');
WriteLn('// Compilation Time: '+FloatToStr(SimpleRoundTo((cEnd-cStart) / 1000,-2))+' sec');
WriteLn('// ----------------------------------------');
Output.Free;
except
WriteLn('// Internal error.');
AppExit;
end;
SetAgeToDat(FileName,FileAge(Name));
end;
function GetAgeFromDat(const FileName: String): Integer;
var
Ini: TIniFile;
begin
Ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'compile.dat');
Result := Ini.ReadInteger(FileName,'Age',-1);
Ini.Free;
end;
procedure SetAgeToDat(const FileName: String; const Age: Integer);
var
Ini: TIniFile;
begin
Ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'compile.dat');
Ini.WriteInteger(FileName,'Age',Age);
Ini.UpdateFile;
Ini.Free;
end;
function GetConsoleOutput(const Command: String; var Output: TStringList): Boolean;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
SecurityAttr: TSecurityAttributes;
PipeOutputRead: THandle;
PipeOutputWrite: THandle;
PipeErrorsRead: THandle;
PipeErrorsWrite: THandle;
Succeed: Boolean;
Buffer: array [0..255] of Char;
NumberOfBytesRead: DWORD;
Stream: TMemoryStream;
begin
FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
SecurityAttr.nLength := SizeOf(SecurityAttr);
SecurityAttr.bInheritHandle := True;
SecurityAttr.lpSecurityDescriptor := nil;
CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.hStdInput := 0;
StartupInfo.hStdOutput := PipeOutputWrite;
StartupInfo.hStdError := PipeErrorsWrite;
StartupInfo.wShowWindow := SW_HIDE;
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
if CreateProcess(nil, PChar(command), nil, nil, true,
CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
StartupInfo, ProcessInfo) then begin
Result := True;
CloseHandle(PipeOutputWrite);
CloseHandle(PipeErrorsWrite);
Stream := TMemoryStream.Create;
try
while True do begin
Succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
if not Succeed then Break;
Stream.Write(Buffer, NumberOfBytesRead);
end;
Stream.Position := 0;
Output.LoadFromStream(Stream);
finally
Stream.Free;
end;
CloseHandle(PipeOutputRead);
try
while True do
begin
Succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil);
if not Succeed then Break;
end;
finally
end;
CloseHandle(PipeErrorsRead);
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hProcess);
end
else
begin
Result := False;
CloseHandle(PipeOutputRead);
CloseHandle(PipeOutputWrite);
CloseHandle(PipeErrorsRead);
CloseHandle(PipeErrorsWrite);
end;
end;
end.

33
compiler/compile/version.rc Executable file
View File

@ -0,0 +1,33 @@
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,2,0,0
PRODUCTVERSION 0,2,0,0
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP // VFT_APP VFT_DLL
//FILEFLGAGS:
// VS_FF_DEBUG VS_FF_PRERELEASE VS_FF_PATCHED VS_FF_PRIVATEBUILD VS_FF_INFOINFERRED VS_FF_SPECIALBUILD
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "AMXXSC compile.exe\0"
//VALUE "CompanyName", "AMXX Development Team\0"
VALUE "FileDescription", "AMXXSC compile.exe\0"
VALUE "FileVersion", "0.20\0"
VALUE "InternalName", "AMXXSC compile.exe\0"
VALUE "LegalCopyright", "(c) 2004, AMXX Development Team\0"
//VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "compile.exe\0"
//VALUE "PrivateBuild", "\0"
VALUE "ProductName", "AMXXSC compile.exe\0"
VALUE "ProductVersion", "0.20\0"
//VALUE "SpecialBuild", "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", LANG_ENGLISH SUBLANG_ENGLISH_US
END
END

14
compiler/scasm/Makefile Executable file
View File

@ -0,0 +1,14 @@
CPPFILES = amxasm.cpp cexpr.cpp amx_symbol.cpp amx_proc.cpp \
amx_parser.cpp amx_natives.cpp amx_macro.cpp amx_label.cpp \
amx_error.cpp amx_define.cpp amx_data.cpp amx_compiler.cpp
FLAGS = -march=i386
all: sasm
sasm:
g++ $(FLAGS) -Wall $(CPPFILES) -o sasm -s
clean:
-rm *.o
-rm sasm

176
compiler/scasm/Makefile.pl Executable file
View File

@ -0,0 +1,176 @@
#!/usr/bin/perl
#(C)2004 AMX Mod X Development Team
# by David "BAILOPAN" Anderson
# output will occur in bin.x.proc
# where x is debug or opt and proc is ix86 or amd64
# You must use this script from the project src dir
#options =
# debug - enable gdb debugging
# amd64 - compile for AMD64
# proc=ix86 - assumed not amd64
# clean - clean the specifications above
$PROJECT = "sasm";
$gccf = "gcc";
@CPP_SOURCE_FILES = ("amx_compiler.cpp", "amx_data.cpp", "amx_define.cpp", "amx_error.cpp", "amx_label.cpp", "amx_macro.cpp", "amx_natives.cpp", "amx_proc.cpp", "amx_parser.cpp", "amx_symbol.cpp", "amxasm.cpp", "cexpr.cpp");
@C_SOURCE_FILES = ();
my %OPTIONS, %OPT;
$OPT{"debug"} = "-g -ggdb";
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\"";
$OPTIONS{"include"} = "";
while ($cmd = shift)
{
if ($cmd =~ /amd64/) {
$OPTIONS{"amd64"} = 1;
} elsif ($cmd =~ /debug/) {
$OPTIONS{"debug"} = 1;
} elsif ($cmd =~ /proc=i(\d)86/) {
$proc = $1;
if ($OPTIONS{"amd64"})
{
die "You cannot compile for i".$proc."86 and AMD64.\n";
} else {
$OPTIONS{"proc"} = "i".$proc."86";
}
} elsif ($cmd =~ /clean/) {
$OPTIONS{"clean"} = 1;
}
}
$gcc = `$gccf --version`;
if ($gcc =~ /2\.9/)
{
$OPT{"opt"} .= " -malign-loops=2 -malign-jumps=2 -malign-functions=2";
} else {
$OPT{"opt"} .= " -falign-loops=2 -falign-jumps=2 -falign-functions=2";
}
if ($OPTIONS{"debug"})
{
$cflags = $OPT{"debug"};
} else {
if (!$OPTIONS{"amd64"})
{
$proc = $OPTIONS{"proc"};
if (!$proc)
{
$proc = 3;
}
$cflags = "-march=i".$proc."86 ".$OPT{"opt"};
} else {
$cflags = $OPT{"opt"};
}
}
if ($OPTIONS{"amd64"})
{
$cflags .= " -m64 -DHAVE_I64 -DSMALL_CELL_SIZE=64 $cflags";
}
if ($OPTIONS{"debug"})
{
$outdir = "bin.debug";
} else {
$outdir = "bin.opt";
}
if ($OPTIONS{"amd64"})
{
$outdir .= ".amd64";
$bin = $PROJECT."_amd64.so";
} else {
$proc = $OPTIONS{"proc"};
if ($proc)
{
$outdir .= ".i".$proc."86";
$bin = $PROJECT."_i".$proc."86.so";
} else {
$outdir .= ".i386";
$bin = $PROJECT."_i386.so";
}
}
unlink("$outdir/$bin");
if ($OPTIONS{"clean"})
{
`rm $outdir/*.o`;
die("Project cleaned.\n");
}
#create the dirs
#build link list
my @LINK;
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
{
$file = $CPP_SOURCE_FILES[$i];
$file =~ s/\.cpp/\.o/;
push(@LINK, $outdir."/".$file);
}
for ($i=0; $i<=$#C_SOURCE_FILES; $i++)
{
$file = $C_SOURCE_FILES[$i];
$file =~ s/\.c/\.o/;
push(@LINK, $outdir."/".$file);
}
if (!(-d $outdir))
{
mkdir($outdir);
}
$inc = $OPTIONS{"include"};
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
{
$file = $CPP_SOURCE_FILES[$i];
$ofile = $file;
$ofile =~ s/\.cpp/\.o/;
$ofile = "$outdir/$ofile";
$gcc = "$gccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
if (-e $ofile)
{
$file_time = (stat($file))[9];
$ofile_time = (stat($ofile))[9];
if ($file_time > $ofile_time)
{
print "$gcc\n";
`$gcc`;
}
} else {
print "$gcc\n";
`$gcc`;
}
}
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
{
$file = $C_SOURCE_FILES[$i];
$ofile = $file;
$ofile =~ s/\.c/\.o/;
$ofile = "$outdir/$ofile";
$gcc = "cc $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
if (-e $ofile)
{
$file_time = (stat($file))[9];
$ofile_time = (stat($file))[9];
if ($file_time > $ofile_time)
{
print "$gcc\n";
`$gcc`;
}
} else {
print "$gcc\n";
`$gcc`;
}
}
$gcc = "$gccf $cflags -shared -lstdc++ -ldl -lm @LINK -o $outdir/$bin";
print "$gcc\n";
`$gcc`;

240
compiler/scasm/adminslots.asm Executable file
View File

@ -0,0 +1,240 @@
;(C)2004 David "BAILOPAN" Anderson
; Assembler version of Anti-Flood
#define VERSION "0.20-A"
#define PLUGIN_HANDLED
#macro ARGN(argc) (12+(argc*CELL))
.CODE
halt 0 ;Return point for end
.NATIVE
register_plugin
register_cvar
random_num
register_clcmd
server_cmd
get_maxplayers
get_playersnum
get_cvar_num
set_cvar_num
get_user_flags
client_cmd
get_user_userid
.DATA
Plugin db "Slots Reservation"
Version db VERSION
Author db "AMXX Dev Team"
Cvar db "amx_reservation"
CvarVal db "1"
Callback db "ackSignal"
loopBack db "amxres0000"
.CODE
PROC plugin_init
push.c Author ;push author
push.c Version ;push version
push.c Plugin ;push name
push.c CELL*3 ;push 3 args
sysreq.c register_plugin ;call register_plugin
stack CELL*4 ;clean-up
push.c CvarVal ;push Cvar initial value
push.c Cvar ;push Cvar
push.c CELL*2 ;push 2 args
sysreq.c register_cvar ;call register_cvar
stack CELL*3 ;clean-up
push.c 90 ;push max range
push.c 65 ;push min range
push.c CELL*2 ;push 2 args
sysreq.c random_num ;call random_num
stack CELL*3 ;clean-up
stor.pri loopBack+CELL*6 ;store pri in loopBack[6]
push.c 90 ;push max range
push.c 65 ;push min range
push.c CELL*2 ;push 2 args
sysreq.c random_num ;call random_num
stack CELL*3 ;clean-up
stor.pri loopBack+CELL*7 ;store pri in loopBack[7]
push.c 90 ;push max range
push.c 65 ;push min range
push.c CELL*2 ;push 2 args
sysreq.c random_num ;call random_num
stack CELL*3 ;clean-up
stor.pri loopBack+CELL*8 ;store pri in loopBack[8]
push.c 90 ;push max range
push.c 65 ;push min range
push.c CELL*2 ;push 2 args
sysreq.c random_num ;call random_num
stack CELL*3 ;clean-up
stor.pri loopBack+CELL*9 ;store pri in loopBack[9]
push.c Callback ;push callback
push.c loopBack ;push loopback
push.c CELL*2
sysreq.c register_clcmd ;call register_clcmd
stack CELL*3 ;clean-up
zero.pri ;return 0
retn ;final cleanup
ENDP
.DATA
KickMsg db "kick #%d \"Dropped due to slot reservation\""
.CODE
PROC ackSignal
push.s ARGN(0) ;push the first argument
push.c CELL*1 ;push one argument
sysreq.c get_user_userid ;call get_user_userid
stack CELL*2 ;clean-up
push.pri ;push the result of the last call
push.c KickMsg ;push the kick message
push.c CELL*2 ;push 2 args
sysreq.c server_cmd ;call server_cmd
stack CELL*3 ;clean-up
zero.pri ;return 0
retn ;final cleanup
ENDP
.DATA
VisCvar db "sv_visiblemaxplayers"
.CODE
;players, maxplayrs, limit
PROC setVisibleSlots
stack -CELL ;new variable
load.s.pri ARGN(0) ;get first parameter into [PRI]
add.c 1 ;[PRI] += 1
stor.s.pri -CELL ;[var] = [PRI]
load.s.pri ARGN(0) ;Reset [PRI] to first param
load.s.alt ARGN(1) ;get second parameter into [ALT]
jeq setMax ;does players == maxplayers?
jump setLimitCheck ; -- no, jump to next check
setMax: ; -- yes
stor.s.alt -CELL ; store the maxplayers into [var]
jump endSetIf ; we're done, jump to the end
setLimitCheck:
load.s.alt ARGN(2) ;load the third param into [ALT]
jless setLimit ;is playres < limit?
jump endSetIf ; -- no, jump to end
setLimit: ; -- yes
stor.s.alt -CELL ;store limit into [var]
endSetIf:
push.s -CELL ;push [var] onto stack
push.c VisCvar ;push cvar onto stack
push.c CELL*2 ;push 2 args
sysreq.c set_cvar_num ;call set_cvar_num
stack CELL*3 ;clean-up
stack CELL ;restore stack
zero.pri ;return 0
retn ;final cleanup
ENDP
PROC client_authorized
push.c 0 ;push 0 args
sysreq.c get_maxplayers ;call get_maxplayers
stack CELL ;clean-up
push.pri ;store the result - maxplayers
push.c 1 ;push 1
push.c CELL ;push 1 args
sysreq.c get_playersnum ;call get_playersnum
stack CELL*2 ;clean-up
push.pri ;store the result - players
push.c Cvar ;push cvar
push.c CELL ;push 1 arg
sysreq.c get_cvar_num ;call get_cvar_num
stack CELL*2 ;clean-up
xchg ;last result is now in alt
load.s.pri -CELL ;load the first result into pri
sub ;pri = maxplayers - cvar
push.pri ;store the result - limit
push.s ARGN(0) ;push the id
push.c CELL ;push 1 arg
sysreq.c get_user_flags ;call get_user_flags
stack CELL*2 ;clean-up
const.alt 2 ;2 = ADMIN_RESERVATION
and ;flags & 2
jeq setVis ;if (flags & 2) == 2, short circuit
;otherwise check this condition
load.s.pri -CELL*2 ;load players into pri
load.s.alt -CELL*3 ;load limit into alt
jleq setVis ;if players <= limit, jump
jump setVisSkip ;otherwise skip
setVis:
push.s -CELL*3 ;push limit
push.s -CELL ;push maxplayers
push.s -CELL*2 ;push players
push.c CELL*3 ;push 3 args
call setVisibleSlots ;call setVisibleSlots
stack CELL*3 ;restore stack
zero.pri ;return 0
retn ;finalize
setVisSkip:
push.c loopBack ;push loopback cmd
push.s ARGN(0) ;push the id passed
push.c CELL*2 ;push 2 args
sysreq.c client_cmd ;call client_cmd
stack CELL*3 ;clean-up
stack CELL*3 ;restore stack
const.pri PLUGIN_HANDLED ;return
retn ;finalize
ENDP
PROC client_disconnect
push.c 0 ;push 0 args
sysreq.c get_maxplayers ;call get_maxplayers
stack CELL ;clean-up
push.pri ;store the result - maxplayers
push.c 1 ;push 1
push.c CELL ;push 1 args
sysreq.c get_playersnum ;call get_playersnum
stack CELL*2 ;clean-up
push.pri ;store the result - players
dec.s -CELL*2 ;players--
push.c Cvar ;push cvar
push.c CELL ;push 1 arg
sysreq.c get_cvar_num ;call get_cvar_num
stack CELL*2 ;clean-up
xchg ;last result is now in alt
load.s.pri -CELL ;[pri] = maxplayers
sub ;[pri] = maxplayers - cvar
push.pri ;store the result - limit
push.s -CELL*3 ;push limit
push.s -CELL ;push maxplayers
push.s -CELL*2 ;push playersnum-1
push.c CELL*3 ;push 3 args
call setVisibleSlots ;call
stack 3*CELL ;clean up 3 vars
zero.pri ;return 0
retn ;finalize
ENDP
.PUBLIC
ackSignal
plugin_init
client_authorized
client_disconnect

383
compiler/scasm/amx.h Executable file
View File

@ -0,0 +1,383 @@
/* Abstract Machine for the Small compiler
*
* Copyright (c) ITB CompuPhase, 1997-2004
*
* This software is provided "as-is", without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from
* the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software in
* a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#if defined LINUX
#include <sclinux.h>
#endif
#ifndef AMX_H_INCLUDED
#define AMX_H_INCLUDED
#if defined __LCC__ || defined __DMC__ || defined LINUX
#include <stdint.h>
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
/* The ISO C99 defines the int16_t and int_32t types. If the compiler got
* here, these types are probably undefined.
*/
#if defined __FreeBSD__
#include <inttypes.h>
#else
typedef short int int16_t;
typedef unsigned short int uint16_t;
#if defined SN_TARGET_PS2
typedef int int32_t;
typedef unsigned int uint32_t;
#else
typedef long int int32_t;
typedef unsigned long int uint32_t;
#endif
#if defined __WIN32__ || defined _WIN32 || defined WIN32
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
#define HAVE_I64
#elif defined __GNUC__
typedef long long int64_t;
typedef unsigned long long uint64_t;
#define HAVE_I64
#endif
#endif
#endif
#if defined __WIN32__ || defined _WIN32 || defined WIN32 /* || defined __MSDOS__ */
#if !defined alloca
#define alloca(n) _alloca(n)
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* calling convention for native functions */
#if !defined AMX_NATIVE_CALL
#define AMX_NATIVE_CALL
#endif
/* calling convention for all interface functions and callback functions */
#if !defined AMXAPI
#if defined STDECL
#define AMXAPI __stdcall
#elif defined CDECL
#define AMXAPI __cdecl
#else
#define AMXAPI
#endif
#endif
#if !defined AMXEXPORT
#define AMXEXPORT
#endif
/* File format version Required AMX version
* 0 (original version) 0
* 1 (opcodes JUMP.pri, SWITCH and CASETBL) 1
* 2 (compressed files) 2
* 3 (public variables) 2
* 4 (opcodes SWAP.pri/alt and PUSHADDR) 4
* 5 (tagnames table) 4
* 6 (reformatted header) 6
* 7 (name table, opcodes SYMTAG & SYSREQ.D) 7
*/
#define CUR_FILE_VERSION 7 /* current file version; also the current AMX version */
#define MIN_FILE_VERSION 6 /* lowest supported file format version for the current AMX version */
#define MIN_AMX_VERSION 7 /* minimum AMX version needed to support the current file format */
#if defined BIT16
#define SMALL_CELL_SIZE 16 /* for backward compatibility */
#endif
#if !defined SMALL_CELL_SIZE
#define SMALL_CELL_SIZE 32 /* by default, use 32-bit cells */
#endif
#if SMALL_CELL_SIZE==16
typedef uint16_t ucell;
typedef int16_t cell;
#elif SMALL_CELL_SIZE==32
typedef uint32_t ucell;
typedef int32_t cell;
#elif SMALL_CELL_SIZE==64
typedef uint64_t ucell;
typedef int64_t cell;
#else
#error Unsupported cell size (SMALL_CELL_SIZE)
#endif
#define UNPACKEDMAX ((1 << (sizeof(cell)-1)*8) - 1)
struct tagAMX;
typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, cell *params);
typedef int (AMXAPI *AMX_CALLBACK)(struct tagAMX *amx, cell index,
cell *result, cell *params);
typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
#if !defined _FAR
#define _FAR
#endif
#if defined _MSC_VER
#pragma warning(disable:4103) /* disable warning message 4103 that complains
* about pragma pack in a header file */
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
#endif
/* Some compilers do not support the #pragma align, which should be fine. Some
* compilers give a warning on unknown #pragmas, which is not so fine...
*/
#if defined SN_TARGET_PS2 || defined __GNUC__
#define AMX_NO_ALIGN
#endif
#if defined __GNUC__
#define PACKED __attribute__((packed))
#else
#define PACKED
#endif
#if !defined AMX_NO_ALIGN
#if defined LINUX
#pragma pack(1) /* structures must be packed (byte-aligned) */
#else
#pragma pack(push)
#pragma pack(1) /* structures must be packed (byte-aligned) */
#if defined __TURBOC__
#pragma option -a- /* "pack" pragma for older Borland compilers */
#endif
#endif
#endif
typedef struct {
const char _FAR *name PACKED;
AMX_NATIVE func PACKED;
} AMX_NATIVE_INFO PACKED;
#define AMX_USERNUM 4
#define sEXPMAX 19 /* maximum name length for file version <= 6 */
#define sNAMEMAX 31 /* maximum name length of symbol name */
typedef struct tagAMX_FUNCSTUB {
uint32_t address PACKED;
char name[sEXPMAX+1] PACKED;
} AMX_FUNCSTUB PACKED;
/* The AMX structure is the internal structure for many functions. Not all
* fields are valid at all times; many fields are cached in local variables.
*/
typedef struct tagAMX {
unsigned char _FAR *base PACKED; /* points to the AMX header ("amxhdr") plus the code, optionally also the data */
unsigned char _FAR *data PACKED; /* points to separate data+stack+heap, may be NULL */
AMX_CALLBACK callback PACKED;
AMX_DEBUG debug PACKED; /* debug callback */
/* for external functions a few registers must be accessible from the outside */
cell cip PACKED; /* instruction pointer: relative to base + amxhdr->cod */
cell frm PACKED; /* stack frame base: relative to base + amxhdr->dat */
cell hea PACKED; /* top of the heap: relative to base + amxhdr->dat */
cell hlw PACKED; /* bottom of the heap: relative to base + amxhdr->dat */
cell stk PACKED; /* stack pointer: relative to base + amxhdr->dat */
cell stp PACKED; /* top of the stack: relative to base + amxhdr->dat */
int flags PACKED; /* current status, see amx_Flags() */
/* for assertions and debug hook */
cell curline PACKED;
cell curfile PACKED;
int dbgcode PACKED;
cell dbgaddr PACKED;
cell dbgparam PACKED;
char _FAR *dbgname PACKED;
/* user data */
long usertags[AMX_USERNUM] PACKED;
void _FAR *userdata[AMX_USERNUM] PACKED;
/* native functions can raise an error */
int error PACKED;
/* the sleep opcode needs to store the full AMX status */
cell pri PACKED;
cell alt PACKED;
cell reset_stk PACKED;
cell reset_hea PACKED;
cell sysreq_d PACKED; /* relocated address/value for the SYSREQ.D opcode */
#if defined JIT
/* support variables for the JIT */
int reloc_size PACKED; /* required temporary buffer for relocations */
long code_size PACKED; /* estimated memory footprint of the native code */
#endif
} AMX PACKED;
/* The AMX_HEADER structure is both the memory format as the file format. The
* structure is used internaly.
*/
typedef struct tagAMX_HEADER {
int32_t size PACKED; /* size of the "file" */
uint16_t magic PACKED; /* signature */
char file_version PACKED; /* file format version */
char amx_version PACKED; /* required version of the AMX */
int16_t flags PACKED;
int16_t defsize PACKED; /* size of a definition record */
int32_t cod PACKED; /* initial value of COD - code block */
int32_t dat PACKED; /* initial value of DAT - data block */
int32_t hea PACKED; /* initial value of HEA - start of the heap */
int32_t stp PACKED; /* initial value of STP - stack top */
int32_t cip PACKED; /* initial value of CIP - the instruction pointer */
int32_t publics PACKED; /* offset to the "public functions" table */
int32_t natives PACKED; /* offset to the "native functions" table */
int32_t libraries PACKED; /* offset to the table of libraries */
int32_t pubvars PACKED; /* the "public variables" table */
int32_t tags PACKED; /* the "public tagnames" table */
int32_t nametable PACKED; /* name table, file version 7 only */
} AMX_HEADER PACKED;
#define AMX_MAGIC 0xf1e0
enum {
AMX_ERR_NONE,
/* reserve the first 15 error codes for exit codes of the abstract machine */
AMX_ERR_EXIT, /* forced exit */
AMX_ERR_ASSERT, /* assertion failed */
AMX_ERR_STACKERR, /* stack/heap collision */
AMX_ERR_BOUNDS, /* index out of bounds */
AMX_ERR_MEMACCESS, /* invalid memory access */
AMX_ERR_INVINSTR, /* invalid instruction */
AMX_ERR_STACKLOW, /* stack underflow */
AMX_ERR_HEAPLOW, /* heap underflow */
AMX_ERR_CALLBACK, /* no callback, or invalid callback */
AMX_ERR_NATIVE, /* native function failed */
AMX_ERR_DIVIDE, /* divide by zero */
AMX_ERR_SLEEP, /* go into sleepmode - code can be restarted */
AMX_ERR_MEMORY = 16, /* out of memory */
AMX_ERR_FORMAT, /* invalid file format */
AMX_ERR_VERSION, /* file is for a newer version of the AMX */
AMX_ERR_NOTFOUND, /* function not found */
AMX_ERR_INDEX, /* invalid index parameter (bad entry point) */
AMX_ERR_DEBUG, /* debugger cannot run */
AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */
AMX_ERR_USERDATA, /* unable to set user data field (table full) */
AMX_ERR_INIT_JIT, /* cannot initialize the JIT */
AMX_ERR_PARAMS, /* parameter error */
AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */
};
enum {
DBG_INIT, /* query/initialize */
DBG_FILE, /* file number in curfile, filename in name */
DBG_LINE, /* line number in curline, file number in curfile */
DBG_SYMBOL, /* address in dbgaddr, class/type in dbgparam */
DBG_CLRSYM, /* stack address below which locals should be removed. stack address in stk */
DBG_CALL, /* function call, address jumped to in dbgaddr */
DBG_RETURN, /* function returns */
DBG_TERMINATE, /* program ends, code address in dbgaddr, reason in dbgparam */
DBG_SRANGE, /* symbol size and dimensions (arrays); level in dbgaddr (!); length in dbgparam */
DBG_SYMTAG, /* tag of the most recent symbol (if non-zero), tag in dbgparam */
};
/* AMX_FLAG_CHAR16 0x01 no longer used */
#define AMX_FLAG_DEBUG 0x02 /* symbolic info. available */
#define AMX_FLAG_COMPACT 0x04 /* compact encoding */
#define AMX_FLAG_BIGENDIAN 0x08 /* big endian encoding */
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking */
#define AMX_FLAG_BROWSE 0x4000 /* browsing/relocating or executing */
#define AMX_FLAG_RELOC 0x8000 /* jump/call addresses relocated */
#define AMX_EXEC_MAIN -1 /* start at program entry point */
#define AMX_EXEC_CONT -2 /* continue from last address */
#define AMX_USERTAG(a,b,c,d) ((a) | ((b)<<8) | ((long)(c)<<16) | ((long)(d)<<24))
#define AMX_EXPANDMARGIN 64
/* for native functions that use floating point parameters, the following
* two macros are convenient for casting a "cell" into a "float" type _without_
* changing the bit pattern
*/
#if SMALL_CELL_SIZE==32
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
#define amx_ctof(c) ( * ((float*)&c) ) /* cell to float */
#elif SMALL_CELL_SIZE==64
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
#define amx_ctof(c) ( * ((double*)&c) ) /* cell to float */
#else
#error Unsupported cell size
#endif
#define amx_StrParam(amx,param,result) \
do { \
cell *amx_cstr_; int amx_length_; \
amx_GetAddr((amx), (param), &amx_cstr_); \
amx_StrLen(amx_cstr_, &amx_length_); \
if (amx_length_ > 0 && \
((result) = (void*)alloca((amx_length_ + 1) * sizeof(*(result)))) != NULL) \
amx_GetString((char*)(result), amx_cstr_, sizeof(*(result))>1); \
else (result) = NULL; \
} while (0)
uint16_t * AMXAPI amx_Align16(uint16_t *v);
uint32_t * AMXAPI amx_Align32(uint32_t *v);
#if defined _I64_MAX || defined HAVE_I64
uint64_t * AMXAPI amx_Align64(uint64_t *v);
#endif
int AMXAPI amx_Allot(AMX *amx, int cells, cell *amx_addr, cell **phys_addr);
int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params);
int AMXAPI amx_Cleanup(AMX *amx);
int AMXAPI amx_Clone(AMX *amxClone, AMX *amxSource, void *data);
int AMXAPI amx_Debug(AMX *amx); /* default debug procedure, does nothing */
int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...);
int AMXAPI amx_Execv(AMX *amx, cell *retval, int index, int numparams, cell params[]);
int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index);
int AMXAPI amx_FindPublic(AMX *amx, const char *funcname, int *index);
int AMXAPI amx_FindPubVar(AMX *amx, const char *varname, cell *amx_addr);
int AMXAPI amx_FindTagId(AMX *amx, cell tag_id, char *tagname);
int AMXAPI amx_Flags(AMX *amx,uint16_t *flags);
int AMXAPI amx_GetAddr(AMX *amx,cell amx_addr,cell **phys_addr);
int AMXAPI amx_GetNative(AMX *amx, int index, char *funcname);
int AMXAPI amx_GetPublic(AMX *amx, int index, char *funcname);
int AMXAPI amx_GetPubVar(AMX *amx, int index, char *varname, cell *amx_addr);
int AMXAPI amx_GetString(char *dest,const cell *source, int use_wchar);
int AMXAPI amx_GetTag(AMX *amx, int index, char *tagname, cell *tag_id);
int AMXAPI amx_GetUserData(AMX *amx, long tag, void **ptr);
int AMXAPI amx_Init(AMX *amx, void *program);
int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code);
int AMXAPI amx_MemInfo(AMX *amx, long *codesize, long *datasize, long *stackheap);
int AMXAPI amx_NameLength(AMX *amx, int *length);
AMX_NATIVE_INFO * AMXAPI amx_NativeInfo(const char *name,AMX_NATIVE func);
int AMXAPI amx_NumNatives(AMX *amx, int *number);
int AMXAPI amx_NumPublics(AMX *amx, int *number);
int AMXAPI amx_NumPubVars(AMX *amx, int *number);
int AMXAPI amx_NumTags(AMX *amx, int *number);
int AMXAPI amx_RaiseError(AMX *amx, int error);
int AMXAPI amx_Register(AMX *amx, AMX_NATIVE_INFO *nativelist, int number);
int AMXAPI amx_Release(AMX *amx, cell amx_addr);
int AMXAPI amx_SetCallback(AMX *amx, AMX_CALLBACK callback);
int AMXAPI amx_SetDebugHook(AMX *amx, AMX_DEBUG debug);
int AMXAPI amx_SetString(cell *dest, const char *source, int pack, int use_wchar);
int AMXAPI amx_SetUserData(AMX *amx, long tag, void *ptr);
int AMXAPI amx_StrLen(cell *cstring, int *length);
int AMXAPI amx_UTF8Get(const char *string, const char **endptr, cell *value);
int AMXAPI amx_UTF8Put(char *string, char **endptr, int maxchars, cell value);
int AMXAPI amx_UTF8Check(const char *string);
#if !defined AMX_NO_ALIGN
#if defined LINUX
#pragma pack() /* reset default packing */
#else
#pragma pack(pop) /* reset previous packing */
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif /* AMX_H_INCLUDED */

2392
compiler/scasm/amx_compiler.cpp Executable file

File diff suppressed because it is too large Load Diff

110
compiler/scasm/amx_compiler.h Executable file
View File

@ -0,0 +1,110 @@
/* AMX Assembler
* Copyright (C)2004 David "BAILOPAN" Anderson
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#ifndef _INCLUDE_AMXCOMPILER_H
#define _INCLUDE_AMXCOMPILER_H
#define CHK_PARAMS(d) \
if (paramList.size() > d) \
{ \
CError->ErrorMsg(Warning_Param_Count, paramList.size(), d); \
} else if (paramList.size() < d) { \
CError->ErrorMsg(Err_Param_Count, paramList.size(), d); \
delete ASM; \
ASM = 0; \
}
#define PUSH_PARAM(n,sym) \
if (paramList.size() >= n) \
{ \
ASM->params.push_back(Eval(*(paramList[n-1]), sym)); \
lastCip+=cellsize; \
}
class rpn
{
public:
~rpn();
//TODO: use linked lists, but not std::list
std::vector<char> ops;
std::vector<CExpr> vals;
};
class Compiler
{
public:
Compiler();
~Compiler();
Compiler(std::string &f);
void Load(std::string &f);
bool Parse();
bool Compile(std::string &out);
int CurLine() { return curLine; }
ErrorMngr *ErrorHandler() { return CError; }
void PrintCodeList();
public:
int FindArguments(std::string &text, std::vector<std::string*> &List, int &end, bool simple = false);
void Clear();
int CipCount();
int CurCip() { return lastCip; }
Asm *CurAsm() { return curAsm; }
bool SetDebug();
bool SetPack();
bool SetDOpt();
int DerefSymbol(std::string &str, SymbolType sym = Sym_None);
bool IsSymbol(std::string &str);
private:
void ProcessDirective(std::string &text);
void Init();
void InitOpcodes();
int Eval(std::string &str, SymbolType sym = Sym_None);
CExpr EvalE(std::string &str, SymbolType sym = Sym_None);
CExpr EvalRpn(rpn *r, SymbolType sym);
OpToken OperToken(char c);
char OperChar(OpToken c);
void WriteCell(FILE *fp, ucell *c, int repeat);
private:
std::vector<Asm *> CodeList;
std::map<std::string,int> OpCodes;
std::stack<std::string> LabelStack;
char *Output;
ErrorMngr *CError;
SymbolList *CSymbols;
DefineMngr *CDefines;
MacroList *CMacros;
DataMngr *DAT;
ProcMngr *PROC;
LabelMngr *CLabels;
NativeMngr *CNatives;
std::string filename;
int curLine;
int lastCip;
int cellsize;
int stacksize;
bool debug;
bool pack;
bool dopt;
int bitsOut;
Asm *curAsm;
};
#endif //_INCLUDE_AMXCOMPILER_H

196
compiler/scasm/amx_data.cpp Executable file
View File

@ -0,0 +1,196 @@
/* AMX Assembler
* Copyright (C)2004 David "BAILOPAN" Anderson
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#include "amxasm.h"
DataMngr::~DataMngr()
{
Clear();
}
void DataMngr::Clear()
{
std::vector<DataMngr::Datum *>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
if ( (*i) )
delete (*i);
}
List.clear();
}
DataMngr::Datum::Datum()
{
db = false;
offset = -1;
fill = 0;
zeroed = false;
}
void DataMngr::Add(std::string &s, CExpr &expr, bool db, int fill)
{
DataMngr::Datum *D = new DataMngr::Datum();
D->symbol.assign(s);
D->e = expr;
D->fill = fill;
D->db = db;
int size = 0;
if (db)
{
size = ((D->e.GetType() == Val_Number) ?
cellsize : D->e.Size() * cellsize);
} else {
size = (D->e.GetNumber() * cellsize);
}
if (List.size() == 0)
{
D->offset = 0;
} else {
DataMngr::Datum *p = List[List.size()-1];
if (p->db)
{
D->offset = p->offset +
((p->e.GetType() == Val_Number) ?
cellsize : p->e.Size() * cellsize);
} else {
D->offset = p->offset + (p->e.GetNumber() * cellsize);
}
}
cursize += size;
List.push_back(D);
}
DataMngr::Datum *DataMngr::FindData(std::string &sym)
{
std::vector<DataMngr::Datum *>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
if ((*i)->symbol.compare(sym) == 0)
{
return (*i);
}
}
return NULL;
}
int DataMngr::GetOffset(std::string &sym)
{
DataMngr::Datum *D = NULL;
D = FindData(sym);
if (D == NULL)
return DataMngr::nof;
return D->offset;
}
int DataMngr::GetSize()
{
return cursize;
}
void DataMngr::GetData(std::vector<DataMngr::Datum *> &dList)
{
std::vector<DataMngr::Datum *>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
dList.push_back( (*i) );
}
}
void DataMngr::PrintTable()
{
std::vector<DataMngr::Datum *>::iterator i;
DataMngr::Datum *p = 0;
printf("Symbol\tSize\n");
for (i=List.begin(); i!=List.end(); i++)
{
p = (*i);
printf("%s\t%d\n", p->symbol.c_str(), p->offset);
}
}
//Rewrite the DAT section so empties are at the end
void DataMngr::Optimize()
{
std::vector<DataMngr::Datum *> DbList;
std::vector<DataMngr::Datum *> MtList;
std::vector<DataMngr::Datum *>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
if ( (*i)->db )
{
DbList.push_back( (*i) );
} else if ( (*i)->fill == 0 ) {
MtList.push_back( (*i) );
} else {
DbList.push_back( (*i) );
}
}
List.clear();
lastOffset = 0;
cursize = 0;
int size = 0;
for (i=DbList.begin(); i!=DbList.end(); i++)
{
size = (( (*i)->e.GetType() == Val_Number
|| (*i)->e.GetType() == Val_Float ) ?
cellsize : (*i)->e.Size() * cellsize);
(*i)->offset = lastOffset;
lastOffset += size;
(*i)->zeroed = false;
List.push_back( (*i) );
}
cursize = lastOffset;
DbList.clear();
for (i=MtList.begin(); i!=MtList.end(); i++)
{
size = ( (*i)->e.GetNumber() * cellsize );
(*i)->offset = lastOffset;
lastOffset += size;
(*i)->zeroed = true;
List.push_back( (*i) );
}
MtList.clear();
optimized = true;
}

63
compiler/scasm/amx_data.h Executable file
View File

@ -0,0 +1,63 @@
/* AMX Assembler
* Copyright (C)2004 David "BAILOPAN" Anderson
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#ifndef _INCLUDE_AMXDATA_H
#define _INCLUDE_AMXDATA_H
class DataMngr
{
public:
class Datum
{
public:
Datum();
std::string symbol;
CExpr e;
bool db;
int offset;
int fill;
bool zeroed;
};
public:
~DataMngr();
DataMngr() { cellsize = 4; lastOffset = 0; cursize = 0; optimized = false; }
DataMngr(int cell) { lastOffset = 0; cellsize = cell; cursize = 0; optimized = false; }
void Add(std::string &s, CExpr &expr, bool db = false, int fill = 0);
DataMngr::Datum *FindData(std::string &sym);
void GetData(std::vector<DataMngr::Datum *> &dList);
int GetOffset(std::string &sym);
int GetSize();
void Clear();
void PrintTable();
void Optimize();
bool IsOptimized() { return optimized; }
private:
std::vector<DataMngr::Datum *> List;
int lastOffset;
int cellsize;
int cursize;
bool optimized;
public:
static const int nof = -1;
};
#endif //_INCLUDE_AMXDATA_H

90
compiler/scasm/amx_define.cpp Executable file
View File

@ -0,0 +1,90 @@
/* AMX Assembler
* Copyright (C)2004 David "BAILOPAN" Anderson
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#include "amxasm.h"
DefineMngr::~DefineMngr()
{
Clear();
}
void DefineMngr::Clear()
{
std::vector<DefineMngr::Define *>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
if ( (*i) )
delete (*i);
}
List.clear();
}
void DefineMngr::Define::Set(std::string &s, std::string &d)
{
sym.assign(s);
def.assign(d);
}
DefineMngr::Define *DefineMngr::AddDefine(std::string &sym, std::string &def)
{
DefineMngr::Define *D = new DefineMngr::Define;
D->Set(sym, def);
List.push_back(D);
return D;
}
DefineMngr::Define *DefineMngr::FindDefine(std::string &sym)
{
std::vector<DefineMngr::Define*>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
if ((*i)->GetSymbol()->compare(sym)==0)
{
return (*i);
}
}
return NULL;
}
void DefineMngr::SearchAndReplace(std::string &text)
{
std::vector<DefineMngr::Define*>::iterator i;
DefineMngr::Define *D = NULL;
int pos;
for (i=List.begin(); i!=List.end(); i++)
{
D = (*i);
pos = FindSymbol(text, *(D->GetSymbol()), 0);
if (pos != -1)
{
text.replace(pos, D->GetSymbol()->size(), *(D->GetDefine()));
i = List.begin();
}
}
}

49
compiler/scasm/amx_define.h Executable file
View File

@ -0,0 +1,49 @@
/* AMX Assembler
* Copyright (C)2004 David "BAILOPAN" Anderson
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#ifndef _INCLUDE_DEFINE_H
#define _INCLUDE_DEFINE_H
class DefineMngr
{
public:
class Define
{
public:
void Set(std::string &s, std::string &d);
const std::string *GetSymbol() { return &sym; }
const std::string *GetDefine() { return &def; }
private:
std::string sym;
std::string def;
};
private:
std::vector<Define *> List;
public:
~DefineMngr();
void Clear();
DefineMngr::Define *AddDefine(std::string &sym, std::string &def);
DefineMngr::Define *FindDefine(std::string &sym);
void SearchAndReplace(std::string &text);
};
#endif //_INCLUDE_DEFINE_H

198
compiler/scasm/amx_error.cpp Executable file
View File

@ -0,0 +1,198 @@
/* AMX Assembler
* Copyright (C)2004 David "BAILOPAN" Anderson
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#include "amxasm.h"
ErrorMngr::ErrorMngr()
{
printf("Not instantiated with a compiler.");
Cmp = NULL;
line = -1;
assert(Cmp);
}
void ErrorMngr::Clear()
{
Totals[0] = 0;
Totals[1] = 0;
Totals[2] = 0;
Totals[3] = 0;
HighestError = Err_None;
}
int ErrorMngr::CurLine()
{
return ((Compiler *)Cmp)->CurLine();
}
int ErrorMngr::CurCip()
{
return ((Compiler *)Cmp)->CurCip();
}
ErrorMngr::ErrorMngr(void *c)
{
Cmp = c;
DefineErrors();
Totals[0] = 0;
Totals[1] = 0;
Totals[2] = 0;
Totals[3] = 0;
line = -1;
HighestError = Err_None;
}
ErrorType ErrorMngr::GetErrorType(ErrorCode id)
{
if (id > fatals_start && id < fatals_end)
return Err_Fatal;
if (id > warnings_start && id < warnings_end)
return Err_Warning;
if (id > notices_start && id < notices_end)
return Err_Notice;
if (id > errors_start && id < errors_end)
return Err_Error;
return Err_None;
}
void ErrorMngr::DefineErrors()
{
List.resize(fatals_end+1);
List.at(Warning_Hex_Start) = "Hexadecimal notation is 0xN, 0 missing";
List.at(Warning_Null_Expression) = "Bad expression will evaluate to 0";
List.at(Warning_Param_Count) = "Expected %d parameters, found %d";
List.at(Err_String_Terminate) = "String not terminated properly";
List.at(Err_String_Extra) = "Unexpected characters after string end (character '%c')";
List.at(Err_Unexpected_Char) = "Unexpected character found (character '%c')";
List.at(Err_Wandering_Stuff) = "Unknown directive placed outside of a section";
List.at(Err_Symbol_Reuse) = "Symbol \"%s\" already defined on line %d";
List.at(Err_Invalid_Stor) = "Invalid DAT storage identifier \"%s\"";
List.at(Err_Unknown_Symbol) = "Unknown symbol \"%s\"";
List.at(Err_Symbol_Type) = "Expected symbol type %d, got %d (bad symbol)";
List.at(Err_Invalid_Symbol) = "Invalid symbol";
List.at(Err_Opcode) = "Invalid or unrecognized opcode";
List.at(Err_Unmatched_Token) = "Unmatched token '%c'";
List.at(Err_Param_Count) = "Expected %d parameters, found %d";
List.at(Err_Unknown_Define) = "Unknown define referenced";
List.at(Err_Misplaced_Directive) = "Misplaced preprocessor directive";
List.at(Err_Bad_Label) = "Label referenced without being created";
List.at(Err_Bad_Not) = "Wrong type argument to bit-complement";
List.at(Err_Invalid_Operator) = "Operator used on bad type";
List.at(Err_Invalid_Pragma) = "Invalid pragma";
List.at(Err_Invalid_Proc) = "Procedure referenced that does not exist";
List.at(Err_FileNone) = "No file specified";
List.at(Err_FileOpen) = "Could not open file \"%s\"";
List.at(Err_NoMemory) = "Ran out of memory";
List.at(Err_PragmaStacksize) = "Invalid stacksize on #pragma stacksize";
List.at(Err_InvalidMacro) = "Invalid or empty macro definition";
List.at(Err_SymbolRedef) = "Symbol \"%s\" already defined on line %d";
List.at(Err_Reserved) = "Symbol assigned to a reserved token";
List.at(Err_MacroParamCount) = "Parameter count for macro \"%s\" incorrect";
List.at(Err_FatalTokenError) = "Fatal token error encountered";
List.at(Err_Invalid_Section) = "Section identifier \"%s\" is not valid, ignoring section.";
}
void ErrorMngr::PrintReport()
{
static char *ErrorSwi[4] = {"Notice", "Warning", "Error", "Fatal Error"};
int i = 0;
printf("+---------------------------+\n");
for (i=0; i<4; i++)
{
printf("| %ss: %s%d |\n", ErrorSwi[i], (i!=3)?"\t\t":"\t", Totals[i]);
}
printf("+---------------------------+\n");
}
void ErrorMngr::ErrorMsg(ErrorCode error, ...)
{
static char *ErrorSwi[4] = {"Notice", "Warning", "Error", "Fatal Error"};
static char errbuf[1024];
ErrorType type = GetErrorType(error);
if (type == -1)
return;
int curLine = 0;
if (line == -1)
{
curLine = ((Compiler *)Cmp)->CurLine();
} else {
curLine = line;
line = -1;
}
va_list argptr;
va_start(argptr, error);
if (((Compiler *)Cmp)->CurLine() == -1)
sprintf(errbuf, "%s(%d): %s\n", ErrorSwi[type], error, GetError(error));
else
sprintf(errbuf, "%s(%d) on line %d: %s\n", ErrorSwi[type], error, curLine, GetError(error));
vprintf(errbuf, argptr);
va_end(argptr);
Totals[type]++;
if (type == Err_Fatal)
exit(0);
if (type > HighestError)
HighestError = type;
}
const char *ErrorMngr::GetError(ErrorCode id)
{
if (id == fatals_start || id == fatals_end)
return NULL;
if (id == warnings_start || id == warnings_end)
return NULL;
if (id == notices_start || id == notices_end)
return NULL;
if (id == errors_start || id == errors_end)
return NULL;
if (id < notices_start || id > fatals_end)
return NULL;
return List.at(id);
}
int ErrorMngr::DerefSymbol(std::string &str, int sym)
{
return ((Compiler *)Cmp)->DerefSymbol(str, (SymbolType)sym);
}
bool ErrorMngr::IsSymbol(std::string &str)
{
return ((Compiler *)Cmp)->IsSymbol(str);
}
void ErrorMngr::SetLine(int ln)
{
line = ln;
}

109
compiler/scasm/amx_error.h Executable file
View File

@ -0,0 +1,109 @@
/* AMX Assembler
* Copyright (C)2004 David "BAILOPAN" Anderson
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#ifndef _INCLUDE_AMX_ERROR
#define _INCLUDE_AMX_ERROR
typedef enum
{
Err_None=-1,
Err_Notice,
Err_Warning,
Err_Error,
Err_Fatal,
} ErrorType;
typedef enum
{
notices_start,
notices_end,
warnings_start,
Warning_Hex_Start,
Warning_Null_Expression,
Warning_Param_Count,
warnings_end,
errors_start,
Err_String_Terminate,
Err_String_Extra,
Err_Unexpected_Char,
Err_Invalid_Section,
Err_Wandering_Stuff,
Err_Symbol_Reuse, /* Non-fatal version of Redef */
Err_Invalid_Stor,
Err_Unknown_Symbol,
Err_Symbol_Type,
Err_Invalid_Symbol,
Err_Opcode,
Err_Unmatched_Token,
Err_Param_Count,
Err_Unknown_Define,
Err_Misplaced_Directive,
Err_Bad_Label,
Err_Bad_Not,
Err_Invalid_Operator,
Err_Invalid_Pragma,
Err_Invalid_Proc,
errors_end,
fatals_start,
Err_FileNone,
Err_FileOpen,
Err_NoMemory,
Err_PragmaStacksize,
Err_InvalidMacro,
Err_SymbolRedef,
Err_Reserved,
Err_MacroParamCount,
Err_FatalTokenError,
fatals_end,
} ErrorCode;
class ErrorMngr
{
private:
void DefineErrors();
const char *GetError(ErrorCode id);
ErrorType GetErrorType(ErrorCode id);
private:
std::vector<const char *> List;
ErrorType HighestError;
void *Cmp;
int Totals[4];
int line;
public:
ErrorMngr();
ErrorMngr(void *c);
void Clear();
void ErrorMsg(ErrorCode error, ...);
ErrorType GetStatus() { return HighestError; }
void PrintReport();
int CurLine();
int CurCip();
void SetLine(int ln);
int DerefSymbol(std::string &str, int sym = 0);
bool IsSymbol(std::string &str);
};
#endif //_INCLUDE_AMX_ERROR

182
compiler/scasm/amx_label.cpp Executable file
View File

@ -0,0 +1,182 @@
/* AMX Assembler
* Copyright (C)2004 David "BAILOPAN" Anderson
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#include "amxasm.h"
LabelMngr::~LabelMngr()
{
Clear();
}
LabelMngr::Label::Label()
{
cip = -1;
sym = 0;
}
void LabelMngr::Clear()
{
std::list<LabelMngr::Label *>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
if ( (*i) )
delete (*i);
}
List.clear();
}
LabelMngr::Label *LabelMngr::AddLabel(SymbolList::Symbol *sym, int cip)
{
LabelMngr::Label *p = new LabelMngr::Label;
p->sym = sym;
p->cip = cip;
List.push_back(p);
return p;
}
LabelMngr::Label *LabelMngr::FindLabel(std::string &sym)
{
std::list<LabelMngr::Label *>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
if ( (*i)->sym->IsEqual(sym) )
{
return (*i);
}
}
return NULL;
}
bool LabelMngr::SetCip(std::string &sym, int cip)
{
LabelMngr::Label *p = NULL;
p = FindLabel(sym);
if (p == NULL)
return false;
p->cip = cip;
return true;
}
void LabelMngr::QueueLabel(std::string &sym, Asm *ASM)
{
std::string d(sym);
LQ[d].push(ASM);
}
void LabelMngr::CompleteQueue(bool isLocal)
{
std::map<std::string,std::stack<Asm *> >::iterator i;
std::stack<Asm *> *stk = 0;
std::stack<std::map<std::string,std::stack<Asm *> >::iterator> DeleteStack;
std::string search;
Asm *ASM = 0;
LabelMngr::Label *p = 0;
for (i=LQ.begin(); i!=LQ.end(); i++)
{
search.assign( (*i).first );
p = FindLabel(search);
stk = &((*i).second);
if (p == NULL || p->cip == LabelMngr::ncip)
{
if ((!isLocal || (isLocal && search[0]=='_')) && CError)
{
while (!stk->empty())
{
CError->SetLine(stk->top()->line);
CError->ErrorMsg(Err_Bad_Label);
stk->pop();
}
DeleteStack.push( i );
}
} else {
while (!stk->empty())
{
ASM = stk->top();
ASM->params[0] = p->cip;
stk->pop();
}
DeleteStack.push( i );
}
}
while (!DeleteStack.empty())
{
LQ.erase(DeleteStack.top());
DeleteStack.pop();
}
}
int LabelMngr::GetCip(std::string &sym)
{
LabelMngr::Label *p = NULL;
p = FindLabel(sym);
if (p == NULL)
return ncip;
return p->cip;
}
bool LabelMngr::EraseLabel(std::string &sym)
{
std::list<LabelMngr::Label *>::iterator i;
LabelMngr::Label *L = 0;
for (i=List.begin(); i!=List.end(); i++)
{
L = (*i);
if ( L->sym->IsEqual(sym) )
{
i = List.erase(i);
L->sym = 0;
delete L;
L = 0;
return true;
}
}
return false;
}
void LabelMngr::PrintList()
{
std::list<LabelMngr::Label *>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
printf("Label:\t%s\t%d\t%d\n", (*i)->sym->sym.c_str(), (*i)->cip, (*i)->sym->line);
}
}

57
compiler/scasm/amx_label.h Executable file
View File

@ -0,0 +1,57 @@
/* AMX Assembler
* Copyright (C)2004 David "BAILOPAN" Anderson
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#ifndef _INCLUDE_AMXLABEL_H
#define _INCLUDE_AMXLABEL_H
class LabelMngr
{
public:
class Label
{
public:
Label();
SymbolList::Symbol *sym;
int cip;
};
public:
~LabelMngr();
LabelMngr() { CError = NULL; assert(CError!=NULL); }
LabelMngr(ErrorMngr *e) { CError = e; }
LabelMngr::Label *AddLabel(SymbolList::Symbol *sym, int cip);
LabelMngr::Label *FindLabel(std::string &sym);
int GetCip(std::string &sym);
void Clear();
bool SetCip(std::string &sym, int cip);
void QueueLabel(std::string &sym, Asm *ASM);
void CompleteQueue(bool isLocal = false);
bool EraseLabel(std::string &sym);
void PrintList();
private:
std::list<LabelMngr::Label *> List;
std::map<std::string, std::stack<Asm *> > LQ;
ErrorMngr *CError;
public:
static const int ncip = -1;
};
#endif //_INCLUDE_AMXLABEL_H

173
compiler/scasm/amx_macro.cpp Executable file
View File

@ -0,0 +1,173 @@
/* AMX Assembler
* Copyright (C)2004 David "BAILOPAN" Anderson
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#include "amxasm.h"
MacroList::~MacroList()
{
Clear();
}
void MacroList::Clear()
{
std::vector<MacroList::Macro *>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
if ( (*i) )
delete (*i);
}
List.clear();
}
MacroList::Macro::~Macro()
{
std::vector<std::string *>::iterator i;
for (i=argList.begin(); i!=argList.end(); i++)
{
if ( (*i) )
delete (*i);
}
argList.clear();
}
MacroList::MacroList()
{
printf("Not instantiated with a compiler\n");
exit(0);
}
MacroList::MacroList(void *c)
{
CError = ((Compiler *)c)->ErrorHandler();
Cmp = c;
}
std::string *MacroList::BeginReplacement(MacroList::Macro *macro)
{
std::string *mstring = new std::string(macro->macro);
macro->arg = macro->argList.begin();
macro->argpos = 0;
return mstring;
}
int MacroList::ReplaceArgument(MacroList::Macro *m, std::string *macro, std::string &arg, int pos = 0)
{
int bPos = 0;
bPos = FindSymbol(*macro, *(*m->arg), pos);
if (bPos != -1)
{
macro->replace(bPos, (*m->arg)->size(), arg);
bPos += (int)arg.size();
}
m->arg++;
m->argpos++;
return bPos;
}
void MacroList::EndReplacement(MacroList::Macro *m, std::string *macro)
{
if (m->arg != m->argList.end())
{
CError->ErrorMsg(Err_MacroParamCount, m->symbol.c_str());
}
m->arg = m->argList.begin();
m->argpos = 0;
}
MacroList::Macro *MacroList::AddMacroBegin(std::string &symbol, std::string &mac)
{
Macro *macro = new Macro;
macro->macro.assign(mac);
macro->symbol.assign(symbol);
return macro;
}
void MacroList::AddMacroArgument(MacroList::Macro *m, std::string &arg)
{
std::string *sArg = new std::string(arg);
m->argList.push_back(sArg);
}
void MacroList::AddMacroEnd(MacroList::Macro *m)
{
List.push_back(m);
}
MacroList::Macro *MacroList::FindMacro(std::string &sym)
{
std::vector<Macro *>::iterator i;
for (i=List.begin(); i!=List.end(); i++)
{
if ((*i)->macro.compare(sym) == 0)
return (*i);
}
return NULL;
}
void MacroList::SearchAndReplace(std::string &text)
{
std::vector<Macro *>::iterator i;
MacroList::Macro *m = NULL;
int pos=0, symPos=0, bPos=0, argPos=0;
for (i=List.begin(); i!=List.end(); i++)
{
m = (*i);
pos = FindSymbol(text, m->symbol, 0);
if (pos != -1)
{
/* Strip the arguments */
std::string argstring;
symPos = pos + (int)m->symbol.size();
argstring.assign(text.substr(symPos+1, text.size()-symPos));
std::vector<std::string *> argList;
((Compiler *)Cmp)->FindArguments(argstring, argList, bPos, true);
/* Build the macro */
std::string *ms;
ms = BeginReplacement(m);
std::vector<std::string *>::iterator j;
for (j=argList.begin(); j!=argList.end(); j++)
{
argPos = ReplaceArgument(m, ms, *(*j), argPos);
}
EndReplacement(m, ms);
/* Search and replace */
text.replace(pos, bPos-pos, *ms);
/* Cleanup */
delete ms;
i = List.begin();
}
}
}

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