Compare commits
1136 Commits
amxmodx-0.
...
amxmodx-1.
Author | SHA1 | Date | |
---|---|---|---|
5f34f1baaa | |||
dc5e458d9e | |||
4feaa1449f | |||
25002f559a | |||
41f38424ee | |||
862ee2029a | |||
cd30fb0c1c | |||
59ad6c49e3 | |||
2d255829a6 | |||
be762580b7 | |||
ae8bf10746 | |||
324f4c58a8 | |||
a816767abb | |||
164a47bde4 | |||
545769e241 | |||
dcf39196d5 | |||
58dd553d00 | |||
f64ca6a827 | |||
ebd4974c75 | |||
4b1769f457 | |||
f58c0f4508 | |||
4d7bdcde47 | |||
c7a620424e | |||
24260137ec | |||
315e69797d | |||
dddc693369 | |||
13e654aafe | |||
f02c73f94c | |||
92f79ffe88 | |||
db33e50f92 | |||
2ad557024e | |||
ddf3b6df32 | |||
12bf140931 | |||
0d65bb64f9 | |||
c6e265b414 | |||
9ba597b5c1 | |||
b6a4514bd0 | |||
a6daebe7d4 | |||
471ba0adbf | |||
7225aa3cc0 | |||
88b833f879 | |||
6f8816c13f | |||
95ccd6078c | |||
2e5c71f771 | |||
eeb77395cd | |||
e3afe22a48 | |||
73d70aff29 | |||
120c849e4b | |||
138b732e75 | |||
760e29e531 | |||
401ee3c97f | |||
6e52ce7678 | |||
89aab62549 | |||
468d99ff70 | |||
2d787f43de | |||
f0c5e44985 | |||
76760b221d | |||
612a86dbef | |||
369ece2d56 | |||
cc37f479aa | |||
deaaf20713 | |||
e566413224 | |||
368856f122 | |||
52cc204787 | |||
52b1d67ca2 | |||
16ad8739e7 | |||
e67457440d | |||
fc955009da | |||
0dc2ba85e8 | |||
de65e65854 | |||
d95f2cba37 | |||
e2a521583a | |||
f8aac5e88d | |||
4738c92b8e | |||
7ce59966fc | |||
afa1337e62 | |||
cc34f468f0 | |||
3f9598fcbb | |||
97b5391118 | |||
227c13d12c | |||
729932476b | |||
7c21deb0f2 | |||
80048eba61 | |||
0552e5ef58 | |||
ce881a7d30 | |||
80dd7f034d | |||
5fac746feb | |||
67f012b74a | |||
5705e69abb | |||
bece1e6d0c | |||
f2527ecc86 | |||
66b95f64a5 | |||
af79fe8e20 | |||
d3e2bad4e7 | |||
6bebf37f1a | |||
2f27b7da8d | |||
824caab2c5 | |||
a105bc7402 | |||
81ab33d794 | |||
e90364c17b | |||
ac4014ff5a | |||
ad634924fa | |||
2d5f9ba181 | |||
aa0e4e121e | |||
f8227a09b4 | |||
46130a6754 | |||
58c006a9c8 | |||
ea1d72401c | |||
fdbe0e2064 | |||
e239801671 | |||
4be88a5015 | |||
ee02d0b13d | |||
2ec084ffa3 | |||
6636c20336 | |||
27c80b00f8 | |||
6bcb72952c | |||
8c17be27dd | |||
0232b0abee | |||
12fd7a9f0d | |||
71c6e70706 | |||
c5cc94ba98 | |||
8220cc4c01 | |||
57ce74c4c7 | |||
5d6c72bf42 | |||
63b2bbc67e | |||
12f628e3d7 | |||
cd8d800eb7 | |||
160ab3572b | |||
dc57ef1e0c | |||
ca1544564c | |||
462916d00f | |||
e15761b79a | |||
270d898f82 | |||
2a2d5697b8 | |||
b17f277a1b | |||
c15ed5741a | |||
9e035dc744 | |||
ac279b37e4 | |||
974fdc950e | |||
8bb01423b9 | |||
401a23a298 | |||
7ac9ed4b80 | |||
6fdcd8ffae | |||
d50a6302e0 | |||
5fd891bc32 | |||
864f7c268e | |||
4770f28a18 | |||
51a4e2bf4e | |||
c213c771d2 | |||
0176d3a2ae | |||
92653ceebc | |||
c9051ad364 | |||
94d350118d | |||
2e22dde409 | |||
4dad81af30 | |||
b271b01b13 | |||
a17b879380 | |||
ea05af9fe8 | |||
d661196429 | |||
1114443a43 | |||
d802a3c961 | |||
e2226ae809 | |||
fd8a27013b | |||
b12224eabd | |||
c30c3cf35c | |||
f828cde999 | |||
d05c381789 | |||
245054cf48 | |||
da82ce757f | |||
4d74743138 | |||
c1db39d086 | |||
d516824936 | |||
10328f5f81 | |||
d4f09aac74 | |||
8f97ed7934 | |||
1fcf7628a3 | |||
bdd740f8ab | |||
82fed37247 | |||
5b208eb9f5 | |||
9be88ffa42 | |||
f54d112bbb | |||
96c4d33da4 | |||
bad4c02647 | |||
70140ffc8f | |||
53e6bb6b50 | |||
4cb7986426 | |||
18ba13be84 | |||
dd371c4dbe | |||
7ea47c5a96 | |||
5693d2629e | |||
24d9e3266e | |||
b3b3ce4c2d | |||
5882802a3e | |||
94e19aae0c | |||
7d51404aeb | |||
1cdb12c4e4 | |||
e9993cce25 | |||
80bd845182 | |||
f986202b06 | |||
a4168a2096 | |||
3e85589930 | |||
b5a57da29c | |||
58fec512e5 | |||
a6ca045086 | |||
e401231d25 | |||
9ddc24898f | |||
f5350c0e0e | |||
fa64bef511 | |||
29bfd81b36 | |||
2d2506f1c4 | |||
f334fec0a3 | |||
03b6d3e77d | |||
661f6c9851 | |||
593e013572 | |||
b04498cddb | |||
8648bf32a3 | |||
1768ae4b23 | |||
80e6d31998 | |||
381e331dda | |||
13c65f006b | |||
4e8eff3e04 | |||
572ad38366 | |||
b2ade117ec | |||
9eb36bd2bb | |||
85b7ac740b | |||
98d3fb79d7 | |||
bf092b4f95 | |||
a4a9613f5b | |||
ad86bf636f | |||
d0b5886d7d | |||
aa75a143fc | |||
7144f5c794 | |||
befb651268 | |||
c8fdea6216 | |||
4a6a16c627 | |||
6256687272 | |||
5be9ba4a68 | |||
8f61073f43 | |||
a973adb4f2 | |||
96c9fc8bc8 | |||
d472d5d309 | |||
a819a494b8 | |||
f2c3dfa874 | |||
fe3645d809 | |||
b9ff24171f | |||
59fb0a39b2 | |||
94202eec34 | |||
ef8715892b | |||
e5ce86d61a | |||
7825364e06 | |||
5cba645e49 | |||
ef4d04a7e1 | |||
0302803f38 | |||
d57004c91f | |||
f5fe076ec1 | |||
7eaa8a1a39 | |||
de5abef49a | |||
edd9fa2879 | |||
0686da47a6 | |||
4f9f548a58 | |||
2d79c6e634 | |||
ad6c7d412a | |||
686dadc9c5 | |||
70bff9c430 | |||
cefad23b72 | |||
0447c39a97 | |||
688c12ac8b | |||
5cbcd34bec | |||
f9563b5103 | |||
38da105ac1 | |||
cc393d0e8d | |||
25cbe60bf8 | |||
6be3805841 | |||
6e3de2c53a | |||
cf274f7f50 | |||
17cca4587c | |||
3014e60bdb | |||
e5b4b5a53d | |||
bc66a93fcf | |||
8f06e36d04 | |||
e38b64ff82 | |||
4687ecd99b | |||
b1718bc334 | |||
d7063435f4 | |||
a7133501d5 | |||
5078ed9d0f | |||
424a8c17b3 | |||
90c0e32cb3 | |||
d3acbcc319 | |||
a776e832dd | |||
65bd10c47b | |||
9bdd0ba0a4 | |||
ff48a9076b | |||
3f99ce7af5 | |||
4451691aa2 | |||
bc64ae2712 | |||
7f55873bfb | |||
d94016384a | |||
eb87344a16 | |||
43c06b0e36 | |||
a35b96fb7e | |||
562633c040 | |||
71eac5c544 | |||
4fe39dd5cc | |||
7605abc929 | |||
0a4133b4d0 | |||
0086b58f39 | |||
583b67dbb1 | |||
a81f356835 | |||
b2218661f8 | |||
8234977fa9 | |||
13ed6ed2d6 | |||
a7fb4e85c9 | |||
abfca025d5 | |||
34acc54cc9 | |||
b27eaab57f | |||
dd6c169994 | |||
5751d381af | |||
28998b5c14 | |||
a939cd0e2a | |||
d9d5446e86 | |||
b91cc24d32 | |||
faae071ee8 | |||
cdbfa38391 | |||
5d92972aad | |||
ba17c8a75f | |||
389a593f9e | |||
b35e5dbd55 | |||
0591c38d45 | |||
041e73dc7e | |||
431eb72518 | |||
75b63da66f | |||
51d54a96ff | |||
df982ceb79 | |||
ee978890b8 | |||
fa46d2e1b5 | |||
559d8bc7eb | |||
0d90a958ae | |||
cb7bfbf642 | |||
6cf6edb5b6 | |||
b9ee99a3dc | |||
a86302beea | |||
f6d647f614 | |||
32a42886dd | |||
5b1d0dd2b9 | |||
166b5ca650 | |||
044fa19470 | |||
1d6b173e87 | |||
eaf102d78f | |||
31436e3ecf | |||
62cdaf5e10 | |||
0de08a9452 | |||
0de288139d | |||
94d3b31f40 | |||
6d7442fb4f | |||
68ad9c2b9a | |||
191acd8e42 | |||
ce043d0633 | |||
f18354807e | |||
6a97d73167 | |||
586d09e533 | |||
ba24020857 | |||
4b9425cf3b | |||
ef2a9a2b34 | |||
1a3a5331d1 | |||
363e7e2270 | |||
fdbee670c5 | |||
a47ccb2a2a | |||
9e46d2da47 | |||
451a6d8464 | |||
4abd7b4706 | |||
09a08fd2f6 | |||
4609cb409b | |||
955aa04b41 | |||
69a5b5f410 | |||
b94fbb519a | |||
832de07128 | |||
f6b91f9258 | |||
f9ca86cee6 | |||
0ef9b80430 | |||
057929e2f6 | |||
25d629083f | |||
c2502626e6 | |||
76505f172a | |||
79268c5316 | |||
0c36613352 | |||
37a80e6ef6 | |||
7fc97524e2 | |||
842813dcbb | |||
9e194394c3 | |||
e188bf087a | |||
c5aae0d8aa | |||
25f1870020 | |||
911e2ecefe | |||
b9131293c5 | |||
536a4f8472 | |||
29e1a5edc8 | |||
34e5872881 | |||
1d853b5fee | |||
191824d72a | |||
99f65175ff | |||
2f8e311140 | |||
21551a6ea8 | |||
c4f097bb36 | |||
ffbf9fdca6 | |||
3863bd3ccc | |||
a89e1ac536 | |||
2f64226c6b | |||
91da6f1631 | |||
e8c87f8d89 | |||
3cba7811bd | |||
70396a2fc1 | |||
1a53b7bba7 | |||
74ec2e75b8 | |||
b312da8c63 | |||
fe2d28f711 | |||
1b09be51e1 | |||
e1d1802cb9 | |||
db293cc451 | |||
116984afed | |||
a9d4e4e711 | |||
ef908ff4f5 | |||
4631311905 | |||
1106113f2b | |||
35ed810775 | |||
e1a1153018 | |||
e91cd0862e | |||
5ac71db62d | |||
d270feb15f | |||
1c8aca42eb | |||
e0dbc031cc | |||
39eba4134e | |||
9f77c8a4a2 | |||
9b6fb64aba | |||
82d6cb9de0 | |||
8ae1d4ce27 | |||
21541fcc7f | |||
e9e4ab69e6 | |||
35ecd40228 | |||
e8d30a11d7 | |||
36d19dfe04 | |||
5d90ccf088 | |||
de5eb6924a | |||
0600e3357c | |||
40f28a543e | |||
13b6c0764c | |||
950d1b4a5f | |||
85ed8468f8 | |||
756a6a2b65 | |||
e63ed1e3e0 | |||
27c2978617 | |||
b0c9b868cd | |||
101c590f32 | |||
943a75d7e1 | |||
611ad2be94 | |||
64b7c7b600 | |||
cc899d298d | |||
3f2c117039 | |||
0d21377035 | |||
48749382fb | |||
996f461157 | |||
8d898ae459 | |||
b609eead1b | |||
567ab19fe5 | |||
1cc60fc9ad | |||
959a5b9225 | |||
9b8658606b | |||
51ff0a2c49 | |||
c1552aacd6 | |||
ba245458de | |||
c32e747dc1 | |||
7ad84abb09 | |||
dd6abc5487 | |||
3642cedd2b | |||
df87bc06c2 | |||
9d200888ff | |||
ebf0945c6e | |||
7c6d869cb4 | |||
6de8178c30 | |||
1b80dd5584 | |||
7ceaa4801d | |||
15bd719cf5 | |||
acb2b27852 | |||
abbb2f2cc2 | |||
aa8beace98 | |||
d17d9103de | |||
85f5604d43 | |||
fa42dbf011 | |||
d1c27a7534 | |||
8675d6a4a8 | |||
1d770fd400 | |||
d6b704e74c | |||
eeee302722 | |||
81f4a505c1 | |||
560f50eda7 | |||
73f1e4d77e | |||
87fd5e2b4e | |||
01cc4a1bad | |||
ad732d7286 | |||
448da8bd9e | |||
a4be1ac635 | |||
5e46f64d75 | |||
f9281fe309 | |||
d3a49d1d41 | |||
8736214678 | |||
b2aa069cd4 | |||
01bacc3275 | |||
53b7516449 | |||
916325d3db | |||
054f046807 | |||
a4e57797f5 | |||
afef83ae66 | |||
730857a23b | |||
7fd9fff987 | |||
3074ca0756 | |||
7b8165fe6f | |||
3774575160 | |||
57eec2b88e | |||
b2eb9df894 | |||
00e9f2bbea | |||
adf12ab745 | |||
9d4e5b18ee | |||
8a40ed8cd6 | |||
c79909eb80 | |||
26e8b0dbb6 | |||
a2c2dc88fc | |||
99f47224ee | |||
a085cef0d6 | |||
2980fb1d82 | |||
3ed92695be | |||
9d797f8664 | |||
d7dbf60c8f | |||
06923d0f6d | |||
948be015a7 | |||
1a339b2f77 | |||
39479f2403 | |||
e4beb3828a | |||
84caa10733 | |||
a8ff2abab5 | |||
b4d2f83d6f | |||
be28d95b8d | |||
2401d1833e | |||
a189c0bda7 | |||
cc462c9ccb | |||
3d7987e8d8 | |||
1c544f55ca | |||
5c231919b6 | |||
4b48be3e93 | |||
ca07e53293 | |||
3f2a8ccfc5 | |||
e097932ac9 | |||
27e4174be6 | |||
7f47d2de56 | |||
6200ee6977 | |||
e98fb7d6e4 | |||
4e6233b898 | |||
544b74f839 | |||
4a823a0894 | |||
53188ab941 | |||
5f7dabf9b6 | |||
e343d224ce | |||
188023b5ac | |||
f18adbf9d6 | |||
9959ef52b3 | |||
8e58484fc5 | |||
a58ab24b0c | |||
a67085217f | |||
f08f16c20d | |||
ec9d4a52fe | |||
01b955d2d4 | |||
a384a78544 | |||
b4ad89e6ef | |||
2b4ed9cc27 | |||
e986848faf | |||
21ceae3c9e | |||
51b9fae4bc | |||
4e7d24f64b | |||
40640c92d4 | |||
c5b3919122 | |||
29a22bb5fd | |||
2baf9c4c20 | |||
c4727c1dc3 | |||
4901dee86d | |||
c1f2a499f8 | |||
7aa31c764d | |||
08fea0eea1 | |||
add716276b | |||
e688addd98 | |||
199131b2b8 | |||
fb29cbff16 | |||
11fa330f10 | |||
ca720c8c83 | |||
456d7b69a2 | |||
a86cb11fd7 | |||
96c65dcfc4 | |||
86451da9a9 | |||
57607f1a28 | |||
eb4fdf53fa | |||
6251521102 | |||
c940a0b621 | |||
719af5c72c | |||
128d19c69e | |||
46861ff5b4 | |||
ee464539de | |||
f69ff642df | |||
db77c245e6 | |||
d5caf3e2ac | |||
148b365e43 | |||
8c215e5d6f | |||
0513dae63e | |||
f73a8356f6 | |||
77c5198009 | |||
820fedca22 | |||
28a1182cd2 | |||
16444a713a | |||
6457fc45c7 | |||
cb94cccf22 | |||
c0ee97b437 | |||
f950d384b6 | |||
426a71e7f2 | |||
d49b2453bb | |||
74a1db4417 | |||
dc7e1e2494 | |||
5dfbcf2a23 | |||
09c1471c3a | |||
50a882cf4c | |||
850557df5a | |||
4c43eccbb5 | |||
380db7c884 | |||
1994917044 | |||
449f31d78c | |||
bc2386fe47 | |||
ec02883f6e | |||
abd372447a | |||
fef70c0386 | |||
719b32d71f | |||
4e385fec50 | |||
c9b2f2f060 | |||
d038e926fd | |||
712859eb20 | |||
826893d8d2 | |||
47d1881c29 | |||
741666b742 | |||
ee8e30417c | |||
cc4bbadfa2 | |||
8761791473 | |||
6697b7b1d3 | |||
3c9a47aae3 | |||
d1675c82b5 | |||
b40643950d | |||
ff5b1dd7cc | |||
3587483fa6 | |||
c9c26b869c | |||
8f18856e91 | |||
ddfba00791 | |||
c6eaa97391 | |||
5eb095b514 | |||
4e0bfe161e | |||
0e681d9bd4 | |||
3d1162ecd9 | |||
3414cd7ce7 | |||
66386cca59 | |||
75396c753c | |||
4edd77faee | |||
91db6c7398 | |||
46390b83ac | |||
89eda75b1f | |||
f14808e009 | |||
b569ea3c3f | |||
f595be47dc | |||
ee3404fea0 | |||
61fc7da654 | |||
14c3930b3d | |||
3efa25a5fb | |||
c29a7d34e5 | |||
daa873d8ed | |||
c09de969eb | |||
b0dd18580c | |||
32deaa261f | |||
3a8e103faf | |||
f4b1c9f78a | |||
618759f390 | |||
ced5d6ff57 | |||
db4041114f | |||
b52d77e8bf | |||
940b0be4b9 | |||
75f49e78b0 | |||
f06359e38f | |||
2733adbb49 | |||
fc4d8f183b | |||
ea70c77dd8 | |||
301a69aacb | |||
92eda7c214 | |||
4800ab292c | |||
34cfce33a1 | |||
fec17424fb | |||
264dd7a10d | |||
6cef4eab4f | |||
f4ada32ec2 | |||
bff8c3cdcf | |||
3b670333de | |||
eb36757ef1 | |||
054b1f8868 | |||
23234fad0b | |||
74dca8b6ef | |||
2a187988f6 | |||
d1ee9ee9ba | |||
380f560fa4 | |||
d9b6fa1f93 | |||
8a57648b87 | |||
80b8591295 | |||
f94aa52974 | |||
ef8ad4a894 | |||
41b6f6bd4a | |||
9e8f380121 | |||
39070081d1 | |||
00d8ffe503 | |||
4ef8530bba | |||
77aa0f4f8e | |||
766246648d | |||
7963eb1cde | |||
02d8b2c523 | |||
227fb0411e | |||
027ae6dc7e | |||
334905e16e | |||
e3fad723b8 | |||
5e52c45968 | |||
e3a2a2bc17 | |||
18b75cb07c | |||
4e1c5a3e02 | |||
5db290890f | |||
b9c83aa4a2 | |||
bb12f71137 | |||
0a3911231b | |||
846ef95c58 | |||
601bb30b7e | |||
9728b79c33 | |||
90baf98057 | |||
8ad6437dd8 | |||
02bf904467 | |||
62e4bbcfe9 | |||
fc15ac1f41 | |||
01770f0e5b | |||
87ff81a499 | |||
981f41aee0 | |||
605ca152c2 | |||
0fc8f0b489 | |||
c511d80da7 | |||
8304fc143c | |||
f3cfd31668 | |||
ef90960121 | |||
3700b8b39f | |||
b83f2f5257 | |||
06f61cf92a | |||
5a5ff6d8ea | |||
bbe2626fd1 | |||
d5646ae238 | |||
df43d897df | |||
687a0f23da | |||
aa0dc4dbaf | |||
de399c54c6 | |||
58d522e4c3 | |||
3b90cca5bd | |||
b7c9cfeea4 | |||
4fcad51d25 | |||
c2a2fc7dbe | |||
3f0d3c257a | |||
ecc07d4b45 | |||
8da965552b | |||
cfe36dea52 | |||
c16eab09ec | |||
d07cc0424d | |||
c669efd609 | |||
c3151b312a | |||
3fc3ece5b0 | |||
6887dfef16 | |||
867e7615ae | |||
5157be6e3d | |||
82ca25b231 | |||
a555f9b3f0 | |||
c1a6ce2565 | |||
8874666109 | |||
5233be593f | |||
0f38a24555 | |||
8d06f80eeb | |||
0983698d2e | |||
dde43b6e0d | |||
4382158b88 | |||
ba69d73785 | |||
be3d078d5a | |||
b8ca4586ad | |||
25750d2f05 | |||
423a467a70 | |||
d6e18a3e97 | |||
a6d5d89209 | |||
16b35006bd | |||
95b638dbcd | |||
c42fef6d48 | |||
d60d19a3d7 | |||
3f1c730863 | |||
89f5a45e1d | |||
2b2149b643 | |||
f074af039b | |||
30ec1eec60 | |||
0e279c5bc9 | |||
525dfceb1d | |||
83fa1aea27 | |||
6e3f2f9616 | |||
6a77edfa97 | |||
b24f44896c | |||
e23726ac54 | |||
fb2be2256f | |||
1ef7f8dd72 | |||
4008743091 | |||
bff11bc18e | |||
6ada631aaf | |||
9042efd195 | |||
04b88c16a9 | |||
1c6636b106 | |||
a6a03bf51e | |||
b05cf94a23 | |||
b641192e73 | |||
d14c107db1 | |||
2e24077b77 | |||
d819c76024 | |||
89b5496dfb | |||
de44b4382a | |||
c71fc25a9d | |||
5527afc91e | |||
47eb690a89 | |||
bb662770e0 | |||
4d04072672 | |||
4c00d8b95d | |||
f828e1c8a0 | |||
34abaa1d56 | |||
768ea7519f | |||
3eed3b7f07 | |||
3419aa4dc5 | |||
54a00466e8 | |||
5133915e9c | |||
895948ca45 | |||
d0c51bd637 | |||
2e028ebe20 | |||
26349730e5 | |||
c0374c5fe5 | |||
ab2794d4bd | |||
e0af113cac | |||
f9a57a83a0 | |||
b7c0c47c05 | |||
2d9ec5295d | |||
b3f01faf38 | |||
58578690ad | |||
4754ccdd1d | |||
f6facb5349 | |||
1728c02561 | |||
c90d922443 | |||
2f1de39dd3 | |||
ec5f944c03 | |||
d43807a248 | |||
1980c524d3 | |||
31604d44a8 | |||
dba30f7ee6 | |||
1aaf540be4 | |||
d3751054da | |||
0c2dbdbc47 | |||
1485014229 | |||
0ea68c81dc | |||
8fbbda13c6 | |||
a96d26d573 | |||
fb7d1c0a7d | |||
d7d8ba1398 | |||
36c78421ae | |||
083fe35188 | |||
9e4a611b7f | |||
4ed906248d | |||
44bb871f7e | |||
c1a138f370 | |||
569ef4d494 | |||
26465afbf7 | |||
e287a2f202 | |||
91decabfde | |||
9a21e3e9d3 | |||
60940512e2 | |||
d4e69d97e0 | |||
f171842cf8 | |||
3d9bf8bc93 | |||
d7325f4209 | |||
5c177aada0 | |||
5c6289e1f0 | |||
844fbf581e | |||
22bac3c8f4 | |||
35ffbf8ca6 | |||
926f995a3a | |||
8589f0bcf5 | |||
1a2ef38588 | |||
fed8228712 | |||
09d0ba039d | |||
f2dcb89609 | |||
69e7cbc722 | |||
54e88bf8a8 | |||
b0315f5d56 | |||
ec55a2ab97 | |||
1082ef31c7 | |||
ee28532c53 | |||
e4294da5bd | |||
1ba9a39b3f | |||
5453b55bdc | |||
16f51ea619 | |||
b209d92a2a | |||
0def8c9354 | |||
ac59f75523 | |||
f2faf990a0 | |||
7f6e9f5e20 | |||
c12b04d302 | |||
9922b5016f | |||
77fffb46b2 | |||
e7cd31b1d5 | |||
9006673b09 | |||
96271810d8 | |||
8377680989 | |||
00582481c6 | |||
c2255016d2 | |||
9e1c5f2808 | |||
897d93a892 | |||
04be9fb703 | |||
acf722e855 | |||
d2fe1dc043 | |||
dafc8bb678 | |||
d303a2e0b7 | |||
7c8e9509ce | |||
7334f968a8 | |||
f5a997069d | |||
c7f8b3f965 | |||
316ddad7ab | |||
4d34270ee9 | |||
2573c9c4d2 | |||
d72b8de045 | |||
49d24f6829 | |||
6f9ec854dc | |||
9a3e713a69 | |||
3ec4ccd9da | |||
5867e3398f | |||
07ed1baee9 | |||
1e1d479d76 | |||
78c191b4c9 | |||
cf65ebf647 | |||
7b626ab632 | |||
90eafe59a6 | |||
a055d3d373 | |||
267db7cc2b | |||
5043a40c51 | |||
0a74f09273 | |||
767795b91e | |||
8089d42eda | |||
6b9c8ac1ea | |||
3c037270a6 | |||
6ac682cc5b | |||
e378c45be7 | |||
66da3375ba | |||
1df654c6a1 | |||
388915e6f8 | |||
4d8a927ff7 | |||
b8721e0123 | |||
59880371e1 | |||
6c73a7d8d1 | |||
4232d68c92 | |||
17faf3af1f | |||
1c3a871831 | |||
a313c5b95b | |||
b23eba293d | |||
08682ab378 | |||
39cb15cc56 | |||
c5d7417f8e | |||
4c202dadb0 | |||
78dc3ffd39 | |||
1d3dd15e61 | |||
02446ac5f1 | |||
2601879c0b | |||
313e0603e9 | |||
1d145d6c79 | |||
213b0e65dc | |||
079a3e8bcd | |||
3010241fbd | |||
f3ea36c5d7 | |||
55dfbefb40 | |||
1aee2c6f81 | |||
226c7300be | |||
f2af6ad1e6 | |||
02d60ded5d | |||
3d0e25a8ef | |||
baef3362ed | |||
8903bc7f04 | |||
fe2e3a1468 | |||
3cbcebae56 | |||
0fe010f4f0 | |||
cd6e51271c | |||
711ad7b3dc | |||
7ed66f0b38 | |||
3c67dcd326 | |||
8d0b5360c2 | |||
44c5265757 | |||
3297cf2e9b | |||
b040f4474b | |||
5094bba5e9 | |||
e0e4f5cb34 | |||
c0d73ce572 | |||
7d3d04b13d | |||
88e199ff10 | |||
ec3ade999a | |||
57e93ef281 | |||
6122364a24 | |||
ff1be08b8a | |||
a66d04d26f | |||
d20e9527f7 | |||
5c72931b94 | |||
276886022e | |||
8df987cf95 | |||
de30d647d4 | |||
7f70805e63 | |||
1822261046 | |||
2a622424a0 | |||
37a5a38be5 | |||
580b20e720 | |||
9a4f15e4ad | |||
dd5c75888a | |||
e8ec0ad5bf | |||
961b92db2c | |||
af6349454d | |||
32b07e4c0c | |||
e73b3bbbb7 | |||
fbb7c0bb92 | |||
04c43f8589 | |||
9d733d7a6b | |||
30ddeda877 | |||
72e5e9885f | |||
5c6b34b1d8 | |||
7a627f75cf | |||
02cb4b94f5 | |||
0b5c02f678 | |||
ec5f9ec5ca | |||
551d51ea42 | |||
560cd184cc | |||
14297c8408 | |||
385fa07884 | |||
35fdb8aa6e | |||
34c6a1d4be | |||
745c595fc8 | |||
e979252742 | |||
90b7dc2b9c | |||
66bed5a1ab | |||
8575c9a637 | |||
e73acf4fe4 | |||
2f37ab7ede | |||
b1dd324354 | |||
5f00f09314 | |||
f06796c275 | |||
e15c151167 | |||
0b2eae8e0a | |||
4fff936626 | |||
e2c9dbaa62 | |||
b2f3a52884 | |||
a720b62aaa | |||
71e6ce30a3 | |||
4ee0573203 | |||
68354f8964 | |||
d0b37726d5 | |||
51e8519d96 | |||
c6d2516df8 | |||
813bc1a212 | |||
aa3c8fa377 | |||
8cb5ad18f5 | |||
b34179e997 | |||
91aacb1036 | |||
2134a7e36d | |||
6da1dc3e4a | |||
b33a53d258 | |||
bec1e418e7 | |||
5c6db6d743 | |||
ac25c5fc60 | |||
1e36d0ca39 | |||
945900605d | |||
3b6d22d3bf | |||
b254f14285 | |||
38e89f11f4 | |||
f4960433bc | |||
ebe778d0ee | |||
36ad12b6b3 | |||
0c022b1543 | |||
4e9de62da6 | |||
727c798892 | |||
d9b768e2cf | |||
c1d75857f3 | |||
6d91af30b8 | |||
a1d36ff75d | |||
9a3e53478e | |||
7703c36a90 | |||
a3d048880f | |||
53f8d12237 | |||
54fb9fbfef | |||
5a80d24780 | |||
b8bbe4ae8f | |||
da13f4797d | |||
6d35912c67 | |||
02be09dd00 | |||
93cd6dbed5 | |||
8c8ccc51c4 | |||
c7982c2bc3 | |||
4015655141 | |||
980ccfddf5 | |||
891be11032 | |||
269a0e4305 | |||
9fb04f552c | |||
19101470fd | |||
fb8a883eec | |||
8d714dd84e | |||
c6c958db2d | |||
185070a9ad | |||
a86c892af2 | |||
5464977fb7 | |||
f5fc9d026f | |||
d5cb120ab4 | |||
7cbe114cf0 | |||
84771f11a7 | |||
8b35ce2145 | |||
9d3ea5513b | |||
94219ae71a | |||
f4130105b0 | |||
e4d11b321d | |||
c53f54fe20 | |||
c95e1d8ae3 | |||
4ee81cd1ca | |||
9a98b20d1b | |||
ff9bce89f2 | |||
2d9e405b18 | |||
4a74dce0cd | |||
473699e7c8 |
192
amxmodx/CCmd.cpp
192
amxmodx/CCmd.cpp
@ -35,8 +35,10 @@
|
|||||||
// *****************************************************
|
// *****************************************************
|
||||||
// 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;
|
||||||
@ -49,13 +51,12 @@ 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.assign(szCmd);
|
command.assign(szCmd);
|
||||||
argument.assign(szArg);
|
argument.assign(szArg);
|
||||||
plugin = pplugin;
|
plugin = pplugin;
|
||||||
@ -73,95 +74,88 @@ 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 ) &&
|
++buf_num;
|
||||||
(*a).getPlugin()->isExecutable( (*a).getFunction() )
|
|
||||||
&& (*a).isViewable() )
|
|
||||||
++buf_num;
|
|
||||||
++a;
|
++a;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
@ -169,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_ClientCommand: cmdtype |= 1; break;
|
case CMD_ConsoleCommand: cmdtype |= 3; break;
|
||||||
case CMD_ServerCommand: cmdtype |= 2; break;
|
case CMD_ClientCommand: cmdtype |= 1; 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 2: return "server";
|
{
|
||||||
case 3: return "console";
|
case 1: return "client";
|
||||||
|
case 2: return "server";
|
||||||
|
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.c_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;
|
||||||
@ -264,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;
|
||||||
|
@ -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() { return command.c_str(); }
|
||||||
inline const char* getArgument() { return argument.c_str(); }
|
inline const char* getArgument() { return argument.c_str(); }
|
||||||
inline const char* getCmdInfo() { return info.c_str(); }
|
inline const char* getCmdInfo() { return info.c_str(); }
|
||||||
inline const char* getCmdLine() { return commandline.c_str(); }
|
inline const char* getCmdLine() { return commandline.c_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.c_str() + prefix, cmd + prefix) && (argument.empty() || !stricmp(argument.c_str(), arg))); }
|
||||||
inline bool matchCommand(const char* cmd) { return (!strcmp(command.c_str(), cmd )); }
|
inline bool matchCommand(const char* cmd) { return (!strcmp(command.c_str(), cmd)); }
|
||||||
inline int getFunction() const { return function; }
|
inline int getFunction() const { return function; }
|
||||||
inline bool gotAccess(int f) const { return (!flags||((flags & f)==flags)); }
|
inline bool gotAccess(int f) const { return (!flags || ((flags & f) == flags)); }
|
||||||
inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
|
inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
|
||||||
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
|
||||||
|
{
|
||||||
String name;
|
String name;
|
||||||
CmdMngr* parent;
|
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
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
// class ClEvent
|
// class ClEvent
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
|
|
||||||
EventsMngr::ClEvent::ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags)
|
EventsMngr::ClEvent::ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags)
|
||||||
{
|
{
|
||||||
m_Plugin = plugin;
|
m_Plugin = plugin;
|
||||||
m_Func = func;
|
m_Func = func;
|
||||||
@ -45,13 +45,14 @@ EventsMngr::ClEvent::ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags)
|
|||||||
m_FlagAlive = true;
|
m_FlagAlive = true;
|
||||||
m_FlagDead = true;
|
m_FlagDead = true;
|
||||||
|
|
||||||
m_FlagWorld = (flags & 1) ? true : false; // flag a
|
m_FlagWorld = (flags & 1) ? true : false; // flag a
|
||||||
m_FlagPlayer = (flags & 2) ? true : false; // flag b
|
m_FlagPlayer = (flags & 2) ? true : false; // flag b
|
||||||
m_FlagOnce = (flags & 4) ? true : false; // flag c
|
m_FlagOnce = (flags & 4) ? true : false; // flag c
|
||||||
|
|
||||||
if (flags & 24)
|
if (flags & 24)
|
||||||
{
|
{
|
||||||
m_FlagAlive = (flags & 16) ? true : false; // flag e
|
m_FlagAlive = (flags & 16) ? true : false; // flag e
|
||||||
m_FlagDead = (flags & 8) ? true : false; // flag d
|
m_FlagDead = (flags & 8) ? true : false; // flag d
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Stamp = 0.0f;
|
m_Stamp = 0.0f;
|
||||||
@ -64,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,14 +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)
|
if (!tmp)
|
||||||
{
|
{
|
||||||
return; // :TODO: Error report !!
|
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;
|
||||||
@ -102,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));
|
||||||
@ -128,7 +135,6 @@ EventsMngr::~EventsMngr()
|
|||||||
clearEvents();
|
clearEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CPluginMngr::CPlugin * EventsMngr::ClEvent::getPlugin()
|
CPluginMngr::CPlugin * EventsMngr::ClEvent::getPlugin()
|
||||||
{
|
{
|
||||||
return m_Plugin;
|
return m_Plugin;
|
||||||
@ -170,7 +176,7 @@ void EventsMngr::ClEvent::registerFilter(char *filter)
|
|||||||
|
|
||||||
// rest of line
|
// rest of line
|
||||||
tmpCond->sValue.assign(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;
|
||||||
@ -178,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;
|
||||||
@ -194,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;
|
||||||
|
|
||||||
@ -216,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;
|
||||||
@ -230,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;
|
||||||
@ -247,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -257,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];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,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();
|
||||||
@ -284,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
|
||||||
}
|
}
|
||||||
@ -312,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();
|
||||||
@ -330,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
|
||||||
}
|
}
|
||||||
@ -374,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.c_str())) execute=true; break;
|
case '=': if (!strcmp(sz, condIter->sValue.c_str())) execute = true; break;
|
||||||
case '!': if (strcmp(sz, condIter->sValue.c_str())) execute=true; break;
|
case '!': if (strcmp(sz, condIter->sValue.c_str())) execute = true; break;
|
||||||
case '&': if (strstr(sz, condIter->sValue.c_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
|
||||||
}
|
}
|
||||||
@ -396,41 +411,22 @@ void EventsMngr::parseValue(const char *sz)
|
|||||||
|
|
||||||
void EventsMngr::executeEvents()
|
void EventsMngr::executeEvents()
|
||||||
{
|
{
|
||||||
int err;
|
|
||||||
|
|
||||||
if (!m_ParseFun)
|
if (!m_ParseFun)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLEEXEPTIONS
|
for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++iter)
|
||||||
try
|
|
||||||
{
|
{
|
||||||
#endif // #ifdef ENABLEEXEPTIONS
|
if ((*iter).m_Done)
|
||||||
for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++iter)
|
|
||||||
{
|
{
|
||||||
if ( (*iter).m_Done )
|
(*iter).m_Done = false;
|
||||||
{
|
continue;
|
||||||
(*iter).m_Done = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*iter).m_Stamp = (float)*m_Timer;
|
|
||||||
|
|
||||||
if ((err = amx_Exec((*iter).m_Plugin->getAMX(), NULL, (*iter).m_Func, 1, m_ParseVault ? m_ParseVault[0].iValue : 0)) != AMX_ERR_NONE)
|
|
||||||
{
|
|
||||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err,
|
|
||||||
(*iter).m_Plugin->getAMX()->curline, (*iter).m_Plugin->getName());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLEEXEPTIONS
|
(*iter).m_Stamp = (float)*m_Timer;
|
||||||
|
executeForwards((*iter).m_Func, m_ParseVault ? m_ParseVault[0].iValue : 0);
|
||||||
}
|
}
|
||||||
catch( ... )
|
|
||||||
{
|
|
||||||
AMXXLOG_Log( "[AMXX] fatal error at event execution");
|
|
||||||
}
|
|
||||||
#endif // #ifdef ENABLEEXEPTIONS
|
|
||||||
|
|
||||||
m_CurrentMsgType = -1;
|
m_CurrentMsgType = -1;
|
||||||
m_ParseFun = NULL;
|
m_ParseFun = NULL;
|
||||||
@ -443,53 +439,53 @@ int EventsMngr::getArgNum() const
|
|||||||
|
|
||||||
const char* EventsMngr::getArgString(int a) const
|
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) const
|
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;
|
||||||
case MSG_STRING:
|
case MSG_STRING:
|
||||||
return atoi(m_ParseVault[a].sValue);
|
return atoi(m_ParseVault[a].sValue);
|
||||||
default:
|
default:
|
||||||
return (int)m_ParseVault[a].fValue;
|
return (int)m_ParseVault[a].fValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float EventsMngr::getArgFloat(int a) const
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -499,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)
|
||||||
{
|
{
|
||||||
@ -517,25 +514,26 @@ 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()
|
int EventsMngr::getCurrentMsgType()
|
||||||
|
@ -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,
|
||||||
@ -67,7 +68,7 @@ public:
|
|||||||
|
|
||||||
class ClEvent
|
class ClEvent
|
||||||
{
|
{
|
||||||
friend class EventsMngr; // events manager may access our private members
|
friend class EventsMngr; // events manager may access our private members
|
||||||
|
|
||||||
int m_Func; // function to be executed
|
int m_Func; // function to be executed
|
||||||
CPluginMngr::CPlugin *m_Plugin; // the plugin this ClEvent class is assigned to
|
CPluginMngr::CPlugin *m_Plugin; // the plugin this ClEvent class is assigned to
|
||||||
@ -100,7 +101,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// constructors & destructors
|
// constructors & destructors
|
||||||
ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags);
|
ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags);
|
||||||
~ClEvent();
|
~ClEvent();
|
||||||
|
|
||||||
inline CPluginMngr::CPlugin* getPlugin();
|
inline CPluginMngr::CPlugin* getPlugin();
|
||||||
@ -116,21 +117,22 @@ 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
|
||||||
|
|
||||||
typedef CList<ClEvent> ClEventVec;
|
typedef CList<ClEvent> ClEventVec;
|
||||||
typedef ClEventVec::iterator ClEventVecIter;
|
typedef ClEventVec::iterator ClEventVecIter;
|
||||||
|
|
||||||
ClEventVec m_Events[MAX_AMX_REG_MSG];
|
ClEventVec m_Events[MAX_AMX_REG_MSG];
|
||||||
ClEventVec *m_ParseFun; // current Event vector
|
ClEventVec *m_ParseFun; // current Event vector
|
||||||
|
|
||||||
bool m_ParseNotDone;
|
bool m_ParseNotDone;
|
||||||
int m_ParsePos; // is 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;
|
int m_CurrentMsgType;
|
||||||
public:
|
public:
|
||||||
@ -140,20 +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() const; //{ return (parsePos+1); }
|
|
||||||
|
int getArgNum() const; //{ return (parsePos + 1); }
|
||||||
const char* getArgString(int a) const;
|
const char* getArgString(int a) const;
|
||||||
int getArgInteger(int a) const;
|
int getArgInteger(int a) const;
|
||||||
float getArgFloat(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();
|
int getCurrentMsgType();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // #ifdef __CEVENTS_H__
|
#endif //__CEVENTS_H__
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,91 +36,91 @@
|
|||||||
// *****************************************************
|
// *****************************************************
|
||||||
// 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.c_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.assign(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 )
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
while ( sz-- && (c = getc( (*this).fp)) && c != EOF && c != '\n' )
|
|
||||||
*buf++ = c;
|
|
||||||
*buf = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// trim 0x0a and 0x0d characters at the end
|
if (*this)
|
||||||
while (buf != origBuf)
|
{
|
||||||
{
|
int c;
|
||||||
if (*buf == 0x0a || *buf == 0x0d)
|
while (sz-- && (c = getc((*this).fp)) && c != EOF && c != '\n')
|
||||||
|
*buf++ = c;
|
||||||
*buf = 0;
|
*buf = 0;
|
||||||
--buf;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return a - sz;
|
// trim 0x0a and 0x0d characters at the end
|
||||||
|
while (buf != origBuf)
|
||||||
|
{
|
||||||
|
if (*buf == 0x0a || *buf == 0x0d)
|
||||||
|
*buf = 0;
|
||||||
|
--buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,17 +30,21 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
|
#include "debugger.h"
|
||||||
|
|
||||||
CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes)
|
CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes)
|
||||||
{
|
{
|
||||||
m_FuncName = name;
|
m_FuncName = name;
|
||||||
m_ExecType = et;
|
m_ExecType = et;
|
||||||
m_NumParams = numParams;
|
m_NumParams = numParams;
|
||||||
|
|
||||||
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
||||||
|
|
||||||
// find funcs
|
// find funcs
|
||||||
int func;
|
int func;
|
||||||
AMXForward *tmp = NULL;
|
AMXForward *tmp = NULL;
|
||||||
m_Funcs.clear();
|
m_Funcs.clear();
|
||||||
|
|
||||||
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
|
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
|
||||||
{
|
{
|
||||||
if ((*iter).isValid() && amx_FindPublic((*iter).getAMX(), name, &func) == AMX_ERR_NONE)
|
if ((*iter).isValid() && amx_FindPublic((*iter).getAMX(), name, &func) == AMX_ERR_NONE)
|
||||||
@ -70,47 +74,74 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
|||||||
{
|
{
|
||||||
if (iter->pPlugin->isExecutable(iter->func))
|
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
|
// handle strings & arrays
|
||||||
int i;
|
int i, ax = 0;
|
||||||
|
|
||||||
for (i = 0; i < m_NumParams; ++i)
|
for (i = 0; i < m_NumParams; ++i)
|
||||||
{
|
{
|
||||||
if (m_ParamTypes[i] == FP_STRING || m_ParamTypes[i] == FP_STRINGEX)
|
if (m_ParamTypes[i] == FP_STRING || m_ParamTypes[i] == FP_STRINGEX)
|
||||||
{
|
{
|
||||||
cell *tmp;
|
cell *tmp;
|
||||||
amx_Allot(iter->pPlugin->getAMX(),
|
amx_Allot(iter->pPlugin->getAMX(), (m_ParamTypes[i] == FP_STRING) ? strlen(reinterpret_cast<const char*>(params[i])) + 1 : STRINGEX_MAXLENGTH, &realParams[i], &tmp);
|
||||||
(m_ParamTypes[i] == FP_STRING) ? strlen(reinterpret_cast<const char*>(params[i]))+1 : STRINGEX_MAXLENGTH,
|
amx_SetStringOld(tmp, (const char *)(params[i]), 0, 0);
|
||||||
&realParams[i], &tmp);
|
|
||||||
amx_SetString(tmp, (const char *)(params[i]), 0, 0);
|
|
||||||
physAddrs[i] = tmp;
|
physAddrs[i] = tmp;
|
||||||
}
|
}
|
||||||
else if (m_ParamTypes[i] == FP_ARRAY)
|
else if (m_ParamTypes[i] == FP_ARRAY)
|
||||||
{
|
{
|
||||||
cell *tmp;
|
cell *tmp;
|
||||||
amx_Allot(iter->pPlugin->getAMX(), preparedArrays[params[i]].size,
|
amx_Allot(amx, preparedArrays[params[i]].size, &realParams[i], &tmp);
|
||||||
&realParams[i], &tmp);
|
|
||||||
physAddrs[i] = tmp;
|
physAddrs[i] = tmp;
|
||||||
|
|
||||||
if (preparedArrays[params[i]].type == Type_Cell)
|
if (preparedArrays[params[i]].type == Type_Cell)
|
||||||
{
|
{
|
||||||
memcpy(tmp, preparedArrays[params[i]].ptr, preparedArrays[params[i]].size * sizeof(cell));
|
memcpy(tmp, preparedArrays[params[i]].ptr, preparedArrays[params[i]].size * sizeof(cell));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
char *data = (char*)preparedArrays[params[i]].ptr;
|
char *data = (char*)preparedArrays[params[i]].ptr;
|
||||||
|
|
||||||
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
|
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
|
||||||
*tmp++ = (static_cast<cell>(*data++)) & 0xFF;
|
*tmp++ = (static_cast<cell>(*data++)) & 0xFF;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
realParams[i] = params[i];
|
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
|
// exec
|
||||||
cell retVal;
|
cell retVal;
|
||||||
int err = amx_Execv(iter->pPlugin->getAMX(), &retVal, iter->func, m_NumParams, realParams);
|
int err = amx_Exec(amx, &retVal, iter->func);
|
||||||
|
|
||||||
// log runtime error, if any
|
// log runtime error, if any
|
||||||
if (err != AMX_ERR_NONE)
|
if (err != AMX_ERR_NONE)
|
||||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err, iter->pPlugin->getAMX()->curline, iter->pPlugin->getName());
|
{
|
||||||
|
//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
|
// cleanup strings & arrays
|
||||||
for (i = 0; i < m_NumParams; ++i)
|
for (i = 0; i < m_NumParams; ++i)
|
||||||
@ -122,22 +153,24 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
|||||||
else if (m_ParamTypes[i] == FP_STRINGEX)
|
else if (m_ParamTypes[i] == FP_STRINGEX)
|
||||||
{
|
{
|
||||||
// copy back
|
// copy back
|
||||||
amx_GetString(reinterpret_cast<char*>(params[i]), physAddrs[i], 0);
|
amx_GetStringOld(reinterpret_cast<char*>(params[i]), physAddrs[i], 0);
|
||||||
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
|
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
|
||||||
}
|
}
|
||||||
else if (m_ParamTypes[i] == FP_ARRAY)
|
else if (m_ParamTypes[i] == FP_ARRAY)
|
||||||
{
|
{
|
||||||
// copy back
|
// copy back
|
||||||
cell *tmp = physAddrs[i];
|
if (preparedArrays[params[i]].copyBack)
|
||||||
if (preparedArrays[params[i]].type == Type_Cell)
|
|
||||||
{
|
{
|
||||||
memcpy(preparedArrays[params[i]].ptr, tmp, preparedArrays[params[i]].size * sizeof(cell));
|
cell *tmp = physAddrs[i];
|
||||||
}
|
if (preparedArrays[params[i]].type == Type_Cell)
|
||||||
else
|
{
|
||||||
{
|
memcpy(preparedArrays[params[i]].ptr, tmp, preparedArrays[params[i]].size * sizeof(cell));
|
||||||
char *data = (char*)preparedArrays[params[i]].ptr;
|
} else {
|
||||||
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
|
char *data = (char*)preparedArrays[params[i]].ptr;
|
||||||
*data++ = static_cast<char>(*tmp++ & 0xFF);
|
|
||||||
|
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
|
||||||
|
*data++ = static_cast<char>(*tmp++ & 0xFF);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
|
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
|
||||||
}
|
}
|
||||||
@ -146,24 +179,25 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
|||||||
// decide what to do (based on exectype and retval)
|
// decide what to do (based on exectype and retval)
|
||||||
switch (m_ExecType)
|
switch (m_ExecType)
|
||||||
{
|
{
|
||||||
case ET_IGNORE:
|
case ET_IGNORE:
|
||||||
break;
|
break;
|
||||||
case ET_STOP:
|
case ET_STOP:
|
||||||
if (retVal > 0)
|
if (retVal > 0)
|
||||||
return retVal;
|
return retVal;
|
||||||
case ET_STOP2:
|
case ET_STOP2:
|
||||||
if (retVal == 1)
|
if (retVal == 1)
|
||||||
return 1;
|
return 1;
|
||||||
else if (retVal > globRetVal)
|
else if (retVal > globRetVal)
|
||||||
globRetVal = retVal;
|
globRetVal = retVal;
|
||||||
break;
|
break;
|
||||||
case ET_CONTINUE:
|
case ET_CONTINUE:
|
||||||
if (retVal > globRetVal)
|
if (retVal > globRetVal)
|
||||||
globRetVal = retVal;
|
globRetVal = retVal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return globRetVal;
|
return globRetVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,6 +208,7 @@ void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *para
|
|||||||
m_NumParams = numParams;
|
m_NumParams = numParams;
|
||||||
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
||||||
m_HasFunc = true;
|
m_HasFunc = true;
|
||||||
|
isFree = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
||||||
@ -182,10 +217,14 @@ void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const Forwar
|
|||||||
m_NumParams = numParams;
|
m_NumParams = numParams;
|
||||||
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
||||||
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
|
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
|
||||||
|
isFree = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||||
{
|
{
|
||||||
|
if (isFree)
|
||||||
|
return 0;
|
||||||
|
|
||||||
const int STRINGEX_MAXLENGTH = 128;
|
const int STRINGEX_MAXLENGTH = 128;
|
||||||
|
|
||||||
cell realParams[FORWARD_MAX_PARAMS];
|
cell realParams[FORWARD_MAX_PARAMS];
|
||||||
@ -198,45 +237,67 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
|||||||
if (!pPlugin->isExecutable(m_Func))
|
if (!pPlugin->isExecutable(m_Func))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
Debugger *pDebugger = (Debugger *)m_Amx->userdata[UD_DEBUGGER];
|
||||||
|
if (pDebugger)
|
||||||
|
pDebugger->BeginExec();
|
||||||
|
|
||||||
// handle strings & arrays
|
// handle strings & arrays
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < m_NumParams; ++i)
|
for (i = 0; i < m_NumParams; ++i)
|
||||||
{
|
{
|
||||||
if (m_ParamTypes[i] == FP_STRING || m_ParamTypes[i] == FP_STRINGEX)
|
if (m_ParamTypes[i] == FP_STRING || m_ParamTypes[i] == FP_STRINGEX)
|
||||||
{
|
{
|
||||||
cell *tmp;
|
cell *tmp;
|
||||||
amx_Allot(m_Amx,
|
amx_Allot(m_Amx, (m_ParamTypes[i] == FP_STRING) ? strlen(reinterpret_cast<const char*>(params[i])) + 1 : STRINGEX_MAXLENGTH, &realParams[i], &tmp);
|
||||||
(m_ParamTypes[i] == FP_STRING) ? strlen(reinterpret_cast<const char*>(params[i]))+1 : STRINGEX_MAXLENGTH,
|
amx_SetStringOld(tmp, (const char *)(params[i]), 0, 0);
|
||||||
&realParams[i], &tmp);
|
|
||||||
amx_SetString(tmp, (const char *)(params[i]), 0, 0);
|
|
||||||
physAddrs[i] = tmp;
|
physAddrs[i] = tmp;
|
||||||
}
|
}
|
||||||
else if (m_ParamTypes[i] == FP_ARRAY)
|
else if (m_ParamTypes[i] == FP_ARRAY)
|
||||||
{
|
{
|
||||||
cell *tmp;
|
cell *tmp;
|
||||||
amx_Allot(m_Amx, preparedArrays[params[i]].size,
|
amx_Allot(m_Amx, preparedArrays[params[i]].size, &realParams[i], &tmp);
|
||||||
&realParams[i], &tmp);
|
|
||||||
physAddrs[i] = tmp;
|
physAddrs[i] = tmp;
|
||||||
|
|
||||||
if (preparedArrays[params[i]].type == Type_Cell)
|
if (preparedArrays[params[i]].type == Type_Cell)
|
||||||
{
|
{
|
||||||
memcpy(tmp, preparedArrays[params[i]].ptr, preparedArrays[params[i]].size * sizeof(cell));
|
memcpy(tmp, preparedArrays[params[i]].ptr, preparedArrays[params[i]].size * sizeof(cell));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
char *data = (char*)preparedArrays[params[i]].ptr;
|
char *data = (char*)preparedArrays[params[i]].ptr;
|
||||||
|
|
||||||
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
|
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
|
||||||
*tmp++ = (static_cast<cell>(*data++)) & 0xFF;
|
*tmp++ = (static_cast<cell>(*data++)) & 0xFF;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
realParams[i] = params[i];
|
realParams[i] = params[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = m_NumParams - 1; i >= 0; i--)
|
||||||
|
amx_Push(m_Amx, realParams[i]);
|
||||||
|
|
||||||
// exec
|
// exec
|
||||||
cell retVal;
|
cell retVal;
|
||||||
amx_Execv(m_Amx, &retVal, m_Func, m_NumParams, realParams);
|
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
|
// cleanup strings & arrays
|
||||||
for (i = 0; i < m_NumParams; ++i)
|
for (i = 0; i < m_NumParams; ++i)
|
||||||
@ -248,22 +309,24 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
|||||||
else if (m_ParamTypes[i] == FP_STRINGEX)
|
else if (m_ParamTypes[i] == FP_STRINGEX)
|
||||||
{
|
{
|
||||||
// copy back
|
// copy back
|
||||||
amx_GetString(reinterpret_cast<char*>(params[i]), physAddrs[i], 0);
|
amx_GetStringOld(reinterpret_cast<char*>(params[i]), physAddrs[i], 0);
|
||||||
amx_Release(m_Amx, realParams[i]);
|
amx_Release(m_Amx, realParams[i]);
|
||||||
}
|
}
|
||||||
else if (m_ParamTypes[i] == FP_ARRAY)
|
else if (m_ParamTypes[i] == FP_ARRAY)
|
||||||
{
|
{
|
||||||
// copy back
|
// copy back
|
||||||
cell *tmp = physAddrs[i];
|
if (preparedArrays[params[i]].copyBack)
|
||||||
if (preparedArrays[params[i]].type == Type_Cell)
|
|
||||||
{
|
{
|
||||||
memcpy(preparedArrays[params[i]].ptr, tmp, preparedArrays[params[i]].size * sizeof(cell));
|
cell *tmp = physAddrs[i];
|
||||||
}
|
if (preparedArrays[params[i]].type == Type_Cell)
|
||||||
else
|
{
|
||||||
{
|
memcpy(preparedArrays[params[i]].ptr, tmp, preparedArrays[params[i]].size * sizeof(cell));
|
||||||
char *data = (char*)preparedArrays[params[i]].ptr;
|
} else {
|
||||||
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
|
char *data = (char*)preparedArrays[params[i]].ptr;
|
||||||
*data++ = static_cast<char>(*tmp++ & 0xFF);
|
|
||||||
|
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
|
||||||
|
*data++ = static_cast<char>(*tmp++ & 0xFF);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
amx_Release(m_Amx, realParams[i]);
|
amx_Release(m_Amx, realParams[i]);
|
||||||
}
|
}
|
||||||
@ -276,30 +339,48 @@ int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int
|
|||||||
{
|
{
|
||||||
int retVal = m_Forwards.size() << 1;
|
int retVal = m_Forwards.size() << 1;
|
||||||
CForward *tmp = new CForward(funcName, et, numParams, paramTypes);
|
CForward *tmp = new CForward(funcName, et, numParams, paramTypes);
|
||||||
|
|
||||||
if (!tmp)
|
if (!tmp)
|
||||||
return -1; // should be invalid
|
return -1; // should be invalid
|
||||||
|
|
||||||
m_Forwards.push_back(tmp);
|
m_Forwards.push_back(tmp);
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CForwardMngr::registerSPForward(int func, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
int CForwardMngr::registerSPForward(int func, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
||||||
{
|
{
|
||||||
int retVal = (m_SPForwards.size() << 1) | 1;
|
int retVal = -1;
|
||||||
CSPForward *pForward;
|
CSPForward *pForward;
|
||||||
if (m_FreeSPForwards.size())
|
|
||||||
{
|
if (!m_FreeSPForwards.empty())
|
||||||
pForward = m_SPForwards[m_FreeSPForwards.back()];
|
|
||||||
m_FreeSPForwards.pop_back();
|
|
||||||
pForward->Set(func, amx, numParams, paramTypes);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
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();
|
pForward = new CSPForward();
|
||||||
|
|
||||||
if (!pForward)
|
if (!pForward)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pForward->Set(func, amx, numParams, paramTypes);
|
pForward->Set(func, amx, numParams, paramTypes);
|
||||||
|
|
||||||
|
if (pForward->getFuncsNum() == 0)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
delete pForward;
|
||||||
|
}
|
||||||
|
|
||||||
m_SPForwards.push_back(pForward);
|
m_SPForwards.push_back(pForward);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,42 +388,58 @@ int CForwardMngr::registerSPForward(const char *funcName, AMX *amx, int numParam
|
|||||||
{
|
{
|
||||||
int retVal = (m_SPForwards.size() << 1) | 1;
|
int retVal = (m_SPForwards.size() << 1) | 1;
|
||||||
CSPForward *pForward;
|
CSPForward *pForward;
|
||||||
if (m_FreeSPForwards.size())
|
|
||||||
{
|
if (!m_FreeSPForwards.empty())
|
||||||
pForward = m_SPForwards[m_FreeSPForwards.back()];
|
|
||||||
m_FreeSPForwards.pop_back();
|
|
||||||
pForward->Set(funcName, amx, numParams, paramTypes);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
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();
|
pForward = new CSPForward();
|
||||||
|
|
||||||
if (!pForward)
|
if (!pForward)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pForward->Set(funcName, amx, numParams, paramTypes);
|
pForward->Set(funcName, amx, numParams, paramTypes);
|
||||||
|
|
||||||
|
if (pForward->getFuncsNum() == 0)
|
||||||
|
{
|
||||||
|
delete pForward;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
m_SPForwards.push_back(pForward);
|
m_SPForwards.push_back(pForward);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CForwardMngr::isIdValid(int id) const
|
bool CForwardMngr::isIdValid(int id) const
|
||||||
{
|
{
|
||||||
return (id >= 0) && ((id & 1) ?
|
return (id >= 0) && ((id & 1) ? (static_cast<size_t>(id >> 1) < m_SPForwards.size()) : (static_cast<size_t>(id >> 1) < m_Forwards.size()));
|
||||||
(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)
|
cell CForwardMngr::executeForwards(int id, cell *params)
|
||||||
{
|
{
|
||||||
int retVal = (id & 1) ? m_SPForwards[id >> 1]->execute(params, m_TmpArrays) :
|
int retVal = (id & 1) ? m_SPForwards[id >> 1]->execute(params, m_TmpArrays) : m_Forwards[id >> 1]->execute(params, m_TmpArrays);
|
||||||
m_Forwards[id >> 1]->execute(params, m_TmpArrays);
|
|
||||||
m_TmpArraysNum = 0;
|
m_TmpArraysNum = 0;
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CForwardMngr::getParamsNum(int id) const
|
int CForwardMngr::getParamsNum(int id) const
|
||||||
{
|
{
|
||||||
return (id & 1) ? m_SPForwards[id >> 1]->getParamsNum() :
|
return (id & 1) ? m_SPForwards[id >> 1]->getParamsNum() : m_Forwards[id >> 1]->getParamsNum();
|
||||||
m_Forwards[id >> 1]->getParamsNum();
|
}
|
||||||
|
|
||||||
|
ForwardParam CForwardMngr::getParamType(int id, int paramNum) const
|
||||||
|
{
|
||||||
|
return (id & 1) ? m_SPForwards[id >> 1]->getParamType(paramNum) : m_Forwards[id >> 1]->getParamType(paramNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CForwardMngr::clear()
|
void CForwardMngr::clear()
|
||||||
@ -351,7 +448,9 @@ void CForwardMngr::clear()
|
|||||||
{
|
{
|
||||||
delete *iter;
|
delete *iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
SPForwardVec::iterator spIter;
|
SPForwardVec::iterator spIter;
|
||||||
|
|
||||||
for (spIter = m_SPForwards.begin(); spIter != m_SPForwards.end(); ++spIter)
|
for (spIter = m_SPForwards.begin(); spIter != m_SPForwards.end(); ++spIter)
|
||||||
{
|
{
|
||||||
delete (*spIter);
|
delete (*spIter);
|
||||||
@ -359,7 +458,10 @@ void CForwardMngr::clear()
|
|||||||
|
|
||||||
m_Forwards.clear();
|
m_Forwards.clear();
|
||||||
m_SPForwards.clear();
|
m_SPForwards.clear();
|
||||||
m_FreeSPForwards.clear();
|
|
||||||
|
while (!m_FreeSPForwards.empty())
|
||||||
|
m_FreeSPForwards.pop();
|
||||||
|
|
||||||
m_TmpArraysNum = 0;
|
m_TmpArraysNum = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,69 +472,98 @@ bool CForwardMngr::isSPForward(int id) const
|
|||||||
|
|
||||||
void CForwardMngr::unregisterSPForward(int id)
|
void CForwardMngr::unregisterSPForward(int id)
|
||||||
{
|
{
|
||||||
m_FreeSPForwards.push_back(id);
|
//make sure the id is valid
|
||||||
|
if (!isIdValid(id) || m_SPForwards.at(id >> 1)->isFree)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_SPForwards.at(id >> 1)->isFree = true;
|
||||||
|
m_FreeSPForwards.push(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
int registerForward(const char *funcName, ForwardExecType et, ...)
|
int registerForward(const char *funcName, ForwardExecType et, ...)
|
||||||
{
|
{
|
||||||
int curParam = 0;
|
int curParam = 0;
|
||||||
|
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
va_start(argptr, et);
|
va_start(argptr, et);
|
||||||
|
|
||||||
ForwardParam params[FORWARD_MAX_PARAMS];
|
ForwardParam params[FORWARD_MAX_PARAMS];
|
||||||
ForwardParam tmp;
|
ForwardParam tmp;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (curParam == FORWARD_MAX_PARAMS)
|
if (curParam == FORWARD_MAX_PARAMS)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
tmp = (ForwardParam)va_arg(argptr, int);
|
tmp = (ForwardParam)va_arg(argptr, int);
|
||||||
|
|
||||||
if (tmp == FP_DONE)
|
if (tmp == FP_DONE)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
params[curParam] = tmp;
|
params[curParam] = tmp;
|
||||||
++curParam;
|
++curParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
|
|
||||||
return g_forwards.registerForward(funcName, et, curParam, params);
|
return g_forwards.registerForward(funcName, et, curParam, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
int registerSPForwardByName(AMX *amx, const char *funcName, ...)
|
int registerSPForwardByName(AMX *amx, const char *funcName, ...)
|
||||||
{
|
{
|
||||||
int curParam = 0;
|
int curParam = 0;
|
||||||
|
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
va_start(argptr, funcName);
|
va_start(argptr, funcName);
|
||||||
|
|
||||||
ForwardParam params[FORWARD_MAX_PARAMS];
|
ForwardParam params[FORWARD_MAX_PARAMS];
|
||||||
ForwardParam tmp;
|
ForwardParam tmp;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (curParam == FORWARD_MAX_PARAMS)
|
if (curParam == FORWARD_MAX_PARAMS)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
tmp = (ForwardParam)va_arg(argptr, int);
|
tmp = (ForwardParam)va_arg(argptr, int);
|
||||||
|
|
||||||
if (tmp == FP_DONE)
|
if (tmp == FP_DONE)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
params[curParam] = tmp;
|
params[curParam] = tmp;
|
||||||
++curParam;
|
++curParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
|
|
||||||
return g_forwards.registerSPForward(funcName, amx, curParam, params);
|
return g_forwards.registerSPForward(funcName, amx, curParam, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
int registerSPForward(AMX *amx, int func, ...)
|
int registerSPForward(AMX *amx, int func, ...)
|
||||||
{
|
{
|
||||||
int curParam = 0;
|
int curParam = 0;
|
||||||
|
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
va_start(argptr, func);
|
va_start(argptr, func);
|
||||||
|
|
||||||
ForwardParam params[FORWARD_MAX_PARAMS];
|
ForwardParam params[FORWARD_MAX_PARAMS];
|
||||||
ForwardParam tmp;
|
ForwardParam tmp;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (curParam == FORWARD_MAX_PARAMS)
|
if (curParam == FORWARD_MAX_PARAMS)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
tmp = (ForwardParam)va_arg(argptr, int);
|
tmp = (ForwardParam)va_arg(argptr, int);
|
||||||
|
|
||||||
if (tmp == FP_DONE)
|
if (tmp == FP_DONE)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
params[curParam] = tmp;
|
params[curParam] = tmp;
|
||||||
++curParam;
|
++curParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
|
|
||||||
return g_forwards.registerSPForward(func, amx, curParam, params);
|
return g_forwards.registerSPForward(func, amx, curParam, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,38 +573,58 @@ cell executeForwards(int id, ...)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
cell params[FORWARD_MAX_PARAMS];
|
cell params[FORWARD_MAX_PARAMS];
|
||||||
|
|
||||||
int paramsNum = g_forwards.getParamsNum(id);
|
int paramsNum = g_forwards.getParamsNum(id);
|
||||||
|
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
va_start(argptr, id);
|
va_start(argptr, id);
|
||||||
|
|
||||||
for (int i = 0; i < paramsNum && i < FORWARD_MAX_PARAMS; ++i)
|
for (int i = 0; i < paramsNum && i < FORWARD_MAX_PARAMS; ++i)
|
||||||
{
|
{
|
||||||
if (params[i] == FP_FLOAT)
|
if (g_forwards.getParamType(id, i) == FP_FLOAT)
|
||||||
{
|
{
|
||||||
REAL tmp = (REAL)va_arg(argptr, double); // floats get converted to doubles
|
REAL tmp = (REAL)va_arg(argptr, double); // floats get converted to doubles
|
||||||
params[i] = *(cell*)&tmp;
|
params[i] = *(cell*)&tmp;
|
||||||
}
|
}
|
||||||
params[i] = (cell)va_arg(argptr, cell);
|
else
|
||||||
|
params[i] = (cell)va_arg(argptr, cell);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
|
|
||||||
return g_forwards.executeForwards(id, params);
|
return g_forwards.executeForwards(id, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
cell CForwardMngr::prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type)
|
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].ptr = ptr;
|
||||||
m_TmpArrays[m_TmpArraysNum].size = size;
|
m_TmpArrays[m_TmpArraysNum].size = size;
|
||||||
m_TmpArrays[m_TmpArraysNum].type = type;
|
m_TmpArrays[m_TmpArraysNum].type = type;
|
||||||
|
m_TmpArrays[m_TmpArraysNum].copyBack = copyBack;
|
||||||
|
|
||||||
return m_TmpArraysNum++;
|
return m_TmpArraysNum++;
|
||||||
}
|
}
|
||||||
|
|
||||||
cell prepareCellArray(cell *ptr, unsigned int size)
|
cell prepareCellArray(cell *ptr, unsigned int size, bool copyBack)
|
||||||
{
|
{
|
||||||
return g_forwards.prepareArray((void*)ptr, size, Type_Cell);
|
return g_forwards.prepareArray((void*)ptr, size, Type_Cell, copyBack);
|
||||||
}
|
}
|
||||||
|
|
||||||
cell prepareCharArray(char *ptr, unsigned int size)
|
cell prepareCharArray(char *ptr, unsigned int size, bool copyBack)
|
||||||
{
|
{
|
||||||
return g_forwards.prepareArray((void*)ptr, size, Type_Char);
|
return g_forwards.prepareArray((void*)ptr, size, Type_Char, copyBack);
|
||||||
}
|
}
|
||||||
|
|
||||||
void unregisterSPForward(int id)
|
void unregisterSPForward(int id)
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
#ifndef FORWARD_H
|
#ifndef FORWARD_H
|
||||||
#define FORWARD_H
|
#define FORWARD_H
|
||||||
|
|
||||||
const int FORWARD_MAX_PARAMS = 16;
|
const int FORWARD_MAX_PARAMS = 32;
|
||||||
|
|
||||||
enum ForwardExecType
|
enum ForwardExecType
|
||||||
{
|
{
|
||||||
@ -77,8 +77,11 @@ enum ForwardArrayElemType
|
|||||||
struct ForwardPreparedArray
|
struct ForwardPreparedArray
|
||||||
{
|
{
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
ForwardArrayElemType type;
|
ForwardArrayElemType type;
|
||||||
|
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
|
bool copyBack;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Normal forward
|
// Normal forward
|
||||||
@ -87,27 +90,41 @@ class CForward
|
|||||||
const char *m_FuncName;
|
const char *m_FuncName;
|
||||||
ForwardExecType m_ExecType;
|
ForwardExecType m_ExecType;
|
||||||
int m_NumParams;
|
int m_NumParams;
|
||||||
|
|
||||||
struct AMXForward
|
struct AMXForward
|
||||||
{
|
{
|
||||||
CPluginMngr::CPlugin *pPlugin;
|
CPluginMngr::CPlugin *pPlugin;
|
||||||
int func;
|
int func;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef CVector<AMXForward> AMXForwardList;
|
typedef CVector<AMXForward> AMXForwardList;
|
||||||
|
|
||||||
AMXForwardList m_Funcs;
|
AMXForwardList m_Funcs;
|
||||||
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
|
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam * paramTypes);
|
CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam * paramTypes);
|
||||||
CForward()
|
CForward() {} // leaves everything unitialized'
|
||||||
{ } // leaves everything unitialized'
|
|
||||||
cell execute(cell *params, ForwardPreparedArray *preparedArrays);
|
cell execute(cell *params, ForwardPreparedArray *preparedArrays);
|
||||||
|
|
||||||
int getParamsNum() const
|
int getParamsNum() const
|
||||||
{
|
{
|
||||||
return m_NumParams;
|
return m_NumParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getFuncsNum() const
|
int getFuncsNum() const
|
||||||
{
|
{
|
||||||
return m_Funcs.size();
|
return m_Funcs.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ForwardParam getParamType(int paramId) const
|
||||||
|
{
|
||||||
|
if (paramId < 0 || paramId >= m_NumParams)
|
||||||
|
return FP_DONE;
|
||||||
|
|
||||||
|
return m_ParamTypes[paramId];
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Single plugin forward
|
// Single plugin forward
|
||||||
@ -115,45 +132,59 @@ class CSPForward
|
|||||||
{
|
{
|
||||||
const char *m_FuncName;
|
const char *m_FuncName;
|
||||||
int m_NumParams;
|
int m_NumParams;
|
||||||
|
|
||||||
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
|
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
|
||||||
AMX *m_Amx;
|
AMX *m_Amx;
|
||||||
|
|
||||||
int m_Func;
|
int m_Func;
|
||||||
bool m_HasFunc;
|
bool m_HasFunc;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool isFree;
|
||||||
public:
|
public:
|
||||||
CSPForward() { m_HasFunc = false; }
|
CSPForward() { m_HasFunc = false; }
|
||||||
void Set(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
|
void Set(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
|
||||||
void Set(int func, AMX *amx, int numParams, const ForwardParam * paramTypes);
|
void Set(int func, AMX *amx, int numParams, const ForwardParam * paramTypes);
|
||||||
|
|
||||||
cell execute(cell *params, ForwardPreparedArray *preparedArrays);
|
cell execute(cell *params, ForwardPreparedArray *preparedArrays);
|
||||||
|
|
||||||
int getParamsNum() const
|
int getParamsNum() const
|
||||||
{
|
{
|
||||||
return m_NumParams;
|
return m_NumParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getFuncsNum() const
|
int getFuncsNum() const
|
||||||
{
|
{
|
||||||
return (m_HasFunc) ? 1 : 0;
|
return (m_HasFunc) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ForwardParam getParamType(int paramId) const
|
||||||
|
{
|
||||||
|
if (paramId < 0 || paramId >= m_NumParams)
|
||||||
|
return FP_DONE;
|
||||||
|
|
||||||
|
return m_ParamTypes[paramId];
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CForwardMngr
|
class CForwardMngr
|
||||||
{
|
{
|
||||||
typedef CVector<CForward*> ForwardVec;
|
typedef CVector<CForward*> ForwardVec;
|
||||||
typedef CVector<CSPForward*> SPForwardVec;
|
typedef CVector<CSPForward*> SPForwardVec;
|
||||||
typedef CVector<int> FreeSPVec; // Free SP Forwards
|
typedef CQueue<int> FreeSPVec; // Free SP Forwards
|
||||||
|
|
||||||
ForwardVec m_Forwards;
|
ForwardVec m_Forwards;
|
||||||
|
|
||||||
SPForwardVec m_SPForwards;
|
SPForwardVec m_SPForwards;
|
||||||
FreeSPVec m_FreeSPForwards; // so we don't have to free memory
|
FreeSPVec m_FreeSPForwards; // so we don't have to free memory
|
||||||
|
|
||||||
ForwardPreparedArray m_TmpArrays[FORWARD_MAX_PARAMS]; // used by prepareArray
|
ForwardPreparedArray m_TmpArrays[FORWARD_MAX_PARAMS]; // used by prepareArray
|
||||||
int m_TmpArraysNum;
|
int m_TmpArraysNum;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
CForwardMngr()
|
CForwardMngr()
|
||||||
{ m_TmpArraysNum = 0; }
|
{ m_TmpArraysNum = 0; }
|
||||||
~CForwardMngr()
|
~CForwardMngr() {}
|
||||||
{ }
|
|
||||||
|
|
||||||
// Interface
|
// Interface
|
||||||
// Register normal forward
|
// Register normal forward
|
||||||
@ -161,16 +192,21 @@ public:
|
|||||||
// Register single plugin forward
|
// Register single plugin forward
|
||||||
int registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
|
int registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
|
||||||
int registerSPForward(int func, AMX *amx, int numParams, const ForwardParam * paramTypes);
|
int registerSPForward(int func, AMX *amx, int numParams, const ForwardParam * paramTypes);
|
||||||
|
|
||||||
// Unregister single plugin forward
|
// Unregister single plugin forward
|
||||||
void unregisterSPForward(int id);
|
void unregisterSPForward(int id);
|
||||||
|
|
||||||
// execute forward
|
// execute forward
|
||||||
cell executeForwards(int id, cell *params);
|
cell executeForwards(int id, cell *params);
|
||||||
void clear(); // delete all forwards
|
void clear(); // delete all forwards
|
||||||
|
|
||||||
bool isIdValid(int id) const; // check whether forward id is valid
|
bool isIdValid(int id) const; // check whether forward id is valid
|
||||||
bool isSPForward(int id) const; // check whether forward is single plugin
|
bool isSPForward(int id) const; // check whether forward is single plugin
|
||||||
int getParamsNum(int id) const; // get num of params of a forward
|
int getParamsNum(int id) const; // get num of params of a forward
|
||||||
int getFuncsNum(int id) const; // get num of found functions of a forward
|
int getFuncsNum(int id) const; // get num of found functions of a forward
|
||||||
cell prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type); // prepare array
|
|
||||||
|
ForwardParam getParamType(int id, int paramId) const;
|
||||||
|
cell prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type, bool copyBack); // prepare array
|
||||||
};
|
};
|
||||||
|
|
||||||
// (un)register forward
|
// (un)register forward
|
||||||
@ -182,8 +218,7 @@ void unregisterSPForward(int id);
|
|||||||
// execute forwards
|
// execute forwards
|
||||||
cell executeForwards(int id, ...);
|
cell executeForwards(int id, ...);
|
||||||
// prepare array
|
// prepare array
|
||||||
cell prepareCellArray(cell *ptr, unsigned int size);
|
cell prepareCellArray(cell *ptr, unsigned int size, bool copyBack = false);
|
||||||
cell prepareCharArray(char *ptr, unsigned int size);
|
cell prepareCharArray(char *ptr, unsigned int size, bool copyBack = false);
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
#endif //FORWARD_H
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -51,6 +51,7 @@ struct sKeyDef
|
|||||||
{
|
{
|
||||||
sKeyDef() { key = -1; def = 0; }
|
sKeyDef() { key = -1; def = 0; }
|
||||||
~sKeyDef() { if (def) delete def; }
|
~sKeyDef() { if (def) delete def; }
|
||||||
|
|
||||||
int key;
|
int key;
|
||||||
String *def;
|
String *def;
|
||||||
};
|
};
|
||||||
@ -77,8 +78,9 @@ class CLangMngr
|
|||||||
// compare this language to a language name
|
// compare this language to a language name
|
||||||
friend bool operator == (const CLang &left, const char *right)
|
friend bool operator == (const CLang &left, const char *right)
|
||||||
{
|
{
|
||||||
return strcmp(left.m_LanguageName, right)==0 ? true : false;
|
return strcmp(left.m_LanguageName, right) == 0 ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get language name
|
// Get language name
|
||||||
const char *GetName() { return m_LanguageName; }
|
const char *GetName() { return m_LanguageName; }
|
||||||
// Save to file
|
// Save to file
|
||||||
@ -91,8 +93,8 @@ class CLangMngr
|
|||||||
int Entries() { return m_LookUpTable.size(); }
|
int Entries() { return m_LookUpTable.size(); }
|
||||||
// Make a hash from a string; convert to lowercase first if needed
|
// Make a hash from a string; convert to lowercase first if needed
|
||||||
static uint32_t MakeHash(const char *src, bool makeLower = false);
|
static uint32_t MakeHash(const char *src, bool makeLower = false);
|
||||||
protected:
|
|
||||||
|
|
||||||
|
protected:
|
||||||
// An entry in the language
|
// An entry in the language
|
||||||
class LangEntry
|
class LangEntry
|
||||||
{
|
{
|
||||||
@ -145,7 +147,7 @@ class CLangMngr
|
|||||||
// Merge definitions into a language
|
// Merge definitions into a language
|
||||||
void MergeDefinitions(const char *lang, CQueue <sKeyDef*> &tmpVec);
|
void MergeDefinitions(const char *lang, CQueue <sKeyDef*> &tmpVec);
|
||||||
// strip lowercase; make lower if needed
|
// strip lowercase; make lower if needed
|
||||||
static size_t strip(char *str, char *newstr, bool makelower=false);
|
static size_t strip(char *str, char *newstr, bool makelower = false);
|
||||||
|
|
||||||
typedef CVector<CLang*> LangVec;
|
typedef CVector<CLang*> LangVec;
|
||||||
typedef CVector<CLang*>::iterator LangVecIter;
|
typedef CVector<CLang*>::iterator LangVecIter;
|
||||||
@ -171,6 +173,7 @@ public:
|
|||||||
const char *Format(const char *src, ...);
|
const char *Format(const char *src, ...);
|
||||||
// Format a string for an AMX plugin
|
// Format a string for an AMX plugin
|
||||||
char *FormatAmxString(AMX *amx, cell *params, int parm, int &len);
|
char *FormatAmxString(AMX *amx, cell *params, int parm, int &len);
|
||||||
|
char *FormatString(const char *fmt, va_list &ap);
|
||||||
// Save
|
// Save
|
||||||
bool Save(const char *filename);
|
bool Save(const char *filename);
|
||||||
// Load
|
// Load
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
// *****************************************************
|
// *****************************************************
|
||||||
// class CList
|
// class CList
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
|
|
||||||
// Linked list
|
// Linked list
|
||||||
template <typename T, typename F = char* >
|
template <typename T, typename F = char* >
|
||||||
class CList
|
class CList
|
||||||
@ -65,8 +66,10 @@ private:
|
|||||||
~CElement()
|
~CElement()
|
||||||
{
|
{
|
||||||
delete m_pObject;
|
delete m_pObject;
|
||||||
|
|
||||||
if (m_pNext)
|
if (m_pNext)
|
||||||
m_pNext->m_pPrev = m_pPrev;
|
m_pNext->m_pPrev = m_pPrev;
|
||||||
|
|
||||||
if (m_pPrev)
|
if (m_pPrev)
|
||||||
m_pPrev->m_pNext = m_pNext;
|
m_pPrev->m_pNext = m_pNext;
|
||||||
}
|
}
|
||||||
@ -102,15 +105,16 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// CList<T,F> class
|
// CList<T, F> class
|
||||||
CElement *m_pHead; // head of the linked list
|
CElement *m_pHead; // head of the linked list
|
||||||
CElement *m_pTail; // tail of the linked list
|
CElement *m_pTail; // tail of the linked list
|
||||||
public:
|
public:
|
||||||
// iterator class
|
// iterator class
|
||||||
class iterator
|
class iterator
|
||||||
{
|
{
|
||||||
friend class CList<T,F>;
|
friend class CList<T, F>;
|
||||||
CList<T,F> *m_pList; // The list that created this iterator
|
|
||||||
|
CList<T, F> *m_pList; // The list that created this iterator
|
||||||
CElement *m_CurPos; // Current position in the list
|
CElement *m_CurPos; // Current position in the list
|
||||||
public:
|
public:
|
||||||
iterator()
|
iterator()
|
||||||
@ -120,7 +124,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// constructor based on list, element
|
// constructor based on list, element
|
||||||
iterator(CList<T,F> *pList, CElement *startPos)
|
iterator(CList<T, F> *pList, CElement *startPos)
|
||||||
{
|
{
|
||||||
m_pList = pList;
|
m_pList = pList;
|
||||||
m_CurPos = startPos;
|
m_CurPos = startPos;
|
||||||
@ -147,7 +151,7 @@ public:
|
|||||||
// validity check operator
|
// validity check operator
|
||||||
inline operator bool () const
|
inline operator bool () const
|
||||||
{
|
{
|
||||||
return m_pList!=NULL && m_CurPos!=NULL && m_CurPos->GetObj()!=NULL;
|
return m_pList != NULL && m_CurPos != NULL && m_CurPos->GetObj() != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// pre increment operator
|
// pre increment operator
|
||||||
@ -162,6 +166,7 @@ public:
|
|||||||
{
|
{
|
||||||
iterator tmp(*this);
|
iterator tmp(*this);
|
||||||
m_CurPos = m_CurPos->next;
|
m_CurPos = m_CurPos->next;
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,18 +181,20 @@ public:
|
|||||||
{
|
{
|
||||||
return m_pList->remove(*this);
|
return m_pList->remove(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator put(T *obj)
|
iterator put(T *obj)
|
||||||
{
|
{
|
||||||
return m_pList->put(obj, *this);
|
return m_pList->put(obj, *this);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CList<T,F>()
|
CList<T, F>()
|
||||||
{
|
{
|
||||||
m_pHead = NULL;
|
m_pHead = NULL;
|
||||||
m_pTail = NULL;
|
m_pTail = NULL;
|
||||||
}
|
}
|
||||||
~CList<T,F>()
|
|
||||||
|
~CList<T, F>()
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
@ -198,12 +205,16 @@ public:
|
|||||||
iterator remove(iterator &where)
|
iterator remove(iterator &where)
|
||||||
{
|
{
|
||||||
iterator tmp(where.GetNext());
|
iterator tmp(where.GetNext());
|
||||||
|
|
||||||
if (where.m_CurPos == m_pHead)
|
if (where.m_CurPos == m_pHead)
|
||||||
m_pHead = where.m_CurPos->GetNext();
|
m_pHead = where.m_CurPos->GetNext();
|
||||||
|
|
||||||
if (where.m_CurPos == m_pTail)
|
if (where.m_CurPos == m_pTail)
|
||||||
m_pTail = where.m_CurPos->GetPrev();
|
m_pTail = where.m_CurPos->GetPrev();
|
||||||
|
|
||||||
delete where.m_CurPos;
|
delete where.m_CurPos;
|
||||||
where = tmp;
|
where = tmp;
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,36 +223,36 @@ public:
|
|||||||
iterator put_back(T *pObj)
|
iterator put_back(T *pObj)
|
||||||
{
|
{
|
||||||
CElement *pTmp = new CElement(pObj);
|
CElement *pTmp = new CElement(pObj);
|
||||||
|
|
||||||
if (!m_pHead)
|
if (!m_pHead)
|
||||||
{
|
{
|
||||||
m_pHead = pTmp;
|
m_pHead = pTmp;
|
||||||
m_pTail = pTmp;
|
m_pTail = pTmp;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
pTmp->SetNext(NULL);
|
pTmp->SetNext(NULL);
|
||||||
pTmp->SetPrev(m_pTail);
|
pTmp->SetPrev(m_pTail);
|
||||||
m_pTail->SetNext(pTmp);
|
m_pTail->SetNext(pTmp);
|
||||||
m_pTail = pTmp;
|
m_pTail = pTmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
return iterator(this, pTmp);
|
return iterator(this, pTmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator put_front(T *pObj)
|
iterator put_front(T *pObj)
|
||||||
{
|
{
|
||||||
CElement *pTmp = new CElement(pObj);
|
CElement *pTmp = new CElement(pObj);
|
||||||
|
|
||||||
if (!m_pHead)
|
if (!m_pHead)
|
||||||
{
|
{
|
||||||
m_pHead = pTmp;
|
m_pHead = pTmp;
|
||||||
m_pTail = pTmp;
|
m_pTail = pTmp;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
pTmp->SetNext(m_pHead);
|
pTmp->SetNext(m_pHead);
|
||||||
pTmp->SetPrev(NULL);
|
pTmp->SetPrev(NULL);
|
||||||
m_pHead->SetPrev(pTmp);
|
m_pHead->SetPrev(pTmp);
|
||||||
m_pHead = pTmp;
|
m_pHead = pTmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
return iterator(this, pTmp);
|
return iterator(this, pTmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -257,6 +268,7 @@ public:
|
|||||||
iterator put(T *pObj, iterator &where)
|
iterator put(T *pObj, iterator &where)
|
||||||
{
|
{
|
||||||
CElement *pTmp = new CElement(pObj);
|
CElement *pTmp = new CElement(pObj);
|
||||||
|
|
||||||
if (where.m_CurPos->GetNext())
|
if (where.m_CurPos->GetNext())
|
||||||
where.m_CurPos->GetNext()->SetPrev(pTmp);
|
where.m_CurPos->GetNext()->SetPrev(pTmp);
|
||||||
else // where = tail
|
else // where = tail
|
||||||
@ -266,6 +278,7 @@ public:
|
|||||||
pTmp->SetNext(where.m_CurPos->GetNext());
|
pTmp->SetNext(where.m_CurPos->GetNext());
|
||||||
|
|
||||||
where.m_CurPos->SetNext(pTmp);
|
where.m_CurPos->SetNext(pTmp);
|
||||||
|
|
||||||
return ++where;
|
return ++where;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,12 +296,13 @@ public:
|
|||||||
iterator find(iterator startOn, const F &desc)
|
iterator find(iterator startOn, const F &desc)
|
||||||
{
|
{
|
||||||
iterator iter = startOn;
|
iterator iter = startOn;
|
||||||
while(iter)
|
while (iter)
|
||||||
{
|
{
|
||||||
if (*iter == desc)
|
if (*iter == desc)
|
||||||
break;
|
break;
|
||||||
++iter;
|
++iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -300,14 +314,16 @@ public:
|
|||||||
int size()
|
int size()
|
||||||
{
|
{
|
||||||
iterator iter = begin();
|
iterator iter = begin();
|
||||||
int i=0;
|
int i = 0;
|
||||||
|
|
||||||
while (iter)
|
while (iter)
|
||||||
{
|
{
|
||||||
++i;
|
++i;
|
||||||
++iter;
|
++iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
|
#endif //CLIST_H
|
||||||
|
@ -35,217 +35,284 @@
|
|||||||
// *****************************************************
|
// *****************************************************
|
||||||
// class LogEventsMngr
|
// class LogEventsMngr
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
LogEventsMngr::LogEventsMngr() {
|
|
||||||
logCurrent = logCounter = 0;
|
LogEventsMngr::LogEventsMngr()
|
||||||
logcmplist = 0;
|
{
|
||||||
arelogevents = false;
|
logCurrent = logCounter = 0;
|
||||||
memset( logevents, 0, sizeof(logevents) );
|
logcmplist = 0;
|
||||||
|
arelogevents = false;
|
||||||
|
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 )
|
{
|
||||||
return result;
|
if (logid == parent->logCounter)
|
||||||
logid = parent->logCounter;
|
return result;
|
||||||
if ( in ) return result = strstr( string , text.c_str() ) ? 0 : 1;
|
|
||||||
return result = strcmp(string,text.c_str());
|
logid = parent->logCounter;
|
||||||
|
|
||||||
|
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=='&');
|
|
||||||
*filter++ = 0;
|
bool in = (*filter=='&');
|
||||||
int pos = atoi(temp);
|
*filter++ = 0;
|
||||||
if ( pos < 0 || pos >= MAX_LOGARGS) pos = 0;
|
int pos = atoi(temp);
|
||||||
|
|
||||||
|
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.c_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 int a;
|
register const char* b = logString;
|
||||||
while( *b && logArgc < MAX_LOGARGS ){
|
register int a;
|
||||||
a = 0;
|
|
||||||
if ( *b == '"' ) {
|
while (*b && logArgc < MAX_LOGARGS)
|
||||||
++b;
|
{
|
||||||
while ( *b && *b != '"' && a < 127 )
|
a = 0;
|
||||||
logArgs[logArgc][a++] = *b++;
|
|
||||||
logArgs[logArgc++][a] = 0;
|
if (*b == '"')
|
||||||
if ( *b) b+=2; // thanks to double terminator
|
{
|
||||||
}
|
++b;
|
||||||
else if ( *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; // thanks to double terminator
|
||||||
}
|
}
|
||||||
else {
|
else if (*b == '(')
|
||||||
while ( *b && *b != '(' && *b != '"' && a < 127 )
|
{
|
||||||
logArgs[logArgc][a++] = *b++;
|
++b;
|
||||||
if ( *b ) --a;
|
|
||||||
logArgs[logArgc++][a] = 0;
|
while (*b && *b != ')' && a < 127)
|
||||||
}
|
logArgs[logArgc][a++] = *b++;
|
||||||
}
|
|
||||||
|
logArgs[logArgc++][a] = 0;
|
||||||
|
if (*b) b+=2;
|
||||||
|
} else {
|
||||||
|
while (*b && *b != '(' && *b != '"' && a < 127)
|
||||||
|
logArgs[logArgc][a++] = *b++;
|
||||||
|
if (*b) --a;
|
||||||
|
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;
|
|
||||||
CLogEvent** d = &logevents[pos];
|
arelogevents = true;
|
||||||
while(*d) d = &(*d)->next;
|
CLogEvent** d = &logevents[pos];
|
||||||
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)
|
|
||||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")",
|
|
||||||
err,a->plugin->getAMX()->curline,a->plugin->getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ENABLEEXEPTIONS
|
|
||||||
}
|
}
|
||||||
catch( ... )
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogEventsMngr::clearLogEvents()
|
||||||
|
{
|
||||||
|
logCurrent = logCounter = 0;
|
||||||
|
arelogevents = false;
|
||||||
|
|
||||||
|
for (int i = 0; i < MAX_LOGARGS + 1; ++i)
|
||||||
|
{
|
||||||
|
CLogEvent **a = &logevents[i];
|
||||||
|
while (*a)
|
||||||
{
|
{
|
||||||
AMXXLOG_Log( "[AMXX] fatal error at log forward function execution");
|
CLogEvent* bb = (*a)->next;
|
||||||
|
delete *a;
|
||||||
|
*a = bb;
|
||||||
}
|
}
|
||||||
#endif
|
}
|
||||||
|
|
||||||
}
|
clearConditions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void LogEventsMngr::clearLogEvents(){
|
void LogEventsMngr::clearConditions()
|
||||||
logCurrent = logCounter = 0;
|
{
|
||||||
arelogevents = false;
|
while (logcmplist)
|
||||||
for(int i = 0; i < MAX_LOGARGS + 1; ++i){
|
{
|
||||||
CLogEvent **a = &logevents[i];
|
CLogCmp* a = logcmplist->next;
|
||||||
while(*a){
|
delete logcmplist;
|
||||||
CLogEvent* bb = (*a)->next;
|
logcmplist = a;
|
||||||
delete *a;
|
}
|
||||||
*a = bb;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
clearConditions();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LogEventsMngr::clearConditions() {
|
LogEventsMngr::CLogEvent::LogCond::~LogCond()
|
||||||
while (logcmplist){
|
{
|
||||||
CLogCmp* a = logcmplist->next;
|
while (list)
|
||||||
delete logcmplist;
|
{
|
||||||
logcmplist = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LogEventsMngr::CLogEvent::LogCond::~LogCond() {
|
|
||||||
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;
|
||||||
}
|
}
|
@ -40,126 +40,139 @@
|
|||||||
// 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;
|
||||||
int logCounter;
|
int logCounter;
|
||||||
int logCurrent;
|
int logCurrent;
|
||||||
bool arelogevents;
|
bool arelogevents;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
class CLogCmp;
|
class CLogCmp;
|
||||||
class iterator;
|
class iterator;
|
||||||
class CLogEvent;
|
class CLogEvent;
|
||||||
|
|
||||||
friend class CLogEvent;
|
|
||||||
friend class CLogCmp;
|
|
||||||
friend class iterator;
|
|
||||||
|
|
||||||
class CLogCmp
|
|
||||||
{
|
|
||||||
friend class LogEventsMngr;
|
|
||||||
friend class CLogEvent;
|
friend class CLogEvent;
|
||||||
LogEventsMngr* parent;
|
friend class CLogCmp;
|
||||||
String text;
|
|
||||||
int logid;
|
|
||||||
int pos;
|
|
||||||
int result;
|
|
||||||
bool in;
|
|
||||||
CLogCmp *next;
|
|
||||||
CLogCmp( const char* s, bool r, int p, CLogCmp *n, LogEventsMngr* mg ) : text(s) {
|
|
||||||
logid = result = 0;
|
|
||||||
pos = p;
|
|
||||||
parent = mg;
|
|
||||||
in = r;
|
|
||||||
next = n;
|
|
||||||
}
|
|
||||||
public:
|
|
||||||
|
|
||||||
int compareCondition(const char* string);
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
CLogCmp *logcmplist;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
class CLogEvent {
|
|
||||||
friend class LogEventsMngr;
|
|
||||||
friend class iterator;
|
friend class iterator;
|
||||||
struct LogCondEle {
|
|
||||||
CLogCmp *cmp;
|
class CLogCmp
|
||||||
LogCondEle *next;
|
{
|
||||||
LogCondEle(CLogCmp *c, LogCondEle *n): cmp(c) , next(n) { }
|
friend class LogEventsMngr;
|
||||||
|
friend class CLogEvent;
|
||||||
|
|
||||||
|
LogEventsMngr* parent;
|
||||||
|
String text;
|
||||||
|
|
||||||
|
int logid;
|
||||||
|
int pos;
|
||||||
|
int result;
|
||||||
|
bool in;
|
||||||
|
|
||||||
|
CLogCmp *next;
|
||||||
|
|
||||||
|
CLogCmp(const char* s, bool r, int p, CLogCmp *n, LogEventsMngr* mg) : text(s)
|
||||||
|
{
|
||||||
|
logid = result = 0;
|
||||||
|
pos = p;
|
||||||
|
parent = mg;
|
||||||
|
in = r;
|
||||||
|
next = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
int compareCondition(const char* string);
|
||||||
};
|
};
|
||||||
struct LogCond {
|
|
||||||
int argnum;
|
|
||||||
LogCondEle *list;
|
|
||||||
LogCond *next;
|
|
||||||
LogCond( int a , LogCondEle* ee , LogCond* n ) : argnum(a) , list(ee), next(n) {}
|
|
||||||
~LogCond();
|
|
||||||
};
|
|
||||||
CPluginMngr::CPlugin *plugin;
|
|
||||||
int func;
|
|
||||||
LogCond *filters;
|
|
||||||
LogEventsMngr* parent;
|
|
||||||
CLogEvent *next;
|
|
||||||
CLogEvent(CPluginMngr::CPlugin *p,int f, LogEventsMngr* ppp) : plugin(p),func(f), filters(0),parent(ppp) ,next(0) { }
|
|
||||||
~CLogEvent();
|
|
||||||
public:
|
|
||||||
inline CPluginMngr::CPlugin *getPlugin() { return plugin; }
|
|
||||||
void registerFilter( char* filter );
|
|
||||||
inline int getFunction() { return func; }
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
CLogCmp *logcmplist;
|
||||||
CLogEvent *logevents[MAX_LOGARGS+1];
|
|
||||||
CLogEvent *getValidLogEvent( CLogEvent * a );
|
|
||||||
CLogCmp* registerCondition(char* filter);
|
|
||||||
void clearConditions();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
LogEventsMngr();
|
class CLogEvent
|
||||||
~LogEventsMngr();
|
{
|
||||||
|
friend class LogEventsMngr;
|
||||||
|
friend class iterator;
|
||||||
|
|
||||||
|
struct LogCondEle
|
||||||
|
{
|
||||||
|
CLogCmp *cmp;
|
||||||
|
LogCondEle *next;
|
||||||
|
LogCondEle(CLogCmp *c, LogCondEle *n): cmp(c), next(n) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LogCond
|
||||||
|
{
|
||||||
|
int argnum;
|
||||||
|
|
||||||
|
LogCondEle *list;
|
||||||
|
LogCond *next;
|
||||||
|
LogCond(int a, LogCondEle* ee, LogCond* n) : argnum(a), list(ee), next(n) {}
|
||||||
|
~LogCond();
|
||||||
|
};
|
||||||
|
|
||||||
|
CPluginMngr::CPlugin *plugin;
|
||||||
|
|
||||||
|
int func;
|
||||||
|
|
||||||
|
LogCond *filters;
|
||||||
|
LogEventsMngr* parent;
|
||||||
|
|
||||||
|
CLogEvent *next;
|
||||||
|
CLogEvent(CPluginMngr::CPlugin *p, int f, LogEventsMngr* ppp) : plugin(p), func(f), filters(0), parent(ppp), next(0) {}
|
||||||
|
~CLogEvent();
|
||||||
|
public:
|
||||||
|
inline CPluginMngr::CPlugin *getPlugin() { return plugin; }
|
||||||
|
void registerFilter(char* filter);
|
||||||
|
inline int getFunction() { return func; }
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
CLogEvent *logevents[MAX_LOGARGS + 1];
|
||||||
|
CLogEvent *getValidLogEvent(CLogEvent * a);
|
||||||
|
CLogCmp* registerCondition(char* filter);
|
||||||
|
|
||||||
|
void clearConditions();
|
||||||
|
public:
|
||||||
|
LogEventsMngr();
|
||||||
|
~LogEventsMngr();
|
||||||
|
|
||||||
// Interface
|
// Interface
|
||||||
|
CLogEvent* registerLogEvent(CPluginMngr::CPlugin* plugin, int func, int pos);
|
||||||
|
inline bool logEventsExist() { return arelogevents; }
|
||||||
|
|
||||||
|
void setLogString(char* frmt, va_list& vaptr);
|
||||||
|
void setLogString(char* frmt, ...);
|
||||||
|
void parseLogString();
|
||||||
|
void executeLogEvents();
|
||||||
|
|
||||||
CLogEvent* registerLogEvent( CPluginMngr::CPlugin* plugin, int func, int pos );
|
inline const char* getLogString() { return logString; }
|
||||||
inline bool logEventsExist() { return arelogevents; }
|
inline int getLogArgNum() { return logArgc; }
|
||||||
void setLogString( char* frmt, va_list& vaptr );
|
inline const char* getLogArg(int i) { return (i < 0 || i >= logArgc) ? "" : logArgs[i]; }
|
||||||
void setLogString( char* frmt , ... );
|
void clearLogEvents();
|
||||||
void parseLogString( );
|
|
||||||
void executeLogEvents();
|
|
||||||
inline const char* getLogString() { return logString; }
|
|
||||||
inline int getLogArgNum() { return logArgc; }
|
|
||||||
inline const char* getLogArg( int i ) { return ( i < 0 || i >= logArgc ) ? "" : logArgs[ i ]; }
|
|
||||||
void clearLogEvents();
|
|
||||||
|
|
||||||
|
class iterator
|
||||||
|
{
|
||||||
|
CLogEvent* a;
|
||||||
|
LogEventsMngr* b;
|
||||||
|
|
||||||
class iterator {
|
public:
|
||||||
CLogEvent* a;
|
inline iterator(CLogEvent*aa, LogEventsMngr* bb) : a(aa), b(bb) {}
|
||||||
LogEventsMngr* b;
|
|
||||||
public:
|
inline iterator& operator++()
|
||||||
inline iterator(CLogEvent*aa,LogEventsMngr* bb) : a(aa), b(bb) {}
|
{
|
||||||
inline iterator& operator++() {
|
a = b->getValidLogEvent(a->next);
|
||||||
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
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,7 +35,8 @@
|
|||||||
// *****************************************************
|
// *****************************************************
|
||||||
// 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;
|
||||||
@ -50,45 +51,52 @@ MenuMngr::~MenuMngr()
|
|||||||
|
|
||||||
int MenuMngr::findMenuId(const char* name, AMX* amx)
|
int MenuMngr::findMenuId(const char* name, AMX* amx)
|
||||||
{
|
{
|
||||||
for( MenuIdEle* b = headid; b ; b = b->next) {
|
for (MenuIdEle* b = headid; b; b = b->next)
|
||||||
if ( (!b->amx || amx == b->amx) && strstr(name,b->name.c_str()) )
|
{
|
||||||
return b->id;
|
if ((!amx || !b->amx || amx == b->amx) && strstr(name,b->name.c_str()))
|
||||||
}
|
return b->id;
|
||||||
return 0;
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int MenuMngr::registerMenuId(const char* n, AMX* a )
|
int MenuMngr::registerMenuId(const char* n, AMX* a)
|
||||||
{
|
{
|
||||||
int id = findMenuId( n, a );
|
int id = findMenuId(n, a);
|
||||||
if (id) return id;
|
|
||||||
headid = new MenuIdEle( n, a , headid );
|
if (id)
|
||||||
if (!headid)
|
return id;
|
||||||
return 0; // :TODO: Better error report
|
|
||||||
return headid->id;
|
headid = new MenuIdEle(n, a, headid);
|
||||||
|
|
||||||
|
if (!headid)
|
||||||
|
return 0; // :TODO: Better error report
|
||||||
|
|
||||||
|
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()
|
||||||
{
|
{
|
||||||
while (headid)
|
while (headid)
|
||||||
{
|
{
|
||||||
MenuIdEle* a = headid->next;
|
MenuIdEle* a = headid->next;
|
||||||
delete headid;
|
delete headid;
|
||||||
headid = a;
|
headid = a;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (headcmd)
|
while (headcmd)
|
||||||
{
|
{
|
||||||
MenuCommand* a = headcmd->next;
|
MenuCommand* a = headcmd->next;
|
||||||
delete headcmd;
|
delete headcmd;
|
||||||
headcmd = a;
|
headcmd = a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int MenuMngr::MenuIdEle::uniqueid = 0;
|
int MenuMngr::MenuIdEle::uniqueid = 0;
|
@ -38,55 +38,58 @@
|
|||||||
|
|
||||||
class MenuMngr
|
class MenuMngr
|
||||||
{
|
{
|
||||||
struct MenuIdEle
|
struct MenuIdEle
|
||||||
{
|
{
|
||||||
String name;
|
String name;
|
||||||
AMX* amx;
|
AMX* amx;
|
||||||
MenuIdEle* next;
|
MenuIdEle* next;
|
||||||
int id;
|
|
||||||
static int uniqueid;
|
int id;
|
||||||
MenuIdEle( const char* n, AMX* a, MenuIdEle* m ) : name( n ) , amx(a) , next( m ) {
|
static int uniqueid;
|
||||||
id = ++uniqueid;
|
|
||||||
}
|
MenuIdEle(const char* n, AMX* a, MenuIdEle* m) : name(n), amx(a), next(m)
|
||||||
~MenuIdEle() { --uniqueid; }
|
{
|
||||||
} *headid;
|
id = ++uniqueid;
|
||||||
|
}
|
||||||
|
|
||||||
|
~MenuIdEle() { --uniqueid; }
|
||||||
|
} *headid;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
class iterator;
|
class iterator;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
class MenuCommand
|
class MenuCommand
|
||||||
{
|
{
|
||||||
friend class iterator;
|
friend class iterator;
|
||||||
friend class MenuMngr;
|
friend class MenuMngr;
|
||||||
|
|
||||||
CPluginMngr::CPlugin *plugin;
|
CPluginMngr::CPlugin *plugin;
|
||||||
int menuid;
|
int menuid;
|
||||||
int keys;
|
int keys;
|
||||||
int function;
|
int function;
|
||||||
MenuCommand* next;
|
|
||||||
MenuCommand( CPluginMngr::CPlugin *a, int mi, int k, int f );
|
MenuCommand* next;
|
||||||
public:
|
MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f);
|
||||||
inline int getFunction() { return function; }
|
public:
|
||||||
inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
|
inline int getFunction() { return function; }
|
||||||
inline bool matchCommand( int m, int k ) { return ((m == menuid) && (keys & k)); }
|
inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
|
||||||
} *headcmd;
|
inline bool matchCommand(int m, int k) { return ((m == menuid) && (keys & k)); }
|
||||||
|
} *headcmd;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
MenuMngr() { headid = 0; headcmd = 0; }
|
||||||
MenuMngr() { headid = 0; headcmd = 0; }
|
|
||||||
~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 registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f);
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
class iterator {
|
class iterator
|
||||||
|
{
|
||||||
MenuCommand* a;
|
MenuCommand* a;
|
||||||
public:
|
public:
|
||||||
iterator(MenuCommand*aa) : a(aa) {}
|
iterator(MenuCommand*aa) : a(aa) {}
|
||||||
@ -96,12 +99,9 @@ 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); }
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif //MENUS_H
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
// 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;
|
||||||
@ -55,178 +55,224 @@ void CPlayer::Init( edict_t* e , int i )
|
|||||||
team.clear();
|
team.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayer::Disconnect() {
|
void CPlayer::Disconnect()
|
||||||
ingame = false;
|
{
|
||||||
initialized = false;
|
ingame = false;
|
||||||
authorized = false;
|
initialized = false;
|
||||||
bot = 0;
|
authorized = false;
|
||||||
|
|
||||||
|
while (!cvarQueryQueue.empty())
|
||||||
|
{
|
||||||
|
ClientCvarQuery_Info *pQuery = cvarQueryQueue.front();
|
||||||
|
unregisterSPForward(pQuery->resultFwd);
|
||||||
|
|
||||||
|
if (pQuery->params)
|
||||||
|
delete [] pQuery->params;
|
||||||
|
|
||||||
|
delete pQuery;
|
||||||
|
cvarQueryQueue.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
bot = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayer::PutInServer() {
|
void CPlayer::PutInServer()
|
||||||
playtime = gpGlobals->time;
|
{
|
||||||
ingame = true;
|
playtime = gpGlobals->time;
|
||||||
}
|
ingame = true;
|
||||||
bool CPlayer::Connect(const char* connectname,const char* ipaddress) {
|
|
||||||
name.assign(connectname);
|
|
||||||
ip.assign(ipaddress);
|
|
||||||
time = gpGlobals->time;
|
|
||||||
bot = IsBot();
|
|
||||||
death_killer = 0;
|
|
||||||
memset(flags,0,sizeof(flags));
|
|
||||||
memset(weapons,0,sizeof(weapons));
|
|
||||||
initialized = true;
|
|
||||||
authorized = false;
|
|
||||||
|
|
||||||
const char* authid = GETPLAYERAUTHID( pEdict );
|
|
||||||
|
|
||||||
if ( (authid == 0) || (*authid == 0)
|
|
||||||
|| (strcmp( authid , "STEAM_ID_PENDING") == 0) )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CPlayer::Connect(const char* connectname, const char* ipaddress)
|
||||||
|
{
|
||||||
|
name.assign(connectname);
|
||||||
|
ip.assign(ipaddress);
|
||||||
|
time = gpGlobals->time;
|
||||||
|
bot = IsBot();
|
||||||
|
death_killer = 0;
|
||||||
|
|
||||||
|
memset(flags, 0, sizeof(flags));
|
||||||
|
memset(weapons, 0, sizeof(weapons));
|
||||||
|
|
||||||
|
initialized = true;
|
||||||
|
authorized = false;
|
||||||
|
|
||||||
|
const char* authid = GETPLAYERAUTHID(pEdict);
|
||||||
|
|
||||||
|
if ((authid == 0) || (*authid == 0) || (strcmp(authid, "STEAM_ID_PENDING") == 0))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
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;
|
||||||
a->type = type;
|
a->type = type;
|
||||||
a->next = head;
|
a->next = head;
|
||||||
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 ) {
|
|
||||||
if ( (*a)->grenade == enemy ) {
|
|
||||||
found = true;
|
|
||||||
(*p) = (*a)->player;
|
|
||||||
type = (*a)->type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Obj* b = (*a)->next;
|
|
||||||
delete *a;
|
|
||||||
*a = b;
|
|
||||||
|
|
||||||
continue;
|
while (*a)
|
||||||
|
{
|
||||||
|
if ((*a)->time > gpGlobals->time)
|
||||||
|
{
|
||||||
|
if ((*a)->grenade == enemy)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
(*p) = (*a)->player;
|
||||||
|
type = (*a)->type;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Obj* b = (*a)->next;
|
||||||
|
delete *a;
|
||||||
|
*a = b;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
a = &(*a)->next;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
return found;
|
||||||
a = &(*a)->next;
|
|
||||||
}
|
|
||||||
return found;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Grenades::clear()
|
void Grenades::clear()
|
||||||
{
|
{
|
||||||
while(head){
|
while (head)
|
||||||
Obj* a = head->next;
|
{
|
||||||
delete head;
|
Obj* a = head->next;
|
||||||
head = a;
|
delete head;
|
||||||
}
|
head = a;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
// 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) )
|
{
|
||||||
return a;
|
if ((head[a].amx == p) && (head[a].value == v))
|
||||||
}
|
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.c_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);
|
||||||
newTeam |= (1<<(*a)->tid);
|
|
||||||
|
if (*a == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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.c_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.c_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;
|
||||||
|
|
||||||
|
207
amxmodx/CMisc.h
207
amxmodx/CMisc.h
@ -37,34 +37,44 @@
|
|||||||
// *****************************************************
|
// *****************************************************
|
||||||
// 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.c_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.c_str(); }
|
inline const char* getPluginName() { return plugin.c_str(); }
|
||||||
inline const char* getName() { return name.c_str(); }
|
inline const char* getName() { return name.c_str(); }
|
||||||
inline bool operator == ( const char* string ) { return (strcmp(name.c_str(),string)==0); }
|
inline bool operator == (const char* string) { return (strcmp(name.c_str(), string) == 0); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
// class CPlayer
|
// class CPlayer
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
|
|
||||||
|
struct ClientCvarQuery_Info
|
||||||
|
{
|
||||||
|
bool querying; // Are we actually waiting for a response at the moment?
|
||||||
|
String cvarName;
|
||||||
|
int resultFwd;
|
||||||
|
|
||||||
|
int paramLen;
|
||||||
|
cell *params;
|
||||||
|
};
|
||||||
|
|
||||||
class CPlayer
|
class CPlayer
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
edict_t* pEdict;
|
edict_t* pEdict;
|
||||||
|
|
||||||
@ -80,7 +90,8 @@ public:
|
|||||||
float time;
|
float time;
|
||||||
float playtime;
|
float playtime;
|
||||||
|
|
||||||
struct {
|
struct
|
||||||
|
{
|
||||||
int ammo;
|
int ammo;
|
||||||
int clip;
|
int clip;
|
||||||
} weapons[MAX_WEAPONS];
|
} weapons[MAX_WEAPONS];
|
||||||
@ -99,22 +110,29 @@ public:
|
|||||||
int death_victim;
|
int death_victim;
|
||||||
bool death_tk;
|
bool death_tk;
|
||||||
String death_weapon;
|
String death_weapon;
|
||||||
|
int newmenu;
|
||||||
|
int page;
|
||||||
|
|
||||||
Vector lastTrace;
|
Vector lastTrace;
|
||||||
Vector thisTrace;
|
Vector thisTrace;
|
||||||
Vector lastHit;
|
Vector lastHit;
|
||||||
|
|
||||||
void Init( edict_t* e , int i );
|
CQueue<ClientCvarQuery_Info*> cvarQueryQueue;
|
||||||
|
|
||||||
|
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);
|
||||||
return ((pEdict->v.flags & FL_FAKECLIENT)?true:false);
|
|
||||||
|
inline bool IsBot()
|
||||||
|
{
|
||||||
|
return ((pEdict->v.flags & FL_FAKECLIENT) ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool IsAlive(){
|
inline bool IsAlive()
|
||||||
return ((pEdict->v.deadflag==DEAD_NO)&&(pEdict->v.health>0));
|
{
|
||||||
|
return ((pEdict->v.deadflag == DEAD_NO) && (pEdict->v.health > 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Authorize() { authorized = true; }
|
inline void Authorize() { authorized = true; }
|
||||||
@ -127,40 +145,44 @@ public:
|
|||||||
|
|
||||||
class Grenades
|
class Grenades
|
||||||
{
|
{
|
||||||
struct Obj
|
struct Obj
|
||||||
{
|
{
|
||||||
CPlayer* player;
|
CPlayer* player;
|
||||||
edict_t* grenade;
|
edict_t* grenade;
|
||||||
float time;
|
float time;
|
||||||
int type;
|
int type;
|
||||||
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);
|
||||||
void clear();
|
bool find(edict_t* enemy, CPlayer** p, int& type);
|
||||||
|
void clear();
|
||||||
};
|
};
|
||||||
|
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
// class ForceObject
|
// class ForceObject
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
class ForceObject {
|
|
||||||
String filename;
|
class ForceObject
|
||||||
FORCE_TYPE type;
|
{
|
||||||
Vector mins;
|
String filename;
|
||||||
Vector maxs;
|
FORCE_TYPE type;
|
||||||
AMX* amx;
|
Vector mins;
|
||||||
|
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.c_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; }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -170,81 +192,92 @@ public:
|
|||||||
|
|
||||||
class XVars
|
class XVars
|
||||||
{
|
{
|
||||||
struct XVarEle {
|
struct XVarEle
|
||||||
AMX* amx;
|
{
|
||||||
cell* value;
|
AMX* amx;
|
||||||
};
|
cell* value;
|
||||||
|
};
|
||||||
|
|
||||||
XVarEle* head;
|
XVarEle* head;
|
||||||
int size;
|
|
||||||
int num;
|
|
||||||
|
|
||||||
int realloc_array( int nsize );
|
int size;
|
||||||
|
int num;
|
||||||
|
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();
|
|
||||||
int put( AMX* a, cell* v );
|
void clear();
|
||||||
inline cell getValue( int a ) {
|
int put(AMX* a, cell* v);
|
||||||
return ( a >= 0 && a < num ) ? *(head[a].value) : 0;
|
|
||||||
}
|
inline cell getValue(int a)
|
||||||
inline int setValue( int a, cell v ) {
|
{
|
||||||
if ( a >= 0 && a < num ){
|
return (a >= 0 && a < num) ? *(head[a].value) : 0;
|
||||||
*(head[a].value) = v;
|
}
|
||||||
return 0;
|
|
||||||
}
|
inline int setValue(int a, cell v)
|
||||||
return 1;
|
{
|
||||||
}
|
if (a >= 0 && a < num)
|
||||||
|
{
|
||||||
|
*(head[a].value) = v;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
// 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.c_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;
|
{
|
||||||
int id;
|
String name;
|
||||||
char tid;
|
int id;
|
||||||
static char uid;
|
char tid;
|
||||||
TeamEle* next;
|
static char uid;
|
||||||
TeamEle(const char* n, int& i) : name(n) , id(i) , next(0) {
|
TeamEle* next;
|
||||||
tid = uid++;
|
|
||||||
};
|
|
||||||
~TeamEle(){ --uid; }
|
|
||||||
} *head;
|
|
||||||
|
|
||||||
int newTeam;
|
TeamEle(const char* n, int& i) : name(n), id(i), next(0)
|
||||||
|
{
|
||||||
|
tid = uid++;
|
||||||
|
}
|
||||||
|
|
||||||
|
~TeamEle() { --uid; }
|
||||||
|
} *head;
|
||||||
|
|
||||||
|
int newTeam;
|
||||||
|
|
||||||
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);
|
||||||
inline bool isNewTeam() { return newTeam ? true : false; }
|
int findTeamIdCase(const char* n);
|
||||||
|
inline bool isNewTeam() { return newTeam ? true : false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif //CMISC_H
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,14 +32,9 @@
|
|||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
|
|
||||||
#ifndef FAR
|
#ifndef FAR
|
||||||
#define FAR
|
#define FAR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Old
|
|
||||||
typedef int (FAR *QUERYMOD)(module_info_s**);
|
|
||||||
typedef int (FAR *ATTACHMOD)(pfnamx_engine_g*,pfnmodule_engine_g*);
|
|
||||||
typedef int (FAR *DETACHMOD)(void);
|
|
||||||
|
|
||||||
// New
|
// New
|
||||||
typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
|
typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
|
||||||
typedef int (FAR *QUERYMOD_NEW)(int * /*ifvers*/, amxx_module_info_s * /*modInfo*/);
|
typedef int (FAR *QUERYMOD_NEW)(int * /*ifvers*/, amxx_module_info_s * /*modInfo*/);
|
||||||
@ -47,94 +42,20 @@ typedef int (FAR *ATTACHMOD_NEW)(PFN_REQ_FNPTR /*reqFnptrFunc*/);
|
|||||||
typedef int (FAR *DETACHMOD_NEW)(void);
|
typedef int (FAR *DETACHMOD_NEW)(void);
|
||||||
typedef void (FAR *PLUGINSLOADED_NEW)(void);
|
typedef void (FAR *PLUGINSLOADED_NEW)(void);
|
||||||
|
|
||||||
// Old
|
|
||||||
// These functions are needed since Small Abstract Machine 2.5.0
|
|
||||||
int wamx_FindPublic(AMX *amx, char *name, int *index)
|
|
||||||
{ return amx_FindPublic(amx, name, index); }
|
|
||||||
|
|
||||||
int wamx_FindPubVar(AMX *amx, char *varname, cell *amx_addr)
|
|
||||||
{ return amx_FindPubVar(amx, varname, amx_addr); }
|
|
||||||
|
|
||||||
int wamx_GetString(char *dest, cell *source)
|
|
||||||
{ return amx_GetString(dest, source, 0); }
|
|
||||||
|
|
||||||
AMX_NATIVE_INFO *wamx_NativeInfo(char *name, AMX_NATIVE func)
|
|
||||||
{ return amx_NativeInfo(name, func); }
|
|
||||||
|
|
||||||
int wamx_SetString(cell *dest, char *source, int pack)
|
|
||||||
{ return amx_SetString(dest, source, pack, 0); }
|
|
||||||
|
|
||||||
pfnamx_engine_g engAmxFunc = {
|
|
||||||
amx_Align16,
|
|
||||||
amx_Align32,
|
|
||||||
amx_Allot,
|
|
||||||
amx_Callback,
|
|
||||||
amx_Clone,
|
|
||||||
amx_Debug,
|
|
||||||
amx_Exec,
|
|
||||||
amx_Execv,
|
|
||||||
wamx_FindPublic,
|
|
||||||
wamx_FindPubVar,
|
|
||||||
amx_FindTagId,
|
|
||||||
amx_Flags,
|
|
||||||
amx_GetAddr,
|
|
||||||
amx_GetPublic,
|
|
||||||
amx_GetPubVar,
|
|
||||||
wamx_GetString,
|
|
||||||
amx_GetTag,
|
|
||||||
amx_GetUserData,
|
|
||||||
amx_Init,
|
|
||||||
amx_InitJIT,
|
|
||||||
amx_MemInfo,
|
|
||||||
amx_NameLength,
|
|
||||||
wamx_NativeInfo,
|
|
||||||
amx_NumPublics,
|
|
||||||
amx_NumPubVars,
|
|
||||||
amx_NumTags,
|
|
||||||
amx_RaiseError,
|
|
||||||
amx_Register,
|
|
||||||
amx_Release,
|
|
||||||
amx_SetCallback,
|
|
||||||
amx_SetDebugHook,
|
|
||||||
wamx_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) : m_Filename(fname)
|
CModule::CModule(const char* fname)
|
||||||
{
|
{
|
||||||
|
m_Filename.assign(fname);
|
||||||
clear(false);
|
clear(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
CModule::~CModule()
|
CModule::~CModule()
|
||||||
{
|
{
|
||||||
// old & new
|
// old & new
|
||||||
if ( m_Handle )
|
if (m_Handle)
|
||||||
DLFREE(m_Handle);
|
DLFREE(m_Handle);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
@ -146,11 +67,10 @@ void CModule::clear(bool clearFilename)
|
|||||||
m_Metamod = false;
|
m_Metamod = false;
|
||||||
m_Handle = NULL;
|
m_Handle = NULL;
|
||||||
m_Status = MODULE_NONE;
|
m_Status = MODULE_NONE;
|
||||||
|
|
||||||
if (clearFilename)
|
if (clearFilename)
|
||||||
m_Filename.assign("unknown");
|
m_Filename.assign("unknown");
|
||||||
|
|
||||||
// old
|
|
||||||
m_InfoOld = NULL;
|
|
||||||
// new
|
// new
|
||||||
m_Amxx = false;
|
m_Amxx = false;
|
||||||
m_InfoNew.author = "unknown";
|
m_InfoNew.author = "unknown";
|
||||||
@ -162,6 +82,26 @@ void CModule::clear(bool clearFilename)
|
|||||||
m_Natives.clear();
|
m_Natives.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;
|
||||||
|
}
|
||||||
|
|
||||||
bool CModule::attachModule()
|
bool CModule::attachModule()
|
||||||
{
|
{
|
||||||
// old & new
|
// old & new
|
||||||
@ -175,6 +115,7 @@ bool CModule::attachModule()
|
|||||||
|
|
||||||
if (!AttachFunc_New)
|
if (!AttachFunc_New)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
g_ModuleCallReason = ModuleCall_Attach;
|
g_ModuleCallReason = ModuleCall_Attach;
|
||||||
g_CurrentlyCalledModule = this;
|
g_CurrentlyCalledModule = this;
|
||||||
int retVal = (*AttachFunc_New)(Module_ReqFnptr);
|
int retVal = (*AttachFunc_New)(Module_ReqFnptr);
|
||||||
@ -183,38 +124,32 @@ bool CModule::attachModule()
|
|||||||
|
|
||||||
switch (retVal)
|
switch (retVal)
|
||||||
{
|
{
|
||||||
case AMXX_OK:
|
case AMXX_OK:
|
||||||
m_Status = MODULE_LOADED;
|
m_Status = MODULE_LOADED;
|
||||||
return true;
|
return true;
|
||||||
case AMXX_PARAM:
|
case AMXX_PARAM:
|
||||||
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
|
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
|
||||||
m_Status = MODULE_INTERROR;
|
m_Status = MODULE_INTERROR;
|
||||||
return false;
|
return false;
|
||||||
case AMXX_FUNC_NOT_PRESENT:
|
case AMXX_FUNC_NOT_PRESENT:
|
||||||
m_Status = MODULE_FUNCNOTPRESENT;
|
m_Status = MODULE_FUNCNOTPRESENT;
|
||||||
m_MissingFunc = g_LastRequestedFunc;
|
m_MissingFunc = g_LastRequestedFunc;
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an invalid code.", m_Filename.c_str(), getVersion());
|
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an invalid code.", m_Filename.c_str(), getVersion());
|
||||||
m_Status = MODULE_BADLOAD;
|
m_Status = MODULE_BADLOAD;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
m_Status = MODULE_BADLOAD;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// old
|
|
||||||
ATTACHMOD AttachFunc = (ATTACHMOD)DLPROC(m_Handle, "AMX_Attach");
|
|
||||||
|
|
||||||
if (AttachFunc)
|
return false;
|
||||||
(*AttachFunc)(&engAmxFunc,&engModuleFunc);
|
|
||||||
m_Status = MODULE_LOADED;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CModule::queryModule()
|
bool CModule::queryModule()
|
||||||
{
|
{
|
||||||
if (m_Status != MODULE_NONE) // don't check if already queried
|
if (m_Status != MODULE_NONE) // don't check if already queried
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_Handle = DLLOAD(m_Filename.c_str()); // load file
|
m_Handle = DLLOAD(m_Filename.c_str()); // load file
|
||||||
@ -230,6 +165,7 @@ bool CModule::queryModule()
|
|||||||
|
|
||||||
// Try new interface first
|
// Try new interface first
|
||||||
QUERYMOD_NEW queryFunc_New = (QUERYMOD_NEW)DLPROC(m_Handle, "AMXX_Query");
|
QUERYMOD_NEW queryFunc_New = (QUERYMOD_NEW)DLPROC(m_Handle, "AMXX_Query");
|
||||||
|
|
||||||
if (queryFunc_New)
|
if (queryFunc_New)
|
||||||
{
|
{
|
||||||
m_Amxx = true;
|
m_Amxx = true;
|
||||||
@ -239,24 +175,25 @@ bool CModule::queryModule()
|
|||||||
int retVal = (*queryFunc_New)(&ifVers, &m_InfoNew);
|
int retVal = (*queryFunc_New)(&ifVers, &m_InfoNew);
|
||||||
g_CurrentlyCalledModule = NULL;
|
g_CurrentlyCalledModule = NULL;
|
||||||
g_ModuleCallReason = ModuleCall_NotCalled;
|
g_ModuleCallReason = ModuleCall_NotCalled;
|
||||||
|
|
||||||
switch (retVal)
|
switch (retVal)
|
||||||
{
|
{
|
||||||
case AMXX_PARAM:
|
case AMXX_PARAM:
|
||||||
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
|
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
|
||||||
m_Status = MODULE_INTERROR;
|
m_Status = MODULE_INTERROR;
|
||||||
return false;
|
return false;
|
||||||
case AMXX_IFVERS:
|
case AMXX_IFVERS:
|
||||||
if (ifVers < AMXX_INTERFACE_VERSION)
|
if (ifVers < AMXX_INTERFACE_VERSION)
|
||||||
m_Status = MODULE_OLD;
|
m_Status = MODULE_OLD;
|
||||||
else
|
else
|
||||||
m_Status = MODULE_NEWER;
|
m_Status = MODULE_NEWER;
|
||||||
return false;
|
return false;
|
||||||
case AMXX_OK:
|
case AMXX_OK:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an invalid code.", m_Filename.c_str(), getVersion());
|
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an invalid code.", m_Filename.c_str(), getVersion());
|
||||||
m_Status = MODULE_BADLOAD;
|
m_Status = MODULE_BADLOAD;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for attach
|
// Check for attach
|
||||||
@ -268,47 +205,10 @@ bool CModule::queryModule()
|
|||||||
|
|
||||||
m_Status = MODULE_QUERY;
|
m_Status = MODULE_QUERY;
|
||||||
return true;
|
return true;
|
||||||
}
|
} else {
|
||||||
else
|
m_Status = MODULE_NOQUERY;
|
||||||
{
|
m_Amxx = false;
|
||||||
// old interface not 64 bit compatible
|
|
||||||
#if SMALL_CELL_SIZE == 64
|
|
||||||
m_Status = MODULE_NOT64BIT;
|
|
||||||
return false;
|
return false;
|
||||||
#else
|
|
||||||
// Try old interface
|
|
||||||
QUERYMOD queryFunc_Old = (QUERYMOD)DLPROC(m_Handle,"AMX_Query"); // check what version
|
|
||||||
if (!queryFunc_Old)
|
|
||||||
{
|
|
||||||
m_Status = MODULE_NOQUERY;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*queryFunc_Old)(&m_InfoOld);
|
|
||||||
|
|
||||||
if (!m_InfoOld)
|
|
||||||
{
|
|
||||||
m_Status = MODULE_NOINFO;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_InfoOld->ivers != AMX_INTERFACE_VERSION)
|
|
||||||
{
|
|
||||||
m_Status = MODULE_OLD;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for attach
|
|
||||||
if (!DLPROC(m_Handle, "AMX_Attach"))
|
|
||||||
{
|
|
||||||
m_Status = MODULE_NOATTACH;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_InfoOld->serial = (long int)this;
|
|
||||||
m_Status = MODULE_QUERY;
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,6 +220,7 @@ bool CModule::detachModule()
|
|||||||
if (m_Amxx)
|
if (m_Amxx)
|
||||||
{
|
{
|
||||||
DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
|
DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
|
||||||
|
|
||||||
if (detachFunc_New)
|
if (detachFunc_New)
|
||||||
{
|
{
|
||||||
g_ModuleCallReason = ModuleCall_Detach;
|
g_ModuleCallReason = ModuleCall_Detach;
|
||||||
@ -329,14 +230,17 @@ bool CModule::detachModule()
|
|||||||
g_ModuleCallReason = ModuleCall_NotCalled;
|
g_ModuleCallReason = ModuleCall_NotCalled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
#ifndef FAKEMETA
|
||||||
|
if (IsMetamod())
|
||||||
{
|
{
|
||||||
DETACHMOD detachFunc_Old = (DETACHMOD)DLPROC(m_Handle, "AMX_Detach");
|
UnloadMetamodPlugin(m_Handle);
|
||||||
if (detachFunc_Old)
|
|
||||||
(*detachFunc_Old)();
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
DLFREE(m_Handle);
|
DLFREE(m_Handle);
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,28 +253,31 @@ void CModule::CallPluginsLoaded()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
PLUGINSLOADED_NEW func = (PLUGINSLOADED_NEW)DLPROC(m_Handle, "AMXX_PluginsLoaded");
|
PLUGINSLOADED_NEW func = (PLUGINSLOADED_NEW)DLPROC(m_Handle, "AMXX_PluginsLoaded");
|
||||||
|
|
||||||
if (!func)
|
if (!func)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
func();
|
func();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* CModule::getStatus() const
|
const char* CModule::getStatus() const
|
||||||
{
|
{
|
||||||
switch(m_Status)
|
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_FUNCNOTPRESENT:
|
||||||
case MODULE_NEWER: return "newer";
|
case MODULE_NEWER: return "newer";
|
||||||
case MODULE_INTERROR: return "internal err";
|
case MODULE_INTERROR: return "internal err";
|
||||||
case MODULE_NOT64BIT: return "not 64bit";
|
case MODULE_NOT64BIT: return "not 64bit";
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
|
@ -36,19 +36,20 @@
|
|||||||
#ifndef CMODULE_H
|
#ifndef CMODULE_H
|
||||||
#define CMODULE_H
|
#define CMODULE_H
|
||||||
|
|
||||||
enum MODULE_STATUS {
|
enum MODULE_STATUS
|
||||||
MODULE_NONE, // No module loaded
|
{
|
||||||
MODULE_QUERY, // Query failed
|
MODULE_NONE, // No module loaded
|
||||||
MODULE_BADLOAD, // Bad file or the module writer messed something up ;]
|
MODULE_QUERY, // Query failed
|
||||||
MODULE_LOADED, // Loaded
|
MODULE_BADLOAD, // Bad file or the module writer messed something up ;]
|
||||||
MODULE_NOINFO, // No info
|
MODULE_LOADED, // Loaded
|
||||||
MODULE_NOQUERY, // No query function present
|
MODULE_NOINFO, // No info
|
||||||
MODULE_NOATTACH, // No attach function present
|
MODULE_NOQUERY, // No query function present
|
||||||
MODULE_OLD, // Old interface
|
MODULE_NOATTACH, // No attach function present
|
||||||
MODULE_NEWER, // newer interface
|
MODULE_OLD, // Old interface
|
||||||
MODULE_INTERROR, // Internal error
|
MODULE_NEWER, // newer interface
|
||||||
MODULE_FUNCNOTPRESENT, // Function not present
|
MODULE_INTERROR, // Internal error
|
||||||
MODULE_NOT64BIT // Not 64 bit compatible
|
MODULE_FUNCNOTPRESENT, // Function not present
|
||||||
|
MODULE_NOT64BIT // Not 64 bit compatible
|
||||||
};
|
};
|
||||||
|
|
||||||
struct amxx_module_info_s
|
struct amxx_module_info_s
|
||||||
@ -57,22 +58,23 @@ struct amxx_module_info_s
|
|||||||
const char *author;
|
const char *author;
|
||||||
const char *version;
|
const char *version;
|
||||||
int reload; // reload on mapchange when nonzero
|
int reload; // reload on mapchange when nonzero
|
||||||
|
const char *logtag; //added in version 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define AMXX_OK 0 /* no error */
|
#define AMXX_OK 0 /* no error */
|
||||||
#define AMXX_IFVERS 1 /* interface version */
|
#define AMXX_IFVERS 1 /* interface version */
|
||||||
#define AMXX_PARAM 2 /* Invalid parameter */
|
#define AMXX_PARAM 2 /* Invalid parameter */
|
||||||
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
|
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
|
||||||
|
|
||||||
#define AMXX_INTERFACE_VERSION 1
|
#define AMXX_INTERFACE_VERSION 3
|
||||||
|
|
||||||
class CModule
|
class CModule
|
||||||
{
|
{
|
||||||
String m_Filename; // Filename
|
String m_Filename; // Filename
|
||||||
|
|
||||||
bool m_Metamod; // Using metamod?
|
bool m_Metamod; // Using metamod?
|
||||||
bool m_Amxx; // Using new module interface?
|
bool m_Amxx; // Using new module interface?
|
||||||
module_info_s* m_InfoOld; // module info (old module interface)
|
|
||||||
amxx_module_info_s m_InfoNew; // module info (new module interface)
|
amxx_module_info_s m_InfoNew; // module info (new module interface)
|
||||||
DLHANDLE m_Handle; // handle
|
DLHANDLE m_Handle; // handle
|
||||||
MODULE_STATUS m_Status; // status
|
MODULE_STATUS m_Status; // status
|
||||||
@ -84,30 +86,32 @@ public:
|
|||||||
~CModule();
|
~CModule();
|
||||||
|
|
||||||
// Interface
|
// Interface
|
||||||
|
|
||||||
bool attachModule();
|
bool attachModule();
|
||||||
bool queryModule();
|
bool queryModule();
|
||||||
bool detachModule();
|
bool detachModule();
|
||||||
|
|
||||||
|
#ifndef FAKEMETA
|
||||||
|
bool attachMetamod(const char *mmfile, PLUG_LOADTIME now);
|
||||||
|
#endif
|
||||||
|
|
||||||
const char* getStatus() const;
|
const char* getStatus() const;
|
||||||
inline const char* getType() const { return m_Amxx ? "amxx" : (m_Metamod ? "amx&mm" : "amx"); }
|
inline const char* getType() const { return m_Amxx ? "amxx" : (m_Metamod ? "amx&mm" : "amx"); }
|
||||||
inline const char* getAuthor() const { return m_Amxx ? (m_InfoNew.author) : (m_InfoOld ? m_InfoOld->author : "unknown"); }
|
inline const char* getAuthor() const { return m_InfoNew.author; }
|
||||||
inline const char* getVersion() const { return m_Amxx ? (m_InfoNew.version) : (m_InfoOld ? m_InfoOld->version : "unknown"); }
|
inline const char* getVersion() const { return m_InfoNew.version; }
|
||||||
inline const char* getName() const { return m_Amxx ? (m_InfoNew.name) : (m_InfoOld ? m_InfoOld->name : "unknown"); }
|
inline const char* getName() const { return m_InfoNew.name; }
|
||||||
inline module_info_s* getInfo() const { return m_InfoOld; } // old
|
|
||||||
inline const amxx_module_info_s* getInfoNew() const { return &m_InfoNew; } // new
|
inline const amxx_module_info_s* getInfoNew() const { return &m_InfoNew; } // new
|
||||||
inline int getStatusValue() { return m_Status; }
|
inline int getStatusValue() { return m_Status; }
|
||||||
inline bool operator==( void* fname ) { return !strcmp( m_Filename.c_str() , (char*)fname ); }
|
inline bool operator==(const char* fname) { return !strcmp(m_Filename.c_str(), fname); }
|
||||||
inline bool isReloadable() { return m_Amxx ? ((m_Status == MODULE_LOADED) && (m_InfoNew.reload != 0)) : ( (m_Status==MODULE_LOADED) && (m_InfoOld->type==RELOAD_MODULE)); }
|
inline bool isReloadable() { return ((m_Status == MODULE_LOADED) && (m_InfoNew.reload != 0)); }
|
||||||
inline bool isAmxx() const { return m_Amxx; }
|
inline bool isAmxx() const { return m_Amxx; }
|
||||||
inline const char *getMissingFunc() const { return m_MissingFunc; }
|
inline const char *getMissingFunc() const { return m_MissingFunc; }
|
||||||
inline const char *getFilename() { return m_Filename.c_str(); }
|
inline const char *getFilename() { return m_Filename.c_str(); }
|
||||||
|
inline bool IsMetamod() { return m_Metamod; }
|
||||||
|
|
||||||
void CModule::CallPluginsLoaded();
|
void CModule::CallPluginsLoaded();
|
||||||
|
|
||||||
CList<AMX_NATIVE_INFO*> m_Natives;
|
CList<AMX_NATIVE_INFO*> m_Natives;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif //CMODULE_H
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,135 +33,330 @@
|
|||||||
#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"
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
AMXXLOG_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)
|
||||||
|
{
|
||||||
|
char file[256];
|
||||||
|
FILE *fp = fopen(build_pathname_r(file, sizeof(file) - 1, "%s", filename), "rt");
|
||||||
|
|
||||||
|
if (!fp)
|
||||||
|
{
|
||||||
|
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 ) )
|
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)
|
line.clear();
|
||||||
AMXXLOG_Log("[AMXX] %s (plugin \"%s\")", error, pluginName );
|
line._fread(fp);
|
||||||
|
sscanf(line.c_str(), "%s %s", pluginName, debug);
|
||||||
|
|
||||||
|
if (!isalnum(*pluginName))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (isalnum(*debug) && strcmp(debug, "debug") == 0)
|
||||||
|
{
|
||||||
|
debugFlag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
CPlugin**a = &head;
|
||||||
while ( *a )
|
|
||||||
|
while (*a)
|
||||||
unloadPlugin(a);
|
unloadPlugin(a);
|
||||||
|
|
||||||
|
m_Finalized = false;
|
||||||
|
|
||||||
|
if (pNatives)
|
||||||
|
{
|
||||||
|
delete [] pNatives;
|
||||||
|
pNatives = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CPluginMngr::CPlugin* CPluginMngr::findPluginFast(AMX *amx)
|
CPluginMngr::CPlugin* CPluginMngr::findPluginFast(AMX *amx)
|
||||||
{
|
{
|
||||||
return (CPlugin*)(amx->userdata[3]);
|
return (CPlugin*)(amx->userdata[UD_FINDPLUGIN]);
|
||||||
/*CPlugin*a = head;
|
|
||||||
while ( a && &a->amx != amx )
|
|
||||||
a=a->next;
|
|
||||||
return a;*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx) {
|
CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx)
|
||||||
|
{
|
||||||
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.c_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_paused: return "paused";
|
{
|
||||||
case ps_bad_load: return "bad load";
|
case ps_running:
|
||||||
case ps_stopped: return "stopped";
|
{
|
||||||
case ps_locked: return "locked";
|
if (m_Debug)
|
||||||
|
{
|
||||||
|
return "debug";
|
||||||
|
} else {
|
||||||
|
return "running";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ps_paused: return "paused";
|
||||||
|
case ps_bad_load: return "bad load";
|
||||||
|
case ps_stopped: return "stopped";
|
||||||
|
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.assign(unk);
|
title.assign(unk);
|
||||||
author.assign(unk);
|
author.assign(unk);
|
||||||
version.assign(unk);
|
version.assign(unk);
|
||||||
char* path = build_pathname("%s/%s",p,n);
|
|
||||||
|
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");
|
||||||
g_commands.clearBufforedInfo();
|
m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause");
|
||||||
|
|
||||||
|
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 = 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))
|
||||||
|
{
|
||||||
|
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
|
||||||
}
|
}
|
||||||
@ -172,16 +367,8 @@ void CPluginMngr::CPlugin::pausePlugin()
|
|||||||
if (isValid())
|
if (isValid())
|
||||||
{
|
{
|
||||||
// call plugin_pause if provided
|
// call plugin_pause if provided
|
||||||
int func;
|
if (m_PauseFwd != -1)
|
||||||
cell retval;
|
executeForwards(m_PauseFwd);
|
||||||
if (amx_FindPublic(&amx, "plugin_pause", &func) == AMX_ERR_NONE)
|
|
||||||
{
|
|
||||||
if (isExecutable(func))
|
|
||||||
{
|
|
||||||
|
|
||||||
amx_Exec(&amx, &retval, func, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setStatus(ps_paused);
|
setStatus(ps_paused);
|
||||||
}
|
}
|
||||||
@ -193,17 +380,10 @@ void CPluginMngr::CPlugin::unpausePlugin()
|
|||||||
if (isValid())
|
if (isValid())
|
||||||
{
|
{
|
||||||
// set status first so the function will be marked executable
|
// set status first so the function will be marked executable
|
||||||
|
|
||||||
setStatus(ps_running);
|
setStatus(ps_running);
|
||||||
|
|
||||||
// call plugin_unpause if provided
|
// call plugin_unpause if provided
|
||||||
int func;
|
if (m_UnpauseFwd != -1)
|
||||||
cell retval;
|
executeForwards(m_UnpauseFwd);
|
||||||
if (amx_FindPublic(&amx, "plugin_unpause", &func) == AMX_ERR_NONE)
|
|
||||||
{
|
|
||||||
if (isExecutable(func))
|
|
||||||
{
|
|
||||||
amx_Exec(&amx, &retval, func, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -36,18 +36,18 @@
|
|||||||
// class CPluginMngr
|
// class CPluginMngr
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
|
|
||||||
enum {
|
enum
|
||||||
|
{
|
||||||
ps_bad_load,
|
ps_bad_load,
|
||||||
ps_error,
|
ps_error,
|
||||||
|
ps_locked,
|
||||||
ps_paused,
|
ps_paused,
|
||||||
ps_running,
|
|
||||||
ps_stopped,
|
ps_stopped,
|
||||||
ps_locked
|
ps_running,
|
||||||
};
|
};
|
||||||
|
|
||||||
class CPluginMngr
|
class CPluginMngr
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
class iterator;
|
class iterator;
|
||||||
@ -59,62 +59,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() { return name.c_str();}
|
||||||
inline const char* getVersion() { return version.c_str();}
|
inline const char* getVersion() { return version.c_str();}
|
||||||
inline const char* getTitle() { return title.c_str();}
|
inline const char* getTitle() { return title.c_str();}
|
||||||
inline const char* getAuthor() { return author.c_str();}
|
inline const char* getAuthor() { return author.c_str();}
|
||||||
|
inline const char* getError() { return errorMsg.c_str();}
|
||||||
|
inline int getStatusCode() { return status; }
|
||||||
inline int getId() const { return id; }
|
inline int getId() const { return id; }
|
||||||
inline AMX* getAMX() { return &amx; }
|
inline AMX* getAMX() { return &amx; }
|
||||||
inline void setTitle( const char* n ) { title.assign(n); }
|
inline const AMX* getAMX() const { return &amx; }
|
||||||
inline void setAuthor( const char* n ) { author.assign(n); }
|
inline void setTitle(const char* n) { title.assign(n); }
|
||||||
inline void setVersion( const char* n ) { version.assign(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 bool isExecutable(int id) const { return (isValid() && !isPaused()); }
|
||||||
|
|
||||||
|
void Finalize();
|
||||||
void pausePlugin();
|
void pausePlugin();
|
||||||
void unpausePlugin();
|
void unpausePlugin();
|
||||||
void pauseFunction( int id );
|
void pauseFunction(int id);
|
||||||
void unpauseFunction( int id );
|
void unpauseFunction(int id);
|
||||||
void setStatus( int a );
|
void setStatus(int a);
|
||||||
|
|
||||||
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(); }
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
CPlugin* findPluginFast(AMX *amx);
|
CPlugin* findPluginFast(AMX *amx);
|
||||||
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 +142,9 @@ 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); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif //PLUGIN_H
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,14 +45,17 @@ public:
|
|||||||
item = i;
|
item = i;
|
||||||
next = n;
|
next = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
CQueueItem *GetNext()
|
CQueueItem *GetNext()
|
||||||
{
|
{
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
T & GetItem()
|
T & GetItem()
|
||||||
{
|
{
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetNext(CQueueItem *n)
|
void SetNext(CQueueItem *n)
|
||||||
{
|
{
|
||||||
next = n;
|
next = n;
|
||||||
@ -71,7 +74,7 @@ public:
|
|||||||
|
|
||||||
bool empty()
|
bool empty()
|
||||||
{
|
{
|
||||||
return ((mSize==0)?true:false);
|
return ((mSize == 0) ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void push(const T &v)
|
void push(const T &v)
|
||||||
@ -119,8 +122,8 @@ public:
|
|||||||
private:
|
private:
|
||||||
CQueueItem *mFirst;
|
CQueueItem *mFirst;
|
||||||
CQueueItem *mLast;
|
CQueueItem *mLast;
|
||||||
|
|
||||||
unsigned int mSize;
|
unsigned int mSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //_INCLUDE_CQUEUE_H
|
#endif //_INCLUDE_CQUEUE_H
|
||||||
|
|
||||||
|
105
amxmodx/CStack.h
Executable file
105
amxmodx/CStack.h
Executable file
@ -0,0 +1,105 @@
|
|||||||
|
/* 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_CSTACK_H
|
||||||
|
#define _INCLUDE_CSTACK_H
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
class CStack
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct CStackItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
T item;
|
||||||
|
CStackItem *prev;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
CStack()
|
||||||
|
{
|
||||||
|
mSize = 0;
|
||||||
|
mStack = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
~CStack()
|
||||||
|
{
|
||||||
|
CStackItem *p, *t;
|
||||||
|
p = mStack;
|
||||||
|
|
||||||
|
while (p)
|
||||||
|
{
|
||||||
|
t = p->prev;
|
||||||
|
delete p;
|
||||||
|
p = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
mStack = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool empty()
|
||||||
|
{
|
||||||
|
return (mSize == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void push(const T & v)
|
||||||
|
{
|
||||||
|
CStackItem *p = new CStackItem;
|
||||||
|
p->item = v;
|
||||||
|
p->prev = mStack;
|
||||||
|
mStack = p;
|
||||||
|
mSize++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pop()
|
||||||
|
{
|
||||||
|
CStackItem *p = mStack;
|
||||||
|
mStack = p->prev;
|
||||||
|
delete p;
|
||||||
|
mSize--;
|
||||||
|
}
|
||||||
|
|
||||||
|
T & top()
|
||||||
|
{
|
||||||
|
return mStack->item;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size()
|
||||||
|
{
|
||||||
|
return mSize;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
CStackItem *mStack;
|
||||||
|
size_t mSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_CQUEUE_H
|
@ -32,6 +32,9 @@
|
|||||||
#ifndef _INCLUDE_CSTRING_H
|
#ifndef _INCLUDE_CSTRING_H
|
||||||
#define _INCLUDE_CSTRING_H
|
#define _INCLUDE_CSTRING_H
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
//by David "BAILOPAN" Anderson
|
//by David "BAILOPAN" Anderson
|
||||||
class String
|
class String
|
||||||
{
|
{
|
||||||
@ -39,10 +42,8 @@ public:
|
|||||||
String()
|
String()
|
||||||
{
|
{
|
||||||
v = NULL;
|
v = NULL;
|
||||||
mSize = 0;
|
a_size = 0;
|
||||||
cSize = 0;
|
//assign("");
|
||||||
Grow(2);
|
|
||||||
assign("");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~String()
|
~String()
|
||||||
@ -54,41 +55,45 @@ public:
|
|||||||
String(const char *src)
|
String(const char *src)
|
||||||
{
|
{
|
||||||
v = NULL;
|
v = NULL;
|
||||||
mSize = 0;
|
a_size = 0;
|
||||||
cSize = 0; assign(src);
|
assign(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * _fread(FILE *fp)
|
||||||
|
{
|
||||||
|
Grow(512, false);
|
||||||
|
char *ret = fgets(v, 511, fp);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
String(String &src)
|
String(String &src)
|
||||||
{
|
{
|
||||||
v = NULL;
|
v = NULL;
|
||||||
mSize = 0;
|
a_size = 0;
|
||||||
cSize = 0;
|
|
||||||
assign(src.c_str());
|
assign(src.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *c_str() { return v?v:""; }
|
const char *c_str() { return v?v:""; }
|
||||||
|
|
||||||
const char *c_str() const { return v?v:""; }
|
const char *c_str() const { return v?v:""; }
|
||||||
|
|
||||||
void append(const char *t)
|
void append(const char *t)
|
||||||
{
|
{
|
||||||
Grow(cSize + strlen(t));
|
Grow(size() + strlen(t) + 1);
|
||||||
strcat(v, t);
|
strcat(v, t);
|
||||||
cSize = strlen(v);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void append(const char c)
|
void append(const char c)
|
||||||
{
|
{
|
||||||
Grow(cSize + 2);
|
size_t len = size();
|
||||||
v[cSize] = c;
|
Grow(len + 2);
|
||||||
v[++cSize] = 0;
|
v[len] = c;
|
||||||
|
v[len + 1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
void append(String &d)
|
void append(String &d)
|
||||||
{
|
{
|
||||||
const char *t = d.c_str();
|
append(d.c_str());
|
||||||
Grow(cSize + strlen(t));
|
|
||||||
strcat(v, t);
|
|
||||||
cSize = strlen(v);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void assign(const String &src)
|
void assign(const String &src)
|
||||||
@ -100,79 +105,56 @@ public:
|
|||||||
{
|
{
|
||||||
if (!d)
|
if (!d)
|
||||||
{
|
{
|
||||||
Grow(1);
|
clear();
|
||||||
cSize = 0;
|
|
||||||
strcpy(v, "");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Grow(strlen(d));
|
|
||||||
if (v)
|
|
||||||
{
|
|
||||||
strcpy(v, d);
|
|
||||||
cSize = strlen(v);
|
|
||||||
} else {
|
} else {
|
||||||
cSize = 0;
|
Grow(strlen(d) + 1, false);
|
||||||
|
strcpy(v, d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
if (v)
|
if (v)
|
||||||
{
|
v[0] = '\0';
|
||||||
v[0] = 0;
|
|
||||||
cSize = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int compare (const char *d)
|
int compare (const char *d)
|
||||||
{
|
{
|
||||||
if (v) {
|
if (!v)
|
||||||
if (d) {
|
return strcmp("", d);
|
||||||
return strcmp(v, d);
|
else
|
||||||
} else {
|
return strcmp(v, d);
|
||||||
return strlen(v);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (d) {
|
|
||||||
return strlen(d);
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Added this for amxx inclusion
|
//Added this for amxx inclusion
|
||||||
bool empty()
|
bool empty()
|
||||||
{
|
{
|
||||||
if (!v || !cSize)
|
if (!v)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (v[0] == '\0')
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int size()
|
size_t size()
|
||||||
{
|
{
|
||||||
if (!v)
|
if (v)
|
||||||
|
return strlen(v);
|
||||||
|
else
|
||||||
return 0;
|
return 0;
|
||||||
return cSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char * _fread(FILE *fp)
|
|
||||||
{
|
|
||||||
Grow(512);
|
|
||||||
char * ret = fgets(v, 511, fp);
|
|
||||||
cSize = strlen(v);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int find(const char c, int index = 0)
|
int find(const char c, int index = 0)
|
||||||
{
|
{
|
||||||
if (!v)
|
size_t len = size();
|
||||||
|
if (len < 1)
|
||||||
return npos;
|
return npos;
|
||||||
if (index >= (int)cSize || index < 0)
|
if (index >= (int)len || index < 0)
|
||||||
return npos;
|
return npos;
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
for (i=index; i<cSize; i++)
|
for (i=index; i<(int)len; i++)
|
||||||
{
|
{
|
||||||
if (v[i] == c)
|
if (v[i] == c)
|
||||||
{
|
{
|
||||||
@ -187,7 +169,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (c == '\f' || c == '\n' ||
|
if (c == '\f' || c == '\n' ||
|
||||||
c == '\t' || c == '\r' ||
|
c == '\t' || c == '\r' ||
|
||||||
c == 'v' || c == ' ')
|
c == '\v' || c == ' ')
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -199,10 +181,12 @@ public:
|
|||||||
{
|
{
|
||||||
if (!v)
|
if (!v)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
unsigned int j = 0;
|
unsigned int j = 0;
|
||||||
|
size_t len = strlen(v);
|
||||||
|
|
||||||
if (cSize == 1)
|
if (len == 1)
|
||||||
{
|
{
|
||||||
if (is_space(v[i]))
|
if (is_space(v[i]))
|
||||||
{
|
{
|
||||||
@ -215,9 +199,9 @@ public:
|
|||||||
|
|
||||||
if (is_space(c0))
|
if (is_space(c0))
|
||||||
{
|
{
|
||||||
for (i=0; i<cSize; i++)
|
for (i=0; i<len; i++)
|
||||||
{
|
{
|
||||||
if (!is_space(v[i]) || (is_space(v[i]) && ((unsigned char)i==cSize-1)))
|
if (!is_space(v[i]) || (is_space(v[i]) && ((unsigned char)i==len-1)))
|
||||||
{
|
{
|
||||||
erase(0, i);
|
erase(0, i);
|
||||||
break;
|
break;
|
||||||
@ -225,16 +209,16 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cSize = strlen(v);
|
len = strlen(v);
|
||||||
|
|
||||||
if (cSize < 1)
|
if (len < 1)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_space(v[cSize-1]))
|
if (is_space(v[len-1]))
|
||||||
{
|
{
|
||||||
for (i=cSize-1; i>=0; i--)
|
for (i=len-1; i>=0; i--)
|
||||||
{
|
{
|
||||||
if (!is_space(v[i])
|
if (!is_space(v[i])
|
||||||
|| (is_space(v[i]) && i==0))
|
|| (is_space(v[i]) && i==0))
|
||||||
@ -246,7 +230,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cSize == 1)
|
if (len == 1)
|
||||||
{
|
{
|
||||||
if (is_space(v[0]))
|
if (is_space(v[0]))
|
||||||
{
|
{
|
||||||
@ -256,21 +240,22 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String & erase(unsigned int start, int num = npos)
|
void erase(unsigned int start, int num = npos)
|
||||||
{
|
{
|
||||||
if (!v)
|
if (!v)
|
||||||
return (*this);
|
return;
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
|
size_t len = size();
|
||||||
//check for bounds
|
//check for bounds
|
||||||
if (num == npos || start+num > cSize-num+1)
|
if (num == npos || start+num > len-num+1)
|
||||||
num = cSize - start;
|
num = len - start;
|
||||||
//do the erasing
|
//do the erasing
|
||||||
bool copyflag = false;
|
bool copyflag = false;
|
||||||
for (i=0; i<cSize; i++)
|
for (i=0; i<len; i++)
|
||||||
{
|
{
|
||||||
if (i>=start && i<start+num)
|
if (i>=start && i<start+num)
|
||||||
{
|
{
|
||||||
if (i+num < cSize)
|
if (i+num < len)
|
||||||
{
|
{
|
||||||
v[i] = v[i+num];
|
v[i] = v[i+num];
|
||||||
} else {
|
} else {
|
||||||
@ -278,7 +263,7 @@ public:
|
|||||||
}
|
}
|
||||||
copyflag = true;
|
copyflag = true;
|
||||||
} else if (copyflag) {
|
} else if (copyflag) {
|
||||||
if (i+num < cSize)
|
if (i+num < len)
|
||||||
{
|
{
|
||||||
v[i] = v[i+num];
|
v[i] = v[i+num];
|
||||||
} else {
|
} else {
|
||||||
@ -286,38 +271,39 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cSize -= num;
|
len -= num;
|
||||||
v[cSize] = 0;
|
v[len] = 0;
|
||||||
|
|
||||||
return (*this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String substr(unsigned int index, int num = npos)
|
String substr(unsigned int index, int num = npos)
|
||||||
{
|
{
|
||||||
|
if (!v)
|
||||||
|
{
|
||||||
|
String b("");
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
String ns;
|
String ns;
|
||||||
|
|
||||||
if (index >= cSize || !v)
|
size_t len = size();
|
||||||
|
|
||||||
|
if (index >= len || !v)
|
||||||
return ns;
|
return ns;
|
||||||
|
|
||||||
if (num == npos)
|
if (num == npos)
|
||||||
{
|
{
|
||||||
num = cSize - index;
|
num = len - index;
|
||||||
} else if (index+num >= cSize) {
|
} else if (index+num >= len) {
|
||||||
num = cSize - index;
|
num = len - index;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int i = 0, j=0;
|
unsigned int i = 0, j=0;
|
||||||
char *s = new char[cSize+1];
|
unsigned int nslen = num + 2;
|
||||||
|
|
||||||
|
ns.Grow(nslen);
|
||||||
|
|
||||||
for (i=index; i<index+num; i++)
|
for (i=index; i<index+num; i++)
|
||||||
{
|
ns.append(v[i]);
|
||||||
s[j++] = v[i];
|
|
||||||
}
|
|
||||||
s[j] = 0;
|
|
||||||
|
|
||||||
ns.assign(s);
|
|
||||||
|
|
||||||
delete [] s;
|
|
||||||
|
|
||||||
return ns;
|
return ns;
|
||||||
}
|
}
|
||||||
@ -327,10 +313,11 @@ public:
|
|||||||
if (!v)
|
if (!v)
|
||||||
return;
|
return;
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
for (i=0; i<cSize; i++)
|
size_t len = strlen(v);
|
||||||
|
for (i=0; i<len; i++)
|
||||||
{
|
{
|
||||||
if (v[i] >= 65 && v[i] <= 90)
|
if (v[i] >= 65 && v[i] <= 90)
|
||||||
v[i] |= 32;
|
v[i] &= ~(1<<5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,7 +336,7 @@ public:
|
|||||||
|
|
||||||
char operator [] (unsigned int index)
|
char operator [] (unsigned int index)
|
||||||
{
|
{
|
||||||
if (index > cSize)
|
if (index > size() || !v)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
@ -359,7 +346,7 @@ public:
|
|||||||
|
|
||||||
int at(int a)
|
int at(int a)
|
||||||
{
|
{
|
||||||
if (a < 0 || a >= (int)cSize)
|
if (a < 0 || a >= (int)size() || !v)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return v[a];
|
return v[a];
|
||||||
@ -367,7 +354,7 @@ public:
|
|||||||
|
|
||||||
bool at(int at, char c)
|
bool at(int at, char c)
|
||||||
{
|
{
|
||||||
if (at < 0 || at >= (int)cSize)
|
if (at < 0 || at >= (int)size() || !v)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
v[at] = c;
|
v[at] = c;
|
||||||
@ -376,27 +363,23 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Grow(unsigned int d)
|
void Grow(unsigned int d, bool copy=true)
|
||||||
{
|
{
|
||||||
if (d<1)
|
if (d <= a_size)
|
||||||
return;
|
return;
|
||||||
if (d > mSize)
|
char *n = new char[d + 1];
|
||||||
{
|
if (copy && v)
|
||||||
mSize = d + 16; // allocate a buffer
|
strcpy(n, v);
|
||||||
char *t = new char[d+1];
|
if (v)
|
||||||
if (v) {
|
delete [] v;
|
||||||
strcpy(t, v);
|
else
|
||||||
t[cSize] = 0;
|
strcpy(n, "");
|
||||||
delete [] v;
|
v = n;
|
||||||
}
|
a_size = d + 1;
|
||||||
v = t;
|
|
||||||
mSize = d;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *v;
|
char *v;
|
||||||
unsigned int mSize;
|
unsigned int a_size;
|
||||||
unsigned int cSize;
|
|
||||||
public:
|
public:
|
||||||
static const int npos = -1;
|
static const int npos = -1;
|
||||||
};
|
};
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "CTask.h"
|
#include "CTask.h"
|
||||||
|
|
||||||
/*********************** CTask ***********************/
|
/*********************** CTask ***********************/
|
||||||
|
|
||||||
int CTaskMngr::CTask::getTaskId() const
|
int CTaskMngr::CTask::getTaskId() const
|
||||||
{
|
{
|
||||||
return m_iId;
|
return m_iId;
|
||||||
@ -45,6 +46,7 @@ CPluginMngr::CPlugin *CTaskMngr::CTask::getPlugin() const
|
|||||||
|
|
||||||
void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime)
|
void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime)
|
||||||
{
|
{
|
||||||
|
clear();
|
||||||
m_bFree = false;
|
m_bFree = false;
|
||||||
|
|
||||||
m_pPlugin = pPlugin;
|
m_pPlugin = pPlugin;
|
||||||
@ -52,23 +54,29 @@ void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags,
|
|||||||
m_iId = iId;
|
m_iId = iId;
|
||||||
m_fBase = fBase;
|
m_fBase = fBase;
|
||||||
|
|
||||||
m_iRepeat = (iFlags & 1) ? iRepeat : 0;
|
if (iFlags & 2)
|
||||||
m_bLoop = (iFlags & 2) ? true : false;
|
{
|
||||||
m_bAfterStart = (iFlags & 4) ? true : false;
|
m_bLoop = true;
|
||||||
m_bBeforeEnd = (iFlags & 8) ? true : false;
|
m_iRepeat = -1;
|
||||||
|
}
|
||||||
|
else if (iFlags & 1)
|
||||||
|
{
|
||||||
|
m_bLoop = true;
|
||||||
|
m_iRepeat = iRepeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_bAfterStart = (iFlags & 4) ? true : false;
|
||||||
|
m_bBeforeEnd = (iFlags & 8) ? true : false;
|
||||||
|
|
||||||
m_fNextExecTime = fCurrentTime + m_fBase;
|
m_fNextExecTime = fCurrentTime + m_fBase;
|
||||||
|
|
||||||
if (iParamsLen)
|
if (iParamsLen)
|
||||||
{
|
{
|
||||||
// also add a cell to the back with the value 0
|
|
||||||
m_iParamLen = iParamsLen + 1;
|
m_iParamLen = iParamsLen + 1;
|
||||||
m_pParams = new cell[m_iParamLen];
|
m_pParams = new cell[m_iParamLen];
|
||||||
memcpy(m_pParams, pParams, sizeof(cell)*iParamsLen);
|
memcpy(m_pParams, pParams, sizeof(cell)*iParamsLen);
|
||||||
m_pParams[iParamsLen] = 0;
|
m_pParams[iParamsLen] = 0;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
m_iParamLen = 0;
|
m_iParamLen = 0;
|
||||||
m_pParams = NULL;
|
m_pParams = NULL;
|
||||||
}
|
}
|
||||||
@ -77,8 +85,29 @@ void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags,
|
|||||||
void CTaskMngr::CTask::clear()
|
void CTaskMngr::CTask::clear()
|
||||||
{
|
{
|
||||||
m_bFree = true;
|
m_bFree = true;
|
||||||
|
|
||||||
|
if (m_iFunc >= 0)
|
||||||
|
{
|
||||||
|
unregisterSPForward(m_iFunc);
|
||||||
|
m_iFunc = -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_pParams)
|
if (m_pParams)
|
||||||
|
{
|
||||||
delete [] 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
|
bool CTaskMngr::CTask::isFree() const
|
||||||
@ -98,7 +127,9 @@ void CTaskMngr::CTask::resetNextExecTime(float fCurrentTime)
|
|||||||
|
|
||||||
void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft)
|
void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft)
|
||||||
{
|
{
|
||||||
bool execute=false;
|
bool execute = false;
|
||||||
|
bool done = false;
|
||||||
|
|
||||||
if (m_bAfterStart)
|
if (m_bAfterStart)
|
||||||
{
|
{
|
||||||
if (fCurrentTime - fTimeLeft + 1.0f >= m_fBase)
|
if (fCurrentTime - fTimeLeft + 1.0f >= m_fBase)
|
||||||
@ -110,42 +141,41 @@ void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, f
|
|||||||
execute = true;
|
execute = true;
|
||||||
}
|
}
|
||||||
else if (m_fNextExecTime <= fCurrentTime)
|
else if (m_fNextExecTime <= fCurrentTime)
|
||||||
|
{
|
||||||
execute = true;
|
execute = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (execute)
|
if (execute)
|
||||||
{
|
{
|
||||||
if (m_pPlugin->isExecutable(m_iFunc))
|
//only bother calling if we have something to call
|
||||||
|
if (!(m_bLoop && !m_iRepeat))
|
||||||
{
|
{
|
||||||
int err;
|
|
||||||
if (m_iParamLen) // call with parameters
|
if (m_iParamLen) // call with parameters
|
||||||
{
|
{
|
||||||
cell amx_addr, *phys_addr;
|
cell arr = prepareCellArray(m_pParams, m_iParamLen);
|
||||||
if (amx_Allot(m_pPlugin->getAMX(), m_iParamLen, &amx_addr, &phys_addr) != AMX_ERR_NONE)
|
executeForwards(m_iFunc, arr, m_iId);
|
||||||
AMXXLOG_Log("[AMXX] Failed to allocate AMX memory (task \"%d\") (plugin \"%s\")", m_iId, m_pPlugin->getName());
|
} else {
|
||||||
else
|
executeForwards(m_iFunc, m_iId);
|
||||||
{
|
|
||||||
copy_amxmemory(phys_addr, m_pParams, m_iParamLen);
|
|
||||||
if ((err = amx_Exec(m_pPlugin->getAMX(), NULL, m_iFunc, 2, amx_addr, m_iId)) != AMX_ERR_NONE)
|
|
||||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (task \"%d\") (plugin \"%s\")", err, m_pPlugin->getAMX()->curline, m_iId, m_pPlugin->getName());
|
|
||||||
|
|
||||||
amx_Release(m_pPlugin->getAMX(), amx_addr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((err = amx_Exec(m_pPlugin->getAMX(), NULL, m_iFunc, 1, m_iId)) != AMX_ERR_NONE)
|
|
||||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (task \"%d\") (plugin \"%s\")", err, m_pPlugin->getAMX()->curline, m_iId, m_pPlugin->getName());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isFree())
|
||||||
|
return;
|
||||||
|
|
||||||
// set new exec time OR remove the task if needed
|
// set new exec time OR remove the task if needed
|
||||||
if (m_bLoop || (--m_iRepeat > 0))
|
if (m_bLoop)
|
||||||
{
|
{
|
||||||
m_fNextExecTime += m_fBase;
|
if (m_iRepeat != -1 && --m_iRepeat <= 0)
|
||||||
|
done = true;
|
||||||
|
} else {
|
||||||
|
done = true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (done)
|
||||||
{
|
{
|
||||||
m_bFree = true;
|
clear();
|
||||||
|
} else {
|
||||||
|
m_fNextExecTime += m_fBase;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -153,6 +183,21 @@ void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, f
|
|||||||
CTaskMngr::CTask::CTask()
|
CTaskMngr::CTask::CTask()
|
||||||
{
|
{
|
||||||
m_bFree = true;
|
m_bFree = true;
|
||||||
|
|
||||||
|
m_pPlugin = NULL;
|
||||||
|
m_iFunc = -1;
|
||||||
|
m_iId = 0;
|
||||||
|
m_fBase = 0.0f;
|
||||||
|
|
||||||
|
m_iRepeat = 0;
|
||||||
|
m_bLoop = false;
|
||||||
|
m_bAfterStart = false;
|
||||||
|
m_bBeforeEnd = false;
|
||||||
|
|
||||||
|
m_fNextExecTime = 0.0f;
|
||||||
|
|
||||||
|
m_iParamLen = 0;
|
||||||
|
m_pParams = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTaskMngr::CTask::~CTask()
|
CTaskMngr::CTask::~CTask()
|
||||||
@ -161,6 +206,7 @@ CTaskMngr::CTask::~CTask()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*********************** CTaskMngr ***********************/
|
/*********************** CTaskMngr ***********************/
|
||||||
|
|
||||||
CTaskMngr::CTaskMngr()
|
CTaskMngr::CTaskMngr()
|
||||||
{
|
{
|
||||||
m_pTmr_CurrentTime = NULL;
|
m_pTmr_CurrentTime = NULL;
|
||||||
@ -168,6 +214,11 @@ CTaskMngr::CTaskMngr()
|
|||||||
m_pTmr_TimeLeft = NULL;
|
m_pTmr_TimeLeft = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CTaskMngr::~CTaskMngr()
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
|
||||||
void CTaskMngr::registerTimers(float *pCurrentTime, float *pTimeLimit, float *pTimeLeft)
|
void CTaskMngr::registerTimers(float *pCurrentTime, float *pTimeLimit, float *pTimeLeft)
|
||||||
{
|
{
|
||||||
m_pTmr_CurrentTime = pCurrentTime;
|
m_pTmr_CurrentTime = pCurrentTime;
|
||||||
@ -179,17 +230,18 @@ void CTaskMngr::registerTask(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlag
|
|||||||
{
|
{
|
||||||
// first, search for free tasks
|
// first, search for free tasks
|
||||||
TaskListIter iter = m_Tasks.find(CTaskDescriptor(0, NULL, true));
|
TaskListIter iter = m_Tasks.find(CTaskDescriptor(0, NULL, true));
|
||||||
|
|
||||||
if (iter)
|
if (iter)
|
||||||
{
|
{
|
||||||
// found: reuse it
|
// found: reuse it
|
||||||
iter->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
|
iter->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// not found: make a new one
|
// not found: make a new one
|
||||||
CTask *pTmp = new CTask;
|
CTask *pTmp = new CTask;
|
||||||
|
|
||||||
if (!pTmp)
|
if (!pTmp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pTmp->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
|
pTmp->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
|
||||||
m_Tasks.put(pTmp);
|
m_Tasks.put(pTmp);
|
||||||
}
|
}
|
||||||
@ -199,13 +251,15 @@ int CTaskMngr::removeTasks(int iId, AMX *pAmx)
|
|||||||
{
|
{
|
||||||
CTaskDescriptor descriptor(iId, pAmx);
|
CTaskDescriptor descriptor(iId, pAmx);
|
||||||
TaskListIter iter = m_Tasks.find(descriptor);
|
TaskListIter iter = m_Tasks.find(descriptor);
|
||||||
int i=0;
|
int i = 0;
|
||||||
|
|
||||||
while (iter)
|
while (iter)
|
||||||
{
|
{
|
||||||
iter->clear();
|
iter->clear();
|
||||||
++i;
|
++i;
|
||||||
iter = m_Tasks.find(++iter, descriptor);
|
iter = m_Tasks.find(++iter, descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,14 +267,16 @@ int CTaskMngr::changeTasks(int iId, AMX *pAmx, float fNewBase)
|
|||||||
{
|
{
|
||||||
CTaskDescriptor descriptor(iId, pAmx);
|
CTaskDescriptor descriptor(iId, pAmx);
|
||||||
TaskListIter iter = m_Tasks.find(descriptor);
|
TaskListIter iter = m_Tasks.find(descriptor);
|
||||||
int i=0;
|
int i = 0;
|
||||||
|
|
||||||
while (iter)
|
while (iter)
|
||||||
{
|
{
|
||||||
iter->changeBase(fNewBase);
|
iter->changeBase(fNewBase);
|
||||||
iter->resetNextExecTime(*m_pTmr_CurrentTime);
|
iter->resetNextExecTime(*m_pTmr_CurrentTime);
|
||||||
++i;
|
++i;
|
||||||
iter = m_Tasks.find(++iter, descriptor);
|
iter = m_Tasks.find(++iter, descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,34 +39,37 @@ private:
|
|||||||
class CTask
|
class CTask
|
||||||
{
|
{
|
||||||
// task settings
|
// task settings
|
||||||
|
|
||||||
CPluginMngr::CPlugin *m_pPlugin;
|
CPluginMngr::CPlugin *m_pPlugin;
|
||||||
int m_iId;
|
int m_iId;
|
||||||
int m_iFunc;
|
int m_iFunc;
|
||||||
int m_iRepeat;
|
int m_iRepeat;
|
||||||
|
|
||||||
bool m_bLoop;
|
bool m_bLoop;
|
||||||
bool m_bAfterStart;
|
bool m_bAfterStart;
|
||||||
bool m_bBeforeEnd;
|
bool m_bBeforeEnd;
|
||||||
float m_fBase; // for normal tasks, stores the interval, for the others, stores the amount of time before start / after end
|
float m_fBase; // for normal tasks, stores the interval, for the others, stores the amount of time before start / after end
|
||||||
int m_iParamLen;
|
int m_iParamLen;
|
||||||
|
|
||||||
cell *m_pParams;
|
cell *m_pParams;
|
||||||
bool m_bFree;
|
bool m_bFree;
|
||||||
|
|
||||||
// execution
|
// execution
|
||||||
float m_fNextExecTime;
|
float m_fNextExecTime;
|
||||||
public:
|
public:
|
||||||
inline void set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime);
|
void set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime);
|
||||||
inline void clear();
|
void clear();
|
||||||
inline bool isFree() const;
|
bool isFree() const;
|
||||||
|
|
||||||
inline CPluginMngr::CPlugin *getPlugin() const;
|
CPluginMngr::CPlugin *getPlugin() const;
|
||||||
inline int getTaskId() const;
|
int getTaskId() const;
|
||||||
|
|
||||||
inline void executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft); // also removes the task if needed
|
void executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft); // also removes the task if needed
|
||||||
|
|
||||||
inline void changeBase(float fNewBase);
|
void changeBase(float fNewBase);
|
||||||
inline void resetNextExecTime(float fCurrentTime);
|
void resetNextExecTime(float fCurrentTime);
|
||||||
|
|
||||||
inline bool shouldRepeat();
|
bool shouldRepeat();
|
||||||
|
|
||||||
CTask();
|
CTask();
|
||||||
~CTask();
|
~CTask();
|
||||||
@ -91,31 +94,32 @@ private:
|
|||||||
if (right.m_bFree)
|
if (right.m_bFree)
|
||||||
return left.isFree();
|
return left.isFree();
|
||||||
|
|
||||||
return !left.isFree() &&
|
return !left.isFree() && (right.m_pAmx ? left.getPlugin()->getAMX() == right.m_pAmx : true) && left.getTaskId() == right.m_iId;
|
||||||
(right.m_pAmx ? left.getPlugin()->getAMX() == right.m_pAmx : true) &&
|
|
||||||
left.getTaskId() == right.m_iId;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*** CTaskMngr priv members ***/
|
/*** CTaskMngr priv members ***/
|
||||||
typedef CList<CTask, CTaskDescriptor> TaskList;
|
typedef CList<CTask, CTaskDescriptor> TaskList;
|
||||||
typedef TaskList::iterator TaskListIter;
|
typedef TaskList::iterator TaskListIter;
|
||||||
|
|
||||||
TaskList m_Tasks;
|
TaskList m_Tasks;
|
||||||
|
|
||||||
float *m_pTmr_CurrentTime;
|
float *m_pTmr_CurrentTime;
|
||||||
float *m_pTmr_TimeLimit;
|
float *m_pTmr_TimeLimit;
|
||||||
float *m_pTmr_TimeLeft;
|
float *m_pTmr_TimeLeft;
|
||||||
public:
|
public:
|
||||||
CTaskMngr();
|
CTaskMngr();
|
||||||
|
~CTaskMngr();
|
||||||
|
|
||||||
void registerTimers(float *pCurrentTime, float *pTimeLimit, float *pTimeLeft); // The timers will always point to the right value
|
void registerTimers(float *pCurrentTime, float *pTimeLimit, float *pTimeLeft); // The timers will always point to the right value
|
||||||
void registerTask(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat);
|
void registerTask(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat);
|
||||||
int removeTasks(int iId, AMX *pAmx); // remove all tasks that match the id and amx
|
|
||||||
int changeTasks(int iId, AMX *pAmx, float fNewBase); // change all tasks that match the id and amx
|
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);
|
bool taskExists(int iId, AMX *pAmx);
|
||||||
|
|
||||||
void startFrame();
|
void startFrame();
|
||||||
void clear();
|
void clear();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif //CTASK_H
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,46 +39,47 @@
|
|||||||
// *****************************************************
|
// *****************************************************
|
||||||
// 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.assign(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.c_str(), n) == 0 )
|
if (strcmp((*a)->key.c_str(), n) == 0)
|
||||||
return a;
|
return a;
|
||||||
|
|
||||||
a = &(*a)->next;
|
a = &(*a)->next;
|
||||||
@ -88,90 +89,89 @@ 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.c_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;
|
||||||
head = a;
|
head = a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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.assign(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.c_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.c_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;
|
||||||
|
@ -41,53 +41,55 @@
|
|||||||
|
|
||||||
class Vault
|
class Vault
|
||||||
{
|
{
|
||||||
struct Obj
|
struct Obj
|
||||||
{
|
{
|
||||||
String key;
|
String key;
|
||||||
String value;
|
String value;
|
||||||
int number;
|
|
||||||
Obj *next;
|
|
||||||
Obj( const char* k, const char* v);
|
|
||||||
} *head;
|
|
||||||
|
|
||||||
String path;
|
int number;
|
||||||
|
Obj *next;
|
||||||
|
Obj(const char* k, const char* v);
|
||||||
|
} *head;
|
||||||
|
|
||||||
Obj** find( const char* n );
|
String path;
|
||||||
|
|
||||||
|
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 remove( const char* k );
|
|
||||||
const char* get( const char* n );
|
|
||||||
int get_number( const char* n );
|
|
||||||
void setSource( const char* n );
|
|
||||||
bool loadVault( );
|
|
||||||
bool saveVault( );
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
|
void put(const char* k, const char* v);
|
||||||
|
void remove(const char* k);
|
||||||
|
|
||||||
class iterator {
|
const char* get(const char* n);
|
||||||
Obj * a;
|
int get_number(const char* n);
|
||||||
public:
|
void setSource(const char* n);
|
||||||
iterator(Obj*aa) : a(aa) {}
|
|
||||||
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 !operator==(b); }
|
|
||||||
String& key() const { return a->key; }
|
|
||||||
String& value() const { return a->value; }
|
|
||||||
};
|
|
||||||
|
|
||||||
inline iterator begin() const { return iterator(head); }
|
bool loadVault();
|
||||||
inline iterator end() const { return iterator(0); }
|
bool saveVault();
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
class iterator
|
||||||
|
{
|
||||||
|
Obj * a;
|
||||||
|
public:
|
||||||
|
iterator(Obj* aa) : a(aa) {}
|
||||||
|
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 !operator==(b); }
|
||||||
|
String& key() const { return a->key; }
|
||||||
|
String& value() const { return a->value; }
|
||||||
|
};
|
||||||
|
|
||||||
|
inline iterator begin() const { return iterator(head); }
|
||||||
|
inline iterator end() const { return iterator(0); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif //VAULT_CUSTOM_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,6 +32,8 @@
|
|||||||
#ifndef __CVECTOR_H__
|
#ifndef __CVECTOR_H__
|
||||||
#define __CVECTOR_H__
|
#define __CVECTOR_H__
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
// Vector
|
// Vector
|
||||||
template <class T> class CVector
|
template <class T> class CVector
|
||||||
{
|
{
|
||||||
@ -46,7 +48,8 @@ template <class T> class CVector
|
|||||||
return false;
|
return false;
|
||||||
if (m_Data)
|
if (m_Data)
|
||||||
{
|
{
|
||||||
memcpy(newData, m_Data, m_Size * sizeof(T));
|
for (size_t i=0; i<m_CurrentUsedSize; i++)
|
||||||
|
newData[i] = m_Data[i];
|
||||||
delete [] m_Data;
|
delete [] m_Data;
|
||||||
}
|
}
|
||||||
m_Data = newData;
|
m_Data = newData;
|
||||||
@ -67,30 +70,58 @@ template <class T> class CVector
|
|||||||
// change size
|
// change size
|
||||||
if (size == m_Size)
|
if (size == m_Size)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (!size)
|
||||||
|
{
|
||||||
|
if (m_Data)
|
||||||
|
{
|
||||||
|
delete [] m_Data;
|
||||||
|
m_Data = NULL;
|
||||||
|
m_Size = 0;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
T *newData = new T[size];
|
T *newData = new T[size];
|
||||||
if (!newData)
|
if (!newData)
|
||||||
return false;
|
return false;
|
||||||
if (m_Data)
|
if (m_Data)
|
||||||
{
|
{
|
||||||
memcpy(newData, m_Data, (m_Size < size) ? (m_Size * sizeof(T)) : (size * sizeof(T)));
|
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;
|
delete [] m_Data;
|
||||||
}
|
}
|
||||||
if (m_Size < size)
|
|
||||||
m_CurrentSize = size;
|
|
||||||
m_Data = newData;
|
m_Data = newData;
|
||||||
m_Size = size;
|
m_Size = size;
|
||||||
|
if (m_CurrentUsedSize > m_Size)
|
||||||
|
m_CurrentUsedSize = m_Size;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FreeMemIfPossible()
|
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:
|
protected:
|
||||||
T *m_Data;
|
T *m_Data;
|
||||||
size_t m_Size;
|
size_t m_Size;
|
||||||
size_t m_CurrentUsedSize;
|
size_t m_CurrentUsedSize;
|
||||||
size_t m_CurrentSize;
|
|
||||||
public:
|
public:
|
||||||
class iterator
|
class iterator
|
||||||
{
|
{
|
||||||
@ -184,7 +215,7 @@ public:
|
|||||||
|
|
||||||
iterator & operator-=(size_t offset)
|
iterator & operator-=(size_t offset)
|
||||||
{
|
{
|
||||||
m_Ptr += offset;
|
m_Ptr -= offset;
|
||||||
return (*this);
|
return (*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,7 +229,7 @@ public:
|
|||||||
iterator operator-(size_t offset) const
|
iterator operator-(size_t offset) const
|
||||||
{
|
{
|
||||||
iterator tmp(*this);
|
iterator tmp(*this);
|
||||||
tmp.m_Ptr += offset;
|
tmp.m_Ptr -= offset;
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,10 +280,11 @@ public:
|
|||||||
CVector<T>(const CVector<T> & other)
|
CVector<T>(const CVector<T> & other)
|
||||||
{
|
{
|
||||||
// copy data
|
// copy data
|
||||||
m_Data = new T [other.m_Size];
|
m_Data = new T [other.m_CurrentUsedSize];
|
||||||
m_Size = other.m_Size;
|
m_Size = other.m_CurrentUsedSize;
|
||||||
m_CurrentUsedSize = other.m_CurrentUsedSize;
|
m_CurrentUsedSize = other.m_CurrentUsedSize;
|
||||||
memcpy(m_Data, other.m_Data, m_CurrentUsedSize * sizeof(T));
|
for (size_t i=0; i<other.m_CurrentUsedSize; i++)
|
||||||
|
m_Data[i] = other.m_Data[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
~CVector<T>()
|
~CVector<T>()
|
||||||
@ -271,12 +303,12 @@ public:
|
|||||||
return m_Size;
|
return m_Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator begin()
|
iterator begin() const
|
||||||
{
|
{
|
||||||
return iterator(m_Data);
|
return iterator(m_Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator end()
|
iterator end() const
|
||||||
{
|
{
|
||||||
return iterator(m_Data + m_CurrentUsedSize);
|
return iterator(m_Data + m_CurrentUsedSize);
|
||||||
}
|
}
|
||||||
@ -284,13 +316,15 @@ public:
|
|||||||
iterator iterAt(size_t pos)
|
iterator iterAt(size_t pos)
|
||||||
{
|
{
|
||||||
if (pos > m_CurrentUsedSize)
|
if (pos > m_CurrentUsedSize)
|
||||||
ASSERT(0);
|
assert(0);
|
||||||
return iterator(m_Data + pos);
|
return iterator(m_Data + pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool reserve(size_t newSize)
|
bool reserve(size_t newSize)
|
||||||
{
|
{
|
||||||
return ChangeSize(newSize);
|
if (newSize > m_Size)
|
||||||
|
return ChangeSize(newSize);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool push_back(const T & elem)
|
bool push_back(const T & elem)
|
||||||
@ -311,14 +345,15 @@ public:
|
|||||||
--m_CurrentUsedSize;
|
--m_CurrentUsedSize;
|
||||||
if (m_CurrentUsedSize < 0)
|
if (m_CurrentUsedSize < 0)
|
||||||
m_CurrentUsedSize = 0;
|
m_CurrentUsedSize = 0;
|
||||||
// :TODO: free memory sometimes
|
|
||||||
|
FreeMemIfPossible();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool resize(size_t newSize)
|
bool resize(size_t newSize)
|
||||||
{
|
{
|
||||||
if (!ChangeSize(newSize))
|
if (!ChangeSize(newSize))
|
||||||
return false;
|
return false;
|
||||||
FreeMemIfPossible();
|
m_CurrentUsedSize = newSize;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,7 +366,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (pos > m_CurrentUsedSize)
|
if (pos > m_CurrentUsedSize)
|
||||||
{
|
{
|
||||||
ASSERT(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
return m_Data[pos];
|
return m_Data[pos];
|
||||||
}
|
}
|
||||||
@ -340,7 +375,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (pos > m_CurrentUsedSize)
|
if (pos > m_CurrentUsedSize)
|
||||||
{
|
{
|
||||||
ASSERT(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
return m_Data[pos];
|
return m_Data[pos];
|
||||||
}
|
}
|
||||||
@ -359,7 +394,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (m_CurrentUsedSize < 1)
|
if (m_CurrentUsedSize < 1)
|
||||||
{
|
{
|
||||||
ASSERT(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
return m_Data[0];
|
return m_Data[0];
|
||||||
}
|
}
|
||||||
@ -368,7 +403,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (m_CurrentUsedSize < 1)
|
if (m_CurrentUsedSize < 1)
|
||||||
{
|
{
|
||||||
ASSERT(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
return m_Data[0];
|
return m_Data[0];
|
||||||
}
|
}
|
||||||
@ -377,7 +412,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (m_CurrentUsedSize < 1)
|
if (m_CurrentUsedSize < 1)
|
||||||
{
|
{
|
||||||
ASSERT(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
return m_Data[m_CurrentUsedSize - 1];
|
return m_Data[m_CurrentUsedSize - 1];
|
||||||
}
|
}
|
||||||
@ -386,20 +421,18 @@ public:
|
|||||||
{
|
{
|
||||||
if (m_CurrentUsedSize < 1)
|
if (m_CurrentUsedSize < 1)
|
||||||
{
|
{
|
||||||
ASSERT(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
return m_Data[m_CurrentUsedSize - 1];
|
return m_Data[m_CurrentUsedSize - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool insert(iterator where, const T & value)
|
iterator insert(iterator where, const T & value)
|
||||||
{
|
{
|
||||||
// we have to insert before
|
|
||||||
// if it is begin, don't decrement
|
|
||||||
if (where != m_Data)
|
|
||||||
--where;
|
|
||||||
// validate iter
|
// validate iter
|
||||||
if (where < m_Data || where >= (m_Data + m_CurrentUsedSize))
|
if (where < m_Data || where > (m_Data + m_CurrentUsedSize))
|
||||||
return false;
|
return iterator(0);
|
||||||
|
|
||||||
|
size_t ofs = where - begin();
|
||||||
|
|
||||||
++m_CurrentUsedSize;
|
++m_CurrentUsedSize;
|
||||||
if (!GrowIfNeeded())
|
if (!GrowIfNeeded())
|
||||||
@ -408,33 +441,49 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
memmove(where.base() + 1, where.base(), m_CurrentUsedSize - (where - m_Data));
|
where = begin() + ofs;
|
||||||
memcpy(where.base(), &value, sizeof(T));
|
|
||||||
return true;
|
// Move subsequent entries
|
||||||
|
for (T *ptr = m_Data + m_CurrentUsedSize - 2; ptr >= where.base(); --ptr)
|
||||||
|
*(ptr + 1) = *ptr;
|
||||||
|
|
||||||
|
*where.base() = value;
|
||||||
|
|
||||||
|
return where;
|
||||||
}
|
}
|
||||||
|
|
||||||
void erase(iterator where)
|
iterator erase(iterator where)
|
||||||
{
|
{
|
||||||
// validate iter
|
// validate iter
|
||||||
if (where < m_Data || where >= (m_Data + m_CurrentUsedSize))
|
if (where < m_Data || where >= (m_Data + m_CurrentUsedSize))
|
||||||
return false;
|
return iterator(0);
|
||||||
|
|
||||||
|
size_t ofs = where - begin();
|
||||||
|
|
||||||
if (m_CurrentUsedSize > 1)
|
if (m_CurrentUsedSize > 1)
|
||||||
{
|
{
|
||||||
// move
|
// move
|
||||||
memmove(where.base(), where.base() + 1, m_CurrentUsedSize - 1);
|
T *theend = m_Data + m_CurrentUsedSize;
|
||||||
|
for (T *ptr = where.base() + 1; ptr < theend; ++ptr)
|
||||||
|
*(ptr - 1) = *ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
--m_CurrentUsedSize;
|
--m_CurrentUsedSize;
|
||||||
// :TODO: free memory sometimes
|
|
||||||
|
FreeMemIfPossible();
|
||||||
|
|
||||||
|
return begin() + ofs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
m_Size = 0;
|
m_Size = 0;
|
||||||
m_CurrentUsedSize = 0;
|
m_CurrentUsedSize = 0;
|
||||||
delete [] m_Data;
|
if (m_Data)
|
||||||
m_Data = NULL;
|
{
|
||||||
|
delete [] m_Data;
|
||||||
|
m_Data = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
BIN
amxmodx/JIT/amxexecn.o
Executable file
BIN
amxmodx/JIT/amxexecn.o
Executable file
Binary file not shown.
BIN
amxmodx/JIT/amxexecn.obj
Executable file
BIN
amxmodx/JIT/amxexecn.obj
Executable file
Binary file not shown.
BIN
amxmodx/JIT/amxjitsn.o
Executable file
BIN
amxmodx/JIT/amxjitsn.o
Executable file
Binary file not shown.
BIN
amxmodx/JIT/amxjitsn.obj
Executable file
BIN
amxmodx/JIT/amxjitsn.obj
Executable file
Binary file not shown.
@ -1,10 +0,0 @@
|
|||||||
LIBRARY jits
|
|
||||||
DESCRIPTION "JIT for AMX Mod X"
|
|
||||||
EXPORTS
|
|
||||||
asm_runJIT @1
|
|
||||||
getMaxCodeSize @2
|
|
||||||
amx_exec_asm @3
|
|
||||||
amx_opcodelist @4
|
|
||||||
SECTIONS
|
|
||||||
.data READ WRITE
|
|
||||||
.code EXECUTE
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
amxmodx/JIT/natives-amd64.o
Executable file
BIN
amxmodx/JIT/natives-amd64.o
Executable file
Binary file not shown.
BIN
amxmodx/JIT/natives-x86.o
Executable file
BIN
amxmodx/JIT/natives-x86.o
Executable file
Binary file not shown.
BIN
amxmodx/JIT/natives-x86.obj
Executable file
BIN
amxmodx/JIT/natives-x86.obj
Executable file
Binary file not shown.
160
amxmodx/Makefile
160
amxmodx/Makefile
@ -1,123 +1,95 @@
|
|||||||
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 \
|
|
||||||
amxcore.cpp amxtime.cpp power.cpp amxxlog.cpp fakemeta.cpp mmgr/mmgr.cpp \
|
|
||||||
amxxfile.cpp CLang.cpp md5.cpp amx.cpp
|
|
||||||
#use this for amd64, remove the above amx.cpp, and rename amx.cpp to amx.c
|
|
||||||
#CSRCFILES = amx.c minilzo/minilzo.c
|
|
||||||
CSRCFILES = minilzo/minilzo.c
|
|
||||||
|
|
||||||
EXTRA_LIBS_LINUX =
|
HLSDK = ../hlsdk/SourceCode
|
||||||
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 -funroll-loops -s -pipe
|
||||||
|
DEBUG_FLAGS = -g -ggdb3
|
||||||
|
CPP = gcc
|
||||||
|
NAME = amxmodx_mm
|
||||||
|
|
||||||
SDKTOP=../hlsdk
|
OBJECTS = meta_api.cpp CFile.cpp CVault.cpp vault.cpp float.cpp file.cpp modules.cpp \
|
||||||
METADIR=../metamod/metamod
|
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
|
||||||
|
|
||||||
|
LINK = -lz
|
||||||
|
|
||||||
SDKSRC=$(SDKTOP)/SourceCode
|
INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \
|
||||||
OBJDIR_LINUX=obj.linux
|
-I$(MM_ROOT) -Lzlib -I$(HLSDK)/common
|
||||||
OBJDIR_WIN32=obj.win32
|
|
||||||
SRCDIR=.
|
|
||||||
|
|
||||||
ifdef windir
|
ifeq "$(DEBUG)" "true"
|
||||||
OS=WIN32
|
BIN_DIR = Debug
|
||||||
|
CFLAGS = $(DEBUG_FLAGS)
|
||||||
else
|
else
|
||||||
OS=LINUX
|
BIN_DIR = Release
|
||||||
|
CFLAGS = $(OPT_FLAGS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CC_LINUX=gcc
|
ifeq "$(MMGR)" "true"
|
||||||
ifeq "$(OS)" "WIN32"
|
OBJECTS += mmgr/mmgr.cpp
|
||||||
CC_WIN32=gcc
|
CFLAGS += -DMEMORY_TEST
|
||||||
LD_WINDLL=dllwrap
|
|
||||||
DEFAULT=win32
|
|
||||||
CLEAN=clean_win32
|
|
||||||
else
|
|
||||||
CC_WIN32=/usr/local/cross-tools/i386-mingw32msvc/bin/gcc
|
|
||||||
LD_WINDLL=/usr/local/cross-tools/bin/i386-mingw32msvc-dllwrap
|
|
||||||
DEFAULT=linux win32
|
|
||||||
CLEAN=clean_both
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
CFLAGS += -DLINUX -DNDEBUG -fPIC -Wno-deprecated -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
|
||||||
|
|
||||||
#use this for AMD64
|
ifeq "$(AMD64)" "true"
|
||||||
#LIBFILE_LINUX = $(MODNAME)_amd64.so
|
BINARY = $(NAME)_amd64.so
|
||||||
LIBFILE_LINUX = $(MODNAME)_i386.so
|
CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64
|
||||||
LIBFILE_WIN32 = $(MODNAME).dll
|
OBJECTS += JIT/natives-amd64.o
|
||||||
TARGET_LINUX = $(OBJDIR_LINUX)/$(LIBFILE_LINUX)
|
|
||||||
TARGET_WIN32 = $(OBJDIR_WIN32)/$(LIBFILE_WIN32)
|
|
||||||
|
|
||||||
FILES_ALL = *.cpp *.h [A-Z]* *.rc
|
|
||||||
ifeq "$(OS)" "LINUX"
|
|
||||||
ASRCFILES := $(shell ls -t $(SRCFILES))
|
|
||||||
else
|
else
|
||||||
ASRCFILES := $(shell dir /b)
|
BINARY = $(NAME)_i386.so
|
||||||
|
OBJECTS += JIT/amxexecn.o JIT/amxjitsn.o JIT/natives-x86.o
|
||||||
|
CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32
|
||||||
|
OPT_FLAGS += -march=i686
|
||||||
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)
|
|
||||||
|
|
||||||
#use this for amd64
|
OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o)
|
||||||
#CCOPT = -m64 -g -ggdb3 -DHAVE_I64 -DSMALL_CELL_SIZE=64
|
|
||||||
CCOPT = -march=i386 -s -DNDEBUG -O2 -fomit-frame-pointer -fno-exceptions -fno-rtti -ffast math
|
|
||||||
|
|
||||||
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)
|
$(BIN_DIR)/%.o: %.cpp
|
||||||
CFLAGS=-Wall -Wno-unknown-pragmas
|
$(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $<
|
||||||
ODEF = -DOPT_TYPE=\"optimized\"
|
|
||||||
CFLAGS:=$(CCOPT) $(CFLAGS) $(ODEF) $(EXTRA_FLAGS)
|
|
||||||
|
|
||||||
DO_CC_LINUX=$(CC_LINUX) $(CFLAGS) -fPIC $(INCLUDEDIRS) -o $@ -c $<
|
all:
|
||||||
DO_CC_WIN32=$(CC_WIN32) $(CFLAGS) $(INCLUDEDIRS) -o $@ -c $<
|
mkdir -p $(BIN_DIR)
|
||||||
LINK_LINUX=$(CC_LINUX) $(CFLAGS) -shared -ldl -lm $(OBJ_LINUX) $(OBJC_LINUX) $(EXTRA_LIBDIRS_LINUX) $(EXTRA_LIBS_LINUX) -o $@
|
$(MAKE) amxmodx
|
||||||
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
|
amd64:
|
||||||
$(DO_CC_LINUX)
|
rm -f zlib/libz.a
|
||||||
|
$(MAKE) all AMD64=true
|
||||||
|
|
||||||
$(OBJDIR_LINUX)/%.o: $(SRCDIR)/%.cpp
|
amd64_mmgr:
|
||||||
$(DO_CC_LINUX)
|
rm -f zlib/libz.a
|
||||||
|
$(MAKE) all AMD64=true MMGR=true
|
||||||
|
|
||||||
$(OBJDIR_WIN32)/%.o: $(SRCDIR)/%.c
|
amd64_debug_mmgr:
|
||||||
$(DO_CC_WIN32)
|
rm -f zlib/libz.a
|
||||||
|
$(MAKE) all AMD64=true DEBUG=true MMGR=true
|
||||||
|
|
||||||
$(OBJDIR_WIN32)/%.o: $(SRCDIR)/%.cpp
|
amd64_debug:
|
||||||
$(DO_CC_WIN32)
|
rm -f zlib/libz.a
|
||||||
|
$(MAKE) all AMD64=true DEBUG=true
|
||||||
|
|
||||||
default: $(DEFAULT)
|
mmgr:
|
||||||
|
$(MAKE) all MMGR=true
|
||||||
|
|
||||||
$(TARGET_LINUX): $(OBJDIR_LINUX) $(OBJ_LINUX) $(OBJC_LINUX)
|
debug_mmgr:
|
||||||
$(LINK_LINUX)
|
$(MAKE) all MMGR=true DEBUG=true
|
||||||
|
|
||||||
$(TARGET_WIN32): $(OBJDIR_WIN32) $(OBJ_WIN32) $(OBJC_WIN32)
|
amxmodx: $(OBJ_LINUX)
|
||||||
$(LINK_WIN32)
|
$(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY)
|
||||||
|
|
||||||
$(OBJDIR_LINUX):
|
debug:
|
||||||
mkdir $@
|
$(MAKE) all DEBUG=true
|
||||||
mkdir $@/mmgr
|
|
||||||
|
|
||||||
$(OBJDIR_WIN32):
|
default: all
|
||||||
mkdir $@
|
|
||||||
mkdir $@/mmgr
|
|
||||||
|
|
||||||
win32: $(TARGET_WIN32)
|
|
||||||
|
|
||||||
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/$(BINARY)
|
||||||
|
rm -rf Debug/*.o
|
||||||
|
rm -rf Debug/$(BINARY)
|
||||||
|
|
||||||
|
@ -1,222 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
#(C)2004 AMX Mod X Development Team
|
|
||||||
# by David "BAILOPAN" Anderson
|
|
||||||
|
|
||||||
# output will occur in bin.x.proc
|
|
||||||
# where x is debug or opt and proc is ix86 or amd64
|
|
||||||
# You must use this script from the amxmodx src dir
|
|
||||||
|
|
||||||
#options =
|
|
||||||
# jit - use the JIT
|
|
||||||
# debug - enable gdb debugging
|
|
||||||
# amd64 - compile for AMD64 (impiles no jit)
|
|
||||||
# proc=ix86 - assumed not amd64
|
|
||||||
# clean - clean the specifications above
|
|
||||||
|
|
||||||
$PROJECT = "amxx_mm";
|
|
||||||
$sdk = "../hlsdk/SourceCode";
|
|
||||||
$mm = "../metamod/metamod";
|
|
||||||
|
|
||||||
@CPP_SOURCE_FILES = ("meta_api.cpp", "CFile.cpp", "CVault.cpp", "vault.cpp", "float.cpp", "file.cpp", "modules.cpp", "CMisc.cpp", "CTask.cpp", "string.cpp", "amxmodx.cpp", "CEvent.cpp", "CCmd.cpp", "CLogEvent.cpp", "srvcmd.cpp", "strptime.cpp", "amxcore.cpp", "amxtime.cpp", "power.cpp", "amxxlog.cpp", "fakemeta.cpp", "MMGR/MMGR.cpp", "amxxfile.cpp", "CLang.cpp", "md5.cpp", "emsg.cpp", "CForward.cpp", "CPlugin.cpp", "CModule.cpp", "CMenu.cpp", "util.cpp");
|
|
||||||
|
|
||||||
@C_SOURCE_FILES = ("minilzo/minilzo.c");
|
|
||||||
my %OPTIONS, %OPT;
|
|
||||||
|
|
||||||
$OPT{"debug"} = "-g -ggdb";
|
|
||||||
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\"";
|
|
||||||
|
|
||||||
$OPTIONS{"include"} = "-I$sdk -I. -I$mm -I$sdk/engine -I$sdk/common -I$sdk/pm_shared -I$sdk/dlls";
|
|
||||||
|
|
||||||
while ($cmd = shift)
|
|
||||||
{
|
|
||||||
if ($cmd =~ /jit/)
|
|
||||||
{
|
|
||||||
if ($OPTIONS{"amd64"})
|
|
||||||
{
|
|
||||||
die "You cannot compile the JIT and AMD64 yet.\n";
|
|
||||||
} else {
|
|
||||||
$OPTIONS{"jit"} = 1;
|
|
||||||
}
|
|
||||||
} elsif ($cmd =~ /amd64/) {
|
|
||||||
if ($OPTIONS{"jit"})
|
|
||||||
{
|
|
||||||
die "You cannot compile the JIT and AMD64 yet.\n";
|
|
||||||
} else {
|
|
||||||
$OPTIONS{"amd64"} = 1;
|
|
||||||
}
|
|
||||||
} elsif ($cmd =~ /debug/) {
|
|
||||||
$OPTIONS{"debug"} = 1;
|
|
||||||
} elsif ($cmd =~ /proc=i(\d)86/) {
|
|
||||||
$proc = $1;
|
|
||||||
if ($OPTIONS{"amd64"})
|
|
||||||
{
|
|
||||||
die "You cannot compile for i".$proc."86 and AMD64.\n";
|
|
||||||
} else {
|
|
||||||
$OPTIONS{"proc"} = "i".$proc."86";
|
|
||||||
}
|
|
||||||
} elsif ($cmd =~ /clean/) {
|
|
||||||
$OPTIONS{"clean"} = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$gcc = `g++ --version`;
|
|
||||||
if ($gcc =~ /2\.9/)
|
|
||||||
{
|
|
||||||
`cp amx.cpp amx.c`;
|
|
||||||
push(@C_SOURCE_FILES, "amx.c");
|
|
||||||
$OPT{"opt"} .= " -malign-loops=2 -malign-jumps=2 -malign-functions=2";
|
|
||||||
} else {
|
|
||||||
if ($OPTIONS{"amd64"})
|
|
||||||
{
|
|
||||||
`cp amx.cpp amx.c`;
|
|
||||||
push(@C_SOURCE_FILES, "amx.c");
|
|
||||||
} else {
|
|
||||||
push(@CPP_SOURCE_FILES, "amx.cpp");
|
|
||||||
}
|
|
||||||
$OPT{"opt"} .= " -falign-loops=2 -falign-jumps=2 -falign-functions=2";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($OPTIONS{"debug"})
|
|
||||||
{
|
|
||||||
$cflags = $OPT{"debug"};
|
|
||||||
} else {
|
|
||||||
if (!$OPTIONS{"amd64"})
|
|
||||||
{
|
|
||||||
$proc = $OPTIONS{"proc"};
|
|
||||||
if (!$proc)
|
|
||||||
{
|
|
||||||
$proc = 3;
|
|
||||||
}
|
|
||||||
$cflags = "-march=i".$proc."86 ".$OPT{"opt"};
|
|
||||||
} else {
|
|
||||||
$cflags = $OPT{"opt"};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($OPTIONS{"amd64"})
|
|
||||||
{
|
|
||||||
$cflags .= " -m64 -DSMALL_CELL_SIZE=64 -DHAVE_I64 $cflags";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($OPTIONS{"jit"})
|
|
||||||
{
|
|
||||||
$cflags .= "-DJIT";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($OPTIONS{"debug"})
|
|
||||||
{
|
|
||||||
$outdir = "bin.debug";
|
|
||||||
} else {
|
|
||||||
$outdir = "bin.opt";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($OPTIONS{"amd64"})
|
|
||||||
{
|
|
||||||
$outdir .= ".amd64";
|
|
||||||
$bin = $PROJECT."_amd64.so";
|
|
||||||
} else {
|
|
||||||
$proc = $OPTIONS{"proc"};
|
|
||||||
if ($proc)
|
|
||||||
{
|
|
||||||
$outdir .= ".i".$proc."86";
|
|
||||||
$bin = $PROJECT."_i".$proc."86.so";
|
|
||||||
} else {
|
|
||||||
$outdir .= ".i386";
|
|
||||||
$bin = $PROJECT."_i386.so";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($OPTIONS{"clean"})
|
|
||||||
{
|
|
||||||
`rm $outdir/*.o`;
|
|
||||||
`rm $outdir/MMGR/*.o`;
|
|
||||||
`rm $outdir/minilzo/*.o`;
|
|
||||||
`rm $outdir/$bin`;
|
|
||||||
die("Project cleaned.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
#create the dirs
|
|
||||||
#build link list
|
|
||||||
my @LINK;
|
|
||||||
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
|
||||||
{
|
|
||||||
$file = $CPP_SOURCE_FILES[$i];
|
|
||||||
$file =~ s/\.cpp/\.o/;
|
|
||||||
push(@LINK, $outdir."/".$file);
|
|
||||||
}
|
|
||||||
for ($i=0; $i<=$#C_SOURCE_FILES; $i++)
|
|
||||||
{
|
|
||||||
$file = $C_SOURCE_FILES[$i];
|
|
||||||
$file =~ s/\.c/\.o/;
|
|
||||||
push(@LINK, $outdir."/".$file);
|
|
||||||
}
|
|
||||||
if ($OPTIONS{"jit"})
|
|
||||||
{
|
|
||||||
push(@LINK, "JIT/jits.o");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(-d $outdir))
|
|
||||||
{
|
|
||||||
mkdir($outdir);
|
|
||||||
}
|
|
||||||
if (!(-d "$outdir/MMGR"))
|
|
||||||
{
|
|
||||||
mkdir("$outdir/MMGR");
|
|
||||||
}
|
|
||||||
if (!(-d "$outdir/JIT"))
|
|
||||||
{
|
|
||||||
mkdir("$outdir/JIT");
|
|
||||||
}
|
|
||||||
if (!(-d "$outdir/minilzo"))
|
|
||||||
{
|
|
||||||
mkdir("$outdir/minilzo");
|
|
||||||
}
|
|
||||||
|
|
||||||
$inc = $OPTIONS{"include"};
|
|
||||||
|
|
||||||
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
|
||||||
{
|
|
||||||
$file = $CPP_SOURCE_FILES[$i];
|
|
||||||
$ofile = $file;
|
|
||||||
$ofile =~ s/\.cpp/\.o/;
|
|
||||||
$ofile = "$outdir/$ofile";
|
|
||||||
$gcc = "g++ $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
|
||||||
if (-e $ofile)
|
|
||||||
{
|
|
||||||
$file_time = (stat($file))[9];
|
|
||||||
$ofile_time = (stat($file))[9];
|
|
||||||
if ($file_time > $ofile_time)
|
|
||||||
{
|
|
||||||
print "$gcc\n";
|
|
||||||
`$gcc`;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print "$gcc\n";
|
|
||||||
`$gcc`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
|
||||||
{
|
|
||||||
$file = $C_SOURCE_FILES[$i];
|
|
||||||
$ofile = $file;
|
|
||||||
$ofile =~ s/\.c/\.o/;
|
|
||||||
$ofile = "$outdir/$ofile";
|
|
||||||
$gcc = "cc $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
|
||||||
if (-e $ofile)
|
|
||||||
{
|
|
||||||
$file_time = (stat($file))[9];
|
|
||||||
$ofile_time = (stat($file))[9];
|
|
||||||
if ($file_time > $ofile_time)
|
|
||||||
{
|
|
||||||
print "$gcc\n";
|
|
||||||
`$gcc`;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print "$gcc\n";
|
|
||||||
`$gcc`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$gcc = "g++ $cflags -shared -ldl -lm @LINK -o $outdir/$bin";
|
|
||||||
`$gcc`;
|
|
1641
amxmodx/amx.cpp
1641
amxmodx/amx.cpp
File diff suppressed because it is too large
Load Diff
272
amxmodx/amx.h
272
amxmodx/amx.h
@ -1,6 +1,6 @@
|
|||||||
/* Abstract Machine for the Small compiler
|
/* Pawn Abstract Machine (for the Pawn language)
|
||||||
*
|
*
|
||||||
* Copyright (c) ITB CompuPhase, 1997-2004
|
* 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
|
||||||
@ -21,55 +21,90 @@
|
|||||||
* Version: $Id$
|
* Version: $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined __linux__
|
#if defined FREEBSD && !defined __FreeBSD__
|
||||||
#include "sclinux.h"
|
#define __FreeBSD__
|
||||||
|
#endif
|
||||||
|
#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
|
||||||
|
#include <sclinux.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef AMX_H_INCLUDED
|
#ifndef AMX_H_INCLUDED
|
||||||
#define AMX_H_INCLUDED
|
#define AMX_H_INCLUDED
|
||||||
|
|
||||||
//#define JIT
|
#if defined HAVE_STDINT_H
|
||||||
|
|
||||||
#if defined __LCC__ || defined __DMC__ || defined __linux__
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
|
#else
|
||||||
/* The ISO C99 defines the int16_t and int_32t types. If the compiler got
|
#if defined __LCC__ || defined __DMC__ || defined LINUX
|
||||||
* here, these types are probably undefined.
|
#if defined HAVE_INTTYPES_H
|
||||||
*/
|
#include <inttypes.h>
|
||||||
#if defined __FreeBSD__
|
|
||||||
#include <inttypes.h>
|
|
||||||
#else
|
|
||||||
typedef short int int16_t;
|
|
||||||
typedef unsigned short int uint16_t;
|
|
||||||
#if defined SN_TARGET_PS2
|
|
||||||
typedef int int32_t;
|
|
||||||
typedef unsigned int uint32_t;
|
|
||||||
#else
|
#else
|
||||||
typedef long int int32_t;
|
#include <stdint.h>
|
||||||
typedef unsigned long int uint32_t;
|
|
||||||
#endif
|
#endif
|
||||||
#if defined __WIN32__ || defined _WIN32 || defined WIN32
|
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
|
||||||
typedef __int64 int64_t;
|
/* The ISO C99 defines the int16_t and int_32t types. If the compiler got
|
||||||
typedef unsigned __int64 uint64_t;
|
* here, these types are probably undefined.
|
||||||
#define HAVE_I64
|
*/
|
||||||
#elif defined __GNUC__
|
#if defined __MACH__
|
||||||
typedef long long int64_t;
|
#include <ppc/types.h>
|
||||||
typedef unsigned long long uint64_t;
|
typedef unsigned short int uint16_t;
|
||||||
#define HAVE_I64
|
typedef unsigned long int uint32_t;
|
||||||
|
#elif defined __FreeBSD__
|
||||||
|
#include <inttypes.h>
|
||||||
|
#else
|
||||||
|
typedef short int int16_t;
|
||||||
|
typedef unsigned short int uint16_t;
|
||||||
|
#if defined SN_TARGET_PS2
|
||||||
|
typedef int int32_t;
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
#else
|
||||||
|
typedef long int int32_t;
|
||||||
|
typedef unsigned long int uint32_t;
|
||||||
|
#endif
|
||||||
|
#if defined __WIN32__ || defined _WIN32 || defined WIN32
|
||||||
|
typedef __int64 int64_t;
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
#define HAVE_I64
|
||||||
|
#elif defined __GNUC__
|
||||||
|
typedef long long int64_t;
|
||||||
|
typedef unsigned long long uint64_t;
|
||||||
|
#define HAVE_I64
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#define HAVE_STDINT_H
|
||||||
|
#endif
|
||||||
|
#if defined _LP64 || defined WIN64 || defined _WIN64
|
||||||
|
#if !defined __64BIT__
|
||||||
|
#define __64BIT__
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_ALLOCA_H
|
||||||
|
#include <alloca.h>
|
||||||
|
#endif
|
||||||
#if defined __WIN32__ || defined _WIN32 || defined WIN32 /* || defined __MSDOS__ */
|
#if defined __WIN32__ || defined _WIN32 || defined WIN32 /* || defined __MSDOS__ */
|
||||||
#if !defined alloca
|
#if !defined alloca
|
||||||
#define alloca(n) _alloca(n)
|
#define alloca(n) _alloca(n)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined arraysize
|
||||||
|
#define arraysize(array) (sizeof(array) / sizeof((array)[0]))
|
||||||
|
#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
|
||||||
@ -80,6 +115,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
|
||||||
@ -97,45 +134,39 @@ 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 BIT16
|
#if !defined PAWN_CELL_SIZE
|
||||||
#define SMALL_CELL_SIZE 16 /* for backward compatibility */
|
#define PAWN_CELL_SIZE 32 /* by default, use 32-bit cells */
|
||||||
#endif
|
#endif
|
||||||
#if !defined SMALL_CELL_SIZE
|
#if PAWN_CELL_SIZE==16
|
||||||
#define SMALL_CELL_SIZE 32 /* by default, use 32-bit cells */
|
|
||||||
#endif
|
|
||||||
#if SMALL_CELL_SIZE==16
|
|
||||||
typedef uint16_t ucell;
|
typedef uint16_t ucell;
|
||||||
typedef int16_t cell;
|
typedef int16_t cell;
|
||||||
#elif SMALL_CELL_SIZE==32
|
#elif PAWN_CELL_SIZE==32
|
||||||
typedef uint32_t ucell;
|
typedef uint32_t ucell;
|
||||||
typedef int32_t cell;
|
typedef int32_t cell;
|
||||||
#elif SMALL_CELL_SIZE==64
|
#define REAL float
|
||||||
|
#elif PAWN_CELL_SIZE==64
|
||||||
typedef uint64_t ucell;
|
typedef uint64_t ucell;
|
||||||
typedef int64_t cell;
|
typedef int64_t cell;
|
||||||
|
#define REAL double
|
||||||
#else
|
#else
|
||||||
#error Unsupported cell size (SMALL_CELL_SIZE)
|
#error Unsupported cell size (PAWN_CELL_SIZE)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SMALL_CELL_SIZE==32
|
#define UNPACKEDMAX ((1L << (sizeof(cell)-1)*8) - 1)
|
||||||
#define REAL float
|
#define UNLIMITED (~1u >> 1)
|
||||||
#elif SMALL_CELL_SIZE==64
|
|
||||||
#define REAL double
|
|
||||||
#else
|
|
||||||
#error Unsupported cell size
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define UNPACKEDMAX ((1 << (sizeof(cell)-1)*8) - 1)
|
|
||||||
|
|
||||||
struct tagAMX;
|
struct tagAMX;
|
||||||
typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, cell *params);
|
typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, cell *params);
|
||||||
typedef int (AMXAPI *AMX_CALLBACK)(struct tagAMX *amx, cell index,
|
typedef int (AMXAPI *AMX_CALLBACK)(struct tagAMX *amx, cell index,
|
||||||
cell *result, cell *params);
|
cell *result, cell *params);
|
||||||
typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
|
typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
|
||||||
|
typedef int (AMXAPI *AMX_NATIVE_FILTER)(struct tagAMX *amx, int index);
|
||||||
#if !defined _FAR
|
#if !defined _FAR
|
||||||
#define _FAR
|
#define _FAR
|
||||||
#endif
|
#endif
|
||||||
@ -149,7 +180,7 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
|
|||||||
/* 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
|
||||||
|
|
||||||
@ -160,8 +191,10 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
|
|||||||
#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) */
|
||||||
@ -171,25 +204,30 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct tagAMX_NATIVE_INFO {
|
||||||
const char _FAR *name PACKED;
|
const char _FAR *name PACKED;
|
||||||
AMX_NATIVE func PACKED;
|
AMX_NATIVE func PACKED;
|
||||||
} AMX_NATIVE_INFO;
|
} PACKED AMX_NATIVE_INFO;
|
||||||
|
|
||||||
#define AMX_USERNUM 4
|
#define AMX_USERNUM 4
|
||||||
#define sEXPMAX 19 /* maximum name length for file version <= 6 */
|
#define sEXPMAX 19 /* maximum name length for file version <= 6 */
|
||||||
#define sNAMEMAX 31 /* maximum name length of symbol name */
|
#define sNAMEMAX 31 /* maximum name length of symbol name */
|
||||||
|
|
||||||
typedef struct tagAMX_FUNCSTUB {
|
typedef struct tagAMX_FUNCSTUB {
|
||||||
ucell address PACKED;
|
ucell address PACKED;
|
||||||
const char name[sEXPMAX+1] PACKED;
|
char name[sEXPMAX+1] PACKED;
|
||||||
} AMX_FUNCSTUB;
|
} 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 */
|
||||||
@ -201,30 +239,26 @@ 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;
|
long 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 sysreq_d PACKED; /* relocated address/value for the SYSREQ.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 */
|
} PACKED AMX;
|
||||||
#endif
|
|
||||||
} AMX;
|
|
||||||
|
|
||||||
/* 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.
|
||||||
@ -246,9 +280,11 @@ 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;
|
||||||
#define AMX_MAGIC 0xf1e0
|
|
||||||
|
//This is always the same for us
|
||||||
|
#define AMX_MAGIC 0xf1e0
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
AMX_ERR_NONE,
|
AMX_ERR_NONE,
|
||||||
@ -265,6 +301,8 @@ 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 */
|
||||||
@ -277,27 +315,18 @@ 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 */
|
|
||||||
DBG_FILE, /* file number in curfile, filename in name */
|
|
||||||
DBG_LINE, /* line number in curline, file number in curfile */
|
|
||||||
DBG_SYMBOL, /* address in dbgaddr, class/type in dbgparam */
|
|
||||||
DBG_CLRSYM, /* stack address below which locals should be removed. stack address in stk */
|
|
||||||
DBG_CALL, /* function call, address jumped to in dbgaddr */
|
|
||||||
DBG_RETURN, /* function returns */
|
|
||||||
DBG_TERMINATE, /* program ends, code address in dbgaddr, reason in dbgparam */
|
|
||||||
DBG_SRANGE, /* symbol size and dimensions (arrays); level in dbgaddr (!); length in dbgparam */
|
|
||||||
DBG_SYMTAG, /* tag of the most recent symbol (if non-zero), tag in dbgparam */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* AMX_FLAG_CHAR16 0x01 no longer used */
|
/* AMX_FLAG_CHAR16 0x01 no longer used */
|
||||||
#define AMX_FLAG_DEBUG 0x02 /* symbolic info. available */
|
#define AMX_FLAG_DEBUG 0x02 /* symbolic info. available */
|
||||||
#define AMX_FLAG_COMPACT 0x04 /* compact encoding */
|
#define AMX_FLAG_COMPACT 0x04 /* compact encoding */
|
||||||
#define AMX_FLAG_BIGENDIAN 0x08 /* big endian encoding */
|
#define AMX_FLAG_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_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 */
|
||||||
@ -305,16 +334,24 @@ enum {
|
|||||||
|
|
||||||
#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
|
||||||
|
|
||||||
/* 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
|
||||||
*/
|
*/
|
||||||
#if SMALL_CELL_SIZE==32
|
#if PAWN_CELL_SIZE==32
|
||||||
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
|
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
|
||||||
#define amx_ctof(c) ( * ((float*)&c) ) /* cell to float */
|
#define amx_ctof(c) ( * ((float*)&c) ) /* cell to float */
|
||||||
#elif SMALL_CELL_SIZE==64
|
#elif PAWN_CELL_SIZE==64
|
||||||
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
|
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
|
||||||
#define amx_ctof(c) ( * ((double*)&c) ) /* cell to float */
|
#define amx_ctof(c) ( * ((double*)&c) ) /* cell to float */
|
||||||
#else
|
#else
|
||||||
@ -328,7 +365,7 @@ enum {
|
|||||||
amx_StrLen(amx_cstr_, &amx_length_); \
|
amx_StrLen(amx_cstr_, &amx_length_); \
|
||||||
if (amx_length_ > 0 && \
|
if (amx_length_ > 0 && \
|
||||||
((result) = (void*)alloca((amx_length_ + 1) * sizeof(*(result)))) != NULL) \
|
((result) = (void*)alloca((amx_length_ + 1) * sizeof(*(result)))) != NULL) \
|
||||||
amx_GetString((char*)(result), amx_cstr_, sizeof(*(result))>1); \
|
amx_GetString((char*)(result), amx_cstr_, sizeof(*(result))>1, amx_length_); \
|
||||||
else (result) = NULL; \
|
else (result) = NULL; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
@ -337,20 +374,12 @@ uint32_t * AMXAPI amx_Align32(uint32_t *v);
|
|||||||
#if defined _I64_MAX || defined HAVE_I64
|
#if defined _I64_MAX || defined HAVE_I64
|
||||||
uint64_t * AMXAPI amx_Align64(uint64_t *v);
|
uint64_t * AMXAPI amx_Align64(uint64_t *v);
|
||||||
#endif
|
#endif
|
||||||
#if SMALL_CELL_SIZE==32
|
|
||||||
#define amx_AlignCell amx_Align32
|
|
||||||
#elif SMALL_CELL_SIZE==64
|
|
||||||
#define amx_AlignCell amx_Align64
|
|
||||||
#else
|
|
||||||
#error Unsupported cell size
|
|
||||||
#endif
|
|
||||||
int AMXAPI amx_Allot(AMX *amx, int cells, cell *amx_addr, cell **phys_addr);
|
int AMXAPI amx_Allot(AMX *amx, int cells, cell *amx_addr, cell **phys_addr);
|
||||||
int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params);
|
int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params);
|
||||||
|
int AMXAPI amx_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_Execv(AMX *amx, cell *retval, int index, int numparams, cell params[]);
|
|
||||||
int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index);
|
int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index);
|
||||||
int AMXAPI amx_FindPublic(AMX *amx, const char *funcname, int *index);
|
int AMXAPI amx_FindPublic(AMX *amx, const char *funcname, int *index);
|
||||||
int AMXAPI amx_FindPubVar(AMX *amx, const char *varname, cell *amx_addr);
|
int AMXAPI amx_FindPubVar(AMX *amx, const char *varname, cell *amx_addr);
|
||||||
@ -360,34 +389,57 @@ 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,const cell *source, int use_wchar);
|
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(const 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_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, const char *source, int pack, int use_wchar);
|
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);
|
||||||
int AMXAPI amx_StrLen(cell *cstring, int *length);
|
int AMXAPI amx_StrLen(const 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_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_UTF8Put(char *string, char **endptr, int maxchars, cell value);
|
||||||
int AMXAPI amx_UTF8Check(const char *string);
|
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
|
||||||
|
@ -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 ;
|
|
@ -1,6 +1,6 @@
|
|||||||
/* Core module for the Small AMX
|
/* Core module for the Pawn AMX
|
||||||
*
|
*
|
||||||
* Copyright (c) ITB CompuPhase, 1997-2004
|
* 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
|
||||||
@ -34,14 +34,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
// this file does not include amxmodx.h, so we have to include the memory manager here
|
|
||||||
#ifdef MEMORY_TEST
|
|
||||||
#include "mmgr/mmgr.h"
|
|
||||||
#endif // MEMORY_TEST
|
|
||||||
|
|
||||||
#include "amx.h"
|
#include "amx.h"
|
||||||
|
|
||||||
#if defined __WIN32__ || defined _WIN32 || defined WIN32 || defined _Windows
|
#if defined __WIN32__ || defined _WIN32 || defined WIN32 || defined _Windows
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
@ -60,14 +53,13 @@
|
|||||||
# define _tcscpy strcpy
|
# define _tcscpy strcpy
|
||||||
# define _tcsdup strdup
|
# define _tcsdup strdup
|
||||||
# define _tcslen strlen
|
# define _tcslen strlen
|
||||||
# define _stprintf sprintf
|
|
||||||
#endif
|
#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;
|
||||||
@ -76,7 +68,7 @@ typedef struct _property_list {
|
|||||||
//??? safe AMX (owner of the property)
|
//??? 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)
|
||||||
{
|
{
|
||||||
@ -142,15 +134,13 @@ 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->data ? amx->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" */
|
||||||
@ -190,18 +180,16 @@ static cell AMX_NATIVE_CALL setarg(AMX *amx, cell *params)
|
|||||||
/* adjust the address in "value" in case of an array access */
|
/* adjust the address in "value" in case of an array access */
|
||||||
value+=params[2]*sizeof(cell);
|
value+=params[2]*sizeof(cell);
|
||||||
/* verify the address */
|
/* verify the address */
|
||||||
if (value<0 || (value>=amx->hea && value<amx->stk))
|
if (value<0 || value>=amx->hea && value<amx->stk)
|
||||||
return 0;
|
return 0;
|
||||||
/* set the value indirectly */
|
/* set the value indirectly */
|
||||||
* (cell *)(data+(int)value) = params[3];
|
* (cell *)(data+(int)value) = params[3];
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,142 +208,22 @@ static cell AMX_NATIVE_CALL funcidx(AMX *amx,cell *params)
|
|||||||
return 0;
|
return 0;
|
||||||
} /* if */
|
} /* if */
|
||||||
|
|
||||||
amx_GetString(name,cstr,0);
|
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>UNPACKEDMAX) {
|
|
||||||
/* 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>UNPACKEDMAX) {
|
|
||||||
/* 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,err;
|
|
||||||
size_t lastaddr;
|
|
||||||
|
|
||||||
/* 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=(size_t)(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;
|
|
||||||
size_t lastaddr;
|
|
||||||
|
|
||||||
/* calculate number of cells needed for (packed) destination */
|
|
||||||
amx_GetAddr(amx,params[2],&csrc);
|
|
||||||
amx_StrLen(csrc,&len);
|
|
||||||
assert(len>=0);
|
|
||||||
lastaddr=(size_t)(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 SMALL_CELL_SIZE==16
|
#if PAWN_CELL_SIZE==16
|
||||||
uchar b[2];
|
uchar b[2];
|
||||||
#elif SMALL_CELL_SIZE==32
|
#elif PAWN_CELL_SIZE==32
|
||||||
uchar b[4];
|
uchar b[4];
|
||||||
#elif SMALL_CELL_SIZE==64
|
#elif PAWN_CELL_SIZE==64
|
||||||
uchar b[8];
|
uchar b[8];
|
||||||
#else
|
#else
|
||||||
#error Unsupported cell size
|
#error Unsupported cell size
|
||||||
@ -363,20 +231,21 @@ static cell AMX_NATIVE_CALL swapchars(AMX *amx,cell *params)
|
|||||||
} 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 SMALL_CELL_SIZE==16
|
#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;
|
||||||
#elif SMALL_CELL_SIZE==32
|
#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 SMALL_CELL_SIZE==64
|
#elif PAWN_CELL_SIZE==64
|
||||||
t = value.b[0];
|
t = value.b[0];
|
||||||
value.b[0] = value.b[7];
|
value.b[0] = value.b[7];
|
||||||
value.b[7] = t;
|
value.b[7] = t;
|
||||||
@ -395,11 +264,9 @@ static cell AMX_NATIVE_CALL swapchars(AMX *amx,cell *params)
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
(void)amx;
|
||||||
#if defined __WIN32__ || defined _WIN32 || defined WIN32
|
#if defined __WIN32__ || defined _WIN32 || defined WIN32
|
||||||
return (cell)CharLower((LPTSTR)params[1]);
|
return (cell)CharLower((LPTSTR)params[1]);
|
||||||
#elif defined _Windows
|
#elif defined _Windows
|
||||||
@ -409,11 +276,9 @@ static cell AMX_NATIVE_CALL core_tolower(AMX *amx,cell *params)
|
|||||||
#endif
|
#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)
|
||||||
{
|
{
|
||||||
|
(void)amx;
|
||||||
#if defined __WIN32__ || defined _WIN32 || defined WIN32
|
#if defined __WIN32__ || defined _WIN32 || defined WIN32
|
||||||
return (cell)CharUpper((LPTSTR)params[1]);
|
return (cell)CharUpper((LPTSTR)params[1]);
|
||||||
#elif defined _Windows
|
#elif defined _Windows
|
||||||
@ -423,19 +288,15 @@ static cell AMX_NATIVE_CALL core_toupper(AMX *amx,cell *params)
|
|||||||
#endif
|
#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];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -451,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;
|
||||||
@ -459,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,0);
|
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;
|
||||||
@ -480,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,0);
|
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;
|
||||||
@ -545,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
|
||||||
@ -562,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
|
||||||
|
|
||||||
@ -579,6 +453,7 @@ static cell AMX_NATIVE_CALL core_random(AMX *amx,cell *params)
|
|||||||
result %= params[1];
|
result %= params[1];
|
||||||
return (cell)result;
|
return (cell)result;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
AMX_NATIVE_INFO core_Natives[] = {
|
AMX_NATIVE_INFO core_Natives[] = {
|
||||||
@ -587,22 +462,13 @@ AMX_NATIVE_INFO core_Natives[] = {
|
|||||||
{ "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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -611,12 +477,10 @@ int AMXEXPORT amx_CoreInit(AMX *amx)
|
|||||||
return amx_Register(amx, core_Natives, -1);
|
return amx_Register(amx, core_Natives, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
|
||||||
#pragma argsused
|
|
||||||
#endif
|
|
||||||
int AMXEXPORT amx_CoreCleanup(AMX *amx)
|
int AMXEXPORT amx_CoreCleanup(AMX *amx)
|
||||||
{
|
{
|
||||||
#if !defined NOPROPLIST
|
(void)amx;
|
||||||
|
#if !defined AMX_NOPROPLIST
|
||||||
//??? delete only the properties owned by the AMX
|
//??? delete only the properties owned by the AMX
|
||||||
while (proproot.next!=NULL)
|
while (proproot.next!=NULL)
|
||||||
list_delete(&proproot,proproot.next);
|
list_delete(&proproot,proproot.next);
|
||||||
|
498
amxmodx/amxdbg.cpp
Executable file
498
amxmodx/amxdbg.cpp
Executable 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
172
amxmodx/amxdbg.h
Executable 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 PACKED; /* file format version */
|
||||||
|
char amx_version PACKED; /* 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 */
|
||||||
|
} AMX_DBG_HDR PACKED;
|
||||||
|
#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] PACKED; /* ASCII string, zero-terminated */
|
||||||
|
} AMX_DBG_FILE PACKED;
|
||||||
|
|
||||||
|
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 */
|
||||||
|
} AMX_DBG_LINE PACKED;
|
||||||
|
|
||||||
|
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 PACKED; /* kind of symbol (function/variable) */
|
||||||
|
char vclass PACKED; /* class of symbol (global/local) */
|
||||||
|
int16_t dim PACKED; /* number of dimensions */
|
||||||
|
const char name[1] PACKED; /* ASCII string, zero-terminated */
|
||||||
|
} AMX_DBG_SYMBOL PACKED;
|
||||||
|
|
||||||
|
typedef struct tagAMX_DBG_SYMDIM {
|
||||||
|
int16_t tag PACKED; /* tag for the array dimension */
|
||||||
|
ucell size PACKED; /* size of the array dimension */
|
||||||
|
} AMX_DBG_SYMDIM PACKED;
|
||||||
|
|
||||||
|
typedef struct tagAMX_DBG_TAG {
|
||||||
|
int16_t tag PACKED; /* tag id */
|
||||||
|
const char name[1] PACKED; /* ASCII string, zero-terminated */
|
||||||
|
} AMX_DBG_TAG PACKED;
|
||||||
|
|
||||||
|
typedef struct tagAMX_DBG_MACHINE {
|
||||||
|
int16_t automaton PACKED; /* automaton id */
|
||||||
|
ucell address PACKED; /* address of state variable */
|
||||||
|
const char name[1] PACKED; /* ASCII string, zero-terminated */
|
||||||
|
} AMX_DBG_MACHINE PACKED;
|
||||||
|
|
||||||
|
typedef struct tagAMX_DBG_STATE {
|
||||||
|
int16_t state PACKED; /* state id */
|
||||||
|
int16_t automaton PACKED; /* automaton id */
|
||||||
|
const char name[1] PACKED; /* ASCII string, zero-terminated */
|
||||||
|
} AMX_DBG_STATE PACKED;
|
||||||
|
|
||||||
|
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;
|
||||||
|
} AMX_DBG PACKED;
|
||||||
|
|
||||||
|
#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
86
amxmodx/amxdefn.asm
Executable 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
|
||||||
|
|
1645
amxmodx/amxexecn.asm
Executable file
1645
amxmodx/amxexecn.asm
Executable file
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,5 @@
|
|||||||
; JIT.ASM: Just-In-Time compiler for the Abstract Machine of the "Small"language
|
; AMXJITSN.ASM: Just-In-Time compiler for the Abstract Machine of the "Pawn"
|
||||||
|
; scripting language
|
||||||
; (C) 1999-2000, Marc Peter; beta version; provided AS IS WITHOUT ANY WARRANTIES
|
; (C) 1999-2000, Marc Peter; beta version; provided AS IS WITHOUT ANY WARRANTIES
|
||||||
|
|
||||||
; I reached >155 million instr./sec on my AMD K6-2/366 with the Hanoi "bench"
|
; I reached >155 million instr./sec on my AMD K6-2/366 with the Hanoi "bench"
|
||||||
@ -20,18 +21,64 @@
|
|||||||
; step.
|
; step.
|
||||||
|
|
||||||
; NOTE 3:
|
; NOTE 3:
|
||||||
; During execution of the compiled code with amx_exec_asm() the x86 processor's
|
; Although the Pawn compiler doesn't generate the LCTRL, SCTRL and CALL.I
|
||||||
; stack is switched into the data section of the abstract machine. This means
|
|
||||||
; that there should always be enough memory left between HEA and STK to provide
|
|
||||||
; stack space for occurring interrupts! (see the STACKRESERVE variable)
|
|
||||||
|
|
||||||
; NOTE 4:
|
|
||||||
; Although the Small compiler doesn't generate the LCTRL, SCTRL and CALL.I
|
|
||||||
; instructions, I have to tell that they don't work as expected in a JIT
|
; instructions, I have to tell that they don't work as expected in a JIT
|
||||||
; compiled program, because there is no easy way of transforming AMX code
|
; compiled program, because there is no easy way of transforming AMX code
|
||||||
; addresses and JIT translated ones. This might be fixed in a future version.
|
; addresses and JIT translated ones. This might be fixed in a future version.
|
||||||
|
|
||||||
|
; NOTE 4:
|
||||||
|
; Stack Pointer issues (by David Anderson)
|
||||||
|
; The JIT was changed recently so it no longer uses ESP as a general purpose
|
||||||
|
; register (GRP), because it can conflict with threading/signal systems which
|
||||||
|
; rely on the stack pointer being in-tact to find thread-ids. My fix for this
|
||||||
|
; was to keep esp safe, but save the stack pointer in 'ecx'. As such, ecx is no
|
||||||
|
; longer the CIP or scratch register, it is the save point for pieces of the AMX
|
||||||
|
; structure on the x86 stack.
|
||||||
|
; This means that the optimization of the JIT has changed, as every amx stack
|
||||||
|
; push call now takes two operations instead of one (same for pop), and pushing
|
||||||
|
; addresses is 4 instructions instead of 1.
|
||||||
|
; As of this moment I don't see a better way around it, but the sacrifice for
|
||||||
|
; having pthread-safe code was deemed to be necessary.
|
||||||
|
|
||||||
|
; NOTE 5:
|
||||||
|
; NX ("No eXecute") and XD (eXecution Denied) bits
|
||||||
|
; (by Thiadmer Riemersma)
|
||||||
|
;
|
||||||
|
; AMD defined a bit "No eXecute" for the page table entries (for its 64-bit
|
||||||
|
; processors) and Intel came with the same design, but calling it differently.
|
||||||
|
; The purpose is to make "buffer overrun" security holes impossible, or at least
|
||||||
|
; very, very difficult, by marking the stack and the heap as memory regions
|
||||||
|
; such that an attempt to execute processor instructions will cause a processor
|
||||||
|
; exception (of course, a buffer overrun that is not explictly handled will then
|
||||||
|
; crash the application --instead of executing the rogue code).
|
||||||
|
;
|
||||||
|
; For JIT compilers, this has the impact that you are not allowed to execute the
|
||||||
|
; code that the JIT has generated. To do that, you must adjust the attributes
|
||||||
|
; for the memory page. For Microsoft Windows, you can use VirtualAlloc() to
|
||||||
|
; allocate a memory block with the appropriate fags; on Linux (with a recent
|
||||||
|
; kernel), you would use vmalloc_exec(). Microsoft Windows also offers the
|
||||||
|
; function VirtualProtect() to change the page attributes of an existing memory
|
||||||
|
; block, but there are caveats in its use: if the block spans multiple pages,
|
||||||
|
; these pages must be consecutive, and if there are blocks of memory in a page
|
||||||
|
; unrelated to the JIT, their page attributes will change too.
|
||||||
|
;
|
||||||
|
; The JIT compiler itself requires only read-write access (this is the default
|
||||||
|
; for a memory block that you allocate). The execution of the JIT-compiled code
|
||||||
|
; requires full access to the memory block: read, write and execute. It needs
|
||||||
|
; write access, because the SYSREQ.C opcode is patched to SYSREQ.D after the
|
||||||
|
; first lookup (this is an optimization, look up the address of the native
|
||||||
|
; function only once). For processors that do not support the NX/XD bit,
|
||||||
|
; execution of code is implicitly supported if read access is supported.
|
||||||
|
;
|
||||||
|
; During compilation, the JIT compiler requires write-access to its own code
|
||||||
|
; segment: the JIT-compiler patches P-code parameters into its own code segment
|
||||||
|
; during compilation. This is handled in the support code for amx_InitJIT.
|
||||||
|
;
|
||||||
|
|
||||||
|
; NOTE 6:
|
||||||
|
; CALLING CONVENTIONS
|
||||||
|
; (by Thiadmer Riemersma)
|
||||||
;
|
;
|
||||||
; CALLING CONVENTIONS (by Thiadmer Riemersma)
|
|
||||||
; This version is the JIT that uses the "stack calling convention". In the
|
; This version is the JIT that uses the "stack calling convention". In the
|
||||||
; original implementation, this meant __cdecl; both for the calling convention
|
; original implementation, this meant __cdecl; both for the calling convention
|
||||||
; for the _asm_runJIT routine itself as for the callback functions.
|
; for the _asm_runJIT routine itself as for the callback functions.
|
||||||
@ -40,8 +87,23 @@
|
|||||||
; a reserved word on the assembler, I had to choose a different name for the
|
; a reserved word on the assembler, I had to choose a different name for the
|
||||||
; macro, hence STDECL.)
|
; macro, hence STDECL.)
|
||||||
|
|
||||||
|
|
||||||
; Revision History
|
; Revision History
|
||||||
;------------------
|
; ----------------
|
||||||
|
; 16 august 2005 by David "BAILOPAN" Anderson (DA)
|
||||||
|
; Changed JIT to not swap stack pointer during execution. This
|
||||||
|
; is playing with fire, especially with pthreads and signals on linux,
|
||||||
|
; where the stack pointer is used to find the current thread id. If
|
||||||
|
; the stack pointer is altered during a thread/signal switch/interrupt
|
||||||
|
; unexpected behaviour can occur (crashes).
|
||||||
|
; 26 july 2005 by David "BAILOPAN" Anderson (DA)
|
||||||
|
; Fixed a bug where zero casetbl entries would crash the JIT.
|
||||||
|
; 17 february 2005 by Thiadmer Riemersms
|
||||||
|
; Addition of the BREAK opcode, removal of the older debugging opcode
|
||||||
|
; table. There should now be some debug support (if enabled during the
|
||||||
|
; build of the JIT compiler), but not enough to run a debugger: the JIT
|
||||||
|
; compiler does not keep a list that relates the code addresses of the
|
||||||
|
; P-code versus the native code.
|
||||||
; 29 June 2004 by G.W.M. Vissers
|
; 29 June 2004 by G.W.M. Vissers
|
||||||
; Translated the thing into NASM. The actual generation of the code is
|
; Translated the thing into NASM. The actual generation of the code is
|
||||||
; put into the data section because the code modifies itself whereas the
|
; put into the data section because the code modifies itself whereas the
|
||||||
@ -88,8 +150,8 @@
|
|||||||
; hanoi bench.
|
; hanoi bench.
|
||||||
; 1999/08/05 MP
|
; 1999/08/05 MP
|
||||||
; * fixed OP_LINE in the case of NODBGCALLS==1, where no compiled address
|
; * fixed OP_LINE in the case of NODBGCALLS==1, where no compiled address
|
||||||
; was stored for the LINE byte code (I.e. SWITCH would jump to totally
|
; was stored for the LINE byte code (i.e. SWITCH would jump to totally
|
||||||
; wrong addresses.) The same fix was applied to OP_FILL, OP_FILE and
|
; wrong addresses). The same fix was applied to OP_FILL, OP_FILE and
|
||||||
; OP_SCTRL (for the no-op case).
|
; OP_SCTRL (for the no-op case).
|
||||||
; 1999/08/04 MP
|
; 1999/08/04 MP
|
||||||
; * updated with 4 new opcodes (SRANGE does nothing at the moment; 2dim.
|
; * updated with 4 new opcodes (SRANGE does nothing at the moment; 2dim.
|
||||||
@ -102,13 +164,14 @@
|
|||||||
; 1999/07/08 MP - initial revision
|
; 1999/07/08 MP - initial revision
|
||||||
|
|
||||||
|
|
||||||
; Controls generation of LINE op-codes: 0 - no, all other values - yes
|
|
||||||
; Beware that, if set to 1, this makes the compiled code slower by a factor of
|
|
||||||
; up to 3!
|
|
||||||
;
|
;
|
||||||
; GWMV: to generate LINE opcode, %define ALLOWOPLINE
|
; Support for the BREAK opcode (callback to the debugger): 0 = no, all other
|
||||||
|
; values = yes. Beware that the compiled code runs slower when this is enabled,
|
||||||
|
; and that debug support is still fairly minimal.
|
||||||
;
|
;
|
||||||
%undef ALLOWOPLINE
|
; GWMV: to generate LINE opcode, %define DEBUGSUPPORT
|
||||||
|
;
|
||||||
|
%undef DEBUGSUPPORT
|
||||||
|
|
||||||
;
|
;
|
||||||
; If this is set to 1 the JIT generates relocatable code for case tables, too.
|
; If this is set to 1 the JIT generates relocatable code for case tables, too.
|
||||||
@ -119,151 +182,66 @@
|
|||||||
;
|
;
|
||||||
%define FORCERELOCATABLE
|
%define FORCERELOCATABLE
|
||||||
|
|
||||||
;
|
|
||||||
; Determines how much memory should be reserved for occurring interrupts.
|
|
||||||
; (If my memory serves me right, DOS4/G(W) provides a stack of 512 bytes
|
|
||||||
; for interrupts that occur in real mode and are promoted to protected mode.)
|
|
||||||
; This value _MUST_ be greater than 64 (for AMX needs) and should be at least
|
|
||||||
; 128 (to serve interrupts).
|
|
||||||
;
|
|
||||||
%define STACKRESERVE 256
|
|
||||||
|
|
||||||
;
|
;
|
||||||
; This variable controls the generation of memory range checks at run-time.
|
; This variable controls the generation of memory range checks at run-time.
|
||||||
; You should set this to 0, only when you are sure that there are no range
|
; You should set this to 0, only when you are sure that there are no range
|
||||||
; violations in your Small programs and you really need those 5% speed gain.
|
; violations in your Pawn programs and you really need those 5% speed gain.
|
||||||
;
|
;
|
||||||
; GWMV: To disable runtime checks, %undef it, instread of setting it to zero
|
; GWMV: To disable runtime checks, %undef it, instread of setting it to zero
|
||||||
;
|
;
|
||||||
%define DORUNTIMECHECKS
|
%define DORUNTIMECHECKS
|
||||||
|
|
||||||
|
%define JIT 1
|
||||||
|
%include "amxdefn.asm"
|
||||||
|
|
||||||
struc amx_s
|
;Registers used for JIT during execution:
|
||||||
_base: resd 1
|
; eax - pri
|
||||||
_dataseg: resd 1
|
; ebx - reloc frame
|
||||||
_callback: resd 1
|
; ecx - info params
|
||||||
_debug: resd 1
|
; edx - alt
|
||||||
_cip: resd 1
|
; esi - AMX stack
|
||||||
_frm: resd 1
|
; edi - DAT
|
||||||
_hea: resd 1
|
; ebp - scratch
|
||||||
_hlw: resd 1
|
|
||||||
_stk: resd 1
|
|
||||||
_stp: resd 1
|
|
||||||
_flags: resd 1
|
|
||||||
_curline: resd 1
|
|
||||||
_curfile: resd 1
|
|
||||||
_dbgcode: resd 1
|
|
||||||
_dbgaddr: resd 1
|
|
||||||
_dbgparam: resd 1
|
|
||||||
_dbgname: 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
|
|
||||||
_pri: resd 1
|
|
||||||
_alt: resd 1
|
|
||||||
_reset_stk: resd 1
|
|
||||||
_reset_hea: resd 1
|
|
||||||
_syscall_d: resd 1
|
|
||||||
; 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
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
|
;DA:
|
||||||
struc amxhead_s
|
; These are still stored in the stack, but the stack pointer
|
||||||
_size: resd 1 ; size of the "file"
|
; holding them is now kept in ecx.
|
||||||
_magic: resw 1 ; signature
|
%define stk [ecx+32] ; define some aliases to registers that will
|
||||||
_file_version: resb 1 ;file format version
|
%define alt [ecx+28] ; be stored on the stack when the code is
|
||||||
_amx_version: resb 1 ; required version of the AMX
|
%define pri [ecx+24] ; actually beeing executed
|
||||||
_h_flags: resw 1
|
%define code [ecx+20]
|
||||||
_defsize: resw 1 ; size of one public/native function entry
|
%define amx [ecx+16]
|
||||||
_cod: resd 1 ; initial value of COD - code block
|
%define retval [ecx+12]
|
||||||
_dat: resd 1 ; initial value of DAT - data block
|
%define stp [ecx+8]
|
||||||
_h_hea: resd 1 ; initial value of HEA - start of the heap
|
%define hea [ecx+4]
|
||||||
_h_stp: resd 1 ; initial value of STP - stack top
|
%define frm [ecx] ; FRM is NOT stored in ebp, FRM+DAT is being held
|
||||||
_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
|
|
||||||
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 ; MP: added for catching divide errors
|
|
||||||
AMX_ERR_SLEEP equ 12 ; (TR) go into sleep mode
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
DBG_INIT equ 0
|
|
||||||
DBG_FILE equ 1
|
|
||||||
DBG_LINE equ 2
|
|
||||||
DBG_SYMBOL equ 3
|
|
||||||
DBG_CLRSYM equ 4
|
|
||||||
DBG_CALL equ 5
|
|
||||||
DBG_RETURN equ 6
|
|
||||||
DBG_TERMINATE equ 7
|
|
||||||
DBG_SRANGE equ 8
|
|
||||||
DBG_SYMTAG equ 9
|
|
||||||
|
|
||||||
AMX_FLAG_CHAR16 equ 0001h ; characters are 16-bit
|
|
||||||
AMX_FLAG_DEBUG equ 0002h ; symbolic info. available
|
|
||||||
AMX_FLAG_BROWSE equ 4000h
|
|
||||||
AMX_FLAG_RELOC equ 8000h ; jump/call addresses relocated
|
|
||||||
|
|
||||||
; GWMV:
|
|
||||||
; Nasm can't do the next as equivalence statements, since the value of
|
|
||||||
; esi is not determined at compile time
|
|
||||||
%define stk [esi+32] ; define some aliases to registers that will
|
|
||||||
%define alt [esi+28] ; be stored on the stack when the code is
|
|
||||||
%define pri [esi+24] ; actually beeing executed
|
|
||||||
%define code [esi+20]
|
|
||||||
%define amx [esi+16]
|
|
||||||
%define retval [esi+12]
|
|
||||||
%define stp [esi+8]
|
|
||||||
%define hea [esi+4]
|
|
||||||
%define frm [esi] ; FRM is NOT stored in ebp, FRM+DAT is being held
|
|
||||||
; in ebx instead.
|
; in ebx instead.
|
||||||
|
|
||||||
;
|
;
|
||||||
; #define PUSH(v) ( stk-=sizeof(cell), *(cell *)(data+(int)stk)=v )
|
; #define PUSH(v) ( stk-=sizeof(cell), *(cell *)(data+(int)stk)=v )
|
||||||
;
|
;
|
||||||
%macro _PUSH 1
|
%macro _PUSH 1
|
||||||
push dword %1
|
lea esi,[esi-4]
|
||||||
|
mov dword [esi], %1
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%macro _PUSHMEM 1
|
||||||
|
lea esi,[esi-4]
|
||||||
|
mov ebp, dword %1
|
||||||
|
mov dword [esi], ebp
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
;
|
;
|
||||||
; #define POP(v) ( v=*(cell *)(data+(int)stk), stk+=sizeof(cell) )
|
; #define POP(v) ( v=*(cell *)(data+(int)stk), stk+=sizeof(cell) )
|
||||||
;
|
;
|
||||||
%macro _POP 1
|
%macro _POP 1
|
||||||
pop dword %1
|
mov %1, dword [esi]
|
||||||
|
lea esi,[esi+4]
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
|
|
||||||
;
|
;
|
||||||
; For determining the biggest native code section generated for ONE Small
|
; For determining the biggest native code section generated for ONE Pawn
|
||||||
; opcode. (See the following macro and the PUBLIC function getMaxCodeSize().)
|
; opcode. (See the following macro and the PUBLIC function getMaxCodeSize().)
|
||||||
;
|
;
|
||||||
; GWMV: Do NOT see the following macro. See CHECKCODESIZE instead.
|
; GWMV: Do NOT see the following macro. See CHECKCODESIZE instead.
|
||||||
@ -276,8 +254,8 @@ AMX_FLAG_RELOC equ 8000h ; jump/call addresses relocated
|
|||||||
mov esi, %1 ;get source address of JIT code
|
mov esi, %1 ;get source address of JIT code
|
||||||
mov ecx,%2-%1 ;get number of bytes to copy
|
mov ecx,%2-%1 ;get number of bytes to copy
|
||||||
mov [ebx],edi ;store address for jump-correction
|
mov [ebx],edi ;store address for jump-correction
|
||||||
add ebx,%3
|
add ebx,%3
|
||||||
rep movsb
|
rep movsb
|
||||||
cmp ebx,[end_code]
|
cmp ebx,[end_code]
|
||||||
jae code_gen_done
|
jae code_gen_done
|
||||||
jmp dword [ebx] ;go on with the next opcode
|
jmp dword [ebx] ;go on with the next opcode
|
||||||
@ -286,7 +264,7 @@ AMX_FLAG_RELOC equ 8000h ; jump/call addresses relocated
|
|||||||
; GWMV:
|
; GWMV:
|
||||||
; Nasm can't handle the determination of the maximum code size as was done
|
; Nasm can't handle the determination of the maximum code size as was done
|
||||||
; in the Masm implementation, since it only does two passes. This macro is
|
; in the Masm implementation, since it only does two passes. This macro is
|
||||||
; called *after* the code for each Small instruction.
|
; called *after* the code for each Pawn instruction.
|
||||||
%macro CHECKCODESIZE 1
|
%macro CHECKCODESIZE 1
|
||||||
%if MAXCODESIZE < $-%1
|
%if MAXCODESIZE < $-%1
|
||||||
%assign MAXCODESIZE $-%1
|
%assign MAXCODESIZE $-%1
|
||||||
@ -294,7 +272,7 @@ AMX_FLAG_RELOC equ 8000h ; jump/call addresses relocated
|
|||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
;
|
;
|
||||||
; Modify the argument of an x86 instruction with the Small opcode's parameter
|
; Modify the argument of an x86 instruction with the Pawn opcode's parameter
|
||||||
; before copying the code.
|
; before copying the code.
|
||||||
;
|
;
|
||||||
%macro putval 1
|
%macro putval 1
|
||||||
@ -330,7 +308,7 @@ section .text
|
|||||||
|
|
||||||
|
|
||||||
global asm_runJIT, _asm_runJIT
|
global asm_runJIT, _asm_runJIT
|
||||||
global amx_exec_asm, _amx_exec_asm
|
global amx_exec_jit, _amx_exec_jit
|
||||||
global getMaxCodeSize, _getMaxCodeSize
|
global getMaxCodeSize, _getMaxCodeSize
|
||||||
|
|
||||||
|
|
||||||
@ -455,7 +433,7 @@ reloc_done:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
; GWMV:
|
; GWMV:
|
||||||
; The code below modifies itself to store the arguments to the Small opcodes
|
; The code below modifies itself to store the arguments to the Pawn opcodes
|
||||||
; in the compiled code. This is fine, but the .text section in an ELF executable
|
; in the compiled code. This is fine, but the .text section in an ELF executable
|
||||||
; is usually marked read-only, that's why this code is in the .data section.
|
; is usually marked read-only, that's why this code is in the .data section.
|
||||||
|
|
||||||
@ -837,7 +815,7 @@ OP_LCTRL:
|
|||||||
jne lctrl_5
|
jne lctrl_5
|
||||||
GO_ON j_lctrl_4, lctrl_5, 8
|
GO_ON j_lctrl_4, lctrl_5, 8
|
||||||
j_lctrl_4:
|
j_lctrl_4:
|
||||||
mov eax,esp ; 4=STK
|
mov eax,esi ; 4=STK
|
||||||
sub eax,edi
|
sub eax,edi
|
||||||
CHECKCODESIZE j_lctrl_4
|
CHECKCODESIZE j_lctrl_4
|
||||||
lctrl_5:
|
lctrl_5:
|
||||||
@ -871,7 +849,7 @@ OP_SCTRL:
|
|||||||
j_sctrl_4:
|
j_sctrl_4:
|
||||||
;mov esp,eax ; 4=STK
|
;mov esp,eax ; 4=STK
|
||||||
;add esp,edi ; relocate stack
|
;add esp,edi ; relocate stack
|
||||||
lea esp,[eax+edi]
|
lea esi,[eax+edi]
|
||||||
CHECKCODESIZE j_sctrl_4
|
CHECKCODESIZE j_sctrl_4
|
||||||
sctrl_5:
|
sctrl_5:
|
||||||
cmp eax,5
|
cmp eax,5
|
||||||
@ -932,14 +910,16 @@ OP_PUSH_ALT:
|
|||||||
|
|
||||||
OP_PUSH_R_PRI:
|
OP_PUSH_R_PRI:
|
||||||
;nop;
|
;nop;
|
||||||
putval j_push_r_pri+1
|
putval j_push_r_pri+2
|
||||||
GO_ON j_push_r_pri, OP_PUSH_C, 8
|
GO_ON j_push_r_pri, OP_PUSH_C, 8
|
||||||
|
|
||||||
j_push_r_pri:
|
j_push_r_pri:
|
||||||
|
push ecx
|
||||||
mov ecx,12345678h
|
mov ecx,12345678h
|
||||||
j_push_loop:
|
j_push_loop:
|
||||||
_PUSH eax
|
_PUSH eax
|
||||||
loop j_push_loop
|
loop j_push_loop
|
||||||
|
pop ecx
|
||||||
;dec ecx
|
;dec ecx
|
||||||
;jnz j_push_loop
|
;jnz j_push_loop
|
||||||
CHECKCODESIZE j_push_r_pri
|
CHECKCODESIZE j_push_r_pri
|
||||||
@ -947,30 +927,33 @@ OP_PUSH_R_PRI:
|
|||||||
;good
|
;good
|
||||||
OP_PUSH_C:
|
OP_PUSH_C:
|
||||||
;nop;
|
;nop;
|
||||||
putval j_push_c+1
|
putval j_push_c_end-4
|
||||||
GO_ON j_push_c, OP_PUSH, 8
|
GO_ON j_push_c, OP_PUSH, 8
|
||||||
|
|
||||||
j_push_c:
|
j_push_c:
|
||||||
_PUSH 12345678h
|
_PUSH 12345678h
|
||||||
|
j_push_c_end:
|
||||||
CHECKCODESIZE j_push_c
|
CHECKCODESIZE j_push_c
|
||||||
|
|
||||||
OP_PUSH:
|
OP_PUSH:
|
||||||
;nop;
|
;nop;
|
||||||
putval j_push+2
|
putval j_push_end-6
|
||||||
GO_ON j_push, OP_PUSH_S, 8
|
GO_ON j_push, OP_PUSH_S, 8
|
||||||
|
|
||||||
j_push:
|
j_push:
|
||||||
_PUSH [edi+12345678h]
|
_PUSHMEM [edi+12345678h]
|
||||||
|
j_push_end:
|
||||||
CHECKCODESIZE j_push
|
CHECKCODESIZE j_push
|
||||||
|
|
||||||
;good
|
;good
|
||||||
OP_PUSH_S:
|
OP_PUSH_S:
|
||||||
;nop;
|
;nop;
|
||||||
putval j_push_s+2
|
putval j_push_s_end-6
|
||||||
GO_ON j_push_s, OP_POP_PRI, 8
|
GO_ON j_push_s, OP_POP_PRI, 8
|
||||||
|
|
||||||
j_push_s:
|
j_push_s:
|
||||||
_PUSH [ebx+12345678h]
|
_PUSHMEM [ebx+12345678h]
|
||||||
|
j_push_s_end:
|
||||||
CHECKCODESIZE j_push_s
|
CHECKCODESIZE j_push_s
|
||||||
|
|
||||||
OP_POP_PRI:
|
OP_POP_PRI:
|
||||||
@ -997,8 +980,8 @@ OP_STACK:
|
|||||||
GO_ON j_stack, OP_HEAP, 8
|
GO_ON j_stack, OP_HEAP, 8
|
||||||
|
|
||||||
j_stack:
|
j_stack:
|
||||||
mov edx,esp
|
mov edx,esi
|
||||||
add esp,12345678h
|
add esi,12345678h
|
||||||
sub edx,edi
|
sub edx,edi
|
||||||
%ifdef DORUNTIMECHECKS
|
%ifdef DORUNTIMECHECKS
|
||||||
call [chk_marginstack]
|
call [chk_marginstack]
|
||||||
@ -1026,9 +1009,9 @@ OP_PROC:
|
|||||||
GO_ON j_proc, OP_RET
|
GO_ON j_proc, OP_RET
|
||||||
|
|
||||||
j_proc: ;[STK] = FRM, STK = STK - cell size, FRM = STK
|
j_proc: ;[STK] = FRM, STK = STK - cell size, FRM = STK
|
||||||
_PUSH frm ; push old frame (for RET/RETN)
|
_PUSHMEM frm ; push old frame (for RET/RETN)
|
||||||
mov frm,esp ; get new frame
|
mov frm,esi ; get new frame
|
||||||
mov ebx,esp ; already relocated
|
mov ebx,esi ; already relocated
|
||||||
sub frm,edi ; relocate frame
|
sub frm,edi ; relocate frame
|
||||||
CHECKCODESIZE j_proc
|
CHECKCODESIZE j_proc
|
||||||
|
|
||||||
@ -1038,6 +1021,7 @@ OP_RET:
|
|||||||
|
|
||||||
j_ret:
|
j_ret:
|
||||||
_POP ebx ; pop frame
|
_POP ebx ; pop frame
|
||||||
|
lea esi,[esi+4]
|
||||||
mov frm,ebx
|
mov frm,ebx
|
||||||
add ebx,edi
|
add ebx,edi
|
||||||
ret
|
ret
|
||||||
@ -1056,11 +1040,13 @@ OP_RETN:
|
|||||||
;good
|
;good
|
||||||
OP_CALL:
|
OP_CALL:
|
||||||
;nop;
|
;nop;
|
||||||
RELOC 1
|
RELOC j_call_e8-j_call+1
|
||||||
GO_ON j_call, OP_CALL_I, 8
|
GO_ON j_call, OP_CALL_I, 8
|
||||||
|
|
||||||
j_call:
|
j_call:
|
||||||
;call 12345678h ; tasm chokes on this out of a sudden
|
;call 12345678h ; tasm chokes on this out of a sudden
|
||||||
|
_PUSH 0
|
||||||
|
j_call_e8
|
||||||
db 0e8h, 0, 0, 0, 0
|
db 0e8h, 0, 0, 0, 0
|
||||||
CHECKCODESIZE j_call
|
CHECKCODESIZE j_call
|
||||||
|
|
||||||
@ -1069,6 +1055,7 @@ OP_CALL_I:
|
|||||||
GO_ON j_call_i, OP_JUMP
|
GO_ON j_call_i, OP_JUMP
|
||||||
|
|
||||||
j_call_i:
|
j_call_i:
|
||||||
|
_PUSH 0
|
||||||
call eax
|
call eax
|
||||||
CHECKCODESIZE j_call_i
|
CHECKCODESIZE j_call_i
|
||||||
|
|
||||||
@ -1219,24 +1206,30 @@ OP_SHL:
|
|||||||
;nop;
|
;nop;
|
||||||
GO_ON j_shl, OP_SHR
|
GO_ON j_shl, OP_SHR
|
||||||
j_shl:
|
j_shl:
|
||||||
mov ecx,edx ; TODO: save ECX if used as special register
|
push ecx
|
||||||
|
mov ecx,edx
|
||||||
shl eax,cl
|
shl eax,cl
|
||||||
|
pop ecx
|
||||||
CHECKCODESIZE j_shl
|
CHECKCODESIZE j_shl
|
||||||
|
|
||||||
OP_SHR:
|
OP_SHR:
|
||||||
;nop;
|
;nop;
|
||||||
GO_ON j_shr, OP_SSHR
|
GO_ON j_shr, OP_SSHR
|
||||||
j_shr:
|
j_shr:
|
||||||
mov ecx,edx ; TODO: save ECX if used as special register
|
push ecx
|
||||||
|
mov ecx,edx
|
||||||
shr eax,cl
|
shr eax,cl
|
||||||
|
pop ecx
|
||||||
CHECKCODESIZE j_shr
|
CHECKCODESIZE j_shr
|
||||||
|
|
||||||
OP_SSHR:
|
OP_SSHR:
|
||||||
;nop;
|
;nop;
|
||||||
GO_ON j_sshr, OP_SHL_C_PRI
|
GO_ON j_sshr, OP_SHL_C_PRI
|
||||||
j_sshr:
|
j_sshr:
|
||||||
mov ecx,edx ; TODO: save ECX if used as special register
|
push ecx
|
||||||
|
mov ecx,edx
|
||||||
sar eax,cl
|
sar eax,cl
|
||||||
|
pop ecx
|
||||||
CHECKCODESIZE j_sshr
|
CHECKCODESIZE j_sshr
|
||||||
|
|
||||||
OP_SHL_C_PRI:
|
OP_SHL_C_PRI:
|
||||||
@ -1655,29 +1648,35 @@ OP_DEC_I:
|
|||||||
|
|
||||||
OP_MOVS:
|
OP_MOVS:
|
||||||
;nop;
|
;nop;
|
||||||
putval j_movs+1
|
putval j_movs+2
|
||||||
GO_ON j_movs, OP_CMPS, 8
|
GO_ON j_movs, OP_CMPS, 8
|
||||||
j_movs:
|
j_movs:
|
||||||
mov ecx,12345678h ;TODO: save ECX if used as special register
|
push ecx
|
||||||
|
mov ecx,12345678h
|
||||||
call [jit_movs]
|
call [jit_movs]
|
||||||
|
pop ecx
|
||||||
CHECKCODESIZE j_movs
|
CHECKCODESIZE j_movs
|
||||||
|
|
||||||
OP_CMPS:
|
OP_CMPS:
|
||||||
;nop;
|
;nop;
|
||||||
putval j_cmps+1
|
putval j_cmps+2
|
||||||
GO_ON j_cmps, OP_FILL, 8
|
GO_ON j_cmps, OP_FILL, 8
|
||||||
j_cmps:
|
j_cmps:
|
||||||
mov ecx,12345678h ;TODO: save ECX if used as special register
|
push ecx
|
||||||
|
mov ecx,12345678h
|
||||||
call [jit_cmps]
|
call [jit_cmps]
|
||||||
|
pop ecx
|
||||||
CHECKCODESIZE j_cmps
|
CHECKCODESIZE j_cmps
|
||||||
|
|
||||||
OP_FILL:
|
OP_FILL:
|
||||||
;nop;
|
;nop;
|
||||||
putval j_fill+1
|
putval j_fill+2
|
||||||
GO_ON j_fill, OP_HALT, 8
|
GO_ON j_fill, OP_HALT, 8
|
||||||
j_fill:
|
j_fill:
|
||||||
|
push ecx
|
||||||
mov ecx,12345678h ;TODO: save ECX if used as special register
|
mov ecx,12345678h ;TODO: save ECX if used as special register
|
||||||
call [jit_fill]
|
call [jit_fill]
|
||||||
|
pop ecx
|
||||||
CHECKCODESIZE j_fill
|
CHECKCODESIZE j_fill
|
||||||
|
|
||||||
;good
|
;good
|
||||||
@ -1734,23 +1733,11 @@ OP_FILE: ;opcode is simply ignored
|
|||||||
|
|
||||||
OP_LINE:
|
OP_LINE:
|
||||||
;nop;
|
;nop;
|
||||||
%ifndef ALLOWOPLINE
|
|
||||||
mov [ebx],edi ; no line number support: ignore opcode
|
mov [ebx],edi ; no line number support: ignore opcode
|
||||||
add ebx,12 ; move on to next opcode
|
add ebx,12 ; move on to next opcode
|
||||||
cmp ebx,[end_code]
|
cmp ebx,[end_code]
|
||||||
jae code_gen_done
|
jae code_gen_done
|
||||||
jmp dword [ebx] ; go on with the next opcode
|
jmp dword [ebx] ; go on with the next opcode
|
||||||
%else
|
|
||||||
putval j_line+6
|
|
||||||
mov eax,[ebx+8]
|
|
||||||
mov [j_line_sm],eax
|
|
||||||
GO_ON j_line, OP_SYMBOL, 12
|
|
||||||
j_line:
|
|
||||||
call [jit_line]
|
|
||||||
DD 0 ; space for curline
|
|
||||||
j_line_sm DD 0 ; space for curfile
|
|
||||||
CHECKCODESIZE j_line
|
|
||||||
%endif
|
|
||||||
|
|
||||||
OP_SYMBOL: ;ignored
|
OP_SYMBOL: ;ignored
|
||||||
mov [ebx],edi
|
mov [ebx],edi
|
||||||
@ -1881,6 +1868,23 @@ OP_SYMTAG: ;ignored (TR)
|
|||||||
jmp dword [ebx] ; go on with the next opcode
|
jmp dword [ebx] ; go on with the next opcode
|
||||||
|
|
||||||
|
|
||||||
|
OP_BREAK:
|
||||||
|
%ifndef DEBUGSUPPORT
|
||||||
|
mov [ebx],edi ; no line number support: ignore opcode
|
||||||
|
add ebx,4 ; move on to next opcode
|
||||||
|
cmp ebx,[end_code]
|
||||||
|
jae code_gen_done
|
||||||
|
jmp DWORD [ebx] ; go on with the next opcode
|
||||||
|
%else
|
||||||
|
GO_ON j_break, OP_INVALID
|
||||||
|
j_break:
|
||||||
|
mov ebp,amx
|
||||||
|
cmp DWORD [ebp+_debug], 0
|
||||||
|
je $+4 ; jump around the "call" statement
|
||||||
|
call [jit_break]
|
||||||
|
CHECKCODESIZE j_break
|
||||||
|
%endif
|
||||||
|
|
||||||
OP_INVALID: ; break from the compiler with an error code
|
OP_INVALID: ; break from the compiler with an error code
|
||||||
mov eax,AMX_ERR_INVINSTR
|
mov eax,AMX_ERR_INVINSTR
|
||||||
pop esi
|
pop esi
|
||||||
@ -1894,12 +1898,12 @@ section .text
|
|||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; ;
|
; ;
|
||||||
;cell asm_exec( cell *regs, cell *retval, cell stp, cell hea );
|
;cell amx_exec( cell *regs, cell *retval, cell stp, cell hea );
|
||||||
; eax edx ebx ecx ;
|
; eax edx ebx ecx ;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
amx_exec_asm:
|
amx_exec_jit:
|
||||||
_amx_exec_asm:
|
_amx_exec_jit:
|
||||||
push edi
|
push edi
|
||||||
push esi
|
push esi
|
||||||
push ebp
|
push ebp
|
||||||
@ -1921,7 +1925,7 @@ _amx_exec_asm:
|
|||||||
push dword [eax+20]; store FRM
|
push dword [eax+20]; store FRM
|
||||||
|
|
||||||
mov edx,[eax+4] ; get ALT
|
mov edx,[eax+4] ; get ALT
|
||||||
mov ecx,[eax+8] ; get CIP
|
mov ebp,[eax+8] ; get CIP
|
||||||
mov edi,[eax+12] ; get pointer to data segment
|
mov edi,[eax+12] ; get pointer to data segment
|
||||||
mov esi,[eax+16] ; get STK !!changed, now ECX free as counter!!
|
mov esi,[eax+16] ; get STK !!changed, now ECX free as counter!!
|
||||||
mov ebx,[eax+20] ; get FRM
|
mov ebx,[eax+20] ; get FRM
|
||||||
@ -1929,13 +1933,14 @@ _amx_exec_asm:
|
|||||||
add ebx,edi ; relocate frame
|
add ebx,edi ; relocate frame
|
||||||
|
|
||||||
add esi,edi ; ESP will contain DAT+STK
|
add esi,edi ; ESP will contain DAT+STK
|
||||||
xchg esp,esi ; switch to AMX stack
|
|
||||||
|
|
||||||
add stp,edi ; make STP absolute address for run-time checks
|
add [esp+8],edi ; make STP absolute address for run-time checks
|
||||||
|
|
||||||
_POP ebp ; AMX pseudo-return address, ignored
|
mov dword [esi], 0 ; zero this out, but we need to keep it so
|
||||||
|
; the stack frame is in tact
|
||||||
|
mov ecx,esp ; copy stack pointer
|
||||||
; Call compiled code via CALL NEAR <address>
|
; Call compiled code via CALL NEAR <address>
|
||||||
call ecx
|
call ebp
|
||||||
|
|
||||||
return_to_caller:
|
return_to_caller:
|
||||||
cmp dword retval,0
|
cmp dword retval,0
|
||||||
@ -1948,15 +1953,17 @@ return_to_caller:
|
|||||||
jmp _return
|
jmp _return
|
||||||
|
|
||||||
_return_popstack:
|
_return_popstack:
|
||||||
add esp,4 ; Correct ESP, because we just come from a
|
mov esp,ecx ; get our old stack pointer
|
||||||
; runtime error checking routine.
|
|
||||||
_return:
|
_return:
|
||||||
; store machine state
|
; store machine state
|
||||||
mov ecx,esp ; get STK into ECX
|
push ecx
|
||||||
|
push ecx
|
||||||
mov ebp,amx ; get amx into EBP
|
mov ebp,amx ; get amx into EBP
|
||||||
|
mov ecx,esi ; get STK into ECX
|
||||||
|
|
||||||
sub ecx,edi ; correct STK
|
sub ecx,edi ; correct STK
|
||||||
mov [ebp+_stk],ecx ; store values in AMX structure: STK, ...
|
mov [ebp+_stk],ecx ; store values in AMX structure: STK, ...
|
||||||
|
pop ecx ; get orig value
|
||||||
mov ecx,hea ; ... HEA, ...
|
mov ecx,hea ; ... HEA, ...
|
||||||
mov [ebp+_hea],ecx
|
mov [ebp+_hea],ecx
|
||||||
mov ecx,ebx ; ... and FRM
|
mov ecx,ebx ; ... and FRM
|
||||||
@ -1966,8 +1973,8 @@ _return:
|
|||||||
mov [ebp+_alt],edx ; ... and ALT
|
mov [ebp+_alt],edx ; ... and ALT
|
||||||
|
|
||||||
; return
|
; return
|
||||||
|
pop ecx
|
||||||
sub stp,edi ; make STP relative to DAT again
|
sub stp,edi ; make STP relative to DAT again
|
||||||
xchg esp,esi ; switch back to caller's stack
|
|
||||||
|
|
||||||
add esp,4*9 ; remove temporary data
|
add esp,4*9 ; remove temporary data
|
||||||
|
|
||||||
@ -1988,12 +1995,8 @@ err_stacklow:
|
|||||||
jmp _return_popstack
|
jmp _return_popstack
|
||||||
|
|
||||||
_CHKMARGIN_STACK: ; some run-time check routines
|
_CHKMARGIN_STACK: ; some run-time check routines
|
||||||
cmp esp,stp
|
cmp esi,stp
|
||||||
lea ebp,[esp-STACKRESERVE]
|
|
||||||
jg err_stacklow
|
jg err_stacklow
|
||||||
sub ebp,edi
|
|
||||||
cmp hea,ebp
|
|
||||||
jg err_stack
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
err_heaplow:
|
err_heaplow:
|
||||||
@ -2001,7 +2004,7 @@ err_heaplow:
|
|||||||
jmp _return_popstack
|
jmp _return_popstack
|
||||||
|
|
||||||
_CHKMARGIN_HEAP:
|
_CHKMARGIN_HEAP:
|
||||||
cmp esp,stp
|
cmp esi,stp
|
||||||
jg err_stacklow
|
jg err_stacklow
|
||||||
cmp dword hea,0
|
cmp dword hea,0
|
||||||
jl err_heaplow
|
jl err_heaplow
|
||||||
@ -2017,7 +2020,7 @@ _VERIFYADDRESS_eax: ; used in load.i, store.i & lidx
|
|||||||
cmp eax,hea
|
cmp eax,hea
|
||||||
jb veax1
|
jb veax1
|
||||||
lea ebp,[eax+edi]
|
lea ebp,[eax+edi]
|
||||||
cmp ebp,esp
|
cmp ebp,esi
|
||||||
jb err_memaccess
|
jb err_memaccess
|
||||||
veax1:
|
veax1:
|
||||||
ret
|
ret
|
||||||
@ -2028,7 +2031,7 @@ _VERIFYADDRESS_edx: ; used in load.i, store.i & lidx
|
|||||||
cmp edx,hea
|
cmp edx,hea
|
||||||
jb vedx1
|
jb vedx1
|
||||||
lea ebp,[edx+edi]
|
lea ebp,[edx+edi]
|
||||||
cmp ebp,esp
|
cmp ebp,esi
|
||||||
jb err_memaccess
|
jb err_memaccess
|
||||||
vedx1:
|
vedx1:
|
||||||
ret
|
ret
|
||||||
@ -2060,15 +2063,15 @@ JIT_OP_SDIV:
|
|||||||
|
|
||||||
JIT_OP_RETN:
|
JIT_OP_RETN:
|
||||||
_POP ebx ; pop frame
|
_POP ebx ; pop frame
|
||||||
_POP ecx ; get return address
|
add esi,4 ; get rid of the extra parameter from call
|
||||||
|
|
||||||
mov frm,ebx
|
mov frm,ebx
|
||||||
_POP ebp
|
_POP ebp
|
||||||
|
|
||||||
add ebx,edi
|
add ebx,edi
|
||||||
add esp,ebp ; remove data from stack
|
add esi,ebp ; remove data from stack
|
||||||
|
|
||||||
jmp ecx
|
ret
|
||||||
|
|
||||||
|
|
||||||
JIT_OP_MOVS: ;length of block to copy is already in ECX
|
JIT_OP_MOVS: ;length of block to copy is already in ECX
|
||||||
@ -2134,34 +2137,33 @@ err_divide:
|
|||||||
jmp _return_popstack
|
jmp _return_popstack
|
||||||
|
|
||||||
JIT_OP_SYSREQ:
|
JIT_OP_SYSREQ:
|
||||||
mov ecx,esp ; get STK into ECX
|
push ecx
|
||||||
|
push esi
|
||||||
mov ebp,amx ; get amx into EBP
|
mov ebp,amx ; get amx into EBP
|
||||||
|
|
||||||
sub ecx,edi ; correct STK
|
sub esi,edi ; correct STK
|
||||||
mov alt,edx ; save ALT
|
mov alt,edx ; save ALT
|
||||||
|
|
||||||
mov [ebp+_stk],ecx ; store values in AMX structure: STK,
|
mov [ebp+_stk],esi ; store values in AMX structure: STK,
|
||||||
mov ecx,hea ; HEA,
|
mov esi,hea ; HEA,
|
||||||
mov ebx,frm ; and FRM
|
mov ebx,frm ; and FRM
|
||||||
mov [ebp+_hea],ecx
|
mov [ebp+_hea],esi
|
||||||
mov [ebp+_frm],ebx
|
mov [ebp+_frm],ebx
|
||||||
|
|
||||||
lea ebx,pri ; 3rd param: addr. of retval
|
lea ebx,pri ; 3rd param: addr. of retval
|
||||||
lea ecx,[esp+4] ; 4th param: parameter array
|
|
||||||
|
|
||||||
xchg esp,esi ; switch to caller stack
|
;Our original esi is still pushed!
|
||||||
|
|
||||||
push ecx
|
|
||||||
push ebx
|
push ebx
|
||||||
push eax ; 2nd param: function number
|
push eax ; 2nd param: function number
|
||||||
push ebp ; 1st param: amx
|
push ebp ; 1st param: amx
|
||||||
call [ebp+_callback]
|
call [ebp+_callback]
|
||||||
_DROPARGS 16 ; remove args from stack
|
_DROPARGS 12 ; remove args from stack
|
||||||
|
|
||||||
xchg esp,esi ; switch back to AMX stack
|
pop esi
|
||||||
|
pop ecx
|
||||||
cmp eax,AMX_ERR_NONE
|
cmp eax,AMX_ERR_NONE
|
||||||
jne _return_popstack; return error code, if any
|
jne _return_popstack
|
||||||
|
.continue:
|
||||||
mov eax,pri ; get retval into eax (PRI)
|
mov eax,pri ; get retval into eax (PRI)
|
||||||
mov edx,alt ; restore ALT
|
mov edx,alt ; restore ALT
|
||||||
mov ebx,frm ; restore FRM
|
mov ebx,frm ; restore FRM
|
||||||
@ -2170,25 +2172,25 @@ JIT_OP_SYSREQ:
|
|||||||
|
|
||||||
|
|
||||||
JIT_OP_SYSREQ_D: ; (TR)
|
JIT_OP_SYSREQ_D: ; (TR)
|
||||||
mov ecx,esp ; get STK into ECX
|
push ecx
|
||||||
|
push esi
|
||||||
mov ebp,amx ; get amx into EBP
|
mov ebp,amx ; get amx into EBP
|
||||||
|
|
||||||
sub ecx,edi ; correct STK
|
sub esi,edi ; correct STK
|
||||||
mov alt,edx ; save ALT
|
mov alt,edx ; save ALT
|
||||||
|
|
||||||
mov [ebp+_stk],ecx ; store values in AMX structure: STK,
|
mov [ebp+_stk],esi ; store values in AMX structure: STK,
|
||||||
mov ecx,hea ; HEA,
|
mov esi,hea ; HEA,
|
||||||
mov eax,frm ; and FRM
|
mov eax,frm ; and FRM
|
||||||
mov [ebp+_hea],ecx
|
mov [ebp+_hea],esi
|
||||||
mov [ebp+_frm],eax ; eax & ecx are invalid by now
|
mov [ebp+_frm],eax ; eax & ecx are invalid by now
|
||||||
|
|
||||||
lea edx,[esp+4] ; 2nd param: parameter array
|
;esi is still pushed!
|
||||||
xchg esp,esi ; switch to caller stack
|
|
||||||
push edx
|
|
||||||
push ebp ; 1st param: amx
|
push ebp ; 1st param: amx
|
||||||
call ebx ; direct call
|
call ebx ; direct call
|
||||||
_DROPARGS 8 ; remove args from stack
|
_DROPARGS 8 ; remove args from stack
|
||||||
xchg esp,esi ; switch back to AMX stack
|
|
||||||
|
pop ecx
|
||||||
mov ebp,amx ; get amx into EBP
|
mov ebp,amx ; get amx into EBP
|
||||||
cmp dword [ebp+_error],AMX_ERR_NONE
|
cmp dword [ebp+_error],AMX_ERR_NONE
|
||||||
jne _return_popstack; return error code, if any
|
jne _return_popstack; return error code, if any
|
||||||
@ -2200,32 +2202,57 @@ JIT_OP_SYSREQ_D: ; (TR)
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
JIT_OP_LINE:
|
JIT_OP_BREAK:
|
||||||
pop ecx ; get return address
|
%ifdef DEBUGSUPPORT
|
||||||
mov ebp,amx
|
push ecx
|
||||||
push eax
|
push esi
|
||||||
push edx
|
mov ebp,amx ; get amx into EBP
|
||||||
mov eax,[ecx] ; get curline
|
|
||||||
mov edx,[ecx+4] ; get curfile
|
|
||||||
add ecx,8 ; skip curline & curfile
|
|
||||||
mov [ebp+_curline],eax ; store curline
|
|
||||||
mov [ebp+_curfile],edx ; store curfile
|
|
||||||
|
|
||||||
pop edx
|
sub esi,edi ; correct STK
|
||||||
pop eax
|
|
||||||
jmp ecx ; jump back
|
mov [ebp+_pri],eax ; store values in AMX structure: PRI,
|
||||||
|
mov [ebp+_alt],edx ; ALT,
|
||||||
|
mov [ebp+_stk],esi ; STK,
|
||||||
|
mov esi,hea ; HEA,
|
||||||
|
mov ebx,frm ; and FRM
|
||||||
|
mov [ebp+_hea],esi
|
||||||
|
mov [ebp+_frm],ebx ; EBX & ECX are invalid by now
|
||||||
|
;??? storing CIP is not very useful, because the code changed (during JIT compile)
|
||||||
|
|
||||||
|
push ebp ; 1st param: amx
|
||||||
|
call [ebp+_debug]
|
||||||
|
_DROPARGS 4 ; remove args from stack
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
pop ecx
|
||||||
|
cmp eax,AMX_ERR_NONE
|
||||||
|
jne _return_popstack; return error code, if any
|
||||||
|
|
||||||
|
mov ebp,amx ; get amx into EBP
|
||||||
|
mov eax,[ebp+_pri] ; restore values
|
||||||
|
mov edx,[ebp+_alt] ; ALT,
|
||||||
|
mov edx,alt ; restore ALT
|
||||||
|
mov ebx,frm ; restore FRM
|
||||||
|
add ebx,edi ; relocate frame
|
||||||
|
%endif
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
JIT_OP_SWITCH:
|
JIT_OP_SWITCH:
|
||||||
pop ebp ; pop return address = table address
|
pop ebp ; pop return address = table address
|
||||||
|
push ecx
|
||||||
mov ecx,[ebp] ; ECX = number of records
|
mov ecx,[ebp] ; ECX = number of records
|
||||||
lea ebp,[ebp+ecx*8+8] ; set pointer _after_ LAST case
|
lea ebp,[ebp+ecx*8+8] ; set pointer _after_ LAST case
|
||||||
|
;if there are zero cases we should just skip this -- bail
|
||||||
|
test ecx, ecx
|
||||||
|
jz op_switch_jump
|
||||||
op_switch_loop:
|
op_switch_loop:
|
||||||
cmp eax,[ebp-8] ; PRI == case label?
|
cmp eax,[ebp-8] ; PRI == case label?
|
||||||
je op_switch_jump ; found, jump
|
je op_switch_jump ; found, jump
|
||||||
sub ebp,8 ; position to preceding case
|
sub ebp,8 ; position to preceding case
|
||||||
loop op_switch_loop ; check next case, or fall through
|
loop op_switch_loop ; check next case, or fall through
|
||||||
op_switch_jump:
|
op_switch_jump:
|
||||||
|
pop ecx
|
||||||
%ifndef FORCERELOCATABLE
|
%ifndef FORCERELOCATABLE
|
||||||
jmp [ebp-4] ; jump to the case instructions
|
jmp [ebp-4] ; jump to the case instructions
|
||||||
%else
|
%else
|
||||||
@ -2234,9 +2261,10 @@ JIT_OP_SWITCH:
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; The caller of asm_runJIT() can determine the maximum size of the compiled
|
; The caller of asm_runJIT() can determine the maximum size of the compiled
|
||||||
; code by multiplying the result of this function by the number of opcodes in
|
; code by multiplying the result of this function by the number of opcodes in
|
||||||
; Small module.
|
; Pawn module.
|
||||||
;
|
;
|
||||||
; unsigned long getMaxCodeSize_();
|
; unsigned long getMaxCodeSize_();
|
||||||
;
|
;
|
||||||
@ -2278,17 +2306,17 @@ jit_fill DD JIT_OP_FILL
|
|||||||
jit_bounds DD JIT_OP_BOUNDS
|
jit_bounds DD JIT_OP_BOUNDS
|
||||||
jit_sysreq DD JIT_OP_SYSREQ
|
jit_sysreq DD JIT_OP_SYSREQ
|
||||||
jit_sysreq_d DD JIT_OP_SYSREQ_D
|
jit_sysreq_d DD JIT_OP_SYSREQ_D
|
||||||
jit_line DD JIT_OP_LINE
|
jit_break DD JIT_OP_BREAK
|
||||||
jit_switch DD JIT_OP_SWITCH
|
jit_switch DD JIT_OP_SWITCH
|
||||||
|
|
||||||
;
|
;
|
||||||
; The table for the browser/relocator function.
|
; The table for the browser/relocator function.
|
||||||
;
|
;
|
||||||
|
|
||||||
global amx_opcodelist, _amx_opcodelist
|
global amx_opcodelist_jit, _amx_opcodelist_jit
|
||||||
|
|
||||||
amx_opcodelist:
|
amx_opcodelist_jit:
|
||||||
_amx_opcodelist:
|
_amx_opcodelist_jit:
|
||||||
DD OP_INVALID
|
DD OP_INVALID
|
||||||
DD OP_LOAD_PRI
|
DD OP_LOAD_PRI
|
||||||
DD OP_LOAD_ALT
|
DD OP_LOAD_ALT
|
||||||
@ -2426,3 +2454,6 @@ _amx_opcodelist:
|
|||||||
DD OP_NOP ; TR
|
DD OP_NOP ; TR
|
||||||
DD OP_SYSREQ_D ; TR
|
DD OP_SYSREQ_D ; TR
|
||||||
DD OP_SYMTAG ; TR
|
DD OP_SYMTAG ; TR
|
||||||
|
DD OP_BREAK ; TR
|
||||||
|
|
||||||
|
END
|
4287
amxmodx/amxmodx.cpp
4287
amxmodx/amxmodx.cpp
File diff suppressed because it is too large
Load Diff
@ -32,13 +32,19 @@
|
|||||||
#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 "string.h"
|
||||||
#include <extdll.h>
|
#include <extdll.h>
|
||||||
#include <meta_api.h>
|
#include <meta_api.h>
|
||||||
|
#include "mm_pextensions.h" // metamod-p extensions
|
||||||
|
|
||||||
#ifdef MEMORY_TEST
|
#ifdef MEMORY_TEST
|
||||||
#include "mmgr/mmgr.h"
|
#include "mmgr/mmgr.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "md5.h"
|
#include "md5.h"
|
||||||
@ -62,32 +68,31 @@
|
|||||||
#include "amxxlog.h"
|
#include "amxxlog.h"
|
||||||
|
|
||||||
#define AMXXLOG_Log g_log.Log
|
#define AMXXLOG_Log g_log.Log
|
||||||
#define AMX_VERSION "0.2"
|
#define AMX_VERSION "1.60"
|
||||||
|
|
||||||
extern AMX_NATIVE_INFO core_Natives[];
|
|
||||||
extern AMX_NATIVE_INFO time_Natives[];
|
|
||||||
extern AMX_NATIVE_INFO power_Natives[];
|
|
||||||
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[];
|
|
||||||
|
|
||||||
|
extern AMX_NATIVE_INFO core_Natives[];
|
||||||
|
extern AMX_NATIVE_INFO time_Natives[];
|
||||||
|
extern AMX_NATIVE_INFO power_Natives[];
|
||||||
|
extern AMX_NATIVE_INFO amxmodx_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__
|
#ifndef __linux__
|
||||||
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
|
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
|
||||||
#define DLPROC(m,func) GetProcAddress(m,func)
|
#define DLPROC(m, func) GetProcAddress(m, func)
|
||||||
#define DLFREE(m) FreeLibrary(m)
|
#define DLFREE(m) FreeLibrary(m)
|
||||||
#else
|
#else
|
||||||
#define DLLOAD(path) (DLHANDLE)dlopen(path, RTLD_NOW)
|
#define DLLOAD(path) (DLHANDLE)dlopen(path, RTLD_NOW)
|
||||||
#define DLPROC(m,func) dlsym(m,func)
|
#define DLPROC(m, func) dlsym(m, func)
|
||||||
#define DLFREE(m) dlclose(m)
|
#define DLFREE(m) dlclose(m)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
typedef HINSTANCE DLHANDLE;
|
typedef HINSTANCE DLHANDLE;
|
||||||
#else
|
#else
|
||||||
typedef void* DLHANDLE;
|
typedef void* DLHANDLE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef GETPLAYERAUTHID
|
#ifndef GETPLAYERAUTHID
|
||||||
@ -103,33 +108,39 @@ 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);
|
||||||
|
|
||||||
|
char *UTIL_VarArgs(const char *fmt, ...);
|
||||||
|
|
||||||
|
|
||||||
#define GET_PLAYER_POINTER(e) (&g_players[ENTINDEX(e)])
|
#define GET_PLAYER_POINTER(e) (&g_players[ENTINDEX(e)])
|
||||||
//#define GET_PLAYER_POINTER(e) (&g_players[(((int)e-g_edict_point)/sizeof(edict_t ))])
|
//#define GET_PLAYER_POINTER(e) (&g_players[(((int)e-g_edict_point)/sizeof(edict_t))])
|
||||||
#define GET_PLAYER_POINTER_I(i) (&g_players[i])
|
#define GET_PLAYER_POINTER_I(i) (&g_players[i])
|
||||||
|
|
||||||
struct WeaponsVault {
|
struct WeaponsVault
|
||||||
String fullName;
|
{
|
||||||
short int iId;
|
String fullName;
|
||||||
short int ammoSlot;
|
short int iId;
|
||||||
|
short int ammoSlot;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fakecmd_t {
|
struct fakecmd_t
|
||||||
char args[256];
|
{
|
||||||
const char *argv[3];
|
char args[256];
|
||||||
//char argv[3][128];
|
const char *argv[3];
|
||||||
int argc;
|
int argc;
|
||||||
bool fake;
|
bool fake;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern bool g_IsNewMM;
|
||||||
|
extern pextension_funcs_t *gpMetaPExtFuncs;
|
||||||
extern CLog g_log;
|
extern CLog g_log;
|
||||||
extern CPluginMngr g_plugins;
|
extern CPluginMngr g_plugins;
|
||||||
extern CTaskMngr g_tasksMngr;
|
extern CTaskMngr g_tasksMngr;
|
||||||
@ -140,7 +151,8 @@ 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;
|
||||||
@ -151,13 +163,12 @@ extern String g_log_dir;
|
|||||||
extern String g_mod_name;
|
extern String g_mod_name;
|
||||||
extern TeamIds g_teamsIds;
|
extern TeamIds g_teamsIds;
|
||||||
extern Vault g_vault;
|
extern Vault g_vault;
|
||||||
extern CForwardMngr g_forwards;
|
extern CForwardMngr g_forwards;
|
||||||
extern WeaponsVault g_weaponsData[MAX_WEAPONS];
|
extern WeaponsVault g_weaponsData[MAX_WEAPONS];
|
||||||
extern XVars g_xvars;
|
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* amxmodx_version;
|
extern cvar_t* amxmodx_version;
|
||||||
extern cvar_t* hostname;
|
extern cvar_t* hostname;
|
||||||
@ -167,6 +178,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;
|
||||||
@ -215,14 +227,16 @@ 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 detachModules();
|
void detachModules();
|
||||||
void detachReloadModules();
|
void detachReloadModules();
|
||||||
void attachModules();
|
|
||||||
void attachMetaModModules(PLUG_LOADTIME now, const char* filename);
|
#ifdef FAKEMETA
|
||||||
|
void attachModules();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Count modules
|
// Count modules
|
||||||
enum CountModulesMode
|
enum CountModulesMode
|
||||||
@ -235,39 +249,46 @@ enum CountModulesMode
|
|||||||
int countModules(CountModulesMode mode);
|
int countModules(CountModulesMode mode);
|
||||||
void modules_callPluginsLoaded();
|
void modules_callPluginsLoaded();
|
||||||
|
|
||||||
int add_amxnatives(module_info_s* info,AMX_NATIVE_INFO*natives);
|
cell* get_amxaddr(AMX *amx, cell amx_addr);
|
||||||
cell* get_amxaddr(AMX *amx,cell amx_addr);
|
char* build_pathname(char *fmt, ...);
|
||||||
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);
|
char* format_amxstring(AMX *amx, cell *params, int parm, int& len);
|
||||||
AMX* get_amxscript(int, void**,const char**);
|
AMX* get_amxscript(int, void**, const char**);
|
||||||
const char* get_amxscriptname(AMX* amx);
|
const char* get_amxscriptname(AMX* amx);
|
||||||
char* get_amxstring(AMX *amx,cell amx_addr,int id,int& len);
|
char* get_amxstring(AMX *amx, cell amx_addr, int id, int& len);
|
||||||
|
|
||||||
int amxstring_len(cell* cstr);
|
int amxstring_len(cell* cstr);
|
||||||
int load_amxscript(AMX* amx, void** program, const char* path, char error[64]);
|
int load_amxscript(AMX* amx, void** program, const char* path, char error[64], int debug);
|
||||||
int set_amxnatives(AMX* amx,char error[64]);
|
int set_amxnatives(AMX* amx, char error[64]);
|
||||||
int set_amxstring(AMX *amx,cell amx_addr,const char *source,int max);
|
int set_amxstring(AMX *amx, cell amx_addr, const char *source, int max);
|
||||||
int unload_amxscript(AMX* amx,void** program);
|
int unload_amxscript(AMX* amx, void** program);
|
||||||
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);
|
||||||
|
void LogError(AMX *amx, int err, const char *fmt, ...);
|
||||||
|
|
||||||
enum ModuleCallReason
|
enum ModuleCallReason
|
||||||
{
|
{
|
||||||
ModuleCall_NotCalled = 0, // nothing
|
ModuleCall_NotCalled = 0, // nothing
|
||||||
ModuleCall_Query, // in Query func
|
ModuleCall_Query, // in Query func
|
||||||
ModuleCall_Attach, // in Attach func
|
ModuleCall_Attach, // in Attach func
|
||||||
ModuleCall_Detach, // in Detach func
|
ModuleCall_Detach, // in Detach func
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ModuleCallReason g_ModuleCallReason; // modules.cpp
|
extern ModuleCallReason g_ModuleCallReason; // modules.cpp
|
||||||
extern CModule *g_CurrentlyCalledModule; // modules.cpp
|
extern CModule *g_CurrentlyCalledModule; // modules.cpp
|
||||||
extern const char *g_LastRequestedFunc; // modules.cpp
|
extern const char *g_LastRequestedFunc; // modules.cpp
|
||||||
|
|
||||||
|
void Module_CacheFunctions();
|
||||||
|
void Module_UncacheFunctions();
|
||||||
|
|
||||||
void *Module_ReqFnptr(const char *funcName); // modules.cpp
|
void *Module_ReqFnptr(const char *funcName); // modules.cpp
|
||||||
|
|
||||||
// standard forwards
|
// standard forwards
|
||||||
@ -284,7 +305,16 @@ extern int FF_PluginLog;
|
|||||||
extern int FF_PluginEnd;
|
extern int FF_PluginEnd;
|
||||||
extern int FF_InconsistentFile;
|
extern int FF_InconsistentFile;
|
||||||
extern int FF_ClientAuthorized;
|
extern int FF_ClientAuthorized;
|
||||||
|
extern bool g_coloredmenus;
|
||||||
|
|
||||||
|
#ifdef FAKEMETA
|
||||||
|
extern CFakeMeta g_FakeMeta;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct func_s
|
||||||
|
{
|
||||||
|
void *pfn;
|
||||||
|
const char *desc;
|
||||||
|
};
|
||||||
|
|
||||||
extern CFakeMeta g_FakeMeta;
|
|
||||||
#endif // AMXMODX_H
|
#endif // AMXMODX_H
|
||||||
|
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
// this file does not include amxmodx.h, so we have to include the memory manager here
|
// this file does not include amxmodx.h, so we have to include the memory manager here
|
||||||
#ifdef MEMORY_TEST
|
#ifdef MEMORY_TEST
|
||||||
#include "mmgr/mmgr.h"
|
#include "mmgr/mmgr.h"
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
* by the AMX Mod X Development Team
|
* by the AMX Mod X Development Team
|
||||||
* originally developed by OLO
|
* 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
|
||||||
* under the terms of the GNU General Public License as published by the
|
* under the terms of the GNU General Public License as published by the
|
||||||
* Free Software Foundation; either version 2 of the License, or (at
|
* Free Software Foundation; either version 2 of the License, or (at
|
||||||
@ -31,30 +30,27 @@
|
|||||||
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "amxxfile.h"
|
#include "amxxfile.h"
|
||||||
#include "minilzo/minilzo.h"
|
#include "zlib/zlib.h"
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
****** AMXXFILE ******
|
****** AMXXFILE ******
|
||||||
**********************/
|
**********************/
|
||||||
|
|
||||||
#if defined __GNUC__
|
#if defined __GNUC__
|
||||||
#define PACKED __attribute__((packed))
|
#define PACKED __attribute__((packed))
|
||||||
#else
|
#else
|
||||||
#define PACKED
|
#define PACKED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined __linux__
|
#if defined __linux__
|
||||||
#pragma pack(1) /* structures must be packed (byte-aligned) */
|
#pragma pack(1) /* structures must be packed (byte-aligned) */
|
||||||
#else
|
#else
|
||||||
#pragma pack(1) /* structures must be packed (byte-aligned) */
|
#pragma pack(1) /* structures must be packed (byte-aligned) */
|
||||||
#if defined __TURBOC__
|
#if defined __TURBOC__
|
||||||
#pragma option -a- /* "pack" pragma for older Borland compilers */
|
#pragma option -a- /* "pack" pragma for older Borland compilers */
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef lzo_byte mint8_t;
|
|
||||||
typedef int16_t mint16_t;
|
|
||||||
typedef int32_t mint32_t;
|
|
||||||
|
|
||||||
struct TableEntry
|
struct TableEntry
|
||||||
{
|
{
|
||||||
mint8_t cellSize PACKED;
|
mint8_t cellSize PACKED;
|
||||||
@ -76,6 +72,9 @@ struct TableEntry
|
|||||||
|
|
||||||
CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
||||||
{
|
{
|
||||||
|
m_Bh.plugins = NULL;
|
||||||
|
m_AmxxFile = false;
|
||||||
|
|
||||||
if (!filename)
|
if (!filename)
|
||||||
{
|
{
|
||||||
m_Status = Err_InvalidParam;
|
m_Status = Err_InvalidParam;
|
||||||
@ -84,15 +83,8 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
|||||||
|
|
||||||
m_Status = Err_None;
|
m_Status = Err_None;
|
||||||
m_CellSize = cellsize;
|
m_CellSize = cellsize;
|
||||||
|
|
||||||
// Make sure the decompressor runs
|
|
||||||
if (lzo_init() != LZO_E_OK)
|
|
||||||
{
|
|
||||||
m_Status = Err_DecompressorInit;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_pFile = fopen(filename, "rb");
|
m_pFile = fopen(filename, "rb");
|
||||||
|
|
||||||
if (!m_pFile)
|
if (!m_pFile)
|
||||||
{
|
{
|
||||||
m_Status = Err_FileOpen;
|
m_Status = Err_FileOpen;
|
||||||
@ -103,13 +95,116 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
|||||||
DATAREAD(&magic, sizeof(magic), 1);
|
DATAREAD(&magic, sizeof(magic), 1);
|
||||||
|
|
||||||
m_OldFile = false;
|
m_OldFile = false;
|
||||||
if (magic != 0x524C4542)
|
|
||||||
|
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
|
// check for old file
|
||||||
AMX_HEADER hdr;
|
AMX_HEADER hdr;
|
||||||
rewind(m_pFile);
|
rewind(m_pFile);
|
||||||
fread(&hdr, sizeof(hdr), 1, m_pFile);
|
fread(&hdr, sizeof(hdr), 1, m_pFile);
|
||||||
amx_Align16(&hdr.magic);
|
amx_Align16(&hdr.magic);
|
||||||
|
|
||||||
if (hdr.magic == AMX_MAGIC)
|
if (hdr.magic == AMX_MAGIC)
|
||||||
{
|
{
|
||||||
if (cellsize != 4)
|
if (cellsize != 4)
|
||||||
@ -117,60 +212,22 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
|||||||
m_Status = Err_SectionNotFound;
|
m_Status = Err_SectionNotFound;
|
||||||
fclose(m_pFile);
|
fclose(m_pFile);
|
||||||
m_pFile = NULL;
|
m_pFile = NULL;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_OldFile = true;
|
m_OldFile = true;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// no known file format
|
// no known file format
|
||||||
m_Status = Err_FileInvalid;
|
m_Status = Err_FileInvalid;
|
||||||
fclose(m_pFile);
|
fclose(m_pFile);
|
||||||
m_pFile = NULL;
|
m_pFile = NULL;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to find the section
|
|
||||||
mint8_t numOfPlugins;
|
|
||||||
DATAREAD(&numOfPlugins, sizeof(numOfPlugins), 1);
|
|
||||||
|
|
||||||
TableEntry entry;
|
|
||||||
|
|
||||||
m_SectionHdrOffset = 0;
|
|
||||||
int i = 0;
|
|
||||||
for (i = 0; i < static_cast<int>(numOfPlugins); ++i)
|
|
||||||
{
|
|
||||||
DATAREAD(&entry, sizeof(entry), 1);
|
|
||||||
if (entry.cellSize == m_CellSize)
|
|
||||||
{
|
|
||||||
m_SectionHdrOffset = ftell(m_pFile) - sizeof(entry);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!m_SectionHdrOffset)
|
|
||||||
{
|
|
||||||
m_Status = Err_SectionNotFound;
|
|
||||||
fclose(m_pFile);
|
|
||||||
m_pFile = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// compute section length
|
|
||||||
if ((i+1) < static_cast<int>(numOfPlugins))
|
|
||||||
{
|
|
||||||
// there is a next section
|
|
||||||
TableEntry nextEntry;
|
|
||||||
DATAREAD(&nextEntry, sizeof(nextEntry), 1);
|
|
||||||
m_SectionLength = nextEntry.offset - entry.offset;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fseek(m_pFile, 0, SEEK_END);
|
|
||||||
m_SectionLength = ftell(m_pFile) - (long)entry.offset;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CAmxxReader::~CAmxxReader()
|
CAmxxReader::~CAmxxReader()
|
||||||
@ -180,6 +237,12 @@ CAmxxReader::~CAmxxReader()
|
|||||||
fclose(m_pFile);
|
fclose(m_pFile);
|
||||||
m_pFile = NULL;
|
m_pFile = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_Bh.plugins)
|
||||||
|
{
|
||||||
|
delete [] m_Bh.plugins;
|
||||||
|
m_Bh.plugins = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CAmxxReader::Error CAmxxReader::GetStatus()
|
CAmxxReader::Error CAmxxReader::GetStatus()
|
||||||
@ -205,18 +268,33 @@ size_t CAmxxReader::GetBufferSize()
|
|||||||
if (!m_pFile)
|
if (!m_pFile)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
long save = ftell(m_pFile);
|
||||||
|
|
||||||
if (m_OldFile)
|
if (m_OldFile)
|
||||||
{
|
{
|
||||||
rewind(m_pFile);
|
rewind(m_pFile);
|
||||||
AMX_HEADER hdr;
|
AMX_HEADER hdr;
|
||||||
DATAREAD(&hdr, sizeof(hdr), 1);
|
DATAREAD(&hdr, sizeof(hdr), 1);
|
||||||
|
fseek(m_pFile, save, SEEK_SET);
|
||||||
|
|
||||||
return hdr.stp;
|
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);
|
fseek(m_pFile, m_SectionHdrOffset, SEEK_SET);
|
||||||
|
|
||||||
TableEntry entry;
|
TableEntry entry;
|
||||||
DATAREAD(&entry, sizeof(entry), 1);
|
DATAREAD(&entry, sizeof(entry), 1);
|
||||||
|
fseek(m_pFile, save, SEEK_SET);
|
||||||
|
|
||||||
return entry.origSize + 1; // +1 : safe
|
return entry.origSize + 1; // +1 : safe
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,28 +324,51 @@ CAmxxReader::Error CAmxxReader::GetSection(void *buffer)
|
|||||||
rewind(m_pFile);
|
rewind(m_pFile);
|
||||||
DATAREAD(buffer, 1, filesize);
|
DATAREAD(buffer, 1, filesize);
|
||||||
m_Status = Err_None;
|
m_Status = Err_None;
|
||||||
|
|
||||||
return m_Status;
|
return m_Status;
|
||||||
}
|
}
|
||||||
|
else if (m_AmxxFile)
|
||||||
// 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);
|
|
||||||
|
|
||||||
// read the data to a temporary buffer
|
|
||||||
lzo_byte *tempBuffer = new lzo_byte[m_SectionLength + 1];
|
|
||||||
DATAREAD((void*)tempBuffer, 1, m_SectionLength);
|
|
||||||
// decompress
|
|
||||||
lzo_uint destLen = GetBufferSize();
|
|
||||||
int result = lzo1x_decompress_safe(tempBuffer, m_SectionLength,
|
|
||||||
(lzo_byte*)buffer, &destLen,
|
|
||||||
NULL /*unused*/ );
|
|
||||||
if (result != LZO_E_OK)
|
|
||||||
{
|
{
|
||||||
m_Status = Err_Decompress;
|
PluginEntry *pe = &(m_Bh.plugins[m_Entry]);
|
||||||
return Err_Decompress;
|
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;
|
||||||
}
|
}
|
||||||
return Err_None;
|
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,31 @@
|
|||||||
#ifndef __AMXXFILE_H__
|
#ifndef __AMXXFILE_H__
|
||||||
#define __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
|
class CAmxxReader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -44,7 +69,8 @@ public:
|
|||||||
Err_FileInvalid,
|
Err_FileInvalid,
|
||||||
Err_SectionNotFound,
|
Err_SectionNotFound,
|
||||||
Err_DecompressorInit,
|
Err_DecompressorInit,
|
||||||
Err_Decompress
|
Err_Decompress,
|
||||||
|
Err_OldFile,
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -52,6 +78,9 @@ private:
|
|||||||
FILE *m_pFile;
|
FILE *m_pFile;
|
||||||
|
|
||||||
bool m_OldFile; // old .amx file
|
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_CellSize;
|
||||||
int m_SectionHdrOffset; // offset to the table in the header that describes the required section
|
int m_SectionHdrOffset; // offset to the table in the header that describes the required section
|
||||||
@ -65,6 +94,4 @@ public:
|
|||||||
Error GetSection(void *buffer); // Copy the currently selected section to the buffer
|
Error GetSection(void *buffer); // Copy the currently selected section to the buffer
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // __AMXXFILE_H__
|
#endif // __AMXXFILE_H__
|
||||||
|
|
||||||
|
@ -36,10 +36,14 @@
|
|||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#endif
|
#endif
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
|
|
||||||
|
#ifndef __linux__
|
||||||
|
#define vsnprintf _vsnprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
CLog::CLog()
|
CLog::CLog()
|
||||||
{
|
{
|
||||||
m_LogType = 0;
|
m_LogType = 0;
|
||||||
@ -57,10 +61,11 @@ void CLog::CloseFile()
|
|||||||
if (!m_LogFile.empty())
|
if (!m_LogFile.empty())
|
||||||
{
|
{
|
||||||
FILE *fp = fopen(m_LogFile.c_str(), "r");
|
FILE *fp = fopen(m_LogFile.c_str(), "r");
|
||||||
|
|
||||||
if (fp)
|
if (fp)
|
||||||
{
|
{
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
fopen(m_LogFile.c_str(), "a+");
|
fp = fopen(m_LogFile.c_str(), "a+");
|
||||||
|
|
||||||
// get time
|
// get time
|
||||||
time_t td;
|
time_t td;
|
||||||
@ -73,6 +78,7 @@ void CLog::CloseFile()
|
|||||||
fprintf(fp, "L %s: %s\n", date, "Log file closed.");
|
fprintf(fp, "L %s: %s\n", date, "Log file closed.");
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_LogFile.clear();
|
m_LogFile.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,47 +86,56 @@ void CLog::CloseFile()
|
|||||||
void CLog::CreateNewFile()
|
void CLog::CreateNewFile()
|
||||||
{
|
{
|
||||||
CloseFile();
|
CloseFile();
|
||||||
|
|
||||||
// build filename
|
// build filename
|
||||||
time_t td;
|
time_t td;
|
||||||
time(&td);
|
time(&td);
|
||||||
tm *curTime = localtime(&td);
|
tm *curTime = localtime(&td);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
m_LogFile.assign(build_pathname("%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i));
|
FILE *pTmpFile = fopen(m_LogFile.c_str(), "r"); // open for reading to check whether the file exists
|
||||||
FILE *pTmpFile = fopen(m_LogFile.c_str(), "r"); // open for reading to check whether the file exists
|
|
||||||
if (!pTmpFile)
|
if (!pTmpFile)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
fclose(pTmpFile);
|
fclose(pTmpFile);
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log logfile start
|
// Log logfile start
|
||||||
FILE *fp = fopen(m_LogFile.c_str(), "w");
|
FILE *fp = fopen(m_LogFile.c_str(), "w");
|
||||||
|
|
||||||
if (!fp)
|
if (!fp)
|
||||||
{
|
{
|
||||||
ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n");
|
ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n");
|
||||||
SET_LOCALINFO("amxx_logging", "0");
|
SET_LOCALINFO("amxx_logging", "0");
|
||||||
|
} else {
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
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)
|
void CLog::UseFile(const String &fileName)
|
||||||
{
|
{
|
||||||
m_LogFile.assign(build_pathname("%s/%s", g_log_dir.c_str(), fileName.c_str()));
|
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()
|
void CLog::MapChange()
|
||||||
{
|
{
|
||||||
// create dir if not existing
|
// create dir if not existing
|
||||||
|
char file[256];
|
||||||
#ifdef __linux
|
#ifdef __linux
|
||||||
mkdir(build_pathname("%s", g_log_dir.c_str()), 0700);
|
mkdir(build_pathname_r(file, sizeof(file)-1, "%s", g_log_dir.c_str()), 0700);
|
||||||
#else
|
#else
|
||||||
mkdir(build_pathname("%s", g_log_dir.c_str()));
|
mkdir(build_pathname_r(file, sizeof(file)-1, "%s", g_log_dir.c_str()));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_LogType = atoi(get_localinfo("amxx_logging", "1"));
|
m_LogType = atoi(get_localinfo("amxx_logging", "1"));
|
||||||
|
|
||||||
if (m_LogType < 0 || m_LogType > 3)
|
if (m_LogType < 0 || m_LogType > 3)
|
||||||
{
|
{
|
||||||
SET_LOCALINFO("amxx_logging", "1");
|
SET_LOCALINFO("amxx_logging", "1");
|
||||||
@ -135,7 +150,7 @@ void CLog::MapChange()
|
|||||||
}
|
}
|
||||||
else if (m_LogType == 1)
|
else if (m_LogType == 1)
|
||||||
{
|
{
|
||||||
Log("-------- Mapchange --------");
|
Log("-------- Mapchange to %s --------", STRING(gpGlobals->mapname));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
@ -143,6 +158,8 @@ void CLog::MapChange()
|
|||||||
|
|
||||||
void CLog::Log(const char *fmt, ...)
|
void CLog::Log(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
static char file[256];
|
||||||
|
|
||||||
if (m_LogType == 1 || m_LogType == 2)
|
if (m_LogType == 1 || m_LogType == 2)
|
||||||
{
|
{
|
||||||
// get time
|
// get time
|
||||||
@ -154,14 +171,14 @@ void CLog::Log(const char *fmt, ...)
|
|||||||
strftime(date, 31, "%m/%d/%Y - %H:%M:%S", curTime);
|
strftime(date, 31, "%m/%d/%Y - %H:%M:%S", curTime);
|
||||||
|
|
||||||
// msg
|
// msg
|
||||||
char msg[3072];
|
static char msg[3072];
|
||||||
|
|
||||||
va_list arglst;
|
va_list arglst;
|
||||||
va_start(arglst, fmt);
|
va_start(arglst, fmt);
|
||||||
vsprintf(msg, fmt, arglst);
|
vsnprintf(msg, 3071, fmt, arglst);
|
||||||
va_end(arglst);
|
va_end(arglst);
|
||||||
|
|
||||||
FILE *pF;
|
FILE *pF = NULL;
|
||||||
if (m_LogType == 2)
|
if (m_LogType == 2)
|
||||||
{
|
{
|
||||||
pF = fopen(m_LogFile.c_str(), "a+");
|
pF = fopen(m_LogFile.c_str(), "a+");
|
||||||
@ -169,6 +186,7 @@ void CLog::Log(const char *fmt, ...)
|
|||||||
{
|
{
|
||||||
CreateNewFile();
|
CreateNewFile();
|
||||||
pF = fopen(m_LogFile.c_str(), "a+");
|
pF = fopen(m_LogFile.c_str(), "a+");
|
||||||
|
|
||||||
if (!pF)
|
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());
|
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());
|
||||||
@ -176,26 +194,32 @@ void CLog::Log(const char *fmt, ...)
|
|||||||
return;
|
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;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
pF = fopen(build_pathname("%s/L%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday), "a+");
|
|
||||||
}
|
|
||||||
fprintf(pF, "L %s: %s\n", date, msg);
|
|
||||||
|
|
||||||
fclose(pF);
|
|
||||||
// print on server console
|
// print on server console
|
||||||
print_srvconsole("L %s: %s\n", date, msg);
|
print_srvconsole("L %s: %s\n", date, msg);
|
||||||
}
|
}
|
||||||
else if (m_LogType == 3)
|
else if (m_LogType == 3)
|
||||||
{
|
{
|
||||||
// build message
|
// build message
|
||||||
// :TODO: Overflow possible here
|
static char msg_[3072];
|
||||||
char msg[3072];
|
|
||||||
va_list arglst;
|
va_list arglst;
|
||||||
va_start(arglst, fmt);
|
va_start(arglst, fmt);
|
||||||
vsprintf(msg, fmt, arglst);
|
vsnprintf(msg_, 3071, fmt, arglst);
|
||||||
va_end(arglst);
|
va_end(arglst);
|
||||||
ALERT(at_logged, "%s\n", msg);
|
ALERT(at_logged, "%s\n", msg_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ private:
|
|||||||
public:
|
public:
|
||||||
CLog();
|
CLog();
|
||||||
~CLog();
|
~CLog();
|
||||||
|
|
||||||
void CreateNewFile();
|
void CreateNewFile();
|
||||||
void CloseFile();
|
void CloseFile();
|
||||||
void MapChange();
|
void MapChange();
|
||||||
@ -49,4 +50,3 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
#endif // __AMXXLOG_H__
|
#endif // __AMXXLOG_H__
|
||||||
|
|
||||||
|
1230
amxmodx/debugger.cpp
Executable file
1230
amxmodx/debugger.cpp
Executable file
File diff suppressed because it is too large
Load Diff
201
amxmodx/debugger.h
Executable file
201
amxmodx/debugger.h
Executable 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), used(false), next(NULL), prev(NULL) {};
|
||||||
|
|
||||||
|
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);
|
||||||
|
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_
|
375
amxmodx/emsg.cpp
375
amxmodx/emsg.cpp
@ -57,208 +57,224 @@ WeaponsVault g_weaponsData[MAX_WEAPONS];
|
|||||||
|
|
||||||
void Client_VGUIMenu(void* mValue)
|
void Client_VGUIMenu(void* mValue)
|
||||||
{
|
{
|
||||||
if (!mPlayer) return;
|
if (!mPlayer) return;
|
||||||
switch (mState++){
|
|
||||||
case 0:
|
switch (mState++)
|
||||||
mPlayer->menu = -(*(int*)mValue);
|
{
|
||||||
break;
|
case 0:
|
||||||
case 1:
|
mPlayer->menu = -(*(int*)mValue);
|
||||||
mPlayer->keys = *(int*)mValue;
|
break;
|
||||||
}
|
case 1:
|
||||||
|
mPlayer->keys = *(int*)mValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client_ShowMenu(void* mValue)
|
void Client_ShowMenu(void* mValue)
|
||||||
{
|
{
|
||||||
if (!mPlayer) return;
|
if (!mPlayer) return;
|
||||||
switch (mState++){
|
|
||||||
case 0:
|
switch (mState++)
|
||||||
mPlayer->keys = *(int*)mValue;
|
{
|
||||||
break;
|
case 0:
|
||||||
case 3:
|
mPlayer->keys = *(int*)mValue;
|
||||||
mPlayer->menu = g_menucmds.findMenuId( (char*)mValue );
|
break;
|
||||||
}
|
case 3:
|
||||||
|
mPlayer->menu = g_menucmds.findMenuId((char*)mValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client_TeamInfo(void* mValue)
|
void Client_TeamInfo(void* mValue)
|
||||||
{
|
{
|
||||||
if (mPlayer) return;
|
if (mPlayer) return;
|
||||||
static int index;
|
static int index;
|
||||||
switch (mState++) {
|
|
||||||
case 0:
|
switch (mState++)
|
||||||
index = *(int*)mValue;
|
{
|
||||||
break;
|
case 0:
|
||||||
case 1:
|
index = *(int*)mValue;
|
||||||
if ( index < 1 || index > gpGlobals->maxClients ) break;
|
break;
|
||||||
char* msg = (char*)mValue;
|
case 1:
|
||||||
g_players[ index ].team.assign( msg );
|
if (index < 1 || index > gpGlobals->maxClients) break;
|
||||||
g_teamsIds.registerTeam( msg , -1 );
|
char* msg = (char*)mValue;
|
||||||
}
|
g_players[index].team.assign(msg);
|
||||||
|
g_teamsIds.registerTeam(msg, -1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client_TextMsg(void* mValue)
|
void Client_TextMsg(void* mValue)
|
||||||
{
|
{
|
||||||
if ( mPlayer ) return;
|
if (mPlayer) return;
|
||||||
switch (mState++) {
|
|
||||||
case 1:{
|
|
||||||
char * msg = (char*)mValue;
|
|
||||||
if (!msg) break;
|
|
||||||
if ( !strncmp("#Game_C", msg , 7) ) {
|
|
||||||
g_game_timeleft = g_game_restarting = gpGlobals->time + 3;
|
|
||||||
// g_endround_time = gpGlobals->time;
|
|
||||||
// g_newround_time = gpGlobals->time + CVAR_GET_FLOAT("mp_freezetime") + 3;
|
|
||||||
}
|
|
||||||
else if (!strncmp("#Game_w", msg , 7) ) {
|
|
||||||
g_game_timeleft = -2;
|
|
||||||
}
|
|
||||||
else if ( !strncmp("#game_clan_s", msg , 12) ){
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
switch (mState++)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
char * msg = (char*)mValue;
|
||||||
|
if (!msg) break;
|
||||||
|
|
||||||
|
if (!strncmp("#Game_C", msg, 7))
|
||||||
|
{
|
||||||
|
g_game_timeleft = g_game_restarting = gpGlobals->time + 3;
|
||||||
|
//g_endround_time = gpGlobals->time;
|
||||||
|
//g_newround_time = gpGlobals->time + CVAR_GET_FLOAT("mp_freezetime") + 3;
|
||||||
|
}
|
||||||
|
else if (!strncmp("#Game_w", msg, 7))
|
||||||
|
{
|
||||||
|
g_game_timeleft = -2;
|
||||||
|
}
|
||||||
|
else if (!strncmp("#game_clan_s", msg, 12))
|
||||||
|
{
|
||||||
|
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.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)
|
||||||
{
|
{
|
||||||
static int wpnList = 0;
|
static int wpnList = 0;
|
||||||
//static int wpnList2;
|
//static int wpnList2;
|
||||||
static int iSlot;
|
static int iSlot;
|
||||||
static const char* wpnName;
|
static const char* wpnName;
|
||||||
switch (mState++) {
|
|
||||||
case 0:
|
|
||||||
wpnName = (char*)mValue;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
iSlot = *(int*)mValue;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
int iId = *(int*)mValue;
|
|
||||||
/*int* blocker;
|
|
||||||
|
|
||||||
int iwpn = iId;
|
switch (mState++)
|
||||||
|
{
|
||||||
if (iId > 31) {
|
case 0:
|
||||||
iwpn -= 31;
|
wpnName = (char*)mValue;
|
||||||
blocker = &wpnList2;
|
break;
|
||||||
|
case 1:
|
||||||
|
iSlot = *(int*)mValue;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
int iId = *(int*)mValue;
|
||||||
|
if ((iId < 0 || iId >= MAX_WEAPONS) || (wpnList & (1<<iId)))
|
||||||
|
break;
|
||||||
|
wpnList |= (1<<iId);
|
||||||
|
g_weaponsData[iId].iId = iId;
|
||||||
|
g_weaponsData[iId].ammoSlot = iSlot;
|
||||||
|
g_weaponsData[iId].fullName.assign(wpnName);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
blocker = &wpnList;*/
|
|
||||||
|
|
||||||
if ( (iId < 0 || iId >= MAX_WEAPONS ) || (wpnList & (1<<iId)) )
|
|
||||||
break;
|
|
||||||
wpnList |= (1<<iId);
|
|
||||||
g_weaponsData[iId].iId = iId;
|
|
||||||
g_weaponsData[iId].ammoSlot = iSlot;
|
|
||||||
g_weaponsData[iId].fullName.assign(wpnName);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client_CurWeapon(void* mValue)
|
void Client_CurWeapon(void* mValue)
|
||||||
{
|
{
|
||||||
static int iState;
|
static int iState;
|
||||||
static int iId;
|
static int iId;
|
||||||
switch (mState++){
|
|
||||||
case 0:
|
switch (mState++)
|
||||||
iState = *(int*)mValue;
|
{
|
||||||
break;
|
case 0:
|
||||||
case 1:
|
iState = *(int*)mValue;
|
||||||
if (!iState) break;
|
break;
|
||||||
iId = *(int*)mValue;
|
case 1:
|
||||||
break;
|
if (!iState) break;
|
||||||
case 2:
|
iId = *(int*)mValue;
|
||||||
if (!mPlayer) return;
|
break;
|
||||||
if (!iState || (iId < 1 || iId >= MAX_WEAPONS ) ) break;
|
case 2:
|
||||||
mPlayer->weapons[iId].clip = *(int*)mValue;
|
if (!mPlayer) return;
|
||||||
mPlayer->current = iId;
|
if (!iState || (iId < 1 || iId >= MAX_WEAPONS)) break;
|
||||||
mPlayer->lastHit = mPlayer->lastTrace;
|
mPlayer->weapons[iId].clip = *(int*)mValue;
|
||||||
}
|
mPlayer->current = iId;
|
||||||
|
mPlayer->lastHit = mPlayer->lastTrace;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client_AmmoPickup(void* mValue)
|
void Client_AmmoPickup(void* mValue)
|
||||||
{
|
{
|
||||||
static int iSlot;
|
static int iSlot;
|
||||||
switch (mState++){
|
|
||||||
case 0:
|
switch (mState++)
|
||||||
iSlot = *(int*)mValue;
|
{
|
||||||
break;
|
case 0:
|
||||||
case 1:
|
iSlot = *(int*)mValue;
|
||||||
if (!mPlayer) return;
|
break;
|
||||||
for(int i=1;i<MAX_WEAPONS;++i)
|
case 1:
|
||||||
if (g_weaponsData[i].ammoSlot==iSlot)
|
if (!mPlayer) return;
|
||||||
mPlayer->weapons[i].ammo += *(int*)mValue;
|
for (int i = 1; i < MAX_WEAPONS; ++i)
|
||||||
}
|
if (g_weaponsData[i].ammoSlot==iSlot)
|
||||||
|
mPlayer->weapons[i].ammo += *(int*)mValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client_ScoreInfo(void* mValue)
|
void Client_ScoreInfo(void* mValue)
|
||||||
{
|
{
|
||||||
static int index;
|
static int index;
|
||||||
static int deaths;
|
static int deaths;
|
||||||
switch (mState++){
|
|
||||||
case 0:
|
switch (mState++)
|
||||||
index = *(int*)mValue;
|
{
|
||||||
break;
|
case 0:
|
||||||
case 2:
|
index = *(int*)mValue;
|
||||||
deaths = *(int*)mValue;
|
break;
|
||||||
break;
|
case 2:
|
||||||
case 4:
|
deaths = *(int*)mValue;
|
||||||
if ( index < 1 || index > gpGlobals->maxClients ) break;
|
break;
|
||||||
CPlayer*pPlayer = GET_PLAYER_POINTER_I( index );
|
case 4:
|
||||||
pPlayer->deaths = deaths;
|
if (index < 1 || index > gpGlobals->maxClients) break;
|
||||||
pPlayer->teamId = *(int*)mValue;
|
CPlayer*pPlayer = GET_PLAYER_POINTER_I(index);
|
||||||
if ( g_teamsIds.isNewTeam() )
|
pPlayer->deaths = deaths;
|
||||||
g_teamsIds.registerTeam( pPlayer->team.c_str() , pPlayer->teamId );
|
pPlayer->teamId = *(int*)mValue;
|
||||||
}
|
if (g_teamsIds.isNewTeam())
|
||||||
|
g_teamsIds.registerTeam(pPlayer->team.c_str(), pPlayer->teamId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client_DamageEnd(void* mValue)
|
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.c_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;
|
||||||
}
|
}
|
||||||
@ -272,28 +288,25 @@ 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:
|
{
|
||||||
killer_id = *(int*)mValue;
|
case 0:
|
||||||
killer = (killer_id > 0 && killer_id < 33) ?
|
killer_id = *(int*)mValue;
|
||||||
GET_PLAYER_POINTER_I(killer_id) : 0;
|
killer = (killer_id > 0 && killer_id < 33) ? 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;
|
||||||
|
victim->death_killer = killer_id;
|
||||||
if ( !killer || !victim ) break;
|
victim->death_weapon.assign((char*)mValue);
|
||||||
|
victim->death_headshot = hs;
|
||||||
victim->death_killer = killer_id;
|
victim->death_tk = (killer->teamId == victim->teamId);
|
||||||
victim->death_weapon.assign((char*)mValue);
|
|
||||||
victim->death_headshot = hs;
|
|
||||||
victim->death_tk = (killer->teamId == victim->teamId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -28,10 +28,53 @@
|
|||||||
* version.
|
* version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Fake metamod api
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "fakemeta.h"
|
#include "fakemeta.h"
|
||||||
|
|
||||||
|
#ifndef FAKEMETA
|
||||||
|
int LoadMetamodPlugin(const char *path, void **handle, PLUG_LOADTIME now)
|
||||||
|
{
|
||||||
|
if (gpMetaPExtFuncs)
|
||||||
|
{
|
||||||
|
if(PEXT_LOAD_PLUGIN_BY_NAME(PLID, path, now, handle) || !*handle)
|
||||||
|
{
|
||||||
|
LOG_MESSAGE(PLID, "Can't Attach metamod-module \"%s\".", path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
} else if (g_IsNewMM) {
|
||||||
|
int err = 0;
|
||||||
|
if ( (err = LOAD_PLUGIN(PLID, path, now, handle)) || !*handle)
|
||||||
|
{
|
||||||
|
LOG_MESSAGE(PLID, "Can't Attach Module \"%s\".", path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int UnloadMetamodPlugin(void *handle)
|
||||||
|
{
|
||||||
|
if (gpMetaPExtFuncs)
|
||||||
|
{
|
||||||
|
if(PEXT_UNLOAD_PLUGIN_BY_HANDLE(PLID, (void*)handle, PT_ANYTIME, PNL_PLUGIN)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
} else if (g_IsNewMM) {
|
||||||
|
if (UNLOAD_PLUGIN_BY_HANDLE(PLID, (void *)handle, PT_ANYTIME, PNL_PLUGIN))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
// Fake metamod api
|
||||||
|
|
||||||
// for varargs
|
// for varargs
|
||||||
#define MAX_STRBUF_LEN 512
|
#define MAX_STRBUF_LEN 512
|
||||||
|
|
||||||
@ -320,7 +363,7 @@
|
|||||||
prev_mres = mres; \
|
prev_mres = mres; \
|
||||||
if (mres == MRES_UNSET) \
|
if (mres == MRES_UNSET) \
|
||||||
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
||||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnArgs); \
|
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnName); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
/* Set meta result to the highest value */ \
|
/* Set meta result to the highest value */ \
|
||||||
@ -353,7 +396,7 @@
|
|||||||
prev_mres = mres; \
|
prev_mres = mres; \
|
||||||
if (mres == MRES_UNSET) \
|
if (mres == MRES_UNSET) \
|
||||||
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
||||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnArgs); \
|
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnName); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
/* Set meta result to the highest value */ \
|
/* Set meta result to the highest value */ \
|
||||||
@ -379,7 +422,7 @@
|
|||||||
prev_mres = mres; \
|
prev_mres = mres; \
|
||||||
if (mres == MRES_UNSET) \
|
if (mres == MRES_UNSET) \
|
||||||
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
||||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnArgs); \
|
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnName); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
/* Set meta result to the highest value */ \
|
/* Set meta result to the highest value */ \
|
||||||
@ -412,7 +455,10 @@
|
|||||||
prev_mres = mres; \
|
prev_mres = mres; \
|
||||||
if (mres == MRES_UNSET) \
|
if (mres == MRES_UNSET) \
|
||||||
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
||||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnArgs); \
|
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnName); \
|
||||||
|
if (mres == MRES_SUPERCEDE) \
|
||||||
|
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has set meta result in \"%s\" to supercede", \
|
||||||
|
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnName); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
/* Set meta result to the highest value */ \
|
/* Set meta result to the highest value */ \
|
||||||
@ -2341,8 +2387,24 @@ CFakeMeta::CFakeMetaPlugin::~CFakeMetaPlugin()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ghost_of_evilspy's "could not find memloc for cvar" fix
|
||||||
|
void FakeMeta_New_CVarRegister(cvar_t *pCVar)
|
||||||
|
{
|
||||||
|
static cvar_t tmpvar;
|
||||||
|
tmpvar = *pCVar;
|
||||||
|
CVAR_REGISTER(&tmpvar);
|
||||||
|
}
|
||||||
|
|
||||||
int CFakeMeta::CFakeMetaPlugin::Query(mutil_funcs_t *pMetaUtilFuncs)
|
int CFakeMeta::CFakeMetaPlugin::Query(mutil_funcs_t *pMetaUtilFuncs)
|
||||||
{
|
{
|
||||||
|
//using metamod p-extensions?
|
||||||
|
if(gpMetaPExtFuncs || g_IsNewMM)
|
||||||
|
{
|
||||||
|
//load plugins in meta_attach
|
||||||
|
m_Status = PL_OPENED;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Load the library
|
// Load the library
|
||||||
// We don't have to DLCLOSE here.
|
// We don't have to DLCLOSE here.
|
||||||
m_Handle = DLOPEN(build_pathname("%s", m_Path.c_str()));
|
m_Handle = DLOPEN(build_pathname("%s", m_Path.c_str()));
|
||||||
@ -2387,7 +2449,13 @@ int CFakeMeta::CFakeMetaPlugin::Query(mutil_funcs_t *pMetaUtilFuncs)
|
|||||||
m_Status = PL_BADFILE;
|
m_Status = PL_BADFILE;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
giveEngFuncsFn(&g_engfuncs, gpGlobals);
|
|
||||||
|
// ghost_of_evilspy's "Could not find memloc for cvar" fix
|
||||||
|
static enginefuncs_t fakemeta_engfuncs;
|
||||||
|
memcpy(&fakemeta_engfuncs, &g_engfuncs, sizeof(enginefuncs_t));
|
||||||
|
// Override cvar register to our own function
|
||||||
|
fakemeta_engfuncs.pfnCVarRegister = FakeMeta_New_CVarRegister;
|
||||||
|
giveEngFuncsFn(&fakemeta_engfuncs, gpGlobals);
|
||||||
|
|
||||||
if (queryFn(META_INTERFACE_VERSION, &m_Info, pMetaUtilFuncs) != 1)
|
if (queryFn(META_INTERFACE_VERSION, &m_Info, pMetaUtilFuncs) != 1)
|
||||||
{
|
{
|
||||||
@ -2402,8 +2470,35 @@ int CFakeMeta::CFakeMetaPlugin::Query(mutil_funcs_t *pMetaUtilFuncs)
|
|||||||
|
|
||||||
int CFakeMeta::CFakeMetaPlugin::Attach(PLUG_LOADTIME now, meta_globals_t *pMGlobals, gamedll_funcs_t *pGameDllFuncs)
|
int CFakeMeta::CFakeMetaPlugin::Attach(PLUG_LOADTIME now, meta_globals_t *pMGlobals, gamedll_funcs_t *pGameDllFuncs)
|
||||||
{
|
{
|
||||||
|
// evilspy's patch:
|
||||||
|
//using metamod p-extensions?
|
||||||
|
if (gpMetaPExtFuncs)
|
||||||
|
{
|
||||||
|
if(PEXT_LOAD_PLUGIN_BY_NAME(PLID, m_Path.c_str(), now, (void**)&m_Handle) || !m_Handle)
|
||||||
|
{
|
||||||
|
LOG_MESSAGE(PLID, "Can't Attach Module \"%s\".", m_Path.c_str());
|
||||||
|
m_Status = PL_FAILED;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Status = PL_RUNNING;
|
||||||
|
return 1;
|
||||||
|
} else if (g_IsNewMM) {
|
||||||
|
int err = 0;
|
||||||
|
if ( (err = LOAD_PLUGIN(PLID, m_Path.c_str(), now, (void **)&m_Handle)) || !m_Handle)
|
||||||
|
{
|
||||||
|
LOG_MESSAGE(PLID, "Can't Attach Module \"%s\".", m_Path.c_str());
|
||||||
|
m_Status = PL_FAILED;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Status = PL_RUNNING;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!m_Handle)
|
if (!m_Handle)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
META_ATTACH_FN attachFn = (META_ATTACH_FN)DLSYM(m_Handle, "Meta_Attach");
|
META_ATTACH_FN attachFn = (META_ATTACH_FN)DLSYM(m_Handle, "Meta_Attach");
|
||||||
if (!attachFn)
|
if (!attachFn)
|
||||||
{
|
{
|
||||||
@ -2413,7 +2508,7 @@ int CFakeMeta::CFakeMetaPlugin::Attach(PLUG_LOADTIME now, meta_globals_t *pMGlob
|
|||||||
}
|
}
|
||||||
if (attachFn(now, &m_MetaFuncTable, pMGlobals, pGameDllFuncs) != 1)
|
if (attachFn(now, &m_MetaFuncTable, pMGlobals, pGameDllFuncs) != 1)
|
||||||
{
|
{
|
||||||
AMXXLOG_Log("[AMXX] Can't Attach Module \"%s\" (\"%s\").", m_Info->name, m_Path.c_str());
|
LOG_MESSAGE(PLID, "Can't Attach Module \"%s\".", m_Path.c_str());
|
||||||
m_Status = PL_FAILED;
|
m_Status = PL_FAILED;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2426,6 +2521,29 @@ int CFakeMeta::CFakeMetaPlugin::Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reaso
|
|||||||
{
|
{
|
||||||
if (!m_Handle)
|
if (!m_Handle)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
// evilspy's patch:
|
||||||
|
//using metamod p-extensions?
|
||||||
|
if (gpMetaPExtFuncs)
|
||||||
|
{
|
||||||
|
if(PEXT_UNLOAD_PLUGIN_BY_HANDLE(PLID, (void*)m_Handle, now, reason)) {
|
||||||
|
m_Status = PL_FAILED;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
m_Status = PL_OPENED;
|
||||||
|
m_Handle = NULL;
|
||||||
|
return 1;
|
||||||
|
} else if (g_IsNewMM) {
|
||||||
|
if (UNLOAD_PLUGIN_BY_HANDLE(PLID, (void *)m_Handle, now, reason))
|
||||||
|
{
|
||||||
|
m_Status = PL_FAILED;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
m_Status = PL_OPENED;
|
||||||
|
m_Handle = NULL;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
META_DETACH_FN detachFn = (META_DETACH_FN)DLSYM(m_Handle, "Meta_Detach");
|
META_DETACH_FN detachFn = (META_DETACH_FN)DLSYM(m_Handle, "Meta_Detach");
|
||||||
if (!detachFn)
|
if (!detachFn)
|
||||||
{
|
{
|
||||||
@ -2516,6 +2634,11 @@ void CFakeMeta::ReleasePlugins()
|
|||||||
|
|
||||||
bool CFakeMeta::AddCorePlugin()
|
bool CFakeMeta::AddCorePlugin()
|
||||||
{
|
{
|
||||||
|
// evilspy:
|
||||||
|
// not needed when using metamod p-extensions
|
||||||
|
if(gpMetaPExtFuncs || g_IsNewMM)
|
||||||
|
return true;
|
||||||
|
|
||||||
// Check whether there already is a core plugin
|
// Check whether there already is a core plugin
|
||||||
if (m_Plugins.begin() && strcmp((*m_Plugins.begin()).GetPath(), "[AMXX Core]") == 0)
|
if (m_Plugins.begin() && strcmp((*m_Plugins.begin()).GetPath(), "[AMXX Core]") == 0)
|
||||||
return true;
|
return true;
|
||||||
@ -2537,7 +2660,12 @@ void CFakeMeta::Meta_Query(mutil_funcs_t *pMetaUtilFuncs)
|
|||||||
|
|
||||||
// Query all plugins except core
|
// Query all plugins except core
|
||||||
CList<CFakeMetaPlugin>::iterator iter = m_Plugins.begin();
|
CList<CFakeMetaPlugin>::iterator iter = m_Plugins.begin();
|
||||||
++iter; // Skip core
|
|
||||||
|
// evilspy:
|
||||||
|
// using metamod p-extensions?
|
||||||
|
if(!gpMetaPExtFuncs && !g_IsNewMM)
|
||||||
|
++iter; // Skip core
|
||||||
|
|
||||||
for (; iter; ++iter)
|
for (; iter; ++iter)
|
||||||
{
|
{
|
||||||
(*iter).Query(pMetaUtilFuncs);
|
(*iter).Query(pMetaUtilFuncs);
|
||||||
@ -2551,7 +2679,11 @@ void CFakeMeta::Meta_Attach(PLUG_LOADTIME now, meta_globals_t *pMGlobals, gamedl
|
|||||||
|
|
||||||
// Attach all plugins except core
|
// Attach all plugins except core
|
||||||
CList<CFakeMetaPlugin>::iterator iter = m_Plugins.begin();
|
CList<CFakeMetaPlugin>::iterator iter = m_Plugins.begin();
|
||||||
++iter; // Skip core
|
// evilspy:
|
||||||
|
// using metamod p-extensions?
|
||||||
|
if(!gpMetaPExtFuncs && !g_IsNewMM)
|
||||||
|
++iter; // Skip core
|
||||||
|
|
||||||
for (; iter; ++iter)
|
for (; iter; ++iter)
|
||||||
{
|
{
|
||||||
(*iter).Attach(now, pMGlobals, pGamedllFuncs);
|
(*iter).Attach(now, pMGlobals, pGamedllFuncs);
|
||||||
@ -2563,7 +2695,11 @@ void CFakeMeta::Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
|
|||||||
{
|
{
|
||||||
// Detach all plugins except core
|
// Detach all plugins except core
|
||||||
CList<CFakeMetaPlugin>::iterator iter = m_Plugins.begin();
|
CList<CFakeMetaPlugin>::iterator iter = m_Plugins.begin();
|
||||||
++iter; // Skip core
|
// evilspy:
|
||||||
|
// using metamod p-extensions?
|
||||||
|
if(!gpMetaPExtFuncs && !g_IsNewMM)
|
||||||
|
++iter; // Skip core
|
||||||
|
|
||||||
for (; iter; ++iter)
|
for (; iter; ++iter)
|
||||||
{
|
{
|
||||||
(*iter).Detach(now, reason);
|
(*iter).Detach(now, reason);
|
||||||
@ -2579,6 +2715,15 @@ int CFakeMeta::GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable /*from metamod*/, int
|
|||||||
*interfaceVersion = INTERFACE_VERSION;
|
*interfaceVersion = INTERFACE_VERSION;
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// evilspy:
|
||||||
|
//using metamod p-extensions?
|
||||||
|
if(gpMetaPExtFuncs || g_IsNewMM)
|
||||||
|
{
|
||||||
|
memcpy( pFunctionTable, pAMXXFunctionTable, sizeof( DLL_FUNCTIONS ) );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy( pFunctionTable, &g_DllFunctionTable, sizeof( DLL_FUNCTIONS ) );
|
memcpy( pFunctionTable, &g_DllFunctionTable, sizeof( DLL_FUNCTIONS ) );
|
||||||
|
|
||||||
// Make sure there is a core plugin
|
// Make sure there is a core plugin
|
||||||
@ -2608,6 +2753,15 @@ int CFakeMeta::GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable /*from metamod*/
|
|||||||
*interfaceVersion = INTERFACE_VERSION;
|
*interfaceVersion = INTERFACE_VERSION;
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// evilspy
|
||||||
|
//using metamod p-extensions?
|
||||||
|
if(gpMetaPExtFuncs || g_IsNewMM)
|
||||||
|
{
|
||||||
|
memcpy( pFunctionTable, pAMXXFunctionTable, sizeof( DLL_FUNCTIONS ) );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy( pFunctionTable, &g_DllFunctionTable_Post, sizeof( DLL_FUNCTIONS ) );
|
memcpy( pFunctionTable, &g_DllFunctionTable_Post, sizeof( DLL_FUNCTIONS ) );
|
||||||
|
|
||||||
// Make sure there is a core plugin
|
// Make sure there is a core plugin
|
||||||
@ -2637,6 +2791,15 @@ int CFakeMeta::GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inter
|
|||||||
*interfaceVersion = ENGINE_INTERFACE_VERSION;
|
*interfaceVersion = ENGINE_INTERFACE_VERSION;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// evilspy:
|
||||||
|
//using metamod p-extensions?
|
||||||
|
if(gpMetaPExtFuncs || g_IsNewMM)
|
||||||
|
{
|
||||||
|
memcpy( pengfuncsFromEngine, pAMXXFunctionTable, sizeof( enginefuncs_t ) );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy( pengfuncsFromEngine, &g_EngineFunctionTable, sizeof( enginefuncs_t ) );
|
memcpy( pengfuncsFromEngine, &g_EngineFunctionTable, sizeof( enginefuncs_t ) );
|
||||||
|
|
||||||
// Make sure there is a core plugin
|
// Make sure there is a core plugin
|
||||||
@ -2665,6 +2828,15 @@ int CFakeMeta::GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int *
|
|||||||
*interfaceVersion = ENGINE_INTERFACE_VERSION;
|
*interfaceVersion = ENGINE_INTERFACE_VERSION;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// evilspy:
|
||||||
|
//using metamod p-extensions?
|
||||||
|
if(gpMetaPExtFuncs || g_IsNewMM)
|
||||||
|
{
|
||||||
|
memcpy( pengfuncsFromEngine, pAMXXFunctionTable, sizeof( enginefuncs_t ) );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy( pengfuncsFromEngine, &g_EngineFunctionTable_Post, sizeof( enginefuncs_t ) );
|
memcpy( pengfuncsFromEngine, &g_EngineFunctionTable_Post, sizeof( enginefuncs_t ) );
|
||||||
|
|
||||||
// Make sure there is a core plugin
|
// Make sure there is a core plugin
|
||||||
@ -2700,7 +2872,16 @@ int CFakeMeta::GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pNewFunctionTable, int *int
|
|||||||
*interfaceVersion = NEW_DLL_FUNCTIONS_VERSION;
|
*interfaceVersion = NEW_DLL_FUNCTIONS_VERSION;
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
memcpy( pNewFunctionTable, &g_NewDllFunctionTable, sizeof( DLL_FUNCTIONS ) );
|
|
||||||
|
// evilspy:
|
||||||
|
//using metamod p-extensions?
|
||||||
|
if(gpMetaPExtFuncs || g_IsNewMM)
|
||||||
|
{
|
||||||
|
memcpy( pNewFunctionTable, pAMXXFunctionTable, sizeof( NEW_DLL_FUNCTIONS ) );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy( pNewFunctionTable, &g_NewDllFunctionTable, sizeof( NEW_DLL_FUNCTIONS ) );
|
||||||
|
|
||||||
// Make sure there is a core plugin
|
// Make sure there is a core plugin
|
||||||
AddCorePlugin();
|
AddCorePlugin();
|
||||||
@ -2735,7 +2916,16 @@ int CFakeMeta::GetNewDLLFunctions_Post(NEW_DLL_FUNCTIONS *pNewFunctionTable, int
|
|||||||
*interfaceVersion = NEW_DLL_FUNCTIONS_VERSION;
|
*interfaceVersion = NEW_DLL_FUNCTIONS_VERSION;
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
memcpy( pNewFunctionTable, &g_NewDllFunctionTable_Post, sizeof( DLL_FUNCTIONS ) );
|
|
||||||
|
// evilspy:
|
||||||
|
//using metamod p-extensions?
|
||||||
|
if(gpMetaPExtFuncs || g_IsNewMM)
|
||||||
|
{
|
||||||
|
memcpy( pNewFunctionTable, pAMXXFunctionTable, sizeof( NEW_DLL_FUNCTIONS ) );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy( pNewFunctionTable, &g_NewDllFunctionTable_Post, sizeof( NEW_DLL_FUNCTIONS ) );
|
||||||
|
|
||||||
// Make sure there is a core plugin
|
// Make sure there is a core plugin
|
||||||
AddCorePlugin();
|
AddCorePlugin();
|
||||||
@ -2754,3 +2944,5 @@ int CFakeMeta::GetNewDLLFunctions_Post(NEW_DLL_FUNCTIONS *pNewFunctionTable, int
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif //FAKEMETA
|
||||||
|
@ -31,6 +31,10 @@
|
|||||||
#ifndef __FAKEMETA_H__
|
#ifndef __FAKEMETA_H__
|
||||||
#define __FAKEMETA_H__
|
#define __FAKEMETA_H__
|
||||||
|
|
||||||
|
#ifndef FAKEMETA
|
||||||
|
int UnloadMetamodPlugin(void *handle);
|
||||||
|
int LoadMetamodPlugin(const char *path, void **handle, PLUG_LOADTIME now);
|
||||||
|
#else
|
||||||
// Fake metamod api for modules
|
// Fake metamod api for modules
|
||||||
|
|
||||||
#include "CList.h"
|
#include "CList.h"
|
||||||
@ -38,11 +42,12 @@
|
|||||||
// from mplugin.h (metamod)
|
// from mplugin.h (metamod)
|
||||||
// Flags to indicate current "load" state of plugin.
|
// Flags to indicate current "load" state of plugin.
|
||||||
// NOTE: order is important, as greater/less comparisons are made.
|
// NOTE: order is important, as greater/less comparisons are made.
|
||||||
typedef enum {
|
typedef enum
|
||||||
|
{
|
||||||
PL_EMPTY = 0, // empty slot
|
PL_EMPTY = 0, // empty slot
|
||||||
PL_VALID, // has valid info in it
|
PL_VALID, // has valid info in it
|
||||||
PL_BADFILE, // nonexistent file (open failed),
|
PL_BADFILE, // nonexistent file (open failed),
|
||||||
// or not a valid plugin file (query failed)
|
// or not a valid plugin file (query failed)
|
||||||
PL_OPENED, // dlopened and queried
|
PL_OPENED, // dlopened and queried
|
||||||
PL_FAILED, // opened, but failed to attach or unattach
|
PL_FAILED, // opened, but failed to attach or unattach
|
||||||
PL_RUNNING, // attached and running
|
PL_RUNNING, // attached and running
|
||||||
@ -51,11 +56,10 @@ typedef enum {
|
|||||||
|
|
||||||
// from h_export.h (metamod)
|
// from h_export.h (metamod)
|
||||||
// Our GiveFnptrsToDll, called by engine.
|
// Our GiveFnptrsToDll, called by engine.
|
||||||
typedef void (WINAPI *GIVE_ENGINE_FUNCTIONS_FN) (enginefuncs_t
|
typedef void (WINAPI *GIVE_ENGINE_FUNCTIONS_FN) (enginefuncs_t *pengfuncsFromEngine, globalvars_t *pGlobals);
|
||||||
*pengfuncsFromEngine, globalvars_t *pGlobals);
|
|
||||||
|
|
||||||
|
|
||||||
// *** CFakeMeta
|
// *** CFakeMeta
|
||||||
|
|
||||||
class CFakeMeta
|
class CFakeMeta
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -96,7 +100,6 @@ public:
|
|||||||
inline void SetStatus(PLUG_STATUS newStatus)
|
inline void SetStatus(PLUG_STATUS newStatus)
|
||||||
{ m_Status = newStatus; }
|
{ m_Status = newStatus; }
|
||||||
|
|
||||||
|
|
||||||
inline plugin_info_t * GetInfo()
|
inline plugin_info_t * GetInfo()
|
||||||
{ return m_Info; }
|
{ return m_Info; }
|
||||||
inline const plugin_info_t * GetInfo() const
|
inline const plugin_info_t * GetInfo() const
|
||||||
@ -225,5 +228,6 @@ public:
|
|||||||
// defined in meta_api.cpp
|
// defined in meta_api.cpp
|
||||||
extern CFakeMeta g_FakeMeta;
|
extern CFakeMeta g_FakeMeta;
|
||||||
|
|
||||||
#endif // #ifndef __FAKEMETA_H__
|
#endif //FAKEMETA
|
||||||
|
|
||||||
|
#endif // #ifndef __FAKEMETA_H__
|
||||||
|
751
amxmodx/file.cpp
751
amxmodx/file.cpp
File diff suppressed because it is too large
Load Diff
@ -37,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
|
||||||
@ -83,7 +96,7 @@ static cell AMX_NATIVE_CALL n_floatstr(AMX *amx,cell *params)
|
|||||||
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, 0);
|
amx_GetStringOld(szSource, pString, 0);
|
||||||
|
|
||||||
/* Now convert this to a float. */
|
/* Now convert this to a float. */
|
||||||
fNum = (REAL)atof(szSource);
|
fNum = (REAL)atof(szSource);
|
||||||
@ -357,6 +370,7 @@ static cell AMX_NATIVE_CALL n_floatatan(AMX *amx, cell *params)
|
|||||||
REAL fA = amx_ctof(params[1]);
|
REAL fA = amx_ctof(params[1]);
|
||||||
fA = ToRadians(fA, params[2]);
|
fA = ToRadians(fA, params[2]);
|
||||||
fA = atan(fA);
|
fA = atan(fA);
|
||||||
|
fA = FromRadians(fA, params[2]);
|
||||||
return amx_ftoc(fA);
|
return amx_ftoc(fA);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,8 +385,8 @@ static cell AMX_NATIVE_CALL n_floatacos(AMX *amx, cell *params)
|
|||||||
* params[2] = radix
|
* params[2] = radix
|
||||||
*/
|
*/
|
||||||
REAL fA = amx_ctof(params[1]);
|
REAL fA = amx_ctof(params[1]);
|
||||||
fA = ToRadians(fA, params[2]);
|
|
||||||
fA = acos(fA);
|
fA = acos(fA);
|
||||||
|
fA = FromRadians(fA, params[2]);
|
||||||
return amx_ftoc(fA);
|
return amx_ftoc(fA);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -387,8 +401,8 @@ static cell AMX_NATIVE_CALL n_floatasin(AMX *amx, cell *params)
|
|||||||
* params[2] = radix
|
* params[2] = radix
|
||||||
*/
|
*/
|
||||||
REAL fA = amx_ctof(params[1]);
|
REAL fA = amx_ctof(params[1]);
|
||||||
fA = ToRadians(fA, params[2]);
|
|
||||||
fA = asin(fA);
|
fA = asin(fA);
|
||||||
|
fA = FromRadians(fA, params[2]);
|
||||||
return amx_ftoc(fA);
|
return amx_ftoc(fA);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,6 +421,7 @@ static cell AMX_NATIVE_CALL n_floatatan2(AMX *amx, cell *params)
|
|||||||
REAL fB = amx_ctof(params[2]);
|
REAL fB = amx_ctof(params[2]);
|
||||||
REAL fC;
|
REAL fC;
|
||||||
fC = atan2(fA, fB);
|
fC = atan2(fA, fB);
|
||||||
|
fC = FromRadians(fC, params[3]);
|
||||||
return amx_ftoc(fC);
|
return amx_ftoc(fC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1813
amxmodx/meta_api.cpp
1813
amxmodx/meta_api.cpp
File diff suppressed because it is too large
Load Diff
@ -1,451 +0,0 @@
|
|||||||
/* lzoconf.h -- configuration for the LZO real-time data compression library
|
|
||||||
|
|
||||||
This file is part of the LZO real-time data compression library.
|
|
||||||
|
|
||||||
Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
The LZO library 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.
|
|
||||||
|
|
||||||
The LZO library 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 the LZO library; see the file COPYING.
|
|
||||||
If not, write to the Free Software Foundation, Inc.,
|
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/opensource/lzo/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __LZOCONF_H
|
|
||||||
#define __LZOCONF_H
|
|
||||||
|
|
||||||
#define LZO_VERSION 0x1080
|
|
||||||
#define LZO_VERSION_STRING "1.08"
|
|
||||||
#define LZO_VERSION_DATE "Jul 12 2002"
|
|
||||||
|
|
||||||
/* internal Autoconf configuration file - only used when building LZO */
|
|
||||||
#if defined(LZO_HAVE_CONFIG_H)
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// LZO requires a conforming <limits.h>
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(CHAR_BIT) || (CHAR_BIT != 8)
|
|
||||||
# error "invalid CHAR_BIT"
|
|
||||||
#endif
|
|
||||||
#if !defined(UCHAR_MAX) || !defined(UINT_MAX) || !defined(ULONG_MAX)
|
|
||||||
# error "check your compiler installation"
|
|
||||||
#endif
|
|
||||||
#if (USHRT_MAX < 1) || (UINT_MAX < 1) || (ULONG_MAX < 1)
|
|
||||||
# error "your limits.h macros are broken"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* workaround a cpp bug under hpux 10.20 */
|
|
||||||
#define LZO_0xffffffffL 4294967295ul
|
|
||||||
|
|
||||||
#if !defined(LZO_UINT32_C)
|
|
||||||
# if (UINT_MAX < LZO_0xffffffffL)
|
|
||||||
# define LZO_UINT32_C(c) c ## UL
|
|
||||||
# else
|
|
||||||
# define LZO_UINT32_C(c) c ## U
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// architecture defines
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(__LZO_WIN) && !defined(__LZO_DOS) && !defined(__LZO_OS2)
|
|
||||||
# if defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows)
|
|
||||||
# define __LZO_WIN
|
|
||||||
# elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
|
|
||||||
# define __LZO_WIN
|
|
||||||
# elif defined(__NT__) || defined(__NT_DLL__) || defined(__WINDOWS_386__)
|
|
||||||
# define __LZO_WIN
|
|
||||||
# elif defined(__DOS__) || defined(__MSDOS__) || defined(MSDOS)
|
|
||||||
# define __LZO_DOS
|
|
||||||
# elif defined(__OS2__) || defined(__OS2V2__) || defined(OS2)
|
|
||||||
# define __LZO_OS2
|
|
||||||
# elif defined(__palmos__)
|
|
||||||
# define __LZO_PALMOS
|
|
||||||
# elif defined(__TOS__) || defined(__atarist__)
|
|
||||||
# define __LZO_TOS
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (UINT_MAX < LZO_0xffffffffL)
|
|
||||||
# if defined(__LZO_WIN)
|
|
||||||
# define __LZO_WIN16
|
|
||||||
# elif defined(__LZO_DOS)
|
|
||||||
# define __LZO_DOS16
|
|
||||||
# elif defined(__LZO_PALMOS)
|
|
||||||
# define __LZO_PALMOS16
|
|
||||||
# elif defined(__LZO_TOS)
|
|
||||||
# define __LZO_TOS16
|
|
||||||
# elif defined(__C166__)
|
|
||||||
# else
|
|
||||||
/* porting hint: for pure 16-bit architectures try compiling
|
|
||||||
* everything with -D__LZO_STRICT_16BIT */
|
|
||||||
# error "16-bit target not supported - contact me for porting hints"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__LZO_i386)
|
|
||||||
# if defined(__LZO_DOS) || defined(__LZO_WIN16)
|
|
||||||
# define __LZO_i386
|
|
||||||
# elif defined(__i386__) || defined(__386__) || defined(_M_IX86)
|
|
||||||
# define __LZO_i386
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__LZO_STRICT_16BIT)
|
|
||||||
# if (UINT_MAX < LZO_0xffffffffL)
|
|
||||||
# include <lzo16bit.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* memory checkers */
|
|
||||||
#if !defined(__LZO_CHECKER)
|
|
||||||
# if defined(__BOUNDS_CHECKING_ON)
|
|
||||||
# define __LZO_CHECKER
|
|
||||||
# elif defined(__CHECKER__)
|
|
||||||
# define __LZO_CHECKER
|
|
||||||
# elif defined(__INSURE__)
|
|
||||||
# define __LZO_CHECKER
|
|
||||||
# elif defined(__PURIFY__)
|
|
||||||
# define __LZO_CHECKER
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// integral and pointer types
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* Integral types with 32 bits or more */
|
|
||||||
#if !defined(LZO_UINT32_MAX)
|
|
||||||
# if (UINT_MAX >= LZO_0xffffffffL)
|
|
||||||
typedef unsigned int lzo_uint32;
|
|
||||||
typedef int lzo_int32;
|
|
||||||
# define LZO_UINT32_MAX UINT_MAX
|
|
||||||
# define LZO_INT32_MAX INT_MAX
|
|
||||||
# define LZO_INT32_MIN INT_MIN
|
|
||||||
# elif (ULONG_MAX >= LZO_0xffffffffL)
|
|
||||||
typedef unsigned long lzo_uint32;
|
|
||||||
typedef long lzo_int32;
|
|
||||||
# define LZO_UINT32_MAX ULONG_MAX
|
|
||||||
# define LZO_INT32_MAX LONG_MAX
|
|
||||||
# define LZO_INT32_MIN LONG_MIN
|
|
||||||
# else
|
|
||||||
# error "lzo_uint32"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* lzo_uint is used like size_t */
|
|
||||||
#if !defined(LZO_UINT_MAX)
|
|
||||||
# if (UINT_MAX >= LZO_0xffffffffL)
|
|
||||||
typedef unsigned int lzo_uint;
|
|
||||||
typedef int lzo_int;
|
|
||||||
# define LZO_UINT_MAX UINT_MAX
|
|
||||||
# define LZO_INT_MAX INT_MAX
|
|
||||||
# define LZO_INT_MIN INT_MIN
|
|
||||||
# elif (ULONG_MAX >= LZO_0xffffffffL)
|
|
||||||
typedef unsigned long lzo_uint;
|
|
||||||
typedef long lzo_int;
|
|
||||||
# define LZO_UINT_MAX ULONG_MAX
|
|
||||||
# define LZO_INT_MAX LONG_MAX
|
|
||||||
# define LZO_INT_MIN LONG_MIN
|
|
||||||
# else
|
|
||||||
# error "lzo_uint"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef int lzo_bool;
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// memory models
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* Memory model for the public code segment. */
|
|
||||||
#if !defined(__LZO_CMODEL)
|
|
||||||
# if defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
|
||||||
# define __LZO_CMODEL __far
|
|
||||||
# elif defined(__LZO_i386) && defined(__WATCOMC__)
|
|
||||||
# define __LZO_CMODEL __near
|
|
||||||
# else
|
|
||||||
# define __LZO_CMODEL
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Memory model for the public data segment. */
|
|
||||||
#if !defined(__LZO_DMODEL)
|
|
||||||
# if defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
|
||||||
# define __LZO_DMODEL __far
|
|
||||||
# elif defined(__LZO_i386) && defined(__WATCOMC__)
|
|
||||||
# define __LZO_DMODEL __near
|
|
||||||
# else
|
|
||||||
# define __LZO_DMODEL
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Memory model that allows to access memory at offsets of lzo_uint. */
|
|
||||||
#if !defined(__LZO_MMODEL)
|
|
||||||
# if (LZO_UINT_MAX <= UINT_MAX)
|
|
||||||
# define __LZO_MMODEL
|
|
||||||
# elif defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
|
||||||
# define __LZO_MMODEL __huge
|
|
||||||
# define LZO_999_UNSUPPORTED
|
|
||||||
# elif defined(__LZO_PALMOS16) || defined(__LZO_TOS16)
|
|
||||||
# define __LZO_MMODEL
|
|
||||||
# else
|
|
||||||
# error "__LZO_MMODEL"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* no typedef here because of const-pointer issues */
|
|
||||||
#define lzo_byte unsigned char __LZO_MMODEL
|
|
||||||
#define lzo_bytep unsigned char __LZO_MMODEL *
|
|
||||||
#define lzo_charp char __LZO_MMODEL *
|
|
||||||
#define lzo_voidp void __LZO_MMODEL *
|
|
||||||
#define lzo_shortp short __LZO_MMODEL *
|
|
||||||
#define lzo_ushortp unsigned short __LZO_MMODEL *
|
|
||||||
#define lzo_uint32p lzo_uint32 __LZO_MMODEL *
|
|
||||||
#define lzo_int32p lzo_int32 __LZO_MMODEL *
|
|
||||||
#define lzo_uintp lzo_uint __LZO_MMODEL *
|
|
||||||
#define lzo_intp lzo_int __LZO_MMODEL *
|
|
||||||
#define lzo_voidpp lzo_voidp __LZO_MMODEL *
|
|
||||||
#define lzo_bytepp lzo_bytep __LZO_MMODEL *
|
|
||||||
|
|
||||||
#ifndef lzo_sizeof_dict_t
|
|
||||||
# define lzo_sizeof_dict_t sizeof(lzo_bytep)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// calling conventions and function types
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* linkage */
|
|
||||||
#if !defined(__LZO_EXTERN_C)
|
|
||||||
# ifdef __cplusplus
|
|
||||||
# define __LZO_EXTERN_C extern "C"
|
|
||||||
# else
|
|
||||||
# define __LZO_EXTERN_C extern
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* calling convention */
|
|
||||||
#if !defined(__LZO_CDECL)
|
|
||||||
# if defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
|
||||||
# define __LZO_CDECL __LZO_CMODEL __cdecl
|
|
||||||
# elif defined(__LZO_i386) && defined(_MSC_VER)
|
|
||||||
# define __LZO_CDECL __LZO_CMODEL __cdecl
|
|
||||||
# elif defined(__LZO_i386) && defined(__WATCOMC__)
|
|
||||||
# define __LZO_CDECL __LZO_CMODEL __cdecl
|
|
||||||
# else
|
|
||||||
# define __LZO_CDECL __LZO_CMODEL
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if !defined(__LZO_ENTRY)
|
|
||||||
# define __LZO_ENTRY __LZO_CDECL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* C++ exception specification for extern "C" function types */
|
|
||||||
#if !defined(__cplusplus)
|
|
||||||
# undef LZO_NOTHROW
|
|
||||||
# define LZO_NOTHROW
|
|
||||||
#elif !defined(LZO_NOTHROW)
|
|
||||||
# define LZO_NOTHROW
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_ENTRY *lzo_compress_t) ( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_ENTRY *lzo_decompress_t) ( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_ENTRY *lzo_optimize_t) ( lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_ENTRY *lzo_compress_dict_t)(const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem,
|
|
||||||
const lzo_byte *dict, lzo_uint dict_len );
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_ENTRY *lzo_decompress_dict_t)(const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem,
|
|
||||||
const lzo_byte *dict, lzo_uint dict_len );
|
|
||||||
|
|
||||||
|
|
||||||
/* assembler versions always use __cdecl */
|
|
||||||
typedef int
|
|
||||||
(__LZO_CDECL *lzo_compress_asm_t)( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
typedef int
|
|
||||||
(__LZO_CDECL *lzo_decompress_asm_t)( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
|
|
||||||
/* a progress indicator callback function */
|
|
||||||
typedef void (__LZO_ENTRY *lzo_progress_callback_t) (lzo_uint, lzo_uint);
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// export information
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* DLL export information */
|
|
||||||
#if !defined(__LZO_EXPORT1)
|
|
||||||
# define __LZO_EXPORT1
|
|
||||||
#endif
|
|
||||||
#if !defined(__LZO_EXPORT2)
|
|
||||||
# define __LZO_EXPORT2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* exported calling convention for C functions */
|
|
||||||
#if !defined(LZO_PUBLIC)
|
|
||||||
# define LZO_PUBLIC(_rettype) \
|
|
||||||
__LZO_EXPORT1 _rettype __LZO_EXPORT2 __LZO_ENTRY
|
|
||||||
#endif
|
|
||||||
#if !defined(LZO_EXTERN)
|
|
||||||
# define LZO_EXTERN(_rettype) __LZO_EXTERN_C LZO_PUBLIC(_rettype)
|
|
||||||
#endif
|
|
||||||
#if !defined(LZO_PRIVATE)
|
|
||||||
# define LZO_PRIVATE(_rettype) static _rettype __LZO_ENTRY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* exported __cdecl calling convention for assembler functions */
|
|
||||||
#if !defined(LZO_PUBLIC_CDECL)
|
|
||||||
# define LZO_PUBLIC_CDECL(_rettype) \
|
|
||||||
__LZO_EXPORT1 _rettype __LZO_EXPORT2 __LZO_CDECL
|
|
||||||
#endif
|
|
||||||
#if !defined(LZO_EXTERN_CDECL)
|
|
||||||
# define LZO_EXTERN_CDECL(_rettype) __LZO_EXTERN_C LZO_PUBLIC_CDECL(_rettype)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* exported global variables (LZO currently uses no static variables and
|
|
||||||
* is fully thread safe) */
|
|
||||||
#if !defined(LZO_PUBLIC_VAR)
|
|
||||||
# define LZO_PUBLIC_VAR(_type) \
|
|
||||||
__LZO_EXPORT1 _type __LZO_EXPORT2 __LZO_DMODEL
|
|
||||||
#endif
|
|
||||||
#if !defined(LZO_EXTERN_VAR)
|
|
||||||
# define LZO_EXTERN_VAR(_type) extern LZO_PUBLIC_VAR(_type)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// error codes and prototypes
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* Error codes for the compression/decompression functions. Negative
|
|
||||||
* values are errors, positive values will be used for special but
|
|
||||||
* normal events.
|
|
||||||
*/
|
|
||||||
#define LZO_E_OK 0
|
|
||||||
#define LZO_E_ERROR (-1)
|
|
||||||
#define LZO_E_OUT_OF_MEMORY (-2) /* not used right now */
|
|
||||||
#define LZO_E_NOT_COMPRESSIBLE (-3) /* not used right now */
|
|
||||||
#define LZO_E_INPUT_OVERRUN (-4)
|
|
||||||
#define LZO_E_OUTPUT_OVERRUN (-5)
|
|
||||||
#define LZO_E_LOOKBEHIND_OVERRUN (-6)
|
|
||||||
#define LZO_E_EOF_NOT_FOUND (-7)
|
|
||||||
#define LZO_E_INPUT_NOT_CONSUMED (-8)
|
|
||||||
|
|
||||||
|
|
||||||
/* lzo_init() should be the first function you call.
|
|
||||||
* Check the return code !
|
|
||||||
*
|
|
||||||
* lzo_init() is a macro to allow checking that the library and the
|
|
||||||
* compiler's view of various types are consistent.
|
|
||||||
*/
|
|
||||||
#define lzo_init() __lzo_init2(LZO_VERSION,(int)sizeof(short),(int)sizeof(int),\
|
|
||||||
(int)sizeof(long),(int)sizeof(lzo_uint32),(int)sizeof(lzo_uint),\
|
|
||||||
(int)lzo_sizeof_dict_t,(int)sizeof(char *),(int)sizeof(lzo_voidp),\
|
|
||||||
(int)sizeof(lzo_compress_t))
|
|
||||||
LZO_EXTERN(int) __lzo_init2(unsigned,int,int,int,int,int,int,int,int,int);
|
|
||||||
|
|
||||||
/* version functions (useful for shared libraries) */
|
|
||||||
LZO_EXTERN(unsigned) lzo_version(void);
|
|
||||||
LZO_EXTERN(const char *) lzo_version_string(void);
|
|
||||||
LZO_EXTERN(const char *) lzo_version_date(void);
|
|
||||||
LZO_EXTERN(const lzo_charp) _lzo_version_string(void);
|
|
||||||
LZO_EXTERN(const lzo_charp) _lzo_version_date(void);
|
|
||||||
|
|
||||||
/* string functions */
|
|
||||||
LZO_EXTERN(int)
|
|
||||||
lzo_memcmp(const lzo_voidp _s1, const lzo_voidp _s2, lzo_uint _len);
|
|
||||||
LZO_EXTERN(lzo_voidp)
|
|
||||||
lzo_memcpy(lzo_voidp _dest, const lzo_voidp _src, lzo_uint _len);
|
|
||||||
LZO_EXTERN(lzo_voidp)
|
|
||||||
lzo_memmove(lzo_voidp _dest, const lzo_voidp _src, lzo_uint _len);
|
|
||||||
LZO_EXTERN(lzo_voidp)
|
|
||||||
lzo_memset(lzo_voidp _s, int _c, lzo_uint _len);
|
|
||||||
|
|
||||||
/* checksum functions */
|
|
||||||
LZO_EXTERN(lzo_uint32)
|
|
||||||
lzo_adler32(lzo_uint32 _adler, const lzo_byte *_buf, lzo_uint _len);
|
|
||||||
LZO_EXTERN(lzo_uint32)
|
|
||||||
lzo_crc32(lzo_uint32 _c, const lzo_byte *_buf, lzo_uint _len);
|
|
||||||
|
|
||||||
/* misc. */
|
|
||||||
LZO_EXTERN(lzo_bool) lzo_assert(int _expr);
|
|
||||||
LZO_EXTERN(int) _lzo_config_check(void);
|
|
||||||
typedef union { lzo_bytep p; lzo_uint u; } __lzo_pu_u;
|
|
||||||
typedef union { lzo_bytep p; lzo_uint32 u32; } __lzo_pu32_u;
|
|
||||||
typedef union { void *vp; lzo_bytep bp; lzo_uint32 u32; long l; } lzo_align_t;
|
|
||||||
|
|
||||||
/* align a char pointer on a boundary that is a multiple of `size' */
|
|
||||||
LZO_EXTERN(unsigned) __lzo_align_gap(const lzo_voidp _ptr, lzo_uint _size);
|
|
||||||
#define LZO_PTR_ALIGN_UP(_ptr,_size) \
|
|
||||||
((_ptr) + (lzo_uint) __lzo_align_gap((const lzo_voidp)(_ptr),(lzo_uint)(_size)))
|
|
||||||
|
|
||||||
/* deprecated - only for backward compatibility */
|
|
||||||
#define LZO_ALIGN(_ptr,_size) LZO_PTR_ALIGN_UP(_ptr,_size)
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,100 +0,0 @@
|
|||||||
/* minilzo.h -- mini subset of the LZO real-time data compression library
|
|
||||||
|
|
||||||
This file is part of the LZO real-time data compression library.
|
|
||||||
|
|
||||||
Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
The LZO library 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.
|
|
||||||
|
|
||||||
The LZO library 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 the LZO library; see the file COPYING.
|
|
||||||
If not, write to the Free Software Foundation, Inc.,
|
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/opensource/lzo/
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NOTE:
|
|
||||||
* the full LZO package can be found at
|
|
||||||
* http://www.oberhumer.com/opensource/lzo/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __MINILZO_H
|
|
||||||
#define __MINILZO_H
|
|
||||||
|
|
||||||
#define MINILZO_VERSION 0x1080
|
|
||||||
|
|
||||||
#ifdef __LZOCONF_H
|
|
||||||
# error "you cannot use both LZO and miniLZO"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef LZO_HAVE_CONFIG_H
|
|
||||||
#include "lzoconf.h"
|
|
||||||
|
|
||||||
#if !defined(LZO_VERSION) || (LZO_VERSION != MINILZO_VERSION)
|
|
||||||
# error "version mismatch in header files"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
//
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* Memory required for the wrkmem parameter.
|
|
||||||
* When the required size is 0, you can also pass a NULL pointer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define LZO1X_MEM_COMPRESS LZO1X_1_MEM_COMPRESS
|
|
||||||
#define LZO1X_1_MEM_COMPRESS ((lzo_uint32) (16384L * lzo_sizeof_dict_t))
|
|
||||||
#define LZO1X_MEM_DECOMPRESS (0)
|
|
||||||
|
|
||||||
|
|
||||||
/* compression */
|
|
||||||
LZO_EXTERN(int)
|
|
||||||
lzo1x_1_compress ( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem );
|
|
||||||
|
|
||||||
/* decompression */
|
|
||||||
LZO_EXTERN(int)
|
|
||||||
lzo1x_decompress ( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem /* NOT USED */ );
|
|
||||||
|
|
||||||
/* safe decompression with overrun testing */
|
|
||||||
LZO_EXTERN(int)
|
|
||||||
lzo1x_decompress_safe ( const lzo_byte *src, lzo_uint src_len,
|
|
||||||
lzo_byte *dst, lzo_uintp dst_len,
|
|
||||||
lzo_voidp wrkmem /* NOT USED */ );
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
116
amxmodx/mm_pextensions.h
Executable file
116
amxmodx/mm_pextensions.h
Executable file
@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004 Jussi Kivilinna
|
||||||
|
*
|
||||||
|
* This file is part of "Metamod All-Mod-Support"-patch for Metamod.
|
||||||
|
*
|
||||||
|
* Metamod 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.
|
||||||
|
*
|
||||||
|
* Metamod 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 Metamod; 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 MM_PEXTENSIONS_H
|
||||||
|
#define MM_PEXTENSIONS_H
|
||||||
|
|
||||||
|
#include "plinfo.h" // plid_t
|
||||||
|
#include "meta_api.h" // PLUG_LOADTIME
|
||||||
|
/*
|
||||||
|
|
||||||
|
How to use:
|
||||||
|
1. Add new export function 'Meta_PExtGiveFnptrs' to your plugin file.
|
||||||
|
'Meta_PExtGiveFnptrs' will be called right after 'Meta_Query' call.
|
||||||
|
2. Meta_PExtGiveFnptrs is called with interface version 'META_PEXT_VERSION'
|
||||||
|
and pointer to extension function table.
|
||||||
|
3. Meta_PExtGiveFnptrs should return plugin's interface version.
|
||||||
|
4. !NOTE! Metamod will not stop loading plugin even if plugin returns
|
||||||
|
interface version greater than current. Plugin should disable itself in
|
||||||
|
this kind of situation.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
#include "mm_pextensions.h"
|
||||||
|
|
||||||
|
pextension_funcs_t *gpMetaPExtFuncs;
|
||||||
|
|
||||||
|
int Meta_PExtGiveFnptrs(int interfaceVersion, pextension_funcs_t *pMetaPExtFuncs) {
|
||||||
|
if(interfaceVersion < META_PEXT_VERSION) {
|
||||||
|
LOG_DEVELOPER(PLID, "Error! Metamod is too old, please update!");
|
||||||
|
gpMetaPExtFuncs = NULL;
|
||||||
|
|
||||||
|
return(META_PEXT_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
gpMetaPExtFuncs = pMetaPExtFuncs;
|
||||||
|
|
||||||
|
return(META_PEXT_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
Callback functions:
|
||||||
|
- int PEXT_LOAD_PLUGIN_BY_NAME(PLID, const char *cmdline, PLUG_LOADTIME now, void **plugin_handle);
|
||||||
|
Parses 'cmdline' as metamod would parse 'meta load <cmdline>' and loads found
|
||||||
|
plugin. If 'plugin_handle' is set, metamod writes module handle of loaded
|
||||||
|
plugin at it.
|
||||||
|
Returns zero on success.
|
||||||
|
For error codes see 'META_ERRNO' in 'types_meta.h'.
|
||||||
|
|
||||||
|
- int PEXT_UNLOAD_PLUGIN_BY_NAME(PLID, const char *cmdline, PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
|
||||||
|
Parses 'cmdline' as metamod would parse 'meta unload <cmdline>' and
|
||||||
|
unloads found plugin.
|
||||||
|
Returns zero on success.
|
||||||
|
For error codes see 'META_ERRNO' in 'types_meta.h'.
|
||||||
|
|
||||||
|
- int PEXT_UNLOAD_PLUGIN_BY_HANDLE(PLID, void *plugin_handle, PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
|
||||||
|
Unloads plugin with 'plugin_handle'.
|
||||||
|
Returns zero on success.
|
||||||
|
For error codes see 'META_ERRNO' in 'types_meta.h'.
|
||||||
|
|
||||||
|
!NOTE! Plugin cannot unload itself!
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Interface version
|
||||||
|
// 1: first version. Used in p13
|
||||||
|
// 2: Complete remake (p14):
|
||||||
|
// pfnLoadMetaPluginByName
|
||||||
|
// pfnUnloadMetaPluginByName
|
||||||
|
// pfnUnloadMetaPluginByHandle
|
||||||
|
// v2 is locked now. Don't modify old functions. If you add new functions, increase META_PEXT_VERSION.
|
||||||
|
#define META_PEXT_VERSION 2
|
||||||
|
|
||||||
|
// Meta PExtension Function table type.
|
||||||
|
typedef struct pextension_funcs_s {
|
||||||
|
int (*pfnLoadMetaPluginByName)(plid_t plid, const char *cmdline, PLUG_LOADTIME now, void **plugin_handle);
|
||||||
|
int (*pfnUnloadMetaPluginByName)(plid_t plid, const char *cmdline, PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
|
||||||
|
int (*pfnUnloadMetaPluginByHandle)(plid_t plid, void *plugin_handle, PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
|
||||||
|
} pextension_funcs_t;
|
||||||
|
|
||||||
|
// Convenience macros for MetaPExtension functions.
|
||||||
|
#define PEXT_LOAD_PLUGIN_BY_NAME (*gpMetaPExtFuncs->pfnLoadMetaPluginByName)
|
||||||
|
#define PEXT_UNLOAD_PLUGIN_BY_NAME (*gpMetaPExtFuncs->pfnUnloadMetaPluginByName)
|
||||||
|
#define PEXT_UNLOAD_PLUGIN_BY_HANDLE (*gpMetaPExtFuncs->pfnUnloadMetaPluginByHandle)
|
||||||
|
|
||||||
|
// Give plugin extension function table.
|
||||||
|
C_DLLEXPORT int Meta_PExtGiveFnptrs(int interfaceVersion,
|
||||||
|
pextension_funcs_t *pMetaPExtFuncs);
|
||||||
|
typedef int (*META_GIVE_PEXT_FUNCTIONS_FN) (int interfaceVersion,
|
||||||
|
pextension_funcs_t *pMetaPExtFuncs);
|
||||||
|
|
||||||
|
#endif /* MM_PEXTENSIONS_H */
|
@ -930,7 +930,11 @@ void *m_allocator(const char *sourceFile, const unsigned int sourceLine, const c
|
|||||||
|
|
||||||
// Danger Will Robinson!
|
// Danger Will Robinson!
|
||||||
|
|
||||||
if (reservoir == NULL) throw "Unable to allocate RAM for internal memory tracking data";
|
if (reservoir == NULL)
|
||||||
|
{
|
||||||
|
log("%s: Unable to allocate RAM for internal memory tracking data", ownerString(sourceFile, sourceLine, sourceFunc));
|
||||||
|
throw "Unable to allocate RAM for internal memory tracking data";
|
||||||
|
}
|
||||||
|
|
||||||
// Build a linked-list of the elements in our reservoir
|
// Build a linked-list of the elements in our reservoir
|
||||||
|
|
||||||
@ -998,6 +1002,7 @@ void *m_allocator(const char *sourceFile, const unsigned int sourceLine, const c
|
|||||||
|
|
||||||
if (au->actualAddress == NULL)
|
if (au->actualAddress == NULL)
|
||||||
{
|
{
|
||||||
|
log("%s: Request for allocation failed. Out of memory.", ownerString(sourceFile, sourceLine, sourceFunc));
|
||||||
throw "Request for allocation failed. Out of memory.";
|
throw "Request for allocation failed. Out of memory.";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1108,7 +1113,11 @@ void *m_reallocator(const char *sourceFile, const unsigned int sourceLine, const
|
|||||||
|
|
||||||
// If you hit this assert, you tried to reallocate RAM that wasn't allocated by this memory manager.
|
// If you hit this assert, you tried to reallocate RAM that wasn't allocated by this memory manager.
|
||||||
m_assert(au != NULL);
|
m_assert(au != NULL);
|
||||||
if (au == NULL) throw "Request to reallocate RAM that was never allocated";
|
if (au == NULL)
|
||||||
|
{
|
||||||
|
log("%s: Request to reallocate RAM that was never allocated", ownerString(sourceFile, sourceLine, sourceFunc));
|
||||||
|
throw "Request to reallocate RAM that was never allocated";
|
||||||
|
}
|
||||||
|
|
||||||
// If you hit this assert, then the allocation unit that is about to be reallocated is damaged. But you probably
|
// If you hit this assert, then the allocation unit that is about to be reallocated is damaged. But you probably
|
||||||
// already know that from a previous assert you should have seen in validateAllocUnit() :)
|
// already know that from a previous assert you should have seen in validateAllocUnit() :)
|
||||||
@ -1162,7 +1171,11 @@ void *m_reallocator(const char *sourceFile, const unsigned int sourceLine, const
|
|||||||
m_assert(newActualAddress);
|
m_assert(newActualAddress);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!newActualAddress) throw "Request for reallocation failed. Out of memory.";
|
if (!newActualAddress)
|
||||||
|
{
|
||||||
|
log("%s: Request for reallocation failed. Out of memory", ownerString(sourceFile, sourceLine, sourceFunc));
|
||||||
|
throw "Request for reallocation failed. Out of memory.";
|
||||||
|
}
|
||||||
|
|
||||||
// Remove this allocation from our stats (we'll add the new reallocation again later)
|
// Remove this allocation from our stats (we'll add the new reallocation again later)
|
||||||
|
|
||||||
@ -1291,7 +1304,11 @@ void m_deallocator(const char *sourceFile, const unsigned int sourceLine, const
|
|||||||
|
|
||||||
// If you hit this assert, you tried to deallocate RAM that wasn't allocated by this memory manager.
|
// If you hit this assert, you tried to deallocate RAM that wasn't allocated by this memory manager.
|
||||||
m_assert(au != NULL);
|
m_assert(au != NULL);
|
||||||
if (au == NULL) throw "Request to deallocate RAM that was never allocated";
|
if (au == NULL)
|
||||||
|
{
|
||||||
|
log("%s: Request to deallocate RAM that was never allocated", ownerString(sourceFile, sourceLine, sourceFunc));
|
||||||
|
throw "Request to deallocate RAM that was never allocated";
|
||||||
|
}
|
||||||
|
|
||||||
// If you hit this assert, then the allocation unit that is about to be deallocated is damaged. But you probably
|
// If you hit this assert, then the allocation unit that is about to be deallocated is damaged. But you probably
|
||||||
// already know that from a previous assert you should have seen in validateAllocUnit() :)
|
// already know that from a previous assert you should have seen in validateAllocUnit() :)
|
||||||
|
1442
amxmodx/modules.cpp
1442
amxmodx/modules.cpp
File diff suppressed because it is too large
Load Diff
@ -36,144 +36,19 @@
|
|||||||
|
|
||||||
#undef DLLEXPORT
|
#undef DLLEXPORT
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
#define DLLEXPORT __declspec(dllexport)
|
#define DLLEXPORT __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define DLLEXPORT
|
#define DLLEXPORT
|
||||||
#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 {
|
int CheckModules(AMX *amx, char error[128]);
|
||||||
const char* name;
|
const char *StrCaseStr(const char *as, const char *bs);
|
||||||
const char* author;
|
|
||||||
const char* version;
|
|
||||||
int ivers;
|
|
||||||
int type;
|
|
||||||
long int serial;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Small scripting language
|
|
||||||
struct pfnamx_engine_g {
|
|
||||||
uint16_t* (*pfnamx_Align16)(uint16_t *); // value
|
|
||||||
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)
|
|
||||||
#define AMX_ALIGN32 (*g_engAmxFunc->pfnamx_Align32)
|
|
||||||
#define AMX_ALLOT (*g_engAmxFunc->pfnamx_Allot)
|
|
||||||
#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
|
|
||||||
struct pfnmodule_engine_g {
|
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
#endif // __MODULES_H__
|
#endif // __MODULES_H__
|
||||||
|
39
amxmodx/msvc/amxmodx_mm.sln
Executable file
39
amxmodx/msvc/amxmodx_mm.sln
Executable file
@ -0,0 +1,39 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx", "amxmodx_mm.vcproj", "{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfiguration) = preSolution
|
||||||
|
Debug = Debug
|
||||||
|
JITDebug = JITDebug
|
||||||
|
JITMemtestRelease = JITMemtestRelease
|
||||||
|
JITRelease = JITRelease
|
||||||
|
MaximalSpeed = MaximalSpeed
|
||||||
|
MemtestDebug = MemtestDebug
|
||||||
|
MemtestRelease = MemtestRelease
|
||||||
|
Release = Release
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfiguration) = postSolution
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Debug.ActiveCfg = Debug|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Debug.Build.0 = Debug|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug.ActiveCfg = JITDebug|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug.Build.0 = JITDebug|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITMemtestRelease.ActiveCfg = JITMemtestRelease|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITMemtestRelease.Build.0 = JITMemtestRelease|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}.MaximalSpeed.ActiveCfg = MaximalSpeed|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MaximalSpeed.Build.0 = MaximalSpeed|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestDebug.ActiveCfg = MemtestDebug|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestDebug.Build.0 = MemtestDebug|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestRelease.ActiveCfg = MemtestRelease|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestRelease.Build.0 = MemtestRelease|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Release.ActiveCfg = Release|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Release.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
@ -42,12 +42,13 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/MACHINE:I386"
|
AdditionalOptions="/MACHINE:I386"
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib"
|
AdditionalDependencies="..\JIT\natives-x86.obj ..\zlib\zlib.lib"
|
||||||
OutputFile="debug/amxx_mm.dll"
|
OutputFile="debug/amxmodx_mm.dll"
|
||||||
Version="0.1"
|
Version="0.1"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="MSVCRT"
|
||||||
ModuleDefinitionFile=""
|
ModuleDefinitionFile=""
|
||||||
GenerateDebugInformation="TRUE"
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile=".\debug/amxx_mm.pdb"
|
ProgramDatabaseFile=".\debug/amxx_mm.pdb"
|
||||||
@ -112,11 +113,12 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/MACHINE:I386"
|
AdditionalOptions="/MACHINE:I386"
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib"
|
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib ..\JIT\natives-x86.obj"
|
||||||
OutputFile="release/amxx_mm.dll"
|
OutputFile="release/amxmodx_mm.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="LIBC"
|
||||||
ModuleDefinitionFile=""
|
ModuleDefinitionFile=""
|
||||||
ProgramDatabaseFile=".\release/amxx_mm.pdb"
|
ProgramDatabaseFile=".\release/amxx_mm.pdb"
|
||||||
ImportLibrary=".\release/amxx_mm.lib"/>
|
ImportLibrary=".\release/amxx_mm.lib"/>
|
||||||
@ -179,12 +181,13 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/MACHINE:I386"
|
AdditionalOptions="/MACHINE:I386"
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib"
|
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib ..\JIT\natives-x86.obj"
|
||||||
OutputFile="memtestdebug/amxx_mm.dll"
|
OutputFile="memtestdebug/amxmodx_mm.dll"
|
||||||
Version="0.1"
|
Version="0.1"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="MSVCRT"
|
||||||
ModuleDefinitionFile=""
|
ModuleDefinitionFile=""
|
||||||
GenerateDebugInformation="TRUE"
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile=".\memtestdebug/amxx_mm.pdb"
|
ProgramDatabaseFile=".\memtestdebug/amxx_mm.pdb"
|
||||||
@ -249,13 +252,17 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/MACHINE:I386"
|
AdditionalOptions="/MACHINE:I386"
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib"
|
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib ..\JIT\natives-x86.obj"
|
||||||
OutputFile="memtestrelease/amxx_mm.dll"
|
OutputFile="memtestrelease/amxmodx_mm.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="LIBC"
|
||||||
ModuleDefinitionFile=""
|
ModuleDefinitionFile=""
|
||||||
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile=".\memtestrelease/amxx_mm.pdb"
|
ProgramDatabaseFile=".\memtestrelease/amxx_mm.pdb"
|
||||||
|
GenerateMapFile="TRUE"
|
||||||
|
MapExports="TRUE"
|
||||||
ImportLibrary=".\memtestrelease/amxx_mm.lib"/>
|
ImportLibrary=".\memtestrelease/amxx_mm.lib"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCMIDLTool"
|
Name="VCMIDLTool"
|
||||||
@ -297,7 +304,7 @@
|
|||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
Optimization="0"
|
Optimization="0"
|
||||||
AdditionalIncludeDirectories=""C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared";"C:\Hry\Half-Life\SDK\Multiplayer Source\dlls";"C:\Hry\Half-Life\SDK\Multiplayer Source\engine";"C:\Hry\Half-Life\SDK\Multiplayer Source\common";C:\Files\Programming\metamod\metamod"
|
AdditionalIncludeDirectories=""C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared";"C:\Hry\Half-Life\SDK\Multiplayer Source\dlls";"C:\Hry\Half-Life\SDK\Multiplayer Source\engine";"C:\Hry\Half-Life\SDK\Multiplayer Source\common";C:\Files\Programming\metamod\metamod"
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT"
|
||||||
BasicRuntimeChecks="3"
|
BasicRuntimeChecks="3"
|
||||||
RuntimeLibrary="5"
|
RuntimeLibrary="5"
|
||||||
StructMemberAlignment="3"
|
StructMemberAlignment="3"
|
||||||
@ -316,12 +323,13 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/MACHINE:I386"
|
AdditionalOptions="/MACHINE:I386"
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib"
|
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||||
OutputFile="jitdebug/amxx_mm.dll"
|
OutputFile="jitdebug/amxmodx_mm.dll"
|
||||||
Version="0.1"
|
Version="0.1"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="MSVCRT"
|
||||||
ModuleDefinitionFile=""
|
ModuleDefinitionFile=""
|
||||||
GenerateDebugInformation="TRUE"
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
|
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
|
||||||
@ -367,8 +375,10 @@
|
|||||||
GlobalOptimizations="TRUE"
|
GlobalOptimizations="TRUE"
|
||||||
InlineFunctionExpansion="1"
|
InlineFunctionExpansion="1"
|
||||||
FavorSizeOrSpeed="1"
|
FavorSizeOrSpeed="1"
|
||||||
|
OmitFramePointers="TRUE"
|
||||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
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"
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT;ASM32;PAWN_CELL_SIZE=32"
|
||||||
|
IgnoreStandardIncludePath="FALSE"
|
||||||
StringPooling="TRUE"
|
StringPooling="TRUE"
|
||||||
RuntimeLibrary="4"
|
RuntimeLibrary="4"
|
||||||
EnableFunctionLevelLinking="TRUE"
|
EnableFunctionLevelLinking="TRUE"
|
||||||
@ -386,13 +396,16 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/MACHINE:I386"
|
AdditionalOptions="/MACHINE:I386"
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib"
|
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||||
OutputFile="jitrelease/amxx_mm.dll"
|
OutputFile="jitrelease/amxmodx_mm.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="MSVCRT"
|
||||||
ModuleDefinitionFile=""
|
ModuleDefinitionFile=""
|
||||||
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile=".\jitrelease/amxx_mm.pdb"
|
ProgramDatabaseFile=".\jitrelease/amxx_mm.pdb"
|
||||||
|
GenerateMapFile="FALSE"
|
||||||
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
|
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCMIDLTool"
|
Name="VCMIDLTool"
|
||||||
@ -436,7 +449,7 @@
|
|||||||
InlineFunctionExpansion="1"
|
InlineFunctionExpansion="1"
|
||||||
FavorSizeOrSpeed="1"
|
FavorSizeOrSpeed="1"
|
||||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST;JIT"
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST;JIT;ASM32;PAWN_CELL_SIZE=32"
|
||||||
StringPooling="TRUE"
|
StringPooling="TRUE"
|
||||||
RuntimeLibrary="4"
|
RuntimeLibrary="4"
|
||||||
EnableFunctionLevelLinking="TRUE"
|
EnableFunctionLevelLinking="TRUE"
|
||||||
@ -454,12 +467,14 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/MACHINE:I386"
|
AdditionalOptions="/MACHINE:I386"
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib"
|
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||||
OutputFile="jitmemtestrelease/amxx_mm.dll"
|
OutputFile="jitmemtestrelease/amxmodx_mm.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="MSVCRT"
|
||||||
ModuleDefinitionFile=""
|
ModuleDefinitionFile=""
|
||||||
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile=".\jitmemtestrelease/amxx_mm.pdb"
|
ProgramDatabaseFile=".\jitmemtestrelease/amxx_mm.pdb"
|
||||||
ImportLibrary=".\jitmemtestrelease/amxx_mm.lib"/>
|
ImportLibrary=".\jitmemtestrelease/amxx_mm.lib"/>
|
||||||
<Tool
|
<Tool
|
||||||
@ -525,8 +540,8 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/MACHINE:I386"
|
AdditionalOptions="/MACHINE:I386"
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib"
|
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
|
||||||
OutputFile="MaximalSpeed/amxx_mm.dll"
|
OutputFile="MaximalSpeed/amxmodx_mm.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
@ -574,6 +589,9 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\amxcore.cpp">
|
RelativePath="..\amxcore.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxdbg.cpp">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\amxmodx.cpp">
|
RelativePath="..\amxmodx.cpp">
|
||||||
</File>
|
</File>
|
||||||
@ -622,6 +640,9 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\CVault.cpp">
|
RelativePath="..\CVault.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\debugger.cpp">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\emsg.cpp">
|
RelativePath="..\emsg.cpp">
|
||||||
</File>
|
</File>
|
||||||
@ -647,10 +668,13 @@
|
|||||||
RelativePath="..\meta_api.cpp">
|
RelativePath="..\meta_api.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\minilzo\minilzo.c">
|
RelativePath="..\modules.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\modules.cpp">
|
RelativePath="..\natives.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\newmenus.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\power.cpp">
|
RelativePath="..\power.cpp">
|
||||||
@ -714,6 +738,9 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\amx.h">
|
RelativePath="..\amx.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxdbg.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\amxmodx.h">
|
RelativePath="..\amxmodx.h">
|
||||||
</File>
|
</File>
|
||||||
@ -760,7 +787,7 @@
|
|||||||
RelativePath="..\CQueue.h">
|
RelativePath="..\CQueue.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CRList.h">
|
RelativePath="..\CStack.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CString.h">
|
RelativePath="..\CString.h">
|
||||||
@ -774,15 +801,36 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\CVector.h">
|
RelativePath="..\CVector.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\debugger.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\fakemeta.h">
|
RelativePath="..\fakemeta.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\md5.h">
|
RelativePath="..\md5.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\menus.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\modules.h">
|
RelativePath="..\modules.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\natives.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\newmenus.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\resource.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\zlib\zconf.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\zlib\zlib.h">
|
||||||
|
</File>
|
||||||
<Filter
|
<Filter
|
||||||
Name="mmgr"
|
Name="mmgr"
|
||||||
Filter="">
|
Filter="">
|
||||||
@ -801,6 +849,25 @@
|
|||||||
RelativePath="..\version.rc">
|
RelativePath="..\version.rc">
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Assembly"
|
||||||
|
Filter="">
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxdefn.asm">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxexecn.asm">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxjitsn.asm">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\natives-amd64.asm">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\natives-x86.asm">
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
</Files>
|
</Files>
|
||||||
<Globals>
|
<Globals>
|
||||||
</Globals>
|
</Globals>
|
91
amxmodx/natives-amd64.asm
Executable file
91
amxmodx/natives-amd64.asm
Executable 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
100
amxmodx/natives-x86.asm
Executable 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
|
436
amxmodx/natives.cpp
Executable file
436
amxmodx/natives.cpp
Executable file
@ -0,0 +1,436 @@
|
|||||||
|
/* 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 "CStack.h"
|
||||||
|
#include "natives.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
|
||||||
|
|
||||||
|
CVector<regnative *> g_RegNatives;
|
||||||
|
CStack<regnative *> g_NativeStack;
|
||||||
|
CVector<String> g_Libraries;
|
||||||
|
static char g_errorStr[512] = {0};
|
||||||
|
static int g_errorNum = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
//parameter stack
|
||||||
|
pNative->caller = amx;
|
||||||
|
|
||||||
|
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx);
|
||||||
|
|
||||||
|
int err = 0;
|
||||||
|
cell ret = 0;
|
||||||
|
g_errorNum = 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>=1; 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]);
|
||||||
|
}
|
||||||
|
if ( (err=amx_Exec(pNative->amx, &ret, pNative->func)) != AMX_ERR_NONE)
|
||||||
|
{
|
||||||
|
g_NativeStack.pop();
|
||||||
|
LogError(pNative->amx, err, "");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (g_errorNum)
|
||||||
|
{
|
||||||
|
g_NativeStack.pop();
|
||||||
|
LogError(amx, g_errorNum, g_errorStr);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
g_NativeStack.pop();
|
||||||
|
|
||||||
|
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_errorNum = 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.top();
|
||||||
|
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.top();
|
||||||
|
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.top();
|
||||||
|
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.top();
|
||||||
|
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.top();
|
||||||
|
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.top();
|
||||||
|
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.top();
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
//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.top();
|
||||||
|
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);
|
||||||
|
|
||||||
|
AddPluginLibrary(lib);
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
//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;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LibraryExists(const char *name)
|
||||||
|
{
|
||||||
|
for (size_t i=0; i<g_Libraries.size(); i++)
|
||||||
|
{
|
||||||
|
if (stricmp(g_Libraries[i].c_str(), name)==0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddPluginLibrary(const char *name)
|
||||||
|
{
|
||||||
|
String f(name);
|
||||||
|
g_Libraries.push_back(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClearPluginLibraries()
|
||||||
|
{
|
||||||
|
g_Libraries.clear();
|
||||||
|
|
||||||
|
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},
|
||||||
|
{"param_convert", param_convert},
|
||||||
|
//////////////////////////
|
||||||
|
{NULL, NULL},
|
||||||
|
};
|
69
amxmodx/natives.h
Executable file
69
amxmodx/natives.h
Executable 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
|
||||||
|
#define CALLFUNC_MAXPARAMS 16
|
||||||
|
|
||||||
|
#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 AddPluginLibrary(const char *name);
|
||||||
|
void ClearPluginLibraries();
|
||||||
|
bool LibraryExists(const char *name);
|
||||||
|
|
||||||
|
//I couldn't resist :)
|
||||||
|
extern AMX_NATIVE_INFO g_NativeNatives[];
|
||||||
|
|
||||||
|
#endif //_INCLUDE_NATIVES_H
|
484
amxmodx/newmenus.cpp
Executable file
484
amxmodx/newmenus.cpp
Executable file
@ -0,0 +1,484 @@
|
|||||||
|
/* 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;
|
||||||
|
|
||||||
|
void ClearMenus()
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < g_NewMenus.size(); i++)
|
||||||
|
delete g_NewMenus[i];
|
||||||
|
|
||||||
|
g_NewMenus.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
Menu::Menu(const char *title, int mid, int tid)
|
||||||
|
{
|
||||||
|
m_Title.assign(title);
|
||||||
|
menuId = mid;
|
||||||
|
thisId = tid;
|
||||||
|
}
|
||||||
|
|
||||||
|
Menu::~Menu()
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < m_Items.size(); i++)
|
||||||
|
delete m_Items[i];
|
||||||
|
|
||||||
|
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();
|
||||||
|
page_t numPages = (items / MENUITEMS) + 1;
|
||||||
|
|
||||||
|
if (!items)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (numPages % MENUITEMS == 0)
|
||||||
|
numPages--;
|
||||||
|
|
||||||
|
return numPages;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Menu::PagekeyToItem(page_t page, item_t key)
|
||||||
|
{
|
||||||
|
page_t pages = GetPageCount();
|
||||||
|
item_t numItems = GetItemCount();
|
||||||
|
|
||||||
|
if (page >= pages)
|
||||||
|
return MENU_EXIT;
|
||||||
|
|
||||||
|
item_t start = page * 7;
|
||||||
|
|
||||||
|
if (page == 0)
|
||||||
|
{
|
||||||
|
item_t rem = numItems >= 7 ? 7 : numItems;
|
||||||
|
|
||||||
|
if (key == rem)
|
||||||
|
{
|
||||||
|
if (pages > 1)
|
||||||
|
return MENU_MORE;
|
||||||
|
else
|
||||||
|
return MENU_EXIT;
|
||||||
|
}
|
||||||
|
else if (key == rem + 1)
|
||||||
|
{
|
||||||
|
return MENU_EXIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (page == pages - 1)
|
||||||
|
{
|
||||||
|
//find number of remaining items
|
||||||
|
//for example, 11 items on page 1... means start=7, 11-7=4
|
||||||
|
item_t rem = numItems - start;
|
||||||
|
//however, the last item is actually this -1, so...
|
||||||
|
if (key == rem)
|
||||||
|
{
|
||||||
|
return MENU_EXIT;
|
||||||
|
}
|
||||||
|
else if (key == rem + 1)
|
||||||
|
{
|
||||||
|
return MENU_BACK;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (key == 7)
|
||||||
|
{
|
||||||
|
return MENU_MORE;
|
||||||
|
}
|
||||||
|
else if (key == 8)
|
||||||
|
{
|
||||||
|
return MENU_BACK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (start + key);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 (g_coloredmenus)
|
||||||
|
_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);
|
||||||
|
|
||||||
|
m_Text.append(buffer);
|
||||||
|
|
||||||
|
item_t start = page * 7;
|
||||||
|
item_t end = 0;
|
||||||
|
if (start + 7 <= numItems)
|
||||||
|
{
|
||||||
|
end = start + 7;
|
||||||
|
} else {
|
||||||
|
end = numItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
menuitem *pItem = NULL;
|
||||||
|
|
||||||
|
int option = 0;
|
||||||
|
keys = 0;
|
||||||
|
bool enabled = true;
|
||||||
|
int ret = 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, player, thisId, 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);
|
||||||
|
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", ++option, pItem->name.c_str());
|
||||||
|
} else {
|
||||||
|
if (g_coloredmenus)
|
||||||
|
{
|
||||||
|
_snprintf(buffer, sizeof(buffer)-1, "\\d%d. %s\n\\w", ++option, pItem->name.c_str());
|
||||||
|
} else {
|
||||||
|
_snprintf(buffer, sizeof(buffer)-1, "#. %s\n", pItem->name.c_str());
|
||||||
|
option++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_Text.append(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
//now for a weird part >:o
|
||||||
|
//this will either be MORE or BACK..
|
||||||
|
keys |= (1<<option++);
|
||||||
|
if ((page < pages - 1) && (pages > 1))
|
||||||
|
{
|
||||||
|
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", option, "More");
|
||||||
|
} else {
|
||||||
|
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", option, "Exit");
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Text.append(buffer);
|
||||||
|
|
||||||
|
if (pages > 1)
|
||||||
|
{
|
||||||
|
keys |= (1<<option++);
|
||||||
|
if (pages == 0)
|
||||||
|
{
|
||||||
|
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", option, "Exit");
|
||||||
|
} else {
|
||||||
|
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", option, "Back");
|
||||||
|
}
|
||||||
|
m_Text.append(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_Text.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GETMENU(p) if (p >= (int)g_NewMenus.size() || p < 0) { \
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d", p); \
|
||||||
|
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);
|
||||||
|
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, (int)g_NewMenus.size());
|
||||||
|
g_NewMenus.push_back(pMenu);
|
||||||
|
|
||||||
|
return (int)g_NewMenus.size() - 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]);
|
||||||
|
|
||||||
|
name = get_amxstring(amx, params[2], 0, len);
|
||||||
|
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];
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
AMX_NATIVE_INFO g_NewMenuNatives[] =
|
||||||
|
{
|
||||||
|
{"menu_create", menu_create},
|
||||||
|
{"menu_additem", menu_additem},
|
||||||
|
{"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},
|
||||||
|
{NULL, NULL},
|
||||||
|
};
|
106
amxmodx/newmenus.h
Executable file
106
amxmodx/newmenus.h
Executable file
@ -0,0 +1,106 @@
|
|||||||
|
/* 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 MENUITEMS 7
|
||||||
|
|
||||||
|
typedef int (*MENUITEM_CALLBACK)(int, int, int);
|
||||||
|
|
||||||
|
struct menuitem
|
||||||
|
{
|
||||||
|
String name;
|
||||||
|
String cmd;
|
||||||
|
|
||||||
|
int access;
|
||||||
|
int handler;
|
||||||
|
|
||||||
|
MENUITEM_CALLBACK pfn;
|
||||||
|
size_t id;
|
||||||
|
};
|
||||||
|
|
||||||
|
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();
|
||||||
|
private:
|
||||||
|
CVector<menuitem * > m_Items;
|
||||||
|
|
||||||
|
String m_Title;
|
||||||
|
String m_Text;
|
||||||
|
|
||||||
|
int menuId;
|
||||||
|
int thisId;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*Menu *CreateMenu(const char *title);
|
||||||
|
Menu *GetMenuById(menu_t menu);
|
||||||
|
menuitem *GetMenuItem(menu_t menu, item_t item);
|
||||||
|
size_t GetMenuPages(menu_t menu);
|
||||||
|
size_t GetMenuItems(menu_t menu);
|
||||||
|
menuitem *AddMenuItem(menu_t menu, const char *name, const char *cmd, int access);
|
||||||
|
bool DisplayMenu(menu_t menu, int player, page_t page);
|
||||||
|
int MenuPagekeyToItem(menu_t menu, page_t page, int key);
|
||||||
|
int FindByMenuid(int menuid);
|
||||||
|
int GetMenuMenuid(menu_t menu);
|
||||||
|
const char *GetItemName(menu_t menu, item_t item);
|
||||||
|
const char *GetItemCmd(menu_t menu, item_t item);*/
|
||||||
|
|
||||||
|
void ClearMenus();
|
||||||
|
|
||||||
|
extern CVector<Menu *> g_NewMenus;
|
||||||
|
extern AMX_NATIVE_INFO g_NewMenuNatives[];
|
||||||
|
|
||||||
|
#endif //_INCLUDE_NEWMENUS_H
|
@ -6,6 +6,7 @@
|
|||||||
* 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
|
// this file does not include amxmodx.h, so we have to include the memory manager here
|
||||||
#ifdef MEMORY_TEST
|
#ifdef MEMORY_TEST
|
||||||
#include "mmgr/mmgr.h"
|
#include "mmgr/mmgr.h"
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
@ -45,6 +45,13 @@
|
|||||||
enginefuncs_t g_engfuncs;
|
enginefuncs_t g_engfuncs;
|
||||||
globalvars_t *gpGlobals;
|
globalvars_t *gpGlobals;
|
||||||
|
|
||||||
|
DLL_FUNCTIONS *g_pFunctionTable;
|
||||||
|
DLL_FUNCTIONS *g_pFunctionTable_Post;
|
||||||
|
enginefuncs_t *g_pengfuncsTable;
|
||||||
|
enginefuncs_t *g_pengfuncsTable_Post;
|
||||||
|
NEW_DLL_FUNCTIONS *g_pNewFunctionsTable;
|
||||||
|
NEW_DLL_FUNCTIONS *g_pNewFunctionsTable_Post;
|
||||||
|
|
||||||
// GetEntityAPI2 functions
|
// GetEntityAPI2 functions
|
||||||
static DLL_FUNCTIONS g_EntityAPI_Table =
|
static DLL_FUNCTIONS g_EntityAPI_Table =
|
||||||
{
|
{
|
||||||
@ -2114,6 +2121,7 @@ C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersi
|
|||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
memcpy(pFunctionTable, &g_EntityAPI_Table, sizeof(DLL_FUNCTIONS));
|
memcpy(pFunctionTable, &g_EntityAPI_Table, sizeof(DLL_FUNCTIONS));
|
||||||
|
g_pFunctionTable=pFunctionTable;
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2131,7 +2139,7 @@ C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interface
|
|||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
memcpy( pFunctionTable, &g_EntityAPI_Post_Table, sizeof( DLL_FUNCTIONS ) );
|
memcpy( pFunctionTable, &g_EntityAPI_Post_Table, sizeof( DLL_FUNCTIONS ) );
|
||||||
|
g_pFunctionTable_Post=pFunctionTable;
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2154,6 +2162,7 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
|||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
memcpy(pengfuncsFromEngine, &g_EngineFuncs_Table, sizeof(enginefuncs_t));
|
memcpy(pengfuncsFromEngine, &g_EngineFuncs_Table, sizeof(enginefuncs_t));
|
||||||
|
g_pengfuncsTable=pengfuncsFromEngine;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2171,6 +2180,7 @@ C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int
|
|||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
memcpy(pengfuncsFromEngine, &g_EngineFuncs_Post_Table, sizeof(enginefuncs_t));
|
memcpy(pengfuncsFromEngine, &g_EngineFuncs_Post_Table, sizeof(enginefuncs_t));
|
||||||
|
g_pengfuncsTable_Post=pengfuncsFromEngine;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -2195,6 +2205,7 @@ C_DLLEXPORT int GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pNewFunctionTable,
|
|||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
memcpy(pNewFunctionTable, &g_NewFuncs_Table, sizeof(NEW_DLL_FUNCTIONS));
|
memcpy(pNewFunctionTable, &g_NewFuncs_Table, sizeof(NEW_DLL_FUNCTIONS));
|
||||||
|
g_pNewFunctionsTable=pNewFunctionTable;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2212,6 +2223,7 @@ C_DLLEXPORT int GetNewDLLFunctions_Post( NEW_DLL_FUNCTIONS *pNewFunctionTable, i
|
|||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
memcpy(pNewFunctionTable, &g_NewFuncs_Post_Table, sizeof(NEW_DLL_FUNCTIONS));
|
memcpy(pNewFunctionTable, &g_NewFuncs_Post_Table, sizeof(NEW_DLL_FUNCTIONS));
|
||||||
|
g_pNewFunctionsTable_Post=pNewFunctionTable;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2406,9 +2418,6 @@ C_DLLEXPORT void __stdcall GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine,
|
|||||||
|
|
||||||
/************* AMXX Stuff *************/
|
/************* AMXX Stuff *************/
|
||||||
|
|
||||||
// *** Types ***
|
|
||||||
typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
|
|
||||||
|
|
||||||
// *** Globals ***
|
// *** Globals ***
|
||||||
// Module info
|
// Module info
|
||||||
static amxx_module_info_s g_ModuleInfo =
|
static amxx_module_info_s g_ModuleInfo =
|
||||||
@ -2417,15 +2426,17 @@ static amxx_module_info_s g_ModuleInfo =
|
|||||||
MODULE_AUTHOR,
|
MODULE_AUTHOR,
|
||||||
MODULE_VERSION,
|
MODULE_VERSION,
|
||||||
#ifdef MODULE_RELOAD_ON_MAPCHANGE
|
#ifdef MODULE_RELOAD_ON_MAPCHANGE
|
||||||
1
|
1,
|
||||||
#else // MODULE_RELOAD_ON_MAPCHANGE
|
#else // MODULE_RELOAD_ON_MAPCHANGE
|
||||||
0
|
0,
|
||||||
#endif // MODULE_RELOAD_ON_MAPCHANGE
|
#endif // MODULE_RELOAD_ON_MAPCHANGE
|
||||||
|
MODULE_LOGTAG
|
||||||
};
|
};
|
||||||
|
|
||||||
// Storage for the requested functions
|
// Storage for the requested functions
|
||||||
PFN_ADD_NATIVES g_fn_AddNatives;
|
PFN_ADD_NATIVES g_fn_AddNatives;
|
||||||
PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
||||||
|
PFN_BUILD_PATHNAME_R g_fn_BuildPathnameR;
|
||||||
PFN_GET_AMXADDR g_fn_GetAmxAddr;
|
PFN_GET_AMXADDR g_fn_GetAmxAddr;
|
||||||
PFN_PRINT_SRVCONSOLE g_fn_PrintSrvConsole;
|
PFN_PRINT_SRVCONSOLE g_fn_PrintSrvConsole;
|
||||||
PFN_GET_MODNAME g_fn_GetModname;
|
PFN_GET_MODNAME g_fn_GetModname;
|
||||||
@ -2439,11 +2450,14 @@ PFN_GET_AMXSTRINGLEN g_fn_GetAmxStringLen;
|
|||||||
PFN_FORMAT_AMXSTRING g_fn_FormatAmxString;
|
PFN_FORMAT_AMXSTRING g_fn_FormatAmxString;
|
||||||
PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory;
|
PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory;
|
||||||
PFN_LOG g_fn_Log;
|
PFN_LOG g_fn_Log;
|
||||||
|
PFN_LOG_ERROR g_fn_LogErrorFunc;
|
||||||
PFN_RAISE_AMXERROR g_fn_RaiseAmxError;
|
PFN_RAISE_AMXERROR g_fn_RaiseAmxError;
|
||||||
PFN_REGISTER_FORWARD g_fn_RegisterForward;
|
PFN_REGISTER_FORWARD g_fn_RegisterForward;
|
||||||
PFN_EXECUTE_FORWARD g_fn_ExecuteForward;
|
PFN_EXECUTE_FORWARD g_fn_ExecuteForward;
|
||||||
PFN_PREPARE_CELLARRAY g_fn_PrepareCellArray;
|
PFN_PREPARE_CELLARRAY g_fn_PrepareCellArray;
|
||||||
PFN_PREPARE_CHARARRAY g_fn_PrepareCharArray;
|
PFN_PREPARE_CHARARRAY g_fn_PrepareCharArray;
|
||||||
|
PFN_PREPARE_CELLARRAY_A g_fn_PrepareCellArrayA;
|
||||||
|
PFN_PREPARE_CHARARRAY_A g_fn_PrepareCharArrayA;
|
||||||
PFN_IS_PLAYER_VALID g_fn_IsPlayerValid;
|
PFN_IS_PLAYER_VALID g_fn_IsPlayerValid;
|
||||||
PFN_GET_PLAYER_NAME g_fn_GetPlayerName;
|
PFN_GET_PLAYER_NAME g_fn_GetPlayerName;
|
||||||
PFN_GET_PLAYER_IP g_fn_GetPlayerIP;
|
PFN_GET_PLAYER_IP g_fn_GetPlayerIP;
|
||||||
@ -2453,6 +2467,7 @@ PFN_IS_PLAYER_AUTHORIZED g_fn_IsPlayerAuthorized;
|
|||||||
PFN_GET_PLAYER_TIME g_fn_GetPlayerTime;
|
PFN_GET_PLAYER_TIME g_fn_GetPlayerTime;
|
||||||
PFN_GET_PLAYER_PLAYTIME g_fn_GetPlayerPlayTime;
|
PFN_GET_PLAYER_PLAYTIME g_fn_GetPlayerPlayTime;
|
||||||
PFN_GET_PLAYER_CURWEAPON g_fn_GetPlayerCurweapon;
|
PFN_GET_PLAYER_CURWEAPON g_fn_GetPlayerCurweapon;
|
||||||
|
PFN_GET_PLAYER_TEAM g_fn_GetPlayerTeam;
|
||||||
PFN_GET_PLAYER_TEAMID g_fn_GetPlayerTeamID;
|
PFN_GET_PLAYER_TEAMID g_fn_GetPlayerTeamID;
|
||||||
PFN_GET_PLAYER_DEATHS g_fn_GetPlayerDeaths;
|
PFN_GET_PLAYER_DEATHS g_fn_GetPlayerDeaths;
|
||||||
PFN_GET_PLAYER_MENU g_fn_GetPlayerMenu;
|
PFN_GET_PLAYER_MENU g_fn_GetPlayerMenu;
|
||||||
@ -2463,9 +2478,11 @@ PFN_IS_PLAYER_CONNECTING g_fn_IsPlayerConnecting;
|
|||||||
PFN_IS_PLAYER_HLTV g_fn_IsPlayerHLTV;
|
PFN_IS_PLAYER_HLTV g_fn_IsPlayerHLTV;
|
||||||
PFN_GET_PLAYER_ARMOR g_fn_GetPlayerArmor;
|
PFN_GET_PLAYER_ARMOR g_fn_GetPlayerArmor;
|
||||||
PFN_GET_PLAYER_HEALTH g_fn_GetPlayerHealth;
|
PFN_GET_PLAYER_HEALTH g_fn_GetPlayerHealth;
|
||||||
|
#ifdef MEMORY_TEST
|
||||||
PFN_ALLOCATOR g_fn_Allocator;
|
PFN_ALLOCATOR g_fn_Allocator;
|
||||||
PFN_REALLOCATOR g_fn_Reallocator;
|
PFN_REALLOCATOR g_fn_Reallocator;
|
||||||
PFN_DEALLOCATOR g_fn_Deallocator;
|
PFN_DEALLOCATOR g_fn_Deallocator;
|
||||||
|
#endif
|
||||||
PFN_AMX_EXEC g_fn_AmxExec;
|
PFN_AMX_EXEC g_fn_AmxExec;
|
||||||
PFN_AMX_EXECV g_fn_AmxExecv;
|
PFN_AMX_EXECV g_fn_AmxExecv;
|
||||||
PFN_AMX_ALLOT g_fn_AmxAllot;
|
PFN_AMX_ALLOT g_fn_AmxAllot;
|
||||||
@ -2478,6 +2495,13 @@ PFN_REGISTER_SPFORWARD g_fn_RegisterSPForward;
|
|||||||
PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName;
|
PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName;
|
||||||
PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward;
|
PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward;
|
||||||
PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File;
|
PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File;
|
||||||
|
PFN_AMX_FINDNATIVE g_fn_AmxFindNative;
|
||||||
|
PFN_GETPLAYERFLAGS g_fn_GetPlayerFlags;
|
||||||
|
PFN_GET_PLAYER_EDICT g_fn_GetPlayerEdict;
|
||||||
|
PFN_FORMAT g_fn_Format;
|
||||||
|
PFN_REGISTERFUNCTION g_fn_RegisterFunction;
|
||||||
|
PFN_REQ_FNPTR g_fn_RequestFunction;
|
||||||
|
PFN_AMX_PUSH g_fn_AmxPush;
|
||||||
|
|
||||||
// *** Exports ***
|
// *** Exports ***
|
||||||
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
||||||
@ -2515,13 +2539,19 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|||||||
if (!reqFnptrFunc)
|
if (!reqFnptrFunc)
|
||||||
return AMXX_PARAM;
|
return AMXX_PARAM;
|
||||||
|
|
||||||
|
g_fn_RequestFunction = reqFnptrFunc;
|
||||||
|
|
||||||
// Req all known functions
|
// Req all known functions
|
||||||
// Misc
|
// Misc
|
||||||
REQFUNC("BuildPathname", g_fn_BuildPathname, PFN_BUILD_PATHNAME);
|
REQFUNC("BuildPathname", g_fn_BuildPathname, PFN_BUILD_PATHNAME);
|
||||||
|
REQFUNC("BuildPathnameR", g_fn_BuildPathnameR, PFN_BUILD_PATHNAME_R);
|
||||||
REQFUNC("PrintSrvConsole", g_fn_PrintSrvConsole, PFN_PRINT_SRVCONSOLE);
|
REQFUNC("PrintSrvConsole", g_fn_PrintSrvConsole, PFN_PRINT_SRVCONSOLE);
|
||||||
REQFUNC("GetModname", g_fn_GetModname, PFN_GET_MODNAME);
|
REQFUNC("GetModname", g_fn_GetModname, PFN_GET_MODNAME);
|
||||||
REQFUNC("Log", g_fn_Log, PFN_LOG);
|
REQFUNC("Log", g_fn_Log, PFN_LOG);
|
||||||
|
REQFUNC("LogError", g_fn_LogErrorFunc, PFN_LOG_ERROR);
|
||||||
REQFUNC("MergeDefinitionFile", g_fn_MergeDefinition_File, PFN_MERGEDEFINITION_FILE);
|
REQFUNC("MergeDefinitionFile", g_fn_MergeDefinition_File, PFN_MERGEDEFINITION_FILE);
|
||||||
|
REQFUNC("Format", g_fn_Format, PFN_FORMAT);
|
||||||
|
REQFUNC("RegisterFunction", g_fn_RegisterFunction, PFN_REGISTERFUNCTION);
|
||||||
|
|
||||||
// Amx scripts
|
// Amx scripts
|
||||||
REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT);
|
REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT);
|
||||||
@ -2529,6 +2559,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|||||||
REQFUNC("FindAmxScriptByName", g_fn_FindAmxScriptByName, PFN_FIND_AMXSCRIPT_BYNAME);
|
REQFUNC("FindAmxScriptByName", g_fn_FindAmxScriptByName, PFN_FIND_AMXSCRIPT_BYNAME);
|
||||||
REQFUNC("LoadAmxScript", g_fn_LoadAmxScript, PFN_LOAD_AMXSCRIPT);
|
REQFUNC("LoadAmxScript", g_fn_LoadAmxScript, PFN_LOAD_AMXSCRIPT);
|
||||||
REQFUNC("UnloadAmxScript", g_fn_UnloadAmxScript, PFN_UNLOAD_AMXSCRIPT);
|
REQFUNC("UnloadAmxScript", g_fn_UnloadAmxScript, PFN_UNLOAD_AMXSCRIPT);
|
||||||
|
REQFUNC("GetAmxScriptName", g_fn_GetAmxScriptName, PFN_GET_AMXSCRIPTNAME);
|
||||||
|
|
||||||
// String / mem in amx scripts support
|
// String / mem in amx scripts support
|
||||||
REQFUNC("SetAmxString", g_fn_SetAmxString, PFN_SET_AMXSTRING);
|
REQFUNC("SetAmxString", g_fn_SetAmxString, PFN_SET_AMXSTRING);
|
||||||
@ -2542,6 +2573,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|||||||
REQFUNC("amx_Execv", g_fn_AmxExecv, PFN_AMX_EXECV);
|
REQFUNC("amx_Execv", g_fn_AmxExecv, PFN_AMX_EXECV);
|
||||||
REQFUNC("amx_FindPublic", g_fn_AmxFindPublic, PFN_AMX_FINDPUBLIC);
|
REQFUNC("amx_FindPublic", g_fn_AmxFindPublic, PFN_AMX_FINDPUBLIC);
|
||||||
REQFUNC("amx_Allot", g_fn_AmxAllot, PFN_AMX_ALLOT);
|
REQFUNC("amx_Allot", g_fn_AmxAllot, PFN_AMX_ALLOT);
|
||||||
|
REQFUNC("amx_FindNative", g_fn_AmxFindNative, PFN_AMX_FINDNATIVE);
|
||||||
|
|
||||||
// Natives / Forwards
|
// Natives / Forwards
|
||||||
REQFUNC("AddNatives", g_fn_AddNatives, PFN_ADD_NATIVES);
|
REQFUNC("AddNatives", g_fn_AddNatives, PFN_ADD_NATIVES);
|
||||||
@ -2553,7 +2585,8 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|||||||
REQFUNC("ExecuteForward", g_fn_ExecuteForward, PFN_EXECUTE_FORWARD);
|
REQFUNC("ExecuteForward", g_fn_ExecuteForward, PFN_EXECUTE_FORWARD);
|
||||||
REQFUNC("PrepareCellArray", g_fn_PrepareCellArray, PFN_PREPARE_CELLARRAY);
|
REQFUNC("PrepareCellArray", g_fn_PrepareCellArray, PFN_PREPARE_CELLARRAY);
|
||||||
REQFUNC("PrepareCharArray", g_fn_PrepareCharArray, PFN_PREPARE_CHARARRAY);
|
REQFUNC("PrepareCharArray", g_fn_PrepareCharArray, PFN_PREPARE_CHARARRAY);
|
||||||
|
REQFUNC("PrepareCellArrayA", g_fn_PrepareCellArrayA, PFN_PREPARE_CELLARRAY_A);
|
||||||
|
REQFUNC("PrepareCharArrayA", g_fn_PrepareCharArrayA, PFN_PREPARE_CHARARRAY_A);
|
||||||
// Player
|
// Player
|
||||||
REQFUNC("IsPlayerValid", g_fn_IsPlayerValid, PFN_IS_PLAYER_VALID);
|
REQFUNC("IsPlayerValid", g_fn_IsPlayerValid, PFN_IS_PLAYER_VALID);
|
||||||
REQFUNC("GetPlayerName", g_fn_GetPlayerName, PFN_GET_PLAYER_NAME);
|
REQFUNC("GetPlayerName", g_fn_GetPlayerName, PFN_GET_PLAYER_NAME);
|
||||||
@ -2565,6 +2598,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|||||||
REQFUNC("GetPlayerPlayTime", g_fn_GetPlayerPlayTime, PFN_GET_PLAYER_PLAYTIME);
|
REQFUNC("GetPlayerPlayTime", g_fn_GetPlayerPlayTime, PFN_GET_PLAYER_PLAYTIME);
|
||||||
REQFUNC("GetPlayerCurweapon", g_fn_GetPlayerCurweapon, PFN_GET_PLAYER_CURWEAPON);
|
REQFUNC("GetPlayerCurweapon", g_fn_GetPlayerCurweapon, PFN_GET_PLAYER_CURWEAPON);
|
||||||
REQFUNC("GetPlayerTeamID", g_fn_GetPlayerTeamID, PFN_GET_PLAYER_TEAMID);
|
REQFUNC("GetPlayerTeamID", g_fn_GetPlayerTeamID, PFN_GET_PLAYER_TEAMID);
|
||||||
|
REQFUNC("GetPlayerTeam",g_fn_GetPlayerTeam, PFN_GET_PLAYER_TEAM);
|
||||||
REQFUNC("GetPlayerDeaths", g_fn_GetPlayerDeaths, PFN_GET_PLAYER_DEATHS);
|
REQFUNC("GetPlayerDeaths", g_fn_GetPlayerDeaths, PFN_GET_PLAYER_DEATHS);
|
||||||
REQFUNC("GetPlayerMenu", g_fn_GetPlayerMenu, PFN_GET_PLAYER_MENU);
|
REQFUNC("GetPlayerMenu", g_fn_GetPlayerMenu, PFN_GET_PLAYER_MENU);
|
||||||
REQFUNC("GetPlayerKeys", g_fn_GetPlayerKeys, PFN_GET_PLAYER_KEYS);
|
REQFUNC("GetPlayerKeys", g_fn_GetPlayerKeys, PFN_GET_PLAYER_KEYS);
|
||||||
@ -2574,11 +2608,16 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|||||||
REQFUNC("IsPlayerHLTV", g_fn_IsPlayerHLTV, PFN_IS_PLAYER_HLTV);
|
REQFUNC("IsPlayerHLTV", g_fn_IsPlayerHLTV, PFN_IS_PLAYER_HLTV);
|
||||||
REQFUNC("GetPlayerArmor", g_fn_GetPlayerArmor, PFN_GET_PLAYER_ARMOR);
|
REQFUNC("GetPlayerArmor", g_fn_GetPlayerArmor, PFN_GET_PLAYER_ARMOR);
|
||||||
REQFUNC("GetPlayerHealth", g_fn_GetPlayerHealth, PFN_GET_PLAYER_HEALTH);
|
REQFUNC("GetPlayerHealth", g_fn_GetPlayerHealth, PFN_GET_PLAYER_HEALTH);
|
||||||
|
REQFUNC("GetPlayerFlags", g_fn_GetPlayerFlags, PFN_GETPLAYERFLAGS);
|
||||||
|
REQFUNC("GetPlayerEdict", g_fn_GetPlayerEdict, PFN_GET_PLAYER_EDICT);
|
||||||
|
REQFUNC("amx_Push", g_fn_AmxPush, PFN_AMX_PUSH);
|
||||||
|
|
||||||
|
#ifdef MEMORY_TEST
|
||||||
// Memory
|
// Memory
|
||||||
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
|
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
|
||||||
REQFUNC_OPT("Reallocator", g_fn_Reallocator, PFN_REALLOCATOR);
|
REQFUNC_OPT("Reallocator", g_fn_Reallocator, PFN_REALLOCATOR);
|
||||||
REQFUNC_OPT("Deallocator", g_fn_Deallocator, PFN_DEALLOCATOR);
|
REQFUNC_OPT("Deallocator", g_fn_Deallocator, PFN_DEALLOCATOR);
|
||||||
|
#endif
|
||||||
|
|
||||||
REQFUNC("CellToReal", g_fn_CellToReal, PFN_CELL_TO_REAL);
|
REQFUNC("CellToReal", g_fn_CellToReal, PFN_CELL_TO_REAL);
|
||||||
REQFUNC("RealToCell", g_fn_RealToCell, PFN_REAL_TO_CELL);
|
REQFUNC("RealToCell", g_fn_RealToCell, PFN_REAL_TO_CELL);
|
||||||
@ -2617,7 +2656,19 @@ void MF_Log(const char *fmt, ...)
|
|||||||
vsprintf(msg, fmt, arglst);
|
vsprintf(msg, fmt, arglst);
|
||||||
va_end(arglst);
|
va_end(arglst);
|
||||||
|
|
||||||
g_fn_Log("[%s] %s", MODULE_NAME, msg);
|
g_fn_Log("[%s] %s", MODULE_LOGTAG, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MF_LogError(AMX *amx, int err, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
// :TODO: Overflow possible here
|
||||||
|
char msg[3072];
|
||||||
|
va_list arglst;
|
||||||
|
va_start(arglst, fmt);
|
||||||
|
vsprintf(msg, fmt, arglst);
|
||||||
|
va_end(arglst);
|
||||||
|
|
||||||
|
g_fn_LogErrorFunc(amx, err, "[%s] %s", MODULE_LOGTAG, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2627,6 +2678,7 @@ void MF_Log(const char *fmt, ...)
|
|||||||
void ValidateMacros_DontCallThis_Smiley()
|
void ValidateMacros_DontCallThis_Smiley()
|
||||||
{
|
{
|
||||||
MF_BuildPathname("str", "str", 0);
|
MF_BuildPathname("str", "str", 0);
|
||||||
|
MF_BuildPathnameR(NULL, 0, "%d", 0);
|
||||||
MF_FormatAmxString(NULL, 0, 0, NULL);
|
MF_FormatAmxString(NULL, 0, 0, NULL);
|
||||||
MF_GetAmxAddr(NULL, 0);
|
MF_GetAmxAddr(NULL, 0);
|
||||||
MF_PrintSrvConsole("str", "str", 0);
|
MF_PrintSrvConsole("str", "str", 0);
|
||||||
@ -2640,11 +2692,14 @@ void ValidateMacros_DontCallThis_Smiley()
|
|||||||
MF_GetAmxStringLen(NULL);
|
MF_GetAmxStringLen(NULL);
|
||||||
MF_CopyAmxMemory(NULL, NULL, 0);
|
MF_CopyAmxMemory(NULL, NULL, 0);
|
||||||
MF_Log("str", "str", 0);
|
MF_Log("str", "str", 0);
|
||||||
|
MF_LogError(NULL, 0, NULL);
|
||||||
MF_RaiseAmxError(NULL, 0);
|
MF_RaiseAmxError(NULL, 0);
|
||||||
MF_RegisterForward("str", (ForwardExecType)0, 0, 0, 0);
|
MF_RegisterForward("str", (ForwardExecType)0, 0, 0, 0);
|
||||||
MF_ExecuteForward(0, 0, 0);
|
MF_ExecuteForward(0, 0, 0);
|
||||||
MF_PrepareCellArray(NULL, 0);
|
MF_PrepareCellArray(NULL, 0);
|
||||||
MF_PrepareCharArray(NULL, 0);
|
MF_PrepareCharArray(NULL, 0);
|
||||||
|
MF_PrepareCellArrayA(NULL, 0, true);
|
||||||
|
MF_PrepareCharArrayA(NULL, 0, true);
|
||||||
MF_IsPlayerValid(0);
|
MF_IsPlayerValid(0);
|
||||||
MF_GetPlayerName(0);
|
MF_GetPlayerName(0);
|
||||||
MF_GetPlayerIP(0);
|
MF_GetPlayerIP(0);
|
||||||
@ -2655,6 +2710,7 @@ void ValidateMacros_DontCallThis_Smiley()
|
|||||||
MF_GetPlayerPlayTime(0);
|
MF_GetPlayerPlayTime(0);
|
||||||
MF_GetPlayerCurweapon(0);
|
MF_GetPlayerCurweapon(0);
|
||||||
MF_GetPlayerTeamID(0);
|
MF_GetPlayerTeamID(0);
|
||||||
|
MF_GetPlayerTeam(0);
|
||||||
MF_GetPlayerDeaths(0);
|
MF_GetPlayerDeaths(0);
|
||||||
MF_GetPlayerMenu(0);
|
MF_GetPlayerMenu(0);
|
||||||
MF_GetPlayerKeys(0);
|
MF_GetPlayerKeys(0);
|
||||||
@ -2664,18 +2720,24 @@ void ValidateMacros_DontCallThis_Smiley()
|
|||||||
MF_IsPlayerHLTV(0);
|
MF_IsPlayerHLTV(0);
|
||||||
MF_GetPlayerArmor(0);
|
MF_GetPlayerArmor(0);
|
||||||
MF_GetPlayerHealth(0);
|
MF_GetPlayerHealth(0);
|
||||||
MF_AmxExec(0, 0, 0, 0);
|
MF_AmxExec(0, 0, 0);
|
||||||
MF_AmxExecv(0, 0, 0, 0, 0);
|
MF_AmxExecv(0, 0, 0, 0, 0);
|
||||||
MF_AmxFindPublic(0, 0, 0);
|
MF_AmxFindPublic(0, 0, 0);
|
||||||
MF_AmxAllot(0, 0, 0, 0);
|
MF_AmxAllot(0, 0, 0, 0);
|
||||||
MF_LoadAmxScript(0, 0, 0, 0);
|
MF_LoadAmxScript(0, 0, 0, 0, 0);
|
||||||
MF_UnloadAmxScript(0, 0);
|
MF_UnloadAmxScript(0, 0);
|
||||||
MF_RegisterSPForward(0, 0, 0, 0, 0, 0);
|
MF_RegisterSPForward(0, 0, 0, 0, 0, 0);
|
||||||
MF_RegisterSPForwardByName(0, 0, 0, 0, 0, 0);
|
MF_RegisterSPForwardByName(0, 0, 0, 0, 0, 0);
|
||||||
MF_UnregisterSPForward(0);
|
MF_UnregisterSPForward(0);
|
||||||
|
MF_GetPlayerFrags(0);
|
||||||
|
MF_GetPlayerEdict(0);
|
||||||
|
MF_Format("", 4, "str");
|
||||||
|
MF_RegisterFunction(NULL, "");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MEMORY_TEST
|
||||||
|
|
||||||
/************* MEMORY *************/
|
/************* MEMORY *************/
|
||||||
// undef all defined macros
|
// undef all defined macros
|
||||||
#undef new
|
#undef new
|
||||||
@ -2789,7 +2851,7 @@ void *operator new(size_t reportedSize)
|
|||||||
return ptr;
|
return ptr;
|
||||||
|
|
||||||
// allocation failed
|
// allocation failed
|
||||||
throw std::bad_alloc();
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *operator new[](size_t reportedSize)
|
void *operator new[](size_t reportedSize)
|
||||||
@ -2802,7 +2864,7 @@ void *operator new[](size_t reportedSize)
|
|||||||
return ptr;
|
return ptr;
|
||||||
|
|
||||||
// allocation failed
|
// allocation failed
|
||||||
throw std::bad_alloc();
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Microsoft memory tracking operators
|
// Microsoft memory tracking operators
|
||||||
@ -2816,7 +2878,7 @@ void *operator new(size_t reportedSize, const char *sourceFile, int sourceLine)
|
|||||||
return ptr;
|
return ptr;
|
||||||
|
|
||||||
// allocation failed
|
// allocation failed
|
||||||
throw std::bad_alloc();
|
return NULL;
|
||||||
}
|
}
|
||||||
void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine)
|
void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine)
|
||||||
{
|
{
|
||||||
@ -2828,7 +2890,7 @@ void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine
|
|||||||
return ptr;
|
return ptr;
|
||||||
|
|
||||||
// allocation failed
|
// allocation failed
|
||||||
throw std::bad_alloc();
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator delete(void *reportedAddress)
|
void operator delete(void *reportedAddress)
|
||||||
@ -2847,6 +2909,30 @@ void operator delete[](void *reportedAddress)
|
|||||||
Mem_Deallocator(g_Mem_CurrentFilename, g_Mem_CurrentLine, g_Mem_CurrentFunc, m_alloc_delete_array, reportedAddress);
|
Mem_Deallocator(g_Mem_CurrentFilename, g_Mem_CurrentLine, g_Mem_CurrentFunc, m_alloc_delete_array, reportedAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#if !defined NO_ALLOC_OVERRIDES && !defined MEMORY_TEST && !defined WIN32
|
||||||
|
void * ::operator new(size_t size) {
|
||||||
|
return(calloc(1, size));
|
||||||
|
}
|
||||||
|
|
||||||
|
void * ::operator new[](size_t size) {
|
||||||
|
return(calloc(1, size));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ::operator delete(void * ptr) {
|
||||||
|
if(ptr)
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ::operator delete[](void * ptr) {
|
||||||
|
if(ptr)
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif //MEMORY_TEST
|
||||||
|
|
||||||
/************* stuff from dlls/util.cpp *************/
|
/************* stuff from dlls/util.cpp *************/
|
||||||
// must come here because cbase.h declares it's own operator new
|
// must come here because cbase.h declares it's own operator new
|
||||||
|
|
||||||
|
@ -31,8 +31,10 @@
|
|||||||
|
|
||||||
// ***** AMXX stuff *****
|
// ***** AMXX stuff *****
|
||||||
|
|
||||||
// module interface version is 1
|
// module interface version was 1
|
||||||
#define AMXX_INTERFACE_VERSION 1
|
// 2 - added logtag to struct (amxx1.1-rc1)
|
||||||
|
// 3 - added new tagAMX structure (amxx1.5)
|
||||||
|
#define AMXX_INTERFACE_VERSION 3
|
||||||
|
|
||||||
// amxx module info
|
// amxx module info
|
||||||
struct amxx_module_info_s
|
struct amxx_module_info_s
|
||||||
@ -41,10 +43,9 @@ struct amxx_module_info_s
|
|||||||
const char *author;
|
const char *author;
|
||||||
const char *version;
|
const char *version;
|
||||||
int reload; // reload on mapchange when nonzero
|
int reload; // reload on mapchange when nonzero
|
||||||
|
const char *logtag; // added in version 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// return values from functions called by amxx
|
// return values from functions called by amxx
|
||||||
#define AMXX_OK 0 /* no error */
|
#define AMXX_OK 0 /* no error */
|
||||||
#define AMXX_IFVERS 1 /* interface version */
|
#define AMXX_IFVERS 1 /* interface version */
|
||||||
@ -53,38 +54,55 @@ struct amxx_module_info_s
|
|||||||
|
|
||||||
// *** Small stuff ***
|
// *** Small stuff ***
|
||||||
// The next section is copied from the amx.h file
|
// The next section is copied from the amx.h file
|
||||||
// Copyright (c) ITB CompuPhase, 1997-2004
|
// Copyright (c) ITB CompuPhase, 1997-2005
|
||||||
|
|
||||||
#if defined __LCC__ || defined __DMC__ || defined __linux__
|
#if defined HAVE_STDINT_H
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
|
#else
|
||||||
/* The ISO C99 defines the int16_t and int_32t types. If the compiler got
|
#if defined __LCC__ || defined __DMC__ || defined LINUX
|
||||||
* here, these types are probably undefined.
|
#if defined HAVE_INTTYPES_H
|
||||||
*/
|
#include <inttypes.h>
|
||||||
#if defined __FreeBSD__
|
|
||||||
#include <inttypes.h>
|
|
||||||
#else
|
|
||||||
typedef short int int16_t;
|
|
||||||
typedef unsigned short int uint16_t;
|
|
||||||
#if defined SN_TARGET_PS2
|
|
||||||
typedef int int32_t;
|
|
||||||
typedef unsigned int uint32_t;
|
|
||||||
#else
|
#else
|
||||||
typedef long int int32_t;
|
#include <stdint.h>
|
||||||
typedef unsigned long int uint32_t;
|
|
||||||
#endif
|
#endif
|
||||||
#if defined __WIN32__ || defined _WIN32 || defined WIN32
|
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
|
||||||
typedef __int64 int64_t;
|
/* The ISO C99 defines the int16_t and int_32t types. If the compiler got
|
||||||
typedef unsigned __int64 uint64_t;
|
* here, these types are probably undefined.
|
||||||
#define HAVE_I64
|
*/
|
||||||
#elif defined __GNUC__
|
#if defined __MACH__
|
||||||
typedef long long int64_t;
|
#include <ppc/types.h>
|
||||||
typedef unsigned long long uint64_t;
|
typedef unsigned short int uint16_t;
|
||||||
#define HAVE_I64
|
typedef unsigned long int uint32_t;
|
||||||
|
#elif defined __FreeBSD__
|
||||||
|
#include <inttypes.h>
|
||||||
|
#else
|
||||||
|
typedef short int int16_t;
|
||||||
|
typedef unsigned short int uint16_t;
|
||||||
|
#if defined SN_TARGET_PS2
|
||||||
|
typedef int int32_t;
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
#else
|
||||||
|
typedef long int int32_t;
|
||||||
|
typedef unsigned long int uint32_t;
|
||||||
|
#endif
|
||||||
|
#if defined __WIN32__ || defined _WIN32 || defined WIN32
|
||||||
|
typedef __int64 int64_t;
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
#define HAVE_I64
|
||||||
|
#elif defined __GNUC__
|
||||||
|
typedef long long int64_t;
|
||||||
|
typedef unsigned long long uint64_t;
|
||||||
|
#define HAVE_I64
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#define HAVE_STDINT_H
|
||||||
|
#endif
|
||||||
|
#if defined _LP64 || defined WIN64 || defined _WIN64
|
||||||
|
#if !defined __64BIT__
|
||||||
|
#define __64BIT__
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* calling convention for native functions */
|
/* calling convention for native functions */
|
||||||
#if !defined AMX_NATIVE_CALL
|
#if !defined AMX_NATIVE_CALL
|
||||||
@ -104,24 +122,26 @@ struct amxx_module_info_s
|
|||||||
#define AMXEXPORT
|
#define AMXEXPORT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined PAWN_CELL_SIZE
|
||||||
|
#define PAWN_CELL_SIZE 32 /* by default, use 32-bit cells */
|
||||||
#if !defined SMALL_CELL_SIZE
|
|
||||||
#define SMALL_CELL_SIZE 32 /* by default, use 32-bit cells */
|
|
||||||
#endif
|
#endif
|
||||||
#if SMALL_CELL_SIZE==32
|
#if PAWN_CELL_SIZE==16
|
||||||
|
typedef uint16_t ucell;
|
||||||
|
typedef int16_t cell;
|
||||||
|
#elif PAWN_CELL_SIZE==32
|
||||||
typedef uint32_t ucell;
|
typedef uint32_t ucell;
|
||||||
typedef int32_t cell;
|
typedef int32_t cell;
|
||||||
typedef float REAL;
|
#define REAL float
|
||||||
#elif SMALL_CELL_SIZE==64
|
#elif PAWN_CELL_SIZE==64
|
||||||
typedef uint64_t ucell;
|
typedef uint64_t ucell;
|
||||||
typedef int64_t cell;
|
typedef int64_t cell;
|
||||||
typedef double REAL;
|
#define REAL double
|
||||||
#else
|
#else
|
||||||
#error Unsupported cell size (SMALL_CELL_SIZE)
|
#error Unsupported cell size (PAWN_CELL_SIZE)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define UNPACKEDMAX ((1 << (sizeof(cell)-1)*8) - 1)
|
#define UNPACKEDMAX ((1 << (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);
|
||||||
@ -139,21 +159,24 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined SN_TARGET_PS2 || defined __GNUC__
|
/* 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__) && !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) */
|
||||||
@ -174,7 +197,7 @@ typedef struct {
|
|||||||
* 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 */
|
||||||
@ -186,30 +209,25 @@ 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;
|
long 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
|
||||||
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 sysreq_d PACKED; /* relocated address/value for the SYSREQ.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 */
|
} PACKED AMX;
|
||||||
#endif
|
|
||||||
} AMX;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
AMX_ERR_NONE,
|
AMX_ERR_NONE,
|
||||||
@ -226,6 +244,7 @@ enum {
|
|||||||
AMX_ERR_NATIVE, /* native function failed */
|
AMX_ERR_NATIVE, /* native function failed */
|
||||||
AMX_ERR_DIVIDE, /* divide by zero */
|
AMX_ERR_DIVIDE, /* divide by zero */
|
||||||
AMX_ERR_SLEEP, /* go into sleepmode - code can be restarted */
|
AMX_ERR_SLEEP, /* go into sleepmode - code can be restarted */
|
||||||
|
AMX_ERR_INVSTATE, /* invalid state for this access */
|
||||||
|
|
||||||
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 */
|
||||||
@ -240,6 +259,14 @@ enum {
|
|||||||
AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */
|
AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if !defined AMX_NO_ALIGN
|
||||||
|
#if defined __linux__
|
||||||
|
#pragma pack() /* reset default packing */
|
||||||
|
#else
|
||||||
|
#pragma pack(pop) /* reset previous packing */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ***** declare functions *****
|
// ***** declare functions *****
|
||||||
|
|
||||||
@ -923,7 +950,7 @@ void FN_EngineFprintf(FILE *pfile, char *szFmt, ...);
|
|||||||
#endif // FN_EngineFprintf
|
#endif // FN_EngineFprintf
|
||||||
|
|
||||||
#ifdef FN_PvAllocEntPrivateData
|
#ifdef FN_PvAllocEntPrivateData
|
||||||
void *FN_PvAllocEntPrivateData(edict_t *pEdict, long cb);
|
void *FN_PvAllocEntPrivateData(edict_t *pEdict, int32 cb);
|
||||||
#endif // FN_PvAllocEntPrivateData
|
#endif // FN_PvAllocEntPrivateData
|
||||||
|
|
||||||
#ifdef FN_PvEntPrivateData
|
#ifdef FN_PvEntPrivateData
|
||||||
@ -1877,6 +1904,9 @@ void FN_AMXX_DETACH(void);
|
|||||||
void FN_AMXX_PLUGINSLOADED(void);
|
void FN_AMXX_PLUGINSLOADED(void);
|
||||||
#endif // FN_AMXX_PLUGINSLOADED
|
#endif // FN_AMXX_PLUGINSLOADED
|
||||||
|
|
||||||
|
// *** Types ***
|
||||||
|
typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
|
||||||
|
|
||||||
// ***** Module funcs stuff *****
|
// ***** Module funcs stuff *****
|
||||||
enum ForwardExecType
|
enum ForwardExecType
|
||||||
{
|
{
|
||||||
@ -1900,6 +1930,7 @@ enum ForwardParam
|
|||||||
|
|
||||||
typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/);
|
typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/);
|
||||||
typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...);
|
typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...);
|
||||||
|
typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...);
|
||||||
typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/);
|
typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/);
|
||||||
typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...);
|
typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...);
|
||||||
typedef const char * (*PFN_GET_MODNAME) (void);
|
typedef const char * (*PFN_GET_MODNAME) (void);
|
||||||
@ -1913,11 +1944,14 @@ typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr);
|
|||||||
typedef char * (*PFN_FORMAT_AMXSTRING) (AMX * /*amx*/, cell * /*params*/, int /*startParam*/, int * /*pLen*/);
|
typedef char * (*PFN_FORMAT_AMXSTRING) (AMX * /*amx*/, cell * /*params*/, int /*startParam*/, int * /*pLen*/);
|
||||||
typedef void (*PFN_COPY_AMXMEMORY) (cell * /*dest*/, const cell * /*src*/, int /*len*/);
|
typedef void (*PFN_COPY_AMXMEMORY) (cell * /*dest*/, const cell * /*src*/, int /*len*/);
|
||||||
typedef void (*PFN_LOG) (const char * /*fmt*/, ...);
|
typedef void (*PFN_LOG) (const char * /*fmt*/, ...);
|
||||||
|
typedef void (*PFN_LOG_ERROR) (AMX * /*amx*/, int /*err*/, const char * /*fmt*/, ...);
|
||||||
typedef int (*PFN_RAISE_AMXERROR) (AMX * /*amx*/, int /*error*/);
|
typedef int (*PFN_RAISE_AMXERROR) (AMX * /*amx*/, int /*error*/);
|
||||||
typedef int (*PFN_REGISTER_FORWARD) (const char * /*funcname*/, ForwardExecType /*exectype*/, ... /*paramtypes terminated by PF_DONE*/);
|
typedef int (*PFN_REGISTER_FORWARD) (const char * /*funcname*/, ForwardExecType /*exectype*/, ... /*paramtypes terminated by PF_DONE*/);
|
||||||
typedef int (*PFN_EXECUTE_FORWARD) (int /*id*/, ... /*params*/);
|
typedef int (*PFN_EXECUTE_FORWARD) (int /*id*/, ... /*params*/);
|
||||||
typedef cell (*PFN_PREPARE_CELLARRAY) (cell * /*ptr*/, unsigned int /*size*/);
|
typedef cell (*PFN_PREPARE_CELLARRAY) (cell * /*ptr*/, unsigned int /*size*/);
|
||||||
typedef cell (*PFN_PREPARE_CHARARRAY) (char * /*ptr*/, unsigned int /*size*/);
|
typedef cell (*PFN_PREPARE_CHARARRAY) (char * /*ptr*/, unsigned int /*size*/);
|
||||||
|
typedef cell (*PFN_PREPARE_CELLARRAY_A) (cell * /*ptr*/, unsigned int /*size*/, bool /*copyBack*/);
|
||||||
|
typedef cell (*PFN_PREPARE_CHARARRAY_A) (char * /*ptr*/, unsigned int /*size*/, bool /*copyBack*/);
|
||||||
typedef int (*PFN_IS_PLAYER_VALID) (int /*id*/);
|
typedef int (*PFN_IS_PLAYER_VALID) (int /*id*/);
|
||||||
typedef const char * (*PFN_GET_PLAYER_NAME) (int /*id*/);
|
typedef const char * (*PFN_GET_PLAYER_NAME) (int /*id*/);
|
||||||
typedef const char * (*PFN_GET_PLAYER_IP) (int /*id*/);
|
typedef const char * (*PFN_GET_PLAYER_IP) (int /*id*/);
|
||||||
@ -1926,7 +1960,9 @@ typedef int (*PFN_IS_PLAYER_BOT) (int /*id*/);
|
|||||||
typedef int (*PFN_IS_PLAYER_AUTHORIZED) (int /*id*/);
|
typedef int (*PFN_IS_PLAYER_AUTHORIZED) (int /*id*/);
|
||||||
typedef float (*PFN_GET_PLAYER_TIME) (int /*id*/);
|
typedef float (*PFN_GET_PLAYER_TIME) (int /*id*/);
|
||||||
typedef float (*PFN_GET_PLAYER_PLAYTIME) (int /*id*/);
|
typedef float (*PFN_GET_PLAYER_PLAYTIME) (int /*id*/);
|
||||||
|
typedef int (*PFN_GETPLAYERFLAGS) (int /* id*/);
|
||||||
typedef int (*PFN_GET_PLAYER_CURWEAPON) (int /*id*/);
|
typedef int (*PFN_GET_PLAYER_CURWEAPON) (int /*id*/);
|
||||||
|
typedef const char * (*PFN_GET_PLAYER_TEAM) (int /*id*/);
|
||||||
typedef int (*PFN_GET_PLAYER_TEAMID) (int /*id*/);
|
typedef int (*PFN_GET_PLAYER_TEAMID) (int /*id*/);
|
||||||
typedef int (*PFN_GET_PLAYER_DEATHS) (int /*id*/);
|
typedef int (*PFN_GET_PLAYER_DEATHS) (int /*id*/);
|
||||||
typedef int (*PFN_GET_PLAYER_MENU) (int /*id*/);
|
typedef int (*PFN_GET_PLAYER_MENU) (int /*id*/);
|
||||||
@ -1937,17 +1973,26 @@ typedef int (*PFN_IS_PLAYER_CONNECTING) (int /*id*/);
|
|||||||
typedef int (*PFN_IS_PLAYER_HLTV) (int /*id*/);
|
typedef int (*PFN_IS_PLAYER_HLTV) (int /*id*/);
|
||||||
typedef int (*PFN_GET_PLAYER_ARMOR) (int /*id*/);
|
typedef int (*PFN_GET_PLAYER_ARMOR) (int /*id*/);
|
||||||
typedef int (*PFN_GET_PLAYER_HEALTH) (int /*id*/);
|
typedef int (*PFN_GET_PLAYER_HEALTH) (int /*id*/);
|
||||||
|
#ifdef USE_METAMOD
|
||||||
|
typedef edict_t * (*PFN_GET_PLAYER_EDICT) (int /*id*/);
|
||||||
|
#else
|
||||||
|
typedef void * (*PFN_GET_PLAYER_EDICT) (int /*id*/);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MEMORY_TEST
|
||||||
typedef void * (*PFN_ALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
typedef void * (*PFN_ALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
||||||
const unsigned int /*type*/, const size_t /*size*/);
|
const unsigned int /*type*/, const size_t /*size*/);
|
||||||
typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
||||||
const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ );
|
const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ );
|
||||||
typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
||||||
const unsigned int /*type*/, const void* /*addr*/ );
|
const unsigned int /*type*/, const void* /*addr*/ );
|
||||||
typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, ... /*params*/);
|
#endif
|
||||||
|
typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/);
|
||||||
typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/);
|
typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/);
|
||||||
typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/);
|
typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/);
|
||||||
typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/);
|
typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/);
|
||||||
typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/);
|
typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/);
|
||||||
|
typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */);
|
||||||
typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/);
|
typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/);
|
||||||
typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/);
|
typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/);
|
||||||
typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/);
|
typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/);
|
||||||
@ -1955,9 +2000,13 @@ typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*pa
|
|||||||
typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/);
|
typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/);
|
||||||
typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/);
|
typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/);
|
||||||
typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/);
|
typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/);
|
||||||
|
typedef const char * (*PFN_FORMAT) (const char * /*fmt*/, ... /*params*/);
|
||||||
|
typedef void (*PFN_REGISTERFUNCTION) (void * /*pfn*/, const char * /*desc*/);
|
||||||
|
typedef int (*PFN_AMX_PUSH) (AMX * /*amx*/, cell /*value*/);
|
||||||
|
|
||||||
extern PFN_ADD_NATIVES g_fn_AddNatives;
|
extern PFN_ADD_NATIVES g_fn_AddNatives;
|
||||||
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
||||||
|
extern PFN_BUILD_PATHNAME_R g_fn_BuildPathnameR;
|
||||||
extern PFN_GET_AMXADDR g_fn_GetAmxAddr;
|
extern PFN_GET_AMXADDR g_fn_GetAmxAddr;
|
||||||
extern PFN_PRINT_SRVCONSOLE g_fn_PrintSrvConsole;
|
extern PFN_PRINT_SRVCONSOLE g_fn_PrintSrvConsole;
|
||||||
extern PFN_GET_MODNAME g_fn_GetModname;
|
extern PFN_GET_MODNAME g_fn_GetModname;
|
||||||
@ -1971,11 +2020,14 @@ extern PFN_GET_AMXSTRINGLEN g_fn_GetAmxStringLen;
|
|||||||
extern PFN_FORMAT_AMXSTRING g_fn_FormatAmxString;
|
extern PFN_FORMAT_AMXSTRING g_fn_FormatAmxString;
|
||||||
extern PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory;
|
extern PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory;
|
||||||
extern PFN_LOG g_fn_Log;
|
extern PFN_LOG g_fn_Log;
|
||||||
|
extern PFN_LOG_ERROR g_fn_LogErrorFunc;
|
||||||
extern PFN_RAISE_AMXERROR g_fn_RaiseAmxError;
|
extern PFN_RAISE_AMXERROR g_fn_RaiseAmxError;
|
||||||
extern PFN_REGISTER_FORWARD g_fn_RegisterForward;
|
extern PFN_REGISTER_FORWARD g_fn_RegisterForward;
|
||||||
extern PFN_EXECUTE_FORWARD g_fn_ExecuteForward;
|
extern PFN_EXECUTE_FORWARD g_fn_ExecuteForward;
|
||||||
extern PFN_PREPARE_CELLARRAY g_fn_PrepareCellArray;
|
extern PFN_PREPARE_CELLARRAY g_fn_PrepareCellArray;
|
||||||
extern PFN_PREPARE_CHARARRAY g_fn_PrepareCharArray;
|
extern PFN_PREPARE_CHARARRAY g_fn_PrepareCharArray;
|
||||||
|
extern PFN_PREPARE_CELLARRAY_A g_fn_PrepareCellArrayA;
|
||||||
|
extern PFN_PREPARE_CHARARRAY_A g_fn_PrepareCharArrayA;
|
||||||
extern PFN_IS_PLAYER_VALID g_fn_IsPlayerValid;
|
extern PFN_IS_PLAYER_VALID g_fn_IsPlayerValid;
|
||||||
extern PFN_GET_PLAYER_NAME g_fn_GetPlayerName;
|
extern PFN_GET_PLAYER_NAME g_fn_GetPlayerName;
|
||||||
extern PFN_GET_PLAYER_IP g_fn_GetPlayerIP;
|
extern PFN_GET_PLAYER_IP g_fn_GetPlayerIP;
|
||||||
@ -1996,7 +2048,6 @@ extern PFN_IS_PLAYER_HLTV g_fn_IsPlayerHLTV;
|
|||||||
extern PFN_GET_PLAYER_ARMOR g_fn_GetPlayerArmor;
|
extern PFN_GET_PLAYER_ARMOR g_fn_GetPlayerArmor;
|
||||||
extern PFN_GET_PLAYER_HEALTH g_fn_GetPlayerHealth;
|
extern PFN_GET_PLAYER_HEALTH g_fn_GetPlayerHealth;
|
||||||
extern PFN_AMX_EXEC g_fn_AmxExec;
|
extern PFN_AMX_EXEC g_fn_AmxExec;
|
||||||
extern PFN_AMX_EXECV g_fn_AmxExecv;
|
|
||||||
extern PFN_AMX_ALLOT g_fn_AmxAllot;
|
extern PFN_AMX_ALLOT g_fn_AmxAllot;
|
||||||
extern PFN_AMX_FINDPUBLIC g_fn_AmxFindPublic;
|
extern PFN_AMX_FINDPUBLIC g_fn_AmxFindPublic;
|
||||||
extern PFN_LOAD_AMXSCRIPT g_fn_LoadAmxScript;
|
extern PFN_LOAD_AMXSCRIPT g_fn_LoadAmxScript;
|
||||||
@ -2007,12 +2058,21 @@ extern PFN_REGISTER_SPFORWARD g_fn_RegisterSPForward;
|
|||||||
extern PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName;
|
extern PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName;
|
||||||
extern PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward;
|
extern PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward;
|
||||||
extern PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File;
|
extern PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File;
|
||||||
|
extern PFN_AMX_FINDNATIVE g_fn_AmxFindNative;
|
||||||
|
extern PFN_GETPLAYERFLAGS g_fn_GetPlayerFlags;
|
||||||
|
extern PFN_GET_PLAYER_EDICT g_fn_GetPlayerEdict;
|
||||||
|
extern PFN_FORMAT g_fn_Format;
|
||||||
|
extern PFN_GET_PLAYER_TEAM g_fn_GetPlayerTeam;
|
||||||
|
extern PFN_REGISTERFUNCTION g_fn_RegisterFunction;
|
||||||
|
extern PFN_REQ_FNPTR g_fn_RequestFunction;
|
||||||
|
extern PFN_AMX_PUSH g_fn_AmxPush;
|
||||||
|
|
||||||
#ifdef MAY_NEVER_BE_DEFINED
|
#ifdef MAY_NEVER_BE_DEFINED
|
||||||
// Function prototypes for intellisense and similar systems
|
// Function prototypes for intellisense and similar systems
|
||||||
// They understand #if 0 so we use #ifdef MAY_NEVER_BE_DEFINED
|
// They understand #if 0 so we use #ifdef MAY_NEVER_BE_DEFINED
|
||||||
int MF_AddNatives (const AMX_NATIVE_INFO *list) { }
|
int MF_AddNatives (const AMX_NATIVE_INFO *list) { }
|
||||||
char * MF_BuildPathname (const char * format, ...) { }
|
char * MF_BuildPathname (const char * format, ...) { }
|
||||||
|
char * MF_BuildPathnameR (char *buffer, size_t maxlen, const char *fmt, ...) { }
|
||||||
cell * MF_GetAmxAddr (AMX * amx, cell offset) { }
|
cell * MF_GetAmxAddr (AMX * amx, cell offset) { }
|
||||||
void MF_PrintSrvConsole (char * format, ...) { }
|
void MF_PrintSrvConsole (char * format, ...) { }
|
||||||
const char * MF_GetModname (void) { }
|
const char * MF_GetModname (void) { }
|
||||||
@ -2026,11 +2086,14 @@ int MF_GetAmxStringLen (const cell *ptr) { }
|
|||||||
char * MF_FormatAmxString (AMX * amx, cell * params, int startParam, int * pLen) { }
|
char * MF_FormatAmxString (AMX * amx, cell * params, int startParam, int * pLen) { }
|
||||||
void MF_CopyAmxMemory (cell * dest, const cell * src, int len) { }
|
void MF_CopyAmxMemory (cell * dest, const cell * src, int len) { }
|
||||||
void MF_Log (const char * fmt, ...) { }
|
void MF_Log (const char * fmt, ...) { }
|
||||||
|
void MF_LogError (AMX * amx, int err, const char *fmt, ...) { }
|
||||||
int MF_RaiseAmxError (AMX * amx, int error) { }
|
int MF_RaiseAmxError (AMX * amx, int error) { }
|
||||||
int MF_RegisterForward (const char * funcname, ForwardExecType exectype, ...) { }
|
int MF_RegisterForward (const char * funcname, ForwardExecType exectype, ...) { }
|
||||||
int MF_ExecuteForward (int id, ...) { }
|
int MF_ExecuteForward (int id, ...) { }
|
||||||
cell MF_PrepareCellArray (cell * ptr, unsigned int size) { }
|
cell MF_PrepareCellArray (cell * ptr, unsigned int size) { }
|
||||||
cell MF_PrepareCharArray (char * ptr, unsigned int size) { }
|
cell MF_PrepareCharArray (char * ptr, unsigned int size) { }
|
||||||
|
cell MF_PrepareCellArrayA (cell * ptr, unsigned int size, bool copyBack) { }
|
||||||
|
cell MF_PrepareCharArrayA (char * ptr, unsigned int size, bool copyBack) { }
|
||||||
int MF_IsPlayerValid (int id) { }
|
int MF_IsPlayerValid (int id) { }
|
||||||
const char * MF_GetPlayerName (int id) { }
|
const char * MF_GetPlayerName (int id) { }
|
||||||
const char * MF_GetPlayerIP (int id) { }
|
const char * MF_GetPlayerIP (int id) { }
|
||||||
@ -2040,6 +2103,7 @@ int MF_IsPlayerAuthorized (int id) { }
|
|||||||
float MF_GetPlayerTime (int id) { }
|
float MF_GetPlayerTime (int id) { }
|
||||||
float MF_GetPlayerPlayTime (int id) { }
|
float MF_GetPlayerPlayTime (int id) { }
|
||||||
int MF_GetPlayerCurweapon (int id) { }
|
int MF_GetPlayerCurweapon (int id) { }
|
||||||
|
const char * MF_GetPlayerTeam (int id) { }
|
||||||
int MF_GetPlayerTeamID (int id) { }
|
int MF_GetPlayerTeamID (int id) { }
|
||||||
int MF_GetPlayerDeaths (int id) { }
|
int MF_GetPlayerDeaths (int id) { }
|
||||||
int MF_GetPlayerMenu (int id) { }
|
int MF_GetPlayerMenu (int id) { }
|
||||||
@ -2055,10 +2119,18 @@ cell amx_ftoc (float x) { }
|
|||||||
int MF_RegisterSPForwardByName (AMX * amx, const char *str, ...) { }
|
int MF_RegisterSPForwardByName (AMX * amx, const char *str, ...) { }
|
||||||
int MF_RegisterSPForward (AMX * amx, int func, ...) { }
|
int MF_RegisterSPForward (AMX * amx, int func, ...) { }
|
||||||
void MF_UnregisterSPForward (int id) { }
|
void MF_UnregisterSPForward (int id) { }
|
||||||
|
int MF_GetPlayerFlags (int id) { }
|
||||||
|
edict_t* MF_GetPlayerEdict (int id) { }
|
||||||
|
const char * MF_Format (const char *fmt, ...) { }
|
||||||
|
void MF_RegisterFunction (void *pfn, const char *description) { }
|
||||||
|
void * MF_RequestFunction (const char *description) { }
|
||||||
|
int MF_AmxPush (AMX *amx, cell *params) { }
|
||||||
|
int MF_AmxExec (AMX *amx, cell *retval, int idx) { }
|
||||||
#endif // MAY_NEVER_BE_DEFINED
|
#endif // MAY_NEVER_BE_DEFINED
|
||||||
|
|
||||||
#define MF_AddNatives g_fn_AddNatives
|
#define MF_AddNatives g_fn_AddNatives
|
||||||
#define MF_BuildPathname g_fn_BuildPathname
|
#define MF_BuildPathname g_fn_BuildPathname
|
||||||
|
#define MF_BuildPathnameR g_fn_BuildPathnameR
|
||||||
#define MF_FormatAmxString g_fn_FormatAmxString
|
#define MF_FormatAmxString g_fn_FormatAmxString
|
||||||
#define MF_GetAmxAddr g_fn_GetAmxAddr
|
#define MF_GetAmxAddr g_fn_GetAmxAddr
|
||||||
#define MF_PrintSrvConsole g_fn_PrintSrvConsole
|
#define MF_PrintSrvConsole g_fn_PrintSrvConsole
|
||||||
@ -2072,11 +2144,14 @@ void MF_UnregisterSPForward (int id) { }
|
|||||||
#define MF_GetAmxStringLen g_fn_GetAmxStringLen
|
#define MF_GetAmxStringLen g_fn_GetAmxStringLen
|
||||||
#define MF_CopyAmxMemory g_fn_CopyAmxMemory
|
#define MF_CopyAmxMemory g_fn_CopyAmxMemory
|
||||||
void MF_Log(const char *fmt, ...);
|
void MF_Log(const char *fmt, ...);
|
||||||
|
void MF_LogError(AMX *amx, int err, const char *fmt, ...);
|
||||||
#define MF_RaiseAmxError g_fn_RaiseAmxError
|
#define MF_RaiseAmxError g_fn_RaiseAmxError
|
||||||
#define MF_RegisterForward g_fn_RegisterForward
|
#define MF_RegisterForward g_fn_RegisterForward
|
||||||
#define MF_ExecuteForward g_fn_ExecuteForward
|
#define MF_ExecuteForward g_fn_ExecuteForward
|
||||||
#define MF_PrepareCellArray g_fn_PrepareCellArray
|
#define MF_PrepareCellArray g_fn_PrepareCellArray
|
||||||
#define MF_PrepareCharArray g_fn_PrepareCharArray
|
#define MF_PrepareCharArray g_fn_PrepareCharArray
|
||||||
|
#define MF_PrepareCellArrayA g_fn_PrepareCellArrayA
|
||||||
|
#define MF_PrepareCharArrayA g_fn_PrepareCharArrayA
|
||||||
#define MF_IsPlayerValid g_fn_IsPlayerValid
|
#define MF_IsPlayerValid g_fn_IsPlayerValid
|
||||||
#define MF_GetPlayerName g_fn_GetPlayerName
|
#define MF_GetPlayerName g_fn_GetPlayerName
|
||||||
#define MF_GetPlayerIP g_fn_GetPlayerIP
|
#define MF_GetPlayerIP g_fn_GetPlayerIP
|
||||||
@ -2086,6 +2161,7 @@ void MF_Log(const char *fmt, ...);
|
|||||||
#define MF_GetPlayerTime g_fn_GetPlayerTime
|
#define MF_GetPlayerTime g_fn_GetPlayerTime
|
||||||
#define MF_GetPlayerPlayTime g_fn_GetPlayerPlayTime
|
#define MF_GetPlayerPlayTime g_fn_GetPlayerPlayTime
|
||||||
#define MF_GetPlayerCurweapon g_fn_GetPlayerCurweapon
|
#define MF_GetPlayerCurweapon g_fn_GetPlayerCurweapon
|
||||||
|
#define MF_GetPlayerTeam g_fn_GetPlayerTeam
|
||||||
#define MF_GetPlayerTeamID g_fn_GetPlayerTeamID
|
#define MF_GetPlayerTeamID g_fn_GetPlayerTeamID
|
||||||
#define MF_GetPlayerDeaths g_fn_GetPlayerDeaths
|
#define MF_GetPlayerDeaths g_fn_GetPlayerDeaths
|
||||||
#define MF_GetPlayerMenu g_fn_GetPlayerMenu
|
#define MF_GetPlayerMenu g_fn_GetPlayerMenu
|
||||||
@ -2100,14 +2176,23 @@ void MF_Log(const char *fmt, ...);
|
|||||||
#define MF_AmxExecv g_fn_AmxExecv
|
#define MF_AmxExecv g_fn_AmxExecv
|
||||||
#define MF_AmxFindPublic g_fn_AmxFindPublic
|
#define MF_AmxFindPublic g_fn_AmxFindPublic
|
||||||
#define MF_AmxAllot g_fn_AmxAllot
|
#define MF_AmxAllot g_fn_AmxAllot
|
||||||
|
#define MF_AmxFindNative g_fn_AmxFindNative
|
||||||
#define MF_LoadAmxScript g_fn_LoadAmxScript
|
#define MF_LoadAmxScript g_fn_LoadAmxScript
|
||||||
#define MF_UnloadAmxScript g_fn_UnloadAmxScript
|
#define MF_UnloadAmxScript g_fn_UnloadAmxScript
|
||||||
|
#define MF_MergeDefinitionFile g_fn_MergeDefinition_File
|
||||||
#define amx_ctof g_fn_CellToReal
|
#define amx_ctof g_fn_CellToReal
|
||||||
#define amx_ftoc g_fn_RealToCell
|
#define amx_ftoc g_fn_RealToCell
|
||||||
#define MF_RegisterSPForwardByName g_fn_RegisterSPForwardByName
|
#define MF_RegisterSPForwardByName g_fn_RegisterSPForwardByName
|
||||||
#define MF_RegisterSPForward g_fn_RegisterSPForward
|
#define MF_RegisterSPForward g_fn_RegisterSPForward
|
||||||
#define MF_UnregisterSPForward g_fn_UnregisterSPForward
|
#define MF_UnregisterSPForward g_fn_UnregisterSPForward
|
||||||
|
#define MF_GetPlayerFlags g_fn_GetPlayerFlags
|
||||||
|
#define MF_GetPlayerEdict g_fn_GetPlayerEdict
|
||||||
|
#define MF_Format g_fn_Format
|
||||||
|
#define MF_RegisterFunction g_fn_RegisterFunction
|
||||||
|
#define MF_RequestFunction g_fn_RequestFunction;
|
||||||
|
#define MF_AmxPush g_fn_AmxPush
|
||||||
|
|
||||||
|
#ifdef MEMORY_TEST
|
||||||
/*** Memory ***/
|
/*** Memory ***/
|
||||||
void *operator new(size_t reportedSize);
|
void *operator new(size_t reportedSize);
|
||||||
void *operator new[](size_t reportedSize);
|
void *operator new[](size_t reportedSize);
|
||||||
@ -2151,4 +2236,6 @@ void Mem_Deallocator(const char *sourceFile, const unsigned int sourceLine, cons
|
|||||||
#define realloc(ptr,sz) Mem_Reallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_realloc,sz,ptr)
|
#define realloc(ptr,sz) Mem_Reallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_realloc,sz,ptr)
|
||||||
#define free(ptr) Mem_Deallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_free,ptr)
|
#define free(ptr) Mem_Deallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_free,ptr)
|
||||||
|
|
||||||
|
#endif //MEMORY_TEST
|
||||||
|
|
||||||
#endif // #ifndef __AMXXMODULE_H__
|
#endif // #ifndef __AMXXMODULE_H__
|
||||||
|
@ -21,13 +21,23 @@
|
|||||||
// metamod plugin?
|
// metamod plugin?
|
||||||
// #define USE_METAMOD
|
// #define USE_METAMOD
|
||||||
|
|
||||||
|
// use memory manager/tester?
|
||||||
|
// note that if you use this, you cannot construct/allocate
|
||||||
|
// anything before the module attached (OnAmxxAttach).
|
||||||
|
// be careful of default constructors using new/malloc!
|
||||||
|
// #define MEMORY_TEST
|
||||||
|
|
||||||
|
// Unless you use STL or exceptions, keep this commented.
|
||||||
|
// It allows you to compile without libstdc++.so as a dependency
|
||||||
|
// #define NO_ALLOC_OVERRIDES
|
||||||
|
|
||||||
// - AMXX Init functions
|
// - AMXX Init functions
|
||||||
// Also consider using FN_META_*
|
// Also consider using FN_META_*
|
||||||
// AMXX query
|
// AMXX query
|
||||||
//#define FN_AMXX_QUERY OnAmxxQuery
|
//#define FN_AMXX_QUERY OnAmxxQuery
|
||||||
// AMXX attach
|
// AMXX attach
|
||||||
// Do native functions init here (MF_AddNatives)
|
// Do native functions init here (MF_AddNatives)
|
||||||
// #define FN_AMXX_ATTACH OnAmxxAttach
|
//#define FN_AMXX_ATTACH OnAmxxAttach
|
||||||
// AMXX detach
|
// AMXX detach
|
||||||
//#define FN_AMXX_DETACH OnAmxxDetach
|
//#define FN_AMXX_DETACH OnAmxxDetach
|
||||||
// All plugins loaded
|
// All plugins loaded
|
||||||
|
@ -31,254 +31,232 @@
|
|||||||
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
|
|
||||||
void amx_command(){
|
void amx_command()
|
||||||
|
{
|
||||||
|
const char* cmd = CMD_ARGV(1);
|
||||||
|
|
||||||
const char* cmd = CMD_ARGV(1);
|
if (!strcmp(cmd, "plugins") || !strcmp(cmd, "list"))
|
||||||
|
{
|
||||||
|
|
||||||
if (!strcmp(cmd,"plugins") || !strcmp(cmd,"list"))
|
print_srvconsole("Currently loaded plugins:\n");
|
||||||
|
print_srvconsole(" %-18.17s %-8.7s %-17.16s %-16.15s %-9.8s\n", "name", "version", "author", "file", "status");
|
||||||
|
|
||||||
|
int plugins = 0;
|
||||||
|
int running = 0;
|
||||||
|
|
||||||
|
CPluginMngr::iterator a = g_plugins.begin();
|
||||||
|
|
||||||
|
while (a)
|
||||||
{
|
{
|
||||||
|
++plugins;
|
||||||
|
if ((*a).isValid() && !(*a).isPaused())
|
||||||
|
++running;
|
||||||
|
|
||||||
print_srvconsole( "Currently loaded plugins:\n");
|
print_srvconsole(" [%3d] %-18.17s %-8.7s %-17.16s %-16.15s %-9.8s\n", plugins, (*a).getTitle(), (*a).getVersion(), (*a).getAuthor(), (*a).getName(), (*a).getStatus());
|
||||||
print_srvconsole( " %-18.17s %-8.7s %-17.16s %-16.15s %-9.8s\n",
|
++a;
|
||||||
"name","version","author","file","status");
|
|
||||||
|
|
||||||
int plugins = 0;
|
|
||||||
int running = 0;
|
|
||||||
|
|
||||||
|
|
||||||
CPluginMngr::iterator a = g_plugins.begin();
|
|
||||||
|
|
||||||
while (a)
|
|
||||||
{
|
|
||||||
++plugins;
|
|
||||||
|
|
||||||
if ( (*a).isValid() && !(*a).isPaused() )
|
|
||||||
++running;
|
|
||||||
|
|
||||||
print_srvconsole( " [%3d] %-18.17s %-8.7s %-17.16s %-16.15s %-9.8s\n",
|
|
||||||
plugins,(*a).getTitle(),(*a).getVersion(),
|
|
||||||
(*a).getAuthor(), (*a).getName(), (*a).getStatus() );
|
|
||||||
|
|
||||||
++a;
|
|
||||||
}
|
|
||||||
|
|
||||||
print_srvconsole( "%d plugins, %d running\n",plugins,running );
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (!strcmp(cmd,"pause") && CMD_ARGC() > 2)
|
|
||||||
|
a = g_plugins.begin();
|
||||||
|
|
||||||
|
while (a)
|
||||||
{
|
{
|
||||||
const char* sPlugin = CMD_ARGV(2);
|
if ((*a).getStatusCode() == ps_bad_load)
|
||||||
|
{
|
||||||
CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin);
|
//error
|
||||||
|
print_srvconsole("Load fails: %s\n", (*a).getError());
|
||||||
if ( plugin && plugin->isValid() )
|
}
|
||||||
{
|
++a;
|
||||||
plugin->pausePlugin();
|
|
||||||
print_srvconsole("Paused plugin \"%s\"\n",plugin->getName() );
|
|
||||||
}
|
|
||||||
else print_srvconsole("Couldn't find plugin matching \"%s\"\n",sPlugin);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (!strcmp(cmd,"unpause") && CMD_ARGC() > 2)
|
|
||||||
|
print_srvconsole("%d plugins, %d running\n", plugins, running);
|
||||||
|
}
|
||||||
|
else if (!strcmp(cmd, "pause") && CMD_ARGC() > 2)
|
||||||
|
{
|
||||||
|
const char* sPlugin = CMD_ARGV(2);
|
||||||
|
|
||||||
|
CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin);
|
||||||
|
|
||||||
|
if (plugin && plugin->isValid())
|
||||||
{
|
{
|
||||||
const char* sPlugin = CMD_ARGV(2);
|
plugin->pausePlugin();
|
||||||
|
print_srvconsole("Paused plugin \"%s\"\n", plugin->getName());
|
||||||
CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin);
|
|
||||||
|
|
||||||
if ( plugin && plugin->isValid() )
|
|
||||||
{
|
|
||||||
plugin->unpausePlugin();
|
|
||||||
print_srvconsole("Unpaused plugin \"%s\"\n",plugin->getName() );
|
|
||||||
}
|
|
||||||
else print_srvconsole("Couldn't find plugin matching \"%s\"\n",sPlugin);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (!strcmp(cmd,"cvars"))
|
|
||||||
{
|
|
||||||
print_srvconsole( "Registered cvars:\n");
|
|
||||||
print_srvconsole( " %-24.23s %-24.23s %-16.15s\n",
|
|
||||||
"name","value","plugin");
|
|
||||||
|
|
||||||
int ammount = 0;
|
|
||||||
|
|
||||||
for( CList<CCVar>::iterator a = g_cvars.begin(); a ; ++a )
|
|
||||||
{
|
|
||||||
print_srvconsole( " [%3d] %-24.23s %-24.23s %-16.15s\n",++ammount,
|
|
||||||
(*a).getName() ,CVAR_GET_STRING( (*a).getName() ),(*a).getPluginName() );
|
|
||||||
}
|
|
||||||
|
|
||||||
print_srvconsole( "%d cvars\n",ammount);
|
|
||||||
}
|
|
||||||
else if ( !strcmp(cmd,"cmds") )
|
|
||||||
{
|
|
||||||
|
|
||||||
print_srvconsole( "Registered commands:\n");
|
|
||||||
print_srvconsole( " %-24.23s %-16.15s %-8.7s %-16.15s\n",
|
|
||||||
"name","access" ,"type" ,"plugin");
|
|
||||||
|
|
||||||
int ammount = 0;
|
|
||||||
|
|
||||||
char access[32];
|
|
||||||
|
|
||||||
CmdMngr::iterator a = g_commands.begin( CMD_ConsoleCommand );
|
|
||||||
|
|
||||||
while( a )
|
|
||||||
{
|
|
||||||
UTIL_GetFlags( access , (*a).getFlags() );
|
|
||||||
print_srvconsole( " [%3d] %-24.23s %-16.15s %-8.7s %-16.15s\n",
|
|
||||||
++ammount,(*a).getCmdLine() , access , (*a).getCmdType() , (*a).getPlugin()->getName());
|
|
||||||
++a;
|
|
||||||
}
|
|
||||||
|
|
||||||
print_srvconsole( "%d commands\n",ammount);
|
|
||||||
}
|
|
||||||
else if (!strcmp(cmd,"version"))
|
|
||||||
{
|
|
||||||
|
|
||||||
print_srvconsole( "%s %s\n", Plugin_info.name, Plugin_info.version);
|
|
||||||
print_srvconsole( "author: %s (%s)\n", Plugin_info.author, Plugin_info.url);
|
|
||||||
print_srvconsole( "compiled: %s\n", __DATE__ ", " __TIME__);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (!strcmp(cmd,"modules"))
|
|
||||||
{
|
|
||||||
print_srvconsole( "Currently loaded modules:\n");
|
|
||||||
print_srvconsole( " %-23.22s %-8.7s %-20.19s %-11.10s\n",
|
|
||||||
"name", "version", "author", "status");
|
|
||||||
|
|
||||||
int running = 0;
|
|
||||||
int modules = 0;
|
|
||||||
|
|
||||||
CList<CModule>::iterator a = g_modules.begin();
|
|
||||||
|
|
||||||
while ( a )
|
|
||||||
{
|
|
||||||
if ( (*a).getStatusValue() == MODULE_LOADED )
|
|
||||||
++running;
|
|
||||||
|
|
||||||
++modules;
|
|
||||||
|
|
||||||
print_srvconsole( " [%2d] %-23.22s %-8.7s %-20.19s %-11.10s\n", modules,
|
|
||||||
(*a).getName(), (*a).getVersion(), (*a).getAuthor() , (*a).getStatus() );
|
|
||||||
|
|
||||||
++a;
|
|
||||||
}
|
|
||||||
|
|
||||||
print_srvconsole( "%d modules, %d correct\n",modules,running);
|
|
||||||
}
|
|
||||||
else if (!strcmp(cmd, "gpl"))
|
|
||||||
{
|
|
||||||
print_srvconsole("AMX Mod X\n");
|
|
||||||
print_srvconsole("\n");
|
|
||||||
print_srvconsole(" by the AMX Mod X Development Team\n");
|
|
||||||
print_srvconsole(" originally developed by OLO\n");
|
|
||||||
print_srvconsole("\n");
|
|
||||||
print_srvconsole("\n");
|
|
||||||
print_srvconsole(" This program is free software; you can redistribute it and/or modify it\n");
|
|
||||||
print_srvconsole(" under the terms of the GNU General Public License as published by the\n");
|
|
||||||
print_srvconsole(" Free Software Foundation; either version 2 of the License, or (at\n");
|
|
||||||
print_srvconsole(" your option) any later version.\n");
|
|
||||||
print_srvconsole("\n");
|
|
||||||
print_srvconsole(" This program is distributed in the hope that it will be useful, but\n");
|
|
||||||
print_srvconsole(" WITHOUT ANY WARRANTY; without even the implied warranty of\n");
|
|
||||||
print_srvconsole(" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n");
|
|
||||||
print_srvconsole(" General Public License for more details.\n");
|
|
||||||
print_srvconsole("\n");
|
|
||||||
print_srvconsole(" You should have received a copy of the GNU General Public License\n");
|
|
||||||
print_srvconsole(" along with this program; if not, write to the Free Software Foundation,\n");
|
|
||||||
print_srvconsole(" Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n");
|
|
||||||
print_srvconsole("\n");
|
|
||||||
print_srvconsole(" In addition, as a special exception, the author gives permission to\n");
|
|
||||||
print_srvconsole(" link the code of this program with the Half-Life Game Engine (\"HL\n");
|
|
||||||
print_srvconsole(" Engine\") and Modified Game Libraries (\"MODs\") developed by Valve,\n");
|
|
||||||
print_srvconsole(" L.L.C (\"Valve\"). You must obey the GNU General Public License in all\n");
|
|
||||||
print_srvconsole(" respects for all of the code used other than the HL Engine and MODs\n");
|
|
||||||
print_srvconsole(" from Valve. If you modify this file, you may extend this exception\n");
|
|
||||||
print_srvconsole(" to your version of the file, but you are not obligated to do so. If\n");
|
|
||||||
print_srvconsole(" you do not wish to do so, delete this exception statement from your\n");
|
|
||||||
print_srvconsole(" version.\n");
|
|
||||||
print_srvconsole("\n");
|
|
||||||
}
|
|
||||||
else if (!strcmp(cmd, "\x74\x75\x72\x74\x6C\x65")) // !! Hidden Command :D !!
|
|
||||||
{
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2E\x2E\x3A\x3A\x3E\x3E\x3A\x3A\x3B\x3E\x5E\x27\x2E\x27\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x27\x3A\x3A\x3F\x3D\x3E\x3E\x3E\x3E\x3E\x3D\x3F\x3E\x78\x2B\x3F\x3E\x3E\x3E\x3D\x3E\x3F\x2B\x3F\x3E\x3B\x2E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x2E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x27\x2C\x3A\x3E\x3B\x3F\x3D\x3E\x3B\x2E\x27\x5E\x5E\x3B\x3B\x2C\x3A\x3F\x3F\x3D\x78\x3F\x3B\x3E\x3A\x3B\x3A\x5E\x3B\x3D\x3E\x2B\x2B\x2B\x2B\x3D\x2C\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x2C\x3E\x37\x24\x24\x78\x3D\x3D\x3D\x3F\x3A\x27\x20\x20\x20\x20\x20\x20\x20\x2E\x3A\x3B\x3D\x3E\x3A\x3A\x3A\x3A\x3F\x3F\x3F\x3E\x5E\x2C\x2E\x2E\x2C\x2C\x2C\x2C\x3A\x3B\x3D\x3D\x3B\x5E\x2C\x2C\x2C\x3A\x5E\x3A\x3F\x3F\x3E\x3D\x3D\x3E\x3E\x2B\x3B\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x2C\x3D\x2B\x3E\x2C\x5E\x3D\x79\x24\x33\x78\x33\x24\x5A\x24\x3B\x20\x20\x3A\x3E\x2B\x3E\x3D\x3F\x5E\x2C\x2C\x2C\x5E\x5E\x3E\x3D\x3E\x3B\x3B\x3A\x5E\x5E\x3E\x3F\x3D\x2B\x37\x3D\x3F\x3E\x3E\x3E\x3F\x3D\x3F\x3F\x3D\x3D\x3D\x3D\x3E\x3F\x3D\x3E\x3E\x3E\x3D\x5A\x78\x3E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x3D\x5A\x24\x37\x78\x66\x68\x78\x5A\x5A\x24\x79\x79\x71\x23\x23\x4D\x71\x3B\x3A\x3B\x3A\x3E\x3B\x3B\x2C\x5E\x3E\x3F\x3D\x3F\x3A\x2C\x2C\x3A\x3B\x3B\x3E\x3E\x3D\x2B\x3D\x3E\x3D\x3B\x3A\x3E\x3D\x2B\x3D\x2B\x37\x2B\x3D\x2B\x37\x37\x2B\x2B\x33\x33\x33\x37\x37\x24\x5A\x79\x3A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x5E\x2B\x5A\x2B\x3E\x3D\x37\x5A\x66\x40\x40\x23\x40\x48\x23\x23\x23\x38\x5E\x3B\x3D\x3F\x2B\x3E\x3B\x3E\x5E\x5E\x2C\x27\x2E\x27\x2E\x2E\x5E\x3F\x3D\x3D\x3F\x3A\x3B\x3A\x3A\x3A\x5E\x5E\x3E\x3E\x3F\x3D\x37\x37\x3D\x3D\x37\x2B\x3D\x37\x2B\x37\x78\x24\x79\x38\x68\x45\x48\x79\x3E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x2C\x3E\x3E\x78\x33\x68\x48\x23\x23\x40\x40\x48\x45\x66\x33\x20\x2C\x3A\x3E\x3E\x3E\x3B\x3B\x3A\x3A\x2C\x2E\x2C\x5E\x3A\x2C\x5E\x3B\x3E\x37\x37\x3F\x3B\x3A\x2E\x3A\x3A\x3B\x3D\x3B\x3B\x3D\x2B\x3D\x78\x33\x37\x3E\x3D\x3D\x2B\x37\x2B\x78\x78\x78\x78\x5A\x66\x71\x68\x38\x45\x27\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x3A\x37\x37\x24\x66\x71\x45\x45\x71\x45\x3A\x3A\x2C\x5E\x3A\x3E\x3A\x3A\x3B\x3B\x5E\x3A\x2C\x5E\x5E\x2C\x2C\x5E\x3A\x3E\x2B\x33\x3D\x3E\x3A\x3A\x3A\x3D\x2B\x2B\x3D\x3F\x3F\x37\x37\x2B\x37\x3D\x3D\x5A\x33\x78\x33\x37\x78\x24\x5A\x33\x37\x38\x40\x71\x38\x66\x40\x2C\x20\x20\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x2B\x5A\x45\x40\x5E\x5E\x5E\x3A\x2C\x3A\x3B\x3E\x3A\x5E\x5E\x2C\x2E\x2E\x2C\x5E\x3B\x3B\x3A\x2B\x3E\x3F\x3B\x3F\x3F\x3F\x3F\x3E\x3F\x3D\x37\x3B\x3B\x3D\x33\x2B\x3D\x3D\x78\x78\x5A\x78\x33\x78\x5A\x5A\x5A\x24\x71\x48\x79\x5A\x24\x79\x45\x3E\x20\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x27\x3B\x2C\x2C\x27\x5E\x5E\x2C\x3A\x5E\x3A\x3A\x5E\x3A\x3B\x3F\x3E\x3F\x3E\x3B\x3E\x3E\x3F\x3D\x2B\x37\x37\x2B\x2B\x3D\x2B\x37\x2B\x37\x37\x2B\x3B\x3D\x33\x2B\x2B\x37\x37\x2B\x3D\x78\x78\x66\x78\x78\x37\x33\x66\x78\x38\x23\x23\x27\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3A\x3F\x3B\x5E\x2C\x3B\x3F\x3D\x3F\x3F\x3B\x3A\x3A\x3A\x3E\x3F\x3E\x3E\x3F\x3A\x3F\x33\x78\x78\x33\x24\x24\x33\x2B\x37\x78\x24\x78\x33\x3D\x2B\x2B\x5A\x24\x78\x24\x78\x33\x33\x24\x5A\x79\x24\x24\x24\x68\x45\x48\x38\x68\x45\x40\x3E\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2C\x3A\x3E\x3F\x37\x3D\x3E\x3F\x2B\x3F\x3F\x3E\x3F\x3F\x3F\x3D\x3F\x3E\x3F\x3D\x37\x2B\x3E\x3E\x2B\x37\x37\x33\x37\x33\x78\x33\x33\x33\x78\x37\x37\x37\x78\x5A\x78\x5A\x79\x79\x5A\x24\x79\x79\x79\x79\x79\x68\x71\x38\x38\x71\x23\x23\x45\x37\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x2B\x2B\x3F\x2B\x78\x40\x38\x3F\x3B\x3E\x3B\x3B\x3E\x3F\x37\x2B\x3F\x3F\x3D\x3D\x3E\x3F\x2B\x37\x37\x37\x37\x33\x33\x78\x78\x33\x37\x24\x5A\x78\x5A\x5A\x78\x24\x33\x3D\x37\x37\x37\x78\x24\x5A\x78\x37\x37\x78\x66\x79\x66\x71\x66\x40\x45\x40\x3A\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2B\x3A\x3F\x2B\x3D\x2B\x79\x23\x79\x3B\x2C\x3A\x3A\x3A\x37\x78\x3F\x3E\x3B\x3E\x3B\x3E\x3D\x37\x24\x33\x37\x33\x37\x78\x78\x33\x24\x68\x79\x33\x24\x78\x2B\x33\x33\x5A\x79\x24\x5A\x79\x24\x5A\x37\x24\x5A\x5A\x66\x38\x66\x79\x66\x40\x71\x45\x48\x5A\x3A\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x37\x3D\x37\x37\x33\x37\x37\x66\x45\x5A\x3F\x5E\x5E\x78\x37\x3D\x3F\x3E\x3B\x3B\x3E\x2B\x2B\x24\x78\x37\x2B\x37\x2B\x37\x78\x78\x71\x79\x33\x33\x24\x24\x78\x24\x5A\x3F\x37\x78\x24\x78\x79\x66\x5A\x78\x79\x66\x79\x68\x79\x66\x5A\x33\x3F\x3D\x3D\x20\x20\x20\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x2B\x3D\x3F\x37\x37\x78\x33\x5A\x4E\x4D\x23\x38\x33\x3F\x3E\x3B\x3E\x3B\x3D\x3D\x33\x66\x24\x78\x33\x2B\x78\x24\x5A\x24\x5A\x71\x79\x78\x33\x33\x78\x79\x5A\x5A\x33\x66\x24\x78\x78\x24\x79\x5A\x24\x79\x5A\x37\x66\x24\x3D\x3B\x66\x23\x4D\x4D\x4D\x79\x3B\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3A\x33\x37\x37\x24\x78\x66\x79\x48\x4D\x4D\x4D\x4D\x23\x71\x68\x5A\x24\x5A\x79\x68\x68\x5A\x5A\x24\x79\x66\x68\x78\x5A\x4E\x45\x66\x66\x45\x45\x45\x24\x5A\x40\x71\x68\x5A\x68\x5A\x37\x66\x79\x78\x37\x78\x37\x68\x38\x38\x71\x48\x40\x23\x45\x3A\x3D\x37\x45\x27\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x37\x37\x78\x37\x33\x38\x45\x45\x71\x20\x5E\x3D\x2B\x3F\x2B\x2B\x79\x71\x45\x48\x40\x45\x45\x45\x45\x45\x71\x40\x40\x71\x38\x38\x79\x66\x38\x68\x48\x48\x45\x66\x37\x2B\x3A\x37\x3F\x3B\x3A\x2C\x27\x2C\x27\x78\x4D\x23\x48\x48\x48\x79\x2B\x3A\x3F\x79\x27\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3A\x78\x78\x24\x40\x4E\x4E\x4D\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x3E\x3E\x3F\x3E\x3E\x3E\x3E\x3B\x3B\x3B\x3A\x3A\x3F\x3E\x3A\x2E\x2E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2E\x45\x4D\x40\x45\x78\x5E\x33\x68\x33\x2B\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x24\x48\x45\x48\x78\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2B\x4E\x40\x2B\x66\x33\x78\x20\x20\n");
|
|
||||||
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2B\x2C\x20\x3A\x20\x20\n");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
print_srvconsole("Couldn't find plugin matching \"%s\"\n", sPlugin);
|
||||||
|
}
|
||||||
|
else if (!strcmp(cmd, "unpause") && CMD_ARGC() > 2)
|
||||||
|
{
|
||||||
|
const char* sPlugin = CMD_ARGV(2);
|
||||||
|
|
||||||
|
CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin);
|
||||||
|
|
||||||
|
if (plugin && plugin->isValid() && plugin->isPaused())
|
||||||
{
|
{
|
||||||
|
plugin->unpausePlugin();
|
||||||
|
print_srvconsole("Unpaused plugin \"%s\"\n", plugin->getName());
|
||||||
print_srvconsole("Usage: amxx < command > [ argument ]\n");
|
|
||||||
print_srvconsole("Commands:\n");
|
|
||||||
print_srvconsole(" version - display amxx version info\n");
|
|
||||||
print_srvconsole(" gpl - print the license\n");
|
|
||||||
print_srvconsole(" plugins - list plugins currently loaded\n");
|
|
||||||
print_srvconsole(" modules - list modules currently loaded\n");
|
|
||||||
print_srvconsole(" cvars - list cvars registered by plugins\n");
|
|
||||||
print_srvconsole(" cmds - list commands registered by plugins\n");
|
|
||||||
print_srvconsole(" pause < plugin > - pause a running plugin\n");
|
|
||||||
print_srvconsole(" unpause < plugin > - unpause a previously paused plugin\n");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
else if (!plugin)
|
||||||
|
{
|
||||||
|
print_srvconsole("Couldn't find plugin matching \"%s\"\n", sPlugin);
|
||||||
|
} else {
|
||||||
|
print_srvconsole("Plugin %s can't be unpaused right now.", sPlugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strcmp(cmd, "cvars"))
|
||||||
|
{
|
||||||
|
print_srvconsole("Registered cvars:\n");
|
||||||
|
print_srvconsole(" %-24.23s %-24.23s %-16.15s\n", "name", "value", "plugin");
|
||||||
|
|
||||||
|
int ammount = 0;
|
||||||
|
|
||||||
|
for (CList<CCVar>::iterator a = g_cvars.begin(); a; ++a)
|
||||||
|
{
|
||||||
|
print_srvconsole(" [%3d] %-24.23s %-24.23s %-16.15s\n", ++ammount, (*a).getName(), CVAR_GET_STRING((*a).getName()), (*a).getPluginName());
|
||||||
|
}
|
||||||
|
|
||||||
|
print_srvconsole("%d cvars\n", ammount);
|
||||||
|
}
|
||||||
|
else if (!strcmp(cmd, "cmds"))
|
||||||
|
{
|
||||||
|
print_srvconsole("Registered commands:\n");
|
||||||
|
print_srvconsole(" %-24.23s %-16.15s %-8.7s %-16.15s\n", "name", "access", "type", "plugin");
|
||||||
|
|
||||||
|
int ammount = 0;
|
||||||
|
char access[32];
|
||||||
|
|
||||||
|
CmdMngr::iterator a = g_commands.begin(CMD_ConsoleCommand);
|
||||||
|
|
||||||
|
while (a)
|
||||||
|
{
|
||||||
|
UTIL_GetFlags(access, (*a).getFlags());
|
||||||
|
print_srvconsole(" [%3d] %-24.23s %-16.15s %-8.7s %-16.15s\n", ++ammount, (*a).getCmdLine(), access, (*a).getCmdType(), (*a).getPlugin()->getName());
|
||||||
|
++a;
|
||||||
|
}
|
||||||
|
|
||||||
|
print_srvconsole("%d commands\n",ammount);
|
||||||
|
}
|
||||||
|
else if (!strcmp(cmd, "version"))
|
||||||
|
{
|
||||||
|
print_srvconsole("%s %s\n", Plugin_info.name, Plugin_info.version);
|
||||||
|
print_srvconsole("Authors: %s (%s)\n", "Felix \"SniperBeamer\" Geyer, David \"BAILOPAN\" Anderson, Pavol \"PM OnoTo\" Marko, Jonny \"Got His Gun\" Bergstrom, and Lukasz \"SidLuke\" Wlasinski.", Plugin_info.url);
|
||||||
|
print_srvconsole("Compiled: %s\n", __DATE__ ", " __TIME__);
|
||||||
|
#if defined JIT && !defined ASM32
|
||||||
|
print_srvconsole("Core mode: JIT Only\n");
|
||||||
|
#elif !defined JIT && defined ASM32
|
||||||
|
print_srvconsole("Core mode: ASM32 Only\n");
|
||||||
|
#elif defined JIT && defined ASM32
|
||||||
|
print_srvconsole("Core mode: JIT+ASM32\n");
|
||||||
|
#else
|
||||||
|
print_srvconsole("Core mode: Normal\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if (!strcmp(cmd, "modules"))
|
||||||
|
{
|
||||||
|
print_srvconsole("Currently loaded modules:\n");
|
||||||
|
print_srvconsole(" %-23.22s %-8.7s %-20.19s %-11.10s\n", "name", "version", "author", "status");
|
||||||
|
|
||||||
|
int running = 0;
|
||||||
|
int modules = 0;
|
||||||
|
|
||||||
|
CList<CModule,const char *>::iterator a = g_modules.begin();
|
||||||
|
|
||||||
|
while (a)
|
||||||
|
{
|
||||||
|
if ((*a).getStatusValue() == MODULE_LOADED)
|
||||||
|
++running;
|
||||||
|
++modules;
|
||||||
|
|
||||||
|
print_srvconsole(" [%2d] %-23.22s %-8.7s %-20.19s %-11.10s\n", modules, (*a).getName(), (*a).getVersion(), (*a).getAuthor(), (*a).getStatus());
|
||||||
|
++a;
|
||||||
|
}
|
||||||
|
|
||||||
|
print_srvconsole("%d modules, %d correct\n", modules, running);
|
||||||
|
}
|
||||||
|
else if (!strcmp(cmd, "gpl"))
|
||||||
|
{
|
||||||
|
print_srvconsole("AMX Mod X\n");
|
||||||
|
print_srvconsole("\n");
|
||||||
|
print_srvconsole(" by the AMX Mod X Development Team\n");
|
||||||
|
print_srvconsole(" originally developed by OLO\n");
|
||||||
|
print_srvconsole("\n");
|
||||||
|
print_srvconsole("\n");
|
||||||
|
print_srvconsole(" This program is free software; you can redistribute it and/or modify it\n");
|
||||||
|
print_srvconsole(" under the terms of the GNU General Public License as published by the\n");
|
||||||
|
print_srvconsole(" Free Software Foundation; either version 2 of the License, or (at\n");
|
||||||
|
print_srvconsole(" your option) any later version.\n");
|
||||||
|
print_srvconsole("\n");
|
||||||
|
print_srvconsole(" This program is distributed in the hope that it will be useful, but\n");
|
||||||
|
print_srvconsole(" WITHOUT ANY WARRANTY; without even the implied warranty of\n");
|
||||||
|
print_srvconsole(" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n");
|
||||||
|
print_srvconsole(" General Public License for more details.\n");
|
||||||
|
print_srvconsole("\n");
|
||||||
|
print_srvconsole(" You should have received a copy of the GNU General Public License\n");
|
||||||
|
print_srvconsole(" along with this program; if not, write to the Free Software Foundation,\n");
|
||||||
|
print_srvconsole(" Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n");
|
||||||
|
print_srvconsole("\n");
|
||||||
|
print_srvconsole(" In addition, as a special exception, the author gives permission to\n");
|
||||||
|
print_srvconsole(" link the code of this program with the Half-Life Game Engine (\"HL\n");
|
||||||
|
print_srvconsole(" Engine\") and Modified Game Libraries (\"MODs\") developed by Valve,\n");
|
||||||
|
print_srvconsole(" L.L.C (\"Valve\"). You must obey the GNU General Public License in all\n");
|
||||||
|
print_srvconsole(" respects for all of the code used other than the HL Engine and MODs\n");
|
||||||
|
print_srvconsole(" from Valve. If you modify this file, you may extend this exception\n");
|
||||||
|
print_srvconsole(" to your version of the file, but you are not obligated to do so. If\n");
|
||||||
|
print_srvconsole(" you do not wish to do so, delete this exception statement from your\n");
|
||||||
|
print_srvconsole(" version.\n");
|
||||||
|
print_srvconsole("\n");
|
||||||
|
}
|
||||||
|
else if (!strcmp(cmd, "\x74\x75\x72\x74\x6C\x65")) // !! Hidden Command :D !!
|
||||||
|
{
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2E\x2E\x3A\x3A\x3E\x3E\x3A\x3A\x3B\x3E\x5E\x27\x2E\x27\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x27\x3A\x3A\x3F\x3D\x3E\x3E\x3E\x3E\x3E\x3D\x3F\x3E\x78\x2B\x3F\x3E\x3E\x3E\x3D\x3E\x3F\x2B\x3F\x3E\x3B\x2E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x2E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x27\x2C\x3A\x3E\x3B\x3F\x3D\x3E\x3B\x2E\x27\x5E\x5E\x3B\x3B\x2C\x3A\x3F\x3F\x3D\x78\x3F\x3B\x3E\x3A\x3B\x3A\x5E\x3B\x3D\x3E\x2B\x2B\x2B\x2B\x3D\x2C\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x2C\x3E\x37\x24\x24\x78\x3D\x3D\x3D\x3F\x3A\x27\x20\x20\x20\x20\x20\x20\x20\x2E\x3A\x3B\x3D\x3E\x3A\x3A\x3A\x3A\x3F\x3F\x3F\x3E\x5E\x2C\x2E\x2E\x2C\x2C\x2C\x2C\x3A\x3B\x3D\x3D\x3B\x5E\x2C\x2C\x2C\x3A\x5E\x3A\x3F\x3F\x3E\x3D\x3D\x3E\x3E\x2B\x3B\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x2C\x3D\x2B\x3E\x2C\x5E\x3D\x79\x24\x33\x78\x33\x24\x5A\x24\x3B\x20\x20\x3A\x3E\x2B\x3E\x3D\x3F\x5E\x2C\x2C\x2C\x5E\x5E\x3E\x3D\x3E\x3B\x3B\x3A\x5E\x5E\x3E\x3F\x3D\x2B\x37\x3D\x3F\x3E\x3E\x3E\x3F\x3D\x3F\x3F\x3D\x3D\x3D\x3D\x3E\x3F\x3D\x3E\x3E\x3E\x3D\x5A\x78\x3E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x3D\x5A\x24\x37\x78\x66\x68\x78\x5A\x5A\x24\x79\x79\x71\x23\x23\x4D\x71\x3B\x3A\x3B\x3A\x3E\x3B\x3B\x2C\x5E\x3E\x3F\x3D\x3F\x3A\x2C\x2C\x3A\x3B\x3B\x3E\x3E\x3D\x2B\x3D\x3E\x3D\x3B\x3A\x3E\x3D\x2B\x3D\x2B\x37\x2B\x3D\x2B\x37\x37\x2B\x2B\x33\x33\x33\x37\x37\x24\x5A\x79\x3A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x5E\x2B\x5A\x2B\x3E\x3D\x37\x5A\x66\x40\x40\x23\x40\x48\x23\x23\x23\x38\x5E\x3B\x3D\x3F\x2B\x3E\x3B\x3E\x5E\x5E\x2C\x27\x2E\x27\x2E\x2E\x5E\x3F\x3D\x3D\x3F\x3A\x3B\x3A\x3A\x3A\x5E\x5E\x3E\x3E\x3F\x3D\x37\x37\x3D\x3D\x37\x2B\x3D\x37\x2B\x37\x78\x24\x79\x38\x68\x45\x48\x79\x3E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x2C\x3E\x3E\x78\x33\x68\x48\x23\x23\x40\x40\x48\x45\x66\x33\x20\x2C\x3A\x3E\x3E\x3E\x3B\x3B\x3A\x3A\x2C\x2E\x2C\x5E\x3A\x2C\x5E\x3B\x3E\x37\x37\x3F\x3B\x3A\x2E\x3A\x3A\x3B\x3D\x3B\x3B\x3D\x2B\x3D\x78\x33\x37\x3E\x3D\x3D\x2B\x37\x2B\x78\x78\x78\x78\x5A\x66\x71\x68\x38\x45\x27\x20\x20\x20\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x3A\x37\x37\x24\x66\x71\x45\x45\x71\x45\x3A\x3A\x2C\x5E\x3A\x3E\x3A\x3A\x3B\x3B\x5E\x3A\x2C\x5E\x5E\x2C\x2C\x5E\x3A\x3E\x2B\x33\x3D\x3E\x3A\x3A\x3A\x3D\x2B\x2B\x3D\x3F\x3F\x37\x37\x2B\x37\x3D\x3D\x5A\x33\x78\x33\x37\x78\x24\x5A\x33\x37\x38\x40\x71\x38\x66\x40\x2C\x20\x20\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x2B\x5A\x45\x40\x5E\x5E\x5E\x3A\x2C\x3A\x3B\x3E\x3A\x5E\x5E\x2C\x2E\x2E\x2C\x5E\x3B\x3B\x3A\x2B\x3E\x3F\x3B\x3F\x3F\x3F\x3F\x3E\x3F\x3D\x37\x3B\x3B\x3D\x33\x2B\x3D\x3D\x78\x78\x5A\x78\x33\x78\x5A\x5A\x5A\x24\x71\x48\x79\x5A\x24\x79\x45\x3E\x20\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x27\x3B\x2C\x2C\x27\x5E\x5E\x2C\x3A\x5E\x3A\x3A\x5E\x3A\x3B\x3F\x3E\x3F\x3E\x3B\x3E\x3E\x3F\x3D\x2B\x37\x37\x2B\x2B\x3D\x2B\x37\x2B\x37\x37\x2B\x3B\x3D\x33\x2B\x2B\x37\x37\x2B\x3D\x78\x78\x66\x78\x78\x37\x33\x66\x78\x38\x23\x23\x27\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3A\x3F\x3B\x5E\x2C\x3B\x3F\x3D\x3F\x3F\x3B\x3A\x3A\x3A\x3E\x3F\x3E\x3E\x3F\x3A\x3F\x33\x78\x78\x33\x24\x24\x33\x2B\x37\x78\x24\x78\x33\x3D\x2B\x2B\x5A\x24\x78\x24\x78\x33\x33\x24\x5A\x79\x24\x24\x24\x68\x45\x48\x38\x68\x45\x40\x3E\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2C\x3A\x3E\x3F\x37\x3D\x3E\x3F\x2B\x3F\x3F\x3E\x3F\x3F\x3F\x3D\x3F\x3E\x3F\x3D\x37\x2B\x3E\x3E\x2B\x37\x37\x33\x37\x33\x78\x33\x33\x33\x78\x37\x37\x37\x78\x5A\x78\x5A\x79\x79\x5A\x24\x79\x79\x79\x79\x79\x68\x71\x38\x38\x71\x23\x23\x45\x37\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x2B\x2B\x3F\x2B\x78\x40\x38\x3F\x3B\x3E\x3B\x3B\x3E\x3F\x37\x2B\x3F\x3F\x3D\x3D\x3E\x3F\x2B\x37\x37\x37\x37\x33\x33\x78\x78\x33\x37\x24\x5A\x78\x5A\x5A\x78\x24\x33\x3D\x37\x37\x37\x78\x24\x5A\x78\x37\x37\x78\x66\x79\x66\x71\x66\x40\x45\x40\x3A\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2B\x3A\x3F\x2B\x3D\x2B\x79\x23\x79\x3B\x2C\x3A\x3A\x3A\x37\x78\x3F\x3E\x3B\x3E\x3B\x3E\x3D\x37\x24\x33\x37\x33\x37\x78\x78\x33\x24\x68\x79\x33\x24\x78\x2B\x33\x33\x5A\x79\x24\x5A\x79\x24\x5A\x37\x24\x5A\x5A\x66\x38\x66\x79\x66\x40\x71\x45\x48\x5A\x3A\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x37\x3D\x37\x37\x33\x37\x37\x66\x45\x5A\x3F\x5E\x5E\x78\x37\x3D\x3F\x3E\x3B\x3B\x3E\x2B\x2B\x24\x78\x37\x2B\x37\x2B\x37\x78\x78\x71\x79\x33\x33\x24\x24\x78\x24\x5A\x3F\x37\x78\x24\x78\x79\x66\x5A\x78\x79\x66\x79\x68\x79\x66\x5A\x33\x3F\x3D\x3D\x20\x20\x20\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x2B\x3D\x3F\x37\x37\x78\x33\x5A\x4E\x4D\x23\x38\x33\x3F\x3E\x3B\x3E\x3B\x3D\x3D\x33\x66\x24\x78\x33\x2B\x78\x24\x5A\x24\x5A\x71\x79\x78\x33\x33\x78\x79\x5A\x5A\x33\x66\x24\x78\x78\x24\x79\x5A\x24\x79\x5A\x37\x66\x24\x3D\x3B\x66\x23\x4D\x4D\x4D\x79\x3B\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3A\x33\x37\x37\x24\x78\x66\x79\x48\x4D\x4D\x4D\x4D\x23\x71\x68\x5A\x24\x5A\x79\x68\x68\x5A\x5A\x24\x79\x66\x68\x78\x5A\x4E\x45\x66\x66\x45\x45\x45\x24\x5A\x40\x71\x68\x5A\x68\x5A\x37\x66\x79\x78\x37\x78\x37\x68\x38\x38\x71\x48\x40\x23\x45\x3A\x3D\x37\x45\x27\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x37\x37\x78\x37\x33\x38\x45\x45\x71\x20\x5E\x3D\x2B\x3F\x2B\x2B\x79\x71\x45\x48\x40\x45\x45\x45\x45\x45\x71\x40\x40\x71\x38\x38\x79\x66\x38\x68\x48\x48\x45\x66\x37\x2B\x3A\x37\x3F\x3B\x3A\x2C\x27\x2C\x27\x78\x4D\x23\x48\x48\x48\x79\x2B\x3A\x3F\x79\x27\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3A\x78\x78\x24\x40\x4E\x4E\x4D\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x5E\x3E\x3E\x3F\x3E\x3E\x3E\x3E\x3B\x3B\x3B\x3A\x3A\x3F\x3E\x3A\x2E\x2E\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2E\x45\x4D\x40\x45\x78\x5E\x33\x68\x33\x2B\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x24\x48\x45\x48\x78\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2B\x4E\x40\x2B\x66\x33\x78\x20\x20\n");
|
||||||
|
print_srvconsole("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2B\x2C\x20\x3A\x20\x20\n");
|
||||||
|
} else {
|
||||||
|
print_srvconsole("Usage: amxx < command > [ argument ]\n");
|
||||||
|
print_srvconsole("Commands:\n");
|
||||||
|
print_srvconsole(" version - display amxx version info\n");
|
||||||
|
print_srvconsole(" gpl - print the license\n");
|
||||||
|
print_srvconsole(" plugins - list plugins currently loaded\n");
|
||||||
|
print_srvconsole(" modules - list modules currently loaded\n");
|
||||||
|
print_srvconsole(" cvars - list cvars registered by plugins\n");
|
||||||
|
print_srvconsole(" cmds - list commands registered by plugins\n");
|
||||||
|
print_srvconsole(" pause < plugin > - pause a running plugin\n");
|
||||||
|
print_srvconsole(" unpause < plugin > - unpause a previously paused plugin\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void plugin_srvcmd()
|
void plugin_srvcmd()
|
||||||
{
|
{
|
||||||
|
cell ret = 0;
|
||||||
|
const char* cmd = CMD_ARGV(0);
|
||||||
|
|
||||||
cell ret = 0;
|
CmdMngr::iterator a = g_commands.srvcmdbegin();
|
||||||
int err;
|
|
||||||
const char* cmd = CMD_ARGV(0);
|
|
||||||
|
|
||||||
#ifdef ENABLEEXEPTIONS
|
while (a)
|
||||||
try{
|
{
|
||||||
#endif
|
if ((*a).matchCommand(cmd) && (*a).getPlugin()->isExecutable((*a).getFunction()))
|
||||||
|
|
||||||
CmdMngr::iterator a = g_commands.srvcmdbegin();
|
|
||||||
|
|
||||||
while ( a )
|
|
||||||
{
|
|
||||||
if ( (*a).matchCommand( cmd ) &&
|
|
||||||
(*a).getPlugin()->isExecutable( (*a).getFunction() ) )
|
|
||||||
{
|
|
||||||
|
|
||||||
if ((err = amx_Exec( (*a).getPlugin()->getAMX(), &ret , (*a).getFunction()
|
|
||||||
, 3 , g_srvindex , (*a).getFlags() , (*a).getId() )) != AMX_ERR_NONE)
|
|
||||||
|
|
||||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")",
|
|
||||||
err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName());
|
|
||||||
|
|
||||||
if ( ret ) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
++a;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ENABLEEXEPTIONS
|
|
||||||
}catch( ... )
|
|
||||||
{
|
{
|
||||||
AMXXLOG_Log( "[AMXX] fatal error at forward function execution");
|
cell ret = executeForwards((*a).getFunction(), g_srvindex, (*a).getFlags(), (*a).getId());
|
||||||
|
if (ret) break;
|
||||||
}
|
}
|
||||||
#endif
|
++a;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
1078
amxmodx/string.cpp
1078
amxmodx/string.cpp
File diff suppressed because it is too large
Load Diff
214
amxmodx/util.cpp
214
amxmodx/util.cpp
@ -30,46 +30,68 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
#define _vsnprintf vsnprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char *UTIL_VarArgs(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
static char string[4096];
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
_vsnprintf(string, sizeof(string)-1, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
int UTIL_ReadFlags(const char* c)
|
int UTIL_ReadFlags(const char* c)
|
||||||
{
|
{
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
while (*c) flags |= ( 1 << ( *c++ - 'a' ) );
|
|
||||||
|
while (*c)
|
||||||
|
flags |= (1<<(*c++ - 'a'));
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UTIL_GetFlags(char* f,int a)
|
void UTIL_GetFlags(char* f, int a)
|
||||||
{
|
{
|
||||||
for(int i='a';i<='z';++i){
|
for (int i = 'a'; i <= 'z'; ++i)
|
||||||
if ( a & 1 ) *f++ = i;
|
{
|
||||||
|
if (a & 1) *f++ = i;
|
||||||
a >>= 1;
|
a >>= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*f = 0;
|
*f = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* warning - don't pass here const string */
|
/* warning - don't pass here const string */
|
||||||
void UTIL_ShowMenu( edict_t* pEdict, int slots, int time, char *menu, int mlen )
|
void UTIL_ShowMenu(edict_t* pEdict, int slots, int time, char *menu, int mlen)
|
||||||
{
|
{
|
||||||
char *n = menu;
|
char *n = menu;
|
||||||
char c = 0;
|
char c = 0;
|
||||||
int a;
|
int a;
|
||||||
|
|
||||||
if (!gmsgShowMenu)
|
if (!gmsgShowMenu)
|
||||||
return; // some games don't support ShowMenu (Firearms)
|
return; // some games don't support ShowMenu (Firearms)
|
||||||
|
|
||||||
while ( *n ) {
|
while (*n)
|
||||||
|
{
|
||||||
a = mlen;
|
a = mlen;
|
||||||
if ( a > 175 ) a = 175;
|
if (a > 175) a = 175;
|
||||||
mlen -= a;
|
mlen -= a;
|
||||||
c = *(n+=a);
|
c = *(n+=a);
|
||||||
*n = 0;
|
*n = 0;
|
||||||
MESSAGE_BEGIN( MSG_ONE , gmsgShowMenu, NULL, pEdict );
|
|
||||||
WRITE_SHORT( slots );
|
MESSAGE_BEGIN(MSG_ONE, gmsgShowMenu, NULL, pEdict);
|
||||||
WRITE_CHAR( time );
|
WRITE_SHORT(slots);
|
||||||
WRITE_BYTE( c ? TRUE : FALSE);
|
WRITE_CHAR(time);
|
||||||
WRITE_STRING( menu );
|
WRITE_BYTE(c ? TRUE : FALSE);
|
||||||
|
WRITE_STRING(menu);
|
||||||
MESSAGE_END();
|
MESSAGE_END();
|
||||||
*n = c;
|
*n = c;
|
||||||
menu = n;
|
menu = n;
|
||||||
@ -77,68 +99,86 @@ void UTIL_ShowMenu( edict_t* pEdict, int slots, int time, char *menu, int mlen )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* warning - don't pass here const string */
|
/* warning - don't pass here const string */
|
||||||
void UTIL_ShowMOTD( edict_t *client , char *motd, int mlen, const char *name)
|
void UTIL_ShowMOTD(edict_t *client, char *motd, int mlen, const char *name)
|
||||||
{
|
{
|
||||||
if (!gmsgServerName)
|
if (!gmsgMOTD)
|
||||||
return; // :TODO: Maybe output a warning log?
|
return; // :TODO: Maybe output a warning log?
|
||||||
|
|
||||||
MESSAGE_BEGIN( MSG_ONE , gmsgServerName, NULL, client );
|
if (gmsgServerName)
|
||||||
WRITE_STRING(name);
|
{
|
||||||
MESSAGE_END();
|
MESSAGE_BEGIN(MSG_ONE, gmsgServerName, NULL, client);
|
||||||
|
WRITE_STRING(name);
|
||||||
|
MESSAGE_END();
|
||||||
|
}
|
||||||
|
|
||||||
char *n = motd;
|
char *n = motd;
|
||||||
char c = 0;
|
char c = 0;
|
||||||
int a;
|
int a;
|
||||||
|
|
||||||
while ( *n ) {
|
while (*n)
|
||||||
|
{
|
||||||
a = mlen;
|
a = mlen;
|
||||||
if ( a > 175 ) a = 175;
|
if (a > 175) a = 175;
|
||||||
mlen -= a;
|
mlen -= a;
|
||||||
c = *(n+=a);
|
c = *(n += a);
|
||||||
*n = 0;
|
*n = 0;
|
||||||
MESSAGE_BEGIN( MSG_ONE , gmsgMOTD, NULL, client );
|
|
||||||
WRITE_BYTE( c ? FALSE : TRUE );
|
MESSAGE_BEGIN(MSG_ONE, gmsgMOTD, NULL, client);
|
||||||
WRITE_STRING( motd );
|
WRITE_BYTE(c ? FALSE : TRUE);
|
||||||
|
WRITE_STRING(motd);
|
||||||
MESSAGE_END();
|
MESSAGE_END();
|
||||||
*n = c;
|
*n = c;
|
||||||
motd = n;
|
motd = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
MESSAGE_BEGIN( MSG_ONE , gmsgServerName, NULL, client );
|
if (gmsgServerName)
|
||||||
WRITE_STRING( hostname->string );
|
{
|
||||||
MESSAGE_END();
|
MESSAGE_BEGIN(MSG_ONE, gmsgServerName, NULL, client);
|
||||||
|
WRITE_STRING(hostname->string);
|
||||||
|
MESSAGE_END();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UTIL_IntToString(int value, char *output)
|
void UTIL_IntToString(int value, char *output)
|
||||||
{
|
{
|
||||||
static const char *words[] = {"zero ","one ","two ","three ","four ",
|
static const char *words[] =
|
||||||
|
{"zero ","one ","two ","three ","four ",
|
||||||
"five ", "six ","seven ","eight ","nine ","ten ",
|
"five ", "six ","seven ","eight ","nine ","ten ",
|
||||||
"eleven ","twelve ","thirteen ","fourteen ","fifteen ",
|
"eleven ","twelve ","thirteen ","fourteen ","fifteen ",
|
||||||
"sixteen ","seventeen ","eighteen ","nineteen ",
|
"sixteen ","seventeen ","eighteen ","nineteen ",
|
||||||
"twenty ","thirty ","fourty ", "fifty ","sixty ",
|
"twenty ","thirty ","fourty ", "fifty ","sixty ",
|
||||||
"seventy ","eighty ","ninety ",
|
"seventy ","eighty ","ninety ",
|
||||||
"hundred ","thousand "};
|
"hundred ","thousand "};
|
||||||
|
|
||||||
*output = 0;
|
*output = 0;
|
||||||
if (value < 0) value = -value;
|
if (value < 0) value = -value;
|
||||||
int tho = value / 1000;
|
int tho = value / 1000;
|
||||||
int aaa = 0;
|
int aaa = 0;
|
||||||
if (tho){
|
|
||||||
aaa += sprintf(&output[aaa], words[ tho ] );
|
if (tho)
|
||||||
aaa += sprintf(&output[aaa], words[29] );
|
{
|
||||||
value = value % 1000;
|
aaa += sprintf(&output[aaa], words[tho]);
|
||||||
|
aaa += sprintf(&output[aaa], words[29]);
|
||||||
|
value = value % 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hun = value / 100;
|
int hun = value / 100;
|
||||||
if (hun) {
|
|
||||||
aaa += sprintf(&output[aaa], words[ hun ] );
|
if (hun)
|
||||||
aaa += sprintf(&output[aaa], words[28] );
|
{
|
||||||
value = value % 100;
|
aaa += sprintf(&output[aaa], words[hun]);
|
||||||
|
aaa += sprintf(&output[aaa], words[28]);
|
||||||
|
value = value % 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ten = value / 10;
|
int ten = value / 10;
|
||||||
int unit = value % 10;
|
int unit = value % 10;
|
||||||
if ( ten )
|
|
||||||
aaa += sprintf(&output[aaa], words[ ( ten > 1 ) ? ( ten + 18 ) : ( unit + 10 ) ] );
|
if (ten)
|
||||||
if ( ten != 1 && ( unit || (!value && !hun && !tho) ) )
|
aaa += sprintf(&output[aaa], words[(ten > 1) ? (ten + 18) : (unit + 10)]);
|
||||||
sprintf(&output[aaa], words[ unit ] );
|
|
||||||
|
if (ten != 1 && (unit || (!value && !hun && !tho)))
|
||||||
|
sprintf(&output[aaa], words[unit]);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* UTIL_SplitHudMessage(const char *src)
|
char* UTIL_SplitHudMessage(const char *src)
|
||||||
@ -146,50 +186,57 @@ char* UTIL_SplitHudMessage(const char *src)
|
|||||||
static char message[512];
|
static char message[512];
|
||||||
short b = 0, d = 0, e = 0, c = -1;
|
short b = 0, d = 0, e = 0, c = -1;
|
||||||
|
|
||||||
while ( src[ d ] && e < 480 ) {
|
while (src[d] && e < 480)
|
||||||
if ( src[ d ] == ' ' ) {
|
{
|
||||||
|
if (src[d] == ' ')
|
||||||
|
{
|
||||||
c = e;
|
c = e;
|
||||||
}
|
}
|
||||||
else if ( src[ d ] == '\n' ) {
|
else if (src[d] == '\n')
|
||||||
|
{
|
||||||
c = -1;
|
c = -1;
|
||||||
b = 0;
|
b = 0;
|
||||||
}
|
}
|
||||||
message[ e++ ] = src[ d++ ];
|
|
||||||
if ( ++b == 69 ) {
|
message[e++] = src[d++];
|
||||||
if ( c == -1 ) {
|
|
||||||
message[ e++ ] = '\n';
|
if (++b == 69)
|
||||||
|
{
|
||||||
|
if (c == -1)
|
||||||
|
{
|
||||||
|
message[e++] = '\n';
|
||||||
b = 0;
|
b = 0;
|
||||||
}
|
} else {
|
||||||
else {
|
message[c] = '\n';
|
||||||
message[ c ] = '\n';
|
|
||||||
b = e - c - 1;
|
b = e - c - 1;
|
||||||
c = -1;
|
c = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
message[ e ] = 0;
|
|
||||||
|
message[e] = 0;
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned short FixedUnsigned16( float value, float scale )
|
unsigned short FixedUnsigned16(float value, float scale)
|
||||||
{
|
{
|
||||||
int output = (int)(value * scale);
|
int output = (int)(value * scale);
|
||||||
|
|
||||||
if ( output < 0 )
|
if (output < 0)
|
||||||
output = 0;
|
output = 0;
|
||||||
else if ( output > 0xFFFF )
|
else if (output > 0xFFFF)
|
||||||
output = 0xFFFF;
|
output = 0xFFFF;
|
||||||
|
|
||||||
return (unsigned short)output;
|
return (unsigned short)output;
|
||||||
}
|
}
|
||||||
|
|
||||||
short FixedSigned16( float value, float scale )
|
short FixedSigned16(float value, float scale)
|
||||||
{
|
{
|
||||||
int output = (int)(value * scale);
|
int output = (int)(value * scale);
|
||||||
|
|
||||||
if ( output > 32767 )
|
if (output > 32767)
|
||||||
output = 32767;
|
output = 32767;
|
||||||
else if ( output < -32768 )
|
else if (output < -32768)
|
||||||
output = -32768;
|
output = -32768;
|
||||||
|
|
||||||
return (short)output;
|
return (short)output;
|
||||||
@ -197,15 +244,15 @@ short FixedSigned16( float value, float scale )
|
|||||||
|
|
||||||
void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pMessage)
|
void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pMessage)
|
||||||
{
|
{
|
||||||
if ( pEntity )
|
if (pEntity)
|
||||||
MESSAGE_BEGIN( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, NULL, pEntity );
|
MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, NULL, pEntity);
|
||||||
else
|
else
|
||||||
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
|
MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY);
|
||||||
|
|
||||||
WRITE_BYTE(29);
|
WRITE_BYTE(29);
|
||||||
WRITE_BYTE(textparms.channel & 0xFF);
|
WRITE_BYTE(textparms.channel & 0xFF);
|
||||||
WRITE_SHORT(FixedSigned16(textparms.x, (1<<13) ));
|
WRITE_SHORT(FixedSigned16(textparms.x, (1<<13)));
|
||||||
WRITE_SHORT(FixedSigned16(textparms.y, (1<<13) ));
|
WRITE_SHORT(FixedSigned16(textparms.y, (1<<13)));
|
||||||
WRITE_BYTE(textparms.effect);
|
WRITE_BYTE(textparms.effect);
|
||||||
WRITE_BYTE(textparms.r1);
|
WRITE_BYTE(textparms.r1);
|
||||||
WRITE_BYTE(textparms.g1);
|
WRITE_BYTE(textparms.g1);
|
||||||
@ -215,30 +262,34 @@ void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pM
|
|||||||
WRITE_BYTE(255);
|
WRITE_BYTE(255);
|
||||||
WRITE_BYTE(250);
|
WRITE_BYTE(250);
|
||||||
WRITE_BYTE(0);
|
WRITE_BYTE(0);
|
||||||
WRITE_SHORT(FixedUnsigned16(textparms.fadeinTime, (1<<8) ));
|
WRITE_SHORT(FixedUnsigned16(textparms.fadeinTime, (1<<8)));
|
||||||
WRITE_SHORT(FixedUnsigned16(textparms.fadeoutTime, (1<<8) ));
|
WRITE_SHORT(FixedUnsigned16(textparms.fadeoutTime, (1<<8)));
|
||||||
WRITE_SHORT(FixedUnsigned16(textparms.holdTime, (1<<8) ));
|
WRITE_SHORT(FixedUnsigned16(textparms.holdTime, (1<<8)));
|
||||||
if (textparms.effect==2)
|
|
||||||
WRITE_SHORT(FixedUnsigned16(textparms.fxTime, (1<<8) ) );
|
if (textparms.effect == 2)
|
||||||
|
WRITE_SHORT(FixedUnsigned16(textparms.fxTime, (1<<8)));
|
||||||
|
|
||||||
WRITE_STRING(pMessage);
|
WRITE_STRING(pMessage);
|
||||||
MESSAGE_END();
|
MESSAGE_END();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* warning - buffer of msg must be longer than 190 chars!
|
/* warning - buffer of msg must be longer than 190 chars!
|
||||||
(here in AMX it is always longer) */
|
(here in AMX it is always longer) */
|
||||||
void UTIL_ClientPrint( edict_t *pEntity, int msg_dest, char *msg )
|
void UTIL_ClientPrint(edict_t *pEntity, int msg_dest, char *msg)
|
||||||
{
|
{
|
||||||
if (!gmsgTextMsg)
|
if (!gmsgTextMsg)
|
||||||
return; // :TODO: Maybe output a warning log?
|
return; // :TODO: Maybe output a warning log?
|
||||||
|
|
||||||
char c = msg[190];
|
char c = msg[190];
|
||||||
msg[190] = 0; // truncate without checking with strlen()
|
msg[190] = 0; // truncate without checking with strlen()
|
||||||
if ( pEntity )
|
|
||||||
MESSAGE_BEGIN( MSG_ONE, gmsgTextMsg, NULL, pEntity );
|
if (pEntity)
|
||||||
|
MESSAGE_BEGIN(MSG_ONE, gmsgTextMsg, NULL, pEntity);
|
||||||
else
|
else
|
||||||
MESSAGE_BEGIN( MSG_BROADCAST , gmsgTextMsg);
|
MESSAGE_BEGIN(MSG_BROADCAST, gmsgTextMsg);
|
||||||
WRITE_BYTE( msg_dest );
|
|
||||||
WRITE_STRING( msg );
|
WRITE_BYTE(msg_dest);
|
||||||
|
WRITE_STRING(msg);
|
||||||
MESSAGE_END();
|
MESSAGE_END();
|
||||||
msg[190] = c;
|
msg[190] = c;
|
||||||
}
|
}
|
||||||
@ -252,17 +303,6 @@ void UTIL_ClientPrint( edict_t *pEntity, int msg_dest, char *msg )
|
|||||||
// 4) unsets the global "fake" flag
|
// 4) unsets the global "fake" flag
|
||||||
void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1, const char *arg2)
|
void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1, const char *arg2)
|
||||||
{
|
{
|
||||||
if (!cmd)
|
|
||||||
return; // no command
|
|
||||||
/*
|
|
||||||
char clCmd[256];
|
|
||||||
snprintf(g_fakecmd.args, 255, "%s%s%s%s%s", cmd,
|
|
||||||
arg1 ? " " : "", arg1 ? arg1 : "",
|
|
||||||
arg2 ? " " : "", arg2 ? arg2 : "");
|
|
||||||
clCmd[255] = 0;
|
|
||||||
CLIENT_COMMAND(pEdict, clCmd);
|
|
||||||
return;
|
|
||||||
*/
|
|
||||||
if (!cmd)
|
if (!cmd)
|
||||||
return; // no command
|
return; // no command
|
||||||
|
|
||||||
@ -293,7 +333,7 @@ void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1,
|
|||||||
// store argument
|
// store argument
|
||||||
g_fakecmd.argv[1] = arg1;
|
g_fakecmd.argv[1] = arg1;
|
||||||
// build argument line
|
// build argument line
|
||||||
snprintf( g_fakecmd.args, 255, "%s", arg1);
|
snprintf(g_fakecmd.args, 255, "%s", arg1);
|
||||||
// if snprintf reached 255 chars limit, this will make sure there will be no access violation
|
// if snprintf reached 255 chars limit, this will make sure there will be no access violation
|
||||||
g_fakecmd.args[255] = 0;
|
g_fakecmd.args[255] = 0;
|
||||||
}
|
}
|
||||||
|
@ -34,52 +34,49 @@
|
|||||||
|
|
||||||
Vault g_vault;
|
Vault g_vault;
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL set_vaultdata(AMX *amx,cell *params)
|
static cell AMX_NATIVE_CALL set_vaultdata(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
int iLen;
|
int iLen;
|
||||||
|
|
||||||
g_vault.put( get_amxstring(amx,params[1],0,iLen) , get_amxstring(amx,params[2],1,iLen) );
|
g_vault.put(get_amxstring(amx, params[1], 0, iLen), get_amxstring(amx, params[2], 1, iLen));
|
||||||
g_vault.saveVault();
|
g_vault.saveVault();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL get_vaultdata(AMX *amx,cell *params)
|
static cell AMX_NATIVE_CALL get_vaultdata(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
int iLen;
|
int iLen;
|
||||||
|
const char* key = get_amxstring(amx, params[1], 0, iLen);
|
||||||
|
|
||||||
const char* key = get_amxstring(amx,params[1],0,iLen);
|
if (params[3])
|
||||||
|
return set_amxstring(amx, params[2], g_vault.get(key), params[3]);
|
||||||
|
|
||||||
if ( params[3] )
|
return g_vault.get_number(key);
|
||||||
return set_amxstring( amx , params[2] , g_vault.get( key ) , params[3] );
|
|
||||||
|
|
||||||
return g_vault.get_number( key );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL remove_vaultdata(AMX *amx,cell *params)
|
static cell AMX_NATIVE_CALL remove_vaultdata(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
int iLen;
|
int iLen;
|
||||||
|
|
||||||
g_vault.remove( get_amxstring(amx,params[1],0,iLen) );
|
g_vault.remove(get_amxstring(amx, params[1], 0, iLen));
|
||||||
g_vault.saveVault();
|
g_vault.saveVault();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL vaultdata_exists(AMX *amx,cell *params)
|
static cell AMX_NATIVE_CALL vaultdata_exists(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
int iLen;
|
int iLen;
|
||||||
|
return g_vault.exists(get_amxstring(amx, params[1], 0, iLen)) ? 1 : 0;
|
||||||
return g_vault.exists( get_amxstring(amx,params[1],0,iLen) ) ? 1 : 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AMX_NATIVE_INFO vault_Natives[] = {
|
AMX_NATIVE_INFO vault_Natives[] =
|
||||||
{ "set_vaultdata", set_vaultdata },
|
{
|
||||||
{ "get_vaultdata", get_vaultdata },
|
{"set_vaultdata", set_vaultdata},
|
||||||
{ "remove_vaultdata", remove_vaultdata },
|
{"get_vaultdata", get_vaultdata},
|
||||||
{ "delete_vaultdata", remove_vaultdata },
|
{"remove_vaultdata", remove_vaultdata},
|
||||||
{ "vaultdata_exists", vaultdata_exists },
|
{"delete_vaultdata", remove_vaultdata},
|
||||||
{ 0, 0 }
|
{"vaultdata_exists", vaultdata_exists},
|
||||||
|
{0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,8 +1,34 @@
|
|||||||
|
// Microsoft Visual C++ generated resource script.
|
||||||
|
//
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
#define APSTUDIO_READONLY_SYMBOLS
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 2 resource.
|
||||||
|
//
|
||||||
#include "winres.h"
|
#include "winres.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// English (U.S.) resources
|
||||||
|
|
||||||
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||||
|
#ifdef _WIN32
|
||||||
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
#pragma code_page(1252)
|
||||||
|
#endif //_WIN32
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Version
|
||||||
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 0,2,0,0
|
FILEVERSION 1,6,0,0
|
||||||
PRODUCTVERSION 0,2,0,0
|
PRODUCTVERSION 1,6,0,0
|
||||||
FILEFLAGSMASK 0x17L
|
FILEFLAGSMASK 0x17L
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@ -13,22 +39,64 @@ VS_VERSION_INFO VERSIONINFO
|
|||||||
FILETYPE 0x2L
|
FILETYPE 0x2L
|
||||||
FILESUBTYPE 0x0L
|
FILESUBTYPE 0x0L
|
||||||
BEGIN
|
BEGIN
|
||||||
BLOCK "StringFileInfo"
|
BLOCK "StringFileInfo"
|
||||||
BEGIN
|
BEGIN
|
||||||
BLOCK "000004b0"
|
BLOCK "000004b0"
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "Comments", "AMX Mod X\0"
|
VALUE "Comments", "AMX Mod X"
|
||||||
VALUE "FileDescription", "AMX Mod X\0"
|
VALUE "FileDescription", "AMX Mod X"
|
||||||
VALUE "FileVersion", "0.20\0"
|
VALUE "FileVersion", "1.60"
|
||||||
VALUE "InternalName", "amxmodx\0"
|
VALUE "InternalName", "amxmodx"
|
||||||
VALUE "LegalCopyright", "Copyright (c) 2004, AMX Mod X Dev Team\0"
|
VALUE "LegalCopyright", "Copyright (c) 2004-2005, AMX Mod X Dev Team"
|
||||||
VALUE "OriginalFilename", "amxx_mm.dll\0"
|
VALUE "OriginalFilename", "amxmodx_mm.dll"
|
||||||
VALUE "ProductName", "AMX Mod X\0"
|
VALUE "ProductName", "AMX Mod X"
|
||||||
VALUE "ProductVersion", "0.20\0"
|
VALUE "ProductVersion", "1.60"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "Translation", 0x0, 1200
|
VALUE "Translation", 0x0, 1200
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TEXTINCLUDE
|
||||||
|
//
|
||||||
|
|
||||||
|
1 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"resource.h\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
2 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"#include ""winres.h""\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
3 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
#endif // English (U.S.) resources
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 3 resource.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#endif // not APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
BIN
amxmodx/zlib/libz.a
Executable file
BIN
amxmodx/zlib/libz.a
Executable file
Binary file not shown.
BIN
amxmodx/zlib/libz64.a
Executable file
BIN
amxmodx/zlib/libz64.a
Executable file
Binary file not shown.
323
amxmodx/zlib/zconf.h
Executable file
323
amxmodx/zlib/zconf.h
Executable file
@ -0,0 +1,323 @@
|
|||||||
|
/* zconf.h -- configuration of the zlib compression library
|
||||||
|
* Copyright (C) 1995-2003 Jean-loup Gailly.
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#ifndef ZCONF_H
|
||||||
|
#define ZCONF_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you *really* need a unique prefix for all types and library functions,
|
||||||
|
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
|
||||||
|
*/
|
||||||
|
#ifdef Z_PREFIX
|
||||||
|
# define deflateInit_ z_deflateInit_
|
||||||
|
# define deflate z_deflate
|
||||||
|
# define deflateEnd z_deflateEnd
|
||||||
|
# define inflateInit_ z_inflateInit_
|
||||||
|
# define inflate z_inflate
|
||||||
|
# define inflateEnd z_inflateEnd
|
||||||
|
# define deflateInit2_ z_deflateInit2_
|
||||||
|
# define deflateSetDictionary z_deflateSetDictionary
|
||||||
|
# define deflateCopy z_deflateCopy
|
||||||
|
# define deflateReset z_deflateReset
|
||||||
|
# define deflatePrime z_deflatePrime
|
||||||
|
# define deflateParams z_deflateParams
|
||||||
|
# define deflateBound z_deflateBound
|
||||||
|
# define inflateInit2_ z_inflateInit2_
|
||||||
|
# define inflateSetDictionary z_inflateSetDictionary
|
||||||
|
# define inflateSync z_inflateSync
|
||||||
|
# define inflateSyncPoint z_inflateSyncPoint
|
||||||
|
# define inflateCopy z_inflateCopy
|
||||||
|
# define inflateReset z_inflateReset
|
||||||
|
# define compress z_compress
|
||||||
|
# define compress2 z_compress2
|
||||||
|
# define compressBound z_compressBound
|
||||||
|
# define uncompress z_uncompress
|
||||||
|
# define adler32 z_adler32
|
||||||
|
# define crc32 z_crc32
|
||||||
|
# define get_crc_table z_get_crc_table
|
||||||
|
|
||||||
|
# define Byte z_Byte
|
||||||
|
# define uInt z_uInt
|
||||||
|
# define uLong z_uLong
|
||||||
|
# define Bytef z_Bytef
|
||||||
|
# define charf z_charf
|
||||||
|
# define intf z_intf
|
||||||
|
# define uIntf z_uIntf
|
||||||
|
# define uLongf z_uLongf
|
||||||
|
# define voidpf z_voidpf
|
||||||
|
# define voidp z_voidp
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__MSDOS__) && !defined(MSDOS)
|
||||||
|
# define MSDOS
|
||||||
|
#endif
|
||||||
|
#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
|
||||||
|
# define OS2
|
||||||
|
#endif
|
||||||
|
#if defined(_WINDOWS) && !defined(WINDOWS)
|
||||||
|
# define WINDOWS
|
||||||
|
#endif
|
||||||
|
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
|
||||||
|
# define WIN32
|
||||||
|
#endif
|
||||||
|
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
|
||||||
|
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
|
||||||
|
# ifndef SYS16BIT
|
||||||
|
# define SYS16BIT
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more
|
||||||
|
* than 64k bytes at a time (needed on systems with 16-bit int).
|
||||||
|
*/
|
||||||
|
#ifdef SYS16BIT
|
||||||
|
# define MAXSEG_64K
|
||||||
|
#endif
|
||||||
|
#ifdef MSDOS
|
||||||
|
# define UNALIGNED_OK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __STDC_VERSION__
|
||||||
|
# ifndef STDC
|
||||||
|
# define STDC
|
||||||
|
# endif
|
||||||
|
# if __STDC_VERSION__ >= 199901L
|
||||||
|
# ifndef STDC99
|
||||||
|
# define STDC99
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STDC
|
||||||
|
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
|
||||||
|
# define const /* note: need a more gentle solution here */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Some Mac compilers merge all .h files incorrectly: */
|
||||||
|
#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
|
||||||
|
# define NO_DUMMY_DECL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Maximum value for memLevel in deflateInit2 */
|
||||||
|
#ifndef MAX_MEM_LEVEL
|
||||||
|
# ifdef MAXSEG_64K
|
||||||
|
# define MAX_MEM_LEVEL 8
|
||||||
|
# else
|
||||||
|
# define MAX_MEM_LEVEL 9
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Maximum value for windowBits in deflateInit2 and inflateInit2.
|
||||||
|
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
|
||||||
|
* created by gzip. (Files created by minigzip can still be extracted by
|
||||||
|
* gzip.)
|
||||||
|
*/
|
||||||
|
#ifndef MAX_WBITS
|
||||||
|
# define MAX_WBITS 15 /* 32K LZ77 window */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The memory requirements for deflate are (in bytes):
|
||||||
|
(1 << (windowBits+2)) + (1 << (memLevel+9))
|
||||||
|
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
|
||||||
|
plus a few kilobytes for small objects. For example, if you want to reduce
|
||||||
|
the default memory requirements from 256K to 128K, compile with
|
||||||
|
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
|
||||||
|
Of course this will generally degrade compression (there's no free lunch).
|
||||||
|
|
||||||
|
The memory requirements for inflate are (in bytes) 1 << windowBits
|
||||||
|
that is, 32K for windowBits=15 (default value) plus a few kilobytes
|
||||||
|
for small objects.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Type declarations */
|
||||||
|
|
||||||
|
#ifndef OF /* function prototypes */
|
||||||
|
# ifdef STDC
|
||||||
|
# define OF(args) args
|
||||||
|
# else
|
||||||
|
# define OF(args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The following definitions for FAR are needed only for MSDOS mixed
|
||||||
|
* model programming (small or medium model with some far allocations).
|
||||||
|
* This was tested only with MSC; for other MSDOS compilers you may have
|
||||||
|
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
|
||||||
|
* just define FAR to be empty.
|
||||||
|
*/
|
||||||
|
#ifdef SYS16BIT
|
||||||
|
# if defined(M_I86SM) || defined(M_I86MM)
|
||||||
|
/* MSC small or medium model */
|
||||||
|
# define SMALL_MEDIUM
|
||||||
|
# ifdef _MSC_VER
|
||||||
|
# define FAR _far
|
||||||
|
# else
|
||||||
|
# define FAR far
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if (defined(__SMALL__) || defined(__MEDIUM__))
|
||||||
|
/* Turbo C small or medium model */
|
||||||
|
# define SMALL_MEDIUM
|
||||||
|
# ifdef __BORLANDC__
|
||||||
|
# define FAR _far
|
||||||
|
# else
|
||||||
|
# define FAR far
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WINDOWS) || defined(WIN32)
|
||||||
|
/* If building or using zlib as a DLL, define ZLIB_DLL.
|
||||||
|
* This is not mandatory, but it offers a little performance increase.
|
||||||
|
*/
|
||||||
|
# ifdef ZLIB_DLL
|
||||||
|
# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
|
||||||
|
# ifdef ZLIB_INTERNAL
|
||||||
|
# define ZEXTERN extern __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define ZEXTERN extern __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif /* ZLIB_DLL */
|
||||||
|
/* If building or using zlib with the WINAPI/WINAPIV calling convention,
|
||||||
|
* define ZLIB_WINAPI.
|
||||||
|
* Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
|
||||||
|
*/
|
||||||
|
# ifdef ZLIB_WINAPI
|
||||||
|
# ifdef FAR
|
||||||
|
# undef FAR
|
||||||
|
# endif
|
||||||
|
# include <windows.h>
|
||||||
|
/* No need for _export, use ZLIB.DEF instead. */
|
||||||
|
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
|
||||||
|
# define ZEXPORT WINAPI
|
||||||
|
# ifdef WIN32
|
||||||
|
# define ZEXPORTVA WINAPIV
|
||||||
|
# else
|
||||||
|
# define ZEXPORTVA FAR CDECL
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__BEOS__)
|
||||||
|
# ifdef ZLIB_DLL
|
||||||
|
# ifdef ZLIB_INTERNAL
|
||||||
|
# define ZEXPORT __declspec(dllexport)
|
||||||
|
# define ZEXPORTVA __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define ZEXPORT __declspec(dllimport)
|
||||||
|
# define ZEXPORTVA __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ZEXTERN
|
||||||
|
# define ZEXTERN extern
|
||||||
|
#endif
|
||||||
|
#ifndef ZEXPORT
|
||||||
|
# define ZEXPORT
|
||||||
|
#endif
|
||||||
|
#ifndef ZEXPORTVA
|
||||||
|
# define ZEXPORTVA
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FAR
|
||||||
|
# define FAR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__MACTYPES__)
|
||||||
|
typedef unsigned char Byte; /* 8 bits */
|
||||||
|
#endif
|
||||||
|
typedef unsigned int uInt; /* 16 bits or more */
|
||||||
|
typedef unsigned long uLong; /* 32 bits or more */
|
||||||
|
|
||||||
|
#ifdef SMALL_MEDIUM
|
||||||
|
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
|
||||||
|
# define Bytef Byte FAR
|
||||||
|
#else
|
||||||
|
typedef Byte FAR Bytef;
|
||||||
|
#endif
|
||||||
|
typedef char FAR charf;
|
||||||
|
typedef int FAR intf;
|
||||||
|
typedef uInt FAR uIntf;
|
||||||
|
typedef uLong FAR uLongf;
|
||||||
|
|
||||||
|
#ifdef STDC
|
||||||
|
typedef void const *voidpc;
|
||||||
|
typedef void FAR *voidpf;
|
||||||
|
typedef void *voidp;
|
||||||
|
#else
|
||||||
|
typedef Byte const *voidpc;
|
||||||
|
typedef Byte FAR *voidpf;
|
||||||
|
typedef Byte *voidp;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
|
||||||
|
# include <sys/types.h> /* for off_t */
|
||||||
|
# include <unistd.h> /* for SEEK_* and off_t */
|
||||||
|
# ifdef VMS
|
||||||
|
# include <unixio.h> /* for off_t */
|
||||||
|
# endif
|
||||||
|
# define z_off_t off_t
|
||||||
|
#endif
|
||||||
|
#ifndef SEEK_SET
|
||||||
|
# define SEEK_SET 0 /* Seek from beginning of file. */
|
||||||
|
# define SEEK_CUR 1 /* Seek from current position. */
|
||||||
|
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
|
||||||
|
#endif
|
||||||
|
#ifndef z_off_t
|
||||||
|
# define z_off_t long
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__OS400__)
|
||||||
|
#define NO_vsnprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__MVS__)
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# ifdef FAR
|
||||||
|
# undef FAR
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* MVS linker does not support external names larger than 8 bytes */
|
||||||
|
#if defined(__MVS__)
|
||||||
|
# pragma map(deflateInit_,"DEIN")
|
||||||
|
# pragma map(deflateInit2_,"DEIN2")
|
||||||
|
# pragma map(deflateEnd,"DEEND")
|
||||||
|
# pragma map(deflateBound,"DEBND")
|
||||||
|
# pragma map(inflateInit_,"ININ")
|
||||||
|
# pragma map(inflateInit2_,"ININ2")
|
||||||
|
# pragma map(inflateEnd,"INEND")
|
||||||
|
# pragma map(inflateSync,"INSY")
|
||||||
|
# pragma map(inflateSetDictionary,"INSEDI")
|
||||||
|
# pragma map(compressBound,"CMBND")
|
||||||
|
# pragma map(inflate_table,"INTABL")
|
||||||
|
# pragma map(inflate_fast,"INFA")
|
||||||
|
# pragma map(inflate_copyright,"INCOPY")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ZCONF_H */
|
1357
amxmodx/zlib/zlib.h
Executable file
1357
amxmodx/zlib/zlib.h
Executable file
File diff suppressed because it is too large
Load Diff
BIN
amxmodx/zlib/zlib.lib
Executable file
BIN
amxmodx/zlib/zlib.lib
Executable file
Binary file not shown.
143
compiler/amxxpc/Binary.cpp
Executable file
143
compiler/amxxpc/Binary.cpp
Executable file
@ -0,0 +1,143 @@
|
|||||||
|
#include "Binary.h"
|
||||||
|
|
||||||
|
BinaryWriter::BinaryWriter(FILE *fp)
|
||||||
|
{
|
||||||
|
m_Fp = fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BinaryWriter::WriteAddr(void *buffer, size_t size)
|
||||||
|
{
|
||||||
|
if (fwrite(buffer, size, 1, m_Fp) != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinaryWriter::WriteUInt32(uint32_t num)
|
||||||
|
{
|
||||||
|
if ( !WriteAddr(&num, sizeof(uint32_t)) )
|
||||||
|
throw -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinaryWriter::WriteInt32(int32_t num)
|
||||||
|
{
|
||||||
|
if ( !WriteAddr(&num, sizeof(int32_t)) )
|
||||||
|
throw -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinaryWriter::WriteUInt16(uint16_t num)
|
||||||
|
{
|
||||||
|
if ( !WriteAddr(&num, sizeof(uint16_t)) )
|
||||||
|
throw -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinaryWriter::WriteInt16(int16_t num)
|
||||||
|
{
|
||||||
|
if ( !WriteAddr(&num, sizeof(int16_t)) )
|
||||||
|
throw -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinaryWriter::WriteUInt8(uint8_t num)
|
||||||
|
{
|
||||||
|
if ( !WriteAddr(&num, sizeof(uint8_t)) )
|
||||||
|
throw -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinaryWriter::WriteInt8(int8_t num)
|
||||||
|
{
|
||||||
|
if ( !WriteAddr(&num, sizeof(int8_t)) )
|
||||||
|
throw -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinaryWriter::WriteChars(const char buffer[], size_t chars)
|
||||||
|
{
|
||||||
|
if (!chars)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (fwrite(buffer, sizeof(char), chars, m_Fp) != chars)
|
||||||
|
throw -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
BinaryReader::BinaryReader(FILE *fp)
|
||||||
|
{
|
||||||
|
m_Fp = fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BinaryReader::ReadAddr(void *buffer, size_t size)
|
||||||
|
{
|
||||||
|
if (fread(buffer, size, 1, m_Fp) != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t BinaryReader::ReadUInt32()
|
||||||
|
{
|
||||||
|
uint32_t num;
|
||||||
|
|
||||||
|
if ( !ReadAddr(&num, sizeof(uint32_t)) )
|
||||||
|
throw -1;
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t BinaryReader::ReadInt32()
|
||||||
|
{
|
||||||
|
int32_t num;
|
||||||
|
|
||||||
|
if ( !ReadAddr(&num, sizeof(int32_t)) )
|
||||||
|
throw -1;
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t BinaryReader::ReadUInt16()
|
||||||
|
{
|
||||||
|
uint16_t num;
|
||||||
|
|
||||||
|
if ( !ReadAddr(&num, sizeof(uint16_t)) )
|
||||||
|
throw -1;
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t BinaryReader::ReadInt16()
|
||||||
|
{
|
||||||
|
int16_t num;
|
||||||
|
|
||||||
|
if ( !ReadAddr(&num, sizeof(int16_t)) )
|
||||||
|
throw -1;
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t BinaryReader::ReadUInt8()
|
||||||
|
{
|
||||||
|
uint8_t num;
|
||||||
|
|
||||||
|
if ( !ReadAddr(&num, sizeof(uint8_t)) )
|
||||||
|
throw -1;
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t BinaryReader::ReadInt8()
|
||||||
|
{
|
||||||
|
int8_t num;
|
||||||
|
|
||||||
|
if ( !ReadAddr(&num, sizeof(int8_t)) )
|
||||||
|
throw -1;
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *BinaryReader::ReadChars(char buffer[], size_t chars)
|
||||||
|
{
|
||||||
|
if (!chars)
|
||||||
|
return buffer;
|
||||||
|
|
||||||
|
if (fread(buffer, sizeof(char), chars, m_Fp) != chars)
|
||||||
|
throw -1;
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
54
compiler/amxxpc/Binary.h
Executable file
54
compiler/amxxpc/Binary.h
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
#ifndef _INCLUDE_BINARY_H
|
||||||
|
#define _INCLUDE_BINARY_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "amx.h"
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
typedef __int8 int8_t;
|
||||||
|
typedef unsigned __int8 uint8_t;
|
||||||
|
typedef __int16 int16_t;
|
||||||
|
typedef unsigned __int16 uint16_t;
|
||||||
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class BinaryReader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BinaryReader(FILE *fp);
|
||||||
|
//~BinaryReader();
|
||||||
|
public:
|
||||||
|
uint32_t ReadUInt32();
|
||||||
|
int32_t ReadInt32();
|
||||||
|
uint16_t ReadUInt16();
|
||||||
|
int16_t ReadInt16();
|
||||||
|
uint8_t ReadUInt8();
|
||||||
|
int8_t ReadInt8();
|
||||||
|
char *ReadChars(char buffer[], size_t chars);
|
||||||
|
private:
|
||||||
|
bool ReadAddr(void *buffer, size_t size);
|
||||||
|
private:
|
||||||
|
FILE *m_Fp;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BinaryWriter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BinaryWriter(FILE *fp);
|
||||||
|
public:
|
||||||
|
void WriteUInt32(uint32_t num);
|
||||||
|
void WriteInt32(int32_t num);
|
||||||
|
void WriteUInt16(uint16_t num);
|
||||||
|
void WriteInt16(int16_t num);
|
||||||
|
void WriteUInt8(uint8_t num);
|
||||||
|
void WriteInt8(int8_t num);
|
||||||
|
void WriteChars(const char buffer[], size_t chars);
|
||||||
|
private:
|
||||||
|
bool WriteAddr(void *buffer, size_t size);
|
||||||
|
private:
|
||||||
|
FILE *m_Fp;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_BINARY_H
|
||||||
|
|
46
compiler/amxxpc/Makefile
Executable file
46
compiler/amxxpc/Makefile
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
#(C)2004-2005 AMX Mod X Development Team
|
||||||
|
# Makefile written by David "BAILOPAN" Anderson
|
||||||
|
|
||||||
|
### EDIT BELOW FOR OTHER PROJECTS ###
|
||||||
|
|
||||||
|
OPT_FLAGS = -O3 -funroll-loops -s -pipe
|
||||||
|
DEBUG_FLAGS = -g -ggdb3
|
||||||
|
CPP = gcc
|
||||||
|
BINARY = amxxpc
|
||||||
|
|
||||||
|
OBJECTS = amx.cpp amxxpc.cpp Binary.cpp
|
||||||
|
|
||||||
|
LINK = -lz /lib/libstdc++.a
|
||||||
|
|
||||||
|
INCLUDE = -I. -L.
|
||||||
|
|
||||||
|
ifeq "$(DEBUG)" "true"
|
||||||
|
BIN_DIR = Debug
|
||||||
|
CFLAGS = $(DEBUG_FLAGS)
|
||||||
|
else
|
||||||
|
BIN_DIR = Release
|
||||||
|
CFLAGS = $(OPT_FLAGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
CFLAGS += -DLINUX -DNDEBUG -Wno-deprecated -fexceptions -DHAVE_STDINT_H -DAMX_ANSIONLY -fno-rtti -static-libgcc
|
||||||
|
|
||||||
|
OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o)
|
||||||
|
|
||||||
|
$(BIN_DIR)/%.o: %.cpp
|
||||||
|
$(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $<
|
||||||
|
|
||||||
|
all:
|
||||||
|
mkdir -p $(BIN_DIR)
|
||||||
|
$(MAKE) amxxpc
|
||||||
|
|
||||||
|
amxxpc: $(OBJ_LINUX)
|
||||||
|
$(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -ldl -lm -o$(BIN_DIR)/$(BINARY)
|
||||||
|
|
||||||
|
default: all
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf Release/*.o
|
||||||
|
rm -rf Release/$(BINARY)
|
||||||
|
rm -rf Debug/*.o
|
||||||
|
rm -rf Debug/$(BINARY)
|
||||||
|
|
3984
compiler/amxxpc/amx.cpp
Executable file
3984
compiler/amxxpc/amx.cpp
Executable file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user