Compare commits
524 Commits
amxmodx-1.
...
amxmodx-1.
Author | SHA1 | Date | |
---|---|---|---|
7e6cc572cf | |||
4cc460cfbe | |||
947cb5f79d | |||
73386b12c5 | |||
57160763af | |||
1f0778b14e | |||
3c923170a9 | |||
09beb4b81e | |||
f48aea7a72 | |||
63ad5727ef | |||
61525e9638 | |||
918e1c3195 | |||
6e56aed778 | |||
87c3e1dc82 | |||
d925dc6e41 | |||
651c5d9f01 | |||
4f8917ec44 | |||
1c265733e1 | |||
14a068532f | |||
3c379469d5 | |||
2df8b4269e | |||
3d74b7cf09 | |||
47e2214f09 | |||
4413e54058 | |||
14aff9b19b | |||
38cb94050e | |||
c294b91ca4 | |||
d95f794844 | |||
3754604686 | |||
4bd356079c | |||
c67e19a62f | |||
96c29d5376 | |||
65eb0279b2 | |||
c287985a66 | |||
1b9ef4d268 | |||
02fb807a0b | |||
f880fc6ee9 | |||
f6f6bcc356 | |||
4f95899d2e | |||
adf12bf348 | |||
c7febb4447 | |||
77e4d85002 | |||
418efa4088 | |||
4599b59834 | |||
751e8e6299 | |||
4eb8c4e295 | |||
5a4b1d2f03 | |||
b5498818a3 | |||
5286672268 | |||
8df33abd70 | |||
38e7b9ff58 | |||
621c120b71 | |||
c9c2943c05 | |||
ed5395a54a | |||
557958b408 | |||
2905217607 | |||
78956f3d89 | |||
95537e4840 | |||
35a96176fa | |||
6a28bc602a | |||
72f59422d5 | |||
cba554d193 | |||
76a4d84dbb | |||
ec83efbdf3 | |||
9bd22661ff | |||
baf406cb6a | |||
388711e969 | |||
cb01ff1dc3 | |||
5c23cf416e | |||
b8b3107210 | |||
2cd1449f88 | |||
3691e98814 | |||
709b3705ab | |||
22bef17660 | |||
b4767cb99e | |||
30235e05e5 | |||
28c4ea4fec | |||
58e1254876 | |||
81ac41037b | |||
6786b0e356 | |||
af5a7f5434 | |||
cd6f3dfd71 | |||
a7fcf76244 | |||
3878c7492a | |||
4981f46c41 | |||
ee4f064073 | |||
a42a5f1a0e | |||
bab5bb5a72 | |||
58abc3a655 | |||
0cb316c764 | |||
74d3d23f13 | |||
5b47da7cee | |||
45b67b6e2c | |||
44a17fe646 | |||
d21a352167 | |||
4fc2c9cebb | |||
4692335abb | |||
4e639d09de | |||
deefc504e1 | |||
ea262171db | |||
e49af85119 | |||
dec169562b | |||
0acaf1b476 | |||
2cf396be3e | |||
df7ee94b83 | |||
afe7df87d2 | |||
c80b7fd422 | |||
adad1384ff | |||
fb0d728720 | |||
a1e8701236 | |||
df5c6ccb95 | |||
8a58dd8806 | |||
67f53505ce | |||
e7cc87a610 | |||
b572cdff2f | |||
446d4b8a5d | |||
db5c9c114e | |||
408f61c6d6 | |||
042b9f7f4b | |||
a8b4ebbe70 | |||
ed0312567d | |||
e80679afd0 | |||
9093a178f1 | |||
4fe8c71d62 | |||
f5414ff8de | |||
f3a833dd1b | |||
e2932fb61a | |||
43bd5fc732 | |||
377c01eac7 | |||
7af82f0d4f | |||
010ef526c5 | |||
659448ce29 | |||
d7d0d72ceb | |||
79f8525c4a | |||
2869c8f4f6 | |||
b7076fc572 | |||
f7691a51c6 | |||
5524d5dca1 | |||
e015df58c8 | |||
db175082ad | |||
8b055fd1d0 | |||
6295813723 | |||
a03cd1385d | |||
1b065c6f36 | |||
e0115ba2dc | |||
4306c4f5b6 | |||
3b62b91fb7 | |||
32b1149716 | |||
f92017516f | |||
8837c52d81 | |||
6ab3c50813 | |||
0c06cdca36 | |||
ce59ee0362 | |||
c2d2e8aef5 | |||
9780a6c36f | |||
1a6f4e08b2 | |||
49f46a5f4c | |||
51ee2e4846 | |||
928091864f | |||
fab4a43915 | |||
b44951295d | |||
db3beb9b98 | |||
2dc3f2bec9 | |||
6ac889f6e2 | |||
87ac42cd98 | |||
f64d2366e9 | |||
34d71eb4dc | |||
fb2e0c5f6c | |||
65513c6037 | |||
b859001feb | |||
895039308f | |||
43b8ea4657 | |||
0eca298c2a | |||
8d4f28ac62 | |||
57ccee89f2 | |||
4b649469b0 | |||
f1d3274f0e | |||
0c668753fb | |||
2edbf72391 | |||
e1caa575e7 | |||
9dcdba439a | |||
d3af14c957 | |||
f08bbbc45f | |||
99a2b54530 | |||
6f20664140 | |||
06fbff7042 | |||
bb609123fb | |||
d832eb8fef | |||
fd67b07530 | |||
c0396bf140 | |||
d55542aa8d | |||
2e86f51cfe | |||
84ec8ef007 | |||
07e55f3b71 | |||
50311d14fb | |||
1088b209d9 | |||
63ec26f8c0 | |||
07b5a819bf | |||
8e03e67a8f | |||
66d04f8def | |||
bce69e7116 | |||
d4bfddc034 | |||
373d25b0ce | |||
deb1b00416 | |||
6b80e9e8d2 | |||
a19b00fd2f | |||
8f2c9e9452 | |||
5463a84c12 | |||
68e1937a5c | |||
d05c34b73c | |||
c69777d8cc | |||
b3b9e72b01 | |||
7f57e8377a | |||
036ab78828 | |||
e0f1a93d6e | |||
eba189e2b9 | |||
5748ed84a2 | |||
9eb0d50f4c | |||
24c5c10a31 | |||
c91f712363 | |||
f6c9263940 | |||
ba87258a3d | |||
011c9fa45c | |||
2c7ca33bf1 | |||
2ece53fa38 | |||
36ec7bc818 | |||
b4450bbee5 | |||
c92145ee88 | |||
3fbf65103a | |||
e7858b4cd7 | |||
ad495cef13 | |||
17fb06f7bb | |||
7d3ddf502c | |||
5940b4a6ca | |||
9edf20866b | |||
30495aa34e | |||
45b8383eb9 | |||
56e97a2b60 | |||
9857731dff | |||
915c3d244c | |||
24cdcde968 | |||
cef005317b | |||
1035c35c03 | |||
2210c54d68 | |||
e546c69041 | |||
36268f04d9 | |||
3fe24d8793 | |||
b3a91bc496 | |||
8a529b100c | |||
f1f683dca7 | |||
afb8fb0019 | |||
fb904f6e40 | |||
73858b0fcd | |||
a5bd69ac4a | |||
c6e17539ca | |||
e0b05c0b83 | |||
a44eb16360 | |||
fc429213d3 | |||
80cbaa8217 | |||
170dbcaaa9 | |||
7c1da54412 | |||
c508f17bfe | |||
1cdbfb50ad | |||
579cc83d54 | |||
be7bf671af | |||
e1b9543d10 | |||
af8dea753e | |||
d0d08800ef | |||
dafc10d878 | |||
ad0eafe66a | |||
5ffb38b5bc | |||
b363b16d61 | |||
5522778aed | |||
3a7d291513 | |||
fe603c29f0 | |||
27ba10c8a0 | |||
34f5b3257d | |||
7367f29cb4 | |||
fc5e049e4a | |||
1c2749fdf6 | |||
aa1308e32e | |||
3cde89bc74 | |||
75b6aa192d | |||
43ecf97f99 | |||
4ca564540e | |||
c8d543929a | |||
e7e87ff040 | |||
ab40f426c6 | |||
7ecdf75d0d | |||
e6064af9fb | |||
44a7b62963 | |||
ac1e3a9001 | |||
7e36a19590 | |||
6af5516005 | |||
444e2caa68 | |||
3d932c8a36 | |||
2e63e1316c | |||
b4a77512ae | |||
b40f5e6637 | |||
e0bed163ac | |||
bce3bce586 | |||
f9c9088303 | |||
9bbb0df492 | |||
eafd402ead | |||
cf9cdaa3d6 | |||
a993ba159a | |||
2d75dfe865 | |||
635b681825 | |||
ef1347cb6c | |||
c0334deae1 | |||
39a22813cb | |||
d01d6b06fa | |||
6cb6ef9c84 | |||
b953f285d0 | |||
dc785a4369 | |||
a7de50a4bb | |||
00fd007e7a | |||
b6007e8223 | |||
25a2b11198 | |||
a0923e21ed | |||
f51620c2d7 | |||
1370305fb0 | |||
f7805623b0 | |||
9a34c7931a | |||
b67e6c5269 | |||
5e4d5a2c8f | |||
567044c381 | |||
b2b001c9e4 | |||
793de6d8d2 | |||
d862f23929 | |||
f8809e2663 | |||
19f2be0c96 | |||
6995b182c1 | |||
79f86bfabd | |||
035c54350e | |||
d0a61ef581 | |||
123215a53c | |||
9b68c0678a | |||
e0fa5227d6 | |||
441ab14d3b | |||
ed6e28c1d4 | |||
77f0e526bf | |||
30ce0d9f1b | |||
8920a05bba | |||
061da07af8 | |||
da757b6c62 | |||
880b83a10b | |||
76c1c78b5b | |||
afe19411b2 | |||
b2aff10e46 | |||
4e1123730c | |||
8e3a5e6d58 | |||
beb975bdbf | |||
302b759fc8 | |||
c6e8a356ee | |||
b12025093b | |||
de1f1eef8d | |||
25d4b6aea3 | |||
f9fd83b42e | |||
1e6ba05ec9 | |||
dd7529b42c | |||
cfb36025b5 | |||
f5cabb4bea | |||
58209dfb37 | |||
a29f8d0651 | |||
f600a96657 | |||
d8c8e72745 | |||
9a34213992 | |||
67d4c5ccad | |||
6b794d4a9d | |||
ca3e8582e3 | |||
7669ab02f6 | |||
c6f8749242 | |||
6ee7930a46 | |||
f2c5a2b85b | |||
37151d361f | |||
974e8882b9 | |||
9b9f0d0e27 | |||
0a4a209f94 | |||
603be35426 | |||
92645db291 | |||
00e32aca97 | |||
dad00a2eb6 | |||
576680eaf9 | |||
7a533c7be5 | |||
4e5ada6ad1 | |||
a9f300bca9 | |||
8fec829c63 | |||
f3fe58809d | |||
c6d16eac7a | |||
d7e53d7a81 | |||
26ee3955b6 | |||
21ffd88bdd | |||
ed19c53552 | |||
133c7d6815 | |||
7cd10e4796 | |||
ecd2d913e4 | |||
53e84a13be | |||
eb55e1f4aa | |||
dc063594de | |||
f26d208c38 | |||
6cc239c66f | |||
6733ef9a79 | |||
7dc4beae63 | |||
de33bb6a1d | |||
7883710bf6 | |||
0071d73e25 | |||
0555e7aa63 | |||
ddda9c9118 | |||
d2b57d29fb | |||
d78ec24679 | |||
e5057d7191 | |||
f10ecbb239 | |||
229b149247 | |||
1f8b9a8cd9 | |||
6000fe43d1 | |||
5a2e35c1bf | |||
62c096d7d3 | |||
f6cb8ab3bb | |||
8da4987895 | |||
38cb60c60b | |||
a87966cde3 | |||
9b252fa919 | |||
760514a1fe | |||
2ca42b7b21 | |||
b65b8a1cf0 | |||
e96eaa6174 | |||
2a74d2229f | |||
3f5bae615b | |||
96854aefa7 | |||
697f63f2e9 | |||
98a1d2b3da | |||
2c541f338c | |||
9dccde4567 | |||
47408443f7 | |||
f673e641f3 | |||
1f44f5f481 | |||
94d4380f39 | |||
5adc7021e4 | |||
14db579540 | |||
3aebbd7173 | |||
1c5b8670d9 | |||
768880fa92 | |||
114a6fe19d | |||
0d3e657e1a | |||
880ec0572f | |||
eba3f39d88 | |||
58ed3067ed | |||
fce58de726 | |||
3677bc15ad | |||
27d8cde394 | |||
3ba923e4c0 | |||
07b1f0ea87 | |||
769485ce29 | |||
1d6becf3b5 | |||
761e1f6fe1 | |||
b34557b839 | |||
a265189efa | |||
4101eea5e8 | |||
b57c752b1c | |||
82a739a95e | |||
0a66780727 | |||
cb92e45712 | |||
28b04878ce | |||
a5df31570e | |||
ed1b2914be | |||
41214cc461 | |||
c371684e5e | |||
c1866f8156 | |||
0939c54048 | |||
d9e2166e97 | |||
17d5e7f0ca | |||
564a5484f7 | |||
8a732c7e14 | |||
998208ef20 | |||
a2082bac93 | |||
3dacc60073 | |||
a5dc3fe777 | |||
5c55eae9a6 | |||
63aef3bcee | |||
deeb2f3cf9 | |||
59098d703e | |||
662289eb28 | |||
392b7d9fdf | |||
db9fcc28d6 | |||
63d4d6591b | |||
9ef9e3755a | |||
b8ddd281aa | |||
363d95f68c | |||
da6b71a677 | |||
c9765e50c8 | |||
cd7f15f112 | |||
4fb001ce50 | |||
e49365755d | |||
9baab16682 | |||
dfcd83ffa3 | |||
8238741f39 | |||
a595557e2d | |||
070d8177c5 | |||
9eb3cd1793 | |||
2f6fe9fac4 | |||
3bf5fb612f | |||
62b28e7033 | |||
860a4ca50e | |||
26a0767737 | |||
4eccad2c27 | |||
3966f79324 | |||
38305fdd4f | |||
9c2f98e1eb | |||
971c5ffbb5 | |||
c1edaa83bd | |||
795e23dd09 | |||
93ff6d5c67 | |||
0dc594f5e1 | |||
fad03b546a | |||
39f4a2bc13 | |||
3cb91fec58 | |||
8276223e68 | |||
2da45cfd1c | |||
82b0128308 | |||
550c505813 | |||
d50d6b0334 | |||
f2d21c410b | |||
ec51566abe |
@ -43,7 +43,6 @@ CForward::CForward(const char *name, ForwardExecType et, int numParams, const Fo
|
||||
|
||||
// find funcs
|
||||
int func;
|
||||
AMXForward *tmp = NULL;
|
||||
m_Funcs.clear();
|
||||
|
||||
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
|
||||
@ -56,6 +55,8 @@ CForward::CForward(const char *name, ForwardExecType et, int numParams, const Fo
|
||||
m_Funcs.push_back(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
m_Name.assign(name);
|
||||
}
|
||||
|
||||
cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
@ -67,8 +68,6 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
|
||||
cell globRetVal = 0;
|
||||
|
||||
unsigned int id = 0;
|
||||
|
||||
AMXForwardList::iterator iter;
|
||||
|
||||
for (iter = m_Funcs.begin(); iter != m_Funcs.end(); iter++)
|
||||
@ -83,7 +82,7 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
pDebugger->BeginExec();
|
||||
|
||||
// handle strings & arrays
|
||||
int i, ax = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < m_NumParams; ++i)
|
||||
{
|
||||
@ -210,12 +209,16 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
|
||||
void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
||||
{
|
||||
char name[sNAMEMAX];
|
||||
m_Func = func;
|
||||
m_Amx = amx;
|
||||
m_NumParams = numParams;
|
||||
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
||||
m_HasFunc = true;
|
||||
isFree = false;
|
||||
name[0] = '\0';
|
||||
amx_GetPublic(amx, func, name);
|
||||
m_Name.assign(name);
|
||||
}
|
||||
|
||||
void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
||||
@ -225,6 +228,7 @@ void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const Forwar
|
||||
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
||||
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
|
||||
isFree = false;
|
||||
m_Name.assign(funcName);
|
||||
}
|
||||
|
||||
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
@ -445,6 +449,24 @@ cell CForwardMngr::executeForwards(int id, cell *params)
|
||||
return retVal;
|
||||
}
|
||||
|
||||
const char *CForwardMngr::getFuncName(int id) const
|
||||
{
|
||||
if (!isIdValid(id))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return (id & 1) ? m_SPForwards[id >> 1]->getFuncName() : m_Forwards[id >> 1]->getFuncName();
|
||||
}
|
||||
|
||||
int CForwardMngr::getFuncsNum(int id) const
|
||||
{
|
||||
if (!isIdValid(id))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return (id & 1) ? m_SPForwards[id >> 1]->getFuncsNum() : m_Forwards[id >> 1]->getFuncsNum();
|
||||
}
|
||||
|
||||
int CForwardMngr::getParamsNum(int id) const
|
||||
{
|
||||
return (id & 1) ? m_SPForwards[id >> 1]->getParamsNum() : m_Forwards[id >> 1]->getParamsNum();
|
||||
@ -452,6 +474,10 @@ int CForwardMngr::getParamsNum(int id) const
|
||||
|
||||
ForwardParam CForwardMngr::getParamType(int id, int paramNum) const
|
||||
{
|
||||
if (!isIdValid(id))
|
||||
{
|
||||
return FP_DONE;
|
||||
}
|
||||
return (id & 1) ? m_SPForwards[id >> 1]->getParamType(paramNum) : m_Forwards[id >> 1]->getParamType(paramNum);
|
||||
}
|
||||
|
||||
|
@ -93,6 +93,7 @@ class CForward
|
||||
const char *m_FuncName;
|
||||
ForwardExecType m_ExecType;
|
||||
int m_NumParams;
|
||||
String m_Name;
|
||||
|
||||
struct AMXForward
|
||||
{
|
||||
@ -120,6 +121,11 @@ public:
|
||||
{
|
||||
return m_Funcs.size();
|
||||
}
|
||||
|
||||
const char *getFuncName() const
|
||||
{
|
||||
return m_Name.c_str();
|
||||
}
|
||||
|
||||
ForwardParam getParamType(int paramId) const
|
||||
{
|
||||
@ -141,6 +147,7 @@ class CSPForward
|
||||
|
||||
int m_Func;
|
||||
bool m_HasFunc;
|
||||
String m_Name;
|
||||
|
||||
public:
|
||||
bool isFree;
|
||||
@ -160,6 +167,11 @@ public:
|
||||
{
|
||||
return (m_HasFunc) ? 1 : 0;
|
||||
}
|
||||
|
||||
const char *getFuncName() const
|
||||
{
|
||||
return m_Name.c_str();
|
||||
}
|
||||
|
||||
ForwardParam getParamType(int paramId) const
|
||||
{
|
||||
@ -207,6 +219,7 @@ public:
|
||||
bool isSPForward(int id) const; // check whether forward is single plugin
|
||||
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
|
||||
const char *getFuncName(int id) const; // get the function name
|
||||
|
||||
ForwardParam getParamType(int id, int paramId) const;
|
||||
cell prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type, bool copyBack); // prepare array
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "amxmodx.h"
|
||||
#include "CLang.h"
|
||||
#include "format.h"
|
||||
#include "amxmod_compat.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#define _snprintf snprintf
|
||||
@ -65,7 +66,10 @@ int HashFunction<String>(const String &k)
|
||||
unsigned long hash = 5381;
|
||||
register const char *str = k.c_str();
|
||||
register char c;
|
||||
while (c = *str++) hash = ((hash << 5) + hash) + c; // hash*33 + c
|
||||
while ((c = *str++))
|
||||
{
|
||||
hash = ((hash << 5) + hash) + c; // hash*33 + c
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
@ -75,7 +79,10 @@ int HashAlt<const char *>(char const * const &k)
|
||||
unsigned long hash = 5381;
|
||||
register const char *str = k;
|
||||
register char c;
|
||||
while (c = *str++) hash = ((hash << 5) + hash) + c; // hash*33 + c
|
||||
while ((c = *str++))
|
||||
{
|
||||
hash = ((hash << 5) + hash) + c; // hash*33 + c
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
@ -250,9 +257,9 @@ int CLangMngr::GetKeyEntry(const char *key)
|
||||
return val.index;
|
||||
}
|
||||
|
||||
int CLangMngr::AddKeyEntry(String &key)
|
||||
int CLangMngr::AddKeyEntry(const char *key)
|
||||
{
|
||||
keytbl_val val;
|
||||
keytbl_val val;
|
||||
val.index = static_cast<int>(KeyList.size());
|
||||
|
||||
String *pString = new String(key);
|
||||
@ -263,6 +270,11 @@ int CLangMngr::AddKeyEntry(String &key)
|
||||
return val.index;
|
||||
}
|
||||
|
||||
int CLangMngr::AddKeyEntry(String &key)
|
||||
{
|
||||
return AddKeyEntry(key.c_str());
|
||||
}
|
||||
|
||||
int CLangMngr::GetKeyEntry(String &key)
|
||||
{
|
||||
keytbl_val &val = KeyTable[key];
|
||||
@ -276,7 +288,23 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
|
||||
static char outbuf[4096];
|
||||
cell *addr = get_amxaddr(amx, params[parm++]);
|
||||
|
||||
len = atcprintf(outbuf, sizeof(outbuf)-1, addr, amx, params, &parm);
|
||||
if (amx->flags & AMX_FLAG_OLDFILE)
|
||||
{
|
||||
if (*addr & BCOMPAT_TRANSLATE_BITS)
|
||||
{
|
||||
const char *key, *def;
|
||||
if (!translate_bcompat(amx, addr, &key, &def))
|
||||
{
|
||||
goto normal_string;
|
||||
}
|
||||
len = atcprintf(outbuf, sizeof(outbuf)-1, def, amx, params, &parm);
|
||||
} else {
|
||||
goto normal_string;
|
||||
}
|
||||
} else {
|
||||
normal_string:
|
||||
len = atcprintf(outbuf, sizeof(outbuf)-1, addr, amx, params, &parm);
|
||||
}
|
||||
|
||||
return outbuf;
|
||||
}
|
||||
@ -353,7 +381,7 @@ int CLangMngr::MergeDefinitionFile(const char *file)
|
||||
CQueue<sKeyDef> Defq;
|
||||
String buf;
|
||||
char language[3];
|
||||
sKeyDef tmpEntry;
|
||||
sKeyDef tmpEntry = {NULL, 0};
|
||||
|
||||
while (!feof(fp))
|
||||
{
|
||||
@ -570,7 +598,7 @@ bool CLangMngr::LangExists(const char *langName)
|
||||
char buf[3] = {0};
|
||||
int i = 0;
|
||||
|
||||
while (buf[i] = tolower(*langName++))
|
||||
while ((buf[i] = tolower(*langName++)))
|
||||
{
|
||||
if (++i == 2)
|
||||
break;
|
||||
|
@ -127,9 +127,11 @@ class CLangMngr
|
||||
public:
|
||||
void AddEntry(int key, const char *definition);
|
||||
};
|
||||
|
||||
public:
|
||||
// Merge definitions into a language
|
||||
void MergeDefinitions(const char *lang, CQueue <sKeyDef> &tmpVec);
|
||||
|
||||
private:
|
||||
// strip lowercase; make lower if needed
|
||||
static size_t strip(char *str, char *newstr, bool makelower = false);
|
||||
|
||||
@ -160,11 +162,11 @@ public:
|
||||
// Get index
|
||||
int GetKeyEntry(String &key);
|
||||
int GetKeyEntry(const char *key);
|
||||
int GetKeyIndex(const char *key);
|
||||
// Get key from index
|
||||
const char *GetKey(int key);
|
||||
// Add key
|
||||
int AddKeyEntry(String &key);
|
||||
int AddKeyEntry(const char *key);
|
||||
|
||||
// Get the number of languages
|
||||
int GetLangsNum();
|
||||
|
@ -40,7 +40,8 @@ void CPlayer::Init(edict_t* e, int i)
|
||||
pEdict = e;
|
||||
initialized = false;
|
||||
ingame = false;
|
||||
bot = false;
|
||||
bot_value = false;
|
||||
bot_cached = false;
|
||||
authorized = false;
|
||||
|
||||
current = 0;
|
||||
@ -88,7 +89,8 @@ void CPlayer::Disconnect()
|
||||
}
|
||||
queries.clear();
|
||||
|
||||
bot = 0;
|
||||
bot_value = false;
|
||||
bot_cached = false;
|
||||
menu = 0;
|
||||
newmenu = -1;
|
||||
}
|
||||
@ -114,10 +116,11 @@ int CPlayer::NextHUDChannel()
|
||||
|
||||
bool CPlayer::Connect(const char* connectname, const char* ipaddress)
|
||||
{
|
||||
bot_value = false;
|
||||
bot_cached = false;
|
||||
name.assign(connectname);
|
||||
ip.assign(ipaddress);
|
||||
time = gpGlobals->time;
|
||||
bot = IsBot();
|
||||
death_killer = 0;
|
||||
menu = 0;
|
||||
newmenu = -1;
|
||||
|
@ -58,6 +58,7 @@ public:
|
||||
inline const char* getPluginName() { return plugin.c_str(); }
|
||||
inline const char* getName() { return name.c_str(); }
|
||||
inline bool operator == (const char* string) { return (strcmp(name.c_str(), string) == 0); }
|
||||
int plugin_id;
|
||||
};
|
||||
|
||||
// *****************************************************
|
||||
@ -83,7 +84,8 @@ public:
|
||||
|
||||
bool initialized;
|
||||
bool ingame;
|
||||
bool bot;
|
||||
bool bot_cached;
|
||||
bool bot_value;
|
||||
bool authorized;
|
||||
bool vgui;
|
||||
|
||||
@ -131,7 +133,24 @@ public:
|
||||
|
||||
inline bool IsBot()
|
||||
{
|
||||
return ((pEdict->v.flags & FL_FAKECLIENT) ? true : false);
|
||||
if (!bot_cached)
|
||||
{
|
||||
bot_value = false;
|
||||
if (pEdict->v.flags & FL_FAKECLIENT)
|
||||
{
|
||||
bot_value = true;
|
||||
bot_cached = true;
|
||||
} else {
|
||||
const char *auth = GETPLAYERAUTHID(pEdict);
|
||||
if (auth && (strcmp(auth, "BOT") == 0))
|
||||
{
|
||||
bot_value = true;
|
||||
bot_cached = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return bot_value;
|
||||
}
|
||||
|
||||
inline bool IsAlive()
|
||||
|
@ -30,6 +30,7 @@
|
||||
*/
|
||||
|
||||
#include "amxmodx.h"
|
||||
#include "libraries.h"
|
||||
|
||||
#ifndef FAR
|
||||
#define FAR
|
||||
@ -41,6 +42,8 @@ typedef int (FAR *QUERYMOD_NEW)(int * /*ifvers*/, amxx_module_info_s * /*modInfo
|
||||
typedef int (FAR *ATTACHMOD_NEW)(PFN_REQ_FNPTR /*reqFnptrFunc*/);
|
||||
typedef int (FAR *DETACHMOD_NEW)(void);
|
||||
typedef void (FAR *PLUGINSLOADED_NEW)(void);
|
||||
typedef void (*PLUGINSUNLOADED_NEW)(void);
|
||||
typedef void (*PLUGINSUNLOADING_NEW)(void);
|
||||
|
||||
// *****************************************************
|
||||
// class CModule
|
||||
@ -79,7 +82,14 @@ void CModule::clear(bool clearFilename)
|
||||
m_InfoNew.reload = 0;
|
||||
m_MissingFunc = NULL;
|
||||
|
||||
for (size_t i=0; i<m_DestroyableIndexes.size(); i++)
|
||||
{
|
||||
delete [] m_Natives[m_DestroyableIndexes[i]];
|
||||
}
|
||||
|
||||
m_DestroyableIndexes.clear();
|
||||
m_Natives.clear();
|
||||
m_NewNatives.clear();
|
||||
}
|
||||
|
||||
bool CModule::attachMetamod(const char *mmfile, PLUG_LOADTIME now)
|
||||
@ -102,6 +112,53 @@ bool CModule::attachMetamod(const char *mmfile, PLUG_LOADTIME now)
|
||||
return true;
|
||||
}
|
||||
|
||||
//this ugly function is ultimately something like O(n^4).
|
||||
//sigh. it shouldn't be needed.
|
||||
void CModule::rewriteNativeLists(AMX_NATIVE_INFO *list)
|
||||
{
|
||||
AMX_NATIVE_INFO *curlist;
|
||||
for (size_t i=0; i<m_Natives.size(); i++)
|
||||
{
|
||||
curlist = m_Natives[i];
|
||||
bool changed = false;
|
||||
bool found = false;
|
||||
CVector<size_t> newlist;
|
||||
for (size_t j=0; curlist[j].func != NULL; j++)
|
||||
{
|
||||
found = false;
|
||||
for (size_t k=0; list[k].func != NULL; k++)
|
||||
{
|
||||
if (strcmp(curlist[j].name, list[k].name) == 0)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found)
|
||||
{
|
||||
changed = true;
|
||||
//don't break, we have to search it all
|
||||
} else {
|
||||
newlist.push_back(j);
|
||||
}
|
||||
}
|
||||
if (changed)
|
||||
{
|
||||
//now build the new list
|
||||
AMX_NATIVE_INFO *rlist = new AMX_NATIVE_INFO[newlist.size()+1];
|
||||
for (size_t j=0; j<newlist.size(); j++)
|
||||
{
|
||||
rlist[j].func = curlist[newlist[j]].func;
|
||||
rlist[j].name = curlist[newlist[j]].name;
|
||||
}
|
||||
rlist[newlist.size()].func = NULL;
|
||||
rlist[newlist.size()].name = NULL;
|
||||
m_Natives[i] = rlist;
|
||||
m_DestroyableIndexes.push_back(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CModule::attachModule()
|
||||
{
|
||||
// old & new
|
||||
@ -126,7 +183,7 @@ bool CModule::attachModule()
|
||||
{
|
||||
case AMXX_OK:
|
||||
m_Status = MODULE_LOADED;
|
||||
return true;
|
||||
break;
|
||||
case AMXX_PARAM:
|
||||
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
|
||||
m_Status = MODULE_INTERROR;
|
||||
@ -144,6 +201,13 @@ bool CModule::attachModule()
|
||||
m_Status = MODULE_BADLOAD;
|
||||
}
|
||||
|
||||
if (m_Status == MODULE_LOADED)
|
||||
{
|
||||
AddLibrariesFromString(m_InfoNew.library, LibType_Library, LibSource_Module, this);
|
||||
AddLibrariesFromString(m_InfoNew.libclass, LibType_Class, LibSource_Module, this);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -184,10 +248,36 @@ bool CModule::queryModule()
|
||||
return false;
|
||||
case AMXX_IFVERS:
|
||||
if (ifVers < AMXX_INTERFACE_VERSION)
|
||||
m_Status = MODULE_OLD;
|
||||
else
|
||||
{
|
||||
//backwards compat for new defs
|
||||
if (ifVers == 3)
|
||||
{
|
||||
g_ModuleCallReason = ModuleCall_Query;
|
||||
g_CurrentlyCalledModule = this;
|
||||
retVal = (*queryFunc_New)(&ifVers, &m_InfoNew);
|
||||
g_CurrentlyCalledModule = NULL;
|
||||
g_ModuleCallReason = ModuleCall_NotCalled;
|
||||
if (retVal == AMXX_OK)
|
||||
{
|
||||
m_InfoNew.library = m_InfoNew.logtag;
|
||||
if (StrCaseStr(m_InfoNew.library, "sql")
|
||||
|| StrCaseStr(m_InfoNew.library, "dbi"))
|
||||
{
|
||||
m_InfoNew.libclass = "DBI";
|
||||
} else {
|
||||
m_InfoNew.libclass = "";
|
||||
}
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
m_Status = MODULE_OLD;
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
m_Status = MODULE_NEWER;
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
case AMXX_OK:
|
||||
break;
|
||||
default:
|
||||
@ -217,6 +307,8 @@ bool CModule::detachModule()
|
||||
if (m_Status != MODULE_LOADED)
|
||||
return false;
|
||||
|
||||
RemoveLibraries(this);
|
||||
|
||||
if (m_Amxx)
|
||||
{
|
||||
DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
|
||||
@ -244,6 +336,38 @@ bool CModule::detachModule()
|
||||
return true;
|
||||
}
|
||||
|
||||
void CModule::CallPluginsUnloaded()
|
||||
{
|
||||
if (m_Status != MODULE_LOADED)
|
||||
return;
|
||||
|
||||
if (!m_Handle)
|
||||
return;
|
||||
|
||||
PLUGINSUNLOADED_NEW func = (PLUGINSUNLOADED_NEW)DLPROC(m_Handle, "AMXX_PluginsUnloaded");
|
||||
|
||||
if (!func)
|
||||
return;
|
||||
|
||||
func();
|
||||
}
|
||||
|
||||
void CModule::CallPluginsUnloading()
|
||||
{
|
||||
if (m_Status != MODULE_LOADED)
|
||||
return;
|
||||
|
||||
if (!m_Handle)
|
||||
return;
|
||||
|
||||
PLUGINSUNLOADING_NEW func = (PLUGINSUNLOADING_NEW)DLPROC(m_Handle, "AMXX_PluginsUnloading");
|
||||
|
||||
if (!func)
|
||||
return;
|
||||
|
||||
func();
|
||||
}
|
||||
|
||||
void CModule::CallPluginsLoaded()
|
||||
{
|
||||
if (m_Status != MODULE_LOADED)
|
||||
|
@ -59,6 +59,8 @@ struct amxx_module_info_s
|
||||
const char *version;
|
||||
int reload; // reload on mapchange when nonzero
|
||||
const char *logtag; //added in version 2
|
||||
const char *library; // added in version 4
|
||||
const char *libclass; // added in version 4
|
||||
};
|
||||
|
||||
#define AMXX_OK 0 /* no error */
|
||||
@ -66,7 +68,7 @@ struct amxx_module_info_s
|
||||
#define AMXX_PARAM 2 /* Invalid parameter */
|
||||
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
|
||||
|
||||
#define AMXX_INTERFACE_VERSION 3
|
||||
#define AMXX_INTERFACE_VERSION 4
|
||||
|
||||
class CModule
|
||||
{
|
||||
@ -90,6 +92,7 @@ public:
|
||||
bool attachModule();
|
||||
bool queryModule();
|
||||
bool detachModule();
|
||||
void rewriteNativeLists(AMX_NATIVE_INFO *list);
|
||||
|
||||
#ifndef FAKEMETA
|
||||
bool attachMetamod(const char *mmfile, PLUG_LOADTIME now);
|
||||
@ -110,8 +113,12 @@ public:
|
||||
inline bool IsMetamod() { return m_Metamod; }
|
||||
|
||||
void CallPluginsLoaded();
|
||||
void CallPluginsUnloaded();
|
||||
void CallPluginsUnloading();
|
||||
|
||||
CList<AMX_NATIVE_INFO*> m_Natives;
|
||||
CVector<AMX_NATIVE_INFO*> m_Natives;
|
||||
CVector<AMX_NATIVE_INFO*> m_NewNatives; // Natives for new (AMXX, not AMX) plugins only
|
||||
CVector<size_t> m_DestroyableIndexes;
|
||||
};
|
||||
|
||||
#endif //CMODULE_H
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "amx.h"
|
||||
#include "natives.h"
|
||||
#include "debugger.h"
|
||||
#include "libraries.h"
|
||||
|
||||
extern const char *no_function;
|
||||
|
||||
@ -80,14 +81,17 @@ void CPluginMngr::Finalize()
|
||||
m_Finalized = true;
|
||||
}
|
||||
|
||||
int CPluginMngr::loadPluginsFromFile(const char* filename)
|
||||
int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
|
||||
{
|
||||
char file[256];
|
||||
FILE *fp = fopen(build_pathname_r(file, sizeof(file) - 1, "%s", filename), "rt");
|
||||
|
||||
if (!fp)
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] Plugins list not found (file \"%s\")", filename);
|
||||
if (warn)
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] Plugins list not found (file \"%s\")", filename);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -98,6 +102,8 @@ int CPluginMngr::loadPluginsFromFile(const char* filename)
|
||||
|
||||
String line;
|
||||
|
||||
List<String *>::iterator block_iter;
|
||||
|
||||
while (!feof(fp))
|
||||
{
|
||||
pluginName[0] = '\0';
|
||||
@ -107,16 +113,46 @@ int CPluginMngr::loadPluginsFromFile(const char* filename)
|
||||
|
||||
line.clear();
|
||||
line._fread(fp);
|
||||
/** quick hack */
|
||||
char *ptr = const_cast<char *>(line.c_str());
|
||||
while (*ptr)
|
||||
{
|
||||
if (*ptr == ';')
|
||||
{
|
||||
*ptr = '\0';
|
||||
} else {
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
sscanf(line.c_str(), "%s %s", pluginName, debug);
|
||||
|
||||
if (!isalnum(*pluginName))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isalnum(*debug) && strcmp(debug, "debug") == 0)
|
||||
if (isalnum(*debug) && !strcmp(debug, "debug"))
|
||||
{
|
||||
debugFlag = 1;
|
||||
}
|
||||
|
||||
bool skip = false;
|
||||
for (block_iter = m_BlockList.begin();
|
||||
block_iter != m_BlockList.end();
|
||||
block_iter++)
|
||||
{
|
||||
if ((*block_iter)->compare(pluginName) == 0)
|
||||
{
|
||||
skip = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (skip || !strcmp(debug, "disabled"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, debugFlag);
|
||||
|
||||
if (plugin->getStatusCode() == ps_bad_load)
|
||||
@ -147,6 +183,14 @@ void CPluginMngr::clear()
|
||||
delete [] pNatives;
|
||||
pNatives = NULL;
|
||||
}
|
||||
|
||||
List<String *>::iterator iter = m_BlockList.begin();
|
||||
while (iter != m_BlockList.end())
|
||||
{
|
||||
delete (*iter);
|
||||
iter = m_BlockList.erase(iter);
|
||||
}
|
||||
m_BlockList.clear();
|
||||
}
|
||||
|
||||
CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx)
|
||||
@ -238,8 +282,8 @@ CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, int
|
||||
|
||||
if (status == ps_running)
|
||||
{
|
||||
m_PauseFwd = registerSPForwardByName(&amx, "plugin_pause");
|
||||
m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause");
|
||||
m_PauseFwd = registerSPForwardByName(&amx, "plugin_pause", FP_DONE);
|
||||
m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause", FP_DONE);
|
||||
|
||||
if (amx.flags & AMX_FLAG_DEBUG)
|
||||
{
|
||||
@ -383,3 +427,274 @@ void CPluginMngr::CPlugin::unpausePlugin()
|
||||
executeForwards(m_UnpauseFwd);
|
||||
}
|
||||
}
|
||||
|
||||
char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
|
||||
{
|
||||
List<plcache_entry *>::iterator iter;
|
||||
plcache_entry *pl;
|
||||
|
||||
for (iter=m_plcache.begin(); iter!=m_plcache.end(); iter++)
|
||||
{
|
||||
pl = (*iter);
|
||||
if (pl->path.compare(file) == 0)
|
||||
{
|
||||
bufsize = pl->bufsize;
|
||||
return pl->buffer;
|
||||
}
|
||||
}
|
||||
|
||||
pl = new plcache_entry;
|
||||
|
||||
pl->file = new CAmxxReader(file, sizeof(cell));
|
||||
pl->buffer = NULL;
|
||||
if (pl->file->GetStatus() != CAmxxReader::Err_None ||
|
||||
pl->file->IsOldFile())
|
||||
{
|
||||
delete pl->file;
|
||||
delete pl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pl->bufsize = pl->file->GetBufferSize();
|
||||
if (pl->bufsize)
|
||||
{
|
||||
pl->buffer = new char[pl->bufsize];
|
||||
pl->file->GetSection(pl->buffer);
|
||||
}
|
||||
|
||||
if (!pl->buffer || pl->file->GetStatus() != CAmxxReader::Err_None)
|
||||
{
|
||||
delete [] pl->buffer;
|
||||
delete pl->file;
|
||||
delete pl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pl->path.assign(file);
|
||||
|
||||
bufsize = pl->bufsize;
|
||||
|
||||
m_plcache.push_back(pl);
|
||||
|
||||
return pl->buffer;
|
||||
}
|
||||
|
||||
void CPluginMngr::InvalidateCache()
|
||||
{
|
||||
List<plcache_entry *>::iterator iter;
|
||||
plcache_entry *pl;
|
||||
|
||||
for (iter=m_plcache.begin(); iter!=m_plcache.end(); iter++)
|
||||
{
|
||||
pl = (*iter);
|
||||
delete [] pl->buffer;
|
||||
delete pl->file;
|
||||
delete pl;
|
||||
}
|
||||
|
||||
m_plcache.clear();
|
||||
}
|
||||
|
||||
void CPluginMngr::InvalidateFileInCache(const char *file, bool freebuf)
|
||||
{
|
||||
List<plcache_entry *>::iterator iter;
|
||||
plcache_entry *pl;
|
||||
|
||||
for (iter=m_plcache.begin(); iter!=m_plcache.end(); iter++)
|
||||
{
|
||||
pl = (*iter);
|
||||
if (pl->path.compare(file) == 0)
|
||||
{
|
||||
if (freebuf)
|
||||
delete [] pl->buffer;
|
||||
delete pl->file;
|
||||
delete pl;
|
||||
m_plcache.erase(iter);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CPluginMngr::CacheAndLoadModules(const char *plugin)
|
||||
{
|
||||
size_t progsize;
|
||||
char *prog = ReadIntoOrFromCache(plugin, progsize);
|
||||
|
||||
if (!prog)
|
||||
return;
|
||||
|
||||
AMX_HEADER hdr;
|
||||
memcpy(&hdr, prog, sizeof(AMX_HEADER));
|
||||
|
||||
uint16_t magic = hdr.magic;
|
||||
amx_Align16(&magic);
|
||||
|
||||
if (magic != AMX_MAGIC)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (hdr.file_version < MIN_FILE_VERSION ||
|
||||
hdr.file_version > CUR_FILE_VERSION)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ((hdr.defsize != sizeof(AMX_FUNCSTUB)) &&
|
||||
(hdr.defsize != sizeof(AMX_FUNCSTUBNT)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
amx_Align32((uint32_t*)&hdr.nametable);
|
||||
uint16_t *namelength=(uint16_t*)((unsigned char*)prog + (unsigned)hdr.nametable);
|
||||
amx_Align16(namelength);
|
||||
if (*namelength>sNAMEMAX)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (hdr.stp <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AMX amx;
|
||||
memset(&amx, 0, sizeof(AMX));
|
||||
amx.base = (unsigned char *)prog;
|
||||
|
||||
int num;
|
||||
char name[sNAMEMAX+1];
|
||||
|
||||
num = amx_GetLibraries(&amx);
|
||||
for (int i=0; i<num; i++)
|
||||
{
|
||||
amx_GetLibrary(&amx, i, name, sNAMEMAX);
|
||||
if (stricmp(name, "Float")==0)
|
||||
continue;
|
||||
//awful backwards compat hack
|
||||
if (stricmp(name, "socket")==0)
|
||||
strcpy(name, "sockets");
|
||||
//we don't want to report failed modules here...
|
||||
LoadModule(name, PT_ANYTIME, true, true);
|
||||
}
|
||||
|
||||
cell tag_id;
|
||||
amx_NumTags(&amx, &num);
|
||||
|
||||
CVector<LibDecoder *> expects;
|
||||
CVector<LibDecoder *> defaults;
|
||||
CStack<LibDecoder *> delstack;
|
||||
for (int i=0; i<num; i++)
|
||||
{
|
||||
amx_GetTag(&amx, i, name, &tag_id);
|
||||
if (name[0] == '?')
|
||||
{
|
||||
LibDecoder *dc = new LibDecoder;
|
||||
delstack.push(dc);
|
||||
if (DecodeLibCmdString(name, dc))
|
||||
{
|
||||
if (dc->cmd == LibCmd_ForceLib)
|
||||
{
|
||||
RunLibCommand(dc);
|
||||
} else if ( (dc->cmd == LibCmd_ExpectClass) ||
|
||||
(dc->cmd == LibCmd_ExpectLib) )
|
||||
{
|
||||
expects.push_back(dc);
|
||||
} else if (dc->cmd == LibCmd_DefaultLib) {
|
||||
defaults.push_back(dc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t i=0; i<expects.size(); i++)
|
||||
{
|
||||
RunLibCommand(expects[i]);
|
||||
}
|
||||
for (size_t i=0; i<defaults.size(); i++)
|
||||
{
|
||||
RunLibCommand(defaults[i]);
|
||||
}
|
||||
|
||||
expects.clear();
|
||||
defaults.clear();
|
||||
|
||||
while (!delstack.empty())
|
||||
{
|
||||
delete delstack.front();
|
||||
delstack.pop();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void CPluginMngr::CALMFromFile(const char *file)
|
||||
{
|
||||
char filename[256];
|
||||
FILE *fp = fopen(build_pathname_r(filename, sizeof(filename) - 1, "%s", file), "rt");
|
||||
|
||||
if (!fp)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Find now folder
|
||||
char pluginName[256];
|
||||
char line[256];
|
||||
String rline;
|
||||
|
||||
while (!feof(fp))
|
||||
{
|
||||
fgets(line, sizeof(line)-1, fp);
|
||||
if (line[0] == ';' || line[0] == '\n' || line[0] == '\0')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/** quick hack */
|
||||
char *ptr = line;
|
||||
while (*ptr)
|
||||
{
|
||||
if (*ptr == ';')
|
||||
{
|
||||
*ptr = '\0';
|
||||
} else {
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
rline.assign(line);
|
||||
rline.trim();
|
||||
pluginName[0] = '\0';
|
||||
sscanf(rline.c_str(), "%s", pluginName);
|
||||
|
||||
/* HACK: see if there's a 'disabled' coming up
|
||||
* new block for scopying flexibility
|
||||
*/
|
||||
if (1)
|
||||
{
|
||||
const char *_ptr = rline.c_str() + strlen(pluginName);
|
||||
while (*_ptr != '\0' && isspace(*_ptr))
|
||||
{
|
||||
_ptr++;
|
||||
}
|
||||
if ((*_ptr != '\0') && !strcmp(_ptr, "disabled"))
|
||||
{
|
||||
String *pString = new String(pluginName);
|
||||
m_BlockList.push_back(pString);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isalnum(*pluginName))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
build_pathname_r(filename, sizeof(filename)-1, "%s/%s", get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins"), pluginName);
|
||||
|
||||
CacheAndLoadModules(filename);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
|
@ -32,6 +32,11 @@
|
||||
#ifndef PLUGIN_H
|
||||
#define PLUGIN_H
|
||||
|
||||
#include "CString.h"
|
||||
#include "sh_list.h"
|
||||
#include "amx.h"
|
||||
#include "amxxfile.h"
|
||||
|
||||
// *****************************************************
|
||||
// class CPluginMngr
|
||||
// *****************************************************
|
||||
@ -111,7 +116,7 @@ private:
|
||||
int pCounter;
|
||||
public:
|
||||
CPluginMngr() { head = 0; pCounter = 0; pNatives = NULL; m_Finalized=false;}
|
||||
~CPluginMngr() { clear(); }
|
||||
~CPluginMngr() { clear(); InvalidateCache(); }
|
||||
|
||||
bool m_Finalized;
|
||||
AMX_NATIVE_INFO *pNatives;
|
||||
@ -120,7 +125,7 @@ public:
|
||||
|
||||
CPlugin* loadPlugin(const char* path, const char* name, char* error, int debug);
|
||||
void unloadPlugin(CPlugin** a);
|
||||
int loadPluginsFromFile(const char* filename);
|
||||
int loadPluginsFromFile(const char* filename, bool warn=true);
|
||||
|
||||
inline CPlugin* findPluginFast(AMX *amx) { return (CPlugin*)(amx->userdata[UD_FINDPLUGIN]); }
|
||||
CPlugin* findPlugin(AMX *amx);
|
||||
@ -145,6 +150,22 @@ public:
|
||||
|
||||
inline iterator begin() const { return iterator(head); }
|
||||
inline iterator end() const { return iterator(0); }
|
||||
public:
|
||||
struct plcache_entry
|
||||
{
|
||||
CAmxxReader *file;
|
||||
size_t bufsize;
|
||||
char *buffer;
|
||||
String path;
|
||||
};
|
||||
char *ReadIntoOrFromCache(const char *file, size_t &bufsize);
|
||||
void InvalidateCache();
|
||||
void InvalidateFileInCache(const char *file, bool freebuf);
|
||||
void CacheAndLoadModules(const char *plugin);
|
||||
void CALMFromFile(const char *file);
|
||||
private:
|
||||
List<plcache_entry *> m_plcache;
|
||||
List<String *> m_BlockList;
|
||||
};
|
||||
|
||||
#endif //PLUGIN_H
|
||||
|
@ -34,16 +34,6 @@
|
||||
|
||||
/*********************** CTask ***********************/
|
||||
|
||||
int CTaskMngr::CTask::getTaskId() const
|
||||
{
|
||||
return m_iId;
|
||||
}
|
||||
|
||||
CPluginMngr::CPlugin *CTaskMngr::CTask::getPlugin() const
|
||||
{
|
||||
return m_pPlugin;
|
||||
}
|
||||
|
||||
void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, cell iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime)
|
||||
{
|
||||
clear();
|
||||
@ -53,6 +43,7 @@ void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags,
|
||||
m_iFunc = iFunc;
|
||||
m_iId = iId;
|
||||
m_fBase = fBase;
|
||||
m_bInExecute = false;
|
||||
|
||||
if (iFlags & 2)
|
||||
{
|
||||
@ -150,6 +141,7 @@ void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, f
|
||||
//only bother calling if we have something to call
|
||||
if (!(m_bLoop && !m_iRepeat))
|
||||
{
|
||||
m_bInExecute = true;
|
||||
if (m_iParamLen) // call with parameters
|
||||
{
|
||||
cell arr = prepareCellArray(m_pParams, m_iParamLen);
|
||||
@ -157,6 +149,7 @@ void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, f
|
||||
} else {
|
||||
executeForwards(m_iFunc, m_iId);
|
||||
}
|
||||
m_bInExecute = false;
|
||||
}
|
||||
|
||||
if (isFree())
|
||||
@ -193,6 +186,7 @@ CTaskMngr::CTask::CTask()
|
||||
m_bLoop = false;
|
||||
m_bAfterStart = false;
|
||||
m_bBeforeEnd = false;
|
||||
m_bInExecute = false;
|
||||
|
||||
m_fNextExecTime = 0.0f;
|
||||
|
||||
|
@ -45,6 +45,7 @@ private:
|
||||
int m_iFunc;
|
||||
int m_iRepeat;
|
||||
|
||||
bool m_bInExecute;
|
||||
bool m_bLoop;
|
||||
bool m_bAfterStart;
|
||||
bool m_bBeforeEnd;
|
||||
@ -61,13 +62,15 @@ private:
|
||||
void clear();
|
||||
bool isFree() const;
|
||||
|
||||
CPluginMngr::CPlugin *getPlugin() const;
|
||||
int getTaskId() const;
|
||||
inline CPluginMngr::CPlugin *getPlugin() const { return m_pPlugin; }
|
||||
inline AMX *getAMX() const { return m_pPlugin->getAMX(); }
|
||||
inline int getTaskId() const { return m_iId; }
|
||||
|
||||
void executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft); // also removes the task if needed
|
||||
|
||||
void changeBase(float fNewBase);
|
||||
void resetNextExecTime(float fCurrentTime);
|
||||
inline bool inExecute() const { return m_bInExecute; }
|
||||
|
||||
bool shouldRepeat();
|
||||
|
||||
@ -92,9 +95,11 @@ private:
|
||||
friend bool operator == (const CTask &left, const CTaskDescriptor &right)
|
||||
{
|
||||
if (right.m_bFree)
|
||||
return left.isFree();
|
||||
return (left.isFree() && !left.inExecute());
|
||||
|
||||
return !left.isFree() && (right.m_pAmx ? left.getPlugin()->getAMX() == right.m_pAmx : true) && left.getTaskId() == right.m_iId;
|
||||
return (!left.isFree()) &&
|
||||
(right.m_pAmx ? left.getAMX() == right.m_pAmx : true) &&
|
||||
(left.getTaskId() == right.m_iId);
|
||||
}
|
||||
};
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,28 +1,38 @@
|
||||
#(C)2004-2005 AMX Mod X Development Team
|
||||
# Makefile written by David "BAILOPAN" Anderson
|
||||
|
||||
HLSDK = ../hlsdk/SourceCode
|
||||
HLSDK = ../../hlsdk
|
||||
MM_ROOT = ../metamod/metamod
|
||||
|
||||
### EDIT BELOW FOR OTHER PROJECTS ###
|
||||
|
||||
OPT_FLAGS = -O2 -funroll-loops -s -fomit-frame-pointer -pipe
|
||||
OPT_FLAGS = -O2 -fno-strict-aliasing -funroll-loops -s -fomit-frame-pointer -pipe
|
||||
DEBUG_FLAGS = -g -ggdb3
|
||||
CPP = gcc
|
||||
NAME = amxmodx_mm
|
||||
CPP = gcc-4.1
|
||||
NAME = amxmodx
|
||||
|
||||
BIN_SUFFIX_32 = mm_i386.so
|
||||
BIN_SUFFIX_64 = mm_amd64.so
|
||||
|
||||
OBJECTS = meta_api.cpp CFile.cpp CVault.cpp vault.cpp float.cpp file.cpp modules.cpp \
|
||||
CMisc.cpp CTask.cpp string.cpp amxmodx.cpp CEvent.cpp CCmd.cpp CLogEvent.cpp \
|
||||
srvcmd.cpp strptime.cpp amxcore.cpp amxtime.cpp power.cpp amxxlog.cpp fakemeta.cpp \
|
||||
amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \
|
||||
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
|
||||
optimizer.cpp format.cpp
|
||||
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp sorting.cpp \
|
||||
amxmod_compat.cpp
|
||||
|
||||
LINK = -lz /lib/libstdc++.a
|
||||
LINK = -lgcc -static-libgcc
|
||||
|
||||
INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \
|
||||
-I$(MM_ROOT) -Lzlib -I$(HLSDK)/common
|
||||
|
||||
GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1)
|
||||
|
||||
ifeq "$(GCC_VERSION)" "4"
|
||||
OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden
|
||||
endif
|
||||
|
||||
ifeq "$(DEBUG)" "true"
|
||||
BIN_DIR = Debug
|
||||
CFLAGS = $(DEBUG_FLAGS)
|
||||
@ -31,22 +41,26 @@ else
|
||||
CFLAGS = $(OPT_FLAGS)
|
||||
endif
|
||||
|
||||
ifeq "$(MMGR)" "true"
|
||||
OBJECTS += mmgr/mmgr.cpp
|
||||
CFLAGS += -DMEMORY_TEST
|
||||
ifeq "$(BINLOG)" "true"
|
||||
NAME := $(NAME)_bl
|
||||
BIN_DIR := $(BIN_DIR)BinLog
|
||||
OBJECTS += binlog.cpp
|
||||
CFLAGS += -DBINLOG_ENABLED
|
||||
endif
|
||||
|
||||
CFLAGS += -DLINUX -DNDEBUG -fPIC -Wno-deprecated -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
|
||||
CFLAGS += -DLINUX -DNDEBUG -DAMX_NOPROPLIST -fPIC -Wall -Werror -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
|
||||
|
||||
ifeq "$(AMD64)" "true"
|
||||
BINARY = $(NAME)_amd64.so
|
||||
CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -DAMD64 -m64
|
||||
BINARY = $(NAME)_$(BIN_SUFFIX_64)
|
||||
CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -DAMD64 -m64
|
||||
LINK += -lz64
|
||||
OBJECTS += JIT/natives-amd64.o
|
||||
else
|
||||
BINARY = $(NAME)_i386.so
|
||||
BINARY = $(NAME)_$(BIN_SUFFIX_32)
|
||||
OBJECTS += JIT/amxexecn.o JIT/amxjitsn.o JIT/natives-x86.o
|
||||
OBJECTS += JIT/helpers-x86.o
|
||||
CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32
|
||||
LINK += -lz
|
||||
OPT_FLAGS += -march=i586
|
||||
endif
|
||||
|
||||
@ -63,23 +77,23 @@ amd64:
|
||||
rm -f zlib/libz.a
|
||||
$(MAKE) all AMD64=true
|
||||
|
||||
amd64_mmgr:
|
||||
rm -f zlib/libz.a
|
||||
$(MAKE) all AMD64=true MMGR=true
|
||||
|
||||
amd64_debug_mmgr:
|
||||
rm -f zlib/libz.a
|
||||
$(MAKE) all AMD64=true DEBUG=true MMGR=true
|
||||
|
||||
amd64_debug:
|
||||
rm -f zlib/libz.a
|
||||
$(MAKE) all AMD64=true DEBUG=true
|
||||
|
||||
mmgr:
|
||||
$(MAKE) all MMGR=true
|
||||
amd64_binlog:
|
||||
rm -f zlib/libz.a
|
||||
$(MAKE) all AMD64=true BINLOG=true
|
||||
|
||||
debug_mmgr:
|
||||
$(MAKE) all MMGR=true DEBUG=true
|
||||
amd64_binlog_debug:
|
||||
rm -f zlib/libz.a
|
||||
$(MAKE) all AMD64=true BINLOG=true DEBUG=true
|
||||
|
||||
binlog:
|
||||
$(MAKE) all BINLOG=true
|
||||
|
||||
binlog_debug:
|
||||
$(MAKE) all BINLOG=true DEBUG=true
|
||||
|
||||
amxmodx: $(OBJ_LINUX)
|
||||
$(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY)
|
||||
@ -91,7 +105,14 @@ default: all
|
||||
|
||||
clean:
|
||||
rm -rf Release/*.o
|
||||
rm -rf Release/$(BINARY)
|
||||
rm -rf Release/$(NAME)_$(BIN_SUFFIX_32)
|
||||
rm -rf Release/$(NAME)_$(BIN_SUFFIX_64)
|
||||
rm -rf ReleaseBinLog/*.o
|
||||
rm -rf ReleaseBinLog/$(NAME)_bl_$(BIN_SUFFIX_32)
|
||||
rm -rf ReleaseBinLog/$(NAME)_bl_$(BIN_SUFFIX_64)
|
||||
rm -rf Debug/*.o
|
||||
rm -rf Debug/$(BINARY)
|
||||
|
||||
rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32)
|
||||
rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64)
|
||||
rm -rf DebugBinLog/*.o
|
||||
rm -rf DebugBinLog/$(NAME)_bl_$(BIN_SUFFIX_32)
|
||||
rm -rf DebugBinLog/$(NAME)_bl_$(BIN_SUFFIX_64)
|
||||
|
172
amxmodx/amx.cpp
172
amxmodx/amx.cpp
@ -22,9 +22,9 @@
|
||||
*/
|
||||
|
||||
#define AMX_NODYNALOAD
|
||||
#define AMX_ANSIONLY
|
||||
#define AMX_ANSIONLY
|
||||
|
||||
#if BUILD_PLATFORM == WINDOWS && BUILD_TYPE == RELEASE && BUILD_COMPILER == MSVC && PAWN_CELL_SIZE == 64
|
||||
#if !defined __linux__ && BUILD_PLATFORM == WINDOWS && BUILD_TYPE == RELEASE && BUILD_COMPILER == MSVC && PAWN_CELL_SIZE == 64
|
||||
/* bad bad workaround but we have to prevent a compiler crash :/ */
|
||||
#pragma optimize("g",off)
|
||||
#endif
|
||||
@ -844,19 +844,6 @@ int AMXAPI amx_Init(AMX *amx, void *program)
|
||||
{
|
||||
AMX_HEADER *hdr;
|
||||
BROWSEHOOK hook = NULL;
|
||||
#if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD
|
||||
char libname[sNAMEMAX+8]; /* +1 for '\0', +3 for 'amx' prefix, +4 for extension */
|
||||
#if defined _Windows
|
||||
typedef int (FAR WINAPI *AMX_ENTRY)(AMX _FAR *amx);
|
||||
HINSTANCE hlib;
|
||||
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
|
||||
typedef int (*AMX_ENTRY)(AMX *amx);
|
||||
void *hlib;
|
||||
#endif
|
||||
int numlibraries,i;
|
||||
AMX_FUNCSTUB *lib;
|
||||
AMX_ENTRY libinit;
|
||||
#endif
|
||||
|
||||
if ((amx->flags & AMX_FLAG_RELOC)!=0)
|
||||
return AMX_ERR_INIT; /* already initialized (may not do so twice) */
|
||||
@ -866,22 +853,6 @@ int AMXAPI amx_Init(AMX *amx, void *program)
|
||||
* multi-byte words
|
||||
*/
|
||||
assert(check_endian());
|
||||
#if BYTE_ORDER==BIG_ENDIAN
|
||||
amx_Align32((uint32_t*)&hdr->size);
|
||||
amx_Align16(&hdr->magic);
|
||||
amx_Align16((uint16_t*)&hdr->flags);
|
||||
amx_Align16((uint16_t*)&hdr->defsize);
|
||||
amx_Align32((uint32_t*)&hdr->cod);
|
||||
amx_Align32((uint32_t*)&hdr->dat);
|
||||
amx_Align32((uint32_t*)&hdr->hea);
|
||||
amx_Align32((uint32_t*)&hdr->stp);
|
||||
amx_Align32((uint32_t*)&hdr->cip);
|
||||
amx_Align32((uint32_t*)&hdr->publics);
|
||||
amx_Align32((uint32_t*)&hdr->natives);
|
||||
amx_Align32((uint32_t*)&hdr->libraries);
|
||||
amx_Align32((uint32_t*)&hdr->pubvars);
|
||||
amx_Align32((uint32_t*)&hdr->tags);
|
||||
#endif
|
||||
|
||||
if (hdr->magic!=AMX_MAGIC)
|
||||
return AMX_ERR_FORMAT;
|
||||
@ -902,13 +873,7 @@ int AMXAPI amx_Init(AMX *amx, void *program)
|
||||
} /* if */
|
||||
if (hdr->stp<=0)
|
||||
return AMX_ERR_FORMAT;
|
||||
#if BYTE_ORDER==BIG_ENDIAN
|
||||
if ((hdr->flags & AMX_FLAG_COMPACT)==0) {
|
||||
ucell *code=(ucell *)((unsigned char *)program+(int)hdr->cod);
|
||||
while (code<(ucell *)((unsigned char *)program+(int)hdr->hea))
|
||||
swapcell(code++);
|
||||
} /* if */
|
||||
#endif
|
||||
|
||||
assert((hdr->flags & AMX_FLAG_COMPACT)!=0 || hdr->hea == hdr->size);
|
||||
if ((hdr->flags & AMX_FLAG_COMPACT)!=0) {
|
||||
#if AMX_COMPACTMARGIN > 2
|
||||
@ -935,108 +900,12 @@ int AMXAPI amx_Init(AMX *amx, void *program)
|
||||
amx->callback=amx_Callback;
|
||||
amx->data=NULL;
|
||||
|
||||
/* also align all addresses in the public function, public variable,
|
||||
* public tag and native function tables --offsets into the name table
|
||||
* (if present) must also be swapped.
|
||||
*/
|
||||
#if BYTE_ORDER==BIG_ENDIAN
|
||||
{ /* local */
|
||||
AMX_FUNCSTUB *fs;
|
||||
int i,num;
|
||||
|
||||
fs=GETENTRY(hdr,natives,0);
|
||||
num=NUMENTRIES(hdr,natives,libraries);
|
||||
for (i=0; i<num; i++) {
|
||||
amx_AlignCell(&fs->address); /* redundant, because it should be zero */
|
||||
if (USENAMETABLE(hdr))
|
||||
amx_AlignCell(&((AMX_FUNCSTUBNT*)fs)->nameofs);
|
||||
fs=(AMX_FUNCSTUB*)((unsigned char *)fs+hdr->defsize);
|
||||
} /* for */
|
||||
|
||||
fs=GETENTRY(hdr,publics,0);
|
||||
assert(hdr->publics<=hdr->natives);
|
||||
num=NUMENTRIES(hdr,publics,natives);
|
||||
for (i=0; i<num; i++) {
|
||||
amx_AlignCell(&fs->address);
|
||||
if (USENAMETABLE(hdr))
|
||||
amx_AlignCell(&((AMX_FUNCSTUBNT*)fs)->nameofs);
|
||||
fs=(AMX_FUNCSTUB*)((unsigned char *)fs+hdr->defsize);
|
||||
} /* for */
|
||||
|
||||
fs=GETENTRY(hdr,pubvars,0);
|
||||
assert(hdr->pubvars<=hdr->tags);
|
||||
num=NUMENTRIES(hdr,pubvars,tags);
|
||||
for (i=0; i<num; i++) {
|
||||
amx_AlignCell(&fs->address);
|
||||
if (USENAMETABLE(hdr))
|
||||
amx_AlignCell(&((AMX_FUNCSTUBNT*)fs)->nameofs);
|
||||
fs=(AMX_FUNCSTUB*)((unsigned char *)fs+hdr->defsize);
|
||||
} /* for */
|
||||
|
||||
fs=GETENTRY(hdr,tags,0);
|
||||
if (hdr->file_version<7) {
|
||||
assert(hdr->tags<=hdr->cod);
|
||||
num=NUMENTRIES(hdr,tags,cod);
|
||||
} else {
|
||||
assert(hdr->tags<=hdr->nametable);
|
||||
num=NUMENTRIES(hdr,tags,nametable);
|
||||
} /* if */
|
||||
for (i=0; i<num; i++) {
|
||||
amx_AlignCell(&fs->address);
|
||||
if (USENAMETABLE(hdr))
|
||||
amx_AlignCell(&((AMX_FUNCSTUBNT*)fs)->nameofs);
|
||||
fs=(AMX_FUNCSTUB*)((unsigned char *)fs+hdr->defsize);
|
||||
} /* for */
|
||||
} /* local */
|
||||
#endif
|
||||
|
||||
/* relocate call and jump instructions */
|
||||
hook = (BROWSEHOOK)amx->usertags[UT_BROWSEHOOK];
|
||||
if (hook)
|
||||
hook(amx, NULL, NULL);
|
||||
amx_BrowseRelocate(amx);
|
||||
|
||||
/* load any extension modules that the AMX refers to */
|
||||
#if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD
|
||||
hdr=(AMX_HEADER *)amx->base;
|
||||
numlibraries=NUMENTRIES(hdr,libraries,pubvars);
|
||||
for (i=0; i<numlibraries; i++) {
|
||||
lib=GETENTRY(hdr,libraries,i);
|
||||
strcpy(libname,"amx");
|
||||
strcat(libname,GETENTRYNAME(hdr,lib));
|
||||
#if defined _Windows
|
||||
strcat(libname,".dll");
|
||||
#if defined __WIN32__
|
||||
hlib=LoadLibraryA(libname);
|
||||
#else
|
||||
hlib=LoadLibrary(libname);
|
||||
if (hlib<=HINSTANCE_ERROR)
|
||||
hlib=NULL;
|
||||
#endif
|
||||
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
|
||||
strcat(libname,".so");
|
||||
hlib=dlopen(libname,RTLD_NOW);
|
||||
#endif
|
||||
if (hlib!=NULL) {
|
||||
/* a library that cannot be loaded or that does not have the required
|
||||
* initialization function is simply ignored
|
||||
*/
|
||||
char funcname[sNAMEMAX+9]; /* +1 for '\0', +4 for 'amx_', +4 for 'Init' */
|
||||
strcpy(funcname,"amx_");
|
||||
strcat(funcname,GETENTRYNAME(hdr,lib));
|
||||
strcat(funcname,"Init");
|
||||
#if defined _Windows
|
||||
libinit=(AMX_ENTRY)GetProcAddress(hlib,funcname);
|
||||
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
|
||||
libinit=(AMX_ENTRY)dlsym(hlib,funcname);
|
||||
#endif
|
||||
if (libinit!=NULL)
|
||||
libinit(amx);
|
||||
} /* if */
|
||||
lib->address=(ucell)hlib;
|
||||
} /* for */
|
||||
#endif
|
||||
|
||||
return AMX_ERR_NONE;
|
||||
}
|
||||
|
||||
@ -1121,6 +990,7 @@ int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code)
|
||||
amx->cip = hdr->cip;
|
||||
amx->hea = hdr->hea;
|
||||
amx->stp = hdr->stp - sizeof(cell);
|
||||
amx->hlw = hdr->hea;
|
||||
/* also put a sentinel for strings at the top the stack */
|
||||
*(cell *)((char*)native_code + hdr->dat + hdr->stp - sizeof(cell)) = 0;
|
||||
amx->stk = amx->stp;
|
||||
@ -1612,6 +1482,36 @@ int AMXAPI amx_RegisterToAny(AMX *amx, AMX_NATIVE f)
|
||||
return err;
|
||||
}
|
||||
|
||||
int AMXAPI amx_Reregister(AMX *amx, const AMX_NATIVE_INFO *list, int number)
|
||||
{
|
||||
AMX_FUNCSTUB *func;
|
||||
AMX_HEADER *hdr;
|
||||
int i,numnatives,count=0;
|
||||
AMX_NATIVE funcptr;
|
||||
|
||||
hdr=(AMX_HEADER *)amx->base;
|
||||
assert(hdr!=NULL);
|
||||
assert(hdr->magic==AMX_MAGIC);
|
||||
assert(hdr->natives<=hdr->libraries);
|
||||
numnatives=NUMENTRIES(hdr,natives,libraries);
|
||||
|
||||
count=0;
|
||||
func=GETENTRY(hdr,natives,0);
|
||||
for (i=0; i<numnatives; i++) {
|
||||
if (func->address!=0) {
|
||||
/* this function is located */
|
||||
funcptr=(list!=NULL) ? findfunction(GETENTRYNAME(hdr,func),list,number) : NULL;
|
||||
if (funcptr!=NULL)
|
||||
{
|
||||
func->address=(ucell)funcptr;
|
||||
count++;
|
||||
}
|
||||
} /* if */
|
||||
func=(AMX_FUNCSTUB*)((unsigned char*)func+hdr->defsize);
|
||||
} /* for */
|
||||
return count;
|
||||
}
|
||||
|
||||
int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *list, int number)
|
||||
{
|
||||
AMX_FUNCSTUB *func;
|
||||
@ -1632,12 +1532,12 @@ int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *list, int number)
|
||||
/* this function is not yet located */
|
||||
funcptr=(list!=NULL) ? findfunction(GETENTRYNAME(hdr,func),list,number) : NULL;
|
||||
if (funcptr!=NULL)
|
||||
{
|
||||
{
|
||||
func->address=(ucell)funcptr;
|
||||
} else {
|
||||
no_function = GETENTRYNAME(hdr,func);
|
||||
err=AMX_ERR_NOTFOUND;
|
||||
}
|
||||
}
|
||||
} /* if */
|
||||
func=(AMX_FUNCSTUB*)((unsigned char*)func+hdr->defsize);
|
||||
} /* for */
|
||||
|
@ -166,6 +166,14 @@ typedef int (AMXAPI *AMX_NATIVE_FILTER)(struct tagAMX *amx, int index);
|
||||
#pragma warning(disable:4103) /* disable warning message 4103 that complains
|
||||
* about pragma pack in a header file */
|
||||
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
|
||||
|
||||
#if _MSC_VER >= 1400
|
||||
// MSVC8 - Replace POSIX stricmp with ISO C++ conformant one as it is deprecated
|
||||
#define stricmp _stricmp
|
||||
|
||||
// Need this because of some stupid bug
|
||||
#pragma warning (disable : 4996)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Some compilers do not support the #pragma align, which should be fine. Some
|
||||
@ -206,7 +214,7 @@ typedef struct tagAMX_NATIVE_INFO {
|
||||
|
||||
typedef struct tagAMX_FUNCSTUB {
|
||||
ucell address PACKED;
|
||||
char name[sEXPMAX+1] PACKED;
|
||||
char name[sEXPMAX+1];
|
||||
} PACKED AMX_FUNCSTUB;
|
||||
|
||||
typedef struct tagFUNCSTUBNT {
|
||||
@ -257,8 +265,8 @@ typedef struct tagAMX {
|
||||
typedef struct tagAMX_HEADER {
|
||||
int32_t size PACKED; /* size of the "file" */
|
||||
uint16_t magic PACKED; /* signature */
|
||||
char file_version PACKED; /* file format version */
|
||||
char amx_version PACKED; /* required version of the AMX */
|
||||
char file_version; /* file format version */
|
||||
char amx_version; /* required version of the AMX */
|
||||
int16_t flags PACKED;
|
||||
int16_t defsize PACKED; /* size of a definition record */
|
||||
int32_t cod PACKED; /* initial value of COD - code block */
|
||||
@ -314,6 +322,7 @@ enum {
|
||||
#define AMX_FLAG_COMPACT 0x04 /* compact encoding */
|
||||
#define AMX_FLAG_BYTEOPC 0x08 /* opcode is a byte (not a cell) */
|
||||
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking; no STMT opcode */
|
||||
#define AMX_FLAG_OLDFILE 0x20 /* Old AMX Mod plugin */
|
||||
#define AMX_FLAG_PRENIT 0x100 /* pre-initialized, do not check natives */
|
||||
#define AMX_FLAG_NTVREG 0x1000 /* all native functions are registered */
|
||||
#define AMX_FLAG_JITC 0x2000 /* abstract machine is JIT compiled */
|
||||
@ -402,6 +411,7 @@ int AMXAPI amx_PushArray(AMX *amx, cell *amx_addr, cell **phys_addr, const cell
|
||||
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_Register(AMX *amx, const AMX_NATIVE_INFO *nativelist, int number);
|
||||
int AMXAPI amx_Reregister(AMX *amx, const AMX_NATIVE_INFO *nativelist, int number);
|
||||
int AMXAPI amx_RegisterToAny(AMX *amx, AMX_NATIVE f);
|
||||
int AMXAPI amx_Release(AMX *amx, cell amx_addr);
|
||||
int AMXAPI amx_SetCallback(AMX *amx, AMX_CALLBACK callback);
|
||||
|
@ -65,8 +65,8 @@ extern "C" {
|
||||
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 */
|
||||
char file_version; /* file format version */
|
||||
char amx_version; /* required version of the AMX */
|
||||
int16_t flags PACKED; /* currently unused */
|
||||
int16_t files PACKED; /* number of entries in the "file" table */
|
||||
int16_t lines PACKED; /* number of entries in the "line" table */
|
||||
@ -74,51 +74,51 @@ typedef struct tagAMX_DBG_HDR {
|
||||
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;
|
||||
} PACKED AMX_DBG_HDR;
|
||||
#define AMX_DBG_MAGIC 0xf1ef
|
||||
|
||||
typedef struct tagAMX_DBG_FILE {
|
||||
ucell address PACKED; /* address in the code segment where generated code (for this file) starts */
|
||||
const char name[1] PACKED; /* ASCII string, zero-terminated */
|
||||
} AMX_DBG_FILE PACKED;
|
||||
const char name[1]; /* ASCII string, zero-terminated */
|
||||
} PACKED AMX_DBG_FILE;
|
||||
|
||||
typedef struct tagAMX_DBG_LINE {
|
||||
ucell address PACKED; /* address in the code segment where generated code (for this line) starts */
|
||||
int32_t line PACKED; /* line number */
|
||||
} AMX_DBG_LINE PACKED;
|
||||
} PACKED AMX_DBG_LINE;
|
||||
|
||||
typedef struct tagAMX_DBG_SYMBOL {
|
||||
ucell address PACKED; /* address in the data segment or relative to the frame */
|
||||
int16_t tag PACKED; /* tag for the symbol */
|
||||
ucell codestart PACKED; /* address in the code segment from which this symbol is valid (in scope) */
|
||||
ucell codeend PACKED; /* address in the code segment until which this symbol is valid (in scope) */
|
||||
char ident PACKED; /* kind of symbol (function/variable) */
|
||||
char vclass PACKED; /* class of symbol (global/local) */
|
||||
char ident; /* kind of symbol (function/variable) */
|
||||
char vclass; /* class of symbol (global/local) */
|
||||
int16_t dim PACKED; /* number of dimensions */
|
||||
const char name[1] PACKED; /* ASCII string, zero-terminated */
|
||||
} AMX_DBG_SYMBOL PACKED;
|
||||
const char name[1]; /* ASCII string, zero-terminated */
|
||||
} PACKED AMX_DBG_SYMBOL;
|
||||
|
||||
typedef struct tagAMX_DBG_SYMDIM {
|
||||
int16_t tag PACKED; /* tag for the array dimension */
|
||||
ucell size PACKED; /* size of the array dimension */
|
||||
} AMX_DBG_SYMDIM PACKED;
|
||||
} PACKED AMX_DBG_SYMDIM;
|
||||
|
||||
typedef struct tagAMX_DBG_TAG {
|
||||
int16_t tag PACKED; /* tag id */
|
||||
const char name[1] PACKED; /* ASCII string, zero-terminated */
|
||||
} AMX_DBG_TAG PACKED;
|
||||
const char name[1]; /* ASCII string, zero-terminated */
|
||||
} PACKED AMX_DBG_TAG;
|
||||
|
||||
typedef struct tagAMX_DBG_MACHINE {
|
||||
int16_t automaton PACKED; /* automaton id */
|
||||
ucell address PACKED; /* address of state variable */
|
||||
const char name[1] PACKED; /* ASCII string, zero-terminated */
|
||||
} AMX_DBG_MACHINE PACKED;
|
||||
const char name[1]; /* ASCII string, zero-terminated */
|
||||
} PACKED AMX_DBG_MACHINE;
|
||||
|
||||
typedef struct tagAMX_DBG_STATE {
|
||||
int16_t state PACKED; /* state id */
|
||||
int16_t automaton PACKED; /* automaton id */
|
||||
const char name[1] PACKED; /* ASCII string, zero-terminated */
|
||||
} AMX_DBG_STATE PACKED;
|
||||
const char name[1]; /* ASCII string, zero-terminated */
|
||||
} PACKED AMX_DBG_STATE;
|
||||
|
||||
typedef struct tagAMX_DBG {
|
||||
AMX_DBG_HDR _FAR *hdr PACKED; /* points to the AMX_DBG header */
|
||||
@ -128,7 +128,7 @@ typedef struct tagAMX_DBG {
|
||||
AMX_DBG_TAG _FAR **tagtbl PACKED;
|
||||
AMX_DBG_MACHINE _FAR **automatontbl PACKED;
|
||||
AMX_DBG_STATE _FAR **statetbl PACKED;
|
||||
} AMX_DBG PACKED;
|
||||
} PACKED AMX_DBG;
|
||||
|
||||
#if !defined iVARIABLE
|
||||
#define iVARIABLE 1 /* cell that has an address and that can be fetched directly (lvalue) */
|
||||
|
@ -1473,11 +1473,23 @@ OP_FLOAT_ROUND:
|
||||
mov [ebp], eax
|
||||
fldcw [ebp]
|
||||
;calculate
|
||||
push 0
|
||||
sub esp,4
|
||||
fld dword [edi+ecx+4]
|
||||
test edx,edx
|
||||
jz .correct
|
||||
jmp .skip_correct
|
||||
.correct:
|
||||
fadd st0
|
||||
fadd dword [g_round_nearest]
|
||||
fistp dword [esp]
|
||||
pop eax
|
||||
sar eax,1
|
||||
jmp .done
|
||||
.skip_correct:
|
||||
frndint
|
||||
fistp dword [esp]
|
||||
pop eax
|
||||
.done:
|
||||
pop edx
|
||||
;restore bits
|
||||
pop ebp
|
||||
@ -1593,6 +1605,8 @@ Start_DATA
|
||||
|
||||
lodb_and DD 0ffh, 0ffffh, 0, 0ffffffffh
|
||||
|
||||
g_round_nearest DD 0.5
|
||||
|
||||
GLOBAL g_flags
|
||||
g_flags:
|
||||
DD -1
|
||||
@ -1740,10 +1754,10 @@ _amx_opcodelist DD OP_INVALID
|
||||
DD OP_SYSREQ_D
|
||||
DD OP_SYMTAG
|
||||
DD OP_BREAK
|
||||
DD OP_FLOAT_MUL
|
||||
DD OP_FLOAT_DIV
|
||||
DD OP_FLOAT_ADD
|
||||
DD OP_FLOAT_SUB
|
||||
DD OP_FLOAT_TO
|
||||
DD OP_FLOAT_ROUND
|
||||
DD OP_FLOAT_CMP
|
||||
DD OP_FLOAT_MUL
|
||||
DD OP_FLOAT_DIV
|
||||
DD OP_FLOAT_ADD
|
||||
DD OP_FLOAT_SUB
|
||||
DD OP_FLOAT_TO
|
||||
DD OP_FLOAT_ROUND
|
||||
DD OP_FLOAT_CMP
|
||||
|
@ -1962,11 +1962,23 @@ OP_FLOAT_ROUND:
|
||||
mov [ebp], eax
|
||||
fldcw [ebp]
|
||||
;calculate
|
||||
push 0
|
||||
sub esp,4
|
||||
fld dword [esi+4]
|
||||
test edx,edx
|
||||
jz .correct
|
||||
jmp .skip_correct
|
||||
.correct:
|
||||
fadd st0
|
||||
fadd dword [g_round_nearest]
|
||||
fistp dword [esp]
|
||||
pop eax
|
||||
sar eax,1
|
||||
jmp .done
|
||||
.skip_correct:
|
||||
frndint
|
||||
fistp dword [esp]
|
||||
pop eax
|
||||
.done:
|
||||
pop edx
|
||||
;restore bits
|
||||
pop ebp
|
||||
@ -2110,7 +2122,9 @@ err_heaplow:
|
||||
_CHKMARGIN_HEAP:
|
||||
cmp esi,stp
|
||||
jg err_stacklow
|
||||
cmp dword hea,0
|
||||
mov ebp,amx
|
||||
mov ebp,[ebp+_hlw]
|
||||
cmp dword hea,ebp
|
||||
jl err_heaplow
|
||||
ret
|
||||
|
||||
@ -2422,6 +2436,10 @@ g_flagsjit:
|
||||
DD -1
|
||||
DD 0
|
||||
DD 1
|
||||
|
||||
global g_round_nearest
|
||||
g_round_nearest:
|
||||
DD 0.5
|
||||
|
||||
global amx_opcodelist_jit, _amx_opcodelist_jit
|
||||
|
||||
|
117
amxmodx/amxmod_compat.cpp
Normal file
117
amxmodx/amxmod_compat.cpp
Normal file
@ -0,0 +1,117 @@
|
||||
#include "amxmodx.h"
|
||||
#include "amxmod_compat.h"
|
||||
#include "format.h"
|
||||
|
||||
bool GetTranslation(amxtrans_t trans, int &key, int &dest, int &lang)
|
||||
{
|
||||
key = (trans & BCOMPAT_TRANSLATE_KEYMASK);
|
||||
dest = (trans >> BCOMPAT_TRANSLATE_DESTRSH) & BCOMPAT_TRANSLATE_DESTMASK;
|
||||
lang = (trans >> BCOMPAT_TRANSLATE_LANGRSH) & BCOMPAT_TRANSLATE_LANGMASK;
|
||||
|
||||
if (dest == 0x3F)
|
||||
{
|
||||
dest = -1;
|
||||
}
|
||||
|
||||
if (lang == 0x1F)
|
||||
{
|
||||
lang = -1;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool translate_bcompat(AMX *amx, cell *source, const char **_key, const char **_def)
|
||||
{
|
||||
amxtrans_t trans = static_cast<amxtrans_t>(*source);
|
||||
int key, _dest, lang;
|
||||
if (!GetTranslation(trans, key, _dest, lang))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
cell amx_addr, *phys_addr;
|
||||
if (amx_Allot(amx, 3, &amx_addr, &phys_addr) != AMX_ERR_NONE)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_dest == -1)
|
||||
{
|
||||
*phys_addr = LANG_PLAYER;
|
||||
} else if (_dest == 0) {
|
||||
*phys_addr = LANG_SERVER;
|
||||
} else if (lang >= 0 && lang < g_langMngr.GetLangsNum()) {
|
||||
const char *name = g_langMngr.GetLangName(lang);
|
||||
phys_addr[0] = static_cast<cell>(name[0]);
|
||||
phys_addr[1] = static_cast<cell>(name[1]);
|
||||
phys_addr[2] = static_cast<cell>('\0');
|
||||
} else {
|
||||
*phys_addr = LANG_SERVER;
|
||||
}
|
||||
|
||||
//not optimized but it works, eh
|
||||
//if someone cares they can make a translate() wrapper that takes the key # in directly
|
||||
const char *r_key = g_langMngr.GetKey(key);
|
||||
const char *def = translate(amx, amx_addr, r_key);
|
||||
if (!def)
|
||||
{
|
||||
def = r_key;
|
||||
}
|
||||
amx_Release(amx, amx_addr);
|
||||
|
||||
*_key = g_langMngr.GetKey(key);
|
||||
*_def = def;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL amx_translate(AMX *amx, cell *params)
|
||||
{
|
||||
int len;
|
||||
char *key = get_amxstring(amx, params[1], 0, len);
|
||||
|
||||
amxtrans_t trans;
|
||||
|
||||
int suki = g_langMngr.GetKeyEntry(key);
|
||||
//Some AMX Mod plugins do not register everything they need. Prevent a crash.
|
||||
if (suki == -1)
|
||||
{
|
||||
suki = g_langMngr.AddKeyEntry(key);
|
||||
}
|
||||
|
||||
if (suki > BCOMPAT_TRANSLATE_KEYMASK)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Not enough translation space, aborting!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
trans = suki & BCOMPAT_TRANSLATE_KEYMASK;
|
||||
int dest = static_cast<int>(params[2]);
|
||||
int lang = static_cast<int>(params[3]);
|
||||
if (dest == -1)
|
||||
{
|
||||
trans |= (0x3F << BCOMPAT_TRANSLATE_DESTRSH);
|
||||
} else {
|
||||
trans |= (dest & BCOMPAT_TRANSLATE_DESTMASK) << BCOMPAT_TRANSLATE_DESTRSH;
|
||||
}
|
||||
|
||||
if (lang == -1)
|
||||
{
|
||||
trans |= (0x1F << BCOMPAT_TRANSLATE_LANGRSH);
|
||||
} else {
|
||||
trans |= (lang & BCOMPAT_TRANSLATE_LANGMASK) << BCOMPAT_TRANSLATE_LANGRSH;
|
||||
}
|
||||
|
||||
trans |= BCOMPAT_TRANSLATE_BITS;
|
||||
|
||||
return static_cast<cell>(trans);
|
||||
}
|
||||
|
||||
AMX_NATIVE_INFO g_BcompatNatives[] =
|
||||
{
|
||||
{"translate", amx_translate},
|
||||
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
28
amxmodx/amxmod_compat.h
Normal file
28
amxmodx/amxmod_compat.h
Normal file
@ -0,0 +1,28 @@
|
||||
#ifndef _INCLUDE_AMXMOD_CORE_COMPAT_H
|
||||
#define _INCLUDE_AMXMOD_CORE_COMPAT_H
|
||||
|
||||
/**
|
||||
* New format for translation:
|
||||
* Note that we only support:
|
||||
* 4k keys
|
||||
* 32 languages
|
||||
* 0000 0000 0000 0000 0000 0000 0000 0000
|
||||
* | key id |
|
||||
* | | <- dest id
|
||||
* | | <- lang id
|
||||
*/
|
||||
|
||||
#define BCOMPAT_TRANSLATE_BITS 0xFF000000
|
||||
#define BCOMPAT_TRANSLATE_KEYMASK 0xFFF
|
||||
#define BCOMPAT_TRANSLATE_DESTMASK 0x3F
|
||||
#define BCOMPAT_TRANSLATE_DESTRSH 12
|
||||
#define BCOMPAT_TRANSLATE_LANGMASK 0x1F
|
||||
#define BCOMPAT_TRANSLATE_LANGRSH 18
|
||||
|
||||
typedef unsigned int amxtrans_t;
|
||||
|
||||
bool GetTranslation(amxtrans_t trans, int &key, int &dest, int &lang);
|
||||
|
||||
extern AMX_NATIVE_INFO g_BcompatNatives[];
|
||||
|
||||
#endif //_INCLUDE_AMXMOD_CORE_COMPAT_H
|
File diff suppressed because it is too large
Load Diff
@ -42,8 +42,13 @@
|
||||
#include <extdll.h>
|
||||
#include <meta_api.h>
|
||||
|
||||
#ifdef MEMORY_TEST
|
||||
#include "mmgr/mmgr.h"
|
||||
#ifdef _MSC_VER
|
||||
// MSVC8 - replace POSIX functions with ISO C++ conformant ones as they are deprecated
|
||||
#if _MSC_VER >= 1400
|
||||
#define unlink _unlink
|
||||
#define mkdir _mkdir
|
||||
#define strdup _strdup
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "md5.h"
|
||||
@ -67,7 +72,8 @@
|
||||
#include "amxxlog.h"
|
||||
|
||||
#define AMXXLOG_Log g_log.Log
|
||||
#define AMX_VERSION "1.71"
|
||||
#define AMXXLOG_Error g_log.LogError
|
||||
#define AMX_VERSION "1.76"
|
||||
|
||||
extern AMX_NATIVE_INFO core_Natives[];
|
||||
extern AMX_NATIVE_INFO time_Natives[];
|
||||
@ -77,6 +83,9 @@ 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 msg_Natives[];
|
||||
extern AMX_NATIVE_INFO vector_Natives[];
|
||||
extern AMX_NATIVE_INFO g_SortNatives[];
|
||||
|
||||
#ifndef __linux__
|
||||
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
|
||||
@ -257,6 +266,8 @@ enum CountModulesMode
|
||||
|
||||
int countModules(CountModulesMode mode);
|
||||
void modules_callPluginsLoaded();
|
||||
void modules_callPluginsUnloaded();
|
||||
void modules_callPluginsUnloading();
|
||||
|
||||
cell* get_amxaddr(AMX *amx, cell amx_addr);
|
||||
char* build_pathname(char *fmt, ...);
|
||||
@ -328,4 +339,6 @@ struct func_s
|
||||
const char *desc;
|
||||
};
|
||||
|
||||
extern enginefuncs_t *g_pEngTable;
|
||||
|
||||
#endif // AMXMODX_H
|
||||
|
@ -54,7 +54,7 @@ static cell AMX_NATIVE_CALL _time(AMX *amx, cell *params)
|
||||
/* the time() function returns the number of seconds since January 1 1970
|
||||
* in Universal Coordinated Time (the successor to Greenwich Mean Time)
|
||||
*/
|
||||
return sec1970;
|
||||
return (cell)sec1970;
|
||||
}
|
||||
|
||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
||||
|
@ -53,7 +53,7 @@
|
||||
|
||||
struct TableEntry
|
||||
{
|
||||
mint8_t cellSize PACKED;
|
||||
mint8_t cellSize;
|
||||
mint32_t origSize PACKED; // contains AMX_HEADER->stp
|
||||
mint32_t offset PACKED;
|
||||
};
|
||||
@ -109,7 +109,7 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
||||
{
|
||||
DATAREAD(&m_Bh.version, sizeof(int16_t), 1);
|
||||
|
||||
if (m_Bh.version != MAGIC_VERSION)
|
||||
if (m_Bh.version > MAGIC_VERSION)
|
||||
{
|
||||
m_Status = Err_OldFile;
|
||||
fclose(m_pFile);
|
||||
@ -300,7 +300,7 @@ size_t CAmxxReader::GetBufferSize()
|
||||
|
||||
#undef DATAREAD
|
||||
#define DATAREAD(addr, itemsize, itemcount) \
|
||||
if (fread(addr, itemsize, itemcount, m_pFile) != itemcount) \
|
||||
if (fread(addr, itemsize, itemcount, m_pFile) != static_cast<size_t>(itemcount)) \
|
||||
{ \
|
||||
if (feof(m_pFile)) \
|
||||
m_Status = Err_FileInvalid; \
|
||||
|
@ -92,6 +92,7 @@ public:
|
||||
Error GetStatus(); // Get the current status
|
||||
size_t GetBufferSize(); // Get the size for the buffer
|
||||
Error GetSection(void *buffer); // Copy the currently selected section to the buffer
|
||||
inline bool IsOldFile() const { return m_OldFile; }
|
||||
};
|
||||
|
||||
#endif // __AMXXFILE_H__
|
||||
|
@ -48,6 +48,8 @@ CLog::CLog()
|
||||
{
|
||||
m_LogType = 0;
|
||||
m_LogFile.clear();
|
||||
m_FoundError = false;
|
||||
m_LoggedErrMap = false;
|
||||
}
|
||||
|
||||
CLog::~CLog()
|
||||
@ -146,17 +148,17 @@ void CLog::MapChange()
|
||||
print_srvconsole("[AMXX] Invalid amxx_logging value; setting back to 1...");
|
||||
}
|
||||
|
||||
m_LoggedErrMap = false;
|
||||
|
||||
if (m_LogType == 2)
|
||||
{
|
||||
// create new logfile
|
||||
CreateNewFile();
|
||||
}
|
||||
else if (m_LogType == 1)
|
||||
{
|
||||
} else if (m_LogType == 1) {
|
||||
Log("-------- Mapchange to %s --------", STRING(gpGlobals->mapname));
|
||||
}
|
||||
else
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void CLog::Log(const char *fmt, ...)
|
||||
@ -214,9 +216,7 @@ void CLog::Log(const char *fmt, ...)
|
||||
|
||||
// print on server console
|
||||
print_srvconsole("L %s: %s\n", date, msg);
|
||||
}
|
||||
else if (m_LogType == 3)
|
||||
{
|
||||
} else if (m_LogType == 3) {
|
||||
// build message
|
||||
static char msg_[3072];
|
||||
va_list arglst;
|
||||
@ -226,3 +226,53 @@ void CLog::Log(const char *fmt, ...)
|
||||
ALERT(at_logged, "%s\n", msg_);
|
||||
}
|
||||
}
|
||||
|
||||
void CLog::LogError(const char *fmt, ...)
|
||||
{
|
||||
static char file[256];
|
||||
|
||||
if (m_FoundError)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// get time
|
||||
time_t td;
|
||||
time(&td);
|
||||
tm *curTime = localtime(&td);
|
||||
|
||||
char date[32];
|
||||
strftime(date, 31, "%m/%d/%Y - %H:%M:%S", curTime);
|
||||
|
||||
// msg
|
||||
static char msg[3072];
|
||||
|
||||
va_list arglst;
|
||||
va_start(arglst, fmt);
|
||||
vsnprintf(msg, sizeof(msg)-1, fmt, arglst);
|
||||
va_end(arglst);
|
||||
|
||||
FILE *pF = NULL;
|
||||
build_pathname_r(file, sizeof(file)-1, "%s/error_%02d%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100);
|
||||
pF = fopen(file, "a+");
|
||||
|
||||
if (pF)
|
||||
{
|
||||
if (!m_LoggedErrMap)
|
||||
{
|
||||
fprintf(pF, "L %s: Start of error session.\n", date);
|
||||
fprintf(pF, "L %s: Info (map \"%s\") (logfile \"error_%02d%02d%02d.log\")\n", date, STRING(gpGlobals->mapname), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100);
|
||||
m_LoggedErrMap = true;
|
||||
}
|
||||
fprintf(pF, "L %s: %s\n", date, msg);
|
||||
fclose(pF);
|
||||
} else {
|
||||
ALERT(at_logged, "[AMXX] Unexpected fatal logging error (couldn't open %s for a+). AMXX Error Logging disabled for this map.\n", file);
|
||||
m_FoundError = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// print on server console
|
||||
print_srvconsole("L %s: %s\n", date, msg);
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,8 @@ class CLog
|
||||
private:
|
||||
String m_LogFile;
|
||||
int m_LogType;
|
||||
bool m_FoundError;
|
||||
bool m_LoggedErrMap;
|
||||
|
||||
void GetLastFile(int &outMonth, int &outDay, String &outFilename);
|
||||
void UseFile(const String &fileName);
|
||||
@ -47,6 +49,7 @@ public:
|
||||
void CloseFile();
|
||||
void MapChange();
|
||||
void Log(const char *fmt, ...);
|
||||
void LogError(const char *fmt, ...);
|
||||
};
|
||||
|
||||
#endif // __AMXXLOG_H__
|
||||
|
@ -1,13 +1,42 @@
|
||||
#if defined BINLOG_ENABLED
|
||||
|
||||
#include <time.h>
|
||||
#include "amxmodx.h"
|
||||
#include "binlog.h"
|
||||
|
||||
#if defined BINLOG_ENABLED
|
||||
#include "debugger.h"
|
||||
|
||||
BinLog g_BinLog;
|
||||
int g_binlog_level = 0;
|
||||
int g_binlog_maxsize = 0;
|
||||
|
||||
// Helper function to get a filename index
|
||||
#define USHR(x) ((unsigned int)(x)>>1)
|
||||
int LookupFile(AMX_DBG *amxdbg, ucell address)
|
||||
{
|
||||
int high, low, mid;
|
||||
|
||||
high = amxdbg->hdr->files;
|
||||
low = -1;
|
||||
|
||||
while (high - low > 1)
|
||||
{
|
||||
mid = USHR(low + high);
|
||||
if (amxdbg->filetbl[mid]->address <= address)
|
||||
{
|
||||
low = mid;
|
||||
} else {
|
||||
high = mid;
|
||||
}
|
||||
}
|
||||
|
||||
if (low == -1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return low;
|
||||
}
|
||||
|
||||
bool BinLog::Open()
|
||||
{
|
||||
const char *data = get_localinfo("amxmodx_datadir", "addons/amxmodx/data");
|
||||
@ -110,6 +139,21 @@ void BinLog::WriteOp(BinLogOp op, int plug, ...)
|
||||
va_list ap;
|
||||
va_start(ap, plug);
|
||||
|
||||
AMX *amx = NULL;
|
||||
bool debug = false;
|
||||
AMX_DBG *dbg = NULL;
|
||||
CPluginMngr::CPlugin *pl = NULL;
|
||||
|
||||
if (plug != -1)
|
||||
{
|
||||
pl = g_plugins.findPlugin(plug);
|
||||
if ((debug = pl->isDebug()))
|
||||
{
|
||||
amx = pl->getAMX();
|
||||
dbg = static_cast<Debugger *>(amx->userdata[UD_DEBUGGER])->m_pAmxDbg;
|
||||
}
|
||||
}
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case BinLog_Registered:
|
||||
@ -126,10 +170,19 @@ void BinLog::WriteOp(BinLogOp op, int plug, ...)
|
||||
}
|
||||
case BinLog_NativeCall:
|
||||
{
|
||||
int file;
|
||||
int native = va_arg(ap, int);
|
||||
int params = va_arg(ap, int);
|
||||
fwrite(&native, sizeof(int), 1, fp);
|
||||
fwrite(¶ms, sizeof(int), 1, fp);
|
||||
if (debug)
|
||||
{
|
||||
file = LookupFile(dbg, amx->cip);
|
||||
fwrite(&file, sizeof(int), 1, fp);
|
||||
} else {
|
||||
file = 0;
|
||||
fwrite(&file, sizeof(int), 1, fp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BinLog_NativeRet:
|
||||
@ -150,14 +203,32 @@ void BinLog::WriteOp(BinLogOp op, int plug, ...)
|
||||
}
|
||||
case BinLog_CallPubFunc:
|
||||
{
|
||||
int file;
|
||||
int num = va_arg(ap, int);
|
||||
fwrite(&num, sizeof(int), 1, fp);
|
||||
if (debug)
|
||||
{
|
||||
file = LookupFile(dbg, amx->cip);
|
||||
fwrite(&file, sizeof(int), 1, fp);
|
||||
} else {
|
||||
file = 0;
|
||||
fwrite(&file, sizeof(int), 1, fp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BinLog_SetLine:
|
||||
{
|
||||
int file;
|
||||
int line = va_arg(ap, int);
|
||||
fwrite(&line, sizeof(int), 1, fp);
|
||||
if (debug)
|
||||
{
|
||||
file = LookupFile(dbg, amx->cip);
|
||||
fwrite(&file, sizeof(int), 1, fp);
|
||||
} else {
|
||||
file = 0;
|
||||
fwrite(&file, sizeof(int), 1, fp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BinLog_FormatString:
|
||||
@ -227,32 +298,63 @@ void BinLog::WritePluginDB(FILE *fp)
|
||||
if (c && pl->isDebug())
|
||||
c = 2;
|
||||
fwrite(&c, sizeof(char), 1, fp);
|
||||
len = (char)strlen(pl->getName());
|
||||
fwrite(&len, sizeof(char), 1, fp);
|
||||
len++;
|
||||
fwrite(pl->getName(), sizeof(char), len, fp);
|
||||
int natives, publics;
|
||||
AMX *amx = pl->getAMX();
|
||||
amx_NumNatives(amx, &natives);
|
||||
amx_NumPublics(amx, &publics);
|
||||
fwrite(&natives, sizeof(int), 1, fp);
|
||||
fwrite(&publics, sizeof(int), 1, fp);
|
||||
char name[34];
|
||||
for (int i=0; i<natives; i++)
|
||||
if (c)
|
||||
{
|
||||
amx_GetNative(amx, i, name);
|
||||
len = (char)strlen(name);
|
||||
Debugger *pd = NULL;
|
||||
len = (char)strlen(pl->getName());
|
||||
fwrite(&len, sizeof(char), 1, fp);
|
||||
len++;
|
||||
fwrite(name, sizeof(char), len, fp);
|
||||
}
|
||||
for (int i=0; i<publics; i++)
|
||||
{
|
||||
amx_GetPublic(amx, i, name);
|
||||
len = (char)strlen(name);
|
||||
fwrite(pl->getName(), sizeof(char), len, fp);
|
||||
int natives, publics, files;
|
||||
AMX *amx = pl->getAMX();
|
||||
// Write the number of Filenames
|
||||
if (c == 2)
|
||||
{
|
||||
pd = static_cast<Debugger *>(amx->userdata[UD_DEBUGGER]);
|
||||
files = pd->m_pAmxDbg->hdr->files;
|
||||
fwrite(&files, sizeof(int), 1, fp);
|
||||
}
|
||||
amx_NumNatives(amx, &natives);
|
||||
amx_NumPublics(amx, &publics);
|
||||
fwrite(&natives, sizeof(int), 1, fp);
|
||||
fwrite(&publics, sizeof(int), 1, fp);
|
||||
char name[34];
|
||||
// Write the Filenames to the binfile
|
||||
if (c == 2)
|
||||
{
|
||||
AMX_DBG_FILE **ftable = pd->m_pAmxDbg->filetbl;
|
||||
for (int i=0; i<files; i++)
|
||||
{
|
||||
len = (char)strlen(ftable[i]->name);
|
||||
fwrite(&len, sizeof(char), 1, fp);
|
||||
len++;
|
||||
fwrite(ftable[i]->name, sizeof(char), len, fp);
|
||||
}
|
||||
}
|
||||
for (int i=0; i<natives; i++)
|
||||
{
|
||||
amx_GetNative(amx, i, name);
|
||||
len = (char)strlen(name);
|
||||
fwrite(&len, sizeof(char), 1, fp);
|
||||
len++;
|
||||
fwrite(name, sizeof(char), len, fp);
|
||||
}
|
||||
for (int i=0; i<publics; i++)
|
||||
{
|
||||
amx_GetPublic(amx, i, name);
|
||||
len = (char)strlen(name);
|
||||
fwrite(&len, sizeof(char), 1, fp);
|
||||
len++;
|
||||
fwrite(name, sizeof(char), len, fp);
|
||||
}
|
||||
} else {
|
||||
char empty[] = " ";
|
||||
len = 1;
|
||||
fwrite(&len, sizeof(char), 1, fp);
|
||||
len++;
|
||||
fwrite(name, sizeof(char), len, fp);
|
||||
fwrite(empty, sizeof(char), len, fp);
|
||||
int no = 0;
|
||||
fwrite(&no, sizeof(int), 1, fp);
|
||||
fwrite(&no, sizeof(int), 1, fp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
#include "CString.h"
|
||||
|
||||
#define BINLOG_MAGIC 0x414D424C
|
||||
#define BINLOG_VERSION 0x0200
|
||||
#define BINLOG_VERSION 0x0300
|
||||
|
||||
/**
|
||||
* Format of binlog:
|
||||
@ -17,8 +17,14 @@
|
||||
* [
|
||||
* uint8 status codes
|
||||
* str[int8] filename
|
||||
* if(status==2)
|
||||
* uint32 num filenames
|
||||
* uint32 num natives
|
||||
* uint32 num publics
|
||||
* if (status==2)
|
||||
* [
|
||||
* str[uint8] file name
|
||||
* ]
|
||||
* [
|
||||
* str[uint8] native name
|
||||
* ]
|
||||
@ -33,17 +39,18 @@
|
||||
* int32 plugin id
|
||||
* <extra info>
|
||||
* ]
|
||||
* If filename id is 0 skip as plugin was not in debug mode, if -1 there was an error.
|
||||
*/
|
||||
|
||||
enum BinLogOp
|
||||
{
|
||||
BinLog_Start=1,
|
||||
BinLog_End,
|
||||
BinLog_NativeCall, //<int32 native id> <int32_t num_params>
|
||||
BinLog_NativeCall, //<int32 native id> <int32_t num_params> <int32_t filename id>
|
||||
BinLog_NativeError, //<int32 errornum> <str[int16] string>
|
||||
BinLog_NativeRet, //<cell value>
|
||||
BinLog_CallPubFunc, //<int32 public id>
|
||||
BinLog_SetLine, //<int32 line no#>
|
||||
BinLog_CallPubFunc, //<int32 public id> <int32_t filename id>
|
||||
BinLog_SetLine, //<int32 line no#> <int32_t filename id>
|
||||
BinLog_Registered, //<string title> <string version>
|
||||
BinLog_FormatString, //<int32 param#> <int32 maxlen> <str[int16] string>
|
||||
BinLog_NativeParams, //<int32 num> <cell ...>
|
||||
|
@ -388,9 +388,9 @@ int Debugger::FormatError(char *buffer, size_t maxLength)
|
||||
int error = pTracer->m_Error;
|
||||
const char *gen_err = GenericError(error);
|
||||
int size = 0;
|
||||
trace_info_t *pTrace = pTracer->GetEnd();
|
||||
cell cip = _CipAsVa(m_pAmx->cip);
|
||||
cell *p_cip = NULL;
|
||||
//trace_info_t *pTrace = pTracer->GetEnd();
|
||||
//cell cip = _CipAsVa(m_pAmx->cip);
|
||||
//cell *p_cip = NULL;
|
||||
int amx_err = AMX_ERR_NONE;
|
||||
|
||||
size += _snprintf(buffer, maxLength, "Run time error %d: %s ", error, gen_err);
|
||||
@ -556,15 +556,15 @@ void Debugger::Clear()
|
||||
void Debugger::DisplayTrace(const char *message)
|
||||
{
|
||||
if (message != NULL)
|
||||
AMXXLOG_Log("%s", message);
|
||||
AMXXLOG_Error("%s", message);
|
||||
|
||||
char buffer[512];
|
||||
FormatError(buffer, sizeof(buffer)-1);
|
||||
|
||||
const char *filename = _GetFilename();
|
||||
|
||||
AMXXLOG_Log("[AMXX] Displaying debug trace (plugin \"%s\")", filename);
|
||||
AMXXLOG_Log("[AMXX] %s", buffer);
|
||||
AMXXLOG_Error("[AMXX] Displaying debug trace (plugin \"%s\")", filename);
|
||||
AMXXLOG_Error("[AMXX] %s", buffer);
|
||||
|
||||
int count = 0;
|
||||
long lLine;
|
||||
@ -573,7 +573,7 @@ void Debugger::DisplayTrace(const char *message)
|
||||
while (pTrace)
|
||||
{
|
||||
GetTraceInfo(pTrace, lLine, function, file);
|
||||
AMXXLOG_Log(
|
||||
AMXXLOG_Error(
|
||||
"[AMXX] [%d] %s::%s (line %d)",
|
||||
count,
|
||||
file,
|
||||
@ -608,6 +608,7 @@ const char *Debugger::_GetFilename()
|
||||
void Debugger::FmtGenericMsg(AMX *amx, int error, char buffer[], size_t maxLength)
|
||||
{
|
||||
const char *filename = "";
|
||||
char native[sNAMEMAX+1];
|
||||
|
||||
CList<CScript,AMX*>::iterator a = g_loadedscripts.find(amx);
|
||||
if (a)
|
||||
@ -622,7 +623,15 @@ void Debugger::FmtGenericMsg(AMX *amx, int error, char buffer[], size_t maxLengt
|
||||
}
|
||||
}
|
||||
|
||||
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") - debug not enabled!", error, filename);
|
||||
if (error == AMX_ERR_EXIT)
|
||||
{
|
||||
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") - %s", error, filename, GenericError(AMX_ERR_EXIT));
|
||||
} else if (error == AMX_ERR_NATIVE) {
|
||||
amx_GetNative(amx, reinterpret_cast<long>(amx->usertags[UT_NATIVE]), native);
|
||||
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") (native \"%s\") - debug not enabled!", error, filename, native);
|
||||
} else {
|
||||
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") - debug not enabled!", error, filename);
|
||||
}
|
||||
}
|
||||
|
||||
void Debugger::GenericMessage(AMX *amx, int err)
|
||||
@ -633,12 +642,14 @@ void Debugger::GenericMessage(AMX *amx, int err)
|
||||
Debugger::FmtGenericMsg(amx, err, buffer, sizeof(buffer)-1);
|
||||
|
||||
if (buffer[0] != '\0')
|
||||
AMXXLOG_Log("[AMXX] %s", buffer);
|
||||
AMXXLOG_Error("[AMXX] %s", buffer);
|
||||
}
|
||||
|
||||
Debugger::~Debugger()
|
||||
{
|
||||
Clear();
|
||||
dbg_FreeInfo(m_pAmxDbg);
|
||||
delete m_pAmxDbg;
|
||||
}
|
||||
|
||||
int Handler::SetErrorHandler(const char *function)
|
||||
@ -693,7 +704,7 @@ const char *Handler::GetLastMsg()
|
||||
return m_MsgCache.c_str();
|
||||
}
|
||||
|
||||
int Handler::HandleModule(const char *module)
|
||||
int Handler::HandleModule(const char *module, bool isClass)
|
||||
{
|
||||
if (m_iModFunc < 0)
|
||||
return 0;
|
||||
@ -709,6 +720,7 @@ int Handler::HandleModule(const char *module)
|
||||
|
||||
//temporarily set prenit
|
||||
m_pAmx->flags |= AMX_FLAG_PRENIT;
|
||||
amx_Push(m_pAmx, isClass ? 1 : 0);
|
||||
amx_PushString(m_pAmx, &hea_addr, &phys_addr, module, 0, 0);
|
||||
int err = amx_Exec(m_pAmx, &retval, m_iModFunc);
|
||||
amx_Release(m_pAmx, hea_addr);
|
||||
@ -762,7 +774,7 @@ int Handler::HandleNative(const char *native, int index, int trap)
|
||||
}
|
||||
if (!trap)
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] Runtime failure %d occurred in native filter. Aborting plugin load.", err);
|
||||
AMXXLOG_Error("[AMXX] Runtime failure %d occurred in native filter. Aborting plugin load.", err);
|
||||
return 0;
|
||||
}
|
||||
//handle this manually.
|
||||
@ -773,7 +785,7 @@ int Handler::HandleNative(const char *native, int index, int trap)
|
||||
} else if (err != -1) {
|
||||
LogError(m_pAmx, err, NULL);
|
||||
}
|
||||
AMXXLOG_Log("[AMXX] NOTE: Runtime failures in native filters are not good!");
|
||||
AMXXLOG_Error("[AMXX] NOTE: Runtime failures in native filters are not good!");
|
||||
retval = 0;
|
||||
}
|
||||
if (!trap)
|
||||
@ -833,10 +845,10 @@ int Handler::HandleError(const char *msg)
|
||||
pDebugger->DisplayTrace(msg);
|
||||
} else {
|
||||
if (GetLastMsg())
|
||||
AMXXLOG_Log("%s", GetLastMsg());
|
||||
AMXXLOG_Error("%s", GetLastMsg());
|
||||
Debugger::GenericMessage(m_pAmx, err);
|
||||
}
|
||||
AMXXLOG_Log("[AMXX] NOTE: Runtime failures in an error filter are not good!");
|
||||
AMXXLOG_Error("[AMXX] NOTE: Runtime failures in an error filter are not good!");
|
||||
}
|
||||
|
||||
if (pDebugger)
|
||||
@ -864,7 +876,7 @@ static cell AMX_NATIVE_CALL set_error_filter(AMX *amx, cell *params)
|
||||
if (!pHandler)
|
||||
{
|
||||
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
||||
AMXXLOG_Log("[AMXX] Plugin not initialized correctly.");
|
||||
AMXXLOG_Error("[AMXX] Plugin not initialized correctly.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -872,7 +884,7 @@ static cell AMX_NATIVE_CALL set_error_filter(AMX *amx, cell *params)
|
||||
if (err != AMX_ERR_NONE)
|
||||
{
|
||||
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
||||
AMXXLOG_Log("[AMXX] Function not found: %s", function);
|
||||
AMXXLOG_Error("[AMXX] Function not found: %s", function);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -952,7 +964,7 @@ static cell AMX_NATIVE_CALL set_native_filter(AMX *amx, cell *params)
|
||||
if (!pHandler)
|
||||
{
|
||||
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
||||
AMXXLOG_Log("[AMXX] Plugin not initialized correctly.");
|
||||
AMXXLOG_Error("[AMXX] Plugin not initialized correctly.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -971,7 +983,7 @@ static cell AMX_NATIVE_CALL set_native_filter(AMX *amx, cell *params)
|
||||
if (err != AMX_ERR_NONE)
|
||||
{
|
||||
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
||||
AMXXLOG_Log("[AMXX] Function not found: %s", function);
|
||||
AMXXLOG_Error("[AMXX] Function not found: %s", function);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ public:
|
||||
|
||||
struct trace_info
|
||||
{
|
||||
trace_info() : cip(0), frm(0), used(false), next(NULL), prev(NULL) {};
|
||||
trace_info() : cip(0), frm(0), next(NULL), prev(NULL), used(false) {};
|
||||
|
||||
cell cip;
|
||||
cell frm;
|
||||
@ -167,7 +167,7 @@ public:
|
||||
public:
|
||||
int HandleError(const char *msg);
|
||||
int HandleNative(const char *native, int index, int trap);
|
||||
int HandleModule(const char *module);
|
||||
int HandleModule(const char *module, bool isClass=false);
|
||||
public:
|
||||
bool IsHandling() const { return m_Handling; }
|
||||
void SetErrorMsg(const char *msg);
|
||||
|
@ -51,8 +51,6 @@
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
#include <extdll.h>
|
||||
#include <meta_api.h>
|
||||
#include "amxmodx.h"
|
||||
|
||||
CVector<FILE *> FileList;
|
||||
@ -141,7 +139,7 @@ static cell AMX_NATIVE_CALL read_file(AMX *amx, cell *params) /* 5 param */
|
||||
|
||||
if ((fp =fopen(build_pathname("%s", szFile), "r")) == NULL)
|
||||
{
|
||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
||||
LogError(amx, AMX_ERR_NATIVE, "Couldn't read file \"%s\"", szFile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -185,7 +183,7 @@ static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */
|
||||
{
|
||||
if ((pFile = fopen(sFile, "a")) == NULL)
|
||||
{
|
||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
||||
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -201,7 +199,7 @@ static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */
|
||||
{
|
||||
if ((pFile = fopen(sFile, "w")) == NULL)
|
||||
{
|
||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
||||
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -221,7 +219,7 @@ static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */
|
||||
|
||||
if ((pTemp = tmpfile()) == NULL)
|
||||
{
|
||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
||||
LogError(amx, AMX_ERR_NATIVE, "Couldn't create temp file");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -251,7 +249,7 @@ static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */
|
||||
// now rewrite because file can be now smaller...
|
||||
if ((pFile = fopen(sFile, "w")) == NULL)
|
||||
{
|
||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
||||
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -360,7 +358,7 @@ static cell AMX_NATIVE_CALL file_size(AMX *amx, cell *params) /* 1 param */
|
||||
|
||||
static cell AMX_NATIVE_CALL amx_fopen(AMX *amx, cell *params)
|
||||
{
|
||||
int len, j = -1;
|
||||
int len;
|
||||
char *file = build_pathname("%s", get_amxstring(amx, params[1], 1, len));
|
||||
char *flags = get_amxstring(amx, params[2], 0, len);
|
||||
|
||||
@ -385,7 +383,6 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
|
||||
case 1:
|
||||
{
|
||||
char *a = new char[blocks];
|
||||
char *ptr = a;
|
||||
while (btmp--)
|
||||
*a++ = static_cast<char>(*addr++);
|
||||
size_t res = fwrite(a, sizeof(char), blocks, fp);
|
||||
@ -395,7 +392,6 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
|
||||
case 2:
|
||||
{
|
||||
short *a = new short[blocks];
|
||||
short *ptr = a;
|
||||
while (btmp--)
|
||||
*a++ = static_cast<short>(*addr++);
|
||||
size_t res = fwrite(a, sizeof(short), blocks, fp);
|
||||
@ -405,7 +401,6 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
|
||||
case 4:
|
||||
{
|
||||
int *a = new int[blocks];
|
||||
int *ptr = a;
|
||||
while (btmp--)
|
||||
*a++ = static_cast<int>(*addr++);
|
||||
size_t res = fwrite(a, sizeof(int), blocks, fp);
|
||||
@ -556,6 +551,18 @@ static cell AMX_NATIVE_CALL amx_fread_blocks(AMX *amx, cell *params)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL amx_fputs(AMX *amx, cell *params)
|
||||
{
|
||||
FILE *fp = (FILE *)params[1];
|
||||
|
||||
if (!fp)
|
||||
return 0;
|
||||
|
||||
int len;
|
||||
char *str = get_amxstring(amx, params[2], 0, len);
|
||||
return fputs(str, fp);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL amx_fgets(AMX *amx, cell *params)
|
||||
{
|
||||
FILE *fp = (FILE *)params[1];
|
||||
@ -672,13 +679,13 @@ static cell AMX_NATIVE_CALL amx_open_dir(AMX *amx, cell *params)
|
||||
DIR *dp = opendir(dirname);
|
||||
|
||||
if (!dp)
|
||||
return NULL;
|
||||
return 0;
|
||||
struct dirent *ep = readdir(dp);
|
||||
|
||||
if (!ep)
|
||||
{
|
||||
closedir(dp);
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
set_amxstring(amx, params[2], ep->d_name, params[3]);
|
||||
@ -789,6 +796,19 @@ static cell AMX_NATIVE_CALL amx_rmdir(AMX *amx, cell *params)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL amx_rename(AMX *amx, cell *params)
|
||||
{
|
||||
int len;
|
||||
char *fold = get_amxstring(amx, params[1], 0, len);
|
||||
char *fnew = get_amxstring(amx, params[2], 1, len);
|
||||
|
||||
#if defined __linux__
|
||||
return (rename(fold, fnew) == 0);
|
||||
#elif defined WIN32
|
||||
return MoveFileA(fold, fnew);
|
||||
#endif
|
||||
}
|
||||
|
||||
AMX_NATIVE_INFO file_Natives[] =
|
||||
{
|
||||
{"delete_file", delete_file},
|
||||
@ -822,5 +842,7 @@ AMX_NATIVE_INFO file_Natives[] =
|
||||
{"fputc", amx_fputc},
|
||||
{"fungetc", amx_ungetc},
|
||||
{"rmdir", amx_rmdir},
|
||||
{"fputs", amx_fputs},
|
||||
{"rename_file", amx_rename},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
@ -368,7 +368,6 @@ static cell AMX_NATIVE_CALL n_floatatan(AMX *amx, cell *params)
|
||||
* params[2] = radix
|
||||
*/
|
||||
REAL fA = amx_ctof(params[1]);
|
||||
fA = ToRadians(fA, params[2]);
|
||||
fA = atan(fA);
|
||||
fA = FromRadians(fA, params[2]);
|
||||
return amx_ftoc(fA);
|
||||
@ -425,6 +424,54 @@ static cell AMX_NATIVE_CALL n_floatatan2(AMX *amx, cell *params)
|
||||
return amx_ftoc(fC);
|
||||
}
|
||||
|
||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
||||
#pragma argsused
|
||||
#endif
|
||||
/* Added by DS */
|
||||
static cell AMX_NATIVE_CALL n_floatsinh(AMX *amx, cell *params)
|
||||
{
|
||||
/*
|
||||
* params[1] = angle
|
||||
* params[2] = radix
|
||||
*/
|
||||
REAL fA = amx_ctof(params[1]);
|
||||
fA = ToRadians(fA, params[2]);
|
||||
fA = sinh(fA);
|
||||
return amx_ftoc(fA);
|
||||
}
|
||||
|
||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
||||
#pragma argsused
|
||||
#endif
|
||||
/* Added by DS */
|
||||
static cell AMX_NATIVE_CALL n_floatcosh(AMX *amx, cell *params)
|
||||
{
|
||||
/*
|
||||
* params[1] = angle
|
||||
* params[2] = radix
|
||||
*/
|
||||
REAL fA = amx_ctof(params[1]);
|
||||
fA = ToRadians(fA, params[2]);
|
||||
fA = cosh(fA);
|
||||
return amx_ftoc(fA);
|
||||
}
|
||||
|
||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
||||
#pragma argsused
|
||||
#endif
|
||||
/* Added by DS */
|
||||
static cell AMX_NATIVE_CALL n_floattanh(AMX *amx, cell *params)
|
||||
{
|
||||
/*
|
||||
* params[1] = angle
|
||||
* params[2] = radix
|
||||
*/
|
||||
REAL fA = amx_ctof(params[1]);
|
||||
fA = ToRadians(fA, params[2]);
|
||||
fA = tanh(fA);
|
||||
return amx_ftoc(fA);
|
||||
}
|
||||
|
||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
||||
#pragma argsused
|
||||
#endif
|
||||
@ -457,6 +504,9 @@ AMX_NATIVE_INFO float_Natives[] = {
|
||||
{ "floatacos", n_floatacos },
|
||||
{ "floatatan", n_floatatan },
|
||||
{ "floatatan2", n_floatatan2 },
|
||||
{ "floatsinh", n_floatsinh },
|
||||
{ "floatcosh", n_floatcosh },
|
||||
{ "floattanh", n_floattanh },
|
||||
{ NULL, NULL } /* terminator */
|
||||
};
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "amxmodx.h"
|
||||
#include "format.h"
|
||||
#include "amxmod_compat.h"
|
||||
|
||||
//Adapted from Quake3's vsprintf
|
||||
// thanks to cybermind for linking me to this :)
|
||||
@ -80,14 +81,14 @@ const char *translate(AMX *amx, cell amxaddr, const char *key)
|
||||
const char *testlang = amx_mldebug->string;
|
||||
if (!g_langMngr.LangExists(testlang))
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] \"%s\" is an invalid debug language", testlang);
|
||||
AMXXLOG_Error("[AMXX] \"%s\" is an invalid debug language", testlang);
|
||||
validlang = false;
|
||||
}
|
||||
|
||||
g_langMngr.GetDef(testlang, key, debug_status);
|
||||
|
||||
if (validlang && debug_status == ERR_BADKEY)
|
||||
AMXXLOG_Log("[AMXX] Language key \"%s\" not found for language \"%s\", check \"%s\"", key, testlang, GetFileName(amx));
|
||||
AMXXLOG_Error("[AMXX] Language key \"%s\" not found for language \"%s\", check \"%s\"", key, testlang, GetFileName(amx));
|
||||
}
|
||||
|
||||
if (def == NULL)
|
||||
@ -96,7 +97,7 @@ const char *translate(AMX *amx, cell amxaddr, const char *key)
|
||||
{
|
||||
if (status == ERR_BADLANG && (BadLang_Table.AltFindOrInsert(pLangName).last + 120.0f < gpGlobals->time))
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] Language \"%s\" not found", pLangName);
|
||||
AMXXLOG_Error("[AMXX] Language \"%s\" not found", pLangName);
|
||||
BadLang_Table.AltFindOrInsert(pLangName).last = gpGlobals->time;
|
||||
}
|
||||
}
|
||||
@ -224,6 +225,50 @@ void AddFloat(U **buf_p, size_t &maxlen, double fval, int width, int prec)
|
||||
}
|
||||
}
|
||||
|
||||
template <typename U>
|
||||
void AddUInt(U **buf_p, size_t &maxlen, unsigned int val, int width, int flags)
|
||||
{
|
||||
U text[32];
|
||||
int digits;
|
||||
U *buf;
|
||||
|
||||
digits = 0;
|
||||
do {
|
||||
text[digits++] = '0' + val % 10;
|
||||
val /= 10;
|
||||
} while (val);
|
||||
|
||||
buf = *buf_p;
|
||||
|
||||
if( !(flags & LADJUST) )
|
||||
{
|
||||
while (digits < width && maxlen)
|
||||
{
|
||||
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
|
||||
width--;
|
||||
maxlen--;
|
||||
}
|
||||
}
|
||||
|
||||
while (digits-- && maxlen)
|
||||
{
|
||||
*buf++ = text[digits];
|
||||
width--;
|
||||
maxlen--;
|
||||
}
|
||||
|
||||
if (flags & LADJUST)
|
||||
{
|
||||
while (width-- && maxlen)
|
||||
{
|
||||
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
|
||||
maxlen--;
|
||||
}
|
||||
}
|
||||
|
||||
*buf_p = buf;
|
||||
}
|
||||
|
||||
template <typename U>
|
||||
void AddInt(U **buf_p, size_t &maxlen, int val, int width, int flags)
|
||||
{
|
||||
@ -231,15 +276,21 @@ void AddInt(U **buf_p, size_t &maxlen, int val, int width, int flags)
|
||||
int digits;
|
||||
int signedVal;
|
||||
U *buf;
|
||||
unsigned int unsignedVal;
|
||||
|
||||
digits = 0;
|
||||
signedVal = val;
|
||||
if (val < 0)
|
||||
val = -val;
|
||||
{
|
||||
/* we want the unsigned version */
|
||||
unsignedVal = abs(val);
|
||||
} else {
|
||||
unsignedVal = val;
|
||||
}
|
||||
do {
|
||||
text[digits++] = '0' + val % 10;
|
||||
val /= 10;
|
||||
} while (val);
|
||||
text[digits++] = '0' + unsignedVal % 10;
|
||||
unsignedVal /= 10;
|
||||
} while (unsignedVal);
|
||||
|
||||
if (signedVal < 0)
|
||||
text[digits++] = '-';
|
||||
@ -360,6 +411,11 @@ reswitch:
|
||||
AddInt(&buf_p, llen, *get_amxaddr(amx, params[arg]), width, flags);
|
||||
arg++;
|
||||
break;
|
||||
case 'u':
|
||||
CHECK_ARGS(0);
|
||||
AddUInt(&buf_p, llen, static_cast<unsigned int>(*get_amxaddr(amx, params[arg])), width, flags);
|
||||
arg++;
|
||||
break;
|
||||
case 'f':
|
||||
CHECK_ARGS(0);
|
||||
AddFloat(&buf_p, llen, amx_ctof(*get_amxaddr(amx, params[arg])), width, prec);
|
||||
@ -367,6 +423,24 @@ reswitch:
|
||||
break;
|
||||
case 's':
|
||||
CHECK_ARGS(0);
|
||||
if (amx->flags & AMX_FLAG_OLDFILE)
|
||||
{
|
||||
cell *addr = get_amxaddr(amx, params[arg]);
|
||||
if (*addr & BCOMPAT_TRANSLATE_BITS)
|
||||
{
|
||||
const char *key, *def;
|
||||
if (!translate_bcompat(amx, addr, &key, &def))
|
||||
{
|
||||
goto break_to_normal_string;
|
||||
}
|
||||
arg++;
|
||||
size_t written = atcprintf(buf_p, llen, def, amx, params, &arg);
|
||||
buf_p += written;
|
||||
llen -= written;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break_to_normal_string:
|
||||
AddString(&buf_p, llen, get_amxaddr(amx, params[arg]), width, prec);
|
||||
arg++;
|
||||
break;
|
||||
|
@ -5,4 +5,7 @@
|
||||
template <typename D, typename S>
|
||||
size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param);
|
||||
|
||||
const char *translate(AMX *amx, cell amxaddr, const char *key);
|
||||
bool translate_bcompat(AMX *amx, cell *source, const char **_key, const char **_def);
|
||||
|
||||
#endif //_INCLUDE_FORMATTING_H
|
||||
|
243
amxmodx/libraries.cpp
Normal file
243
amxmodx/libraries.cpp
Normal file
@ -0,0 +1,243 @@
|
||||
#include "libraries.h"
|
||||
#include "sh_list.h"
|
||||
|
||||
List<Library *> g_libraries;
|
||||
|
||||
bool AddLibrary(const char *name, LibType type, LibSource src, void *parent)
|
||||
{
|
||||
if (FindLibrary(name, type))
|
||||
return false;
|
||||
|
||||
Library *lib = new Library;
|
||||
|
||||
lib->name.assign(name);
|
||||
lib->type = type;
|
||||
lib->src = src;
|
||||
lib->parent = parent;
|
||||
|
||||
g_libraries.push_back(lib);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DecodeLibCmdString(const char *str, LibDecoder *dec)
|
||||
{
|
||||
if (dec->buffer)
|
||||
{
|
||||
free(dec->buffer);
|
||||
dec->buffer = NULL;
|
||||
}
|
||||
if (str[0] != '?')
|
||||
{
|
||||
return false;
|
||||
} else {
|
||||
str++;
|
||||
if (*str == 'r')
|
||||
{
|
||||
str++;
|
||||
if (*str == 'c')
|
||||
dec->cmd = LibCmd_ReqClass;
|
||||
else if (*str == 'l')
|
||||
dec->cmd = LibCmd_ReqLib;
|
||||
else
|
||||
return false;
|
||||
str++;
|
||||
} else if (*str == 'f') {
|
||||
str++;
|
||||
dec->cmd = LibCmd_ForceLib;
|
||||
} else if (*str == 'e') {
|
||||
str++;
|
||||
if (*str == 'c')
|
||||
dec->cmd = LibCmd_ExpectClass;
|
||||
else if (*str == 'l')
|
||||
dec->cmd = LibCmd_ExpectLib;
|
||||
else
|
||||
return false;
|
||||
str++;
|
||||
} else if (*str == 'd') {
|
||||
str++;
|
||||
dec->cmd = LibCmd_DefaultLib;
|
||||
}
|
||||
if (*str != '_')
|
||||
return false;
|
||||
str++;
|
||||
if (dec->cmd < LibCmd_ExpectLib)
|
||||
{
|
||||
dec->buffer = strdup(str);
|
||||
dec->param1 = dec->buffer;
|
||||
dec->param2 = NULL;
|
||||
} else {
|
||||
dec->buffer = strdup(str);
|
||||
char *p = strchr(dec->buffer, '_');
|
||||
while (p && (*(p+1) == '_'))
|
||||
p = strchr(p+2, '_');
|
||||
if (!p || !*(p+1))
|
||||
return false;
|
||||
*p = '\0';
|
||||
dec->param1 = dec->buffer;
|
||||
dec->param2 = p+1;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t AddLibrariesFromString(const char *name, LibType type, LibSource src, void *parent)
|
||||
{
|
||||
char buffer[255];
|
||||
char *ptr, *p, s;
|
||||
size_t count = 0;
|
||||
|
||||
snprintf(buffer, sizeof(buffer)-1, "%s", name);
|
||||
|
||||
ptr = buffer;
|
||||
p = buffer;
|
||||
while (*p)
|
||||
{
|
||||
while (*p && (*p != ','))
|
||||
p++;
|
||||
s = *p;
|
||||
*p = '\0';
|
||||
if (AddLibrary(ptr, type, src, parent))
|
||||
count++;
|
||||
if (!s)
|
||||
break;
|
||||
p++;
|
||||
while (*p && (*p == ','))
|
||||
p++;
|
||||
ptr = p;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
size_t ClearLibraries(LibSource src)
|
||||
{
|
||||
List<Library *>::iterator iter;
|
||||
size_t count = 0;
|
||||
|
||||
iter = g_libraries.begin();
|
||||
while (iter != g_libraries.end())
|
||||
{
|
||||
if ( (*iter)->src == src )
|
||||
{
|
||||
delete (*iter);
|
||||
iter = g_libraries.erase(iter);
|
||||
count++;
|
||||
} else {
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
size_t RemoveLibraries(void *parent)
|
||||
{
|
||||
List<Library *>::iterator iter;
|
||||
Library *lib;
|
||||
size_t count = 0;
|
||||
|
||||
iter = g_libraries.begin();
|
||||
while (iter != g_libraries.end())
|
||||
{
|
||||
lib = (*iter);
|
||||
if (lib->parent == parent)
|
||||
{
|
||||
delete (*iter);
|
||||
iter = g_libraries.erase(iter);
|
||||
count++;
|
||||
} else {
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
bool FindLibrary(const char *name, LibType type)
|
||||
{
|
||||
List<Library *>::iterator iter;
|
||||
Library *lib;
|
||||
|
||||
for (iter = g_libraries.begin(); iter != g_libraries.end(); iter++)
|
||||
{
|
||||
lib = (*iter);
|
||||
if (lib->type != type)
|
||||
continue;
|
||||
if (strcasecmp(lib->name.c_str(), name) == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
LibError RunLibCommand(const LibDecoder *enc)
|
||||
{
|
||||
List<Library *>::iterator iter,end;
|
||||
Library *lib;
|
||||
|
||||
iter = g_libraries.begin();
|
||||
end = g_libraries.end();
|
||||
|
||||
if ( (enc->cmd == LibCmd_ReqLib) || (enc->cmd == LibCmd_ReqClass) )
|
||||
{
|
||||
LibType expect = LibType_Library;
|
||||
|
||||
if (enc->cmd == LibCmd_ReqLib)
|
||||
expect = LibType_Library;
|
||||
else if (enc->cmd == LibCmd_ReqClass)
|
||||
expect = LibType_Class;
|
||||
|
||||
/** see if it exists */
|
||||
for (; iter != end; iter++)
|
||||
{
|
||||
lib = (*iter);
|
||||
if (lib->type != expect)
|
||||
continue;
|
||||
if (strcasecmp(lib->name.c_str(), enc->param1) == 0)
|
||||
return LibErr_None;
|
||||
}
|
||||
if (expect == LibType_Library)
|
||||
return LibErr_NoLibrary;
|
||||
else if (expect == LibType_Class)
|
||||
return LibErr_NoClass;
|
||||
|
||||
return LibErr_NoLibrary;
|
||||
} else if (enc->cmd == LibCmd_ForceLib) {
|
||||
if (!LoadModule(enc->param1, PT_ANYTIME, true, true))
|
||||
{
|
||||
return LibErr_NoLibrary;
|
||||
}
|
||||
} else if ( (enc->cmd == LibCmd_DefaultLib) ||
|
||||
((enc->cmd == LibCmd_ExpectLib) || (enc->cmd == LibCmd_ExpectClass)) )
|
||||
{
|
||||
LibType expect;
|
||||
|
||||
if (enc->cmd == LibCmd_ExpectLib)
|
||||
expect = LibType_Library;
|
||||
else
|
||||
expect = LibType_Class;
|
||||
|
||||
/** see if it exists */
|
||||
for (; iter != end; iter++)
|
||||
{
|
||||
lib = (*iter);
|
||||
if (lib->type != expect)
|
||||
continue;
|
||||
if (strcasecmp(lib->name.c_str(), enc->param1) == 0)
|
||||
return LibErr_None;
|
||||
}
|
||||
|
||||
if (!LoadModule(enc->param2, PT_ANYTIME, true, true))
|
||||
{
|
||||
return LibErr_NoLibrary;
|
||||
}
|
||||
|
||||
return LibErr_None;
|
||||
}
|
||||
|
||||
return LibErr_None;
|
||||
}
|
73
amxmodx/libraries.h
Normal file
73
amxmodx/libraries.h
Normal file
@ -0,0 +1,73 @@
|
||||
#ifndef _INCLUDE_LIBRARIES_H
|
||||
#define _INCLUDE_LIBRARIES_H
|
||||
|
||||
#include <string.h>
|
||||
#include "amxmodx.h"
|
||||
#include "CString.h"
|
||||
|
||||
enum LibSource
|
||||
{
|
||||
LibSource_Plugin,
|
||||
LibSource_Module
|
||||
};
|
||||
|
||||
enum LibType
|
||||
{
|
||||
LibType_Library,
|
||||
LibType_Class
|
||||
};
|
||||
|
||||
struct Library
|
||||
{
|
||||
String name;
|
||||
LibSource src;
|
||||
LibType type;
|
||||
void *parent;
|
||||
};
|
||||
|
||||
enum LibCmd
|
||||
{
|
||||
LibCmd_ReqLib,
|
||||
LibCmd_ReqClass,
|
||||
LibCmd_ForceLib,
|
||||
LibCmd_ExpectLib,
|
||||
LibCmd_ExpectClass,
|
||||
LibCmd_DefaultLib,
|
||||
};
|
||||
|
||||
enum LibError
|
||||
{
|
||||
LibErr_None = 0,
|
||||
LibErr_NoLibrary,
|
||||
LibErr_NoClass,
|
||||
};
|
||||
|
||||
class LibDecoder
|
||||
{
|
||||
public:
|
||||
LibDecoder() : buffer(NULL)
|
||||
{
|
||||
}
|
||||
~LibDecoder()
|
||||
{
|
||||
free(buffer);
|
||||
buffer = NULL;
|
||||
param1 = NULL;
|
||||
param2 = NULL;
|
||||
}
|
||||
char *buffer;
|
||||
char *param1;
|
||||
char *param2;
|
||||
LibCmd cmd;
|
||||
};
|
||||
|
||||
bool AddLibrary(const char *name, LibType type, LibSource src, void *parent=NULL);
|
||||
bool DecodeLibCmdString(const char *str, LibDecoder *cmd);
|
||||
size_t AddLibrariesFromString(const char *name, LibType type, LibSource src, void *parent=NULL);
|
||||
size_t ClearLibraries(LibSource src);
|
||||
LibError RunLibCommand(const LibDecoder *enc);
|
||||
size_t RemoveLibraries(void *parent);
|
||||
bool FindLibrary(const char *name, LibType type);
|
||||
|
||||
|
||||
#endif //_INCLUDE_LIBRARIES_H
|
@ -111,7 +111,7 @@ void MD5::update(FILE *file){
|
||||
unsigned char buffer[1024];
|
||||
int len;
|
||||
|
||||
while (len=fread(buffer, 1, 1024, file))
|
||||
while ((len=fread(buffer, 1, 1024, file)))
|
||||
update(buffer, len);
|
||||
|
||||
fclose (file);
|
||||
|
805
amxmodx/messages.cpp
Executable file
805
amxmodx/messages.cpp
Executable file
@ -0,0 +1,805 @@
|
||||
#include "amxmodx.h"
|
||||
#include "messages.h"
|
||||
|
||||
Message Msg;
|
||||
CVector<int> msgHooks[256];
|
||||
int msgBlocks[256] = {BLOCK_NOT};
|
||||
int msgDest;
|
||||
int msgType;
|
||||
float *msgOrigin;
|
||||
edict_t *msgpEntity;
|
||||
bool inhook = false;
|
||||
bool inblock = false;
|
||||
enginefuncs_t *g_pEngTable = NULL;
|
||||
|
||||
void ClearMessages()
|
||||
{
|
||||
for (size_t i=0; i<MAX_MESSAGES; i++)
|
||||
{
|
||||
msgHooks[i].clear();
|
||||
msgBlocks[i] = BLOCK_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
Message::Message()
|
||||
{
|
||||
m_CurParam = 0;
|
||||
}
|
||||
|
||||
bool Message::Ready()
|
||||
{
|
||||
if (!m_Params.size())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void Message::Init()
|
||||
{
|
||||
if (!Ready())
|
||||
{
|
||||
msgparam *p = new msgparam;
|
||||
m_Params.push_back(p);
|
||||
}
|
||||
m_CurParam = 0;
|
||||
}
|
||||
|
||||
Message::~Message()
|
||||
{
|
||||
for (size_t i=0; i<m_Params.size(); i++)
|
||||
delete m_Params[i];
|
||||
|
||||
m_Params.clear();
|
||||
}
|
||||
|
||||
msgparam *Message::AdvPtr()
|
||||
{
|
||||
msgparam *pParam = NULL;
|
||||
|
||||
if (++m_CurParam >= m_Params.size())
|
||||
{
|
||||
pParam = new msgparam;
|
||||
m_Params.push_back(pParam);
|
||||
} else {
|
||||
pParam = m_Params[m_CurParam];
|
||||
}
|
||||
|
||||
return pParam;
|
||||
}
|
||||
|
||||
void Message::AddParam(const char *data, msgtype type)
|
||||
{
|
||||
msgparam *pParam = AdvPtr();
|
||||
|
||||
pParam->szData.assign(data);
|
||||
pParam->type = type;
|
||||
}
|
||||
|
||||
void Message::AddParam(int data, msgtype type)
|
||||
{
|
||||
msgparam *pParam = AdvPtr();
|
||||
|
||||
pParam->v.iData = data;
|
||||
pParam->type = type;
|
||||
}
|
||||
|
||||
void Message::AddParam(float data, msgtype type)
|
||||
{
|
||||
msgparam *pParam = AdvPtr();
|
||||
|
||||
pParam->v.fData = data;
|
||||
pParam->type = type;
|
||||
}
|
||||
|
||||
msgtype Message::GetParamType(size_t index)
|
||||
{
|
||||
if (index < 1 || index > m_CurParam)
|
||||
return static_cast<msgtype>(0);
|
||||
|
||||
return m_Params[index]->type;
|
||||
}
|
||||
|
||||
float Message::GetParamFloat(size_t index)
|
||||
{
|
||||
if (index < 1 || index > m_CurParam)
|
||||
return 0;
|
||||
|
||||
return m_Params[index]->v.fData;
|
||||
}
|
||||
|
||||
const char *Message::GetParamString(size_t index)
|
||||
{
|
||||
if (index < 1 || index > m_CurParam)
|
||||
return 0;
|
||||
|
||||
return m_Params[index]->szData.c_str();
|
||||
}
|
||||
|
||||
int Message::GetParamInt(size_t index)
|
||||
{
|
||||
if (index < 1 || index > m_CurParam)
|
||||
return 0;
|
||||
|
||||
return m_Params[index]->v.iData;
|
||||
}
|
||||
|
||||
void Message::SetParam(size_t index, float data)
|
||||
{
|
||||
if (index < 1 || index > m_CurParam)
|
||||
return;
|
||||
|
||||
m_Params[index]->v.fData = data;
|
||||
}
|
||||
|
||||
void Message::SetParam(size_t index, int data)
|
||||
{
|
||||
if (index < 1 || index > m_CurParam)
|
||||
return;
|
||||
|
||||
m_Params[index]->v.iData = data;
|
||||
}
|
||||
|
||||
void Message::SetParam(size_t index, const char *data)
|
||||
{
|
||||
if (index < 1 || index > m_CurParam)
|
||||
return;
|
||||
|
||||
m_Params[index]->szData.assign(data);
|
||||
}
|
||||
|
||||
void Message::Reset()
|
||||
{
|
||||
m_CurParam = 0;
|
||||
}
|
||||
|
||||
size_t Message::Params()
|
||||
{
|
||||
return m_CurParam;
|
||||
}
|
||||
|
||||
void Message::Send()
|
||||
{
|
||||
msgparam *pParam = NULL;
|
||||
|
||||
for (size_t i=1; i<=m_CurParam; i++)
|
||||
{
|
||||
pParam = m_Params[i];
|
||||
switch (pParam->type)
|
||||
{
|
||||
case arg_byte:
|
||||
WRITE_BYTE(pParam->v.iData);
|
||||
break;
|
||||
case arg_char:
|
||||
WRITE_CHAR(pParam->v.iData);
|
||||
break;
|
||||
case arg_short:
|
||||
WRITE_SHORT(pParam->v.iData);
|
||||
break;
|
||||
case arg_long:
|
||||
WRITE_LONG(pParam->v.iData);
|
||||
break;
|
||||
case arg_angle:
|
||||
WRITE_ANGLE(pParam->v.fData);
|
||||
break;
|
||||
case arg_coord:
|
||||
WRITE_COORD(pParam->v.fData);
|
||||
break;
|
||||
case arg_string:
|
||||
WRITE_STRING(pParam->szData.c_str());
|
||||
break;
|
||||
case arg_entity:
|
||||
WRITE_ENTITY(pParam->v.iData);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void C_MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)
|
||||
{
|
||||
if (msgBlocks[msg_type])
|
||||
{
|
||||
inblock = true;
|
||||
msgType = msg_type;
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
} else if (msgHooks[msg_type].size()) {
|
||||
inhook = true;
|
||||
msgDest = msg_dest;
|
||||
msgType = msg_type;
|
||||
msgOrigin = (float *)pOrigin;
|
||||
msgpEntity = ed;
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_WriteByte(int iValue)
|
||||
{
|
||||
if (inblock)
|
||||
{
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
} else if (inhook) {
|
||||
Msg.AddParam(iValue, arg_byte);
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_WriteChar(int iValue)
|
||||
{
|
||||
if (inblock)
|
||||
{
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
} else if (inhook) {
|
||||
Msg.AddParam(iValue, arg_char);
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_WriteShort(int iValue)
|
||||
{
|
||||
if (inblock)
|
||||
{
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
} else if (inhook) {
|
||||
Msg.AddParam(iValue, arg_short);
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_WriteLong(int iValue)
|
||||
{
|
||||
if (inblock)
|
||||
{
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
} else if (inhook) {
|
||||
Msg.AddParam(iValue, arg_long);
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_WriteAngle(float flValue)
|
||||
{
|
||||
if (inblock)
|
||||
{
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
} else if (inhook) {
|
||||
Msg.AddParam(flValue, arg_angle);
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_WriteCoord(float flValue)
|
||||
{
|
||||
if (inblock)
|
||||
{
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
} else if (inhook) {
|
||||
Msg.AddParam(flValue, arg_coord);
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_WriteString(const char *sz)
|
||||
{
|
||||
if (inblock)
|
||||
{
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
} else if (inhook) {
|
||||
Msg.AddParam(sz, arg_string);
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_WriteEntity(int iValue)
|
||||
{
|
||||
if (inblock)
|
||||
{
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
} else if (inhook) {
|
||||
Msg.AddParam(iValue, arg_entity);
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_MessageEnd(void)
|
||||
{
|
||||
int mres = 0, mresB = 0;
|
||||
unsigned int i = 0;
|
||||
if (inblock)
|
||||
{
|
||||
inblock = false;
|
||||
if (msgBlocks[msgType] == BLOCK_ONCE)
|
||||
{
|
||||
msgBlocks[msgType] = BLOCK_NOT;
|
||||
}
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
} else if (inhook) {
|
||||
for (i=0; i<msgHooks[msgType].size(); i++)
|
||||
{
|
||||
mresB = executeForwards(msgHooks[msgType].at(i), (cell)msgType, (cell)msgDest, (cell)ENTINDEX(msgpEntity));
|
||||
if (mresB > mres)
|
||||
mres = mresB;
|
||||
}
|
||||
inhook = false;
|
||||
if (mres & 1)
|
||||
{
|
||||
Msg.Reset();
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
/* send the real message */
|
||||
MESSAGE_BEGIN(msgDest, msgType, msgOrigin, msgpEntity);
|
||||
Msg.Send();
|
||||
MESSAGE_END();
|
||||
|
||||
/* reset */
|
||||
Msg.Reset();
|
||||
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL message_begin(AMX *amx, cell *params) /* 4 param */
|
||||
{
|
||||
int numparam = *params / sizeof(cell);
|
||||
float vecOrigin[3];
|
||||
cell *cpOrigin;
|
||||
|
||||
if (params[2] < 1 || ((params[2] > 63) // maximal number of engine messages
|
||||
&& !GET_USER_MSG_NAME(PLID, params[2], NULL)))
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Plugin called message_begin with an invalid message id (%d).", params[2]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (params[1])
|
||||
{
|
||||
case MSG_BROADCAST:
|
||||
case MSG_ALL:
|
||||
case MSG_SPEC:
|
||||
MESSAGE_BEGIN(params[1], params[2], NULL);
|
||||
break;
|
||||
case MSG_PVS: case MSG_PAS:
|
||||
case MSG_PVS_R: case MSG_PAS_R:
|
||||
if (numparam < 3)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cpOrigin = get_amxaddr(amx, params[3]);
|
||||
|
||||
vecOrigin[0] = static_cast<float>(*cpOrigin);
|
||||
vecOrigin[1] = static_cast<float>(*(cpOrigin + 1));
|
||||
vecOrigin[2] = static_cast<float>(*(cpOrigin + 2));
|
||||
|
||||
MESSAGE_BEGIN(params[1], params[2], vecOrigin);
|
||||
|
||||
break;
|
||||
case MSG_ONE_UNRELIABLE:
|
||||
case MSG_ONE:
|
||||
if (numparam < 4)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
MESSAGE_BEGIN(params[1], params[2], NULL, INDEXENT(params[4]));
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL message_end(AMX *amx, cell *params)
|
||||
{
|
||||
MESSAGE_END();
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL write_byte(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
WRITE_BYTE(params[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL write_char(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
WRITE_CHAR(params[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL write_short(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
WRITE_SHORT(params[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL write_long(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
WRITE_LONG(params[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL write_entity(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
WRITE_ENTITY(params[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL write_angle(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
WRITE_ANGLE(static_cast<float>(params[1]));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL write_coord(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
WRITE_COORD(static_cast<float>(params[1]));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL write_string(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
int a;
|
||||
WRITE_STRING(get_amxstring(amx, params[1], 3, a));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL register_message(AMX *amx, cell *params)
|
||||
{
|
||||
int len;
|
||||
char *name = get_amxstring(amx, params[2], 0, len);
|
||||
|
||||
if (!Msg.Ready())
|
||||
Msg.Init();
|
||||
|
||||
if (params[1]>0 && params[1] < 256)
|
||||
{
|
||||
int id = registerSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
if (id != -1)
|
||||
{
|
||||
msgHooks[params[1]].push_back(id);
|
||||
return id;
|
||||
} else {
|
||||
LogError(amx, AMX_ERR_NOTFOUND, "Could not find function \"%s\"", name);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL set_msg_block(AMX *amx, cell *params)
|
||||
{
|
||||
int msgid = params[1];
|
||||
int block = params[2];
|
||||
|
||||
if (msgid < 1 || msgid > 255)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid message id");
|
||||
return 0;
|
||||
}
|
||||
|
||||
msgBlocks[msgid] = block;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_msg_block(AMX *amx, cell *params)
|
||||
{
|
||||
int msgid = params[1];
|
||||
|
||||
if (msgid < 1 || msgid > 255)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid message id");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return msgBlocks[msgid];
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_msg_args(AMX *amx, cell *params)
|
||||
{
|
||||
return Msg.Params();
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_msg_argtype(AMX *amx, cell *params)
|
||||
{
|
||||
size_t argn = static_cast<size_t>(params[1]);
|
||||
|
||||
if (!inhook || argn > Msg.Params())
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return Msg.GetParamType(argn);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_msg_arg_int(AMX *amx, cell *params)
|
||||
{
|
||||
size_t argn = static_cast<size_t>(params[1]);
|
||||
|
||||
if (!inhook || argn > Msg.Params())
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return Msg.GetParamInt(argn);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL set_msg_arg_int(AMX *amx, cell *params)
|
||||
{
|
||||
size_t argn = static_cast<size_t>(params[1]);
|
||||
|
||||
if (!inhook || argn > Msg.Params())
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Msg.SetParam(argn, (int)params[3]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_msg_arg_float(AMX *amx, cell *params)
|
||||
{
|
||||
size_t argn = static_cast<size_t>(params[1]);
|
||||
|
||||
if (!inhook || argn > Msg.Params())
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
REAL f = (REAL)Msg.GetParamFloat(argn);
|
||||
return amx_ftoc(f);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL set_msg_arg_float(AMX *amx, cell *params)
|
||||
{
|
||||
size_t argn = static_cast<size_t>(params[1]);
|
||||
|
||||
if (!inhook || argn > Msg.Params())
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
REAL fVal = amx_ctof(params[3]);
|
||||
|
||||
Msg.SetParam(argn, (float)fVal);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_msg_arg_string(AMX *amx, cell *params)
|
||||
{
|
||||
size_t argn = static_cast<size_t>(params[1]);
|
||||
|
||||
if (!inhook || argn > Msg.Params())
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *szVal = Msg.GetParamString(argn);
|
||||
|
||||
return set_amxstring(amx, params[2], szVal, params[3]);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL set_msg_arg_string(AMX *amx, cell *params)
|
||||
{
|
||||
size_t argn = static_cast<size_t>(params[1]);
|
||||
int iLen;
|
||||
|
||||
if (!inhook || argn > Msg.Params())
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid message argument %d", argn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *szVal = get_amxstring(amx, params[2], 0, iLen);
|
||||
|
||||
Msg.SetParam(argn, szVal);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_msg_origin(AMX *amx, cell *params)
|
||||
{
|
||||
if (!inhook)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Not in a message hook");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cell *cAddr = get_amxaddr(amx, params[1]);
|
||||
|
||||
if (msgDest >= MSG_PVS && msgDest <= MSG_PAS_R)
|
||||
{
|
||||
vec3_t vRet = (Vector)msgOrigin;
|
||||
cAddr[0] = FloatToCell(vRet.x);
|
||||
cAddr[1] = FloatToCell(vRet.y);
|
||||
cAddr[2] = FloatToCell(vRet.z);
|
||||
} else {
|
||||
cAddr[0] = 0;
|
||||
cAddr[1] = 0;
|
||||
cAddr[2] = 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL emessage_begin(AMX *amx, cell *params) /* 4 param */
|
||||
{
|
||||
int numparam = *params / sizeof(cell);
|
||||
float vecOrigin[3];
|
||||
cell *cpOrigin;
|
||||
|
||||
if (params[2] < 1 || ((params[2] > 63) // maximal number of engine messages
|
||||
&& !GET_USER_MSG_NAME(PLID, params[2], NULL)))
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Plugin called message_begin with an invalid message id (%d).", params[2]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (params[1])
|
||||
{
|
||||
case MSG_BROADCAST:
|
||||
case MSG_ALL:
|
||||
case MSG_SPEC:
|
||||
g_pEngTable->pfnMessageBegin(params[1], params[2], NULL, NULL);
|
||||
break;
|
||||
case MSG_PVS: case MSG_PAS:
|
||||
case MSG_PVS_R: case MSG_PAS_R:
|
||||
if (numparam < 3)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cpOrigin = get_amxaddr(amx, params[3]);
|
||||
|
||||
vecOrigin[0] = static_cast<float>(*cpOrigin);
|
||||
vecOrigin[1] = static_cast<float>(*(cpOrigin + 1));
|
||||
vecOrigin[2] = static_cast<float>(*(cpOrigin + 2));
|
||||
|
||||
g_pEngTable->pfnMessageBegin(params[1], params[2], vecOrigin, NULL);
|
||||
|
||||
break;
|
||||
case MSG_ONE_UNRELIABLE:
|
||||
case MSG_ONE:
|
||||
if (numparam < 4)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
g_pEngTable->pfnMessageBegin(params[1], params[2], NULL, INDEXENT(params[4]));
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL emessage_end(AMX *amx, cell *params)
|
||||
{
|
||||
g_pEngTable->pfnMessageEnd();
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL ewrite_byte(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
g_pEngTable->pfnWriteByte(params[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL ewrite_char(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
g_pEngTable->pfnWriteChar(params[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL ewrite_short(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
g_pEngTable->pfnWriteShort(params[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL ewrite_long(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
g_pEngTable->pfnWriteLong(params[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL ewrite_entity(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
g_pEngTable->pfnWriteEntity(params[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL ewrite_angle(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
g_pEngTable->pfnWriteAngle(static_cast<float>(params[1]));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL ewrite_coord(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
g_pEngTable->pfnWriteCoord(static_cast<float>(params[1]));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL ewrite_string(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
int a;
|
||||
g_pEngTable->pfnWriteString(get_amxstring(amx, params[1], 3, a));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
AMX_NATIVE_INFO msg_Natives[] =
|
||||
{
|
||||
{"message_begin", message_begin},
|
||||
{"message_end", message_end},
|
||||
|
||||
{"write_angle", write_angle},
|
||||
{"write_byte", write_byte},
|
||||
{"write_char", write_char},
|
||||
{"write_coord", write_coord},
|
||||
{"write_entity", write_entity},
|
||||
{"write_long", write_long},
|
||||
{"write_short", write_short},
|
||||
{"write_string", write_string},
|
||||
|
||||
{"register_message", register_message},
|
||||
|
||||
{"set_msg_block", set_msg_block},
|
||||
{"get_msg_block", get_msg_block},
|
||||
|
||||
{"get_msg_args", get_msg_args},
|
||||
{"get_msg_argtype", get_msg_argtype},
|
||||
{"get_msg_arg_int", get_msg_arg_int},
|
||||
{"set_msg_arg_int", set_msg_arg_int},
|
||||
{"get_msg_arg_float", get_msg_arg_float},
|
||||
{"set_msg_arg_float", set_msg_arg_float},
|
||||
{"get_msg_arg_string", get_msg_arg_string},
|
||||
{"set_msg_arg_string", set_msg_arg_string},
|
||||
{"get_msg_origin", get_msg_origin},
|
||||
|
||||
{"emessage_begin", emessage_begin},
|
||||
{"emessage_end", emessage_end},
|
||||
|
||||
{"ewrite_angle", ewrite_angle},
|
||||
{"ewrite_byte", ewrite_byte},
|
||||
{"ewrite_char", ewrite_char},
|
||||
{"ewrite_coord", ewrite_coord},
|
||||
{"ewrite_entity", ewrite_entity},
|
||||
{"ewrite_long", ewrite_long},
|
||||
{"ewrite_short", ewrite_short},
|
||||
{"ewrite_string", ewrite_string},
|
||||
|
||||
{NULL, NULL},
|
||||
};
|
@ -1,10 +1,16 @@
|
||||
#ifndef _MSGS_INCLUDE_H
|
||||
#define _MSGS_INCLUDE_H
|
||||
|
||||
#include "engine.h"
|
||||
#include <extdll.h>
|
||||
#include <meta_api.h>
|
||||
#include "amx.h"
|
||||
#include "CVector.h"
|
||||
#include "CString.h"
|
||||
|
||||
#define MAX_MESSAGES 255
|
||||
|
||||
#define MSGBLOCK_SET 0
|
||||
#define MSGBLOCK_GET 1
|
||||
#define BLOCK_NOT 0
|
||||
#define BLOCK_ONCE 1
|
||||
#define BLOCK_SET 2
|
||||
@ -59,9 +65,21 @@ private:
|
||||
size_t m_CurParam;
|
||||
};
|
||||
|
||||
extern AMX_NATIVE_INFO msg_Natives[];
|
||||
void C_MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
|
||||
void C_WriteByte(int iValue);
|
||||
void C_WriteChar(int iValue);
|
||||
void C_WriteShort(int iValue);
|
||||
void C_WriteLong(int iValue);
|
||||
void C_WriteAngle(float flValue);
|
||||
void C_WriteCoord(float flValue);
|
||||
void C_WriteString(const char *sz);
|
||||
void C_WriteEntity(int iValue);
|
||||
void C_MessageEnd(void);
|
||||
|
||||
extern CVector<int> msgHooks[256];
|
||||
extern int msgBlocks[256];
|
||||
|
||||
void ClearMessages();
|
||||
|
||||
#endif //_MSGS_INCLUDE_H
|
||||
|
@ -33,6 +33,8 @@
|
||||
|
||||
#if defined WIN32
|
||||
#include <direct.h>
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
|
||||
#include "amxmodx.h"
|
||||
@ -41,6 +43,9 @@
|
||||
#include "natives.h"
|
||||
#include "binlog.h"
|
||||
#include "optimizer.h"
|
||||
#include "libraries.h"
|
||||
#include "messages.h"
|
||||
#include "amxmod_compat.h"
|
||||
|
||||
plugin_info_t Plugin_info =
|
||||
{
|
||||
@ -149,6 +154,96 @@ int FF_InconsistentFile = -1;
|
||||
int FF_ClientAuthorized = -1;
|
||||
int FF_ChangeLevel = -1;
|
||||
|
||||
void ParseAndOrAdd(CStack<String *> & files, const char *name)
|
||||
{
|
||||
if (strncmp(name, "plugins-", 8) == 0)
|
||||
{
|
||||
#if !defined WIN32
|
||||
size_t len = strlen(name);
|
||||
if (strcmp(&name[len-4], ".ini") == 0)
|
||||
{
|
||||
#endif
|
||||
String *pString = new String(name);
|
||||
files.push(pString);
|
||||
#if !defined WIN32
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void BuildPluginFileList(const char *initialdir, CStack<String *> & files)
|
||||
{
|
||||
char path[255];
|
||||
#if defined WIN32
|
||||
build_pathname_r(path, sizeof(path)-1, "%s/*.ini", initialdir);
|
||||
_finddata_t fd;
|
||||
intptr_t handle = _findfirst(path, &fd);
|
||||
|
||||
if (handle < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
while (!_findnext(handle, &fd))
|
||||
{
|
||||
ParseAndOrAdd(files, fd.name);
|
||||
}
|
||||
|
||||
_findclose(handle);
|
||||
#elif defined __linux__
|
||||
build_pathname_r(path, sizeof(path)-1, "%s/", initialdir);
|
||||
struct dirent *ep;
|
||||
DIR *dp;
|
||||
|
||||
if ((dp = opendir(path)) == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
while ( (ep=readdir(dp)) != NULL )
|
||||
{
|
||||
ParseAndOrAdd(files, ep->d_name);
|
||||
}
|
||||
|
||||
closedir (dp);
|
||||
#endif
|
||||
}
|
||||
|
||||
//Loads a plugin list into the Plugin Cache and Load Modules cache
|
||||
void LoadExtraPluginsToPCALM(const char *initialdir)
|
||||
{
|
||||
CStack<String *> files;
|
||||
BuildPluginFileList(initialdir, files);
|
||||
char path[255];
|
||||
while (!files.empty())
|
||||
{
|
||||
String *pString = files.front();
|
||||
snprintf(path, sizeof(path)-1, "%s/%s",
|
||||
initialdir,
|
||||
pString->c_str());
|
||||
g_plugins.CALMFromFile(path);
|
||||
delete pString;
|
||||
files.pop();
|
||||
}
|
||||
}
|
||||
|
||||
void LoadExtraPluginsFromDir(const char *initialdir)
|
||||
{
|
||||
CStack<String *> files;
|
||||
char path[255];
|
||||
BuildPluginFileList(initialdir, files);
|
||||
while (!files.empty())
|
||||
{
|
||||
String *pString = files.front();
|
||||
snprintf(path, sizeof(path)-1, "%s/%s",
|
||||
initialdir,
|
||||
pString->c_str());
|
||||
g_plugins.loadPluginsFromFile(path);
|
||||
delete pString;
|
||||
files.pop();
|
||||
}
|
||||
}
|
||||
|
||||
// Precache stuff from force consistency calls
|
||||
// or check for pointed files won't be done
|
||||
int C_PrecacheModel(char *s)
|
||||
@ -213,7 +308,9 @@ const char* get_localinfo(const char* name, const char* def)
|
||||
const char* b = LOCALINFO((char*)name);
|
||||
|
||||
if (b == 0 || *b == 0)
|
||||
{
|
||||
SET_LOCALINFO((char*)name, (char*)(b = def));
|
||||
}
|
||||
|
||||
return b;
|
||||
}
|
||||
@ -225,7 +322,9 @@ const char* get_localinfo(const char* name, const char* def)
|
||||
int C_Spawn(edict_t *pent)
|
||||
{
|
||||
if (g_initialized)
|
||||
{
|
||||
RETURN_META_VALUE(MRES_IGNORED, 0);
|
||||
}
|
||||
|
||||
g_activated = false;
|
||||
g_initialized = true;
|
||||
@ -259,8 +358,26 @@ int C_Spawn(edict_t *pent)
|
||||
get_localinfo("amxx_configsdir", "addons/amxmodx/configs");
|
||||
get_localinfo("amxx_customdir", "addons/amxmodx/custom");
|
||||
|
||||
// make sure bcompat localinfos are set
|
||||
get_localinfo("amx_basedir", "addons/amxmodx");
|
||||
get_localinfo("amx_configdir", "addons/amxmodx/configs");
|
||||
get_localinfo("amx_langdir", "addons/amxmodx/data/amxmod-lang");
|
||||
get_localinfo("amx_modulesdir", "addons/amxmodx/modules");
|
||||
get_localinfo("amx_pluginsdir", "addons/amxmodx/plugins");
|
||||
get_localinfo("amx_logdir", "addons/amxmodx/logs");
|
||||
|
||||
char map_pluginsfile_path[256];
|
||||
|
||||
// ###### Load modules
|
||||
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"), PT_ANYTIME);
|
||||
g_plugins.CALMFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
||||
LoadExtraPluginsToPCALM(get_localinfo("amxx_configsdir", "addons/amxmodx/configs"));
|
||||
snprintf(map_pluginsfile_path, sizeof(map_pluginsfile_path)-1,
|
||||
"%s/maps/plugins-%s.ini",
|
||||
get_localinfo("amxx_configsdir", "addons/amxmodx/configs"),
|
||||
STRING(gpGlobals->mapname));
|
||||
g_plugins.CALMFromFile(map_pluginsfile_path);
|
||||
|
||||
int loaded = countModules(CountModules_Running); // Call after attachModules so all modules don't have pending stat
|
||||
|
||||
// Set some info about amx version and modules
|
||||
@ -296,9 +413,12 @@ int C_Spawn(edict_t *pent)
|
||||
if (!g_opt_level)
|
||||
g_opt_level = 7;
|
||||
|
||||
// ###### Load AMX scripts
|
||||
// ###### Load AMX Mod X plugins
|
||||
g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
||||
LoadExtraPluginsFromDir(get_localinfo("amxx_configsdir", "addons/amxmodx/configs"));
|
||||
g_plugins.loadPluginsFromFile(map_pluginsfile_path, false);
|
||||
g_plugins.Finalize();
|
||||
g_plugins.InvalidateCache();
|
||||
|
||||
// Register forwards
|
||||
FF_PluginInit = registerForward("plugin_init", ET_IGNORE, FP_DONE);
|
||||
@ -488,6 +608,8 @@ void C_ServerDeactivate_Post()
|
||||
{
|
||||
if (!g_initialized)
|
||||
RETURN_META(MRES_IGNORED);
|
||||
|
||||
modules_callPluginsUnloading();
|
||||
|
||||
detachReloadModules();
|
||||
g_auth.clear();
|
||||
@ -506,6 +628,9 @@ void C_ServerDeactivate_Post()
|
||||
g_xvars.clear();
|
||||
g_plugins.clear();
|
||||
ClearPluginLibraries();
|
||||
modules_callPluginsUnloaded();
|
||||
|
||||
ClearMessages();
|
||||
|
||||
for (unsigned int i=0; i<g_hudsync.size(); i++)
|
||||
delete [] g_hudsync[i];
|
||||
@ -577,7 +702,7 @@ void C_ServerDeactivate_Post()
|
||||
BOOL C_ClientConnect_Post(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128])
|
||||
{
|
||||
CPlayer* pPlayer = GET_PLAYER_POINTER(pEntity);
|
||||
if (!pPlayer->bot)
|
||||
if (!pPlayer->IsBot())
|
||||
{
|
||||
bool a = pPlayer->Connect(pszName, pszAddress);
|
||||
executeForwards(FF_ClientConnect, static_cast<cell>(pPlayer->index));
|
||||
@ -625,7 +750,7 @@ void C_ClientDisconnect(edict_t *pEntity)
|
||||
void C_ClientPutInServer_Post(edict_t *pEntity)
|
||||
{
|
||||
CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity);
|
||||
if (!pPlayer->bot)
|
||||
if (!pPlayer->IsBot())
|
||||
{
|
||||
pPlayer->PutInServer();
|
||||
++g_players_num;
|
||||
@ -645,9 +770,7 @@ void C_ClientUserInfoChanged_Post(edict_t *pEntity, char *infobuffer)
|
||||
if (pPlayer->ingame)
|
||||
{
|
||||
pPlayer->name.assign(name); // Make sure player have name up to date
|
||||
}
|
||||
else if (pPlayer->IsBot())
|
||||
{
|
||||
} else if (pPlayer->IsBot()) {
|
||||
pPlayer->Connect(name, "127.0.0.1"/*CVAR_GET_STRING("net_address")*/);
|
||||
|
||||
executeForwards(FF_ClientConnect, static_cast<cell>(pPlayer->index));
|
||||
@ -696,10 +819,11 @@ void C_ClientCommand(edict_t *pEntity)
|
||||
|
||||
sprintf(buf, "%s %s\n", Plugin_info.name, Plugin_info.version);
|
||||
CLIENT_PRINT(pEntity, print_console, buf);
|
||||
len = sprintf(buf, "Authors: David \"BAILOPAN\" Anderson, Pavol \"PM OnoTo\" Marko, Felix \"SniperBeamer\" Geyer\n");
|
||||
len += sprintf(&buf[len], "Authors: Jonny \"Got His Gun\" Bergstrom, Lukasz \"SidLuke\" Wlasinski\n");
|
||||
len = sprintf(buf, "Authors: \n David \"BAILOPAN\" Anderson, Pavol \"PM OnoTo\" Marko, Felix \"SniperBeamer\" Geyer\n");
|
||||
len += sprintf(&buf[len], " Jonny \"Got His Gun\" Bergstrom, Lukasz \"SidLuke\" Wlasinski\n");
|
||||
CLIENT_PRINT(pEntity, print_console, buf);
|
||||
len = sprintf(buf, "Authors: Christian \"Basic-Master\" Hammacher, Borja \"faluco\" Ferrer\n");
|
||||
len = sprintf(buf, " Christian \"Basic-Master\" Hammacher, Borja \"faluco\" Ferrer\n");
|
||||
len += sprintf(&buf[len], " Scott \"Damaged Soul\" Ehlert\n");
|
||||
len += sprintf(&buf[len], "Compiled: %s\nURL:http://www.amxmodx.org/\n", __DATE__ ", " __TIME__);
|
||||
CLIENT_PRINT(pEntity, print_console, buf);
|
||||
#ifdef JIT
|
||||
@ -1076,10 +1200,12 @@ void C_TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...)
|
||||
void C_AlertMessage(ALERT_TYPE atype, char *szFmt, ...)
|
||||
{
|
||||
if (atype != at_logged)
|
||||
{
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
/* There are also more messages but we want only logs
|
||||
at_notice,
|
||||
@ -1090,8 +1216,11 @@ void C_AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...)
|
||||
at_logged // Server print to console ( only in multiplayer games ).
|
||||
*/
|
||||
|
||||
cell retVal = 0;
|
||||
|
||||
// execute logevents and plugin_log forward
|
||||
if (g_logevents.logEventsExist() || FF_PluginLog >= 0)
|
||||
if (g_logevents.logEventsExist()
|
||||
|| g_forwards.getFuncsNum(FF_PluginLog))
|
||||
{
|
||||
va_list logArgPtr;
|
||||
va_start(logArgPtr, szFmt);
|
||||
@ -1100,15 +1229,19 @@ void C_AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...)
|
||||
g_logevents.parseLogString();
|
||||
|
||||
if (g_logevents.logEventsExist())
|
||||
{
|
||||
g_logevents.executeLogEvents();
|
||||
|
||||
cell retVal = executeForwards(FF_PluginLog);
|
||||
|
||||
if (retVal)
|
||||
RETURN_META(MRES_HANDLED);
|
||||
}
|
||||
|
||||
retVal = executeForwards(FF_PluginLog);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
if (retVal)
|
||||
{
|
||||
RETURN_META(MRES_SUPERCEDE);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
void C_ChangeLevel(char *map, char *what)
|
||||
@ -1266,6 +1399,8 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
|
||||
// This will also call modules Meta_Query and Meta_Attach functions
|
||||
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"), now);
|
||||
|
||||
GET_HOOK_TABLES(PLID, &g_pEngTable, NULL, NULL);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
@ -1277,6 +1412,8 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
modules_callPluginsUnloading();
|
||||
|
||||
g_auth.clear();
|
||||
g_forwards.clear();
|
||||
g_commands.clear();
|
||||
@ -1295,12 +1432,19 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
|
||||
g_cvars.clear();
|
||||
g_langMngr.Clear();
|
||||
|
||||
ClearMessages();
|
||||
|
||||
modules_callPluginsUnloaded();
|
||||
|
||||
detachModules();
|
||||
|
||||
g_log.CloseFile();
|
||||
|
||||
Module_UncacheFunctions();
|
||||
|
||||
ClearLibraries(LibSource_Plugin);
|
||||
ClearLibraries(LibSource_Module);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
@ -1436,6 +1580,20 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
||||
meta_engfuncs.pfnPrecacheSound = C_PrecacheSound;
|
||||
meta_engfuncs.pfnChangeLevel = C_ChangeLevel;
|
||||
|
||||
/* message stuff from messages.h/cpp */
|
||||
meta_engfuncs.pfnMessageBegin = C_MessageBegin;
|
||||
meta_engfuncs.pfnMessageEnd = C_MessageEnd;
|
||||
meta_engfuncs.pfnWriteAngle = C_WriteAngle;
|
||||
meta_engfuncs.pfnWriteByte = C_WriteByte;
|
||||
meta_engfuncs.pfnWriteChar = C_WriteChar;
|
||||
meta_engfuncs.pfnWriteCoord = C_WriteCoord;
|
||||
meta_engfuncs.pfnWriteEntity = C_WriteEntity;
|
||||
meta_engfuncs.pfnWriteLong = C_WriteLong;
|
||||
meta_engfuncs.pfnWriteShort = C_WriteShort;
|
||||
meta_engfuncs.pfnWriteString = C_WriteString;
|
||||
|
||||
meta_engfuncs.pfnAlertMessage = C_AlertMessage;
|
||||
|
||||
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
|
||||
|
||||
return 1;
|
||||
@ -1457,7 +1615,6 @@ C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int
|
||||
meta_engfuncs_post.pfnWriteCoord = C_WriteCoord_Post;
|
||||
meta_engfuncs_post.pfnWriteString = C_WriteString_Post;
|
||||
meta_engfuncs_post.pfnWriteEntity = C_WriteEntity_Post;
|
||||
meta_engfuncs_post.pfnAlertMessage = C_AlertMessage_Post;
|
||||
meta_engfuncs_post.pfnRegUserMsg = C_RegUserMsg_Post;
|
||||
|
||||
memcpy(pengfuncsFromEngine, &meta_engfuncs_post, sizeof(enginefuncs_t));
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -38,7 +38,7 @@
|
||||
#ifndef __linux__
|
||||
#define DLLEXPORT __declspec(dllexport)
|
||||
#else
|
||||
#define DLLEXPORT
|
||||
#define DLLEXPORT __attribute__((visibility("default")))
|
||||
#define WINAPI
|
||||
#endif
|
||||
|
||||
@ -72,6 +72,7 @@ typedef enum
|
||||
} PlayerProp;
|
||||
|
||||
int CheckModules(AMX *amx, char error[128]);
|
||||
bool LoadModule(const char *shortname, PLUG_LOADTIME now, bool simplify=true, bool noFileBail=false);
|
||||
const char *StrCaseStr(const char *as, const char *bs);
|
||||
|
||||
class Debugger;
|
||||
@ -79,7 +80,12 @@ Debugger *DisableDebugHandler(AMX *amx);
|
||||
void EnableDebugHandler(AMX *amx, Debugger *pd);
|
||||
|
||||
bool DirExists(const char *dir);
|
||||
|
||||
const char* GetFileName(AMX *amx);
|
||||
|
||||
inline cell FloatToCell(float input)
|
||||
{
|
||||
REAL output = input;
|
||||
return *(cell *)&output;
|
||||
}
|
||||
|
||||
#endif // __MODULES_H__
|
||||
|
@ -5,38 +5,20 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx", "amxmodx_mm.vcpro
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
Debug = Debug
|
||||
JITDebug = JITDebug
|
||||
JITDebugBinLog = JITDebugBinLog
|
||||
JITMemtestRelease = JITMemtestRelease
|
||||
JITRelease = JITRelease
|
||||
JITReleaseBinLog = JITReleaseBinLog
|
||||
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}.JITDebugBinLog.ActiveCfg = JITDebugBinLog|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog.Build.0 = JITDebugBinLog|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}.JITReleaseBinLog.ActiveCfg = JITReleaseBinLog|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog.Build.0 = JITReleaseBinLog|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
|
||||
|
@ -4,6 +4,7 @@
|
||||
Version="7.10"
|
||||
Name="amxmodx"
|
||||
ProjectGUID="{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
|
||||
RootNamespace="amxmodx"
|
||||
SccProjectName=""
|
||||
SccLocalPath="">
|
||||
<Platforms>
|
||||
@ -11,287 +12,6 @@
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\Debug"
|
||||
IntermediateDirectory=".\Debug"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""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"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
StructMemberAlignment="3"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\debug/amxmodx.pch"
|
||||
AssemblerListingLocation=".\debug/"
|
||||
ObjectFile=".\debug/"
|
||||
ProgramDataBaseFileName=".\debug/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="..\JIT\natives-x86.obj ..\zlib\zlib.lib"
|
||||
OutputFile="debug/amxmodx_mm.dll"
|
||||
Version="0.1"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
IgnoreDefaultLibraryNames="MSVCRT"
|
||||
ModuleDefinitionFile=""
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\debug/amxx_mm.pdb"
|
||||
ImportLibrary=".\debug/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\debug/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\Release"
|
||||
IntermediateDirectory=".\Release"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GlobalOptimizations="TRUE"
|
||||
InlineFunctionExpansion="1"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\release/amxmodx.pch"
|
||||
AssemblerListingLocation=".\release/"
|
||||
ObjectFile=".\release/"
|
||||
ProgramDataBaseFileName=".\release/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib ..\JIT\natives-x86.obj"
|
||||
OutputFile="release/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
IgnoreDefaultLibraryNames="LIBC"
|
||||
ModuleDefinitionFile=""
|
||||
ProgramDatabaseFile=".\release/amxx_mm.pdb"
|
||||
ImportLibrary=".\release/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\release/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="MemtestDebug|Win32"
|
||||
OutputDirectory="MemtestDebug"
|
||||
IntermediateDirectory="MemtestDebug"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""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;MEMORY_TEST"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
StructMemberAlignment="3"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\memtestdebug/amxmodx.pch"
|
||||
AssemblerListingLocation=".\memtestdebug/"
|
||||
ObjectFile=".\memtestdebug/"
|
||||
ProgramDataBaseFileName=".\memtestdebug/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib ..\JIT\natives-x86.obj"
|
||||
OutputFile="memtestdebug/amxmodx_mm.dll"
|
||||
Version="1.6.5.0"
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
IgnoreDefaultLibraryNames="MSVCRT"
|
||||
ModuleDefinitionFile=""
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\memtestdebug/amxx_mm.pdb"
|
||||
ImportLibrary=".\memtestdebug/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\debug/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="MemtestRelease|Win32"
|
||||
OutputDirectory="MemtestRelease"
|
||||
IntermediateDirectory="MemtestRelease"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GlobalOptimizations="TRUE"
|
||||
InlineFunctionExpansion="1"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\memtestrelease/amxmodx.pch"
|
||||
AssemblerListingLocation=".\memtestrelease/"
|
||||
ObjectFile=".\memtestrelease/"
|
||||
ProgramDataBaseFileName=".\memtestrelease/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib ..\JIT\natives-x86.obj"
|
||||
OutputFile="memtestrelease/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
IgnoreDefaultLibraryNames="MSVCRT"
|
||||
ModuleDefinitionFile=""
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\memtestrelease/amxx_mm.pdb"
|
||||
GenerateMapFile="TRUE"
|
||||
MapExports="TRUE"
|
||||
ImportLibrary=".\memtestrelease/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\release/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="JITDebug|Win32"
|
||||
OutputDirectory="JITDebug"
|
||||
@ -329,11 +49,11 @@
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
IgnoreDefaultLibraryNames="MSVCRT"
|
||||
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
|
||||
ModuleDefinitionFile=""
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
|
||||
ImportLibrary=".\jitdebug/amxx_mm.lib"/>
|
||||
ProgramDatabaseFile=".\jitdebug/amxmodx_mm.pdb"
|
||||
ImportLibrary=".\jitdebug/amxmodx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
@ -410,148 +130,7 @@
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\jitrelease/amxmodx_mm.pdb"
|
||||
GenerateMapFile="TRUE"
|
||||
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\release/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="JITMemtestRelease|Win32"
|
||||
OutputDirectory="JITMemtestRelease"
|
||||
IntermediateDirectory="JITMemtestRelease"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GlobalOptimizations="TRUE"
|
||||
InlineFunctionExpansion="1"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST;JIT;ASM32;PAWN_CELL_SIZE=32"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\jitmemtestrelease/amxmodx.pch"
|
||||
AssemblerListingLocation=".\jitmemtestrelease/"
|
||||
ObjectFile=".\jitmemtestrelease/"
|
||||
ProgramDataBaseFileName=".\jitmemtestrelease/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||
OutputFile="jitmemtestrelease/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
IgnoreDefaultLibraryNames="MSVCRT"
|
||||
ModuleDefinitionFile=""
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\jitmemtestrelease/amxx_mm.pdb"
|
||||
ImportLibrary=".\jitmemtestrelease/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\release/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="MaximalSpeed|Win32"
|
||||
OutputDirectory="MaximalSpeed"
|
||||
IntermediateDirectory="MaximalSpeed"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GlobalOptimizations="TRUE"
|
||||
InlineFunctionExpansion="1"
|
||||
EnableIntrinsicFunctions="TRUE"
|
||||
FavorSizeOrSpeed="1"
|
||||
OptimizeForProcessor="2"
|
||||
OptimizeForWindowsApplication="TRUE"
|
||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\MaximalSpeed/amxmodx.pch"
|
||||
AssemblerListingLocation=".\MaximalSpeed/"
|
||||
ObjectFile=".\MaximalSpeed/"
|
||||
ProgramDataBaseFileName=".\MaximalSpeed/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
|
||||
OutputFile="MaximalSpeed/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
ModuleDefinitionFile=""
|
||||
ProgramDatabaseFile=".\MaximalSpeede/amxx_mm.pdb"
|
||||
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
|
||||
ImportLibrary=".\jitrelease/amxmodx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
@ -612,16 +191,16 @@
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||
OutputFile="jitdebugbinlog/amxmodx_mm.dll"
|
||||
OutputFile="jitdebugbinlog/amxmodx_bl_mm.dll"
|
||||
Version="0.1"
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
IgnoreDefaultLibraryNames="MSVCRT"
|
||||
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
|
||||
ModuleDefinitionFile=""
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\jitdebugbinlog/amxx_mm.pdb"
|
||||
ImportLibrary=".\jitdebugbinlog/amxx_mm.lib"/>
|
||||
ProgramDatabaseFile=".\jitdebugbinlog/amxmodx_bl_mm.pdb"
|
||||
ImportLibrary=".\jitdebugbinlog/amxmodx_bl_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
@ -689,16 +268,16 @@
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||
OutputFile="jitreleasebinlog/amxmodx_mm.dll"
|
||||
OutputFile="jitreleasebinlog/amxmodx_bl_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
IgnoreDefaultLibraryNames="MSVCRT"
|
||||
ModuleDefinitionFile=""
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\jitreleasebinlog/amxmodx_mm.pdb"
|
||||
ProgramDatabaseFile=".\jitreleasebinlog/amxmodx_bl_mm.pdb"
|
||||
GenerateMapFile="TRUE"
|
||||
ImportLibrary=".\jitreleasebinlog/amxx_mm.lib"/>
|
||||
ImportLibrary=".\jitreleasebinlog/amxmodx_bl_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
@ -743,6 +322,9 @@
|
||||
<File
|
||||
RelativePath="..\amxdbg.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxmod_compat.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxmodx.cpp">
|
||||
</File>
|
||||
@ -757,6 +339,18 @@
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\binlog.cpp">
|
||||
<FileConfiguration
|
||||
Name="JITDebug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITRelease|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CCmd.cpp">
|
||||
@ -790,18 +384,6 @@
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CTask.cpp">
|
||||
<FileConfiguration
|
||||
Name="JITRelease|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AssemblerOutput="0"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITReleaseBinLog|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AssemblerOutput="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CVault.cpp">
|
||||
@ -814,12 +396,6 @@
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\fakemeta.cpp">
|
||||
<FileConfiguration
|
||||
Name="MemtestDebug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GeneratePreprocessedFile="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\file.cpp">
|
||||
@ -842,9 +418,15 @@
|
||||
AssemblerOutput="4"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\libraries.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\md5.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\messages.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\meta_api.cpp">
|
||||
</File>
|
||||
@ -863,6 +445,9 @@
|
||||
<File
|
||||
RelativePath="..\power.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\sorting.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\srvcmd.cpp">
|
||||
</File>
|
||||
@ -890,55 +475,9 @@
|
||||
<File
|
||||
RelativePath="..\vault.cpp">
|
||||
</File>
|
||||
<Filter
|
||||
Name="mmgr"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\mmgr\mmgr.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITDebug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITRelease|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MaximalSpeed|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITDebugBinLog|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITReleaseBinLog|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="..\vector.cpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
@ -949,6 +488,9 @@
|
||||
<File
|
||||
RelativePath="..\amxdbg.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxmod_compat.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxmodx.h">
|
||||
</File>
|
||||
@ -1018,12 +560,18 @@
|
||||
<File
|
||||
RelativePath="..\format.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\libraries.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\md5.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\menus.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\messages.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\modules.h">
|
||||
</File>
|
||||
@ -1054,16 +602,6 @@
|
||||
<File
|
||||
RelativePath="..\zlib\zlib.h">
|
||||
</File>
|
||||
<Filter
|
||||
Name="mmgr"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\mmgr\mmgr.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\mmgr\nommgr.h">
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
@ -1106,30 +644,6 @@
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\sdk\amxxmodule.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MemtestDebug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MemtestRelease|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITDebug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
@ -1142,18 +656,6 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITMemtestRelease|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MaximalSpeed|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITDebugBinLog|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
|
@ -1,35 +1,24 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# Visual Studio 2005
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx", "amxmodx_mm.vcproj", "{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx_mm", "amxmodx_mm.vcproj", "{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
JITDebug|Win32 = JITDebug|Win32
|
||||
JITMemtestRelease|Win32 = JITMemtestRelease|Win32
|
||||
JITDebugBinLog|Win32 = JITDebugBinLog|Win32
|
||||
JITRelease|Win32 = JITRelease|Win32
|
||||
MaximalSpeed|Win32 = MaximalSpeed|Win32
|
||||
MemtestDebug|Win32 = MemtestDebug|Win32
|
||||
MemtestRelease|Win32 = MemtestRelease|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
JITReleaseBinLog|Win32 = JITReleaseBinLog|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug|Win32.ActiveCfg = JITDebug|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug|Win32.Build.0 = JITDebug|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITMemtestRelease|Win32.ActiveCfg = JITMemtestRelease|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITMemtestRelease|Win32.Build.0 = JITMemtestRelease|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog|Win32.ActiveCfg = JITDebugBinLog|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog|Win32.Build.0 = JITDebugBinLog|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease|Win32.ActiveCfg = JITRelease|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease|Win32.Build.0 = JITRelease|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MaximalSpeed|Win32.ActiveCfg = MaximalSpeed|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MaximalSpeed|Win32.Build.0 = MaximalSpeed|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestDebug|Win32.ActiveCfg = MemtestDebug|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestDebug|Win32.Build.0 = MemtestDebug|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestRelease|Win32.ActiveCfg = MemtestRelease|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestRelease|Win32.Build.0 = MemtestRelease|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Release|Win32.Build.0 = Release|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog|Win32.ActiveCfg = JITReleaseBinLog|Win32
|
||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog|Win32.Build.0 = JITReleaseBinLog|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -32,6 +32,8 @@
|
||||
#include "sh_stack.h"
|
||||
#include "natives.h"
|
||||
#include "debugger.h"
|
||||
#include "libraries.h"
|
||||
#include "format.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#include <malloc.h>
|
||||
@ -47,7 +49,6 @@
|
||||
CStack<int> g_ErrorStk;
|
||||
CVector<regnative *> g_RegNatives;
|
||||
CStack<regnative *> g_NativeStack;
|
||||
CVector<String> g_Libraries;
|
||||
static char g_errorStr[512] = {0};
|
||||
bool g_Initialized = false;
|
||||
|
||||
@ -68,10 +69,27 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
||||
return 0;
|
||||
}
|
||||
|
||||
//parameter stack
|
||||
pNative->caller = amx;
|
||||
|
||||
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx);
|
||||
CPluginMngr::CPlugin *pNativePlugin = g_plugins.findPluginFast(pNative->amx);
|
||||
|
||||
if (!pNativePlugin->isExecutable(pNative->func))
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Called dynanative into a paused plugin.");
|
||||
pPlugin->setStatus(ps_paused);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (pNative->caller)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Bug caught! Please contact the AMX Mod X Dev Team.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
//parameter stack
|
||||
//NOTE: it is possible that recursive register native calling
|
||||
// could potentially be somehow damaged here.
|
||||
//so, a :TODO: - make the stack unique, rather than a known ptr
|
||||
pNative->caller = amx;
|
||||
|
||||
int err = 0;
|
||||
cell ret = 0;
|
||||
@ -81,7 +99,7 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
||||
{
|
||||
amx_Push(pNative->amx, numParams);
|
||||
amx_Push(pNative->amx, pPlugin->getId());
|
||||
for (int i=numParams; i>=1; i--)
|
||||
for (int i=numParams; i>=0; i--)
|
||||
pNative->params[i] = params[i];
|
||||
} else if (pNative->style == 1) {
|
||||
//use dJeyL's system .. very clever!
|
||||
@ -112,6 +130,8 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
||||
g_NativeStack.pop();
|
||||
g_ErrorStk.pop();
|
||||
|
||||
pNative->caller = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -309,6 +329,70 @@ static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
|
||||
{
|
||||
if (!g_NativeStack.size())
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||
return 0;
|
||||
}
|
||||
|
||||
regnative *pNative = g_NativeStack.front();
|
||||
|
||||
if (pNative->style)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vargPos = static_cast<int>(params[4]);
|
||||
int fargPos = static_cast<int>(params[3]);
|
||||
|
||||
/** get the parent parameter array */
|
||||
cell *local_params = pNative->params;
|
||||
|
||||
cell max = local_params[0] / sizeof(cell);
|
||||
if (vargPos > (int)max + 1)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos);
|
||||
return 0;
|
||||
}
|
||||
if (fargPos > (int)max + 1)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid fmtarg parameter passed: %d", fargPos);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* get destination info */
|
||||
cell *fmt;
|
||||
if (fargPos == 0)
|
||||
{
|
||||
if (params[0] / sizeof(cell) != 5)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Expected fmtarg as fifth parameter, found none");
|
||||
return 0;
|
||||
}
|
||||
fmt = get_amxaddr(amx, params[5]);
|
||||
} else {
|
||||
fmt = get_amxaddr(pNative->caller, pNative->params[fargPos]);
|
||||
}
|
||||
cell *realdest = get_amxaddr(amx, params[1]);
|
||||
size_t maxlen = static_cast<size_t>(params[2]);
|
||||
cell *dest = realdest;
|
||||
|
||||
/* if this is necessary... */
|
||||
static cell cpbuf[4096];
|
||||
dest = cpbuf;
|
||||
|
||||
/* perform format */
|
||||
size_t total = atcprintf(dest, maxlen, fmt, pNative->caller, local_params, &vargPos);
|
||||
|
||||
/* copy back */
|
||||
memcpy(realdest, dest, (total+1) * sizeof(cell));
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
//This is basically right from dJeyL's lib_convert function
|
||||
//This awesome hack modifies the stack frame to have an address offset
|
||||
// that will align to the other plugin's memory.
|
||||
@ -343,7 +427,7 @@ static cell AMX_NATIVE_CALL register_library(AMX *amx, cell *params)
|
||||
int len;
|
||||
char *lib = get_amxstring(amx, params[1], 0, len);
|
||||
|
||||
AddPluginLibrary(lib);
|
||||
AddLibrary(lib, LibType_Library, LibSource_Plugin, g_plugins.findPluginFast(amx));
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -370,6 +454,7 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
|
||||
regnative *pNative = new regnative;
|
||||
pNative->amx = amx;
|
||||
pNative->func = idx;
|
||||
pNative->caller = NULL;
|
||||
|
||||
//we'll apply a safety buffer too
|
||||
//make our function
|
||||
@ -396,27 +481,9 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
|
||||
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();
|
||||
|
||||
ClearLibraries(LibSource_Plugin);
|
||||
for (size_t i=0; i<g_RegNatives.size(); i++)
|
||||
{
|
||||
delete [] g_RegNatives[i]->pfn;
|
||||
@ -442,6 +509,7 @@ AMX_NATIVE_INFO g_NativeNatives[] = {
|
||||
{"set_float_byref", set_param_byref},
|
||||
{"get_array_f", get_array},
|
||||
{"set_array_f", set_array},
|
||||
{"vdformat", vdformat},
|
||||
{"param_convert", param_convert},
|
||||
//////////////////////////
|
||||
{NULL, NULL},
|
||||
|
@ -61,9 +61,7 @@ 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[];
|
||||
|
@ -151,7 +151,7 @@ int Menu::PagekeyToItem(page_t page, item_t key)
|
||||
|
||||
if (num_pages == 1 || !items_per_page)
|
||||
{
|
||||
if (m_AlwaysExit && key > m_Items.size())
|
||||
if (key > m_Items.size())
|
||||
return MENU_EXIT;
|
||||
else
|
||||
return key-1;
|
||||
|
@ -110,7 +110,7 @@ void _Setup_Optimizer_Stage2(AMX *amx, cell *oplist, cell *cip)
|
||||
}
|
||||
#endif
|
||||
}
|
||||
//we don't do these yet because of radix stuff >:\
|
||||
/* we don't do these yet because of radix stuff >:\ */
|
||||
//FIND_NATIVE("floatsin", N_Float_Sin);
|
||||
//FIND_NATIVE("floatcos", N_Float_Cos);
|
||||
//FIND_NATIVE("floattan", N_Float_Tan);
|
||||
|
@ -2430,11 +2430,14 @@ static amxx_module_info_s g_ModuleInfo =
|
||||
#else // MODULE_RELOAD_ON_MAPCHANGE
|
||||
0,
|
||||
#endif // MODULE_RELOAD_ON_MAPCHANGE
|
||||
MODULE_LOGTAG
|
||||
MODULE_LOGTAG,
|
||||
MODULE_LIBRARY,
|
||||
MODULE_LIBCLASS
|
||||
};
|
||||
|
||||
// Storage for the requested functions
|
||||
PFN_ADD_NATIVES g_fn_AddNatives;
|
||||
PFN_ADD_NEW_NATIVES g_fn_AddNewNatives;
|
||||
PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
||||
PFN_BUILD_PATHNAME_R g_fn_BuildPathnameR;
|
||||
PFN_GET_AMXADDR g_fn_GetAmxAddr;
|
||||
@ -2506,6 +2509,14 @@ PFN_SET_TEAM_INFO g_fn_SetTeamInfo;
|
||||
PFN_PLAYER_PROP_ADDR g_fn_PlayerPropAddr;
|
||||
PFN_REG_AUTH_FUNC g_fn_RegAuthFunc;
|
||||
PFN_UNREG_AUTH_FUNC g_fn_UnregAuthFunc;
|
||||
PFN_FINDLIBRARY g_fn_FindLibrary;
|
||||
PFN_ADDLIBRARIES g_fn_AddLibraries;
|
||||
PFN_REMOVELIBRARIES g_fn_RemoveLibraries;
|
||||
PFN_OVERRIDENATIVES g_fn_OverrideNatives;
|
||||
PFN_GETLOCALINFO g_fn_GetLocalInfo;
|
||||
PFN_AMX_REREGISTER g_fn_AmxReRegister;
|
||||
PFN_REGISTERFUNCTIONEX g_fn_RegisterFunctionEx;
|
||||
PFN_MESSAGE_BLOCK g_fn_MessageBlock;
|
||||
|
||||
// *** Exports ***
|
||||
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
||||
@ -2556,6 +2567,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("MergeDefinitionFile", g_fn_MergeDefinition_File, PFN_MERGEDEFINITION_FILE);
|
||||
REQFUNC("Format", g_fn_Format, PFN_FORMAT);
|
||||
REQFUNC("RegisterFunction", g_fn_RegisterFunction, PFN_REGISTERFUNCTION);
|
||||
REQFUNC("RegisterFunctionEx", g_fn_RegisterFunctionEx, PFN_REGISTERFUNCTIONEX);
|
||||
|
||||
// Amx scripts
|
||||
REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT);
|
||||
@ -2581,6 +2593,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
|
||||
// Natives / Forwards
|
||||
REQFUNC("AddNatives", g_fn_AddNatives, PFN_ADD_NATIVES);
|
||||
REQFUNC("AddNewNatives", g_fn_AddNewNatives, PFN_ADD_NEW_NATIVES);
|
||||
REQFUNC("RaiseAmxError", g_fn_RaiseAmxError, PFN_RAISE_AMXERROR);
|
||||
REQFUNC("RegisterForward", g_fn_RegisterForward, PFN_REGISTER_FORWARD);
|
||||
REQFUNC("RegisterSPForward", g_fn_RegisterSPForward, PFN_REGISTER_SPFORWARD);
|
||||
@ -2620,6 +2633,16 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("RegAuthFunc", g_fn_RegAuthFunc, PFN_REG_AUTH_FUNC);
|
||||
REQFUNC("UnregAuthFunc", g_fn_UnregAuthFunc, PFN_UNREG_AUTH_FUNC);
|
||||
|
||||
//Added in 1.75
|
||||
REQFUNC("FindLibrary", g_fn_FindLibrary, PFN_FINDLIBRARY);
|
||||
REQFUNC("AddLibraries", g_fn_AddLibraries, PFN_ADDLIBRARIES);
|
||||
REQFUNC("RemoveLibraries", g_fn_RemoveLibraries, PFN_REMOVELIBRARIES);
|
||||
REQFUNC("OverrideNatives", g_fn_OverrideNatives, PFN_OVERRIDENATIVES);
|
||||
REQFUNC("GetLocalInfo", g_fn_GetLocalInfo, PFN_GETLOCALINFO);
|
||||
REQFUNC("AmxReregister", g_fn_AmxReRegister, PFN_AMX_REREGISTER);
|
||||
|
||||
REQFUNC("MessageBlock", g_fn_MessageBlock, PFN_MESSAGE_BLOCK);
|
||||
|
||||
#ifdef MEMORY_TEST
|
||||
// Memory
|
||||
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
|
||||
@ -2654,14 +2677,27 @@ C_DLLEXPORT int AMXX_PluginsLoaded()
|
||||
return AMXX_OK;
|
||||
}
|
||||
|
||||
C_DLLEXPORT void AMXX_PluginsUnloaded()
|
||||
{
|
||||
#ifdef FN_AMXX_PLUGINSUNLOADED
|
||||
FN_AMXX_PLUGINSUNLOADED();
|
||||
#endif // FN_AMXX_PLUGINSUNLOADED
|
||||
}
|
||||
|
||||
C_DLLEXPORT void AMXX_PluginsUnloading()
|
||||
{
|
||||
#ifdef FN_AMXX_PLUGINSUNLOADING
|
||||
FN_AMXX_PLUGINSUNLOADING();
|
||||
#endif // FN_AMXX_PLUGINSUNLOADING
|
||||
}
|
||||
|
||||
// Advanced MF functions
|
||||
void MF_Log(const char *fmt, ...)
|
||||
{
|
||||
// :TODO: Overflow possible here
|
||||
char msg[3072];
|
||||
va_list arglst;
|
||||
va_start(arglst, fmt);
|
||||
vsprintf(msg, fmt, arglst);
|
||||
vsnprintf(msg, sizeof(msg) - 1, fmt, arglst);
|
||||
va_end(arglst);
|
||||
|
||||
g_fn_Log("[%s] %s", MODULE_LOGTAG, msg);
|
||||
@ -2669,11 +2705,10 @@ void MF_Log(const char *fmt, ...)
|
||||
|
||||
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);
|
||||
vsnprintf(msg, sizeof(msg) - 1, fmt, arglst);
|
||||
va_end(arglst);
|
||||
|
||||
g_fn_LogErrorFunc(amx, err, "[%s] %s", MODULE_LOGTAG, msg);
|
||||
@ -2741,10 +2776,16 @@ void ValidateMacros_DontCallThis_Smiley()
|
||||
MF_GetPlayerEdict(0);
|
||||
MF_Format("", 4, "str");
|
||||
MF_RegisterFunction(NULL, "");
|
||||
MF_RegisterFunctionEx(NULL, "");
|
||||
MF_SetPlayerTeamInfo(0, 0, "");
|
||||
MF_PlayerPropAddr(0, 0);
|
||||
MF_RegAuthFunc(NULL);
|
||||
MF_UnregAuthFunc(NULL);
|
||||
MF_FindLibrary(NULL, LibType_Class);
|
||||
MF_AddLibraries(NULL, LibType_Class, NULL);
|
||||
MF_RemoveLibraries(NULL);
|
||||
MF_OverrideNatives(NULL, NULL);
|
||||
MF_MessageBlock(0, 0, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
#ifndef __linux__
|
||||
#define DLLEXPORT __declspec(dllexport)
|
||||
#else
|
||||
#define DLLEXPORT
|
||||
#define DLLEXPORT __attribute__((visibility("default")))
|
||||
#define LINUX
|
||||
#endif
|
||||
|
||||
@ -34,7 +34,8 @@
|
||||
// module interface version was 1
|
||||
// 2 - added logtag to struct (amxx1.1-rc1)
|
||||
// 3 - added new tagAMX structure (amxx1.5)
|
||||
#define AMXX_INTERFACE_VERSION 3
|
||||
// 4 - added new 'library' setting for direct loading
|
||||
#define AMXX_INTERFACE_VERSION 4
|
||||
|
||||
// amxx module info
|
||||
struct amxx_module_info_s
|
||||
@ -44,6 +45,8 @@ struct amxx_module_info_s
|
||||
const char *version;
|
||||
int reload; // reload on mapchange when nonzero
|
||||
const char *logtag; // added in version 2
|
||||
const char *library; // added in version 4
|
||||
const char *libclass; // added in version 4
|
||||
};
|
||||
|
||||
// return values from functions called by amxx
|
||||
@ -153,9 +156,137 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
|
||||
#endif
|
||||
|
||||
#if defined _MSC_VER
|
||||
#pragma warning(disable:4103) /* disable warning message 4103 that complains
|
||||
* about pragma pack in a header file */
|
||||
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
|
||||
#pragma warning(disable:4103) /* disable warning message 4103 that complains
|
||||
* about pragma pack in a header file */
|
||||
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
|
||||
|
||||
#if _MSC_VER >= 1400
|
||||
#if !defined NO_MSVC8_AUTO_COMPAT
|
||||
|
||||
/* Disable deprecation warnings concerning unsafe CRT functions */
|
||||
#if !defined _CRT_SECURE_NO_DEPRECATE
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
#endif
|
||||
|
||||
/* Replace the POSIX function with ISO C++ conformant ones as they are now deprecated */
|
||||
#define access _access
|
||||
#define cabs _cabs
|
||||
#define cgets _cgets
|
||||
#define chdir _chdir
|
||||
#define chmod _chmod
|
||||
#define chsize _chsize
|
||||
#define close _close
|
||||
#define cprintf _cprintf
|
||||
#define cputs _cputts
|
||||
#define creat _creat
|
||||
#define cscanf _cscanf
|
||||
#define cwait _cwait
|
||||
#define dup _dup
|
||||
#define dup2 _dup2
|
||||
#define ecvt _ecvt
|
||||
#define eof _eof
|
||||
#define execl _execl
|
||||
#define execle _execle
|
||||
#define execlp _execlp
|
||||
#define execlpe _execlpe
|
||||
#define execv _execv
|
||||
#define execve _execv
|
||||
#define execvp _execvp
|
||||
#define execvpe _execvpe
|
||||
#define fcloseall _fcloseall
|
||||
#define fcvt _fcvt
|
||||
#define fdopen _fdopen
|
||||
#define fgetchar _fgetchar
|
||||
#define filelength _filelength
|
||||
#define fileno _fileno
|
||||
#define flushall _flushall
|
||||
#define fputchar _fputchar
|
||||
#define gcvt _gcvt
|
||||
#define getch _getch
|
||||
#define getche _getche
|
||||
#define getcwd _getcwd
|
||||
#define getpid _getpid
|
||||
#define getw _getw
|
||||
#define hypot _hypot
|
||||
#define inp _inp
|
||||
#define inpw _inpw
|
||||
#define isascii __isascii
|
||||
#define isatty _isatty
|
||||
#define iscsym __iscsym
|
||||
#define iscsymf __iscsymf
|
||||
#define itoa _itoa
|
||||
#define j0 _j0
|
||||
#define j1 _j1
|
||||
#define jn _jn
|
||||
#define kbhit _kbhit
|
||||
#define lfind _lfind
|
||||
#define locking _locking
|
||||
#define lsearch _lsearch
|
||||
#define lseek _lseek
|
||||
#define ltoa _ltoa
|
||||
#define memccpy _memccpy
|
||||
#define memicmp _memicmp
|
||||
#define mkdir _mkdir
|
||||
#define mktemp _mktemp
|
||||
#define open _open
|
||||
#define outp _outp
|
||||
#define outpw _outpw
|
||||
#define putch _putch
|
||||
#define putenv _putenv
|
||||
#define putw _putw
|
||||
#define read _read
|
||||
#define rmdir _rmdir
|
||||
#define rmtmp _rmtmp
|
||||
#define setmode _setmode
|
||||
#define sopen _sopen
|
||||
#define spawnl _spawnl
|
||||
#define spawnle _spawnle
|
||||
#define spawnlp _spawnlp
|
||||
#define spawnlpe _spawnlpe
|
||||
#define spawnv _spawnv
|
||||
#define spawnve _spawnve
|
||||
#define spawnvp _spawnvp
|
||||
#define spawnvpe _spawnvpe
|
||||
#define strcmpi _strcmpi
|
||||
#define strdup _strdup
|
||||
#define stricmp _stricmp
|
||||
#define strlwr _strlwr
|
||||
#define strnicmp _strnicmp
|
||||
#define strnset _strnset
|
||||
#define strrev _strrev
|
||||
#define strset _strset
|
||||
#define strupr _strupr
|
||||
#define swab _swab
|
||||
#define tell _tell
|
||||
#define tempnam _tempnam
|
||||
#define toascii __toascii
|
||||
#define tzset _tzset
|
||||
#define ultoa _ultoa
|
||||
#define umask _umask
|
||||
#define ungetch _ungetch
|
||||
#define unlink _unlink
|
||||
#define wcsdup _wcsdup
|
||||
#define wcsicmp _wcsicmp
|
||||
#define wcsicoll _wcsicoll
|
||||
#define wcslwr _wcslwr
|
||||
#define wcsnicmp _wcsnicmp
|
||||
#define wcsnset _wcsnset
|
||||
#define wcsrev _wcsrev
|
||||
#define wcsset _wcsset
|
||||
#define wcsupr _wcsupr
|
||||
#define write _write
|
||||
#define y0 _y0
|
||||
#define y1 _y1
|
||||
#define yn _yn
|
||||
|
||||
/* Disable deprecation warnings because MSVC8 seemingly thinks the ISO C++ conformant
|
||||
* functions above are deprecated. */
|
||||
#pragma warning (disable:4996)
|
||||
|
||||
#endif
|
||||
#else
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@ -1904,6 +2035,14 @@ void FN_AMXX_DETACH(void);
|
||||
void FN_AMXX_PLUGINSLOADED(void);
|
||||
#endif // FN_AMXX_PLUGINSLOADED
|
||||
|
||||
#ifdef FN_AMXX_PLUGINSUNLOADING
|
||||
void FN_AMXX_PLUGINSUNLOADING(void);
|
||||
#endif // FN_AMXX_PLUGINSUNLOADING
|
||||
|
||||
#ifdef FN_AMXX_PLUGINSUNLOADED
|
||||
void FN_AMXX_PLUGINSUNLOADED(void);
|
||||
#endif // FN_AMXX_PLUGINSUNLOADED
|
||||
|
||||
// *** Types ***
|
||||
typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
|
||||
|
||||
@ -1950,9 +2089,22 @@ enum PlayerProp
|
||||
Player_NewmenuPage, //int
|
||||
};
|
||||
|
||||
enum LibType
|
||||
{
|
||||
LibType_Library,
|
||||
LibType_Class
|
||||
};
|
||||
|
||||
#define MSGBLOCK_SET 0
|
||||
#define MSGBLOCK_GET 1
|
||||
#define BLOCK_NOT 0
|
||||
#define BLOCK_ONCE 1
|
||||
#define BLOCK_SET 2
|
||||
|
||||
typedef void (*AUTHORIZEFUNC)(int player, const char *authstring);
|
||||
|
||||
typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/);
|
||||
typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/);
|
||||
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*/);
|
||||
@ -2031,8 +2183,17 @@ typedef int (*PFN_AMX_PUSH) (AMX * /*amx*/, cell /*value*/);
|
||||
typedef int (*PFN_SET_TEAM_INFO) (int /*player */, int /*teamid */, const char * /*name */);
|
||||
typedef void (*PFN_REG_AUTH_FUNC) (AUTHORIZEFUNC);
|
||||
typedef void (*PFN_UNREG_AUTH_FUNC) (AUTHORIZEFUNC);
|
||||
typedef int (*PFN_FINDLIBRARY) (const char * /*name*/, LibType /*type*/);
|
||||
typedef size_t (*PFN_ADDLIBRARIES) (const char * /*name*/, LibType /*type*/, void * /*parent*/);
|
||||
typedef size_t (*PFN_REMOVELIBRARIES) (void * /*parent*/);
|
||||
typedef void (*PFN_OVERRIDENATIVES) (AMX_NATIVE_INFO * /*natives*/, const char * /*myname*/);
|
||||
typedef const char * (*PFN_GETLOCALINFO) (const char * /*name*/, const char * /*def*/);
|
||||
typedef int (*PFN_AMX_REREGISTER) (AMX * /*amx*/, AMX_NATIVE_INFO * /*list*/, int /*list*/);
|
||||
typedef void * (*PFN_REGISTERFUNCTIONEX) (void * /*pfn*/, const char * /*desc*/);
|
||||
typedef void (*PFN_MESSAGE_BLOCK) (int /* mode */, int /* message */, int * /* opt */);
|
||||
|
||||
extern PFN_ADD_NATIVES g_fn_AddNatives;
|
||||
extern PFN_ADD_NEW_NATIVES g_fn_AddNewNatives;
|
||||
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
||||
extern PFN_BUILD_PATHNAME_R g_fn_BuildPathnameR;
|
||||
extern PFN_GET_AMXADDR g_fn_GetAmxAddr;
|
||||
@ -2098,11 +2259,20 @@ extern PFN_SET_TEAM_INFO g_fn_SetTeamInfo;
|
||||
extern PFN_PLAYER_PROP_ADDR g_fn_PlayerPropAddr;
|
||||
extern PFN_REG_AUTH_FUNC g_fn_RegAuthFunc;
|
||||
extern PFN_UNREG_AUTH_FUNC g_fn_UnregAuthFunc;
|
||||
extern PFN_FINDLIBRARY g_fn_FindLibrary;
|
||||
extern PFN_ADDLIBRARIES g_fn_AddLibraries;
|
||||
extern PFN_REMOVELIBRARIES g_fn_RemoveLibraries;
|
||||
extern PFN_OVERRIDENATIVES g_fn_OverrideNatives;
|
||||
extern PFN_GETLOCALINFO g_fn_GetLocalInfo;
|
||||
extern PFN_AMX_REREGISTER g_fn_AmxReRegister;
|
||||
extern PFN_REGISTERFUNCTIONEX g_fn_RegisterFunctionEx;
|
||||
extern PFN_MESSAGE_BLOCK g_fn_MessageBlock;
|
||||
|
||||
#ifdef MAY_NEVER_BE_DEFINED
|
||||
// Function prototypes for intellisense and similar systems
|
||||
// They understand #if 0 so we use #ifdef MAY_NEVER_BE_DEFINED
|
||||
int MF_AddNatives (const AMX_NATIVE_INFO *list) { }
|
||||
int MF_AddNewNatives (const AMX_NATIVE_INFO *list) { }
|
||||
char * MF_BuildPathname (const char * format, ...) { }
|
||||
char * MF_BuildPathnameR (char *buffer, size_t maxlen, const char *fmt, ...) { }
|
||||
cell * MF_GetAmxAddr (AMX * amx, cell offset) { }
|
||||
@ -2162,9 +2332,18 @@ int MF_SetPlayerTeamInfo (int id, int teamid, const char *teamname) { }
|
||||
void * MF_PlayerPropAddr (int id, int prop) { }
|
||||
void MF_RegAuthFunc (AUTHORIZEFUNC fn) { }
|
||||
void MF_UnregAuthFunc (AUTHORIZEFUNC fn) { }
|
||||
int MF_FindLibrary (const char *name, LibType type) { }
|
||||
size_t MF_AddLibraries (const char *name, LibType type, void *parent) { }
|
||||
size_t MF_RemoveLibraries (void *parent) { }
|
||||
void MF_OverrideNatives (AMX_NATIVE_INFO *natives, const char *myname) { }
|
||||
const char * MF_GetLocalInfo (const char *name, const char *def) { }
|
||||
int MF_AmxReRegister (AMX *amx, AMX_NATIVE_INFO *list, int number) { return 0; }
|
||||
void * MF_RegisterFunctionEx (void *pfn, const char *description) { }
|
||||
void * MF_MessageBlock (int mode, int msg, int *opt) { }
|
||||
#endif // MAY_NEVER_BE_DEFINED
|
||||
|
||||
#define MF_AddNatives g_fn_AddNatives
|
||||
#define MF_AddNewNatives g_fn_AddNewNatives
|
||||
#define MF_BuildPathname g_fn_BuildPathname
|
||||
#define MF_BuildPathnameR g_fn_BuildPathnameR
|
||||
#define MF_FormatAmxString g_fn_FormatAmxString
|
||||
@ -2231,6 +2410,14 @@ void MF_LogError(AMX *amx, int err, const char *fmt, ...);
|
||||
#define MF_PlayerPropAddr g_fn_PlayerPropAddr
|
||||
#define MF_RegAuthFunc g_fn_RegAuthFunc
|
||||
#define MF_UnregAuthFunc g_fn_UnregAuthFunc
|
||||
#define MF_FindLibrary g_fn_FindLibrary
|
||||
#define MF_AddLibraries g_fn_AddLibraries
|
||||
#define MF_RemoveLibraries g_fn_RemoveLibraries
|
||||
#define MF_OverrideNatives g_fn_OverrideNatives
|
||||
#define MF_GetLocalInfo g_fn_GetLocalInfo
|
||||
#define MF_AmxReRegister g_fn_AmxReRegister
|
||||
#define MF_RegisterFunctionEx g_fn_RegisterFunctionEx
|
||||
#define MF_MessageBlock g_fn_MessageBlock
|
||||
|
||||
#ifdef MEMORY_TEST
|
||||
/*** Memory ***/
|
||||
|
@ -3,12 +3,24 @@
|
||||
#ifndef __MODULECONFIG_H__
|
||||
#define __MODULECONFIG_H__
|
||||
|
||||
// Module info
|
||||
/** Module info
|
||||
* -The logtag is the tag that the module's log messages will be
|
||||
* prepended with.
|
||||
* -The library is the name that the #pragma library
|
||||
* message will have prepended.
|
||||
* -The library class is the class of libraries that
|
||||
* a module belongs to (like DBI). Keep it "" to
|
||||
* ignore.
|
||||
* -For both library and library class, you can use a comma
|
||||
* to add multiple entries.
|
||||
*/
|
||||
#define MODULE_NAME "--ENTER NAME HERE--"
|
||||
#define MODULE_VERSION "--ENTER VERSION HERE--"
|
||||
#define MODULE_AUTHOR "--ENTER AUTHOR HERE--"
|
||||
#define MODULE_URL "--ENTER URL HERE--"
|
||||
#define MODULE_LOGTAG "--ENTER LOGTAG HERE--"
|
||||
#define MODULE_LIBRARY "--ENTER LIBRARY HERE--"
|
||||
#define MODULE_LIBCLASS ""
|
||||
// If you want the module not to be reloaded on mapchange, remove / comment out the next line
|
||||
#define MODULE_RELOAD_ON_MAPCHANGE
|
||||
|
||||
@ -31,18 +43,35 @@
|
||||
// It allows you to compile without libstdc++.so as a dependency
|
||||
// #define NO_ALLOC_OVERRIDES
|
||||
|
||||
// - AMXX Init functions
|
||||
// Also consider using FN_META_*
|
||||
// AMXX query
|
||||
// Uncomment this if you are using MSVC8 or greater and want to fix some of the compatibility issues yourself
|
||||
// #define NO_MSVC8_AUTO_COMPAT
|
||||
|
||||
/**
|
||||
* AMXX Init functions
|
||||
* Also consider using FN_META_*
|
||||
*/
|
||||
|
||||
/** AMXX query */
|
||||
//#define FN_AMXX_QUERY OnAmxxQuery
|
||||
// AMXX attach
|
||||
// Do native functions init here (MF_AddNatives)
|
||||
|
||||
/** AMXX attach
|
||||
* Do native functions init here (MF_AddNatives)
|
||||
*/
|
||||
//#define FN_AMXX_ATTACH OnAmxxAttach
|
||||
// AMXX detach
|
||||
|
||||
/** AMXX Detach (unload) */
|
||||
//#define FN_AMXX_DETACH OnAmxxDetach
|
||||
// All plugins loaded
|
||||
// Do forward functions init here (MF_RegisterForward)
|
||||
// #define FN_AMXX_PLUGINSLOADED OnPluginsLoaded
|
||||
|
||||
/** All plugins loaded
|
||||
* Do forward functions init here (MF_RegisterForward)
|
||||
*/
|
||||
//#define FN_AMXX_PLUGINSLOADED OnPluginsLoaded
|
||||
|
||||
/** All plugins are about to be unloaded */
|
||||
//#define FN_AMXX_PLUGINSUNLOADING OnPluginsUnloading
|
||||
|
||||
/** All plugins are now unloaded */
|
||||
//#define FN_AMXX_PLUGINSUNLOADED OnPluginsUnloaded
|
||||
|
||||
/**** METAMOD ****/
|
||||
// If your module doesn't use metamod, you may close the file now :)
|
||||
|
@ -11,6 +11,13 @@
|
||||
#ifndef _INCLUDE_SMM_LIST_H
|
||||
#define _INCLUDE_SMM_LIST_H
|
||||
|
||||
// MSVC8 fix for offsetof macro redefition warnings
|
||||
#ifdef _MSC_VER
|
||||
#if _MSC_VER >= 1400
|
||||
#undef offsetof
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <new>
|
||||
#include <malloc.h>
|
||||
|
||||
|
359
amxmodx/sorting.cpp
Normal file
359
amxmodx/sorting.cpp
Normal file
@ -0,0 +1,359 @@
|
||||
#include "amxmodx.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
/***********************************
|
||||
* About the double array hack *
|
||||
***************************
|
||||
|
||||
Double arrays in Pawn are vectors offset by the current offset. For example:
|
||||
|
||||
new array[2][2]
|
||||
|
||||
In this array, index 0 contains the offset from the current offset which
|
||||
results in the final vector [2] (at [0][2]). Meaning, to dereference [1][2],
|
||||
it is equivalent to:
|
||||
|
||||
address = &array[1] + array[1] + 2 * sizeof(cell)
|
||||
|
||||
The fact that each offset is from the _current_ position rather than the _base_
|
||||
position is very important. It means that if you to try to swap vector positions,
|
||||
the offsets will no longer match, because their current position has changed. A
|
||||
simple and ingenious way around this is to back up the positions in a separate array,
|
||||
then to overwrite each position in the old array with absolute indices. Pseudo C++ code:
|
||||
|
||||
cell *array; //assumed to be set to the 2+D array
|
||||
cell *old_offsets = new cell[2];
|
||||
for (int i=0; i<2; i++)
|
||||
{
|
||||
old_offsets = array[i];
|
||||
array[i] = i;
|
||||
}
|
||||
|
||||
Now, you can swap the array indices with no problem, and do a reverse-lookup to find the original addresses.
|
||||
After sorting/modification is done, you must relocate the new indices. For example, if the two vectors in our
|
||||
demo array were swapped, array[0] would be 1 and array[1] would be 0. This is invalid to the virtual machine.
|
||||
Luckily, this is also simple -- all the information is there.
|
||||
|
||||
for (int i=0; i<2; i++)
|
||||
{
|
||||
//get the # of the vector we want to relocate in
|
||||
cell vector_index = array[i];
|
||||
//get the real address of this vector
|
||||
char *real_address = (char *)array + (vector_index * sizeof(cell)) + old_offsets[vector_index];
|
||||
//calc and store the new distance offset
|
||||
array[i] = real_address - ( (char *)array + (vector_index + sizeof(cell)) )
|
||||
}
|
||||
|
||||
Note that the inner expression can be heavily reduced; it is expanded for readability.
|
||||
**********************************/
|
||||
|
||||
enum SortOrder
|
||||
{
|
||||
Sort_Ascending = 0,
|
||||
Sort_Descending = 1,
|
||||
};
|
||||
|
||||
int sort_ints_asc(const void *int1, const void *int2)
|
||||
{
|
||||
return (*(int *)int1) - (*(int *)int2);
|
||||
}
|
||||
|
||||
int sort_ints_desc(const void *int1, const void *int2)
|
||||
{
|
||||
return (*(int *)int2) - (*(int *)int1);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL SortIntegers(AMX *amx, cell *params)
|
||||
{
|
||||
cell *array = get_amxaddr(amx, params[1]);
|
||||
cell array_size = params[2];
|
||||
cell type = params[3];
|
||||
|
||||
if (type == Sort_Ascending)
|
||||
{
|
||||
qsort(array, array_size, sizeof(cell), sort_ints_asc);
|
||||
} else {
|
||||
qsort(array, array_size, sizeof(cell), sort_ints_desc);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int sort_floats_asc(const void *float1, const void *float2)
|
||||
{
|
||||
REAL r1 = *(REAL *)float1;
|
||||
REAL r2 = *(REAL *)float2;
|
||||
|
||||
if (r1 < r2)
|
||||
{
|
||||
return -1;
|
||||
} else if (r2 < r1) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int sort_floats_desc(const void *float1, const void *float2)
|
||||
{
|
||||
REAL r1 = *(REAL *)float1;
|
||||
REAL r2 = *(REAL *)float2;
|
||||
|
||||
if (r1 < r2)
|
||||
{
|
||||
return 1;
|
||||
} else if (r2 < r1) {
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL SortFloats(AMX *amx, cell *params)
|
||||
{
|
||||
cell *array = get_amxaddr(amx, params[1]);
|
||||
cell array_size = params[2];
|
||||
cell type = params[3];
|
||||
|
||||
if (type == Sort_Ascending)
|
||||
{
|
||||
qsort(array, array_size, sizeof(cell), sort_floats_asc);
|
||||
} else {
|
||||
qsort(array, array_size, sizeof(cell), sort_floats_desc);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell *g_CurStringArray = NULL;
|
||||
static cell *g_CurRebaseMap = NULL;
|
||||
|
||||
int sort_strings_asc(const void *blk1, const void *blk2)
|
||||
{
|
||||
cell reloc1 = *(cell *)blk1;
|
||||
cell reloc2 = *(cell *)blk2;
|
||||
|
||||
register cell *str1 = (cell *)((char *)(&g_CurStringArray[reloc1]) + g_CurRebaseMap[reloc1]);
|
||||
register cell *str2 = (cell *)((char *)(&g_CurStringArray[reloc2]) + g_CurRebaseMap[reloc2]);
|
||||
|
||||
while (*str1 == *str2++)
|
||||
{
|
||||
if (*str1++ == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return (*str1 - *(str2 - 1));
|
||||
}
|
||||
|
||||
int sort_strings_desc(const void *blk1, const void *blk2)
|
||||
{
|
||||
cell reloc1 = *(cell *)blk1;
|
||||
cell reloc2 = *(cell *)blk2;
|
||||
|
||||
register cell *str1 = (cell *)((char *)(&g_CurStringArray[reloc1]) + g_CurRebaseMap[reloc1]);
|
||||
register cell *str2 = (cell *)((char *)(&g_CurStringArray[reloc2]) + g_CurRebaseMap[reloc2]);
|
||||
|
||||
while (*str1 == *str2++)
|
||||
{
|
||||
if (*str1++ == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return (*(str2 - 1) - *str1);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL SortStrings(AMX *amx, cell *params)
|
||||
{
|
||||
cell *array = get_amxaddr(amx, params[1]);
|
||||
cell array_size = params[2];
|
||||
cell type = params[3];
|
||||
|
||||
/** HACKHACK - back up the old indices, replace the indices with something easier */
|
||||
cell amx_addr, *phys_addr;
|
||||
int err;
|
||||
if ((err=amx_Allot(amx, array_size, &amx_addr, &phys_addr)) != AMX_ERR_NONE)
|
||||
{
|
||||
LogError(amx, err, "Ran out of memory");
|
||||
return 0;
|
||||
}
|
||||
|
||||
g_CurStringArray = array;
|
||||
g_CurRebaseMap = phys_addr;
|
||||
|
||||
for (int i=0; i<array_size; i++)
|
||||
{
|
||||
phys_addr[i] = array[i];
|
||||
array[i] = i;
|
||||
}
|
||||
|
||||
if (type == Sort_Ascending)
|
||||
{
|
||||
qsort(array, array_size, sizeof(cell), sort_strings_asc);
|
||||
} else {
|
||||
qsort(array, array_size, sizeof(cell), sort_strings_desc);
|
||||
}
|
||||
|
||||
/* END HACKHACK - restore what we damaged so Pawn doesn't throw up.
|
||||
* We'll browse through each index of the array and patch up the distance.
|
||||
*/
|
||||
for (int i=0; i<array_size; i++)
|
||||
{
|
||||
/* Compute the final address of the old array and subtract the new location.
|
||||
* This is the fixed up distance.
|
||||
*/
|
||||
array[i] = ((char *)&array[array[i]] + phys_addr[array[i]]) - (char *)&array[i];
|
||||
}
|
||||
|
||||
amx_Release(amx, amx_addr);
|
||||
|
||||
g_CurStringArray = NULL;
|
||||
g_CurRebaseMap = NULL;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct sort_info
|
||||
{
|
||||
int pfn;
|
||||
cell data_addr;
|
||||
cell data_size;
|
||||
cell array_addr;
|
||||
cell *array_base;
|
||||
cell *array_remap;
|
||||
AMX *amx;
|
||||
};
|
||||
|
||||
static CStack<sort_info *> g_AMXSortStack;
|
||||
|
||||
int sort1d_amx_custom(const void *elem1, const void *elem2)
|
||||
{
|
||||
cell c1 = *(cell *)elem1;
|
||||
cell c2 = *(cell *)elem2;
|
||||
sort_info *pInfo = g_AMXSortStack.front();
|
||||
|
||||
return executeForwards(pInfo->pfn, c1, c2, pInfo->array_addr, pInfo->data_addr, pInfo->data_size);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL SortCustom1D(AMX *amx, cell *params)
|
||||
{
|
||||
cell *array = get_amxaddr(amx, params[1]);
|
||||
cell array_size = params[2];
|
||||
int len;
|
||||
const char *funcname = get_amxstring(amx, params[3], 0, len);
|
||||
|
||||
int pfn = registerSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
if (pfn < 0)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "The public function \"%s\" was not found.", funcname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sort_info *pInfo = new sort_info;
|
||||
|
||||
pInfo->pfn = pfn;
|
||||
pInfo->data_addr = params[4];
|
||||
pInfo->data_size = params[5];
|
||||
pInfo->array_addr = params[1];
|
||||
pInfo->array_remap = NULL;
|
||||
pInfo->array_base = NULL;
|
||||
|
||||
g_AMXSortStack.push(pInfo);
|
||||
qsort(array, array_size, sizeof(cell), sort1d_amx_custom);
|
||||
g_AMXSortStack.pop();
|
||||
|
||||
delete pInfo;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int sort2d_amx_custom(const void *elem1, const void *elem2)
|
||||
{
|
||||
cell c1 = *(cell *)elem1;
|
||||
cell c2 = *(cell *)elem2;
|
||||
sort_info *pInfo = g_AMXSortStack.front();
|
||||
|
||||
cell c1_addr = pInfo->array_addr + (c1 * sizeof(cell)) + pInfo->array_remap[c1];
|
||||
cell c2_addr = pInfo->array_addr + (c2 * sizeof(cell)) + pInfo->array_remap[c2];
|
||||
|
||||
//cell *c1_r = get_amxaddr(pInfo->amx, c1_addr);
|
||||
//cell *c2_r = get_amxaddr(pInfo->amx, c2_addr);
|
||||
|
||||
return executeForwards(pInfo->pfn, c1_addr, c2_addr, pInfo->array_addr, pInfo->data_addr, pInfo->data_size);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL SortCustom2D(AMX *amx, cell *params)
|
||||
{
|
||||
cell *array = get_amxaddr(amx, params[1]);
|
||||
cell array_size = params[2];
|
||||
int len;
|
||||
const char *funcname = get_amxstring(amx, params[3], 0, len);
|
||||
|
||||
/** back up the old indices, replace the indices with something easier */
|
||||
cell amx_addr, *phys_addr;
|
||||
int err;
|
||||
if ((err=amx_Allot(amx, array_size, &amx_addr, &phys_addr)) != AMX_ERR_NONE)
|
||||
{
|
||||
LogError(amx, err, "Ran out of memory");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pfn = registerSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
||||
if (pfn < 0)
|
||||
{
|
||||
amx_Release(amx, amx_addr);
|
||||
LogError(amx, AMX_ERR_NATIVE, "The public function \"%s\" was not found.", funcname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sort_info *pInfo = new sort_info;
|
||||
|
||||
pInfo->pfn = pfn;
|
||||
pInfo->data_addr = params[4];
|
||||
pInfo->data_size = params[5];
|
||||
pInfo->array_addr = params[1];
|
||||
pInfo->amx = amx;
|
||||
|
||||
/** Same process as in strings, back up the old indices for later fixup */
|
||||
pInfo->array_base = array;
|
||||
pInfo->array_remap = phys_addr;
|
||||
|
||||
for (int i=0; i<array_size; i++)
|
||||
{
|
||||
phys_addr[i] = array[i];
|
||||
array[i] = i;
|
||||
}
|
||||
|
||||
g_AMXSortStack.push(pInfo);
|
||||
qsort(array, array_size, sizeof(cell), sort2d_amx_custom);
|
||||
g_AMXSortStack.pop();
|
||||
|
||||
/** Fixup process! */
|
||||
for (int i=0; i<array_size; i++)
|
||||
{
|
||||
/* Compute the final address of the old array and subtract the new location.
|
||||
* This is the fixed up distance.
|
||||
*/
|
||||
array[i] = ((char *)&array[array[i]] + phys_addr[array[i]]) - (char *)&array[i];
|
||||
}
|
||||
|
||||
amx_Release(amx, amx_addr);
|
||||
unregisterSPForward(pInfo->pfn);
|
||||
delete pInfo;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
AMX_NATIVE_INFO g_SortNatives[] =
|
||||
{
|
||||
{"SortIntegers", SortIntegers},
|
||||
{"SortFloats", SortFloats},
|
||||
{"SortStrings", SortStrings},
|
||||
{"SortCustom1D", SortCustom1D},
|
||||
{"SortCustom2D", SortCustom2D},
|
||||
|
||||
{NULL, NULL},
|
||||
};
|
@ -39,7 +39,7 @@ void amx_command()
|
||||
{
|
||||
|
||||
print_srvconsole("Currently loaded plugins:\n");
|
||||
print_srvconsole(" %-18.17s %-8.7s %-17.16s %-16.15s %-9.8s\n", "name", "version", "author", "file", "status");
|
||||
print_srvconsole(" %-23.22s %-8.7s %-17.16s %-16.15s %-9.8s\n", "name", "version", "author", "file", "status");
|
||||
|
||||
int plugins = 0;
|
||||
int running = 0;
|
||||
@ -52,7 +52,7 @@ void amx_command()
|
||||
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());
|
||||
print_srvconsole(" [%3d] %-23.22s %-8.7s %-17.16s %-16.15s %-9.8s\n", plugins, (*a).getTitle(), (*a).getVersion(), (*a).getAuthor(), (*a).getName(), (*a).getStatus());
|
||||
++a;
|
||||
}
|
||||
|
||||
@ -143,10 +143,10 @@ void amx_command()
|
||||
else if (!strcmp(cmd, "version"))
|
||||
{
|
||||
print_srvconsole("%s %s (%s)\n", Plugin_info.name, Plugin_info.version, Plugin_info.url);
|
||||
print_srvconsole("Authors: David \"BAILOPAN\" Anderson, Pavol \"PM OnoTo\" Marko\n");
|
||||
print_srvconsole("Authors:\n\tDavid \"BAILOPAN\" Anderson, Pavol \"PM OnoTo\" Marko\n");
|
||||
print_srvconsole("\tFelix \"SniperBeamer\" Geyer, Jonny \"Got His Gun\" Bergstrom\n");
|
||||
print_srvconsole("\tLukasz \"SidLuke\" Wlasinski, Christian \"Basic-Master\" Hammacher\n");
|
||||
print_srvconsole("\tBorja \"faluco\" Ferrer\n");
|
||||
print_srvconsole("\tBorja \"faluco\" Ferrer, Scott \"Damaged Soul\" Ehlert\n");
|
||||
print_srvconsole("Compiled: %s\n", __DATE__ ", " __TIME__);
|
||||
#if defined JIT && !defined ASM32
|
||||
print_srvconsole("Core mode: JIT Only\n");
|
||||
@ -253,7 +253,6 @@ void amx_command()
|
||||
|
||||
void plugin_srvcmd()
|
||||
{
|
||||
cell ret = 0;
|
||||
const char* cmd = CMD_ARGV(0);
|
||||
|
||||
CmdMngr::iterator a = g_commands.srvcmdbegin();
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "amxmodx.h"
|
||||
#include "format.h"
|
||||
#include "binlog.h"
|
||||
#include "amxmod_compat.h"
|
||||
|
||||
const char* stristr(const char* str, const char* substr)
|
||||
{
|
||||
@ -115,8 +116,21 @@ extern "C" size_t get_amxstring_r(AMX *amx, cell amx_addr, char *destination, in
|
||||
register char *dest = destination;
|
||||
char *start = dest;
|
||||
|
||||
while (maxlen-- && *source)
|
||||
*dest++=(char)(*source++);
|
||||
if ( (amx->flags & AMX_FLAG_OLDFILE) &&
|
||||
(*source & BCOMPAT_TRANSLATE_BITS) )
|
||||
{
|
||||
const char *def, *key;
|
||||
if (!translate_bcompat(amx, source, &key, &def))
|
||||
{
|
||||
goto normal_string;
|
||||
}
|
||||
while (maxlen-- && *def)
|
||||
*dest++=(*source++);
|
||||
} else {
|
||||
normal_string:
|
||||
while (maxlen-- && *source)
|
||||
*dest++=(char)(*source++);
|
||||
}
|
||||
|
||||
*dest = '\0';
|
||||
|
||||
@ -132,16 +146,29 @@ extern "C" size_t get_amxstring_r(AMX *amx, cell amx_addr, char *destination, in
|
||||
return dest - start;
|
||||
}
|
||||
|
||||
char* get_amxstring(AMX *amx, cell amx_addr, int id, int& len)
|
||||
char *get_amxstring(AMX *amx, cell amx_addr, int id, int& len)
|
||||
{
|
||||
static char buffor[4][3072];
|
||||
register cell* source = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
|
||||
register char* dest = buffor[id];
|
||||
char* start = dest;
|
||||
|
||||
while ((*dest++=(char)(*source++)));
|
||||
|
||||
len = --dest - start;
|
||||
if ( (amx->flags & AMX_FLAG_OLDFILE) &&
|
||||
(*source & BCOMPAT_TRANSLATE_BITS) )
|
||||
{
|
||||
const char *def, *key;
|
||||
if (!translate_bcompat(amx, source, &key, &def))
|
||||
{
|
||||
goto normal_string;
|
||||
}
|
||||
while ( (*dest++ = (*def++)) );
|
||||
len = --dest - start;
|
||||
} else {
|
||||
normal_string:
|
||||
while ((*dest++=(char)(*source++)));
|
||||
|
||||
len = --dest - start;
|
||||
}
|
||||
|
||||
#if defined BINLOG_ENABLED
|
||||
if (g_binlog_level & 2)
|
||||
@ -416,15 +443,42 @@ static cell AMX_NATIVE_CALL add(AMX *amx, cell *params) /* 4 param */
|
||||
static cell AMX_NATIVE_CALL copy(AMX *amx, cell *params) /* 4 param */
|
||||
{
|
||||
cell *src = get_amxaddr(amx, params[3]);
|
||||
cell *dest = get_amxaddr(amx, params[1]);
|
||||
cell *start = dest;
|
||||
int c = params[2];
|
||||
|
||||
while (c-- && *src)
|
||||
*dest++ =* src++;
|
||||
*dest = 0;
|
||||
|
||||
return (dest - start);
|
||||
|
||||
if (amx->flags & AMX_FLAG_OLDFILE)
|
||||
{
|
||||
if (*src & BCOMPAT_TRANSLATE_BITS)
|
||||
{
|
||||
const char *key, *def;
|
||||
if (!translate_bcompat(amx, src, &key, &def))
|
||||
{
|
||||
goto normal_string;
|
||||
}
|
||||
cell *dest = get_amxaddr(amx, params[1]);
|
||||
cell *start = dest;
|
||||
while (c-- && *def)
|
||||
{
|
||||
*dest++ = static_cast<cell>(*def++);
|
||||
}
|
||||
*dest = '\0';
|
||||
|
||||
return dest-start;
|
||||
} else {
|
||||
goto normal_string;
|
||||
}
|
||||
} else {
|
||||
normal_string:
|
||||
cell *dest = get_amxaddr(amx, params[1]);
|
||||
cell *start = dest;
|
||||
|
||||
while (c-- && *src)
|
||||
{
|
||||
*dest++ = *src++;
|
||||
}
|
||||
*dest = '\0';
|
||||
|
||||
return (dest - start);
|
||||
}
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL copyc(AMX *amx, cell *params) /* 4 param */
|
||||
@ -541,7 +595,26 @@ static cell AMX_NATIVE_CALL format(AMX *amx, cell *params) /* 3 param */
|
||||
if (copy)
|
||||
buf = g_cpbuf;
|
||||
int param = 4;
|
||||
size_t total = atcprintf(buf, maxlen, fmt, amx, params, ¶m);
|
||||
size_t total = 0;
|
||||
|
||||
if (amx->flags & AMX_FLAG_OLDFILE)
|
||||
{
|
||||
if (*fmt & BCOMPAT_TRANSLATE_BITS)
|
||||
{
|
||||
const char *key, *def;
|
||||
if (!translate_bcompat(amx, fmt, &key, &def))
|
||||
{
|
||||
goto normal_string;
|
||||
}
|
||||
total = atcprintf(buf, maxlen, def, amx, params, ¶m);
|
||||
} else {
|
||||
goto normal_string;
|
||||
}
|
||||
} else {
|
||||
normal_string:
|
||||
total = atcprintf(buf, maxlen, fmt, amx, params, ¶m);
|
||||
}
|
||||
|
||||
if (copy)
|
||||
{
|
||||
/* copy back */
|
||||
@ -832,7 +905,7 @@ static cell AMX_NATIVE_CALL format_args(AMX *amx, cell *params)
|
||||
|
||||
if (pos < 0)
|
||||
{
|
||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
||||
LogError(amx, AMX_ERR_NATIVE, "Pos has to be a positive number");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -863,7 +936,6 @@ static cell AMX_NATIVE_CALL is_alpha(AMX *amx, cell *params)
|
||||
|
||||
static cell AMX_NATIVE_CALL amx_ucfirst(AMX *amx, cell *params)
|
||||
{
|
||||
int len = 0;
|
||||
cell *str = get_amxaddr(amx, params[1]);
|
||||
|
||||
if (!isalpha((char)str[0]) || !(str[0] & (1<<5)))
|
||||
@ -944,7 +1016,6 @@ static cell AMX_NATIVE_CALL n_strfind(AMX *amx, cell *params)
|
||||
int sublen;
|
||||
char *sub = get_amxstring(amx, params[2], 1, sublen);
|
||||
|
||||
bool found = false;
|
||||
bool igcase = params[3] ? true : false;
|
||||
|
||||
if (igcase)
|
||||
@ -964,7 +1035,6 @@ static cell AMX_NATIVE_CALL n_strfind(AMX *amx, cell *params)
|
||||
if (params[4] > len)
|
||||
return -1;
|
||||
|
||||
char *pos = &(str[params[4]]);
|
||||
char *find = strstr(str, sub);
|
||||
|
||||
if (!find)
|
||||
@ -973,6 +1043,67 @@ static cell AMX_NATIVE_CALL n_strfind(AMX *amx, cell *params)
|
||||
return (find - str);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL vformat(AMX *amx, cell *params)
|
||||
{
|
||||
int vargPos = static_cast<int>(params[4]);
|
||||
|
||||
/** get the parent parameter array */
|
||||
AMX_HEADER *hdr = (AMX_HEADER *)amx->base;
|
||||
cell *local_params = (cell *)(
|
||||
(char *)amx->base + (cell)hdr->dat +
|
||||
(cell)amx->frm + (2 * sizeof(cell))
|
||||
);
|
||||
|
||||
cell max = local_params[0] / sizeof(cell);
|
||||
if (vargPos > (int)max + 1)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* check for bounds clipping
|
||||
*/
|
||||
cell addr_start = params[1];
|
||||
cell addr_end = addr_start + params[2];
|
||||
bool copy = false;
|
||||
for (int i = vargPos; i <= max; i++)
|
||||
{
|
||||
//does this clip the bounds?
|
||||
if ( (local_params[i] >= addr_start)
|
||||
&& (local_params[i] <= addr_end) )
|
||||
{
|
||||
copy = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* get destination info */
|
||||
cell *fmt = get_amxaddr(amx, params[3]);
|
||||
cell *realdest = get_amxaddr(amx, params[1]);
|
||||
size_t maxlen = static_cast<size_t>(params[2]);
|
||||
cell *dest = realdest;
|
||||
|
||||
/* if this is necessary... */
|
||||
static cell cpbuf[4096];
|
||||
if (copy)
|
||||
dest = cpbuf;
|
||||
|
||||
/* perform format */
|
||||
size_t total = atcprintf(dest, maxlen, fmt, amx, local_params, &vargPos);
|
||||
|
||||
/* copy back */
|
||||
if (copy)
|
||||
{
|
||||
memcpy(realdest, dest, (total+1) * sizeof(cell));
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
AMX_NATIVE_INFO string_Natives[] =
|
||||
{
|
||||
{"add", add},
|
||||
@ -1008,5 +1139,6 @@ AMX_NATIVE_INFO string_Natives[] =
|
||||
{"strcmp", n_strcmp},
|
||||
{"str_to_float", str_to_float},
|
||||
{"float_to_str", float_to_str},
|
||||
{"vformat", vformat},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
@ -14,6 +14,16 @@
|
||||
#define strnicmp strncasecmp
|
||||
#endif
|
||||
|
||||
#if _MSC_VER
|
||||
#if _MSC_VER >= 1400
|
||||
// MSVC8 - Replace POSIX stricmp with ISO C++ conformant one as it is deprecated
|
||||
#define stricmp _stricmp
|
||||
|
||||
// Need this because of some stupid bug
|
||||
#pragma warning (disable : 4996)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// this file does not include amxmodx.h, so we have to include the memory manager here
|
||||
#ifdef MEMORY_TEST
|
||||
#include "mmgr/mmgr.h"
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include <time.h>
|
||||
#include "amxmodx.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#if defined __linux__ && !defined _vsnprintf
|
||||
#define _vsnprintf vsnprintf
|
||||
#endif
|
||||
|
||||
@ -347,3 +347,4 @@ void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1,
|
||||
// unset the global "fake" flag
|
||||
g_fakecmd.fake = false;
|
||||
}
|
||||
|
||||
|
205
amxmodx/vector.cpp
Normal file
205
amxmodx/vector.cpp
Normal file
@ -0,0 +1,205 @@
|
||||
/* 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"
|
||||
|
||||
#define ANGLEVECTORS_FORWARD 1
|
||||
#define ANGLEVECTORS_RIGHT 2
|
||||
#define ANGLEVECTORS_UP 3
|
||||
|
||||
static cell AMX_NATIVE_CALL get_distance(AMX *amx, cell *params)
|
||||
{
|
||||
cell *cpVec1 = get_amxaddr(amx, params[1]);
|
||||
cell *cpVec2 = get_amxaddr(amx, params[2]);
|
||||
|
||||
Vector vec1 = Vector((float)cpVec1[0], (float)cpVec1[1], (float)cpVec1[2]);
|
||||
Vector vec2 = Vector((float)cpVec2[0], (float)cpVec2[1], (float)cpVec2[2]);
|
||||
|
||||
int iDist = (int)((vec1 - vec2).Length());
|
||||
|
||||
return iDist;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_distance_f(AMX *amx, cell *params)
|
||||
{
|
||||
cell *cpVec1 = get_amxaddr(amx, params[1]);
|
||||
cell *cpVec2 = get_amxaddr(amx, params[2]);
|
||||
|
||||
Vector vec1 = Vector((float)amx_ctof(cpVec1[0]), (float)amx_ctof(cpVec1[1]), (float)amx_ctof(cpVec1[2]));
|
||||
Vector vec2 = Vector((float)amx_ctof(cpVec2[0]), (float)amx_ctof(cpVec2[1]), (float)amx_ctof(cpVec2[2]));
|
||||
|
||||
REAL fDist = (REAL) (vec1 - vec2).Length();
|
||||
|
||||
return amx_ftoc(fDist);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL VelocityByAim(AMX *amx, cell *params)
|
||||
{
|
||||
int iEnt = params[1];
|
||||
int iVelocity = params[2];
|
||||
cell *vRet = get_amxaddr(amx, params[3]);
|
||||
Vector vVector = Vector(0, 0, 0);
|
||||
edict_t *pEnt = NULL;
|
||||
|
||||
if (iEnt < 0 || iEnt > gpGlobals->maxEntities)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Entity out of range (%d)", iEnt);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (iEnt > 0 && iEnt <= gpGlobals->maxClients)
|
||||
{
|
||||
if (!GET_PLAYER_POINTER_I(iEnt)->ingame)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (not ingame)", iEnt);
|
||||
return 0;
|
||||
}
|
||||
pEnt = GET_PLAYER_POINTER_I(iEnt)->pEdict;
|
||||
} else {
|
||||
pEnt = INDEXENT(iEnt);
|
||||
}
|
||||
}
|
||||
|
||||
if (!pEnt)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid entity %d (nullent)", iEnt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
MAKE_VECTORS(pEnt->v.v_angle);
|
||||
vVector = gpGlobals->v_forward * iVelocity;
|
||||
|
||||
vRet[0] = FloatToCell(vVector.x);
|
||||
vRet[1] = FloatToCell(vVector.y);
|
||||
vRet[2] = FloatToCell(vVector.z);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL vector_to_angle(AMX *amx, cell *params)
|
||||
{
|
||||
cell *cAddr = get_amxaddr(amx, params[1]);
|
||||
|
||||
REAL fX = amx_ctof(cAddr[0]);
|
||||
REAL fY = amx_ctof(cAddr[1]);
|
||||
REAL fZ = amx_ctof(cAddr[2]);
|
||||
|
||||
Vector vVector = Vector(fX, fY, fZ);
|
||||
Vector vAngle = Vector(0, 0, 0);
|
||||
VEC_TO_ANGLES(vVector, vAngle);
|
||||
|
||||
cell *vRet = get_amxaddr(amx, params[2]);
|
||||
|
||||
vRet[0] = FloatToCell(vAngle.x);
|
||||
vRet[1] = FloatToCell(vAngle.y);
|
||||
vRet[2] = FloatToCell(vAngle.z);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL angle_vector(AMX *amx, cell *params)
|
||||
{
|
||||
Vector v_angles, v_forward, v_right, v_up, v_return;
|
||||
|
||||
cell *vCell = get_amxaddr(amx, params[1]);
|
||||
v_angles.x = amx_ctof(vCell[0]);
|
||||
v_angles.y = amx_ctof(vCell[1]);
|
||||
v_angles.z = amx_ctof(vCell[2]);
|
||||
|
||||
g_engfuncs.pfnAngleVectors(v_angles, v_forward, v_right, v_up);
|
||||
|
||||
switch (params[2])
|
||||
{
|
||||
case ANGLEVECTORS_FORWARD:
|
||||
v_return = v_forward;
|
||||
break;
|
||||
case ANGLEVECTORS_RIGHT:
|
||||
v_return = v_right;
|
||||
break;
|
||||
case ANGLEVECTORS_UP:
|
||||
v_return = v_up;
|
||||
break;
|
||||
}
|
||||
|
||||
vCell = get_amxaddr(amx, params[3]);
|
||||
vCell[0] = FloatToCell(v_return.x);
|
||||
vCell[1] = FloatToCell(v_return.y);
|
||||
vCell[2] = FloatToCell(v_return.z);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL vector_length(AMX *amx, cell *params)
|
||||
{
|
||||
cell *cAddr = get_amxaddr(amx, params[1]);
|
||||
|
||||
REAL fX = amx_ctof(cAddr[0]);
|
||||
REAL fY = amx_ctof(cAddr[1]);
|
||||
REAL fZ = amx_ctof(cAddr[2]);
|
||||
|
||||
Vector vVector = Vector(fX, fY, fZ);
|
||||
|
||||
REAL fLength = vVector.Length();
|
||||
|
||||
return amx_ftoc(fLength);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL vector_distance(AMX *amx, cell *params)
|
||||
{
|
||||
cell *cAddr = get_amxaddr(amx, params[1]);
|
||||
cell *cAddr2 = get_amxaddr(amx, params[2]);
|
||||
|
||||
REAL fX = amx_ctof(cAddr[0]);
|
||||
REAL fY = amx_ctof(cAddr[1]);
|
||||
REAL fZ = amx_ctof(cAddr[2]);
|
||||
REAL fX2 = amx_ctof(cAddr2[0]);
|
||||
REAL fY2 = amx_ctof(cAddr2[1]);
|
||||
REAL fZ2 = amx_ctof(cAddr2[2]);
|
||||
|
||||
Vector vVector = Vector(fX, fY, fZ);
|
||||
Vector vVector2 = Vector(fX2, fY2, fZ2);
|
||||
|
||||
REAL fLength = (vVector - vVector2).Length();
|
||||
|
||||
return amx_ftoc(fLength);
|
||||
}
|
||||
|
||||
AMX_NATIVE_INFO vector_Natives[] = {
|
||||
{"get_distance", get_distance},
|
||||
{"get_distance_f", get_distance_f},
|
||||
{"velocity_by_aim", VelocityByAim},
|
||||
{"vector_to_angle", vector_to_angle},
|
||||
{"angle_vector", angle_vector},
|
||||
{"vector_length", vector_length},
|
||||
{"vector_distance", vector_distance},
|
||||
{NULL, NULL},
|
||||
};
|
@ -1,6 +1,5 @@
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
@ -27,8 +26,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,7,1,0
|
||||
PRODUCTVERSION 1,7,1,0
|
||||
FILEVERSION 1,7,6,0
|
||||
PRODUCTVERSION 1,7,6,0
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@ -45,12 +44,12 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "Comments", "AMX Mod X"
|
||||
VALUE "FileDescription", "AMX Mod X"
|
||||
VALUE "FileVersion", "1.71"
|
||||
VALUE "FileVersion", "1.76"
|
||||
VALUE "InternalName", "amxmodx"
|
||||
VALUE "LegalCopyright", "Copyright (c) 2004-2006, AMX Mod X Dev Team"
|
||||
VALUE "OriginalFilename", "amxmodx_mm.dll"
|
||||
VALUE "ProductName", "AMX Mod X"
|
||||
VALUE "ProductVersion", "1.71"
|
||||
VALUE "ProductVersion", "1.76"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
@ -3,9 +3,9 @@
|
||||
|
||||
### EDIT BELOW FOR OTHER PROJECTS ###
|
||||
|
||||
OPT_FLAGS = -O3 -funroll-loops -s -pipe
|
||||
OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing
|
||||
DEBUG_FLAGS = -g -ggdb3
|
||||
CPP = gcc
|
||||
CPP = gcc-4.1
|
||||
BINARY = amxxpc
|
||||
|
||||
OBJECTS = amx.cpp amxxpc.cpp Binary.cpp
|
||||
|
@ -62,7 +62,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
pc_printf("Welcome to the AMX Mod X %s Compiler.\n", VERSION_STRING);
|
||||
pc_printf("Copyright (c) 1997-2005 ITB CompuPhase, AMX Mod X Team\n\n");
|
||||
pc_printf("Copyright (c) 1997-2006 ITB CompuPhase, AMX Mod X Team\n\n");
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
|
@ -1,9 +1,7 @@
|
||||
#ifndef _AMXXSC_INCLUDE_H
|
||||
#define _AMXXSC_INCLUDE_H
|
||||
|
||||
#define VERSION_STRING "1.70-300"
|
||||
#define VERSION 03000
|
||||
#define MAGIC_HEADER 0x414D5842
|
||||
#define VERSION_STRING "1.76-300"
|
||||
#define MAGIC_HEADER2 0x414D5858
|
||||
#define MAGIC_VERSION 0x0300
|
||||
|
||||
|
Binary file not shown.
@ -3,13 +3,14 @@
|
||||
|
||||
### EDIT BELOW FOR OTHER PROJECTS ###
|
||||
|
||||
OPT_FLAGS = -O3 -funroll-loops -s -pipe
|
||||
OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -fvisibility=hidden
|
||||
DEBUG_FLAGS = -g -ggdb3
|
||||
CPP = gcc
|
||||
CPP = gcc-4.1
|
||||
NAME = amxxpc
|
||||
|
||||
OBJECTS = sc1.c sc2.c sc3.c sc4.c sc5.c sc6.c sc7.c scvars.c scmemfil.c \
|
||||
scstate.c sclist.c sci18n.c scexpand.c pawncc.c libpawnc.c prefix.c
|
||||
scstate.c sclist.c sci18n.c scexpand.c pawncc.c libpawnc.c prefix.c \
|
||||
memfile.c
|
||||
|
||||
LINK = -lpthread
|
||||
|
||||
|
@ -52,7 +52,7 @@
|
||||
__declspec (dllexport)
|
||||
void EXCOMPILER(int argc, char **argv)
|
||||
# else
|
||||
void extern EXCOMPILER(int argc, char **argv)
|
||||
void extern __attribute__((visibility("default"))) EXCOMPILER(int argc, char **argv)
|
||||
# endif
|
||||
{
|
||||
pc_compile(argc, argv);
|
||||
@ -70,7 +70,7 @@
|
||||
__declspec (dllexport)
|
||||
int pc_printf(const char *message,...)
|
||||
#else
|
||||
extern int pc_printf(const char *message,...)
|
||||
extern int __attribute__((visibility("default"))) pc_printf(const char *message,...)
|
||||
#endif
|
||||
#else
|
||||
int pc_printf(const char *message, ...)
|
||||
|
@ -310,6 +310,9 @@
|
||||
<File
|
||||
RelativePath=".\libpawnc.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\memfile.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\sc1.c">
|
||||
</File>
|
||||
@ -357,6 +360,9 @@
|
||||
<File
|
||||
RelativePath=".\amx.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\memfile.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\sc.h">
|
||||
</File>
|
||||
|
105
compiler/libpc300/memfile.c
Normal file
105
compiler/libpc300/memfile.c
Normal file
@ -0,0 +1,105 @@
|
||||
#include "memfile.h"
|
||||
#include <string.h>
|
||||
#include "osdefs.h"
|
||||
|
||||
memfile_t *memfile_creat(const char *name, size_t init)
|
||||
{
|
||||
memfile_t mf;
|
||||
memfile_t *pmf;
|
||||
|
||||
mf.size = init;
|
||||
mf.base = (char *)malloc(init);
|
||||
mf.usedoffs = 0;
|
||||
if (!mf.base)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mf.offs = 0;
|
||||
mf._static = 0;
|
||||
|
||||
pmf = (memfile_t *)malloc(sizeof(memfile_t));
|
||||
memcpy(pmf, &mf, sizeof(memfile_t));
|
||||
|
||||
pmf->name = strdup(name);
|
||||
|
||||
return pmf;
|
||||
}
|
||||
|
||||
void memfile_destroy(memfile_t *mf)
|
||||
{
|
||||
if (!mf->_static)
|
||||
{
|
||||
free(mf->name);
|
||||
free(mf->base);
|
||||
free(mf);
|
||||
}
|
||||
}
|
||||
|
||||
void memfile_seek(memfile_t *mf, long seek)
|
||||
{
|
||||
mf->offs = seek;
|
||||
}
|
||||
|
||||
long memfile_tell(memfile_t *mf)
|
||||
{
|
||||
return mf->offs;
|
||||
}
|
||||
|
||||
size_t memfile_read(memfile_t *mf, void *buffer, size_t maxsize)
|
||||
{
|
||||
if (!maxsize || mf->offs >= mf->usedoffs)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mf->usedoffs - mf->offs < (long)maxsize)
|
||||
{
|
||||
maxsize = mf->usedoffs - mf->offs;
|
||||
if (!maxsize)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(buffer, mf->base + mf->offs, maxsize);
|
||||
|
||||
mf->offs += maxsize;
|
||||
|
||||
return maxsize;
|
||||
}
|
||||
|
||||
int memfile_write(memfile_t *mf, void *buffer, size_t size)
|
||||
{
|
||||
if (mf->offs + size > mf->size)
|
||||
{
|
||||
size_t newsize = (mf->size + size) * 2;
|
||||
if (mf->_static)
|
||||
{
|
||||
char *oldbase = mf->base;
|
||||
mf->base = (char *)malloc(newsize);
|
||||
if (!mf->base)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
memcpy(mf->base, oldbase, mf->size);
|
||||
} else {
|
||||
mf->base = (char *)realloc(mf->base, newsize);
|
||||
if (!mf->base)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
mf->_static = 0;
|
||||
mf->size = newsize;
|
||||
}
|
||||
memcpy(mf->base + mf->offs, buffer, size);
|
||||
mf->offs += size;
|
||||
|
||||
if (mf->offs > mf->usedoffs)
|
||||
{
|
||||
mf->usedoffs = mf->offs;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
23
compiler/libpc300/memfile.h
Normal file
23
compiler/libpc300/memfile.h
Normal file
@ -0,0 +1,23 @@
|
||||
#ifndef _INCLUDE_MEMFILE_H
|
||||
#define _INCLUDE_MEMFILE_H
|
||||
|
||||
#include <malloc.h>
|
||||
|
||||
typedef struct memfile_s
|
||||
{
|
||||
char *name;
|
||||
char *base;
|
||||
long offs;
|
||||
long usedoffs;
|
||||
size_t size;
|
||||
int _static;
|
||||
} memfile_t;
|
||||
|
||||
memfile_t *memfile_creat(const char *name, size_t init);
|
||||
void memfile_destroy(memfile_t *mf);
|
||||
void memfile_seek(memfile_t *mf, long seek);
|
||||
int memfile_write(memfile_t *mf, void *buffer, size_t size);
|
||||
size_t memfile_read(memfile_t *mf, void *buffer, size_t maxsize);
|
||||
long memfile_tell(memfile_t *mf);
|
||||
|
||||
#endif //_INCLUDE_MEMFILE_H
|
@ -446,7 +446,7 @@ int pc_enablewarning(int number,int enable);
|
||||
__declspec (dllexport)
|
||||
int pc_printf(const char *message,...);
|
||||
#else
|
||||
extern int pc_printf(const char *message,...);
|
||||
extern int __attribute__((visibility("default"))) pc_printf(const char *message,...);
|
||||
#endif
|
||||
#else
|
||||
int pc_printf(const char *message, ...) INVISIBLE;
|
||||
|
@ -61,6 +61,8 @@
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "sc.h"
|
||||
#define VERSION_STR "3.0.3367-amxx"
|
||||
#define VERSION_INT 0x300
|
||||
@ -125,6 +127,7 @@ static void dostate(void);
|
||||
static void addwhile(int *ptr);
|
||||
static void delwhile(void);
|
||||
static int *readwhile(void);
|
||||
static void inst_datetime_defines(void);
|
||||
|
||||
static int lastst = 0; /* last executed statement type */
|
||||
static int nestlevel = 0; /* number of active (open) compound statements */
|
||||
@ -382,6 +385,23 @@ long pc_lengthbin(void *handle)
|
||||
|
||||
#endif /* !defined NO_MAIN */
|
||||
|
||||
void inst_datetime_defines()
|
||||
{
|
||||
char date[64];
|
||||
char ltime[64];
|
||||
time_t td;
|
||||
struct tm *curtime;
|
||||
|
||||
time(&td);
|
||||
curtime = localtime(&td);
|
||||
|
||||
strftime(date, 31, "\"%m/%d/%Y\"", curtime);
|
||||
strftime(ltime, 31, "\"%H:%M:%S\"", curtime);
|
||||
|
||||
insert_subst("__DATE__", date, 8);
|
||||
insert_subst("__TIME__", ltime, 8);
|
||||
}
|
||||
|
||||
|
||||
/* "main" of the compiler
|
||||
*/
|
||||
@ -531,7 +551,7 @@ int pc_compile(int argc, char *argv[])
|
||||
delete_symbols(&glbtab,0,TRUE,FALSE);
|
||||
#if !defined NO_DEFINE
|
||||
delete_substtable();
|
||||
insert_subst("__DATE__", "\"" __DATE__ "\"", 8);
|
||||
inst_datetime_defines();
|
||||
#endif
|
||||
resetglobals();
|
||||
sc_ctrlchar=sc_ctrlchar_org;
|
||||
@ -595,7 +615,7 @@ int pc_compile(int argc, char *argv[])
|
||||
delete_symbols(&glbtab,0,TRUE,FALSE);
|
||||
#if !defined NO_DEFINE
|
||||
delete_substtable();
|
||||
insert_subst("__DATE__", "\"" __DATE__ "\"", 8);
|
||||
inst_datetime_defines();
|
||||
#endif
|
||||
resetglobals();
|
||||
sc_ctrlchar=sc_ctrlchar_org;
|
||||
|
@ -1016,8 +1016,29 @@ static int command(void)
|
||||
} /* if */
|
||||
} else if (strcmp(str,"dynamic")==0) {
|
||||
preproc_expr(&sc_stksize,NULL);
|
||||
} else if (strcmp(str,"library")==0) {
|
||||
char name[sNAMEMAX+1];
|
||||
} else if ( !strcmp(str,"library") ||
|
||||
!strcmp(str, "reqlib") ||
|
||||
!strcmp(str, "reqclass") ||
|
||||
!strcmp(str, "loadlib") ||
|
||||
!strcmp(str, "explib") ||
|
||||
!strcmp(str, "expclass") ||
|
||||
!strcmp(str, "defclasslib") ) {
|
||||
char name[sNAMEMAX+1],sname[sNAMEMAX+1];
|
||||
const char *prefix = "";
|
||||
sname[0] = '\0';
|
||||
sname[1] = '\0';
|
||||
if (!strcmp(str, "reqlib"))
|
||||
prefix = "?rl_";
|
||||
else if (!strcmp(str, "reqclass"))
|
||||
prefix = "?rc_";
|
||||
else if (!strcmp(str, "loadlib"))
|
||||
prefix = "?f_";
|
||||
else if (!strcmp(str, "explib"))
|
||||
prefix = "?el_";
|
||||
else if (!strcmp(str, "expclass"))
|
||||
prefix = "?ec_";
|
||||
else if (!strcmp(str, "defclasslib"))
|
||||
prefix = "?d_";
|
||||
while (*lptr<=' ' && *lptr!='\0')
|
||||
lptr++;
|
||||
if (*lptr=='"') {
|
||||
@ -1027,6 +1048,20 @@ static int command(void)
|
||||
for (i=0; i<sizeof name && (alphanum(*lptr) || *lptr=='-'); i++,lptr++)
|
||||
name[i]=*lptr;
|
||||
name[i]='\0';
|
||||
if (!strncmp(str, "exp", 3) || !strncmp(str, "def", 3))
|
||||
{
|
||||
while (*lptr && isspace(*lptr))
|
||||
lptr++;
|
||||
for (i=1; i<sizeof sname && alphanum(*lptr); i++,lptr++)
|
||||
sname[i]=*lptr;
|
||||
sname[i] = '\0';
|
||||
if (!sname[1])
|
||||
{
|
||||
error(45);
|
||||
} else {
|
||||
sname[0] = '_';
|
||||
}
|
||||
}
|
||||
} /* if */
|
||||
if (strlen(name)==0) {
|
||||
curlibrary=NULL;
|
||||
@ -1034,8 +1069,22 @@ static int command(void)
|
||||
pc_addlibtable=FALSE;
|
||||
} else {
|
||||
/* add the name if it does not yet exist in the table */
|
||||
if (find_constval(&libname_tab,name,0)==NULL)
|
||||
curlibrary=append_constval(&libname_tab,name,0,0);
|
||||
char newname[sNAMEMAX+1];
|
||||
if (strlen(name) + strlen(prefix) + strlen(sname) <= sNAMEMAX)
|
||||
{
|
||||
strcpy(newname, prefix);
|
||||
strcat(newname, name);
|
||||
strcat(newname, sname);
|
||||
if (newname[0] != '?')
|
||||
{
|
||||
if (find_constval(&libname_tab,newname,0)==NULL)
|
||||
{
|
||||
curlibrary=append_constval(&libname_tab,newname,0,0);
|
||||
}
|
||||
} else {
|
||||
exporttag(pc_addtag(newname));
|
||||
}
|
||||
}
|
||||
} /* if */
|
||||
} else if (strcmp(str,"pack")==0) {
|
||||
cell val;
|
||||
|
@ -993,6 +993,8 @@ static int hier13(value *lval)
|
||||
value lval2 = {0};
|
||||
int array1,array2;
|
||||
|
||||
int orig_heap=decl_heap;
|
||||
int diff1=0,diff2=0;
|
||||
if (lvalue) {
|
||||
rvalue(lval);
|
||||
} else if (lval->ident==iCONSTEXPR) {
|
||||
@ -1009,6 +1011,10 @@ static int hier13(value *lval)
|
||||
sc_allowtags=(short)POPSTK_I(); /* restore */
|
||||
jumplabel(flab2);
|
||||
setlabel(flab1);
|
||||
if (orig_heap!=decl_heap) {
|
||||
diff1=abs(decl_heap-orig_heap);
|
||||
decl_heap=orig_heap;
|
||||
}
|
||||
needtoken(':');
|
||||
if (hier13(&lval2))
|
||||
rvalue(&lval2);
|
||||
@ -1031,6 +1037,15 @@ static int hier13(value *lval)
|
||||
lval->ident=iREFARRAY; /* iARRAY becomes iREFARRAY */
|
||||
else if (lval->ident!=iREFARRAY)
|
||||
lval->ident=iEXPRESSION; /* iREFARRAY stays iREFARRAY, rest becomes iEXPRESSION */
|
||||
if (orig_heap!=decl_heap) {
|
||||
diff2=abs(decl_heap-orig_heap);
|
||||
decl_heap=orig_heap;
|
||||
}
|
||||
if (diff1==diff2) {
|
||||
decl_heap+=(diff1/2);
|
||||
} else {
|
||||
decl_heap+=(diff1+diff2);
|
||||
}
|
||||
return FALSE; /* conditional expression is no lvalue */
|
||||
} else {
|
||||
return lvalue;
|
||||
|
@ -236,6 +236,15 @@ static stringlist includepaths = {NULL, NULL}; /* directory list for include fi
|
||||
|
||||
SC_FUNC stringlist *insert_path(char *path)
|
||||
{
|
||||
char *extra_path = malloc(strlen(path) + 16);
|
||||
strcpy(extra_path, path);
|
||||
#if defined __linux__
|
||||
strcat(extra_path, "/amxmod_compat/");
|
||||
#else if defined WIN32 || defined _WIN32
|
||||
strcat(extra_path, "\\amxmod_compat\\");
|
||||
#endif
|
||||
insert_string(&includepaths, extra_path);
|
||||
free(extra_path);
|
||||
return insert_string(&includepaths,path);
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "memfile.h"
|
||||
|
||||
#if defined FORTIFY
|
||||
#include "fortify.h"
|
||||
@ -44,11 +45,7 @@
|
||||
* buffer points to the "file name"
|
||||
* bufpos is the current "file pointer"
|
||||
*/
|
||||
typedef struct tagMEMFILE {
|
||||
struct tagMEMFILE *next;
|
||||
unsigned char *buffer;
|
||||
long bufpos;
|
||||
} MEMFILE;
|
||||
typedef memfile_t MEMFILE;
|
||||
#define tMEMFILE 1
|
||||
|
||||
#include "sc.h"
|
||||
@ -56,33 +53,12 @@ typedef struct tagMEMFILE {
|
||||
|
||||
MEMFILE *mfcreate(char *filename)
|
||||
{
|
||||
MEMFILE *mf;
|
||||
|
||||
/* create a first block that only holds the name */
|
||||
mf=(MEMFILE*)malloc(sizeof(MEMFILE));
|
||||
if (mf==NULL)
|
||||
return NULL;
|
||||
memset(mf,0,sizeof(MEMFILE));
|
||||
mf->buffer=(unsigned char*)strdup(filename);
|
||||
if (mf->buffer==NULL) {
|
||||
free(mf);
|
||||
return NULL;
|
||||
} /* if */
|
||||
return mf;
|
||||
return memfile_creat(filename, 4096);
|
||||
}
|
||||
|
||||
void mfclose(MEMFILE *mf)
|
||||
{
|
||||
MEMFILE *next;
|
||||
|
||||
assert(mf!=NULL);
|
||||
while (mf!=NULL) {
|
||||
next=mf->next;
|
||||
assert(mf->buffer!=NULL);
|
||||
free(mf->buffer);
|
||||
free(mf);
|
||||
mf=next;
|
||||
} /* while */
|
||||
memfile_destroy(mf);
|
||||
}
|
||||
|
||||
int mfdump(MEMFILE *mf)
|
||||
@ -92,19 +68,12 @@ int mfdump(MEMFILE *mf)
|
||||
|
||||
assert(mf!=NULL);
|
||||
/* create the file */
|
||||
fp=fopen((char*)mf->buffer,"wb");
|
||||
fp=fopen(mf->name, "wb");
|
||||
if (fp==NULL)
|
||||
return 0;
|
||||
|
||||
okay=1;
|
||||
mf=mf->next;
|
||||
while (mf!=NULL) {
|
||||
assert(mf->buffer!=NULL);
|
||||
/* all blocks except the last should be fully filled */
|
||||
assert(mf->next==NULL || (unsigned long)mf->bufpos==BUFFERSIZE);
|
||||
okay=okay && fwrite(mf->buffer,1,(size_t)mf->bufpos,fp)==(size_t)mf->bufpos;
|
||||
mf=mf->next;
|
||||
} /* while */
|
||||
okay = okay & (fwrite(mf->base, mf->usedoffs, 1, fp)==(size_t)mf->usedoffs);
|
||||
|
||||
fclose(fp);
|
||||
return okay;
|
||||
@ -112,19 +81,7 @@ int mfdump(MEMFILE *mf)
|
||||
|
||||
long mflength(MEMFILE *mf)
|
||||
{
|
||||
long length;
|
||||
|
||||
assert(mf!=NULL);
|
||||
/* find the size of the memory file */
|
||||
length=0L;
|
||||
mf=mf->next; /* skip initial block */
|
||||
while (mf!=NULL) {
|
||||
assert(mf->next==NULL || (unsigned long)mf->bufpos==BUFFERSIZE);
|
||||
length+=mf->bufpos;
|
||||
mf=mf->next;
|
||||
} /* while */
|
||||
|
||||
return length;
|
||||
return mf->usedoffs;
|
||||
}
|
||||
|
||||
long mfseek(MEMFILE *mf,long offset,int whence)
|
||||
@ -132,7 +89,7 @@ long mfseek(MEMFILE *mf,long offset,int whence)
|
||||
long length;
|
||||
|
||||
assert(mf!=NULL);
|
||||
if (mf->next==NULL)
|
||||
if (mf->usedoffs == 0)
|
||||
return 0L; /* early exit: not a single byte in the file */
|
||||
|
||||
/* find the size of the memory file */
|
||||
@ -143,7 +100,7 @@ long mfseek(MEMFILE *mf,long offset,int whence)
|
||||
case SEEK_SET:
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
offset+=mf->bufpos;
|
||||
offset+=mf->offs;
|
||||
break;
|
||||
case SEEK_END:
|
||||
assert(offset<=0);
|
||||
@ -158,136 +115,18 @@ long mfseek(MEMFILE *mf,long offset,int whence)
|
||||
offset=length;
|
||||
|
||||
/* set new position and return it */
|
||||
mf->bufpos=offset;
|
||||
memfile_seek(mf, offset);
|
||||
return offset;
|
||||
}
|
||||
|
||||
unsigned int mfwrite(MEMFILE *mf,unsigned char *buffer,unsigned int size)
|
||||
{
|
||||
long length;
|
||||
long numblocks;
|
||||
int blockpos,blocksize;
|
||||
unsigned int bytes;
|
||||
MEMFILE *block;
|
||||
|
||||
assert(mf!=NULL);
|
||||
|
||||
/* see whether more memory must be allocated */
|
||||
length=mflength(mf);
|
||||
assert(mf->bufpos>=0 && mf->bufpos<=length);
|
||||
numblocks=(length+BUFFERSIZE-1)/BUFFERSIZE; /* # allocated blocks */
|
||||
while (mf->bufpos+size>numblocks*BUFFERSIZE) {
|
||||
/* append a block */
|
||||
MEMFILE *last;
|
||||
block=(MEMFILE*)malloc(sizeof(MEMFILE));
|
||||
if (block==NULL)
|
||||
return 0;
|
||||
memset(block,0,sizeof(MEMFILE));
|
||||
block->buffer=(unsigned char*)malloc(BUFFERSIZE);
|
||||
if (block->buffer==NULL) {
|
||||
free(block);
|
||||
return 0;
|
||||
} /* if */
|
||||
for (last=mf; last->next!=NULL; last=last->next)
|
||||
/* nothing */;
|
||||
assert(last!=NULL);
|
||||
assert(last->next==NULL);
|
||||
last->next=block;
|
||||
numblocks++;
|
||||
} /* while */
|
||||
|
||||
if (size==0)
|
||||
return 0;
|
||||
|
||||
/* find the block to start writing to */
|
||||
numblocks=mf->bufpos/BUFFERSIZE; /* # blocks to skip */
|
||||
block=mf->next;
|
||||
while (numblocks-->0) {
|
||||
assert(block!=NULL);
|
||||
block=block->next;
|
||||
} /* while */
|
||||
assert(block!=NULL);
|
||||
|
||||
/* copy into memory */
|
||||
bytes=0;
|
||||
blockpos=(int)(mf->bufpos % BUFFERSIZE);
|
||||
do {
|
||||
blocksize=BUFFERSIZE-blockpos;
|
||||
assert(blocksize>=0);
|
||||
if ((unsigned int)blocksize>size)
|
||||
blocksize=size;
|
||||
|
||||
assert(block!=NULL);
|
||||
memcpy(block->buffer+blockpos,buffer,blocksize);
|
||||
buffer+=blocksize;
|
||||
size-=blocksize;
|
||||
bytes+=blocksize;
|
||||
|
||||
if (blockpos+blocksize>block->bufpos)
|
||||
block->bufpos=blockpos+blocksize;
|
||||
assert(block->bufpos>=0 && (unsigned long)block->bufpos<=BUFFERSIZE);
|
||||
block=block->next;
|
||||
blockpos=0;
|
||||
} while (size>0);
|
||||
|
||||
/* adjust file pointer */
|
||||
mf->bufpos+=bytes;
|
||||
|
||||
return bytes;
|
||||
return (memfile_write(mf, buffer, size) ? size : 0);
|
||||
}
|
||||
|
||||
unsigned int mfread(MEMFILE *mf,unsigned char *buffer,unsigned int size)
|
||||
{
|
||||
long length;
|
||||
long numblocks;
|
||||
int blockpos,blocksize;
|
||||
unsigned int bytes;
|
||||
MEMFILE *block;
|
||||
|
||||
assert(mf!=NULL);
|
||||
|
||||
/* adjust the size to read */
|
||||
length=mflength(mf);
|
||||
assert(mf->bufpos>=0 && mf->bufpos<=length);
|
||||
if (mf->bufpos+size>(unsigned long)length)
|
||||
size=(int)(length-mf->bufpos);
|
||||
assert(mf->bufpos+size<=(unsigned long)length);
|
||||
if (size==0)
|
||||
return 0;
|
||||
|
||||
/* find the block to start reading from */
|
||||
numblocks=mf->bufpos/BUFFERSIZE; /* # blocks to skip */
|
||||
block=mf->next;
|
||||
while (numblocks-->0) {
|
||||
assert(block!=NULL);
|
||||
block=block->next;
|
||||
} /* while */
|
||||
assert(block!=NULL);
|
||||
|
||||
/* copy out of memory */
|
||||
bytes=0;
|
||||
blockpos=(int)(mf->bufpos % BUFFERSIZE);
|
||||
do {
|
||||
blocksize=BUFFERSIZE-blockpos;
|
||||
if ((unsigned int)blocksize>size)
|
||||
blocksize=size;
|
||||
|
||||
assert(block!=NULL);
|
||||
assert(block->bufpos>=0 && (unsigned long)block->bufpos<=BUFFERSIZE);
|
||||
assert(blockpos+blocksize<=block->bufpos);
|
||||
memcpy(buffer,block->buffer+blockpos,blocksize);
|
||||
buffer+=blocksize;
|
||||
size-=blocksize;
|
||||
bytes+=blocksize;
|
||||
|
||||
block=block->next;
|
||||
blockpos=0;
|
||||
} while (size>0);
|
||||
|
||||
/* adjust file pointer */
|
||||
mf->bufpos+=bytes;
|
||||
|
||||
return bytes;
|
||||
return memfile_read(mf, buffer, size);
|
||||
}
|
||||
|
||||
char *mfgets(MEMFILE *mf,char *string,unsigned int size)
|
||||
|
@ -1,5 +1,5 @@
|
||||
; Configuration file for AMX Mod X
|
||||
amxx_logdir addons/amxmodx/logs
|
||||
amxx_logs addons/amxmodx/logs
|
||||
amxx_configsdir addons/amxmodx/configs
|
||||
amxx_datadir addons/amxmodx/data
|
||||
amxx_modules addons/amxmodx/configs/modules.ini
|
||||
|
@ -1,5 +1,5 @@
|
||||
; Configuration file for AMX Mod X
|
||||
amxx_logdir addons/amxmodx/logs
|
||||
amxx_logs addons/amxmodx/logs
|
||||
amxx_configsdir addons/amxmodx/configs
|
||||
amxx_datadir addons/amxmodx/data
|
||||
amxx_modules addons/amxmodx/configs/modules.ini
|
||||
|
@ -14,7 +14,6 @@
|
||||
"mp_friendlyfire" "0" "1" "u"
|
||||
"mp_limitteams" "0" "1" "2" "u"
|
||||
"mp_autoteambalance" "0" "1" "2" "u"
|
||||
"mp_limitteams" "0" "1" "2" "u"
|
||||
"allow_spectators" "0" "1" "u"
|
||||
"mp_freezetime" "0" "6" "u"
|
||||
"mp_buytime" "1" "0.5" "u"
|
||||
|
@ -1,83 +1,39 @@
|
||||
; AMX Mod X Modules
|
||||
; You can specify both linux & win32 modules here
|
||||
; To enable a module, remove the semi-colon from the line
|
||||
|
||||
; ------------------------------
|
||||
; Fun - provides extra functions
|
||||
; ------------------------------
|
||||
fun_amxx_i386.so
|
||||
fun_amxx.dll
|
||||
fun_amxx_amd64.so
|
||||
;;;
|
||||
; To enable a module, remove the semi-colon (;) in front of its name.
|
||||
; If it's not here, simply add it its name, one per line.
|
||||
; You don't need to write the _amxx part or the file extension.
|
||||
;;;
|
||||
|
||||
; ----------------------------------------------------
|
||||
; Engine - provides engine functions core to Half-Life
|
||||
; ----------------------------------------------------
|
||||
;engine_amxx_i386.so
|
||||
;engine_amxx.dll
|
||||
;engine_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; SQL Modules usually need to be enabled manually ;;
|
||||
;; You can have any number on at a time. Use ;;
|
||||
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ----------------------------------------------------------
|
||||
; Fakemeta - provides a massive interface into the HL engine
|
||||
; ----------------------------------------------------------
|
||||
;fakemeta_amxx_i386.so
|
||||
;fakemeta_amxx.dll
|
||||
;fakemeta_amxx_amd64.so
|
||||
;mysql
|
||||
;sqlite
|
||||
|
||||
; -------------------------------------------
|
||||
; Database Access - only enable one of these
|
||||
; -------------------------------------------
|
||||
; MySQL
|
||||
;mysql_amxx_i386.so
|
||||
;mysql_amxx.dll
|
||||
;mysql_amxx_amd64.so
|
||||
; PostgreSQL
|
||||
;pgsql_amxx_i386.so
|
||||
;pgsql_amxx.dll
|
||||
; Microsoft SQL
|
||||
;mssql_amxx.dll
|
||||
; SQLite
|
||||
;sqlite_amxx.dll
|
||||
;sqlite_amxx_i386.so
|
||||
;sqlite_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Put third party modules below here. ;;
|
||||
;; You can just list their names, without the _amxx ;;
|
||||
;; or file extension. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ---------------------------------------------
|
||||
; GeoIP - determines the country of ip adresses
|
||||
; ---------------------------------------------
|
||||
;geoip_amxx_i386.so
|
||||
;geoip_amxx.dll
|
||||
;geoip_amxx_amd64.so
|
||||
|
||||
; --------------------------------
|
||||
; Sockets - network socket support
|
||||
; --------------------------------
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
;sockets_amxx_amd64.so
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
;regex_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; These modules will be auto-detected and loaded ;;
|
||||
;; as needed. You do not need to enable them here ;;
|
||||
;; unless you have problems. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; --------------------
|
||||
; Binary Vault support
|
||||
; --------------------
|
||||
;nvault_amxx_i386.so
|
||||
;nvault_amxx.dll
|
||||
;nvault_amxx_amd64.so
|
||||
|
||||
; ----------------------------------------------------------
|
||||
; Counter-Strike - adds functions specific to Counter-Strike
|
||||
; ----------------------------------------------------------
|
||||
cstrike_amxx_i386.so
|
||||
cstrike_amxx.dll
|
||||
cstrike_amxx_amd64.so
|
||||
|
||||
; -----------------------------------------------------
|
||||
; CSX - adds functionality for CS statistics and events
|
||||
; -----------------------------------------------------
|
||||
csx_amxx_i386.so
|
||||
csx_amxx.dll
|
||||
csx_amxx_amd64.so
|
||||
fun
|
||||
;engine
|
||||
;fakemeta
|
||||
;geoip
|
||||
;sockets
|
||||
;regex
|
||||
;nvault
|
||||
cstrike
|
||||
csx
|
||||
|
@ -39,5 +39,7 @@ statsx.amxx ; stats on death or round end (CSX Module required!)
|
||||
;miscstats.amxx ; bunch of events announcement for Counter-Strike
|
||||
;stats_logging.amxx ; weapons stats logging (CSX Module required!)
|
||||
|
||||
; Enable to use AMX Mod plugins
|
||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
||||
|
||||
; Custom - Add 3rd party plugins here
|
||||
|
@ -1,5 +1,5 @@
|
||||
; Configuration file for AMX Mod X
|
||||
amxx_logdir addons/amxmodx/logs
|
||||
amxx_logs addons/amxmodx/logs
|
||||
amxx_configsdir addons/amxmodx/configs
|
||||
amxx_datadir addons/amxmodx/data
|
||||
amxx_modules addons/amxmodx/configs/modules.ini
|
||||
|
@ -1,83 +1,39 @@
|
||||
; AMX Mod X Modules
|
||||
; You can specify both linux & win32 modules here
|
||||
; To enable a module, remove the semi-colon from the line
|
||||
|
||||
; ------------------------------
|
||||
; Fun - provides extra functions
|
||||
; ------------------------------
|
||||
fun_amxx_i386.so
|
||||
fun_amxx.dll
|
||||
fun_amxx_amd64.so
|
||||
;;;
|
||||
; To enable a module, remove the semi-colon (;) in front of its name.
|
||||
; If it's not here, simply add it its name, one per line.
|
||||
; You don't need to write the _amxx part or the file extension.
|
||||
;;;
|
||||
|
||||
; ----------------------------------------------------
|
||||
; Engine - provides engine functions core to Half-Life
|
||||
; ----------------------------------------------------
|
||||
;engine_amxx_i386.so
|
||||
;engine_amxx.dll
|
||||
;engine_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; SQL Modules usually need to be enabled manually ;;
|
||||
;; You can have any number on at a time. Use ;;
|
||||
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ----------------------------------------------------------
|
||||
; Fakemeta - provides a massive interface into the HL engine
|
||||
; ----------------------------------------------------------
|
||||
;fakemeta_amxx_i386.so
|
||||
;fakemeta_amxx.dll
|
||||
;fakemeta_amxx_amd64.so
|
||||
;mysql
|
||||
;sqlite
|
||||
|
||||
; -------------------------------------------
|
||||
; Database Access - only enable one of these
|
||||
; -------------------------------------------
|
||||
; MySQL
|
||||
;mysql_amxx_i386.so
|
||||
;mysql_amxx.dll
|
||||
;mysql_amxx_amd64.so
|
||||
; PostgreSQL
|
||||
;pgsql_amxx_i386.so
|
||||
;pgsql_amxx.dll
|
||||
; Microsoft SQL
|
||||
;mssql_amxx.dll
|
||||
; SQLite
|
||||
;sqlite_amxx.dll
|
||||
;sqlite_amxx_i386.so
|
||||
;sqlite_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Put third party modules below here. ;;
|
||||
;; You can just list their names, without the _amxx ;;
|
||||
;; or file extension. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ---------------------------------------------
|
||||
; GeoIP - determines the country of ip adresses
|
||||
; ---------------------------------------------
|
||||
;geoip_amxx_i386.so
|
||||
;geoip_amxx.dll
|
||||
;geoip_amxx_amd64.so
|
||||
|
||||
; --------------------------------
|
||||
; Sockets - network socket support
|
||||
; --------------------------------
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
;sockets_amxx_amd64.so
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
;regex_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; These modules will be auto-detected and loaded ;;
|
||||
;; as needed. You do not need to enable them here ;;
|
||||
;; unless you have problems. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; --------------------
|
||||
; Binary Vault support
|
||||
; --------------------
|
||||
;nvault_amxx_i386.so
|
||||
;nvault_amxx.dll
|
||||
;nvault_amxx_amd64.so
|
||||
|
||||
; --------------------------------------------------
|
||||
; Day of Defeat Fun - adds functions specific to DoD
|
||||
; --------------------------------------------------
|
||||
dodfun_amxx_i386.so
|
||||
dodfun_amxx.dll
|
||||
dodfun_amxx_amd64.so
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Day of Defeat X - adds stats and addition DoD functions
|
||||
; -------------------------------------------------------
|
||||
dodx_amxx_i386.so
|
||||
dodx_amxx.dll
|
||||
dodx_amxx_amd64.so
|
||||
fun
|
||||
;engine
|
||||
;fakemeta
|
||||
;geoip
|
||||
;sockets
|
||||
;regex
|
||||
;nvault
|
||||
dodfun
|
||||
dodx
|
||||
|
@ -38,5 +38,7 @@ statscfg.amxx ; allows to manage stats plugins via menu and commands
|
||||
;statssounds.amxx ; precache plugin for stats plugins
|
||||
;stats_logging.amxx ; weapons stats logging (DoD Module required!)
|
||||
|
||||
; Enable to use AMX Mod plugins
|
||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
||||
|
||||
; Custom - Add 3rd party plugins here
|
||||
|
@ -1,69 +1,37 @@
|
||||
; AMX Mod X Modules
|
||||
; You can specify both linux & win32 modules here
|
||||
; To enable a module, remove the semi-colon from the line
|
||||
|
||||
; ------------------------------
|
||||
; Fun - provides extra functions
|
||||
; ------------------------------
|
||||
fun_amxx_i386.so
|
||||
fun_amxx.dll
|
||||
fun_amxx_amd64.so
|
||||
;;;
|
||||
; To enable a module, remove the semi-colon (;) in front of its name.
|
||||
; If it's not here, simply add it its name, one per line.
|
||||
; You don't need to write the _amxx part or the file extension.
|
||||
;;;
|
||||
|
||||
; ----------------------------------------------------
|
||||
; Engine - provides engine functions core to Half-Life
|
||||
; ----------------------------------------------------
|
||||
engine_amxx_i386.so
|
||||
engine_amxx.dll
|
||||
engine_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; SQL Modules usually need to be enabled manually ;;
|
||||
;; You can have any number on at a time. Use ;;
|
||||
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ----------------------------------------------------------
|
||||
; Fakemeta - provides a massive interface into the HL engine
|
||||
; ----------------------------------------------------------
|
||||
fakemeta_amxx_i386.so
|
||||
fakemeta_amxx.dll
|
||||
fakemeta_amxx_amd64.so
|
||||
;mysql
|
||||
;sqlite
|
||||
|
||||
; -------------------------------------------
|
||||
; Database Access - only enable one of these
|
||||
; -------------------------------------------
|
||||
; MySQL
|
||||
;mysql_amxx_i386.so
|
||||
;mysql_amxx.dll
|
||||
;mysql_amxx_amd64.so
|
||||
; PostgreSQL
|
||||
;pgsql_amxx_i386.so
|
||||
;pgsql_amxx.dll
|
||||
; Microsoft SQL
|
||||
;mssql_amxx.dll
|
||||
; SQLite
|
||||
;sqlite_amxx.dll
|
||||
;sqlite_amxx_i386.so
|
||||
;sqlite_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Put third party modules below here. ;;
|
||||
;; You can just list their names, without the _amxx ;;
|
||||
;; or file extension. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ---------------------------------------------
|
||||
; GeoIP - determines the country of ip adresses
|
||||
; ---------------------------------------------
|
||||
;geoip_amxx_i386.so
|
||||
;geoip_amxx.dll
|
||||
;geoip_amxx_amd64.so
|
||||
|
||||
; --------------------------------
|
||||
; Sockets - network socket support
|
||||
; --------------------------------
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
;sockets_amxx_amd64.so
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
;regex_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; These modules will be auto-detected and loaded ;;
|
||||
;; as needed. You do not need to enable them here ;;
|
||||
;; unless you have problems. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; --------------------
|
||||
; Binary Vault support
|
||||
; --------------------
|
||||
;nvault_amxx_i386.so
|
||||
;nvault_amxx.dll
|
||||
;nvault_amxx_amd64.so
|
||||
fun
|
||||
engine
|
||||
fakemeta
|
||||
;geoip
|
||||
;sockets
|
||||
;regex
|
||||
;nvault
|
||||
|
@ -33,6 +33,8 @@ timeleft.amxx ; displays time left on map
|
||||
pausecfg.amxx ; allows to pause and unpause some plugins
|
||||
statscfg.amxx ; allows to manage stats plugins via menu and commands
|
||||
|
||||
; Enable to use AMX Mod plugins
|
||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
||||
|
||||
; Custom - Add 3rd party plugins here
|
||||
EvolutionX.Core.amxx ; Adds extra plugin functions for Earth's Special Forces
|
||||
|
@ -1,69 +1,37 @@
|
||||
; AMX Mod X Modules
|
||||
; You can specify both linux & win32 modules here
|
||||
; To enable a module, remove the semi-colon from the line
|
||||
|
||||
; ------------------------------
|
||||
; Fun - provides extra functions
|
||||
; ------------------------------
|
||||
fun_amxx_i386.so
|
||||
fun_amxx.dll
|
||||
fun_amxx_amd64.so
|
||||
;;;
|
||||
; To enable a module, remove the semi-colon (;) in front of its name.
|
||||
; If it's not here, simply add it its name, one per line.
|
||||
; You don't need to write the _amxx part or the file extension.
|
||||
;;;
|
||||
|
||||
; ----------------------------------------------------
|
||||
; Engine - provides engine functions core to Half-Life
|
||||
; ----------------------------------------------------
|
||||
;engine_amxx_i386.so
|
||||
;engine_amxx.dll
|
||||
;engine_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; SQL Modules usually need to be enabled manually ;;
|
||||
;; You can have any number on at a time. Use ;;
|
||||
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ----------------------------------------------------------
|
||||
; Fakemeta - provides a massive interface into the HL engine
|
||||
; ----------------------------------------------------------
|
||||
;fakemeta_amxx_i386.so
|
||||
;fakemeta_amxx.dll
|
||||
;fakemeta_amxx_amd64.so
|
||||
;mysql
|
||||
;sqlite
|
||||
|
||||
; -------------------------------------------
|
||||
; Database Access - only enable one of these
|
||||
; -------------------------------------------
|
||||
; MySQL
|
||||
;mysql_amxx_i386.so
|
||||
;mysql_amxx.dll
|
||||
;mysql_amxx_amd64.so
|
||||
; PostgreSQL
|
||||
;pgsql_amxx_i386.so
|
||||
;pgsql_amxx.dll
|
||||
; Microsoft SQL
|
||||
;mssql_amxx.dll
|
||||
; SQLite
|
||||
;sqlite_amxx.dll
|
||||
;sqlite_amxx_i386.so
|
||||
;sqlite_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Put third party modules below here. ;;
|
||||
;; You can just list their names, without the _amxx ;;
|
||||
;; or file extension. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ---------------------------------------------
|
||||
; GeoIP - determines the country of ip adresses
|
||||
; ---------------------------------------------
|
||||
;geoip_amxx_i386.so
|
||||
;geoip_amxx.dll
|
||||
;geoip_amxx_amd64.so
|
||||
|
||||
; --------------------------------
|
||||
; Sockets - network socket support
|
||||
; --------------------------------
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
;sockets_amxx_amd64.so
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
;regex_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; These modules will be auto-detected and loaded ;;
|
||||
;; as needed. You do not need to enable them here ;;
|
||||
;; unless you have problems. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; --------------------
|
||||
; Binary Vault support
|
||||
; --------------------
|
||||
;nvault_amxx_i386.so
|
||||
;nvault_amxx.dll
|
||||
;nvault_amxx_amd64.so
|
||||
;fun
|
||||
;engine
|
||||
;fakemeta
|
||||
;geoip
|
||||
;sockets
|
||||
;regex
|
||||
;nvault
|
||||
|
@ -1,76 +1,38 @@
|
||||
; AMX Mod X Modules
|
||||
; You can specify both linux & win32 modules here
|
||||
; To enable a module, remove the semi-colon from the line
|
||||
|
||||
; ------------------------------
|
||||
; Fun - provides extra functions
|
||||
; ------------------------------
|
||||
fun_amxx_i386.so
|
||||
fun_amxx.dll
|
||||
fun_amxx_amd64.so
|
||||
;;;
|
||||
; To enable a module, remove the semi-colon (;) in front of its name.
|
||||
; If it's not here, simply add it its name, one per line.
|
||||
; You don't need to write the _amxx part or the file extension.
|
||||
;;;
|
||||
|
||||
; ----------------------------------------------------
|
||||
; Engine - provides engine functions core to Half-Life
|
||||
; ----------------------------------------------------
|
||||
;engine_amxx_i386.so
|
||||
;engine_amxx.dll
|
||||
;engine_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; SQL Modules usually need to be enabled manually ;;
|
||||
;; You can have any number on at a time. Use ;;
|
||||
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ----------------------------------------------------------
|
||||
; Fakemeta - provides a massive interface into the HL engine
|
||||
; ----------------------------------------------------------
|
||||
;fakemeta_amxx_i386.so
|
||||
;fakemeta_amxx.dll
|
||||
;fakemeta_amxx_amd64.so
|
||||
;mysql
|
||||
;sqlite
|
||||
|
||||
; -------------------------------------------
|
||||
; Database Access - only enable one of these
|
||||
; -------------------------------------------
|
||||
; MySQL
|
||||
;mysql_amxx_i386.so
|
||||
;mysql_amxx.dll
|
||||
;mysql_amxx_amd64.so
|
||||
; PostgreSQL
|
||||
;pgsql_amxx_i386.so
|
||||
;pgsql_amxx.dll
|
||||
; Microsoft SQL
|
||||
;mssql_amxx.dll
|
||||
; SQLite
|
||||
;sqlite_amxx.dll
|
||||
;sqlite_amxx_i386.so
|
||||
;sqlite_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Put third party modules below here. ;;
|
||||
;; You can just list their names, without the _amxx ;;
|
||||
;; or file extension. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ---------------------------------------------
|
||||
; GeoIP - determines the country of ip adresses
|
||||
; ---------------------------------------------
|
||||
;geoip_amxx_i386.so
|
||||
;geoip_amxx.dll
|
||||
;geoip_amxx_amd64.so
|
||||
|
||||
; --------------------------------
|
||||
; Sockets - network socket support
|
||||
; --------------------------------
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
;sockets_amxx_amd64.so
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
;regex_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; These modules will be auto-detected and loaded ;;
|
||||
;; as needed. You do not need to enable them here ;;
|
||||
;; unless you have problems. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; --------------------
|
||||
; Binary Vault support
|
||||
; --------------------
|
||||
;nvault_amxx_i386.so
|
||||
;nvault_amxx.dll
|
||||
;nvault_amxx_amd64.so
|
||||
|
||||
; -----------------
|
||||
; Natural Selection
|
||||
; -----------------
|
||||
ns_amxx_i386.so
|
||||
ns_amxx.dll
|
||||
ns_amxx_amd64.so
|
||||
fun
|
||||
;engine
|
||||
;fakemeta
|
||||
;geoip
|
||||
;sockets
|
||||
;regex
|
||||
;nvault
|
||||
ns
|
||||
|
@ -37,4 +37,7 @@ idlekicker.amxx ; kicks idle players
|
||||
nscommands.amxx ; extra commands for Natural-Selection
|
||||
;unstuck.amxx ; Free stuck players (engine & ns modules required!)
|
||||
|
||||
; Enable to use AMX Mod plugins
|
||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
||||
|
||||
; Custom - Add 3rd party plugins here
|
||||
|
@ -33,5 +33,8 @@ timeleft.amxx ; displays time left on map
|
||||
pausecfg.amxx ; allows to pause and unpause some plugins
|
||||
statscfg.amxx ; allows to manage stats plugins via menu and commands
|
||||
|
||||
; Enable to use AMX Mod plugins
|
||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
||||
|
||||
|
||||
; Custom - Add 3rd party plugins here
|
||||
|
@ -4,8 +4,11 @@
|
||||
// *NOTE* Linux users may encounter problems if they specify "localhost" instead of "127.0.0.1"
|
||||
// We recommend using your server IP address instead of its name
|
||||
|
||||
// *NOTE* amx_sql_type specifies the DEFAULT database type which admin.sma will use.
|
||||
|
||||
amx_sql_host "127.0.0.1"
|
||||
amx_sql_user "root"
|
||||
amx_sql_pass ""
|
||||
amx_sql_db "amx"
|
||||
amx_sql_table "admins"
|
||||
amx_sql_db "amx"
|
||||
amx_sql_table "admins"
|
||||
amx_sql_type "mysql"
|
||||
|
@ -1,5 +1,5 @@
|
||||
; Configuration file for AMX Mod X
|
||||
amxx_logdir addons/amxmodx/logs
|
||||
amxx_logs addons/amxmodx/logs
|
||||
amxx_configsdir addons/amxmodx/configs
|
||||
amxx_datadir addons/amxmodx/data
|
||||
amxx_modules addons/amxmodx/configs/modules.ini
|
||||
|
@ -1,76 +1,38 @@
|
||||
; AMX Mod X Modules
|
||||
; You can specify both linux & win32 modules here
|
||||
; To enable a module, remove the semi-colon from the line
|
||||
|
||||
; ------------------------------
|
||||
; Fun - provides extra functions
|
||||
; ------------------------------
|
||||
fun_amxx_i386.so
|
||||
fun_amxx.dll
|
||||
fun_amxx_amd64.so
|
||||
;;;
|
||||
; To enable a module, remove the semi-colon (;) in front of its name.
|
||||
; If it's not here, simply add it its name, one per line.
|
||||
; You don't need to write the _amxx part or the file extension.
|
||||
;;;
|
||||
|
||||
; ----------------------------------------------------
|
||||
; Engine - provides engine functions core to Half-Life
|
||||
; ----------------------------------------------------
|
||||
;engine_amxx_i386.so
|
||||
;engine_amxx.dll
|
||||
;engine_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; SQL Modules usually need to be enabled manually ;;
|
||||
;; You can have any number on at a time. Use ;;
|
||||
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ----------------------------------------------------------
|
||||
; Fakemeta - provides a massive interface into the HL engine
|
||||
; ----------------------------------------------------------
|
||||
;fakemeta_amxx_i386.so
|
||||
;fakemeta_amxx.dll
|
||||
;fakemeta_amxx_amd64.so
|
||||
;mysql
|
||||
;sqlite
|
||||
|
||||
; -------------------------------------------
|
||||
; Database Access - only enable one of these
|
||||
; -------------------------------------------
|
||||
; MySQL
|
||||
;mysql_amxx_i386.so
|
||||
;mysql_amxx.dll
|
||||
;mysql_amxx_amd64.so
|
||||
; PostgreSQL
|
||||
;pgsql_amxx_i386.so
|
||||
;pgsql_amxx.dll
|
||||
; Microsoft SQL
|
||||
;mssql_amxx.dll
|
||||
; SQLite
|
||||
;sqlite_amxx.dll
|
||||
;sqlite_amxx_i386.so
|
||||
;sqlite_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Put third party modules below here. ;;
|
||||
;; You can just list their names, without the _amxx ;;
|
||||
;; or file extension. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; ---------------------------------------------
|
||||
; GeoIP - determines the country of ip adresses
|
||||
; ---------------------------------------------
|
||||
;geoip_amxx_i386.so
|
||||
;geoip_amxx.dll
|
||||
;geoip_amxx_amd64.so
|
||||
|
||||
; --------------------------------
|
||||
; Sockets - network socket support
|
||||
; --------------------------------
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
;sockets_amxx_amd64.so
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
;regex_amxx_amd64.so
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; These modules will be auto-detected and loaded ;;
|
||||
;; as needed. You do not need to enable them here ;;
|
||||
;; unless you have problems. ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; --------------------
|
||||
; Binary Vault support
|
||||
; --------------------
|
||||
;nvault_amxx_i386.so
|
||||
;nvault_amxx.dll
|
||||
;nvault_amxx_amd64.so
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; Team Fortress Classic X - adds functions and stats specific to TFC
|
||||
; ------------------------------------------------------------------
|
||||
tfcx_amxx_i386.so
|
||||
tfcx_amxx.dll
|
||||
tfcx_amxx_amd64.so
|
||||
fun
|
||||
;engine
|
||||
;fakemeta
|
||||
;geoip
|
||||
;sockets
|
||||
;regex
|
||||
;nvault
|
||||
tfcx
|
||||
|
@ -38,5 +38,7 @@ statscfg.amxx ; allows to manage stats plugins via menu and commands
|
||||
;statssounds.amxx ; precache plugin for stats plugins
|
||||
;stats_logging.amxx ; weapons stats logging (TFC Module required!)
|
||||
|
||||
; Enable to use AMX Mod plugins
|
||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
||||
|
||||
; Custom - Add 3rd party plugins here
|
||||
|
@ -1,5 +1,5 @@
|
||||
; Configuration file for AMX Mod X
|
||||
amxx_logdir addons/amxmodx/logs
|
||||
amxx_logs addons/amxmodx/logs
|
||||
amxx_configsdir addons/amxmodx/configs
|
||||
amxx_datadir addons/amxmodx/data
|
||||
amxx_modules addons/amxmodx/configs/modules.ini
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user