2802 Commits

Author SHA1 Message Date
7e90fe8a70 Tagged 1.76c 2007-02-02 05:20:01 +00:00
68f1ce7a52 fixed an initialization bug 2006-12-23 22:05:51 +00:00
e5b0ed3af1 fixed bug am48866 part 2 2006-12-23 19:01:11 +00:00
49e70063fa fixed bug am48866 2006-12-23 18:59:30 +00:00
7aa4cf70be removed amd64 support from installer (and yep, installer's version is already up-to-date ;] ) 2006-12-19 19:50:20 +00:00
b661873426 removed amd64 crap 2006-12-19 14:34:41 +00:00
8e290cdf31 final build info 2006-12-19 14:26:31 +00:00
42f23a832a bumped version number for plugins 2006-12-19 14:24:01 +00:00
13e619bf97 bumped versions 2006-12-19 14:18:05 +00:00
4332d6c271 fixed bug am47617 2006-12-19 14:03:02 +00:00
627b3f0f98 Fixed bug 48522 2006-12-19 12:24:36 +00:00
b7b55d060a sawce's sdk fixes 2006-12-19 11:19:45 +00:00
b110021f4f fixed bug am48308 2006-12-19 11:12:12 +00:00
96c49f4ff9 defaulted value back to 0 for backwards compat 2006-12-19 11:03:00 +00:00
f53c877670 fixed bug am27152 2006-12-19 10:57:43 +00:00
b237317e50 Fixed bug am48018 2006-12-19 10:36:26 +00:00
73b2ceb855 fixed bug am47988 2006-12-19 03:32:58 +00:00
b64fb4678d fixed issue 48202 2006-12-19 02:35:16 +00:00
d6ed1a8d8a Fixed bug am48234 2006-12-19 02:24:09 +00:00
b762174c30 fixed bug am48275 2006-12-19 02:02:49 +00:00
86838bead1 Fixed bug am48294 2006-12-19 01:58:46 +00:00
e6c15d9f05 Fixed bug am48580 2006-12-19 01:57:18 +00:00
266ed797c5 Fixed bug at48523 2006-12-18 14:33:06 +00:00
93cb2060dd fixed typo 2006-12-11 04:07:55 +00:00
0cd1782d01 fixed bug at48369 once and for all 2006-12-10 22:58:28 +00:00
75a5dadd4d small bug fix, compressed exe again :x 2006-12-10 22:37:01 +00:00
f03449acbd fixed 3rd bug at48369 2006-12-10 22:32:49 +00:00
34f127b9aa fixed 2nd bug at48369 2006-12-10 22:25:09 +00:00
0c345ceebc fixed bug at48201 2006-12-09 18:23:52 +00:00
c5dc780635 correction since commit 3164 was accidental 2006-12-06 08:46:44 +00:00
fe0e461c76 checks if the none option is the majority vote 2006-12-06 07:41:38 +00:00
935da9f0de version bump? >:o 2006-12-05 19:31:22 +00:00
36e9f29d55 2006-12-03 02:20:32 +00:00
c66c076a03 fixed bug at47865 2006-11-28 20:04:04 +00:00
4eaea443e1 who would have thought that iterators change?! 2006-11-22 07:33:54 +00:00
299f1b5f62 Fixed bug am46960 (cannot unpause through menu) 2006-11-22 06:14:10 +00:00
4e7bf7e348 ! 2006-11-22 05:39:08 +00:00
d048996b50 fixed bug am47194 (journal crash) 2006-11-22 05:30:58 +00:00
a34c8daf34 again... oops 2006-11-22 04:17:08 +00:00
6cd5a51c8e fixed issue am47452 2006-11-22 04:14:56 +00:00
5cabf748ca fixed issue am47474 2006-11-22 04:13:39 +00:00
1905ea7295 added info about console commands 2006-11-22 02:47:15 +00:00
89158f9342 Added request am47144 (register_*cmd return id) 2006-11-22 02:45:12 +00:00
db7dc509e0 Fixed another serious bug where deleting menus and not returning PLUGIN_HANDLED would cause the iterator to fail and crash 2006-11-21 23:59:21 +00:00
c15a23a2a7 fixed a serious bug where deleted forwards could be placed in the re-use cache too soon 2006-11-21 23:06:50 +00:00
3e0866e57a fixed bug am47134 2006-11-11 19:05:46 +00:00
551e5298cc fixed bug am46924 2006-11-05 18:38:09 +00:00
dfea3e8a13 corrected typo (at46807) 2006-11-03 13:27:17 +00:00
e8a30e7187 bumped version 2006-11-01 00:33:30 +00:00
8a93673276 2006-10-31 22:53:29 +00:00
ece4db4f43 oh no, new version number 2006-10-31 20:37:43 +00:00
8b8cc3dd6b Fixed bug am46630: rename_file did not have a relative location version 2006-10-31 20:18:44 +00:00
b33e76d9c4 Fixed bug am46559 2006-10-31 19:48:47 +00:00
6fb6d7d399 Fixed bug am46699 - dod stats.sma did not show multi-lingual menus correctly 2006-10-31 19:42:34 +00:00
5649a17502 fixed silly translation bug 2006-10-31 19:38:30 +00:00
5cfc2df359 fixed potential in-game bug 2006-10-31 19:36:47 +00:00
1ac390b54c Fixed version # 2006-10-31 19:31:54 +00:00
102c2b219f Fixed bug am46336 - could not compile TraceLn 2006-10-27 05:53:09 +00:00
4e1d420495 added AMX_ERR_GENERAL to the error list 2006-10-27 05:49:34 +00:00
e93e75fa39 Bumped version numbers 2006-10-27 05:47:38 +00:00
90c213bc6d fixed querying invalid players 2006-10-27 05:41:04 +00:00
6c3e7e7ee0 removed another get_players("ae") 2006-10-27 05:40:09 +00:00
8a2528108d Fixed bug am46378 2006-10-25 16:54:37 +00:00
a65d65bee4 fix for bug am46266: TFC team names not picking up 2006-10-24 22:57:19 +00:00
483403aa3a Fixed bug am46335 - text spacing not aligned in adminchat 2006-10-24 22:30:15 +00:00
2a1dbf5247 Fixed bug am46350 2006-10-24 17:13:02 +00:00
7aa687eb69 Attempted a patch for am46340 2006-10-24 17:09:28 +00:00
699cb2a6d6 fixed bug at45677 2006-10-22 19:15:36 +00:00
7b82bc7b76 several bug fixes in the auto-update system, bumped version to 1.4.3 final and improved code snippets feature (can now append or insert snippet into new line) 2006-10-22 18:56:39 +00:00
ed43b8a5ac Changed to use CreateMultiForwardEx() instead 2006-10-22 03:52:02 +00:00
d2ebca38a1 Experimental addition to CreateMultiForward() for bcompat 2006-10-22 03:49:23 +00:00
d542015214 Fixed bug am46112 2006-10-22 00:45:33 +00:00
d84c3a3798 Fixed bug am46058, unpausing stopped plugins 2006-10-21 21:48:24 +00:00
405d9ff48e bumped trunk version 2006-10-21 21:27:07 +00:00
a63c728471 added two new tests to the menu test suite 2006-10-21 21:13:57 +00:00
a60e9d205b fixed bug where blanks misaligned the item selection process 2006-10-21 21:13:39 +00:00
553a950b98 added comment :( yes we broke backwards compat 2006-10-21 20:20:44 +00:00
955e827b19 Fixed bug am45492 (stats always resetting) 2006-10-21 19:23:16 +00:00
00380cfe4c fixed a bug in get_func_id (thanks P34CH_34732) 2006-10-02 06:12:02 +00:00
12ecf026db hack for backwards compat layer (thanks suicid3) 2006-10-02 06:07:38 +00:00
3fa6cd3227 added a timeout test which does not work, thanks MySQL 2006-10-01 19:59:27 +00:00
fe1ebfe7bb fix for 45337 and some other little things 2006-10-01 19:46:56 +00:00
f3057efd7d updated the test suite 2006-10-01 18:36:15 +00:00
39d5ea94fb Added extra param to is_in_viewcone to switch between a 2D and 3D calculation
Neither is still as accurate as I want them to be though :\
2006-10-01 06:08:39 +00:00
90f11b52bc Fixed am45318 - Some wrong constants from TraceResult enum 2006-10-01 02:39:59 +00:00
9740f6469d this feature is just for sawce (updated go to line dialog) 2006-09-30 19:03:49 +00:00
461e7de151 fixed bug at45362 2006-09-30 18:49:28 +00:00
c2695a8cd8 updated version # 2006-09-26 00:25:01 +00:00
5ded9eef2a Bumped version numbers to 1.76a 2006-09-25 23:48:07 +00:00
44617778c7 Fixed bug am40911 (round kill stats persisting for spectators) 2006-09-25 23:04:33 +00:00
647d226764 synchronized more hud messages as per am45020 2006-09-25 17:34:33 +00:00
f086273d2b Attempt at accuracy improvement for is_in_viewcone with 3D calculation (am44838) 2006-09-22 15:11:51 +00:00
afde57b27e fixed bug am45088 (studio icon left on desktop after uninstall) 2006-09-22 14:49:04 +00:00
c4453a9593 fixed tense error in English 2006-09-22 14:46:38 +00:00
020b3a5963 test fix for bug am44973 (knife headshots) 2006-09-22 03:47:04 +00:00
3720810b61 fixed bug am44694 (is_user_alive() on TFC connect failing) 2006-09-21 23:33:05 +00:00
98e20e0fc7 Fixed translation errors from am45015 2006-09-21 17:43:16 +00:00
e72aff5c14 Fixed bug am44956 (extra plugin file lists not working) 2006-09-21 17:18:04 +00:00
63bc8885c9 committed fix for bug am45017 (phrase not translated) 2006-09-21 17:01:21 +00:00
ff8fd747c5 Fixed bug am44964 (thread crash on bad database) 2006-09-21 16:54:14 +00:00
98278b7bb5 small bug fix, bumped version to 1.76a 2006-09-20 15:12:49 +00:00
09df281556 Fixed am44998 2006-09-20 02:50:58 +00:00
4cc460cfbe component update, fixed small bug 2006-09-17 10:57:30 +00:00
947cb5f79d component update, fixed metamod plugins.ini bug once and for all 2006-09-16 23:26:24 +00:00
73386b12c5 added silent backwards compatibility for a broken plugin 2006-09-16 00:16:13 +00:00
57160763af Fixed threaded queries not having an IQuery assignment 2006-09-15 23:11:35 +00:00
1f0778b14e Fixed threader not checking the state on looping 2006-09-15 21:39:20 +00:00
3c923170a9 whoa, forgot a SEMICOLON 2006-09-14 08:06:08 +00:00
09beb4b81e Fixed bug am44776 2006-09-14 08:00:55 +00:00
f48aea7a72 Merged in rebuilds of compiler for latest changes 2006-09-14 07:45:54 +00:00
63ad5727ef this SHOULD fix the ftp bug 2006-09-13 21:11:53 +00:00
61525e9638 fix for getFuncsNum() on invalid forward 2006-09-13 19:46:32 +00:00
918e1c3195 Better, but still not perfect. :( 2006-09-13 13:44:37 +00:00
6e56aed778 More tiny bcompat stuff. admincmd is now source compatible at least 2006-09-13 10:58:47 +00:00
87c3e1dc82 attempt for bug am44778 - plugin_log() did not function in logevents properly 2006-09-13 06:36:59 +00:00
d925dc6e41 bugfix: correct string length computation in replace_all 2006-09-12 13:26:40 +00:00
651c5d9f01 added more api to help with amxmod compat layer
cleaned up some more bcompat stuff
2006-09-12 07:59:56 +00:00
4f8917ec44 experimental hack fix for code generation bug 2006-09-12 07:42:15 +00:00
1c265733e1 small fix 2006-09-11 16:56:25 +00:00
14a068532f this should fix the bug where metamod's plugins.ini is being overwritten even if it already contains an entry of amxx's mm dll 2006-09-11 16:53:26 +00:00
3c379469d5 added get_cmdaccess() 2006-09-10 22:16:04 +00:00
2df8b4269e fixed bcompat trans + optimized it a bit
added bcompat trans support to format() and copy()
2006-09-10 22:08:52 +00:00
3d74b7cf09 this should have been disabled by default 2006-09-10 18:20:51 +00:00
47e2214f09 Synced MSVC8 project for engine 2006-09-10 16:47:49 +00:00
4413e54058 LogType checking is not necessary, LogError is always type 1 2006-09-10 12:07:01 +00:00
14aff9b19b added simple access level wrappers (Obbin) 2006-09-10 10:14:58 +00:00
38cb94050e updated for latest source tree 2006-09-10 09:25:27 +00:00
c294b91ca4 fixed up module support 2006-09-10 09:21:09 +00:00
d95f794844 rewrote replace_all()
added replace_all() tests
2006-09-10 08:15:00 +00:00
3754604686 Fixed a serious bug in replace_all() that could make replaces fail or corrupt random data 2006-09-10 07:23:08 +00:00
4bd356079c testsuite now included 2006-09-10 06:46:06 +00:00
c67e19a62f updated credits + look for 1.76 2006-09-10 06:35:54 +00:00
96c29d5376 merged linux build of latest compiler 2006-09-10 06:35:19 +00:00
65eb0279b2 merged in compiler change for amxmod_compat 2006-09-10 06:33:55 +00:00
c287985a66 fixed up build process 2006-09-10 06:29:22 +00:00
1b9ef4d268 2006-09-10 05:16:26 +00:00
02fb807a0b Added request am44517 (jRaven, spectator team) 2006-09-10 05:13:03 +00:00
f880fc6ee9 added request am44229 - more error log info 2006-09-10 04:52:43 +00:00
f6f6bcc356 added a note to hostage natives for CZ 2006-09-10 04:36:44 +00:00
4f95899d2e Added request am44580 (simple query w/ formatting) 2006-09-10 03:46:35 +00:00
adf12bf348 potential fix for am44179 (array is too small) 2006-09-10 03:32:46 +00:00
c7febb4447 fix for issue am44593 2006-09-10 03:01:21 +00:00
77e4d85002 fixed up a callfunc issue and added copyback parameter 2006-09-10 02:30:10 +00:00
418efa4088 fixed bug am44544 (log forward broken) 2006-09-10 01:08:29 +00:00
4599b59834 corrected issue am44595 2006-09-10 00:51:35 +00:00
751e8e6299 Might as well update this too while I'm at it (Kugatsu, Septiembre, September!) 2006-09-09 20:27:09 +00:00
4eb8c4e295 Synced this or something... 2006-09-09 20:21:29 +00:00
5a4b1d2f03 Fixed some GCC warnings for Werror 2006-09-09 20:12:50 +00:00
b5498818a3 updated the GEOIP API 2006-09-09 11:41:48 +00:00
5286672268 finalizing rc3 builds 2006-09-09 03:29:13 +00:00
8df33abd70 initial import of the bcompat plugins (userland layer) 2006-09-08 14:49:54 +00:00
38e7b9ff58 unbroke the build 2006-09-08 14:46:34 +00:00
621c120b71 finished merging in the glorious bcompat changes 2006-09-08 14:11:29 +00:00
c9c2943c05 MySQL and SQLite can actually use 4.1 here... Also libstdc++ == ugh 2006-09-04 08:28:08 +00:00
ed5395a54a AMD64 building fixes and such 2006-09-03 03:48:54 +00:00
557958b408 Removed some amxmod compat stuff for now so this can actually compile and link properly again 2006-09-03 02:39:13 +00:00
2905217607 Fixed this o_O 2006-09-02 08:08:05 +00:00
78956f3d89 merged bcompat changed into trunk
removed amxmod compat files for now
2006-09-01 03:29:27 +00:00
95537e4840 fix for issues where bots might not 'cache' properly? 2006-09-01 02:22:47 +00:00
35a96176fa Fixed bug am43881: hideslots not working on first map 2006-09-01 01:40:37 +00:00
6a28bc602a Request am43716 - moved IVecFVec and FVecIVec around 2006-09-01 01:34:43 +00:00
72f59422d5 turns out this isn't even needed 2006-08-28 22:08:20 +00:00
cba554d193 fixed this up for gcc-3.4 and no lstdc++.a 2006-08-28 21:21:06 +00:00
76a4d84dbb Fixed this up to work, eh. no more libstdc++.a for you 2006-08-28 21:03:27 +00:00
ec83efbdf3 These did not sync to trunk properly (SDK fix and some updates) 2006-08-28 19:29:20 +00:00
9bd22661ff Added SQL_GetInsertId() 2006-08-28 19:17:26 +00:00
baf406cb6a Fixed bug with floatatan() returning wrong values when trying to get angle in degrees or grades 2006-08-28 17:37:15 +00:00
388711e969 Synced bcompat tree additions and fixes found so far 2006-08-28 11:08:18 +00:00
cb01ff1dc3 Fixed two minor annoyances
1) Paths in config file are now checked before building is attempted (prevents some potential crashes)
2) The compression routines can now handle spaces in the 'output' path
2006-08-28 03:27:16 +00:00
5c23cf416e Fixed makefiles (yes, again) for hlsdk move 2006-08-27 05:29:04 +00:00
b8b3107210 Moved hlsdk out of trunk 2006-08-27 05:14:59 +00:00
2cd1449f88 Ugh, part 2 2006-08-27 05:01:32 +00:00
3691e98814 Ugh, should not have removed that 2006-08-27 04:56:27 +00:00
709b3705ab Fixed warnings that only appeared when compiling amd64 binaries 2006-08-27 04:50:20 +00:00
22bef17660 Changed makefiles to point to trunk's modified version of the HL SDK 2006-08-27 03:13:11 +00:00
b4767cb99e fixed amxxpc builds 2006-08-27 02:34:03 +00:00
30235e05e5 Moved modified HL SDK to trunk 2006-08-27 02:22:59 +00:00
28c4ea4fec Removed odd debug message 2006-08-27 02:21:27 +00:00
58e1254876 oops 2006-08-27 02:18:08 +00:00
81ac41037b GCC Wallification 2006-08-27 02:17:18 +00:00
6786b0e356 Fixed bug am43875 2006-08-27 01:38:47 +00:00
af5a7f5434 fixed am43858 (beta report) 2006-08-25 22:06:59 +00:00
cd6f3dfd71 Updated SDK for GCC-4.1 2006-08-25 00:53:37 +00:00
a7fcf76244 fixed up for gcc-4.1 2006-08-25 00:28:36 +00:00
3878c7492a fixed these for gcc-4.1 2006-08-25 00:26:51 +00:00
4981f46c41 Forgot to sync this 2006-08-24 22:58:48 +00:00
ee4f064073 Initial bump to GCC-4.1 2006-08-24 22:44:57 +00:00
a42a5f1a0e updated for latest build tree 2006-08-24 21:42:25 +00:00
bab5bb5a72 Attempt to fix up am41036 2006-08-24 21:13:52 +00:00
58abc3a655 Request am28110 - Added tfc_get_user_goalitem native to determine if player is carrying a goal item (such as a flag or keycard) 2006-08-22 21:50:27 +00:00
0cb316c764 Removed amd64 stuff from makefiles for projects that don't need it 2006-08-21 15:32:07 +00:00
74d3d23f13 Added tfc_get/setweaponammo to set ammo in weapon's clip (not backpack ammo) 2006-08-21 13:50:51 +00:00
5b47da7cee Finalized binlogging update by removing another unnecessary opcode and updating the reader 2006-08-21 04:18:13 +00:00
45b67b6e2c more tweaks to binlogs 2006-08-21 03:46:20 +00:00
44a17fe646 documented new file format
increased file version
2006-08-21 03:11:19 +00:00
d21a352167 expanded comment for get_players() 2006-08-21 03:07:25 +00:00
4fc2c9cebb fixed bug am41259 2006-08-21 02:08:01 +00:00
4692335abb bumped version 2006-08-21 02:01:57 +00:00
4e639d09de Added sorting.inc to the installer package 2006-08-21 01:55:34 +00:00
deefc504e1 Added request am29544 (nvault_touch) 2006-08-20 21:23:38 +00:00
ea262171db fixed bug am42321 2006-08-20 21:19:50 +00:00
e49af85119 Fixed bugizzle am43566 2006-08-20 21:01:35 +00:00
dec169562b missed the FP_DONE's 2006-08-20 17:57:00 +00:00
0acaf1b476 MSVC8 sync 2006-08-20 11:18:31 +00:00
2cf396be3e weird typo 2006-08-20 08:00:55 +00:00
df7ee94b83 Committed sorting natives as per request am23838 2006-08-20 04:46:34 +00:00
afe7df87d2 Added request am40169 2006-08-20 00:20:47 +00:00
c80b7fd422 updated this 2006-08-19 23:23:30 +00:00
adad1384ff now it compiles 2006-08-19 23:18:11 +00:00
fb0d728720 optimized a stock and created message_stocks.inc (am29627) 2006-08-19 23:02:01 +00:00
a1e8701236 added request at40243 2006-08-19 22:33:02 +00:00
df5c6ccb95 added format test 2006-08-19 22:23:45 +00:00
8a58dd8806 this is a bit more standards compliant 2006-08-19 22:21:42 +00:00
67f53505ce Added request am41635 and fixed a bug with passing (1<<31) 2006-08-19 22:15:34 +00:00
e7cc87a610 now yes 2006-08-19 20:21:00 +00:00
b572cdff2f Updated SQLX test suite for plugin_end() bug 2006-08-19 19:39:57 +00:00
446d4b8a5d Synced threading changes between MySQLX and Sqlite 2006-08-19 19:37:45 +00:00
db5c9c114e Queries in plugin_end() now resolve correctly. 2006-08-19 19:29:33 +00:00
408f61c6d6 Added request am42871:file names in binlogs 2006-08-19 18:44:12 +00:00
042b9f7f4b Fixed bug am42307 (nvault_open did not return -1 on failure) 2006-08-18 22:46:07 +00:00
a8b4ebbe70 Fixed bug am42097 (FM disabling hooks too early) 2006-08-18 22:17:51 +00:00
ed0312567d Fixed bug am42213 2006-08-18 20:53:31 +00:00
e80679afd0 Fixed bug am42213 2006-08-18 20:52:49 +00:00
9093a178f1 Fixed bug am41900 (command name too long) 2006-08-18 20:31:23 +00:00
4fe8c71d62 Added request am41375 (animation toggling on silenced weapons) 2006-08-18 20:12:20 +00:00
f5414ff8de Fixed issues with stats.dat files loading (bug am41030) 2006-08-18 19:49:32 +00:00
f3a833dd1b more warning fixes 2006-08-18 19:08:51 +00:00
e2932fb61a Request am40967 (logging set_fail_state) 2006-08-18 19:02:37 +00:00
43bd5fc732 removed unused stuff 2006-08-18 14:02:07 +00:00
377c01eac7 just a little detail 2006-08-18 13:23:02 +00:00
7af82f0d4f n0thing 2006-08-18 13:05:09 +00:00
010ef526c5 added amxx_setpl_curweap to export table 2006-08-18 06:05:57 +00:00
659448ce29 clarified the API 2006-08-18 06:00:26 +00:00
d7d0d72ceb fixed a serious bug with byref values and callfunc_push*() where the heap was used incorrectly, causing passed data to be easily corrupted.
added callfunc_push_array() (am42810)
2006-08-18 05:52:21 +00:00
79f8525c4a bumped version number 2006-08-18 03:34:03 +00:00
2869c8f4f6 Fixed bug at43313 2006-08-18 03:33:46 +00:00
b7076fc572 Committed implementation of request am42697 2006-08-18 02:19:38 +00:00
f7691a51c6 Added request am43012: per-map plugin files 2006-08-17 19:34:34 +00:00
5524d5dca1 Added the ability to mark plugins as "disabled." This blocks the plugin from loading in other files.
Fixed a bug where the PCALM cache was invalidated on file read, rather than plugin finalization.
2006-08-17 18:25:23 +00:00
e015df58c8 More GCC compatibility fixes 2006-08-17 16:43:47 +00:00
db175082ad Fixed some bugs/warnings that GCC caught 2006-08-17 16:41:41 +00:00
8b055fd1d0 Added GCC-4.1 support
Disabled potentially bad optimization
2006-08-17 01:39:47 +00:00
6295813723 Work-around for a code generation bug in GCC 2006-08-17 00:23:03 +00:00
a03cd1385d clarified this 2006-08-15 20:21:25 +00:00
1b065c6f36 bug fixes, bumped version to 1.4.3 and advanced auto-indenter a bit 2006-08-02 08:43:24 +00:00
e0115ba2dc final version (I hope) 2006-08-01 17:26:14 +00:00
4306c4f5b6 Fixed am42013
TFC plmenu - team menu didn't allow changing from blue team
All plmenu - Team change message was always in language of the admin that changed the player
2006-07-26 00:53:45 +00:00
3b62b91fb7 Fixed bug am41961 (Orangutanz)
GetPlayerAuthId, GetPlayerWONId, and IsMapValid were not being reset on mapchange
2006-07-24 16:15:09 +00:00
32b1149716 bumped version number to 1.76, zomg! 2006-07-23 01:04:39 +00:00
f92017516f few changes, little bug fix for ESF (again) 2006-07-22 11:46:43 +00:00
8837c52d81 fixed case-sensitivity bug and another typo that prevented the installer from asking for the ESF add-on when installing amxx on the listen server
tiny optimization, fixed bug at41769
2006-07-22 01:11:38 +00:00
6ab3c50813 tiny optimization, fixed bug at41769 2006-07-22 01:08:36 +00:00
0c06cdca36 fixed case-sensitivity bug and another typo that prevented the installer from asking for the ESF add-on when installing amxx on the listen server 2006-07-22 01:06:32 +00:00
ce59ee0362 Partially fixed am41769 (some missing ESF files) 2006-07-21 07:20:52 +00:00
c2d2e8aef5 Fixed issue am41768 (wrong plugin name) 2006-07-21 06:45:37 +00:00
9780a6c36f Fixed issue am41777 (missing time.txt) 2006-07-21 06:43:45 +00:00
1a6f4e08b2 Added request am41585 (Orangutanz) 2006-07-19 04:23:00 +00:00
49f46a5f4c Fixed wrong team names in TFC plmenu am41563 2006-07-18 20:18:23 +00:00
51ee2e4846 this line doesn't look necessary 2006-07-18 09:59:36 +00:00
928091864f Added request am41367 (devcones) 2006-07-18 09:20:57 +00:00
fab4a43915 Fix for am41317, forward re-entrancy problem 2006-07-18 04:39:54 +00:00
b44951295d I forgot to remove you didn't I am41542 2006-07-17 23:11:57 +00:00
db3beb9b98 Various pev issues fixed am41542 2006-07-17 20:01:11 +00:00
2dc3f2bec9 fixed bug at41483 2006-07-17 12:42:59 +00:00
6ac889f6e2 fixed bug at40963 2006-07-16 13:23:56 +00:00
87ac42cd98 fixed makefile for changes 2006-07-16 07:24:35 +00:00
f64d2366e9 added 2 memfile files 2006-07-16 02:27:51 +00:00
34d71eb4dc built latest compiler 2006-07-16 02:26:58 +00:00
fb2e0c5f6c compiler is fast now 2006-07-16 02:25:32 +00:00
65513c6037 bumped version 2006-07-16 02:22:38 +00:00
b859001feb Fixed path to Pawn include file in MSVC projects (Fun module) 2006-07-13 03:22:30 +00:00
895039308f Added CZ models to CsInternalModel enum (request at41295) 2006-07-13 03:07:24 +00:00
43b8ea4657 deleted outdated or unneeded dirs in dlls 2006-07-12 18:25:41 +00:00
0eca298c2a Fixed makefile paths (I think) 2006-07-12 06:05:06 +00:00
8d4f28ac62 a typo_O 2006-07-09 19:10:08 +00:00
57ccee89f2 bump3d v3rsion 2006-07-04 17:37:49 +00:00
4b649469b0 underlined "FTP" in FTP install page
bumped version number to 1.75a
2006-07-04 17:36:41 +00:00
f1d3274f0e fixed bug at40706 (angle_vector) 2006-07-02 15:24:00 +00:00
0c668753fb fixed bug where indenter unindented the entire code
menu generator: now checks for bad menu keys (simple menu, old style)
2006-06-30 21:25:26 +00:00
2edbf72391 fixed bug where indenter unindented the entire code 2006-06-30 21:23:26 +00:00
e1caa575e7 now checks for bad menu keys (simple menu, old style) 2006-06-30 21:22:46 +00:00
9dcdba439a added fix for binlog bug with failed plugins
added experimental emsg natives
fixed target's velbyaim bug find
added native for setting player curweapon
2006-06-28 10:07:20 +00:00
d3af14c957 experimental emsg natives 2006-06-28 10:01:55 +00:00
f08bbbc45f dep recompile 2006-06-28 02:31:07 +00:00
99a2b54530 fixed small bug in the documents bar 2006-06-15 00:43:09 +00:00
6f20664140 Wow 2006-06-12 21:08:29 +00:00
06fbff7042 fixed floattocell bug, omg 2006-06-12 17:37:09 +00:00
bb609123fb Fixed comment next to zoom type enum 2006-06-12 10:08:54 +00:00
d832eb8fef fixed this up 2006-06-12 08:20:35 +00:00
fd67b07530 whoa, changes from twisty-san 2006-06-12 06:14:35 +00:00
c0396bf140 updated for another test 2006-06-12 06:12:46 +00:00
d55542aa8d fourth time's a charm 2006-06-11 22:04:10 +00:00
2e86f51cfe fixed this 2006-06-11 21:50:19 +00:00
Zor
84ec8ef007 - Added new forwards as well as new stocks 2006-06-11 21:47:11 +00:00
07e55f3b71 whoa 2006-06-11 09:01:30 +00:00
50311d14fb fixed bug at31100 (belsebub) 2006-06-11 08:58:15 +00:00
1088b209d9 added belsebub's test 2006-06-11 08:57:39 +00:00
63ec26f8c0 committed menu tester 2006-06-11 07:59:07 +00:00
07b5a819bf fixed more amx_ftoc errors that wouldn't occur in modules 2006-06-11 07:32:18 +00:00
8e03e67a8f fixed a menu exit calculation bug in newmenus (omg) 2006-06-10 22:12:46 +00:00
66d04f8def fixed another possible amx_ftoc() misusage 2006-06-10 21:00:33 +00:00
bce69e7116 fixed pcvar bug (thanks niluje) 2006-06-10 20:57:52 +00:00
d4bfddc034 added 2 new natives 2006-06-10 20:46:12 +00:00
373d25b0ce Removed some unnecessary code at31046 2006-06-10 14:38:04 +00:00
deb1b00416 synced fix 2006-06-10 01:34:27 +00:00
6b80e9e8d2 fixed a silly row bug 2006-06-09 08:47:52 +00:00
a19b00fd2f moved some hud messages to avoid more overlapping 2006-06-07 23:22:43 +00:00
8f2c9e9452 moved up imessage a bit 2006-06-07 23:11:45 +00:00
5463a84c12 fixed another stupid path bug
fixed more module loading bugs
2006-06-07 19:09:48 +00:00
68e1937a5c got rid of debug msg 2006-06-07 06:28:32 +00:00
d05c34b73c fixed a bug causing failed modules to register as successes. this also blocked handlers from being called. 2006-06-07 05:21:03 +00:00
c69777d8cc fixed stupid path bugs! 2006-06-07 04:44:03 +00:00
b3b9e72b01 fixed another newmenu calc bug 2006-06-06 17:59:38 +00:00
7f57e8377a oh, compiles now 2006-06-06 10:49:33 +00:00
036ab78828 added plugin semi-auto-loading shut it 2006-06-06 09:03:07 +00:00
e0f1a93d6e fixed a bug where an empty modules file would crash
fixed a bug where newmenu with default exit and a single page would not return MENU_EXIT on exit
2006-06-06 07:00:27 +00:00
eba189e2b9 fixed erroneous error message 2006-06-06 00:29:05 +00:00
5748ed84a2 oh, updated 2006-06-05 23:28:28 +00:00
9eb0d50f4c yams 2006-06-05 23:22:57 +00:00
24c5c10a31 oh, hello 2006-06-05 23:22:45 +00:00
c91f712363 some bugfixes and changes for the ftp panel 2006-06-05 23:20:59 +00:00
f6c9263940 Argh, did it again didn't I 2006-06-05 22:33:22 +00:00
ba87258a3d Added admin indentifier (red asterisk) to all menus that contain a user list at30358 2006-06-05 22:32:00 +00:00
011c9fa45c fixed "ghost module" problem 2006-06-05 19:19:43 +00:00
2c7ca33bf1 fixed a bug where HandleModule() took the mangled name instead of the demangled 2006-06-05 19:08:01 +00:00
2ece53fa38 fixed a bug where plmenu autoloaded cstrike 2006-06-05 19:07:19 +00:00
36ec7bc818 fixed a very minor parsing bug in plugins.ini 2006-06-05 18:48:01 +00:00
b4450bbee5 synced this change 2006-06-05 18:43:01 +00:00
c92145ee88 backwards compat fixes -
dbi_close() must return 0 on failure (not that it matters)
dbi_nextrow() must return 0 on RESULT_NONE
2006-06-05 08:21:28 +00:00
3fbf65103a fixed a crash bug 2006-06-05 08:06:57 +00:00
e7858b4cd7 Oops, guess I forgot this one 2006-06-05 07:52:21 +00:00
ad495cef13 Updated for vector.inc 2006-06-05 07:50:42 +00:00
17fb06f7bb Moved vector natives from engine to core at29896
Moved precache_generic from engine to core at30469
2006-06-05 07:48:54 +00:00
7d3ddf502c Synced MSVC8 project file 2006-06-05 05:29:26 +00:00
5940b4a6ca MSVC8 warning fix 2006-06-05 05:24:59 +00:00
9edf20866b Synced MSVC8 project file 2006-06-05 05:18:27 +00:00
30495aa34e Linking to zlib isn't necessary 2006-06-05 05:07:52 +00:00
45b8383eb9 lang sync (added bulgarian and l33t) 2006-06-04 23:49:47 +00:00
56e97a2b60 updated this t00 2006-06-04 19:42:08 +00:00
9857731dff removed x from sql names 2006-06-04 19:41:37 +00:00
915c3d244c merged in mysqlx fixes 2006-06-04 19:40:34 +00:00
24cdcde968 fixed heap corruption
improved memory usage
removed useless stringpooler
2006-06-04 19:26:43 +00:00
cef005317b wow I'm tired 2006-06-04 09:28:45 +00:00
1035c35c03 *** empty log message *** 2006-06-04 08:57:52 +00:00
2210c54d68 fixed 64bit bugz 2006-06-04 08:57:20 +00:00
e546c69041 fixed linux bug 2006-06-04 08:40:27 +00:00
36268f04d9 latest compiler builds 2006-06-04 08:10:14 +00:00
3fe24d8793 fixed some build problems 2006-06-04 07:49:07 +00:00
b3a91bc496 fixed a build error on gcc 2006-06-04 07:44:55 +00:00
8a529b100c or this 2006-06-04 07:42:46 +00:00
f1f683dca7 gcc didn't like this 2006-06-04 07:42:10 +00:00
afb8fb0019 fixed linux build 2006-06-04 07:37:44 +00:00
fb904f6e40 Linux build works now 2006-06-04 07:35:33 +00:00
73858b0fcd removed packing stuff 2006-06-04 06:43:48 +00:00
a5bd69ac4a MSVC8 project file fixed and updated 2006-06-04 04:35:53 +00:00
c6e17539ca zomg fixed warnings again o_O 2006-06-04 04:29:46 +00:00
e0b05c0b83 Yeah another possible warning fix perhaps 2006-06-04 03:59:14 +00:00
a44eb16360 MSVC8 fixes again, what the heck did I do before? o_O 2006-06-04 03:57:45 +00:00
fc429213d3 whoabug 2006-06-04 02:10:04 +00:00
80cbaa8217 updated these, reorg'd a tad 2006-06-04 01:55:47 +00:00
170dbcaaa9 whoa 2006-06-04 01:54:07 +00:00
7c1da54412 omgcommitted 2006-06-04 01:46:24 +00:00
c508f17bfe added sqlite3 db binary 2006-06-04 01:43:58 +00:00
1cdbfb50ad my test sql file 2006-06-04 01:40:42 +00:00
579cc83d54 this was broken too. make sure it builds next time ;) 2006-06-04 01:36:18 +00:00
be7bf671af sooomeooone broke the geoip build. 2006-06-04 01:31:31 +00:00
e1b9543d10 added these k 2006-06-04 01:22:10 +00:00
af8dea753e removed this SUCKA 2006-06-04 01:14:33 +00:00
d0d08800ef what 2006-06-04 01:05:20 +00:00
dafc10d878 added some more sqlx stocks
upgraded admin.sma to sqlx
fixed various amx_Addadmin bugs
2006-06-04 00:58:17 +00:00
ad0eafe66a fix for memory leak[?] 2006-06-04 00:29:27 +00:00
5ffb38b5bc fixed invalid pathnames passed to CacheAndLoadModules causing auto load not to work 2006-06-04 00:22:59 +00:00
b363b16d61 Added test suite, included sqlxtests 2006-06-03 23:51:11 +00:00
5522778aed fixed registerfuncex never actually registering
fixed requestfunc returning null when not querying
2006-06-03 23:14:09 +00:00
3a7d291513 fixed wrong aff ret val
updated sdk
2006-06-03 23:13:22 +00:00
fe603c29f0 fixed wrong aff return val 2006-06-03 23:13:02 +00:00
27ba10c8a0 fixed a reporting bug 2006-06-03 23:02:18 +00:00
34f5b3257d attempted some thread improvements[?]
fixed moduleconf bug
what
2006-06-03 22:26:43 +00:00
7367f29cb4 fixed a bug where defclasslib would search for lib instead of class 2006-06-03 21:44:35 +00:00
fc5e049e4a expanded MF_OverrideNatives API function a bit, to exclude named module(s) 2006-06-03 21:34:43 +00:00
1c2749fdf6 removed old sdk 2006-06-03 19:52:49 +00:00
aa1308e32e initial import of sqlitex 2006-06-03 19:52:21 +00:00
3cde89bc74 Don't look please 2006-06-03 19:45:03 +00:00
75b6aa192d Wowzers, fixed :\ 2006-06-03 19:41:36 +00:00
43ecf97f99 fixed spelling mistake 2006-06-03 19:29:29 +00:00
4ca564540e bumped version number to 1.75 2006-06-03 13:17:48 +00:00
c8d543929a Updated to June 2006-06-03 08:33:30 +00:00
e7e87ff040 updated to sqlite-3.3.5 2006-06-02 21:29:25 +00:00
ab40f426c6 Added missing colon at30601 2006-06-02 02:18:15 +00:00
7ecdf75d0d fixed typo 2006-05-26 22:08:52 +00:00
e6064af9fb added request at30290 (VEN)
fixed cs_get_user_buyzone returning true when user was in bombtarget zone or other specific areas
2006-05-26 18:26:59 +00:00
44a7b62963 possible fix at29931 2006-05-23 19:35:40 +00:00
ac1e3a9001 Added ClientPrintf engine function (request at30137) 2006-05-23 03:26:26 +00:00
7e36a19590 committed fix for bug atDIVINE (kami no buggu) 2006-05-22 00:00:11 +00:00
6af5516005 added request at26380 (KWo) 2006-05-21 22:02:22 +00:00
444e2caa68 fixed yet another bug 2006-05-19 22:09:43 +00:00
3d932c8a36 Removed take_damage at29909 2006-05-19 19:00:35 +00:00
2e63e1316c fixed bug at29945 2006-05-19 18:40:17 +00:00
b4a77512ae Fixed bug that didn't allow users to use "non-email accounts" for listen+dedicated server installations 2006-05-19 18:37:03 +00:00
b40f5e6637 request at29928
New callable engine function: AlertMessage
2006-05-19 06:01:55 +00:00
e0bed163ac added affinity stuff 2006-05-19 02:04:09 +00:00
bce3bce586 Added amx_ReRegister() and MNF_RegisterFunctionEx() 2006-05-19 01:54:51 +00:00
f9c9088303 added affinity implementation 2006-05-19 01:54:28 +00:00
9bbb0df492 fixed bug at29731 2006-05-18 16:18:14 +00:00
eafd402ead fixed *slaps himself* 2006-05-18 15:55:21 +00:00
cf9cdaa3d6 zomg, I guess I should move these too 2006-05-17 20:23:36 +00:00
a993ba159a Updated for message_const.inc 2006-05-17 20:14:36 +00:00
2d75dfe865 Even more include file changes...
1) Moved message_begin, message_end, and write_ natives to messages.inc
2) Moved MSG constants to message_const.inc
All completely backwards compatible with compiling older plugins of course :)
2006-05-17 20:08:04 +00:00
635b681825 Gah, nothing to say about this one 2006-05-17 19:37:34 +00:00
ef1347cb6c Oh, hello, one more constant 2006-05-17 19:36:42 +00:00
c0334deae1 Added a whole bunch of constants at29843
Some minor changes to some other inc files that aren't even worth mentioning
2006-05-17 19:33:45 +00:00
39a22813cb updated comment 2006-05-17 14:03:59 +00:00
d01d6b06fa little fix 2006-05-17 13:44:58 +00:00
6cb6ef9c84 updated for hlsdk_const 2006-05-16 21:45:33 +00:00
b953f285d0 Tended to request at29593 2006-05-16 21:42:06 +00:00
dc785a4369 Fixed bug at29628 2006-05-16 21:20:14 +00:00
a7de50a4bb fixed problem at29669 2006-05-16 21:15:41 +00:00
00fd007e7a fixed bug at29654 2006-05-16 21:08:19 +00:00
b6007e8223 Modified get_brush_entity_origin and ViewContents as per at29759 (Orangutanz) 2006-05-15 13:52:38 +00:00
25a2b11198 oh hello PM, here is another optimization 2006-05-14 15:59:28 +00:00
a0923e21ed improved using pm's magic (patent pending) 2006-05-14 15:20:25 +00:00
f51620c2d7 fixed worst bug ever 2006-05-13 20:49:37 +00:00
1370305fb0 Exactly why was all that old stuff there? o_O
(Hope I did the right thing, as I usually do the wrong thing here, err)
2006-05-13 15:57:33 +00:00
f7805623b0 added request at29591 2006-05-13 14:59:24 +00:00
9a34c7931a fixed bug at29636 2006-05-13 12:15:16 +00:00
b67e6c5269 Hello MSVC8 project. I'm just removing some files from you this time. Won't hurt one bit. 2006-05-12 04:55:54 +00:00
5e4d5a2c8f Hello MSVC8 project, may I update you? 2006-05-12 04:52:36 +00:00
567044c381 fixed indenter bug (I swear I fixed this bug years ago!) 2006-05-11 16:03:18 +00:00
b2b001c9e4 added M_ in front to match HLSDK and other things 2006-05-11 13:12:41 +00:00
793de6d8d2 added PI define (at29548) 2006-05-11 13:10:29 +00:00
d862f23929 Attempt for fix of bug at28381 2006-05-11 13:04:37 +00:00
f8809e2663 Fixed a backwards compatibility issue with free result 2006-05-11 12:11:42 +00:00
19f2be0c96 updated 2006-05-11 10:22:18 +00:00
6995b182c1 failsafe autoloading of libraries for 1.71- plugins 2006-05-11 10:19:09 +00:00
79f86bfabd updated comment 2006-05-11 10:07:32 +00:00
035c54350e module filter is expanded a tiny bit 2006-05-11 10:05:42 +00:00
d0a61ef581 Added request at28865 2006-05-11 08:55:29 +00:00
123215a53c removed these, no longer needed 2006-05-11 08:47:53 +00:00
9b68c0678a merged register_message into core
request at29428
2006-05-11 08:45:06 +00:00
e0fa5227d6 merged register_message into core 2006-05-11 08:36:20 +00:00
441ab14d3b moved register_message into core, yay 2006-05-11 08:35:21 +00:00
ed6e28c1d4 removed message functions from engine [!] 2006-05-11 07:49:45 +00:00
77f0e526bf Whoa. SetClientKeyValue fixed :\ 2006-05-11 03:34:13 +00:00
30ce0d9f1b Another pointless typo fix 2006-05-11 02:29:08 +00:00
8920a05bba mov gah, [newline_fix] 2006-05-10 14:38:11 +00:00
061da07af8 Yet another wondeful typo fix 2006-05-10 13:26:36 +00:00
da757b6c62 Um, ignore me please. Nothing to see here. Move along. 2006-05-10 13:25:29 +00:00
880b83a10b Typo fix! :o 2006-05-10 13:24:31 +00:00
76c1c78b5b up up and awayyy 2006-05-10 13:02:37 +00:00
afe19411b2 oh I forgot to commit this, basic-master-san 2006-05-10 12:40:44 +00:00
b2aff10e46 Added some comments to benefit all mankind :o 2006-05-10 12:35:21 +00:00
4e1123730c fixed lib class 2006-05-10 12:29:37 +00:00
8e3a5e6d58 sdk v4 2006-05-10 12:00:22 +00:00
beb975bdbf ohmygod like the modules are synced and updated for sdk v4 2006-05-10 11:53:22 +00:00
302b759fc8 oops :( 2006-05-10 11:31:17 +00:00
c6e8a356ee Added request at29487
1) New hookable Engine func: GetInfoKeyBuffer
2) New GameDLL func that can be called via engfunc: GetInfoKeyBuffer
3) New native: copy_infokey_buffer that copies data out of the specified info key buffer
4) EngFunc_InfoKeyValue, EngFunc_SetKeyValue, and EngFunc_SetClientKeyValue have been reworked
    so that they expect pointers to an info key buffer in order to work properly o_O
2006-05-10 11:28:00 +00:00
b12025093b added ability to override natives (someone shoot me) 2006-05-10 11:23:08 +00:00
de1f1eef8d Added request at29487
1) New hookable Engine func: GetInfoKeyBuffer
2) New GameDLL func that can be called via engfunc: GetInfoKeyBuffer
3) New native: copy_infokey_buffer that copies data out of the specified info key buffer
4) EngFunc_InfoKeyValue, EngFunc_SetKeyValue, and EngFunc_SetClientKeyValue have been reworked
    so that they expect pointers to an info key buffer in order to work properly o_O
5) Added some error messages to get_tr
2006-05-10 11:19:24 +00:00
25d4b6aea3 added these include files k 2006-05-10 10:42:49 +00:00
f9fd83b42e test commit of new sdk 2006-05-10 07:49:05 +00:00
1e6ba05ec9 corrected some changes for inclusion into base 2006-05-10 07:42:35 +00:00
dd7529b42c Fixed a bug where three of the new pragmas parsed spaces wrong 2006-05-10 04:51:07 +00:00
cfb36025b5 builds of latest compiler sources, and version bumped 2006-05-10 04:48:19 +00:00
f5cabb4bea fixed infinite loop (oops) 2006-05-10 04:44:07 +00:00
58209dfb37 Added fix for __DATE__, added __TIME__
Added tag table crap for new autoloading feature
Version bump
2006-05-10 03:44:35 +00:00
a29f8d0651 Cleaned up error reporting a bit 2006-05-10 03:43:53 +00:00
f600a96657 Initial massive import of the new code module auto-loading code
Important difference - pubtags table is used instead of library table!
2006-05-10 02:32:34 +00:00
d8c8e72745 Committed fix for bug at29456 2006-05-09 23:43:06 +00:00
9a34213992 Committed rebuild of ASM stuff for bug at29456 2006-05-09 23:43:05 +00:00
67d4c5ccad bumped version 2006-05-09 22:47:16 +00:00
6b794d4a9d Version bump 2006-05-08 04:37:15 +00:00
ca3e8582e3 Added missing files to MSVC8 project (libraries.h and libraries.cpp)
Fixed some MSVC8 errors with new files
Bumped version
2006-05-08 04:13:37 +00:00
7669ab02f6 fixed prototype error 2006-05-08 00:26:32 +00:00
c6f8749242 real fix for memleak 2006-05-07 22:21:06 +00:00
6ee7930a46 experimental fix for memleak 2006-05-07 21:59:57 +00:00
f2c5a2b85b updated to new module API 2006-05-07 21:40:12 +00:00
37151d361f added layout for "plugin cache"
dynamic natives that are paused now pause parent plugin with an error
added catch for a potentially serious bug?
2006-05-07 21:16:00 +00:00
974e8882b9 detach zOMG 2006-05-07 20:07:57 +00:00
9b9f0d0e27 fixed small typo 2006-05-07 17:27:24 +00:00
0a4a209f94 corrected commit 2006-05-07 17:11:17 +00:00
603be35426 test of new module API, should work though 2006-05-07 10:10:44 +00:00
92645db291 Synced in new modules.ini format 2006-05-07 10:09:04 +00:00
00e32aca97 added a little more flexibility to modules.ini
fixed bug where unloading was never called
2006-05-07 10:05:04 +00:00
dad00a2eb6 Initial import of replacement Library system - Backwards compat tested!
Updated new SDK (bumped vers number, kept backwards compat)
Improved module path resolving
2006-05-07 09:56:06 +00:00
576680eaf9 Added vformat() native 2006-05-07 00:25:43 +00:00
7a533c7be5 Added vformat() 2006-05-07 00:25:30 +00:00
4e5ada6ad1 added request at28200 2006-05-06 22:49:38 +00:00
a9f300bca9 Version bumpage for every module except MySQL/MySQLX (as I'm unsure of the status of those at the moment) 2006-05-06 04:57:10 +00:00
8fec829c63 Version bump in AMX_VERSION define (since version.rc was bumped) 2006-05-06 04:49:36 +00:00
f3fe58809d changes so forward ids can be mapped back to names 2006-05-06 02:03:25 +00:00
c6d16eac7a version bump 2006-05-05 18:31:27 +00:00
d7e53d7a81 Err, more descriptive param names? 2006-05-05 08:30:16 +00:00
26ee3955b6 Another one of my stupid clarifications that shouldn't break anything (I hope...) 2006-05-05 08:27:58 +00:00
21ffd88bdd More bugs?
1) FM_CreateInstancedBaselines has been renamed to FM_CreateInstBaselines
2) DLLFunc_CreateInstancedBaseline has been renamed to DLLFunc_CreateInstBaselines
(I'd be extremely surprised if someone complained about the above 2 changes)
3) New hookable GameDLL func: FM_CreateBaseline
4) New hookable Engine func: FM_CreateInstBaseline
5) New GameDLL func that can be called via dllfunc: CreateBaseline
6) New GameDLL func that can be called via engfunc: CreateInstancedBaseline
7) Added some comments to each member of various enums that correspond to special structs in the engine and/or game dll
2006-05-05 08:07:31 +00:00
ed19c53552 More bugs?
1) New hookable GameDLL func: CreateBaseline
2) New hookable Engine func: CreateInstancedBaseline
3) New GameDLL func that can be called via dllfunc: CreateBaseline
4) New GameDLL func that can be called via engfunc: CreateInstancedBaseline
2006-05-05 08:04:19 +00:00
133c7d6815 Fixed possible crash bug in get_tr2 at29250 (Orangutanz) 2006-05-05 05:11:17 +00:00
7cd10e4796 Another param change that I seemed to have missed... should be no problem 2006-05-04 22:39:23 +00:00
ecd2d913e4 Err, gah... native one being changed didn't really matter 2006-05-04 22:12:16 +00:00
53e84a13be gah 2006-05-04 22:10:23 +00:00
eb55e1f4aa i prefix changed to ent because it looks nicer indeed 2006-05-04 19:59:05 +00:00
dc063594de Not sure why I decided to potentially crash the server with cs_set_user_vip o_O
Stayed tuned for another episode of "What Was DS Thinking?"
2006-05-04 05:32:45 +00:00
f26d208c38 Updated to May 2006-05-03 07:12:01 +00:00
6cc239c66f Two extra params in cs_set_user_vip for determining whether or not model and scoreboard are updated at28699
Version bumpage
2006-05-02 21:49:17 +00:00
6733ef9a79 Two extra params in cs_set_user_vip for determining whether or not model and scoreboard are updated at28699 2006-05-02 21:48:26 +00:00
7dc4beae63 Removed set_user_deaths from inc file at29080
(Doesn't seem to be any easy general way to implement it)
2006-05-01 05:25:28 +00:00
de33bb6a1d Oh goodness, let the bugs begin...
1) New hookable GameDLL funcs: UpdateClientData, AddToFullPack, CmdStart, CmdEnd (at28754)
2) New GameDLL funcs that can be called via dllfunc: UpdateClientData, AddToFullPack, CmdStart, CmdEnd
3) New natives to read/write special data structures associated with the above GameDLL funcs:
   get/set_cd (ClientData), get/set_es (EntityState), get/set_uc (UserCmd)
2006-04-30 07:37:31 +00:00
7883710bf6 Added pm_shared to include directories so this can compile on Linux again 2006-04-30 07:28:39 +00:00
0071d73e25 Oh goodness, let the bugs begin...
1) Fixed getting incorrect value of the entity index when using ClientUserInfoChanged via dllfunc
2) New hookable GameDLL funcs: UpdateClientData, AddToFullPack, CmdStart, CmdEnd (at28754)
3) New GameDLL funcs that can be called via dllfunc: UpdateClientData, AddToFullPack, CmdStart, CmdEnd
4) New natives to read/write special data structures associated with the above GameDLL funcs
2006-04-30 07:27:14 +00:00
0555e7aa63 fixed MM warning 2006-04-29 13:51:52 +00:00
ddda9c9118 Fixed weird close bug 2006-04-29 10:20:41 +00:00
d2b57d29fb untested fix for issue where hooks were not released on server deactivate - only on plugin load 2006-04-29 07:23:23 +00:00
d78ec24679 fixed bug when registering plugin_(un)pause forward 2006-04-28 22:51:40 +00:00
e5057d7191 cell upcasting (second revision) 2006-04-28 21:30:17 +00:00
f10ecbb239 Small bug fix and tiny optimizations in xs_get_maxmessages and xs_is_msg_valid
Added xs_vec_maked2d (at28754)
2006-04-28 21:10:29 +00:00
229b149247 cell upcasting (second revision) 2006-04-28 20:14:08 +00:00
1f8b9a8cd9 Renamed FM_ClientInfoChanged to FM_ClientUserInfoChanged for consistency with DLLFunc_ClientUserInfoChanged
(Also goes along with fix made in FakeMeta module itself, sort of :|)
2006-04-28 20:10:42 +00:00
6000fe43d1 Fixed ClientUserInfoChanged forward not being reset on mapchange 2006-04-28 20:07:53 +00:00
5a2e35c1bf Fixed is_in_viewcone always returning 0
Fixed is_visible causing a crash when a non-player entity was passed and also made it quite a bit more accurate
(at28936)
2006-04-28 19:19:24 +00:00
62c096d7d3 updated comment as per at28188 2006-04-27 17:41:41 +00:00
f6cb8ab3bb fixed typo (at28930) 2006-04-27 17:31:55 +00:00
8da4987895 implemented request at28875 2006-04-27 17:31:38 +00:00
38cb60c60b Eh hem. This shouldn't have been bumped quite yet :( 2006-04-27 03:57:33 +00:00
a87966cde3 Oops (again) 2006-04-27 00:07:36 +00:00
9b252fa919 Oops :( 2006-04-27 00:04:52 +00:00
760514a1fe Makefile now in sync with the others (I think)
(This is mostly for cleaning fixes. Please give me a better idea)
2006-04-27 00:02:54 +00:00
2ca42b7b21 MSVC8 Project File + SDK Update 2006-04-26 23:54:12 +00:00
b65b8a1cf0 request at28581 2006-04-26 05:21:29 +00:00
e96eaa6174 Fixed small error 2006-04-26 05:18:26 +00:00
2a74d2229f commit for fix to a deadlock which would occur when stopping a live, queue'd thread worker 2006-04-25 20:41:18 +00:00
3f5bae615b added request at28199 2006-04-25 17:19:58 +00:00
96854aefa7 now allows you to teleport yourself (request by jpt10181) 2006-04-25 15:14:54 +00:00
697f63f2e9 fixed small modified bug
fixed another tiny bug (default author+default name weren't equal if you created a new plugin if the settings.ini wasn't found)
2006-04-25 14:51:13 +00:00
98a1d2b3da added fast read+write
fixed modified bug for the notes
2006-04-25 14:24:21 +00:00
2c541f338c Now shows if a document has been modified in the documents tab bar 2006-04-25 13:16:43 +00:00
9dccde4567 Fixed bug with ClientUserInfoChanged forward at28782
Also bumped version
2006-04-25 09:08:11 +00:00
47408443f7 Fixed bug with ClientUserInfoChanged forward at28782 (Orangutanz)
Also bumped version
2006-04-25 09:08:11 +00:00
f673e641f3 Fixed issue where hostname could be retrieved too early if it was set in server.cfg;
thereby having an incorrect hostname if %hostname% was used in the message

Also, if the hostname cvar changes at any time before a map change occurs, then %hostname% should be replaced with the new value
2006-04-25 07:35:02 +00:00
1f44f5f481 fixed some return stuff 2006-04-24 15:14:34 +00:00
94d4380f39 renamed logtag to deal with stupid system 2006-04-24 11:59:22 +00:00
5adc7021e4 fixed project for release builds 2006-04-24 11:22:24 +00:00
14db579540 added more tests 2006-04-24 11:13:17 +00:00
3aebbd7173 Restored linux compat 2006-04-24 10:31:37 +00:00
1c5b8670d9 added backwards compat layer to old mysql module 2006-04-24 10:27:25 +00:00
768880fa92 leprechaun ! 2006-04-24 07:33:09 +00:00
114a6fe19d added linux support [untested] 2006-04-24 07:19:15 +00:00
0d3e657e1a added pragma library 2006-04-24 07:08:05 +00:00
880ec0572f fixed some bugs in result stuff 2006-04-24 02:09:27 +00:00
eba3f39d88 fixed some corruption bugs, hopefully improved memory management 2006-04-23 23:17:20 +00:00
58ed3067ed Fixed search bug
Fixed print bug
Bumped version number to 1.4.2
2006-04-23 20:46:52 +00:00
fce58de726 *** empty log message *** 2006-04-23 04:24:46 +00:00
3677bc15ad *** empty log message *** 2006-04-23 01:36:33 +00:00
27d8cde394 initial import 2006-04-23 01:10:06 +00:00
3ba923e4c0 Works on t3h linux 2006-04-22 19:50:51 +00:00
07b1f0ea87 Added to allow Linux compilations. 2006-04-22 19:44:37 +00:00
769485ce29 fixed 2 memory leaks in the debugger 2006-04-21 02:45:57 +00:00
1d6becf3b5 hi, dont look 2006-04-21 02:18:34 +00:00
761e1f6fe1 Reverted a CreateInstancedBaselines change due to a 31 character limit to enum symbols that causes a compiler warning
(Real function that FM uses is called CreateInstancedBaselines and is different from CreateInstancedBaseline...
So something should be done, but I'm not sure what yet)
2006-04-20 08:49:49 +00:00
b34557b839 fixed bug at27878 2006-04-19 02:52:39 +00:00
a265189efa Modified param names for touch native and forward to correct values... makes it more clear to someone looking at it 2006-04-17 22:29:18 +00:00
4101eea5e8 Oh dear, lots of changes:
1) Added get_orig_retval for retrieving the original return value of an engine function
2) Fixed engfunc being called with EngFunc_CheckVisibility so that it now works as intended
3) Hooks should now also work with FM_WalkMove, FM_TraceToss, FM_TraceMonsterHull, FM_TraceHull,
   FM_TraceModel, FM_TraceTexture, FM_TraceSphere, FM_GetBonePosition, FM_GetAttachment, FM_RunPlayerMove,
   FM_StaticDecal, FM_BuildSoundMsg and FM_CheckVisibility
4) Reformatted comments in some header files so they look a bit neater
2006-04-17 17:02:57 +00:00
b57c752b1c Added get_orig_retval for retrieving the original return value of an engine function
Reformatted comments in fakemeta include files so they look a bit neater
2006-04-17 16:59:37 +00:00
82a739a95e register_plugin returns id 2006-04-17 12:57:52 +00:00
0a66780727 bugfix for HLDM (listen server) 2006-04-16 00:54:16 +00:00
cb92e45712 Small design changes
Added multi-account support to the local install functions (experimental!)
2006-04-16 00:25:49 +00:00
28b04878ce Added visual style support :o 2006-04-14 15:55:25 +00:00
a5df31570e added request at28068 (split log files)
fixed all native debug errors in core
2006-04-13 16:29:01 +00:00
ed1b2914be Oops, forgot some directories for clean 2006-04-12 17:05:05 +00:00
41214cc461 Makefile changes to fix the clean option 2006-04-12 16:55:09 +00:00
c371684e5e Makefile changes to fix the clean option
Changed arch from 686 to 586
2006-04-12 16:54:17 +00:00
c1866f8156 Makefile changes to fix the clean option
Removed unnecessary geoip files from CVS :o
2006-04-12 16:52:28 +00:00
0939c54048 Makefile changes to fix the clean option
Changed arch from 686 to 586
2006-04-12 16:48:47 +00:00
d9e2166e97 bumped version number to 1.72 2006-04-12 16:18:46 +00:00
17d5e7f0ca Renamed SUFFIX_x to BIN_SUFFIX_x because it more clearly shows the meaning of the variable :\ 2006-04-12 16:00:12 +00:00
564a5484f7 Some changes to the makefile:
1) Fixed clean not removing amd64 binaries
2) Removed seemingly broken mmgr builds (just like MSVC now)
3) Added binlog options for creating BinLog binaries
4) Fixed amd64 build from dynamically linking to zlib
2006-04-12 15:42:18 +00:00
8a732c7e14 For some reason libz64.a was not recognized as a binary file in CVS. Hopefully fixed now. 2006-04-12 15:37:00 +00:00
998208ef20 *** empty log message *** 2006-04-12 15:36:07 +00:00
a2082bac93 Don't include unnecessary headers when BINLOG_ENABLED isn't defined - whoa 2006-04-12 13:01:15 +00:00
3dacc60073 Minor MSVC Project Changes:
1) Automatically add "bl" to binary name on BinLog builds
2) Exclude binlog.cpp from non-BinLog builds
2006-04-12 12:56:58 +00:00
a5dc3fe777 changed a few captions 2006-04-12 12:08:52 +00:00
5c55eae9a6 fixed a bug for metamod's plugins.ini
simplified the install method page a bit
2006-04-12 10:26:19 +00:00
63aef3bcee added debug msgs 2006-04-12 02:25:31 +00:00
deeb2f3cf9 added some debug msgs 2006-04-12 02:12:03 +00:00
59098d703e added debug msgs 2006-04-12 02:00:08 +00:00
662289eb28 added some debug msgs 2006-04-12 01:51:23 +00:00
392b7d9fdf Removed tclsqlite.c from MSVC project files (it's really not needed, I swear) 2006-04-11 16:11:42 +00:00
db9fcc28d6 fixed bug at27729 (HS and announcements overlapping) 2006-04-11 13:26:50 +00:00
63d4d6591b fixed typo at28092 2006-04-11 12:41:29 +00:00
9ef9e3755a Fixed bug at28087 2006-04-11 06:34:17 +00:00
b8ddd281aa hack fix for at28078 2006-04-11 06:30:59 +00:00
363d95f68c fixed bug at27832(jtp10181) 2006-04-10 22:14:42 +00:00
da6b71a677 Changed default caption of the documents tabbar
Changed default theme to Xito
2006-04-10 18:25:54 +00:00
c9765e50c8 Replaced Documents tabbar (means two bugs are fixed now)
Removed Projects tabbar and added a new item to the statusbar
2006-04-10 18:05:08 +00:00
cd7f15f112 Reverted one of my "fixes." Apparently this is intended functionality. Sorry :( 2006-04-10 16:13:02 +00:00
4fb001ce50 Whoa, whoa, whoa. Three "bugs"
1) Fixed tag mismatches with fprintf when not using Float, Sql, or Result (comma was missing :o)
2) Fixed unlink from taking more than one argument o_O
3) Fixed filesize from taking more than one argument o_O
2006-04-10 14:02:37 +00:00
e49365755d MSVC8 Project File + SDK Update + Some Newline Fixes 2006-04-07 12:05:08 +00:00
9baab16682 MSVC8 Project File + SDK Update 2006-04-07 11:56:28 +00:00
dfcd83ffa3 Redefined some missing preprocessor macros that should have been present in the release build configs 2006-04-07 11:42:50 +00:00
8238741f39 MSVC8 Project File + SDK Update + Some Newline Fixes 2006-04-07 11:32:45 +00:00
a595557e2d MSVC8 Project File + SDK Update
Update to SQLite 3.3.5
2006-04-07 11:18:17 +00:00
070d8177c5 MSVC8 Project File + SDK Update 2006-04-07 11:04:28 +00:00
9eb3cd1793 Readded libpcre 6.4 binary for x86 Linux module 2006-04-07 10:52:39 +00:00
2f6fe9fac4 MSVC8 Project Files + SDK Update
Also updated to pcre 6.4
Added lib_linux64/pcrelib - should fix issue with module requiring libpcre as external dependency on AMD64
2006-04-07 10:51:09 +00:00
3bf5fb612f Oops, disable RTTI. 2006-04-07 10:27:49 +00:00
62b28e7033 MSVC8 Project File + SDK Update 2006-04-07 10:25:45 +00:00
860a4ca50e MSVC8 Project File + SDK Update + Some Newline Fixes 2006-04-07 10:12:56 +00:00
26a0767737 MSVC8 Warning Fixes 2006-04-07 10:02:13 +00:00
4eccad2c27 MSVC8 Project File + SDK Update 2006-04-07 10:00:04 +00:00
3966f79324 MSVC8 Project File + SDK Update 2006-04-07 09:41:31 +00:00
38305fdd4f MSVC8 Project File + SDK Update + Some Newline Fixes 2006-04-07 09:24:27 +00:00
9c2f98e1eb MSVC8 Project File + SDK Update + Some Newline Fixes 2006-04-07 09:09:48 +00:00
971c5ffbb5 Oops. Put no RTTI on debug build as well. 2006-04-07 08:58:37 +00:00
c1edaa83bd MSVC8 Project Files + SDK Update 2006-04-07 08:48:01 +00:00
795e23dd09 natives-amd64.o fixed? 2006-04-07 07:18:52 +00:00
93ff6d5c67 *** empty log message *** 2006-04-07 07:18:23 +00:00
0dc594f5e1 Weirdness in libz.a hopefully fixed? 2006-04-07 07:14:56 +00:00
fad03b546a *** empty log message *** 2006-04-07 07:14:15 +00:00
39f4a2bc13 fixed bug at27770 2006-04-06 23:36:22 +00:00
3cb91fec58 MSVC8 Project File + SDK Update 2006-04-06 14:33:15 +00:00
8276223e68 Compile with no RTTI 2006-04-06 14:27:50 +00:00
2da45cfd1c MSVC8 Project File + SDK Update 2006-04-06 14:17:39 +00:00
82b0128308 MSVC8 Project File + SDK Update 2006-04-06 13:58:06 +00:00
550c505813 Removed no longer supported DB modules from modules.ini :o 2006-04-06 13:14:45 +00:00
d50d6b0334 For some strange reason natives-amd64.o and libz.a were not valid files before and core would not compile on Linux. Now they should work. 2006-04-06 13:06:48 +00:00
f2d21c410b MSVC8/VS2005 Compiling Fixes - 0 errors, 0 warnings. Hurray! 2006-04-06 12:56:45 +00:00
ec51566abe Remove cruft from MSVC 7.1 project files so that JITDebug, JITDebugBinLog, JITRelease, and JITReleaseBinLog are the only build configs 2006-04-06 12:14:59 +00:00
8a2d750970 removed some amd64 files :o 2006-04-03 02:42:20 +00:00
46b70bdfba updated to April 2006-04-02 19:27:18 +00:00
15e137e266 time test 2006-04-02 18:50:35 +00:00
93c8bd0253 fixed potential exploit (thanks twisted) 2006-04-01 05:50:33 +00:00
10a935790c a clean yam is a happy yam. 2006-03-31 21:59:52 +00:00
68208d73d7 made sure vars are reset 2006-03-30 20:45:22 +00:00
b57367dd30 abort() now cancels a callfunc 2006-03-30 20:42:11 +00:00
9eb9839a46 bumped version numbers 2006-03-30 04:25:57 +00:00
deccf7816c added rmdir() 2006-03-30 00:48:58 +00:00
fe971497cc synced to dll 2006-03-30 00:31:45 +00:00
8c2be55233 added ClientUserInfoChanged forward 2006-03-30 00:31:33 +00:00
ab443e8254 fixed a few buffer overflow errors 2006-03-30 00:13:38 +00:00
16e53eded8 synced to dll 2006-03-29 23:57:54 +00:00
a7acf05bfc added more strings 2006-03-29 23:57:42 +00:00
5e22cd5f0a Fixed bug at27323 (AndraX2000) 2006-03-29 23:33:38 +00:00
92be7f6791 synced to core 2006-03-29 22:58:11 +00:00
94c449936d added getc,ungetc,putc 2006-03-29 22:56:18 +00:00
89c58265aa page numbering does not appear with no pages 2006-03-29 22:48:45 +00:00
3783e34a70 Fixed a bug where handlers wouldn't work if they were in the 0th slot 2006-03-29 22:42:03 +00:00
414ecdfffa fixed crash when creating a new binlog file 2006-03-24 19:29:49 +00:00
76afa40270 fixed bug 2006-03-23 15:01:15 +00:00
17bbc37638 fixed binlog max size name 2006-03-23 10:11:09 +00:00
4b0b3c0c7c bumped version 2006-03-20 22:58:27 +00:00
006b4bd49a added syncpoints to all stats scripts 2006-03-20 19:40:58 +00:00
5395fc1280 updated constants 2006-03-20 19:36:57 +00:00
a293e23fe2 renamed time to gl_time
updated makefile
2006-03-20 18:45:53 +00:00
68e729721d ~(, ,)o <-- wtf another turtle?! 2006-03-20 18:38:29 +00:00
4f5c16c278 added support for new tr and kvd hooking/calling 2006-03-20 18:23:03 +00:00
c15a86b454 added new TR/KVD stuffs 2006-03-20 18:08:51 +00:00
51c8724cff added more hud syncpoints 2006-03-20 01:43:44 +00:00
ccb3b4fbb3 experimental fix for improving hud sync 2006-03-20 01:03:30 +00:00
83bf0d7b2a ~(, ,)o <-- turtle 2006-03-19 21:52:25 +00:00
f55a8c54cc binlog reader no longer logs plugin database in a separate file 2006-03-19 21:41:11 +00:00
dc9350fcc5 committed changes for new file format 2006-03-19 21:40:24 +00:00
ef5437fec3 a working adminslots 2006-03-19 21:25:18 +00:00
0999db0203 fixed bug at26073 2006-03-19 20:48:37 +00:00
d84ef62e6c little optimization from PM 2006-03-19 20:39:25 +00:00
b5e8bc9ec1 fixed bug at26868 2006-03-19 20:14:24 +00:00
ccaa4434ad committed new language code 2006-03-19 19:26:29 +00:00
555ac1c7f3 fixed corrupt file loads smashing the stack
added compile of support code
2006-03-18 22:10:05 +00:00
b9788b7e1b *** empty log message *** 2006-03-18 21:38:28 +00:00
c6e332a0f5 linux+amd64 compat 2006-03-18 20:59:38 +00:00
007d41b5af Bumped version number to 1.71
Added a hint concerning binary logging to metamod's plugins.ini
2006-03-18 20:03:34 +00:00
a1956bc83b added cpuid helper func 2006-03-18 08:56:58 +00:00
ff61158491 fix for binary db not being created on maxsize overflow 2006-03-17 23:29:33 +00:00
2c5520cad0 added optimization tweaker
added binary log maxsize support
2006-03-17 22:50:13 +00:00
4bcb0fcb13 new localinfo crap 2006-03-17 22:10:16 +00:00
6ef670878d committed binary 2006-03-17 18:26:21 +00:00
89e13334ae uses stringbuilder instead of alloc+concat for speed now 2006-03-16 19:29:46 +00:00
82fe1e10d9 Fleshed out log and database readers, began basics of GUI 2006-03-16 06:40:18 +00:00
e067a980be implemented a lot more binary opcodes
bumped versions
2006-03-16 06:36:01 +00:00
e98fbc47e8 added new binary logging option 2006-03-16 04:36:55 +00:00
b6fa60b0bd Modified to fix memory leaks and improve speed 2006-03-16 02:11:48 +00:00
7e97156fc4 added arrayset native 2006-03-16 00:13:13 +00:00
7190d933b4 fixed bug at26204 2006-03-15 16:14:32 +00:00
3699796bc6 finalized file format
added register op (working)
added msvc8 stuff (4better || 4worse)
2006-03-15 13:43:06 +00:00
e208ff0664 quick import of file structure 2006-03-15 13:42:25 +00:00
adc2a7d169 initial import of binary logger support code 2006-03-14 19:36:18 +00:00
dc8e162e26 added menu_cancel 2006-03-14 17:50:38 +00:00
522511d059 implemented menu_cancel 2006-03-14 17:49:29 +00:00
d5152fedc4 added glb.cpp 2006-03-14 17:21:35 +00:00
d7bef2ae4b added get_global() 2006-03-14 17:15:52 +00:00
9283cbe1c2 added request at26450 2006-03-14 16:55:06 +00:00
7dae023a98 fixed bug at26580 2006-03-14 10:01:35 +00:00
9c88ce1394 fixed bug at26581 2006-03-14 09:59:28 +00:00
4cb8d4adc7 *** empty log message *** 2006-03-14 02:54:54 +00:00
5c88803942 New update! 3.1 is liiiive!
Error handling:
Array now has sufficiently advanced error handling to remove most, if not all, disable_checks.

Extention:
With the metaprogramming techniques, new types can be added easily.

Speed:
With the new changes I've made to Judy, the Array module has far exceeded the speed of any traditional datatype
2006-03-14 02:54:24 +00:00
4457b0d879 Obsolete due to update 2006-03-14 02:50:30 +00:00
58415dcfb9 Obsolete due to new updates 2006-03-14 02:49:02 +00:00
76c216d07e added request at26533 (Brad) 2006-03-13 22:43:55 +00:00
aa3582a2f3 removed patch for autochanneler (bug at26176) 2006-03-13 14:37:23 +00:00
d80b59e639 vers bump 2006-03-13 14:35:46 +00:00
880cb401fb fixed bug at26340 (NiLuJe) 2006-03-13 14:35:26 +00:00
2e0dcb860a fixed dynamic ExecuteForward not returning a valid result and patching the forward id 2006-03-10 19:04:04 +00:00
a9684fb81d fixed bug at26189 2006-03-07 12:58:39 +00:00
f2b8b82515 Component update (whoa I hate delphi reinstallations)
Added another feature for the Code-Explorer
2006-03-06 19:47:22 +00:00
eb7a49f6d4 fixed awful cvar bug, amx_reservedslots (which wasn't registered by the plugin) was used in the code instead of amx_reservation 2006-03-06 15:27:30 +00:00
982b22ab20 fixed bug in split() 2006-03-06 14:54:12 +00:00
38acf132c8 new installer for added files, removed files, that stuff... yams 2006-03-04 11:12:17 +00:00
f25824a1aa added in two old natives again
fixed a native spelling mistake
2006-03-04 11:06:19 +00:00
446c5523f8 added back in two more old natives 2006-03-04 11:05:59 +00:00
7bcdc4be44 new info files for vers bump 2006-03-04 09:46:32 +00:00
6c6389ba65 oh, last credits bit. wee <-- gaben? 2006-03-04 08:52:08 +00:00
0898418cf3 what... oh 2006-03-04 08:40:27 +00:00
943b902e23 fixed the cursed bug of throwing knives 2006-03-04 08:16:00 +00:00
74cd310504 bumped version 2006-03-04 06:53:06 +00:00
44979f2b07 bumped versions 2006-03-04 06:51:59 +00:00
a3142a520f bumped versSIIOOON 2006-03-04 06:48:44 +00:00
372a01e6da committed fakemeta optimizations 2006-03-04 06:34:28 +00:00
3b4cd21835 NL and SV fixes (Lt Llama) 2006-03-03 22:31:55 +00:00
2d6c06b82f fixed fclose bug (NiLuJe) 2006-03-01 20:59:08 +00:00
a9cdb2b48e new binary 2006-03-01 02:50:28 +00:00
60b411757d latest compiler build 2006-03-01 02:48:40 +00:00
19b5835ae4 added ClearSyncHud() 2006-03-01 02:20:44 +00:00
48377168b2 Added ClearSyncHud() 2006-03-01 02:17:20 +00:00
d89f216682 added more syncing 2006-03-01 00:10:35 +00:00
62489d05cc fixed hud message syncing 2006-03-01 00:10:23 +00:00
84b09301e6 fixed display bug 2006-02-28 23:43:22 +00:00
3c1b564956 wrapped a few more things around HudSyncObjs 2006-02-28 10:46:22 +00:00
f7d4c6fe34 fixed the final bug in this I think 2006-02-28 10:42:52 +00:00
d2cc14fa18 crraaaaap 2006-02-28 10:10:44 +00:00
51b2cf120e fixed valve_id_lan bug 2006-02-28 10:03:13 +00:00
dc5506efe3 added experimental callback for modules to get authorization 2006-02-28 09:59:03 +00:00
628d38df7a experimental fix for new stats sync code 2006-02-28 09:43:20 +00:00
d4c2bf154f experimental fix for hud sync issue 2006-02-28 09:42:56 +00:00
a504caac62 resync 2006-02-28 05:15:40 +00:00
2653f88b73 bumped vers on this early 2006-02-28 05:15:29 +00:00
f853f8f8cd added amxx to vers string 2006-02-28 05:14:36 +00:00
b2437451e3 implemented __DATE__ 2006-02-28 05:14:20 +00:00
c49bff54b1 fixed bug at25751 (zor) 2006-02-27 20:31:50 +00:00
b9ed05f38b fixed bug at25751 (zor) 2006-02-27 20:30:07 +00:00
4aaa2f8e0f fixed memory leak 2006-02-27 10:10:52 +00:00
85c37c6a39 merged in marticus's changes 2006-02-27 09:22:03 +00:00
ed4d8f9e26 added missing flags (NiLuJe) 2006-02-26 20:38:36 +00:00
1a03391347 omg updated these for sure. 2006-02-26 08:15:12 +00:00
0999ad32e3 makefile 2006-02-26 08:13:56 +00:00
f62933efd4 makeile 2006-02-26 08:13:15 +00:00
b968f437ca phew... updated to include old tsfun stuffs 2006-02-26 08:11:25 +00:00
d9f9c5256a more revert to 1.00-era code 2006-02-26 06:54:23 +00:00
0da49cfc45 reduced this module to a wrapper 2006-02-26 06:45:44 +00:00
8735bf3df3 initial revert to 1.00-era code 2006-02-26 06:42:48 +00:00
4db61f243a what 2006-02-26 06:40:47 +00:00
a43a3b0803 committed patch for correct typecasting 2006-02-26 05:03:05 +00:00
bf8cf574e0 updated to 3.3.4 2006-02-25 01:37:50 +00:00
4fed42b5c7 gah >_< recompiled with -O1 -DWIN32 2006-02-24 15:47:40 +00:00
1f2d9c8a92 typos, made language harsher 2006-02-24 10:12:55 +00:00
8502fb51b3 fixed bug where deleting oldmenus would make the next key non-unique 2006-02-24 08:34:37 +00:00
1d30d0831b i have a hat 2006-02-24 07:49:08 +00:00
0520c606ec fixed possible overrun bug 2006-02-24 00:11:37 +00:00
6997c780d9 fixed bug where format() on copy-back would not null terminate 2006-02-24 00:09:33 +00:00
631e709471 fixed bug where the string lenght wasnt decreased on some cases 2006-02-23 22:55:43 +00:00
1d508c0e04 Updated version to 1.70 2006-02-23 10:54:15 +00:00
28ca230a53 Fixed another bug, installer didn't register the right mm version in the liblist.gam for AMD64 servers 2006-02-23 10:51:35 +00:00
01b58a4635 Fixed dictionary parsing not obeying the carat backtick
Fixed failed translations crashing
Added formatex()
Fixed buffer copyback problems in old usages
2006-02-23 00:02:33 +00:00
0852dfa112 added missing pcvar natives 2006-02-22 20:32:59 +00:00
7362cd0621 sup twisty 2006-02-22 01:41:28 +00:00
635d18de92 tiny optimizations from evilspy 2006-02-22 01:36:29 +00:00
484014e2db fixed translate concat bug 2006-02-22 01:05:09 +00:00
2ba0b079ab initial import of new format zomg 2006-02-22 00:33:19 +00:00
2843c333aa Fixed bug at25472 2006-02-20 03:24:45 +00:00
4369023394 Added a few edit functions to the notes richedit 2006-02-17 20:25:25 +00:00
dc97e18955 fixes for % stuff in statsx and its lang file 2006-02-15 19:44:34 +00:00
c31e2be46f added backward compatibility for % mistakes 2006-02-15 17:31:30 +00:00
7539751fc6 added pcvar funcs 2006-02-15 16:05:20 +00:00
8a8b91998a fixed typo 2006-02-15 10:45:05 +00:00
c7fbc7f55e more gaben 2006-02-14 23:59:24 +00:00
ea5c9f0af4 gaben 2006-02-14 23:56:55 +00:00
76609e2a4a fixed bug with translator cvar not being registered by core 2006-02-14 22:14:12 +00:00
1923d42c5f fixed old fmt bug 2006-02-14 20:28:52 +00:00
13360bec73 reformatted file a bit 2006-02-14 16:57:44 +00:00
f1a4cfee61 compilable now o_O 2006-02-14 15:13:26 +00:00
ac5d87b2c2 commited binaries + project file 2006-02-14 13:42:25 +00:00
bf0c1990dd committed new format() code 2006-02-14 12:01:22 +00:00
a8c01e4865 fixed forwards passing floats as cells to the core
fixed pfn_playbackevent missing a parameter
2006-02-13 20:03:39 +00:00
472613d973 Fixed engine and dll bases screwing up. 2006-02-13 19:31:46 +00:00
323341f67a added request at22274 2006-02-13 14:23:43 +00:00
71c023f485 added CS_TEAM_UNASSIGNED at vittu's request 2006-02-11 22:57:34 +00:00
48d3b6e952 bad ptr checks for strings 2006-02-11 22:56:55 +00:00
2c8808aaff fixed formatter bug on bad control code 2006-02-11 22:48:29 +00:00
82693ccae6 fixed serious OP_FLOAT_CMP bug (boy I was tired) 2006-02-11 21:51:28 +00:00
e74ff6a5a4 committed OP_FLOAT_CMP 2006-02-11 07:06:35 +00:00
eba5b1a920 Fixed 2006-02-11 03:04:45 +00:00
a93001a68b Fixed Null Error 2006-02-11 00:41:28 +00:00
d548457c30 Fixed stupid NULL error 2006-02-11 00:41:11 +00:00
be1bc6f75c removed debug log for float testings 2006-02-10 19:47:09 +00:00
76358f4289 updated makefile 2006-02-10 15:53:13 +00:00
652f8b9f74 commited builds of latest asm stuff 2006-02-10 15:51:37 +00:00
dcaf3066bf experimental optimizer for float ops 2006-02-10 15:43:27 +00:00
b527efde41 fixed bug where showmenus didn't properly clear newmenu bit 2006-02-10 14:16:00 +00:00
a195a0af30 fixed a re-entrancy bug 2006-02-09 12:04:35 +00:00
52aa992a2f fixed recursion problem
fixed handle leak
fixed player defaults
2006-02-09 11:53:22 +00:00
c602308acb fixed bug where exit wasn't guaranteed
fixed menu destroy bug at25132
2006-02-09 11:19:57 +00:00
5a0b3b0f9f added a memcpy for MM 2006-02-09 11:17:22 +00:00
750b098e02 sigh... 2006-02-08 22:59:58 +00:00
2a13d923fa committed menu padding and title setting 2006-02-08 22:09:31 +00:00
3507155189 removed MM-1.18 compat 2006-02-08 21:59:02 +00:00
1e4c71e8e3 fixed blank items destroying menus 2006-02-08 05:39:03 +00:00
8d0a3ac9ae another sync 2006-02-08 04:11:14 +00:00
fb0febb50e Updated to remove unnessasary stocks 2006-02-08 02:17:45 +00:00
60586fdda4 Working at time of commission 2006-02-08 02:14:15 +00:00
b381fc9141 Working at time of commision. 2006-02-08 02:13:58 +00:00
33da5f3737 quick patch for dynamic native issues 2006-02-07 14:23:09 +00:00
3dcaa5742d bumped vers 2006-02-07 13:06:19 +00:00
e59d7c2f01 bumped version 2006-02-07 13:04:01 +00:00
9946a6892c wtfversion 2006-02-07 13:03:06 +00:00
9a5b855e2d fixed bug at25040 2006-02-07 12:43:40 +00:00
a43f62615b stupid typo 2006-02-07 12:19:37 +00:00
459f91af24 optimized this further 2006-02-07 09:02:08 +00:00
29f46a56d9 got rid of stupid "buffor" 2006-02-07 08:57:34 +00:00
a2bd08cf64 fixed bug at16664 2006-02-07 08:56:36 +00:00
208a57eaf8 added menu padding 2006-02-06 15:27:02 +00:00
2879c86d79 added more exit props 2006-02-06 13:24:26 +00:00
506a6e0465 added never display exit option to newmenus 2006-02-06 13:22:33 +00:00
53c029471f removed usage of CVAR_GET_STRING 2006-02-06 13:10:23 +00:00
cc32f33815 lang debugger uses now make_string for THash 2006-02-06 12:57:14 +00:00
e2c1b8c178 Fixed bug where invalid keys were saved as blank translations
Fixed bug where dictionary caches were invalidated before being used
Loads with MM 5:11 now
2006-02-06 11:13:27 +00:00
458f2acfe7 fixed bug at25056 2006-02-06 04:29:50 +00:00
e929dc55bd synced CString.h 2006-02-05 19:16:16 +00:00
b5b42c675d updated to February 2006-02-05 19:14:19 +00:00
278e267690 Fixed potential crash bug in the plugins unit 2006-02-05 13:59:41 +00:00
93ad26fb2a oops, forgot there was a sep. def for this 2006-02-05 08:25:45 +00:00
f8d0e4b90d fixed bug at25028 (teame06) 2006-02-05 08:06:50 +00:00
35e8a67a48 *** empty log message *** 2006-02-05 04:20:30 +00:00
0df187edcd merged lang stuff 2006-02-05 03:41:30 +00:00
2cfebb0234 fixed typo 2006-02-05 02:26:00 +00:00
8edd843f4b removed CDataBuffer reliance 2006-02-05 02:20:45 +00:00
6324161b98 what 2006-02-05 01:00:28 +00:00
f0f8b78df9 added server_changelevel back
fixed bug where NULL FP_STRING could crash forwards
2006-02-05 00:32:20 +00:00
e0d4ad0a06 merged in random changes from twilight 2006-02-04 23:21:03 +00:00
815afdcd11 what 2006-02-03 05:48:55 +00:00
88d2b393d8 cvar queries actually run now
removed old fakemeta code
2006-02-03 04:19:18 +00:00
07affb56f2 works with post now 2006-02-03 03:28:43 +00:00
2ad9a320de added unregister_forward() 2006-02-03 03:27:03 +00:00
df082de817 committed newmenu api, take two 2006-02-03 03:00:48 +00:00
3027b732a5 added player_menu_info 2006-02-03 03:00:27 +00:00
af939f4e8d new menu API 2006-02-03 02:55:27 +00:00
2ab9fce457 Added an information to the welcome page 2006-02-02 10:07:00 +00:00
63b10cfaf5 Fixed DEP bug 2006-02-02 09:34:06 +00:00
dcae78a389 final fixes for strip weapons 2006-02-02 00:45:56 +00:00
ea34df433a patched cvar change exploit (target) 2006-02-01 13:07:36 +00:00
0e3727573e added get_user_footsteps 2006-02-01 13:04:24 +00:00
f40ae48849 removed server_changelevel (at24675 - oneyed) 2006-02-01 12:33:31 +00:00
7070273616 patch at24690 (karlos) 2006-02-01 12:23:30 +00:00
923ecaa0e5 added pev_valid 2006-02-01 12:17:40 +00:00
53d9274b45 added pev_valid() 2006-02-01 12:16:33 +00:00
4426910b9a made find plugin fast inline for speed 2006-02-01 12:10:52 +00:00
eb010688af optimized + fixed parsing in strbreak() 2006-02-01 12:10:26 +00:00
314392bffe removed old cvarquery stuff, added support for queryclientcvarvalue2 2006-02-01 12:09:43 +00:00
28ede82f91 added cell list registering 2006-02-01 12:09:19 +00:00
a5819d8cf8 added create forward natives 2006-02-01 12:08:42 +00:00
2d0e12363f added include defs for new forward creation 2006-02-01 11:54:57 +00:00
cb291dbdd5 sync 2006-01-30 21:40:10 +00:00
44db80bc75 Added madExcept
Updated some captions
Improved the "Cancel" button
2006-01-29 17:24:49 +00:00
bc5445d255 Added madExcept settings 2006-01-29 17:23:19 +00:00
55613eb882 fixed bug at24752 2006-01-27 22:43:51 +00:00
04c54128af fixed case 2006-01-27 09:07:37 +00:00
82cb94ab56 removed old fakemeta #defines
added better mm version handling
2006-01-27 09:07:04 +00:00
82653094fb another synce with SH 2006-01-24 22:51:29 +00:00
7c7422a553 added language debug 2006-01-24 18:47:08 +00:00
018b4645e8 *** empty log message *** 2006-01-24 15:43:49 +00:00
6cec38a329 committed latest compiler 2006-01-24 15:09:27 +00:00
8cc73227c7 removed changelevel forward 2006-01-24 15:02:11 +00:00
93ce1ac470 fixed a forward bug causing client_death to pass weapindex as the damage 2006-01-23 07:27:58 +00:00
bd1999cdfb added amx_mldebug cvar 2006-01-23 00:21:35 +00:00
8d9ad2ce06 fixed bug for checking colored menus in TFC and other mods 2006-01-20 23:24:36 +00:00
8ee50cee1b Commited to show new natives 2006-01-14 03:16:25 +00:00
7183954b08 Fixed a bug in the Code-Inspector
Added madExcept again
2006-01-12 19:14:56 +00:00
564dfbf329 Part of the madExcept component 2006-01-12 19:12:33 +00:00
ab5c11f876 Finally done!!! I finished what DS started:
AMXx Mods may now patch/retreive memory of several varieties directly from the game .dll, mod .dll, or can go free and patch/retreive any peice of memory.

I salute you DS.
2006-01-12 03:55:49 +00:00
73ba5d1644 Updated some captions
Updated the Autocomplete-Check function
Prepared AMXX-Studio for release
2006-01-11 18:02:42 +00:00
fd7f4441fb final version I hope 2006-01-07 06:17:16 +00:00
636f1141e4 removed test code 2006-01-07 06:16:52 +00:00
2eac69e9b4 *** empty log message *** 2006-01-07 05:40:57 +00:00
3b79a063b6 finally, a correct fix 2006-01-07 05:39:40 +00:00
69b6ed5f56 *** empty log message *** 2006-01-07 04:48:02 +00:00
07b9bb9987 okay, works 2006-01-07 04:47:49 +00:00
9578e8ac3d *** empty log message *** 2006-01-07 04:44:36 +00:00
39fd00c5be real fix this time 2006-01-07 04:43:01 +00:00
a3572f7206 Added and working! Array module 1.65 is a go for release! 2006-01-07 04:36:12 +00:00
e8a4b46cc5 removed 4 cmds from statsx, and implemented currentmap and FF status in nextmap (at22858) 2006-01-07 03:26:50 +00:00
6a59d8cd07 patch of compiler binaries 2006-01-07 02:24:58 +00:00
a4db0d927a Fixed bug at22981 2006-01-07 02:20:54 +00:00
bec98dcddd added new cvar for adminslots plugin 2006-01-07 01:04:07 +00:00
e27c0b205f (Marticus)
-Added documentation and cleaned up the code
-Created amx_hideslots cvar to replace #define HIDE_RESERVED_SLOTS
-Removed ackSignal *sigh* and the horribly coded setVisibleSlots function
-Removed client disconnect
-Created global variable gPlayerLimit to be used in both functions
-Moved set cvar sv_visiblemaxplayers to plugin_init
2006-01-07 00:54:40 +00:00
85f14422cb re-added file natives 2006-01-06 22:49:42 +00:00
66c278c64b wrong handle, oops 2006-01-06 21:05:48 +00:00
04113f8a02 merged changes from SH:TinyHash 2006-01-06 18:52:12 +00:00
86c033a922 gab gab 2006-01-06 14:47:59 +00:00
91c082878c wa 2006-01-06 14:44:32 +00:00
3d00b8c545 Merged changes from SH:List
Fixed bug where natives did not use the debugger (experimental)
Removed array size detection :(
2006-01-06 14:37:58 +00:00
0c745590ec Added functions for smashing the stack and memory :) 2006-01-06 14:22:12 +00:00
b46ee941d4 reverted tasks to v1.60 2006-01-06 05:10:17 +00:00
0d3055e505 partial fix for dynamic natives when running on debug mode 2006-01-06 04:59:39 +00:00
4b51565e3b hello my name is pm and i just fixed the bug described in 23888 2006-01-04 23:23:52 +00:00
c9e84c563d Updated to include additional protection for PDATA. 2006-01-03 21:48:59 +00:00
60716cd346 *** empty log message *** 2006-01-03 21:19:11 +00:00
531cc5f2c1 Added some returns in engfunc() and in dllfunc() 2005-12-31 15:09:14 +00:00
d1b290c7a4 Fixed bug at23454 (DeciusMagnus) 2005-12-26 14:38:14 +00:00
8aaa2d859f Modified something in the About dialog 2005-12-24 02:20:08 +00:00
0c6d606fea Added an Auto-Setup feature 2005-12-23 13:19:21 +00:00
8a5806cd25 Added a small hint to the compiler page in the settings dialog 2005-12-18 19:31:50 +00:00
40ca5f8002 *** empty log message *** 2005-12-17 02:16:01 +00:00
e50151343b *** empty log message *** 2005-12-11 18:42:19 +00:00
6aaf11f2a3 updated version number to 1.65 2005-12-11 18:30:52 +00:00
9d480b05af updated a few things in the plugin system 2005-12-11 17:55:35 +00:00
3f36b51f6c Added the plugins directory to CVS and updated the files 2005-12-11 17:31:06 +00:00
7cc586bd0c removed old forward class 2005-12-11 17:11:21 +00:00
b6d6be3c27 Changed a few captions in the about dialog 2005-12-11 16:45:02 +00:00
0b834a3f9b communicate core when setting a new team or deaths 2005-12-08 20:00:43 +00:00
5d5d1e1a7c added request at19456 2005-12-07 00:13:13 +00:00
d55bffede6 *** empty log message *** 2005-12-06 22:47:02 +00:00
806895ebd8 fixed bug when voting multiple maps voting would always fail 2005-12-06 19:06:05 +00:00
914b53933b nothing 2005-12-05 02:28:24 +00:00
402236e51e fixed bug at22532 2005-12-05 02:07:22 +00:00
2ebf822dea added new socket send native 2005-12-05 01:49:16 +00:00
389f470662 format fixes^2 2005-12-03 16:24:27 +00:00
522dccef76 hello 2005-12-03 00:54:26 +00:00
186728053a added autohud
format fixes
2005-12-02 23:34:11 +00:00
507a901a9e Changed a few language strings (again) to English
Fixed bug in the replace system
Fixed bug in the Autcomplete Check
Changed version number to 1.4
2005-12-01 16:30:26 +00:00
83d2e1a510 *** empty log message *** 2005-12-01 13:45:30 +00:00
f336585d4f Fixed GCC compatibility for now.
Removed ps_locked and replaced with ps_error.
Added set_fail_state.
Fixed md5_file.
2005-12-01 13:42:28 +00:00
80fdb2cdb2 Removed ps_locked flag 2005-11-29 21:59:21 +00:00
8251ffd25f Fixed bug at22273 (karlos) 2005-11-29 21:54:43 +00:00
5ad341edd7 EXPERIMENTAL BTree+DL ADT for Tasks (USE AT RISK) 2005-11-29 00:52:35 +00:00
2f8939967e fixed but at22303 (VEN) 2005-11-28 16:22:12 +00:00
6d84dff2b0 tiny optimization 2005-11-26 20:59:47 +00:00
8112fbe161 fixed bug at21983 2005-11-26 20:38:58 +00:00
e9db0c8c76 again bugfixes 2005-11-25 21:44:18 +00:00
cbcc91cc09 BETA optimizations 2005-11-22 04:14:07 +00:00
7ed757dc0d added autohud support
format fixes
2005-11-21 22:30:32 +00:00
8196ddd0b3 added replace_all stock (by jtp10181) 2005-11-21 21:47:54 +00:00
1a48ebb345 format fixes 2005-11-21 20:31:18 +00:00
c6fc34a64d Rewrote format() parser to be re-entrant and easier to read
Added various optimizations
Fixed memory leak in sh_tinyhash
2005-11-21 10:04:43 +00:00
f13599177f Rewrote language backend for integrity checking and optimization
Replaced CRC32 system with real hash-map
2005-11-21 01:35:37 +00:00
bb292d13ad added remove_filepath stock 2005-11-20 23:45:53 +00:00
6f2121cd4d Fixed bug in prune()
Synced changes from SourceHook
2005-11-20 20:54:20 +00:00
3324d65f3f fixed amx_restrict off and related cmds not working as they should (jtp10181) 2005-11-20 20:44:12 +00:00
5c5ca9251e New offsets from karlos 2005-11-20 20:01:03 +00:00
30f7f6d51f Fixed typo in SDK 2005-11-20 20:00:31 +00:00
922a2f6006 bumped version numbers 2005-11-20 19:47:49 +00:00
54f3bba89d Bump of versions+SDKs 2005-11-20 19:45:59 +00:00
5d8150637b Bump of version+SDK 2005-11-20 19:42:14 +00:00
3938933384 added new time include file
added get_time_length stock (Brad)
2005-11-20 19:27:07 +00:00
0482883a8a Resync of compiler build 2005-11-20 19:18:40 +00:00
9e4b1661e3 Fixed bug at21914 (faluco) 2005-11-20 19:10:13 +00:00
4040410c97 first attempt on lang error logging 2005-11-20 03:47:47 +00:00
8edf4d674f removed a native 2005-11-20 03:10:02 +00:00
847158f400 what 2005-11-20 02:36:52 +00:00
6ca3edad0c added GetFilename function 2005-11-20 00:00:33 +00:00
0551b46c8b gcc4 compatibility (Nijule) 2005-11-19 22:44:17 +00:00
e5a798357c Patch at21699 (Nijule) 2005-11-19 21:52:56 +00:00
c051c7f5b7 *** empty log message *** 2005-11-19 21:48:27 +00:00
322ad6fd68 New versions of compiler for at21691 2005-11-19 21:43:55 +00:00
a5bd8463e8 Fixed bug at21691 (Podunk) 2005-11-19 21:38:50 +00:00
71926e6d03 get_user_attacker fixes
version bump
2005-11-19 21:24:49 +00:00
803852ee0c small bug fix 2005-11-19 20:37:44 +00:00
fc6a193765 new hudchanneler 2005-11-19 20:31:11 +00:00
db0dd03128 Added new function to calltips: opens include file on click
Fixed some bugs in the menu generator
2005-11-19 19:46:29 +00:00
429798ae35 *** empty log message *** 2005-11-19 18:57:05 +00:00
4cc1218391 channels should clear again 2005-11-19 18:55:29 +00:00
83ea8b82b9 Fixed issue at19616 2005-11-19 09:26:30 +00:00
32cd6be7f5 Fix for issue at19616 2005-11-19 09:26:06 +00:00
4d9f2ded74 Fix for issue at19199 2005-11-19 09:16:27 +00:00
6163e25d7d *** empty log message *** 2005-11-19 09:07:28 +00:00
a3d0767b22 potential fix for bugs related to TSFUN 2005-11-19 01:36:58 +00:00
62e7e22a93 Added functionality for the auto-channeler 2005-11-19 01:25:34 +00:00
694d7c118c Merged in karlos's code, fixed potential get_user_weapon problem 2005-11-19 00:34:25 +00:00
a8bb28caa4 Committed new SDK function for player property mappings 2005-11-19 00:33:51 +00:00
23fb93a3cc - Updated Calltips
- Fixed bugs in register plugin function
- Added "Autocomplete Check", allows you to customize autocomplete items
- Added a new dialog (the parameter info dialog) to the loadinfo record/struct
- Added a new unit called UnitACCheck.pas
2005-11-18 23:35:58 +00:00
778c2080b0 zomg fix for oldmenus^2 2005-11-17 23:04:43 +00:00
94308b208a fixed bug at19374 2005-11-17 21:12:50 +00:00
b00d313ee8 fixed but at21777 2005-11-17 18:52:35 +00:00
4e497d9737 fix for autobuy cmd being used if the restrictions where set after cl_setautobuy (thanks jtp10181) 2005-11-17 18:23:48 +00:00
8cc10bdb3d patch for old showmenus 2005-11-15 21:58:47 +00:00
e816c86d7a synced with sh_sting.h 2005-11-15 20:48:11 +00:00
db77e12615 synced with sh_string.h 2005-11-15 20:21:29 +00:00
79c4d0ca5c added linux compat 2005-11-13 22:34:32 +00:00
34f12e76c4 added request at20855 2005-11-13 22:21:15 +00:00
2ac00713a7 fixed a menu bug at19364 2005-11-13 20:33:30 +00:00
c5761610b8 Small bugfixes 2005-11-13 10:40:59 +00:00
d09a8e1aac added checks for the executeforwards 2005-11-13 00:52:49 +00:00
16f402ae49 fixed a forward bug that made this module a surprise box 2005-11-13 00:45:45 +00:00
1e5c9b5ed7 added a new stock by Suicid3 (at20399) 2005-11-12 22:43:55 +00:00
3125630b21 Partial fix for bug at19662 2005-11-12 18:55:37 +00:00
32fd0f9e93 Fixed small bug in the indent function 2005-11-12 15:11:14 +00:00
4165548661 fixed bug at21142 2005-11-12 01:22:01 +00:00
31b71760e4 strip_user_weapons should reset now the weapon status 2005-11-12 00:47:34 +00:00
18bf26efb6 fixed but at20584 2005-11-12 00:46:26 +00:00
d190b207b4 linux fix 2005-11-09 22:36:52 +00:00
c4d120082b just another bug fix (or two) 2005-11-09 16:48:21 +00:00
38178ea9fa Important bug fix and updated the MOTD generator 2005-11-09 14:32:07 +00:00
0dd88dccbd fixed and improved function at20081 2005-11-07 16:37:47 +00:00
78b35d80ee Fixed some bugs in the menu generator
Fixed bug in the AutoUpdate function
2005-11-06 14:52:50 +00:00
a66f13fc91 Small bugfix, added another feature (saves now the last keywords) 2005-11-05 17:39:12 +00:00
1cb99082e2 Fixed a small output bug 2005-11-05 11:20:52 +00:00
6ea52a9a08 Added new feature: Auto Disable (disable auto-update if plugin has more than xxx lines, should prevent lags) 2005-11-02 15:36:24 +00:00
efe4b674e2 Fixed another bug (I had fixed it once but removed the fix accidentally) 2005-11-02 14:17:00 +00:00
8016d02319 Fixed addon bug 2005-11-02 13:42:05 +00:00
67c0230a62 Fixed bugs 2005-11-01 03:07:47 +00:00
d5c75fd6a5 What... 2005-10-30 14:17:32 +00:00
fc9e39a021 Updated components, added 2 new units 2005-10-30 10:33:16 +00:00
be1475b732 fixed bug at20181 ( why was an #if 0 in the function :o ) 2005-10-29 18:27:24 +00:00
2931247559 fixed bug at19476 2005-10-29 18:19:23 +00:00
9657430ef7 fixed bug at20423 2005-10-29 02:13:29 +00:00
d5cfb53cf8 added request at20845 (azrael) 2005-10-28 12:30:11 +00:00
10a64737b5 Added optimizations to the task system
Added optimizations to the forward system
Fixed some debugger errors
2005-10-25 20:38:00 +00:00
0be7540637 added a space :o 2005-10-25 16:55:16 +00:00
3ced207dd3 Fixed forward bugs 2005-10-18 21:29:51 +00:00
d2fb486e70 Upcasting args to cell before passing to MF_ExecuteForward 2005-10-18 21:17:12 +00:00
c8d69c41bc Hello quickfix 64bit negative values to executeForwards -> now upcasting everything 32bit to cell before passing to executeForwards 2005-10-18 21:05:52 +00:00
3d59eabdc5 Graaght. Typing. 2005-10-18 21:05:15 +00:00
e8a6126473 fixed but at20342 (jtp10181) 2005-10-16 00:28:20 +00:00
62e1856229 Added 3 more plugin messages (SCM_PAWN_FILECOUNT, SCM_CPP_FILECOUNT, SCM_OTHER_FILECOUNT)
Fixed load bug (if you loaded a textfile and the tab "Other projects" wasn't active you got an error message)
2005-10-13 14:49:40 +00:00
21caa9a0de Really fixed callfunc this time (debugger invocation error) 2005-10-13 05:27:13 +00:00
a46ec5357e Am I wrong or should this be this way to prevent security bugs? 2005-10-09 15:39:20 +00:00
ca70678155 fixed bug at19895 2005-10-08 01:35:11 +00:00
c3450df360 - Upgraded Code-Inspector
- Now checks language strings
  - New design
  - Better parsing
  - Displays actions
- Added function: can't load files twice
- Updated Code-Explorer
  - now faster
  - fixed a few small bugs
  - now keeps selection
- Updated Settings-Dialog
- Fixed output bug (showed sometimes huge numbers as line numbers)
- Fixed design bug (displayed wrong plugin data on start)
- Fixed small bug in the color dialog
- Fixed small start bug (didn't show real plugin data on startup)
- Added restore function
- Fixed code-explorer bug (didn't recognize @-functions)
- Fixed highlight bug (had problems with ^" and ^ in strings)
- Fixed potential crash bug
- Fixed another highlight bug
- Fixed aother code-explorer bug...
- Added 2 settings (for auto-complete and calltips)
- Added SCM_SETTINGS_REMOVEPAGE-message
- Fixed SCM_SETTINGS_CREATEPAGE bug
2005-10-07 21:52:48 +00:00
76b6510a27 686->586 2005-10-02 20:15:52 +00:00
a75feafc4f Downgraded compile time flags to 586 2005-10-02 20:12:48 +00:00
86c2c2db02 Fixed bug where core isn't notified of a team change 2005-10-02 09:57:25 +00:00
21d13507b1 fixed an error output msg 2005-09-28 22:10:11 +00:00
adfe7de08e callfunc_begin_i should not take -1 2005-09-27 19:51:23 +00:00
116536fe36 Fix for bug 19453 (karlos) 2005-09-26 22:11:44 +00:00
f7dbc25461 fixed a small typo 2005-09-23 13:01:33 +00:00
30736ebb53 Updated SciLexer 2005-09-22 11:51:01 +00:00
dc5e458d9e Updated installer script to 1.60 2005-09-22 07:06:28 +00:00
4feaa1449f Fixed bug in Makefile 2005-09-22 06:34:58 +00:00
25002f559a Fixed bad compiler build (oh my god, linux sucks) 2005-09-22 06:16:45 +00:00
41f38424ee Fix for linux 64bit filenames 2005-09-22 05:12:23 +00:00
862ee2029a Bumped version 2005-09-22 03:42:43 +00:00
cd30fb0c1c Bumped version numbers 2005-09-22 02:23:13 +00:00
59ad6c49e3 Bumped version 2005-09-22 02:14:21 +00:00
2d255829a6 bumped version 2005-09-22 02:13:45 +00:00
be762580b7 Bumped versions 2005-09-22 02:13:23 +00:00
ae8bf10746 Fixed bug at18021 (hondaman)
Fixed bug at18924 (Arnold)
2005-09-18 03:26:26 +00:00
324f4c58a8 cleaned revision for cstrike plugins 2005-09-18 03:19:34 +00:00
a816767abb Fixed bug at18919 2005-09-18 02:59:36 +00:00
164a47bde4 Import of windows version 2005-09-18 01:25:22 +00:00
545769e241 Bumped version number 2005-09-18 01:15:03 +00:00
dcf39196d5 Ugly hack to get around ELF garbage 2005-09-18 01:14:44 +00:00
58dd553d00 Loads from non-cwd now 2005-09-18 01:14:23 +00:00
f64ca6a827 Stupid ugly hack to get around ELF's garbage
Import of newer compiler
2005-09-18 01:13:18 +00:00
ebd4974c75 final cleaned revision (I hope) 2005-09-16 23:48:51 +00:00
4b1769f457 Added feature request at18988 2005-09-15 17:53:02 +00:00
f58c0f4508 added request for EKS at18961 2005-09-15 00:51:27 +00:00
4d7bdcde47 Fixed configs not being copied on Linux 2005-09-14 03:41:20 +00:00
c7a620424e *** empty log message *** 2005-09-14 02:38:19 +00:00
24260137ec hope to have fixed the spacings finally 2005-09-14 01:40:48 +00:00
315e69797d more fixes 2005-09-14 00:42:56 +00:00
dddc693369 Fixed spacing 2005-09-14 00:38:48 +00:00
13e654aafe small format changes 2005-09-13 16:05:57 +00:00
f02c73f94c Correct spacing! 2005-09-13 07:37:50 +00:00
92f79ffe88 left debug stuff in 2005-09-13 07:36:01 +00:00
db33e50f92 Fixed a bug where stocks using native names crashed 2005-09-13 07:32:07 +00:00
2ad557024e more cleanups 2005-09-13 01:00:19 +00:00
ddf3b6df32 new cleaned-up version of the plugins (no more OLOcode :D) 2005-09-12 21:06:24 +00:00
12bf140931 Fixed a small save bug 2005-09-12 16:08:45 +00:00
0d65bb64f9 Updated for latest version 2005-09-11 20:54:03 +00:00
c6e265b414 little changes 2005-09-11 20:35:35 +00:00
9ba597b5c1 Fixed bug at18791 (Maddo) 2005-09-11 19:15:49 +00:00
b6a4514bd0 Fixed bug at18763 (karlos) 2005-09-11 18:57:33 +00:00
a6daebe7d4 Made SQL changes by Lazarus Long 2005-09-11 18:37:55 +00:00
471ba0adbf Updated FTP function (now handles misunderstood SITE CHMOD commands) 2005-09-11 15:45:42 +00:00
7225aa3cc0 Fixed font bug 2005-09-11 14:32:16 +00:00
88b833f879 Updated version to 1.60 2005-09-11 11:52:19 +00:00
6f8816c13f Fixed another shortcut bug
Released 1.2
2005-09-11 11:15:22 +00:00
95ccd6078c Fixed bug at18607 (lantz69) 2005-09-11 07:19:06 +00:00
2e5c71f771 Fixed bug at18607 (lantz69) 2005-09-11 07:17:31 +00:00
eeb77395cd Fixed bug at18615 (Lazarus Long) 2005-09-11 07:13:44 +00:00
e3afe22a48 Fixed initialization bug in native filters
Fixed bug where address boundaries were not checked on arrays
2005-09-11 05:43:17 +00:00
73d70aff29 added module_exists 2005-09-11 04:43:40 +00:00
120c849e4b Added native filter 2005-09-11 04:32:40 +00:00
138b732e75 New plmenu 2005-09-11 04:31:13 +00:00
760e29e531 Finalized new debugging system 2005-09-11 03:58:38 +00:00
401ee3c97f Added another function or something 2005-09-11 03:55:48 +00:00
6e52ce7678 New natives 2005-09-11 03:13:45 +00:00
89aab62549 Removed them from AMXX-Studio 2005-09-10 21:58:40 +00:00
468d99ff70 Updated about dialog
Updated a few plugin commands
Removed splashscreen
Added some themes
Updated some captions
2005-09-10 21:55:22 +00:00
2d787f43de updated version of CString.h 2005-09-10 21:04:05 +00:00
f0c5e44985 fixed plugin location comments on stat plugins
replaced 0.20 with AMXX_VERSION_STR
removed all require_modules
2005-09-10 20:51:49 +00:00
76760b221d more cleaned-up code 2005-09-10 20:09:14 +00:00
612a86dbef Added new debugging functions 2005-09-10 18:26:13 +00:00
369ece2d56 ----------------------------------------------------------------------
Linux compatibility problem in debugger.cpp, made Makefile also compile
debugger.cpp
2005-09-10 18:19:02 +00:00
cc37f479aa Added Phase 3 of the debugger (debug tracing from plugins) 2005-09-10 07:24:26 +00:00
deaaf20713 Fixed preproc bugs 2005-09-10 05:30:24 +00:00
e566413224 Fixed MORE lines 2005-09-10 05:23:30 +00:00
368856f122 Fixed lines 2005-09-10 05:22:06 +00:00
52cc204787 Fixed numerous bugs in preprocessor (string literals being parsed, mismatched args being wiped) 2005-09-10 05:04:23 +00:00
52b1d67ca2 latest cleaned files for today (i cant read more :o ) 2005-09-10 03:39:23 +00:00
16ad8739e7 started the clean-up of cpp files 2005-09-10 00:59:24 +00:00
e67457440d cleaned-up versions of header files 2005-09-10 00:38:42 +00:00
fc955009da cleaned-up version of ccmd.h 2005-09-09 23:54:15 +00:00
0dc2ba85e8 Added set_error_filter() 2005-09-09 23:13:34 +00:00
de65e65854 added set_error_filter 2005-09-09 23:03:26 +00:00
d95f2cba37 Fixed another small shortcut bug
Updated "Select color" dialog
Removed "Do not restore caret" property, not useful
2005-09-09 23:01:09 +00:00
e2a521583a Fixed shortcut bugs
Fixed include bug
Changed a few small things in the core
2005-09-09 16:49:41 +00:00
f8aac5e88d Reworked code to support error handling, LogError() is separate from DisplayTrace() implementation 2005-09-09 16:04:44 +00:00
4738c92b8e Committed new debugger with AMX fixes 2005-09-09 03:23:31 +00:00
7ce59966fc Replaced with faluco's cleaned-up version of meta_api.cpp 2005-09-08 22:20:27 +00:00
afa1337e62 because gabe doesn't rollover, he just expands 2005-09-08 15:29:31 +00:00
cc34f468f0 Added a new math stock function. 2005-09-08 15:24:28 +00:00
3f9598fcbb Changed .amx in examples for pause() and callfunc_begin() to .amxx (as requested by XxAvalanchexX on the forums) 2005-09-08 13:05:44 +00:00
97b5391118 Logs the map name on mapchange (as requested by lantz69 on forums) 2005-09-08 13:03:38 +00:00
227c13d12c Added abs(x) stock 2005-09-08 12:58:17 +00:00
729932476b Fixed memory leak
Updated Modified-Event (now only one parameter [the modified text])
2005-09-07 22:31:31 +00:00
7c21deb0f2 Fixed memory leak
Updated Modified-Event (now only one parameter [the modified text])
2005-09-07 22:20:28 +00:00
80048eba61 Fixed memory leak
Updated Modified-Event (now only one parameter [the modified text])
2005-09-07 22:10:21 +00:00
0552e5ef58 Deprecated jghg2 include 2005-09-07 15:40:46 +00:00
ce881a7d30 Fixed bug at18558 (Nijule) 2005-09-07 00:11:10 +00:00
80dd7f034d version bump 2005-09-06 22:28:47 +00:00
5fac746feb compiler fix merge 2005-09-06 22:28:32 +00:00
67f012b74a Fixed bug where static declarations would crash 2005-09-06 21:34:33 +00:00
5705e69abb Fixed bug where level>1 arrays were walked incorrectly 2005-09-06 20:36:02 +00:00
bece1e6d0c Added float_to_str and str_to_float natives 2005-09-06 16:34:17 +00:00
f2527ecc86 The query_client_cvar native now checks for a non-zero g_engfuncs.pfnQueryClientCvarValue before proceeding 2005-09-06 16:31:54 +00:00
66b95f64a5 Now checks whether there is a non-zero g_engfuncs.pfnQueryClientCvarValue before setting newdll's pfnCvarValue function pointer 2005-09-06 16:31:07 +00:00
af79fe8e20 Added natives str_to_float and float_to_str; indents are now tabs 2005-09-06 16:29:27 +00:00
d3e2bad4e7 Added query_client_cvar native 2005-09-06 10:14:32 +00:00
6bebf37f1a An optional array parameter (LIKE TEH TASKS ONE) can be now passed to cvar query handlers 2005-09-06 10:12:02 +00:00
2f27b7da8d zomg! updated teh vectorz codeses a bit! Hopefully didn't break anything 2005-09-06 09:34:13 +00:00
824caab2c5 Fixed bug p1123143748 (Twilight Suzuka) 2005-09-06 03:00:01 +00:00
a105bc7402 Fixed bug at18003 (Geesu)
Fixed bug p1123149221 (Twilight Suzuka)
2005-09-06 01:55:41 +00:00
81ab33d794 Fixed shortcut bug in the settings dialog (couldn't set hotkeys to BkSp etc.)
Added "Reset" button to shortcuts page
2005-09-05 22:33:45 +00:00
e90364c17b Fixed bug at18525 (twistedeuphoria). 2005-09-05 22:05:23 +00:00
ac4014ff5a Fixed bug at18473 (Greenberet). 2005-09-05 21:59:44 +00:00
ad634924fa Fixed two bugs from at18519 (Lord of Destruction) 2005-09-05 21:43:05 +00:00
2d5f9ba181 Using the (*g_engfuncs.pfnQueryClientCvarValue) directlty instead of the macro so that it compiles on both metamod and metamod-p 2005-09-05 20:51:24 +00:00
aa0e4e121e Now properly cleaning up pending client cvar queries in the queue on client disconnect 2005-09-05 19:56:40 +00:00
f8227a09b4 updated to September 2005-09-04 22:40:43 +00:00
46130a6754 *** empty log message *** 2005-09-04 13:25:24 +00:00
58c006a9c8 Ready for release (1.1) 2005-09-04 13:03:34 +00:00
ea1d72401c Fixed switch bug, now even (much) faster
Updated aboutbox
2005-09-03 23:47:40 +00:00
fdbe0e2064 Upgraded plugin-system (other command call and now 93 commands)
Customizable IRC Paster
Updated version number from 1.01 to 1.1
2005-09-03 20:00:46 +00:00
e239801671 fixed get_map_info function 2005-09-03 13:59:33 +00:00
4be88a5015 version bump 2005-09-02 07:10:56 +00:00
ee02d0b13d this must be off! 2005-09-02 04:07:49 +00:00
2ec084ffa3 Patch for bug at18251 2005-09-02 04:06:47 +00:00
6636c20336 Fixed bug at18250 2005-09-02 03:44:15 +00:00
27c80b00f8 Fix for bug at18293. 2005-09-02 03:28:44 +00:00
6bcb72952c Applied patch for bug at18341 (jtp10181) 2005-09-02 02:46:42 +00:00
8c17be27dd Updated AMXx version 1.56 2005-09-01 17:11:48 +00:00
0232b0abee Bumped versions 2005-08-31 20:36:41 +00:00
12fd7a9f0d Added new DBI functions
Fixed bugs in field getting
2005-08-31 20:32:29 +00:00
71c6e70706 Updated for new API 2005-08-31 20:08:12 +00:00
c5cc94ba98 Added new natives 2005-08-31 04:36:25 +00:00
8220cc4c01 is_in_viewcone from in_view_cone 2005-08-30 23:22:27 +00:00
57ce74c4c7 Bumped version, lowered -O flag 2005-08-30 18:43:11 +00:00
5d6c72bf42 Patch for pausing issues 2005-08-30 07:18:47 +00:00
63b2bbc67e Made more de-allocation safety precautions 2005-08-30 07:15:27 +00:00
12f628e3d7 Fixed bug at18162 (vittu) 2005-08-30 07:00:49 +00:00
cd8d800eb7 Fixed bug at17920 (Grasshoper) 2005-08-30 06:59:50 +00:00
160ab3572b Fixed typo at18108 (FireStorm) 2005-08-30 06:57:41 +00:00
dc57ef1e0c Simple implementation for cvar queries 2005-08-27 23:00:44 +00:00
ca1544564c Upped to 3.2.5. 2005-08-27 21:27:35 +00:00
462916d00f Got rid of many annoying warnings MSVC7.1 was reporting 2005-08-27 09:55:32 +00:00
e15761b79a Updated plugin system 2005-08-27 01:47:15 +00:00
270d898f82 Fixed shortcut bug 2005-08-26 23:22:30 +00:00
2a2d5697b8 Fixed some bugs
Upgraded exception handler, now using madCollection
2005-08-26 22:59:25 +00:00
b17f277a1b Added AMXX-Studio to CVS 2005-08-26 19:07:54 +00:00
c15ed5741a Added AMXX-Studio to CVS 2005-08-26 18:53:19 +00:00
9e035dc744 Added AMXX-Studio to CVS 2005-08-26 18:29:39 +00:00
ac279b37e4 Removed old Makefile 2005-08-26 15:57:50 +00:00
974fdc950e Added new standard makefile 2005-08-26 15:54:42 +00:00
8bb01423b9 Updated api 2005-08-25 09:40:29 +00:00
401a23a298 Updated install script 2005-08-25 09:34:31 +00:00
7ac9ed4b80 *** empty log message *** 2005-08-25 09:27:32 +00:00
6fdcd8ffae Fixed NS build 2005-08-25 09:20:10 +00:00
d50a6302e0 ugh 2005-08-25 09:09:35 +00:00
5fd891bc32 Fixed version # 2005-08-25 08:34:26 +00:00
864f7c268e Fixed module for AMD64 2005-08-25 08:34:09 +00:00
4770f28a18 *** empty log message *** 2005-08-25 08:26:28 +00:00
51a4e2bf4e *** empty log message *** 2005-08-25 08:21:07 +00:00
c213c771d2 Fixed compression on Linux 2005-08-25 08:20:11 +00:00
0176d3a2ae Actual fix for compression! 2005-08-25 08:02:48 +00:00
92653ceebc Fixes for compression 2005-08-25 07:50:21 +00:00
c9051ad364 Fixed includes 2005-08-25 07:34:47 +00:00
94d350118d *** empty log message *** 2005-08-25 07:30:34 +00:00
2e22dde409 Removed extra forwards 2005-08-25 07:16:17 +00:00
4dad81af30 Merged in new ts includes 2005-08-25 07:13:48 +00:00
b271b01b13 Synced to Twilight's stuff 2005-08-25 07:12:52 +00:00
a17b879380 Merged in original TSFun 2005-08-25 07:09:16 +00:00
ea05af9fe8 updated to August 2005-08-25 01:15:30 +00:00
d661196429 Fixed bug at17860 2005-08-25 00:19:39 +00:00
1114443a43 Fixed for AMD64 compatibility 2005-08-24 18:13:40 +00:00
d802a3c961 gcc-3. compat 2005-08-24 07:32:01 +00:00
e2226ae809 Fixed linux compiling 2005-08-24 07:16:45 +00:00
fd8a27013b CVS Cleanup 2005-08-24 07:07:34 +00:00
b12224eabd CVS Cleanup 2005-08-24 07:01:02 +00:00
c30c3cf35c CVS cleanup 2005-08-24 06:57:32 +00:00
f828cde999 Updated ESF and CS 2005-08-24 06:56:02 +00:00
d05c381789 Added cstrike specific switch 2005-08-24 06:39:52 +00:00
245054cf48 Fixed bug at17739 (mysticssjgoku4) 2005-08-24 06:29:12 +00:00
da82ce757f Defaulted engine+fm on 2005-08-24 06:19:41 +00:00
4d74743138 Removed esf module 2005-08-24 06:15:41 +00:00
c1db39d086 Added Corona Byte's EvolutionX core 2005-08-24 06:13:55 +00:00
d516824936 Add copy exclusion filters
Repaired windows builder
Fixed /build to be /rebuild
2005-08-24 05:19:23 +00:00
10328f5f81 fixes 2005-08-24 05:08:05 +00:00
d4f09aac74 Wrong, look at the distro. And in the future change for all mod config sets if you do 2005-08-24 03:20:09 +00:00
8f97ed7934 Deleted bad file 2005-08-24 03:14:13 +00:00
1fcf7628a3 Added in real file 2005-08-24 03:13:57 +00:00
bdd740f8ab Added makefile 2005-08-24 02:54:39 +00:00
82fed37247 Updated to work on Linux, redesigned core 2005-08-24 02:53:38 +00:00
5b208eb9f5 gcc-3 compat 2005-08-24 02:36:05 +00:00
9be88ffa42 Linux compat, cleaned up newdll 2005-08-23 23:54:54 +00:00
f54d112bbb Language sync 2005-08-23 01:24:42 +00:00
96c4d33da4 - Updated to Sqlite 3.2.3. See sqlite.org for details about new stuff.
- Base dir for db files is now changed to the game mod dir. Update your config files!
2005-08-22 10:12:22 +00:00
bad4c02647 This file copied from mysql module... I assume this was forgotten during the last commit of amxxmodule.cpp... 2005-08-22 09:18:55 +00:00
70140ffc8f Fixed team menu. Should now work 100% to switch players between teams. However when client uses VGUI menus I haven't been able to close the class selecting window. It is (should be) only a cosmetic flaw though. 2005-08-22 08:01:01 +00:00
53e6bb6b50 No default sql 2005-08-22 01:04:41 +00:00
4cb7986426 admin.sma was "slightly" incompatible for people using sqlite. This version is courtesy of Lazarus Long who fixed this. Thanks. 2005-08-22 00:26:18 +00:00
18ba13be84 Removed the admin_sql.amxx line. It's all in admin.sma now, isn't it??? 2005-08-22 00:21:49 +00:00
dd371c4dbe no idea, I changed something though 2005-08-21 22:48:22 +00:00
7ea47c5a96 Fixed a deallocation mismatch with debug plugins in linux 2005-08-21 21:54:14 +00:00
5693d2629e Attempted fix at DEP 2005-08-21 19:30:27 +00:00
24d9e3266e wrong include, added pdata 2005-08-21 16:38:45 +00:00
b3b3ce4c2d added more pdata funcs 2005-08-21 16:36:40 +00:00
5882802a3e Added set/get pdata string 2005-08-21 16:33:38 +00:00
94e19aae0c Removed newdllfunc() and related NEWDLLFunc_* stuff. :-P (yes I finally read Alfred's post through) 2005-08-18 20:51:41 +00:00
7d51404aeb What!!! 2005-08-18 15:47:28 +00:00
1cdb12c4e4 Added NEW_DLL_FUNCTIONS to FM_* and a newdllfunc() native to call these... Although I'm not sure there is a reason to call those?
Anyway it will be needed later when client cvar query function is implemented.
2005-08-18 09:33:51 +00:00
e9993cce25 amd64 == no more libstdc++ 2005-08-18 08:44:01 +00:00
80bd845182 *** empty log message *** 2005-08-18 08:36:48 +00:00
f986202b06 AMD64 no stdc++ support 2005-08-18 08:33:21 +00:00
a4168a2096 version bump 2005-08-18 07:53:14 +00:00
3e85589930 Fix for bug at16876 (TheRising) 2005-08-18 07:05:33 +00:00
b5a57da29c Fixed linux build (I think) 2005-08-18 07:03:43 +00:00
58fec512e5 Now requires GCC-3 to compile, fixes retarded linking problem 2005-08-18 07:01:47 +00:00
a6ca045086 More SDK syncs 2005-08-18 06:41:59 +00:00
e401231d25 *** empty log message *** 2005-08-18 06:40:24 +00:00
9ddc24898f same win32 fix 2005-08-18 06:37:50 +00:00
f5350c0e0e fix for win32 2005-08-18 06:37:05 +00:00
fa64bef511 New SDK for gcc-3 compilations 2005-08-18 06:34:34 +00:00
29bfd81b36 New SDK for gcc-3 compilation 2005-08-18 06:32:59 +00:00
2d2506f1c4 Added memalign include 2005-08-18 01:04:52 +00:00
f334fec0a3 Added linux compile of altered JIT 2005-08-18 00:32:08 +00:00
03b6d3e77d Fixed alloc/dealloc mismatches 2005-08-18 00:29:43 +00:00
661f6c9851 Fixed bug at17357 (FireStorm) 2005-08-17 18:16:26 +00:00
593e013572 fixed typo 2005-08-17 17:53:11 +00:00
b04498cddb Experimental fix for bug at16815 (karlos) 2005-08-17 17:32:51 +00:00
8648bf32a3 Improved error reporting a bit 2005-08-17 17:21:57 +00:00
1768ae4b23 Fixed bug at17117 (Twilight Suzuka) 2005-08-17 17:07:41 +00:00
80e6d31998 updated sdks 2005-08-17 16:52:12 +00:00
381e331dda updated sdk 2005-08-17 16:50:01 +00:00
13c65f006b SDK no longer manages memory by default 2005-08-17 16:48:31 +00:00
4e8eff3e04 Fixed bug at17021. 2005-08-17 16:41:38 +00:00
572ad38366 Quick fix for bug at16854 (twistedeuphoria) 2005-08-17 16:16:56 +00:00
b2ade117ec Added bug fix at17218 (Freecode) 2005-08-17 16:12:45 +00:00
9eb36bd2bb Fixed bug where first call had wrong stack alignment
Tiny optimizations
2005-08-17 15:57:11 +00:00
85b7ac740b Experimental JIT fixes for linux crashing (no more xchg of esp) 2005-08-16 23:09:55 +00:00
98d3fb79d7 Fixed some mmgr bugs 2005-08-15 21:38:03 +00:00
bf092b4f95 Updated to Sqlite 3.2.2. 2005-08-11 19:06:54 +00:00
a4a9613f5b *** empty log message *** 2005-08-11 02:49:58 +00:00
ad86bf636f enabled statsx by default 2005-08-10 18:37:02 +00:00
d0b5886d7d Added cs_get_armoury_type and cs_set_armoury_type 2005-08-07 20:43:29 +00:00
aa75a143fc This should fix the problem where bots can't hit players using weapons other than the knife. 2005-08-07 13:38:34 +00:00
7144f5c794 updated error handler 2005-08-04 23:46:22 +00:00
befb651268 fixed design bug (adds now Skipped when file is skipped)
fixed ESF install bug (didn't install, invalid pathes)
2005-08-03 18:45:16 +00:00
c8fdea6216 Fixed bug found by T(+)rget 2005-08-03 16:33:52 +00:00
4a6a16c627 NADE_CATCHED changed to NADE_CAUGHT 2005-08-03 15:01:54 +00:00
6256687272 bumped 2005-08-03 01:54:16 +00:00
5be9ba4a68 Fixed esf 2005-08-03 01:17:27 +00:00
8f61073f43 Updated installer script 2005-08-03 01:14:17 +00:00
a973adb4f2 added library 2005-08-02 20:00:29 +00:00
96c9fc8bc8 Changes for linux compatibility 2005-08-02 19:05:51 +00:00
d472d5d309 Slightly buggy but acceptable for linux >:\ 2005-08-02 19:05:38 +00:00
a819a494b8 ugh, amd64-32 compat 2005-08-02 18:37:59 +00:00
f2c3dfa874 added AMXX_VERSION_NUM 2005-08-02 14:06:17 +00:00
fe3645d809 More gcc-3 whining 2005-08-02 11:51:31 +00:00
b9ff24171f AMD64+gcc-3 complains otherwise 2005-08-02 11:43:26 +00:00
59fb0a39b2 added desc box 2005-08-02 11:40:46 +00:00
94202eec34 tl sync 2005-08-02 11:38:57 +00:00
ef8715892b More hax 2005-08-02 11:19:56 +00:00
e5ce86d61a gaben 2005-08-02 11:19:08 +00:00
7825364e06 hax 2005-08-02 11:15:15 +00:00
5cba645e49 latest sdk 2005-08-02 11:13:23 +00:00
ef4d04a7e1 *** empty log message *** 2005-08-02 11:12:42 +00:00
0302803f38 rebuild jic 2005-08-02 10:37:23 +00:00
d57004c91f *** empty log message *** 2005-08-02 10:26:51 +00:00
f5fe076ec1 oops that was win32 2005-08-02 10:18:09 +00:00
7eaa8a1a39 Added makefiles, fixed template bug in nvault 2005-08-02 09:48:06 +00:00
de5abef49a New makefiles 2005-08-02 09:30:50 +00:00
edd9fa2879 New makefiles. 2005-08-02 09:29:14 +00:00
0686da47a6 Fixed crash bug 2005-08-02 08:39:17 +00:00
4f9f548a58 yasm -f elf -m amd64 -g stabs 2005-08-02 08:29:02 +00:00
2d79c6e634 *** empty log message *** 2005-08-02 08:23:36 +00:00
ad6c7d412a *** empty log message *** 2005-08-02 08:15:01 +00:00
686dadc9c5 New makefile 2005-08-02 08:12:47 +00:00
70bff9c430 Fixed AGAIN! 2005-08-02 08:10:04 +00:00
cefad23b72 new makefile 2005-08-02 08:06:28 +00:00
0447c39a97 forgot this 2005-08-02 07:53:59 +00:00
688c12ac8b fixed two bugs 2005-08-02 07:46:41 +00:00
5cbcd34bec update 2005-08-02 07:17:12 +00:00
f9563b5103 *** empty log message *** 2005-08-02 07:07:35 +00:00
38da105ac1 Few changes 2005-08-02 07:01:25 +00:00
cc393d0e8d committed C# releaser 2005-08-02 06:28:41 +00:00
25cbe60bf8 fixed metamod plugins.ini bug 2005-08-02 02:56:09 +00:00
6be3805841 ready for release 2005-08-01 23:25:02 +00:00
6e3de2c53a *** empty log message *** 2005-08-01 22:34:33 +00:00
cf274f7f50 changed project name 2005-08-01 22:33:28 +00:00
17cca4587c Fixed small bug 2005-08-01 22:29:19 +00:00
3014e60bdb Added TSFUN include 2005-08-01 22:21:47 +00:00
e5b4b5a53d Initial import of twilight's module 2005-08-01 22:14:14 +00:00
bc66a93fcf the editor unindents now on pressing }. have fun!
- fixed bugs... lalala
- updated debug-list
- fixed comment-bug
- now final edition...
- updated captions
- fixed configs-bug (configs weren't uploaded during FTP installations)
2005-08-01 21:54:28 +00:00
8f06e36d04 fixed a few bugs 2005-08-01 20:54:41 +00:00
e38b64ff82 yams 2005-08-01 20:22:01 +00:00
4687ecd99b Committed hopefully final version 2005-08-01 19:56:54 +00:00
b1718bc334 added cs_user_spawn 2005-08-01 19:25:25 +00:00
d7063435f4 added cs_user_spawn (thanks T(+)rget) 2005-08-01 19:24:48 +00:00
a7133501d5 Fixed comments 2005-08-01 19:05:10 +00:00
5078ed9d0f changed on advice from target 2005-08-01 19:01:25 +00:00
424a8c17b3 *** empty log message *** 2005-08-01 18:56:03 +00:00
90c0e32cb3 oops killed changes 2005-08-01 18:31:06 +00:00
d3acbcc319 (c) 2005-08-01 10:24:20 +00:00
a776e832dd New plugin file format, new zlib libraries 2005-08-01 09:02:52 +00:00
65bd10c47b Committed linux build of new compiler 2005-08-01 09:00:01 +00:00
9bdd0ba0a4 Windows build of new compiler 2005-08-01 08:51:26 +00:00
ff48a9076b *** empty log message *** 2005-08-01 08:50:14 +00:00
3f99ce7af5 New plugin file format 2005-08-01 08:47:54 +00:00
4451691aa2 Removed warning 219 2005-08-01 05:56:06 +00:00
bc64ae2712 name change 2005-08-01 05:15:57 +00:00
7f55873bfb Fixed name clash 2005-08-01 05:14:55 +00:00
d94016384a from the "check your changes to see if they compile" dept 2005-08-01 05:10:55 +00:00
eb87344a16 Fixed bug at16702, jtp10181 2005-08-01 05:06:40 +00:00
43c06b0e36 what 2005-08-01 05:03:50 +00:00
a35b96fb7e Finished correcting your stuff SidLuke 2005-08-01 04:55:55 +00:00
562633c040 SDK to update MF_AmxExec and add MF_AmxPush 2005-08-01 03:23:56 +00:00
71eac5c544 omg sidluke why was this using amxmod api still?!?! 2005-08-01 03:19:46 +00:00
4fe39dd5cc okay removed old forward stuff why was this defaulted?! 2005-08-01 03:05:53 +00:00
7605abc929 Updated for new API 2005-08-01 02:58:57 +00:00
0a4133b4d0 Added register_native 2005-08-01 02:36:09 +00:00
0086b58f39 Completed AMD64 compatibility 2005-08-01 02:23:42 +00:00
583b67dbb1 the editor unindents now on pressing }. have fun!
- fixed bugs... lalala
- updated debug-list
- fixed comment-bug
- now final edition...
- updated captions
- fixed configs-bug (configs weren't uploaded during FTP installations)
2005-08-01 00:28:07 +00:00
a81f356835 *** empty log message *** 2005-08-01 00:25:47 +00:00
b2218661f8 the editor unindents now on pressing }. have fun!
- fixed bugs... lalala
- updated debug-list
- fixed comment-bug
- now final edition...
- updated captions
- fixed configs-bug (configs weren't uploaded during FTP installations)
2005-08-01 00:24:40 +00:00
8234977fa9 the editor unindents now on pressing }. have fun!
- fixed bugs... lalala
- updated debug-list
- fixed comment-bug
- now final edition...
- updated captions
- fixed configs-bug (configs weren't uploaded during FTP installations)
2005-08-01 00:19:25 +00:00
13ed6ed2d6 Touching up new system for linux support 2005-07-31 22:16:54 +00:00
a7fb4e85c9 Fixed bug where 64bit code was not browsed properly 2005-07-31 22:16:44 +00:00
abfca025d5 Committed new register_native system 2005-07-31 20:11:58 +00:00
34acc54cc9 Initial import of native hack for x86 2005-07-31 06:48:08 +00:00
b27eaab57f Initial import of new version :] 2005-07-31 06:07:48 +00:00
dd6c169994 Fixed c_str() 2005-07-31 06:04:42 +00:00
5751d381af Deleted old version 2005-07-31 06:03:54 +00:00
28998b5c14 initial import 2005-07-30 17:36:40 +00:00
a939cd0e2a added esf 2005-07-30 17:35:53 +00:00
d9d5446e86 updated 2005-07-30 17:34:07 +00:00
b91cc24d32 Finished 2005-07-30 17:33:49 +00:00
faae071ee8 version bump 2005-07-30 16:52:51 +00:00
cdbfa38391 some of the string functions twilight wanted 2005-07-30 16:47:48 +00:00
5d92972aad one more 2005-07-30 16:46:40 +00:00
ba17c8a75f version bump 2005-07-30 16:42:01 +00:00
389a593f9e ugh 2005-07-30 16:41:34 +00:00
b35e5dbd55 SDK sync, version bumps 2005-07-30 13:03:18 +00:00
0591c38d45 Updated SDK 2005-07-30 12:58:24 +00:00
041e73dc7e Updated notices 2005-07-30 01:52:50 +00:00
431eb72518 Updated twisty's code 2005-07-30 01:51:12 +00:00
75b63da66f Fixed output 2005-07-30 00:38:08 +00:00
51d54a96ff Added pc_printf to exports 2005-07-30 00:35:47 +00:00
df982ceb79 Fixed error output on compiler 2005-07-30 00:31:42 +00:00
ee978890b8 What? 2005-07-29 23:47:11 +00:00
fa46d2e1b5 Patched engine with non-constructing string 2005-07-29 21:30:52 +00:00
559d8bc7eb Quick patch for possible bug at15468 2005-07-29 20:23:08 +00:00
0d90a958ae Added request at16475
Fixed crash bug from bad allocation in construction
2005-07-29 20:15:08 +00:00
cb7bfbf642 Added request at16475 2005-07-29 19:37:07 +00:00
6cf6edb5b6 Fixed bug at16581, devicenull 2005-07-29 19:25:24 +00:00
b9ee99a3dc New plugin flags 2005-07-29 19:24:28 +00:00
a86302beea Changed function meaning 2005-07-29 19:20:59 +00:00
f6d647f614 Requested change at16639 2005-07-29 19:18:45 +00:00
32a42886dd Finished new menu system (for now)
Fixed bug where client_print did not add newlines properly
2005-07-29 19:13:55 +00:00
5b1d0dd2b9 removed old project file 2005-07-29 06:41:33 +00:00
166b5ca650 omg new menu system 2005-07-29 06:33:57 +00:00
044fa19470 Fixed bug where callfunc crashes 2005-07-29 06:12:23 +00:00
1d6b173e87 Fixed a bug where bad plugins could crash 2005-07-28 18:00:40 +00:00
eaf102d78f Fixed bug where JIT did not work on linux (memory alignment issues) 2005-07-27 19:43:54 +00:00
31436e3ecf Added linux compatibility 2005-07-27 17:28:06 +00:00
62cdaf5e10 Initial import of linux compiler builds 2005-07-27 17:27:20 +00:00
0de08a9452 Removed unused files 2005-07-27 17:00:57 +00:00
0de288139d Added linux support 2005-07-27 16:58:18 +00:00
94d3b31f40 Language sync for faluco :) 2005-07-27 16:32:39 +00:00
6d7442fb4f Fix for bug at8190 by faluco 2005-07-27 16:32:22 +00:00
68ad9c2b9a Ok makefile works on i386 now 2005-07-27 16:27:01 +00:00
191acd8e42 New Makefile, linux compatibility 2005-07-27 16:24:14 +00:00
ce043d0633 >:o 2005-07-27 00:51:35 +00:00
f18354807e Updated module SDK 2005-07-26 23:33:52 +00:00
6a97d73167 Committed brand new debugger system 2005-07-26 21:31:21 +00:00
586d09e533 I don't think I changed anything... 2005-07-26 21:30:35 +00:00
ba24020857 fixed amx_BrowseRelocate overwriting the flag state 2005-07-26 21:29:49 +00:00
4b9425cf3b Initial import of edited debug reader 2005-07-26 21:28:19 +00:00
ef2a9a2b34 Fixed switch case bug in JIT where no cases would crash 2005-07-26 21:28:04 +00:00
1a3a5331d1 *** empty log message *** 2005-07-26 18:47:11 +00:00
363e7e2270 updated to use amxxpc.exe 2005-07-26 18:45:37 +00:00
fdbee670c5 Uh, forgot... 2005-07-25 21:02:26 +00:00
a47ccb2a2a I'm high 2005-07-25 20:45:02 +00:00
9e46d2da47 WOW. 2005-07-25 20:39:58 +00:00
451a6d8464 PM STRIKES AGAIN (untested) 2005-07-25 19:09:49 +00:00
4abd7b4706 Now reads debug info correctly (cleaned some code up too) 2005-07-25 18:26:42 +00:00
09a08fd2f6 quick fixes before adding debugger again 2005-07-25 06:48:54 +00:00
4609cb409b Whoa! Merged in Pawn! (Small 3.0)
Removed debug handling (will add back in soon)
Ported all amx_Exec()s to forward systems
Deprecated AMX Mod module support (incompatible with Pawn anyway!)
Deprecated many file natives (unused)
Deprecated some functionality of pause/unpause
Fixed some memory deallocation bugs (thanks fysh)
Bumped module API version to 3 (no new M/SDK yet!)
Bumped AMX Mod X version to 1.5!
Merged in CVector changes
2005-07-25 06:03:43 +00:00
955aa04b41 Removed packed strings 2005-07-25 05:54:33 +00:00
69a5b5f410 Initial import of Pawn 3.0 compiler (win32) 2005-07-25 05:34:13 +00:00
b94fbb519a *** empty log message *** 2005-07-25 05:31:12 +00:00
832de07128 Removed Small compiler 2005-07-25 05:30:28 +00:00
f6b91f9258 Initial import of amxxpc 2005-07-25 00:01:54 +00:00
f9ca86cee6 *** empty log message *** 2005-07-25 00:01:50 +00:00
0ef9b80430 the editor unindents now on pressing }. have fun!
- fixed bugs... lalala
- updated debug-list
- fixed comment-bug
- now final edition...

hrm bail decided this will be AMX Mod X 1.5 so updated captions..
-> Basic-Master is now crazy o_><_O
2005-07-24 23:47:45 +00:00
057929e2f6 Fixed bug with sprintf widths 2005-07-24 22:42:34 +00:00
25d629083f Initial import of Pawn (Small 3.0) 2005-07-24 20:00:55 +00:00
c2502626e6 the editor unindents now on pressing }. have fun!
- fixed bugs... lalala
- updated debug-list
- fixed comment-bug
- now final edition...
2005-07-24 19:27:36 +00:00
76505f172a fixed problems with wrong weapon id ( enfield & fg42 ) 2005-07-24 11:07:49 +00:00
79268c5316 ---------------------------------------------------------------------------
Fixed memory bug found by fysh
2005-07-24 07:06:25 +00:00
0c36613352 Deprecated file read natives until they can be rewritten 2005-07-24 03:23:35 +00:00
37a80e6ef6 Fixed bugs at8190, at16430 2005-07-24 02:52:15 +00:00
7fc97524e2 the editor unindents now on pressing }. have fun!
- fixed bugs... lalala
- updated debug-list
- fixed comment-bug
- now final edition...
2005-07-23 21:25:25 +00:00
842813dcbb Fixed a few potential bugs, and set_msg_arg* no longer accepts type changes 2005-07-23 20:16:29 +00:00
9e194394c3 CVector fix - corrupt memory on size change 2005-07-23 16:58:10 +00:00
e188bf087a CVector fix - corrupt memory on size change
Version bumps
2005-07-23 16:57:21 +00:00
c5aae0d8aa little bug fix 2005-07-23 07:07:41 +00:00
25f1870020 the editor unindents now on pressing }. have fun!
- fixed bugs... lalala
- updated debug-list
- fixed comment-bug
- now final edition...
2005-07-22 22:21:16 +00:00
911e2ecefe New menu natives 2005-07-22 21:15:48 +00:00
b9131293c5 entity_set_owner accepts anything now 2005-07-22 20:47:13 +00:00
536a4f8472 Err, fixed these 2005-07-22 20:41:32 +00:00
29e1a5edc8 FAKEMETA IS GONE! SO LONG AND THANKS FOR THE FISH 2005-07-22 19:32:16 +00:00
34e5872881 *** empty log message *** 2005-07-22 17:37:27 +00:00
1d853b5fee because of bail I the editor unindents now on pressing }. have fun!
fixed bugs... lalala

updated debug-list
2005-07-22 17:36:51 +00:00
191824d72a new message system and string class 2005-07-22 09:26:37 +00:00
99f65175ff *** empty log message *** 2005-07-21 23:08:23 +00:00
2f8e311140 because of bail I the editor unindents now on pressing }. have fun!
fixed bugs... lalala
2005-07-21 22:29:08 +00:00
21551a6ea8 Fixed it for real <_< 2005-07-20 03:19:53 +00:00
c4f097bb36 Updated to PCRE 6.1 2005-07-19 16:48:16 +00:00
ffbf9fdca6 Saved a whole four bytes of memory 2005-07-19 16:14:52 +00:00
3863bd3ccc Fixed bug where not-found natives were still valid 2005-07-19 16:12:48 +00:00
a89e1ac536 Oops! Forgot to MF_Add pev 2005-07-19 16:08:00 +00:00
2f64226c6b Fixed bug at11988 reported by twilight suzuka 2005-07-15 20:50:23 +00:00
91da6f1631 Added is_in_viewcone, is_visible 2005-07-15 20:29:59 +00:00
e8c87f8d89 added is_visible, is_in_viewcone 2005-07-15 20:28:22 +00:00
3cba7811bd Committed new auto-module registering system
require_module is now DEPRECATED
2005-07-15 19:15:58 +00:00
70396a2fc1 new sdk version (bumped interface!!!!) 2005-07-15 19:13:50 +00:00
1a53b7bba7 Committed new SDK version 2005-07-15 19:05:44 +00:00
74ec2e75b8 New auto-module system 2005-07-15 19:05:31 +00:00
b312da8c63 Fixed bugs GCC caught 2005-07-15 16:28:41 +00:00
fe2d28f711 Ported the new dir commands to linux 2005-07-15 16:14:00 +00:00
1b09be51e1 Reverting JGHG's changes (forgot to commit this) 2005-07-15 07:59:26 +00:00
e1d1802cb9 Fixed bug at16027 2005-07-14 13:36:22 +00:00
db293cc451 Fixed memory leaks
Optimized message handling a bit
2005-07-14 04:50:46 +00:00
116984afed New dir reading natives, new memory outputs 2005-07-13 23:31:02 +00:00
a9d4e4e711 New natives for reading dirs 2005-07-13 23:30:28 +00:00
ef908ff4f5 Added get_distance_f, at15992 2005-07-13 22:16:30 +00:00
4631311905 Reverted pev changes 2005-07-13 18:05:52 +00:00
1106113f2b Recommitted pev - don't do this again without telling someone! 2005-07-13 17:35:47 +00:00
35ed810775 Patch for ifvers 5:11 (new MM API), eliminates fakemeta like mm-pext 2005-07-13 02:37:32 +00:00
e1a1153018 updated to July 2005-07-10 09:01:24 +00:00
e91cd0862e Added include files for new ESFMod module 2005-07-10 00:47:56 +00:00
5ac71db62d Tiny fixes 2005-07-10 00:45:42 +00:00
d270feb15f sawce forgot to add the shotgun to the list for retreiving reserve ammo. fixed. 2005-07-09 22:42:29 +00:00
1c8aca42eb Updated offsets for 3.0.5. With a couple of linux changes. 2005-07-09 22:26:38 +00:00
e0dbc031cc Committed initial import of the Earth's Special Forces module 2005-07-09 21:51:35 +00:00
39eba4134e Updated offsets for 3.0.5. Only windows offsets have been tested. I may update this again after testing linux. 2005-07-09 21:44:33 +00:00
9f77c8a4a2 oops 2005-07-09 15:38:07 +00:00
9b6fb64aba Bumped version # 2005-07-09 07:18:41 +00:00
82d6cb9de0 *** empty log message *** 2005-07-09 07:09:25 +00:00
8ae1d4ce27 New offsets from karlos (at15812) 2005-07-09 07:09:08 +00:00
21541fcc7f Decided to discontinue this module 2005-07-09 06:48:04 +00:00
e9e4ab69e6 Addressed report at15008 (twistedeuphoria) 2005-07-08 05:42:10 +00:00
35ecd40228 Fixed bug at15479 (karlos)
Fixed bug at11812 (Kamikaze)
Added new build_pathname implementation for reentracy.
build_pathname_r added to module API
2005-07-08 05:05:06 +00:00
e8d30a11d7 Patch for is_user_hltv (at14918 by Wallslide)
Fixed a few potential crash bugs
2005-07-08 02:01:01 +00:00
36d19dfe04 Fixed bug at15006 reported by EKS 2005-07-08 01:43:44 +00:00
5d90ccf088 Fix for bug at15759, from devicenull 2005-07-08 01:22:57 +00:00
de5eb6924a Added request at13457 from harbu. 2005-07-08 01:15:54 +00:00
0600e3357c Another resync :) 2005-07-08 00:44:09 +00:00
40f28a543e Resync 2005-07-07 20:08:35 +00:00
13b6c0764c Added request at15060 by twistedeuphoria 2005-07-07 19:53:02 +00:00
950d1b4a5f Fixed bug at13314 from XxAvalanchexX 2005-07-07 18:49:14 +00:00
85ed8468f8 Fix ap22177.2 from faluco 2005-07-07 18:46:04 +00:00
756a6a2b65 Fix ap22177.4 from faluco 2005-07-07 18:41:29 +00:00
e63ed1e3e0 Fix ap22177 from faluco 2005-07-07 18:40:59 +00:00
27c2978617 Synced language translation files 2005-07-07 18:38:29 +00:00
b0c9b868cd Fixed bug a13718 report by faluco 2005-07-07 18:37:33 +00:00
101c590f32 Removed mysql backwards compatibility
Removed stray character
2005-07-06 21:20:53 +00:00
943a75d7e1 Added requestfunction 2005-07-06 03:59:02 +00:00
611ad2be94 Malformat bug fixes, RC version bump 2005-07-06 03:20:00 +00:00
64b7c7b600 Malformat bug fixes 2005-07-06 03:19:27 +00:00
cc899d298d Modules can now intercommunicate through RegisterFunction() - UNTESTED
Registering a function will make it available through ReqFunc,
2005-07-05 22:01:29 +00:00
3f2c117039 because of bail I the editor unindents now on pressing }. have fun! 2005-06-26 02:10:33 +00:00
0d21377035 because of bail I the editor unindents now on pressing }. have fun! 2005-06-26 02:07:03 +00:00
48749382fb amx_addadmin added 2005-06-21 22:04:44 +00:00
996f461157 Fixed a memory leak on plugun unload 2005-06-16 20:20:24 +00:00
8d898ae459 fixed /stats command 2005-06-13 10:52:33 +00:00
b609eead1b fixed get area function 2005-06-01 13:49:49 +00:00
567ab19fe5 added cap_message to CP_ enum 2005-05-31 21:08:56 +00:00
1cc60fc9ad added new functions 2005-05-31 13:56:15 +00:00
959a5b9225 *** empty log message *** 2005-05-31 12:44:14 +00:00
9b8658606b fixed EndRound Stats 2005-05-31 12:35:13 +00:00
51ff0a2c49 Added stock file_copy to file.inc.
Also fixed fopen to return 0 on files that can't be opened.
Fixed native fopen to take const filename.
2005-05-29 16:36:35 +00:00
c1552aacd6 * May 18th, 2005: Starting to develop AMXX-Edit v2 as a kind of open source
* May 19th, 2005: Added debug dialog (only for developing)
2005-05-19 11:03:42 +00:00
ba245458de * May 18th, 2005: Starting to develop AMXX-Edit v2 as a kind of open source 2005-05-18 21:23:15 +00:00
c32e747dc1 *** empty log message *** 2005-05-18 21:04:34 +00:00
7ad84abb09 *** empty log message *** 2005-05-18 20:54:43 +00:00
dd6abc5487 * May 18th, 2005: Starting to develop AMXX-Edit v2 as a kind of open source 2005-05-18 20:53:06 +00:00
3642cedd2b delete it 2005-05-18 20:14:34 +00:00
df87bc06c2 fixed "dod_set_stamina" native 2005-05-12 10:28:40 +00:00
9d200888ff Initial import 2005-04-29 22:47:00 +00:00
ebf0945c6e Added numtostr and strtonum mappings... not adding this to string.inc ... but it's there now. :-P 2005-04-19 15:40:21 +00:00
7c6d869cb4 Moved
/* Sets player frags. */
native set_user_frags(index, frags);

from amxmodx.inc to fun.inc...
2005-04-19 14:49:16 +00:00
6de8178c30 Fixed a typo 2005-04-11 02:20:11 +00:00
1b80dd5584 updated to April 2005-04-10 15:47:14 +00:00
7ceaa4801d fixed wrong formatting when using non-english languages (thanks n-o-l-o) 2005-04-05 15:10:20 +00:00
15bd719cf5 FireStorm's fix 2005-04-05 14:48:06 +00:00
acb2b27852 Began AMXx bindings 2005-04-03 03:26:35 +00:00
abbb2f2cc2 Implementation of journaling 2005-04-03 02:01:42 +00:00
aa8beace98 added headers 2005-04-02 16:04:08 +00:00
d17d9103de Initial commit of hashtable stuff 2005-04-02 07:33:25 +00:00
85f5604d43 *** empty log message *** 2005-03-30 18:43:43 +00:00
fa42dbf011 Added stock admin_print(access, const DESTINATION, const MSG[]); 2005-03-30 11:37:41 +00:00
d1c27a7534 Goodbye pev. You've been great. Miss you. 2005-03-27 00:42:00 +00:00
8675d6a4a8 Pev -> Engine wrapper for backwards compatibility 2005-03-26 15:59:58 +00:00
1d770fd400 Removed pev 2005-03-25 22:05:41 +00:00
d6b704e74c Updated from http://www.amxmodx.org/forums/viewtopic.php?p=99878
To ban LAN:ers by IP and not authid.
2005-03-25 09:40:04 +00:00
eeee302722 Removed pev.cpp from build. These are excluded in vcproj from Windows builds. 2005-03-25 09:33:40 +00:00
81f4a505c1 Added FM_KeyValue and get_kv/set_kv natives.
Removed pev natives.

Probably fixed something in DLLFunc_ClientUserInfoChanged.
2005-03-25 09:30:45 +00:00
560f50eda7 *** empty log message *** 2005-03-24 11:37:00 +00:00
73f1e4d77e *** empty log message *** 2005-03-24 11:03:09 +00:00
87fd5e2b4e Added in-game cmd "amx_addadmin <playername> <flags> [password] - automatically add specified player as an admin to users.ini" 2005-03-24 10:59:46 +00:00
01cc4a1bad Fixed cs_set_user_armor() 2005-03-20 15:44:32 +00:00
ad732d7286 *** empty log message *** 2005-03-16 21:00:16 +00:00
448da8bd9e One more core skipping thingy 2005-03-11 19:16:00 +00:00
a4be1ac635 evilspy's fix 2005-03-11 16:31:49 +00:00
5e46f64d75 Updated hitzones.
Now allows setting individual hitzones between player A <-> player B.
2005-03-11 09:21:03 +00:00
f9281fe309 Removed last bug "fix" which did nothing except break a perfectly working plugin. Doh! 2005-03-10 10:47:09 +00:00
d3a49d1d41 Updated installer 2005-03-10 01:25:18 +00:00
8736214678 Added SQLite module to configuration 2005-03-09 23:13:47 +00:00
b2aa069cd4 update 2005-03-09 22:21:26 +00:00
01bacc3275 As sawce would say. Bug go squish. :D 2005-03-07 23:55:18 +00:00
53b7516449 Made combat countdown work over multiple games on the same map. Sound now stops when a team has won and everything resets. 2005-03-07 23:48:10 +00:00
916325d3db Apparently this votemap crash bug is fixed in a server patch being released tonight/tomorrow. 2005-03-07 14:36:48 +00:00
054f046807 Fix for votemap server/client crash in NS v3.0 final release. 2005-03-07 13:41:08 +00:00
a4e57797f5 NS v3.0 final release changes: Removes ns_agora, ns_mineshaft Added: ns_eon, co_niveus 2005-03-06 23:36:11 +00:00
afef83ae66 Updated for addition of Jetpack player class to ScoreInfo Message in NS v3.0 final release. 2005-03-06 21:55:15 +00:00
730857a23b updated to March 2005-03-06 13:41:33 +00:00
7fd9fff987 Offsets updated for NS v3.0 final release. 2005-03-05 05:25:32 +00:00
3074ca0756 Removed some... odd thing. 2005-02-25 18:05:50 +00:00
7b8165fe6f Removing task waiting to call dispInfo if client disconnects before the task is executed. This fixes run time errors. 2005-02-21 00:31:52 +00:00
3774575160 Fixed a bug in dispInfo: if client disconnected fast enough we got a native error in client_print :-D 2005-02-21 00:23:16 +00:00
57eec2b88e evilspy's support for mm-p ext 2005-02-16 20:36:04 +00:00
b2eb9df894 Updated dbi_type() (added "sqlite") and added stock sqlite_table_exists(). 2005-02-15 20:50:15 +00:00
00e9f2bbea Removed some mysql stuff 2005-02-15 20:46:58 +00:00
adf12ab745 Fixed makefiles 2005-02-15 17:27:00 +00:00
9d4e5b18ee Makefiles for Linux. Not tested. 2005-02-15 14:39:36 +00:00
8a40ed8cd6 Stupid Tortoise. 2005-02-15 14:19:07 +00:00
c79909eb80 Initial import of Sqlite 2005-02-15 14:11:01 +00:00
26e8b0dbb6 client_disconnect forwards now get called for every client which is initialized (ie. client_connect was called for him) instead of clients which are ingame only (ie. client_putinserver was called) 2005-02-07 10:28:22 +00:00
a2c2dc88fc Yes! 2005-02-06 11:59:41 +00:00
99f47224ee updated to February 2005-02-05 15:15:13 +00:00
a085cef0d6 Updated to allow compiling with unmodified statsx.sma, and other plugins using the old csx api... hopefully. :-9 2005-02-05 11:06:34 +00:00
2980fb1d82 Merged with ns2amx header 2005-02-03 20:49:44 +00:00
3ed92695be Reverse 2005-02-01 01:12:51 +00:00
9d797f8664 Revert 2005-02-01 00:59:55 +00:00
d7dbf60c8f New versions fixing compaction bug 2005-01-31 23:11:36 +00:00
06923d0f6d Updated versions 2005-01-31 19:39:50 +00:00
948be015a7 new version number 2005-01-31 19:35:06 +00:00
1a339b2f77 New version number 2005-01-31 19:34:15 +00:00
39479f2403 new verison number 2005-01-31 19:33:36 +00:00
e4beb3828a Increased version number 2005-01-31 19:33:17 +00:00
84caa10733 Updated to 2.7.2 compiler 2005-01-31 08:24:24 +00:00
a8ff2abab5 sdk syncs 2005-01-31 07:59:44 +00:00
b4d2f83d6f sdk sync 2005-01-31 07:54:17 +00:00
be28d95b8d Fixed DS's notice 2005-01-31 07:52:32 +00:00
2401d1833e Updated to 2.7.2 compiler 2005-01-31 07:41:47 +00:00
a189c0bda7 Added amx_mkdir for twistedeuphoria 2005-01-30 05:32:10 +00:00
cc462c9ccb Added cs_user_has_shield from Ronkkrop 2005-01-30 05:10:42 +00:00
3d7987e8d8 Fixed is_amd_64 include (Damaged Soul) 2005-01-30 05:03:46 +00:00
1c544f55ca Fixed typo (furax44) 2005-01-30 05:00:25 +00:00
5c231919b6 Fixed typo (FireStorm) 2005-01-30 04:54:04 +00:00
4b48be3e93 Synced language files 2005-01-30 04:53:11 +00:00
ca07e53293 Fixed typo (XxAvalanchexX) 2005-01-30 04:52:10 +00:00
3f2a8ccfc5 0.4 = added delete button 2005-01-27 08:58:01 +00:00
e097932ac9 0.2 file not found -> exits 2005-01-22 13:27:57 +00:00
27e4174be6 0.2: Edit stats, clear stats features added 2005-01-22 13:24:26 +00:00
7f47d2de56 My god... 2005-01-21 16:27:44 +00:00
6200ee6977 Fixed about box :-P 2005-01-21 16:23:55 +00:00
e98fb7d6e4 Included WinCSX project 2005-01-21 16:09:25 +00:00
4e6233b898 WinCSX 0.2 initial commitment 2005-01-21 16:08:36 +00:00
544b74f839 Crashes after hitzones "fix".
This should fix that. Hopefully.
2005-01-17 07:45:20 +00:00
4a823a0894 Updated for amx_menu... 2005-01-16 22:24:36 +00:00
53188ab941 New natives: cs_set_user_armor(), cs_get_user_armor()
cs_set_user_armor() should be used instead of fun's set_user_armor().
2005-01-16 16:30:18 +00:00
5f7dabf9b6 *cough* 2005-01-15 12:24:14 +00:00
e343d224ce amx_menu: A new menu also reachable by non-admin clients. Scripters can add their plugin menus as an item in this menu (Wc3 menu, Superhero info, etc...) so that a client don't have to bind/know a million different menu commands. This could become a one-stop-shop for all of the clients menu needs. Let's hope it catches on. :-)
For this menufront.sma adds: "amx_addclientmenuitem" where server admins can add menu items from plugins that don't support this yet.
amxmisc.inc is also updated to support this.
2005-01-15 09:58:51 +00:00
188023b5ac Fixed get_stats in csx and get_stats2 in csx_sql
csx and csx_sql now have exact same functionality, apart from csx_sql can also export stats to sql database if activated with cvar...
2005-01-14 12:21:12 +00:00
f18adbf9d6 Updated get_stats and get_stats2 to also retrieve authid 2005-01-14 12:14:34 +00:00
9959ef52b3 Possibly fix the hitzones problem. 2005-01-13 11:02:14 +00:00
8e58484fc5 get_stats now looks like this:
native get_stats(index,stats[8],bodyhits[8],name[],len,authid[],authidlen=0);
(authid + authidlen are new)
+ fixes
2005-01-12 01:24:40 +00:00
a58ab24b0c Added cvar csx_sqlstats_exportstats 2005-01-11 15:31:47 +00:00
a67085217f Fixes 2005-01-11 13:02:06 +00:00
f08f16c20d Adds cvars:
cvar_t *csx_sqlstats_host;
cvar_t *csx_sqlstats_username;
cvar_t *csx_sqlstats_password;
cvar_t *csx_sqlstats_db;
cvar_t *csx_sqlstats_table;

Exports players' statistics at map change to SQL db right after it saved those to the dat file.
2005-01-11 12:23:57 +00:00
ec9d4a52fe Updated library to 7.4.6 2005-01-10 16:42:46 +00:00
01b955d2d4 Finally added callfunc_begin_i and get_func_id into amxmodx.inc 2004-12-25 21:28:50 +00:00
a384a78544 Silly me! 2004-12-25 21:24:50 +00:00
b4ad89e6ef Reverted last changes 2004-12-22 18:19:51 +00:00
2b4ed9cc27 Test: Hopefully fixed "bot bug" 2004-12-22 16:29:40 +00:00
e986848faf Removed bot member variable from CPlayer; instead, everything now calls the inline IsBot() function.
Hopefully that will fix the "bot bug"
2004-12-22 13:01:55 +00:00
21ceae3c9e Replaced in files: /amxx/ with /amxmodx/
This fixes lines looking like
; File location: $moddir/addons/amxx/configs/cmds.ini

to look like

; File location: $moddir/addons/amxmodx/configs/cmds.ini

.
2004-12-22 10:27:30 +00:00
51b9fae4bc fixed strbreak 2004-12-10 23:37:43 +00:00
4e7d24f64b Fix for unban by PiTaGoRaS 2004-12-10 07:51:07 +00:00
40640c92d4 *** empty log message *** 2004-12-09 18:25:46 +00:00
c5b3919122 fixed custom weapons system 2004-12-08 23:40:42 +00:00
29a22bb5fd more changes in Damage MSG 2004-12-03 00:57:16 +00:00
2baf9c4c20 damage message changes 2004-12-02 02:11:09 +00:00
c4727c1dc3 fixed grenade problems ( returning wrong (older) owner ) 2004-11-30 15:46:09 +00:00
4901dee86d corrected fakemeta misspelling 2004-11-24 15:12:35 +00:00
c1f2a499f8 fixed compiling error (by FireStorm) 2004-11-20 21:34:22 +00:00
7aa31c764d Fixed some mistakes and typos. 2004-11-17 07:33:29 +00:00
08fea0eea1 Removed some unneeded stuff from class. 2004-11-15 00:20:28 +00:00
add716276b Synced language files (added Dutch, thanks Devilion) 2004-11-14 14:23:15 +00:00
e688addd98 Added new natives 2004-11-14 14:21:20 +00:00
199131b2b8 Added PM OnoTo's XS library include 2004-11-14 14:17:32 +00:00
fb29cbff16 Added some description for require_module etc 2004-11-13 19:55:11 +00:00
11fa330f10 Renamed to CStrike :-D gyar!! 2004-11-13 19:49:25 +00:00
ca720c8c83 XS Library 2004-11-13 10:20:12 +00:00
456d7b69a2 fixed returning float parameters in read_data():s second parameter (by ref) 2004-11-13 08:56:11 +00:00
a86cb11fd7 Umm... 2004-11-13 08:47:12 +00:00
96c65dcfc4 corrected OriginalFilename 2004-11-12 22:04:12 +00:00
86451da9a9 yes 2004-11-11 12:22:23 +00:00
57607f1a28 *** empty log message *** 2004-11-11 11:49:38 +00:00
eb4fdf53fa added fakemeta_stocks 2004-11-11 11:14:01 +00:00
6251521102 *** empty log message *** 2004-11-11 11:07:37 +00:00
c940a0b621 Umm... 2004-11-11 10:57:50 +00:00
719af5c72c *** empty log message *** 2004-11-11 10:55:22 +00:00
128d19c69e added pgsql for windows 2004-11-11 10:46:10 +00:00
46861ff5b4 Added dllfuncs 2004-11-11 10:39:37 +00:00
ee464539de Fixed authors and version numbers 2004-11-11 09:08:12 +00:00
f69ff642df *** empty log message *** 2004-11-11 09:06:50 +00:00
db77c245e6 Fixed copyrights and version numbers 2004-11-11 08:58:54 +00:00
d5caf3e2ac renamed 2004-11-11 07:43:31 +00:00
148b365e43 version/author fix 2004-11-11 07:40:21 +00:00
8c215e5d6f removed 2004-11-10 05:41:18 +00:00
0513dae63e Added better credits ^^ 2004-11-10 05:38:23 +00:00
f73a8356f6 do not touch my modules ! ;P 2004-11-10 00:45:21 +00:00
77c5198009 fixed modules problems when declared also in metamod's plugins.ini 2004-11-10 00:25:53 +00:00
820fedca22 First version 2004-11-09 20:30:17 +00:00
28a1182cd2 Updated EngFunc_SetKeyValue :-) 2004-11-09 16:47:33 +00:00
16444a713a Updated EngFunc_SetKeyValue 2004-11-09 16:47:06 +00:00
6457fc45c7 On dedicated servers, the command "amxx" now prints the AMX Mod X version 2004-11-08 19:51:20 +00:00
cb94cccf22 Added Dutch language 2004-11-08 12:35:52 +00:00
c0ee97b437 changed default formula 2004-11-08 12:17:40 +00:00
f950d384b6 Fixed crash in FM_MessageBegin 2004-11-07 20:36:49 +00:00
426a71e7f2 fixed bug reported by JC_Denton when SQL times out 2004-11-07 17:47:36 +00:00
d49b2453bb little error checking 2004-11-07 17:24:55 +00:00
74a1db4417 Upped buffer in write_file (1024->2048) 2004-11-06 21:56:24 +00:00
dc7e1e2494 updated to November 2004-11-06 13:13:02 +00:00
5dfbcf2a23 Minor fixes to stop crashing in Zombie Panic
(Don't send SVC_INTERMISSION if running zp)
2004-11-06 00:24:55 +00:00
09c1471c3a normal (not SP) forwards now report runtime errors properly 2004-11-04 21:55:14 +00:00
50a882cf4c message_begin now reports an error instead of letting th server abort when the id is invalid 2004-11-04 21:54:46 +00:00
850557df5a Updated get_user_hitzones 2004-11-02 16:51:42 +00:00
4c43eccbb5 *** empty log message *** 2004-11-01 17:15:53 +00:00
380db7c884 *** empty log message *** 2004-11-01 17:15:13 +00:00
1994917044 this may have caused problem 2004-11-01 09:18:46 +00:00
449f31d78c *** empty log message *** 2004-10-31 02:14:53 +00:00
bc2386fe47 Fixed typo in RadiusDamage (reported by apophis) 2004-10-30 13:40:23 +00:00
ec02883f6e Added stocks:
find_plugin_byfile
find_plugin_bydesc
2004-10-30 13:27:22 +00:00
abd372447a Added AMD64 2004-10-30 09:57:55 +00:00
fef70c0386 fix 2004-10-30 09:48:29 +00:00
719b32d71f Changed to memalign, stupid debian is obsolete 2004-10-30 09:42:54 +00:00
4e385fec50 Added server_exec() to make plugin_cfg a bit better 2004-10-29 21:05:40 +00:00
c9b2f2f060 took out this 2004-10-29 20:40:06 +00:00
d038e926fd *** empty log message *** 2004-10-29 20:35:44 +00:00
712859eb20 Fixed JIT crashing on some kernel configs (like FC2 >= 2.6.6) 2004-10-29 20:35:23 +00:00
826893d8d2 Fixed JIT crashing on some kernel config options (like FC2 >= 2.6.6) 2004-10-29 20:34:58 +00:00
47d1881c29 Added declarations for:
callfunc_begin_i
get_func_id
2004-10-29 19:54:56 +00:00
741666b742 Added two natives:
-callfunc_begin_i
 -get_function_id
2004-10-29 19:50:38 +00:00
ee8e30417c Confirmed all offsets for all platforms. (fixed backpack ammo offsets for players which was off, and also fixed offsets for 32 bit linux concerning weapons and the cs_?et_weapon_* natives should now work) 2004-10-29 14:44:48 +00:00
cc4bbadfa2 Added special cases for %% and % at end of phrase for formatting of phrases defined in language definition files. 2004-10-29 13:11:12 +00:00
8761791473 language file sync 2004-10-29 04:40:21 +00:00
6697b7b1d3 new amxxsc compiles 2004-10-29 04:29:02 +00:00
3c9a47aae3 New compilation of libsc251 2004-10-29 04:22:45 +00:00
d1675c82b5 fixed a language format error 2004-10-29 02:17:58 +00:00
b40643950d added some runtime checks 2004-10-29 02:15:01 +00:00
ff5b1dd7cc Changed error output format 2004-10-29 01:49:00 +00:00
3587483fa6 LogError() now can log native function names. 2004-10-29 00:21:44 +00:00
c9c26b869c added more checks 2004-10-28 20:48:00 +00:00
8f18856e91 Fixed SetView (by always hooking Spawn and precaching the needed dummy model rpgrocket.mdl) 2004-10-27 19:06:43 +00:00
ddfba00791 Fixed 2004-10-25 23:08:06 +00:00
c6eaa97391 oops :( 2004-10-25 23:01:28 +00:00
5eb095b514 Added native get_user_msgname(msgid, name[], len); 2004-10-25 23:00:16 +00:00
4e0bfe161e fixing SAWCE'S error 2004-10-25 17:06:24 +00:00
0e681d9bd4 replaced get_weaponname with xmod_get_wpnname 2004-10-25 11:16:02 +00:00
3d1162ecd9 client_ forwards will now work with kill command 2004-10-25 11:05:59 +00:00
3414cd7ce7 fixed pev bug.. 2004-10-24 21:03:12 +00:00
66386cca59 Fixed entity_set_byte 2004-10-24 15:41:25 +00:00
75396c753c Fixed sounds playing while connecting 2004-10-24 01:32:59 +00:00
4edd77faee Crash bug fix from Damaged Soul 2004-10-24 01:11:41 +00:00
91db6c7398 More pointless fixes from karlos 2004-10-24 01:09:07 +00:00
46390b83ac minor fix.. 2004-10-20 15:55:59 +00:00
89eda75b1f Touch it and die, bail. 2004-10-20 14:24:54 +00:00
f14808e009 Updated SDK
Fixed client_built forward...
2004-10-20 14:24:03 +00:00
b569ea3c3f Fixed bug where message_begin could not send MSG_PAS_R and MSG_PVS_R (reliable versions) messages. Reported by Damaged Soul 2004-10-20 14:16:46 +00:00
f595be47dc Fixed errors reportde by karlos 2004-10-18 21:00:25 +00:00
ee3404fea0 removed "is_alive" check from ResetHUD function 2004-10-16 22:22:54 +00:00
61fc7da654 fixed last hit bug and problems with c4 damage 2004-10-16 17:03:53 +00:00
14c3930b3d Damnit, bail 2004-10-16 14:26:11 +00:00
3efa25a5fb Fixed entity_set_edict 2004-10-14 08:15:41 +00:00
c29a7d34e5 Renamed cs_get_weapon_type -> cs_get_weapon_id 2004-10-14 06:09:01 +00:00
daa873d8ed Damaged Soul's map cycle file fix 2004-10-12 21:34:57 +00:00
c09de969eb Sawces icons 2004-10-12 21:23:38 +00:00
b0dd18580c fixed native prepend 2004-10-11 17:20:19 +00:00
32deaa261f fixed weapon name bug in player status 2004-10-09 21:06:11 +00:00
3a8e103faf Added custommenuitems.cfg to standard cfg files.
menufront.sma executes this file on plugin loa, adding the specified menu items to amxmodmenu.
2004-10-09 10:13:16 +00:00
f4b1c9f78a Added server command "amx_addmenuitem <menu text> <menu command> <access flags> <plugin name>":
Server admins can add menu items to amxmodmenu from plugins that do not (yet) do this on their own.
2004-10-09 09:50:33 +00:00
618759f390 Menu items boundary checking... 2004-10-09 09:32:56 +00:00
ced5d6ff57 added lang_phrase 2004-10-08 19:45:38 +00:00
db4041114f Fixed a bug in amx_client_languages
Added lang_phrase
2004-10-08 19:26:26 +00:00
b52d77e8bf Fixed big bug in executeForwards where float parameters were skipped and the stack might be messed up
(thanks to BAILOPAN)
2004-10-08 19:18:41 +00:00
940b0be4b9 Don't ask 2 2004-10-08 08:59:04 +00:00
75f49e78b0 Don't ask 2004-10-08 08:53:27 +00:00
f06359e38f Reworked to add AddMenuItem() 2004-10-08 08:37:27 +00:00
2733adbb49 Added AddMenuItem 2004-10-08 08:36:54 +00:00
fc4d8f183b const parameter in callfunc_push_str 2004-10-08 08:29:53 +00:00
ea70c77dd8 enabled emitsound_post function (knife shot fix, Damaged Soul ) 2004-10-07 08:58:01 +00:00
301a69aacb Synced translation files 2004-10-07 08:31:48 +00:00
92eda7c214 *** empty log message *** 2004-10-06 18:43:26 +00:00
4800ab292c Added stupid forwards 2004-10-06 17:57:57 +00:00
34cfce33a1 fixed /stats menu bug ( Damaged Soul ) and added selfkill check in miscstats 2004-10-06 15:47:04 +00:00
fec17424fb updated to October 2004-10-05 20:16:50 +00:00
264dd7a10d Fixed error outputs for CLang 2004-10-05 19:29:35 +00:00
6cef4eab4f *** empty log message *** 2004-10-05 19:02:15 +00:00
f4ada32ec2 Changed module comments (Damaged Soul) 2004-10-05 18:59:23 +00:00
bff8c3cdcf updated to csx 2004-10-05 16:20:03 +00:00
3b670333de Fixed result always refused even if admin accepted vote result. 2004-10-05 11:16:27 +00:00
eb36757ef1 Fixed menu not displaying on/off status for scout, mp5, ak47. 2004-10-05 10:01:04 +00:00
054b1f8868 *** empty log message *** 2004-10-05 09:22:14 +00:00
23234fad0b Added regex module 2004-10-05 08:53:51 +00:00
74dca8b6ef Fixed some bugs 2004-10-05 08:51:57 +00:00
2a187988f6 fixed project 2004-10-05 08:35:05 +00:00
d1ee9ee9ba *** empty log message *** 2004-10-05 08:33:31 +00:00
380f560fa4 Finalized (not tested!) 2004-10-05 08:32:23 +00:00
d9b6fa1f93 Initial import of regex stuff 2004-10-05 08:31:42 +00:00
8a57648b87 AMD64 support 2004-10-05 08:13:55 +00:00
80b8591295 Fixed a few bugs, added makefile 2004-10-05 08:04:13 +00:00
f94aa52974 Switched includes (bigballer) 2004-10-05 07:41:14 +00:00
ef8ad4a894 *** empty log message *** 2004-10-05 07:18:09 +00:00
41b6f6bd4a Initial import (untested!) 2004-10-05 07:17:49 +00:00
9e8f380121 changed is_valid_ent 2004-10-05 00:45:15 +00:00
39070081d1 fixed empty log message on debug trace 2004-10-04 22:56:36 +00:00
00d8ffe503 Fixed a debug trace output 2004-10-04 20:36:21 +00:00
4ef8530bba removed 2004-10-04 20:34:43 +00:00
77aa0f4f8e Fixed bad error checking routine 2004-10-04 20:32:26 +00:00
766246648d Fixed runtime error bugs 2004-10-04 20:10:27 +00:00
7963eb1cde added ms.net projs 2004-10-04 12:39:03 +00:00
02d8b2c523 Added makefile 2004-10-04 08:15:06 +00:00
227fb0411e Moved to other dirs 2004-10-04 08:11:28 +00:00
027ae6dc7e *** empty log message *** 2004-10-04 08:09:52 +00:00
334905e16e new configuration files for CSX 2004-10-04 08:08:18 +00:00
e3fad723b8 New CSX 2004-10-04 08:04:50 +00:00
5e52c45968 New SDK + debugging engine 2004-10-04 08:00:32 +00:00
e3a2a2bc17 Merged CSX versions 2004-10-04 07:30:39 +00:00
18b75cb07c Updated a bunch of SDKs and moved the rest to the new debugging system. 2004-10-04 06:14:30 +00:00
4e1c5a3e02 *** empty log message *** 2004-10-04 05:51:48 +00:00
5db290890f Fixed debugging stuff 2004-10-04 05:51:27 +00:00
b9c83aa4a2 Reworked SDK LogError() to include module names
improved debugging output
2004-10-04 05:50:28 +00:00
bb12f71137 made worldspawn a valid ent 2004-10-03 23:21:54 +00:00
0a3911231b made worldspawn a valid ent 2004-10-03 22:49:29 +00:00
846ef95c58 Added debugging engine 2004-10-03 22:33:55 +00:00
601bb30b7e Added debugging engine 2004-10-03 21:54:27 +00:00
9728b79c33 Fixed configuration error 2004-10-03 21:44:48 +00:00
90baf98057 Added debugging engine 2004-10-03 21:43:03 +00:00
8ad6437dd8 Added debugging engine 2004-10-03 21:33:09 +00:00
02bf904467 Added debugging support 2004-10-03 21:10:10 +00:00
62e4bbcfe9 Added new debug mode to fun module, also cleaned up error checking code 2004-10-03 20:19:47 +00:00
fc15ac1f41 Added debugging engine 2004-10-03 20:00:23 +00:00
01770f0e5b Fixed possible problem where a file handle could stay open on memory allocation failure 2004-10-03 17:04:29 +00:00
87ff81a499 Added important comment 2004-10-03 17:03:14 +00:00
981f41aee0 Fixed problem where file handles could possible stay open 2004-10-03 16:55:12 +00:00
605ca152c2 Fixed 2 possible crashbugs 2004-10-03 16:49:09 +00:00
0fc8f0b489 fixed bug in create pwup function 2004-10-03 11:07:49 +00:00
c511d80da7 Added delay to map changes 2004-10-03 07:33:49 +00:00
8304fc143c Increased a format buffer 2004-10-03 07:19:35 +00:00
f3cfd31668 Added AlertMessage to fakemeta 2004-10-03 07:04:08 +00:00
ef90960121 Fixed ADMIN_ALL bug 2004-10-03 06:23:25 +00:00
3700b8b39f Fixed bomb count bug 2004-10-03 06:08:09 +00:00
b83f2f5257 - Fixed bug where metamod was reporting "Could not find memloc for cvar xx" when modules registered cvars (fix by ghost_of_evilspy) 2004-10-02 08:18:54 +00:00
06f61cf92a Added more debugging info to case where CForwardMngr::m_PreparedArrays is >= (max params num) 2004-10-02 08:11:33 +00:00
5a5ff6d8ea Fixed parameter type in FN_PvAllocEntPrivateData (from long to int32) 2004-10-01 08:52:25 +00:00
bbe2626fd1 :gyar: a couple minor improvements :attack:
Global pointer for function tables
Better support for compiling under Cygwin gcc

:avast:
2004-09-30 06:18:23 +00:00
d5646ae238 update .. 2004-09-29 17:43:25 +00:00
df43d897df Fioxed call_think:
if (!is_ent_valid(iEnt)) {
		EngineError(amx, "Invalid Entity %d", iEnt);
		return 0;
	}

was

	if (is_ent_valid(iEnt)) {
		EngineError(amx, "Invalid Entity %d", iEnt);
		return 0;
	}
2004-09-29 06:17:44 +00:00
687a0f23da Added MSG_ONE_UNRELIABLE 2004-09-28 17:29:22 +00:00
aa0dc4dbaf Fixed a few issues (Damaged Soul) 2004-09-28 07:29:48 +00:00
de399c54c6 Fixed ML_NOTFOUND(LANG) 2004-09-28 07:18:51 +00:00
58d522e4c3 Fixed typo 2004-09-28 04:59:21 +00:00
3b90cca5bd Fixed user_slap for NS 2004-09-28 02:44:26 +00:00
b7c9cfeea4 Changed touch paramters on give item 2004-09-27 21:52:41 +00:00
4fcad51d25 updated to use amx_show_activity in hud messages 2004-09-27 17:43:40 +00:00
c2a2fc7dbe Added forward parameters overrun check in prepareArray 2004-09-27 14:33:50 +00:00
3f0d3c257a Increased maximal number of forward parameters 2004-09-27 14:33:20 +00:00
ecc07d4b45 Fixed some small mistakes. 2004-09-27 13:45:13 +00:00
8da965552b TK offset for AMD64 added. 2004-09-27 13:28:51 +00:00
cfe36dea52 Added 2 of 3 new offsets for amd64 2004-09-27 10:54:41 +00:00
c16eab09ec Fixed a typo 2004-09-27 09:53:56 +00:00
d07cc0424d Fixed a typo 2004-09-27 06:09:59 +00:00
c669efd609 New stuff in cstrike module:
cs_get_user_driving()
cs_set_user_tked()
cs_get_user_tked

Also cs_?et_user_deaths() offset updated.

Thanks to Damaged Soul for these.
2004-09-26 13:02:22 +00:00
c3151b312a Fixed (and slightly tweaked) make_deathmsg (jtp10181) 2004-09-26 00:43:43 +00:00
3fc3ece5b0 Added cs_get_weapon_type(index) 2004-09-25 23:24:34 +00:00
6887dfef16 CS: buyzone offset update to 235 2004-09-24 21:13:07 +00:00
867e7615ae stupid bug go squish 2004-09-24 19:36:24 +00:00
5157be6e3d Updated offset for VIP: to 209 2004-09-24 05:21:39 +00:00
82ca25b231 wow... =/ 2004-09-23 21:00:43 +00:00
a555f9b3f0 Fixed message blocks (jtp10181) 2004-09-23 20:59:26 +00:00
c1a6ce2565 Fixed typo (ktrain) 2004-09-22 23:27:55 +00:00
8874666109 removed extraneous functions (jtp10181) 2004-09-21 23:33:29 +00:00
5233be593f added dod_set_user_kills 2004-09-21 21:25:30 +00:00
0f38a24555 added dod classes 2004-09-21 20:51:29 +00:00
8d06f80eeb fixed some bugs in weapon stats functions 2004-09-21 18:04:22 +00:00
0983698d2e fixed motd 2004-09-21 17:48:48 +00:00
dde43b6e0d Fixed CVARs not registering properly (hullu) 2004-09-21 15:49:36 +00:00
4382158b88 *** empty log message *** 2004-09-21 15:45:08 +00:00
ba69d73785 Fixed alphanumeric bug (theprog) 2004-09-21 05:20:18 +00:00
be3d078d5a added is_amd64_server 2004-09-21 02:40:30 +00:00
b8ca4586ad fix from fsfod 2004-09-20 22:17:14 +00:00
25750d2f05 Changes incorporated into base package 2004-09-20 17:58:48 +00:00
423a467a70 Added new maps in beta5 2004-09-20 10:23:47 +00:00
d6e18a3e97 Better comments for unstuck 2004-09-20 09:57:48 +00:00
a6d5d89209 Commented out unstuck plugin 2004-09-20 09:56:05 +00:00
16b35006bd Removed "id" from amx_ban for new format. 2004-09-20 09:36:28 +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
1150 changed files with 438144 additions and 24231 deletions

View File

@ -29,16 +29,16 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "CCmd.h" #include "CCmd.h"
// ***************************************************** // *****************************************************
// class CmdMngr // class CmdMngr
// ***************************************************** // *****************************************************
CmdMngr::CmdMngr() {
memset(sortedlists,0,sizeof(sortedlists)); CmdMngr::CmdMngr()
{
memset(sortedlists, 0, sizeof(sortedlists));
srvcmdlist = 0; srvcmdlist = 0;
clcmdlist = 0; clcmdlist = 0;
prefixHead = 0; prefixHead = 0;
@ -51,15 +51,14 @@ CmdMngr::CmdMngr() {
} }
CmdMngr::Command::Command( CPluginMngr::CPlugin* pplugin,const char* pcmd, CmdMngr::Command::Command(CPluginMngr::CPlugin* pplugin, const char* pcmd, const char* pinfo, int pflags,
const char* pinfo , int pflags , int pfunc, int pfunc, bool pviewable, CmdMngr* pparent) : commandline(pcmd), info(pinfo)
bool pviewable, CmdMngr* pparent ) : commandline(pcmd) , info(pinfo) { {
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;
@ -75,75 +74,68 @@ CmdMngr::Command::~Command()
++uniqueid; ++uniqueid;
} }
CmdMngr::Command* CmdMngr::registerCommand( CPluginMngr::CPlugin* plugin , int func , char* cmd , char* info , int level , bool listable ) CmdMngr::Command* CmdMngr::registerCommand(CPluginMngr::CPlugin* plugin, int func, char* cmd, char* info, int level, bool listable)
{ {
Command* b = new Command( plugin , cmd , info , level , func , listable, this ); Command* b = new Command(plugin, cmd, info, level, func, listable, this);
if ( b == 0 ) return 0; if (b == 0) return 0;
setCmdLink( &sortedlists[0] , b ); setCmdLink(&sortedlists[0], b);
return b; return b;
} }
CmdMngr::Command* CmdMngr::getCmd( long int id ,int type, int access ) CmdMngr::Command* CmdMngr::getCmd(long int id, int type, int access)
{ {
//if ( id >= 1024 || id < 0 ) return (Command*)id; //if (id >= 1024 || id < 0) return (Command*)id;
if ( id < 0 ){ if (id < 0)
for (CmdMngr::iterator a = begin( type ); a ; ++a){ {
if ( (*a).id == id ) for (CmdMngr::iterator a = begin(type); a ; ++a)
{
if ((*a).id == id)
return &(*a); return &(*a);
} }
return 0; return 0;
} }
if ( (id < buf_cmdid) || (access != buf_cmdaccess) || (type != buf_cmdtype) ) if ((id < buf_cmdid) || (access != buf_cmdaccess) || (type != buf_cmdtype))
{ {
buf_cmdptr = begin( type ); buf_cmdptr = begin(type);
buf_cmdaccess = access; buf_cmdaccess = access;
buf_cmdtype = type; buf_cmdtype = type;
buf_cmdid = id; buf_cmdid = id;
} } else {
else
{
int a = id; int a = id;
id -= buf_cmdid; id -= buf_cmdid;
buf_cmdid = a; buf_cmdid = a;
} }
while ( buf_cmdptr ) while (buf_cmdptr)
{ {
if ((*buf_cmdptr).gotAccess(access) && (*buf_cmdptr).getPlugin()->isExecutable((*buf_cmdptr).getFunction()) && (*buf_cmdptr).isViewable())
if ( (*buf_cmdptr).gotAccess( access ) &&
(*buf_cmdptr).getPlugin()->isExecutable( (*buf_cmdptr).getFunction() )
&& (*buf_cmdptr).isViewable() )
{ {
if (id-- == 0)
if ( id-- == 0 )
return &(*buf_cmdptr); return &(*buf_cmdptr);
} }
++buf_cmdptr; ++buf_cmdptr;
} }
return 0; return 0;
} }
int CmdMngr::getCmdNum( int type, int access ) int CmdMngr::getCmdNum(int type, int access)
{ {
if ( (access == buf_access) && (type == buf_type) ) if ((access == buf_access) && (type == buf_type))
return buf_num; // once calculated don't have to be done again return buf_num; // once calculated don't have to be done again
buf_access = access; buf_access = access;
buf_type = type; buf_type = type;
buf_num = 0; buf_num = 0;
CmdMngr::iterator a = begin( type ); CmdMngr::iterator a = begin(type);
while ( a ) while (a)
{ {
if ((*a).gotAccess(access) && (*a).getPlugin()->isExecutable((*a).getFunction()) && (*a).isViewable())
if ( (*a).gotAccess( access ) &&
(*a).getPlugin()->isExecutable( (*a).getFunction() )
&& (*a).isViewable() )
++buf_num; ++buf_num;
++a; ++a;
} }
@ -151,19 +143,19 @@ int CmdMngr::getCmdNum( int type, int access )
return buf_num; return buf_num;
} }
void CmdMngr::setCmdLink( CmdLink** a , Command* c, bool sorted ) void CmdMngr::setCmdLink(CmdLink** a, Command* c, bool sorted)
{ {
CmdLink* np = new CmdLink( c ); CmdLink* np = new CmdLink(c);
if ( np == 0 ) return; if (np == 0) return;
if ( sorted ) if (sorted)
{ {
while( *a ) while (*a)
{ {
int i = strcmp(c->getCommand(),(*a)->cmd->getCommand() ); int i = strcmp(c->getCommand(), (*a)->cmd->getCommand());
if ( (i<0) || (i==0) && ( strcmp( c->getArgument() , (*a)->cmd->getArgument() ) < 0 ) ) if ((i < 0) || (i == 0) && (strcmp(c->getArgument(), (*a)->cmd->getArgument()) < 0))
break; break;
a = &(*a)->next; a = &(*a)->next;
@ -171,84 +163,101 @@ void CmdMngr::setCmdLink( CmdLink** a , Command* c, bool sorted )
np->next = *a; np->next = *a;
*a = np; *a = np;
} } else {
else while (*a) a = &(*a)->next;
{
while ( *a ) a = &(*a)->next;
*a = np; *a = np;
} }
} }
void CmdMngr::clearCmdLink( CmdLink** phead, bool pclear ) void CmdMngr::clearCmdLink(CmdLink** phead, bool pclear)
{ {
while( *phead ){ while (*phead)
{
CmdLink* pp = (*phead)->next; CmdLink* pp = (*phead)->next;
if ( pclear ) delete (*phead)->cmd;
if (pclear) delete (*phead)->cmd;
delete *phead; delete *phead;
*phead = pp; *phead = pp;
} }
} }
void CmdMngr::Command::setCmdType( int a ) void CmdMngr::Command::setCmdType(int a)
{ {
switch(a){ switch (a)
{
case CMD_ConsoleCommand: cmdtype |= 3; break; case CMD_ConsoleCommand: cmdtype |= 3; break;
case CMD_ClientCommand: cmdtype |= 1; break; case CMD_ClientCommand: cmdtype |= 1; break;
case CMD_ServerCommand: cmdtype |= 2; break; case CMD_ServerCommand: cmdtype |= 2; break;
} }
if ( cmdtype & 1 ) { // ClientCommand
parent->setCmdLink( &parent->sortedlists[1] , this ); if (cmdtype & 1) // ClientCommand
if ( !parent->registerCmdPrefix( this ) ) {
parent->setCmdLink( &parent->clcmdlist , this , false ); parent->setCmdLink(&parent->sortedlists[1], this);
if (!parent->registerCmdPrefix(this))
parent->setCmdLink(&parent->clcmdlist, this, false);
} }
if ( cmdtype & 2 ) { // ServerCommand
parent->setCmdLink( &parent->sortedlists[2] , this ); if (cmdtype & 2) // ServerCommand
parent->setCmdLink( &parent->srvcmdlist , this , false ); {
parent->setCmdLink(&parent->sortedlists[2], this);
parent->setCmdLink(&parent->srvcmdlist, this, false);
} }
} }
const char* CmdMngr::Command::getCmdType() const { const char* CmdMngr::Command::getCmdType() const
switch( cmdtype ){ {
case 1: return"client"; switch (cmdtype)
{
case 1: return "client";
case 2: return "server"; case 2: return "server";
case 3: return "console"; case 3: return "console";
} }
return "unknown"; return "unknown";
} }
bool CmdMngr::registerCmdPrefix( Command* cc ) bool CmdMngr::registerCmdPrefix(Command* cc)
{ {
CmdPrefix** b = findPrefix( cc->getCommand() ); CmdPrefix** b = findPrefix(cc->getCommand());
if (*b){
setCmdLink( &(*b)->list , cc , false ); if (*b)
{
setCmdLink(&(*b)->list, cc, false);
cc->prefix = (*b)->name.size(); cc->prefix = (*b)->name.size();
return true; return true;
} }
return false; return false;
} }
void CmdMngr::registerPrefix( const char* nn ) void CmdMngr::registerPrefix(const char* nn)
{ {
if ( *nn == 0 ) return; if (*nn == 0) return;
CmdPrefix** b = findPrefix( nn ); CmdPrefix** b = findPrefix(nn);
if (*b) return; if (*b) return;
*b = new CmdPrefix( nn , this ); *b = new CmdPrefix(nn, this);
} }
CmdMngr::CmdPrefix** CmdMngr::findPrefix( const char* nn ){ CmdMngr::CmdPrefix** CmdMngr::findPrefix(const char* nn)
{
CmdPrefix** aa = &prefixHead; CmdPrefix** aa = &prefixHead;
while(*aa){
if ( !strncmp( (*aa)->name.str(), nn, (*aa)->name.size() ) ) while (*aa)
{
if (!strncmp((*aa)->name.c_str(), nn, (*aa)->name.size()))
break; break;
aa=&(*aa)->next; aa = &(*aa)->next;
} }
return aa; return aa;
} }
void CmdMngr::clearPrefix(){ void CmdMngr::clearPrefix()
while(prefixHead){ {
while (prefixHead)
{
CmdPrefix* a = prefixHead->next; CmdPrefix* a = prefixHead->next;
delete prefixHead; delete prefixHead;
prefixHead = a; prefixHead = a;
@ -266,7 +275,8 @@ void CmdMngr::clear()
clearBufforedInfo(); clearBufforedInfo();
} }
void CmdMngr::clearBufforedInfo() { void CmdMngr::clearBufforedInfo()
{
buf_type = -1; buf_type = -1;
buf_access = 0; buf_access = 0;
buf_id = -1; buf_id = -1;

View File

@ -36,7 +36,8 @@
// class CmdMngr // class CmdMngr
// ***************************************************** // *****************************************************
enum { enum
{
CMD_ConsoleCommand, CMD_ConsoleCommand,
CMD_ClientCommand, CMD_ClientCommand,
CMD_ServerCommand CMD_ServerCommand
@ -48,14 +49,17 @@ public:
class Command; class Command;
friend class Command; friend class Command;
class Command { class Command
{
friend class CmdMngr; friend class CmdMngr;
CPluginMngr::CPlugin* plugin; CPluginMngr::CPlugin* plugin;
CmdMngr* parent; CmdMngr* parent;
String command; String command;
String argument; String argument;
String commandline; String commandline;
String info; String info;
bool listable; bool listable;
int function; int function;
int flags; int flags;
@ -63,33 +67,33 @@ public:
int cmdtype; int cmdtype;
int prefix; int prefix;
static int uniqueid; static int uniqueid;
Command( CPluginMngr::CPlugin* pplugin,const char* pcmd, const char* pinfo , int pflags , int pfunc, bool pviewable, CmdMngr* pparent );
Command(CPluginMngr::CPlugin* pplugin, const char* pcmd, const char* pinfo, int pflags, int pfunc, bool pviewable, CmdMngr* pparent);
~Command(); ~Command();
public: public:
inline const char* getCommand() { return command.c_str(); }
inline const char* getCommand() const{ return command.str(); } inline const char* getArgument() { return argument.c_str(); }
inline const char* getArgument() const{ return argument.str(); } inline const char* getCmdInfo() { return info.c_str(); }
inline const char* getCmdInfo() const{ return info.str(); } inline const char* getCmdLine() { return commandline.c_str(); }
inline const char* getCmdLine() const{ return commandline.str(); } 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 matchCommandLine(const char* cmd, const char* arg) { return (!stricmp(command.str()+prefix, cmd+prefix ) && (argument.empty() || !stricmp(argument.str() , arg ))); } inline bool matchCommand(const char* cmd) { return (!strcmp(command.c_str(), cmd)); }
inline bool matchCommand(const char* cmd) { return (!strcmp(command.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; }
inline bool isViewable() const { return listable; } inline bool isViewable() const { return listable; }
inline int getFlags() const { return flags; } inline int getFlags() const { return flags; }
inline long int getId() const { return (long int)id; } inline long int getId() const { return (long int)id; }
const char* getCmdType() const;
void setCmdType( int a );
const char* getCmdType() const;
void setCmdType(int a);
}; };
private: private:
struct CmdPrefix; struct CmdPrefix;
friend struct CmdPrefix; friend struct CmdPrefix;
struct CmdLink { struct CmdLink
{
Command* cmd; Command* cmd;
CmdLink* next; CmdLink* next;
CmdLink(Command* c): cmd(c), next(0) {} CmdLink(Command* c): cmd(c), next(0) {}
@ -99,36 +103,40 @@ private:
CmdLink* srvcmdlist; CmdLink* srvcmdlist;
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) {}
~CmdPrefix(){ parent->clearCmdLink(&list); } ~CmdPrefix() { parent->clearCmdLink(&list); }
} *prefixHead; } *prefixHead;
bool registerCmdPrefix( Command* cc ); bool registerCmdPrefix(Command* cc);
CmdPrefix** findPrefix( const char* nn ); CmdPrefix** findPrefix(const char* nn);
void clearPrefix(); void clearPrefix();
void setCmdLink( CmdLink** a , Command* c, bool sorted = true ); void setCmdLink(CmdLink** a, Command* c, bool sorted = true);
void clearCmdLink( CmdLink** phead, bool pclear = false ); void clearCmdLink(CmdLink** phead, bool pclear = false);
public: public:
CmdMngr(); CmdMngr();
~CmdMngr() {clear();} ~CmdMngr() { clear(); }
// Interface // Interface
void registerPrefix( const char* nn ); void registerPrefix(const char* nn);
Command* registerCommand( CPluginMngr::CPlugin* plugin , int func , char* cmd , char* info , int level , bool listable );
Command* getCmd( long int id ,int type, int access); Command* registerCommand(CPluginMngr::CPlugin* plugin, int func, char* cmd, char* info, int level, bool listable);
int getCmdNum( int type, int access ); Command* getCmd(long int id, int type, int access);
int getCmdNum(int type, int access);
void clearBufforedInfo(); void clearBufforedInfo();
void clear(); void clear();
class iterator { class iterator
{
CmdLink *a; CmdLink *a;
public: public:
iterator(CmdLink*aa = 0) : a(aa) {} iterator(CmdLink*aa = 0) : a(aa) {}
@ -138,28 +146,30 @@ public:
operator bool () const { return a ? true : false; } operator bool () const { return a ? true : false; }
Command& operator*() { return *a->cmd; } Command& operator*() { return *a->cmd; }
}; };
inline iterator clcmdprefixbegin(const char* nn){
inline iterator clcmdprefixbegin(const char* nn)
{
CmdPrefix* a = *findPrefix(nn); CmdPrefix* a = *findPrefix(nn);
return iterator( a ? a->list : 0 ); return iterator(a ? a->list : 0);
} }
inline iterator clcmdbegin() const {return iterator(clcmdlist);}
inline iterator srvcmdbegin() const {return iterator(srvcmdlist);} inline iterator clcmdbegin() const { return iterator(clcmdlist); }
inline iterator begin( int type ) const { return iterator(sortedlists[type]); } inline iterator srvcmdbegin() const { return iterator(srvcmdlist); }
inline iterator begin(int type) const { return iterator(sortedlists[type]); }
inline iterator end() const { return iterator(0); } inline iterator end() const { return iterator(0); }
private: private:
int buf_cmdid; int buf_cmdid;
int buf_cmdtype; int buf_cmdtype;
int buf_cmdaccess; int buf_cmdaccess;
iterator buf_cmdptr; iterator buf_cmdptr;
int buf_id; int buf_id;
int buf_type; int buf_type;
int buf_access; int buf_access;
int buf_num; int buf_num;
}; };
#endif #endif //COMMANDS_H

View File

@ -29,8 +29,6 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "CEvent.h" #include "CEvent.h"
@ -50,6 +48,7 @@ EventsMngr::ClEvent::ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags)
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
if (flags & 24) if (flags & 24)
{ {
m_FlagAlive = (flags & 16) ? true : false; // flag e m_FlagAlive = (flags & 16) ? true : false; // flag e
@ -66,12 +65,14 @@ EventsMngr::ClEvent::~ClEvent()
{ {
cond_t *tmp1 = m_Conditions; cond_t *tmp1 = m_Conditions;
cond_t *tmp2 = NULL; cond_t *tmp2 = NULL;
while (tmp1) while (tmp1)
{ {
tmp2 = tmp1->next; tmp2 = tmp1->next;
delete tmp1; delete tmp1;
tmp1 = tmp2; tmp1 = tmp2;
} }
m_Conditions = NULL; m_Conditions = NULL;
} }
@ -84,10 +85,17 @@ void EventsMngr::NextParam()
MsgDataEntry *tmp = NULL; MsgDataEntry *tmp = NULL;
int tmpSize = 0; int tmpSize = 0;
if (m_ParseVault) if (m_ParseVault)
{ {
// copy to tmp // copy to tmp
tmp = new MsgDataEntry[m_ParseVaultSize]; tmp = new MsgDataEntry[m_ParseVaultSize];
if (!tmp)
{
return; // :TODO: Error report !!
}
memcpy(tmp, m_ParseVault, m_ParseVaultSize * sizeof(MsgDataEntry)); memcpy(tmp, m_ParseVault, m_ParseVaultSize * sizeof(MsgDataEntry));
tmpSize = m_ParseVaultSize; tmpSize = m_ParseVaultSize;
delete [] m_ParseVault; delete [] m_ParseVault;
@ -100,6 +108,7 @@ void EventsMngr::NextParam()
m_ParseVaultSize = INITIAL_PARSEVAULT_SIZE; m_ParseVaultSize = INITIAL_PARSEVAULT_SIZE;
m_ParseVault = new MsgDataEntry[m_ParseVaultSize]; m_ParseVault = new MsgDataEntry[m_ParseVaultSize];
if (tmp) if (tmp)
{ {
memcpy(m_ParseVault, tmp, tmpSize * sizeof(MsgDataEntry)); memcpy(m_ParseVault, tmp, tmpSize * sizeof(MsgDataEntry));
@ -117,6 +126,7 @@ EventsMngr::EventsMngr()
{ {
m_ParseVault = NULL; m_ParseVault = NULL;
m_ParseVaultSize = 0; m_ParseVaultSize = 0;
m_CurrentMsgType = -1;
clearEvents(); clearEvents();
} }
@ -125,7 +135,6 @@ EventsMngr::~EventsMngr()
clearEvents(); clearEvents();
} }
CPluginMngr::CPlugin * EventsMngr::ClEvent::getPlugin() CPluginMngr::CPlugin * EventsMngr::ClEvent::getPlugin()
{ {
return m_Plugin; return m_Plugin;
@ -166,8 +175,8 @@ void EventsMngr::ClEvent::registerFilter(char *filter)
tmpCond->paramId = atoi(filter); tmpCond->paramId = atoi(filter);
// rest of line // rest of line
tmpCond->sValue.set(value); tmpCond->sValue.assign(value);
tmpCond->fValue = atof(value); tmpCond->fValue = static_cast<float>(atof(value));
tmpCond->iValue = atoi(value); tmpCond->iValue = atoi(value);
tmpCond->next = NULL; tmpCond->next = NULL;
@ -175,10 +184,11 @@ void EventsMngr::ClEvent::registerFilter(char *filter)
if (m_Conditions) if (m_Conditions)
{ {
cond_t *tmp = m_Conditions; cond_t *tmp = m_Conditions;
while (tmp->next) while (tmp->next)
tmp = tmp->next; tmp = tmp->next;
tmp->next = tmpCond;
tmp->next = tmpCond;
} }
else else
m_Conditions = tmpCond; m_Conditions = tmpCond;
@ -191,6 +201,7 @@ EventsMngr::ClEvent* EventsMngr::registerEvent(CPluginMngr::CPlugin* plugin, int
return NULL; return NULL;
ClEvent *event = new ClEvent(plugin, func, flags); ClEvent *event = new ClEvent(plugin, func, flags);
if (!event) if (!event)
return NULL; return NULL;
@ -204,6 +215,8 @@ 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;
@ -211,12 +224,11 @@ void EventsMngr::parserInit(int msg_type, float* timer, CPlayer* pPlayer, int in
if (!m_Events[msg_type].size()) if (!m_Events[msg_type].size())
return; return;
for(ClEventVecIter iter = m_Events[msg_type].begin(); iter; ++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;
@ -225,7 +237,7 @@ void EventsMngr::parserInit(int msg_type, float* timer, CPlayer* pPlayer, int in
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;
@ -242,6 +254,7 @@ void EventsMngr::parserInit(int msg_type, float* timer, CPlayer* pPlayer, int in
(*iter).m_Done = true; (*iter).m_Done = true;
continue; continue;
} }
m_ParseNotDone = true; m_ParseNotDone = true;
} }
@ -252,6 +265,7 @@ void EventsMngr::parserInit(int msg_type, float* timer, CPlayer* pPlayer, int in
m_ParseVault[0].type = MSG_INTEGER; m_ParseVault[0].type = MSG_INTEGER;
m_ParseVault[0].iValue = index; m_ParseVault[0].iValue = index;
} }
m_ParseFun = &m_Events[msg_type]; m_ParseFun = &m_Events[msg_type];
} }
@ -261,7 +275,6 @@ void EventsMngr::parseValue(int iValue)
if (!m_ParseNotDone || !m_ParseFun) if (!m_ParseNotDone || !m_ParseFun)
return; return;
// grow if needed // grow if needed
++m_ParsePos; ++m_ParsePos;
NextParam(); NextParam();
@ -279,23 +292,25 @@ void EventsMngr::parseValue(int iValue)
// loop through conditions // loop through conditions
bool execute = false; bool execute = false;
bool anyConditions = false; bool anyConditions = false;
for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next) for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next)
{ {
if (condIter->paramId == m_ParsePos) if (condIter->paramId == m_ParsePos)
{ {
anyConditions = true; anyConditions = true;
switch(condIter->type) switch (condIter->type)
{ {
case '=': if (condIter->iValue == iValue) execute=true; break; case '=': if (condIter->iValue == iValue) execute = true; break;
case '!': if (condIter->iValue != iValue) execute=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; 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 (execute) if (execute)
break; break;
} }
} }
if (anyConditions && !execute) if (anyConditions && !execute)
(*iter).m_Done = true; // don't execute (*iter).m_Done = true; // don't execute
} }
@ -307,7 +322,6 @@ void EventsMngr::parseValue(float fValue)
if (!m_ParseNotDone || !m_ParseFun) if (!m_ParseNotDone || !m_ParseFun)
return; return;
// grow if needed // grow if needed
++m_ParsePos; ++m_ParsePos;
NextParam(); NextParam();
@ -325,22 +339,25 @@ void EventsMngr::parseValue(float fValue)
// loop through conditions // loop through conditions
bool execute = false; bool execute = false;
bool anyConditions = false; bool anyConditions = false;
for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next) for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next)
{ {
if (condIter->paramId == m_ParsePos) if (condIter->paramId == m_ParsePos)
{ {
anyConditions = true; anyConditions = true;
switch(condIter->type) switch (condIter->type)
{ {
case '=': if (condIter->fValue == fValue) execute=true; break; case '=': if (condIter->fValue == fValue) execute = 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;
case '>': if (fValue > condIter->fValue) execute=true; break; case '>': if (fValue > condIter->fValue) execute = true; break;
} }
if (execute) if (execute)
break; break;
} }
} }
if (anyConditions && !execute) if (anyConditions && !execute)
(*iter).m_Done = true; // don't execute (*iter).m_Done = true; // don't execute
} }
@ -369,21 +386,24 @@ void EventsMngr::parseValue(const char *sz)
// loop through conditions // loop through conditions
bool execute = false; bool execute = false;
bool anyConditions = false; bool anyConditions = false;
for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next) for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next)
{ {
if (condIter->paramId == m_ParsePos) if (condIter->paramId == m_ParsePos)
{ {
anyConditions = true; anyConditions = true;
switch(condIter->type) switch (condIter->type)
{ {
case '=': if (!strcmp(sz, condIter->sValue.str())) execute=true; break; case '=': if (!strcmp(sz, condIter->sValue.c_str())) execute = true; break;
case '!': if (strcmp(sz, condIter->sValue.str())) execute=true; break; case '!': if (strcmp(sz, condIter->sValue.c_str())) execute = true; break;
case '&': if (strstr(sz, condIter->sValue.str())) execute=true; break; case '&': if (strstr(sz, condIter->sValue.c_str())) execute = true; break;
} }
if (execute) if (execute)
break; break;
} }
} }
if (anyConditions && !execute) if (anyConditions && !execute)
(*iter).m_Done = true; // don't execute (*iter).m_Done = true; // don't execute
} }
@ -391,76 +411,58 @@ void EventsMngr::parseValue(const char *sz)
void EventsMngr::executeEvents() void EventsMngr::executeEvents()
{ {
int err;
if (!m_ParseFun) if (!m_ParseFun)
{ {
return; return;
} }
#ifdef ENABLEEXEPTIONS
try
{
#endif // #ifdef ENABLEEXEPTIONS
for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++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 = (float)*m_Timer; (*iter).m_Stamp = (float)*m_Timer;
executeForwards((*iter).m_Func, static_cast<cell>(m_ParseVault ? m_ParseVault[0].iValue : 0));
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,
(*iter).m_Plugin->getAMX()->curline, (*iter).m_Plugin->getName());
}
} }
#ifdef ENABLEEXEPTIONS m_CurrentMsgType = -1;
}
catch( ... )
{
UTIL_Log( "[AMXX] fatal error at event execution");
}
#endif // #ifdef ENABLEEXEPTIONS
m_ParseFun = NULL; 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 "";
static char var[32]; static char var[32];
switch(m_ParseVault[a].type) switch (m_ParseVault[a].type)
{ {
case MSG_INTEGER: case MSG_INTEGER:
sprintf( var, "%d", m_ParseVault[a].iValue ); sprintf(var, "%d", m_ParseVault[a].iValue);
return var; return var;
case MSG_STRING: case MSG_STRING:
return m_ParseVault[a].sValue; return m_ParseVault[a].sValue;
default: default:
sprintf( var, "%g", m_ParseVault[a].fValue ); sprintf(var, "%g", m_ParseVault[a].fValue);
return var; return var;
} }
} }
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;
switch(m_ParseVault[a].type) switch (m_ParseVault[a].type)
{ {
case MSG_INTEGER: case MSG_INTEGER:
return m_ParseVault[a].iValue; return m_ParseVault[a].iValue;
@ -471,17 +473,17 @@ 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;
switch(m_ParseVault[a].type) switch (m_ParseVault[a].type)
{ {
case MSG_INTEGER: case MSG_INTEGER:
return m_ParseVault[a].iValue; return static_cast<float>(m_ParseVault[a].iValue);
case MSG_STRING: case MSG_STRING:
return atof(m_ParseVault[a].sValue); return static_cast<float>(atof(m_ParseVault[a].sValue));
default: default:
return m_ParseVault[a].fValue; return m_ParseVault[a].fValue;
} }
@ -493,6 +495,7 @@ void EventsMngr::clearEvents(void)
{ {
m_Events[i].clear(); m_Events[i].clear();
} }
// delete parsevault // delete parsevault
if (m_ParseVault) if (m_ParseVault)
{ {
@ -511,23 +514,29 @@ int EventsMngr::getEventId(const char* msg)
CS_EventsIds id; CS_EventsIds id;
} table[] = } table[] =
{ {
{ "CS_DeathMsg" , CS_DeathMsg }, {"CS_DeathMsg", CS_DeathMsg},
// { "CS_RoundEnd" , CS_RoundEnd }, // {"CS_RoundEnd", CS_RoundEnd},
// { "CS_RoundStart" , CS_RoundStart }, // {"CS_RoundStart", CS_RoundStart},
// { "CS_Restart" , CS_Restart }, // {"CS_Restart", CS_Restart},
{ "" , CS_Null } {"", CS_Null}
}; };
// if msg is a number, return it // if msg is a number, return it
int pos = atoi(msg); int pos = atoi(msg);
if (pos != 0) if (pos != 0)
return pos; return pos;
// try to find in table first // try to find in table first
for (pos = 0; table[ pos ].id != CS_Null; ++pos ) for (pos = 0; table[pos].id != CS_Null; ++pos)
if ( !strcmp( table[ pos ].name , msg ) ) if (!strcmp(table[pos].name, msg))
return table[ pos ].id; return table[pos].id;
// 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,9 +32,10 @@
#ifndef __CEVENTS_H__ #ifndef __CEVENTS_H__
#define __CEVENTS_H__ #define __CEVENTS_H__
#define MAX_AMX_REG_MSG MAX_REG_MSGS+16 #define MAX_AMX_REG_MSG MAX_REG_MSGS + 16
enum { enum
{
CS_DEATHMSG = MAX_REG_MSGS, CS_DEATHMSG = MAX_REG_MSGS,
// CS_ROUNDEND, // CS_ROUNDEND,
// CS_ROUNDSTART, // CS_ROUNDSTART,
@ -116,6 +117,7 @@ private:
const char* sValue; const char* sValue;
MsgParamType type; MsgParamType type;
}; };
MsgDataEntry *m_ParseVault; MsgDataEntry *m_ParseVault;
int m_ParseVaultSize; int m_ParseVaultSize;
void NextParam(); // make sure a new parameter can be added void NextParam(); // make sure a new parameter can be added
@ -130,8 +132,9 @@ private:
int m_ParsePos; // is args. num. - 1 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();
@ -139,17 +142,20 @@ public:
// Interface // Interface
ClEvent* registerEvent(CPluginMngr::CPlugin* plugin, int func, int flags, int msgid); ClEvent* registerEvent(CPluginMngr::CPlugin* plugin, int func, int flags, int msgid);
void parserInit(int msg_type, float* timer, CPlayer* pPlayer, int index); void parserInit(int msg_type, float* timer, CPlayer* pPlayer, int index);
void parseValue(int iValue); void parseValue(int iValue);
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); }
const char* getArgString(int a); int getArgNum() const; //{ return (parsePos + 1); }
int getArgInteger(int a); const char* getArgString(int a) const;
float getArgFloat(int a); int getArgInteger(int a) const;
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 //__CEVENTS_H__

View File

@ -29,76 +29,78 @@
* version. * version.
*/ */
#include "CFile.h"
#include <ctype.h> #include <ctype.h>
#include "amxmodx.h"
#include "CFile.h"
// ***************************************************** // *****************************************************
// class File // class File
// ***************************************************** // *****************************************************
File::File( const char* n, const char* m )
File::File(const char* n, const char* m)
{ {
fp = fopen( n , m ); fp = fopen(n, m);
} }
File::~File( ) File::~File()
{ {
if ( fp ) if (fp)
fclose( fp ); fclose(fp);
} }
File::operator bool ( ) const File::operator bool () const
{ {
return fp && !feof(fp); return fp && !feof(fp);
} }
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;
} }
File& operator<<( File& f, const char* n ) File& operator<<(File& f, const char* n)
{ {
if ( f ) fputs( n , f.fp ) ; if (f) fputs(n, f.fp);
return f; return f;
} }
File& operator<<( File& f, int n ) File& operator<<(File& f, int n)
{ {
if ( f ) fprintf( f.fp , "%d" , n ) ; if (f) fprintf(f.fp, "%d", n);
return f; return f;
} }
File& operator<<(File& f, const char& c)
File& operator<<( File& f, const char& c )
{ {
if ( f ) fputc( c , f.fp ) ; if (f) fputc(c, f.fp);
return f; return f;
} }
File& operator>>( File& f, String& n ) 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;
} }
File& operator>>( File& f, char* n ) File& operator>>(File& f, char* n)
{ {
if ( f ) fscanf( f.fp , "%s", n ); if (f) fscanf(f.fp, "%s", n);
return f; return f;
} }
int File::getline( char* buf, int sz ) int File::getline(char* buf, int sz)
{ {
int a = sz; int a = sz;
char *origBuf = buf; char *origBuf = buf;
if ( *this )
if (*this)
{ {
int c; int c;
while ( sz-- && (c = getc( (*this).fp)) && c != EOF && c != '\n' ) while (sz-- && (c = getc((*this).fp)) && c != EOF && c != '\n')
*buf++ = c; *buf++ = c;
*buf = 0; *buf = 0;
} }
@ -114,12 +116,11 @@ int File::getline( char* buf, int sz )
return a - sz; return a - sz;
} }
File& File::skipWs( ) File& File::skipWs()
{ {
if ( !*this ) return *this; if (!*this) return *this;
int c; int c;
while( isspace( c = getc( fp ) ) ){}; while (isspace(c = getc(fp))) {};
ungetc( c , fp ); ungetc(c, fp);
return *this; return *this;
} }

View File

@ -41,18 +41,19 @@ class File
FILE* fp; FILE* fp;
public: public:
File( const char* n, const char* m ); File(const char* n, const char* m);
~File( ); ~File();
operator bool ( ) const;
friend File& operator<<( File& f, const String& n ); operator bool () const;
friend File& operator<<( File& f, const char* n );
friend File& operator<<( File& f, const char& c ); friend File& operator<<(File& f, const String& n);
friend File& operator<<( File& f, int n ); friend File& operator<<(File& f, const char* n);
friend File& operator>>( File& f, String& n ); friend File& operator<<(File& f, const char& c);
friend File& operator>>( File& f, char* n ); friend File& operator<<(File& f, int n);
int getline( char* buf, int sz ); friend File& operator>>(File& f, String& n);
File& skipWs( ); friend File& operator>>(File& f, char* n);
int getline(char* buf, int sz);
File& skipWs();
}; };

View File

@ -29,52 +29,703 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "CForward.h" #include "debugger.h"
#include "binlog.h"
void CForwardMngr::registerForward( CPluginMngr::CPlugin* p, int func , int type ){ CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes, int fwd_type)
{
m_FuncName = name;
m_ExecType = et;
m_NumParams = numParams;
CForward** a = &head[ type ]; memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
while(*a) a = &(*a)->next;
*a = new CForward( p , func );
// find funcs
int func;
m_Funcs.clear();
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
{
if ((fwd_type != FORWARD_ALL) &&
((fwd_type == FORWARD_ONLY_NEW && ((*iter).getAMX()->flags & AMX_FLAG_OLDFILE))
|| (fwd_type == FORWARD_ONLY_OLD && !((*iter).getAMX()->flags & AMX_FLAG_OLDFILE))
))
{
continue;
}
if ((*iter).isValid() && amx_FindPublic((*iter).getAMX(), name, &func) == AMX_ERR_NONE)
{
AMXForward tmp;
tmp.pPlugin = &(*iter);
tmp.func = func;
m_Funcs.push_back(tmp);
}
}
m_Name.assign(name);
} }
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;
AMXForwardList::iterator iter;
for (iter = m_Funcs.begin(); iter != m_Funcs.end(); iter++)
{
if (iter->pPlugin->isExecutable(iter->func))
{
// Get debug info
AMX *amx = (*iter).pPlugin->getAMX();
Debugger *pDebugger = (Debugger *)amx->userdata[UD_DEBUGGER];
if (pDebugger)
pDebugger->BeginExec();
// handle strings & arrays
int i;
for (i = 0; i < m_NumParams; ++i)
{
if (m_ParamTypes[i] == FP_STRING || m_ParamTypes[i] == FP_STRINGEX)
{
const char *str = reinterpret_cast<const char*>(params[i]);
cell *tmp;
if (!str)
str = "";
amx_Allot(iter->pPlugin->getAMX(), (m_ParamTypes[i] == FP_STRING) ? strlen(str) + 1 : STRINGEX_MAXLENGTH, &realParams[i], &tmp);
amx_SetStringOld(tmp, str, 0, 0);
physAddrs[i] = tmp;
} }
else if (m_ParamTypes[i] == FP_ARRAY)
{
cell *tmp;
amx_Allot(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];
}
}
//Push the parameters in reverse order. Weird, unfriendly part of Small 3.0!
for (i = m_NumParams-1; i >= 0; i--)
{
amx_Push(amx, realParams[i]);
}
// exec
cell retVal;
#if defined BINLOG_ENABLED
g_BinLog.WriteOp(BinLog_CallPubFunc, (*iter).pPlugin->getId(), iter->func);
#endif
int err = amx_Exec(amx, &retVal, iter->func);
// log runtime error, if any
if (err != AMX_ERR_NONE)
{
//Did something else set an error?
if (pDebugger && pDebugger->ErrorExists())
{
//we don't care, something else logged the error.
}
else if (err != -1)
{
//nothing logged the error so spit it out anyway
LogError(amx, err, NULL);
}
}
amx->error = AMX_ERR_NONE;
if (pDebugger)
pDebugger->EndExec();
// 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_GetStringOld(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)
{
char name[sNAMEMAX];
m_Func = func;
m_Amx = amx;
m_NumParams = numParams;
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
m_HasFunc = true;
isFree = false;
name[0] = '\0';
amx_GetPublic(amx, func, name);
m_Name.assign(name);
m_ToDelete = false;
m_InExec = 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;
m_Name.assign(funcName);
m_ToDelete = false;
m_InExec = 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 || m_ToDelete)
return 0;
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(m_Amx);
if (!pPlugin->isExecutable(m_Func))
return 0;
m_InExec = true;
Debugger *pDebugger = (Debugger *)m_Amx->userdata[UD_DEBUGGER];
if (pDebugger)
pDebugger->BeginExec();
// handle strings & arrays
int i;
for (i = 0; i < m_NumParams; ++i)
{
if (m_ParamTypes[i] == FP_STRING || m_ParamTypes[i] == FP_STRINGEX)
{
const char *str = reinterpret_cast<const char*>(params[i]);
if (!str)
str = "";
cell *tmp;
amx_Allot(m_Amx, (m_ParamTypes[i] == FP_STRING) ? strlen(str) + 1 : STRINGEX_MAXLENGTH, &realParams[i], &tmp);
amx_SetStringOld(tmp, str, 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];
}
}
for (i = m_NumParams - 1; i >= 0; i--)
amx_Push(m_Amx, realParams[i]);
// exec
cell retVal;
#if defined BINLOG_ENABLED
g_BinLog.WriteOp(BinLog_CallPubFunc, pPlugin->getId(), m_Func);
#endif
int err = amx_Exec(m_Amx, &retVal, m_Func);
if (err != AMX_ERR_NONE)
{
//Did something else set an error?
if (pDebugger && pDebugger->ErrorExists())
{
//we don't care, something else logged the error.
}
else if (err != -1)
{
//nothing logged the error so spit it out anyway
LogError(m_Amx, err, NULL);
}
}
if (pDebugger)
pDebugger->EndExec();
m_Amx->error = AMX_ERR_NONE;
// 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_GetStringOld(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]);
}
}
m_InExec = false;
return retVal;
}
int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam * paramTypes, int fwd_type)
{
int retVal = m_Forwards.size() << 1;
CForward *tmp = new CForward(funcName, et, numParams, paramTypes, fwd_type);
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;
if (id & 1)
{
CSPForward *fwd = m_SPForwards[id >> 1];
retVal = fwd->execute(params, m_TmpArrays);
if (fwd->m_ToDelete)
{
fwd->m_ToDelete = false;
unregisterSPForward(id);
}
} else {
retVal = m_Forwards[id >> 1]->execute(params, m_TmpArrays);
}
m_TmpArraysNum = 0;
return retVal;
}
const char *CForwardMngr::getFuncName(int id) const
{
if (!isIdValid(id))
{
return "";
}
return (id & 1) ? m_SPForwards[id >> 1]->getFuncName() : m_Forwards[id >> 1]->getFuncName();
}
int CForwardMngr::getFuncsNum(int id) const
{
if (!isIdValid(id))
{
return 0;
}
return (id & 1) ? m_SPForwards[id >> 1]->getFuncsNum() : m_Forwards[id >> 1]->getFuncsNum();
}
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
{
if (!isIdValid(id))
{
return FP_DONE;
}
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 ) CSPForward *fwd = m_SPForwards.at(id >> 1);
if (fwd->m_InExec)
{ {
if ( a->getPlugin()->isExecutable( a->getFunction() ) ) fwd->m_ToDelete = true;
} else {
fwd->isFree = true;
m_FreeSPForwards.push(id);
}
}
int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num, int fwd_type)
{
ForwardParam params[FORWARD_MAX_PARAMS];
for (size_t i=0; i<num; i++)
{ {
params[i] = static_cast<ForwardParam>(list[i]);
}
if ((err = amx_Exec(a->getPlugin()->getAMX(), &ret, a->getFunction() , num, player)) != AMX_ERR_NONE) return g_forwards.registerForward(funcName, et, num, params, fwd_type);
UTIL_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err,a->getPlugin()->getAMX()->curline,a->getPlugin()->getName()); }
if ( ret ) 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 (curParam == FORWARD_MAX_PARAMS)
break; break;
tmp = (ForwardParam)va_arg(argptr, int);
if (tmp == FP_DONE)
break;
params[curParam] = tmp;
++curParam;
} }
a = a->next; va_end(argptr);
}
return g_forwards.registerForward(funcName, et, curParam, params);
}
int registerSPForwardByNameC(AMX *amx, const char *funcName, cell *list, size_t num)
{
ForwardParam params[FORWARD_MAX_PARAMS];
for (size_t i=0; i<num; i++)
params[i] = static_cast<ForwardParam>(list[i]);
return g_forwards.registerSPForward(funcName, amx, num, 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;
}
else
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)
{
if (m_TmpArraysNum >= FORWARD_MAX_PARAMS)
{
#ifdef MEMORY_TEST
m_validateAllAllocUnits();
#endif // MEMORY_TEST
AMXXLOG_Log("[AMXX] Forwards with more than 32 parameters are not supported (tried to prepare array # %d).", m_TmpArraysNum + 1);
m_TmpArraysNum = 0;
return -1;
}
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,221 @@
* 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
// ***************************************************** #include <stdarg.h>
// class CmdMngr #include "sh_stack.h"
// *****************************************************
#define FORWARD_NUM 12 const int FORWARD_MAX_PARAMS = 32;
enum { #define FORWARD_ONLY_OLD 1
FF_ClientCommand, #define FORWARD_ONLY_NEW 2
FF_ClientConnect, #define FORWARD_ALL 3
FF_ClientDisconnect,
FF_ClientInfoChanged, enum ForwardExecType
FF_ClientPutInServer, {
FF_PluginInit, ET_IGNORE = 0, // Ignore return vaue
FF_PluginCfg, ET_STOP, // Stop on PLUGIN_HANDLED
FF_PluginPrecache, ET_STOP2, // Stop on PLUGIN_HANDLED, continue on other values, return biggest return value
FF_PluginLog, ET_CONTINUE, // Continue; return biggest return value
FF_PluginEnd, };
FF_InconsistentFile,
FF_ClientAuthorized, enum ForwardParam
{
FP_DONE = -1, // specify this as the last argument
// only tells the function that there are no more arguments
FP_CELL, // normal cell
FP_FLOAT, // float; used as normal cell though
FP_STRING, // string
FP_STRINGEX, // string; will be updated to the last function's value
FP_ARRAY, // array; use the return value of prepareArray.
};
// for prepareArray
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;
String m_Name;
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, int fwd_type=FORWARD_ALL);
CForward() {} // leaves everything unitialized'
cell execute(cell *params, ForwardPreparedArray *preparedArrays);
int getParamsNum() const
{
return m_NumParams;
}
int getFuncsNum() const
{
return m_Funcs.size();
}
const char *getFuncName() const
{
return m_Name.c_str();
}
ForwardParam getParamType(int paramId) const
{
if (paramId < 0 || paramId >= m_NumParams)
return FP_DONE;
return m_ParamTypes[paramId];
}
};
// Single plugin forward
class CSPForward
{
friend class CForwardMngr;
const char *m_FuncName;
int m_NumParams;
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
AMX *m_Amx;
int m_Func;
bool m_HasFunc;
String m_Name;
bool m_InExec;
bool m_ToDelete;
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;
}
const char *getFuncName() const
{
return m_Name.c_str();
}
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 CStack<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
int registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam *paramTypes, int fwd_type=FORWARD_ALL);
// Register single plugin forward
int registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
int registerSPForward(int func, AMX *amx, int numParams, const ForwardParam * paramTypes);
void registerForward( CPluginMngr::CPlugin* p, int func , int type ); // Unregister single plugin forward
void executeForwards( int type , int num = 0, int player = 0 ); void unregisterSPForward(int id);
void clear();
// execute forward
cell executeForwards(int id, cell *params);
void clear(); // delete all forwards
class iterator { bool isIdValid(int id) const; // check whether forward id is valid
CForward *a; bool isSPForward(int id) const; // check whether forward is single plugin
public: int getParamsNum(int id) const; // get num of params of a forward
iterator(CForward*aa) : a(aa) {} int getFuncsNum(int id) const; // get num of found functions of a forward
iterator& operator++() { a = a->next; return *this; } const char *getFuncName(int id) const; // get the function name
bool operator==(const iterator& b) const { return a == b.a; }
bool operator!=(const iterator& b) const { return !operator==(b); } ForwardParam getParamType(int id, int paramId) const;
operator bool () const { return a ? true : false; } cell prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type, bool copyBack); // prepare array
CForward& operator*() { return *a; }
};
inline iterator begin( int type ) const { return iterator(head[(int)type]); }
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 registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num, int fwd_type=FORWARD_ALL);
int registerSPForwardByName(AMX *amx, const char *funcName, ...);
int registerSPForwardByNameC(AMX *amx, const char *funcName, cell *list, size_t num);
int registerSPForward(AMX *amx, int func, ...);
void unregisterSPForward(int id);
#endif // 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 //FORWARD_H

621
amxmodx/CLang.cpp Executable file
View File

@ -0,0 +1,621 @@
/* 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 <stdarg.h>
#include "amxmodx.h"
#include "CLang.h"
#include "format.h"
#include "amxmod_compat.h"
#ifdef __linux__
#define _snprintf snprintf
#endif
#define LITIDX_NONE 0
#define LITIDX_BRACKET 1
#define LITIDX_DEFINITION 2
#define INSERT_NUMBER 1
#define INSERT_FLOAT 2
#define INSERT_STRING 3
#define INSERT_NEWLINE 4
template<>
int Compare<String>(const String &k1, const String &k2)
{
return k1.compare(k2.c_str());
}
template<>
int CompareAlt<char const *, String>(char const * const &k1, String const &k2)
{
return strcmp(k1, k2.c_str());
}
template<>
int HashFunction<String>(const String &k)
{
unsigned long hash = 5381;
register const char *str = k.c_str();
register char c;
while ((c = *str++))
{
hash = ((hash << 5) + hash) + c; // hash*33 + c
}
return hash;
}
template<>
int HashAlt<const char *>(char const * const &k)
{
unsigned long hash = 5381;
register const char *str = k;
register char c;
while ((c = *str++))
{
hash = ((hash << 5) + hash) + c; // hash*33 + c
}
return hash;
}
template<>
int HashFunction<int>(const int &k)
{
return k;
}
template<>
int Compare<int>(const int &k1, const int &k2)
{
return (k1-k2);
}
// strip the whitespaces at the beginning and the end of a string
// also convert to lowercase if needed
// return the number of written characters (including the terimating zero char)
size_t CLangMngr::strip(char *str, char *newstr, bool makelower)
{
size_t i = 0;
size_t pos = 0;
int flag = 0;
size_t strln = strlen(str);
for (i = strln - 1; i >= 0; i--)
{
if (str[i] == '\n' || str[i] == ' ' || str[i] == '\t')
{
str[i] = 0;
} else {
break;
}
}
char *ptr = str;
while (*ptr)
{
if (!flag)
{
if (*ptr != '\n' && *ptr != ' ' && *ptr != '\t')
{
flag = 1;
newstr[pos++] = makelower ? tolower(*ptr) : *ptr;
}
} else {
newstr[pos++] = makelower ? tolower(*ptr) : *ptr;
}
++ptr;
}
newstr[pos] = 0;
return ptr - str + 1;
}
/******** CLangMngr::CLang *********/
CLangMngr::CLang::CLang()
{
m_LookUpTable.clear();
m_entries = 0;
}
CLangMngr::CLang::CLang(const char *lang)
{
m_LookUpTable.clear();
m_entries = 0;
strncpy(m_LanguageName, lang, 2);
m_LanguageName[2] = 0;
}
void CLangMngr::CLang::AddEntry(int key, const char *definition)
{
defentry &d = m_LookUpTable[key];
if (d.definition)
{
delete d.definition;
} else {
m_entries++;
}
d.definition = new String(definition);
}
CLangMngr::CLang::~CLang()
{
Clear();
}
void CLangMngr::CLang::Clear()
{
THash<int, defentry>::iterator iter;
for (iter=m_LookUpTable.begin(); iter!=m_LookUpTable.end(); iter++)
{
if (iter->val.definition)
{
delete iter->val.definition;
iter->val.definition = NULL;
}
}
m_LookUpTable.clear();
m_entries = 0;
}
void CLangMngr::CLang::MergeDefinitions(CQueue<sKeyDef> &vec)
{
String *pDef;
int key = -1;
while (!vec.empty())
{
key = vec.front().key;
pDef = vec.front().definition;
AddEntry(key, pDef->c_str());
delete vec.front().definition;
vec.pop();
}
}
const char * CLangMngr::CLang::GetDef(int key, int &status)
{
defentry &def = m_LookUpTable[key];
if (!def.definition)
{
status = ERR_BADKEY;
return NULL;
}
return def.definition->c_str();
}
int CLangMngr::CLang::Entries()
{
return m_entries;
}
/******** CLangMngr *********/
inline String &make_string(const char *str)
{
static String g_temp;
g_temp.assign(str);
return g_temp;
}
CLangMngr::CLangMngr()
{
Clear();
}
const char * CLangMngr::GetKey(int key)
{
if (key < 0 || key >= (int)KeyList.size())
return NULL;
return KeyList[key]->c_str();
}
int CLangMngr::GetKeyEntry(const char *key)
{
keytbl_val &val = KeyTable[key];
return val.index;
}
int CLangMngr::AddKeyEntry(const char *key)
{
keytbl_val val;
val.index = static_cast<int>(KeyList.size());
String *pString = new String(key);
KeyList.push_back(pString);
KeyTable[key] = val;
return val.index;
}
int CLangMngr::AddKeyEntry(String &key)
{
return AddKeyEntry(key.c_str());
}
int CLangMngr::GetKeyEntry(String &key)
{
keytbl_val &val = KeyTable[key];
return val.index;
}
char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
{
//do an initial run through all this
static char outbuf[4096];
cell *addr = get_amxaddr(amx, params[parm++]);
if (amx->flags & AMX_FLAG_OLDFILE)
{
if (*addr & BCOMPAT_TRANSLATE_BITS)
{
const char *key, *def;
if (!translate_bcompat(amx, addr, &key, &def))
{
goto normal_string;
}
len = atcprintf(outbuf, sizeof(outbuf)-1, def, amx, params, &parm);
} else {
goto normal_string;
}
} else {
normal_string:
len = atcprintf(outbuf, sizeof(outbuf)-1, addr, amx, params, &parm);
}
return outbuf;
}
void CLangMngr::MergeDefinitions(const char *lang, CQueue<sKeyDef> &tmpVec)
{
CLang * language = GetLang(lang);
if (language)
language->MergeDefinitions(tmpVec);
}
//this is the file parser for dictionary text files
// -- BAILOPAN
int CLangMngr::MergeDefinitionFile(const char *file)
{
FILE *fp = fopen(file, "rt");
if (!fp)
{
CVector<md5Pair *>::iterator iter;
for (iter = FileList.begin(); iter != FileList.end(); ++iter)
{
if ((*iter)->file.compare(file) == 0)
{
char buf[33] = {0};
(*iter)->val.assign(buf);
break;
}
}
AMXXLOG_Log("[AMXX] Failed to open dictionary file: %s", file);
return 0;
}
MD5 md5;
md5.update(fp); // closes for us
md5.finalize();
char md5buffer[33];
md5.hex_digest(md5buffer);
bool foundFlag = false;
CVector<md5Pair *>::iterator iter;
for (iter = FileList.begin(); iter != FileList.end(); ++iter)
{
if ((*iter)->file.compare(file) == 0)
{
if ((*iter)->val.compare(md5buffer) == 0)
{
return -1;
} else {
(*iter)->val.assign(md5buffer);
break;
}
foundFlag = true;
}
}
if (!foundFlag)
{
md5Pair *p = new md5Pair;
p->file.assign(file);
p->val.assign(md5buffer);
FileList.push_back(p);
}
fp = fopen(file, "rt");
if (!fp)
{
AMXXLOG_Log("[AMXX] Failed to re-open dictionary file: %s", file);
return 0;
}
// Allocate enough memory to store everything
bool multiline = 0;
int pos = 0, line = 0;
CQueue<sKeyDef> Defq;
String buf;
char language[3];
sKeyDef tmpEntry = {NULL, 0};
while (!feof(fp))
{
line++;
buf._fread(fp);
buf.trim();
if (buf[0] == 0)
continue;
if ((buf[0] == ';') || (buf[0] == '/' && buf[1] == '/'))
continue;
if (buf[0] == '[' && buf.size() >= 3)
{
if (multiline)
{
AMXXLOG_Log("New section, multiline unterminated (file \"%s\" line %d)", file, line);
tmpEntry.key = -1;
tmpEntry.definition = NULL;
}
if (!Defq.empty())
{
MergeDefinitions(language, Defq);
}
language[0] = buf[1];
language[1] = buf[2];
language[2] = 0;
} else {
if (!multiline)
{
pos = buf.find('=');
if (pos > String::npos)
{
String key;
key.assign(buf.substr(0, pos).c_str());
String def;
def.assign(buf.substr(pos + 1).c_str());
key.trim();
key.toLower();
int iKey = GetKeyEntry(key);
if (iKey == -1)
iKey = AddKeyEntry(key);
tmpEntry.key = iKey;
tmpEntry.definition = new String;
tmpEntry.definition->assign(def.c_str());
tmpEntry.definition->trim();
tmpEntry.definition->reparse_newlines();
Defq.push(tmpEntry);
tmpEntry.key = -1;
tmpEntry.definition = NULL;
} else {
pos = buf.find(':');
if (pos > String::npos)
{
String key;
key.assign(buf.substr(0, pos).c_str());;
key.trim();
key.toLower();
int iKey = GetKeyEntry(key);
if (iKey == -1)
iKey = AddKeyEntry(key);
tmpEntry.key = iKey;
tmpEntry.definition = new String;
multiline = true;
} else {
//user typed a line with no directives
AMXXLOG_Log("Invalid multi-lingual line (file \"%s\" line %d)", file, line);
}
}
} else {
if (buf[0] == ':')
{
tmpEntry.definition->reparse_newlines();
Defq.push(tmpEntry);
tmpEntry.key = -1;
tmpEntry.definition = NULL;
multiline = false;
} else {
if (!tmpEntry.definition)
tmpEntry.definition = new String();
tmpEntry.definition->append(buf);
}
} // if !multiline
} //if - main
}
// merge last section
if (!Defq.empty())
{
MergeDefinitions(language, Defq);
}
fclose(fp);
return 1;
}
// Find a CLang by name, if not found, add it
CLangMngr::CLang * CLangMngr::GetLang(const char *name)
{
LangVecIter iter;
for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter)
{
if (strcmp((*iter)->GetName(), name) == 0)
return (*iter);
}
CLang *p = new CLang(name);
p->SetMngr(this);
m_Languages.push_back(p);
return p;
}
// Find a CLang by name, if not found, return NULL
CLangMngr::CLang * CLangMngr::GetLangR(const char *name)
{
LangVecIter iter;
for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter)
{
if (strcmp((*iter)->GetName(), name) == 0)
return (*iter);
}
return NULL;
}
const char *CLangMngr::GetDef(const char *langName, const char *key, int &status)
{
CLang *lang = GetLangR(langName);
keytbl_val &val = KeyTable.AltFindOrInsert(key); //KeyTable[make_string(key)];
if (lang == NULL)
{
status = ERR_BADLANG;
return NULL;
} else if (val.index == -1) {
status = ERR_BADKEY;
return NULL;
} else {
return lang->GetDef(val.index, status);
}
}
void CLangMngr::InvalidateCache()
{
for (size_t i = 0; i < FileList.size(); i++)
{
if (FileList[i])
delete FileList[i];
}
FileList.clear();
}
CLangMngr::~CLangMngr()
{
Clear();
}
void CLangMngr::Clear()
{
unsigned int i = 0;
KeyTable.clear();
for (i = 0; i < m_Languages.size(); i++)
{
if (m_Languages[i])
delete m_Languages[i];
}
for (i = 0; i < FileList.size(); i++)
{
if (FileList[i])
delete FileList[i];
}
for (i = 0; i < KeyList.size(); i++)
{
if (KeyList[i])
delete KeyList[i];
}
m_Languages.clear();
KeyList.clear();
FileList.clear();
}
int CLangMngr::GetLangsNum()
{
return m_Languages.size();
}
const char *CLangMngr::GetLangName(int langId)
{
int i = 0;
LangVecIter iter;
for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter)
{
if (i == langId)
{
return (*iter)->GetName();
}
i++;
}
return "";
}
bool CLangMngr::LangExists(const char *langName)
{
char buf[3] = {0};
int i = 0;
while ((buf[i] = tolower(*langName++)))
{
if (++i == 2)
break;
}
LangVecIter iter;
for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter)
{
if (strcmp((*iter)->GetName(), buf) == 0)
return true;
}
return false;
}
void CLangMngr::SetDefLang(int id)
{
m_CurGlobId = id;
}

190
amxmodx/CLang.h Executable file
View File

@ -0,0 +1,190 @@
/* 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
#include "sh_tinyhash.h"
#define LANG_SERVER 0
#define LANG_PLAYER -1
#define ERR_BADKEY 1 // Lang key not found
#define ERR_BADLANG 2 // Invalid lang
struct md5Pair
{
String file;
String val;
};
struct sKeyDef
{
String *definition;
int key;
};
struct lang_err
{
lang_err() : last(0.0f)
{
};
float last;
};
class defentry
{
public:
defentry() : definition(NULL)
{
};
defentry(const defentry &src)
{
definition = src.definition;
}
~defentry()
{
}
String *definition;
};
struct keytbl_val
{
keytbl_val() : index(-1)
{
};
int index;
};
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(int key, int &status);
// 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; }
void SetMngr(CLangMngr *l) { m_LMan = l; }
// Get number of entries
int Entries();
protected:
typedef THash<int, defentry> LookUpVec;
typedef LookUpVec::iterator LookUpVecIter;
char m_LanguageName[3];
// our lookup table
LookUpVec m_LookUpTable;
int m_entries;
CLangMngr *m_LMan;
public:
void AddEntry(int key, const char *definition);
};
public:
// Merge definitions into a language
void MergeDefinitions(const char *lang, CQueue <sKeyDef> &tmpVec);
private:
// 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<String *> KeyList;
THash<String, keytbl_val> KeyTable;
// 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 key
const char *GetDef(const char *langName, const char *key, int &status);
// Format a string for an AMX plugin
char *FormatAmxString(AMX *amx, cell *params, int parm, int &len);
void InvalidateCache();
// Get index
int GetKeyEntry(String &key);
int GetKeyEntry(const char *key);
// Get key from index
const char *GetKey(int key);
// Add key
int AddKeyEntry(String &key);
int AddKeyEntry(const char *key);
// 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);
inline int GetDefLang() const { return m_CurGlobId; }
// Reset
void Clear();
CLangMngr();
~CLangMngr();
};
#endif //_INCLUDE_CLANG_H

View File

@ -36,82 +36,294 @@
// 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
public: class CElement
CList<T,F>() { head = 0; }
~CList<T,F>() { clear(); }
void clear() {
iterator a = begin();
while( a ) a.remove();
}
bool empty() {
return (head ? false : true);
}
void put( T* a ) {
head = new CListEle( a , head );
}
int size() {
CListEle *p = head;
int i = 0;
while (p)
{ {
p = p->next; T *m_pObject; // pointer to the object
++i; CElement *m_pNext; // pointer to the next element
} CElement *m_pPrev; // pointer to the previous element
return i;
}
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 //CLIST_H

View File

@ -29,225 +29,290 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "CLogEvent.h" #include "CLogEvent.h"
// ***************************************************** // *****************************************************
// class LogEventsMngr // class LogEventsMngr
// ***************************************************** // *****************************************************
LogEventsMngr::LogEventsMngr() {
LogEventsMngr::LogEventsMngr()
{
logCurrent = logCounter = 0; logCurrent = logCounter = 0;
logcmplist = 0; logcmplist = 0;
arelogevents = false; arelogevents = false;
memset( logevents, 0, sizeof(logevents) ); memset(logevents, 0, sizeof(logevents));
} }
LogEventsMngr::~LogEventsMngr() { LogEventsMngr::~LogEventsMngr()
{
clearLogEvents(); clearLogEvents();
} }
int LogEventsMngr::CLogCmp::compareCondition(const char* string){ 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;
return result = strcmp(string,text.str()); if (in)
return result = strstr(string, text.c_str()) ? 0 : 1;
return result = strcmp(string,text.c_str());
} }
LogEventsMngr::CLogCmp* LogEventsMngr::registerCondition(char* filter){ LogEventsMngr::CLogCmp* LogEventsMngr::registerCondition(char* filter)
{
char* temp = filter; char* temp = filter;
// expand "1=message" // expand "1=message"
while ( isdigit(*filter) )
while (isdigit(*filter))
++filter; ++filter;
bool in = (*filter=='&'); bool in = (*filter=='&');
*filter++ = 0; *filter++ = 0;
int pos = atoi(temp); int pos = atoi(temp);
if ( pos < 0 || pos >= MAX_LOGARGS) pos = 0;
if (pos < 0 || pos >= MAX_LOGARGS)
pos = 0;
CLogCmp* c = logcmplist; CLogCmp* c = logcmplist;
while( c ) {
if ( (c->pos==pos) && (c->in==in) && !strcmp(c->text.str(), filter)) while (c)
{
if ((c->pos == pos) && (c->in == in) && !strcmp(c->text.c_str(), filter))
return c; return c;
c = c->next; c = c->next;
} }
return logcmplist = new CLogCmp( filter , in , pos , logcmplist,this );
return logcmplist = new CLogCmp(filter, in, pos, logcmplist, this);
} }
void LogEventsMngr::CLogEvent::registerFilter( char* filter ){ void LogEventsMngr::CLogEvent::registerFilter(char* filter)
CLogCmp *cmp = parent->registerCondition( filter ); {
if ( cmp == 0 ) return; CLogCmp *cmp = parent->registerCondition(filter);
for(LogCond* c = filters; c ; c = c->next){ if (cmp == 0) return;
if ( c->argnum == cmp->pos ){
c->list = new LogCondEle( cmp , c->list ); for (LogCond* c = filters; c; c = c->next)
{
if (c->argnum == cmp->pos)
{
c->list = new LogCondEle(cmp, c->list);
return; return;
} }
} }
LogCondEle* aa = new LogCondEle( cmp , 0 );
if ( aa == 0 ) return; LogCondEle* aa = new LogCondEle(cmp, 0);
filters = new LogCond( cmp->pos , aa , filters );
if (aa == 0)
return;
filters = new LogCond(cmp->pos, aa, filters);
} }
void LogEventsMngr::setLogString( char* frmt, va_list& vaptr ) { void LogEventsMngr::setLogString(char* frmt, va_list& vaptr)
{
++logCounter; ++logCounter;
int len = vsnprintf (logString, 255 , frmt, vaptr ); int len = vsnprintf(logString, 255, frmt, vaptr);
if ( len == - 1) {
if (len == - 1)
{
len = 255; len = 255;
logString[len] = 0; logString[len] = 0;
} }
if ( len ) logString[--len] = 0;
if (len)
logString[--len] = 0;
logArgc = 0; logArgc = 0;
} }
void LogEventsMngr::setLogString( char* frmt, ... ) { void LogEventsMngr::setLogString(char* frmt, ...)
{
++logCounter; ++logCounter;
va_list logArgPtr; va_list logArgPtr;
va_start ( logArgPtr , frmt ); va_start(logArgPtr, frmt);
int len = vsnprintf(logString, 255 , frmt, logArgPtr ); int len = vsnprintf(logString, 255, frmt, logArgPtr);
if ( len == - 1) {
if (len == - 1)
{
len = 255; len = 255;
logString[len] = 0; logString[len] = 0;
} }
va_end ( logArgPtr );
if ( len ) logString[--len] = 0; va_end(logArgPtr);
if (len)
logString[--len] = 0;
logArgc = 0; logArgc = 0;
} }
void LogEventsMngr::parseLogString( ) { void LogEventsMngr::parseLogString()
{
register const char* b = logString; register const char* b = logString;
register int a; register int a;
while( *b && logArgc < MAX_LOGARGS ){
while (*b && logArgc < MAX_LOGARGS)
{
a = 0; a = 0;
if ( *b == '"' ) {
if (*b == '"')
{
++b; ++b;
while ( *b && *b != '"' && a < 127 )
while (*b && *b != '"' && a < 127)
logArgs[logArgc][a++] = *b++; logArgs[logArgc][a++] = *b++;
logArgs[logArgc++][a] = 0; logArgs[logArgc++][a] = 0;
if ( *b) b+=2; // thanks to double terminator if (*b) b+=2; // thanks to double terminator
} }
else if ( *b == '(' ) { else if (*b == '(')
{
++b; ++b;
while ( *b && *b != ')' && a < 127 )
while (*b && *b != ')' && a < 127)
logArgs[logArgc][a++] = *b++; logArgs[logArgc][a++] = *b++;
logArgs[logArgc++][a] = 0; logArgs[logArgc++][a] = 0;
if ( *b) b+=2; if (*b) b+=2;
} } else {
else { while (*b && *b != '(' && *b != '"' && a < 127)
while ( *b && *b != '(' && *b != '"' && a < 127 )
logArgs[logArgc][a++] = *b++; logArgs[logArgc][a++] = *b++;
if ( *b ) --a; if (*b) --a;
logArgs[logArgc++][a] = 0; logArgs[logArgc++][a] = 0;
} }
} }
} }
LogEventsMngr::CLogEvent* LogEventsMngr::registerLogEvent( CPluginMngr::CPlugin* plugin, int func, int pos ) LogEventsMngr::CLogEvent* LogEventsMngr::registerLogEvent(CPluginMngr::CPlugin* plugin, int func, int pos)
{ {
if ( pos < 1 || pos > MAX_LOGARGS) if (pos < 1 || pos > MAX_LOGARGS)
return 0; return 0;
arelogevents = true; arelogevents = true;
CLogEvent** d = &logevents[pos]; CLogEvent** d = &logevents[pos];
while(*d) d = &(*d)->next;
return *d = new CLogEvent( plugin , func, this ); while (*d)
d = &(*d)->next;
return *d = new CLogEvent(plugin, func, this);
} }
void LogEventsMngr::executeLogEvents() void LogEventsMngr::executeLogEvents()
{ {
int err;
bool valid; bool valid;
for(CLogEvent* a = logevents[ logArgc ]; a ; a = a->next){
for (CLogEvent* a = logevents[logArgc]; a; a = a->next)
{
valid = true; valid = true;
for( CLogEvent::LogCond* b = a->filters; b ; b = b->next){
for (CLogEvent::LogCond* b = a->filters; b; b = b->next)
{
valid = false; valid = false;
for( CLogEvent::LogCondEle* c = b->list; c ; c = c->next) {
if ( c->cmp->compareCondition( logArgs[b->argnum] ) == 0 ){ for (CLogEvent::LogCondEle* c = b->list; c; c = c->next)
{
if (c->cmp->compareCondition(logArgs[b->argnum]) == 0)
{
valid = true; valid = true;
break; break;
} }
} }
if (!valid) break;
if (!valid)
break;
} }
#ifdef ENABLEEXEPTIONS if (valid)
try
{ {
#endif executeForwards(a->func);
if (valid){
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\")",
err,a->plugin->getAMX()->curline,a->plugin->getName());
} }
#ifdef ENABLEEXEPTIONS
}
catch( ... )
{
UTIL_Log( "[AMXX] fatal error at log forward function execution");
}
#endif
} }
} }
void LogEventsMngr::clearLogEvents(){ void LogEventsMngr::clearLogEvents()
{
logCurrent = logCounter = 0; logCurrent = logCounter = 0;
arelogevents = false; arelogevents = false;
for(int i = 0; i < MAX_LOGARGS + 1; ++i){
for (int i = 0; i < MAX_LOGARGS + 1; ++i)
{
CLogEvent **a = &logevents[i]; CLogEvent **a = &logevents[i];
while(*a){ while (*a)
{
CLogEvent* bb = (*a)->next; CLogEvent* bb = (*a)->next;
delete *a; delete *a;
*a = bb; *a = bb;
} }
} }
clearConditions(); clearConditions();
} }
void LogEventsMngr::clearConditions() { void LogEventsMngr::clearConditions()
while (logcmplist){ {
while (logcmplist)
{
CLogCmp* a = logcmplist->next; CLogCmp* a = logcmplist->next;
delete logcmplist; delete logcmplist;
logcmplist = a; logcmplist = a;
} }
} }
LogEventsMngr::CLogEvent::LogCond::~LogCond() { LogEventsMngr::CLogEvent::LogCond::~LogCond()
while( list ) { {
while (list)
{
LogCondEle* cc = list->next; LogCondEle* cc = list->next;
delete list; delete list;
list = cc; list = cc;
} }
} }
LogEventsMngr::CLogEvent::~CLogEvent() { LogEventsMngr::CLogEvent::~CLogEvent()
while( filters ) { {
while (filters)
{
LogCond* cc = filters->next; LogCond* cc = filters->next;
delete filters; delete filters;
filters = cc; filters = cc;
} }
} }
LogEventsMngr::CLogEvent *LogEventsMngr::getValidLogEvent( CLogEvent * a ) LogEventsMngr::CLogEvent *LogEventsMngr::getValidLogEvent(CLogEvent * a)
{ {
bool valid; bool valid;
while(a){
while (a)
{
valid = true; valid = true;
for( CLogEvent::LogCond* b = a->filters; b ; b = b->next){
for (CLogEvent::LogCond* b = a->filters; b; b = b->next)
{
valid = false; valid = false;
for( CLogEvent::LogCondEle* c = b->list; c ; c = c->next) {
if ( c->cmp->compareCondition( logArgs[b->argnum] ) == 0 ){ for (CLogEvent::LogCondEle* c = b->list; c; c = c->next)
{
if (c->cmp->compareCondition(logArgs[b->argnum]) == 0)
{
valid = true; valid = true;
break; break;
} }
} }
if (!valid) break; if (!valid) break;
} }
if (!valid){
if (!valid)
{
a = a->next; a = a->next;
continue; continue;
} }
return a; return a;
} }
return 0; return 0;
} }

View File

@ -40,8 +40,8 @@
// class LogEventsMngr // class LogEventsMngr
// ***************************************************** // *****************************************************
class LogEventsMngr { class LogEventsMngr
{
char logString[256]; char logString[256];
char logArgs[MAX_LOGARGS][128]; char logArgs[MAX_LOGARGS][128];
int logArgc; int logArgc;
@ -53,7 +53,6 @@ public:
class CLogCmp; class CLogCmp;
class iterator; class iterator;
class CLogEvent; class CLogEvent;
friend class CLogEvent; friend class CLogEvent;
friend class CLogCmp; friend class CLogCmp;
friend class iterator; friend class iterator;
@ -62,105 +61,118 @@ public:
{ {
friend class LogEventsMngr; friend class LogEventsMngr;
friend class CLogEvent; friend class CLogEvent;
LogEventsMngr* parent; LogEventsMngr* parent;
String text; String text;
int logid; int logid;
int pos; int pos;
int result; int result;
bool in; bool in;
CLogCmp *next; CLogCmp *next;
CLogCmp( const char* s, bool r, int p, CLogCmp *n, LogEventsMngr* mg ) : text(s) {
CLogCmp(const char* s, bool r, int p, CLogCmp *n, LogEventsMngr* mg) : text(s)
{
logid = result = 0; logid = result = 0;
pos = p; pos = p;
parent = mg; parent = mg;
in = r; in = r;
next = n; next = n;
} }
public:
public:
int compareCondition(const char* string); int compareCondition(const char* string);
}; };
private: private:
CLogCmp *logcmplist; CLogCmp *logcmplist;
public: public:
class CLogEvent { class CLogEvent
{
friend class LogEventsMngr; friend class LogEventsMngr;
friend class iterator; friend class iterator;
struct LogCondEle {
struct LogCondEle
{
CLogCmp *cmp; CLogCmp *cmp;
LogCondEle *next; LogCondEle *next;
LogCondEle(CLogCmp *c, LogCondEle *n): cmp(c) , next(n) { } LogCondEle(CLogCmp *c, LogCondEle *n): cmp(c), next(n) {}
}; };
struct LogCond {
LogCondEle *list; struct LogCond
{
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; }
}; };
private: private:
CLogEvent *logevents[MAX_LOGARGS + 1];
CLogEvent *logevents[MAX_LOGARGS+1]; CLogEvent *getValidLogEvent(CLogEvent * a);
CLogEvent *getValidLogEvent( CLogEvent * a );
CLogCmp* registerCondition(char* filter); CLogCmp* registerCondition(char* filter);
void clearConditions(); void clearConditions();
public: public:
LogEventsMngr(); LogEventsMngr();
~LogEventsMngr(); ~LogEventsMngr();
// Interface // Interface
CLogEvent* registerLogEvent(CPluginMngr::CPlugin* plugin, int func, int pos);
CLogEvent* registerLogEvent( CPluginMngr::CPlugin* plugin, int func, int pos );
inline bool logEventsExist() { return arelogevents; } inline bool logEventsExist() { return arelogevents; }
void setLogString( char* frmt, va_list& vaptr );
void setLogString( char* frmt , ... ); void setLogString(char* frmt, va_list& vaptr);
void parseLogString( ); void setLogString(char* frmt, ...);
void parseLogString();
void executeLogEvents(); void executeLogEvents();
inline const char* getLogString() { return logString; } inline const char* getLogString() { return logString; }
inline int getLogArgNum() { return logArgc; } inline int getLogArgNum() { return logArgc; }
inline const char* getLogArg( int i ) { return ( i < 0 || i >= logArgc ) ? "" : logArgs[ i ]; } inline const char* getLogArg(int i) { return (i < 0 || i >= logArgc) ? "" : logArgs[i]; }
void clearLogEvents(); void clearLogEvents();
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++() {
a = b->getValidLogEvent( a->next ); inline iterator& operator++()
{
a = b->getValidLogEvent(a->next);
return *this; return *this;
} }
inline bool operator==(const iterator& c) const { return a == c.a; } inline bool operator==(const iterator& c) const { return a == c.a; }
inline bool operator!=(const iterator& c) const { return !operator==(c); } inline bool operator!=(const iterator& c) const { return !operator == (c); }
CLogEvent& operator*() { return *a; } CLogEvent& operator*() { return *a; }
operator bool ( ) const { return a ? true : false; } operator bool () const { return a ? true : false; }
}; };
inline iterator begin() { return iterator(getValidLogEvent(logevents[ logArgc ]),this); }
inline iterator end() { return iterator(0,this); } inline iterator begin() { return iterator(getValidLogEvent(logevents[logArgc]), this); }
inline iterator end() { return iterator(0, this); }
}; };
#endif #endif //LOGEVENTS_H

View File

@ -29,15 +29,14 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "CMenu.h" #include "CMenu.h"
// ***************************************************** // *****************************************************
// class MenuMngr // class MenuMngr
// ***************************************************** // *****************************************************
MenuMngr::MenuCommand::MenuCommand( CPluginMngr::CPlugin *a, int mi, int k, int f ) { MenuMngr::MenuCommand::MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f)
{
plugin = a; plugin = a;
keys = k; keys = k;
menuid = mi; menuid = mi;
@ -48,30 +47,84 @@ MenuMngr::MenuCommand::MenuCommand( CPluginMngr::CPlugin *a, int mi, int k, int
MenuMngr::~MenuMngr() MenuMngr::~MenuMngr()
{ {
clear(); clear();
MenuMngr::MenuIdEle::uniqueid = 0;
} }
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 ((!amx || !b->amx || amx == b->amx) && strstr(name,b->name.c_str()))
return b->id; return b->id;
} }
return 0; return 0;
} }
int MenuMngr::registerMenuId(const char* n, AMX* a ) void MenuMngr::removeMenuId(int id)
{ {
int id = findMenuId( n, a ); MenuIdEle *n = headid;
if (id) return id; MenuIdEle *l = NULL;
headid = new MenuIdEle( n, a , headid ); while (n)
{
if (n->id == id)
{
if (l)
l->next = n->next;
else
headid = n->next;
delete n;
break;
}
l = n;
n = n->next;
}
MenuCommand *c = headcmd;
MenuCommand *lc = NULL;
MenuCommand *tmp;
while (c)
{
if (c->menuid == id)
{
if (m_watch_iter.a == c)
{
++m_watch_iter;
}
if (lc)
lc->next = c->next;
else
headcmd = c->next;
tmp = c->next;
delete c;
c = tmp;
} else {
lc = c;
c = c->next;
}
}
}
int MenuMngr::registerMenuId(const char* n, AMX* a)
{
int id = findMenuId(n, a);
if (id)
return id;
headid = new MenuIdEle(n, a, headid);
if (!headid)
return 0; // :TODO: Better error report
return headid->id; return headid->id;
} }
void MenuMngr::registerMenuCmd( CPluginMngr::CPlugin *a,int mi, int k , int f ) void MenuMngr::registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f)
{ {
MenuCommand** temp = &headcmd; MenuCommand** temp = &headcmd;
while(*temp) temp = &(*temp)->next; while (*temp) temp = &(*temp)->next;
*temp = new MenuCommand(a,mi, k,f); *temp = new MenuCommand(a, mi, k, f);
} }
void MenuMngr::clear() void MenuMngr::clear()
@ -91,4 +144,13 @@ void MenuMngr::clear()
} }
} }
MenuMngr::iterator MenuMngr::SetWatchIter(MenuMngr::iterator iter)
{
MenuMngr::iterator old = m_watch_iter;
m_watch_iter = iter;
return old;
}
int MenuMngr::MenuIdEle::uniqueid = 0; int MenuMngr::MenuIdEle::uniqueid = 0;

View File

@ -43,17 +43,18 @@ class MenuMngr
String name; String name;
AMX* amx; AMX* amx;
MenuIdEle* next; MenuIdEle* next;
int id; int id;
static int uniqueid; static int uniqueid;
MenuIdEle( const char* n, AMX* a, MenuIdEle* m ) : name( n ) , amx(a) , next( m ) {
MenuIdEle(const char* n, AMX* a, MenuIdEle* m) : name(n), amx(a), next(m)
{
id = ++uniqueid; id = ++uniqueid;
} }
~MenuIdEle() { --uniqueid; }
} *headid; } *headid;
public: public:
class iterator; class iterator;
private: private:
class MenuCommand class MenuCommand
@ -65,28 +66,31 @@ private:
int menuid; int menuid;
int keys; int keys;
int function; int function;
MenuCommand* next; MenuCommand* next;
MenuCommand( CPluginMngr::CPlugin *a, int mi, int k, int f ); MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f);
public: public:
inline int getFunction() { return function; } inline int getFunction() { return function; }
inline CPluginMngr::CPlugin* getPlugin() { return plugin; } inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
inline bool matchCommand( int m, int k ) { return ((m == menuid) && (keys & k)); } inline bool matchCommand(int m, int k) { return ((m == menuid) && (keys & k)); }
} *headcmd; } *headcmd;
public: public:
MenuMngr() : m_watch_iter(end())
MenuMngr() { headid = 0; headcmd = 0; } { headid = NULL; headcmd = NULL; }
~MenuMngr(); ~MenuMngr();
// Interface // Interface
int findMenuId(const char* name, AMX* a = 0); int findMenuId(const char* name, AMX* a = 0);
int registerMenuId(const char* n, AMX* a ); int registerMenuId(const char* n, AMX* a);
void registerMenuCmd( CPluginMngr::CPlugin *a,int mi, int k , int f ); void removeMenuId(int id);
void registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f);
void clear(); void clear();
class iterator { class iterator
{
friend class MenuMngr;
MenuCommand* a; MenuCommand* a;
public: public:
iterator(MenuCommand*aa) : a(aa) {} iterator(MenuCommand*aa) : a(aa) {}
@ -96,12 +100,14 @@ public:
operator bool () const { return a ? true : false; } operator bool () const { return a ? true : false; }
MenuCommand& operator*() { return *a; } MenuCommand& operator*() { return *a; }
}; };
inline iterator begin() const { return iterator(headcmd); } inline iterator begin() const { return iterator(headcmd); }
inline iterator end() const { return iterator(0); } inline iterator end() const { return iterator(0); }
MenuMngr::iterator SetWatchIter(MenuMngr::iterator iter);
inline MenuMngr::iterator GetWatchIter() { return m_watch_iter; }
private:
MenuMngr::iterator m_watch_iter;
}; };
#endif #endif //MENUS_H

View File

@ -28,21 +28,20 @@
* 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 <extdll.h>
#include <meta_api.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "newmenus.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;
pEdict = e; pEdict = e;
initialized = false; initialized = false;
ingame = false; ingame = false;
bot = false; bot_value = false;
bot_cached = false;
authorized = false; authorized = false;
current = 0; current = 0;
@ -51,6 +50,8 @@ void CPlayer::Init( edict_t* e , int i )
aiming = 0; aiming = 0;
menu = 0; menu = 0;
keys = 0; keys = 0;
menuexpire = 0.0;
newmenu = -1;
death_weapon.clear(); death_weapon.clear();
name.clear(); name.clear();
@ -58,44 +59,109 @@ void CPlayer::Init( edict_t* e , int i )
team.clear(); team.clear();
} }
void CPlayer::Disconnect() { void CPlayer::Disconnect()
{
ingame = false; ingame = false;
initialized = false; initialized = false;
authorized = false; authorized = false;
if (newmenu != -1)
{
Menu *pMenu = g_NewMenus[newmenu];
if (pMenu)
{
//prevent recursion
newmenu = -1;
menu = 0;
executeForwards(pMenu->func,
static_cast<cell>(ENTINDEX(pEdict)),
static_cast<cell>(pMenu->thisId),
static_cast<cell>(MENU_EXIT));
}
}
List<ClientCvarQuery_Info *>::iterator iter, end=queries.end();
for (iter=queries.begin(); iter!=end; iter++)
{
unregisterSPForward((*iter)->resultFwd);
delete [] (*iter)->params;
delete (*iter);
}
queries.clear();
bot_value = false;
bot_cached = false;
menu = 0;
newmenu = -1;
} }
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) {
name.set(connectname); int CPlayer::NextHUDChannel()
ip.set(ipaddress); {
int ilow = 1;
for (int i=ilow+1; i<=4; i++)
{
if (channels[i] < channels[ilow])
ilow = i;
}
return ilow;
}
bool CPlayer::Connect(const char* connectname, const char* ipaddress)
{
bot_value = false;
bot_cached = false;
name.assign(connectname);
ip.assign(ipaddress);
time = gpGlobals->time; time = gpGlobals->time;
bot = IsBot();
death_killer = 0; death_killer = 0;
memset(flags,0,sizeof(flags)); menu = 0;
memset(weapons,0,sizeof(weapons)); newmenu = -1;
memset(flags, 0, sizeof(flags));
memset(weapons, 0, sizeof(weapons));
initialized = true; initialized = true;
authorized = false; authorized = false;
const char* authid = GETPLAYERAUTHID( pEdict ); for (int i=0; i<=4; i++)
{
channels[i] = 0.0f;
hudmap[i] = 0;
}
if ( (authid == 0) || (*authid == 0) List<ClientCvarQuery_Info *>::iterator iter, end=queries.end();
|| (strcmp( authid , "STEAM_ID_PENDING") == 0) ) for (iter=queries.begin(); iter!=end; iter++)
{
unregisterSPForward((*iter)->resultFwd);
delete [] (*iter)->params;
delete (*iter);
}
queries.clear();
const char* authid = GETPLAYERAUTHID(pEdict);
if ((authid == 0) || (*authid == 0) || (strcmp(authid, "STEAM_ID_PENDING") == 0))
return true; return true;
return false; return false;
} }
// ***************************************************** // *****************************************************
// class Grenades // class Grenades
// ***************************************************** // *****************************************************
void Grenades::put( edict_t* grenade, float time, int type, CPlayer* player )
void Grenades::put(edict_t* grenade, float time, int type, CPlayer* player)
{ {
Obj* a = new Obj; Obj* a = new Obj;
if ( a == 0 ) return; if (a == 0) return;
a->player = player; a->player = player;
a->grenade = grenade; a->grenade = grenade;
a->time = gpGlobals->time + time; a->time = gpGlobals->time + time;
@ -104,33 +170,37 @@ void Grenades::put( edict_t* grenade, float time, int type, CPlayer* player )
head = a; head = a;
} }
bool Grenades::find( edict_t* enemy, CPlayer** p, int& type ) bool Grenades::find(edict_t* enemy, CPlayer** p, int& type)
{ {
bool found = false; bool found = false;
Obj** a = &head; Obj** a = &head;
while ( *a ){
if ( (*a)->time > gpGlobals->time ) { while (*a)
if ( (*a)->grenade == enemy ) { {
if ((*a)->time > gpGlobals->time)
{
if ((*a)->grenade == enemy)
{
found = true; found = true;
(*p) = (*a)->player; (*p) = (*a)->player;
type = (*a)->type; type = (*a)->type;
} }
} } else {
else {
Obj* b = (*a)->next; Obj* b = (*a)->next;
delete *a; delete *a;
*a = b; *a = b;
continue; continue;
} }
a = &(*a)->next; a = &(*a)->next;
} }
return found; return found;
} }
void Grenades::clear() void Grenades::clear()
{ {
while(head){ while (head)
{
Obj* a = head->next; Obj* a = head->next;
delete head; delete head;
head = a; head = a;
@ -140,93 +210,119 @@ void Grenades::clear()
// ***************************************************** // *****************************************************
// class XVars // class XVars
// ***************************************************** // *****************************************************
void XVars::clear() {
void XVars::clear()
{
delete[] head; delete[] head;
head = 0; head = 0;
num = 0; num = 0;
size = 0; size = 0;
} }
int XVars::put( AMX* p, cell* v ) int XVars::put(AMX* p, cell* v)
{ {
for(int a = 0; a < num; ++a) { for (int a = 0; a < num; ++a)
if ( (head[a].amx == p) && (head[a].value == v) ) {
if ((head[a].amx == p) && (head[a].value == v))
return a; return a;
} }
if ( (num >= size) && realloc_array( size ? (size * 2) : 8 ) ) if ((num >= size) && realloc_array(size ? (size * 2) : 8))
return -1; return -1;
head[num].value = v; head[num].value = v;
head[num].amx = p; head[num].amx = p;
return num++; return num++;
} }
int XVars::realloc_array( int nsize ) int XVars::realloc_array(int nsize)
{ {
XVarEle* me = new XVarEle[nsize]; XVarEle* me = new XVarEle[nsize];
if ( me ){
for(int a = 0 ; a < num; ++a) if (me)
{
for (int a = 0 ; a < num; ++a)
me[a] = head[a]; me[a] = head[a];
delete[] head; delete[] head;
head = me; head = me;
size = nsize; size = nsize;
return 0; return 0;
} }
return 1; return 1;
} }
// ***************************************************** // *****************************************************
// class TeamIds // class TeamIds
// ***************************************************** // *****************************************************
TeamIds::TeamIds() { head = 0; newTeam = 0; } TeamIds::TeamIds() { head = 0; newTeam = 0; }
TeamIds::~TeamIds() {
while( head ) { TeamIds::~TeamIds()
{
while (head)
{
TeamEle* a = head->next; TeamEle* a = head->next;
delete head; delete head;
head = a; head = a;
} }
} }
void TeamIds::registerTeam( const char* n ,int s ) void TeamIds::registerTeam(const char* n, int s)
{ {
TeamEle** a = &head; TeamEle** a = &head;
while( *a ){
if ( strcmp((*a)->name.str(),n) == 0 ){ while (*a)
if (s != -1){ {
if (strcmp((*a)->name.c_str(),n) == 0)
{
if (s != -1)
{
(*a)->id = s; (*a)->id = s;
newTeam &= ~(1<<(*a)->tid); newTeam &= ~(1<<(*a)->tid);
} }
return; return;
} }
a = &(*a)->next; a = &(*a)->next;
} }
*a = new TeamEle( n , s );
if ( *a == 0 ) return; *a = new TeamEle(n, s);
if (*a == 0)
return;
newTeam |= (1<<(*a)->tid); newTeam |= (1<<(*a)->tid);
} }
int TeamIds::findTeamId( const char* n ) int TeamIds::findTeamId(const char* n)
{ {
TeamEle* a = head; TeamEle* a = head;
while( a ){
if ( !strcmpi(a->name.str(),n) ) while (a)
{
if (!stricmp(a->name.c_str(), n))
return a->id; return a->id;
a = a->next; a = a->next;
} }
return -1; return -1;
} }
int TeamIds::findTeamIdCase( const char* n) int TeamIds::findTeamIdCase(const char* n)
{ {
TeamEle* a = head; TeamEle* a = head;
while( a ){
if ( !strcmp(a->name.str(), n) ) while (a)
{
if (!strcmp(a->name.c_str(), n))
return a->id; return a->id;
a = a->next; a = a->next;
} }
return -1; return -1;
} }
char TeamIds::TeamEle::uid = 0; char TeamIds::TeamEle::uid = 0;

View File

@ -33,39 +33,48 @@
#define CMISC_H #define CMISC_H
#include "CList.h" #include "CList.h"
#include "string.h" #include "sh_list.h"
// ***************************************************** // *****************************************************
// class CCVar // class CCVar
// ***************************************************** // *****************************************************
class CCVar class CCVar
{ {
cvar_t cvar; cvar_t cvar;
String name; String name;
String plugin; String plugin;
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); }
int plugin_id;
}; };
// ***************************************************** // *****************************************************
// class CPlayer // class CPlayer
// ***************************************************** // *****************************************************
struct ClientCvarQuery_Info
{
int resultFwd;
int requestId;
int paramLen;
cell *params;
};
class CPlayer class CPlayer
{ {
public: public:
edict_t* pEdict; edict_t* pEdict;
@ -75,13 +84,17 @@ public:
bool initialized; bool initialized;
bool ingame; bool ingame;
bool bot; bool bot_cached;
bool bot_value;
bool authorized; bool authorized;
bool vgui;
float time; float time;
float playtime; float playtime;
float menuexpire;
struct { struct
{
int ammo; int ammo;
int clip; int clip;
} weapons[MAX_WEAPONS]; } weapons[MAX_WEAPONS];
@ -100,27 +113,55 @@ public:
int death_victim; int death_victim;
bool death_tk; bool death_tk;
String death_weapon; String death_weapon;
int newmenu;
int page;
float channels[5];
cell hudmap[5];
Vector lastTrace; Vector lastTrace;
Vector thisTrace; Vector thisTrace;
Vector lastHit; Vector lastHit;
void Init( edict_t* e , int i ); List<ClientCvarQuery_Info *> queries;
void Init(edict_t* e, int i);
void Disconnect(); void Disconnect();
void PutInServer(); void PutInServer();
bool Connect(const char* connectname,const char* ipaddress);
inline bool IsBot(){ bool Connect(const char* connectname, const char* ipaddress);
const char* auth= (*g_engfuncs.pfnGetPlayerAuthId)(pEdict);
return ( auth && !strcmp( auth , "BOT" ) ); inline bool IsBot()
{
if (!bot_cached)
{
bot_value = false;
if (pEdict->v.flags & FL_FAKECLIENT)
{
bot_value = true;
bot_cached = true;
} else {
const char *auth = GETPLAYERAUTHID(pEdict);
if (auth && (strcmp(auth, "BOT") == 0))
{
bot_value = true;
bot_cached = true;
}
}
} }
inline bool IsAlive(){ return bot_value;
return ((pEdict->v.deadflag==DEAD_NO)&&(pEdict->v.health>0)); }
inline bool IsAlive()
{
return ((pEdict->v.deadflag == DEAD_NO) && (pEdict->v.health > 0));
} }
inline void Authorize() { authorized = true; } inline void Authorize() { authorized = true; }
int NextHUDChannel();
}; };
// ***************************************************** // *****************************************************
@ -138,31 +179,35 @@ class Grenades
Obj* next; Obj* next;
} *head; } *head;
public: public:
Grenades() { head = 0; } Grenades() { head = 0; }
~Grenades() { clear(); } ~Grenades() { clear(); }
void put( edict_t* grenade, float time, int type, CPlayer* player );
bool find( edict_t* enemy, CPlayer** p, int& type ); void put(edict_t* grenade, float time, int type, CPlayer* player);
bool find(edict_t* enemy, CPlayer** p, int& type);
void clear(); void clear();
}; };
// ***************************************************** // *****************************************************
// class ForceObject // class ForceObject
// ***************************************************** // *****************************************************
class ForceObject {
AMX* amx; class ForceObject
{
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; }
inline FORCE_TYPE getForceType() { return type; } inline FORCE_TYPE getForceType() { return type; }
}; };
@ -172,30 +217,38 @@ public:
class XVars class XVars
{ {
struct XVarEle { struct XVarEle
{
AMX* amx; AMX* amx;
cell* value; cell* value;
}; };
XVarEle* head; XVarEle* head;
int size; int size;
int num; int num;
int realloc_array(int nsize);
int realloc_array( int nsize );
public: public:
XVars() { num = 0; size = 0; head = 0; } XVars() { num = 0; size = 0; head = 0; }
~XVars() { clear(); } ~XVars() { clear(); }
void clear(); void clear();
int put( AMX* a, cell* v ); int put(AMX* a, cell* v);
inline cell getValue( int a ) {
return ( a >= 0 && a < num ) ? *(head[a].value) : 0; inline cell getValue(int a)
{
return (a >= 0 && a < num) ? *(head[a].value) : 0;
} }
inline int setValue( int a, cell v ) {
if ( a >= 0 && a < num ){ inline int setValue(int a, cell v)
{
if (a >= 0 && a < num)
{
*(head[a].value) = v; *(head[a].value) = v;
return 0; return 0;
} }
return 1; return 1;
} }
}; };
@ -203,34 +256,41 @@ public:
// ***************************************************** // *****************************************************
// class CScript // class CScript
// ***************************************************** // *****************************************************
class CScript class CScript
{ {
String filename; String filename;
AMX* amx; AMX* amx;
void* code; void* code;
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; }
}; };
// ***************************************************** // *****************************************************
// class TeamIds // class TeamIds
// ***************************************************** // *****************************************************
class TeamIds class TeamIds
{ {
struct TeamEle { struct TeamEle
{
String name; String name;
int id; int id;
char tid; char tid;
static char uid; static char uid;
TeamEle* next; TeamEle* next;
TeamEle(const char* n, int& i) : name(n) , id(i) , next(0) {
TeamEle(const char* n, int& i) : name(n), id(i), next(0)
{
tid = uid++; tid = uid++;
}; }
~TeamEle(){ --uid; }
~TeamEle() { --uid; }
} *head; } *head;
int newTeam; int newTeam;
@ -238,15 +298,11 @@ class TeamIds
public: public:
TeamIds(); TeamIds();
~TeamIds(); ~TeamIds();
void registerTeam( const char* n ,int s );
int findTeamId( const char* n); void registerTeam(const char* n, int s);
int findTeamIdCase( const char* n); int findTeamId(const char* n);
int findTeamIdCase(const char* n);
inline bool isNewTeam() { return newTeam ? true : false; } inline bool isNewTeam() { return newTeam ? true : false; }
}; };
#endif //CMISC_H
#endif

View File

@ -29,164 +29,379 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "libraries.h"
#ifndef FAR // PM: Test: FAR #ifndef FAR
#define FAR #define FAR
#endif #endif
typedef int (FAR *QUERYMOD)(module_info_s**); // New
typedef int (FAR *ATTACHMOD)(pfnamx_engine_g*,pfnmodule_engine_g*); typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
typedef int (FAR *DETACHMOD)(void); typedef int (FAR *QUERYMOD_NEW)(int * /*ifvers*/, amxx_module_info_s * /*modInfo*/);
typedef int (FAR *ATTACHMOD_NEW)(PFN_REQ_FNPTR /*reqFnptrFunc*/);
QUERYMOD QueryModule; typedef int (FAR *DETACHMOD_NEW)(void);
ATTACHMOD AttachModule; typedef void (FAR *PLUGINSLOADED_NEW)(void);
DETACHMOD DetachModule; typedef void (*PLUGINSUNLOADED_NEW)(void);
typedef void (*PLUGINSUNLOADING_NEW)(void);
pfnamx_engine_g engAmxFunc = {
amx_Align16,
amx_Align32,
amx_Allot,
amx_Callback,
amx_Clone,
amx_Debug,
amx_Exec,
amx_Execv,
amx_FindPublic,
amx_FindPubVar,
amx_FindTagId,
amx_Flags,
amx_GetAddr,
amx_GetPublic,
amx_GetPubVar,
amx_GetString,
amx_GetTag,
amx_GetUserData,
amx_Init,
amx_InitJIT,
amx_MemInfo,
amx_NameLength,
amx_NativeInfo,
amx_NumPublics,
amx_NumPubVars,
amx_NumTags,
amx_RaiseError,
amx_Register,
amx_Release,
amx_SetCallback,
amx_SetDebugHook,
amx_SetString,
amx_SetUserData,
amx_StrLen,
};
pfnmodule_engine_g engModuleFunc = {
add_amxnatives,
build_pathname,
copy_amxmemory,
format_amxstring,
get_amxaddr,
get_amxscript,
get_amxscriptname,
get_amxstring,
get_modname,
load_amxscript,
print_srvconsole,
report_error,
set_amxnatives,
set_amxstring,
amxstring_len,
unload_amxscript,
alloc_amxmemory,
free_amxmemory,
};
// ***************************************************** // *****************************************************
// 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");
// new
m_Amxx = false;
m_InfoNew.author = "unknown";
m_InfoNew.name = "unknown";
m_InfoNew.version = "unknown";
m_InfoNew.reload = 0;
m_MissingFunc = NULL;
for (size_t i=0; i<m_DestroyableIndexes.size(); i++)
{
delete [] m_Natives[m_DestroyableIndexes[i]];
}
m_DestroyableIndexes.clear();
m_Natives.clear();
m_NewNatives.clear();
}
bool CModule::attachMetamod(const char *mmfile, PLUG_LOADTIME now)
{
void **handle;
void *dummy = NULL;
if (!m_Handle)
handle = &dummy;
else
handle = (void **)&m_Handle;
int res = LoadMetamodPlugin(mmfile, handle, now);
if (!res)
{
m_Metamod = false;
}
return true;
}
//this ugly function is ultimately something like O(n^4).
//sigh. it shouldn't be needed.
void CModule::rewriteNativeLists(AMX_NATIVE_INFO *list)
{
AMX_NATIVE_INFO *curlist;
for (size_t i=0; i<m_Natives.size(); i++)
{
curlist = m_Natives[i];
bool changed = false;
bool found = false;
CVector<size_t> newlist;
for (size_t j=0; curlist[j].func != NULL; j++)
{
found = false;
for (size_t k=0; list[k].func != NULL; k++)
{
if (strcmp(curlist[j].name, list[k].name) == 0)
{
found = true;
break;
}
}
if (found)
{
changed = true;
//don't break, we have to search it all
} else {
newlist.push_back(j);
}
}
if (changed)
{
//now build the new list
AMX_NATIVE_INFO *rlist = new AMX_NATIVE_INFO[newlist.size()+1];
for (size_t j=0; j<newlist.size(); j++)
{
rlist[j].func = curlist[newlist[j]].func;
rlist[j].name = curlist[newlist[j]].name;
}
rlist[newlist.size()].func = NULL;
rlist[newlist.size()].name = NULL;
m_Natives[i] = rlist;
m_DestroyableIndexes.push_back(i);
}
}
}
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;
break;
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 {
m_Status = MODULE_BADLOAD;
}
if (m_Status == MODULE_LOADED)
{
AddLibrariesFromString(m_InfoNew.library, LibType_Library, LibSource_Module, this);
AddLibrariesFromString(m_InfoNew.libclass, LibType_Class, LibSource_Module, this);
return true; return true;
}
return false;
} }
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)
{
//backwards compat for new defs
if (ifVers == 3)
{
g_ModuleCallReason = ModuleCall_Query;
g_CurrentlyCalledModule = this;
retVal = (*queryFunc_New)(&ifVers, &m_InfoNew);
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
if (retVal == AMXX_OK)
{
m_InfoNew.library = m_InfoNew.logtag;
if (StrCaseStr(m_InfoNew.library, "sql")
|| StrCaseStr(m_InfoNew.library, "dbi"))
{
m_InfoNew.libclass = "DBI";
} else {
m_InfoNew.libclass = "";
}
break;
}
return false;
} else {
m_Status = MODULE_OLD;
return false; return false;
} }
if ( info->ivers != AMX_INTERFACE_VERSION ) { } else {
status = MODULE_OLD; m_Status = MODULE_NEWER;
return false; return false;
} }
AttachModule = (ATTACHMOD)DLPROC(module,"AMX_Attach"); // check for attach case AMXX_OK:
if ( AttachModule == 0) { break;
status = MODULE_NOATTACH; 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;
} }
info->serial = (long int)this;
status = MODULE_QUERY; // Check for attach
if (!DLPROC(m_Handle, "AMXX_Attach"))
{
m_Status = MODULE_NOATTACH;
return false;
}
m_Status = MODULE_QUERY;
return true; return true;
} else {
m_Status = MODULE_NOQUERY;
m_Amxx = false;
return false;
}
} }
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)(); RemoveLibraries(this);
DLFREE(module);
module = 0; if (m_Amxx)
natives.clear(); {
status = MODULE_NONE; DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
if (detachFunc_New)
{
g_ModuleCallReason = ModuleCall_Detach;
g_CurrentlyCalledModule = this;
(*detachFunc_New)();
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
}
}
#ifndef FAKEMETA
if (IsMetamod())
{
UnloadMetamodPlugin(m_Handle);
}
#endif
DLFREE(m_Handle);
clear();
return true; return true;
} }
const char* CModule::getStatus() const {
switch(status){ void CModule::CallPluginsUnloaded()
{
if (m_Status != MODULE_LOADED)
return;
if (!m_Handle)
return;
PLUGINSUNLOADED_NEW func = (PLUGINSUNLOADED_NEW)DLPROC(m_Handle, "AMXX_PluginsUnloaded");
if (!func)
return;
func();
}
void CModule::CallPluginsUnloading()
{
if (m_Status != MODULE_LOADED)
return;
if (!m_Handle)
return;
PLUGINSUNLOADING_NEW func = (PLUGINSUNLOADING_NEW)DLPROC(m_Handle, "AMXX_PluginsUnloading");
if (!func)
return;
func();
}
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

@ -36,49 +36,89 @@
#ifndef CMODULE_H #ifndef CMODULE_H
#define CMODULE_H #define CMODULE_H
enum MODULE_STATUS { enum MODULE_STATUS
MODULE_NONE, {
MODULE_QUERY, MODULE_NONE, // No module loaded
MODULE_BADLOAD, MODULE_QUERY, // Query failed
MODULE_LOADED, MODULE_BADLOAD, // Bad file or the module writer messed something up ;]
MODULE_NOINFO, MODULE_LOADED, // Loaded
MODULE_NOQUERY, MODULE_NOINFO, // No info
MODULE_NOATTACH, MODULE_NOQUERY, // No query function present
MODULE_OLD MODULE_NOATTACH, // No attach function present
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
const char *logtag; //added in version 2
const char *library; // added in version 4
const char *libclass; // added in version 4
};
#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 4
class CModule class CModule
{ {
String filename; String m_Filename; // Filename
bool metamod;
module_info_s* info;
DLHANDLE module;
MODULE_STATUS status;
bool m_Metamod; // Using metamod?
bool m_Amxx; // Using new module interface?
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();
// Interface // Interface
bool attachModule(); bool attachModule();
bool queryModule(); bool queryModule();
bool detachModule(); bool detachModule();
const char* getStatus() const; void rewriteNativeLists(AMX_NATIVE_INFO *list);
inline const char* getType() const { return metamod ? "amx&mm" : "amx"; }
inline const char* getAuthor() const { return info ? info->author : "unknown"; }
inline const char* getVersion() const { return info ? info->version : "unknown"; }
inline const char* getName() const { return info ? info->name : "unknown"; }
inline module_info_s* getInfo() const { return info; }
inline int getStatusValue() { return status; }
inline bool operator==( void* fname ) { return !strcmp( filename.str() , (char*)fname ); }
inline bool isReloadable() { return ( (status==MODULE_LOADED) && (info->type==RELOAD_MODULE)); }
CList<AMX_NATIVE_INFO*> natives;
};
#ifndef FAKEMETA
bool attachMetamod(const char *mmfile, PLUG_LOADTIME now);
#endif #endif
const char* getStatus() const;
inline const char* getType() const { return m_Amxx ? "amxx" : (m_Metamod ? "amx&mm" : "amx"); }
inline const char* getAuthor() const { return m_InfoNew.author; }
inline const char* getVersion() const { return m_InfoNew.version; }
inline const char* getName() const { return m_InfoNew.name; }
inline const amxx_module_info_s* getInfoNew() const { return &m_InfoNew; } // new
inline int getStatusValue() { return m_Status; }
inline bool operator==(const char* fname) { return !strcmp(m_Filename.c_str(), fname); }
inline bool isReloadable() { return ((m_Status == MODULE_LOADED) && (m_InfoNew.reload != 0)); }
inline bool isAmxx() const { return m_Amxx; }
inline const char *getMissingFunc() const { return m_MissingFunc; }
inline const char *getFilename() { return m_Filename.c_str(); }
inline bool IsMetamod() { return m_Metamod; }
void CallPluginsLoaded();
void CallPluginsUnloaded();
void CallPluginsUnloading();
CVector<AMX_NATIVE_INFO*> m_Natives;
CVector<AMX_NATIVE_INFO*> m_NewNatives; // Natives for new (AMXX, not AMX) plugins only
CVector<size_t> m_DestroyableIndexes;
};
#endif //CMODULE_H

View File

@ -29,174 +29,674 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "CPlugin.h" #include "CPlugin.h"
#include "CForward.h" #include "CForward.h"
#include "CFile.h" #include "CFile.h"
#include "amx.h"
#include "natives.h"
#include "debugger.h"
#include "libraries.h"
CPluginMngr::CPlugin* CPluginMngr::loadPlugin(const char* path, const char* name, char* error) { extern const char *no_function;
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;
*a = new CPlugin( pCounter++ ,path,name,error); while (*a)
return *error ? 0 : *a; a = &(*a)->next;
*a = new CPlugin(pCounter++, path, name, error, debug);
return (*a);
} }
void CPluginMngr::unloadPlugin( CPlugin** a ) { void CPluginMngr::unloadPlugin(CPlugin** a)
{
CPlugin* next = (*a)->next; CPlugin* next = (*a)->next;
delete *a; delete *a;
*a = next; *a = next;
--pCounter; --pCounter;
} }
int CPluginMngr::loadPluginsFromFile( const char* filename ) void CPluginMngr::Finalize()
{ {
File fp( build_pathname("%s",filename) , "r" ); if (m_Finalized)
return;
if ( !fp ) pNatives = BuildNativeTable();
CPlugin *a = head;
while (a)
{ {
UTIL_Log( "[AMXX] Plugins list not found (file \"%s\")",filename); if (a->getStatusCode() == ps_running)
{
amx_Register(a->getAMX(), pNatives, -1);
a->Finalize();
}
a = a->next;
}
m_Finalized = true;
}
int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
{
char file[256];
FILE *fp = fopen(build_pathname_r(file, sizeof(file) - 1, "%s", filename), "rt");
if (!fp)
{
if (warn)
{
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 = get_localinfo("amxx_pluginsdir", "addons/amxx/plugins"); int debugFlag = 0;
const char *pluginsDir = get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins");
String line;
while ( fp.getline(line , 255 ) ) List<String *>::iterator block_iter;
while (!feof(fp))
{ {
*pluginName = 0; pluginName[0] = '\0';
sscanf(line,"%s",pluginName);
if (!isalnum(*pluginName)) continue;
CPlugin* plugin = loadPlugin( pluginsDir , pluginName , error ); debug[0] = '\0';
debugFlag = 0;
if ( plugin != 0 ) // load_amxscript fills it with info in case of error line.clear();
line._fread(fp);
/** quick hack */
char *ptr = const_cast<char *>(line.c_str());
while (*ptr)
{ {
AMX* amx = plugin->getAMX(); if (*ptr == ';')
int iFunc;
if(amx_FindPublic(amx, "client_command" , &iFunc) == AMX_ERR_NONE)
g_forwards.registerForward( plugin , iFunc , FF_ClientCommand);
if(amx_FindPublic(amx, "client_connect" , &iFunc) == AMX_ERR_NONE)
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 ); *ptr = '\0';
} else {
ptr++;
} }
} }
sscanf(line.c_str(), "%s %s", pluginName, debug);
if (!isalnum(*pluginName))
{
continue;
}
if (isalnum(*debug) && !strcmp(debug, "debug"))
{
debugFlag = 1;
}
bool skip = false;
for (block_iter = m_BlockList.begin();
block_iter != m_BlockList.end();
block_iter++)
{
if ((*block_iter)->compare(pluginName) == 0)
{
skip = true;
break;
}
}
if (skip || !strcmp(debug, "disabled"))
{
continue;
}
CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, debugFlag);
if (plugin->getStatusCode() == ps_bad_load)
{
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;
} }
void CPluginMngr::clear() { void CPluginMngr::clear()
CPlugin**a = &head;
while ( *a )
unloadPlugin(a);
}
CPluginMngr::CPlugin* CPluginMngr::findPluginFast(AMX *amx)
{ {
return (CPlugin*)(amx->userdata[3]); CPlugin**a = &head;
/*CPlugin*a = head;
while ( a && &a->amx != amx ) while (*a)
a=a->next; unloadPlugin(a);
return a;*/
m_Finalized = false;
if (pNatives)
{
delete [] pNatives;
pNatives = NULL;
}
List<String *>::iterator iter = m_BlockList.begin();
while (iter != m_BlockList.end())
{
delete (*iter);
iter = m_BlockList.erase(iter);
}
m_BlockList.clear();
} }
CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx) { CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx)
{
CPlugin*a = head; CPlugin*a = head;
while ( a && &a->amx != amx )
a=a->next; while (a && &a->amx != amx)
a = a->next;
return a; return a;
} }
CPluginMngr::CPlugin* CPluginMngr::findPlugin(int index){ CPluginMngr::CPlugin* CPluginMngr::findPlugin(int index)
{
CPlugin*a = head; CPlugin*a = head;
while ( a && index--)
a=a->next; while (a && index--)
a = a->next;
return a; return a;
} }
CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name) { CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name)
if (!name) return 0; {
if (!name)
return 0;
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) )
a=a->next; while (a && strncmp(a->name.c_str(), name, len))
a = a->next;
return a; return a;
} }
const char* CPluginMngr::CPlugin::getStatus() const { const char* CPluginMngr::CPlugin::getStatus() const
switch(status){ {
case ps_running: return "running"; switch (status)
{
case ps_running:
{
if (m_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";
case ps_locked: return "locked"; case ps_locked: return "locked";
} }
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);
author.set(unk); title.assign(unk);
version.set(unk); author.assign(unk);
char* path = build_pathname("%s/%s",p,n); version.assign(unk);
char file[256];
char* path = build_pathname_r(file, sizeof(file) - 1, "%s/%s", p, n);
code = 0; code = 0;
int err = load_amxscript(&amx,&code,path,e ); memset(&amx, 0, sizeof(AMX));
if ( err == AMX_ERR_NONE ) status = ps_running; int err = load_amxscript(&amx, &code, path, e, d);
else status = ps_bad_load;
amx.userdata[3] = this; if (err == AMX_ERR_NONE)
{
status = ps_running;
} else {
status = ps_bad_load;
}
amx.userdata[UD_FINDPLUGIN] = this;
paused_fun = 0; paused_fun = 0;
next = 0; next = 0;
id = i; id = i;
}
CPluginMngr::CPlugin::~CPlugin( ){
unload_amxscript( &amx, &code );
}
void CPluginMngr::CPlugin::pauseFunction( int id ) { if (status == ps_running)
if (isValid()){ {
paused_fun |= (1<<id); m_PauseFwd = registerSPForwardByName(&amx, "plugin_pause", FP_DONE);
g_commands.clearBufforedInfo(); m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause", FP_DONE);
if (amx.flags & AMX_FLAG_DEBUG)
{
m_Debug = true;
} else {
m_Debug = false;
}
} }
} }
void CPluginMngr::CPlugin::unpauseFunction( int id ) { CPluginMngr::CPlugin::~CPlugin()
if (isValid()) { {
paused_fun &= ~(1<<id); unload_amxscript(&amx, &code);
g_commands.clearBufforedInfo(); }
int AMXAPI native_handler(AMX *amx, int index)
{
Handler *pHandler = (Handler *)amx->userdata[UD_HANDLER];
char name[sNAMEMAX + 1];
amx_GetNative(amx, index, name);
return pHandler->HandleNative(name, index, 0);
}
static cell AMX_NATIVE_CALL invalid_native(AMX *amx, cell *params)
{
//A script has accidentally called an invalid native! give them a
// first chance to block the resulting error.
Handler *pHandler = (Handler *)amx->userdata[UD_HANDLER];
//this should never happen
if (!pHandler)
{
LogError(amx, AMX_ERR_INVNATIVE, "Invalid native attempt");
return 0;
}
//this should never happen because this native won't be called
// if the plugin isn't filtering.
if (!pHandler->IsNativeFiltering())
{
LogError(amx, AMX_ERR_INVNATIVE, "Invalid native attempt");
return 0;
}
char name[sNAMEMAX + 1];
int native = (int)(_INT_PTR)(amx->usertags[UT_NATIVE]);
int err = amx_GetNative(amx, native, name);
if (err != AMX_ERR_NONE)
name[0] = '\0';
//1 - because we're trapping usage
if (!pHandler->HandleNative(name, native, 1))
{
amx->usertags[UT_NATIVE] = (void *)native;
LogError(amx, AMX_ERR_INVNATIVE, NULL);
return 0;
}
//Someday maybe allow native filters to write their own return value?
return 0;
}
void CPluginMngr::CPlugin::Finalize()
{
char buffer[128];
int old_status = status;
if (CheckModules(&amx, buffer))
{
if (amx_Register(&amx, core_Natives, -1) != AMX_ERR_NONE)
{
Handler *pHandler = (Handler *)amx.userdata[UD_HANDLER];
int res = 0;
if (pHandler->IsNativeFiltering())
res = amx_CheckNatives(&amx, native_handler);
if (!res)
{
status = ps_bad_load;
sprintf(buffer, "Plugin uses an unknown function (name \"%s\") - check your modules.ini.", no_function);
errorMsg.assign(buffer);
amx.error = AMX_ERR_NOTFOUND;
} else {
amx_RegisterToAny(&amx, invalid_native);
}
}
} else {
status = ps_bad_load;
errorMsg.assign(buffer);
amx.error = AMX_ERR_NOTFOUND;
}
if (old_status != status)
{
AMXXLOG_Log("[AMXX] Plugin \"%s\" failed to load: %s", name.c_str(), errorMsg.c_str());
} }
} }
void CPluginMngr::CPlugin::setStatus( int a ) {
void CPluginMngr::CPlugin::pauseFunction(int id)
{
}
void CPluginMngr::CPlugin::unpauseFunction(int id)
{
}
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
if (m_PauseFwd != -1)
executeForwards(m_PauseFwd);
setStatus(ps_paused);
}
}
// Unpause a plugin
void CPluginMngr::CPlugin::unpausePlugin()
{
if (isValid() && (getStatusCode() != ps_stopped))
{
// set status first so the function will be marked executable
setStatus(ps_running);
// call plugin_unpause if provided
if (m_UnpauseFwd != -1)
{
executeForwards(m_UnpauseFwd);
}
}
}
char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
{
List<plcache_entry *>::iterator iter;
plcache_entry *pl;
for (iter=m_plcache.begin(); iter!=m_plcache.end(); iter++)
{
pl = (*iter);
if (pl->path.compare(file) == 0)
{
bufsize = pl->bufsize;
return pl->buffer;
}
}
pl = new plcache_entry;
pl->file = new CAmxxReader(file, sizeof(cell));
pl->buffer = NULL;
if (pl->file->GetStatus() != CAmxxReader::Err_None ||
pl->file->IsOldFile())
{
delete pl->file;
delete pl;
return NULL;
}
pl->bufsize = pl->file->GetBufferSize();
if (pl->bufsize)
{
pl->buffer = new char[pl->bufsize];
pl->file->GetSection(pl->buffer);
}
if (!pl->buffer || pl->file->GetStatus() != CAmxxReader::Err_None)
{
delete [] pl->buffer;
delete pl->file;
delete pl;
return NULL;
}
pl->path.assign(file);
bufsize = pl->bufsize;
m_plcache.push_back(pl);
return pl->buffer;
}
void CPluginMngr::InvalidateCache()
{
List<plcache_entry *>::iterator iter;
plcache_entry *pl;
for (iter=m_plcache.begin(); iter!=m_plcache.end(); iter++)
{
pl = (*iter);
delete [] pl->buffer;
delete pl->file;
delete pl;
}
m_plcache.clear();
}
void CPluginMngr::InvalidateFileInCache(const char *file, bool freebuf)
{
List<plcache_entry *>::iterator iter;
plcache_entry *pl;
for (iter=m_plcache.begin(); iter!=m_plcache.end(); iter++)
{
pl = (*iter);
if (pl->path.compare(file) == 0)
{
if (freebuf)
delete [] pl->buffer;
delete pl->file;
delete pl;
m_plcache.erase(iter);
return;
}
}
}
void CPluginMngr::CacheAndLoadModules(const char *plugin)
{
size_t progsize;
char *prog = ReadIntoOrFromCache(plugin, progsize);
if (!prog)
return;
AMX_HEADER hdr;
memcpy(&hdr, prog, sizeof(AMX_HEADER));
uint16_t magic = hdr.magic;
amx_Align16(&magic);
if (magic != AMX_MAGIC)
{
return;
}
if (hdr.file_version < MIN_FILE_VERSION ||
hdr.file_version > CUR_FILE_VERSION)
{
return;
}
if ((hdr.defsize != sizeof(AMX_FUNCSTUB)) &&
(hdr.defsize != sizeof(AMX_FUNCSTUBNT)))
{
return;
}
amx_Align32((uint32_t*)&hdr.nametable);
uint16_t *namelength=(uint16_t*)((unsigned char*)prog + (unsigned)hdr.nametable);
amx_Align16(namelength);
if (*namelength>sNAMEMAX)
{
return;
}
if (hdr.stp <= 0)
{
return;
}
AMX amx;
memset(&amx, 0, sizeof(AMX));
amx.base = (unsigned char *)prog;
int num;
char name[sNAMEMAX+1];
num = amx_GetLibraries(&amx);
for (int i=0; i<num; i++)
{
amx_GetLibrary(&amx, i, name, sNAMEMAX);
if (stricmp(name, "Float")==0)
continue;
//awful backwards compat hack
if (stricmp(name, "socket")==0)
strcpy(name, "sockets");
//we don't want to report failed modules here...
LoadModule(name, PT_ANYTIME, true, true);
}
cell tag_id;
amx_NumTags(&amx, &num);
CVector<LibDecoder *> expects;
CVector<LibDecoder *> defaults;
CStack<LibDecoder *> delstack;
for (int i=0; i<num; i++)
{
amx_GetTag(&amx, i, name, &tag_id);
if (name[0] == '?')
{
LibDecoder *dc = new LibDecoder;
delstack.push(dc);
if (DecodeLibCmdString(name, dc))
{
if (dc->cmd == LibCmd_ForceLib)
{
RunLibCommand(dc);
} else if ( (dc->cmd == LibCmd_ExpectClass) ||
(dc->cmd == LibCmd_ExpectLib) )
{
expects.push_back(dc);
} else if (dc->cmd == LibCmd_DefaultLib) {
defaults.push_back(dc);
}
}
}
}
for (size_t i=0; i<expects.size(); i++)
{
RunLibCommand(expects[i]);
}
for (size_t i=0; i<defaults.size(); i++)
{
RunLibCommand(defaults[i]);
}
expects.clear();
defaults.clear();
while (!delstack.empty())
{
delete delstack.front();
delstack.pop();
}
return;
}
void CPluginMngr::CALMFromFile(const char *file)
{
char filename[256];
FILE *fp = fopen(build_pathname_r(filename, sizeof(filename) - 1, "%s", file), "rt");
if (!fp)
{
return;
}
// Find now folder
char pluginName[256];
char line[256];
String rline;
while (!feof(fp))
{
fgets(line, sizeof(line)-1, fp);
if (line[0] == ';' || line[0] == '\n' || line[0] == '\0')
{
continue;
}
/** quick hack */
char *ptr = line;
while (*ptr)
{
if (*ptr == ';')
{
*ptr = '\0';
} else {
ptr++;
}
}
rline.assign(line);
rline.trim();
pluginName[0] = '\0';
sscanf(rline.c_str(), "%s", pluginName);
/* HACK: see if there's a 'disabled' coming up
* new block for scopying flexibility
*/
if (1)
{
const char *_ptr = rline.c_str() + strlen(pluginName);
while (*_ptr != '\0' && isspace(*_ptr))
{
_ptr++;
}
if ((*_ptr != '\0') && !strcmp(_ptr, "disabled"))
{
String *pString = new String(pluginName);
m_BlockList.push_back(pString);
continue;
}
}
if (!isalnum(*pluginName))
{
continue;
}
build_pathname_r(filename, sizeof(filename)-1, "%s/%s", get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins"), pluginName);
CacheAndLoadModules(filename);
}
fclose(fp);
}

View File

@ -32,22 +32,27 @@
#ifndef PLUGIN_H #ifndef PLUGIN_H
#define PLUGIN_H #define PLUGIN_H
#include "CString.h"
#include "sh_list.h"
#include "amx.h"
#include "amxxfile.h"
// ***************************************************** // *****************************************************
// class CPluginMngr // class CPluginMngr
// ***************************************************** // *****************************************************
enum { enum
ps_bad_load, {
ps_error, ps_bad_load, //Load failed
ps_paused, ps_error, //Erroneous state
ps_running, ps_locked, //UNUSED
ps_stopped, ps_paused, //Plugin is temporarily paused
ps_locked ps_stopped, //Plugin is ... more temporarily paused
ps_running, //Plugin is running
}; };
class CPluginMngr class CPluginMngr
{ {
public: public:
class iterator; class iterator;
@ -59,62 +64,80 @@ public:
AMX amx; AMX amx;
void* code; void* code;
String name; String name;
String version; String version;
String title; String title;
String author; String author;
String errorMsg;
int m_PauseFwd;
int m_UnpauseFwd;
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( );
CPlugin(int i, const char* p, const char* n, char* e, int d);
~CPlugin();
bool m_Debug;
public: public:
inline const char* getName() { return name.c_str();}
inline const char* getName() const { return name.str();} inline const char* getVersion() { return version.c_str();}
inline const char* getVersion() const { return version.str();} inline const char* getTitle() { return title.c_str();}
inline const char* getTitle() const { return title.str();} inline const char* getAuthor() { return author.c_str();}
inline const char* getAuthor()const { return author.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 bool isValid() const { return ((status != ps_bad_load) && (status != ps_locked)); } inline void setVersion(const char* n) { version.assign(n); }
inline bool isPaused() const { return ( (status == ps_paused) || (status == ps_stopped)); } inline void setError(const char* n) { errorMsg.assign(n); }
inline bool isFunctionPaused( int id ) const { return (paused_fun & (1<<id)) ? true : false; } inline bool isValid() const { return (status >= ps_paused); }
inline bool isExecutable(int id) const { return (isValid() && !isPaused() && !isFunctionPaused(id)); } inline bool isPaused() const { return ((status == ps_paused) || (status == ps_stopped)); }
inline void pausePlugin( ) { if ( isValid() ) setStatus(ps_paused); } inline bool isExecutable(int id) const { return (isValid() && !isPaused()); }
inline void unpausePlugin( ) { if ( isValid() ) setStatus(ps_running); }
void pauseFunction( int id ); void Finalize();
void unpauseFunction( int id ); void pausePlugin();
void setStatus( int a ); void unpausePlugin();
void pauseFunction(int id);
void unpauseFunction(int id);
void setStatus(int a);
const char* getStatus() const; const char* getStatus() const;
inline bool isDebug() const { return m_Debug; }
}; };
private: private:
CPlugin *head; CPlugin *head;
int pCounter; int pCounter;
public: public:
CPluginMngr() { head = 0; pCounter = 0; } CPluginMngr() { head = 0; pCounter = 0; pNatives = NULL; m_Finalized=false;}
~CPluginMngr() { clear(); } ~CPluginMngr() { clear(); InvalidateCache(); }
bool m_Finalized;
AMX_NATIVE_INFO *pNatives;
// 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, bool warn=true);
CPlugin* findPluginFast(AMX *amx);
inline CPlugin* findPluginFast(AMX *amx) { return (CPlugin*)(amx->userdata[UD_FINDPLUGIN]); }
CPlugin* findPlugin(AMX *amx); CPlugin* findPlugin(AMX *amx);
CPlugin* findPlugin(int index); CPlugin* findPlugin(int index);
CPlugin* findPlugin(const char* name); CPlugin* findPlugin(const char* name);
inline int getPluginsNum() const { return pCounter; } inline int getPluginsNum() const { return pCounter; }
void Finalize();
void clear(); void clear();
class iterator { class iterator
{
CPlugin *a; CPlugin *a;
public: public:
iterator(CPlugin*aa) : a(aa) {} iterator(CPlugin*aa) : a(aa) {}
@ -124,10 +147,25 @@ public:
operator bool () const { return a ? true : false; } operator bool () const { return a ? true : false; }
CPlugin& operator*() { return *a; } CPlugin& operator*() { return *a; }
}; };
inline iterator begin() const { return iterator(head); } inline iterator begin() const { return iterator(head); }
inline iterator end() const { return iterator(0); } inline iterator end() const { return iterator(0); }
public:
struct plcache_entry
{
CAmxxReader *file;
size_t bufsize;
char *buffer;
String path;
};
char *ReadIntoOrFromCache(const char *file, size_t &bufsize);
void InvalidateCache();
void InvalidateFileInCache(const char *file, bool freebuf);
void CacheAndLoadModules(const char *plugin);
void CALMFromFile(const char *file);
private:
List<plcache_entry *> m_plcache;
List<String *> m_BlockList;
}; };
#endif #endif //PLUGIN_H

129
amxmodx/CQueue.h Executable file
View File

@ -0,0 +1,129 @@
/* 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,385 @@
* version. * version.
*/ */
#ifndef STRING_CUSTOM_H #ifndef _INCLUDE_CSTRING_H
#define STRING_CUSTOM_H #define _INCLUDE_CSTRING_H
// ***************************************************** #include <string.h>
// class String #include <stdio.h>
// *****************************************************
//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 ); a_size = 0;
inline bool empty() const { return (len == 0); } //assign("");
inline const char* str() const { return napis ? napis : "(null)"; } }
inline short int size() const { return len; }
void clear(); ~String()
{
if (v)
delete [] v;
}
String(const char *src)
{
v = NULL;
a_size = 0;
assign(src);
}
const char * _fread(FILE *fp)
{
Grow(512, false);
char *ret = fgets(v, 511, fp);
return ret;
}
String(const String &src)
{
v = NULL;
a_size = 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(size() + strlen(t) + 1);
strcat(v, t);
}
void append(const char c)
{
size_t len = size();
Grow(len + 2);
v[len] = c;
v[len + 1] = '\0';
}
void append(String &d)
{
append(d.c_str());
}
void assign(const String &src)
{
assign(src.c_str());
}
void assign(const char *d)
{
if (!d)
{
clear();
} else {
size_t len = strlen(d);
Grow(len + 1, false);
memcpy(v, d, len);
v[len] = '\0';
}
}
void clear()
{
if (v)
v[0] = '\0';
}
int compare (const char *d) const
{
if (!v)
return strcmp("", d);
else
return strcmp(v, d);
}
//Added this for amxx inclusion
bool empty()
{
if (!v)
return true;
if (v[0] == '\0')
return true;
return false;
}
size_t size()
{
if (v)
return strlen(v);
else
return 0;
}
int find(const char c, int index = 0)
{
int len = static_cast<int>(size());
if (len < 1)
return npos;
if (index >= len || index < 0)
return npos;
int i = 0;
for (i=index; i<len; 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 reparse_newlines()
{
size_t len = size();
int offs = 0;
char c;
if (!len)
return;
for (size_t i=0; i<len; i++)
{
c = v[i];
if (c == '^' && (i != len-1))
{
c = v[++i];
if (c == 'n')
c = '\n';
else if (c == 't')
c = '\t';
offs++;
}
v[i-offs] = c;
}
v[len-offs] = '\0';
}
void trim()
{
if (!v)
return;
unsigned int i = 0;
unsigned int j = 0;
size_t len = strlen(v);
if (len == 1)
{
if (is_space(v[i]))
{
clear();
return;
}
}
unsigned char c0 = v[0];
if (is_space(c0))
{
for (i=0; i<len; i++)
{
if (!is_space(v[i]) || (is_space(v[i]) && ((unsigned char)i==len-1)))
{
erase(0, i);
break;
}
}
}
len = strlen(v);
if (len < 1)
{
return;
}
if (is_space(v[len-1]))
{
for (i=len-1; i>=0; i--)
{
if (!is_space(v[i])
|| (is_space(v[i]) && i==0))
{
erase(i+1, j);
break;
}
j++;
}
}
if (len == 1)
{
if (is_space(v[0]))
{
clear();
return;
}
}
}
void erase(unsigned int start, int num = npos)
{
if (!v)
return;
unsigned int i = 0;
size_t len = size();
//check for bounds
if (num == npos || start+num > len-start)
num = len - start;
//do the erasing
bool copyflag = false;
for (i=0; i<len; i++)
{
if (i>=start && i<start+num)
{
if (i+num < len)
{
v[i] = v[i+num];
} else {
v[i] = 0;
}
copyflag = true;
} else if (copyflag) {
if (i+num < len)
{
v[i] = v[i+num];
} else {
v[i] = 0;
}
}
}
len -= num;
v[len] = 0;
}
String substr(unsigned int index, int num = npos)
{
if (!v)
{
String b("");
return b;
}
String ns;
size_t len = size();
if (index >= len || !v)
return ns;
if (num == npos)
{
num = len - index;
} else if (index+num >= len) {
num = len - index;
}
unsigned int i = 0;
unsigned int nslen = num + 2;
ns.Grow(nslen);
for (i=index; i<index+num; i++)
ns.append(v[i]);
return ns;
}
void toLower()
{
if (!v)
return;
unsigned int i = 0;
size_t len = strlen(v);
for (i=0; i<len; i++)
{
if (v[i] >= 65 && v[i] <= 90)
v[i] &= ~(1<<5);
}
}
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 > size() || !v)
{
return -1;
} else {
return v[index];
}
}
int at(int a)
{
if (a < 0 || a >= (int)size() || !v)
return -1;
return v[a];
}
bool at(int at, char c)
{
if (at < 0 || at >= (int)size() || !v)
return false;
v[at] = c;
return true;
}
private:
void Grow(unsigned int d, bool copy=true)
{
if (d <= a_size)
return;
char *n = new char[d + 1];
if (copy && v)
strcpy(n, v);
if (v)
delete [] v;
else
strcpy(n, "");
v = n;
a_size = d + 1;
}
char *v;
unsigned int a_size;
public:
static const int npos = -1;
}; };
#endif #endif //_INCLUDE_CSTRING_H

View File

@ -29,164 +29,267 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "CTask.h" #include "CTask.h"
/*********************** CTask ***********************/
CTaskMngr::CTask::CTask( CPluginMngr::CPlugin* p, int f, int flags, void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, cell iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime)
int i, float base, float exec, int parlen , {
const cell* par, int r){ clear();
plugin = p; m_bFree = false;
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 ) m_pPlugin = pPlugin;
m_iFunc = iFunc;
m_iId = iId;
m_fBase = fBase;
m_bInExecute = false;
if (iFlags & 2)
{ {
param = new cell[ parlen + 1 ]; m_bLoop = true;
m_iRepeat = -1;
}
else if (iFlags & 1)
{
m_bLoop = true;
m_iRepeat = iRepeat;
}
if ( param ){ m_bAfterStart = (iFlags & 4) ? true : false;
param_len = parlen + 1; m_bBeforeEnd = (iFlags & 8) ? true : false;
memcpy( param , par , sizeof( cell ) * parlen );
param[ parlen ] = 0; m_fNextExecTime = fCurrentTime + m_fBase;
if (iParamsLen)
{
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;
}
}
void CTaskMngr::CTask::clear()
{
m_bFree = true;
if (m_iFunc >= 0)
{
unregisterSPForward(m_iFunc);
m_iFunc = -1;
}
if (m_pParams)
{
delete [] m_pParams;
m_pParams = NULL;
}
m_pPlugin = NULL;
m_iId = 0;
m_fBase = 0.0f;
m_iRepeat = 0;
m_bLoop = false;
m_bAfterStart = false;
m_bBeforeEnd = false;
m_fNextExecTime = 0.0f;
}
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;
bool done = 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)
{
//only bother calling if we have something to call
if (!(m_bLoop && !m_iRepeat))
{
m_bInExecute = true;
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);
}
m_bInExecute = false;
}
if (isFree())
return;
// set new exec time OR remove the task if needed
if (m_bLoop)
{
if (m_iRepeat != -1 && --m_iRepeat <= 0)
done = true;
} else {
done = true;
}
if (done)
{
clear();
} else {
m_fNextExecTime += m_fBase;
} }
} }
} }
CTaskMngr::CTask* CTaskMngr::getFirstValidTask(CTask* h){ CTaskMngr::CTask::CTask()
CTask* a = h; {
while( a ) { m_bFree = true;
if ( a->isRemoved() ) {
CTask* b = a->next; m_pPlugin = NULL;
unlink( a ); m_iFunc = -1;
delete a; m_iId = 0;
a = b; m_fBase = 0.0f;
continue;
} m_iRepeat = 0;
else if ( a->afterstart ){ m_bLoop = false;
if ( *m_timer - *m_timeleft + 1 < a->base_time ) { m_bAfterStart = false;
a = a->next; m_bBeforeEnd = false;
continue; m_bInExecute = false;
}
} m_fNextExecTime = 0.0f;
else if ( a->beforeend ){
if ( *m_timelimit == 0 ){ m_iParamLen = 0;
a = a->next; m_pParams = NULL;
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 ) {
tail = head->next;
delete head;
head = tail;
}
}
void CTaskMngr::registerTimers( float* timer , float* timelimit, float* timeleft ) { CTaskMngr::CTaskMngr()
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){ CTaskMngr::~CTaskMngr()
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; clear();
}
void CTaskMngr::registerTimers(float *pCurrentTime, float *pTimeLimit, float *pTimeLeft)
{
m_pTmr_CurrentTime = pCurrentTime;
m_pTmr_TimeLimit = pTimeLimit;
m_pTmr_TimeLeft = pTimeLeft;
}
void CTaskMngr::registerTask(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, cell iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat)
{
// 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; int i = 0;
while ( (a = findTask(id, amx )) != 0 ) { while (iter)
a->setToRemove(); {
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,97 +32,99 @@
#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
friend class iterator; CPluginMngr::CPlugin *m_pPlugin;
friend class CTaskMngr; cell m_iId;
int m_iFunc;
int m_iRepeat;
CPluginMngr::CPlugin* plugin; bool m_bInExecute;
int id; bool m_bLoop;
int func; bool m_bAfterStart;
int repeat; bool m_bBeforeEnd;
bool loop; float m_fBase; // for normal tasks, stores the interval, for the others, stores the amount of time before start / after end
bool afterstart; int m_iParamLen;
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; }
cell *m_pParams;
bool m_bFree;
// execution
float m_fNextExecTime;
public: public:
void set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, cell iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime);
void clear();
bool isFree() const;
inline int getParamLen() { return param_len; } inline CPluginMngr::CPlugin *getPlugin() const { return m_pPlugin; }
inline int getTaskId() { return id; } inline AMX *getAMX() const { return m_pPlugin->getAMX(); }
inline int getFunction() { return func; } inline int getTaskId() const { return m_iId; }
cell* getParam() { return param; }
CPluginMngr::CPlugin* getPlugin() { return plugin; } void executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft); // also removes the task if needed
void changeBase(float fNewBase);
void resetNextExecTime(float fCurrentTime);
inline bool inExecute() const { return m_bInExecute; }
bool shouldRepeat();
CTask();
~CTask();
}; };
class CTaskDescriptor
{
public:
cell 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;
}
private: friend bool operator == (const CTask &left, const CTaskDescriptor &right)
{
if (right.m_bFree)
return (left.isFree() && !left.inExecute());
friend class iterator; return (!left.isFree()) &&
CTask *head; (right.m_pAmx ? left.getAMX() == right.m_pAmx : true) &&
CTask *tail; (left.getTaskId() == right.m_iId);
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);
/*** 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: public:
CTaskMngr(); CTaskMngr();
~CTaskMngr(); ~CTaskMngr();
// Interface 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, cell 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 registerTimers( float* timer , float* timelimit, float* timeleft ); void startFrame();
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();
class iterator {
CTaskMngr* b;
CTask* a;
public:
iterator(CTask*aa,CTaskMngr* bb) : a(aa), b(bb) {}
iterator& operator++() {
a = b->getNextTask( a );
a = b->getFirstValidTask( a );
return *this;
}
CTask& operator*() { return *a; }
operator bool ( ) const { return a ? true : false; }
};
inline iterator begin() { return iterator(getFirstValidTask(head),this); }
}; };
#endif #endif //CTASK_H

View File

@ -29,55 +29,57 @@
* 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
// ***************************************************** // *****************************************************
bool Vault::exists( const char* k )
{
if ( *k == 0 ) return false;
return *find( k ) != 0; bool Vault::exists(const char* k)
{
if (*k == 0) return false;
return *find(k) != 0;
} }
void Vault::put( const char* k, const char* v ) void Vault::put(const char* k, const char* v)
{ {
if ( *k == 0 ) return; if (*k == 0) return;
if ( *v == 0 ) if (*v == 0)
{ {
remove( k ); remove(k);
return; return;
} }
Obj** a = find( k ); Obj** a = find(k);
if ( *a ) if (*a)
{ {
(*a)->value.set(v); (*a)->value.assign(v);
(*a)->number = atoi( v ); (*a)->number = atoi(v);
} }
else else
*a = new Obj( k , v ); *a = new Obj(k, v);
} }
Vault::Obj::Obj( const char* k, const char* v): key(k) , value(v) , next(0) { Vault::Obj::Obj(const char* k, const char* v): key(k), value(v), next(0)
{
number = atoi(v); number = atoi(v);
} }
Vault::Obj** Vault::find( const char* n ) Vault::Obj** Vault::find(const char* n)
{ {
Obj** a = &head; Obj** a = &head;
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;
@ -87,31 +89,31 @@ Vault::Obj** Vault::find( const char* n )
} }
int Vault::get_number( const char* n ) int Vault::get_number(const char* n)
{ {
if ( *n == 0 ) return 0; if (*n == 0) return 0;
Obj* b = *find( n ); Obj* b = *find(n);
if ( b == 0 ) return 0; if (b == 0) return 0;
return b->number; return b->number;
} }
const char* Vault::get( const char* n ) const char* Vault::get(const char* n)
{ {
if ( *n == 0 ) return ""; if (*n == 0) return "";
Obj* b = *find( n ); Obj* b = *find(n);
if ( b == 0 ) return ""; if (b == 0) return "";
return b->value.str(); return b->value.c_str();
} }
void Vault::clear() void Vault::clear()
{ {
while ( head ) while (head)
{ {
Obj* a = head->next; Obj* a = head->next;
delete head; delete head;
@ -119,58 +121,57 @@ void Vault::clear()
} }
} }
void Vault::remove( const char* n ) void Vault::remove(const char* n)
{ {
Obj** b = find( n ); Obj** b = find(n);
if ( *b == 0 ) return; if (*b == 0) return;
Obj* a = (*b)->next; Obj* a = (*b)->next;
delete *b; delete *b;
*b = a; *b = a;
} }
void Vault::setSource( const char* n ) void Vault::setSource(const char* n)
{ {
path.set(n); path.assign(n);
} }
bool Vault::loadVault()
bool Vault::loadVault( )
{ {
if ( path.empty() ) return false; if (path.empty()) return false;
clear(); clear();
File a( path.str() , "r" ); File a(path.c_str(), "r");
if ( !a ) return false; if (!a) return false;
const int sz = 512; const int sz = 512;
char value[sz+1]; char value[sz + 1];
char key[sz+1]; char key[sz + 1];
while ( a >> key && a.skipWs() && a.getline( value , sz ) ) while (a >> key && a.skipWs() && a.getline(value, sz))
{ {
if ( isalpha ( *key ) ) if (isalpha(*key))
put( key, value ); put(key, value);
} }
return true; return true;
} }
bool Vault::saveVault( ) 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;
a << "; Don't modify!" << '\n'; a << "; Don't modify!" << '\n';
for (Obj* b = head; b ;b = b->next) for (Obj* b = head; b; b = b->next)
a << b->key << '\t' << b->value << '\n'; a << b->key << '\t' << b->value << '\n';
return true; return true;

View File

@ -45,38 +45,43 @@ class Vault
{ {
String key; String key;
String value; String value;
int number; int number;
Obj *next; Obj *next;
Obj( const char* k, const char* v); Obj(const char* k, const char* v);
} *head; } *head;
String path; String path;
Obj** find( const char* n ); Obj** find(const char* n);
public: public:
Vault() {head=0;} Vault() { head = 0; }
~Vault() { clear();} ~Vault() { clear(); }
// Interface // Interface
bool exists( const char* k ); bool exists(const char* k);
void put(const char* k, const char* v); void put(const char* k, const char* v);
void remove( const char* k ); void remove(const char* k);
const char* get( const char* n );
int get_number( const char* n ); const char* get(const char* n);
void setSource( const char* n ); int get_number(const char* n);
bool loadVault( ); void setSource(const char* n);
bool saveVault( );
bool loadVault();
bool saveVault();
void clear(); void clear();
class iterator
class iterator { {
Obj * a; Obj * a;
public: public:
iterator(Obj*aa) : a(aa) {} iterator(Obj* aa) : a(aa) {}
iterator& operator++() { if ( a ) a = a->next; return *this; } iterator& operator++() { if (a) a = a->next; return *this; }
bool operator==(const iterator& b) const { return a == b.a; } bool operator==(const iterator& b) const { return a == b.a; }
bool operator!=(const iterator& b) const { return !operator==(b); } bool operator!=(const iterator& b) const { return !operator==(b); }
String& key() const { return a->key; } String& key() const { return a->key; }
@ -87,7 +92,4 @@ public:
inline iterator end() const { return iterator(0); } inline iterator end() const { return iterator(0); }
}; };
#endif #endif //VAULT_CUSTOM_H

491
amxmodx/CVector.h Executable file
View File

@ -0,0 +1,491 @@
/* 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)
{
for (size_t i=0; i<m_CurrentUsedSize; i++)
newData[i] = m_Data[i];
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;
if (!size)
{
if (m_Data)
{
delete [] m_Data;
m_Data = NULL;
m_Size = 0;
}
return true;
}
T *newData = new T[size];
if (!newData)
return false;
if (m_Data)
{
size_t end = (m_CurrentUsedSize < size) ? (m_CurrentUsedSize) : size;
for (size_t i=0; i<end; i++)
newData[i] = m_Data[i];
delete [] m_Data;
}
m_Data = newData;
m_Size = size;
if (m_CurrentUsedSize > m_Size)
m_CurrentUsedSize = m_Size;
return true;
}
void FreeMemIfPossible()
{
if (!m_Data)
return;
if (!m_CurrentUsedSize)
{
ChangeSize(0);
return;
}
size_t newSize = m_Size;
while (m_CurrentUsedSize <= newSize / 2)
newSize /= 2;
if (newSize != m_Size)
ChangeSize(newSize);
}
protected:
T *m_Data;
size_t m_Size;
size_t m_CurrentUsedSize;
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_CurrentUsedSize];
m_Size = other.m_CurrentUsedSize;
m_CurrentUsedSize = other.m_CurrentUsedSize;
for (size_t i=0; i<other.m_CurrentUsedSize; i++)
m_Data[i] = other.m_Data[i];
}
~CVector<T>()
{
clear();
}
// interface
size_t size() const
{
return m_CurrentUsedSize;
}
size_t capacity() const
{
return m_Size;
}
iterator begin() const
{
return iterator(m_Data);
}
iterator end() const
{
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)
{
if (newSize > m_Size)
return ChangeSize(newSize);
return true;
}
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;
FreeMemIfPossible();
}
bool resize(size_t newSize)
{
if (!ChangeSize(newSize))
return false;
m_CurrentUsedSize = newSize;
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];
}
iterator insert(iterator where, const T & value)
{
// validate iter
if (where < m_Data || where > (m_Data + m_CurrentUsedSize))
return iterator(0);
size_t ofs = where - begin();
++m_CurrentUsedSize;
if (!GrowIfNeeded())
{
--m_CurrentUsedSize;
return false;
}
where = begin() + ofs;
// Move subsequent entries
for (T *ptr = m_Data + m_CurrentUsedSize - 2; ptr >= where.base(); --ptr)
*(ptr + 1) = *ptr;
*where.base() = value;
return where;
}
iterator erase(iterator where)
{
// validate iter
if (where < m_Data || where >= (m_Data + m_CurrentUsedSize))
return iterator(0);
size_t ofs = where - begin();
if (m_CurrentUsedSize > 1)
{
// move
T *theend = m_Data + m_CurrentUsedSize;
for (T *ptr = where.base() + 1; ptr < theend; ++ptr)
*(ptr - 1) = *ptr;
}
--m_CurrentUsedSize;
FreeMemIfPossible();
return begin() + ofs;
}
void clear()
{
m_Size = 0;
m_CurrentUsedSize = 0;
if (m_Data)
{
delete [] m_Data;
m_Data = NULL;
}
}
};
#endif // __CVECTOR_H__

BIN
amxmodx/JIT/amxexecn.o Executable file

Binary file not shown.

BIN
amxmodx/JIT/amxexecn.obj Executable file

Binary file not shown.

BIN
amxmodx/JIT/amxjitsn.o Executable file

Binary file not shown.

BIN
amxmodx/JIT/amxjitsn.obj Executable file

Binary file not shown.

BIN
amxmodx/JIT/helpers-x86.o Normal file

Binary file not shown.

BIN
amxmodx/JIT/helpers-x86.obj Normal file

Binary file not shown.

BIN
amxmodx/JIT/natives-amd64.o Executable file

Binary file not shown.

BIN
amxmodx/JIT/natives-x86.o Executable file

Binary file not shown.

BIN
amxmodx/JIT/natives-x86.obj Executable file

Binary file not shown.

View File

@ -1,116 +1,118 @@
MODNAME = amxx_mm #(C)2004-2005 AMX Mod X Development Team
SRCFILES = meta_api.cpp CFile.cpp CString.cpp CVault.cpp vault.cpp\ # Makefile written by David "BAILOPAN" Anderson
float.cpp file.cpp modules.cpp CMisc.cpp CTask.cpp string.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
CSRCFILES = amx.c amxcore.c amxtime.c power.c
EXTRA_LIBS_LINUX = HLSDK = ../../hlsdk
EXTRA_LIBS_WIN32 = MM_ROOT = ../metamod/metamod
EXTRA_LIBDIRS_LINUX = -Lextra/lib_linux
EXTRA_LIBDIRS_WIN32 = -Lextra/lib_win32
EXTRA_INCLUDEDIRS = -Iextra/include ### EDIT BELOW FOR OTHER PROJECTS ###
EXTRA_FLAGS = -Dstrcmpi=strcasecmp OPT_FLAGS = -O2 -fno-strict-aliasing -funroll-loops -s -fomit-frame-pointer -pipe
DEBUG_FLAGS = -g -ggdb3
CPP = gcc-4.1
NAME = amxmodx
SDKTOP=../hlsdk BIN_SUFFIX_32 = mm_i386.so
METADIR=../metamodx BIN_SUFFIX_64 = mm_amd64.so
OBJECTS = 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 amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp sorting.cpp \
amxmod_compat.cpp
SDKSRC=$(SDKTOP)/SourceCode LINK = -lgcc -static-libgcc
OBJDIR_LINUX=obj.linux
OBJDIR_WIN32=obj.win32
SRCDIR=.
ifdef windir INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \
OS=WIN32 -I$(MM_ROOT) -Lzlib -I$(HLSDK)/common
else
OS=LINUX GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1)
ifeq "$(GCC_VERSION)" "4"
OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden
endif endif
CC_LINUX=gcc-2.95 ifeq "$(DEBUG)" "true"
ifeq "$(OS)" "WIN32" BIN_DIR = Debug
CC_WIN32=gcc CFLAGS = $(DEBUG_FLAGS)
LD_WINDLL=dllwrap
DEFAULT=win32
CLEAN=clean_win32
else else
CC_WIN32=/usr/local/cross-tools/i386-mingw32msvc/bin/gcc BIN_DIR = Release
LD_WINDLL=/usr/local/cross-tools/bin/i386-mingw32msvc-dllwrap CFLAGS = $(OPT_FLAGS)
DEFAULT=linux win32
CLEAN=clean_both
endif endif
ifeq "$(BINLOG)" "true"
NAME := $(NAME)_bl
LIBFILE_LINUX = $(MODNAME)_i386.so BIN_DIR := $(BIN_DIR)BinLog
LIBFILE_WIN32 = $(MODNAME).dll OBJECTS += binlog.cpp
TARGET_LINUX = $(OBJDIR_LINUX)/$(LIBFILE_LINUX) CFLAGS += -DBINLOG_ENABLED
TARGET_WIN32 = $(OBJDIR_WIN32)/$(LIBFILE_WIN32)
FILES_ALL = *.cpp *.h [A-Z]* *.rc
ifeq "$(OS)" "LINUX"
ASRCFILES := $(shell ls -t $(SRCFILES))
else
ASRCFILES := $(shell dir /b)
endif endif
OBJ_LINUX := $(SRCFILES:%.cpp=$(OBJDIR_LINUX)/%.o)
OBJC_LINUX := $(CSRCFILES:%.c=$(OBJDIR_LINUX)/%.o)
OBJ_WIN32 := $(SRCFILES:%.cpp=$(OBJDIR_WIN32)/%.o)
OBJC_WIN32 := $(CSRCFILES:%.c=$(OBJDIR_WIN32)/%.o)
CFLAGS += -DLINUX -DNDEBUG -DAMX_NOPROPLIST -fPIC -Wall -Werror -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
CCOPT = -O2 -march=i586 -ffast-math -funroll-loops \ ifeq "$(AMD64)" "true"
-fomit-frame-pointer -fexpensive-optimizations -malign-loops=2 \ BINARY = $(NAME)_$(BIN_SUFFIX_64)
-malign-jumps=2 -malign-functions=2 -s -DNDEBUG CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -DAMD64 -m64
LINK += -lz64
OBJECTS += JIT/natives-amd64.o
else
BINARY = $(NAME)_$(BIN_SUFFIX_32)
OBJECTS += JIT/amxexecn.o JIT/amxjitsn.o JIT/natives-x86.o
OBJECTS += JIT/helpers-x86.o
CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32
LINK += -lz
OPT_FLAGS += -march=i586
endif
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) OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o)
CFLAGS=-Wall -Wno-unknown-pragmas
ODEF = -DOPT_TYPE=\"optimized\"
CFLAGS:=$(CCOPT) $(CFLAGS) $(ODEF) $(EXTRA_FLAGS)
DO_CC_LINUX=$(CC_LINUX) $(CFLAGS) -fPIC $(INCLUDEDIRS) -o $@ -c $< $(BIN_DIR)/%.o: %.cpp
DO_CC_WIN32=$(CC_WIN32) $(CFLAGS) $(INCLUDEDIRS) -o $@ -c $< $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $<
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 $@
$(OBJDIR_LINUX)/%.o: $(SRCDIR)/%.c all:
$(DO_CC_LINUX) mkdir -p $(BIN_DIR)
$(MAKE) amxmodx
$(OBJDIR_LINUX)/%.o: $(SRCDIR)/%.cpp amd64:
$(DO_CC_LINUX) rm -f zlib/libz.a
$(MAKE) all AMD64=true
$(OBJDIR_WIN32)/%.o: $(SRCDIR)/%.c amd64_debug:
$(DO_CC_WIN32) rm -f zlib/libz.a
$(MAKE) all AMD64=true DEBUG=true
$(OBJDIR_WIN32)/%.o: $(SRCDIR)/%.cpp amd64_binlog:
$(DO_CC_WIN32) rm -f zlib/libz.a
$(MAKE) all AMD64=true BINLOG=true
default: $(DEFAULT) amd64_binlog_debug:
rm -f zlib/libz.a
$(MAKE) all AMD64=true BINLOG=true DEBUG=true
$(TARGET_LINUX): $(OBJDIR_LINUX) $(OBJ_LINUX) $(OBJC_LINUX) binlog:
$(LINK_LINUX) $(MAKE) all BINLOG=true
$(TARGET_WIN32): $(OBJDIR_WIN32) $(OBJ_WIN32) $(OBJC_WIN32) binlog_debug:
$(LINK_WIN32) $(MAKE) all BINLOG=true DEBUG=true
$(OBJDIR_LINUX): amxmodx: $(OBJ_LINUX)
mkdir $@ $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY)
$(OBJDIR_WIN32): debug:
mkdir $@ $(MAKE) all DEBUG=true
win32: $(TARGET_WIN32) default: all
linux: $(TARGET_LINUX)
clean: $(CLEAN)
clean_both:
-rm -f $(OBJDIR_LINUX)/*
-rm -f $(OBJDIR_WIN32)/*
clean_win32:
del /q $(OBJDIR_WIN32)
clean:
rm -rf Release/*.o
rm -rf Release/$(NAME)_$(BIN_SUFFIX_32)
rm -rf Release/$(NAME)_$(BIN_SUFFIX_64)
rm -rf ReleaseBinLog/*.o
rm -rf ReleaseBinLog/$(NAME)_bl_$(BIN_SUFFIX_32)
rm -rf ReleaseBinLog/$(NAME)_bl_$(BIN_SUFFIX_64)
rm -rf Debug/*.o
rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32)
rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64)
rm -rf DebugBinLog/*.o
rm -rf DebugBinLog/$(NAME)_bl_$(BIN_SUFFIX_32)
rm -rf DebugBinLog/$(NAME)_bl_$(BIN_SUFFIX_64)

4183
amxmodx/amx.cpp Executable file

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/* Abstract Machine for the Small compiler /* Pawn Abstract Machine (for the Pawn language)
* *
* Copyright (c) ITB CompuPhase, 1997-2003 * Copyright (c) ITB CompuPhase, 1997-2005
* *
* 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,18 +10,46 @@
* 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:
* *
* 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__
#if defined FREEBSD && !defined __FreeBSD__
#define __FreeBSD__
#endif
#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
#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 HAVE_STDINT_H
#include <stdint.h>
#else
#if defined __LCC__ || defined __DMC__ || defined LINUX
#if defined HAVE_INTTYPES_H
#include <inttypes.h>
#else
#include <stdint.h>
#endif
#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 __MACH__
#include <stdint.h> #include <ppc/types.h>
typedef unsigned short int uint16_t;
typedef unsigned long int uint32_t;
#elif defined __FreeBSD__
#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;
@ -32,16 +60,42 @@
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
#define HAVE_STDINT_H
#endif
#if defined _LP64 || defined WIN64 || defined _WIN64
#if !defined __64BIT__
#define __64BIT__
#endif #endif
#endif #endif
#if defined __WIN32__ || defined _WIN32 || defined WIN32 || defined __MSDOS__
#if !defined alloca #if !defined arraysize
#define alloca(n) _alloca(n) #define arraysize(array) (sizeof(array) / sizeof((array)[0]))
#endif
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#if defined PAWN_DLL
#if !defined AMX_NATIVE_CALL
#define AMX_NATIVE_CALL __stdcall
#endif
#if !defined AMXAPI
#define AMXAPI __stdcall
#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
@ -52,6 +106,8 @@ extern "C" {
#define AMXAPI __stdcall #define AMXAPI __stdcall
#elif defined CDECL #elif defined CDECL
#define AMXAPI __cdecl #define AMXAPI __cdecl
#elif defined GCC_HASCLASSVISIBILITY
#define AMXAPI __attribute__ ((visibility("default")))
#else #else
#define AMXAPI #define AMXAPI
#endif #endif
@ -59,6 +115,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
@ -68,47 +125,75 @@ extern "C" {
* 5 (tagnames table) 4 * 5 (tagnames table) 4
* 6 (reformatted header) 6 * 6 (reformatted header) 6
* 7 (name table, opcodes SYMTAG & SYSREQ.D) 7 * 7 (name table, opcodes SYMTAG & SYSREQ.D) 7
* 8 (opcode STMT, renewed debug interface) 8
*/ */
#define CUR_FILE_VERSION 7 /* current file version; also the current AMX version */ #define CUR_FILE_VERSION 8 /* 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 8 /* minimum AMX version needed to support the current file format */
#if !defined CELL_TYPE
#define CELL_TYPE #if !defined PAWN_CELL_SIZE
#if defined(BIT16) #define PAWN_CELL_SIZE 32 /* by default, use 32-bit cells */
typedef uint16_t ucell; /* only for type casting */ #endif
#if PAWN_CELL_SIZE==16
typedef uint16_t ucell;
typedef int16_t cell; typedef int16_t cell;
#else #elif PAWN_CELL_SIZE==32
typedef uint32_t ucell; typedef uint32_t ucell;
typedef int32_t cell; typedef int32_t cell;
#endif #define REAL float
#elif PAWN_CELL_SIZE==64
typedef uint64_t ucell;
typedef int64_t cell;
#define REAL double
#else
#error Unsupported cell size (PAWN_CELL_SIZE)
#endif #endif
#define UNPACKEDMAX ((1L << (sizeof(cell)-1)*8) - 1)
#define UNLIMITED (~1u >> 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_NATIVE_FILTER)(struct tagAMX *amx, int index);
#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" */
#if _MSC_VER >= 1400
// MSVC8 - Replace POSIX stricmp with ISO C++ conformant one as it is deprecated
#define stricmp _stricmp
// Need this because of some stupid bug
#pragma warning (disable : 4996)
#endif
#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__) && !defined AMX_NO_ALIGN
#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 || defined __FreeBSD__
#pragma pack(1) /* structures must be packed (byte-aligned) */ #pragma pack(1) /* structures must be packed (byte-aligned) */
#elif defined MACOS && defined __MWERKS__
#pragma options align=mac68k
#else #else
#pragma pack(push) #pragma pack(push)
#pragma pack(1) /* structures must be packed (byte-aligned) */ #pragma pack(1) /* structures must be packed (byte-aligned) */
@ -117,22 +202,31 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
#endif #endif
#endif #endif
#endif #endif
typedef struct {
char _FAR *name PACKED; typedef struct tagAMX_NATIVE_INFO {
const char _FAR *name PACKED;
AMX_NATIVE func PACKED; AMX_NATIVE func PACKED;
} AMX_NATIVE_INFO PACKED; } 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; char name[sEXPMAX+1];
} AMX_FUNCSTUB PACKED; } PACKED AMX_FUNCSTUB;
typedef struct tagFUNCSTUBNT {
ucell address PACKED;
ucell nameofs PACKED; //we need this for amxx to be backwards comaptible
} PACKED AMX_FUNCSTUBNT;
/* 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.
*/ */
typedef struct tagAMX { typedef struct tagAMX {
unsigned char _FAR *base PACKED; /* points to the AMX header ("amxhdr") plus the code, optionally also the data */ unsigned char _FAR *base PACKED; /* points to the AMX header plus the code, optionally also the data */
unsigned char _FAR *data PACKED; /* points to separate data+stack+heap, may be NULL */ unsigned char _FAR *data PACKED; /* points to separate data+stack+heap, may be NULL */
AMX_CALLBACK callback PACKED; AMX_CALLBACK callback PACKED;
AMX_DEBUG debug PACKED; /* debug callback */ AMX_DEBUG debug PACKED; /* debug callback */
@ -144,38 +238,35 @@ typedef struct tagAMX {
cell stk PACKED; /* stack pointer: 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 */ cell stp PACKED; /* top of the stack: relative to base + amxhdr->dat */
int flags PACKED; /* current status, see amx_Flags() */ 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 */ /* user data */
long usertags[AMX_USERNUM] PACKED; void _FAR *usertags[AMX_USERNUM] PACKED;
//okay userdata[3] in AMX Mod X is for the CPlugin * pointer
//we're also gonna set userdata[2] to a special debug structure
//lastly, userdata[1] is for opcode_list from amx_BrowseRelocate
void _FAR *userdata[AMX_USERNUM] PACKED; void _FAR *userdata[AMX_USERNUM] PACKED;
/* native functions can raise an error */ /* native functions can raise an error */
int error PACKED; int error PACKED;
/* passing parameters requires a "count" field */
int paramcount;
/* the sleep opcode needs to store the full AMX status */ /* the sleep opcode needs to store the full AMX status */
cell pri PACKED; cell pri PACKED;
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 } PACKED 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.
*/ */
typedef struct tagAMX_HEADER { typedef struct tagAMX_HEADER {
int32_t size PACKED; /* size of the "file" */ int32_t size PACKED; /* size of the "file" */
uint16_t magic PACKED; /* signature */ uint16_t magic PACKED; /* signature */
char file_version PACKED; /* file format version */ char file_version; /* file format version */
char amx_version PACKED; /* required version of the AMX */ char amx_version; /* required version of the AMX */
int16_t flags PACKED; int16_t flags PACKED;
int16_t defsize PACKED; /* size of a definition record */ int16_t defsize PACKED; /* size of a definition record */
int32_t cod PACKED; /* initial value of COD - code block */ int32_t cod PACKED; /* initial value of COD - code block */
@ -188,9 +279,12 @@ typedef struct tagAMX_HEADER {
int32_t libraries PACKED; /* offset to the table of libraries */ int32_t libraries PACKED; /* offset to the table of libraries */
int32_t pubvars PACKED; /* the "public variables" table */ int32_t pubvars PACKED; /* the "public variables" table */
int32_t tags PACKED; /* the "public tagnames" table */ int32_t tags PACKED; /* the "public tagnames" table */
int32_t nametable PACKED; /* name table, file version 7 only */ int32_t nametable PACKED; /* name table */
} AMX_HEADER PACKED; } PACKED AMX_HEADER;
//This is always the same for us
#define AMX_MAGIC 0xf1e0 #define AMX_MAGIC 0xf1e0
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 */
@ -206,6 +300,9 @@ 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_INVSTATE, /* invalid state for this access */
AMX_ERR_INVNATIVE, /* invalid native was used */
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 */
@ -217,92 +314,154 @@ enum {
AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */
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 */
AMX_ERR_GENERAL, /* general error (unknown or unspecific error) */
}; };
enum {
DBG_INIT, /* query/initialize */ /* AMX_FLAG_CHAR16 0x01 no longer used */
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 */
};
#define AMX_FLAG_CHAR16 0x01 /* characters are 16-bit */
#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_BYTEOPC 0x08 /* opcode is a byte (not a cell) */
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking */ #define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking; no STMT opcode */
#define AMX_FLAG_BROWSE 0x4000 /* browsing/relocating or executing */ #define AMX_FLAG_OLDFILE 0x20 /* Old AMX Mod plugin */
#define AMX_FLAG_PRENIT 0x100 /* pre-initialized, do not check natives */
#define AMX_FLAG_NTVREG 0x1000 /* all native functions are registered */
#define AMX_FLAG_JITC 0x2000 /* abstract machine is JIT compiled */
#define AMX_FLAG_BROWSE 0x4000 /* busy browsing */
#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
#if !defined AMX_COMPACTMARGIN
#define AMX_COMPACTMARGIN 64
#endif
#define UD_FINDPLUGIN 3
#define UD_DEBUGGER 2
#define UD_OPCODELIST 1
#define UD_HANDLER 0
#define UT_NATIVE 3
#define UT_OPTIMIZER 2
#define UT_BROWSEHOOK 1
#define UT_BINLOGS 0
typedef void (*BROWSEHOOK)(AMX *amx, cell *oplist, cell *cip);
/* 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 PAWN_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 PAWN_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, amx_length_); \
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
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_CheckNatives(AMX *amx, AMX_NATIVE_FILTER nf);
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_Exec(AMX *amx, cell *retval, int index);
int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...); int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index);
int AMXAPI amx_Execv(AMX *amx, cell *retval, int index, int numparams, cell params[]); int AMXAPI amx_FindPublic(AMX *amx, const char *funcname, int *index);
int AMXAPI amx_FindNative(AMX *amx, char *name, int *index); int AMXAPI amx_FindPubVar(AMX *amx, const char *varname, cell *amx_addr);
int AMXAPI amx_FindPublic(AMX *amx, char *funcname, int *index);
int AMXAPI amx_FindPubVar(AMX *amx, 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, size_t size);
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);
int AMXAPI amx_NumTags(AMX *amx, int *number); int AMXAPI amx_NumTags(AMX *amx, int *number);
int AMXAPI amx_Push(AMX *amx, cell value);
int AMXAPI amx_PushArray(AMX *amx, cell *amx_addr, cell **phys_addr, const cell array[], int numcells);
int AMXAPI amx_PushString(AMX *amx, cell *amx_addr, cell **phys_addr, const char *string, int pack, int use_wchar);
int AMXAPI amx_RaiseError(AMX *amx, int error); int AMXAPI amx_RaiseError(AMX *amx, int error);
int AMXAPI amx_Register(AMX *amx, AMX_NATIVE_INFO *nativelist, int number); int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *nativelist, int number);
int AMXAPI amx_Reregister(AMX *amx, const AMX_NATIVE_INFO *nativelist, int number);
int AMXAPI amx_RegisterToAny(AMX *amx, AMX_NATIVE f);
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, size_t size);
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(const cell *cstring, int *length);
int AMXAPI amx_StrLen(cell *cstring, int *length); int AMXAPI amx_UTF8Check(const char *string, int *length);
int AMXAPI amx_UTF8Get(const char *string, const char **endptr, cell *value);
int AMXAPI amx_UTF8Len(const cell *cstr, int *length);
int AMXAPI amx_UTF8Put(char *string, char **endptr, int maxchars, cell value);
int AMXAPI amx_GetLibraries(AMX *amx);
const char *AMXAPI amx_GetLibrary(AMX *amx, int index, char *buffer, int len);
int AMXAPI amx_SetStringOld(cell *dest,const char *source,int pack,int use_wchar);
int AMXAPI amx_GetStringOld(char *dest,const cell *source,int use_wchar);
#if PAWN_CELL_SIZE==16
#define amx_AlignCell(v) amx_Align16(v)
#elif PAWN_CELL_SIZE==32
#define amx_AlignCell(v) amx_Align32(v)
#elif PAWN_CELL_SIZE==64 && (defined _I64_MAX || defined HAVE_I64)
#define amx_AlignCell(v) amx_Align64(v)
#else
#error Unsupported cell size
#endif
#define amx_RegisterFunc(amx, name, func) \
amx_Register((amx), amx_NativeInfo((name),(func)), 1);
#if !defined AMX_NO_ALIGN #if !defined AMX_NO_ALIGN
#if defined __linux__ #if defined LINUX || defined __FreeBSD__
#pragma pack() /* reset default packing */ #pragma pack() /* reset default packing */
#elif defined MACOS && defined __MWERKS__
#pragma options align=reset
#else #else
#pragma pack(pop) /* reset previous packing */ #pragma pack(pop) /* reset previous packing */
#endif #endif
#endif #endif
#if defined BINLOG_ENABLED
typedef struct tagBINLOG
{
void (*pfnLogNative)(AMX *amx, int native, int params);
void (*pfnLogReturn)(AMX *amx, cell retval);
void (*pfnLogParams)(AMX *amx, cell *params);
} binlogfuncs_t;
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* __AMX_H */
#endif /* AMX_H_INCLUDED */

View File

@ -1,11 +0,0 @@
; /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 ;

View File

@ -1,36 +1,74 @@
/* Core module for the Small AMX /* Core module for the Pawn AMX
* *
* Copyright (c) ITB CompuPhase, 1997-2002 * Copyright (c) ITB CompuPhase, 1997-2005
* 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>
#include "amx.h" #include "amx.h"
#if defined __WIN32__ || defined _WIN32 || defined WIN32 || defined _Windows
#define NOPROPLIST #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
#endif
#define CHARBITS (8*sizeof(char)) #define CHARBITS (8*sizeof(char))
typedef unsigned char uchar; typedef unsigned char uchar;
#if !defined NOPROPLIST #if !defined AMX_NOPROPLIST
typedef struct _property_list { typedef struct _property_list {
struct _property_list *next; struct _property_list *next;
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, 0, NULL, 0 };
static proplist *list_additem(proplist *root) static proplist *list_additem(proplist *root)
{ {
@ -96,17 +134,15 @@ static proplist *list_finditem(proplist *root,cell id,char *name,cell value,
} }
#endif #endif
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
static cell AMX_NATIVE_CALL numargs(AMX *amx, cell *params) static cell AMX_NATIVE_CALL numargs(AMX *amx, cell *params)
{ {
AMX_HEADER *hdr; AMX_HEADER *hdr;
uchar *data; uchar *data;
cell bytes; cell bytes;
(void)params;
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 +157,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,7 +174,7 @@ 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 */
@ -151,11 +187,9 @@ static cell AMX_NATIVE_CALL setarg(AMX *amx, cell *params)
return 1; return 1;
} }
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
static cell AMX_NATIVE_CALL heapspace(AMX *amx,cell *params) static cell AMX_NATIVE_CALL heapspace(AMX *amx,cell *params)
{ {
(void)params;
return amx->stk - amx->hea; return amx->stk - amx->hea;
} }
@ -174,191 +208,95 @@ 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,UNLIMITED);
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 */
return index; return index;
} }
int amx_StrPack(cell *dest,cell *source)
{
int len;
amx_StrLen(source,&len);
if ((ucell)*source>UCHAR_MAX) {
/* source string is already packed */
while (len >= 0) {
*dest++ = *source++;
len-=sizeof(cell);
} /* while */
} else {
/* pack string, from bottom up */
cell c;
int i;
for (c=0,i=0; i<len; i++) {
assert((*source & ~0xffL)==0);
c=(c<<CHARBITS) | *source++;
if (i%sizeof(cell) == sizeof(cell)-1) {
*dest++=c;
c=0;
} /* if */
} /* for */
if (i%sizeof(cell) != 0) /* store remaining packed characters */
*dest=c << (sizeof(cell)-i%sizeof(cell))*CHARBITS;
else
*dest=0; /* store full cell of zeros */
} /* if */
return AMX_ERR_NONE;
}
int amx_StrUnpack(cell *dest,cell *source)
{
if ((ucell)*source>UCHAR_MAX) {
/* unpack string, from top down (so string can be unpacked in place) */
cell c;
int i,len;
amx_StrLen(source,&len);
dest[len]=0;
for (i=len-1; i>=0; i--) {
c=source[i/sizeof(cell)] >> (sizeof(cell)-i%sizeof(cell)-1)*CHARBITS;
dest[i]=c & UCHAR_MAX;
} /* for */
} else {
/* source string is already unpacked */
while ((*dest++ = *source++) != 0)
/* nothing */;
} /* if */
return AMX_ERR_NONE;
}
static int verify_addr(AMX *amx,cell addr)
{
int err;
cell *cdest;
err=amx_GetAddr(amx,addr,&cdest);
if (err!=AMX_ERR_NONE)
amx_RaiseError(amx,err);
return err;
}
static cell AMX_NATIVE_CALL core_strlen(AMX *amx,cell *params)
{
cell *cptr;
int len = 0;
if (amx_GetAddr(amx,params[1],&cptr)==AMX_ERR_NONE)
amx_StrLen(cptr,&len);
return len;
}
static cell AMX_NATIVE_CALL strpack(AMX *amx,cell *params)
{
cell *cdest,*csrc;
int len,needed,lastaddr,err;
/* calculate number of cells needed for (packed) destination */
amx_GetAddr(amx,params[2],&csrc);
amx_StrLen(csrc,&len);
needed=(len+sizeof(cell))/sizeof(cell); /* # of cells needed */
assert(needed>0);
lastaddr=params[1]+sizeof(cell)*needed-1;
if (verify_addr(amx,(cell)lastaddr)!=AMX_ERR_NONE)
return 0;
amx_GetAddr(amx,params[1],&cdest);
err=amx_StrPack(cdest,csrc);
if (err!=AMX_ERR_NONE)
return amx_RaiseError(amx,err);
return len;
}
static cell AMX_NATIVE_CALL strunpack(AMX *amx,cell *params)
{
cell *cdest,*csrc;
int len,err,lastaddr;
/* calculate number of cells needed for (packed) destination */
amx_GetAddr(amx,params[2],&csrc);
amx_StrLen(csrc,&len);
assert(len>=0);
lastaddr=params[1]+sizeof(cell)*(len+1)-1;
if (verify_addr(amx,(cell)lastaddr)!=AMX_ERR_NONE)
return 0;
amx_GetAddr(amx,params[1],&cdest);
err=amx_StrUnpack(cdest,csrc);
if (err!=AMX_ERR_NONE)
return amx_RaiseError(amx,err);
return len;
}
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
static cell AMX_NATIVE_CALL swapchars(AMX *amx,cell *params) static cell AMX_NATIVE_CALL swapchars(AMX *amx,cell *params)
{ {
union { union {
cell c; cell c;
#if defined BIT16 #if PAWN_CELL_SIZE==16
uchar b[2]; uchar b[2];
#else #elif PAWN_CELL_SIZE==32
uchar b[4]; uchar b[4];
#elif PAWN_CELL_SIZE==64
uchar b[8];
#else
#error Unsupported cell size
#endif #endif
} value; } value;
uchar t; uchar t;
(void)amx;
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 PAWN_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 PAWN_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 PAWN_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;
} }
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#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)); (void)amx;
#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__
#pragma argsused
#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)); (void)amx;
#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__
#pragma argsused
#endif
static cell AMX_NATIVE_CALL core_min(AMX *amx,cell *params) static cell AMX_NATIVE_CALL core_min(AMX *amx,cell *params)
{ {
(void)amx;
return params[1] <= params[2] ? params[1] : params[2]; return params[1] <= params[2] ? params[1] : params[2];
} }
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
static cell AMX_NATIVE_CALL core_max(AMX *amx,cell *params) static cell AMX_NATIVE_CALL core_max(AMX *amx,cell *params)
{ {
(void)amx;
return params[1] >= params[2] ? params[1] : params[2]; return params[1] >= params[2] ? params[1] : params[2];
} }
@ -374,7 +312,7 @@ static cell AMX_NATIVE_CALL core_clamp(AMX *amx,cell *params)
return value; return value;
} }
#if !defined NOPROPLIST #if !defined AMX_NOPROPLIST
static char *MakePackedString(cell *cptr) static char *MakePackedString(cell *cptr)
{ {
int len; int len;
@ -382,10 +320,21 @@ 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,UNLIMITED);
return dest; return dest;
} }
static int verify_addr(AMX *amx,cell addr)
{
int err;
cell *cdest;
err=amx_GetAddr(amx,addr,&cdest);
if (err!=AMX_ERR_NONE)
amx_RaiseError(amx,err);
return err;
}
static cell AMX_NATIVE_CALL getproperty(AMX *amx,cell *params) static cell AMX_NATIVE_CALL getproperty(AMX *amx,cell *params)
{ {
cell *cstr; cell *cstr;
@ -403,7 +352,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,UNLIMITED);
} /* if */ } /* if */
free(name); free(name);
return (item!=NULL) ? item->value : 0; return (item!=NULL) ? item->value : 0;
@ -468,12 +417,14 @@ static cell AMX_NATIVE_CALL existproperty(AMX *amx,cell *params)
} }
#endif #endif
#if !defined AMX_NORANDOM
/* This routine comes from the book "Inner Loops" by Rick Booth, Addison-Wesley /* This routine comes from the book "Inner Loops" by Rick Booth, Addison-Wesley
* (ISBN 0-201-47960-5). This is a "multiplicative congruential random number * (ISBN 0-201-47960-5). This is a "multiplicative congruential random number
* generator" that has been extended to 31-bits (the standard C version returns * generator" that has been extended to 31-bits (the standard C version returns
* only 15-bits). * only 15-bits).
*/ */
static unsigned long IL_StandardRandom_seed = 0L; #define INITIAL_SEED 0xcaa938dbL
static unsigned long IL_StandardRandom_seed = INITIAL_SEED; /* always use a non-zero seed */
#define IL_RMULT 1103515245L #define IL_RMULT 1103515245L
#if defined __BORLANDC__ || defined __WATCOMC__ #if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused #pragma argsused
@ -485,7 +436,7 @@ static cell AMX_NATIVE_CALL core_random(AMX *amx,cell *params)
/* one-time initialization (or, mostly one-time) */ /* one-time initialization (or, mostly one-time) */
#if !defined SN_TARGET_PS2 && !defined _WIN32_WCE #if !defined SN_TARGET_PS2 && !defined _WIN32_WCE
if (IL_StandardRandom_seed == 0L) if (IL_StandardRandom_seed == INITIAL_SEED)
IL_StandardRandom_seed=(unsigned long)time(NULL); IL_StandardRandom_seed=(unsigned long)time(NULL);
#endif #endif
@ -502,47 +453,37 @@ static cell AMX_NATIVE_CALL core_random(AMX *amx,cell *params)
result %= params[1]; result %= params[1];
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 #endif
AMX_NATIVE_INFO core_Natives[] = { AMX_NATIVE_INFO core_Natives[] = {
{ "numargs", numargs }, { "numargs", numargs },
{ "getarg", getarg }, { "getarg", getarg },
{ "setarg", setarg }, { "setarg", setarg },
{ "heapspace", heapspace }, { "heapspace", heapspace },
{ "funcidx", funcidx }, { "funcidx", funcidx },
{ "strlen", core_strlen },
{ "strpack", strpack },
{ "strunpack", strunpack },
{ "swapchars", swapchars }, { "swapchars", swapchars },
{ "tolower", core_tolower }, { "tolower", core_tolower },
{ "toupper", core_toupper }, { "toupper", core_toupper },
{ "random", core_random },
{ "min", core_min }, { "min", core_min },
{ "max", core_max }, { "max", core_max },
{ "clamp", core_clamp }, { "clamp", core_clamp },
#if !defined NOPROPLIST { "random", core_random },
{ "getproperty", getproperty },
{ "setproperty", setproperty },
{ "deleteproperty",delproperty },
{ "existproperty", existproperty },
#endif
{ NULL, NULL } /* terminator */ { NULL, NULL } /* terminator */
}; };
int AMXEXPORT amx_CoreInit(AMX *amx)
{
return amx_Register(amx, core_Natives, -1);
}
int AMXEXPORT amx_CoreCleanup(AMX *amx)
{
(void)amx;
#if !defined AMX_NOPROPLIST
//??? delete only the properties owned by the AMX
while (proproot.next!=NULL)
list_delete(&proproot,proproot.next);
#endif
return AMX_ERR_NONE;
}

498
amxmodx/amxdbg.cpp Executable file
View File

@ -0,0 +1,498 @@
/* Pawn debugger interface
*
* Support functions for debugger applications
*
* Copyright (c) ITB CompuPhase, 2005
*
* 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 <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "osdefs.h" /* for _MAX_PATH */
#include "amx.h"
#include "amxdbg.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
int AMXAPI dbg_FreeInfo(AMX_DBG *amxdbg)
{
assert(amxdbg != NULL);
if (amxdbg->hdr != NULL)
free(amxdbg->hdr);
if (amxdbg->filetbl != NULL)
free(amxdbg->filetbl);
if (amxdbg->symboltbl != NULL)
free(amxdbg->symboltbl);
if (amxdbg->tagtbl != NULL)
free(amxdbg->tagtbl);
if (amxdbg->automatontbl != NULL)
free(amxdbg->automatontbl);
if (amxdbg->statetbl != NULL)
free(amxdbg->statetbl);
memset(amxdbg, 0, sizeof(AMX_DBG));
return AMX_ERR_NONE;
}
void memread(void *dest, char **src, size_t size)
{
void *ptr = *src;
memcpy(dest, ptr, size);
*src += size;
}
const char *ClipFileName(const char *inp)
{
static char buffer[256];
size_t len = strlen(inp);
const char *ptr = inp;
for (size_t i=0; i<len; i++)
{
if ((inp[i] == '\\' || inp[i] == '/') && (i != len-1))
ptr = inp + i + 1;
}
strcpy(buffer, ptr);
return buffer;
}
//Note - I changed this function to read from memory instead.
// -- BAILOPAN
int AMXAPI dbg_LoadInfo(AMX_DBG *amxdbg, void *dbg_addr)
{
AMX_DBG_HDR dbghdr;
unsigned char *ptr;
int index, dim;
AMX_DBG_SYMDIM *symdim;
assert(amxdbg != NULL);
char *addr = (char *)(dbg_addr);
memset(&dbghdr, 0, sizeof(AMX_DBG_HDR));
memread(&dbghdr, &addr, sizeof(AMX_DBG_HDR));
//brabbby graa gragghty graaahhhh
#if BYTE_ORDER==BIG_ENDIAN
amx_Align32((uint32_t*)&dbghdr.size);
amx_Align16(&dbghdr.magic);
amx_Align16(&dbghdr.flags);
amx_Align16(&dbghdr.files);
amx_Align16(&dbghdr.lines);
amx_Align16(&dbghdr.symbols);
amx_Align16(&dbghdr.tags);
amx_Align16(&dbghdr.automatons);
amx_Align16(&dbghdr.states);
#endif
if (dbghdr.magic != AMX_DBG_MAGIC)
return AMX_ERR_FORMAT;
/* allocate all memory */
memset(amxdbg, 0, sizeof(AMX_DBG));
amxdbg->hdr = (AMX_DBG_HDR *)malloc((size_t)dbghdr.size);
if (dbghdr.files > 0)
amxdbg->filetbl = (AMX_DBG_FILE **)malloc(dbghdr.files * sizeof(AMX_DBG_FILE *));
if (dbghdr.symbols > 0)
amxdbg->symboltbl = (AMX_DBG_SYMBOL **)malloc(dbghdr.symbols * sizeof(AMX_DBG_SYMBOL *));
if (dbghdr.tags > 0)
amxdbg->tagtbl = (AMX_DBG_TAG **)malloc(dbghdr.tags * sizeof(AMX_DBG_TAG *));
if (dbghdr.automatons > 0)
amxdbg->automatontbl = (AMX_DBG_MACHINE **)malloc(dbghdr.automatons * sizeof(AMX_DBG_MACHINE *));
if (dbghdr.states > 0)
amxdbg->statetbl = (AMX_DBG_STATE **)malloc(dbghdr.states * sizeof(AMX_DBG_STATE *));
if (amxdbg->hdr == NULL
|| (dbghdr.files > 0 && amxdbg->filetbl == NULL)
|| (dbghdr.symbols > 0 && amxdbg->symboltbl == NULL)
|| (dbghdr.tags > 0 && amxdbg->tagtbl == NULL)
|| (dbghdr.states > 0 && amxdbg->statetbl == NULL)
|| (dbghdr.automatons > 0 && amxdbg->automatontbl == NULL))
{
dbg_FreeInfo(amxdbg);
return AMX_ERR_MEMORY;
} /* if */
/* load the entire symbolic information block into memory */
memcpy(amxdbg->hdr, &dbghdr, sizeof dbghdr);
ptr = (unsigned char *)(amxdbg->hdr + 1);
memread(ptr, &addr, (size_t)(dbghdr.size-sizeof(dbghdr)));
/* file table */
for (index = 0; index < dbghdr.files; index++) {
assert(amxdbg->filetbl != NULL);
amxdbg->filetbl[index] = (AMX_DBG_FILE *)ptr;
#if BYTE_ORDER==BIG_ENDIAN
amx_AlignCell(&amxdbg->filetbl[index]->address);
#endif
for (ptr = ptr + sizeof(AMX_DBG_FILE); *ptr != '\0'; ptr++)
/* nothing */;
ptr++; /* skip '\0' too */
} /* for */
//debug("Files: %d\n", amxdbg->hdr->files);
for (index=0;index<amxdbg->hdr->files; index++)
{
strcpy((char *)amxdbg->filetbl[index]->name, ClipFileName(amxdbg->filetbl[index]->name));
//debug(" [%d] %s\n", index, amxdbg->filetbl[index]->name);
}
/* line table */
amxdbg->linetbl = (AMX_DBG_LINE*)ptr;
#if BYTE_ORDER==BIG_ENDIAN
for (index = 0; index < dbghdr.lines; index++) {
amx_AlignCell(&amxdbg->linetbl[index].address);
amx_Align32((uint32_t*)&amxdbg->linetbl[index].line);
} /* for */
#endif
ptr += dbghdr.lines * sizeof(AMX_DBG_LINE);
/* symbol table (plus index tags) */
for (index = 0; index < dbghdr.symbols; index++) {
assert(amxdbg->symboltbl != NULL);
amxdbg->symboltbl[index] = (AMX_DBG_SYMBOL *)ptr;
#if BYTE_ORDER==BIG_ENDIAN
amx_AlignCell(&amxdbg->symboltbl[index]->address);
amx_Align16((uint16_t*)&amxdbg->symboltbl[index]->tag);
amx_AlignCell(&amxdbg->symboltbl[index]->codestart);
amx_AlignCell(&amxdbg->symboltbl[index]->codeend);
amx_Align16((uint16_t*)&amxdbg->symboltbl[index]->dim);
#endif
for (ptr = ptr + sizeof(AMX_DBG_SYMBOL); *ptr != '\0'; ptr++)
/* nothing */;
ptr++; /* skip '\0' too */
for (dim = 0; dim < amxdbg->symboltbl[index]->dim; dim++) {
symdim = (AMX_DBG_SYMDIM *)ptr;
amx_Align16((uint16_t*)&symdim->tag);
amx_AlignCell(&symdim->size);
ptr += sizeof(AMX_DBG_SYMDIM);
} /* for */
} /* for */
/* tag name table */
for (index = 0; index < dbghdr.tags; index++) {
assert(amxdbg->tagtbl != NULL);
amxdbg->tagtbl[index] = (AMX_DBG_TAG *)ptr;
#if BYTE_ORDER==BIG_ENDIAN
amx_Align16(&amxdbg->tagtbl[index]->tag);
#endif
for (ptr = ptr + sizeof(AMX_DBG_TAG) - 1; *ptr != '\0'; ptr++)
/* nothing */;
ptr++; /* skip '\0' too */
} /* for */
/* automaton name table */
for (index = 0; index < dbghdr.automatons; index++) {
assert(amxdbg->automatontbl != NULL);
amxdbg->automatontbl[index] = (AMX_DBG_MACHINE *)ptr;
#if BYTE_ORDER==BIG_ENDIAN
amx_Align16(&amxdbg->automatontbl[index]->automaton);
amx_AlignCell(&amxdbg->automatontbl[index]->address);
#endif
for (ptr = ptr + sizeof(AMX_DBG_MACHINE) - 1; *ptr != '\0'; ptr++)
/* nothing */;
ptr++; /* skip '\0' too */
} /* for */
/* state name table */
for (index = 0; index < dbghdr.states; index++) {
assert(amxdbg->statetbl != NULL);
amxdbg->statetbl[index] = (AMX_DBG_STATE *)ptr;
#if BYTE_ORDER==BIG_ENDIAN
amx_Align16(&amxdbg->statetbl[index]->state);
amx_Align16(&amxdbg->automatontbl[index]->automaton);
#endif
for (ptr = ptr + sizeof(AMX_DBG_STATE) - 1; *ptr != '\0'; ptr++)
/* nothing */;
ptr++; /* skip '\0' too */
} /* for */
return AMX_ERR_NONE;
}
int AMXAPI dbg_LookupFile(AMX_DBG *amxdbg, ucell address, const char **filename)
{
int index;
assert(amxdbg != NULL);
assert(filename != NULL);
*filename = NULL;
/* this is a simple linear look-up; a binary search would be possible too */
for (index = 0; index < amxdbg->hdr->files && amxdbg->filetbl[index]->address <= address; index++)
/* nothing */;
/* reset for overrun */
if (--index < 0)
return AMX_ERR_NOTFOUND;
*filename = amxdbg->filetbl[index]->name;
return AMX_ERR_NONE;
}
int AMXAPI dbg_LookupLine(AMX_DBG *amxdbg, ucell address, long *line)
{
int index;
assert(amxdbg != NULL);
assert(line != NULL);
*line = 0;
/* this is a simple linear look-up; a binary search would be possible too */
for (index = 0; index < amxdbg->hdr->lines && amxdbg->linetbl[index].address <= address; index++)
/* nothing */;
/* reset for overrun */
if (--index < 0)
return AMX_ERR_NOTFOUND;
*line = (long)amxdbg->linetbl[index].line;
return AMX_ERR_NONE;
}
int AMXAPI dbg_LookupFunction(AMX_DBG *amxdbg, ucell address, const char **funcname)
{
/* dbg_LookupFunction() finds the function a code address is in. It can be
* used for stack walking, and for stepping through a function while stepping
* over sub-functions
*/
int index;
assert(amxdbg != NULL);
assert(funcname != NULL);
*funcname = NULL;
for (index = 0; index < amxdbg->hdr->symbols; index++) {
if (amxdbg->symboltbl[index]->ident == iFUNCTN
&& amxdbg->symboltbl[index]->codestart <= address
&& amxdbg->symboltbl[index]->codeend > address)
break;
} /* for */
if (index >= amxdbg->hdr->symbols)
return AMX_ERR_NOTFOUND;
*funcname = amxdbg->symboltbl[index]->name;
return AMX_ERR_NONE;
}
int AMXAPI dbg_GetTagName(AMX_DBG *amxdbg, int tag, const char **name)
{
int index;
assert(amxdbg != NULL);
assert(name != NULL);
*name = NULL;
for (index = 0; index < amxdbg->hdr->tags && amxdbg->tagtbl[index]->tag != tag; index++)
/* nothing */;
if (index >= amxdbg->hdr->tags)
return AMX_ERR_NOTFOUND;
*name = amxdbg->tagtbl[index]->name;
return AMX_ERR_NONE;
}
int AMXAPI dbg_GetAutomatonName(AMX_DBG *amxdbg, int automaton, const char **name)
{
int index;
assert(amxdbg != NULL);
assert(name != NULL);
*name = NULL;
for (index = 0; index < amxdbg->hdr->automatons && amxdbg->automatontbl[index]->automaton != automaton; index++)
/* nothing */;
if (index >= amxdbg->hdr->automatons)
return AMX_ERR_NOTFOUND;
*name = amxdbg->automatontbl[index]->name;
return AMX_ERR_NONE;
}
int AMXAPI dbg_GetStateName(AMX_DBG *amxdbg, int state, const char **name)
{
int index;
assert(amxdbg != NULL);
assert(name != NULL);
*name = NULL;
for (index = 0; index < amxdbg->hdr->states && amxdbg->statetbl[index]->state != state; index++)
/* nothing */;
if (index >= amxdbg->hdr->states)
return AMX_ERR_NOTFOUND;
*name = amxdbg->statetbl[index]->name;
return AMX_ERR_NONE;
}
int AMXAPI dbg_GetLineAddress(AMX_DBG *amxdbg, long line, const char *filename, ucell *address)
{
/* Find a suitable "breakpoint address" close to the indicated line (and in
* the specified file). The address is moved up to the next "breakable" line
* if no "breakpoint" is available on the specified line. You can use function
* dbg_LookupLine() to find out at which precise line the breakpoint was set.
*
* The filename comparison is strict (case sensitive and path sensitive); the
* "filename" parameter should point into the "filetbl" of the AMX_DBG
* structure.
*/
int file, index;
ucell bottomaddr,topaddr;
assert(amxdbg != NULL);
assert(filename != NULL);
assert(address != NULL);
*address = 0;
index = 0;
for (file = 0; file < amxdbg->hdr->files; file++) {
/* find the (next) mathing instance of the file */
if (strcmp(amxdbg->filetbl[file]->name, filename) != 0)
continue;
/* get address range for the current file */
bottomaddr = amxdbg->filetbl[file]->address;
topaddr = (file + 1 < amxdbg->hdr->files) ? amxdbg->filetbl[file+1]->address : (ucell)(cell)-1;
/* go to the starting address in the line table */
while (index < amxdbg->hdr->lines && amxdbg->linetbl[index].address < bottomaddr)
index++;
/* browse until the line is found or until the top address is exceeded */
while (index < amxdbg->hdr->lines
&& amxdbg->linetbl[index].line < line
&& amxdbg->linetbl[index].address < topaddr)
index++;
if (index >= amxdbg->hdr->lines)
return AMX_ERR_NOTFOUND;
if (amxdbg->linetbl[index].line >= line)
break;
/* if not found (and the line table is not yet exceeded) try the next
* instance of the same file (a file may appear twice in the file table)
*/
} /* for */
if (strcmp(amxdbg->filetbl[file]->name, filename) != 0)
return AMX_ERR_NOTFOUND;
assert(index < amxdbg->hdr->lines);
*address = amxdbg->linetbl[index].address;
return AMX_ERR_NONE;
}
int AMXAPI dbg_GetFunctionAddress(AMX_DBG *amxdbg, const char *funcname, const char *filename, ucell *address)
{
/* Find a suitable "breakpoint address" close to the indicated line (and in
* the specified file). The address is moved up to the first "breakable" line
* in the function. You can use function dbg_LookupLine() to find out at which
* precise line the breakpoint was set.
*
* The filename comparison is strict (case sensitive and path sensitive); the
* "filename" parameter should point into the "filetbl" of the AMX_DBG
* structure. The function name comparison is case sensitive too.
*/
int index, err;
const char *tgtfile;
ucell funcaddr;
assert(amxdbg != NULL);
assert(funcname != NULL);
assert(filename != NULL);
assert(address != NULL);
*address = 0;
index = 0;
for ( ;; ) {
/* find (next) matching function */
while (index < amxdbg->hdr->symbols
&& (amxdbg->symboltbl[index]->ident != iFUNCTN || strcmp(amxdbg->symboltbl[index]->name, funcname) != 0))
index++;
if (index >= amxdbg->hdr->symbols)
return AMX_ERR_NOTFOUND;
/* verify that this line falls in the appropriate file */
err = dbg_LookupFile(amxdbg, amxdbg->symboltbl[index]->address, &tgtfile);
if (err == AMX_ERR_NONE || strcmp(filename, tgtfile) == 0)
break;
index++; /* line is the wrong file, search further */
} /* for */
/* now find the first line in the function where we can "break" on */
assert(index < amxdbg->hdr->symbols);
funcaddr = amxdbg->symboltbl[index]->address;
for (index = 0; index < amxdbg->hdr->lines && amxdbg->linetbl[index].address < funcaddr; index++)
/* nothing */;
if (index >= amxdbg->hdr->lines)
return AMX_ERR_NOTFOUND;
*address = amxdbg->linetbl[index].address;
return AMX_ERR_NONE;
}
int AMXAPI dbg_GetVariable(AMX_DBG *amxdbg, const char *symname, ucell scopeaddr, const AMX_DBG_SYMBOL **sym)
{
ucell codestart,codeend;
int index;
assert(amxdbg != NULL);
assert(symname != NULL);
assert(sym != NULL);
*sym = NULL;
codestart = codeend = 0;
index = 0;
for ( ;; ) {
/* find (next) matching variable */
while (index < amxdbg->hdr->symbols
&& (amxdbg->symboltbl[index]->ident == iFUNCTN || strcmp(amxdbg->symboltbl[index]->name, symname) != 0)
&& (amxdbg->symboltbl[index]->codestart > scopeaddr || amxdbg->symboltbl[index]->codeend < scopeaddr))
index++;
if (index >= amxdbg->hdr->symbols)
break;
/* check the range, keep a pointer to the symbol with the smallest range */
if (strcmp(amxdbg->symboltbl[index]->name, symname) == 0
&& (codestart == 0 && codeend == 0
|| amxdbg->symboltbl[index]->codestart >= codestart && amxdbg->symboltbl[index]->codeend <= codeend))
{
*sym = amxdbg->symboltbl[index];
codestart = amxdbg->symboltbl[index]->codestart;
codeend = amxdbg->symboltbl[index]->codeend;
} /* if */
index++;
} /* for */
return (*sym == NULL) ? AMX_ERR_NOTFOUND : AMX_ERR_NONE;
}
int AMXAPI dbg_GetArrayDim(AMX_DBG *amxdbg, const AMX_DBG_SYMBOL *sym, const AMX_DBG_SYMDIM **symdim)
{
/* retrieves a pointer to the array dimensions structures of an array symbol */
const char *ptr;
assert(amxdbg != NULL);
assert(sym != NULL);
assert(symdim != NULL);
*symdim = NULL;
if (sym->ident != iARRAY && sym->ident != iREFARRAY)
return AMX_ERR_PARAMS;
assert(sym->dim > 0); /* array must have at least one dimension */
/* find the end of the symbol name */
for (ptr = sym->name; *ptr != '\0'; ptr++)
/* nothing */;
*symdim = (AMX_DBG_SYMDIM *)(ptr + 1);/* skip '\0' too */
return AMX_ERR_NONE;
}

172
amxmodx/amxdbg.h Executable file
View File

@ -0,0 +1,172 @@
/* Abstract Machine for the Pawn compiler, debugger support
*
* This file contains extra definitions that are convenient for debugger
* support.
*
* Copyright (c) ITB CompuPhase, 2005
*
* 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 AMXDBG_H_INCLUDED
#define AMXDBG_H_INCLUDED
#ifndef AMX_H_INCLUDED
#include "amx.h"
#endif
#ifdef __cplusplus
extern "C" {
#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 || defined __FreeBSD__
#pragma pack(1) /* structures must be packed (byte-aligned) */
#elif defined MACOS && defined __MWERKS__
#pragma options align=mac68k
#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 tagAMX_DBG_HDR {
int32_t size PACKED; /* size of the debug information chunk */
uint16_t magic PACKED; /* signature, must be 0xf1ef */
char file_version; /* file format version */
char amx_version; /* required version of the AMX */
int16_t flags PACKED; /* currently unused */
int16_t files PACKED; /* number of entries in the "file" table */
int16_t lines PACKED; /* number of entries in the "line" table */
int16_t symbols PACKED; /* number of entries in the "symbol" table */
int16_t tags PACKED; /* number of entries in the "tag" table */
int16_t automatons PACKED; /* number of entries in the "automaton" table */
int16_t states PACKED; /* number of entries in the "state" table */
} PACKED AMX_DBG_HDR;
#define AMX_DBG_MAGIC 0xf1ef
typedef struct tagAMX_DBG_FILE {
ucell address PACKED; /* address in the code segment where generated code (for this file) starts */
const char name[1]; /* ASCII string, zero-terminated */
} PACKED AMX_DBG_FILE;
typedef struct tagAMX_DBG_LINE {
ucell address PACKED; /* address in the code segment where generated code (for this line) starts */
int32_t line PACKED; /* line number */
} PACKED AMX_DBG_LINE;
typedef struct tagAMX_DBG_SYMBOL {
ucell address PACKED; /* address in the data segment or relative to the frame */
int16_t tag PACKED; /* tag for the symbol */
ucell codestart PACKED; /* address in the code segment from which this symbol is valid (in scope) */
ucell codeend PACKED; /* address in the code segment until which this symbol is valid (in scope) */
char ident; /* kind of symbol (function/variable) */
char vclass; /* class of symbol (global/local) */
int16_t dim PACKED; /* number of dimensions */
const char name[1]; /* ASCII string, zero-terminated */
} PACKED AMX_DBG_SYMBOL;
typedef struct tagAMX_DBG_SYMDIM {
int16_t tag PACKED; /* tag for the array dimension */
ucell size PACKED; /* size of the array dimension */
} PACKED AMX_DBG_SYMDIM;
typedef struct tagAMX_DBG_TAG {
int16_t tag PACKED; /* tag id */
const char name[1]; /* ASCII string, zero-terminated */
} PACKED AMX_DBG_TAG;
typedef struct tagAMX_DBG_MACHINE {
int16_t automaton PACKED; /* automaton id */
ucell address PACKED; /* address of state variable */
const char name[1]; /* ASCII string, zero-terminated */
} PACKED AMX_DBG_MACHINE;
typedef struct tagAMX_DBG_STATE {
int16_t state PACKED; /* state id */
int16_t automaton PACKED; /* automaton id */
const char name[1]; /* ASCII string, zero-terminated */
} PACKED AMX_DBG_STATE;
typedef struct tagAMX_DBG {
AMX_DBG_HDR _FAR *hdr PACKED; /* points to the AMX_DBG header */
AMX_DBG_FILE _FAR **filetbl PACKED;
AMX_DBG_LINE _FAR *linetbl PACKED;
AMX_DBG_SYMBOL _FAR **symboltbl PACKED;
AMX_DBG_TAG _FAR **tagtbl PACKED;
AMX_DBG_MACHINE _FAR **automatontbl PACKED;
AMX_DBG_STATE _FAR **statetbl PACKED;
} PACKED AMX_DBG;
#if !defined iVARIABLE
#define iVARIABLE 1 /* cell that has an address and that can be fetched directly (lvalue) */
#define iREFERENCE 2 /* iVARIABLE, but must be dereferenced */
#define iARRAY 3
#define iREFARRAY 4 /* an array passed by reference (i.e. a pointer) */
#define iFUNCTN 9
#endif
int AMXAPI dbg_FreeInfo(AMX_DBG *amxdbg);
int AMXAPI dbg_LoadInfo(AMX_DBG *amxdbg, void *dbg_addr);
int AMXAPI dbg_LookupFile(AMX_DBG *amxdbg, ucell address, const char **filename);
int AMXAPI dbg_LookupFunction(AMX_DBG *amxdbg, ucell address, const char **funcname);
int AMXAPI dbg_LookupLine(AMX_DBG *amxdbg, ucell address, long *line);
int AMXAPI dbg_GetFunctionAddress(AMX_DBG *amxdbg, const char *funcname, const char *filename, ucell *address);
int AMXAPI dbg_GetLineAddress(AMX_DBG *amxdbg, long line, const char *filename, ucell *address);
int AMXAPI dbg_GetAutomatonName(AMX_DBG *amxdbg, int automaton, const char **name);
int AMXAPI dbg_GetStateName(AMX_DBG *amxdbg, int state, const char **name);
int AMXAPI dbg_GetTagName(AMX_DBG *amxdbg, int tag, const char **name);
int AMXAPI dbg_GetVariable(AMX_DBG *amxdbg, const char *symname, ucell scopeaddr, const AMX_DBG_SYMBOL **sym);
int AMXAPI dbg_GetArrayDim(AMX_DBG *amxdbg, const AMX_DBG_SYMBOL *sym, const AMX_DBG_SYMDIM **symdim);
#if !defined AMX_NO_ALIGN
#if defined LINUX || defined __FreeBSD__
#pragma pack() /* reset default packing */
#elif defined MACOS && defined __MWERKS__
#pragma options align=reset
#else
#pragma pack(pop) /* reset previous packing */
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif /* AMXDBG_H_INCLUDED */

86
amxmodx/amxdefn.asm Executable file
View File

@ -0,0 +1,86 @@
; Definition of the AMX structure for assembler syntax (NASM)
struc amx_s
_base: resd 1
_dataseg: resd 1
_callback: resd 1
_debug: resd 1
_cip: resd 1
_frm: resd 1
_hea: resd 1
_hlw: resd 1
_stk: resd 1
_stp: resd 1
_flags: resd 1
_usertags: resd 4 ; 4 = AMX_USERNUM (#define'd in amx.h)
_userdata: resd 4 ; 4 = AMX_USERNUM (#define'd in amx.h)
_error: resd 1
_paramcount: resd 1
_pri: resd 1
_alt: resd 1
_reset_stk: resd 1
_reset_hea: resd 1
_syscall_d: resd 1
%ifdef JIT
; the two fields below are for the JIT; they do not exist in
; the non-JIT version of the abstract machine
_reloc_size: resd 1 ; memory block for relocations
_code_size: resd 1 ; memory size of the native code
%endif
endstruc
struc amxhead_s
_size: resd 1 ; size of the "file"
_magic: resw 1 ; signature
_file_version: resb 1; file format version
_amx_version: resb 1 ; required version of the AMX
_h_flags: resw 1
_defsize: resw 1 ; size of one public/native function entry
_cod: resd 1 ; initial value of COD - code block
_dat: resd 1 ; initial value of DAT - data block
_h_hea: resd 1 ; initial value of HEA - start of the heap
_h_stp: resd 1 ; initial value of STP - stack top
_h_cip: resd 1 ; initial value of CIP - the instruction pointer
_publics: resd 1 ; offset to the "public functions" table
_natives: resd 1 ; offset to the "native functions" table
_libraries: resd 1 ; offset to the "library" table
_pubvars: resd 1 ; offset to the "public variables" table
_tags: resd 1 ; offset to the "public tagnames" table
_nametable: resd 1 ; offset to the name table, file version 7 only
endstruc
AMX_ERR_NONE EQU 0
AMX_ERR_EXIT EQU 1
AMX_ERR_ASSERT EQU 2
AMX_ERR_STACKERR EQU 3
AMX_ERR_BOUNDS EQU 4
AMX_ERR_MEMACCESS EQU 5
AMX_ERR_INVINSTR EQU 6
AMX_ERR_STACKLOW EQU 7
AMX_ERR_HEAPLOW EQU 8
AMX_ERR_CALLBACK EQU 9
AMX_ERR_NATIVE EQU 10
AMX_ERR_DIVIDE EQU 11 ; for catching divide errors
AMX_ERR_SLEEP EQU 12
AMX_ERR_MEMORY EQU 16
AMX_ERR_FORMAT EQU 17
AMX_ERR_VERSION EQU 18
AMX_ERR_NOTFOUND EQU 19
AMX_ERR_INDEX EQU 20
AMX_ERR_DEBUG EQU 21
AMX_ERR_INIT EQU 22
AMX_ERR_USERDATA EQU 23
AMX_ERR_INIT_JIT EQU 24
AMX_ERR_PARAMS EQU 25
AMX_ERR_DOMAIN EQU 26
AMX_ERR_GENERAL EQU 27
AMX_FLAG_DEBUG EQU 0002h ; symbolic info. available
AMX_FLAG_COMPACT EQU 0004h
AMX_FLAG_BYTEOPC EQU 0008h
AMX_FLAG_NOCHECKS EQU 0010h
AMX_FLAG_BROWSE EQU 4000h
AMX_FLAG_RELOC EQU 8000h ; jump/call addresses relocated

1763
amxmodx/amxexecn.asm Executable file

File diff suppressed because it is too large Load Diff

2594
amxmodx/amxjitsn.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

@ -1,240 +0,0 @@
/* 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 AMXMOD_H
#define AMXMOD_H
#include "modules.h"
#include "CString.h"
#include "CList.h"
#include "CPlugin.h"
#include "CMisc.h"
#include "CVault.h"
#include "CModule.h"
#include "CTask.h"
#include "CLogEvent.h"
#include "CForward.h"
#include "CCmd.h"
#include "CMenu.h"
#include "CEvent.h"
#define AMX_VERSION "0.15"
#ifdef __cplusplus
extern "C" {
#endif
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 file_Natives[];
extern AMX_NATIVE_INFO float_Natives[];
extern AMX_NATIVE_INFO string_Natives[];
extern AMX_NATIVE_INFO vault_Natives[];
#ifndef __linux__
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path);
#define DLPROC(m,func) GetProcAddress(m,func);
#define DLFREE(m) FreeLibrary(m);
#else
#define DLLOAD(path) (DLHANDLE)dlopen(path, RTLD_NOW);
#define DLPROC(m,func) dlsym(m,func);
#define DLFREE(m) dlclose(m);
#endif
#ifndef __linux__
typedef HINSTANCE DLHANDLE;
#else
typedef void* DLHANDLE;
#endif
#ifndef GETPLAYERAUTHID
#define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId)
#endif
#define ANGLEVECTORS (*g_engfuncs.pfnAngleVectors)
#define CLIENT_PRINT (*g_engfuncs.pfnClientPrintf)
#define CVAR_DIRECTSET (*g_engfuncs.pfnCvar_DirectSet)
#define GETCLIENTLISTENING (*g_engfuncs.pfnVoice_GetClientListening)
#define RUNPLAYERMOVE (*g_engfuncs.pfnRunPlayerMove)
#define SETCLIENTLISTENING (*g_engfuncs.pfnVoice_SetClientListening)
#define SETCLIENTMAXSPEED (*g_engfuncs.pfnSetClientMaxspeed)
char* UTIL_SplitHudMessage(register const char *src);
int UTIL_ReadFlags(const char* c);
void UTIL_ClientPrint( edict_t *pEntity, int msg_dest, char *msg );
void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1 = NULL, const char *arg2 = NULL);
void UTIL_GetFlags(char* flags,int flag);
void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pMessage);
void UTIL_IntToString(int value, char *output);
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_MakeNewLogFile();
void UTIL_Log(const char *fmt, ...);
#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_I(i) (&g_players[i])
struct WeaponsVault {
String fullName;
short int iId;
short int ammoSlot;
};
struct fakecmd_t {
char args[256];
const char *argv[3];
//char argv[3][128];
int argc;
bool fake;
};
extern CPluginMngr g_plugins;
extern CTaskMngr g_tasksMngr;
extern CPlayer g_players[33];
extern CPlayer* mPlayer;
extern CmdMngr g_commands;
extern CList<CCVar> g_cvars;
extern CList<ForceObject> g_forcemodels;
extern CList<ForceObject> g_forcesounds;
extern CList<ForceObject> g_forcegeneric;
extern CList<CModule> g_modules;
extern CList<CPlayer*> g_auth;
extern EventsMngr g_events;
extern Grenades g_grenades;
extern LogEventsMngr g_logevents;
extern MenuMngr g_menucmds;
extern String g_log_dir;
extern String g_mod_name;
extern TeamIds g_teamsIds;
extern Vault g_vault;
extern CForwardMngr g_forwards;
extern WeaponsVault g_weaponsData[MAX_WEAPONS];
extern XVars g_xvars;
extern bool g_bmod_cstrike;
extern bool g_bmod_dod;
extern bool g_dontprecache;
extern bool g_initialized;
extern int g_srvindex;
extern cvar_t* amx_version;
extern cvar_t* amxmodx_version;
extern cvar_t* hostname;
extern cvar_t* mp_timelimit;
extern fakecmd_t g_fakecmd;
extern float g_game_restarting;
extern float g_game_timeleft;
extern float g_task_time;
extern float g_auth_time;
extern hudtextparms_t g_hudset;
//extern int g_edict_point;
extern int g_players_num;
extern int mPlayerIndex;
extern int mState;
extern void (*endfunction)(void*);
extern void (*function)(void*);
typedef void (*funEventCall)(void*);
extern funEventCall modMsgsEnd[MAX_REG_MSGS];
extern funEventCall modMsgs[MAX_REG_MSGS];
extern int gmsgAmmoPickup;
extern int gmsgAmmoX;
extern int gmsgBattery;
extern int gmsgCurWeapon;
extern int gmsgDamage;
extern int gmsgDeathMsg;
extern int gmsgHealth;
extern int gmsgMOTD;
extern int gmsgScoreInfo;
extern int gmsgSendAudio;
extern int gmsgServerName;
extern int gmsgShowMenu;
extern int gmsgTeamInfo;
extern int gmsgTextMsg;
extern int gmsgVGUIMenu;
extern int gmsgWeapPickup;
extern int gmsgWeaponList;
extern int gmsgintermission;
extern int gmsgResetHUD;
extern int gmsgRoundTime;
void Client_AmmoPickup(void*);
void Client_AmmoX(void*);
void Client_CurWeapon(void*);
void Client_ScoreInfo(void*);
void Client_ShowMenu(void*);
void Client_TeamInfo(void*);
void Client_TextMsg(void*);
void Client_VGUIMenu(void*);
void Client_WeaponList(void*);
void Client_DamageEnd(void*);
void Client_DeathMsg(void*);
void amx_command();
void plugin_srvcmd();
const char* stristr(const char* a,const char* b);
char *strptime(const char *buf, const char *fmt, struct tm *tm, short addthem);
int loadModules(const char* filename);
void dettachModules();
void dettachReloadModules();
void attachModules();
void attachMetaModModules( const char* filename );
void dettachMetaModModules( const char* filename );
int add_amxnatives(module_info_s* info,AMX_NATIVE_INFO*natives);
cell* get_amxaddr(AMX *amx,cell amx_addr);
char* build_pathname(char *fmt, ... );
char* format_amxstring(AMX *amx, cell *params, int parm,int& len);
AMX* get_amxscript(int, void**,const char**);
const char* get_amxscriptname(AMX* amx);
char* get_amxstring(AMX *amx,cell amx_addr,int id,int& len);
int amxstring_len(cell* cstr);
int load_amxscript(AMX* amx, void** program, const char* path, 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 unload_amxscript(AMX* amx,void** program);
void copy_amxmemory(cell* dest,cell* src,int len);
void get_modname(char*);
void print_srvconsole( char *fmt, ... );
void report_error( int code, char* fmt, ... );
void* alloc_amxmemory(void**, int size);
void free_amxmemory(void **ptr);
#endif // AMXMOD_H

117
amxmodx/amxmod_compat.cpp Normal file
View File

@ -0,0 +1,117 @@
#include "amxmodx.h"
#include "amxmod_compat.h"
#include "format.h"
bool GetTranslation(amxtrans_t trans, int &key, int &dest, int &lang)
{
key = (trans & BCOMPAT_TRANSLATE_KEYMASK);
dest = (trans >> BCOMPAT_TRANSLATE_DESTRSH) & BCOMPAT_TRANSLATE_DESTMASK;
lang = (trans >> BCOMPAT_TRANSLATE_LANGRSH) & BCOMPAT_TRANSLATE_LANGMASK;
if (dest == 0x3F)
{
dest = -1;
}
if (lang == 0x1F)
{
lang = -1;
}
return true;
}
bool translate_bcompat(AMX *amx, cell *source, const char **_key, const char **_def)
{
amxtrans_t trans = static_cast<amxtrans_t>(*source);
int key, _dest, lang;
if (!GetTranslation(trans, key, _dest, lang))
{
return false;
}
cell amx_addr, *phys_addr;
if (amx_Allot(amx, 3, &amx_addr, &phys_addr) != AMX_ERR_NONE)
{
return false;
}
if (_dest == -1)
{
*phys_addr = LANG_PLAYER;
} else if (_dest == 0) {
*phys_addr = LANG_SERVER;
} else if (lang >= 0 && lang < g_langMngr.GetLangsNum()) {
const char *name = g_langMngr.GetLangName(lang);
phys_addr[0] = static_cast<cell>(name[0]);
phys_addr[1] = static_cast<cell>(name[1]);
phys_addr[2] = static_cast<cell>('\0');
} else {
*phys_addr = LANG_SERVER;
}
//not optimized but it works, eh
//if someone cares they can make a translate() wrapper that takes the key # in directly
const char *r_key = g_langMngr.GetKey(key);
const char *def = translate(amx, amx_addr, r_key);
if (!def)
{
def = r_key;
}
amx_Release(amx, amx_addr);
*_key = g_langMngr.GetKey(key);
*_def = def;
return true;
}
static cell AMX_NATIVE_CALL amx_translate(AMX *amx, cell *params)
{
int len;
char *key = get_amxstring(amx, params[1], 0, len);
amxtrans_t trans;
int suki = g_langMngr.GetKeyEntry(key);
//Some AMX Mod plugins do not register everything they need. Prevent a crash.
if (suki == -1)
{
suki = g_langMngr.AddKeyEntry(key);
}
if (suki > BCOMPAT_TRANSLATE_KEYMASK)
{
LogError(amx, AMX_ERR_NATIVE, "Not enough translation space, aborting!");
return 0;
}
trans = suki & BCOMPAT_TRANSLATE_KEYMASK;
int dest = static_cast<int>(params[2]);
int lang = static_cast<int>(params[3]);
if (dest == -1)
{
trans |= (0x3F << BCOMPAT_TRANSLATE_DESTRSH);
} else {
trans |= (dest & BCOMPAT_TRANSLATE_DESTMASK) << BCOMPAT_TRANSLATE_DESTRSH;
}
if (lang == -1)
{
trans |= (0x1F << BCOMPAT_TRANSLATE_LANGRSH);
} else {
trans |= (lang & BCOMPAT_TRANSLATE_LANGMASK) << BCOMPAT_TRANSLATE_LANGRSH;
}
trans |= BCOMPAT_TRANSLATE_BITS;
return static_cast<cell>(trans);
}
AMX_NATIVE_INFO g_BcompatNatives[] =
{
{"translate", amx_translate},
{NULL, NULL},
};

28
amxmodx/amxmod_compat.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef _INCLUDE_AMXMOD_CORE_COMPAT_H
#define _INCLUDE_AMXMOD_CORE_COMPAT_H
/**
* New format for translation:
* Note that we only support:
* 4k keys
* 32 languages
* 0000 0000 0000 0000 0000 0000 0000 0000
* | key id |
* | | <- dest id
* | | <- lang id
*/
#define BCOMPAT_TRANSLATE_BITS 0xFF000000
#define BCOMPAT_TRANSLATE_KEYMASK 0xFFF
#define BCOMPAT_TRANSLATE_DESTMASK 0x3F
#define BCOMPAT_TRANSLATE_DESTRSH 12
#define BCOMPAT_TRANSLATE_LANGMASK 0x1F
#define BCOMPAT_TRANSLATE_LANGRSH 18
typedef unsigned int amxtrans_t;
bool GetTranslation(amxtrans_t trans, int &key, int &dest, int &lang);
extern AMX_NATIVE_INFO g_BcompatNatives[];
#endif //_INCLUDE_AMXMOD_CORE_COMPAT_H

File diff suppressed because it is too large Load Diff

View File

@ -32,9 +32,31 @@
#ifndef AMXMODX_H #ifndef AMXMODX_H
#define AMXMODX_H #define AMXMODX_H
#ifdef __linux__
#include <unistd.h>
#include <stdlib.h>
#include "sclinux.h"
#endif
#include <ctype.h> //tolower, etc
#include "string.h"
#include <extdll.h>
#include <meta_api.h>
#ifdef _MSC_VER
// MSVC8 - replace POSIX functions with ISO C++ conformant ones as they are deprecated
#if _MSC_VER >= 1400
#define unlink _unlink
#define mkdir _mkdir
#define strdup _strdup
#endif
#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,39 +67,52 @@
#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.16" #define AMXXLOG_Log g_log.Log
#define AMXXLOG_Error g_log.LogError
#define AMX_VERSION "1.76c"
#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 amxmodx_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 file_Natives[]; extern AMX_NATIVE_INFO file_Natives[];
extern AMX_NATIVE_INFO float_Natives[]; extern AMX_NATIVE_INFO float_Natives[];
extern AMX_NATIVE_INFO string_Natives[]; extern AMX_NATIVE_INFO string_Natives[];
extern AMX_NATIVE_INFO vault_Natives[]; extern AMX_NATIVE_INFO vault_Natives[];
extern AMX_NATIVE_INFO msg_Natives[];
extern AMX_NATIVE_INFO vector_Natives[];
extern AMX_NATIVE_INFO g_SortNatives[];
#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
#if defined __GNUC__
#include <stdint.h>
typedef intptr_t _INT_PTR;
#else
#if defined AMD64
typedef __int64 _INT_PTR;
#else
typedef __int32 _INT_PTR;
#endif
#endif #endif
#ifndef __linux__ #ifndef __linux__
typedef HINSTANCE DLHANDLE; typedef HINSTANCE DLHANDLE;
#else #else
typedef void* DLHANDLE; typedef void* DLHANDLE;
#define INFINITE 0xFFFFFFFF
#endif #endif
#ifndef GETPLAYERAUTHID #ifndef GETPLAYERAUTHID
@ -93,41 +128,38 @@ typedef void* DLHANDLE;
char* UTIL_SplitHudMessage(register const char *src); char* UTIL_SplitHudMessage(register const char *src);
int UTIL_ReadFlags(const char* c); int UTIL_ReadFlags(const char* c);
void UTIL_ClientPrint( edict_t *pEntity, int msg_dest, char *msg );
void UTIL_ClientPrint(edict_t *pEntity, int msg_dest, char *msg);
void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1 = NULL, const char *arg2 = NULL); void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1 = NULL, const char *arg2 = NULL);
void UTIL_GetFlags(char* flags,int flag); void UTIL_GetFlags(char* flags, int flag);
void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pMessage); void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pMessage);
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 UTIL_MODULES_RUNNING 0 char *UTIL_VarArgs(const char *fmt, ...);
#define UTIL_MODULES_ALL 1
#define UTIL_MODULES_STOPPED 2
int UTIL_GetModulesNum(int mode);
#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))])
#define GET_PLAYER_POINTER_I(i) (&g_players[i]) #define GET_PLAYER_POINTER_I(i) (&g_players[i])
struct WeaponsVault { struct WeaponsVault
{
String fullName; String fullName;
short int iId; short int iId;
short int ammoSlot; short int ammoSlot;
}; };
struct fakecmd_t { struct fakecmd_t
{
char args[256]; char args[256];
const char *argv[3]; const char *argv[3];
//char argv[3][128];
int argc; int argc;
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];
@ -137,12 +169,14 @@ 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<CScript, AMX*> g_loadedscripts;
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;
@ -153,9 +187,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;
@ -164,6 +196,7 @@ extern float g_game_restarting;
extern float g_game_timeleft; extern float g_game_timeleft;
extern float g_task_time; extern float g_task_time;
extern float g_auth_time; extern float g_auth_time;
extern bool g_NewDLL_Available;
extern hudtextparms_t g_hudset; extern hudtextparms_t g_hudset;
//extern int g_edict_point; //extern int g_edict_point;
extern int g_players_num; extern int g_players_num;
@ -212,36 +245,100 @@ void Client_DeathMsg(void*);
void amx_command(); void amx_command();
void plugin_srvcmd(); void plugin_srvcmd();
const char* stristr(const char* a,const char* b); 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, PLUG_LOADTIME now);
void dettachModules(); void detachModules();
void dettachReloadModules(); void detachReloadModules();
void attachModules();
void attachMetaModModules( const char* filename );
void dettachMetaModModules( const char* filename );
int add_amxnatives(module_info_s* info,AMX_NATIVE_INFO*natives); #ifdef FAKEMETA
cell* get_amxaddr(AMX *amx,cell amx_addr); void attachModules();
char* build_pathname(char *fmt, ... ); #endif
char* format_amxstring(AMX *amx, cell *params, int parm,int& len);
AMX* get_amxscript(int, void**,const char**); // Count modules
enum CountModulesMode
{
CountModules_Running = 0,
CountModules_All,
CountModules_Stopped
};
int countModules(CountModulesMode mode);
void modules_callPluginsLoaded();
void modules_callPluginsUnloaded();
void modules_callPluginsUnloading();
cell* get_amxaddr(AMX *amx, cell amx_addr);
char* build_pathname(char *fmt, ...);
char* build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...);
char* format_amxstring(AMX *amx, cell *params, int parm, int& len);
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);
extern "C" size_t get_amxstring_r(AMX *amx, cell amx_addr, char *destination, int maxlen);
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);
void copy_amxmemory(cell* dest,cell* src,int len);
void copy_amxmemory(cell* dest, cell* src, int len);
void get_modname(char*); void get_modname(char*);
void print_srvconsole( char *fmt, ... ); 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 // get_localinfo
const char* get_localinfo( const char* name , const char* def ); const char* get_localinfo(const char* name, const char* def);
cell AMX_NATIVE_CALL require_module(AMX *amx, cell *params);
extern "C" 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
};
extern ModuleCallReason g_ModuleCallReason; // modules.cpp
extern CModule *g_CurrentlyCalledModule; // modules.cpp
extern const char *g_LastRequestedFunc; // modules.cpp
void Module_CacheFunctions();
void Module_UncacheFunctions();
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 int FF_ChangeLevel;
extern bool g_coloredmenus;
typedef void (*AUTHORIZEFUNC)(int player, const char *authstring);
#define MM_CVAR2_VERS 13
struct func_s
{
void *pfn;
const char *desc;
};
extern enginefuncs_t *g_pEngTable;
#endif // AMXMODX_H #endif // AMXMODX_H

View File

@ -11,6 +11,20 @@
#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
#include <stdlib.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"
#if defined __BORLANDC__ || defined __WATCOMC__ #if defined __BORLANDC__ || defined __WATCOMC__
@ -40,7 +54,7 @@ static cell AMX_NATIVE_CALL _time(AMX *amx, cell *params)
/* the time() function returns the number of seconds since January 1 1970 /* the time() function returns the number of seconds since January 1 1970
* in Universal Coordinated Time (the successor to Greenwich Mean Time) * in Universal Coordinated Time (the successor to Greenwich Mean Time)
*/ */
return sec1970; return (cell)sec1970;
} }
#if defined __BORLANDC__ || defined __WATCOMC__ #if defined __BORLANDC__ || defined __WATCOMC__

374
amxmodx/amxxfile.cpp Executable file
View File

@ -0,0 +1,374 @@
/* 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
struct TableEntry
{
mint8_t cellSize;
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)
{
m_Bh.plugins = NULL;
m_AmxxFile = false;
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 == 0x524C4542)
{
//we have an invalid, old, RLEB file
m_Status = Err_OldFile;
fclose(m_pFile);
m_pFile = NULL;
return;
}
else if (magic == MAGIC_HEADER2)
{
DATAREAD(&m_Bh.version, sizeof(int16_t), 1);
if (m_Bh.version > MAGIC_VERSION)
{
m_Status = Err_OldFile;
fclose(m_pFile);
m_pFile = NULL;
return;
}
m_AmxxFile = true;
DATAREAD(&m_Bh.numPlugins, sizeof(mint8_t), 1);
m_Bh.plugins = new PluginEntry[m_Bh.numPlugins];
PluginEntry *pe;
m_SectionHdrOffset = 0;
m_Entry = -1;
for (mint8_t i = 0; i < m_Bh.numPlugins; i++)
{
pe = &(m_Bh.plugins[i]);
DATAREAD(&pe->cellsize, sizeof(mint8_t), 1);
DATAREAD(&pe->disksize, sizeof(int32_t), 1);
DATAREAD(&pe->imagesize, sizeof(int32_t), 1);
DATAREAD(&pe->memsize, sizeof(int32_t), 1);
DATAREAD(&pe->offs, sizeof(int32_t), 1);
}
for (mint8_t i = 0; i < m_Bh.numPlugins; i++)
{
pe = &(m_Bh.plugins[i]);
if (pe->cellsize == m_CellSize)
{
m_Entry = i;
break;
}
}
if (m_Entry == -1)
{
m_Status = Err_SectionNotFound;
fclose(m_pFile);
m_pFile = NULL;
return;
}
pe = &(m_Bh.plugins[m_Entry]);
m_SectionLength = pe->disksize;
}
else if (magic == MAGIC_HEADER)
{
// 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;
}
} else {
// 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;
}
}
}
CAmxxReader::~CAmxxReader()
{
if (m_pFile)
{
fclose(m_pFile);
m_pFile = NULL;
}
if (m_Bh.plugins)
{
delete [] m_Bh.plugins;
m_Bh.plugins = 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;
}
else if (m_AmxxFile)
{
PluginEntry *pe = &(m_Bh.plugins[m_Entry]);
if (pe->imagesize > pe->memsize)
return pe->imagesize + 1;
return pe->memsize + 1;
}
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) != static_cast<size_t>(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;
}
else if (m_AmxxFile)
{
PluginEntry *pe = &(m_Bh.plugins[m_Entry]);
char *tempBuffer = new char[m_SectionLength + 1];
fseek(m_pFile, pe->offs, SEEK_SET);
DATAREAD((void *)tempBuffer, 1, m_SectionLength);
uLongf destLen = GetBufferSize();
int result = uncompress((Bytef *)buffer, &destLen, (Bytef *)tempBuffer, m_SectionLength);
delete [] tempBuffer;
if (result != Z_OK)
{
AMXXLOG_Log("[AMXX] Zlib error encountered: %d(%d)", result, m_SectionLength);
m_Status = Err_Decompress;
return Err_Decompress;
}
return Err_None;
} else {
// 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);
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
int result = uncompress((Bytef *)buffer, &destLen, (Bytef *)tempBuffer, m_SectionLength);
delete [] tempBuffer;
if (result != Z_OK)
{
AMXXLOG_Log("[AMXX] Zlib error encountered: %d(%d)", result, m_SectionLength);
m_Status = Err_Decompress;
return Err_Decompress;
}
return Err_None;
}
}

98
amxmodx/amxxfile.h Executable file
View File

@ -0,0 +1,98 @@
/* 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__
#define MAGIC_HEADER 0x414D5842
#define MAGIC_HEADER2 0x414D5858
#define MAGIC_VERSION 0x0300
typedef char mint8_t;
typedef int16_t mint16_t;
typedef int32_t mint32_t;
struct PluginEntry
{
mint8_t cellsize; //cell size
int32_t imagesize; //uncompressed image size
int32_t disksize; //compressed image size
int32_t memsize; //memory image size
int32_t offs; //file offset
};
struct BinHeader
{
int32_t magic;
mint16_t version;
mint8_t numPlugins;
PluginEntry *plugins;
};
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
bool m_AmxxFile; // new 'AMXX' header format
BinHeader m_Bh; // binary header
int m_Entry; // entry #
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
inline bool IsOldFile() const { return m_OldFile; }
};
#endif // __AMXXFILE_H__

278
amxmodx/amxxlog.cpp Executable file
View File

@ -0,0 +1,278 @@
/* 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();
m_FoundError = false;
m_LoggedErrMap = false;
}
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);
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);
char file[256];
int i = 0;
while (true)
{
build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i);
FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists
if (!pTmpFile)
break;
fclose(pTmpFile);
++i;
}
m_LogFile.assign(file);
// 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");
} else {
fprintf(fp, "AMX Mod X log file started (file \"%s/L%02d%02d%03d.log\") (version \"%s\")\n", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i, AMX_VERSION);
fclose(fp);
}
}
void CLog::UseFile(const String &fileName)
{
static char file[256];
m_LogFile.assign(build_pathname_r(file, sizeof(file)-1, "%s/%s", g_log_dir.c_str(), fileName.c_str()));
}
void CLog::MapChange()
{
// create dir if not existing
char file[256];
#ifdef __linux
mkdir(build_pathname_r(file, sizeof(file)-1, "%s", g_log_dir.c_str()), 0700);
#else
mkdir(build_pathname_r(file, sizeof(file)-1, "%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...");
}
m_LoggedErrMap = false;
if (m_LogType == 2)
{
// create new logfile
CreateNewFile();
} else if (m_LogType == 1) {
Log("-------- Mapchange to %s --------", STRING(gpGlobals->mapname));
} else {
return;
}
}
void CLog::Log(const char *fmt, ...)
{
static char file[256];
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
static char msg[3072];
va_list arglst;
va_start(arglst, fmt);
vsnprintf(msg, 3071, fmt, arglst);
va_end(arglst);
FILE *pF = NULL;
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 {
build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday);
pF = fopen(file, "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", file);
m_LogType = 0;
return;
}
// print on server console
print_srvconsole("L %s: %s\n", date, msg);
} else if (m_LogType == 3) {
// build message
static char msg_[3072];
va_list arglst;
va_start(arglst, fmt);
vsnprintf(msg_, 3071, fmt, arglst);
va_end(arglst);
ALERT(at_logged, "%s\n", msg_);
}
}
void CLog::LogError(const char *fmt, ...)
{
static char file[256];
if (m_FoundError)
{
return;
}
// 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
static char msg[3072];
va_list arglst;
va_start(arglst, fmt);
vsnprintf(msg, sizeof(msg)-1, fmt, arglst);
va_end(arglst);
FILE *pF = NULL;
build_pathname_r(file, sizeof(file)-1, "%s/error_%02d%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100);
pF = fopen(file, "a+");
if (pF)
{
if (!m_LoggedErrMap)
{
fprintf(pF, "L %s: Start of error session.\n", date);
fprintf(pF, "L %s: Info (map \"%s\") (logfile \"error_%02d%02d%02d.log\")\n", date, STRING(gpGlobals->mapname), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100);
m_LoggedErrMap = true;
}
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 Error Logging disabled for this map.\n", file);
m_FoundError = true;
return;
}
// print on server console
print_srvconsole("L %s: %s\n", date, msg);
}

55
amxmodx/amxxlog.h Executable file
View File

@ -0,0 +1,55 @@
/* 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 __AMXXLOG_H__
#define __AMXXLOG_H__
class CLog
{
private:
String m_LogFile;
int m_LogType;
bool m_FoundError;
bool m_LoggedErrMap;
void GetLastFile(int &outMonth, int &outDay, String &outFilename);
void UseFile(const String &fileName);
public:
CLog();
~CLog();
void CreateNewFile();
void CloseFile();
void MapChange();
void Log(const char *fmt, ...);
void LogError(const char *fmt, ...);
};
#endif // __AMXXLOG_H__

362
amxmodx/binlog.cpp Normal file
View File

@ -0,0 +1,362 @@
#if defined BINLOG_ENABLED
#include <time.h>
#include "amxmodx.h"
#include "binlog.h"
#include "debugger.h"
BinLog g_BinLog;
int g_binlog_level = 0;
int g_binlog_maxsize = 0;
// Helper function to get a filename index
#define USHR(x) ((unsigned int)(x)>>1)
int LookupFile(AMX_DBG *amxdbg, ucell address)
{
int high, low, mid;
high = amxdbg->hdr->files;
low = -1;
while (high - low > 1)
{
mid = USHR(low + high);
if (amxdbg->filetbl[mid]->address <= address)
{
low = mid;
} else {
high = mid;
}
}
if (low == -1)
{
return -1;
}
return low;
}
bool BinLog::Open()
{
const char *data = get_localinfo("amxmodx_datadir", "addons/amxmodx/data");
char path[255];
build_pathname_r(path, sizeof(path)-1, "%s/binlogs", data);
if (!DirExists(path))
{
mkdir(path
#if defined __linux__
, 0755
#endif
);
if (!DirExists(path))
return false;
}
char file[255];
build_pathname_r(file, sizeof(file)-1, "%s/binlogs/lastlog", data);
unsigned int lastcntr = 0;
FILE *lastlog = fopen(file, "rb");
if (lastlog)
{
if (fread(&lastcntr, sizeof(int), 1, lastlog) != 1)
lastcntr = 0;
fclose(lastlog);
}
lastlog = fopen(file, "wb");
if (lastlog)
{
lastcntr++;
fwrite(&lastcntr, sizeof(int), 1, lastlog);
fclose(lastlog);
}
build_pathname_r(file, sizeof(file)-1, "%s/binlogs/binlog%04d.blg", data, lastcntr);
m_logfile.assign(file);
/**
* it's now safe to create the binary log
*/
FILE *fp = fopen(m_logfile.c_str(), "wb");
if (!fp)
return false;
int magic = BINLOG_MAGIC;
short vers = BINLOG_VERSION;
char c = sizeof(time_t);
fwrite(&magic, sizeof(int), 1, fp);
fwrite(&vers, sizeof(short), 1, fp);
fwrite(&c, sizeof(char), 1, fp);
WritePluginDB(fp);
fclose(fp);
m_state = true;
WriteOp(BinLog_Start, -1);
return true;
}
void BinLog::Close()
{
WriteOp(BinLog_End, -1);
m_state = false;
}
void BinLog::WriteOp(BinLogOp op, int plug, ...)
{
if (!m_state)
return;
FILE *fp = fopen(m_logfile.c_str(), "ab");
if (!fp)
return;
if (g_binlog_maxsize && op != BinLog_End)
{
fseek(fp, 0, SEEK_END);
if (ftell(fp) > (g_binlog_maxsize * (1024 * 1024)))
{
fclose(fp);
Close();
Open();
fp = fopen(m_logfile.c_str(), "ab");
if (!fp)
return;
}
}
unsigned char c = static_cast<char>(op);
time_t t = time(NULL);
float gt = gpGlobals->time;
fwrite(&c, sizeof(char), 1, fp);
fwrite(&t, sizeof(time_t), 1, fp);
fwrite(&gt, sizeof(float), 1, fp);
fwrite(&plug, sizeof(int), 1, fp);
va_list ap;
va_start(ap, plug);
AMX *amx = NULL;
bool debug = false;
AMX_DBG *dbg = NULL;
CPluginMngr::CPlugin *pl = NULL;
if (plug != -1)
{
pl = g_plugins.findPlugin(plug);
if ((debug = pl->isDebug()))
{
amx = pl->getAMX();
dbg = static_cast<Debugger *>(amx->userdata[UD_DEBUGGER])->m_pAmxDbg;
}
}
switch (c)
{
case BinLog_Registered:
{
const char *title = va_arg(ap, const char *);
const char *vers = va_arg(ap, const char *);
c = (char)strlen(title);
fwrite(&c, sizeof(char), 1, fp);
fwrite(title, sizeof(char), c+1, fp);
c = (char)strlen(vers);
fwrite(&c, sizeof(char), 1 ,fp);
fwrite(vers, sizeof(char), c+1, fp);
break;
}
case BinLog_NativeCall:
{
int file;
int native = va_arg(ap, int);
int params = va_arg(ap, int);
fwrite(&native, sizeof(int), 1, fp);
fwrite(&params, sizeof(int), 1, fp);
if (debug)
{
file = LookupFile(dbg, amx->cip);
fwrite(&file, sizeof(int), 1, fp);
} else {
file = 0;
fwrite(&file, sizeof(int), 1, fp);
}
break;
}
case BinLog_NativeRet:
{
cell retval = va_arg(ap, cell);
fwrite(&retval, sizeof(cell), 1, fp);
break;
}
case BinLog_NativeError:
{
int err = va_arg(ap, int);
const char *msg = va_arg(ap, const char *);
short len = (short)strlen(msg);
fwrite(&err, sizeof(int), 1, fp);
fwrite(&len, sizeof(short), 1, fp);
fwrite(msg, sizeof(char), len+1, fp);
break;
}
case BinLog_CallPubFunc:
{
int file;
int num = va_arg(ap, int);
fwrite(&num, sizeof(int), 1, fp);
if (debug)
{
file = LookupFile(dbg, amx->cip);
fwrite(&file, sizeof(int), 1, fp);
} else {
file = 0;
fwrite(&file, sizeof(int), 1, fp);
}
break;
}
case BinLog_SetLine:
{
int file;
int line = va_arg(ap, int);
fwrite(&line, sizeof(int), 1, fp);
if (debug)
{
file = LookupFile(dbg, amx->cip);
fwrite(&file, sizeof(int), 1, fp);
} else {
file = 0;
fwrite(&file, sizeof(int), 1, fp);
}
break;
}
case BinLog_FormatString:
{
int param = va_arg(ap, int);
int maxlen = va_arg(ap, int);
const char *str = va_arg(ap, const char *);
short len = (short)strlen(str);
fwrite(&param, sizeof(int), 1, fp);
fwrite(&maxlen, sizeof(int), 1, fp);
fwrite(&len, sizeof(short), 1, fp);
fwrite(str, sizeof(char), len+1, fp);
break;
}
case BinLog_NativeParams:
{
cell *params = va_arg(ap, cell *);
cell num = params[0] / sizeof(cell);
fwrite(&num, sizeof(cell), 1, fp);
for (cell i=1; i<=num; i++)
fwrite(&(params[i]), sizeof(cell), 1, fp);
break;
}
case BinLog_GetString:
{
cell addr = va_arg(ap, cell);
const char *str = va_arg(ap, const char *);
short len = (short)strlen(str);
fwrite(&addr, sizeof(cell), 1, fp);
fwrite(&len, sizeof(short), 1, fp);
fwrite(str, sizeof(char), len+1, fp);
break;
}
case BinLog_SetString:
{
cell addr = va_arg(ap, cell);
int maxlen = va_arg(ap, int);
const char *str = va_arg(ap, const char *);
short len = (short)strlen(str);
fwrite(&addr, sizeof(cell), 1, fp);
fwrite(&maxlen, sizeof(int), 1, fp);
fwrite(&len, sizeof(short), 1, fp);
fwrite(str, sizeof(char), len+1, fp);
break;
}
};
va_end(ap);
fclose(fp);
}
void BinLog::WritePluginDB(FILE *fp)
{
int num = g_plugins.getPluginsNum();
fwrite(&num, sizeof(int), 1, fp);
CPluginMngr::CPlugin *pl;
char c;
unsigned char len;
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
{
pl = &(*iter);
if (pl->isValid())
c = 1;
else
c = 0;
if (c && pl->isDebug())
c = 2;
fwrite(&c, sizeof(char), 1, fp);
if (c)
{
Debugger *pd = NULL;
len = (char)strlen(pl->getName());
fwrite(&len, sizeof(char), 1, fp);
len++;
fwrite(pl->getName(), sizeof(char), len, fp);
int natives, publics, files;
AMX *amx = pl->getAMX();
// Write the number of Filenames
if (c == 2)
{
pd = static_cast<Debugger *>(amx->userdata[UD_DEBUGGER]);
files = pd->m_pAmxDbg->hdr->files;
fwrite(&files, sizeof(int), 1, fp);
}
amx_NumNatives(amx, &natives);
amx_NumPublics(amx, &publics);
fwrite(&natives, sizeof(int), 1, fp);
fwrite(&publics, sizeof(int), 1, fp);
char name[34];
// Write the Filenames to the binfile
if (c == 2)
{
AMX_DBG_FILE **ftable = pd->m_pAmxDbg->filetbl;
for (int i=0; i<files; i++)
{
len = (char)strlen(ftable[i]->name);
fwrite(&len, sizeof(char), 1, fp);
len++;
fwrite(ftable[i]->name, sizeof(char), len, fp);
}
}
for (int i=0; i<natives; i++)
{
amx_GetNative(amx, i, name);
len = (char)strlen(name);
fwrite(&len, sizeof(char), 1, fp);
len++;
fwrite(name, sizeof(char), len, fp);
}
for (int i=0; i<publics; i++)
{
amx_GetPublic(amx, i, name);
len = (char)strlen(name);
fwrite(&len, sizeof(char), 1, fp);
len++;
fwrite(name, sizeof(char), len, fp);
}
} else {
char empty[] = " ";
len = 1;
fwrite(&len, sizeof(char), 1, fp);
fwrite(empty, sizeof(char), len, fp);
int no = 0;
fwrite(&no, sizeof(int), 1, fp);
fwrite(&no, sizeof(int), 1, fp);
}
}
}
#endif //BINLOG_ENABLED

84
amxmodx/binlog.h Normal file
View File

@ -0,0 +1,84 @@
#ifndef _INCLUDE_BINLOG_H
#define _INCLUDE_BINLOG_H
#if defined BINLOG_ENABLED
#include "CString.h"
#define BINLOG_MAGIC 0x414D424C
#define BINLOG_VERSION 0x0300
/**
* Format of binlog:
* uint32 magic
* uint16 version
* uint8 sizeof(time_t)
* uint32 num plugins
* [
* uint8 status codes
* str[int8] filename
* if(status==2)
* uint32 num filenames
* uint32 num natives
* uint32 num publics
* if (status==2)
* [
* str[uint8] file name
* ]
* [
* str[uint8] native name
* ]
* [
* str[uint8] public name
* ]
* ]
* [
* uint8 operation code
* time_t realtime
* float gametime
* int32 plugin id
* <extra info>
* ]
* If filename id is 0 skip as plugin was not in debug mode, if -1 there was an error.
*/
enum BinLogOp
{
BinLog_Start=1,
BinLog_End,
BinLog_NativeCall, //<int32 native id> <int32_t num_params> <int32_t filename id>
BinLog_NativeError, //<int32 errornum> <str[int16] string>
BinLog_NativeRet, //<cell value>
BinLog_CallPubFunc, //<int32 public id> <int32_t filename id>
BinLog_SetLine, //<int32 line no#> <int32_t filename id>
BinLog_Registered, //<string title> <string version>
BinLog_FormatString, //<int32 param#> <int32 maxlen> <str[int16] string>
BinLog_NativeParams, //<int32 num> <cell ...>
BinLog_GetString, //<cell addr> <string[int16]>
BinLog_SetString, //<cell addr> <int maxlen> <string[int16]>
};
class BinLog
{
public:
BinLog() : m_state(false)
{
};
public:
bool Open();
void Close();
void WriteOp(BinLogOp op, int plug, ...);
private:
void WritePluginDB(FILE *fp);
private:
String m_logfile;
bool m_state;
};
extern BinLog g_BinLog;
extern int g_binlog_level;
extern int g_binlog_maxsize;
#endif //BINLOG_ENABLED
#endif //_INCLUDE_BINLOG_H

1019
amxmodx/debugger.cpp Executable file

File diff suppressed because it is too large Load Diff

201
amxmodx/debugger.h Executable file
View File

@ -0,0 +1,201 @@
/* 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_DEBUGGER_H_
#define _INCLUDE_DEBUGGER_H_
#include "CVector.h"
#include "amxdbg.h"
/**
* Third revision of the AMX Mod X Plugin Debugger.
* This final, object oriented version is safe for multiple calls and lets you
* fine-tune error handling.
* -BAILOPAN
*/
class Debugger
{
public:
class Tracer
{
public:
struct trace_info
{
trace_info() : cip(0), frm(0), next(NULL), prev(NULL), used(false) {};
cell cip;
cell frm;
trace_info *next;
trace_info *prev;
bool used;
};
public:
Tracer() : m_Error(0), m_pStart(NULL), m_pEnd(NULL), m_Reset(true) {};
~Tracer();
public:
void StepI(cell frm, cell cip);
void Reset();
void Clear();
Debugger::Tracer::trace_info *GetStart() const;
Debugger::Tracer::trace_info *GetEnd() const;
public:
int m_Error;
private:
trace_info *m_pStart;
trace_info *m_pEnd;
bool m_Reset;
};
public:
Debugger(AMX *pAmx, AMX_DBG *pAmxDbg) : m_pAmx(pAmx), m_pAmxDbg(pAmxDbg), m_Top(-1)
{
_CacheAmxOpcodeList();
};
~Debugger();
public:
//Begin a trace for a function
void BeginExec();
//Step through one instruction
void StepI();
//Get/set the last traced error
int GetTracedError();
void SetTracedError(int error);
//Get the first trace info of the call stack
Debugger::Tracer::trace_info *GetTraceStart() const;
//Get extra info about the call stack
bool GetTraceInfo(Debugger::Tracer::trace_info *pTraceInfo, long &line, const char *&function, const char *&file);
//Get the next trace in the call stack, NULL if none
Debugger::Tracer::trace_info *GetNextTrace(Debugger::Tracer::trace_info *pTraceInfo);
//Returns true if an error exists
bool ErrorExists();
//Formats the error message into a buffer.
//returns length of data copied, or -1 if there is no error.
int FormatError(char *buffer, size_t maxLength);
//End a trace
void EndExec();
//Reset the internal states as if the debugger was inactive
void Reset();
//Destroy internal states for shutdown
void Clear();
void DisplayTrace(const char *message);
AMX *GetAMX() const { return m_pAmx; }
public:
//generic static opcode breaker
static int AMXAPI DebugHook(AMX *amx);
static void FmtGenericMsg(AMX *amx, int error, char buffer[], size_t maxLength);
static void GenericMessage(AMX *amx, int error);
private:
void _CacheAmxOpcodeList();
int _GetOpcodeFromCip(cell cip, cell *&addr);
cell _CipAsVa(cell cip);
const char *_GetFilename();
public:
AMX *m_pAmx;
AMX_DBG *m_pAmxDbg;
int m_Top;
cell *m_pOpcodeList;
String m_FileName;
CVector<Tracer *> m_pCalls;
};
typedef Debugger::Tracer::trace_info trace_info_t;
/**
* Error handler for plugins
*/
class Handler
{
public:
Handler(AMX *pAmx) : m_pAmx(pAmx), m_iErrFunc(-1), m_iModFunc(-1), m_iNatFunc(-1), m_Handling(false), m_InNativeFilter(false) {};
~Handler() {};
public:
int SetErrorHandler(const char *function);
int SetNativeFilter(const char *function);
int SetModuleFilter(const char *function);
public:
int HandleError(const char *msg);
int HandleNative(const char *native, int index, int trap);
int HandleModule(const char *module, bool isClass=false);
public:
bool IsHandling() const { return m_Handling; }
void SetErrorMsg(const char *msg);
const char *GetLastMsg();
trace_info_t *GetTrace() const { return m_pTrace; }
const char *GetFmtCache() { return m_FmtCache.c_str(); }
bool IsNativeFiltering() { return (m_iNatFunc > 0); }
bool InNativeFilter() { return m_InNativeFilter; }
private:
AMX *m_pAmx;
int m_iErrFunc;
int m_iModFunc;
int m_iNatFunc;
bool m_Handling;
//in the future, make this a stack!
bool m_InNativeFilter;
String m_MsgCache;
String m_FmtCache;
trace_info_t *m_pTrace;
};
extern AMX_NATIVE_INFO g_DebugNatives[];
#endif //_INCLUDE_DEBUGGER_H_

View File

@ -29,8 +29,6 @@
* version. * version.
*/ */
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h" #include "amxmodx.h"
int gmsgAmmoPickup; int gmsgAmmoPickup;
@ -60,9 +58,14 @@ WeaponsVault g_weaponsData[MAX_WEAPONS];
void Client_VGUIMenu(void* mValue) void Client_VGUIMenu(void* mValue)
{ {
if (!mPlayer) return; if (!mPlayer) return;
switch (mState++){
mPlayer->vgui = true;
switch (mState++)
{
case 0: case 0:
mPlayer->menu = -(*(int*)mValue); mPlayer->menu = -(*(int*)mValue);
mPlayer->newmenu = -1;
break; break;
case 1: case 1:
mPlayer->keys = *(int*)mValue; mPlayer->keys = *(int*)mValue;
@ -72,72 +75,97 @@ void Client_VGUIMenu(void* mValue)
void Client_ShowMenu(void* mValue) void Client_ShowMenu(void* mValue)
{ {
if (!mPlayer) return; if (!mPlayer) return;
switch (mState++){
mPlayer->vgui = true;
switch (mState++)
{
case 0: case 0:
mPlayer->keys = *(int*)mValue; mPlayer->keys = *(int*)mValue;
break; break;
case 3: case 3:
mPlayer->menu = g_menucmds.findMenuId( (char*)mValue ); {
mPlayer->menu = g_menucmds.findMenuId((char*)mValue);
mPlayer->newmenu = -1;
break;
}
} }
} }
extern bool g_bmod_tfc;
void Client_TeamInfo(void* mValue) void Client_TeamInfo(void* mValue)
{ {
if (mPlayer) return; if (mPlayer && !g_bmod_tfc) return;
static int index; static int index;
switch (mState++) {
switch (mState++)
{
case 0: case 0:
index = *(int*)mValue; index = *(int*)mValue;
break; break;
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);
break;
} }
} }
void Client_TextMsg(void* mValue) void Client_TextMsg(void* mValue)
{ {
if ( mPlayer ) return; if (mPlayer) return;
switch (mState++) {
case 1:{ switch (mState++)
{
case 1:
{
char * msg = (char*)mValue; char * msg = (char*)mValue;
if (!msg) break; if (!msg) break;
if ( !strncmp("#Game_C", msg , 7) ) {
if (!strncmp("#Game_C", msg, 7))
{
g_game_timeleft = g_game_restarting = gpGlobals->time + 3; g_game_timeleft = g_game_restarting = gpGlobals->time + 3;
// g_endround_time = gpGlobals->time; //g_endround_time = gpGlobals->time;
// g_newround_time = gpGlobals->time + CVAR_GET_FLOAT("mp_freezetime") + 3; //g_newround_time = gpGlobals->time + CVAR_GET_FLOAT("mp_freezetime") + 3;
} }
else if (!strncmp("#Game_w", msg , 7) ) { else if (!strncmp("#Game_w", msg, 7))
{
g_game_timeleft = -2; g_game_timeleft = -2;
} }
else if ( !strncmp("#game_clan_s", msg , 12) ){ else if (!strncmp("#game_clan_s", msg, 12))
{
g_game_timeleft = -3; g_game_timeleft = -3;
} }
break;
}
case 2:{
char * msg = (char*)mValue;
if (!msg) break;
if (g_game_timeleft == -2 ){
g_game_timeleft = g_game_restarting = gpGlobals->time + atoi( msg );
// g_newround_time = g_game_timeleft + CVAR_GET_FLOAT("mp_freezetime");
}
else if ( g_game_timeleft == -3 )
g_game_restarting = atoi( msg ) * 60;
break;
}
case 3:{
char * msg = (char*)mValue;
if (!msg) break;
if ( g_game_timeleft != -3 ) break;
g_game_restarting += atoi( msg );
g_game_timeleft = g_game_restarting = gpGlobals->time + g_game_restarting;
break;
}
}
break;
}
case 2:
{
char * msg = (char*)mValue;
if (!msg) break;
if (g_game_timeleft == -2)
{
g_game_timeleft = g_game_restarting = gpGlobals->time + atoi(msg);
//g_newround_time = g_game_timeleft + CVAR_GET_FLOAT("mp_freezetime");
}
else if (g_game_timeleft == -3)
g_game_restarting = atoi(msg) * 60.0f;
break;
}
case 3:
{
char * msg = (char*)mValue;
if (!msg) break;
if (g_game_timeleft != -3) break;
g_game_restarting += atoi(msg);
g_game_timeleft = g_game_restarting = gpGlobals->time + g_game_restarting;
break;
}
}
} }
void Client_WeaponList(void* mValue) void Client_WeaponList(void* mValue)
@ -146,7 +174,9 @@ void Client_WeaponList(void* mValue)
//static int wpnList2; //static int wpnList2;
static int iSlot; static int iSlot;
static const char* wpnName; static const char* wpnName;
switch (mState++) {
switch (mState++)
{
case 0: case 0:
wpnName = (char*)mValue; wpnName = (char*)mValue;
break; break;
@ -155,24 +185,12 @@ void Client_WeaponList(void* mValue)
break; break;
case 7: case 7:
int iId = *(int*)mValue; int iId = *(int*)mValue;
/*int* blocker; if ((iId < 0 || iId >= MAX_WEAPONS) || (wpnList & (1<<iId)))
int iwpn = iId;
if (iId > 31) {
iwpn -= 31;
blocker = &wpnList2;
}
else
blocker = &wpnList;*/
if ( (iId < 0 || iId >= MAX_WEAPONS ) || (wpnList & (1<<iId)) )
break; break;
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);
} }
} }
@ -180,7 +198,9 @@ void Client_CurWeapon(void* mValue)
{ {
static int iState; static int iState;
static int iId; static int iId;
switch (mState++){
switch (mState++)
{
case 0: case 0:
iState = *(int*)mValue; iState = *(int*)mValue;
break; break;
@ -190,7 +210,7 @@ void Client_CurWeapon(void* mValue)
break; break;
case 2: case 2:
if (!mPlayer) return; if (!mPlayer) return;
if (!iState || (iId < 1 || iId >= MAX_WEAPONS ) ) break; if (!iState || (iId < 1 || iId >= MAX_WEAPONS)) break;
mPlayer->weapons[iId].clip = *(int*)mValue; mPlayer->weapons[iId].clip = *(int*)mValue;
mPlayer->current = iId; mPlayer->current = iId;
mPlayer->lastHit = mPlayer->lastTrace; mPlayer->lastHit = mPlayer->lastTrace;
@ -199,15 +219,16 @@ void Client_CurWeapon(void* mValue)
void Client_AmmoX(void* mValue) void Client_AmmoX(void* mValue)
{ {
static int iAmmo; static int iAmmo;
switch (mState++){
switch (mState++)
{
case 0: case 0:
iAmmo = *(int*)mValue; iAmmo = *(int*)mValue;
break; break;
case 1: case 1:
if (!mPlayer) return; if (!mPlayer) return;
for(int i=1;i<MAX_WEAPONS;++i) for (int i = 1; i < MAX_WEAPONS; ++i)
if (iAmmo == g_weaponsData[i].ammoSlot) if (iAmmo == g_weaponsData[i].ammoSlot)
mPlayer->weapons[i].ammo = *(int*)mValue; mPlayer->weapons[i].ammo = *(int*)mValue;
} }
@ -216,13 +237,15 @@ void Client_AmmoX(void* mValue)
void Client_AmmoPickup(void* mValue) void Client_AmmoPickup(void* mValue)
{ {
static int iSlot; static int iSlot;
switch (mState++){
switch (mState++)
{
case 0: case 0:
iSlot = *(int*)mValue; iSlot = *(int*)mValue;
break; break;
case 1: case 1:
if (!mPlayer) return; if (!mPlayer) return;
for(int i=1;i<MAX_WEAPONS;++i) for (int i = 1; i < MAX_WEAPONS; ++i)
if (g_weaponsData[i].ammoSlot==iSlot) if (g_weaponsData[i].ammoSlot==iSlot)
mPlayer->weapons[i].ammo += *(int*)mValue; mPlayer->weapons[i].ammo += *(int*)mValue;
} }
@ -232,7 +255,9 @@ void Client_ScoreInfo(void* mValue)
{ {
static int index; static int index;
static int deaths; static int deaths;
switch (mState++){
switch (mState++)
{
case 0: case 0:
index = *(int*)mValue; index = *(int*)mValue;
break; break;
@ -240,12 +265,12 @@ void Client_ScoreInfo(void* mValue)
deaths = *(int*)mValue; deaths = *(int*)mValue;
break; break;
case 4: case 4:
if ( index < 1 || index > gpGlobals->maxClients ) break; if (index < 1 || index > gpGlobals->maxClients) break;
CPlayer*pPlayer = GET_PLAYER_POINTER_I( index ); CPlayer*pPlayer = GET_PLAYER_POINTER_I(index);
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);
} }
} }
@ -253,14 +278,14 @@ void Client_DamageEnd(void* mValue)
{ {
CPlayer* dead = mPlayer; CPlayer* dead = mPlayer;
if ( dead && dead->death_killer ) if (dead && dead->death_killer)
{ {
g_events.parserInit( CS_DEATHMSG , &gpGlobals->time , mPlayer = 0, mPlayerIndex = 0 ); g_events.parserInit(CS_DEATHMSG, &gpGlobals->time, mPlayer = 0, mPlayerIndex = 0);
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;
} }
@ -274,26 +299,23 @@ void Client_DeathMsg(void* mValue)
static int victim_id; static int victim_id;
static int hs; static int hs;
switch (mState++){ switch (mState++)
{
case 0: case 0:
killer_id = *(int*)mValue; killer_id = *(int*)mValue;
killer = (killer_id > 0 && killer_id < 33) ? killer = (killer_id > 0 && killer_id < 33) ? GET_PLAYER_POINTER_I(killer_id) : 0;
GET_PLAYER_POINTER_I(killer_id) : 0;
break; break;
case 1: case 1:
victim_id = *(int*)mValue; victim_id = *(int*)mValue;
victim = (victim_id > 0 && victim_id < 33) ? victim = (victim_id > 0 && victim_id < 33) ? GET_PLAYER_POINTER_I(victim_id) : 0;
GET_PLAYER_POINTER_I(victim_id) : 0;
break; break;
case 2: case 2:
hs = *(int*)mValue; hs = *(int*)mValue;
break; break;
case 3: case 3:
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);
} }

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,27 @@
* version. * version.
*/ */
#include "CString.h" #include "amxmodx.h"
#include "string.h" #include "fakemeta.h"
#include "CFile.h"
String::String() int LoadMetamodPlugin(const char *path, void **handle, PLUG_LOADTIME now)
{ {
len = 0; int err = 0;
napis = 0; if ( (err = LOAD_PLUGIN(PLID, path, now, handle)) || !*handle)
} {
LOG_MESSAGE(PLID, "Can't Attach Module \"%s\".", path);
String::String( const char* n ) return 0;
{
napis = 0;
set(n);
}
String::~String()
{
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;
} }
return 1;
} }
void String::clear() { int UnloadMetamodPlugin(void *handle)
delete[] napis; {
napis = 0; if (UNLOAD_PLUGIN_BY_HANDLE(PLID, (void *)handle, PT_ANYTIME, PNL_PLUGIN))
len = 0; {
} return 0;
}
return 1;
}

37
amxmodx/fakemeta.h Executable file
View File

@ -0,0 +1,37 @@
/* 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__
int UnloadMetamodPlugin(void *handle);
int LoadMetamodPlugin(const char *path, void **handle, PLUG_LOADTIME now);
#endif // #ifndef __FAKEMETA_H__

View File

@ -35,25 +35,44 @@
#define _INTPTR_T_DEFINED #define _INTPTR_T_DEFINED
#endif #endif
#include <extdll.h> #ifdef __GNUC__
#include <meta_api.h> #include <stdio.h>
#include "amxmodx.h" #include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#endif
// header file for unlink() // header file for unlink()
#ifdef __linux__ #ifdef __linux__
#include <unistd.h> #include <unistd.h>
#else #else
#define WINDOWS_LEAN_AND_MEAN
#include <windows.h>
#include <io.h> #include <io.h>
#endif #endif
#ifdef __GNUC__ #include "amxmodx.h"
//#include <stddef.h> CVector<FILE *> FileList;
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#endif class AutoFilePtr
{
FILE *m_FP;
public:
AutoFilePtr(FILE *fp) : m_FP(fp)
{}
~AutoFilePtr()
{
if (m_FP)
fclose(m_FP);
}
operator FILE* ()
{
return m_FP;
}
};
static cell AMX_NATIVE_CALL read_dir(AMX *amx, cell *params) static cell AMX_NATIVE_CALL read_dir(AMX *amx, cell *params)
{ {
@ -61,20 +80,26 @@ static cell AMX_NATIVE_CALL read_dir(AMX *amx, cell *params)
int a; int a;
struct dirent *ep; struct dirent *ep;
DIR *dp; DIR *dp;
char* dirname = build_pathname("%s",get_amxstring(amx,params[1],0,a) ); char* dirname = build_pathname("%s", get_amxstring(amx, params[1], 0, a));
a = params[2]; a = params[2];
if ( (dp = opendir (dirname)) == NULL )
if ((dp = opendir (dirname)) == NULL)
return 0; return 0;
seekdir( dp , a );
if ( (ep = readdir (dp)) != NULL ) { seekdir(dp, a);
cell *length = get_amxaddr(amx,params[5]);
*length = set_amxstring(amx,params[3], ep->d_name ,params[4]); if ((ep = readdir (dp)) != NULL)
a = telldir( dp ); {
} cell *length = get_amxaddr(amx, params[5]);
else *length = set_amxstring(amx, params[3], ep->d_name, params[4]);
a = telldir(dp);
} else
a = 0; a = 0;
closedir (dp); closedir (dp);
return a; return a;
#else #else
int tmp; int tmp;
char *dirname = build_pathname("%s/*", get_amxstring(amx, params[1], 0, tmp)); char *dirname = build_pathname("%s/*", get_amxstring(amx, params[1], 0, tmp));
@ -82,10 +107,12 @@ static cell AMX_NATIVE_CALL read_dir(AMX *amx, cell *params)
_finddata_t fd; _finddata_t fd;
intptr_t handle = _findfirst(dirname, &fd); intptr_t handle = _findfirst(dirname, &fd);
if (handle < 0) if (handle < 0)
return 0; return 0;
++tmp; ++tmp;
for (int i = 0; i < tmp; ++i) for (int i = 0; i < tmp; ++i)
{ {
if (_findnext(handle, &fd) < 0) if (_findnext(handle, &fd) < 0)
@ -94,8 +121,9 @@ static cell AMX_NATIVE_CALL read_dir(AMX *amx, cell *params)
break; break;
} }
} }
// current data in fd // current data in fd
cell *length = get_amxaddr(amx,params[5]); // pointer to the outLen parameter cell *length = get_amxaddr(amx, params[5]); // pointer to the outLen parameter
*length = set_amxstring(amx, params[3], fd.name, params[4]); // set output and outLen parameters *length = set_amxstring(amx, params[3], fd.name, params[4]); // set output and outLen parameters
_findclose(handle); _findclose(handle);
@ -106,142 +134,203 @@ static cell AMX_NATIVE_CALL read_dir(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL read_file(AMX *amx, cell *params) /* 5 param */ static cell AMX_NATIVE_CALL read_file(AMX *amx, cell *params) /* 5 param */
{ {
int iLen; int iLen;
char* szFile = get_amxstring(amx,params[1],0,iLen); char* szFile = get_amxstring(amx, params[1], 0, iLen);
FILE*fp; FILE *fp;
if ( (fp =fopen(build_pathname("%s",szFile),"r")) == NULL) {
amx_RaiseError(amx,AMX_ERR_NATIVE); if ((fp =fopen(build_pathname("%s", szFile), "r")) == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't read file \"%s\"", szFile);
return 0; return 0;
} }
char buffor[1024]; char buffor[1024];
int i = 0, iLine = params[2]; int i = 0, iLine = params[2];
while((i <= iLine) && fgets(buffor,1023,fp) )
while ((i <= iLine) && fgets(buffor, 1023, fp))
i++; i++;
fclose(fp); fclose(fp);
if (i > iLine){
if (i > iLine)
{
int len = strlen(buffor); int len = strlen(buffor);
if (buffor[len-1]=='\n')
buffor[--len]=0; if (buffor[len - 1] == '\n')
if (buffor[len-1]=='\r') buffor[--len] = 0;
buffor[--len]=0;
cell *length = get_amxaddr(amx,params[5]); if (buffor[len - 1] == '\r')
*length = set_amxstring(amx,params[3],buffor,params[4]); buffor[--len] = 0;
cell *length = get_amxaddr(amx, params[5]);
*length = set_amxstring(amx, params[3], buffor, params[4]);
return i; return i;
} }
return 0; return 0;
} }
static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */ static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */
{ {
int i; int i;
char* sFile = build_pathname("%s", get_amxstring(amx,params[1],0,i) ); char* sFile = build_pathname("%s", get_amxstring(amx, params[1], 0, i));
char* sText = get_amxstring(amx,params[2],0,i); char* sText = get_amxstring(amx, params[2], 0, i);
FILE* pFile; FILE* pFile;
int iLine = params[3]; int iLine = params[3];
// apending to the end // apending to the end
if (iLine < 0) { if (iLine < 0)
if ( (pFile = fopen( sFile ,"a")) == NULL ){ {
amx_RaiseError(amx,AMX_ERR_NATIVE); if ((pFile = fopen(sFile, "a")) == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
return 0; return 0;
} }
fputs( sText , pFile );
fputc( '\n', pFile ); fputs(sText, pFile);
fclose( pFile ); fputc('\n', pFile);
fclose(pFile);
return 1; return 1;
} }
// creating a new file with a line in a middle // creating a new file with a line in a middle
if ( (pFile = fopen(sFile,"r")) == NULL ) { if ((pFile = fopen(sFile, "r")) == NULL)
if ( (pFile = fopen(sFile,"w")) == NULL ){ {
amx_RaiseError(amx,AMX_ERR_NATIVE); if ((pFile = fopen(sFile, "w")) == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
return 0; return 0;
} }
for(i=0;i < iLine;++i)
fputc('\n',pFile); for (i = 0; i < iLine; ++i)
fputs( sText , pFile ); fputc('\n', pFile);
fputc( '\n', pFile );
fputs(sText, pFile);
fputc('\n', pFile);
fclose(pFile); fclose(pFile);
return 1; return 1;
} }
// adding a new line in a middle of already existing file // adding a new line in a middle of already existing file
FILE* pTemp; FILE* pTemp;
char buffor[1024]; char buffor[2048];
if ( (pTemp = tmpfile()) == NULL ){ if ((pTemp = tmpfile()) == NULL)
amx_RaiseError(amx,AMX_ERR_NATIVE); {
LogError(amx, AMX_ERR_NATIVE, "Couldn't create temp file");
return 0; return 0;
} }
for(i=0;;++i){ for (i = 0; ; ++i)
if ( i == iLine ){ {
fgets(buffor,1023,pFile); if (i == iLine)
fputs( sText , pTemp ); {
fputc( '\n', pTemp ); fgets(buffor, 2047, pFile);
fputs(sText, pTemp);
fputc('\n', pTemp);
} }
else if ( fgets(buffor,1023,pFile) ){ else if (fgets(buffor, 2047, pFile))
fputs(buffor , pTemp ); {
fputs(buffor, pTemp);
} }
else if ( i < iLine ) { else if (i < iLine)
fputc( '\n', pTemp ); {
fputc('\n', pTemp);
} }
else break; else
break;
} }
fclose(pFile); fclose(pFile);
rewind(pTemp); rewind(pTemp);
// now rewrite because file can be now smaller... // now rewrite because file can be now smaller...
if ( (pFile = fopen(sFile,"w")) == NULL ){ if ((pFile = fopen(sFile, "w")) == NULL)
amx_RaiseError(amx,AMX_ERR_NATIVE); {
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
return 0; return 0;
} }
while(fgets(buffor,1023,pTemp)) while (fgets(buffor, 2047, pTemp))
fputs(buffor,pFile ); fputs(buffor, pFile);
fclose(pTemp); fclose(pTemp);
fclose(pFile); fclose(pFile);
return 1; return 1;
} }
static cell AMX_NATIVE_CALL delete_file(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL delete_file(AMX *amx, cell *params) /* 1 param */
{ {
int iLen; int iLen;
char* sFile = get_amxstring(amx,params[1],0,iLen); char* sFile = get_amxstring(amx, params[1], 0, iLen);
return (unlink( build_pathname("%s",sFile) )?0:1);
return (unlink(build_pathname("%s", sFile)) ? 0 : 1);
} }
static cell AMX_NATIVE_CALL file_exists(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL file_exists(AMX *amx, cell *params) /* 1 param */
{ {
int iLen; int iLen;
char* sFile = get_amxstring(amx,params[1],0,iLen); char *sFile = get_amxstring(amx, params[1], 0, iLen);
FILE* fp = fopen(build_pathname("%s",sFile),"r"); char *file = build_pathname("%s", sFile);
if ( fp != NULL) {
fclose(fp); #if defined WIN32 || defined _WIN32
return 1; DWORD attr = GetFileAttributes(file);
}
if (attr == INVALID_FILE_ATTRIBUTES)
return 0; return 0;
if (attr == FILE_ATTRIBUTE_DIRECTORY)
return 0;
return 1;
#else
struct stat s;
if (stat(file, &s) != 0)
return 0;
if (S_ISDIR(s.st_mode))
return 0;
return 1;
#endif
}
static cell AMX_NATIVE_CALL dir_exists(AMX *amx, cell *params) /* 1 param */
{
int iLen;
char *sFile = get_amxstring(amx, params[1], 0, iLen);
char *file = build_pathname("%s", sFile);
return DirExists(file) ? 1 : 0;
} }
static cell AMX_NATIVE_CALL file_size(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL file_size(AMX *amx, cell *params) /* 1 param */
{ {
int iLen; int iLen;
char* sFile = get_amxstring(amx,params[1],0,iLen); char* sFile = get_amxstring(amx, params[1], 0, iLen);
FILE* fp = fopen(build_pathname("%s",sFile),"r"); AutoFilePtr fp(fopen(build_pathname("%s", sFile), "r"));
if ( fp != NULL) {
if ( params[0] < 2 || params[2] == 0 ){ if (fp != NULL)
fseek(fp,0,SEEK_END); {
if (params[0] < 2 || params[2] == 0)
{
fseek(fp, 0, SEEK_END);
int size = ftell(fp); int size = ftell(fp);
fclose(fp);
return size; return size;
} }
else if ( params[2] == 1 ){ else if (params[2] == 1)
{
int a = 0,lines = 0; int a = 0,lines = 0;
while( a != EOF ){
while (a != EOF)
{
++lines; ++lines;
while ( (a = fgetc(fp)) != '\n' && a != EOF ) while ((a = fgetc(fp)) != '\n' && a != EOF);
;
} }
//int a, b = '\n'; //int a, b = '\n';
//while( (a = fgetc(fp)) != EOF ){ //while( (a = fgetc(fp)) != EOF ){
@ -253,23 +342,519 @@ static cell AMX_NATIVE_CALL file_size(AMX *amx, cell *params) /* 1 param */
// ++lines; // ++lines;
return lines; return lines;
} }
else if ( params[2] == 2 ){ else if (params[2] == 2)
fseek(fp,-1,SEEK_END); {
if ( fgetc(fp) == '\n' ) fseek(fp, -1, SEEK_END);
if (fgetc(fp) == '\n')
return 1; return 1;
return 0; return 0;
} }
} }
return -1; return -1;
} }
AMX_NATIVE_INFO file_Natives[] = { static cell AMX_NATIVE_CALL amx_fopen(AMX *amx, cell *params)
{ "delete_file", delete_file }, {
{ "file_exists", file_exists }, int len;
{ "file_size", file_size }, char *file = build_pathname("%s", get_amxstring(amx, params[1], 1, len));
{ "read_dir", read_dir }, char *flags = get_amxstring(amx, params[2], 0, len);
{ "read_file", read_file },
{ "write_file", write_file },
{ NULL, NULL }
};
FILE *fp = fopen(file, flags);
return (cell)fp;
}
static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
cell *addr = get_amxaddr(amx, params[2]);
size_t blocks = params[3];
size_t btmp = blocks;
cell mode = params[4];
switch (mode)
{
case 1:
{
char *a = new char[blocks];
while (btmp--)
*a++ = static_cast<char>(*addr++);
size_t res = fwrite(a, sizeof(char), blocks, fp);
delete [] a;
return res;
}
case 2:
{
short *a = new short[blocks];
while (btmp--)
*a++ = static_cast<short>(*addr++);
size_t res = fwrite(a, sizeof(short), blocks, fp);
delete [] a;
return res;
}
case 4:
{
int *a = new int[blocks];
while (btmp--)
*a++ = static_cast<int>(*addr++);
size_t res = fwrite(a, sizeof(int), blocks, fp);
delete [] a;
return res;
}
}
return 0;
}
static cell AMX_NATIVE_CALL amx_fwrite(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
size_t mode = params[3];
switch (mode)
{
case 1:
{
char a = static_cast<char>(params[2]);
return fwrite(&a, sizeof(char), 1, fp);
}
case 2:
{
short b = static_cast<short>(params[2]);
return fwrite(&b, sizeof(short), 1, fp);
}
case 4:
{
int c = static_cast<int>(params[2]);
return fwrite(&c, sizeof(short), 1, fp);
}
}
return 0;
}
static cell AMX_NATIVE_CALL amx_fwrite_raw(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
cell *addr = get_amxaddr(amx, params[2]);
return fwrite(addr, params[3], params[4], fp);
}
static cell AMX_NATIVE_CALL amx_fread_raw(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
cell *addr = get_amxaddr(amx, params[2]);
size_t size = static_cast<cell>(params[3]);
size_t blocks = static_cast<cell>(params[4]);
return fread(addr, size, blocks, fp);
}
static cell AMX_NATIVE_CALL amx_fread(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
cell *addr = get_amxaddr(amx, params[2]);
switch (params[3])
{
case 1: //char
{
char a;
size_t res = fread(&a, sizeof(char), 1, fp);
*addr = static_cast<cell>(a);
return res;
}
case 2: //short
{
short a;
size_t res = fread(&a, sizeof(short), 1, fp);
*addr = static_cast<cell>(a);
return res;
}
case 4: //int
default:
{
int a;
size_t res = fread(&a, sizeof(int), 1, fp);
*addr = static_cast<cell>(a);
return res;
}
}
return 0;
}
static cell AMX_NATIVE_CALL amx_fread_blocks(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
cell *addr = get_amxaddr(amx, params[2]);
size_t blocks = params[3];
switch (params[3])
{
case 1: //char
{
char *a = new char[blocks];
char *ptr = a;
size_t res = fread(a, sizeof(char), blocks, fp);
while (blocks--)
*addr++ = static_cast<cell>(*ptr++);
delete [] a;
return res;
}
case 2: //short
{
short *a = new short[blocks];
short *ptr = a;
size_t res = fread(a, sizeof(short), blocks, fp);
while (blocks--)
*addr++ = static_cast<cell>(*ptr++);
delete [] a;
return res;
}
case 4: //int
default:
{
int *a = new int[blocks];
int *ptr = a;
size_t res = fread(a, sizeof(int), blocks, fp);
while (blocks--)
*addr++ = static_cast<cell>(*ptr++);
delete [] a;
return res;
}
}
return 0;
}
static cell AMX_NATIVE_CALL amx_fputs(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
int len;
char *str = get_amxstring(amx, params[2], 0, len);
return fputs(str, fp);
}
static cell AMX_NATIVE_CALL amx_fgets(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
static char buffer[4096];
buffer[0] = '\0';
fgets(buffer, sizeof(buffer)-1, fp);
return set_amxstring(amx, params[2], buffer, params[3]);
}
static cell AMX_NATIVE_CALL amx_fseek(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
return fseek(fp, params[2], params[3]);
}
static cell AMX_NATIVE_CALL amx_ftell(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
return ftell(fp);
}
static cell AMX_NATIVE_CALL amx_fprintf(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
int len;
char *str = format_amxstring(amx, params, 2, len);
return fprintf(fp, "%s", str);
}
static cell AMX_NATIVE_CALL amx_feof(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 1;
return feof(fp);
}
static cell AMX_NATIVE_CALL amx_fclose(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 1;
fclose(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;
AutoFilePtr fp(fopen(file, "rb"));
if (fp)
{
fseek(fp, 0, SEEK_END);
size = ftell(fp);
return size;
}
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]);
}
static cell AMX_NATIVE_CALL amx_open_dir(AMX *amx, cell *params)
{
int len;
char *path = get_amxstring(amx, params[1], 0, len);
#if defined WIN32 || defined _WIN32
char *dirname = build_pathname("%s\\*", path);
WIN32_FIND_DATA fd;
HANDLE hFile = FindFirstFile(dirname, &fd);
if (hFile == INVALID_HANDLE_VALUE)
return 0;
set_amxstring(amx, params[2], fd.cFileName, params[3]);
return (DWORD)hFile;
#else
char *dirname = build_pathname("%s", path);
DIR *dp = opendir(dirname);
if (!dp)
return 0;
struct dirent *ep = readdir(dp);
if (!ep)
{
closedir(dp);
return 0;
}
set_amxstring(amx, params[2], ep->d_name, params[3]);
return (cell)dp;
#endif
}
static cell AMX_NATIVE_CALL amx_close_dir(AMX *amx, cell *params)
{
#if defined WIN32 || defined _WIN32
HANDLE hFile = (HANDLE)((DWORD)params[1]);
if (hFile == INVALID_HANDLE_VALUE || hFile == NULL)
return 0;
FindClose(hFile);
return 1;
#else
DIR *dp = (DIR *)params[1];
if (!dp)
return 0;
closedir(dp);
return 1;
#endif
}
static cell AMX_NATIVE_CALL amx_get_dir(AMX *amx, cell *params)
{
#if defined WIN32 || defined _WIN32
HANDLE hFile = (HANDLE)((DWORD)params[1]);
if (hFile == INVALID_HANDLE_VALUE || hFile == NULL)
return 0;
WIN32_FIND_DATA fd;
if (!FindNextFile(hFile, &fd))
return 0;
set_amxstring(amx, params[2], fd.cFileName, params[3]);
return 1;
#else
DIR *dp = (DIR *)params[1];
if (!dp)
return 0;
struct dirent *ep = readdir(dp);
if (!ep)
return 0;
set_amxstring(amx, params[2], ep->d_name, params[3]);
return 1;
#endif
}
//native fgetc( file );
static cell AMX_NATIVE_CALL amx_fgetc(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
return fgetc(fp);
}
//native fputc( file, data );
static cell AMX_NATIVE_CALL amx_fputc(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
return fputc(static_cast<int>(params[2]), fp);
}
//native ungetc( file, data );
static cell AMX_NATIVE_CALL amx_ungetc(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
return ungetc(static_cast<int>(params[2]), fp);
}
#if defined __linux__
#define _rmdir rmdir
#endif
static cell AMX_NATIVE_CALL amx_rmdir(AMX *amx, cell *params)
{
int len;
char* sFile = build_pathname("%s", get_amxstring(amx, params[1], 0, len));
if (_rmdir(sFile) != 0)
return 0;
return 1;
}
static cell AMX_NATIVE_CALL amx_rename(AMX *amx, cell *params)
{
int len;
char f_old_r[260];
char f_new_r[260];
char *fold = get_amxstring(amx, params[1], 0, len);
char *fnew = get_amxstring(amx, params[2], 1, len);
if (params[0] / sizeof(cell) == 3 && params[3])
{
build_pathname_r(f_old_r, sizeof(f_old_r)-1, "%s", fold);
build_pathname_r(f_new_r, sizeof(f_new_r)-1, "%s", fnew);
} else {
snprintf(f_old_r, sizeof(f_old_r)-1, "%s", fold);
snprintf(f_new_r, sizeof(f_new_r)-1, "%s", fnew);
}
#if defined __linux__
return (rename(f_old_r, f_new_r) == 0);
#elif defined WIN32
return MoveFileA(f_old_r, f_new_r);
#endif
}
AMX_NATIVE_INFO file_Natives[] =
{
{"delete_file", delete_file},
{"file_exists", file_exists},
{"file_size", file_size},
{"read_dir", read_dir},
{"read_file", read_file},
{"write_file", write_file},
//new, sane file natives
{"fopen", amx_fopen},
{"fclose", amx_fclose},
{"fread", amx_fread},
{"fread_blocks", amx_fread_blocks},
{"fread_raw", amx_fread_raw},
{"fwrite", amx_fwrite},
{"fwrite_blocks", amx_fwrite_blocks},
{"fwrite_raw", amx_fwrite_raw},
{"feof", amx_feof},
{"fprintf", amx_fprintf},
{"fgets", amx_fgets},
{"fseek", amx_fseek},
{"ftell", amx_ftell},
{"filesize", amx_filesize},
{"unlink", delete_file},
{"build_pathname", amx_build_pathname},
{"dir_exists", dir_exists},
{"open_dir", amx_open_dir},
{"close_dir", amx_close_dir},
{"next_file", amx_get_dir},
{"fgetc", amx_fgetc},
{"fputc", amx_fputc},
{"fungetc", amx_ungetc},
{"rmdir", amx_rmdir},
{"fputs", amx_fputs},
{"rename_file", amx_rename},
{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_GetStringOld(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,9 +351,124 @@ 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);
}
#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 = 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__
#pragma argsused
#endif
/* Added by DS */
static cell AMX_NATIVE_CALL n_floatsinh(AMX *amx, cell *params)
{
/*
* params[1] = angle
* params[2] = radix
*/
REAL fA = amx_ctof(params[1]);
fA = ToRadians(fA, params[2]);
fA = sinh(fA);
return amx_ftoc(fA);
}
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
/* Added by DS */
static cell AMX_NATIVE_CALL n_floatcosh(AMX *amx, cell *params)
{
/*
* params[1] = angle
* params[2] = radix
*/
REAL fA = amx_ctof(params[1]);
fA = ToRadians(fA, params[2]);
fA = cosh(fA);
return amx_ftoc(fA);
}
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
/* Added by DS */
static cell AMX_NATIVE_CALL n_floattanh(AMX *amx, cell *params)
{
/*
* params[1] = angle
* params[2] = radix
*/
REAL fA = amx_ctof(params[1]);
fA = ToRadians(fA, params[2]);
fA = tanh(fA);
return amx_ftoc(fA); return amx_ftoc(fA);
} }
@ -342,7 +478,7 @@ static cell AMX_NATIVE_CALL n_floattan(AMX *amx,cell *params)
/******************************************************************/ /******************************************************************/
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 +500,13 @@ 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 },
{ "floatsinh", n_floatsinh },
{ "floatcosh", n_floatcosh },
{ "floattanh", n_floattanh },
{ NULL, NULL } /* terminator */ { NULL, NULL } /* terminator */
}; };

508
amxmodx/format.cpp Normal file
View File

@ -0,0 +1,508 @@
#include "amxmodx.h"
#include "format.h"
#include "amxmod_compat.h"
//Adapted from Quake3's vsprintf
// thanks to cybermind for linking me to this :)
//I made the following changes:
// - Fixed spacing to be AMX Mod X standard
// - Added 'n' support, no buffer overflows
// - Templatized input/output buffers
#define ALT 0x00000001 /* alternate form */
#define HEXPREFIX 0x00000002 /* add 0x or 0X prefix */
#define LADJUST 0x00000004 /* left adjustment */
#define LONGDBL 0x00000008 /* long double */
#define LONGINT 0x00000010 /* long integer */
#define QUADINT 0x00000020 /* quad integer */
#define SHORTINT 0x00000040 /* short integer */
#define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */
#define FPT 0x00000100 /* floating point number */
#define to_digit(c) ((c) - '0')
#define is_digit(c) ((unsigned)to_digit(c) <= 9)
#define to_char(n) ((n) + '0')
#define CHECK_ARGS(n) \
if ((arg+n) > args) { \
LogError(amx, AMX_ERR_PARAMS, "String formatted incorrectly - parameter %d (total %d)", arg, args); \
return 0; \
}
THash<String, lang_err> BadLang_Table;
static cvar_t *amx_mldebug = NULL;
static cvar_t *amx_cl_langs = NULL;
const char *translate(AMX *amx, cell amxaddr, const char *key)
{
const char *pLangName = NULL;
const char *def = NULL;
int status;
cell *addr = get_amxaddr(amx, amxaddr);
char name[4];
if (addr[0] == LANG_PLAYER)
{
if (!amx_cl_langs)
amx_cl_langs = CVAR_GET_POINTER("amx_client_languages");
if ( (int)amx_cl_langs->value == 0 )
{
pLangName = g_vault.get("server_language");
} else {
pLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(g_langMngr.GetDefLang())->pEdict, "lang");
}
} else if (addr[0] == LANG_SERVER) {
pLangName = g_vault.get("server_language");
} else if (addr[0] >= 1 && addr[0] <= gpGlobals->maxClients) {
if (!amx_cl_langs)
amx_cl_langs = CVAR_GET_POINTER("amx_client_languages");
if ( (int)amx_cl_langs->value == 0 )
{
pLangName = g_vault.get("server_language");
} else {
pLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(addr[0])->pEdict, "lang");
}
} else {
get_amxstring_r(amx, amxaddr, name, 3);
pLangName = name;
}
if (!pLangName || !isalpha(pLangName[0]))
pLangName = "en";
//next parameter!
def = g_langMngr.GetDef(pLangName, key, status);
if (!amx_mldebug)
amx_mldebug = CVAR_GET_POINTER("amx_mldebug");
bool debug = (amx_mldebug && amx_mldebug->string && (amx_mldebug->string[0] != '\0'));
if (debug)
{
int debug_status;
bool validlang = true;
const char *testlang = amx_mldebug->string;
if (!g_langMngr.LangExists(testlang))
{
AMXXLOG_Error("[AMXX] \"%s\" is an invalid debug language", testlang);
validlang = false;
}
g_langMngr.GetDef(testlang, key, debug_status);
if (validlang && debug_status == ERR_BADKEY)
AMXXLOG_Error("[AMXX] Language key \"%s\" not found for language \"%s\", check \"%s\"", key, testlang, GetFileName(amx));
}
if (def == NULL)
{
if (debug)
{
if (status == ERR_BADLANG && (BadLang_Table.AltFindOrInsert(pLangName).last + 120.0f < gpGlobals->time))
{
AMXXLOG_Error("[AMXX] Language \"%s\" not found", pLangName);
BadLang_Table.AltFindOrInsert(pLangName).last = gpGlobals->time;
}
}
if (addr[0] != LANG_SERVER)
def = g_langMngr.GetDef(g_vault.get("server_language"), key, status);
if (!def && (strcmp(pLangName, "en") != 0 && strcmp(g_vault.get("server_language"), "en") != 0))
def = g_langMngr.GetDef("en", key, status);
}
return def;
}
template <typename U>
void AddString(U **buf_p, size_t &maxlen, const cell *string, int width, int prec)
{
int size = 0;
U *buf;
static cell nlstr[] = {'(','n','u','l','l',')','\0'};
buf = *buf_p;
if (string == NULL)
{
string = nlstr;
prec = -1;
}
if (prec >= 0)
{
for (size = 0; size < prec; size++)
{
if (string[size] == '\0')
break;
}
} else {
while (string[size++]) ;
size--;
}
if (size > (int)maxlen)
size = maxlen;
maxlen -= size;
width -= size;
while (size--)
*buf++ = static_cast<U>(*string++);
while (width-- > 0 && maxlen)
{
*buf++ = ' ';
maxlen--;
}
*buf_p = buf;
}
template <typename U>
void AddFloat(U **buf_p, size_t &maxlen, double fval, int width, int prec)
{
U text[32];
int digits;
double signedVal;
U *buf;
int val;
// get the sign
signedVal = fval;
if (fval < 0)
fval = -fval;
// write the float number
digits = 0;
val = (int)fval;
do {
text[digits++] = '0' + val % 10;
val /= 10;
} while (val);
if (signedVal < 0)
text[digits++] = '-';
buf = *buf_p;
while (digits < width && maxlen)
{
*buf++ = ' ';
width--;
maxlen--;
}
while (digits-- && maxlen)
{
*buf++ = text[digits];
maxlen--;
}
*buf_p = buf;
if (prec < 0)
prec = 6;
// write the fraction
digits = 0;
while (digits < prec)
{
fval -= (int) fval;
fval *= 10.0;
val = (int) fval;
text[digits++] = '0' + val % 10;
}
if (digits > 0 && maxlen)
{
buf = *buf_p;
*buf++ = '.';
maxlen--;
for (prec = 0; maxlen && prec < digits; prec++)
{
*buf++ = text[prec];
maxlen--;
}
*buf_p = buf;
}
}
template <typename U>
void AddUInt(U **buf_p, size_t &maxlen, unsigned int val, int width, int flags)
{
U text[32];
int digits;
U *buf;
digits = 0;
do {
text[digits++] = '0' + val % 10;
val /= 10;
} while (val);
buf = *buf_p;
if( !(flags & LADJUST) )
{
while (digits < width && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
width--;
maxlen--;
}
}
while (digits-- && maxlen)
{
*buf++ = text[digits];
width--;
maxlen--;
}
if (flags & LADJUST)
{
while (width-- && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
maxlen--;
}
}
*buf_p = buf;
}
template <typename U>
void AddInt(U **buf_p, size_t &maxlen, int val, int width, int flags)
{
U text[32];
int digits;
int signedVal;
U *buf;
unsigned int unsignedVal;
digits = 0;
signedVal = val;
if (val < 0)
{
/* we want the unsigned version */
unsignedVal = abs(val);
} else {
unsignedVal = val;
}
do {
text[digits++] = '0' + unsignedVal % 10;
unsignedVal /= 10;
} while (unsignedVal);
if (signedVal < 0)
text[digits++] = '-';
buf = *buf_p;
if( !(flags & LADJUST) )
{
while (digits < width && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
width--;
maxlen--;
}
}
while (digits-- && maxlen)
{
*buf++ = text[digits];
width--;
maxlen--;
}
if (flags & LADJUST)
{
while (width-- && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
maxlen--;
}
}
*buf_p = buf;
}
template <typename D, typename S>
size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param)
{
int arg;
int args = params[0] / sizeof(cell);
D *buf_p;
D ch;
int flags;
int width;
int prec;
int n;
char sign;
const S *fmt;
size_t llen = maxlen;
buf_p = buffer;
arg = *param;
fmt = format;
while (true)
{
// run through the format string until we hit a '%' or '\0'
for (ch = static_cast<D>(*fmt);
llen && ((ch = static_cast<D>(*fmt)) != '\0' && ch != '%');
fmt++)
{
*buf_p++ = static_cast<D>(ch);
llen--;
}
if (ch == '\0' || llen <= 0)
goto done;
// skip over the '%'
fmt++;
// reset formatting state
flags = 0;
width = 0;
prec = -1;
sign = '\0';
rflag:
ch = static_cast<D>(*fmt++);
reswitch:
switch(ch)
{
case '-':
flags |= LADJUST;
goto rflag;
case '.':
n = 0;
while( is_digit( ( ch = static_cast<D>(*fmt++)) ) )
n = 10 * n + ( ch - '0' );
prec = n < 0 ? -1 : n;
goto reswitch;
case '0':
flags |= ZEROPAD;
goto rflag;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
n = 0;
do {
n = 10 * n + ( ch - '0' );
ch = static_cast<D>(*fmt++);
} while( is_digit( ch ) );
width = n;
goto reswitch;
case 'c':
CHECK_ARGS(0);
*buf_p++ = static_cast<D>(*get_amxaddr(amx, params[arg]));
arg++;
break;
case 'd':
case 'i':
CHECK_ARGS(0);
AddInt(&buf_p, llen, *get_amxaddr(amx, params[arg]), width, flags);
arg++;
break;
case 'u':
CHECK_ARGS(0);
AddUInt(&buf_p, llen, static_cast<unsigned int>(*get_amxaddr(amx, params[arg])), width, flags);
arg++;
break;
case 'f':
CHECK_ARGS(0);
AddFloat(&buf_p, llen, amx_ctof(*get_amxaddr(amx, params[arg])), width, prec);
arg++;
break;
case 's':
CHECK_ARGS(0);
if (amx->flags & AMX_FLAG_OLDFILE)
{
cell *addr = get_amxaddr(amx, params[arg]);
if (*addr & BCOMPAT_TRANSLATE_BITS)
{
const char *key, *def;
if (!translate_bcompat(amx, addr, &key, &def))
{
goto break_to_normal_string;
}
arg++;
size_t written = atcprintf(buf_p, llen, def, amx, params, &arg);
buf_p += written;
llen -= written;
break;
}
}
break_to_normal_string:
AddString(&buf_p, llen, get_amxaddr(amx, params[arg]), width, prec);
arg++;
break;
case 'L':
{
CHECK_ARGS(1);
cell addr = params[arg++];
int len;
const char *key = get_amxstring(amx, params[arg++], 3, len);
const char *def = translate(amx, addr, key);
if (!def)
{
static char buf[255];
snprintf(buf, sizeof(buf)-1, "ML_NOTFOUND: %s", key);
def = buf;
}
size_t written = atcprintf(buf_p, llen, def, amx, params, &arg);
buf_p += written;
llen -= written;
break;
}
case '%':
*buf_p++ = static_cast<D>(ch);
if (!llen)
goto done;
llen--;
break;
case '\0':
*buf_p++ = static_cast<D>('%');
if (!llen)
goto done;
llen--;
goto done;
break;
default:
*buf_p++ = static_cast<D>(ch);
if (!llen)
goto done;
llen--;
break;
}
}
done:
*buf_p = static_cast<D>(0);
*param = arg;
return maxlen-llen;
}
/**
* HACKHACK: The compiler will generate code for each case we need.
* Don't remove this, otherwise files that use certain code generations
* will have extern problems. For each case you need, add dummy code
* here.
*/
void __WHOA_DONT_CALL_ME_PLZ_K_lol_o_O()
{
//acsprintf
atcprintf((cell *)NULL, 0, (const char *)NULL, NULL, NULL, NULL);
//accprintf
atcprintf((cell *)NULL, 0, (cell *)NULL, NULL, NULL, NULL);
//ascprintf
atcprintf((char *)NULL, 0, (cell *)NULL, NULL, NULL, NULL);
}

11
amxmodx/format.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef _INCLUDE_FORMATTING_H
#define _INCLUDE_FORMATTING_H
//Amx Templatized Cell Printf
template <typename D, typename S>
size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param);
const char *translate(AMX *amx, cell amxaddr, const char *key);
bool translate_bcompat(AMX *amx, cell *source, const char **_key, const char **_def);
#endif //_INCLUDE_FORMATTING_H

51
amxmodx/helpers-x86.asm Normal file
View File

@ -0,0 +1,51 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; (C)2006 by David "BAILOPAN" Anderson ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Licensed under the GNU General Public License, version 2
;;This is a portion of AMX Mod X
;; and is maintained by the AMX Mod X development team.
section .text
global amxx_CpuSupport, _amxx_CpuSupport
amxx_CpuSupport:
_amxx_CpuSupport:
push ebp
mov ebp, esp
push ebx
mov eax, 0
cpuid
cmp eax, 1
jl .fail
mov eax, 1
cpuid
;check if family == 5 or 4
and eax, 0780h ;family mask
shr eax, 7 ;family shift
cmp eax, 5
je .fail
cmp eax, 4
je .fail
;check if CMOV exists
shr edx, 15
and edx, 1
cmp edx, 0
je .fail
mov eax, 1
jmp .end
.fail:
xor eax, eax
.end
pop ebx
pop ebp
ret

243
amxmodx/libraries.cpp Normal file
View File

@ -0,0 +1,243 @@
#include "libraries.h"
#include "sh_list.h"
List<Library *> g_libraries;
bool AddLibrary(const char *name, LibType type, LibSource src, void *parent)
{
if (FindLibrary(name, type))
return false;
Library *lib = new Library;
lib->name.assign(name);
lib->type = type;
lib->src = src;
lib->parent = parent;
g_libraries.push_back(lib);
return true;
}
bool DecodeLibCmdString(const char *str, LibDecoder *dec)
{
if (dec->buffer)
{
free(dec->buffer);
dec->buffer = NULL;
}
if (str[0] != '?')
{
return false;
} else {
str++;
if (*str == 'r')
{
str++;
if (*str == 'c')
dec->cmd = LibCmd_ReqClass;
else if (*str == 'l')
dec->cmd = LibCmd_ReqLib;
else
return false;
str++;
} else if (*str == 'f') {
str++;
dec->cmd = LibCmd_ForceLib;
} else if (*str == 'e') {
str++;
if (*str == 'c')
dec->cmd = LibCmd_ExpectClass;
else if (*str == 'l')
dec->cmd = LibCmd_ExpectLib;
else
return false;
str++;
} else if (*str == 'd') {
str++;
dec->cmd = LibCmd_DefaultLib;
}
if (*str != '_')
return false;
str++;
if (dec->cmd < LibCmd_ExpectLib)
{
dec->buffer = strdup(str);
dec->param1 = dec->buffer;
dec->param2 = NULL;
} else {
dec->buffer = strdup(str);
char *p = strchr(dec->buffer, '_');
while (p && (*(p+1) == '_'))
p = strchr(p+2, '_');
if (!p || !*(p+1))
return false;
*p = '\0';
dec->param1 = dec->buffer;
dec->param2 = p+1;
}
}
return true;
}
size_t AddLibrariesFromString(const char *name, LibType type, LibSource src, void *parent)
{
char buffer[255];
char *ptr, *p, s;
size_t count = 0;
snprintf(buffer, sizeof(buffer)-1, "%s", name);
ptr = buffer;
p = buffer;
while (*p)
{
while (*p && (*p != ','))
p++;
s = *p;
*p = '\0';
if (AddLibrary(ptr, type, src, parent))
count++;
if (!s)
break;
p++;
while (*p && (*p == ','))
p++;
ptr = p;
}
return count;
}
size_t ClearLibraries(LibSource src)
{
List<Library *>::iterator iter;
size_t count = 0;
iter = g_libraries.begin();
while (iter != g_libraries.end())
{
if ( (*iter)->src == src )
{
delete (*iter);
iter = g_libraries.erase(iter);
count++;
} else {
iter++;
}
}
return count;
}
size_t RemoveLibraries(void *parent)
{
List<Library *>::iterator iter;
Library *lib;
size_t count = 0;
iter = g_libraries.begin();
while (iter != g_libraries.end())
{
lib = (*iter);
if (lib->parent == parent)
{
delete (*iter);
iter = g_libraries.erase(iter);
count++;
} else {
iter++;
}
}
return count;
}
bool FindLibrary(const char *name, LibType type)
{
List<Library *>::iterator iter;
Library *lib;
for (iter = g_libraries.begin(); iter != g_libraries.end(); iter++)
{
lib = (*iter);
if (lib->type != type)
continue;
if (strcasecmp(lib->name.c_str(), name) == 0)
{
return true;
}
}
return false;
}
LibError RunLibCommand(const LibDecoder *enc)
{
List<Library *>::iterator iter,end;
Library *lib;
iter = g_libraries.begin();
end = g_libraries.end();
if ( (enc->cmd == LibCmd_ReqLib) || (enc->cmd == LibCmd_ReqClass) )
{
LibType expect = LibType_Library;
if (enc->cmd == LibCmd_ReqLib)
expect = LibType_Library;
else if (enc->cmd == LibCmd_ReqClass)
expect = LibType_Class;
/** see if it exists */
for (; iter != end; iter++)
{
lib = (*iter);
if (lib->type != expect)
continue;
if (strcasecmp(lib->name.c_str(), enc->param1) == 0)
return LibErr_None;
}
if (expect == LibType_Library)
return LibErr_NoLibrary;
else if (expect == LibType_Class)
return LibErr_NoClass;
return LibErr_NoLibrary;
} else if (enc->cmd == LibCmd_ForceLib) {
if (!LoadModule(enc->param1, PT_ANYTIME, true, true))
{
return LibErr_NoLibrary;
}
} else if ( (enc->cmd == LibCmd_DefaultLib) ||
((enc->cmd == LibCmd_ExpectLib) || (enc->cmd == LibCmd_ExpectClass)) )
{
LibType expect;
if (enc->cmd == LibCmd_ExpectLib)
expect = LibType_Library;
else
expect = LibType_Class;
/** see if it exists */
for (; iter != end; iter++)
{
lib = (*iter);
if (lib->type != expect)
continue;
if (strcasecmp(lib->name.c_str(), enc->param1) == 0)
return LibErr_None;
}
if (!LoadModule(enc->param2, PT_ANYTIME, true, true))
{
return LibErr_NoLibrary;
}
return LibErr_None;
}
return LibErr_None;
}

73
amxmodx/libraries.h Normal file
View File

@ -0,0 +1,73 @@
#ifndef _INCLUDE_LIBRARIES_H
#define _INCLUDE_LIBRARIES_H
#include <string.h>
#include "amxmodx.h"
#include "CString.h"
enum LibSource
{
LibSource_Plugin,
LibSource_Module
};
enum LibType
{
LibType_Library,
LibType_Class
};
struct Library
{
String name;
LibSource src;
LibType type;
void *parent;
};
enum LibCmd
{
LibCmd_ReqLib,
LibCmd_ReqClass,
LibCmd_ForceLib,
LibCmd_ExpectLib,
LibCmd_ExpectClass,
LibCmd_DefaultLib,
};
enum LibError
{
LibErr_None = 0,
LibErr_NoLibrary,
LibErr_NoClass,
};
class LibDecoder
{
public:
LibDecoder() : buffer(NULL)
{
}
~LibDecoder()
{
free(buffer);
buffer = NULL;
param1 = NULL;
param2 = NULL;
}
char *buffer;
char *param1;
char *param2;
LibCmd cmd;
};
bool AddLibrary(const char *name, LibType type, LibSource src, void *parent=NULL);
bool DecodeLibCmdString(const char *str, LibDecoder *cmd);
size_t AddLibrariesFromString(const char *name, LibType type, LibSource src, void *parent=NULL);
size_t ClearLibraries(LibSource src);
LibError RunLibCommand(const LibDecoder *enc);
size_t RemoveLibraries(void *parent);
bool FindLibrary(const char *name, LibType type);
#endif //_INCLUDE_LIBRARIES_H

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);
};

805
amxmodx/messages.cpp Executable file
View File

@ -0,0 +1,805 @@
#include "amxmodx.h"
#include "messages.h"
Message Msg;
CVector<int> msgHooks[256];
int msgBlocks[256] = {BLOCK_NOT};
int msgDest;
int msgType;
float *msgOrigin;
edict_t *msgpEntity;
bool inhook = false;
bool inblock = false;
enginefuncs_t *g_pEngTable = NULL;
void ClearMessages()
{
for (size_t i=0; i<MAX_MESSAGES; i++)
{
msgHooks[i].clear();
msgBlocks[i] = BLOCK_NOT;
}
}
Message::Message()
{
m_CurParam = 0;
}
bool Message::Ready()
{
if (!m_Params.size())
return false;
return true;
}
void Message::Init()
{
if (!Ready())
{
msgparam *p = new msgparam;
m_Params.push_back(p);
}
m_CurParam = 0;
}
Message::~Message()
{
for (size_t i=0; i<m_Params.size(); i++)
delete m_Params[i];
m_Params.clear();
}
msgparam *Message::AdvPtr()
{
msgparam *pParam = NULL;
if (++m_CurParam >= m_Params.size())
{
pParam = new msgparam;
m_Params.push_back(pParam);
} else {
pParam = m_Params[m_CurParam];
}
return pParam;
}
void Message::AddParam(const char *data, msgtype type)
{
msgparam *pParam = AdvPtr();
pParam->szData.assign(data);
pParam->type = type;
}
void Message::AddParam(int data, msgtype type)
{
msgparam *pParam = AdvPtr();
pParam->v.iData = data;
pParam->type = type;
}
void Message::AddParam(float data, msgtype type)
{
msgparam *pParam = AdvPtr();
pParam->v.fData = data;
pParam->type = type;
}
msgtype Message::GetParamType(size_t index)
{
if (index < 1 || index > m_CurParam)
return static_cast<msgtype>(0);
return m_Params[index]->type;
}
float Message::GetParamFloat(size_t index)
{
if (index < 1 || index > m_CurParam)
return 0;
return m_Params[index]->v.fData;
}
const char *Message::GetParamString(size_t index)
{
if (index < 1 || index > m_CurParam)
return 0;
return m_Params[index]->szData.c_str();
}
int Message::GetParamInt(size_t index)
{
if (index < 1 || index > m_CurParam)
return 0;
return m_Params[index]->v.iData;
}
void Message::SetParam(size_t index, float data)
{
if (index < 1 || index > m_CurParam)
return;
m_Params[index]->v.fData = data;
}
void Message::SetParam(size_t index, int data)
{
if (index < 1 || index > m_CurParam)
return;
m_Params[index]->v.iData = data;
}
void Message::SetParam(size_t index, const char *data)
{
if (index < 1 || index > m_CurParam)
return;
m_Params[index]->szData.assign(data);
}
void Message::Reset()
{
m_CurParam = 0;
}
size_t Message::Params()
{
return m_CurParam;
}
void Message::Send()
{
msgparam *pParam = NULL;
for (size_t i=1; i<=m_CurParam; i++)
{
pParam = m_Params[i];
switch (pParam->type)
{
case arg_byte:
WRITE_BYTE(pParam->v.iData);
break;
case arg_char:
WRITE_CHAR(pParam->v.iData);
break;
case arg_short:
WRITE_SHORT(pParam->v.iData);
break;
case arg_long:
WRITE_LONG(pParam->v.iData);
break;
case arg_angle:
WRITE_ANGLE(pParam->v.fData);
break;
case arg_coord:
WRITE_COORD(pParam->v.fData);
break;
case arg_string:
WRITE_STRING(pParam->szData.c_str());
break;
case arg_entity:
WRITE_ENTITY(pParam->v.iData);
break;
}
}
}
void C_MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)
{
if (msgBlocks[msg_type])
{
inblock = true;
msgType = msg_type;
RETURN_META(MRES_SUPERCEDE);
} else if (msgHooks[msg_type].size()) {
inhook = true;
msgDest = msg_dest;
msgType = msg_type;
msgOrigin = (float *)pOrigin;
msgpEntity = ed;
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void C_WriteByte(int iValue)
{
if (inblock)
{
RETURN_META(MRES_SUPERCEDE);
} else if (inhook) {
Msg.AddParam(iValue, arg_byte);
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void C_WriteChar(int iValue)
{
if (inblock)
{
RETURN_META(MRES_SUPERCEDE);
} else if (inhook) {
Msg.AddParam(iValue, arg_char);
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void C_WriteShort(int iValue)
{
if (inblock)
{
RETURN_META(MRES_SUPERCEDE);
} else if (inhook) {
Msg.AddParam(iValue, arg_short);
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void C_WriteLong(int iValue)
{
if (inblock)
{
RETURN_META(MRES_SUPERCEDE);
} else if (inhook) {
Msg.AddParam(iValue, arg_long);
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void C_WriteAngle(float flValue)
{
if (inblock)
{
RETURN_META(MRES_SUPERCEDE);
} else if (inhook) {
Msg.AddParam(flValue, arg_angle);
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void C_WriteCoord(float flValue)
{
if (inblock)
{
RETURN_META(MRES_SUPERCEDE);
} else if (inhook) {
Msg.AddParam(flValue, arg_coord);
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void C_WriteString(const char *sz)
{
if (inblock)
{
RETURN_META(MRES_SUPERCEDE);
} else if (inhook) {
Msg.AddParam(sz, arg_string);
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void C_WriteEntity(int iValue)
{
if (inblock)
{
RETURN_META(MRES_SUPERCEDE);
} else if (inhook) {
Msg.AddParam(iValue, arg_entity);
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void C_MessageEnd(void)
{
int mres = 0, mresB = 0;
unsigned int i = 0;
if (inblock)
{
inblock = false;
if (msgBlocks[msgType] == BLOCK_ONCE)
{
msgBlocks[msgType] = BLOCK_NOT;
}
RETURN_META(MRES_SUPERCEDE);
} else if (inhook) {
for (i=0; i<msgHooks[msgType].size(); i++)
{
mresB = executeForwards(msgHooks[msgType].at(i), (cell)msgType, (cell)msgDest, (cell)ENTINDEX(msgpEntity));
if (mresB > mres)
mres = mresB;
}
inhook = false;
if (mres & 1)
{
Msg.Reset();
RETURN_META(MRES_SUPERCEDE);
}
/* send the real message */
MESSAGE_BEGIN(msgDest, msgType, msgOrigin, msgpEntity);
Msg.Send();
MESSAGE_END();
/* reset */
Msg.Reset();
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
static cell AMX_NATIVE_CALL message_begin(AMX *amx, cell *params) /* 4 param */
{
int numparam = *params / sizeof(cell);
float vecOrigin[3];
cell *cpOrigin;
if (params[2] < 1 || ((params[2] > 63) // maximal number of engine messages
&& !GET_USER_MSG_NAME(PLID, params[2], NULL)))
{
LogError(amx, AMX_ERR_NATIVE, "Plugin called message_begin with an invalid message id (%d).", params[2]);
return 0;
}
switch (params[1])
{
case MSG_BROADCAST:
case MSG_ALL:
case MSG_SPEC:
MESSAGE_BEGIN(params[1], params[2], NULL);
break;
case MSG_PVS: case MSG_PAS:
case MSG_PVS_R: case MSG_PAS_R:
if (numparam < 3)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
return 0;
}
cpOrigin = get_amxaddr(amx, params[3]);
vecOrigin[0] = static_cast<float>(*cpOrigin);
vecOrigin[1] = static_cast<float>(*(cpOrigin + 1));
vecOrigin[2] = static_cast<float>(*(cpOrigin + 2));
MESSAGE_BEGIN(params[1], params[2], vecOrigin);
break;
case MSG_ONE_UNRELIABLE:
case MSG_ONE:
if (numparam < 4)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
return 0;
}
MESSAGE_BEGIN(params[1], params[2], NULL, INDEXENT(params[4]));
break;
}
return 1;
}
static cell AMX_NATIVE_CALL message_end(AMX *amx, cell *params)
{
MESSAGE_END();
return 1;
}
static cell AMX_NATIVE_CALL write_byte(AMX *amx, cell *params) /* 1 param */
{
WRITE_BYTE(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL write_char(AMX *amx, cell *params) /* 1 param */
{
WRITE_CHAR(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL write_short(AMX *amx, cell *params) /* 1 param */
{
WRITE_SHORT(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL write_long(AMX *amx, cell *params) /* 1 param */
{
WRITE_LONG(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL write_entity(AMX *amx, cell *params) /* 1 param */
{
WRITE_ENTITY(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL write_angle(AMX *amx, cell *params) /* 1 param */
{
WRITE_ANGLE(static_cast<float>(params[1]));
return 1;
}
static cell AMX_NATIVE_CALL write_coord(AMX *amx, cell *params) /* 1 param */
{
WRITE_COORD(static_cast<float>(params[1]));
return 1;
}
static cell AMX_NATIVE_CALL write_string(AMX *amx, cell *params) /* 1 param */
{
int a;
WRITE_STRING(get_amxstring(amx, params[1], 3, a));
return 1;
}
static cell AMX_NATIVE_CALL register_message(AMX *amx, cell *params)
{
int len;
char *name = get_amxstring(amx, params[2], 0, len);
if (!Msg.Ready())
Msg.Init();
if (params[1]>0 && params[1] < 256)
{
int id = registerSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (id != -1)
{
msgHooks[params[1]].push_back(id);
return id;
} else {
LogError(amx, AMX_ERR_NOTFOUND, "Could not find function \"%s\"", name);
return -1;
}
}
return 0;
}
static cell AMX_NATIVE_CALL set_msg_block(AMX *amx, cell *params)
{
int msgid = params[1];
int block = params[2];
if (msgid < 1 || msgid > 255)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid message id");
return 0;
}
msgBlocks[msgid] = block;
return 1;
}
static cell AMX_NATIVE_CALL get_msg_block(AMX *amx, cell *params)
{
int msgid = params[1];
if (msgid < 1 || msgid > 255)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid message id");
return 0;
}
return msgBlocks[msgid];
}
static cell AMX_NATIVE_CALL get_msg_args(AMX *amx, cell *params)
{
return Msg.Params();
}
static cell AMX_NATIVE_CALL get_msg_argtype(AMX *amx, cell *params)
{
size_t argn = static_cast<size_t>(params[1]);
if (!inhook || argn > Msg.Params())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
return 0;
}
return Msg.GetParamType(argn);
}
static cell AMX_NATIVE_CALL get_msg_arg_int(AMX *amx, cell *params)
{
size_t argn = static_cast<size_t>(params[1]);
if (!inhook || argn > Msg.Params())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
return 0;
}
return Msg.GetParamInt(argn);
}
static cell AMX_NATIVE_CALL set_msg_arg_int(AMX *amx, cell *params)
{
size_t argn = static_cast<size_t>(params[1]);
if (!inhook || argn > Msg.Params())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
return 0;
}
Msg.SetParam(argn, (int)params[3]);
return 1;
}
static cell AMX_NATIVE_CALL get_msg_arg_float(AMX *amx, cell *params)
{
size_t argn = static_cast<size_t>(params[1]);
if (!inhook || argn > Msg.Params())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
return 0;
}
REAL f = (REAL)Msg.GetParamFloat(argn);
return amx_ftoc(f);
}
static cell AMX_NATIVE_CALL set_msg_arg_float(AMX *amx, cell *params)
{
size_t argn = static_cast<size_t>(params[1]);
if (!inhook || argn > Msg.Params())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
return 0;
}
REAL fVal = amx_ctof(params[3]);
Msg.SetParam(argn, (float)fVal);
return 1;
}
static cell AMX_NATIVE_CALL get_msg_arg_string(AMX *amx, cell *params)
{
size_t argn = static_cast<size_t>(params[1]);
if (!inhook || argn > Msg.Params())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
return 0;
}
const char *szVal = Msg.GetParamString(argn);
return set_amxstring(amx, params[2], szVal, params[3]);
}
static cell AMX_NATIVE_CALL set_msg_arg_string(AMX *amx, cell *params)
{
size_t argn = static_cast<size_t>(params[1]);
int iLen;
if (!inhook || argn > Msg.Params())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
return 0;
}
char *szVal = get_amxstring(amx, params[2], 0, iLen);
Msg.SetParam(argn, szVal);
return 1;
}
static cell AMX_NATIVE_CALL get_msg_origin(AMX *amx, cell *params)
{
if (!inhook)
{
LogError(amx, AMX_ERR_NATIVE, "Not in a message hook");
return 0;
}
cell *cAddr = get_amxaddr(amx, params[1]);
if (msgDest >= MSG_PVS && msgDest <= MSG_PAS_R)
{
vec3_t vRet = (Vector)msgOrigin;
cAddr[0] = FloatToCell(vRet.x);
cAddr[1] = FloatToCell(vRet.y);
cAddr[2] = FloatToCell(vRet.z);
} else {
cAddr[0] = 0;
cAddr[1] = 0;
cAddr[2] = 0;
}
return 1;
}
static cell AMX_NATIVE_CALL emessage_begin(AMX *amx, cell *params) /* 4 param */
{
int numparam = *params / sizeof(cell);
float vecOrigin[3];
cell *cpOrigin;
if (params[2] < 1 || ((params[2] > 63) // maximal number of engine messages
&& !GET_USER_MSG_NAME(PLID, params[2], NULL)))
{
LogError(amx, AMX_ERR_NATIVE, "Plugin called message_begin with an invalid message id (%d).", params[2]);
return 0;
}
switch (params[1])
{
case MSG_BROADCAST:
case MSG_ALL:
case MSG_SPEC:
g_pEngTable->pfnMessageBegin(params[1], params[2], NULL, NULL);
break;
case MSG_PVS: case MSG_PAS:
case MSG_PVS_R: case MSG_PAS_R:
if (numparam < 3)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
return 0;
}
cpOrigin = get_amxaddr(amx, params[3]);
vecOrigin[0] = static_cast<float>(*cpOrigin);
vecOrigin[1] = static_cast<float>(*(cpOrigin + 1));
vecOrigin[2] = static_cast<float>(*(cpOrigin + 2));
g_pEngTable->pfnMessageBegin(params[1], params[2], vecOrigin, NULL);
break;
case MSG_ONE_UNRELIABLE:
case MSG_ONE:
if (numparam < 4)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
return 0;
}
g_pEngTable->pfnMessageBegin(params[1], params[2], NULL, INDEXENT(params[4]));
break;
}
return 1;
}
static cell AMX_NATIVE_CALL emessage_end(AMX *amx, cell *params)
{
g_pEngTable->pfnMessageEnd();
return 1;
}
static cell AMX_NATIVE_CALL ewrite_byte(AMX *amx, cell *params) /* 1 param */
{
g_pEngTable->pfnWriteByte(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL ewrite_char(AMX *amx, cell *params) /* 1 param */
{
g_pEngTable->pfnWriteChar(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL ewrite_short(AMX *amx, cell *params) /* 1 param */
{
g_pEngTable->pfnWriteShort(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL ewrite_long(AMX *amx, cell *params) /* 1 param */
{
g_pEngTable->pfnWriteLong(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL ewrite_entity(AMX *amx, cell *params) /* 1 param */
{
g_pEngTable->pfnWriteEntity(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL ewrite_angle(AMX *amx, cell *params) /* 1 param */
{
g_pEngTable->pfnWriteAngle(static_cast<float>(params[1]));
return 1;
}
static cell AMX_NATIVE_CALL ewrite_coord(AMX *amx, cell *params) /* 1 param */
{
g_pEngTable->pfnWriteCoord(static_cast<float>(params[1]));
return 1;
}
static cell AMX_NATIVE_CALL ewrite_string(AMX *amx, cell *params) /* 1 param */
{
int a;
g_pEngTable->pfnWriteString(get_amxstring(amx, params[1], 3, a));
return 1;
}
AMX_NATIVE_INFO msg_Natives[] =
{
{"message_begin", message_begin},
{"message_end", message_end},
{"write_angle", write_angle},
{"write_byte", write_byte},
{"write_char", write_char},
{"write_coord", write_coord},
{"write_entity", write_entity},
{"write_long", write_long},
{"write_short", write_short},
{"write_string", write_string},
{"register_message", register_message},
{"set_msg_block", set_msg_block},
{"get_msg_block", get_msg_block},
{"get_msg_args", get_msg_args},
{"get_msg_argtype", get_msg_argtype},
{"get_msg_arg_int", get_msg_arg_int},
{"set_msg_arg_int", set_msg_arg_int},
{"get_msg_arg_float", get_msg_arg_float},
{"set_msg_arg_float", set_msg_arg_float},
{"get_msg_arg_string", get_msg_arg_string},
{"set_msg_arg_string", set_msg_arg_string},
{"get_msg_origin", get_msg_origin},
{"emessage_begin", emessage_begin},
{"emessage_end", emessage_end},
{"ewrite_angle", ewrite_angle},
{"ewrite_byte", ewrite_byte},
{"ewrite_char", ewrite_char},
{"ewrite_coord", ewrite_coord},
{"ewrite_entity", ewrite_entity},
{"ewrite_long", ewrite_long},
{"ewrite_short", ewrite_short},
{"ewrite_string", ewrite_string},
{NULL, NULL},
};

85
amxmodx/messages.h Executable file
View File

@ -0,0 +1,85 @@
#ifndef _MSGS_INCLUDE_H
#define _MSGS_INCLUDE_H
#include <extdll.h>
#include <meta_api.h>
#include "amx.h"
#include "CVector.h"
#include "CString.h"
#define MAX_MESSAGES 255
#define MSGBLOCK_SET 0
#define MSGBLOCK_GET 1
#define BLOCK_NOT 0
#define BLOCK_ONCE 1
#define BLOCK_SET 2
enum msgtype
{
arg_byte = 1,
arg_char,
arg_short,
arg_long,
arg_angle,
arg_coord,
arg_string,
arg_entity,
};
struct msgparam
{
msgtype type;
union
{
REAL fData;
int iData;
} v;
String szData;
};
class Message
{
public:
Message();
~Message();
void AddParam(float data, msgtype type);
void AddParam(int data, msgtype type);
void AddParam(const char *data, msgtype type);
void SetParam(size_t index, float data);
void SetParam(size_t index, int data);
void SetParam(size_t index, const char *data);
const char *GetParamString(size_t index);
float GetParamFloat(size_t index);
bool Ready();
void Init();
int GetParamInt(size_t index);
msgtype GetParamType(size_t index);
void Reset();
void Send();
size_t Params();
private:
msgparam *AdvPtr();
private:
CVector<msgparam *> m_Params;
size_t m_CurParam;
};
void C_MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
void C_WriteByte(int iValue);
void C_WriteChar(int iValue);
void C_WriteShort(int iValue);
void C_WriteLong(int iValue);
void C_WriteAngle(float flValue);
void C_WriteCoord(float flValue);
void C_WriteString(const char *sz);
void C_WriteEntity(int iValue);
void C_MessageEnd(void);
extern CVector<int> msgHooks[256];
extern int msgBlocks[256];
void ClearMessages();
#endif //_MSGS_INCLUDE_H

File diff suppressed because it is too large Load Diff

1622
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

@ -38,142 +38,54 @@
#ifndef __linux__ #ifndef __linux__
#define DLLEXPORT __declspec(dllexport) #define DLLEXPORT __declspec(dllexport)
#else #else
#define DLLEXPORT #define DLLEXPORT __attribute__((visibility("default")))
#define WINAPI #define WINAPI
#endif #endif
#undef C_DLLEXPORT #undef C_DLLEXPORT
#define C_DLLEXPORT extern "C" DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT
#define AMX_INTERFACE_VERSION 6
#define RELOAD_MODULE 0 #define RELOAD_MODULE 0
#define STATIC_MODULE 1 #define STATIC_MODULE 1
struct module_info_s { typedef enum
const char* name; {
const char* author; Player_Name, //String
const char* version; Player_Ip, //String
int ivers; Player_Team, //String
int type; Player_Ingame, //bool
long int serial; Player_Authorized, //bool
}; Player_Vgui, //bool
Player_Time, //float
Player_Playtime, //float
Player_MenuExpire, //float
Player_Weapons, //struct{int,int}[32]
Player_CurrentWeapon, //int
Player_TeamID, //int
Player_Deaths, //int
Player_Aiming, //int
Player_Menu, //int
Player_Keys, //int
Player_Flags, //int[32]
Player_Newmenu, //int
Player_NewmenuPage, //int
} PlayerProp;
// Small scripting language int CheckModules(AMX *amx, char error[128]);
struct pfnamx_engine_g { bool LoadModule(const char *shortname, PLUG_LOADTIME now, bool simplify=true, bool noFileBail=false);
uint16_t* (*pfnamx_Align16)(uint16_t *); // value const char *StrCaseStr(const char *as, const char *bs);
uint32_t* (*pfnamx_Align32)(uint32_t *); // value
int (*pfnamx_Allot)(AMX*, int, cell*, cell**); // amx, length, amx_addr, phys_addr
int (*pfnamx_Callback)(AMX*, cell , cell*, cell*); // amx, index,result,params
int (*pfnamx_Clone)(AMX*, AMX*, void*); // amxClone, amxSrc, data
int (*pfnamx_Debug)(AMX*); // default debug procedure, does nothing // amx
int (*pfnamx_Exec)(AMX*, cell*, int , int , ...); // amx, return val, index, num_params, ...
int (*pfnamx_Execv)(AMX*, cell*, int , int, cell[]); // amx, return val, index, num_params, param[]
int (*pfnamx_FindPublic)(AMX*, char*, int*); // amx, func name, index
int (*pfnamx_FindPubVar)(AMX*, char*, cell*); // anx, var name, amx_addr
int (*pfnamx_FindTagId)(AMX*, cell , char*); // amx. tag_id, tagname
int (*pfnamx_Flags)(AMX*,uint16_t *); // amx, flags
int (*pfnamx_GetAddr)(AMX*,cell ,cell**); // amx, amx_addr, phys_addr
int (*pfnamx_GetPublic)(AMX*, int , char*); // amx, index, funcname
int (*pfnamx_GetPubVar)(AMX*, int , char*, cell*); // amx, index, varname, amx_addr
int (*pfnamx_GetString)(char*dest,cell*); // dest, source
int (*pfnamx_GetTag)(AMX*, int , char*, cell*); // amx, index, tagname, tag_id
int (*pfnamx_GetUserData)(AMX*, long , void **); // amx, tag, ptr
int (*pfnamx_Init)(AMX*, void *); // amx, program
int (*pfnamx_InitJIT)(AMX*, void *, void *); // amx, reloc_table, native_code
int (*pfnamx_MemInfo)(AMX*, long*, long*, long*); // amx, codesize, datasize, stackheap
int (*pfnamx_NameLength)(AMX*, int*); // amx, length
AMX_NATIVE_INFO * (*pfnamx_NativeInfo)(char*,AMX_NATIVE ); // name, func
int (*pfnamx_NumPublics)(AMX*, int*); // amx, number
int (*pfnamx_NumPubVars)(AMX*, int*); // amx, number
int (*pfnamx_NumTags)(AMX*, int*); // amx, number
int (*pfnamx_RaiseError)(AMX*, int ); // amx, error
int (*pfnamx_Register)(AMX*, AMX_NATIVE_INFO*, int ); // amx, nativelist, number
int (*pfnamx_Release)(AMX*, cell ); // amx, amx_addr
int (*pfnamx_SetCallback)(AMX*, AMX_CALLBACK ); // amx, callback
int (*pfnamx_SetDebugHook)(AMX*, AMX_DEBUG ); // amx, debug
int (*pfnamx_SetString)(cell*, char*, int ); // dest, source, pack
int (*pfnamx_SetUserData)(AMX*, long , void*); // amx, tag, prt
int (*pfnamx_StrLen)(cell*, int*); // amx, cstring, length
};
extern pfnamx_engine_g* g_engAmxFunc;
#define AMX_ALIGN16 (*g_engAmxFunc->pfnamx_Align16) class Debugger;
#define AMX_ALIGN32 (*g_engAmxFunc->pfnamx_Align32) Debugger *DisableDebugHandler(AMX *amx);
#define AMX_ALLOT (*g_engAmxFunc->pfnamx_Allot) void EnableDebugHandler(AMX *amx, Debugger *pd);
#define AMX_CALLBACK (*g_engAmxFunc->pfnamx_Callback)
#define AMX_CLONE (*g_engAmxFunc->pfnamx_Clone)
#define AMX_DEBUG (*g_engAmxFunc->pfnamx_Debug)
#define AMX_EXEC (*g_engAmxFunc->pfnamx_Exec)
#define AMX_EXECV (*g_engAmxFunc->pfnamx_Execv)
#define AMX_FINDPUBLIC (*g_engAmxFunc->pfnamx_FindPublic)
#define AMX_FINDPUBVAR (*g_engAmxFunc->pfnamx_FindPubVar)
#define AMX_FINDTAGID (*g_engAmxFunc->pfnamx_FindTagId)
#define AMX_FLAGS (*g_engAmxFunc->pfnamx_Flags)
#define AMX_GETADDR (*g_engAmxFunc->pfnamx_GetAddr)
#define AMX_GETPUBLIC (*g_engAmxFunc->pfnamx_GetPublic)
#define AMX_GETPUBVAR (*g_engAmxFunc->pfnamx_GetPubVar)
#define AMX_GETSTRING (*g_engAmxFunc->pfnamx_GetString)
#define AMX_GETTAG (*g_engAmxFunc->pfnamx_GetTag)
#define AMX_GETUSERDATA (*g_engAmxFunc->pfnamx_GetUserData)
#define AMX_INIT (*g_engAmxFunc->pfnamx_Init)
#define AMX_INITJIT (*g_engAmxFunc->pfnamx_InitJIT)
#define AMX_MEMINFO (*g_engAmxFunc->pfnamx_MemInfo)
#define AMX_NAMELENGTH (*g_engAmxFunc->pfnamx_NameLength)
#define AMX_NATIVEINFO (*g_engAmxFunc->pfnamx_NativeInfo)
#define AMX_NUMPUBLICS (*g_engAmxFunc->pfnamx_NumPublics)
#define AMX_NUMPUBVARS (*g_engAmxFunc->pfnamx_NumPubVars)
#define AMX_NUMTAGS (*g_engAmxFunc->pfnamx_NumTags)
#define AMX_RAISEERROR (*g_engAmxFunc->pfnamx_RaiseError)
#define AMX_REGISTER (*g_engAmxFunc->pfnamx_Register)
#define AMX_RELEASE (*g_engAmxFunc->pfnamx_Release)
#define AMX_SETCALLBACK (*g_engAmxFunc->pfnamx_SetCallback)
#define AMX_SETDEBUGHOOK (*g_engAmxFunc->pfnamx_SetDebugHook)
#define AMX_SETSTRING (*g_engAmxFunc->pfnamx_SetString)
#define AMX_SETUSERDATA (*g_engAmxFunc->pfnamx_SetUserData)
#define AMX_STRLEN (*g_engAmxFunc->pfnamx_StrLen)
// Modules API bool DirExists(const char *dir);
struct pfnmodule_engine_g { const char* GetFileName(AMX *amx);
int (*pfnadd_amxnatives)(module_info_s*,AMX_NATIVE_INFO*); // list
char* (*pfnbuild_pathname)(char*, ...); // format, ....
void (*pfncopy_amxmemory)(cell*,cell*,int); // dest, src, len
char* (*pfnformat_amxstring)(AMX*, cell*, int ,int& ); // amx, format, start pos, len
cell* (*pfnget_amxaddr)(AMX*,cell ); // amx, cell
AMX* (*pfnget_amxscript)(int, void**,const char**); // id, code, name
const char* (*pfnget_amxscriptname)(AMX* amx); // amx
char* (*pfnget_amxstring)(AMX*,cell,int, int&); // amx, src, buffer (0-3), len
void (*pfnget_modname)(char*); // modname
int (*pfnload_amxscript)(AMX*, void**, const char*, char[64]); // amx, code, path, error info
void (*pfnprint_console)(char*, ...); // format, ....
void (*pfnreport_error)(int code, char*, ... );
int (*pfnset_amxnatives)(AMX*,char[64]); // amx, error info
int (*pfnset_amxstring)(AMX*,cell ,const char*,int); // amx, dest, string, maxlen
int (*pfnamxstring_length)(cell*); // src
int (*pfnunload_amxscript)(AMX* amx,void**); // amx, code
void* (*pfnalloc_amxmemory)(void**,int size);
void (*pfnfree_amxmemory)(void**);
};
extern pfnmodule_engine_g* g_engModuleFunc;
#define ADD_AMXNATIVES (*g_engModuleFunc->pfnadd_amxnatives)
#define AMXSTRING_LENGTH (*g_engModuleFunc->pfnamxstring_length)
#define BUILD_PATHNAME (*g_engModuleFunc->pfnbuild_pathname)
#define COPY_AMXMEMORY (*g_engModuleFunc->pfncopy_amxmemory)
#define FORMAT_AMXSTRING (*g_engModuleFunc->pfnformat_amxstring)
#define GET_AMXADDR (*g_engModuleFunc->pfnget_amxaddr)
#define GET_AMXSCRIPT (*g_engModuleFunc->pfnget_amxscript)
#define GET_AMXSCRIPTNAME (*g_engModuleFunc->pfnget_amxscriptname)
#define GET_AMXSTRING (*g_engModuleFunc->pfnget_amxstring)
#define GET_MODNAME (*g_engModuleFunc->pfnget_modname)
#define LOAD_AMXSCRIPT (*g_engModuleFunc->pfnload_amxscript)
#define PRINT_CONSOLE (*g_engModuleFunc->pfnprint_console)
#define REPORT_ERROR (*g_engModuleFunc->pfnreport_error)
#define SET_AMXNATIVES (*g_engModuleFunc->pfnset_amxnatives)
#define SET_AMXSTRING (*g_engModuleFunc->pfnset_amxstring)
#define UNLOAD_AMXSCRIPT (*g_engModuleFunc->pfnunload_amxscript)
#define ALLOC_AMXMEMORY (*g_engModuleFunc->pfnalloc_amxmemory)
#define FREE_AMXMEMORY (*g_engModuleFunc->pfnfree_amxmemory)
inline cell FloatToCell(float input)
{
REAL output = input;
return *(cell *)&output;
}
#endif // __MODULES_H__ #endif // __MODULES_H__

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

View File

@ -1,6 +0,0 @@
LIBRARY amx_mm
EXPORTS
GiveFnptrsToDll @1
SECTIONS
.data READ WRITE

View File

@ -1,6 +0,0 @@
LIBRARY amxx_mm
EXPORTS
GiveFnptrsToDll @1
SECTIONS
.data READ WRITE

View File

@ -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:".\amxmodx_mm.def" /out:"release/amxxmm.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\amxxmm.dll TargetPath=.\release\amxx_mm.dll
TargetName=amxxmm TargetName=amxx_mm
InputPath=.\release\amxxmm.dll InputPath=.\release\amxx_mm.dll
SOURCE="$(InputPath)" SOURCE="$(InputPath)"
"$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" "$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
@ -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:".\amxmodx_mm.def" /out:"debug/amxxmm.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\amxxmm.dll TargetPath=.\debug\amxx_mm.dll
TargetName=amxxmm TargetName=amxx_mm
InputPath=.\debug\amxxmm.dll InputPath=.\debug\amxx_mm.dll
SOURCE="$(InputPath)" SOURCE="$(InputPath)"
"$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" "$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
@ -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

View File

@ -1,18 +1,24 @@
Microsoft Visual Studio Solution File, Format Version 8.00 Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx_mm", "amxmodx_mm.vcproj", "{2FDEE868-4051-4918-81E9-5CBA63F3E785}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx", "amxmodx_mm.vcproj", "{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
EndProjectSection EndProjectSection
EndProject EndProject
Global Global
GlobalSection(SolutionConfiguration) = preSolution GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug JITDebug = JITDebug
Release = Release JITDebugBinLog = JITDebugBinLog
JITRelease = JITRelease
JITReleaseBinLog = JITReleaseBinLog
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution GlobalSection(ProjectConfiguration) = postSolution
{2FDEE868-4051-4918-81E9-5CBA63F3E785}.Debug.ActiveCfg = Debug|Win32 {2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug.ActiveCfg = JITDebug|Win32
{2FDEE868-4051-4918-81E9-5CBA63F3E785}.Debug.Build.0 = Debug|Win32 {2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug.Build.0 = JITDebug|Win32
{2FDEE868-4051-4918-81E9-5CBA63F3E785}.Release.ActiveCfg = Release|Win32 {2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog.ActiveCfg = JITDebugBinLog|Win32
{2FDEE868-4051-4918-81E9-5CBA63F3E785}.Release.Build.0 = Release|Win32 {2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog.Build.0 = JITDebugBinLog|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease.ActiveCfg = JITRelease|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease.Build.0 = JITRelease|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog.ActiveCfg = JITReleaseBinLog|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog.Build.0 = JITReleaseBinLog|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection EndGlobalSection

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,26 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx_mm", "amxmodx_mm.vcproj", "{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
JITDebug|Win32 = JITDebug|Win32
JITDebugBinLog|Win32 = JITDebugBinLog|Win32
JITRelease|Win32 = JITRelease|Win32
JITReleaseBinLog|Win32 = JITReleaseBinLog|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug|Win32.ActiveCfg = JITDebug|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug|Win32.Build.0 = JITDebug|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog|Win32.ActiveCfg = JITDebugBinLog|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog|Win32.Build.0 = JITDebugBinLog|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease|Win32.ActiveCfg = JITRelease|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease|Win32.Build.0 = JITRelease|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog|Win32.ActiveCfg = JITReleaseBinLog|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog|Win32.Build.0 = JITReleaseBinLog|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,922 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="amxmodx_mm"
ProjectGUID="{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
RootNamespace="amxmodx"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="JITDebug|Win32"
OutputDirectory="JITDebug"
IntermediateDirectory="JITDebug"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=""
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT;_CRT_SECURE_NO_DEPRECATE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
StructMemberAlignment="3"
TreatWChar_tAsBuiltInType="true"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitdebug/amxmodx.pch"
AssemblerListingLocation=".\jitdebug/"
ObjectFile=".\jitdebug/"
ProgramDataBaseFileName=".\jitdebug/"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="4"
CompileAs="0"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
OutputFile="jitdebug/amxmodx_mm.dll"
Version="0.1"
LinkIncremental="2"
SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
ModuleDefinitionFile=""
GenerateDebugInformation="true"
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
ImportLibrary=".\jitdebug/amxmodx_mm.lib"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="JITRelease|Win32"
OutputDirectory="JITRelease"
IntermediateDirectory="JITRelease"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
OmitFramePointers="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;ASM32;PAWN_CELL_SIZE=32;_CRT_SECURE_NO_DEPRECATE"
IgnoreStandardIncludePath="false"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
TreatWChar_tAsBuiltInType="true"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitrelease/amxmodx.pch"
AssemblerListingLocation=".\jitrelease/"
ObjectFile=".\jitrelease/"
ProgramDataBaseFileName=".\jitrelease/"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="3"
CompileAs="0"
ShowIncludes="false"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
OutputFile="jitrelease/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
ModuleDefinitionFile=""
GenerateDebugInformation="true"
ProgramDatabaseFile=".\jitrelease/amxmodx_mm.pdb"
GenerateMapFile="true"
ImportLibrary=".\jitrelease/amxmodx_mm.lib"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="JITDebugBinLog|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=""
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT;BINLOG_ENABLED;_CRT_SECURE_NO_DEPRECATE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
StructMemberAlignment="3"
TreatWChar_tAsBuiltInType="true"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitdebugbinlog/amxmodx.pch"
AssemblerListingLocation=".\jitdebugbinlog/"
ObjectFile=".\jitdebugbinlog/"
ProgramDataBaseFileName=".\jitdebugbinlog/"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="4"
CompileAs="0"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
OutputFile="jitdebugbinlog/amxmodx_bl_mm.dll"
Version="0.1"
LinkIncremental="2"
SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
ModuleDefinitionFile=""
GenerateDebugInformation="true"
ProgramDatabaseFile=".\jitdebugbinlog/amxmodx_bl_mm.pdb"
ImportLibrary=".\jitdebugbinlog/amxmodx_bl_mm.lib"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="JITReleaseBinLog|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
OmitFramePointers="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;ASM32;PAWN_CELL_SIZE=32;BINLOG_ENABLED;_CRT_SECURE_NO_DEPRECATE"
IgnoreStandardIncludePath="false"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
TreatWChar_tAsBuiltInType="true"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitreleasebinlog/amxmodx.pch"
AssemblerListingLocation=".\jitreleasebinlog/"
ObjectFile=".\jitreleasebinlog/"
ProgramDataBaseFileName=".\jitreleasebinlog/"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="3"
CompileAs="0"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
OutputFile="jitreleasebinlog/amxmodx_bl_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
ModuleDefinitionFile=""
GenerateDebugInformation="true"
ProgramDatabaseFile=".\jitreleasebinlog/amxmodx_bl_mm.pdb"
GenerateMapFile="true"
ImportLibrary=".\jitreleasebinlog/amxmodx_bl_mm.lib"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</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="..\amxdbg.cpp"
>
</File>
<File
RelativePath="..\amxmod_compat.cpp"
>
</File>
<File
RelativePath="..\amxmodx.cpp"
>
</File>
<File
RelativePath="..\amxtime.cpp"
>
</File>
<File
RelativePath="..\amxxfile.cpp"
>
</File>
<File
RelativePath="..\amxxlog.cpp"
>
</File>
<File
RelativePath="..\binlog.cpp"
>
<FileConfiguration
Name="JITDebug|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="JITRelease|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
</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="..\debugger.cpp"
>
</File>
<File
RelativePath="..\emsg.cpp"
>
</File>
<File
RelativePath="..\fakemeta.cpp"
>
</File>
<File
RelativePath="..\file.cpp"
>
</File>
<File
RelativePath="..\float.cpp"
>
</File>
<File
RelativePath="..\format.cpp"
>
<FileConfiguration
Name="JITRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="4"
/>
</FileConfiguration>
<FileConfiguration
Name="JITReleaseBinLog|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="4"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\libraries.cpp"
>
</File>
<File
RelativePath="..\md5.cpp"
>
</File>
<File
RelativePath="..\messages.cpp"
>
</File>
<File
RelativePath="..\meta_api.cpp"
>
</File>
<File
RelativePath="..\modules.cpp"
>
</File>
<File
RelativePath="..\natives.cpp"
>
</File>
<File
RelativePath="..\newmenus.cpp"
>
</File>
<File
RelativePath="..\optimizer.cpp"
>
</File>
<File
RelativePath="..\power.cpp"
>
</File>
<File
RelativePath="..\sorting.cpp"
>
</File>
<File
RelativePath="..\srvcmd.cpp"
>
</File>
<File
RelativePath="..\string.cpp"
>
<FileConfiguration
Name="JITRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="2"
/>
</FileConfiguration>
<FileConfiguration
Name="JITReleaseBinLog|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="2"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\strptime.cpp"
>
</File>
<File
RelativePath="..\util.cpp"
>
</File>
<File
RelativePath="..\vault.cpp"
>
</File>
<File
RelativePath="..\vector.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl"
>
<File
RelativePath="..\amx.h"
>
</File>
<File
RelativePath="..\amxdbg.h"
>
</File>
<File
RelativePath="..\amxmod_compat.h"
>
</File>
<File
RelativePath="..\amxmodx.h"
>
</File>
<File
RelativePath="..\amxxfile.h"
>
</File>
<File
RelativePath="..\amxxlog.h"
>
</File>
<File
RelativePath="..\binlog.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="..\CString.h"
>
</File>
<File
RelativePath="..\CTask.h"
>
</File>
<File
RelativePath="..\CVault.h"
>
</File>
<File
RelativePath="..\CVector.h"
>
</File>
<File
RelativePath="..\debugger.h"
>
</File>
<File
RelativePath="..\fakemeta.h"
>
</File>
<File
RelativePath="..\format.h"
>
</File>
<File
RelativePath="..\libraries.h"
>
</File>
<File
RelativePath="..\md5.h"
>
</File>
<File
RelativePath="..\messages.h"
>
</File>
<File
RelativePath="..\modules.h"
>
</File>
<File
RelativePath="..\natives.h"
>
</File>
<File
RelativePath="..\newmenus.h"
>
</File>
<File
RelativePath="..\optimizer.h"
>
</File>
<File
RelativePath="..\resource.h"
>
</File>
<File
RelativePath="..\sh_list.h"
>
</File>
<File
RelativePath="..\sh_stack.h"
>
</File>
<File
RelativePath="..\sh_tinyhash.h"
>
</File>
<File
RelativePath="..\zlib\zconf.h"
>
</File>
<File
RelativePath="..\zlib\zlib.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc"
>
<File
RelativePath="..\version.rc"
>
</File>
</Filter>
<Filter
Name="Assembly"
>
<File
RelativePath="..\amxdefn.asm"
>
</File>
<File
RelativePath="..\amxexecn.asm"
>
</File>
<File
RelativePath="..\amxjitsn.asm"
>
</File>
<File
RelativePath="..\helpers-x86.asm"
>
</File>
<File
RelativePath="..\natives-amd64.asm"
>
</File>
<File
RelativePath="..\natives-x86.asm"
>
</File>
<Filter
Name="Builds"
>
<File
RelativePath="..\Jit\helpers-x86.obj"
>
</File>
</Filter>
</Filter>
<Filter
Name="SDK"
>
<File
RelativePath="..\sdk\amxxmodule.cpp"
>
<FileConfiguration
Name="JITDebug|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="JITRelease|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="JITDebugBinLog|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="JITReleaseBinLog|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\sdk\amxxmodule.h"
>
</File>
<File
RelativePath="..\sdk\moduleconfig.h"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

91
amxmodx/natives-amd64.asm Executable file
View File

@ -0,0 +1,91 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; (C)2005 by David "BAILOPAN" Anderson ;
; register_native functions for amd64 ;;;;;;
; Based on the concept by Julien "dJeyL" Laurent ;
; Thanks to T(+)rget for pushing me to implement this ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Licensed under the GNU General Public License, version 2
;;This is a portion of AMX Mod X
;; and is maintained by the AMX Mod X development team.
;;Initializes the global variable
BITS 64
section .text
global amxx_DynaInit, _amxx_DynaInit
;void amxx_DynaInit(void *ptr);
amxx_DynaInit:
_amxx_DynaInit:
mov [GLOBAL_GATE wrt rip], rdi
ret
;;Assembles the gateway function
global amxx_DynaMake, _amxx_DynaMake
;int amxx_DynaMake(char *buffer, int id);
amxx_DynaMake:
_amxx_DynaMake:
;we're not damaging the stack I think so we should be safe with no prologue
;save these two we're about to destroy them
push rsi ;push id
push rdi ;push buffer
mov rsi, _amxx_DynaFuncStart
mov rcx, _amxx_DynaFuncEnd - _amxx_DynaFuncStart
cld ;clear direction flag (just in case)
rep movsb
pop rdi ;get buffer as destination
pop rax ;get id
;align us to mov rsi, 1234... - on x86-64 this is 2 bytes after the differential
add rdi, (_amxx_DynaFuncStart.move-_amxx_DynaFuncStart) + 2
mov [rdi], qword rax
;align rdi to the call
add rdi, (_amxx_DynaFuncStart.call-_amxx_DynaFuncStart.move)
mov rax, qword [GLOBAL_GATE wrt rip]
;copy the real address
mov [rdi], rax
ret
;;The gateway function we will re-assemble
;; This is similar to dJeyL's but a tad more elegant, as it's written in pure assembly
;; and NASM > GAS :')
global amxx_DynaFunc, _amxx_DynaFunc
;int amxx_DynaFunc(AMX *amx, cell *params);
amxx_DynaFunc:
_amxx_DynaFunc:
_amxx_DynaFuncStart:
push rbp
mov rbp, rsp
;we're given an amx and params... we're also hardcoded for this though:
mov rdx, rsi ;move 2nd param to 3rd
mov rsi, rdi ;move 1st param to 2nd
;this old trick, we'll move in the real pointer in a bit.
.move:
mov rdi, qword 1234567812345678h
.call:
mov rcx, qword 1234567812345678h
call rcx
pop rbp
ret
_amxx_DynaFuncEnd:
;;Just returns the buffer size required
global _amxx_DynaCodesize, amxx_DynaCodesize
;int amxx_DynaCodesize()
amxx_DynaCodesize:
_amxx_DynaCodesize:
; on x86-64 this is 34 bytes
mov rax, _amxx_DynaFuncEnd - _amxx_DynaFuncStart
ret
section .data
GLOBAL_GATE DQ 0

100
amxmodx/natives-x86.asm Executable file
View File

@ -0,0 +1,100 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; (C)2005 by David "BAILOPAN" Anderson ;
; register_native functions for x86 ;;;;;;
; Based on the concept by Julien "dJeyL" Laurent ;
; Thanks to T(+)rget for pushing me to implement this ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Licensed under the GNU General Public License, version 2
;;This is a portion of AMX Mod X
;; and is maintained by the AMX Mod X development team.
;;Initializes the global variable
section .text
global amxx_DynaInit, _amxx_DynaInit
;void amxx_DynaInit(void *ptr);
amxx_DynaInit:
_amxx_DynaInit:
push ebp
mov ebp, esp
mov eax, [ebp+8] ;get pointer
mov [GLOBAL_GATE], eax ;store
mov eax, 1
pop ebp
ret
;;Assembles the gateway function
global amxx_DynaMake, _amxx_DynaMake
;int amxx_DynaMake(char *buffer, int id);
amxx_DynaMake:
_amxx_DynaMake:
push ebp
mov ebp, esp
push edi
push esi
mov edi, [ebp+8] ;buffer
mov esi, _amxx_DynaFuncStart
mov ecx, _amxx_DynaFuncEnd - _amxx_DynaFuncStart
cld ;clear direction flag (just in case)
rep movsb
mov edi, [ebp+8] ;get buffer again
;align us to mov eax, 1234 - on x86 this is 4 bytes
add edi, (_amxx_DynaMoveOffset-_amxx_DynaFuncStart) + 1
mov eax, [ebp+12]
mov [edi], eax
pop esi
pop edi
mov eax, 1
pop ebp
ret
;;The gateway function we will re-assemble
;; This is similar to dJeyL's but a tad more elegant, as it's written in pure assembly
;; and NASM > GAS :')
global amxx_DynaFunc, _amxx_DynaFunc
;int amxx_DynaFunc(AMX *amx, cell *params);
amxx_DynaFunc:
_amxx_DynaFunc:
_amxx_DynaFuncStart:
push ebp
mov ebp, esp
;we're given an amx and params... we're also hardcoded for this though:
_amxx_DynaMoveOffset:
mov eax, 12345678h ;this old trick, we'll move in the real pointer in a bit.
push dword [ebp+12] ;push params
push dword [ebp+8] ;push amx
push eax ;push the id
call [GLOBAL_GATE] ;pass through teh global gateway.
add esp, 12 ;reset stack oops
pop ebp
ret
_amxx_DynaFuncEnd:
;;Just returns the buffer size required
global _amxx_DynaCodesize, amxx_DynaCodesize
;int amxx_DynaCodesize()
amxx_DynaCodesize:
_amxx_DynaCodesize:
push ebp
mov ebp, esp
; on x86 is this 17 bytes
mov eax, _amxx_DynaFuncEnd - _amxx_DynaFuncStart
pop ebp
ret
section .data
GLOBAL_GATE DD 0

516
amxmodx/natives.cpp Executable file
View File

@ -0,0 +1,516 @@
/* 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 "sh_stack.h"
#include "natives.h"
#include "debugger.h"
#include "libraries.h"
#include "format.h"
#ifdef __linux__
#include <malloc.h>
#include <stdlib.h>
#include <sys/mman.h>
#include "sclinux.h"
#endif
//Written by David "BAILOPAN" Anderson
//With the exception for param_convert, which was written by
// Julien "dJeyL" Laurent
CStack<int> g_ErrorStk;
CVector<regnative *> g_RegNatives;
CStack<regnative *> g_NativeStack;
static char g_errorStr[512] = {0};
bool g_Initialized = false;
int amxx_DynaCallback(int idx, AMX *amx, cell *params)
{
if (idx < 0 || idx >= (int)g_RegNatives.size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid dynamic native called");
return 0;
}
regnative *pNative = g_RegNatives[idx];
int numParams = params[0] / sizeof(cell);
if (numParams > CALLFUNC_MAXPARAMS)
{
LogError(amx, AMX_ERR_NATIVE, "Called dynanative with too many parameters (%d)", CALLFUNC_MAXPARAMS);
return 0;
}
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx);
CPluginMngr::CPlugin *pNativePlugin = g_plugins.findPluginFast(pNative->amx);
if (!pNativePlugin->isExecutable(pNative->func))
{
LogError(amx, AMX_ERR_NATIVE, "Called dynanative into a paused plugin.");
pPlugin->setStatus(ps_paused);
return 0;
}
if (pNative->caller)
{
LogError(amx, AMX_ERR_NATIVE, "Bug caught! Please contact the AMX Mod X Dev Team.");
return 0;
}
//parameter stack
//NOTE: it is possible that recursive register native calling
// could potentially be somehow damaged here.
//so, a :TODO: - make the stack unique, rather than a known ptr
pNative->caller = amx;
int err = 0;
cell ret = 0;
g_ErrorStk.push(0);
g_NativeStack.push(pNative);
if (pNative->style == 0)
{
amx_Push(pNative->amx, numParams);
amx_Push(pNative->amx, pPlugin->getId());
for (int i=numParams; i>=0; i--)
pNative->params[i] = params[i];
} else if (pNative->style == 1) {
//use dJeyL's system .. very clever!
for (int i=numParams; i>=1; i--)
amx_Push(pNative->amx, params[i]);
}
Debugger *pDebugger = (Debugger *)pNative->amx->userdata[UD_DEBUGGER];
if (pDebugger)
pDebugger->BeginExec();
err=amx_Exec(pNative->amx, &ret, pNative->func);
if (err != AMX_ERR_NONE)
{
if (pDebugger && pDebugger->ErrorExists())
{
//don't care
} else if (err != -1) {
//nothing logged the error
LogError(pNative->amx, err, NULL);
}
pNative->amx->error = AMX_ERR_NONE;
//furthermore, log an error in the parent plugin.
LogError(amx, AMX_ERR_NATIVE, "Unhandled dynamic native error");
} else if (g_ErrorStk.front()) {
LogError(amx, g_ErrorStk.front(), g_errorStr);
}
if (pDebugger)
pDebugger->EndExec();
g_NativeStack.pop();
g_ErrorStk.pop();
pNative->caller = NULL;
return ret;
}
AMX_NATIVE_INFO *BuildNativeTable()
{
if (g_RegNatives.size() < 1)
return NULL;
AMX_NATIVE_INFO *pNatives = new AMX_NATIVE_INFO[g_RegNatives.size() + 1];
AMX_NATIVE_INFO info;
regnative *pNative;
for (size_t i=0; i<g_RegNatives.size(); i++)
{
pNative = g_RegNatives[i];
info.name = pNative->name.c_str();
info.func = (AMX_NATIVE)((void *)(pNative->pfn));
pNatives[i] = info;
}
pNatives[g_RegNatives.size()].name = NULL;
pNatives[g_RegNatives.size()].func = NULL;
//this needs to be deleted
return pNatives;
}
static cell AMX_NATIVE_CALL log_error(AMX *amx, cell *params)
{
int len;
char *err = format_amxstring(amx, params, 2, len);
_snprintf(g_errorStr, sizeof(g_errorStr), "%s", err);
g_ErrorStk.pop();
g_ErrorStk.push(params[1]);
return 1;
}
//get_string(param, dest[], len)
static cell AMX_NATIVE_CALL get_string(AMX *amx, cell *params)
{
if (!g_NativeStack.size())
{
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0;
}
regnative *pNative = g_NativeStack.front();
if (pNative->style)
{
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0;
}
int p = params[1];
int len;
char *str = get_amxstring(pNative->caller, pNative->params[p], 0, len);
return set_amxstring(amx, params[2], str, params[3]);
}
//set_string(param, source[], maxlen)
static cell AMX_NATIVE_CALL set_string(AMX *amx, cell *params)
{
if (!g_NativeStack.size())
{
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0;
}
regnative *pNative = g_NativeStack.front();
if (pNative->style)
{
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0;
}
int p = params[1];
int len;
char *str = get_amxstring(amx, params[2], 0, len);
return set_amxstring(pNative->caller, pNative->params[p], str, params[3]);
}
//get a byvalue parameter
//get_param(num)
static cell AMX_NATIVE_CALL get_param(AMX *amx, cell *params)
{
if (!g_NativeStack.size())
{
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0;
}
regnative *pNative = g_NativeStack.front();
if (pNative->style)
{
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0;
}
int p = params[1];
return pNative->params[p];
}
//get_param_byref(num)
static cell AMX_NATIVE_CALL get_param_byref(AMX *amx, cell *params)
{
if (!g_NativeStack.size())
{
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0;
}
regnative *pNative = g_NativeStack.front();
if (pNative->style)
{
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0;
}
int p = params[1];
cell *addr = get_amxaddr(pNative->caller, pNative->params[p]);
return addr[0];
}
//set_param_byref(num, val)
static cell AMX_NATIVE_CALL set_param_byref(AMX *amx, cell *params)
{
if (!g_NativeStack.size())
{
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0;
}
regnative *pNative = g_NativeStack.front();
if (pNative->style)
{
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0;
}
int p = params[1];
cell *addr = get_amxaddr(pNative->caller, pNative->params[p]);
addr[0] = params[2];
return 1;
}
//get_array(param, dest[], size)
static cell AMX_NATIVE_CALL get_array(AMX *amx, cell *params)
{
if (!g_NativeStack.size())
{
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0;
}
regnative *pNative = g_NativeStack.front();
if (pNative->style)
{
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0;
}
int p = params[1];
cell *source = get_amxaddr(pNative->caller, pNative->params[p]);
cell *dest = get_amxaddr(amx, params[2]);
int size = params[3];
memcpy(dest, source, size * sizeof(cell));
return 1;
}
//set_array(param, source[], size)
static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
{
if (!g_NativeStack.size())
{
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0;
}
regnative *pNative = g_NativeStack.front();
if (pNative->style)
{
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0;
}
int p = params[1];
cell *dest = get_amxaddr(pNative->caller, pNative->params[p]);
cell *source = get_amxaddr(amx, params[2]);
int size = params[3];
memcpy(dest, source, size * sizeof(cell));
return 1;
}
static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
{
if (!g_NativeStack.size())
{
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0;
}
regnative *pNative = g_NativeStack.front();
if (pNative->style)
{
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0;
}
int vargPos = static_cast<int>(params[4]);
int fargPos = static_cast<int>(params[3]);
/** get the parent parameter array */
cell *local_params = pNative->params;
cell max = local_params[0] / sizeof(cell);
if (vargPos > (int)max + 1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos);
return 0;
}
if (fargPos > (int)max + 1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid fmtarg parameter passed: %d", fargPos);
return 0;
}
/* get destination info */
cell *fmt;
if (fargPos == 0)
{
if (params[0] / sizeof(cell) != 5)
{
LogError(amx, AMX_ERR_NATIVE, "Expected fmtarg as fifth parameter, found none");
return 0;
}
fmt = get_amxaddr(amx, params[5]);
} else {
fmt = get_amxaddr(pNative->caller, pNative->params[fargPos]);
}
cell *realdest = get_amxaddr(amx, params[1]);
size_t maxlen = static_cast<size_t>(params[2]);
cell *dest = realdest;
/* if this is necessary... */
static cell cpbuf[4096];
dest = cpbuf;
/* perform format */
size_t total = atcprintf(dest, maxlen, fmt, pNative->caller, local_params, &vargPos);
/* copy back */
memcpy(realdest, dest, (total+1) * sizeof(cell));
return total;
}
//This is basically right from dJeyL's lib_convert function
//This awesome hack modifies the stack frame to have an address offset
// that will align to the other plugin's memory.
//I've no idea how he thought of this, but it's great. No idea how well it works.
static cell AMX_NATIVE_CALL param_convert(AMX *amx, cell *params)
{
if (!g_NativeStack.size())
{
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0;
}
regnative *pNative = g_NativeStack.front();
if (pNative->style != 1)
{
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0;
}
cell p = params[1];
AMX *caller = pNative->caller;
unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat;
unsigned char *realdata = caller->base+(int)((AMX_HEADER *)caller->base)->dat;
* (cell *)(data+(int)amx->frm+(p+2)*sizeof(cell)) -= (cell)data-(cell)realdata;
return 1;
}
static cell AMX_NATIVE_CALL register_library(AMX *amx, cell *params)
{
int len;
char *lib = get_amxstring(amx, params[1], 0, len);
AddLibrary(lib, LibType_Library, LibSource_Plugin, g_plugins.findPluginFast(amx));
return 1;
}
//register_native(const name[], const handler[])
static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
{
if (!g_Initialized)
amxx_DynaInit((void *)(amxx_DynaCallback));
g_Initialized = true;
int len;
char *name = get_amxstring(amx, params[1], 0, len);
char *func = get_amxstring(amx, params[2], 1, len);
int idx, err;
if ( (err=amx_FindPublic(amx, func, &idx)) != AMX_ERR_NONE)
{
LogError(amx, err, "Function \"%s\" was not found", func);
return 0;
}
regnative *pNative = new regnative;
pNative->amx = amx;
pNative->func = idx;
pNative->caller = NULL;
//we'll apply a safety buffer too
//make our function
int size = amxx_DynaCodesize();
#ifndef __linux__
DWORD temp;
pNative->pfn = new char[size + 10];
VirtualProtect(pNative->pfn, size+10, PAGE_EXECUTE_READWRITE, &temp);
#else
pNative->pfn = (char *)memalign(sysconf(_SC_PAGESIZE), size+10);
mprotect((void *)pNative->pfn, size+10, PROT_READ|PROT_WRITE|PROT_EXEC);
#endif
int id = (int)g_RegNatives.size();
amxx_DynaMake(pNative->pfn, id);
pNative->func = idx;
pNative->style = params[3];
g_RegNatives.push_back(pNative);
pNative->name.assign(name);
return 1;
}
void ClearPluginLibraries()
{
ClearLibraries(LibSource_Plugin);
for (size_t i=0; i<g_RegNatives.size(); i++)
{
delete [] g_RegNatives[i]->pfn;
delete g_RegNatives[i];
}
g_RegNatives.clear();
}
AMX_NATIVE_INFO g_NativeNatives[] = {
{"register_native", register_native},
{"log_error", log_error},
{"register_library",register_library},
{"get_string", get_string},
{"set_string", set_string},
{"get_param", get_param},
{"get_param_byref", get_param_byref},
{"set_param_byref", set_param_byref},
{"get_array", get_array},
{"set_array", set_array},
//these are dummy functions for floats ;p
{"get_param_f", get_param},
{"get_float_byref", get_param_byref},
{"set_float_byref", set_param_byref},
{"get_array_f", get_array},
{"set_array_f", set_array},
{"vdformat", vdformat},
{"param_convert", param_convert},
//////////////////////////
{NULL, NULL},
};

69
amxmodx/natives.h Executable file
View File

@ -0,0 +1,69 @@
/* 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_NATIVES_H
#define _INCLUDE_NATIVES_H
//only 16 for now sorry
#if !defined CALLFUNC_MAXPARAMS
#define CALLFUNC_MAXPARAMS 16
#endif
#define CALLFUNC_FLAG_BYREF 1
#define CALLFUNC_FLAG_BYREF_REUSED 2
#define N_CELL 1
#define N_ARRAY 2
#define N_BYREF 3
#define N_VARARG 4
struct regnative
{
AMX *amx;
String name;
char *pfn;
int func;
AMX *caller;
int style;
cell params[CALLFUNC_MAXPARAMS];
};
extern "C" void amxx_DynaInit(void *ptr);
extern "C" void amxx_DynaMake(char *buffer, int id);
extern "C" int amxx_DynaFunc(AMX *amx, cell *params);
extern "C" int amxx_DynaCodesize();
AMX_NATIVE_INFO *BuildNativeTable();
void ClearPluginLibraries();
//I couldn't resist :)
extern AMX_NATIVE_INFO g_NativeNatives[];
#endif //_INCLUDE_NATIVES_H

967
amxmodx/newmenus.cpp Executable file
View File

@ -0,0 +1,967 @@
/* 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 "newmenus.h"
CVector<Menu *> g_NewMenus;
CStack<int> g_MenuFreeStack;
void ClearMenus()
{
for (size_t i = 0; i < g_NewMenus.size(); i++)
{
delete g_NewMenus[i];
}
g_NewMenus.clear();
while (!g_MenuFreeStack.empty())
{
g_MenuFreeStack.pop();
}
}
void validate_menu_text(char *str)
{
if (!g_coloredmenus)
{
size_t offs = 0;
while (*str)
{
if (*str == '\\')
{
str++;
char c = tolower(*str);
if (c == 'r' || c == 'w'
|| c== 'w' || c == 'd')
{
str++;
offs += 2;
continue;
}
}
if (offs)
{
*(str-offs) = *str;
}
str++;
}
if (offs)
{
*(str-offs) = '\0';
}
}
}
Menu::Menu(const char *title, int mid, int tid)
{
m_Title.assign(title);
menuId = mid;
thisId = tid;
m_OptNames[abs(MENU_BACK)].assign("Back");
m_OptNames[abs(MENU_MORE)].assign("More");
m_OptNames[abs(MENU_EXIT)].assign("Exit");
m_OptOrders[0] = MENU_BACK;
m_OptOrders[1] = MENU_MORE;
m_OptOrders[2] = MENU_EXIT;
m_AlwaysExit = false;
m_NeverExit = false;
m_AutoColors = g_coloredmenus;
items_per_page = 7;
func = 0;
padding = 0;
isDestroying = false;
}
Menu::~Menu()
{
for (size_t i = 0; i < m_Items.size(); i++)
{
delete m_Items[i];
}
unregisterSPForward(this->func);
m_Items.clear();
}
menuitem *Menu::AddItem(const char *name, const char *cmd, int access)
{
menuitem *pItem = new menuitem;
pItem->name.assign(name);
pItem->cmd.assign(cmd);
pItem->access = access;
pItem->id = m_Items.size();
pItem->handler = -1;
pItem->pfn = NULL;
m_Items.push_back(pItem);
return pItem;
}
menuitem *Menu::GetMenuItem(item_t item)
{
if (item >= m_Items.size())
return NULL;
return m_Items[item];
}
size_t Menu::GetItemCount()
{
return m_Items.size();
}
size_t Menu::GetPageCount()
{
size_t items = GetItemCount();
if (items_per_page == 0)
{
return 1;
}
return ((items/items_per_page) + ((items % items_per_page) ? 1 : 0));
}
int Menu::PagekeyToItem(page_t page, item_t key)
{
size_t start = page * items_per_page;
size_t num_pages = GetPageCount();
if (num_pages == 1 || !items_per_page)
{
if (key > m_Items.size())
return MENU_EXIT;
else
return key-1;
} else {
//first page
if (page == 0)
{
/* The algorithm for spaces here is same as a middle page. */
item_t new_key = key;
for (size_t i=start; i<(start+key-1) && i<m_Items.size(); i++)
{
for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
{
if (m_Items[i]->blanks[j] == 1)
{
if (!new_key)
{
break;
}
new_key--;
}
if (!new_key)
{
break;
}
}
}
key = new_key;
if (key == items_per_page + 1)
{
return MENU_MORE;
} else if (key == items_per_page + 2) {
return MENU_EXIT;
} else {
return (start + key - 1);
}
} else if (page == num_pages - 1) {
//last page
size_t remaining = m_Items.size() - start;
/* We have to add one remaining for each "bumping" space */
for (size_t i=m_Items.size() - remaining; i<m_Items.size(); i++)
{
for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
{
if (m_Items[i]->blanks[j] == 1)
{
remaining++;
}
}
}
if (key == remaining + 1)
{
return MENU_BACK;
} else if (key == remaining + 2) {
return MENU_EXIT;
} else {
return (start + key - 1);
}
} else {
/* The algorithm for spaces here is a bit harder. We have to subtract
* one from the key for each space we find along the way.
*/
item_t new_key = key;
for (size_t i=start; i<(start+key-1) && i<m_Items.size(); i++)
{
for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
{
if (m_Items[i]->blanks[j] == 1)
{
if (!new_key)
{
break;
}
new_key--;
}
if (!new_key)
{
break;
}
}
}
key = new_key;
if (key > items_per_page && (key-items_per_page<=3))
{
return m_OptOrders[key-items_per_page-1];
} else {
return (start + key - 1);
}
}
}
}
bool Menu::Display(int player, page_t page)
{
int keys = 0;
const char *str = GetTextString(player, page, keys);
if (!str)
return false;
static char buffer[2048];
int len = _snprintf(buffer, sizeof(buffer)-1, "%s", str);
CPlayer *pPlayer = GET_PLAYER_POINTER_I(player);
pPlayer->keys = keys;
pPlayer->menu = menuId;
pPlayer->newmenu = thisId;
pPlayer->page = (int)page;
UTIL_ShowMenu(pPlayer->pEdict, keys, -1, buffer, len);
return true;
}
const char *Menu::GetTextString(int player, page_t page, int &keys)
{
page_t pages = GetPageCount();
item_t numItems = GetItemCount();
if (page >= pages)
return NULL;
m_Text.clear();
char buffer[255];
if (items_per_page && (pages != 1))
{
if (m_AutoColors)
_snprintf(buffer, sizeof(buffer)-1, "\\y%s %d/%d\n\\w\n", m_Title.c_str(), page + 1, pages);
else
_snprintf(buffer, sizeof(buffer)-1, "%s %d/%d\n\n", m_Title.c_str(), page + 1, pages);
} else {
if (m_AutoColors)
_snprintf(buffer, sizeof(buffer)-1, "\\y%s\n\\w\n", m_Title.c_str());
else
_snprintf(buffer, sizeof(buffer)-1, "%s\n\n", m_Title.c_str());
}
m_Text.append(buffer);
enum
{
Display_Back = (1<<0),
Display_Next = (1<<1),
Display_Exit = (1<<2),
};
int flags = Display_Back|Display_Next;
item_t start = page * items_per_page;
item_t end = 0;
if (items_per_page)
{
if (start + items_per_page >= numItems)
{
end = numItems - 1;
flags &= ~Display_Next;
} else {
end = start + items_per_page - 1;
}
if (!m_NeverExit && (m_AlwaysExit || (page == 0 || page == pages-1)))
flags |= Display_Exit;
} else {
end = numItems - 1;
if (end > 10)
end = 10;
flags = 0;
}
if (page == 0)
flags &= ~Display_Back;
menuitem *pItem = NULL;
int option = 0;
keys = 0;
bool enabled = true;
int ret = 0;
int slots = 0;
int option_display = 0;
for (item_t i = start; i <= end; i++)
{
pItem = m_Items[i];
if (pItem->access && !(pItem->access & g_players[player].flags[0]))
{
enabled = false;
}
if (pItem->handler != -1)
{
ret = executeForwards(pItem->handler, static_cast<cell>(player), static_cast<cell>(thisId), static_cast<cell>(i));
if (ret == ITEM_ENABLED)
{
enabled = true;
} else if (ret == ITEM_DISABLED) {
enabled = false;
}
}
if (pItem->pfn)
{
ret = (pItem->pfn)(player, thisId, i);
if (ret == ITEM_ENABLED)
{
enabled = true;
} else if (ret == ITEM_DISABLED) {
enabled = false;
}
}
if (enabled)
{
keys |= (1<<option);
}
option_display = ++option;
if (option_display == 10)
{
option_display = 0;
}
if (enabled)
{
keys |= (1<<option);
if (m_AutoColors)
{
_snprintf(buffer, sizeof(buffer)-1, "\\r%d.\\w %s\n", option_display, pItem->name.c_str());
} else {
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", option_display, pItem->name.c_str());
}
} else {
if (m_AutoColors)
{
_snprintf(buffer, sizeof(buffer)-1, "\\d%d. %s\n\\w", option_display, pItem->name.c_str());
} else {
_snprintf(buffer, sizeof(buffer)-1, "#. %s\n", pItem->name.c_str());
}
}
slots++;
m_Text.append(buffer);
//attach blanks
if (pItem->blanks.size())
{
for (size_t j=0; j<pItem->blanks.size(); j++)
{
if (pItem->blanks[j] == 1)
{
option++;
}
m_Text.append("\n");
slots++;
}
}
}
if (padding == 1 && items_per_page)
{
int pad = items_per_page;
if (flags & Display_Back)
{
pad--;
}
if (flags & Display_Next)
{
pad--;
}
if (flags & Display_Exit)
{
pad--;
}
for (int i=slots+1; i<=pad; i++)
{
m_Text.append("\n");
option++;
}
}
for (int i=0; i<3; i++)
{
switch (m_OptOrders[i])
{
case MENU_BACK:
{
if (flags & Display_Back)
{
keys |= (1<<option++);
_snprintf(buffer,
sizeof(buffer)-1,
m_AutoColors ? "\\r%d. \\w%s\n" : "%d. %s\n",
option,
m_OptNames[abs(MENU_BACK)].c_str()
);
m_Text.append(buffer);
}
break;
}
case MENU_MORE:
{
if (flags & Display_Next)
{
keys |= (1<<option++);
_snprintf(buffer,
sizeof(buffer)-1,
m_AutoColors ? "\\r%d. \\w%s\n" : "%d. %s\n",
option,
m_OptNames[abs(MENU_MORE)].c_str()
);
m_Text.append(buffer);
}
break;
}
case MENU_EXIT:
{
if (flags & Display_Exit)
{
keys |= (1<<option++);
_snprintf(buffer,
sizeof(buffer)-1,
m_AutoColors ? "\\r%d. \\w%s\n" : "%d. %s\n",
option,
m_OptNames[abs(MENU_EXIT)].c_str()
);
m_Text.append(buffer);
}
break;
}
}
}
return m_Text.c_str();
}
#define GETMENU(p) if (p >= (int)g_NewMenus.size() || p < 0 || !g_NewMenus[p] || g_NewMenus[p]->isDestroying) { \
LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d(%d)", p, g_NewMenus.size()); \
return 0; } \
Menu *pMenu = g_NewMenus[p];
//Makes a new menu handle (-1 for failure)
//native csdm_makemenu(title[]);
static cell AMX_NATIVE_CALL menu_create(AMX *amx, cell *params)
{
int len;
char *title = get_amxstring(amx, params[1], 0, len);
validate_menu_text(title);
char *handler = get_amxstring(amx, params[2], 1, len);
int func = registerSPForwardByName(amx, handler, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (func == -1)
{
LogError(amx, AMX_ERR_NOTFOUND, "Invalid function \"%s\"", handler);
return 0;
}
int id = g_menucmds.registerMenuId(title, amx);
g_menucmds.registerMenuCmd(g_plugins.findPluginFast(amx), id, 1023, func);
Menu *pMenu = new Menu(title, id, 0);
pMenu->func = func;
if (g_MenuFreeStack.empty())
{
g_NewMenus.push_back(pMenu);
pMenu->thisId = (int)g_NewMenus.size() - 1;
return (int)g_NewMenus.size() - 1;
} else {
int pos = g_MenuFreeStack.front();
g_MenuFreeStack.pop();
g_NewMenus[pos] = pMenu;
pMenu->thisId = pos;
return pos;
}
}
static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params)
{
GETMENU(params[1]);
if (params[2] && (!pMenu->items_per_page && pMenu->GetItemCount() >= 10))
{
LogError(amx, AMX_ERR_NATIVE, "Non-paginated menus are limited to 10 items.");
return 0;
}
if (!pMenu->m_Items.size())
{
LogError(amx, AMX_ERR_NATIVE, "Blanks can only be added after items.");
return 0;
}
menuitem *item = pMenu->m_Items[pMenu->m_Items.size() - 1];
item->blanks.push_back(params[2]);
return 1;
}
//Adds an item to the menu (returns current item count - 1)
//native menu_additem(menu, const name[], const command[]="", access=0);
static cell AMX_NATIVE_CALL menu_additem(AMX *amx, cell *params)
{
int len;
char *name, *cmd;
int access;
GETMENU(params[1]);
if (!pMenu->items_per_page && pMenu->GetItemCount() >= 10)
{
LogError(amx, AMX_ERR_NATIVE, "Non-paginated menus are limited to 10 items.");
return 0;
}
name = get_amxstring(amx, params[2], 0, len);
validate_menu_text(name);
cmd = get_amxstring(amx, params[3], 1, len);
access = params[4];
menuitem *pItem = pMenu->AddItem(name, cmd, access);
pItem->handler = params[5];
return 1;
}
//Returns the number of pages in a menu
//native csdm_menu_pages(menu);
static cell AMX_NATIVE_CALL menu_pages(AMX *amx, cell *params)
{
GETMENU(params[1]);
return pMenu->GetPageCount();
}
//Returns the number of items in a menu
//native csdm_menu_items(menu);
static cell AMX_NATIVE_CALL menu_items(AMX *amx, cell *params)
{
GETMENU(params[1]);
return pMenu->GetItemCount();
}
//Builds the menu string for a specific page (set title to 0 to not include title)
//page indices start at 0!
static cell AMX_NATIVE_CALL menu_display(AMX *amx, cell *params)
{
GETMENU(params[2]);
int player = params[1];
int page = params[3];
CPlayer* pPlayer = GET_PLAYER_POINTER_I(player);
// This will set the expire time of the menu to infinite
pPlayer->menuexpire = INFINITE;
return pMenu->Display(player, page);
}
//Finds the id of a menu item for a specific page and key value.
//Note that key should be from 0-6, as it only displays 7 per page.
//page indices start at 0
//native menu_keyid(menu, page, key);
static cell AMX_NATIVE_CALL menu_find_id(AMX *amx, cell *params)
{
GETMENU(params[1]);
page_t page = static_cast<page_t>(params[2]);
item_t key = static_cast<item_t>(params[3]);
return pMenu->PagekeyToItem(page, key);
}
//Gets info about a menu option
//native menu_item_getinfo(menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback);
static cell AMX_NATIVE_CALL menu_item_getinfo(AMX *amx, cell *params)
{
GETMENU(params[1]);
menuitem *pItem = pMenu->GetMenuItem(static_cast<item_t>(params[2]));
if (!pItem)
return 0;
cell *addr = get_amxaddr(amx, params[3]);
addr[0] = pItem->access;
set_amxstring(amx, params[4], pItem->cmd.c_str(), params[5]);
set_amxstring(amx, params[6], pItem->name.c_str(), params[7]);
if (params[8])
{
addr = get_amxaddr(amx, params[8]);
if (addr)
addr[0] = pItem->handler;
}
return 1;
}
static cell AMX_NATIVE_CALL menu_makecallback(AMX *amx, cell *params)
{
int len;
char *name = get_amxstring(amx, params[1], 0, len);
int id = registerSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (id == -1)
{
LogError(amx, AMX_ERR_NOTFOUND, "Invalid function %s", name);
return -1;
}
return id;
}
static cell AMX_NATIVE_CALL menu_item_setname(AMX *amx, cell *params)
{
GETMENU(params[1]);
menuitem *pItem = pMenu->GetMenuItem(static_cast<item_t>(params[2]));
if (!pItem)
return 0;
int len;
char *name;
name = get_amxstring(amx, params[3], 0, len);
pItem->name.assign(name);
return 1;
}
static cell AMX_NATIVE_CALL menu_item_setcmd(AMX *amx, cell *params)
{
GETMENU(params[1]);
menuitem *pItem = pMenu->GetMenuItem(static_cast<item_t>(params[2]));
if (!pItem)
return 0;
int len;
char *cmd;
cmd = get_amxstring(amx, params[3], 0, len);
pItem->cmd.assign(cmd);
return 1;
}
static cell AMX_NATIVE_CALL menu_item_setcall(AMX *amx, cell *params)
{
GETMENU(params[1]);
menuitem *pItem = pMenu->GetMenuItem(static_cast<item_t>(params[2]));
if (!pItem)
return 0;
pItem->handler = params[3];
return 1;
}
static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
{
GETMENU(params[1]);
int len = params[0] / sizeof(cell);
if (len < 3)
{
LogError(amx, AMX_ERR_NATIVE, "Expected 3 parameters");
return 0;
}
switch (params[2])
{
case MPROP_PERPAGE:
{
cell count = *get_amxaddr(amx, params[3]);
if (count < 0 || count > 7)
{
LogError(amx, AMX_ERR_NATIVE, "Cannot set %d items per page", count);
return 0;
}
pMenu->items_per_page = count;
break;
}
case MPROP_BACKNAME:
{
char *str = get_amxstring(amx, params[3], 0, len);
validate_menu_text(str);
pMenu->m_OptNames[abs(MENU_BACK)].assign(str);
break;
}
case MPROP_NEXTNAME:
{
char *str = get_amxstring(amx, params[3], 0, len);
validate_menu_text(str);
pMenu->m_OptNames[abs(MENU_MORE)].assign(str);
break;
}
case MPROP_EXITNAME:
{
char *str = get_amxstring(amx, params[3], 0, len);
validate_menu_text(str);
pMenu->m_OptNames[abs(MENU_EXIT)].assign(str);
break;
}
case MPROP_TITLE:
{
char *str = get_amxstring(amx, params[3], 0, len);
int old = pMenu->menuId;
g_menucmds.removeMenuId(old);
pMenu->m_Title.assign(str);
pMenu->menuId = g_menucmds.registerMenuId(str, amx);
g_menucmds.registerMenuCmd(
g_plugins.findPluginFast(amx),
pMenu->menuId,
1023,
pMenu->func);
CPlayer *pl;
/**
* NOTE - this is actually bogus
* the client's screen won't actually match the cmd here
* I think, this scenario needs to be tested.
*/
for (int i=1; i<=gpGlobals->maxClients; i++)
{
pl = GET_PLAYER_POINTER_I(i);
if (pl->menu == old)
pl->menu = pMenu->menuId;
}
break;
}
case MPROP_EXITALL:
{
cell ans = *get_amxaddr(amx, params[3]);
if (ans == 1)
{
pMenu->m_AlwaysExit = true;
pMenu->m_NeverExit = false;
} else if (ans == 0) {
pMenu->m_AlwaysExit = false;
pMenu->m_NeverExit = false;
} else if (ans == -1) {
pMenu->m_NeverExit = true;
pMenu->m_AlwaysExit = false;
}
break;
}
case MPROP_ORDER:
{
cell *addr = get_amxaddr(amx, params[3]);
pMenu->m_OptOrders[0] = addr[0];
pMenu->m_OptOrders[1] = addr[1];
pMenu->m_OptOrders[2] = addr[2];
break;
}
case MPROP_NOCOLORS:
{
pMenu->m_AutoColors = *get_amxaddr(amx, params[3]) ? true : false;
break;
}
case MPROP_PADMENU:
{
pMenu->padding = *get_amxaddr(amx, params[3]);
break;
}
default:
{
LogError(amx, AMX_ERR_NATIVE, "Invalid menu setting: %d", params[1]);
return 0;
}
}
return 1;
}
#define GETMENU_R(p) if (p >= (int)g_NewMenus.size() || p < 0 || !g_NewMenus[p]) { \
LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d(%d)", p, g_NewMenus.size()); \
return 0; } \
Menu *pMenu = g_NewMenus[p];
static cell AMX_NATIVE_CALL menu_cancel(AMX *amx, cell *params)
{
int index = params[1];
if (index < 1 || index > gpGlobals->maxClients)
{
LogError(amx, AMX_ERR_NATIVE, "Player %d is not valid", index);
return 0;
}
CPlayer *player = GET_PLAYER_POINTER_I(index);
if (!player->ingame)
{
LogError(amx, AMX_ERR_NATIVE, "Played %d is not in game", index);
return 0;
}
int menu = player->newmenu;
if (menu < 0 || menu >= (int)g_NewMenus.size() || !g_NewMenus[menu])
return 0;
Menu *pMenu = g_NewMenus[menu];
player->newmenu = -1;
player->menu = 0;
executeForwards(pMenu->func,
static_cast<cell>(index),
static_cast<cell>(pMenu->thisId),
static_cast<cell>(MENU_EXIT));
return 1;
}
static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
{
GETMENU_R(params[1]);
if (pMenu->isDestroying)
return 0; //prevent infinite recursion
pMenu->isDestroying = true;
g_menucmds.removeMenuId(pMenu->menuId);
CPlayer *player;
for (int i=1; i<=gpGlobals->maxClients; i++)
{
player = GET_PLAYER_POINTER_I(i);
if (player->newmenu == pMenu->thisId)
{
player->newmenu = -1;
player->menu = 0;
executeForwards(pMenu->func,
static_cast<cell>(i),
static_cast<cell>(pMenu->thisId),
static_cast<cell>(MENU_EXIT));
}
}
g_NewMenus[params[1]] = NULL;
delete pMenu;
g_MenuFreeStack.push(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL player_menu_info(AMX *amx, cell *params)
{
if (params[1] < 1 || params[1] > gpGlobals->maxClients)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid player id %d", params[1]);
return 0;
}
CPlayer *player = GET_PLAYER_POINTER_I(params[1]);
if (!player->ingame)
{
LogError(amx, AMX_ERR_NATIVE, "Player %d is not ingame", params[1]);
return 0;
}
cell *m = get_amxaddr(amx, params[2]);
cell *n = get_amxaddr(amx, params[3]);
*m = player->menu;
*n = player->newmenu;
if ( (*m != 0 && *m != -1) || (*n != -1))
return 1;
return 0;
}
AMX_NATIVE_INFO g_NewMenuNatives[] =
{
{"menu_create", menu_create},
{"menu_additem", menu_additem},
{"menu_addblank", menu_addblank},
{"menu_pages", menu_pages},
{"menu_items", menu_items},
{"menu_display", menu_display},
{"menu_find_id", menu_find_id},
{"menu_item_getinfo", menu_item_getinfo},
{"menu_makecallback", menu_makecallback},
{"menu_item_setcall", menu_item_setcall},
{"menu_item_setcmd", menu_item_setcmd},
{"menu_item_setname", menu_item_setname},
{"menu_destroy", menu_destroy},
{"menu_setprop", menu_setprop},
{"menu_cancel", menu_cancel},
{"player_menu_info", player_menu_info},
{NULL, NULL},
};

115
amxmodx/newmenus.h Executable file
View File

@ -0,0 +1,115 @@
/* 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_NEWMENUS_H
#define _INCLUDE_NEWMENUS_H
#define MENU_EXIT -3
#define MENU_BACK -2
#define MENU_MORE -1
#define ITEM_IGNORE 0
#define ITEM_ENABLED 1
#define ITEM_DISABLED 2
#define MPROP_PERPAGE 1
#define MPROP_BACKNAME 2
#define MPROP_NEXTNAME 3
#define MPROP_EXITNAME 4
#define MPROP_TITLE 5
#define MPROP_EXITALL 6
#define MPROP_ORDER 7
#define MPROP_NOCOLORS 8
#define MPROP_PADMENU 9
typedef int (*MENUITEM_CALLBACK)(int, int, int);
struct menuitem
{
String name;
String cmd;
int access;
int handler;
MENUITEM_CALLBACK pfn;
size_t id;
CVector<int> blanks;
};
typedef unsigned int menu_t;
typedef unsigned int item_t;
typedef unsigned int page_t;
class Menu
{
public:
Menu(const char *title, int menuId, int thisId);
~Menu();
menuitem *GetMenuItem(item_t item);
size_t GetPageCount();
size_t GetItemCount();
menuitem *AddItem(const char *name, const char *cmd, int access);
const char *GetTextString(int player, page_t page, int &keys);
bool Display(int player, page_t page);
int PagekeyToItem(page_t page, item_t key);
int GetMenuMenuid();
public:
CVector<menuitem * > m_Items;
String m_Title;
String m_Text;
String m_OptNames[4];
int m_OptOrders[3];
bool m_AlwaysExit;
bool m_NeverExit;
bool m_AutoColors;
int menuId;
int thisId;
int func;
int padding;
bool isDestroying;
public:
unsigned int items_per_page;
};
void ClearMenus();
extern CVector<Menu *> g_NewMenus;
extern AMX_NATIVE_INFO g_NewMenuNatives[];
#endif //_INCLUDE_NEWMENUS_H

123
amxmodx/optimizer.cpp Normal file
View File

@ -0,0 +1,123 @@
#include <string.h>
#include "optimizer.h"
int g_opt_level = 0;
#define OP_SYSREQ_C 123
#define OP_NOP 134
#define OP_FLOAT_MUL 138
#define OP_FLOAT_DIV 139
#define OP_FLOAT_ADD 140
#define OP_FLOAT_SUB 141
#define OP_FLOAT_TO 142
#define OP_FLOAT_ROUND 143
#define OP_FLOAT_CMP 144
cell op_trans_table[N_Total_FloatOps] =
{
OP_FLOAT_MUL,
OP_FLOAT_DIV,
OP_FLOAT_ADD,
OP_FLOAT_SUB,
OP_FLOAT_TO,
OP_FLOAT_ROUND,
OP_FLOAT_CMP
};
void OnBrowseRelocate(AMX *amx, cell *oplist, cell *cip)
{
char *codeptr = (char *)amx->base + (long)(((AMX_HEADER *)amx->base)->cod);
//jump to the parameter;
codeptr += *cip;
int native = -1;
cell n_offs = *(cell *)codeptr;
optimizer_s *opt = (optimizer_s *)amx->usertags[UT_OPTIMIZER];
for (int i=0; i<N_Total_FloatOps; i++)
{
if (opt->natives[i] == n_offs)
{
native = i;
break;
}
}
if (native != -1)
{
//we're patching this:
// 0x7B 0x?? SYSREQ.C float???
//with:
// 0x8A FLOAT.MUL
// 0x86 NOP
cell new_opcodes[2];
new_opcodes[0] = op_trans_table[native];
new_opcodes[1] = OP_NOP;
codeptr -= sizeof(cell);
#if defined __GNUC__ || defined ASM32 || defined JIT
*(cell *)codeptr = oplist[new_opcodes[0]];
*(cell *)(codeptr + sizeof(cell)) = oplist[new_opcodes[1]];
#else
*(cell *)codeptr = new_opcodes[0];
*(cell *)(codeptr + sizeof(cell)) = new_opcodes[1];
#endif
}
*cip += sizeof(cell);
return;
}
#define FIND_NATIVE(name, bind) \
if (amx_FindNative(amx, name, &index) != AMX_ERR_NOTFOUND) \
opt->natives[bind] = index;
void _Setup_Optimizer_Stage2(AMX *amx, cell *oplist, cell *cip)
{
int index;
amx->usertags[UT_BROWSEHOOK] = (void *)OnBrowseRelocate;
optimizer_s *opt = new optimizer_s;
for (int i=0; i<N_Total_FloatOps; i++)
opt->natives[i] = -1;
amx->usertags[UT_OPTIMIZER] = (void *)opt;
if (g_opt_level & 1)
{
FIND_NATIVE("floatmul", N_Float_Mul);
FIND_NATIVE("floatdiv", N_Float_Div);
FIND_NATIVE("floatadd", N_Float_Add);
FIND_NATIVE("floatsub", N_Float_Sub);
}
if (g_opt_level & 4)
{
FIND_NATIVE("float", N_Float_To);
FIND_NATIVE("floatround", N_Float_Round);
}
if (g_opt_level & 2)
{
#if !defined AMD64
if (amxx_CpuSupport())
{
#endif
FIND_NATIVE("floatcmp", N_Float_Cmp);
#if !defined AMD64
} else {
g_opt_level &= ~(2);
}
#endif
}
/* we don't do these yet because of radix stuff >:\ */
//FIND_NATIVE("floatsin", N_Float_Sin);
//FIND_NATIVE("floatcos", N_Float_Cos);
//FIND_NATIVE("floattan", N_Float_Tan);
}
void SetupOptimizer(AMX *amx)
{
amx->usertags[UT_BROWSEHOOK] = (void *)_Setup_Optimizer_Stage2;
}

29
amxmodx/optimizer.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef _INCLUDE_AMXMODX_OPTIMIZER_H
#define _INCLUDE_AMXMODX_OPTIMIZER_H
#include "amx.h"
enum
{
N_Float_Mul=0,
N_Float_Div,
N_Float_Add,
N_Float_Sub,
N_Float_To,
N_Float_Round,
N_Float_Cmp,
/* ------------ */
N_Total_FloatOps,
};
struct optimizer_s
{
int natives[N_Total_FloatOps];
};
void SetupOptimizer(AMX *amx);
extern "C" int amxx_CpuSupport();
extern int g_opt_level;
#endif //_INCLUDE_AMXMODX_OPTIMIZER_H

View File

@ -5,6 +5,13 @@
* 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.
*/ */
#include <stdlib.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"
static cell power(AMX *amx, cell *params) static cell power(AMX *amx, cell *params)

View File

@ -20,6 +20,13 @@
#define stricmp(a,b) strcasecmp(a,b) #define stricmp(a,b) strcasecmp(a,b)
#define strnicmp(a,b,c) strncasecmp(a,b,c) #define strnicmp(a,b,c) strncasecmp(a,b,c)
#if defined __linux__ && !defined _snprintf
#define _snprintf snprintf
#endif
#if defined __linux__ && !defined _vsnprintf
//#define _vsnprintf vsnprintf
#endif
/* /*
* WinWorld wants '\'. Unices do not. * WinWorld wants '\'. Unices do not.
*/ */

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