Compare commits
429 Commits
amxmodx-1.
...
amxmodx-1.
Author | SHA1 | Date | |
---|---|---|---|
028da81df7 | |||
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 | |||
8a2d750970 | |||
46b70bdfba | |||
15e137e266 | |||
93c8bd0253 | |||
10a935790c | |||
68208d73d7 | |||
b57367dd30 | |||
9eb9839a46 | |||
deccf7816c | |||
fe971497cc | |||
8c2be55233 | |||
ab443e8254 | |||
16e53eded8 | |||
a7acf05bfc | |||
5e22cd5f0a | |||
92be7f6791 | |||
94c449936d | |||
89c58265aa | |||
3783e34a70 | |||
414ecdfffa | |||
76afa40270 | |||
17bbc37638 | |||
4b0b3c0c7c | |||
006b4bd49a | |||
5395fc1280 | |||
a293e23fe2 | |||
68e729721d | |||
4f5c16c278 | |||
c15a86b454 | |||
51c8724cff | |||
ccb3b4fbb3 | |||
83bf0d7b2a | |||
f55a8c54cc | |||
dc9350fcc5 | |||
ef5437fec3 | |||
0999db0203 | |||
d84ef62e6c | |||
b5e8bc9ec1 | |||
ccaa4434ad | |||
555ac1c7f3 | |||
b9788b7e1b | |||
c6e332a0f5 | |||
007d41b5af | |||
a1956bc83b | |||
ff61158491 | |||
2c5520cad0 | |||
4bcb0fcb13 | |||
6ef670878d | |||
89e13334ae | |||
82fe1e10d9 | |||
e067a980be | |||
e98fbc47e8 | |||
b6fa60b0bd | |||
7e97156fc4 | |||
7190d933b4 | |||
3699796bc6 | |||
e208ff0664 | |||
adc2a7d169 | |||
dc8e162e26 | |||
522511d059 | |||
d5152fedc4 | |||
d7bef2ae4b | |||
9283cbe1c2 | |||
7dae023a98 | |||
9c88ce1394 | |||
4cb8d4adc7 | |||
5c88803942 | |||
4457b0d879 | |||
58415dcfb9 | |||
76c216d07e | |||
aa3582a2f3 | |||
d80b59e639 | |||
880cb401fb | |||
2e0dcb860a | |||
a9684fb81d | |||
f2b8b82515 | |||
eb7a49f6d4 | |||
982b22ab20 |
@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
#include "binlog.h"
|
||||||
|
|
||||||
CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes)
|
CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes)
|
||||||
{
|
{
|
||||||
@ -55,6 +56,8 @@ CForward::CForward(const char *name, ForwardExecType et, int numParams, const Fo
|
|||||||
m_Funcs.push_back(tmp);
|
m_Funcs.push_back(tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_Name.assign(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||||
@ -124,6 +127,9 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
|||||||
|
|
||||||
// exec
|
// exec
|
||||||
cell retVal;
|
cell retVal;
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
g_BinLog.WriteOp(BinLog_CallPubFunc, (*iter).pPlugin->getId(), iter->func);
|
||||||
|
#endif
|
||||||
int err = amx_Exec(amx, &retVal, iter->func);
|
int err = amx_Exec(amx, &retVal, iter->func);
|
||||||
|
|
||||||
// log runtime error, if any
|
// log runtime error, if any
|
||||||
@ -206,12 +212,16 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
|||||||
|
|
||||||
void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
||||||
{
|
{
|
||||||
|
char name[sNAMEMAX];
|
||||||
m_Func = func;
|
m_Func = func;
|
||||||
m_Amx = amx;
|
m_Amx = amx;
|
||||||
m_NumParams = numParams;
|
m_NumParams = numParams;
|
||||||
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
||||||
m_HasFunc = true;
|
m_HasFunc = true;
|
||||||
isFree = false;
|
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)
|
void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
||||||
@ -221,6 +231,7 @@ void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const Forwar
|
|||||||
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
||||||
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
|
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
|
||||||
isFree = false;
|
isFree = false;
|
||||||
|
m_Name.assign(funcName);
|
||||||
}
|
}
|
||||||
|
|
||||||
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||||
@ -284,6 +295,9 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
|||||||
|
|
||||||
// exec
|
// exec
|
||||||
cell retVal;
|
cell retVal;
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
g_BinLog.WriteOp(BinLog_CallPubFunc, pPlugin->getId(), m_Func);
|
||||||
|
#endif
|
||||||
int err = amx_Exec(m_Amx, &retVal, m_Func);
|
int err = amx_Exec(m_Amx, &retVal, m_Func);
|
||||||
|
|
||||||
if (err != AMX_ERR_NONE)
|
if (err != AMX_ERR_NONE)
|
||||||
@ -438,6 +452,11 @@ cell CForwardMngr::executeForwards(int id, cell *params)
|
|||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *CForwardMngr::getFuncName(int id) const
|
||||||
|
{
|
||||||
|
return (id & 1) ? m_SPForwards[id >> 1]->getFuncName() : m_Forwards[id >> 1]->getFuncName();
|
||||||
|
}
|
||||||
|
|
||||||
int CForwardMngr::getParamsNum(int id) const
|
int CForwardMngr::getParamsNum(int id) const
|
||||||
{
|
{
|
||||||
return (id & 1) ? m_SPForwards[id >> 1]->getParamsNum() : m_Forwards[id >> 1]->getParamsNum();
|
return (id & 1) ? m_SPForwards[id >> 1]->getParamsNum() : m_Forwards[id >> 1]->getParamsNum();
|
||||||
|
@ -93,6 +93,7 @@ class CForward
|
|||||||
const char *m_FuncName;
|
const char *m_FuncName;
|
||||||
ForwardExecType m_ExecType;
|
ForwardExecType m_ExecType;
|
||||||
int m_NumParams;
|
int m_NumParams;
|
||||||
|
String m_Name;
|
||||||
|
|
||||||
struct AMXForward
|
struct AMXForward
|
||||||
{
|
{
|
||||||
@ -121,6 +122,11 @@ public:
|
|||||||
return m_Funcs.size();
|
return m_Funcs.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *getFuncName() const
|
||||||
|
{
|
||||||
|
return m_Name.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
ForwardParam getParamType(int paramId) const
|
ForwardParam getParamType(int paramId) const
|
||||||
{
|
{
|
||||||
if (paramId < 0 || paramId >= m_NumParams)
|
if (paramId < 0 || paramId >= m_NumParams)
|
||||||
@ -141,6 +147,7 @@ class CSPForward
|
|||||||
|
|
||||||
int m_Func;
|
int m_Func;
|
||||||
bool m_HasFunc;
|
bool m_HasFunc;
|
||||||
|
String m_Name;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool isFree;
|
bool isFree;
|
||||||
@ -161,6 +168,11 @@ public:
|
|||||||
return (m_HasFunc) ? 1 : 0;
|
return (m_HasFunc) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *getFuncName() const
|
||||||
|
{
|
||||||
|
return m_Name.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
ForwardParam getParamType(int paramId) const
|
ForwardParam getParamType(int paramId) const
|
||||||
{
|
{
|
||||||
if (paramId < 0 || paramId >= m_NumParams)
|
if (paramId < 0 || paramId >= m_NumParams)
|
||||||
@ -207,6 +219,7 @@ public:
|
|||||||
bool isSPForward(int id) const; // check whether forward is single plugin
|
bool isSPForward(int id) const; // check whether forward is single plugin
|
||||||
int getParamsNum(int id) const; // get num of params of a forward
|
int getParamsNum(int id) const; // get num of params of a forward
|
||||||
int getFuncsNum(int id) const; // get num of found functions of a forward
|
int getFuncsNum(int id) const; // get num of found functions of a forward
|
||||||
|
const char *getFuncName(int id) const; // get the function name
|
||||||
|
|
||||||
ForwardParam getParamType(int id, int paramId) const;
|
ForwardParam getParamType(int id, int paramId) const;
|
||||||
cell prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type, bool copyBack); // prepare array
|
cell prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type, bool copyBack); // prepare array
|
||||||
|
@ -47,41 +47,6 @@
|
|||||||
#define INSERT_STRING 3
|
#define INSERT_STRING 3
|
||||||
#define INSERT_NEWLINE 4
|
#define INSERT_NEWLINE 4
|
||||||
|
|
||||||
// dictionary format is Fast-Format-Hash-Lookup, v6
|
|
||||||
#define MAGIC_HDR 0x4646484C
|
|
||||||
#define FFHL_VERSION 6
|
|
||||||
#define FFHL_MIN_VERSION 6
|
|
||||||
|
|
||||||
/*version history:
|
|
||||||
* 1 (BAILOPAN) - Simplest form possible, no reverse
|
|
||||||
* 2 (BAILOPAN) - One language per file with full reverse
|
|
||||||
* 3 (PM OnoTo) - 2^32 languages per file with full reverse
|
|
||||||
* 4 (BAILOPAN) - Optimized by separating and relocating tables (normalization)
|
|
||||||
* 5 (BAILOPAN) - Removed hash storage
|
|
||||||
* 6 (BAILOPAN) - Arbitrary bump to force reparse.
|
|
||||||
FORMAT:
|
|
||||||
Magic 4bytes
|
|
||||||
Version 1byte
|
|
||||||
Number of Keys 4bytes
|
|
||||||
Number of Languages 4bytes
|
|
||||||
LANG INFO TABLE[]
|
|
||||||
Language Name 2bytes
|
|
||||||
Offset 4bytes
|
|
||||||
KEY TABLE[]
|
|
||||||
Key Lookup Offset 4bytes
|
|
||||||
LANGUAGES TABLE[]
|
|
||||||
Language[]
|
|
||||||
Definitions 4bytes
|
|
||||||
Key # 4bytes (0-index into key table)
|
|
||||||
Def Offset 4bytes
|
|
||||||
KEY LOOKUP TABLE[]
|
|
||||||
Key length 1byte
|
|
||||||
Key string variable
|
|
||||||
DEF LOOKUP TABLE[]
|
|
||||||
Def length 2bytes
|
|
||||||
Def string variable
|
|
||||||
*/
|
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
int Compare<String>(const String &k1, const String &k2)
|
int Compare<String>(const String &k1, const String &k2)
|
||||||
{
|
{
|
||||||
@ -249,76 +214,11 @@ const char * CLangMngr::CLang::GetDef(int key, int &status)
|
|||||||
return def.definition->c_str();
|
return def.definition->c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assumes fp is set to the right position
|
|
||||||
bool CLangMngr::CLang::SaveDefinitions(FILE *fp, uint32_t &curOffset)
|
|
||||||
{
|
|
||||||
unsigned short defLen = 0;
|
|
||||||
String *pdef;
|
|
||||||
|
|
||||||
THash<int, defentry>::iterator iter;
|
|
||||||
for (iter=m_LookUpTable.begin(); iter!=m_LookUpTable.end(); iter++)
|
|
||||||
{
|
|
||||||
pdef = iter->val.definition;
|
|
||||||
if (!pdef)
|
|
||||||
continue;
|
|
||||||
defLen = pdef->size();
|
|
||||||
fwrite((void *)&defLen, sizeof(unsigned short), 1, fp);
|
|
||||||
curOffset += sizeof(unsigned short);
|
|
||||||
fwrite(pdef->c_str(), sizeof(char), defLen, fp);
|
|
||||||
curOffset += defLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CLangMngr::CLang::Entries()
|
int CLangMngr::CLang::Entries()
|
||||||
{
|
{
|
||||||
return m_entries;
|
return m_entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assumes fp is set to the right position
|
|
||||||
bool CLangMngr::CLang::Save(FILE *fp, int &defOffset, uint32_t &curOffset)
|
|
||||||
{
|
|
||||||
uint32_t keynum = 0;
|
|
||||||
uint32_t size = 0;
|
|
||||||
String *pdef;
|
|
||||||
|
|
||||||
//:TODO: remove this loop and assertion, use m_entries for size
|
|
||||||
THash<int, defentry>::iterator iter;
|
|
||||||
for (iter=m_LookUpTable.begin(); iter!=m_LookUpTable.end(); iter++)
|
|
||||||
{
|
|
||||||
if (iter->val.definition)
|
|
||||||
size++;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(size == m_entries);
|
|
||||||
|
|
||||||
fwrite((void*)&size, sizeof(uint32_t), 1, fp);
|
|
||||||
curOffset += sizeof(uint32_t);
|
|
||||||
|
|
||||||
for (iter=m_LookUpTable.begin(); iter!=m_LookUpTable.end(); iter++)
|
|
||||||
{
|
|
||||||
keynum = iter->key;
|
|
||||||
pdef = iter->val.definition;
|
|
||||||
if (!pdef)
|
|
||||||
continue;
|
|
||||||
fwrite((void *)&keynum, sizeof(uint32_t), 1, fp);
|
|
||||||
curOffset += sizeof(uint32_t);
|
|
||||||
fwrite((void *)&defOffset, sizeof(uint32_t), 1, fp);
|
|
||||||
curOffset += sizeof(uint32_t);
|
|
||||||
defOffset += sizeof(short);
|
|
||||||
defOffset += pdef->size();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// assumes fp is set to the right position
|
|
||||||
bool CLangMngr::CLang::Load(FILE *fp)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/******** CLangMngr *********/
|
/******** CLangMngr *********/
|
||||||
|
|
||||||
inline String &make_string(const char *str)
|
inline String &make_string(const char *str)
|
||||||
@ -381,35 +281,6 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
|
|||||||
return outbuf;
|
return outbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *CLangMngr::Format(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
const char *retVal = FormatString(fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef CHECK_PTR
|
|
||||||
#undef CHECK_OUTPR
|
|
||||||
#undef ZEROTERM
|
|
||||||
#undef NEXT_PARAM
|
|
||||||
|
|
||||||
#define CHECK_PTR(ptr, start, bufsize) if ((ptr) - (start) >= (bufsize)) { \
|
|
||||||
AMXXLOG_Log("[AMXX] Buffer overflow in formatting"); \
|
|
||||||
outbuf[0] = 0; \
|
|
||||||
return outbuf; }
|
|
||||||
#define CHECK_OUTPTR(offset) CHECK_PTR(outptr+offset, outbuf, sizeof(outbuf))
|
|
||||||
#define ZEROTERM(buf) buf[(sizeof(buf)/sizeof(buf[0]))-1]=0;
|
|
||||||
#define NEXT_PARAM()
|
|
||||||
|
|
||||||
//this is not implemented....
|
|
||||||
char *CLangMngr::FormatString(const char *fmt, va_list &ap)
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
void CLangMngr::MergeDefinitions(const char *lang, CQueue<sKeyDef> &tmpVec)
|
void CLangMngr::MergeDefinitions(const char *lang, CQueue<sKeyDef> &tmpVec)
|
||||||
{
|
{
|
||||||
CLang * language = GetLang(lang);
|
CLang * language = GetLang(lang);
|
||||||
@ -638,286 +509,6 @@ void CLangMngr::InvalidateCache()
|
|||||||
FileList.clear();
|
FileList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CLangMngr::Save(const char *filename)
|
|
||||||
{
|
|
||||||
FILE *fp = fopen(filename, "wb");
|
|
||||||
|
|
||||||
if (!fp)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
uint32_t magic = MAGIC_HDR;
|
|
||||||
unsigned char version = FFHL_VERSION;
|
|
||||||
uint32_t langNum = m_Languages.size();
|
|
||||||
const char *langName = 0;
|
|
||||||
uint32_t curOffset = 0;
|
|
||||||
uint32_t keyNum = KeyList.size();
|
|
||||||
uint32_t ktbSize = KeyList.size() * sizeof(uint32_t);
|
|
||||||
uint32_t ltbSize = m_Languages.size() * ((sizeof(char)*2) + sizeof(uint32_t));
|
|
||||||
|
|
||||||
fwrite((void *)&magic, sizeof(uint32_t), 1, fp);
|
|
||||||
fwrite((void *)&version, sizeof(unsigned char), 1, fp);
|
|
||||||
fwrite((void *)&keyNum, sizeof(uint32_t), 1, fp);
|
|
||||||
fwrite((void *)&langNum, sizeof(uint32_t), 1, fp);
|
|
||||||
|
|
||||||
curOffset += sizeof(uint32_t);
|
|
||||||
curOffset += sizeof(unsigned char);
|
|
||||||
curOffset += sizeof(uint32_t);
|
|
||||||
curOffset += sizeof(uint32_t);
|
|
||||||
|
|
||||||
uint32_t langOffset = curOffset + ktbSize + ltbSize;
|
|
||||||
for (unsigned int i = 0; i < m_Languages.size(); i++)
|
|
||||||
{
|
|
||||||
langName = m_Languages[i]->GetName();
|
|
||||||
fwrite(langName, sizeof(char), 2, fp);
|
|
||||||
curOffset += sizeof(char) * 2;
|
|
||||||
fwrite((void *)&langOffset, sizeof(uint32_t), 1, fp);
|
|
||||||
langOffset += sizeof(uint32_t) + (m_Languages[i]->Entries() * (sizeof(uint32_t) * 2));
|
|
||||||
curOffset += sizeof(uint32_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Note - langOffset now points to the start of key lookup table
|
|
||||||
uint32_t keyHash = 0;
|
|
||||||
uint32_t keyOffset = langOffset;
|
|
||||||
for (unsigned int i = 0; i < KeyList.size(); i++)
|
|
||||||
{
|
|
||||||
fwrite((void*)&keyOffset, sizeof(uint32_t), 1, fp);
|
|
||||||
curOffset += sizeof(uint32_t);
|
|
||||||
keyOffset += sizeof(char);
|
|
||||||
keyOffset += KeyList[i]->size();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Note - now keyOffset points toward the start of the def table
|
|
||||||
int defOffset = keyOffset;
|
|
||||||
for (unsigned int i = 0; i < m_Languages.size(); i++)
|
|
||||||
{
|
|
||||||
m_Languages[i]->Save(fp, defOffset, curOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Now, defOffset points toward the END of the file
|
|
||||||
//curoffset should point toward the key table, so...
|
|
||||||
unsigned char keyLen = 0;
|
|
||||||
for (unsigned int i = 0; i < KeyList.size(); i++)
|
|
||||||
{
|
|
||||||
keyLen = KeyList[i]->size();
|
|
||||||
fwrite((void*)&keyLen, sizeof(unsigned char), 1, fp);
|
|
||||||
curOffset += sizeof(unsigned char);
|
|
||||||
fwrite(KeyList[i]->c_str(), sizeof(char), keyLen, fp);
|
|
||||||
curOffset += sizeof(char) * keyLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Finally, write the def table
|
|
||||||
// It's assumed no orders changed...
|
|
||||||
for (unsigned int i = 0; i < m_Languages.size(); i++)
|
|
||||||
{
|
|
||||||
m_Languages[i]->SaveDefinitions(fp, curOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
//done!
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CLangMngr::SaveCache(const char *filename)
|
|
||||||
{
|
|
||||||
FILE *fp = fopen(filename, "wb");
|
|
||||||
if (!fp)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVector<md5Pair *>::iterator i;
|
|
||||||
short dictCount = FileList.size();
|
|
||||||
char len = 0;
|
|
||||||
|
|
||||||
fwrite((void *)&dictCount, sizeof(short), 1, fp);
|
|
||||||
|
|
||||||
for (i = FileList.begin(); i != FileList.end(); i++)
|
|
||||||
{
|
|
||||||
len = (*i)->file.size();
|
|
||||||
fwrite((void *)&len, sizeof(char), 1, fp);
|
|
||||||
fwrite((*i)->file.c_str(), sizeof(char), len, fp);
|
|
||||||
fwrite((*i)->val.c_str(), sizeof(char), 32, fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CACHEREAD(expr, type) \
|
|
||||||
if (! (expr==1) ) { \
|
|
||||||
FileList.clear(); \
|
|
||||||
fclose(fp); \
|
|
||||||
return false; \
|
|
||||||
}
|
|
||||||
#define CACHEREAD_S(expr, size) \
|
|
||||||
if (! (expr==size) ) { \
|
|
||||||
FileList.clear(); \
|
|
||||||
fclose(fp); \
|
|
||||||
return false; \
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CLangMngr::LoadCache(const char *filename)
|
|
||||||
{
|
|
||||||
FILE *fp = fopen(filename, "rb");
|
|
||||||
if (!fp)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
short dictCount = 0;
|
|
||||||
char len = 0;
|
|
||||||
char buf[255];
|
|
||||||
char md5[34];
|
|
||||||
CACHEREAD(fread((void*)&dictCount, sizeof(short), 1, fp), short);
|
|
||||||
md5Pair *p = 0;
|
|
||||||
|
|
||||||
for (int i = 1; i <= dictCount; i++)
|
|
||||||
{
|
|
||||||
CACHEREAD(fread((void*)&len, sizeof(char), 1, fp), char);
|
|
||||||
CACHEREAD_S(fread(buf, sizeof(char), len, fp), len);
|
|
||||||
buf[len] = 0;
|
|
||||||
CACHEREAD_S(fread(md5, sizeof(char), 32, fp), 32);
|
|
||||||
md5[32] = 0;
|
|
||||||
p = new md5Pair;
|
|
||||||
p->file.assign(buf);
|
|
||||||
p->val.assign(md5);
|
|
||||||
FileList.push_back(p);
|
|
||||||
p = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DATREAD(expr, type) \
|
|
||||||
if (! (expr==1) ) { \
|
|
||||||
Clear(); \
|
|
||||||
fclose(fp); \
|
|
||||||
return false; \
|
|
||||||
}
|
|
||||||
#define DATREAD_S(expr, size) \
|
|
||||||
if (! (expr==size) ) { \
|
|
||||||
Clear(); \
|
|
||||||
fclose(fp); \
|
|
||||||
return false; \
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CLangMngr::Load(const char *filename)
|
|
||||||
{
|
|
||||||
Clear();
|
|
||||||
|
|
||||||
FILE *fp = fopen(filename, "rb");
|
|
||||||
|
|
||||||
if (!fp)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
uint32_t magic = 0;
|
|
||||||
uint32_t langCount = 0;
|
|
||||||
uint32_t keycount = 0;
|
|
||||||
char version = 0;
|
|
||||||
|
|
||||||
fseek(fp, 0, SEEK_END);
|
|
||||||
long size = ftell(fp);
|
|
||||||
rewind(fp);
|
|
||||||
|
|
||||||
DATREAD(fread((void*)&magic, sizeof(uint32_t), 1, fp), uint32_t);
|
|
||||||
if (magic != MAGIC_HDR)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
DATREAD(fread((void*)&version, sizeof(char), 1, fp), char);
|
|
||||||
if (version > FFHL_VERSION || version < FFHL_MIN_VERSION)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
DATREAD(fread((void*)&keycount, sizeof(uint32_t), 1, fp), uint32_t);
|
|
||||||
DATREAD(fread((void*)&langCount, sizeof(uint32_t), 1, fp), uint32_t);
|
|
||||||
|
|
||||||
uint32_t *LangOffsets = new uint32_t[langCount];
|
|
||||||
char langname[3];
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < langCount; i++)
|
|
||||||
{
|
|
||||||
DATREAD_S(fread(langname, sizeof(char), 2, fp), 2);
|
|
||||||
langname[2] = 0;
|
|
||||||
GetLang(langname); //this will initialize for us
|
|
||||||
DATREAD(fread((void *)&(LangOffsets[i]), sizeof(uint32_t), 1, fp), uint32_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
//we should now be at the key table
|
|
||||||
int ktbOffset = ftell(fp);
|
|
||||||
unsigned char keylen;
|
|
||||||
char keybuf[255];
|
|
||||||
uint32_t bogus;
|
|
||||||
uint32_t keyoffset, save;
|
|
||||||
String _tmpkey;
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < keycount; i++)
|
|
||||||
{
|
|
||||||
if (version == 4)
|
|
||||||
fread((void*)&(bogus), sizeof(uint32_t), 1, fp);
|
|
||||||
DATREAD(fread((void*)&keyoffset, sizeof(uint32_t), 1, fp), uint32_t);
|
|
||||||
if (keyoffset > size-sizeof(uint32_t))
|
|
||||||
{
|
|
||||||
Clear();
|
|
||||||
fclose(fp);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
save = ftell(fp);
|
|
||||||
fseek(fp, keyoffset, SEEK_SET);
|
|
||||||
DATREAD(fread((void*)&keylen, sizeof(char), 1, fp), char);
|
|
||||||
DATREAD_S(fread(keybuf, sizeof(char), keylen, fp), keylen);
|
|
||||||
keybuf[keylen] = 0;
|
|
||||||
_tmpkey.assign(keybuf);
|
|
||||||
AddKeyEntry(_tmpkey);
|
|
||||||
fseek(fp, save, SEEK_SET); //bring back to next key
|
|
||||||
}
|
|
||||||
|
|
||||||
//we should now be at the languages table
|
|
||||||
uint32_t numentries;
|
|
||||||
uint32_t keynum;
|
|
||||||
uint32_t defoffset;
|
|
||||||
unsigned short deflen;
|
|
||||||
char valbuf[4096];
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < langCount; i++)
|
|
||||||
{
|
|
||||||
DATREAD(fread((void*)&numentries, sizeof(uint32_t), 1, fp), uint32_t);
|
|
||||||
|
|
||||||
for (unsigned int j = 0; j < numentries; j++)
|
|
||||||
{
|
|
||||||
DATREAD(fread((void *)&keynum, sizeof(uint32_t), 1, fp), uint32_t);
|
|
||||||
if (version == 4)
|
|
||||||
{
|
|
||||||
DATREAD(fread((void *)&bogus, sizeof(uint32_t), 1, fp), uint32_t);
|
|
||||||
}
|
|
||||||
DATREAD(fread((void *)&defoffset, sizeof(uint32_t), 1, fp), uint32_t);
|
|
||||||
if (defoffset > size-sizeof(uint32_t))
|
|
||||||
{
|
|
||||||
Clear();
|
|
||||||
fclose(fp);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
save = ftell(fp);
|
|
||||||
fseek(fp, defoffset, SEEK_SET);
|
|
||||||
DATREAD(fread((void *)&deflen, sizeof(unsigned short), 1, fp), short);
|
|
||||||
//:TODO: possible string overflow here.
|
|
||||||
DATREAD_S(fread(valbuf, sizeof(char), deflen, fp), deflen);
|
|
||||||
valbuf[deflen] = 0;
|
|
||||||
m_Languages[i]->AddEntry(keynum, valbuf);
|
|
||||||
fseek(fp, save, SEEK_SET); //bring back to next entry
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
delete [] LangOffsets;
|
|
||||||
|
|
||||||
//we're done!
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
CLangMngr::~CLangMngr()
|
CLangMngr::~CLangMngr()
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
|
@ -111,11 +111,6 @@ class CLangMngr
|
|||||||
|
|
||||||
// Get language name
|
// Get language name
|
||||||
const char *GetName() { return m_LanguageName; }
|
const char *GetName() { return m_LanguageName; }
|
||||||
// Save to file
|
|
||||||
bool Save(FILE *fp, int &defOffset, uint32_t &curOffset);
|
|
||||||
bool SaveDefinitions(FILE *fp, uint32_t &curOffset);
|
|
||||||
// Load
|
|
||||||
bool Load(FILE *fp);
|
|
||||||
void SetMngr(CLangMngr *l) { m_LMan = l; }
|
void SetMngr(CLangMngr *l) { m_LMan = l; }
|
||||||
// Get number of entries
|
// Get number of entries
|
||||||
int Entries();
|
int Entries();
|
||||||
@ -159,18 +154,8 @@ public:
|
|||||||
int MergeDefinitionFile(const char *file);
|
int MergeDefinitionFile(const char *file);
|
||||||
// Get a definition from a lang name and a key
|
// Get a definition from a lang name and a key
|
||||||
const char *GetDef(const char *langName, const char *key, int &status);
|
const char *GetDef(const char *langName, const char *key, int &status);
|
||||||
// Format a string
|
|
||||||
const char *Format(const char *src, ...);
|
|
||||||
// Format a string for an AMX plugin
|
// Format a string for an AMX plugin
|
||||||
char *FormatAmxString(AMX *amx, cell *params, int parm, int &len);
|
char *FormatAmxString(AMX *amx, cell *params, int parm, int &len);
|
||||||
char *FormatString(const char *fmt, va_list &ap);
|
|
||||||
// Save
|
|
||||||
bool Save(const char *filename);
|
|
||||||
// Load
|
|
||||||
bool Load(const char *filename);
|
|
||||||
// Cache
|
|
||||||
bool LoadCache(const char *filename);
|
|
||||||
bool SaveCache(const char *filename);
|
|
||||||
void InvalidateCache();
|
void InvalidateCache();
|
||||||
// Get index
|
// Get index
|
||||||
int GetKeyEntry(String &key);
|
int GetKeyEntry(String &key);
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
|
#include "libraries.h"
|
||||||
|
|
||||||
#ifndef FAR
|
#ifndef FAR
|
||||||
#define 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 *ATTACHMOD_NEW)(PFN_REQ_FNPTR /*reqFnptrFunc*/);
|
||||||
typedef int (FAR *DETACHMOD_NEW)(void);
|
typedef int (FAR *DETACHMOD_NEW)(void);
|
||||||
typedef void (FAR *PLUGINSLOADED_NEW)(void);
|
typedef void (FAR *PLUGINSLOADED_NEW)(void);
|
||||||
|
typedef void (*PLUGINSUNLOADED_NEW)(void);
|
||||||
|
typedef void (*PLUGINSUNLOADING_NEW)(void);
|
||||||
|
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
// class CModule
|
// class CModule
|
||||||
@ -79,6 +82,12 @@ void CModule::clear(bool clearFilename)
|
|||||||
m_InfoNew.reload = 0;
|
m_InfoNew.reload = 0;
|
||||||
m_MissingFunc = NULL;
|
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_Natives.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,6 +111,53 @@ bool CModule::attachMetamod(const char *mmfile, PLUG_LOADTIME now)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//this ugly function is ultimately something like O(n^4).
|
||||||
|
//sigh. it shouldn't be needed.
|
||||||
|
void CModule::rewriteNativeLists(AMX_NATIVE_INFO *list)
|
||||||
|
{
|
||||||
|
AMX_NATIVE_INFO *curlist;
|
||||||
|
for (size_t i=0; i<m_Natives.size(); i++)
|
||||||
|
{
|
||||||
|
curlist = m_Natives[i];
|
||||||
|
bool changed = false;
|
||||||
|
bool found = false;
|
||||||
|
CVector<size_t> newlist;
|
||||||
|
for (size_t j=0; curlist[j].func != NULL; j++)
|
||||||
|
{
|
||||||
|
found = false;
|
||||||
|
for (size_t k=0; list[k].func != NULL; k++)
|
||||||
|
{
|
||||||
|
if (strcmp(curlist[j].name, list[k].name) == 0)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found)
|
||||||
|
{
|
||||||
|
changed = true;
|
||||||
|
//don't break, we have to search it all
|
||||||
|
} else {
|
||||||
|
newlist.push_back(j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (changed)
|
||||||
|
{
|
||||||
|
//now build the new list
|
||||||
|
AMX_NATIVE_INFO *rlist = new AMX_NATIVE_INFO[newlist.size()+1];
|
||||||
|
for (size_t j=0; j<newlist.size(); j++)
|
||||||
|
{
|
||||||
|
rlist[j].func = curlist[newlist[j]].func;
|
||||||
|
rlist[j].name = curlist[newlist[j]].name;
|
||||||
|
}
|
||||||
|
rlist[newlist.size()].func = NULL;
|
||||||
|
rlist[newlist.size()].name = NULL;
|
||||||
|
m_Natives[i] = rlist;
|
||||||
|
m_DestroyableIndexes.push_back(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool CModule::attachModule()
|
bool CModule::attachModule()
|
||||||
{
|
{
|
||||||
// old & new
|
// old & new
|
||||||
@ -126,7 +182,7 @@ bool CModule::attachModule()
|
|||||||
{
|
{
|
||||||
case AMXX_OK:
|
case AMXX_OK:
|
||||||
m_Status = MODULE_LOADED;
|
m_Status = MODULE_LOADED;
|
||||||
return true;
|
break;
|
||||||
case AMXX_PARAM:
|
case AMXX_PARAM:
|
||||||
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
|
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
|
||||||
m_Status = MODULE_INTERROR;
|
m_Status = MODULE_INTERROR;
|
||||||
@ -144,6 +200,13 @@ bool CModule::attachModule()
|
|||||||
m_Status = MODULE_BADLOAD;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,10 +247,36 @@ bool CModule::queryModule()
|
|||||||
return false;
|
return false;
|
||||||
case AMXX_IFVERS:
|
case AMXX_IFVERS:
|
||||||
if (ifVers < AMXX_INTERFACE_VERSION)
|
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;
|
m_Status = MODULE_NEWER;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
case AMXX_OK:
|
case AMXX_OK:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -217,6 +306,8 @@ bool CModule::detachModule()
|
|||||||
if (m_Status != MODULE_LOADED)
|
if (m_Status != MODULE_LOADED)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
RemoveLibraries(this);
|
||||||
|
|
||||||
if (m_Amxx)
|
if (m_Amxx)
|
||||||
{
|
{
|
||||||
DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
|
DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
|
||||||
@ -244,6 +335,38 @@ bool CModule::detachModule()
|
|||||||
return true;
|
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()
|
void CModule::CallPluginsLoaded()
|
||||||
{
|
{
|
||||||
if (m_Status != MODULE_LOADED)
|
if (m_Status != MODULE_LOADED)
|
||||||
|
@ -59,6 +59,8 @@ struct amxx_module_info_s
|
|||||||
const char *version;
|
const char *version;
|
||||||
int reload; // reload on mapchange when nonzero
|
int reload; // reload on mapchange when nonzero
|
||||||
const char *logtag; //added in version 2
|
const char *logtag; //added in version 2
|
||||||
|
const char *library; // added in version 4
|
||||||
|
const char *libclass; // added in version 4
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AMXX_OK 0 /* no error */
|
#define AMXX_OK 0 /* no error */
|
||||||
@ -66,7 +68,7 @@ struct amxx_module_info_s
|
|||||||
#define AMXX_PARAM 2 /* Invalid parameter */
|
#define AMXX_PARAM 2 /* Invalid parameter */
|
||||||
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
|
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
|
||||||
|
|
||||||
#define AMXX_INTERFACE_VERSION 3
|
#define AMXX_INTERFACE_VERSION 4
|
||||||
|
|
||||||
class CModule
|
class CModule
|
||||||
{
|
{
|
||||||
@ -90,6 +92,7 @@ public:
|
|||||||
bool attachModule();
|
bool attachModule();
|
||||||
bool queryModule();
|
bool queryModule();
|
||||||
bool detachModule();
|
bool detachModule();
|
||||||
|
void rewriteNativeLists(AMX_NATIVE_INFO *list);
|
||||||
|
|
||||||
#ifndef FAKEMETA
|
#ifndef FAKEMETA
|
||||||
bool attachMetamod(const char *mmfile, PLUG_LOADTIME now);
|
bool attachMetamod(const char *mmfile, PLUG_LOADTIME now);
|
||||||
@ -110,8 +113,11 @@ public:
|
|||||||
inline bool IsMetamod() { return m_Metamod; }
|
inline bool IsMetamod() { return m_Metamod; }
|
||||||
|
|
||||||
void CallPluginsLoaded();
|
void CallPluginsLoaded();
|
||||||
|
void CallPluginsUnloaded();
|
||||||
|
void CallPluginsUnloading();
|
||||||
|
|
||||||
CList<AMX_NATIVE_INFO*> m_Natives;
|
CVector<AMX_NATIVE_INFO*> m_Natives;
|
||||||
|
CVector<size_t> m_DestroyableIndexes;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //CMODULE_H
|
#endif //CMODULE_H
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include "amx.h"
|
#include "amx.h"
|
||||||
#include "natives.h"
|
#include "natives.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
#include "libraries.h"
|
||||||
|
|
||||||
extern const char *no_function;
|
extern const char *no_function;
|
||||||
|
|
||||||
@ -107,6 +108,17 @@ int CPluginMngr::loadPluginsFromFile(const char* filename)
|
|||||||
|
|
||||||
line.clear();
|
line.clear();
|
||||||
line._fread(fp);
|
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);
|
sscanf(line.c_str(), "%s %s", pluginName, debug);
|
||||||
|
|
||||||
if (!isalnum(*pluginName))
|
if (!isalnum(*pluginName))
|
||||||
@ -130,6 +142,8 @@ int CPluginMngr::loadPluginsFromFile(const char* filename)
|
|||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
|
InvalidateCache();
|
||||||
|
|
||||||
return pCounter;
|
return pCounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,8 +252,8 @@ CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, int
|
|||||||
|
|
||||||
if (status == ps_running)
|
if (status == ps_running)
|
||||||
{
|
{
|
||||||
m_PauseFwd = registerSPForwardByName(&amx, "plugin_pause");
|
m_PauseFwd = registerSPForwardByName(&amx, "plugin_pause", FP_DONE);
|
||||||
m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause");
|
m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause", FP_DONE);
|
||||||
|
|
||||||
if (amx.flags & AMX_FLAG_DEBUG)
|
if (amx.flags & AMX_FLAG_DEBUG)
|
||||||
{
|
{
|
||||||
@ -383,3 +397,251 @@ void CPluginMngr::CPlugin::unpausePlugin()
|
|||||||
executeForwards(m_UnpauseFwd);
|
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)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
||||||
|
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
|
#ifndef PLUGIN_H
|
||||||
#define PLUGIN_H
|
#define PLUGIN_H
|
||||||
|
|
||||||
|
#include "CString.h"
|
||||||
|
#include "sh_list.h"
|
||||||
|
#include "amx.h"
|
||||||
|
#include "amxxfile.h"
|
||||||
|
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
// class CPluginMngr
|
// class CPluginMngr
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
@ -111,7 +116,7 @@ private:
|
|||||||
int pCounter;
|
int pCounter;
|
||||||
public:
|
public:
|
||||||
CPluginMngr() { head = 0; pCounter = 0; pNatives = NULL; m_Finalized=false;}
|
CPluginMngr() { head = 0; pCounter = 0; pNatives = NULL; m_Finalized=false;}
|
||||||
~CPluginMngr() { clear(); }
|
~CPluginMngr() { clear(); InvalidateCache(); }
|
||||||
|
|
||||||
bool m_Finalized;
|
bool m_Finalized;
|
||||||
AMX_NATIVE_INFO *pNatives;
|
AMX_NATIVE_INFO *pNatives;
|
||||||
@ -145,6 +150,21 @@ public:
|
|||||||
|
|
||||||
inline iterator begin() const { return iterator(head); }
|
inline iterator begin() const { return iterator(head); }
|
||||||
inline iterator end() const { return iterator(0); }
|
inline iterator end() const { return iterator(0); }
|
||||||
|
public:
|
||||||
|
struct plcache_entry
|
||||||
|
{
|
||||||
|
CAmxxReader *file;
|
||||||
|
size_t bufsize;
|
||||||
|
char *buffer;
|
||||||
|
String path;
|
||||||
|
};
|
||||||
|
char *ReadIntoOrFromCache(const char *file, size_t &bufsize);
|
||||||
|
void InvalidateCache();
|
||||||
|
void InvalidateFileInCache(const char *file, bool freebuf);
|
||||||
|
void CacheAndLoadModules(const char *plugin);
|
||||||
|
void CALMFromFile(const char *file);
|
||||||
|
private:
|
||||||
|
List<plcache_entry *> m_plcache;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //PLUGIN_H
|
#endif //PLUGIN_H
|
||||||
|
@ -34,16 +34,6 @@
|
|||||||
|
|
||||||
/*********************** CTask ***********************/
|
/*********************** 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)
|
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();
|
clear();
|
||||||
@ -53,6 +43,7 @@ void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags,
|
|||||||
m_iFunc = iFunc;
|
m_iFunc = iFunc;
|
||||||
m_iId = iId;
|
m_iId = iId;
|
||||||
m_fBase = fBase;
|
m_fBase = fBase;
|
||||||
|
m_bInExecute = false;
|
||||||
|
|
||||||
if (iFlags & 2)
|
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
|
//only bother calling if we have something to call
|
||||||
if (!(m_bLoop && !m_iRepeat))
|
if (!(m_bLoop && !m_iRepeat))
|
||||||
{
|
{
|
||||||
|
m_bInExecute = true;
|
||||||
if (m_iParamLen) // call with parameters
|
if (m_iParamLen) // call with parameters
|
||||||
{
|
{
|
||||||
cell arr = prepareCellArray(m_pParams, m_iParamLen);
|
cell arr = prepareCellArray(m_pParams, m_iParamLen);
|
||||||
@ -157,6 +149,7 @@ void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, f
|
|||||||
} else {
|
} else {
|
||||||
executeForwards(m_iFunc, m_iId);
|
executeForwards(m_iFunc, m_iId);
|
||||||
}
|
}
|
||||||
|
m_bInExecute = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isFree())
|
if (isFree())
|
||||||
@ -193,6 +186,7 @@ CTaskMngr::CTask::CTask()
|
|||||||
m_bLoop = false;
|
m_bLoop = false;
|
||||||
m_bAfterStart = false;
|
m_bAfterStart = false;
|
||||||
m_bBeforeEnd = false;
|
m_bBeforeEnd = false;
|
||||||
|
m_bInExecute = false;
|
||||||
|
|
||||||
m_fNextExecTime = 0.0f;
|
m_fNextExecTime = 0.0f;
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@ private:
|
|||||||
int m_iFunc;
|
int m_iFunc;
|
||||||
int m_iRepeat;
|
int m_iRepeat;
|
||||||
|
|
||||||
|
bool m_bInExecute;
|
||||||
bool m_bLoop;
|
bool m_bLoop;
|
||||||
bool m_bAfterStart;
|
bool m_bAfterStart;
|
||||||
bool m_bBeforeEnd;
|
bool m_bBeforeEnd;
|
||||||
@ -61,13 +62,15 @@ private:
|
|||||||
void clear();
|
void clear();
|
||||||
bool isFree() const;
|
bool isFree() const;
|
||||||
|
|
||||||
CPluginMngr::CPlugin *getPlugin() const;
|
inline CPluginMngr::CPlugin *getPlugin() const { return m_pPlugin; }
|
||||||
int getTaskId() const;
|
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 executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft); // also removes the task if needed
|
||||||
|
|
||||||
void changeBase(float fNewBase);
|
void changeBase(float fNewBase);
|
||||||
void resetNextExecTime(float fCurrentTime);
|
void resetNextExecTime(float fCurrentTime);
|
||||||
|
inline bool inExecute() const { return m_bInExecute; }
|
||||||
|
|
||||||
bool shouldRepeat();
|
bool shouldRepeat();
|
||||||
|
|
||||||
@ -92,9 +95,11 @@ private:
|
|||||||
friend bool operator == (const CTask &left, const CTaskDescriptor &right)
|
friend bool operator == (const CTask &left, const CTaskDescriptor &right)
|
||||||
{
|
{
|
||||||
if (right.m_bFree)
|
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.
BIN
amxmodx/JIT/helpers-x86.o
Normal file
BIN
amxmodx/JIT/helpers-x86.o
Normal file
Binary file not shown.
BIN
amxmodx/JIT/helpers-x86.obj
Normal file
BIN
amxmodx/JIT/helpers-x86.obj
Normal file
Binary file not shown.
@ -9,16 +9,19 @@ MM_ROOT = ../metamod/metamod
|
|||||||
OPT_FLAGS = -O2 -funroll-loops -s -fomit-frame-pointer -pipe
|
OPT_FLAGS = -O2 -funroll-loops -s -fomit-frame-pointer -pipe
|
||||||
DEBUG_FLAGS = -g -ggdb3
|
DEBUG_FLAGS = -g -ggdb3
|
||||||
CPP = gcc
|
CPP = gcc
|
||||||
NAME = amxmodx_mm
|
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 \
|
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 \
|
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 \
|
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 \
|
amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \
|
||||||
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
|
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
|
||||||
optimizer.cpp format.cpp
|
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp
|
||||||
|
|
||||||
LINK = -lz /lib/libstdc++.a
|
LINK = /lib/libstdc++.a
|
||||||
|
|
||||||
INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \
|
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
|
-I$(MM_ROOT) -Lzlib -I$(HLSDK)/common
|
||||||
@ -31,21 +34,26 @@ else
|
|||||||
CFLAGS = $(OPT_FLAGS)
|
CFLAGS = $(OPT_FLAGS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "$(MMGR)" "true"
|
ifeq "$(BINLOG)" "true"
|
||||||
OBJECTS += mmgr/mmgr.cpp
|
NAME := $(NAME)_bl
|
||||||
CFLAGS += -DMEMORY_TEST
|
BIN_DIR := $(BIN_DIR)BinLog
|
||||||
|
OBJECTS += binlog.cpp
|
||||||
|
CFLAGS += -DBINLOG_ENABLED
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += -DLINUX -DNDEBUG -fPIC -Wno-deprecated -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
|
CFLAGS += -DLINUX -DNDEBUG -fPIC -Wno-deprecated -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
|
||||||
|
|
||||||
ifeq "$(AMD64)" "true"
|
ifeq "$(AMD64)" "true"
|
||||||
BINARY = $(NAME)_amd64.so
|
BINARY = $(NAME)_$(BIN_SUFFIX_64)
|
||||||
CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -DAMD64 -m64
|
CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -DAMD64 -m64
|
||||||
|
LINK += -lz64
|
||||||
OBJECTS += JIT/natives-amd64.o
|
OBJECTS += JIT/natives-amd64.o
|
||||||
else
|
else
|
||||||
BINARY = $(NAME)_i386.so
|
BINARY = $(NAME)_$(BIN_SUFFIX_32)
|
||||||
OBJECTS += JIT/amxexecn.o JIT/amxjitsn.o JIT/natives-x86.o
|
OBJECTS += JIT/amxexecn.o JIT/amxjitsn.o JIT/natives-x86.o
|
||||||
|
OBJECTS += JIT/helpers-x86.o
|
||||||
CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32
|
CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32
|
||||||
|
LINK += -lz
|
||||||
OPT_FLAGS += -march=i586
|
OPT_FLAGS += -march=i586
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -62,23 +70,23 @@ amd64:
|
|||||||
rm -f zlib/libz.a
|
rm -f zlib/libz.a
|
||||||
$(MAKE) all AMD64=true
|
$(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:
|
amd64_debug:
|
||||||
rm -f zlib/libz.a
|
rm -f zlib/libz.a
|
||||||
$(MAKE) all AMD64=true DEBUG=true
|
$(MAKE) all AMD64=true DEBUG=true
|
||||||
|
|
||||||
mmgr:
|
amd64_binlog:
|
||||||
$(MAKE) all MMGR=true
|
rm -f zlib/libz.a
|
||||||
|
$(MAKE) all AMD64=true BINLOG=true
|
||||||
|
|
||||||
debug_mmgr:
|
amd64_binlog_debug:
|
||||||
$(MAKE) all MMGR=true DEBUG=true
|
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)
|
amxmodx: $(OBJ_LINUX)
|
||||||
$(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY)
|
$(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY)
|
||||||
@ -90,7 +98,14 @@ default: all
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf Release/*.o
|
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/*.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)
|
||||||
|
183
amxmodx/amx.cpp
183
amxmodx/amx.cpp
@ -462,8 +462,24 @@ int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params)
|
|||||||
|
|
||||||
amx->error=AMX_ERR_NONE;
|
amx->error=AMX_ERR_NONE;
|
||||||
|
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
binlogfuncs_t *logfuncs = (binlogfuncs_t *)amx->usertags[UT_BINLOGS];
|
||||||
|
if (logfuncs)
|
||||||
|
{
|
||||||
|
logfuncs->pfnLogNative(amx, index, (int)(params[0] / sizeof(cell)));
|
||||||
|
logfuncs->pfnLogParams(amx, params);
|
||||||
|
}
|
||||||
|
#endif //BINLOG_ENABLED
|
||||||
|
|
||||||
*result = f(amx,params);
|
*result = f(amx,params);
|
||||||
|
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
if (logfuncs)
|
||||||
|
{
|
||||||
|
logfuncs->pfnLogReturn(amx, *result);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return amx->error;
|
return amx->error;
|
||||||
}
|
}
|
||||||
#endif /* defined AMX_INIT */
|
#endif /* defined AMX_INIT */
|
||||||
@ -828,19 +844,6 @@ int AMXAPI amx_Init(AMX *amx, void *program)
|
|||||||
{
|
{
|
||||||
AMX_HEADER *hdr;
|
AMX_HEADER *hdr;
|
||||||
BROWSEHOOK hook = NULL;
|
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)
|
if ((amx->flags & AMX_FLAG_RELOC)!=0)
|
||||||
return AMX_ERR_INIT; /* already initialized (may not do so twice) */
|
return AMX_ERR_INIT; /* already initialized (may not do so twice) */
|
||||||
@ -850,22 +853,6 @@ int AMXAPI amx_Init(AMX *amx, void *program)
|
|||||||
* multi-byte words
|
* multi-byte words
|
||||||
*/
|
*/
|
||||||
assert(check_endian());
|
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)
|
if (hdr->magic!=AMX_MAGIC)
|
||||||
return AMX_ERR_FORMAT;
|
return AMX_ERR_FORMAT;
|
||||||
@ -886,13 +873,7 @@ int AMXAPI amx_Init(AMX *amx, void *program)
|
|||||||
} /* if */
|
} /* if */
|
||||||
if (hdr->stp<=0)
|
if (hdr->stp<=0)
|
||||||
return AMX_ERR_FORMAT;
|
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);
|
assert((hdr->flags & AMX_FLAG_COMPACT)!=0 || hdr->hea == hdr->size);
|
||||||
if ((hdr->flags & AMX_FLAG_COMPACT)!=0) {
|
if ((hdr->flags & AMX_FLAG_COMPACT)!=0) {
|
||||||
#if AMX_COMPACTMARGIN > 2
|
#if AMX_COMPACTMARGIN > 2
|
||||||
@ -919,108 +900,12 @@ int AMXAPI amx_Init(AMX *amx, void *program)
|
|||||||
amx->callback=amx_Callback;
|
amx->callback=amx_Callback;
|
||||||
amx->data=NULL;
|
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 */
|
/* relocate call and jump instructions */
|
||||||
hook = (BROWSEHOOK)amx->usertags[UT_BROWSEHOOK];
|
hook = (BROWSEHOOK)amx->usertags[UT_BROWSEHOOK];
|
||||||
if (hook)
|
if (hook)
|
||||||
hook(amx, NULL, NULL);
|
hook(amx, NULL, NULL);
|
||||||
amx_BrowseRelocate(amx);
|
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;
|
return AMX_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1596,6 +1481,36 @@ int AMXAPI amx_RegisterToAny(AMX *amx, AMX_NATIVE f)
|
|||||||
return err;
|
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)
|
int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *list, int number)
|
||||||
{
|
{
|
||||||
AMX_FUNCSTUB *func;
|
AMX_FUNCSTUB *func;
|
||||||
@ -1616,12 +1531,12 @@ int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *list, int number)
|
|||||||
/* this function is not yet located */
|
/* this function is not yet located */
|
||||||
funcptr=(list!=NULL) ? findfunction(GETENTRYNAME(hdr,func),list,number) : NULL;
|
funcptr=(list!=NULL) ? findfunction(GETENTRYNAME(hdr,func),list,number) : NULL;
|
||||||
if (funcptr!=NULL)
|
if (funcptr!=NULL)
|
||||||
{
|
{
|
||||||
func->address=(ucell)funcptr;
|
func->address=(ucell)funcptr;
|
||||||
} else {
|
} else {
|
||||||
no_function = GETENTRYNAME(hdr,func);
|
no_function = GETENTRYNAME(hdr,func);
|
||||||
err=AMX_ERR_NOTFOUND;
|
err=AMX_ERR_NOTFOUND;
|
||||||
}
|
}
|
||||||
} /* if */
|
} /* if */
|
||||||
func=(AMX_FUNCSTUB*)((unsigned char*)func+hdr->defsize);
|
func=(AMX_FUNCSTUB*)((unsigned char*)func+hdr->defsize);
|
||||||
} /* for */
|
} /* 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
|
#pragma warning(disable:4103) /* disable warning message 4103 that complains
|
||||||
* about pragma pack in a header file */
|
* about pragma pack in a header file */
|
||||||
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
|
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
|
||||||
|
|
||||||
|
#if _MSC_VER >= 1400
|
||||||
|
// MSVC8 - Replace POSIX stricmp with ISO C++ conformant one as it is deprecated
|
||||||
|
#define stricmp _stricmp
|
||||||
|
|
||||||
|
// Need this because of some stupid bug
|
||||||
|
#pragma warning (disable : 4996)
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Some compilers do not support the #pragma align, which should be fine. Some
|
/* Some compilers do not support the #pragma align, which should be fine. Some
|
||||||
@ -336,6 +344,7 @@ enum {
|
|||||||
#define UT_NATIVE 3
|
#define UT_NATIVE 3
|
||||||
#define UT_OPTIMIZER 2
|
#define UT_OPTIMIZER 2
|
||||||
#define UT_BROWSEHOOK 1
|
#define UT_BROWSEHOOK 1
|
||||||
|
#define UT_BINLOGS 0
|
||||||
|
|
||||||
typedef void (*BROWSEHOOK)(AMX *amx, cell *oplist, cell *cip);
|
typedef void (*BROWSEHOOK)(AMX *amx, cell *oplist, cell *cip);
|
||||||
|
|
||||||
@ -401,6 +410,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_PushString(AMX *amx, cell *amx_addr, cell **phys_addr, const char *string, int pack, int use_wchar);
|
||||||
int AMXAPI amx_RaiseError(AMX *amx, int error);
|
int AMXAPI amx_RaiseError(AMX *amx, int error);
|
||||||
int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *nativelist, int number);
|
int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *nativelist, int number);
|
||||||
|
int AMXAPI amx_Reregister(AMX *amx, const AMX_NATIVE_INFO *nativelist, int number);
|
||||||
int AMXAPI amx_RegisterToAny(AMX *amx, AMX_NATIVE f);
|
int AMXAPI amx_RegisterToAny(AMX *amx, AMX_NATIVE f);
|
||||||
int AMXAPI amx_Release(AMX *amx, cell amx_addr);
|
int AMXAPI amx_Release(AMX *amx, cell amx_addr);
|
||||||
int AMXAPI amx_SetCallback(AMX *amx, AMX_CALLBACK callback);
|
int AMXAPI amx_SetCallback(AMX *amx, AMX_CALLBACK callback);
|
||||||
@ -440,6 +450,15 @@ int AMXAPI amx_GetStringOld(char *dest,const cell *source,int use_wchar);
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
typedef struct tagBINLOG
|
||||||
|
{
|
||||||
|
void (*pfnLogNative)(AMX *amx, int native, int params);
|
||||||
|
void (*pfnLogReturn)(AMX *amx, cell retval);
|
||||||
|
void (*pfnLogParams)(AMX *amx, cell *params);
|
||||||
|
} binlogfuncs_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1473,11 +1473,23 @@ OP_FLOAT_ROUND:
|
|||||||
mov [ebp], eax
|
mov [ebp], eax
|
||||||
fldcw [ebp]
|
fldcw [ebp]
|
||||||
;calculate
|
;calculate
|
||||||
push 0
|
sub esp,4
|
||||||
fld dword [edi+ecx+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
|
frndint
|
||||||
fistp dword [esp]
|
fistp dword [esp]
|
||||||
pop eax
|
pop eax
|
||||||
|
.done:
|
||||||
pop edx
|
pop edx
|
||||||
;restore bits
|
;restore bits
|
||||||
pop ebp
|
pop ebp
|
||||||
@ -1593,6 +1605,8 @@ Start_DATA
|
|||||||
|
|
||||||
lodb_and DD 0ffh, 0ffffh, 0, 0ffffffffh
|
lodb_and DD 0ffh, 0ffffh, 0, 0ffffffffh
|
||||||
|
|
||||||
|
g_round_nearest DD 0.5
|
||||||
|
|
||||||
GLOBAL g_flags
|
GLOBAL g_flags
|
||||||
g_flags:
|
g_flags:
|
||||||
DD -1
|
DD -1
|
||||||
@ -1740,10 +1754,10 @@ _amx_opcodelist DD OP_INVALID
|
|||||||
DD OP_SYSREQ_D
|
DD OP_SYSREQ_D
|
||||||
DD OP_SYMTAG
|
DD OP_SYMTAG
|
||||||
DD OP_BREAK
|
DD OP_BREAK
|
||||||
DD OP_FLOAT_MUL
|
DD OP_FLOAT_MUL
|
||||||
DD OP_FLOAT_DIV
|
DD OP_FLOAT_DIV
|
||||||
DD OP_FLOAT_ADD
|
DD OP_FLOAT_ADD
|
||||||
DD OP_FLOAT_SUB
|
DD OP_FLOAT_SUB
|
||||||
DD OP_FLOAT_TO
|
DD OP_FLOAT_TO
|
||||||
DD OP_FLOAT_ROUND
|
DD OP_FLOAT_ROUND
|
||||||
DD OP_FLOAT_CMP
|
DD OP_FLOAT_CMP
|
||||||
|
@ -1962,11 +1962,23 @@ OP_FLOAT_ROUND:
|
|||||||
mov [ebp], eax
|
mov [ebp], eax
|
||||||
fldcw [ebp]
|
fldcw [ebp]
|
||||||
;calculate
|
;calculate
|
||||||
push 0
|
sub esp,4
|
||||||
fld dword [esi+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
|
frndint
|
||||||
fistp dword [esp]
|
fistp dword [esp]
|
||||||
pop eax
|
pop eax
|
||||||
|
.done:
|
||||||
pop edx
|
pop edx
|
||||||
;restore bits
|
;restore bits
|
||||||
pop ebp
|
pop ebp
|
||||||
@ -2423,6 +2435,10 @@ g_flagsjit:
|
|||||||
DD 0
|
DD 0
|
||||||
DD 1
|
DD 1
|
||||||
|
|
||||||
|
global g_round_nearest
|
||||||
|
g_round_nearest:
|
||||||
|
DD 0.5
|
||||||
|
|
||||||
global amx_opcodelist_jit, _amx_opcodelist_jit
|
global amx_opcodelist_jit, _amx_opcodelist_jit
|
||||||
|
|
||||||
amx_opcodelist_jit:
|
amx_opcodelist_jit:
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "natives.h"
|
#include "natives.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
#include "binlog.h"
|
||||||
|
#include "libraries.h"
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL get_xvar_id(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL get_xvar_id(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
@ -58,7 +60,7 @@ static cell AMX_NATIVE_CALL set_xvar_num(AMX *amx, cell *params)
|
|||||||
{
|
{
|
||||||
if (g_xvars.setValue(params[1], params[2]))
|
if (g_xvars.setValue(params[1], params[2]))
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Invalid xvar id");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -356,7 +358,23 @@ static cell AMX_NATIVE_CALL show_hudmessage(AMX *amx, cell *params) /* 2 param *
|
|||||||
g_langMngr.SetDefLang(params[1]);
|
g_langMngr.SetDefLang(params[1]);
|
||||||
char* message = NULL;
|
char* message = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Earlier versions would ignore invalid bounds.
|
||||||
|
* Now, bounds are only checked for internal operations.
|
||||||
|
* "channel" stores the valid channel that core uses.
|
||||||
|
* "g_hudset.channel" stores the direct channel passed to the engine.
|
||||||
|
*/
|
||||||
|
|
||||||
bool aut = (g_hudset.channel == -1) ? true : false;
|
bool aut = (g_hudset.channel == -1) ? true : false;
|
||||||
|
int channel = -1;
|
||||||
|
if (!aut)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* guarantee this to be between 0-4
|
||||||
|
* if it's not auto, we don't care
|
||||||
|
*/
|
||||||
|
channel = abs(g_hudset.channel % 5);
|
||||||
|
}
|
||||||
if (params[1] == 0)
|
if (params[1] == 0)
|
||||||
{
|
{
|
||||||
for (int i = 1; i <= gpGlobals->maxClients; ++i)
|
for (int i = 1; i <= gpGlobals->maxClients; ++i)
|
||||||
@ -369,10 +387,12 @@ static cell AMX_NATIVE_CALL show_hudmessage(AMX *amx, cell *params) /* 2 param *
|
|||||||
message = UTIL_SplitHudMessage(format_amxstring(amx, params, 2, len));
|
message = UTIL_SplitHudMessage(format_amxstring(amx, params, 2, len));
|
||||||
if (aut)
|
if (aut)
|
||||||
{
|
{
|
||||||
g_hudset.channel = pPlayer->NextHUDChannel();
|
channel = pPlayer->NextHUDChannel();
|
||||||
pPlayer->channels[g_hudset.channel] = gpGlobals->time;
|
pPlayer->channels[channel] = gpGlobals->time;
|
||||||
|
g_hudset.channel = channel;
|
||||||
}
|
}
|
||||||
pPlayer->hudmap[g_hudset.channel] = 0;
|
//don't need to set g_hudset!
|
||||||
|
pPlayer->hudmap[channel] = 0;
|
||||||
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
|
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -392,10 +412,11 @@ static cell AMX_NATIVE_CALL show_hudmessage(AMX *amx, cell *params) /* 2 param *
|
|||||||
{
|
{
|
||||||
if (aut)
|
if (aut)
|
||||||
{
|
{
|
||||||
g_hudset.channel = pPlayer->NextHUDChannel();
|
channel = pPlayer->NextHUDChannel();
|
||||||
pPlayer->channels[g_hudset.channel] = gpGlobals->time;
|
pPlayer->channels[channel] = gpGlobals->time;
|
||||||
|
g_hudset.channel = channel;
|
||||||
}
|
}
|
||||||
pPlayer->hudmap[g_hudset.channel] = 0;
|
pPlayer->hudmap[channel] = 0;
|
||||||
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
|
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -533,6 +554,11 @@ static cell AMX_NATIVE_CALL is_user_alive(AMX *amx, cell *params) /* 1 param */
|
|||||||
return ((pPlayer->ingame && pPlayer->IsAlive()) ? 1 : 0);
|
return ((pPlayer->ingame && pPlayer->IsAlive()) ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL get_amxx_verstring(AMX *amx, cell *params) /* 2 params */
|
||||||
|
{
|
||||||
|
return set_amxstring(amx, params[1], AMX_VERSION, params[2]);
|
||||||
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL get_user_frags(AMX *amx, cell *params) /* 1 param */
|
static cell AMX_NATIVE_CALL get_user_frags(AMX *amx, cell *params) /* 1 param */
|
||||||
{
|
{
|
||||||
int index = params[1];
|
int index = params[1];
|
||||||
@ -627,6 +653,20 @@ static cell AMX_NATIVE_CALL get_weaponname(AMX *amx, cell *params) /* 3 param */
|
|||||||
return set_amxstring(amx, params[2], g_weaponsData[index].fullName.c_str(), params[3]);
|
return set_amxstring(amx, params[2], g_weaponsData[index].fullName.c_str(), params[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL get_weaponid(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
int ilen;
|
||||||
|
const char *name = get_amxstring(amx, params[1], 0, ilen);
|
||||||
|
|
||||||
|
for (int i = 1; i < MAX_WEAPONS; i++)
|
||||||
|
{
|
||||||
|
if (!strcmp(g_weaponsData[i].fullName.c_str(), name))
|
||||||
|
return g_weaponsData[i].iId;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL get_user_weapons(AMX *amx, cell *params) /* 3 param */
|
static cell AMX_NATIVE_CALL get_user_weapons(AMX *amx, cell *params) /* 3 param */
|
||||||
{
|
{
|
||||||
int index = params[1];
|
int index = params[1];
|
||||||
@ -1019,11 +1059,19 @@ static cell AMX_NATIVE_CALL register_plugin(AMX *amx, cell *params) /* 3 param *
|
|||||||
CPluginMngr::CPlugin* a = g_plugins.findPluginFast(amx);
|
CPluginMngr::CPlugin* a = g_plugins.findPluginFast(amx);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
a->setTitle(get_amxstring(amx, params[1], 0, i));
|
char *title = get_amxstring(amx, params[1], 0, i);
|
||||||
a->setVersion(get_amxstring(amx, params[2], 0, i));
|
char *vers = get_amxstring(amx, params[2], 1, i);
|
||||||
a->setAuthor(get_amxstring(amx, params[3], 0, i));
|
char *author = get_amxstring(amx, params[3], 2, i);
|
||||||
|
|
||||||
return 1;
|
#if defined BINLOG_ENABLED
|
||||||
|
g_BinLog.WriteOp(BinLog_Registered, a->getId(), title, vers);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
a->setTitle(title);
|
||||||
|
a->setVersion(vers);
|
||||||
|
a->setAuthor(author);
|
||||||
|
|
||||||
|
return a->getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL register_menucmd(AMX *amx, cell *params) /* 3 param */
|
static cell AMX_NATIVE_CALL register_menucmd(AMX *amx, cell *params) /* 3 param */
|
||||||
@ -1095,7 +1143,7 @@ static cell AMX_NATIVE_CALL amx_md5_file(AMX *amx, cell *params)
|
|||||||
|
|
||||||
if (!fp)
|
if (!fp)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Cant open file \"%s\"", file);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1302,8 +1350,7 @@ static cell AMX_NATIVE_CALL register_event(AMX *amx, cell *params) /* 2 param */
|
|||||||
|
|
||||||
if ((pos = g_events.getEventId(sTemp)) == 0)
|
if ((pos = g_events.getEventId(sTemp)) == 0)
|
||||||
{
|
{
|
||||||
AMXXLOG_Log("[AMXX] Invalid event (name \"%s\") (plugin \"%s\")", sTemp, plugin->getName());
|
LogError(amx, AMX_ERR_NATIVE, "Invalid event (name \"%s\") (plugin \"%s\")", sTemp, plugin->getName());
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1509,7 +1556,9 @@ static cell AMX_NATIVE_CALL get_pcvar_float(AMX *amx, cell *params)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return amx_ftoc(ptr->value);
|
REAL val = (REAL)ptr->value;
|
||||||
|
|
||||||
|
return amx_ftoc(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params) /* 1 param */
|
static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params) /* 1 param */
|
||||||
@ -1593,116 +1642,6 @@ static cell AMX_NATIVE_CALL set_cvar_string(AMX *amx, cell *params) /* 2 param *
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)))
|
|
||||||
{
|
|
||||||
AMXXLOG_Log("[AMXX] Plugin called message_begin with an invalid message id (%d).", params[2]);
|
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
|
||||||
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 log_message(AMX *amx, cell *params) /* 1 param */
|
static cell AMX_NATIVE_CALL log_message(AMX *amx, cell *params) /* 1 param */
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
@ -1797,12 +1736,6 @@ static cell AMX_NATIVE_CALL get_time(AMX *amx, cell *params) /* 3 param */
|
|||||||
time_t td = time(NULL);
|
time_t td = time(NULL);
|
||||||
tm* lt = localtime(&td);
|
tm* lt = localtime(&td);
|
||||||
|
|
||||||
if (lt == 0)
|
|
||||||
{
|
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
char szDate[512];
|
char szDate[512];
|
||||||
strftime(szDate, 511, sptemp, lt);
|
strftime(szDate, 511, sptemp, lt);
|
||||||
|
|
||||||
@ -1819,7 +1752,7 @@ static cell AMX_NATIVE_CALL format_time(AMX *amx, cell *params) /* 3 param */
|
|||||||
|
|
||||||
if (lt == 0)
|
if (lt == 0)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Couldn't get localtime");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1845,7 +1778,7 @@ static cell AMX_NATIVE_CALL parse_time(AMX *amx, cell *params) /* 3 param */
|
|||||||
|
|
||||||
if (mytime == 0)
|
if (mytime == 0)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Couldn't get localtime");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1856,7 +1789,7 @@ static cell AMX_NATIVE_CALL parse_time(AMX *amx, cell *params) /* 3 param */
|
|||||||
|
|
||||||
if (mytime == 0)
|
if (mytime == 0)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Couldn't get localtime");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1894,7 +1827,7 @@ static cell AMX_NATIVE_CALL read_data(AMX *amx, cell *params) /* 3 param */
|
|||||||
return set_amxstring(amx, params[2], g_events.getArgString(params[1]), *get_amxaddr(amx, params[3]));
|
return set_amxstring(amx, params[2], g_events.getArgString(params[1]), *get_amxaddr(amx, params[3]));
|
||||||
default:
|
default:
|
||||||
cell *fCell = get_amxaddr(amx, params[2]);
|
cell *fCell = get_amxaddr(amx, params[2]);
|
||||||
float fparam = g_events.getArgFloat(params[1]);
|
REAL fparam = (REAL)g_events.getArgFloat(params[1]);
|
||||||
fCell[0] = amx_ftoc(fparam);
|
fCell[0] = amx_ftoc(fparam);
|
||||||
return (int)fparam;
|
return (int)fparam;
|
||||||
}
|
}
|
||||||
@ -1954,6 +1887,8 @@ static cell AMX_NATIVE_CALL get_players(AMX *amx, cell *params) /* 4 param */
|
|||||||
continue;
|
continue;
|
||||||
if ((flags & 16) && (pPlayer->teamId != team))
|
if ((flags & 16) && (pPlayer->teamId != team))
|
||||||
continue;
|
continue;
|
||||||
|
if ((flags & 128) && (pPlayer->pEdict->v.flags & FL_PROXY))
|
||||||
|
continue;
|
||||||
if (flags & 32)
|
if (flags & 32)
|
||||||
{
|
{
|
||||||
if (flags & 64)
|
if (flags & 64)
|
||||||
@ -2068,7 +2003,7 @@ static cell AMX_NATIVE_CALL get_maxplayers(AMX *amx, cell *params)
|
|||||||
|
|
||||||
static cell AMX_NATIVE_CALL get_gametime(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL get_gametime(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
REAL pFloat = gpGlobals->time;
|
REAL pFloat = (REAL)gpGlobals->time;
|
||||||
return amx_ftoc(pFloat);
|
return amx_ftoc(pFloat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2206,9 +2141,7 @@ static cell AMX_NATIVE_CALL set_task(AMX *amx, cell *params) /* 2 param */
|
|||||||
|
|
||||||
if (iFunc == -1)
|
if (iFunc == -1)
|
||||||
{
|
{
|
||||||
AMXXLOG_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")", stemp, plugin->getName());
|
LogError(amx, AMX_ERR_NATIVE, "Function is not present (function \"%s\") (plugin \"%s\")", stemp, plugin->getName());
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2374,7 +2307,7 @@ static cell AMX_NATIVE_CALL pause(AMX *amx, cell *params) /* 3 param */
|
|||||||
|
|
||||||
if (flags & 2) // pause function
|
if (flags & 2) // pause function
|
||||||
{
|
{
|
||||||
AMXXLOG_Log("[AMXX] This usage of the native pause() has been deprecated!");
|
LogError(amx, AMX_ERR_NATIVE, "This usage of the native pause() has been deprecated!");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if (flags & 4)
|
else if (flags & 4)
|
||||||
@ -2410,7 +2343,7 @@ static cell AMX_NATIVE_CALL unpause(AMX *amx, cell *params) /* 3 param */
|
|||||||
|
|
||||||
if (flags & 2)
|
if (flags & 2)
|
||||||
{
|
{
|
||||||
AMXXLOG_Log("[AMXX] This usage of the native pause() has been deprecated!");
|
LogError(amx, AMX_ERR_NATIVE, "This usage of the native pause() has been deprecated!");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if (flags & 4)
|
else if (flags & 4)
|
||||||
@ -2565,12 +2498,12 @@ static cell AMX_NATIVE_CALL precache_sound(AMX *amx, cell *params) /* 1 param */
|
|||||||
{
|
{
|
||||||
if (g_dontprecache)
|
if (g_dontprecache)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Precaching not allowed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ilen;
|
int len;
|
||||||
char* sptemp = get_amxstring(amx, params[1], 0, ilen);
|
char* sptemp = get_amxstring(amx, params[1], 0, len);
|
||||||
|
|
||||||
PRECACHE_SOUND((char*)STRING(ALLOC_STRING(sptemp)));
|
PRECACHE_SOUND((char*)STRING(ALLOC_STRING(sptemp)));
|
||||||
|
|
||||||
@ -2581,40 +2514,28 @@ static cell AMX_NATIVE_CALL precache_model(AMX *amx, cell *params) /* 1 param */
|
|||||||
{
|
{
|
||||||
if (g_dontprecache)
|
if (g_dontprecache)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Precaching not allowed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ilen;
|
int len;
|
||||||
char* sptemp = get_amxstring(amx, params[1], 0, ilen);
|
char* sptemp = get_amxstring(amx, params[1], 0, len);
|
||||||
|
|
||||||
return PRECACHE_MODEL((char*)STRING(ALLOC_STRING(sptemp)));
|
return PRECACHE_MODEL((char*)STRING(ALLOC_STRING(sptemp)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL get_distance(AMX *amx, cell *params) /* 2 param */
|
static cell AMX_NATIVE_CALL precache_generic(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
cell *cpVec1 = get_amxaddr(amx, params[1]);
|
if (g_dontprecache)
|
||||||
cell *cpVec2 = get_amxaddr(amx, params[2]);
|
{
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "Precaching not allowed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
Vector vec1 = Vector((float)cpVec1[0], (float)cpVec1[1], (float)cpVec1[2]);
|
int len;
|
||||||
Vector vec2 = Vector((float)cpVec2[0], (float)cpVec2[1], (float)cpVec2[2]);
|
char* sptemp = get_amxstring(amx, params[1], 0, len);
|
||||||
|
|
||||||
int iDist = (int)((vec1 - vec2).Length());
|
return PRECACHE_GENERIC((char*)STRING(ALLOC_STRING(sptemp)));
|
||||||
|
|
||||||
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 random_float(AMX *amx, cell *params) /* 2 param */
|
static cell AMX_NATIVE_CALL random_float(AMX *amx, cell *params) /* 2 param */
|
||||||
@ -2833,7 +2754,7 @@ static cell AMX_NATIVE_CALL parse_loguser(AMX *amx, cell *params)
|
|||||||
|
|
||||||
if (len < 6) // no user to parse!?
|
if (len < 6) // no user to parse!?
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "No user name specified");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2857,7 +2778,7 @@ static cell AMX_NATIVE_CALL parse_loguser(AMX *amx, cell *params)
|
|||||||
/******** GET AUTHID **********/
|
/******** GET AUTHID **********/
|
||||||
if (len <= 0)
|
if (len <= 0)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "No Authid found");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2880,7 +2801,7 @@ static cell AMX_NATIVE_CALL parse_loguser(AMX *amx, cell *params)
|
|||||||
/******** GET USERID **********/
|
/******** GET USERID **********/
|
||||||
if (len <= 0)
|
if (len <= 0)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "No Userid found");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3188,6 +3109,7 @@ static cell AMX_NATIVE_CALL callfunc_begin(AMX *amx, cell *params)
|
|||||||
// set globals
|
// set globals
|
||||||
g_CallFunc_Plugin = plugin;
|
g_CallFunc_Plugin = plugin;
|
||||||
g_CallFunc_Func = func;
|
g_CallFunc_Func = func;
|
||||||
|
g_CallFunc_CurParam = 0;
|
||||||
|
|
||||||
return 1; // success: 1
|
return 1; // success: 1
|
||||||
}
|
}
|
||||||
@ -3205,6 +3127,13 @@ static cell AMX_NATIVE_CALL callfunc_begin_i(AMX *amx, cell *params)
|
|||||||
if (!plugin)
|
if (!plugin)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (g_CallFunc_Plugin)
|
||||||
|
{
|
||||||
|
// scripter's fault
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "callfunc_begin called without callfunc_end");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (params[1] < 0)
|
if (params[1] < 0)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Public function %d is invalid", params[1]);
|
LogError(amx, AMX_ERR_NATIVE, "Public function %d is invalid", params[1]);
|
||||||
@ -3216,6 +3145,7 @@ static cell AMX_NATIVE_CALL callfunc_begin_i(AMX *amx, cell *params)
|
|||||||
|
|
||||||
g_CallFunc_Plugin = plugin;
|
g_CallFunc_Plugin = plugin;
|
||||||
g_CallFunc_Func = params[1];
|
g_CallFunc_Func = params[1];
|
||||||
|
g_CallFunc_CurParam = 0;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -3344,8 +3274,7 @@ static cell AMX_NATIVE_CALL callfunc_push_byval(AMX *amx, cell *params)
|
|||||||
|
|
||||||
if (g_CallFunc_CurParam == CALLFUNC_MAXPARAMS)
|
if (g_CallFunc_CurParam == CALLFUNC_MAXPARAMS)
|
||||||
{
|
{
|
||||||
AMXXLOG_Log("[AMXX] callfunc_push_xxx: maximal parameters num: %d", CALLFUNC_MAXPARAMS);
|
LogError(amx, AMX_ERR_NATIVE, "Callfunc_push_xxx: maximal parameters num: %d", CALLFUNC_MAXPARAMS);
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3686,6 +3615,10 @@ static cell AMX_NATIVE_CALL amx_abort(AMX *amx, cell *params)
|
|||||||
if (pPlugin)
|
if (pPlugin)
|
||||||
filename = pPlugin->getName();
|
filename = pPlugin->getName();
|
||||||
|
|
||||||
|
//we were in a callfunc?
|
||||||
|
if (g_CallFunc_Plugin == pPlugin)
|
||||||
|
g_CallFunc_Plugin = NULL;
|
||||||
|
|
||||||
if (fmt)
|
if (fmt)
|
||||||
LogError(amx, err, "[%s] %s", filename, fmt);
|
LogError(amx, err, "[%s] %s", filename, fmt);
|
||||||
else
|
else
|
||||||
@ -3699,43 +3632,18 @@ static cell AMX_NATIVE_CALL module_exists(AMX *amx, cell *params)
|
|||||||
int len;
|
int len;
|
||||||
char *module = get_amxstring(amx, params[1], 0, len);
|
char *module = get_amxstring(amx, params[1], 0, len);
|
||||||
|
|
||||||
CList<CModule, const char *>::iterator a;
|
if (!FindLibrary(module, LibType_Library))
|
||||||
|
return FindLibrary(module, LibType_Class);
|
||||||
|
|
||||||
bool isdbi = false, found = false;
|
return true;
|
||||||
const amxx_module_info_s *info;
|
}
|
||||||
|
|
||||||
if (stricmp(module, "dbi") == 0)
|
static cell AMX_NATIVE_CALL LibraryExists(AMX *amx, cell *params)
|
||||||
isdbi = true;
|
{
|
||||||
|
int len;
|
||||||
|
char *library = get_amxstring(amx, params[1], 0, len);
|
||||||
|
|
||||||
for (a = g_modules.begin(); a; ++a)
|
return FindLibrary(library, static_cast<LibType>(params[2]));
|
||||||
{
|
|
||||||
if ((*a).getStatusValue() == MODULE_LOADED)
|
|
||||||
{
|
|
||||||
info = (*a).getInfoNew();
|
|
||||||
if (info)
|
|
||||||
{
|
|
||||||
if (isdbi)
|
|
||||||
{
|
|
||||||
if (info->logtag && (StrCaseStr(info->logtag, "sql") || StrCaseStr(info->logtag, "dbi")))
|
|
||||||
{
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (info->logtag && (stricmp(info->logtag, module) == 0))
|
|
||||||
{
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found)
|
|
||||||
found = LibraryExists(module);
|
|
||||||
|
|
||||||
return (found ? 1 : 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL set_fail_state(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL set_fail_state(AMX *amx, cell *params)
|
||||||
@ -3817,7 +3725,7 @@ static cell AMX_NATIVE_CALL CreateOneForward(AMX *amx, cell *params)
|
|||||||
for (cell i=3; i<=count; i++)
|
for (cell i=3; i<=count; i++)
|
||||||
ps[i-3] = *get_amxaddr(amx, params[i]);
|
ps[i-3] = *get_amxaddr(amx, params[i]);
|
||||||
|
|
||||||
return registerSPForwardByNameC(amx, funcname, ps, count-2);
|
return registerSPForwardByNameC(p->getAMX(), funcname, ps, count-2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL PrepareArray(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL PrepareArray(AMX *amx, cell *params)
|
||||||
@ -3834,7 +3742,7 @@ static cell AMX_NATIVE_CALL ExecuteForward(AMX *amx, cell *params)
|
|||||||
int id = static_cast<int>(params[1]);
|
int id = static_cast<int>(params[1]);
|
||||||
int str_id = 0;
|
int str_id = 0;
|
||||||
int len;
|
int len;
|
||||||
cell *addr = get_amxaddr(amx, params[1]);
|
cell *addr = get_amxaddr(amx, params[2]);
|
||||||
|
|
||||||
if (!g_forwards.isIdValid(id))
|
if (!g_forwards.isIdValid(id))
|
||||||
return 0;
|
return 0;
|
||||||
@ -3891,8 +3799,7 @@ static cell AMX_NATIVE_CALL CreateHudSyncObj(AMX *amx, cell *params)
|
|||||||
return static_cast<cell>(g_hudsync.size());
|
return static_cast<cell>(g_hudsync.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
hudtextparms_t temp_hud_stuff;
|
void CheckAndClearPlayerHUD(CPlayer *player, int &channel, unsigned int sync_obj)
|
||||||
void CheckAndClearPlayerHUD(CPlayer *player, unsigned int channel, unsigned int sync_obj)
|
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* player and channel should be guaranteed to be good to go.
|
* player and channel should be guaranteed to be good to go.
|
||||||
@ -3904,27 +3811,8 @@ void CheckAndClearPlayerHUD(CPlayer *player, unsigned int channel, unsigned int
|
|||||||
//check if the last sync on this channel was this sync obj
|
//check if the last sync on this channel was this sync obj
|
||||||
if (player->hudmap[last_channel] == sync_obj + 1)
|
if (player->hudmap[last_channel] == sync_obj + 1)
|
||||||
{
|
{
|
||||||
//if so, we can safely CLEAR it.
|
//if so, we can safely REUSE it
|
||||||
temp_hud_stuff.a1 = 0;
|
channel = (int)last_channel;
|
||||||
temp_hud_stuff.a2 = 0;
|
|
||||||
temp_hud_stuff.r2 = 255;
|
|
||||||
temp_hud_stuff.g2 = 255;
|
|
||||||
temp_hud_stuff.b2 = 250;
|
|
||||||
temp_hud_stuff.r1 = 0;
|
|
||||||
temp_hud_stuff.g1 = 0;
|
|
||||||
temp_hud_stuff.b1 = 0;
|
|
||||||
temp_hud_stuff.x = 0.0f;
|
|
||||||
temp_hud_stuff.y = 0.0f;
|
|
||||||
temp_hud_stuff.effect = 0;
|
|
||||||
temp_hud_stuff.fxTime = 0.0f;
|
|
||||||
temp_hud_stuff.holdTime = 0.01;
|
|
||||||
temp_hud_stuff.fadeinTime = 0.0f;
|
|
||||||
temp_hud_stuff.fadeoutTime = 0.0f;
|
|
||||||
temp_hud_stuff.channel = last_channel;
|
|
||||||
static char msg[255];
|
|
||||||
msg[0] = '\0';
|
|
||||||
char *msg_ptr = UTIL_SplitHudMessage(msg);
|
|
||||||
UTIL_HudMessage(player->pEdict, temp_hud_stuff, msg_ptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//set the new states
|
//set the new states
|
||||||
@ -3934,6 +3822,7 @@ void CheckAndClearPlayerHUD(CPlayer *player, unsigned int channel, unsigned int
|
|||||||
|
|
||||||
static cell AMX_NATIVE_CALL ClearSyncHud(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL ClearSyncHud(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
|
int len = 0;
|
||||||
int index = params[1];
|
int index = params[1];
|
||||||
unsigned int sync_obj = static_cast<unsigned int>(params[2]) - 1;
|
unsigned int sync_obj = static_cast<unsigned int>(params[2]) - 1;
|
||||||
|
|
||||||
@ -3943,19 +3832,24 @@ static cell AMX_NATIVE_CALL ClearSyncHud(AMX *amx, cell *params)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cell *plist = g_hudsync[sync_obj];
|
g_langMngr.SetDefLang(params[1]);
|
||||||
|
|
||||||
if (index == 0)
|
if (index == 0)
|
||||||
{
|
{
|
||||||
CPlayer *pPlayer;
|
for (int i = 1; i <= gpGlobals->maxClients; ++i)
|
||||||
for (int i = 1; i <= gpGlobals->maxClients; i++)
|
|
||||||
{
|
{
|
||||||
pPlayer = GET_PLAYER_POINTER_I(i);
|
CPlayer *pPlayer = GET_PLAYER_POINTER_I(i);
|
||||||
|
|
||||||
if (!pPlayer->ingame)
|
int channel;
|
||||||
continue;
|
if (pPlayer->ingame)
|
||||||
|
{
|
||||||
CheckAndClearPlayerHUD(pPlayer, plist[pPlayer->index], sync_obj);
|
g_langMngr.SetDefLang(i);
|
||||||
|
channel = pPlayer->NextHUDChannel();
|
||||||
|
CheckAndClearPlayerHUD(pPlayer, channel, sync_obj);
|
||||||
|
pPlayer->channels[channel] = gpGlobals->time;
|
||||||
|
g_hudset.channel = channel;
|
||||||
|
UTIL_HudMessage(pPlayer->pEdict, g_hudset, "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (index < 1 || index > gpGlobals->maxClients)
|
if (index < 1 || index > gpGlobals->maxClients)
|
||||||
@ -3968,11 +3862,15 @@ static cell AMX_NATIVE_CALL ClearSyncHud(AMX *amx, cell *params)
|
|||||||
|
|
||||||
if (pPlayer->ingame)
|
if (pPlayer->ingame)
|
||||||
{
|
{
|
||||||
CheckAndClearPlayerHUD(pPlayer, plist[pPlayer->index], sync_obj);
|
int channel = pPlayer->NextHUDChannel();
|
||||||
|
CheckAndClearPlayerHUD(pPlayer, channel, sync_obj);
|
||||||
|
pPlayer->channels[channel] = gpGlobals->time;
|
||||||
|
g_hudset.channel = channel;
|
||||||
|
UTIL_HudMessage(pPlayer->pEdict, g_hudset, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
//params[1] - target
|
//params[1] - target
|
||||||
@ -3999,12 +3897,14 @@ static cell AMX_NATIVE_CALL ShowSyncHudMsg(AMX *amx, cell *params)
|
|||||||
{
|
{
|
||||||
CPlayer *pPlayer = GET_PLAYER_POINTER_I(i);
|
CPlayer *pPlayer = GET_PLAYER_POINTER_I(i);
|
||||||
|
|
||||||
|
int channel;
|
||||||
if (pPlayer->ingame)
|
if (pPlayer->ingame)
|
||||||
{
|
{
|
||||||
g_langMngr.SetDefLang(i);
|
g_langMngr.SetDefLang(i);
|
||||||
g_hudset.channel = pPlayer->NextHUDChannel();
|
channel = pPlayer->NextHUDChannel();
|
||||||
pPlayer->channels[g_hudset.channel] = gpGlobals->time;
|
CheckAndClearPlayerHUD(pPlayer, channel, sync_obj);
|
||||||
CheckAndClearPlayerHUD(pPlayer, g_hudset.channel, sync_obj);
|
pPlayer->channels[channel] = gpGlobals->time;
|
||||||
|
g_hudset.channel = channel;
|
||||||
message = UTIL_SplitHudMessage(format_amxstring(amx, params, 3, len));
|
message = UTIL_SplitHudMessage(format_amxstring(amx, params, 3, len));
|
||||||
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
|
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
|
||||||
}
|
}
|
||||||
@ -4020,9 +3920,10 @@ static cell AMX_NATIVE_CALL ShowSyncHudMsg(AMX *amx, cell *params)
|
|||||||
|
|
||||||
if (pPlayer->ingame)
|
if (pPlayer->ingame)
|
||||||
{
|
{
|
||||||
g_hudset.channel = pPlayer->NextHUDChannel();
|
int channel = pPlayer->NextHUDChannel();
|
||||||
pPlayer->channels[g_hudset.channel] = gpGlobals->time;
|
CheckAndClearPlayerHUD(pPlayer, channel, sync_obj);
|
||||||
CheckAndClearPlayerHUD(pPlayer, g_hudset.channel, sync_obj);
|
pPlayer->channels[channel] = gpGlobals->time;
|
||||||
|
g_hudset.channel = channel;
|
||||||
message = UTIL_SplitHudMessage(format_amxstring(amx, params, 3, len));
|
message = UTIL_SplitHudMessage(format_amxstring(amx, params, 3, len));
|
||||||
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
|
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
|
||||||
}
|
}
|
||||||
@ -4031,9 +3932,43 @@ static cell AMX_NATIVE_CALL ShowSyncHudMsg(AMX *amx, cell *params)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL is_user_hacking(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
return g_bmod_cstrike ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL arrayset(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
memset(get_amxaddr(amx, params[1]), params[2], params[3] * sizeof(cell));
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL amxx_setpl_curweap(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
if (params[1] < 1 || params[1] > gpGlobals->maxClients)
|
||||||
|
{
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "Invalid client %d", params[1]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CPlayer *p = GET_PLAYER_POINTER_I(params[1]);
|
||||||
|
|
||||||
|
if (!p->ingame)
|
||||||
|
{
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "Player %d not ingame", params[1]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p->current = params[2];
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
AMX_NATIVE_INFO amxmodx_Natives[] =
|
AMX_NATIVE_INFO amxmodx_Natives[] =
|
||||||
{
|
{
|
||||||
{"abort", amx_abort},
|
{"abort", amx_abort},
|
||||||
|
{"arrayset", arrayset},
|
||||||
{"get_addr_val", get_addr_val},
|
{"get_addr_val", get_addr_val},
|
||||||
{"get_var_addr", get_var_addr},
|
{"get_var_addr", get_var_addr},
|
||||||
{"set_addr_val", set_addr_val},
|
{"set_addr_val", set_addr_val},
|
||||||
@ -4067,8 +4002,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
|||||||
{"get_cvar_num", get_cvar_num},
|
{"get_cvar_num", get_cvar_num},
|
||||||
{"get_cvar_pointer", get_cvar_pointer},
|
{"get_cvar_pointer", get_cvar_pointer},
|
||||||
{"get_cvar_string", get_cvar_string},
|
{"get_cvar_string", get_cvar_string},
|
||||||
{"get_distance", get_distance},
|
|
||||||
{"get_distance_f", get_distance_f},
|
|
||||||
{"get_flags", get_flags},
|
{"get_flags", get_flags},
|
||||||
{"get_func_id", get_func_id},
|
{"get_func_id", get_func_id},
|
||||||
{"get_gametime", get_gametime},
|
{"get_gametime", get_gametime},
|
||||||
@ -4093,6 +4026,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
|||||||
{"get_systime", get_systime},
|
{"get_systime", get_systime},
|
||||||
{"get_time", get_time},
|
{"get_time", get_time},
|
||||||
{"get_timeleft", get_timeleft},
|
{"get_timeleft", get_timeleft},
|
||||||
|
{"get_amxx_verstring", get_amxx_verstring},
|
||||||
{"get_user_aiming", get_user_aiming},
|
{"get_user_aiming", get_user_aiming},
|
||||||
{"get_user_ammo", get_user_ammo},
|
{"get_user_ammo", get_user_ammo},
|
||||||
{"get_user_armor", get_user_armor},
|
{"get_user_armor", get_user_armor},
|
||||||
@ -4117,6 +4051,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
|||||||
{"hcsardhnexsnu", register_byval},
|
{"hcsardhnexsnu", register_byval},
|
||||||
{"get_user_weapon", get_user_weapon},
|
{"get_user_weapon", get_user_weapon},
|
||||||
{"get_user_weapons", get_user_weapons},
|
{"get_user_weapons", get_user_weapons},
|
||||||
|
{"get_weaponid", get_weaponid},
|
||||||
{"get_weaponname", get_weaponname},
|
{"get_weaponname", get_weaponname},
|
||||||
{"get_xvar_float", get_xvar_num},
|
{"get_xvar_float", get_xvar_num},
|
||||||
{"get_xvar_id", get_xvar_id},
|
{"get_xvar_id", get_xvar_id},
|
||||||
@ -4134,6 +4069,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
|||||||
{"is_user_bot", is_user_bot},
|
{"is_user_bot", is_user_bot},
|
||||||
{"is_user_connected", is_user_connected},
|
{"is_user_connected", is_user_connected},
|
||||||
{"is_user_connecting", is_user_connecting},
|
{"is_user_connecting", is_user_connecting},
|
||||||
|
{"is_user_hacking", is_user_hacking},
|
||||||
{"is_user_hltv", is_user_hltv},
|
{"is_user_hltv", is_user_hltv},
|
||||||
{"lang_exists", lang_exists},
|
{"lang_exists", lang_exists},
|
||||||
{"log_amx", log_amx},
|
{"log_amx", log_amx},
|
||||||
@ -4141,8 +4077,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
|||||||
{"log_to_file", log_to_file},
|
{"log_to_file", log_to_file},
|
||||||
{"md5", amx_md5},
|
{"md5", amx_md5},
|
||||||
{"md5_file", amx_md5_file},
|
{"md5_file", amx_md5_file},
|
||||||
{"message_begin", message_begin},
|
|
||||||
{"message_end", message_end},
|
|
||||||
{"module_exists", module_exists},
|
{"module_exists", module_exists},
|
||||||
{"mkdir", amx_mkdir},
|
{"mkdir", amx_mkdir},
|
||||||
{"next_hudchannel", next_hudchannel},
|
{"next_hudchannel", next_hudchannel},
|
||||||
@ -4153,6 +4087,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
|||||||
{"plugin_flags", plugin_flags},
|
{"plugin_flags", plugin_flags},
|
||||||
{"precache_model", precache_model},
|
{"precache_model", precache_model},
|
||||||
{"precache_sound", precache_sound},
|
{"precache_sound", precache_sound},
|
||||||
|
{"precache_generic", precache_generic},
|
||||||
{"query_client_cvar", query_client_cvar},
|
{"query_client_cvar", query_client_cvar},
|
||||||
{"random_float", random_float},
|
{"random_float", random_float},
|
||||||
{"random_num", random_num},
|
{"random_num", random_num},
|
||||||
@ -4206,14 +4141,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
|||||||
{"user_has_weapon", user_has_weapon},
|
{"user_has_weapon", user_has_weapon},
|
||||||
{"user_kill", user_kill},
|
{"user_kill", user_kill},
|
||||||
{"user_slap", user_slap},
|
{"user_slap", user_slap},
|
||||||
{"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},
|
|
||||||
{"xvar_exists", xvar_exists},
|
{"xvar_exists", xvar_exists},
|
||||||
{"ClearSyncHud", ClearSyncHud},
|
{"ClearSyncHud", ClearSyncHud},
|
||||||
{"CreateHudSyncObj", CreateHudSyncObj},
|
{"CreateHudSyncObj", CreateHudSyncObj},
|
||||||
@ -4223,5 +4150,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
|||||||
{"ExecuteForward", ExecuteForward},
|
{"ExecuteForward", ExecuteForward},
|
||||||
{"PrepareArray", PrepareArray},
|
{"PrepareArray", PrepareArray},
|
||||||
{"ShowSyncHudMsg", ShowSyncHudMsg},
|
{"ShowSyncHudMsg", ShowSyncHudMsg},
|
||||||
|
{"LibraryExists", LibraryExists},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
@ -42,8 +42,13 @@
|
|||||||
#include <extdll.h>
|
#include <extdll.h>
|
||||||
#include <meta_api.h>
|
#include <meta_api.h>
|
||||||
|
|
||||||
#ifdef MEMORY_TEST
|
#ifdef _MSC_VER
|
||||||
#include "mmgr/mmgr.h"
|
// 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
|
#endif
|
||||||
|
|
||||||
#include "md5.h"
|
#include "md5.h"
|
||||||
@ -67,7 +72,8 @@
|
|||||||
#include "amxxlog.h"
|
#include "amxxlog.h"
|
||||||
|
|
||||||
#define AMXXLOG_Log g_log.Log
|
#define AMXXLOG_Log g_log.Log
|
||||||
#define AMX_VERSION "1.70"
|
#define AMXXLOG_Error g_log.LogError
|
||||||
|
#define AMX_VERSION "1.75a"
|
||||||
|
|
||||||
extern AMX_NATIVE_INFO core_Natives[];
|
extern AMX_NATIVE_INFO core_Natives[];
|
||||||
extern AMX_NATIVE_INFO time_Natives[];
|
extern AMX_NATIVE_INFO time_Natives[];
|
||||||
@ -77,6 +83,8 @@ extern AMX_NATIVE_INFO file_Natives[];
|
|||||||
extern AMX_NATIVE_INFO float_Natives[];
|
extern AMX_NATIVE_INFO float_Natives[];
|
||||||
extern AMX_NATIVE_INFO string_Natives[];
|
extern AMX_NATIVE_INFO string_Natives[];
|
||||||
extern AMX_NATIVE_INFO vault_Natives[];
|
extern AMX_NATIVE_INFO vault_Natives[];
|
||||||
|
extern AMX_NATIVE_INFO msg_Natives[];
|
||||||
|
extern AMX_NATIVE_INFO vector_Natives[];
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
|
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
|
||||||
@ -257,6 +265,8 @@ enum CountModulesMode
|
|||||||
|
|
||||||
int countModules(CountModulesMode mode);
|
int countModules(CountModulesMode mode);
|
||||||
void modules_callPluginsLoaded();
|
void modules_callPluginsLoaded();
|
||||||
|
void modules_callPluginsUnloaded();
|
||||||
|
void modules_callPluginsUnloading();
|
||||||
|
|
||||||
cell* get_amxaddr(AMX *amx, cell amx_addr);
|
cell* get_amxaddr(AMX *amx, cell amx_addr);
|
||||||
char* build_pathname(char *fmt, ...);
|
char* build_pathname(char *fmt, ...);
|
||||||
@ -328,4 +338,6 @@ struct func_s
|
|||||||
const char *desc;
|
const char *desc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern enginefuncs_t *g_pEngTable;
|
||||||
|
|
||||||
#endif // AMXMODX_H
|
#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
|
/* the time() function returns the number of seconds since January 1 1970
|
||||||
* in Universal Coordinated Time (the successor to Greenwich Mean Time)
|
* in Universal Coordinated Time (the successor to Greenwich Mean Time)
|
||||||
*/
|
*/
|
||||||
return sec1970;
|
return (cell)sec1970;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
#if defined __BORLANDC__ || defined __WATCOMC__
|
||||||
|
@ -109,7 +109,7 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
|||||||
{
|
{
|
||||||
DATAREAD(&m_Bh.version, sizeof(int16_t), 1);
|
DATAREAD(&m_Bh.version, sizeof(int16_t), 1);
|
||||||
|
|
||||||
if (m_Bh.version != MAGIC_VERSION)
|
if (m_Bh.version > MAGIC_VERSION)
|
||||||
{
|
{
|
||||||
m_Status = Err_OldFile;
|
m_Status = Err_OldFile;
|
||||||
fclose(m_pFile);
|
fclose(m_pFile);
|
||||||
|
@ -48,6 +48,7 @@ CLog::CLog()
|
|||||||
{
|
{
|
||||||
m_LogType = 0;
|
m_LogType = 0;
|
||||||
m_LogFile.clear();
|
m_LogFile.clear();
|
||||||
|
m_FoundError = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CLog::~CLog()
|
CLog::~CLog()
|
||||||
@ -92,11 +93,13 @@ void CLog::CreateNewFile()
|
|||||||
time(&td);
|
time(&td);
|
||||||
tm *curTime = localtime(&td);
|
tm *curTime = localtime(&td);
|
||||||
|
|
||||||
|
char file[256];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
FILE *pTmpFile = fopen(m_LogFile.c_str(), "r"); // open for reading to check whether the file exists
|
build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i);
|
||||||
|
FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists
|
||||||
|
|
||||||
if (!pTmpFile)
|
if (!pTmpFile)
|
||||||
break;
|
break;
|
||||||
@ -104,6 +107,7 @@ void CLog::CreateNewFile()
|
|||||||
fclose(pTmpFile);
|
fclose(pTmpFile);
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
m_LogFile.assign(file);
|
||||||
|
|
||||||
// Log logfile start
|
// Log logfile start
|
||||||
FILE *fp = fopen(m_LogFile.c_str(), "w");
|
FILE *fp = fopen(m_LogFile.c_str(), "w");
|
||||||
@ -223,3 +227,45 @@ void CLog::Log(const char *fmt, ...)
|
|||||||
ALERT(at_logged, "%s\n", msg_);
|
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, 3071, 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)
|
||||||
|
{
|
||||||
|
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,7 @@ class CLog
|
|||||||
private:
|
private:
|
||||||
String m_LogFile;
|
String m_LogFile;
|
||||||
int m_LogType;
|
int m_LogType;
|
||||||
|
bool m_FoundError;
|
||||||
|
|
||||||
void GetLastFile(int &outMonth, int &outDay, String &outFilename);
|
void GetLastFile(int &outMonth, int &outDay, String &outFilename);
|
||||||
void UseFile(const String &fileName);
|
void UseFile(const String &fileName);
|
||||||
@ -47,6 +48,7 @@ public:
|
|||||||
void CloseFile();
|
void CloseFile();
|
||||||
void MapChange();
|
void MapChange();
|
||||||
void Log(const char *fmt, ...);
|
void Log(const char *fmt, ...);
|
||||||
|
void LogError(const char *fmt, ...);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __AMXXLOG_H__
|
#endif // __AMXXLOG_H__
|
||||||
|
271
amxmodx/binlog.cpp
Normal file
271
amxmodx/binlog.cpp
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include "amxmodx.h"
|
||||||
|
#include "binlog.h"
|
||||||
|
|
||||||
|
BinLog g_BinLog;
|
||||||
|
int g_binlog_level = 0;
|
||||||
|
int g_binlog_maxsize = 0;
|
||||||
|
|
||||||
|
bool BinLog::Open()
|
||||||
|
{
|
||||||
|
const char *data = get_localinfo("amxmodx_datadir", "addons/amxmodx/data");
|
||||||
|
char path[255];
|
||||||
|
build_pathname_r(path, sizeof(path)-1, "%s/binlogs", data);
|
||||||
|
|
||||||
|
if (!DirExists(path))
|
||||||
|
{
|
||||||
|
mkdir(path
|
||||||
|
#if defined __linux__
|
||||||
|
, 0755
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
if (!DirExists(path))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char file[255];
|
||||||
|
build_pathname_r(file, sizeof(file)-1, "%s/binlogs/lastlog", data);
|
||||||
|
|
||||||
|
unsigned int lastcntr = 0;
|
||||||
|
FILE *lastlog = fopen(file, "rb");
|
||||||
|
if (lastlog)
|
||||||
|
{
|
||||||
|
if (fread(&lastcntr, sizeof(int), 1, lastlog) != 1)
|
||||||
|
lastcntr = 0;
|
||||||
|
fclose(lastlog);
|
||||||
|
}
|
||||||
|
lastlog = fopen(file, "wb");
|
||||||
|
if (lastlog)
|
||||||
|
{
|
||||||
|
lastcntr++;
|
||||||
|
fwrite(&lastcntr, sizeof(int), 1, lastlog);
|
||||||
|
fclose(lastlog);
|
||||||
|
}
|
||||||
|
build_pathname_r(file, sizeof(file)-1, "%s/binlogs/binlog%04d.blg", data, lastcntr);
|
||||||
|
m_logfile.assign(file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* it's now safe to create the binary log
|
||||||
|
*/
|
||||||
|
FILE *fp = fopen(m_logfile.c_str(), "wb");
|
||||||
|
if (!fp)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int magic = BINLOG_MAGIC;
|
||||||
|
short vers = BINLOG_VERSION;
|
||||||
|
char c = sizeof(time_t);
|
||||||
|
fwrite(&magic, sizeof(int), 1, fp);
|
||||||
|
fwrite(&vers, sizeof(short), 1, fp);
|
||||||
|
fwrite(&c, sizeof(char), 1, fp);
|
||||||
|
|
||||||
|
WritePluginDB(fp);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
m_state = true;
|
||||||
|
|
||||||
|
WriteOp(BinLog_Start, -1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinLog::Close()
|
||||||
|
{
|
||||||
|
WriteOp(BinLog_End, -1);
|
||||||
|
m_state = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinLog::WriteOp(BinLogOp op, int plug, ...)
|
||||||
|
{
|
||||||
|
if (!m_state)
|
||||||
|
return;
|
||||||
|
|
||||||
|
FILE *fp = fopen(m_logfile.c_str(), "ab");
|
||||||
|
if (!fp)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (g_binlog_maxsize && op != BinLog_End)
|
||||||
|
{
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
if (ftell(fp) > (g_binlog_maxsize * (1024 * 1024)))
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
Close();
|
||||||
|
Open();
|
||||||
|
fp = fopen(m_logfile.c_str(), "ab");
|
||||||
|
if (!fp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char c = static_cast<char>(op);
|
||||||
|
time_t t = time(NULL);
|
||||||
|
float gt = gpGlobals->time;
|
||||||
|
fwrite(&c, sizeof(char), 1, fp);
|
||||||
|
fwrite(&t, sizeof(time_t), 1, fp);
|
||||||
|
fwrite(>, sizeof(float), 1, fp);
|
||||||
|
fwrite(&plug, sizeof(int), 1, fp);
|
||||||
|
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, plug);
|
||||||
|
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case BinLog_Registered:
|
||||||
|
{
|
||||||
|
const char *title = va_arg(ap, const char *);
|
||||||
|
const char *vers = va_arg(ap, const char *);
|
||||||
|
c = (char)strlen(title);
|
||||||
|
fwrite(&c, sizeof(char), 1, fp);
|
||||||
|
fwrite(title, sizeof(char), c+1, fp);
|
||||||
|
c = (char)strlen(vers);
|
||||||
|
fwrite(&c, sizeof(char), 1 ,fp);
|
||||||
|
fwrite(vers, sizeof(char), c+1, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BinLog_NativeCall:
|
||||||
|
{
|
||||||
|
int native = va_arg(ap, int);
|
||||||
|
int params = va_arg(ap, int);
|
||||||
|
fwrite(&native, sizeof(int), 1, fp);
|
||||||
|
fwrite(¶ms, sizeof(int), 1, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BinLog_NativeRet:
|
||||||
|
{
|
||||||
|
cell retval = va_arg(ap, cell);
|
||||||
|
fwrite(&retval, sizeof(cell), 1, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BinLog_NativeError:
|
||||||
|
{
|
||||||
|
int err = va_arg(ap, int);
|
||||||
|
const char *msg = va_arg(ap, const char *);
|
||||||
|
short len = (short)strlen(msg);
|
||||||
|
fwrite(&err, sizeof(int), 1, fp);
|
||||||
|
fwrite(&len, sizeof(short), 1, fp);
|
||||||
|
fwrite(msg, sizeof(char), len+1, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BinLog_CallPubFunc:
|
||||||
|
{
|
||||||
|
int num = va_arg(ap, int);
|
||||||
|
fwrite(&num, sizeof(int), 1, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BinLog_SetLine:
|
||||||
|
{
|
||||||
|
int line = va_arg(ap, int);
|
||||||
|
fwrite(&line, sizeof(int), 1, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BinLog_FormatString:
|
||||||
|
{
|
||||||
|
int param = va_arg(ap, int);
|
||||||
|
int maxlen = va_arg(ap, int);
|
||||||
|
const char *str = va_arg(ap, const char *);
|
||||||
|
short len = (short)strlen(str);
|
||||||
|
fwrite(¶m, sizeof(int), 1, fp);
|
||||||
|
fwrite(&maxlen, sizeof(int), 1, fp);
|
||||||
|
fwrite(&len, sizeof(short), 1, fp);
|
||||||
|
fwrite(str, sizeof(char), len+1, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BinLog_NativeParams:
|
||||||
|
{
|
||||||
|
cell *params = va_arg(ap, cell *);
|
||||||
|
cell num = params[0] / sizeof(cell);
|
||||||
|
fwrite(&num, sizeof(cell), 1, fp);
|
||||||
|
for (cell i=1; i<=num; i++)
|
||||||
|
fwrite(&(params[i]), sizeof(cell), 1, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BinLog_GetString:
|
||||||
|
{
|
||||||
|
cell addr = va_arg(ap, cell);
|
||||||
|
const char *str = va_arg(ap, const char *);
|
||||||
|
short len = (short)strlen(str);
|
||||||
|
fwrite(&addr, sizeof(cell), 1, fp);
|
||||||
|
fwrite(&len, sizeof(short), 1, fp);
|
||||||
|
fwrite(str, sizeof(char), len+1, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BinLog_SetString:
|
||||||
|
{
|
||||||
|
cell addr = va_arg(ap, cell);
|
||||||
|
int maxlen = va_arg(ap, int);
|
||||||
|
const char *str = va_arg(ap, const char *);
|
||||||
|
short len = (short)strlen(str);
|
||||||
|
fwrite(&addr, sizeof(cell), 1, fp);
|
||||||
|
fwrite(&maxlen, sizeof(int), 1, fp);
|
||||||
|
fwrite(&len, sizeof(short), 1, fp);
|
||||||
|
fwrite(str, sizeof(char), len+1, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
va_end(ap);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinLog::WritePluginDB(FILE *fp)
|
||||||
|
{
|
||||||
|
int num = g_plugins.getPluginsNum();
|
||||||
|
fwrite(&num, sizeof(int), 1, fp);
|
||||||
|
|
||||||
|
CPluginMngr::CPlugin *pl;
|
||||||
|
char c;
|
||||||
|
unsigned char len;
|
||||||
|
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
|
||||||
|
{
|
||||||
|
pl = &(*iter);
|
||||||
|
if (pl->isValid())
|
||||||
|
c = 1;
|
||||||
|
else
|
||||||
|
c = 0;
|
||||||
|
if (c && pl->isDebug())
|
||||||
|
c = 2;
|
||||||
|
fwrite(&c, sizeof(char), 1, fp);
|
||||||
|
if (c)
|
||||||
|
{
|
||||||
|
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++)
|
||||||
|
{
|
||||||
|
amx_GetNative(amx, i, name);
|
||||||
|
len = (char)strlen(name);
|
||||||
|
fwrite(&len, sizeof(char), 1, fp);
|
||||||
|
len++;
|
||||||
|
fwrite(name, sizeof(char), len, fp);
|
||||||
|
}
|
||||||
|
for (int i=0; i<publics; i++)
|
||||||
|
{
|
||||||
|
amx_GetPublic(amx, i, name);
|
||||||
|
len = (char)strlen(name);
|
||||||
|
fwrite(&len, sizeof(char), 1, fp);
|
||||||
|
len++;
|
||||||
|
fwrite(name, sizeof(char), len, fp);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
char empty[] = " ";
|
||||||
|
len = 1;
|
||||||
|
fwrite(&len, sizeof(char), 1, fp);
|
||||||
|
fwrite(empty, sizeof(char), len, fp);
|
||||||
|
int no = 0;
|
||||||
|
fwrite(&no, sizeof(int), 1, fp);
|
||||||
|
fwrite(&no, sizeof(int), 1, fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //BINLOG_ENABLED
|
77
amxmodx/binlog.h
Normal file
77
amxmodx/binlog.h
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#ifndef _INCLUDE_BINLOG_H
|
||||||
|
#define _INCLUDE_BINLOG_H
|
||||||
|
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
|
||||||
|
#include "CString.h"
|
||||||
|
|
||||||
|
#define BINLOG_MAGIC 0x414D424C
|
||||||
|
#define BINLOG_VERSION 0x0200
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format of binlog:
|
||||||
|
* uint32 magic
|
||||||
|
* uint16 version
|
||||||
|
* uint8 sizeof(time_t)
|
||||||
|
* uint32 num plugins
|
||||||
|
* [
|
||||||
|
* uint8 status codes
|
||||||
|
* str[int8] filename
|
||||||
|
* uint32 num natives
|
||||||
|
* uint32 num publics
|
||||||
|
* [
|
||||||
|
* str[uint8] native name
|
||||||
|
* ]
|
||||||
|
* [
|
||||||
|
* str[uint8] public name
|
||||||
|
* ]
|
||||||
|
* ]
|
||||||
|
* [
|
||||||
|
* uint8 operation code
|
||||||
|
* time_t realtime
|
||||||
|
* float gametime
|
||||||
|
* int32 plugin id
|
||||||
|
* <extra info>
|
||||||
|
* ]
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum BinLogOp
|
||||||
|
{
|
||||||
|
BinLog_Start=1,
|
||||||
|
BinLog_End,
|
||||||
|
BinLog_NativeCall, //<int32 native id> <int32_t num_params>
|
||||||
|
BinLog_NativeError, //<int32 errornum> <str[int16] string>
|
||||||
|
BinLog_NativeRet, //<cell value>
|
||||||
|
BinLog_CallPubFunc, //<int32 public id>
|
||||||
|
BinLog_SetLine, //<int32 line no#>
|
||||||
|
BinLog_Registered, //<string title> <string version>
|
||||||
|
BinLog_FormatString, //<int32 param#> <int32 maxlen> <str[int16] string>
|
||||||
|
BinLog_NativeParams, //<int32 num> <cell ...>
|
||||||
|
BinLog_GetString, //<cell addr> <string[int16]>
|
||||||
|
BinLog_SetString, //<cell addr> <int maxlen> <string[int16]>
|
||||||
|
};
|
||||||
|
|
||||||
|
class BinLog
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BinLog() : m_state(false)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
bool Open();
|
||||||
|
void Close();
|
||||||
|
void WriteOp(BinLogOp op, int plug, ...);
|
||||||
|
private:
|
||||||
|
void WritePluginDB(FILE *fp);
|
||||||
|
private:
|
||||||
|
String m_logfile;
|
||||||
|
bool m_state;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern BinLog g_BinLog;
|
||||||
|
extern int g_binlog_level;
|
||||||
|
extern int g_binlog_maxsize;
|
||||||
|
|
||||||
|
#endif //BINLOG_ENABLED
|
||||||
|
|
||||||
|
#endif //_INCLUDE_BINLOG_H
|
@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
#include "binlog.h"
|
||||||
|
|
||||||
#if !defined WIN32 && !defined _WIN32
|
#if !defined WIN32 && !defined _WIN32
|
||||||
#define _snprintf snprintf
|
#define _snprintf snprintf
|
||||||
@ -307,6 +308,19 @@ void Debugger::StepI()
|
|||||||
{
|
{
|
||||||
assert(m_Top >= 0 && m_Top < (int)m_pCalls.size());
|
assert(m_Top >= 0 && m_Top < (int)m_pCalls.size());
|
||||||
|
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
if (g_binlog_level & 32)
|
||||||
|
{
|
||||||
|
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(m_pAmx);
|
||||||
|
if (pl)
|
||||||
|
{
|
||||||
|
long line;
|
||||||
|
dbg_LookupLine(m_pAmxDbg, m_pAmx->cip, &line);
|
||||||
|
g_BinLog.WriteOp(BinLog_SetLine, pl->getId(), (int)(line + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
m_pCalls[m_Top]->StepI(m_pAmx->frm, m_pAmx->cip);
|
m_pCalls[m_Top]->StepI(m_pAmx->frm, m_pAmx->cip);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -542,15 +556,15 @@ void Debugger::Clear()
|
|||||||
void Debugger::DisplayTrace(const char *message)
|
void Debugger::DisplayTrace(const char *message)
|
||||||
{
|
{
|
||||||
if (message != NULL)
|
if (message != NULL)
|
||||||
AMXXLOG_Log("%s", message);
|
AMXXLOG_Error("%s", message);
|
||||||
|
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
FormatError(buffer, sizeof(buffer)-1);
|
FormatError(buffer, sizeof(buffer)-1);
|
||||||
|
|
||||||
const char *filename = _GetFilename();
|
const char *filename = _GetFilename();
|
||||||
|
|
||||||
AMXXLOG_Log("[AMXX] Displaying debug trace (plugin \"%s\")", filename);
|
AMXXLOG_Error("[AMXX] Displaying debug trace (plugin \"%s\")", filename);
|
||||||
AMXXLOG_Log("[AMXX] %s", buffer);
|
AMXXLOG_Error("[AMXX] %s", buffer);
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
long lLine;
|
long lLine;
|
||||||
@ -559,7 +573,7 @@ void Debugger::DisplayTrace(const char *message)
|
|||||||
while (pTrace)
|
while (pTrace)
|
||||||
{
|
{
|
||||||
GetTraceInfo(pTrace, lLine, function, file);
|
GetTraceInfo(pTrace, lLine, function, file);
|
||||||
AMXXLOG_Log(
|
AMXXLOG_Error(
|
||||||
"[AMXX] [%d] %s::%s (line %d)",
|
"[AMXX] [%d] %s::%s (line %d)",
|
||||||
count,
|
count,
|
||||||
file,
|
file,
|
||||||
@ -619,12 +633,14 @@ void Debugger::GenericMessage(AMX *amx, int err)
|
|||||||
Debugger::FmtGenericMsg(amx, err, buffer, sizeof(buffer)-1);
|
Debugger::FmtGenericMsg(amx, err, buffer, sizeof(buffer)-1);
|
||||||
|
|
||||||
if (buffer[0] != '\0')
|
if (buffer[0] != '\0')
|
||||||
AMXXLOG_Log("[AMXX] %s", buffer);
|
AMXXLOG_Error("[AMXX] %s", buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
Debugger::~Debugger()
|
Debugger::~Debugger()
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
|
dbg_FreeInfo(m_pAmxDbg);
|
||||||
|
delete m_pAmxDbg;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Handler::SetErrorHandler(const char *function)
|
int Handler::SetErrorHandler(const char *function)
|
||||||
@ -633,7 +649,7 @@ int Handler::SetErrorHandler(const char *function)
|
|||||||
|
|
||||||
error = amx_FindPublic(m_pAmx, function, &m_iErrFunc);
|
error = amx_FindPublic(m_pAmx, function, &m_iErrFunc);
|
||||||
|
|
||||||
if (error != AMX_ERR_NONE && m_iErrFunc < 1)
|
if (error != AMX_ERR_NONE && m_iErrFunc < 0)
|
||||||
m_iErrFunc = -1;
|
m_iErrFunc = -1;
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
@ -645,7 +661,7 @@ int Handler::SetModuleFilter(const char *function)
|
|||||||
|
|
||||||
error = amx_FindPublic(m_pAmx, function, &m_iModFunc);
|
error = amx_FindPublic(m_pAmx, function, &m_iModFunc);
|
||||||
|
|
||||||
if (error != AMX_ERR_NONE && m_iModFunc < 1)
|
if (error != AMX_ERR_NONE && m_iModFunc < 0)
|
||||||
m_iModFunc = -1;
|
m_iModFunc = -1;
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
@ -679,9 +695,9 @@ const char *Handler::GetLastMsg()
|
|||||||
return m_MsgCache.c_str();
|
return m_MsgCache.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
int Handler::HandleModule(const char *module)
|
int Handler::HandleModule(const char *module, bool isClass)
|
||||||
{
|
{
|
||||||
if (m_iModFunc < 1)
|
if (m_iModFunc < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -695,6 +711,7 @@ int Handler::HandleModule(const char *module)
|
|||||||
|
|
||||||
//temporarily set prenit
|
//temporarily set prenit
|
||||||
m_pAmx->flags |= AMX_FLAG_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);
|
amx_PushString(m_pAmx, &hea_addr, &phys_addr, module, 0, 0);
|
||||||
int err = amx_Exec(m_pAmx, &retval, m_iModFunc);
|
int err = amx_Exec(m_pAmx, &retval, m_iModFunc);
|
||||||
amx_Release(m_pAmx, hea_addr);
|
amx_Release(m_pAmx, hea_addr);
|
||||||
@ -748,7 +765,7 @@ int Handler::HandleNative(const char *native, int index, int trap)
|
|||||||
}
|
}
|
||||||
if (!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;
|
return 0;
|
||||||
}
|
}
|
||||||
//handle this manually.
|
//handle this manually.
|
||||||
@ -759,7 +776,7 @@ int Handler::HandleNative(const char *native, int index, int trap)
|
|||||||
} else if (err != -1) {
|
} else if (err != -1) {
|
||||||
LogError(m_pAmx, err, NULL);
|
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;
|
retval = 0;
|
||||||
}
|
}
|
||||||
if (!trap)
|
if (!trap)
|
||||||
@ -819,10 +836,10 @@ int Handler::HandleError(const char *msg)
|
|||||||
pDebugger->DisplayTrace(msg);
|
pDebugger->DisplayTrace(msg);
|
||||||
} else {
|
} else {
|
||||||
if (GetLastMsg())
|
if (GetLastMsg())
|
||||||
AMXXLOG_Log("%s", GetLastMsg());
|
AMXXLOG_Error("%s", GetLastMsg());
|
||||||
Debugger::GenericMessage(m_pAmx, err);
|
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)
|
if (pDebugger)
|
||||||
@ -850,7 +867,7 @@ static cell AMX_NATIVE_CALL set_error_filter(AMX *amx, cell *params)
|
|||||||
if (!pHandler)
|
if (!pHandler)
|
||||||
{
|
{
|
||||||
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
||||||
AMXXLOG_Log("[AMXX] Plugin not initialized correctly.");
|
AMXXLOG_Error("[AMXX] Plugin not initialized correctly.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -858,7 +875,7 @@ static cell AMX_NATIVE_CALL set_error_filter(AMX *amx, cell *params)
|
|||||||
if (err != AMX_ERR_NONE)
|
if (err != AMX_ERR_NONE)
|
||||||
{
|
{
|
||||||
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
||||||
AMXXLOG_Log("[AMXX] Function not found: %s", function);
|
AMXXLOG_Error("[AMXX] Function not found: %s", function);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -938,7 +955,7 @@ static cell AMX_NATIVE_CALL set_native_filter(AMX *amx, cell *params)
|
|||||||
if (!pHandler)
|
if (!pHandler)
|
||||||
{
|
{
|
||||||
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
||||||
AMXXLOG_Log("[AMXX] Plugin not initialized correctly.");
|
AMXXLOG_Error("[AMXX] Plugin not initialized correctly.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -957,7 +974,7 @@ static cell AMX_NATIVE_CALL set_native_filter(AMX *amx, cell *params)
|
|||||||
if (err != AMX_ERR_NONE)
|
if (err != AMX_ERR_NONE)
|
||||||
{
|
{
|
||||||
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
|
||||||
AMXXLOG_Log("[AMXX] Function not found: %s", function);
|
AMXXLOG_Error("[AMXX] Function not found: %s", function);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
int HandleError(const char *msg);
|
int HandleError(const char *msg);
|
||||||
int HandleNative(const char *native, int index, int trap);
|
int HandleNative(const char *native, int index, int trap);
|
||||||
int HandleModule(const char *module);
|
int HandleModule(const char *module, bool isClass=false);
|
||||||
public:
|
public:
|
||||||
bool IsHandling() const { return m_Handling; }
|
bool IsHandling() const { return m_Handling; }
|
||||||
void SetErrorMsg(const char *msg);
|
void SetErrorMsg(const char *msg);
|
||||||
|
115
amxmodx/file.cpp
115
amxmodx/file.cpp
@ -51,8 +51,6 @@
|
|||||||
#include <io.h>
|
#include <io.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <extdll.h>
|
|
||||||
#include <meta_api.h>
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
|
|
||||||
CVector<FILE *> FileList;
|
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)
|
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;
|
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)
|
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;
|
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)
|
if ((pFile = fopen(sFile, "w")) == NULL)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,7 +219,7 @@ static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */
|
|||||||
|
|
||||||
if ((pTemp = tmpfile()) == NULL)
|
if ((pTemp = tmpfile()) == NULL)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Couldn't create temp file");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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...
|
// now rewrite because file can be now smaller...
|
||||||
if ((pFile = fopen(sFile, "w")) == NULL)
|
if ((pFile = fopen(sFile, "w")) == NULL)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,27 +305,7 @@ static cell AMX_NATIVE_CALL dir_exists(AMX *amx, cell *params) /* 1 param */
|
|||||||
char *sFile = get_amxstring(amx, params[1], 0, iLen);
|
char *sFile = get_amxstring(amx, params[1], 0, iLen);
|
||||||
char *file = build_pathname("%s", sFile);
|
char *file = build_pathname("%s", sFile);
|
||||||
|
|
||||||
#if defined WIN32 || defined _WIN32
|
return DirExists(file) ? 1 : 0;
|
||||||
DWORD attr = GetFileAttributes(file);
|
|
||||||
|
|
||||||
if (attr == INVALID_FILE_ATTRIBUTES)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (attr == FILE_ATTRIBUTE_DIRECTORY)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
struct stat s;
|
|
||||||
|
|
||||||
if (stat(file, &s) != 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (S_ISDIR(s.st_mode))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL file_size(AMX *amx, cell *params) /* 1 param */
|
static cell AMX_NATIVE_CALL file_size(AMX *amx, cell *params) /* 1 param */
|
||||||
@ -576,6 +554,18 @@ static cell AMX_NATIVE_CALL amx_fread_blocks(AMX *amx, cell *params)
|
|||||||
return 0;
|
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)
|
static cell AMX_NATIVE_CALL amx_fgets(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
FILE *fp = (FILE *)params[1];
|
FILE *fp = (FILE *)params[1];
|
||||||
@ -761,6 +751,67 @@ static cell AMX_NATIVE_CALL amx_get_dir(AMX *amx, cell *params)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//native fgetc( file );
|
||||||
|
static cell AMX_NATIVE_CALL amx_fgetc(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
FILE *fp = (FILE *)params[1];
|
||||||
|
|
||||||
|
if (!fp)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return fgetc(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//native fputc( file, data );
|
||||||
|
static cell AMX_NATIVE_CALL amx_fputc(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
FILE *fp = (FILE *)params[1];
|
||||||
|
|
||||||
|
if (!fp)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return fputc(static_cast<int>(params[2]), fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//native ungetc( file, data );
|
||||||
|
static cell AMX_NATIVE_CALL amx_ungetc(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
FILE *fp = (FILE *)params[1];
|
||||||
|
|
||||||
|
if (!fp)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return ungetc(static_cast<int>(params[2]), fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined __linux__
|
||||||
|
#define _rmdir rmdir
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL amx_rmdir(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
char* sFile = build_pathname("%s", get_amxstring(amx, params[1], 0, len));
|
||||||
|
|
||||||
|
if (_rmdir(sFile) != 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL amx_rename(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
char *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[] =
|
AMX_NATIVE_INFO file_Natives[] =
|
||||||
{
|
{
|
||||||
{"delete_file", delete_file},
|
{"delete_file", delete_file},
|
||||||
@ -785,10 +836,16 @@ AMX_NATIVE_INFO file_Natives[] =
|
|||||||
{"ftell", amx_ftell},
|
{"ftell", amx_ftell},
|
||||||
{"filesize", amx_filesize},
|
{"filesize", amx_filesize},
|
||||||
{"unlink", delete_file},
|
{"unlink", delete_file},
|
||||||
{"build_pathname", amx_build_pathname},
|
{"build_pathname", amx_build_pathname},
|
||||||
{"dir_exists", dir_exists},
|
{"dir_exists", dir_exists},
|
||||||
{"open_dir", amx_open_dir},
|
{"open_dir", amx_open_dir},
|
||||||
{"close_dir", amx_close_dir},
|
{"close_dir", amx_close_dir},
|
||||||
{"next_file", amx_get_dir},
|
{"next_file", amx_get_dir},
|
||||||
|
{"fgetc", amx_fgetc},
|
||||||
|
{"fputc", amx_fputc},
|
||||||
|
{"fungetc", amx_ungetc},
|
||||||
|
{"rmdir", amx_rmdir},
|
||||||
|
{"fputs", amx_fputs},
|
||||||
|
{"rename_file", amx_rename},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
@ -80,14 +80,14 @@ const char *translate(AMX *amx, cell amxaddr, const char *key)
|
|||||||
const char *testlang = amx_mldebug->string;
|
const char *testlang = amx_mldebug->string;
|
||||||
if (!g_langMngr.LangExists(testlang))
|
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;
|
validlang = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_langMngr.GetDef(testlang, key, debug_status);
|
g_langMngr.GetDef(testlang, key, debug_status);
|
||||||
|
|
||||||
if (validlang && debug_status == ERR_BADKEY)
|
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)
|
if (def == NULL)
|
||||||
@ -96,7 +96,7 @@ const char *translate(AMX *amx, cell amxaddr, const char *key)
|
|||||||
{
|
{
|
||||||
if (status == ERR_BADLANG && (BadLang_Table.AltFindOrInsert(pLangName).last + 120.0f < gpGlobals->time))
|
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;
|
BadLang_Table.AltFindOrInsert(pLangName).last = gpGlobals->time;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
51
amxmodx/helpers-x86.asm
Normal file
51
amxmodx/helpers-x86.asm
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
; (C)2006 by David "BAILOPAN" Anderson ;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;;Licensed under the GNU General Public License, version 2
|
||||||
|
;;This is a portion of AMX Mod X
|
||||||
|
;; and is maintained by the AMX Mod X development team.
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
global amxx_CpuSupport, _amxx_CpuSupport
|
||||||
|
|
||||||
|
amxx_CpuSupport:
|
||||||
|
_amxx_CpuSupport:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
push ebx
|
||||||
|
|
||||||
|
mov eax, 0
|
||||||
|
cpuid
|
||||||
|
cmp eax, 1
|
||||||
|
jl .fail
|
||||||
|
|
||||||
|
mov eax, 1
|
||||||
|
cpuid
|
||||||
|
;check if family == 5 or 4
|
||||||
|
and eax, 0780h ;family mask
|
||||||
|
shr eax, 7 ;family shift
|
||||||
|
cmp eax, 5
|
||||||
|
je .fail
|
||||||
|
cmp eax, 4
|
||||||
|
je .fail
|
||||||
|
;check if CMOV exists
|
||||||
|
shr edx, 15
|
||||||
|
and edx, 1
|
||||||
|
cmp edx, 0
|
||||||
|
je .fail
|
||||||
|
|
||||||
|
mov eax, 1
|
||||||
|
jmp .end
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
xor eax, eax
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
||||||
|
pop ebx
|
||||||
|
|
||||||
|
pop ebp
|
||||||
|
ret
|
243
amxmodx/libraries.cpp
Normal file
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;
|
||||||
|
|
||||||
|
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
|
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,7 +1,11 @@
|
|||||||
#ifndef _MSGS_INCLUDE_H
|
#ifndef _MSGS_INCLUDE_H
|
||||||
#define _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 MAX_MESSAGES 255
|
||||||
|
|
||||||
@ -59,9 +63,21 @@ private:
|
|||||||
size_t m_CurParam;
|
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 CVector<int> msgHooks[256];
|
||||||
extern int msgBlocks[256];
|
extern int msgBlocks[256];
|
||||||
|
|
||||||
|
void ClearMessages();
|
||||||
|
|
||||||
#endif //_MSGS_INCLUDE_H
|
#endif //_MSGS_INCLUDE_H
|
||||||
|
|
@ -33,12 +33,18 @@
|
|||||||
|
|
||||||
#if defined WIN32
|
#if defined WIN32
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
|
#else
|
||||||
|
#include <dirent.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "fakemeta.h"
|
#include "fakemeta.h"
|
||||||
#include "newmenus.h"
|
#include "newmenus.h"
|
||||||
#include "natives.h"
|
#include "natives.h"
|
||||||
|
#include "binlog.h"
|
||||||
|
#include "optimizer.h"
|
||||||
|
#include "libraries.h"
|
||||||
|
#include "messages.h"
|
||||||
|
|
||||||
plugin_info_t Plugin_info =
|
plugin_info_t Plugin_info =
|
||||||
{
|
{
|
||||||
@ -147,6 +153,57 @@ int FF_InconsistentFile = -1;
|
|||||||
int FF_ClientAuthorized = -1;
|
int FF_ClientAuthorized = -1;
|
||||||
int FF_ChangeLevel = -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(CStack<String *> & files)
|
||||||
|
{
|
||||||
|
char path[255];
|
||||||
|
#if defined WIN32
|
||||||
|
build_pathname_r(path, sizeof(path)-1, "%s/*.ini", get_localinfo("amxx_configsdir", "addons/amxmodx/configs"));
|
||||||
|
_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/", get_localinfo("amxx_configsdir", "addons/amxmodx/configs"));
|
||||||
|
struct dirent *ep;
|
||||||
|
DIR *dp;
|
||||||
|
|
||||||
|
if ((dp = opendir(path)) == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while ( (ep=readdir(dp)) != NULL )
|
||||||
|
{
|
||||||
|
ParseAndOrAdd(files, ep->d_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir (dp);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Precache stuff from force consistency calls
|
// Precache stuff from force consistency calls
|
||||||
// or check for pointed files won't be done
|
// or check for pointed files won't be done
|
||||||
int C_PrecacheModel(char *s)
|
int C_PrecacheModel(char *s)
|
||||||
@ -242,15 +299,6 @@ int C_Spawn(edict_t *pent)
|
|||||||
// ###### Initialize task manager
|
// ###### Initialize task manager
|
||||||
g_tasksMngr.registerTimers(&gpGlobals->time, &mp_timelimit->value, &g_game_timeleft);
|
g_tasksMngr.registerTimers(&gpGlobals->time, &mp_timelimit->value, &g_game_timeleft);
|
||||||
|
|
||||||
// ###### Load lang
|
|
||||||
char file[256];
|
|
||||||
if (!g_langMngr.Load(build_pathname_r(file, sizeof(file) - 1, "%s/languages.dat", get_localinfo("amxmodx_datadir", "addons/amxmodx/data"))))
|
|
||||||
{
|
|
||||||
g_langMngr.InvalidateCache();
|
|
||||||
} else {
|
|
||||||
g_langMngr.LoadCache(build_pathname_r(file, sizeof(file) - 1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
|
|
||||||
}
|
|
||||||
|
|
||||||
// ###### Initialize commands prefixes
|
// ###### Initialize commands prefixes
|
||||||
g_commands.registerPrefix("amx");
|
g_commands.registerPrefix("amx");
|
||||||
g_commands.registerPrefix("amxx");
|
g_commands.registerPrefix("amxx");
|
||||||
@ -268,6 +316,20 @@ int C_Spawn(edict_t *pent)
|
|||||||
|
|
||||||
// ###### Load modules
|
// ###### Load modules
|
||||||
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"), PT_ANYTIME);
|
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"), PT_ANYTIME);
|
||||||
|
g_plugins.CALMFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
||||||
|
CStack<String *> files;
|
||||||
|
BuildPluginFileList(files);
|
||||||
|
char path[255];
|
||||||
|
while (!files.empty())
|
||||||
|
{
|
||||||
|
String *pString = files.front();
|
||||||
|
snprintf(path, sizeof(path)-1, "%s/%s",
|
||||||
|
get_localinfo("amxx_configsdir", "addons/amxmodx/configs"),
|
||||||
|
pString->c_str());
|
||||||
|
g_plugins.CALMFromFile(path);
|
||||||
|
delete pString;
|
||||||
|
files.pop();
|
||||||
|
}
|
||||||
int loaded = countModules(CountModules_Running); // Call after attachModules so all modules don't have pending stat
|
int loaded = countModules(CountModules_Running); // Call after attachModules so all modules don't have pending stat
|
||||||
|
|
||||||
// Set some info about amx version and modules
|
// Set some info about amx version and modules
|
||||||
@ -277,6 +339,7 @@ int C_Spawn(edict_t *pent)
|
|||||||
CVAR_SET_STRING(init_amxmodx_modules.name, buffer);
|
CVAR_SET_STRING(init_amxmodx_modules.name, buffer);
|
||||||
|
|
||||||
// ###### Load Vault
|
// ###### Load Vault
|
||||||
|
char file[255];
|
||||||
g_vault.setSource(build_pathname_r(file, sizeof(file) - 1, "%s", get_localinfo("amxx_vault", "addons/amxmodx/configs/vault.ini")));
|
g_vault.setSource(build_pathname_r(file, sizeof(file) - 1, "%s", get_localinfo("amxx_vault", "addons/amxmodx/configs/vault.ini")));
|
||||||
g_vault.loadVault();
|
g_vault.loadVault();
|
||||||
|
|
||||||
@ -298,8 +361,23 @@ int C_Spawn(edict_t *pent)
|
|||||||
// Set server flags
|
// Set server flags
|
||||||
memset(g_players[0].flags, -1, sizeof(g_players[0].flags));
|
memset(g_players[0].flags, -1, sizeof(g_players[0].flags));
|
||||||
|
|
||||||
|
g_opt_level = atoi(get_localinfo("optimizer", "7"));
|
||||||
|
if (!g_opt_level)
|
||||||
|
g_opt_level = 7;
|
||||||
|
|
||||||
// ###### Load AMX scripts
|
// ###### Load AMX scripts
|
||||||
g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
||||||
|
BuildPluginFileList(files);
|
||||||
|
while (!files.empty())
|
||||||
|
{
|
||||||
|
String *pString = files.front();
|
||||||
|
snprintf(path, sizeof(path)-1, "%s/%s",
|
||||||
|
get_localinfo("amxx_configsdir", "addons/amxmodx/configs"),
|
||||||
|
pString->c_str());
|
||||||
|
g_plugins.loadPluginsFromFile(path);
|
||||||
|
delete pString;
|
||||||
|
files.pop();
|
||||||
|
}
|
||||||
g_plugins.Finalize();
|
g_plugins.Finalize();
|
||||||
|
|
||||||
// Register forwards
|
// Register forwards
|
||||||
@ -317,6 +395,15 @@ int C_Spawn(edict_t *pent)
|
|||||||
FF_ClientAuthorized = registerForward("client_authorized", ET_IGNORE, FP_CELL, FP_DONE);
|
FF_ClientAuthorized = registerForward("client_authorized", ET_IGNORE, FP_CELL, FP_DONE);
|
||||||
FF_ChangeLevel = registerForward("server_changelevel", ET_STOP, FP_STRING, FP_DONE);
|
FF_ChangeLevel = registerForward("server_changelevel", ET_STOP, FP_STRING, FP_DONE);
|
||||||
|
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
if (!g_BinLog.Open())
|
||||||
|
{
|
||||||
|
LOG_ERROR(PLID, "Binary log failed to open.");
|
||||||
|
}
|
||||||
|
g_binlog_level = atoi(get_localinfo("bin_logging", "17"));
|
||||||
|
g_binlog_maxsize = atoi(get_localinfo("max_binlog_size", "20"));
|
||||||
|
#endif
|
||||||
|
|
||||||
modules_callPluginsLoaded();
|
modules_callPluginsLoaded();
|
||||||
|
|
||||||
// ###### Call precache forward function
|
// ###### Call precache forward function
|
||||||
@ -430,11 +517,6 @@ void C_ServerActivate_Post(edict_t *pEdictList, int edictCount, int clientMax)
|
|||||||
executeForwards(FF_PluginInit);
|
executeForwards(FF_PluginInit);
|
||||||
executeForwards(FF_PluginCfg);
|
executeForwards(FF_PluginCfg);
|
||||||
|
|
||||||
// ###### Save lang
|
|
||||||
char file[256];
|
|
||||||
g_langMngr.Save(build_pathname_r(file, sizeof(file) - 1, "%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
|
|
||||||
g_langMngr.SaveCache(build_pathname_r(file, sizeof(file) - 1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
|
|
||||||
|
|
||||||
// Correct time in Counter-Strike and other mods (except DOD)
|
// Correct time in Counter-Strike and other mods (except DOD)
|
||||||
if (!g_bmod_dod)
|
if (!g_bmod_dod)
|
||||||
g_game_timeleft = 0;
|
g_game_timeleft = 0;
|
||||||
@ -487,6 +569,8 @@ void C_ServerDeactivate_Post()
|
|||||||
if (!g_initialized)
|
if (!g_initialized)
|
||||||
RETURN_META(MRES_IGNORED);
|
RETURN_META(MRES_IGNORED);
|
||||||
|
|
||||||
|
modules_callPluginsUnloading();
|
||||||
|
|
||||||
detachReloadModules();
|
detachReloadModules();
|
||||||
g_auth.clear();
|
g_auth.clear();
|
||||||
g_commands.clear();
|
g_commands.clear();
|
||||||
@ -504,12 +588,9 @@ void C_ServerDeactivate_Post()
|
|||||||
g_xvars.clear();
|
g_xvars.clear();
|
||||||
g_plugins.clear();
|
g_plugins.clear();
|
||||||
ClearPluginLibraries();
|
ClearPluginLibraries();
|
||||||
|
modules_callPluginsUnloaded();
|
||||||
|
|
||||||
char file[256];
|
ClearMessages();
|
||||||
|
|
||||||
g_langMngr.Save(build_pathname_r(file, sizeof(file) - 1, "%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
|
|
||||||
g_langMngr.SaveCache(build_pathname_r(file, sizeof(file) - 1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
|
|
||||||
g_langMngr.Clear();
|
|
||||||
|
|
||||||
for (unsigned int i=0; i<g_hudsync.size(); i++)
|
for (unsigned int i=0; i<g_hudsync.size(); i++)
|
||||||
delete [] g_hudsync[i];
|
delete [] g_hudsync[i];
|
||||||
@ -569,6 +650,10 @@ void C_ServerDeactivate_Post()
|
|||||||
}
|
}
|
||||||
#endif // MEMORY_TEST
|
#endif // MEMORY_TEST
|
||||||
|
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
g_BinLog.Close();
|
||||||
|
#endif
|
||||||
|
|
||||||
g_initialized = false;
|
g_initialized = false;
|
||||||
|
|
||||||
RETURN_META(MRES_IGNORED);
|
RETURN_META(MRES_IGNORED);
|
||||||
@ -1266,6 +1351,8 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
|
|||||||
// This will also call modules Meta_Query and Meta_Attach functions
|
// This will also call modules Meta_Query and Meta_Attach functions
|
||||||
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"), now);
|
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"), now);
|
||||||
|
|
||||||
|
GET_HOOK_TABLES(PLID, &g_pEngTable, NULL, NULL);
|
||||||
|
|
||||||
return (TRUE);
|
return (TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1277,6 +1364,8 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
|
|||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
modules_callPluginsUnloading();
|
||||||
|
|
||||||
g_auth.clear();
|
g_auth.clear();
|
||||||
g_forwards.clear();
|
g_forwards.clear();
|
||||||
g_commands.clear();
|
g_commands.clear();
|
||||||
@ -1293,6 +1382,11 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
|
|||||||
g_xvars.clear();
|
g_xvars.clear();
|
||||||
g_plugins.clear();
|
g_plugins.clear();
|
||||||
g_cvars.clear();
|
g_cvars.clear();
|
||||||
|
g_langMngr.Clear();
|
||||||
|
|
||||||
|
ClearMessages();
|
||||||
|
|
||||||
|
modules_callPluginsUnloaded();
|
||||||
|
|
||||||
detachModules();
|
detachModules();
|
||||||
|
|
||||||
@ -1300,6 +1394,9 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
|
|||||||
|
|
||||||
Module_UncacheFunctions();
|
Module_UncacheFunctions();
|
||||||
|
|
||||||
|
ClearLibraries(LibSource_Plugin);
|
||||||
|
ClearLibraries(LibSource_Module);
|
||||||
|
|
||||||
return (TRUE);
|
return (TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1435,6 +1532,18 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
|||||||
meta_engfuncs.pfnPrecacheSound = C_PrecacheSound;
|
meta_engfuncs.pfnPrecacheSound = C_PrecacheSound;
|
||||||
meta_engfuncs.pfnChangeLevel = C_ChangeLevel;
|
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;
|
||||||
|
|
||||||
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
|
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -72,12 +72,20 @@ typedef enum
|
|||||||
} PlayerProp;
|
} PlayerProp;
|
||||||
|
|
||||||
int CheckModules(AMX *amx, char error[128]);
|
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);
|
const char *StrCaseStr(const char *as, const char *bs);
|
||||||
|
|
||||||
class Debugger;
|
class Debugger;
|
||||||
Debugger *DisableDebugHandler(AMX *amx);
|
Debugger *DisableDebugHandler(AMX *amx);
|
||||||
void EnableDebugHandler(AMX *amx, Debugger *pd);
|
void EnableDebugHandler(AMX *amx, Debugger *pd);
|
||||||
|
|
||||||
|
bool DirExists(const char *dir);
|
||||||
const char* GetFileName(AMX *amx);
|
const char* GetFileName(AMX *amx);
|
||||||
|
|
||||||
|
inline cell FloatToCell(float input)
|
||||||
|
{
|
||||||
|
REAL output = input;
|
||||||
|
return *(cell *)&output;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // __MODULES_H__
|
#endif // __MODULES_H__
|
||||||
|
@ -5,32 +5,20 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx", "amxmodx_mm.vcpro
|
|||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfiguration) = preSolution
|
GlobalSection(SolutionConfiguration) = preSolution
|
||||||
Debug = Debug
|
|
||||||
JITDebug = JITDebug
|
JITDebug = JITDebug
|
||||||
JITMemtestRelease = JITMemtestRelease
|
JITDebugBinLog = JITDebugBinLog
|
||||||
JITRelease = JITRelease
|
JITRelease = JITRelease
|
||||||
MaximalSpeed = MaximalSpeed
|
JITReleaseBinLog = JITReleaseBinLog
|
||||||
MemtestDebug = MemtestDebug
|
|
||||||
MemtestRelease = MemtestRelease
|
|
||||||
Release = Release
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfiguration) = postSolution
|
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.ActiveCfg = JITDebug|Win32
|
||||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug.Build.0 = JITDebug|Win32
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug.Build.0 = JITDebug|Win32
|
||||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITMemtestRelease.ActiveCfg = JITMemtestRelease|Win32
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog.ActiveCfg = JITDebugBinLog|Win32
|
||||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITMemtestRelease.Build.0 = JITMemtestRelease|Win32
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog.Build.0 = JITDebugBinLog|Win32
|
||||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease.ActiveCfg = JITRelease|Win32
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease.ActiveCfg = JITRelease|Win32
|
||||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease.Build.0 = JITRelease|Win32
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease.Build.0 = JITRelease|Win32
|
||||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MaximalSpeed.ActiveCfg = MaximalSpeed|Win32
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog.ActiveCfg = JITReleaseBinLog|Win32
|
||||||
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MaximalSpeed.Build.0 = MaximalSpeed|Win32
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog.Build.0 = JITReleaseBinLog|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
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
Version="7.10"
|
Version="7.10"
|
||||||
Name="amxmodx"
|
Name="amxmodx"
|
||||||
ProjectGUID="{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
|
ProjectGUID="{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
|
||||||
|
RootNamespace="amxmodx"
|
||||||
SccProjectName=""
|
SccProjectName=""
|
||||||
SccLocalPath="">
|
SccLocalPath="">
|
||||||
<Platforms>
|
<Platforms>
|
||||||
@ -11,287 +12,6 @@
|
|||||||
Name="Win32"/>
|
Name="Win32"/>
|
||||||
</Platforms>
|
</Platforms>
|
||||||
<Configurations>
|
<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
|
<Configuration
|
||||||
Name="JITDebug|Win32"
|
Name="JITDebug|Win32"
|
||||||
OutputDirectory="JITDebug"
|
OutputDirectory="JITDebug"
|
||||||
@ -326,14 +46,14 @@
|
|||||||
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||||
OutputFile="jitdebug/amxmodx_mm.dll"
|
OutputFile="jitdebug/amxmodx_mm.dll"
|
||||||
Version="0.1"
|
Version="0.1"
|
||||||
LinkIncremental="1"
|
LinkIncremental="2"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
IgnoreDefaultLibraryNames="MSVCRT"
|
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
|
||||||
ModuleDefinitionFile=""
|
ModuleDefinitionFile=""
|
||||||
GenerateDebugInformation="TRUE"
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
|
ProgramDatabaseFile=".\jitdebug/amxmodx_mm.pdb"
|
||||||
ImportLibrary=".\jitdebug/amxx_mm.lib"/>
|
ImportLibrary=".\jitdebug/amxmodx_mm.lib"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCMIDLTool"
|
Name="VCMIDLTool"
|
||||||
PreprocessorDefinitions="_DEBUG"
|
PreprocessorDefinitions="_DEBUG"
|
||||||
@ -410,7 +130,7 @@
|
|||||||
GenerateDebugInformation="TRUE"
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile=".\jitrelease/amxmodx_mm.pdb"
|
ProgramDatabaseFile=".\jitrelease/amxmodx_mm.pdb"
|
||||||
GenerateMapFile="TRUE"
|
GenerateMapFile="TRUE"
|
||||||
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
|
ImportLibrary=".\jitrelease/amxmodx_mm.lib"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCMIDLTool"
|
Name="VCMIDLTool"
|
||||||
PreprocessorDefinitions="NDEBUG"
|
PreprocessorDefinitions="NDEBUG"
|
||||||
@ -440,31 +160,30 @@
|
|||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="JITMemtestRelease|Win32"
|
Name="JITDebugBinLog|Win32"
|
||||||
OutputDirectory="JITMemtestRelease"
|
OutputDirectory="$(ConfigurationName)"
|
||||||
IntermediateDirectory="JITMemtestRelease"
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
ConfigurationType="2"
|
ConfigurationType="2"
|
||||||
UseOfMFC="0"
|
UseOfMFC="0"
|
||||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||||
CharacterSet="2">
|
CharacterSet="2">
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
GlobalOptimizations="TRUE"
|
Optimization="0"
|
||||||
InlineFunctionExpansion="1"
|
AdditionalIncludeDirectories=""
|
||||||
FavorSizeOrSpeed="1"
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT;BINLOG_ENABLED"
|
||||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
BasicRuntimeChecks="3"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST;JIT;ASM32;PAWN_CELL_SIZE=32"
|
RuntimeLibrary="5"
|
||||||
StringPooling="TRUE"
|
StructMemberAlignment="3"
|
||||||
RuntimeLibrary="4"
|
|
||||||
EnableFunctionLevelLinking="TRUE"
|
|
||||||
UsePrecompiledHeader="2"
|
UsePrecompiledHeader="2"
|
||||||
PrecompiledHeaderThrough="amxmodx.h"
|
PrecompiledHeaderThrough="amxmodx.h"
|
||||||
PrecompiledHeaderFile=".\jitmemtestrelease/amxmodx.pch"
|
PrecompiledHeaderFile=".\jitdebugbinlog/amxmodx.pch"
|
||||||
AssemblerListingLocation=".\jitmemtestrelease/"
|
AssemblerListingLocation=".\jitdebugbinlog/"
|
||||||
ObjectFile=".\jitmemtestrelease/"
|
ObjectFile=".\jitdebugbinlog/"
|
||||||
ProgramDataBaseFileName=".\jitmemtestrelease/"
|
ProgramDataBaseFileName=".\jitdebugbinlog/"
|
||||||
WarningLevel="3"
|
WarningLevel="3"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
|
DebugInformationFormat="4"
|
||||||
CompileAs="0"/>
|
CompileAs="0"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCustomBuildTool"/>
|
Name="VCCustomBuildTool"/>
|
||||||
@ -472,22 +191,23 @@
|
|||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/MACHINE:I386"
|
AdditionalOptions="/MACHINE:I386"
|
||||||
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||||
OutputFile="jitmemtestrelease/amxmodx_mm.dll"
|
OutputFile="jitdebugbinlog/amxmodx_bl_mm.dll"
|
||||||
LinkIncremental="1"
|
Version="0.1"
|
||||||
|
LinkIncremental="2"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
IgnoreDefaultLibraryNames="MSVCRT"
|
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
|
||||||
ModuleDefinitionFile=""
|
ModuleDefinitionFile=""
|
||||||
GenerateDebugInformation="TRUE"
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile=".\jitmemtestrelease/amxx_mm.pdb"
|
ProgramDatabaseFile=".\jitdebugbinlog/amxmodx_bl_mm.pdb"
|
||||||
ImportLibrary=".\jitmemtestrelease/amxx_mm.lib"/>
|
ImportLibrary=".\jitdebugbinlog/amxmodx_bl_mm.lib"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCMIDLTool"
|
Name="VCMIDLTool"
|
||||||
PreprocessorDefinitions="NDEBUG"
|
PreprocessorDefinitions="_DEBUG"
|
||||||
MkTypLibCompatible="TRUE"
|
MkTypLibCompatible="TRUE"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
TargetEnvironment="1"
|
TargetEnvironment="1"
|
||||||
TypeLibraryName=".\release/amxmodx.tlb"/>
|
TypeLibraryName=".\debug/amxmodx.tlb"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCPostBuildEventTool"/>
|
Name="VCPostBuildEventTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
@ -496,7 +216,7 @@
|
|||||||
Name="VCPreLinkEventTool"/>
|
Name="VCPreLinkEventTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCResourceCompilerTool"
|
Name="VCResourceCompilerTool"
|
||||||
PreprocessorDefinitions="NDEBUG"
|
PreprocessorDefinitions="_DEBUG"
|
||||||
Culture="1033"/>
|
Culture="1033"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
@ -510,48 +230,54 @@
|
|||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="MaximalSpeed|Win32"
|
Name="JITReleaseBinLog|Win32"
|
||||||
OutputDirectory="MaximalSpeed"
|
OutputDirectory="$(ConfigurationName)"
|
||||||
IntermediateDirectory="MaximalSpeed"
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
ConfigurationType="2"
|
ConfigurationType="2"
|
||||||
UseOfMFC="0"
|
UseOfMFC="0"
|
||||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||||
CharacterSet="2">
|
CharacterSet="2">
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
GlobalOptimizations="TRUE"
|
GlobalOptimizations="TRUE"
|
||||||
InlineFunctionExpansion="1"
|
InlineFunctionExpansion="1"
|
||||||
EnableIntrinsicFunctions="TRUE"
|
EnableIntrinsicFunctions="TRUE"
|
||||||
FavorSizeOrSpeed="1"
|
FavorSizeOrSpeed="1"
|
||||||
OptimizeForProcessor="2"
|
OmitFramePointers="TRUE"
|
||||||
OptimizeForWindowsApplication="TRUE"
|
OptimizeForProcessor="0"
|
||||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT;ASM32;PAWN_CELL_SIZE=32;BINLOG_ENABLED"
|
||||||
|
IgnoreStandardIncludePath="FALSE"
|
||||||
StringPooling="TRUE"
|
StringPooling="TRUE"
|
||||||
RuntimeLibrary="4"
|
RuntimeLibrary="4"
|
||||||
EnableFunctionLevelLinking="TRUE"
|
EnableFunctionLevelLinking="TRUE"
|
||||||
UsePrecompiledHeader="2"
|
UsePrecompiledHeader="2"
|
||||||
PrecompiledHeaderThrough="amxmodx.h"
|
PrecompiledHeaderThrough="amxmodx.h"
|
||||||
PrecompiledHeaderFile=".\MaximalSpeed/amxmodx.pch"
|
PrecompiledHeaderFile=".\jitreleasebinlog/amxmodx.pch"
|
||||||
AssemblerListingLocation=".\MaximalSpeed/"
|
AssemblerListingLocation=".\jitreleasebinlog/"
|
||||||
ObjectFile=".\MaximalSpeed/"
|
ObjectFile=".\jitreleasebinlog/"
|
||||||
ProgramDataBaseFileName=".\MaximalSpeed/"
|
ProgramDataBaseFileName=".\jitreleasebinlog/"
|
||||||
WarningLevel="3"
|
WarningLevel="3"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
|
DebugInformationFormat="3"
|
||||||
CompileAs="0"/>
|
CompileAs="0"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCustomBuildTool"/>
|
Name="VCCustomBuildTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/MACHINE:I386"
|
AdditionalOptions="/MACHINE:I386"
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
|
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||||
OutputFile="MaximalSpeed/amxmodx_mm.dll"
|
OutputFile="jitreleasebinlog/amxmodx_bl_mm.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="MSVCRT"
|
||||||
ModuleDefinitionFile=""
|
ModuleDefinitionFile=""
|
||||||
ProgramDatabaseFile=".\MaximalSpeede/amxx_mm.pdb"
|
GenerateDebugInformation="TRUE"
|
||||||
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
|
ProgramDatabaseFile=".\jitreleasebinlog/amxmodx_bl_mm.pdb"
|
||||||
|
GenerateMapFile="TRUE"
|
||||||
|
ImportLibrary=".\jitreleasebinlog/amxmodx_bl_mm.lib"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCMIDLTool"
|
Name="VCMIDLTool"
|
||||||
PreprocessorDefinitions="NDEBUG"
|
PreprocessorDefinitions="NDEBUG"
|
||||||
@ -608,6 +334,21 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\amxxlog.cpp">
|
RelativePath="..\amxxlog.cpp">
|
||||||
</File>
|
</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
|
<File
|
||||||
RelativePath="..\CCmd.cpp">
|
RelativePath="..\CCmd.cpp">
|
||||||
</File>
|
</File>
|
||||||
@ -640,12 +381,6 @@
|
|||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CTask.cpp">
|
RelativePath="..\CTask.cpp">
|
||||||
<FileConfiguration
|
|
||||||
Name="JITRelease|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AssemblerOutput="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CVault.cpp">
|
RelativePath="..\CVault.cpp">
|
||||||
@ -658,12 +393,6 @@
|
|||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\fakemeta.cpp">
|
RelativePath="..\fakemeta.cpp">
|
||||||
<FileConfiguration
|
|
||||||
Name="MemtestDebug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
GeneratePreprocessedFile="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\file.cpp">
|
RelativePath="..\file.cpp">
|
||||||
@ -679,10 +408,22 @@
|
|||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
AssemblerOutput="4"/>
|
AssemblerOutput="4"/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITReleaseBinLog|Win32">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AssemblerOutput="4"/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\libraries.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\md5.cpp">
|
RelativePath="..\md5.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\messages.cpp">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\meta_api.cpp">
|
RelativePath="..\meta_api.cpp">
|
||||||
</File>
|
</File>
|
||||||
@ -712,6 +453,12 @@
|
|||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
AssemblerOutput="2"/>
|
AssemblerOutput="2"/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITReleaseBinLog|Win32">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AssemblerOutput="2"/>
|
||||||
|
</FileConfiguration>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\strptime.cpp">
|
RelativePath="..\strptime.cpp">
|
||||||
@ -722,43 +469,9 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\vault.cpp">
|
RelativePath="..\vault.cpp">
|
||||||
</File>
|
</File>
|
||||||
<Filter
|
<File
|
||||||
Name="mmgr"
|
RelativePath="..\vector.cpp">
|
||||||
Filter="">
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\mmgr\mmgr.cpp">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
ExcludedFromBuild="TRUE">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
ExcludedFromBuild="TRUE">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="JITDebug|Win32"
|
|
||||||
ExcludedFromBuild="TRUE">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="JITRelease|Win32"
|
|
||||||
ExcludedFromBuild="TRUE">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="MaximalSpeed|Win32"
|
|
||||||
ExcludedFromBuild="TRUE">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Header Files"
|
Name="Header Files"
|
||||||
@ -778,6 +491,9 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\amxxlog.h">
|
RelativePath="..\amxxlog.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\binlog.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CCmd.h">
|
RelativePath="..\CCmd.h">
|
||||||
</File>
|
</File>
|
||||||
@ -835,12 +551,18 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\format.h">
|
RelativePath="..\format.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\libraries.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\md5.h">
|
RelativePath="..\md5.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\menus.h">
|
RelativePath="..\menus.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\messages.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\modules.h">
|
RelativePath="..\modules.h">
|
||||||
</File>
|
</File>
|
||||||
@ -871,16 +593,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\zlib\zlib.h">
|
RelativePath="..\zlib\zlib.h">
|
||||||
</File>
|
</File>
|
||||||
<Filter
|
|
||||||
Name="mmgr"
|
|
||||||
Filter="">
|
|
||||||
<File
|
|
||||||
RelativePath="..\mmgr\mmgr.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\mmgr\nommgr.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Resource Files"
|
Name="Resource Files"
|
||||||
@ -901,42 +613,28 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\amxjitsn.asm">
|
RelativePath="..\amxjitsn.asm">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\helpers-x86.asm">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\natives-amd64.asm">
|
RelativePath="..\natives-amd64.asm">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\natives-x86.asm">
|
RelativePath="..\natives-x86.asm">
|
||||||
</File>
|
</File>
|
||||||
|
<Filter
|
||||||
|
Name="Builds"
|
||||||
|
Filter="">
|
||||||
|
<File
|
||||||
|
RelativePath="..\Jit\helpers-x86.obj">
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="SDK"
|
Name="SDK"
|
||||||
Filter="">
|
Filter="">
|
||||||
<File
|
<File
|
||||||
RelativePath="..\sdk\amxxmodule.cpp">
|
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
|
<FileConfiguration
|
||||||
Name="JITDebug|Win32"
|
Name="JITDebug|Win32"
|
||||||
ExcludedFromBuild="TRUE">
|
ExcludedFromBuild="TRUE">
|
||||||
@ -950,13 +648,13 @@
|
|||||||
Name="VCCLCompilerTool"/>
|
Name="VCCLCompilerTool"/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
Name="JITMemtestRelease|Win32"
|
Name="JITDebugBinLog|Win32"
|
||||||
ExcludedFromBuild="TRUE">
|
ExcludedFromBuild="TRUE">
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"/>
|
Name="VCCLCompilerTool"/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
Name="MaximalSpeed|Win32"
|
Name="JITReleaseBinLog|Win32"
|
||||||
ExcludedFromBuild="TRUE">
|
ExcludedFromBuild="TRUE">
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"/>
|
Name="VCCLCompilerTool"/>
|
||||||
|
26
amxmodx/msvc8/amxmodx_mm.sln
Normal file
26
amxmodx/msvc8/amxmodx_mm.sln
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
|
# Visual Studio 2005
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx_mm", "amxmodx_mm.vcproj", "{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
JITDebug|Win32 = JITDebug|Win32
|
||||||
|
JITDebugBinLog|Win32 = JITDebugBinLog|Win32
|
||||||
|
JITRelease|Win32 = JITRelease|Win32
|
||||||
|
JITReleaseBinLog|Win32 = JITReleaseBinLog|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug|Win32.ActiveCfg = JITDebug|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug|Win32.Build.0 = JITDebug|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog|Win32.ActiveCfg = JITDebugBinLog|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog|Win32.Build.0 = JITDebugBinLog|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease|Win32.ActiveCfg = JITRelease|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease|Win32.Build.0 = JITRelease|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog|Win32.ActiveCfg = JITReleaseBinLog|Win32
|
||||||
|
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog|Win32.Build.0 = JITReleaseBinLog|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
914
amxmodx/msvc8/amxmodx_mm.vcproj
Normal file
914
amxmodx/msvc8/amxmodx_mm.vcproj
Normal file
@ -0,0 +1,914 @@
|
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="amxmodx_mm"
|
||||||
|
ProjectGUID="{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
|
||||||
|
RootNamespace="amxmodx"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="JITDebug|Win32"
|
||||||
|
OutputDirectory="JITDebug"
|
||||||
|
IntermediateDirectory="JITDebug"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
MkTypLibCompatible="true"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
TargetEnvironment="1"
|
||||||
|
TypeLibraryName=".\debug/amxmodx.tlb"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories=""
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT;_CRT_SECURE_NO_DEPRECATE"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="1"
|
||||||
|
StructMemberAlignment="3"
|
||||||
|
TreatWChar_tAsBuiltInType="true"
|
||||||
|
RuntimeTypeInfo="false"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderThrough="amxmodx.h"
|
||||||
|
PrecompiledHeaderFile=".\jitdebug/amxmodx.pch"
|
||||||
|
AssemblerListingLocation=".\jitdebug/"
|
||||||
|
ObjectFile=".\jitdebug/"
|
||||||
|
ProgramDataBaseFileName=".\jitdebug/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalOptions="/MACHINE:I386"
|
||||||
|
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||||
|
OutputFile="jitdebug/amxmodx_mm.dll"
|
||||||
|
Version="0.1"
|
||||||
|
LinkIncremental="2"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
|
||||||
|
ModuleDefinitionFile=""
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
|
||||||
|
ImportLibrary=".\jitdebug/amxmodx_mm.lib"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="JITRelease|Win32"
|
||||||
|
OutputDirectory="JITRelease"
|
||||||
|
IntermediateDirectory="JITRelease"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
MkTypLibCompatible="true"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
TargetEnvironment="1"
|
||||||
|
TypeLibraryName=".\release/amxmodx.tlb"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
FavorSizeOrSpeed="1"
|
||||||
|
OmitFramePointers="true"
|
||||||
|
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT;ASM32;PAWN_CELL_SIZE=32;_CRT_SECURE_NO_DEPRECATE"
|
||||||
|
IgnoreStandardIncludePath="false"
|
||||||
|
StringPooling="true"
|
||||||
|
RuntimeLibrary="0"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
TreatWChar_tAsBuiltInType="true"
|
||||||
|
RuntimeTypeInfo="false"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderThrough="amxmodx.h"
|
||||||
|
PrecompiledHeaderFile=".\jitrelease/amxmodx.pch"
|
||||||
|
AssemblerListingLocation=".\jitrelease/"
|
||||||
|
ObjectFile=".\jitrelease/"
|
||||||
|
ProgramDataBaseFileName=".\jitrelease/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
CompileAs="0"
|
||||||
|
ShowIncludes="false"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalOptions="/MACHINE:I386"
|
||||||
|
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||||
|
OutputFile="jitrelease/amxmodx_mm.dll"
|
||||||
|
LinkIncremental="1"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
|
||||||
|
ModuleDefinitionFile=""
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile=".\jitrelease/amxmodx_mm.pdb"
|
||||||
|
GenerateMapFile="true"
|
||||||
|
ImportLibrary=".\jitrelease/amxmodx_mm.lib"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="JITDebugBinLog|Win32"
|
||||||
|
OutputDirectory="$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
MkTypLibCompatible="true"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
TargetEnvironment="1"
|
||||||
|
TypeLibraryName=".\debug/amxmodx.tlb"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories=""
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT;BINLOG_ENABLED;_CRT_SECURE_NO_DEPRECATE"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="1"
|
||||||
|
StructMemberAlignment="3"
|
||||||
|
TreatWChar_tAsBuiltInType="true"
|
||||||
|
RuntimeTypeInfo="false"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderThrough="amxmodx.h"
|
||||||
|
PrecompiledHeaderFile=".\jitdebugbinlog/amxmodx.pch"
|
||||||
|
AssemblerListingLocation=".\jitdebugbinlog/"
|
||||||
|
ObjectFile=".\jitdebugbinlog/"
|
||||||
|
ProgramDataBaseFileName=".\jitdebugbinlog/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalOptions="/MACHINE:I386"
|
||||||
|
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||||
|
OutputFile="jitdebugbinlog/amxmodx_bl_mm.dll"
|
||||||
|
Version="0.1"
|
||||||
|
LinkIncremental="2"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
|
||||||
|
ModuleDefinitionFile=""
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile=".\jitdebugbinlog/amxmodx_bl_mm.pdb"
|
||||||
|
ImportLibrary=".\jitdebugbinlog/amxmodx_bl_mm.lib"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="JITReleaseBinLog|Win32"
|
||||||
|
OutputDirectory="$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
MkTypLibCompatible="true"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
TargetEnvironment="1"
|
||||||
|
TypeLibraryName=".\release/amxmodx.tlb"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
FavorSizeOrSpeed="1"
|
||||||
|
OmitFramePointers="true"
|
||||||
|
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT;ASM32;PAWN_CELL_SIZE=32;BINLOG_ENABLED;_CRT_SECURE_NO_DEPRECATE"
|
||||||
|
IgnoreStandardIncludePath="false"
|
||||||
|
StringPooling="true"
|
||||||
|
RuntimeLibrary="0"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
TreatWChar_tAsBuiltInType="true"
|
||||||
|
RuntimeTypeInfo="false"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderThrough="amxmodx.h"
|
||||||
|
PrecompiledHeaderFile=".\jitreleasebinlog/amxmodx.pch"
|
||||||
|
AssemblerListingLocation=".\jitreleasebinlog/"
|
||||||
|
ObjectFile=".\jitreleasebinlog/"
|
||||||
|
ProgramDataBaseFileName=".\jitreleasebinlog/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalOptions="/MACHINE:I386"
|
||||||
|
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
|
||||||
|
OutputFile="jitreleasebinlog/amxmodx_bl_mm.dll"
|
||||||
|
LinkIncremental="1"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||||
|
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
|
||||||
|
ModuleDefinitionFile=""
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile=".\jitreleasebinlog/amxmodx_bl_mm.pdb"
|
||||||
|
GenerateMapFile="true"
|
||||||
|
ImportLibrary=".\jitreleasebinlog/amxmodx_bl_mm.lib"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amx.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxcore.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxdbg.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxmodx.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxtime.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxxfile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxxlog.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\binlog.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITDebug|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITRelease|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CCmd.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CEvent.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CFile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CForward.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CLang.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CLogEvent.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CMenu.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CMisc.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CModule.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CPlugin.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CTask.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CVault.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\debugger.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\emsg.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\fakemeta.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\file.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\float.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\format.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITRelease|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AssemblerOutput="4"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITReleaseBinLog|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AssemblerOutput="4"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\libraries.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\md5.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\messages.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\meta_api.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\modules.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\natives.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\newmenus.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\optimizer.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\power.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\srvcmd.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\string.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITRelease|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AssemblerOutput="2"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITReleaseBinLog|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AssemblerOutput="2"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\strptime.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\util.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\vault.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\vector.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amx.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxdbg.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxmodx.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxxfile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxxlog.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\binlog.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CCmd.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CEvent.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CFile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CForward.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CLang.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CList.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CLogEvent.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CMenu.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CMisc.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CModule.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CPlugin.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CQueue.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CString.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CTask.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CVault.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CVector.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\debugger.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\fakemeta.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\format.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\libraries.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\md5.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\menus.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\messages.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\modules.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\natives.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\newmenus.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\optimizer.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\resource.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\sh_list.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\sh_stack.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\sh_tinyhash.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\zlib\zconf.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\zlib\zlib.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="rc"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\version.rc"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Assembly"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxdefn.asm"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxexecn.asm"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\amxjitsn.asm"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\helpers-x86.asm"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\natives-amd64.asm"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\natives-x86.asm"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<Filter
|
||||||
|
Name="Builds"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Jit\helpers-x86.obj"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="SDK"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\sdk\amxxmodule.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITDebug|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITRelease|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITDebugBinLog|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="JITReleaseBinLog|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\sdk\amxxmodule.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\sdk\moduleconfig.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
@ -32,6 +32,7 @@
|
|||||||
#include "sh_stack.h"
|
#include "sh_stack.h"
|
||||||
#include "natives.h"
|
#include "natives.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
#include "libraries.h"
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
@ -47,7 +48,6 @@
|
|||||||
CStack<int> g_ErrorStk;
|
CStack<int> g_ErrorStk;
|
||||||
CVector<regnative *> g_RegNatives;
|
CVector<regnative *> g_RegNatives;
|
||||||
CStack<regnative *> g_NativeStack;
|
CStack<regnative *> g_NativeStack;
|
||||||
CVector<String> g_Libraries;
|
|
||||||
static char g_errorStr[512] = {0};
|
static char g_errorStr[512] = {0};
|
||||||
bool g_Initialized = false;
|
bool g_Initialized = false;
|
||||||
|
|
||||||
@ -68,10 +68,27 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//parameter stack
|
|
||||||
pNative->caller = amx;
|
|
||||||
|
|
||||||
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(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;
|
int err = 0;
|
||||||
cell ret = 0;
|
cell ret = 0;
|
||||||
@ -112,6 +129,8 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
|||||||
g_NativeStack.pop();
|
g_NativeStack.pop();
|
||||||
g_ErrorStk.pop();
|
g_ErrorStk.pop();
|
||||||
|
|
||||||
|
pNative->caller = NULL;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -343,7 +362,7 @@ static cell AMX_NATIVE_CALL register_library(AMX *amx, cell *params)
|
|||||||
int len;
|
int len;
|
||||||
char *lib = get_amxstring(amx, params[1], 0, len);
|
char *lib = get_amxstring(amx, params[1], 0, len);
|
||||||
|
|
||||||
AddPluginLibrary(lib);
|
AddLibrary(lib, LibType_Library, LibSource_Plugin, g_plugins.findPluginFast(amx));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -370,6 +389,7 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
|
|||||||
regnative *pNative = new regnative;
|
regnative *pNative = new regnative;
|
||||||
pNative->amx = amx;
|
pNative->amx = amx;
|
||||||
pNative->func = idx;
|
pNative->func = idx;
|
||||||
|
pNative->caller = NULL;
|
||||||
|
|
||||||
//we'll apply a safety buffer too
|
//we'll apply a safety buffer too
|
||||||
//make our function
|
//make our function
|
||||||
@ -396,27 +416,9 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
|
|||||||
return 1;
|
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()
|
void ClearPluginLibraries()
|
||||||
{
|
{
|
||||||
g_Libraries.clear();
|
ClearLibraries(LibSource_Plugin);
|
||||||
|
|
||||||
for (size_t i=0; i<g_RegNatives.size(); i++)
|
for (size_t i=0; i<g_RegNatives.size(); i++)
|
||||||
{
|
{
|
||||||
delete [] g_RegNatives[i]->pfn;
|
delete [] g_RegNatives[i]->pfn;
|
||||||
|
@ -61,9 +61,7 @@ extern "C" int amxx_DynaFunc(AMX *amx, cell *params);
|
|||||||
extern "C" int amxx_DynaCodesize();
|
extern "C" int amxx_DynaCodesize();
|
||||||
|
|
||||||
AMX_NATIVE_INFO *BuildNativeTable();
|
AMX_NATIVE_INFO *BuildNativeTable();
|
||||||
void AddPluginLibrary(const char *name);
|
|
||||||
void ClearPluginLibraries();
|
void ClearPluginLibraries();
|
||||||
bool LibraryExists(const char *name);
|
|
||||||
|
|
||||||
//I couldn't resist :)
|
//I couldn't resist :)
|
||||||
extern AMX_NATIVE_INFO g_NativeNatives[];
|
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 (num_pages == 1 || !items_per_page)
|
||||||
{
|
{
|
||||||
if (m_AlwaysExit && key > m_Items.size())
|
if (key > m_Items.size())
|
||||||
return MENU_EXIT;
|
return MENU_EXIT;
|
||||||
else
|
else
|
||||||
return key-1;
|
return key-1;
|
||||||
@ -221,10 +221,18 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
|
|||||||
m_Text.clear();
|
m_Text.clear();
|
||||||
|
|
||||||
char buffer[255];
|
char buffer[255];
|
||||||
if (m_AutoColors)
|
if (items_per_page && (pages != 1))
|
||||||
_snprintf(buffer, sizeof(buffer)-1, "\\y%s %d/%d\n\\w\n", m_Title.c_str(), page + 1, pages);
|
{
|
||||||
else
|
if (m_AutoColors)
|
||||||
_snprintf(buffer, sizeof(buffer)-1, "%s %d/%d\n\n", m_Title.c_str(), page + 1, pages);
|
_snprintf(buffer, sizeof(buffer)-1, "\\y%s %d/%d\n\\w\n", m_Title.c_str(), page + 1, pages);
|
||||||
|
else
|
||||||
|
_snprintf(buffer, sizeof(buffer)-1, "%s %d/%d\n\n", m_Title.c_str(), page + 1, pages);
|
||||||
|
} else {
|
||||||
|
if (m_AutoColors)
|
||||||
|
_snprintf(buffer, sizeof(buffer)-1, "\\y%s\n\\w\n", m_Title.c_str());
|
||||||
|
else
|
||||||
|
_snprintf(buffer, sizeof(buffer)-1, "%s\n\n", m_Title.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
m_Text.append(buffer);
|
m_Text.append(buffer);
|
||||||
|
|
||||||
@ -751,6 +759,39 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
|
|||||||
return 0; } \
|
return 0; } \
|
||||||
Menu *pMenu = g_NewMenus[p];
|
Menu *pMenu = g_NewMenus[p];
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL menu_cancel(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
int index = params[1];
|
||||||
|
|
||||||
|
if (index < 1 || index > gpGlobals->maxClients)
|
||||||
|
{
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "Player %d is not valid", index);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CPlayer *player = GET_PLAYER_POINTER_I(index);
|
||||||
|
if (!player->ingame)
|
||||||
|
{
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "Played %d is not in game", index);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int menu = player->newmenu;
|
||||||
|
if (menu < 0 || menu >= (int)g_NewMenus.size() || !g_NewMenus[menu])
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
Menu *pMenu = g_NewMenus[menu];
|
||||||
|
|
||||||
|
player->newmenu = -1;
|
||||||
|
player->menu = 0;
|
||||||
|
executeForwards(pMenu->func,
|
||||||
|
static_cast<cell>(index),
|
||||||
|
static_cast<cell>(pMenu->thisId),
|
||||||
|
static_cast<cell>(MENU_EXIT));
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
GETMENU_R(params[1]);
|
GETMENU_R(params[1]);
|
||||||
@ -766,12 +807,12 @@ static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
|
|||||||
player = GET_PLAYER_POINTER_I(i);
|
player = GET_PLAYER_POINTER_I(i);
|
||||||
if (player->newmenu == pMenu->thisId)
|
if (player->newmenu == pMenu->thisId)
|
||||||
{
|
{
|
||||||
|
player->newmenu = -1;
|
||||||
|
player->menu = 0;
|
||||||
executeForwards(pMenu->func,
|
executeForwards(pMenu->func,
|
||||||
static_cast<cell>(i),
|
static_cast<cell>(i),
|
||||||
static_cast<cell>(pMenu->thisId),
|
static_cast<cell>(pMenu->thisId),
|
||||||
static_cast<cell>(MENU_EXIT));
|
static_cast<cell>(MENU_EXIT));
|
||||||
player->newmenu = -1;
|
|
||||||
player->menu = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_NewMenus[params[1]] = NULL;
|
g_NewMenus[params[1]] = NULL;
|
||||||
@ -824,6 +865,7 @@ AMX_NATIVE_INFO g_NewMenuNatives[] =
|
|||||||
{"menu_item_setname", menu_item_setname},
|
{"menu_item_setname", menu_item_setname},
|
||||||
{"menu_destroy", menu_destroy},
|
{"menu_destroy", menu_destroy},
|
||||||
{"menu_setprop", menu_setprop},
|
{"menu_setprop", menu_setprop},
|
||||||
|
{"menu_cancel", menu_cancel},
|
||||||
{"player_menu_info", player_menu_info},
|
{"player_menu_info", player_menu_info},
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "optimizer.h"
|
#include "optimizer.h"
|
||||||
|
|
||||||
|
int g_opt_level = 0;
|
||||||
|
|
||||||
#define OP_SYSREQ_C 123
|
#define OP_SYSREQ_C 123
|
||||||
#define OP_NOP 134
|
#define OP_NOP 134
|
||||||
#define OP_FLOAT_MUL 138
|
#define OP_FLOAT_MUL 138
|
||||||
@ -83,13 +85,31 @@ void _Setup_Optimizer_Stage2(AMX *amx, cell *oplist, cell *cip)
|
|||||||
|
|
||||||
amx->usertags[UT_OPTIMIZER] = (void *)opt;
|
amx->usertags[UT_OPTIMIZER] = (void *)opt;
|
||||||
|
|
||||||
FIND_NATIVE("floatmul", N_Float_Mul);
|
if (g_opt_level & 1)
|
||||||
FIND_NATIVE("floatdiv", N_Float_Div);
|
{
|
||||||
FIND_NATIVE("floatadd", N_Float_Add);
|
FIND_NATIVE("floatmul", N_Float_Mul);
|
||||||
FIND_NATIVE("floatsub", N_Float_Sub);
|
FIND_NATIVE("floatdiv", N_Float_Div);
|
||||||
FIND_NATIVE("float", N_Float_To);
|
FIND_NATIVE("floatadd", N_Float_Add);
|
||||||
FIND_NATIVE("floatround", N_Float_Round);
|
FIND_NATIVE("floatsub", N_Float_Sub);
|
||||||
FIND_NATIVE("floatcmp", N_Float_Cmp);
|
}
|
||||||
|
if (g_opt_level & 4)
|
||||||
|
{
|
||||||
|
FIND_NATIVE("float", N_Float_To);
|
||||||
|
FIND_NATIVE("floatround", N_Float_Round);
|
||||||
|
}
|
||||||
|
if (g_opt_level & 2)
|
||||||
|
{
|
||||||
|
#if !defined AMD64
|
||||||
|
if (amxx_CpuSupport())
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
FIND_NATIVE("floatcmp", N_Float_Cmp);
|
||||||
|
#if !defined AMD64
|
||||||
|
} else {
|
||||||
|
g_opt_level &= ~(2);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
//we don't do these yet because of radix stuff >:\
|
//we don't do these yet because of radix stuff >:\
|
||||||
//FIND_NATIVE("floatsin", N_Float_Sin);
|
//FIND_NATIVE("floatsin", N_Float_Sin);
|
||||||
//FIND_NATIVE("floatcos", N_Float_Cos);
|
//FIND_NATIVE("floatcos", N_Float_Cos);
|
||||||
|
@ -22,5 +22,8 @@ struct optimizer_s
|
|||||||
};
|
};
|
||||||
|
|
||||||
void SetupOptimizer(AMX *amx);
|
void SetupOptimizer(AMX *amx);
|
||||||
|
extern "C" int amxx_CpuSupport();
|
||||||
|
|
||||||
|
extern int g_opt_level;
|
||||||
|
|
||||||
#endif //_INCLUDE_AMXMODX_OPTIMIZER_H
|
#endif //_INCLUDE_AMXMODX_OPTIMIZER_H
|
||||||
|
@ -2430,7 +2430,9 @@ static amxx_module_info_s g_ModuleInfo =
|
|||||||
#else // MODULE_RELOAD_ON_MAPCHANGE
|
#else // MODULE_RELOAD_ON_MAPCHANGE
|
||||||
0,
|
0,
|
||||||
#endif // MODULE_RELOAD_ON_MAPCHANGE
|
#endif // MODULE_RELOAD_ON_MAPCHANGE
|
||||||
MODULE_LOGTAG
|
MODULE_LOGTAG,
|
||||||
|
MODULE_LIBRARY,
|
||||||
|
MODULE_LIBCLASS
|
||||||
};
|
};
|
||||||
|
|
||||||
// Storage for the requested functions
|
// Storage for the requested functions
|
||||||
@ -2506,6 +2508,13 @@ PFN_SET_TEAM_INFO g_fn_SetTeamInfo;
|
|||||||
PFN_PLAYER_PROP_ADDR g_fn_PlayerPropAddr;
|
PFN_PLAYER_PROP_ADDR g_fn_PlayerPropAddr;
|
||||||
PFN_REG_AUTH_FUNC g_fn_RegAuthFunc;
|
PFN_REG_AUTH_FUNC g_fn_RegAuthFunc;
|
||||||
PFN_UNREG_AUTH_FUNC g_fn_UnregAuthFunc;
|
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;
|
||||||
|
|
||||||
// *** Exports ***
|
// *** Exports ***
|
||||||
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
||||||
@ -2556,6 +2565,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|||||||
REQFUNC("MergeDefinitionFile", g_fn_MergeDefinition_File, PFN_MERGEDEFINITION_FILE);
|
REQFUNC("MergeDefinitionFile", g_fn_MergeDefinition_File, PFN_MERGEDEFINITION_FILE);
|
||||||
REQFUNC("Format", g_fn_Format, PFN_FORMAT);
|
REQFUNC("Format", g_fn_Format, PFN_FORMAT);
|
||||||
REQFUNC("RegisterFunction", g_fn_RegisterFunction, PFN_REGISTERFUNCTION);
|
REQFUNC("RegisterFunction", g_fn_RegisterFunction, PFN_REGISTERFUNCTION);
|
||||||
|
REQFUNC("RegisterFunctionEx", g_fn_RegisterFunctionEx, PFN_REGISTERFUNCTIONEX);
|
||||||
|
|
||||||
// Amx scripts
|
// Amx scripts
|
||||||
REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT);
|
REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT);
|
||||||
@ -2620,6 +2630,14 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|||||||
REQFUNC("RegAuthFunc", g_fn_RegAuthFunc, PFN_REG_AUTH_FUNC);
|
REQFUNC("RegAuthFunc", g_fn_RegAuthFunc, PFN_REG_AUTH_FUNC);
|
||||||
REQFUNC("UnregAuthFunc", g_fn_UnregAuthFunc, PFN_UNREG_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);
|
||||||
|
|
||||||
#ifdef MEMORY_TEST
|
#ifdef MEMORY_TEST
|
||||||
// Memory
|
// Memory
|
||||||
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
|
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
|
||||||
@ -2654,14 +2672,27 @@ C_DLLEXPORT int AMXX_PluginsLoaded()
|
|||||||
return AMXX_OK;
|
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
|
// Advanced MF functions
|
||||||
void MF_Log(const char *fmt, ...)
|
void MF_Log(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
// :TODO: Overflow possible here
|
|
||||||
char msg[3072];
|
char msg[3072];
|
||||||
va_list arglst;
|
va_list arglst;
|
||||||
va_start(arglst, fmt);
|
va_start(arglst, fmt);
|
||||||
vsprintf(msg, fmt, arglst);
|
vsnprintf(msg, sizeof(msg) - 1, fmt, arglst);
|
||||||
va_end(arglst);
|
va_end(arglst);
|
||||||
|
|
||||||
g_fn_Log("[%s] %s", MODULE_LOGTAG, msg);
|
g_fn_Log("[%s] %s", MODULE_LOGTAG, msg);
|
||||||
@ -2669,11 +2700,10 @@ void MF_Log(const char *fmt, ...)
|
|||||||
|
|
||||||
void MF_LogError(AMX *amx, int err, const char *fmt, ...)
|
void MF_LogError(AMX *amx, int err, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
// :TODO: Overflow possible here
|
|
||||||
char msg[3072];
|
char msg[3072];
|
||||||
va_list arglst;
|
va_list arglst;
|
||||||
va_start(arglst, fmt);
|
va_start(arglst, fmt);
|
||||||
vsprintf(msg, fmt, arglst);
|
vsnprintf(msg, sizeof(msg) - 1, fmt, arglst);
|
||||||
va_end(arglst);
|
va_end(arglst);
|
||||||
|
|
||||||
g_fn_LogErrorFunc(amx, err, "[%s] %s", MODULE_LOGTAG, msg);
|
g_fn_LogErrorFunc(amx, err, "[%s] %s", MODULE_LOGTAG, msg);
|
||||||
@ -2741,10 +2771,15 @@ void ValidateMacros_DontCallThis_Smiley()
|
|||||||
MF_GetPlayerEdict(0);
|
MF_GetPlayerEdict(0);
|
||||||
MF_Format("", 4, "str");
|
MF_Format("", 4, "str");
|
||||||
MF_RegisterFunction(NULL, "");
|
MF_RegisterFunction(NULL, "");
|
||||||
|
MF_RegisterFunctionEx(NULL, "");
|
||||||
MF_SetPlayerTeamInfo(0, 0, "");
|
MF_SetPlayerTeamInfo(0, 0, "");
|
||||||
MF_PlayerPropAddr(0, 0);
|
MF_PlayerPropAddr(0, 0);
|
||||||
MF_RegAuthFunc(NULL);
|
MF_RegAuthFunc(NULL);
|
||||||
MF_UnregAuthFunc(NULL);
|
MF_UnregAuthFunc(NULL);
|
||||||
|
MF_FindLibrary(NULL, LibType_Class);
|
||||||
|
MF_AddLibraries(NULL, LibType_Class, NULL);
|
||||||
|
MF_RemoveLibraries(NULL);
|
||||||
|
MF_OverrideNatives(NULL, NULL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -34,7 +34,8 @@
|
|||||||
// module interface version was 1
|
// module interface version was 1
|
||||||
// 2 - added logtag to struct (amxx1.1-rc1)
|
// 2 - added logtag to struct (amxx1.1-rc1)
|
||||||
// 3 - added new tagAMX structure (amxx1.5)
|
// 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
|
// amxx module info
|
||||||
struct amxx_module_info_s
|
struct amxx_module_info_s
|
||||||
@ -44,6 +45,8 @@ struct amxx_module_info_s
|
|||||||
const char *version;
|
const char *version;
|
||||||
int reload; // reload on mapchange when nonzero
|
int reload; // reload on mapchange when nonzero
|
||||||
const char *logtag; // added in version 2
|
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
|
// return values from functions called by amxx
|
||||||
@ -153,9 +156,137 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined _MSC_VER
|
#if defined _MSC_VER
|
||||||
#pragma warning(disable:4103) /* disable warning message 4103 that complains
|
#pragma warning(disable:4103) /* disable warning message 4103 that complains
|
||||||
* about pragma pack in a header file */
|
* about pragma pack in a header file */
|
||||||
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
|
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
|
||||||
|
|
||||||
|
#if _MSC_VER >= 1400
|
||||||
|
#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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -1904,6 +2035,14 @@ void FN_AMXX_DETACH(void);
|
|||||||
void FN_AMXX_PLUGINSLOADED(void);
|
void FN_AMXX_PLUGINSLOADED(void);
|
||||||
#endif // FN_AMXX_PLUGINSLOADED
|
#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 ***
|
// *** Types ***
|
||||||
typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
|
typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
|
||||||
|
|
||||||
@ -1950,6 +2089,12 @@ enum PlayerProp
|
|||||||
Player_NewmenuPage, //int
|
Player_NewmenuPage, //int
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum LibType
|
||||||
|
{
|
||||||
|
LibType_Library,
|
||||||
|
LibType_Class
|
||||||
|
};
|
||||||
|
|
||||||
typedef void (*AUTHORIZEFUNC)(int player, const char *authstring);
|
typedef void (*AUTHORIZEFUNC)(int player, const char *authstring);
|
||||||
|
|
||||||
typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/);
|
typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/);
|
||||||
@ -2031,6 +2176,13 @@ typedef int (*PFN_AMX_PUSH) (AMX * /*amx*/, cell /*value*/);
|
|||||||
typedef int (*PFN_SET_TEAM_INFO) (int /*player */, int /*teamid */, const char * /*name */);
|
typedef int (*PFN_SET_TEAM_INFO) (int /*player */, int /*teamid */, const char * /*name */);
|
||||||
typedef void (*PFN_REG_AUTH_FUNC) (AUTHORIZEFUNC);
|
typedef void (*PFN_REG_AUTH_FUNC) (AUTHORIZEFUNC);
|
||||||
typedef void (*PFN_UNREG_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*/);
|
||||||
|
|
||||||
extern PFN_ADD_NATIVES g_fn_AddNatives;
|
extern PFN_ADD_NATIVES g_fn_AddNatives;
|
||||||
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
||||||
@ -2098,6 +2250,13 @@ extern PFN_SET_TEAM_INFO g_fn_SetTeamInfo;
|
|||||||
extern PFN_PLAYER_PROP_ADDR g_fn_PlayerPropAddr;
|
extern PFN_PLAYER_PROP_ADDR g_fn_PlayerPropAddr;
|
||||||
extern PFN_REG_AUTH_FUNC g_fn_RegAuthFunc;
|
extern PFN_REG_AUTH_FUNC g_fn_RegAuthFunc;
|
||||||
extern PFN_UNREG_AUTH_FUNC g_fn_UnregAuthFunc;
|
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;
|
||||||
|
|
||||||
#ifdef MAY_NEVER_BE_DEFINED
|
#ifdef MAY_NEVER_BE_DEFINED
|
||||||
// Function prototypes for intellisense and similar systems
|
// Function prototypes for intellisense and similar systems
|
||||||
@ -2162,6 +2321,13 @@ int MF_SetPlayerTeamInfo (int id, int teamid, const char *teamname) { }
|
|||||||
void * MF_PlayerPropAddr (int id, int prop) { }
|
void * MF_PlayerPropAddr (int id, int prop) { }
|
||||||
void MF_RegAuthFunc (AUTHORIZEFUNC fn) { }
|
void MF_RegAuthFunc (AUTHORIZEFUNC fn) { }
|
||||||
void MF_UnregAuthFunc (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) { }
|
||||||
#endif // MAY_NEVER_BE_DEFINED
|
#endif // MAY_NEVER_BE_DEFINED
|
||||||
|
|
||||||
#define MF_AddNatives g_fn_AddNatives
|
#define MF_AddNatives g_fn_AddNatives
|
||||||
@ -2231,6 +2397,13 @@ void MF_LogError(AMX *amx, int err, const char *fmt, ...);
|
|||||||
#define MF_PlayerPropAddr g_fn_PlayerPropAddr
|
#define MF_PlayerPropAddr g_fn_PlayerPropAddr
|
||||||
#define MF_RegAuthFunc g_fn_RegAuthFunc
|
#define MF_RegAuthFunc g_fn_RegAuthFunc
|
||||||
#define MF_UnregAuthFunc g_fn_UnregAuthFunc
|
#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
|
||||||
|
|
||||||
#ifdef MEMORY_TEST
|
#ifdef MEMORY_TEST
|
||||||
/*** Memory ***/
|
/*** Memory ***/
|
||||||
|
@ -3,12 +3,24 @@
|
|||||||
#ifndef __MODULECONFIG_H__
|
#ifndef __MODULECONFIG_H__
|
||||||
#define __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_NAME "--ENTER NAME HERE--"
|
||||||
#define MODULE_VERSION "--ENTER VERSION HERE--"
|
#define MODULE_VERSION "--ENTER VERSION HERE--"
|
||||||
#define MODULE_AUTHOR "--ENTER AUTHOR HERE--"
|
#define MODULE_AUTHOR "--ENTER AUTHOR HERE--"
|
||||||
#define MODULE_URL "--ENTER URL HERE--"
|
#define MODULE_URL "--ENTER URL HERE--"
|
||||||
#define MODULE_LOGTAG "--ENTER LOGTAG 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
|
// If you want the module not to be reloaded on mapchange, remove / comment out the next line
|
||||||
#define MODULE_RELOAD_ON_MAPCHANGE
|
#define MODULE_RELOAD_ON_MAPCHANGE
|
||||||
|
|
||||||
@ -31,18 +43,35 @@
|
|||||||
// It allows you to compile without libstdc++.so as a dependency
|
// It allows you to compile without libstdc++.so as a dependency
|
||||||
// #define NO_ALLOC_OVERRIDES
|
// #define NO_ALLOC_OVERRIDES
|
||||||
|
|
||||||
// - AMXX Init functions
|
// Uncomment this if you are using MSVC8 or greater and want to fix some of the compatibility issues yourself
|
||||||
// Also consider using FN_META_*
|
// #define NO_MSVC8_AUTO_COMPAT
|
||||||
// AMXX query
|
|
||||||
|
/**
|
||||||
|
* AMXX Init functions
|
||||||
|
* Also consider using FN_META_*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** AMXX query */
|
||||||
//#define FN_AMXX_QUERY OnAmxxQuery
|
//#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
|
//#define FN_AMXX_ATTACH OnAmxxAttach
|
||||||
// AMXX detach
|
|
||||||
|
/** AMXX Detach (unload) */
|
||||||
//#define FN_AMXX_DETACH OnAmxxDetach
|
//#define FN_AMXX_DETACH OnAmxxDetach
|
||||||
// All plugins loaded
|
|
||||||
// Do forward functions init here (MF_RegisterForward)
|
/** All plugins loaded
|
||||||
// #define FN_AMXX_PLUGINSLOADED OnPluginsLoaded
|
* 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 ****/
|
/**** METAMOD ****/
|
||||||
// If your module doesn't use metamod, you may close the file now :)
|
// If your module doesn't use metamod, you may close the file now :)
|
||||||
|
@ -11,6 +11,13 @@
|
|||||||
#ifndef _INCLUDE_SMM_LIST_H
|
#ifndef _INCLUDE_SMM_LIST_H
|
||||||
#define _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 <new>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ void amx_command()
|
|||||||
{
|
{
|
||||||
|
|
||||||
print_srvconsole("Currently loaded plugins:\n");
|
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 plugins = 0;
|
||||||
int running = 0;
|
int running = 0;
|
||||||
@ -52,7 +52,7 @@ void amx_command()
|
|||||||
if ((*a).isValid() && !(*a).isPaused())
|
if ((*a).isValid() && !(*a).isPaused())
|
||||||
++running;
|
++running;
|
||||||
|
|
||||||
print_srvconsole(" [%3d] %-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;
|
++a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
|
#include "binlog.h"
|
||||||
|
|
||||||
const char* stristr(const char* str, const char* substr)
|
const char* stristr(const char* str, const char* substr)
|
||||||
{
|
{
|
||||||
@ -57,7 +58,18 @@ const char* stristr(const char* str, const char* substr)
|
|||||||
|
|
||||||
char* format_amxstring(AMX *amx, cell *params, int parm, int& len)
|
char* format_amxstring(AMX *amx, cell *params, int parm, int& len)
|
||||||
{
|
{
|
||||||
|
#if !defined BINLOG_ENABLED
|
||||||
return g_langMngr.FormatAmxString(amx, params, parm, len);
|
return g_langMngr.FormatAmxString(amx, params, parm, len);
|
||||||
|
#else
|
||||||
|
char *ans = g_langMngr.FormatAmxString(amx, params, parm, len);
|
||||||
|
if (g_binlog_level & 4)
|
||||||
|
{
|
||||||
|
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
|
||||||
|
if (pl)
|
||||||
|
g_BinLog.WriteOp(BinLog_FormatString, pl->getId(), parm, len, ans);
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int amxstring_len(cell* a)
|
int amxstring_len(cell* a)
|
||||||
@ -80,6 +92,15 @@ int set_amxstring(AMX *amx, cell amx_addr, const char *source, int max)
|
|||||||
register cell* dest = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
|
register cell* dest = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
|
||||||
register cell* start = dest;
|
register cell* start = dest;
|
||||||
|
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
if (g_binlog_level & 2)
|
||||||
|
{
|
||||||
|
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
|
||||||
|
if (pl)
|
||||||
|
g_BinLog.WriteOp(BinLog_SetString, pl->getId(), amx_addr, max, source);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
while (max-- && *source)
|
while (max-- && *source)
|
||||||
*dest++ = (cell)*source++;
|
*dest++ = (cell)*source++;
|
||||||
|
|
||||||
@ -99,6 +120,15 @@ extern "C" size_t get_amxstring_r(AMX *amx, cell amx_addr, char *destination, in
|
|||||||
|
|
||||||
*dest = '\0';
|
*dest = '\0';
|
||||||
|
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
if (g_binlog_level & 2)
|
||||||
|
{
|
||||||
|
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
|
||||||
|
if (pl)
|
||||||
|
g_BinLog.WriteOp(BinLog_GetString, pl->getId(), amx_addr, destination);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return dest - start;
|
return dest - start;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,6 +143,15 @@ char* get_amxstring(AMX *amx, cell amx_addr, int id, int& len)
|
|||||||
|
|
||||||
len = --dest - start;
|
len = --dest - start;
|
||||||
|
|
||||||
|
#if defined BINLOG_ENABLED
|
||||||
|
if (g_binlog_level & 2)
|
||||||
|
{
|
||||||
|
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
|
||||||
|
if (pl)
|
||||||
|
g_BinLog.WriteOp(BinLog_GetString, pl->getId(), amx_addr, start);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -757,7 +796,7 @@ do_copy:
|
|||||||
i++;
|
i++;
|
||||||
const char *start = had_quotes ? &(string[beg+1]) : &(string[beg]);
|
const char *start = had_quotes ? &(string[beg+1]) : &(string[beg]);
|
||||||
size_t _end = had_quotes ? (i==len-1 ? 1 : 2) : 0;
|
size_t _end = had_quotes ? (i==len-1 ? 1 : 2) : 0;
|
||||||
size_t end = (pos - _end > LeftMax) ? LeftMax : pos - _end;
|
size_t end = (pos - _end > (size_t)LeftMax) ? (size_t)LeftMax : pos - _end;
|
||||||
size_t to_go = end-beg;
|
size_t to_go = end-beg;
|
||||||
if (end && to_go)
|
if (end && to_go)
|
||||||
{
|
{
|
||||||
@ -765,7 +804,7 @@ do_copy:
|
|||||||
*left++ = (cell)*start++;
|
*left++ = (cell)*start++;
|
||||||
}
|
}
|
||||||
*left = '\0';
|
*left = '\0';
|
||||||
end = (len-i+1 > RightMax) ? RightMax : len-i+1;
|
end = (len-i+1 > (size_t)RightMax) ? (size_t)RightMax : len-i+1;
|
||||||
if (end)
|
if (end)
|
||||||
{
|
{
|
||||||
start = &(string[i]);
|
start = &(string[i]);
|
||||||
@ -793,7 +832,7 @@ static cell AMX_NATIVE_CALL format_args(AMX *amx, cell *params)
|
|||||||
|
|
||||||
if (pos < 0)
|
if (pos < 0)
|
||||||
{
|
{
|
||||||
amx_RaiseError(amx, AMX_ERR_NATIVE);
|
LogError(amx, AMX_ERR_NATIVE, "Pos has to be a positive number");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -934,6 +973,67 @@ static cell AMX_NATIVE_CALL n_strfind(AMX *amx, cell *params)
|
|||||||
return (find - str);
|
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[] =
|
AMX_NATIVE_INFO string_Natives[] =
|
||||||
{
|
{
|
||||||
{"add", add},
|
{"add", add},
|
||||||
@ -969,5 +1069,6 @@ AMX_NATIVE_INFO string_Natives[] =
|
|||||||
{"strcmp", n_strcmp},
|
{"strcmp", n_strcmp},
|
||||||
{"str_to_float", str_to_float},
|
{"str_to_float", str_to_float},
|
||||||
{"float_to_str", float_to_str},
|
{"float_to_str", float_to_str},
|
||||||
|
{"vformat", vformat},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
@ -14,6 +14,16 @@
|
|||||||
#define strnicmp strncasecmp
|
#define strnicmp strncasecmp
|
||||||
#endif
|
#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
|
// this file does not include amxmodx.h, so we have to include the memory manager here
|
||||||
#ifdef MEMORY_TEST
|
#ifdef MEMORY_TEST
|
||||||
#include "mmgr/mmgr.h"
|
#include "mmgr/mmgr.h"
|
||||||
|
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.
|
// Microsoft Visual C++ generated resource script.
|
||||||
//
|
//
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
#define APSTUDIO_READONLY_SYMBOLS
|
#define APSTUDIO_READONLY_SYMBOLS
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
@ -27,8 +26,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,7,0,0
|
FILEVERSION 1,7,5,1
|
||||||
PRODUCTVERSION 1,7,0,0
|
PRODUCTVERSION 1,7,5,1
|
||||||
FILEFLAGSMASK 0x17L
|
FILEFLAGSMASK 0x17L
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@ -45,12 +44,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "Comments", "AMX Mod X"
|
VALUE "Comments", "AMX Mod X"
|
||||||
VALUE "FileDescription", "AMX Mod X"
|
VALUE "FileDescription", "AMX Mod X"
|
||||||
VALUE "FileVersion", "1.70"
|
VALUE "FileVersion", "1.75a"
|
||||||
VALUE "InternalName", "amxmodx"
|
VALUE "InternalName", "amxmodx"
|
||||||
VALUE "LegalCopyright", "Copyright (c) 2004-2006, AMX Mod X Dev Team"
|
VALUE "LegalCopyright", "Copyright (c) 2004-2006, AMX Mod X Dev Team"
|
||||||
VALUE "OriginalFilename", "amxmodx_mm.dll"
|
VALUE "OriginalFilename", "amxmodx_mm.dll"
|
||||||
VALUE "ProductName", "AMX Mod X"
|
VALUE "ProductName", "AMX Mod X"
|
||||||
VALUE "ProductVersion", "1.70"
|
VALUE "ProductVersion", "1.75a"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
Binary file not shown.
@ -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("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)
|
if (argc < 2)
|
||||||
{
|
{
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
#ifndef _AMXXSC_INCLUDE_H
|
#ifndef _AMXXSC_INCLUDE_H
|
||||||
#define _AMXXSC_INCLUDE_H
|
#define _AMXXSC_INCLUDE_H
|
||||||
|
|
||||||
#define VERSION_STRING "1.70-300"
|
#define VERSION_STRING "1.75-300"
|
||||||
#define VERSION 03000
|
|
||||||
#define MAGIC_HEADER 0x414D5842
|
|
||||||
#define MAGIC_HEADER2 0x414D5858
|
#define MAGIC_HEADER2 0x414D5858
|
||||||
#define MAGIC_VERSION 0x0300
|
#define MAGIC_VERSION 0x0300
|
||||||
|
|
||||||
|
@ -61,6 +61,8 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include "sc.h"
|
#include "sc.h"
|
||||||
#define VERSION_STR "3.0.3367-amxx"
|
#define VERSION_STR "3.0.3367-amxx"
|
||||||
#define VERSION_INT 0x300
|
#define VERSION_INT 0x300
|
||||||
@ -125,6 +127,7 @@ static void dostate(void);
|
|||||||
static void addwhile(int *ptr);
|
static void addwhile(int *ptr);
|
||||||
static void delwhile(void);
|
static void delwhile(void);
|
||||||
static int *readwhile(void);
|
static int *readwhile(void);
|
||||||
|
static void inst_datetime_defines(void);
|
||||||
|
|
||||||
static int lastst = 0; /* last executed statement type */
|
static int lastst = 0; /* last executed statement type */
|
||||||
static int nestlevel = 0; /* number of active (open) compound statements */
|
static int nestlevel = 0; /* number of active (open) compound statements */
|
||||||
@ -382,6 +385,23 @@ long pc_lengthbin(void *handle)
|
|||||||
|
|
||||||
#endif /* !defined NO_MAIN */
|
#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
|
/* "main" of the compiler
|
||||||
*/
|
*/
|
||||||
@ -531,7 +551,7 @@ int pc_compile(int argc, char *argv[])
|
|||||||
delete_symbols(&glbtab,0,TRUE,FALSE);
|
delete_symbols(&glbtab,0,TRUE,FALSE);
|
||||||
#if !defined NO_DEFINE
|
#if !defined NO_DEFINE
|
||||||
delete_substtable();
|
delete_substtable();
|
||||||
insert_subst("__DATE__", "\"" __DATE__ "\"", 8);
|
inst_datetime_defines();
|
||||||
#endif
|
#endif
|
||||||
resetglobals();
|
resetglobals();
|
||||||
sc_ctrlchar=sc_ctrlchar_org;
|
sc_ctrlchar=sc_ctrlchar_org;
|
||||||
@ -595,7 +615,7 @@ int pc_compile(int argc, char *argv[])
|
|||||||
delete_symbols(&glbtab,0,TRUE,FALSE);
|
delete_symbols(&glbtab,0,TRUE,FALSE);
|
||||||
#if !defined NO_DEFINE
|
#if !defined NO_DEFINE
|
||||||
delete_substtable();
|
delete_substtable();
|
||||||
insert_subst("__DATE__", "\"" __DATE__ "\"", 8);
|
inst_datetime_defines();
|
||||||
#endif
|
#endif
|
||||||
resetglobals();
|
resetglobals();
|
||||||
sc_ctrlchar=sc_ctrlchar_org;
|
sc_ctrlchar=sc_ctrlchar_org;
|
||||||
|
@ -1016,8 +1016,29 @@ static int command(void)
|
|||||||
} /* if */
|
} /* if */
|
||||||
} else if (strcmp(str,"dynamic")==0) {
|
} else if (strcmp(str,"dynamic")==0) {
|
||||||
preproc_expr(&sc_stksize,NULL);
|
preproc_expr(&sc_stksize,NULL);
|
||||||
} else if (strcmp(str,"library")==0) {
|
} else if ( !strcmp(str,"library") ||
|
||||||
char name[sNAMEMAX+1];
|
!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')
|
while (*lptr<=' ' && *lptr!='\0')
|
||||||
lptr++;
|
lptr++;
|
||||||
if (*lptr=='"') {
|
if (*lptr=='"') {
|
||||||
@ -1027,6 +1048,20 @@ static int command(void)
|
|||||||
for (i=0; i<sizeof name && (alphanum(*lptr) || *lptr=='-'); i++,lptr++)
|
for (i=0; i<sizeof name && (alphanum(*lptr) || *lptr=='-'); i++,lptr++)
|
||||||
name[i]=*lptr;
|
name[i]=*lptr;
|
||||||
name[i]='\0';
|
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 */
|
||||||
if (strlen(name)==0) {
|
if (strlen(name)==0) {
|
||||||
curlibrary=NULL;
|
curlibrary=NULL;
|
||||||
@ -1034,8 +1069,22 @@ static int command(void)
|
|||||||
pc_addlibtable=FALSE;
|
pc_addlibtable=FALSE;
|
||||||
} else {
|
} else {
|
||||||
/* add the name if it does not yet exist in the table */
|
/* add the name if it does not yet exist in the table */
|
||||||
if (find_constval(&libname_tab,name,0)==NULL)
|
char newname[sNAMEMAX+1];
|
||||||
curlibrary=append_constval(&libname_tab,name,0,0);
|
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 */
|
} /* if */
|
||||||
} else if (strcmp(str,"pack")==0) {
|
} else if (strcmp(str,"pack")==0) {
|
||||||
cell val;
|
cell val;
|
||||||
|
@ -14,3 +14,26 @@ amxx_vault addons/amxmodx/data/vault.ini
|
|||||||
; 2 - one logfile / map
|
; 2 - one logfile / map
|
||||||
; 3 - HL Logs
|
; 3 - HL Logs
|
||||||
amxx_logging 1
|
amxx_logging 1
|
||||||
|
|
||||||
|
; Binary logging level
|
||||||
|
; add these up to get what you want
|
||||||
|
; these only work with bin logging binaries
|
||||||
|
; 1 - default
|
||||||
|
; 2 - log internal string sets/gets
|
||||||
|
; 4 - log internal formats
|
||||||
|
; 8 - log all native params
|
||||||
|
; 16 - log internal function calls (only in debug mode)
|
||||||
|
; 32 - log line number accesses (only in debug mode)
|
||||||
|
bin_logging 49
|
||||||
|
|
||||||
|
; Maximum binary log size, in megs
|
||||||
|
max_binlog_size 20
|
||||||
|
|
||||||
|
; Plugin optimization flags - add these up to get what you want
|
||||||
|
; lowering these may stop crashes on very old CPUs
|
||||||
|
; set 65536 to disable optimizer, NOT 0!
|
||||||
|
;-------------
|
||||||
|
; 1 - float arithmetic
|
||||||
|
; 2 - float comparisons
|
||||||
|
; 4 - float rounding
|
||||||
|
optimizer 7
|
||||||
|
@ -16,3 +16,26 @@ csstats addons/amxmodx/data/csstats.dat
|
|||||||
; 2 - one logfile / map
|
; 2 - one logfile / map
|
||||||
; 3 - HL Logs
|
; 3 - HL Logs
|
||||||
amxx_logging 1
|
amxx_logging 1
|
||||||
|
|
||||||
|
; Binary logging level
|
||||||
|
; add these up to get what you want
|
||||||
|
; these only work with bin logging binaries
|
||||||
|
; 1 - default
|
||||||
|
; 2 - log internal string sets/gets
|
||||||
|
; 4 - log internal formats
|
||||||
|
; 8 - log all native params
|
||||||
|
; 16 - log internal function calls (only in debug mode)
|
||||||
|
; 32 - log line number accesses (only in debug mode)
|
||||||
|
bin_logging 49
|
||||||
|
|
||||||
|
; Maximum binary log size, in megs
|
||||||
|
max_binlog_size 20
|
||||||
|
|
||||||
|
; Plugin optimization flags - add these up to get what you want
|
||||||
|
; lowering these may stop crashes on very old CPUs
|
||||||
|
; set 65536 to disable optimizer, NOT 0!
|
||||||
|
;-------------
|
||||||
|
; 1 - float arithmetic
|
||||||
|
; 2 - float comparisons
|
||||||
|
; 4 - float rounding
|
||||||
|
optimizer 7
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
"mp_friendlyfire" "0" "1" "u"
|
"mp_friendlyfire" "0" "1" "u"
|
||||||
"mp_limitteams" "0" "1" "2" "u"
|
"mp_limitteams" "0" "1" "2" "u"
|
||||||
"mp_autoteambalance" "0" "1" "2" "u"
|
"mp_autoteambalance" "0" "1" "2" "u"
|
||||||
"mp_limitteams" "0" "1" "2" "u"
|
|
||||||
"allow_spectators" "0" "1" "u"
|
"allow_spectators" "0" "1" "u"
|
||||||
"mp_freezetime" "0" "6" "u"
|
"mp_freezetime" "0" "6" "u"
|
||||||
"mp_buytime" "1" "0.5" "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
|
; 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.
|
||||||
fun_amxx_i386.so
|
; You don't need to write the _amxx part or the file extension.
|
||||||
fun_amxx.dll
|
;;;
|
||||||
fun_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Engine - provides engine functions core to Half-Life
|
;; SQL Modules usually need to be enabled manually ;;
|
||||||
; ----------------------------------------------------
|
;; You can have any number on at a time. Use ;;
|
||||||
;engine_amxx_i386.so
|
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||||
;engine_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;engine_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------------
|
;mysql
|
||||||
; Fakemeta - provides a massive interface into the HL engine
|
;sqlite
|
||||||
; ----------------------------------------------------------
|
|
||||||
;fakemeta_amxx_i386.so
|
|
||||||
;fakemeta_amxx.dll
|
|
||||||
;fakemeta_amxx_amd64.so
|
|
||||||
|
|
||||||
; -------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Database Access - only enable one of these
|
;; Put third party modules below here. ;;
|
||||||
; -------------------------------------------
|
;; You can just list their names, without the _amxx ;;
|
||||||
; MySQL
|
;; or file extension. ;;
|
||||||
;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
|
|
||||||
|
|
||||||
; ---------------------------------------------
|
|
||||||
; 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
|
;; These modules will be auto-detected and loaded ;;
|
||||||
; --------------------------
|
;; as needed. You do not need to enable them here ;;
|
||||||
;regex_amxx_i386.so
|
;; unless you have problems. ;;
|
||||||
;regex_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;regex_amxx_amd64.so
|
|
||||||
|
|
||||||
; --------------------
|
fun
|
||||||
; Binary Vault support
|
;engine
|
||||||
; --------------------
|
;fakemeta
|
||||||
;nvault_amxx_i386.so
|
;geoip
|
||||||
;nvault_amxx.dll
|
;sockets
|
||||||
;nvault_amxx_amd64.so
|
;regex
|
||||||
|
;nvault
|
||||||
; ----------------------------------------------------------
|
cstrike
|
||||||
; Counter-Strike - adds functions specific to Counter-Strike
|
csx
|
||||||
; ----------------------------------------------------------
|
|
||||||
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
|
|
||||||
|
@ -17,3 +17,26 @@ amxx_logging 1
|
|||||||
|
|
||||||
dodstats_score addons/amxmodx/data/dodstats.amxx
|
dodstats_score addons/amxmodx/data/dodstats.amxx
|
||||||
dodstats addons/amxmodx/data/dodstats.dat
|
dodstats addons/amxmodx/data/dodstats.dat
|
||||||
|
|
||||||
|
; Binary logging level
|
||||||
|
; add these up to get what you want
|
||||||
|
; these only work with bin logging binaries
|
||||||
|
; 1 - default
|
||||||
|
; 2 - log internal string sets/gets
|
||||||
|
; 4 - log internal formats
|
||||||
|
; 8 - log all native params
|
||||||
|
; 16 - log internal function calls (only in debug mode)
|
||||||
|
; 32 - log line number accesses (only in debug mode)
|
||||||
|
bin_logging 49
|
||||||
|
|
||||||
|
; Maximum binary log size, in megs
|
||||||
|
max_binlog_size 20
|
||||||
|
|
||||||
|
; Plugin optimization flags - add these up to get what you want
|
||||||
|
; lowering these may stop crashes on very old CPUs
|
||||||
|
; set 65536 to disable optimizer, NOT 0!
|
||||||
|
;-------------
|
||||||
|
; 1 - float arithmetic
|
||||||
|
; 2 - float comparisons
|
||||||
|
; 4 - float rounding
|
||||||
|
optimizer 7
|
||||||
|
@ -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
|
; 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.
|
||||||
fun_amxx_i386.so
|
; You don't need to write the _amxx part or the file extension.
|
||||||
fun_amxx.dll
|
;;;
|
||||||
fun_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Engine - provides engine functions core to Half-Life
|
;; SQL Modules usually need to be enabled manually ;;
|
||||||
; ----------------------------------------------------
|
;; You can have any number on at a time. Use ;;
|
||||||
;engine_amxx_i386.so
|
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||||
;engine_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;engine_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------------
|
;mysql
|
||||||
; Fakemeta - provides a massive interface into the HL engine
|
;sqlite
|
||||||
; ----------------------------------------------------------
|
|
||||||
;fakemeta_amxx_i386.so
|
|
||||||
;fakemeta_amxx.dll
|
|
||||||
;fakemeta_amxx_amd64.so
|
|
||||||
|
|
||||||
; -------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Database Access - only enable one of these
|
;; Put third party modules below here. ;;
|
||||||
; -------------------------------------------
|
;; You can just list their names, without the _amxx ;;
|
||||||
; MySQL
|
;; or file extension. ;;
|
||||||
;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
|
|
||||||
|
|
||||||
; ---------------------------------------------
|
|
||||||
; 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
|
;; These modules will be auto-detected and loaded ;;
|
||||||
; --------------------------
|
;; as needed. You do not need to enable them here ;;
|
||||||
;regex_amxx_i386.so
|
;; unless you have problems. ;;
|
||||||
;regex_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;regex_amxx_amd64.so
|
|
||||||
|
|
||||||
; --------------------
|
fun
|
||||||
; Binary Vault support
|
;engine
|
||||||
; --------------------
|
;fakemeta
|
||||||
;nvault_amxx_i386.so
|
;geoip
|
||||||
;nvault_amxx.dll
|
;sockets
|
||||||
;nvault_amxx_amd64.so
|
;regex
|
||||||
|
;nvault
|
||||||
; --------------------------------------------------
|
dodfun
|
||||||
; Day of Defeat Fun - adds functions specific to DoD
|
dodx
|
||||||
; --------------------------------------------------
|
|
||||||
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
|
|
||||||
|
@ -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
|
; 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.
|
||||||
fun_amxx_i386.so
|
; You don't need to write the _amxx part or the file extension.
|
||||||
fun_amxx.dll
|
;;;
|
||||||
fun_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Engine - provides engine functions core to Half-Life
|
;; SQL Modules usually need to be enabled manually ;;
|
||||||
; ----------------------------------------------------
|
;; You can have any number on at a time. Use ;;
|
||||||
engine_amxx_i386.so
|
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||||
engine_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
engine_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------------
|
;mysql
|
||||||
; Fakemeta - provides a massive interface into the HL engine
|
;sqlite
|
||||||
; ----------------------------------------------------------
|
|
||||||
fakemeta_amxx_i386.so
|
|
||||||
fakemeta_amxx.dll
|
|
||||||
fakemeta_amxx_amd64.so
|
|
||||||
|
|
||||||
; -------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Database Access - only enable one of these
|
;; Put third party modules below here. ;;
|
||||||
; -------------------------------------------
|
;; You can just list their names, without the _amxx ;;
|
||||||
; MySQL
|
;; or file extension. ;;
|
||||||
;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
|
|
||||||
|
|
||||||
; ---------------------------------------------
|
|
||||||
; 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
|
;; These modules will be auto-detected and loaded ;;
|
||||||
; --------------------------
|
;; as needed. You do not need to enable them here ;;
|
||||||
;regex_amxx_i386.so
|
;; unless you have problems. ;;
|
||||||
;regex_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;regex_amxx_amd64.so
|
|
||||||
|
|
||||||
; --------------------
|
fun
|
||||||
; Binary Vault support
|
engine
|
||||||
; --------------------
|
fakemeta
|
||||||
;nvault_amxx_i386.so
|
;geoip
|
||||||
;nvault_amxx.dll
|
;sockets
|
||||||
;nvault_amxx_amd64.so
|
;regex
|
||||||
|
;nvault
|
||||||
|
@ -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
|
; 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.
|
||||||
fun_amxx_i386.so
|
; You don't need to write the _amxx part or the file extension.
|
||||||
fun_amxx.dll
|
;;;
|
||||||
fun_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Engine - provides engine functions core to Half-Life
|
;; SQL Modules usually need to be enabled manually ;;
|
||||||
; ----------------------------------------------------
|
;; You can have any number on at a time. Use ;;
|
||||||
;engine_amxx_i386.so
|
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||||
;engine_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;engine_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------------
|
;mysql
|
||||||
; Fakemeta - provides a massive interface into the HL engine
|
;sqlite
|
||||||
; ----------------------------------------------------------
|
|
||||||
;fakemeta_amxx_i386.so
|
|
||||||
;fakemeta_amxx.dll
|
|
||||||
;fakemeta_amxx_amd64.so
|
|
||||||
|
|
||||||
; -------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Database Access - only enable one of these
|
;; Put third party modules below here. ;;
|
||||||
; -------------------------------------------
|
;; You can just list their names, without the _amxx ;;
|
||||||
; MySQL
|
;; or file extension. ;;
|
||||||
;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
|
|
||||||
|
|
||||||
; ---------------------------------------------
|
|
||||||
; 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
|
;; These modules will be auto-detected and loaded ;;
|
||||||
; --------------------------
|
;; as needed. You do not need to enable them here ;;
|
||||||
;regex_amxx_i386.so
|
;; unless you have problems. ;;
|
||||||
;regex_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;regex_amxx_amd64.so
|
|
||||||
|
|
||||||
; --------------------
|
;fun
|
||||||
; Binary Vault support
|
;engine
|
||||||
; --------------------
|
;fakemeta
|
||||||
;nvault_amxx_i386.so
|
;geoip
|
||||||
;nvault_amxx.dll
|
;sockets
|
||||||
;nvault_amxx_amd64.so
|
;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
|
; 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.
|
||||||
fun_amxx_i386.so
|
; You don't need to write the _amxx part or the file extension.
|
||||||
fun_amxx.dll
|
;;;
|
||||||
fun_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Engine - provides engine functions core to Half-Life
|
;; SQL Modules usually need to be enabled manually ;;
|
||||||
; ----------------------------------------------------
|
;; You can have any number on at a time. Use ;;
|
||||||
;engine_amxx_i386.so
|
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||||
;engine_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;engine_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------------
|
;mysql
|
||||||
; Fakemeta - provides a massive interface into the HL engine
|
;sqlite
|
||||||
; ----------------------------------------------------------
|
|
||||||
;fakemeta_amxx_i386.so
|
|
||||||
;fakemeta_amxx.dll
|
|
||||||
;fakemeta_amxx_amd64.so
|
|
||||||
|
|
||||||
; -------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Database Access - only enable one of these
|
;; Put third party modules below here. ;;
|
||||||
; -------------------------------------------
|
;; You can just list their names, without the _amxx ;;
|
||||||
; MySQL
|
;; or file extension. ;;
|
||||||
;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
|
|
||||||
|
|
||||||
; ---------------------------------------------
|
|
||||||
; 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
|
;; These modules will be auto-detected and loaded ;;
|
||||||
; --------------------------
|
;; as needed. You do not need to enable them here ;;
|
||||||
;regex_amxx_i386.so
|
;; unless you have problems. ;;
|
||||||
;regex_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;regex_amxx_amd64.so
|
|
||||||
|
|
||||||
; --------------------
|
fun
|
||||||
; Binary Vault support
|
;engine
|
||||||
; --------------------
|
;fakemeta
|
||||||
;nvault_amxx_i386.so
|
;geoip
|
||||||
;nvault_amxx.dll
|
;sockets
|
||||||
;nvault_amxx_amd64.so
|
;regex
|
||||||
|
;nvault
|
||||||
; -----------------
|
ns
|
||||||
; Natural Selection
|
|
||||||
; -----------------
|
|
||||||
ns_amxx_i386.so
|
|
||||||
ns_amxx.dll
|
|
||||||
ns_amxx_amd64.so
|
|
||||||
|
@ -4,8 +4,11 @@
|
|||||||
// *NOTE* Linux users may encounter problems if they specify "localhost" instead of "127.0.0.1"
|
// *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
|
// 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_host "127.0.0.1"
|
||||||
amx_sql_user "root"
|
amx_sql_user "root"
|
||||||
amx_sql_pass ""
|
amx_sql_pass ""
|
||||||
amx_sql_db "amx"
|
amx_sql_db "amx"
|
||||||
amx_sql_table "admins"
|
amx_sql_table "admins"
|
||||||
|
amx_sql_type "mysql"
|
||||||
|
@ -16,3 +16,26 @@ tfcstats addons/amxmodx/data/tfcstats.dat
|
|||||||
; 2 - one logfile / map
|
; 2 - one logfile / map
|
||||||
; 3 - HL Logs
|
; 3 - HL Logs
|
||||||
amxx_logging 1
|
amxx_logging 1
|
||||||
|
|
||||||
|
; Binary logging level
|
||||||
|
; add these up to get what you want
|
||||||
|
; these only work with bin logging binaries
|
||||||
|
; 1 - default
|
||||||
|
; 2 - log internal string sets/gets
|
||||||
|
; 4 - log internal formats
|
||||||
|
; 8 - log all native params
|
||||||
|
; 16 - log internal function calls (only in debug mode)
|
||||||
|
; 32 - log line number accesses (only in debug mode)
|
||||||
|
bin_logging 49
|
||||||
|
|
||||||
|
; Maximum binary log size, in megs
|
||||||
|
max_binlog_size 20
|
||||||
|
|
||||||
|
; Plugin optimization flags - add these up to get what you want
|
||||||
|
; lowering these may stop crashes on very old CPUs
|
||||||
|
; set 65536 to disable optimizer, NOT 0!
|
||||||
|
;-------------
|
||||||
|
; 1 - float arithmetic
|
||||||
|
; 2 - float comparisons
|
||||||
|
; 4 - float rounding
|
||||||
|
optimizer 7
|
||||||
|
@ -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
|
; 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.
|
||||||
fun_amxx_i386.so
|
; You don't need to write the _amxx part or the file extension.
|
||||||
fun_amxx.dll
|
;;;
|
||||||
fun_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Engine - provides engine functions core to Half-Life
|
;; SQL Modules usually need to be enabled manually ;;
|
||||||
; ----------------------------------------------------
|
;; You can have any number on at a time. Use ;;
|
||||||
;engine_amxx_i386.so
|
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||||
;engine_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;engine_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------------
|
;mysql
|
||||||
; Fakemeta - provides a massive interface into the HL engine
|
;sqlite
|
||||||
; ----------------------------------------------------------
|
|
||||||
;fakemeta_amxx_i386.so
|
|
||||||
;fakemeta_amxx.dll
|
|
||||||
;fakemeta_amxx_amd64.so
|
|
||||||
|
|
||||||
; -------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Database Access - only enable one of these
|
;; Put third party modules below here. ;;
|
||||||
; -------------------------------------------
|
;; You can just list their names, without the _amxx ;;
|
||||||
; MySQL
|
;; or file extension. ;;
|
||||||
;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
|
|
||||||
|
|
||||||
; ---------------------------------------------
|
|
||||||
; 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
|
;; These modules will be auto-detected and loaded ;;
|
||||||
; --------------------------
|
;; as needed. You do not need to enable them here ;;
|
||||||
;regex_amxx_i386.so
|
;; unless you have problems. ;;
|
||||||
;regex_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;regex_amxx_amd64.so
|
|
||||||
|
|
||||||
; --------------------
|
fun
|
||||||
; Binary Vault support
|
;engine
|
||||||
; --------------------
|
;fakemeta
|
||||||
;nvault_amxx_i386.so
|
;geoip
|
||||||
;nvault_amxx.dll
|
;sockets
|
||||||
;nvault_amxx_amd64.so
|
;regex
|
||||||
|
;nvault
|
||||||
; ------------------------------------------------------------------
|
tfcx
|
||||||
; Team Fortress Classic X - adds functions and stats specific to TFC
|
|
||||||
; ------------------------------------------------------------------
|
|
||||||
tfcx_amxx_i386.so
|
|
||||||
tfcx_amxx.dll
|
|
||||||
tfcx_amxx_amd64.so
|
|
||||||
|
@ -16,3 +16,26 @@ tsstats addons/amxmodx/data/tsstats.dat
|
|||||||
; 2 - one logfile / map
|
; 2 - one logfile / map
|
||||||
; 3 - HL Logs
|
; 3 - HL Logs
|
||||||
amxx_logging 1
|
amxx_logging 1
|
||||||
|
|
||||||
|
; Binary logging level
|
||||||
|
; add these up to get what you want
|
||||||
|
; these only work with bin logging binaries
|
||||||
|
; 1 - default
|
||||||
|
; 2 - log internal string sets/gets
|
||||||
|
; 4 - log internal formats
|
||||||
|
; 8 - log all native params
|
||||||
|
; 16 - log internal function calls (only in debug mode)
|
||||||
|
; 32 - log line number accesses (only in debug mode)
|
||||||
|
bin_logging 49
|
||||||
|
|
||||||
|
; Maximum binary log size, in megs
|
||||||
|
max_binlog_size 20
|
||||||
|
|
||||||
|
; Plugin optimization flags - add these up to get what you want
|
||||||
|
; lowering these may stop crashes on very old CPUs
|
||||||
|
; set 65536 to disable optimizer, NOT 0!
|
||||||
|
;-------------
|
||||||
|
; 1 - float arithmetic
|
||||||
|
; 2 - float comparisons
|
||||||
|
; 4 - float rounding
|
||||||
|
optimizer 7
|
||||||
|
@ -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
|
; 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.
|
||||||
fun_amxx_i386.so
|
; You don't need to write the _amxx part or the file extension.
|
||||||
fun_amxx.dll
|
;;;
|
||||||
fun_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Engine - provides engine functions core to Half-Life
|
;; SQL Modules usually need to be enabled manually ;;
|
||||||
; ----------------------------------------------------
|
;; You can have any number on at a time. Use ;;
|
||||||
;engine_amxx_i386.so
|
;; amx_sql_type in sql.cfg to specify the default ;;
|
||||||
;engine_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;engine_amxx_amd64.so
|
|
||||||
|
|
||||||
; ----------------------------------------------------------
|
;mysql
|
||||||
; Fakemeta - provides a massive interface into the HL engine
|
;sqlite
|
||||||
; ----------------------------------------------------------
|
|
||||||
;fakemeta_amxx_i386.so
|
|
||||||
;fakemeta_amxx.dll
|
|
||||||
;fakemeta_amxx_amd64.so
|
|
||||||
|
|
||||||
; -------------------------------------------
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Database Access - only enable one of these
|
;; Put third party modules below here. ;;
|
||||||
; -------------------------------------------
|
;; You can just list their names, without the _amxx ;;
|
||||||
; MySQL
|
;; or file extension. ;;
|
||||||
;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
|
|
||||||
|
|
||||||
; ---------------------------------------------
|
|
||||||
; 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
|
;; These modules will be auto-detected and loaded ;;
|
||||||
; --------------------------
|
;; as needed. You do not need to enable them here ;;
|
||||||
;regex_amxx_i386.so
|
;; unless you have problems. ;;
|
||||||
;regex_amxx.dll
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;regex_amxx_amd64.so
|
|
||||||
|
|
||||||
; --------------------
|
fun
|
||||||
; Binary Vault support
|
;engine
|
||||||
; --------------------
|
;fakemeta
|
||||||
;nvault_amxx_i386.so
|
;geoip
|
||||||
;nvault_amxx.dll
|
;sockets
|
||||||
;nvault_amxx_amd64.so
|
;regex
|
||||||
|
;nvault
|
||||||
; -----------------------------------------------------------
|
tsx
|
||||||
; The Specialists X - adds functions and stats specific to TS
|
tsfun
|
||||||
; -----------------------------------------------------------
|
|
||||||
tsx_amxx_i386.so
|
|
||||||
tsx_amxx.dll
|
|
||||||
tsx_amxx_amd64.so
|
|
||||||
|
|
||||||
; -----------------------------------------------------------
|
|
||||||
; The Specialists Fun - more functionality
|
|
||||||
; -----------------------------------------------------------
|
|
||||||
tsfun_amxx_i386.so
|
|
||||||
tsfun_amxx.dll
|
|
||||||
tsfun_amxx_amd64.so
|
|
||||||
|
@ -31,7 +31,7 @@ static cell AMX_NATIVE_CALL get_user_level(AMX *amx,cell *params)
|
|||||||
|
|
||||||
static cell AMX_NATIVE_CALL set_user_level(AMX *amx,cell *params)
|
static cell AMX_NATIVE_CALL set_user_level(AMX *amx,cell *params)
|
||||||
{
|
{
|
||||||
if(GetUserLevel(params[0]) > params[2])
|
if(GetUserLevel(params[1]) > params[2])
|
||||||
{
|
{
|
||||||
MF_LogError(amx,AMX_ERR_NATIVE,"Must set to a level higher than current one!");
|
MF_LogError(amx,AMX_ERR_NATIVE,"Must set to a level higher than current one!");
|
||||||
return 0;
|
return 0;
|
||||||
|
34
dlls/arrayx/Array.cpp
Normal file
34
dlls/arrayx/Array.cpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#include "amxxmodule.h"
|
||||||
|
#include "ComboArray.h"
|
||||||
|
|
||||||
|
extern AMX_NATIVE_INFO bintrie_exports[];
|
||||||
|
extern AMX_NATIVE_INFO bintrie_usage_exports[];
|
||||||
|
extern ComboArray MasterTrie;
|
||||||
|
|
||||||
|
extern AMX_NATIVE_INFO list_exports[];
|
||||||
|
extern AMX_NATIVE_INFO list_creation_exports[];
|
||||||
|
extern ComboArray MasterList;
|
||||||
|
|
||||||
|
extern AMX_NATIVE_INFO map_exports[];
|
||||||
|
extern AMX_NATIVE_INFO map_creation_exports[];
|
||||||
|
extern ComboArray MasterMap;
|
||||||
|
|
||||||
|
|
||||||
|
void OnAmxxAttach( void )
|
||||||
|
{
|
||||||
|
MF_AddNatives(bintrie_exports);
|
||||||
|
MF_AddNatives(bintrie_usage_exports);
|
||||||
|
|
||||||
|
MF_AddNatives(list_exports);
|
||||||
|
MF_AddNatives(list_creation_exports);
|
||||||
|
|
||||||
|
MF_AddNatives(map_exports);
|
||||||
|
MF_AddNatives(map_creation_exports);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnAmxxDetach( void )
|
||||||
|
{
|
||||||
|
JudyClearMasterTrie(&MasterTrie);
|
||||||
|
JudyClearMasterList(&MasterList);
|
||||||
|
JudyClearMasterMap(&MasterMap);
|
||||||
|
}
|
175
dlls/arrayx/Array.dep
Normal file
175
dlls/arrayx/Array.dep
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
# Microsoft Developer Studio Generated Dependency File, included by Array.mak
|
||||||
|
|
||||||
|
.\Array.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CArray.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\ComboArray.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\BinTrieNatives.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\BinTrieNativeFunctions.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CArray.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\ComboArray.h"\
|
||||||
|
".\GenericNatives.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\NativeIncludes.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\Capsule.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\CArray.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CArray.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\CBinTrie.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\CKeytable.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CKeytable.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\JudyExtra.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\ListNatives.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CArray.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\ComboArray.h"\
|
||||||
|
".\GenericNatives.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\ListNativeFunctions.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\NativeIncludes.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\MapNatives.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CArray.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\CHashtable.h"\
|
||||||
|
".\CKeytable.h"\
|
||||||
|
".\ComboArray.h"\
|
||||||
|
".\ComboTable.h"\
|
||||||
|
".\GenericNatives.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\MapNativeFunctions.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\NativeIncludes.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\amxxmodule.cpp : \
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||||
|
|
||||||
CFG=ARRAY - WIN32 RELEASE
|
CFG=Array - Win32 Debug
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||||
!MESSAGE use the Export Makefile command and run
|
!MESSAGE use the Export Makefile command and run
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
@ -13,11 +13,12 @@ CFG=ARRAY - WIN32 RELEASE
|
|||||||
!MESSAGE You can specify a configuration when running NMAKE
|
!MESSAGE You can specify a configuration when running NMAKE
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE NMAKE /f "Array.mak" CFG="ARRAY - WIN32 RELEASE"
|
!MESSAGE NMAKE /f "Array.mak" CFG="Array - Win32 Debug"
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE Possible choices for configuration are:
|
!MESSAGE Possible choices for configuration are:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE "Array - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
!MESSAGE "Array - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||||
|
!MESSAGE "Array - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
|
|
||||||
# Begin Project
|
# Begin Project
|
||||||
@ -27,45 +28,101 @@ CFG=ARRAY - WIN32 RELEASE
|
|||||||
CPP=cl.exe
|
CPP=cl.exe
|
||||||
MTL=midl.exe
|
MTL=midl.exe
|
||||||
RSC=rc.exe
|
RSC=rc.exe
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "Array - Win32 Release"
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
# PROP BASE Use_MFC 0
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
# PROP BASE Use_Debug_Libraries 0
|
||||||
# PROP BASE Output_Dir "Release"
|
# PROP BASE Output_Dir "Release"
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
# PROP BASE Intermediate_Dir "Release"
|
||||||
# PROP BASE Target_Dir ""
|
# PROP BASE Target_Dir ""
|
||||||
# PROP Use_MFC 2
|
# PROP Use_MFC 0
|
||||||
# PROP Use_Debug_Libraries 0
|
# PROP Use_Debug_Libraries 0
|
||||||
# PROP Output_Dir "Release"
|
# PROP Output_Dir "Release"
|
||||||
# PROP Intermediate_Dir "Release"
|
# PROP Intermediate_Dir "Release"
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /c
|
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /c
|
||||||
# ADD CPP /nologo /MD /W3 /vmg /vms /GX /ZI /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /D "_WINDLL" /D "_AFXDLL" /U "DLLEXPORT" /FR /YX /FD /c
|
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /FR /YX /FD /c
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
|
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||||
BSC32=bscmake.exe
|
BSC32=bscmake.exe
|
||||||
# ADD BASE BSC32 /nologo
|
# ADD BASE BSC32 /nologo
|
||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
LINK32=link.exe
|
LINK32=link.exe
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||||
# ADD LINK32 /nologo /dll /machine:I386
|
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||||
# SUBTRACT LINK32 /incremental:yes
|
|
||||||
|
!ELSEIF "$(CFG)" == "Array - Win32 Debug"
|
||||||
|
|
||||||
|
# PROP BASE Use_MFC 0
|
||||||
|
# PROP BASE Use_Debug_Libraries 1
|
||||||
|
# PROP BASE Output_Dir "Debug"
|
||||||
|
# PROP BASE Intermediate_Dir "Debug"
|
||||||
|
# PROP BASE Target_Dir ""
|
||||||
|
# PROP Use_MFC 0
|
||||||
|
# PROP Use_Debug_Libraries 1
|
||||||
|
# PROP Output_Dir "Debug"
|
||||||
|
# PROP Intermediate_Dir "Debug"
|
||||||
|
# PROP Target_Dir ""
|
||||||
|
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /GZ /c
|
||||||
|
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /GZ /c
|
||||||
|
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
|
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
|
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||||
|
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||||
|
BSC32=bscmake.exe
|
||||||
|
# ADD BASE BSC32 /nologo
|
||||||
|
# ADD BSC32 /nologo
|
||||||
|
LINK32=link.exe
|
||||||
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||||
|
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# Begin Target
|
# Begin Target
|
||||||
|
|
||||||
# Name "Array - Win32 Release"
|
# Name "Array - Win32 Release"
|
||||||
|
# Name "Array - Win32 Debug"
|
||||||
# Begin Group "Source Files"
|
# Begin Group "Source Files"
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\amxxmodule.cpp
|
SOURCE=.\Array.cpp
|
||||||
# SUBTRACT CPP /Z<none>
|
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\array.cpp
|
SOURCE=.\BinTrieNatives.cpp
|
||||||
# SUBTRACT CPP /Z<none> /u
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\Capsule.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CArray.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CBinTrie.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CKeytable.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyExtra.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\ListNatives.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\MapNatives.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
# Begin Group "Header Files"
|
# Begin Group "Header Files"
|
||||||
@ -73,7 +130,7 @@ SOURCE=.\array.cpp
|
|||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\amxxmodule.h
|
SOURCE=.\Capsule.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
@ -81,6 +138,18 @@ SOURCE=.\CArray.h
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CBaseList.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CBaseMap.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CBinTrie.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\CHashtable.h
|
SOURCE=.\CHashtable.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
@ -89,11 +158,15 @@ SOURCE=.\CKeytable.h
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\element.h
|
SOURCE=.\ComboArray.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\moduleconfig.h
|
SOURCE=.\ComboTable.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyIncludes.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
# Begin Group "Resource Files"
|
# Begin Group "Resource Files"
|
||||||
@ -101,7 +174,63 @@ SOURCE=.\moduleconfig.h
|
|||||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE="..\module\Judy-1.0.1\src\Judy.lib"
|
SOURCE=.\amxxmodule.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\amxxmodule.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\BinTrieNativeFunctions.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\GenericNatives.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\Judy.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyEx.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyExtra.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyVar.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyVec.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\ListNativeFunctions.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\MapNativeFunctions.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\moduleconfig.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\NativeIncludes.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\osdefs.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\Judy.lib
|
||||||
# End Source File
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
# End Target
|
# End Target
|
||||||
|
29
dlls/arrayx/Array.dsw
Normal file
29
dlls/arrayx/Array.dsw
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||||
|
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
Project: "Array"=".\Array.dsp" - Package Owner=<4>
|
||||||
|
|
||||||
|
Package=<5>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Package=<4>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
Global:
|
||||||
|
|
||||||
|
Package=<5>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Package=<3>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
Binary file not shown.
BIN
dlls/arrayx/Array.opt
Normal file
BIN
dlls/arrayx/Array.opt
Normal file
Binary file not shown.
110
dlls/arrayx/Array.plg
Normal file
110
dlls/arrayx/Array.plg
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<pre>
|
||||||
|
<h1>Build Log</h1>
|
||||||
|
<h3>
|
||||||
|
--------------------Configuration: Array - Win32 Release--------------------
|
||||||
|
</h3>
|
||||||
|
<h3>Command Lines</h3>
|
||||||
|
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPED.tmp" with contents
|
||||||
|
[
|
||||||
|
/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /FR"Release/" /Fp"Release/Array.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
|
||||||
|
"C:\Array\Array.cpp"
|
||||||
|
"C:\Array\BinTrieNatives.cpp"
|
||||||
|
"C:\Array\Capsule.cpp"
|
||||||
|
"C:\Array\CArray.cpp"
|
||||||
|
"C:\Array\CBinTrie.cpp"
|
||||||
|
"C:\Array\CKeytable.cpp"
|
||||||
|
"C:\Array\JudyExtra.cpp"
|
||||||
|
"C:\Array\ListNatives.cpp"
|
||||||
|
"C:\Array\MapNatives.cpp"
|
||||||
|
"C:\Array\amxxmodule.cpp"
|
||||||
|
]
|
||||||
|
Creating command line "cl.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPED.tmp"
|
||||||
|
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPEE.tmp" with contents
|
||||||
|
[
|
||||||
|
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /pdb:"Release/Array.pdb" /machine:I386 /out:"Release/Array.dll" /implib:"Release/Array.lib"
|
||||||
|
.\Release\Array.obj
|
||||||
|
.\Release\BinTrieNatives.obj
|
||||||
|
.\Release\Capsule.obj
|
||||||
|
.\Release\CArray.obj
|
||||||
|
.\Release\CBinTrie.obj
|
||||||
|
.\Release\CKeytable.obj
|
||||||
|
.\Release\JudyExtra.obj
|
||||||
|
.\Release\ListNatives.obj
|
||||||
|
.\Release\MapNatives.obj
|
||||||
|
.\Release\amxxmodule.obj
|
||||||
|
.\Judy.lib
|
||||||
|
]
|
||||||
|
Creating command line "link.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPEE.tmp"
|
||||||
|
<h3>Output Window</h3>
|
||||||
|
Compiling...
|
||||||
|
Array.cpp
|
||||||
|
BinTrieNatives.cpp
|
||||||
|
Capsule.cpp
|
||||||
|
CArray.cpp
|
||||||
|
CBinTrie.cpp
|
||||||
|
CKeytable.cpp
|
||||||
|
JudyExtra.cpp
|
||||||
|
C:\Array\JudyExtra.cpp(10) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(15) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(20) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(23) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(34) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(41) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(66) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(102) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(107) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(112) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(115) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(127) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(132) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(137) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(140) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(160) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(164) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(167) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(190) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(205) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(210) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(215) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(218) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(230) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(235) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(240) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(243) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(258) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(266) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(274) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(277) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(305) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
ListNatives.cpp
|
||||||
|
MapNatives.cpp
|
||||||
|
amxxmodule.cpp
|
||||||
|
Linking...
|
||||||
|
Creating library Release/Array.lib and object Release/Array.exp
|
||||||
|
LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library
|
||||||
|
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPF2.tmp" with contents
|
||||||
|
[
|
||||||
|
/nologo /o"Release/Array.bsc"
|
||||||
|
.\Release\Array.sbr
|
||||||
|
.\Release\BinTrieNatives.sbr
|
||||||
|
.\Release\Capsule.sbr
|
||||||
|
.\Release\CArray.sbr
|
||||||
|
.\Release\CBinTrie.sbr
|
||||||
|
.\Release\CKeytable.sbr
|
||||||
|
.\Release\JudyExtra.sbr
|
||||||
|
.\Release\ListNatives.sbr
|
||||||
|
.\Release\MapNatives.sbr
|
||||||
|
.\Release\amxxmodule.sbr]
|
||||||
|
Creating command line "bscmake.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPF2.tmp"
|
||||||
|
Creating browse info file...
|
||||||
|
<h3>Output Window</h3>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h3>Results</h3>
|
||||||
|
Array.dll - 0 error(s), 33 warning(s)
|
||||||
|
</pre>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -1,151 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="Array"
|
|
||||||
SccProjectName=""
|
|
||||||
SccLocalPath=""
|
|
||||||
Keyword="MFCProj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory=".\Release"
|
|
||||||
IntermediateDirectory=".\Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
UseOfMFC="2"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalOptions="/vmg /vms"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;_USRDLL;ARRAY_EXPORTS"
|
|
||||||
StringPooling="TRUE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
EnableFunctionLevelLinking="TRUE"
|
|
||||||
UsePrecompiledHeader="2"
|
|
||||||
PrecompiledHeaderFile=".\Release/Array.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
BrowseInformation="1"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="TRUE"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
UndefinePreprocessorDefinitions="DLLEXPORT"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/array_amxx.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="TRUE"
|
|
||||||
ProgramDatabaseFile=".\Release/Array.pdb"
|
|
||||||
ImportLibrary=".\Release/Array.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
MkTypLibCompatible="TRUE"
|
|
||||||
SuppressStartupBanner="TRUE"
|
|
||||||
TargetEnvironment="1"
|
|
||||||
TypeLibraryName=".\Release/Array.tlb"
|
|
||||||
HeaderFileName=""/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1033"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
|
||||||
<File
|
|
||||||
RelativePath="amxxmodule.cpp">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalOptions="/vmg /vms /vmg /vms"
|
|
||||||
Optimization="2"
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
BrowseInformation="1"
|
|
||||||
DebugInformationFormat="0"
|
|
||||||
UndefinePreprocessorDefinitions=""/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="array.cpp">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalOptions="/vmg /vms /vmg /vms"
|
|
||||||
Optimization="2"
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
BrowseInformation="1"
|
|
||||||
DebugInformationFormat="0"
|
|
||||||
UndefinePreprocessorDefinitions=""/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl">
|
|
||||||
<File
|
|
||||||
RelativePath="amxxmodule.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="CArray.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="CHashtable.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="CKeytable.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="element.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="moduleconfig.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
|
|
||||||
<File
|
|
||||||
RelativePath=".\Judy-1.0.1\src\Judy.lib">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\osdefs.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
78
dlls/arrayx/BinTrieNativeFunctions.h
Normal file
78
dlls/arrayx/BinTrieNativeFunctions.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#ifndef _bintrie_NATIVE_FUNC_INC_H
|
||||||
|
#define _bintrie_NATIVE_FUNC_INC_H
|
||||||
|
|
||||||
|
#define JUDY_GLUE_FUNC( x , y ) x ## y
|
||||||
|
|
||||||
|
#define JUDY_GLUE_STR( x, y ) #x#y
|
||||||
|
|
||||||
|
#define JUDY_MASTER_EDIT_FUNCTIONS
|
||||||
|
#define JUDY_MASTER_CLEAR_FUNC JUDY_GLUE_FUNC( bintrie , _clear )
|
||||||
|
#define JUDY_MASTER_CLEAR_STR JUDY_GLUE_STR ( bintrie , _clear )
|
||||||
|
|
||||||
|
#define JUDY_MASTER_DELETE_FUNC JUDY_GLUE_FUNC( bintrie , _delete )
|
||||||
|
#define JUDY_MASTER_DELETE_STR JUDY_GLUE_STR ( bintrie , _delete )
|
||||||
|
|
||||||
|
#define JUDY_MASTER_IO_FUNCTIONS
|
||||||
|
|
||||||
|
#define JUDY_MASTER_SAVE_FUNC JUDY_GLUE_FUNC( bintrie , _save )
|
||||||
|
#define JUDY_MASTER_SAVE_STR JUDY_GLUE_STR ( bintrie , _save )
|
||||||
|
#define JUDY_SAVE_FUNC(bin,file) JudySaveBinTrie(bin , file )
|
||||||
|
|
||||||
|
#define JUDY_MASTER_LOAD_FUNC JUDY_GLUE_FUNC( bintrie , _load )
|
||||||
|
#define JUDY_MASTER_LOAD_STR JUDY_GLUE_STR ( bintrie , _load )
|
||||||
|
#define JUDY_LOAD_FUNC(bin, file) JudyLoadBinTrie(bin , file )
|
||||||
|
|
||||||
|
#define JUDY_MASTER_AMOUNT_FUNCTIONS
|
||||||
|
#define JUDY_MASTER_COUNT_FUNC JUDY_GLUE_FUNC( bintrie , _count )
|
||||||
|
#define JUDY_MASTER_COUNT_STR JUDY_GLUE_STR ( bintrie , _count )
|
||||||
|
|
||||||
|
#define JUDY_MASTER_BYCOUNT_FUNC JUDY_GLUE_FUNC( bintrie , _bycount )
|
||||||
|
#define JUDY_MASTER_BYCOUNT_STR JUDY_GLUE_STR ( bintrie , _bycount )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_AMOUNT_FUNCTIONS
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_COUNT_FUNC JUDY_GLUE_FUNC( bintrie , _size )
|
||||||
|
#define JUDY_SLAVE_COUNT_STR JUDY_GLUE_STR ( bintrie , _size )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_BYCOUNT_FUNC JUDY_GLUE_FUNC( bintrie , _get_nth )
|
||||||
|
#define JUDY_SLAVE_BYCOUNT_STR JUDY_GLUE_STR ( bintrie , _get_nth )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_EDIT_FUNCTIONS
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_MEMORY_FUNC JUDY_GLUE_FUNC( bintrie , _memory )
|
||||||
|
#define JUDY_SLAVE_MEMORY_STR JUDY_GLUE_STR ( bintrie , _memory )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_ISFILLED_FUNC JUDY_GLUE_FUNC( bintrie , _isfilled )
|
||||||
|
#define JUDY_SLAVE_ISFILLED_STR JUDY_GLUE_STR ( bintrie , _isfilled )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_ISEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _isempty )
|
||||||
|
#define JUDY_SLAVE_ISEMPTY_STR JUDY_GLUE_STR ( bintrie , _isempty )
|
||||||
|
|
||||||
|
#define NO_JUDY_SLAVE_REMOVE_FUNC
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_SEARCH_FUNCTIONS
|
||||||
|
#define JUDY_SLAVE_FIRST_FUNC JUDY_GLUE_FUNC( bintrie , _first )
|
||||||
|
#define JUDY_SLAVE_LAST_FUNC JUDY_GLUE_FUNC( bintrie , _last )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_FIRST_STR JUDY_GLUE_STR ( bintrie , _first )
|
||||||
|
#define JUDY_SLAVE_LAST_STR JUDY_GLUE_STR ( bintrie , _last )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_NEXT_FUNC JUDY_GLUE_FUNC( bintrie , _next )
|
||||||
|
#define JUDY_SLAVE_PREV_FUNC JUDY_GLUE_FUNC( bintrie , _prev )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_NEXT_STR JUDY_GLUE_STR ( bintrie , _next )
|
||||||
|
#define JUDY_SLAVE_PREV_STR JUDY_GLUE_STR ( bintrie , _prev )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_SEARCH_EMPTY_FUNCTIONS
|
||||||
|
#define JUDY_SLAVE_FIRSTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _firstempty )
|
||||||
|
#define JUDY_SLAVE_LASTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _lastempty )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_FIRSTEMPTY_STR JUDY_GLUE_STR ( bintrie , _firstempty )
|
||||||
|
#define JUDY_SLAVE_LASTEMPTY_STR JUDY_GLUE_STR ( bintrie , _lastempty )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_NEXTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _nextempty )
|
||||||
|
#define JUDY_SLAVE_PREVEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _prevempty )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_NEXTEMPTY_STR JUDY_GLUE_STR ( bintrie , _nextempty )
|
||||||
|
#define JUDY_SLAVE_PREVEMPTY_STR JUDY_GLUE_STR ( bintrie , _prevempty )
|
||||||
|
#endif
|
69
dlls/arrayx/BinTrieNatives.cpp
Normal file
69
dlls/arrayx/BinTrieNatives.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#include "CBinTrie.h"
|
||||||
|
|
||||||
|
#define KEY_TYPE cell
|
||||||
|
#define DYNAMIC_UNIT_TYPE BinTrie
|
||||||
|
#define STORAGE_TYPE cell
|
||||||
|
#define MASTER_NAME MasterTrie
|
||||||
|
#define EXPORT_NAME bintrie_exports
|
||||||
|
|
||||||
|
#define SEARCH_ERROR_OFFSET 0
|
||||||
|
|
||||||
|
#define GET_KEY(params, num) params[num]
|
||||||
|
#define SET_KEY(stuff, parameter) stuff
|
||||||
|
|
||||||
|
#include "BinTrieNativeFunctions.h"
|
||||||
|
#include "NativeIncludes.h"
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL bintrie_create(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
DTYPE* Unit;
|
||||||
|
M_ITYPE Index = params[1];
|
||||||
|
|
||||||
|
JUDY_CREATE_INDEX(MNAME,Unit,BinTrie,Index);
|
||||||
|
return Index;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL bintrie_set(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
DTYPE* Unit = NULL;
|
||||||
|
|
||||||
|
JUDY_GET_INDEX(MNAME,Unit, params[1]);
|
||||||
|
ITYPE Indice = JUDY_GET_KEY(params,2);
|
||||||
|
bool Value = (params[3] != NULL);
|
||||||
|
|
||||||
|
try { return Unit->Set(Indice, Value ); }
|
||||||
|
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Set Function ");
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL bintrie_get(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
DTYPE* Unit = NULL;
|
||||||
|
|
||||||
|
JUDY_GET_INDEX(MNAME,Unit, params[1]);
|
||||||
|
ITYPE Indice = JUDY_GET_KEY(params,2);
|
||||||
|
|
||||||
|
try { return Unit->Get(Indice ); }
|
||||||
|
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Get Function ");
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL bintrie_remove(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
DTYPE* Unit = NULL;
|
||||||
|
|
||||||
|
JUDY_GET_INDEX(MNAME,Unit, params[1]);
|
||||||
|
ITYPE Indice = JUDY_GET_KEY(params,2);
|
||||||
|
|
||||||
|
try { return Unit->Delete(Indice ); }
|
||||||
|
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Delete Function ");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AMX_NATIVE_INFO bintrie_usage_exports[] =
|
||||||
|
{
|
||||||
|
{ "bintrie_create", bintrie_create },
|
||||||
|
{ "bintrie_set", bintrie_set },
|
||||||
|
{ "bintrie_get", bintrie_get },
|
||||||
|
{ "bintrie_remove", bintrie_remove },
|
||||||
|
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
87
dlls/arrayx/CArray.cpp
Normal file
87
dlls/arrayx/CArray.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#include "CArray.h"
|
||||||
|
|
||||||
|
void Array::ThrowSearchError(char* type)
|
||||||
|
{
|
||||||
|
char value[50];
|
||||||
|
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
|
||||||
|
|
||||||
|
throw JudyEx(value,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Array::ThrowIndexError( cell index, bool disable_check )
|
||||||
|
{
|
||||||
|
if(disable_check == true) return;
|
||||||
|
|
||||||
|
char error[50];
|
||||||
|
sprintf(error,"Index %i is not set.",index);
|
||||||
|
|
||||||
|
throw JudyEx(error,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::First( cell Start)
|
||||||
|
{
|
||||||
|
PPvoid_t success = JudyLFirst(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:First");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::FirstEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = JudyLFirstEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:FirstEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::Next( cell Start)
|
||||||
|
{
|
||||||
|
PPvoid_t success = JudyLNext(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Next");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::NextEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = JudyLNextEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:NextEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::Prev( cell Start)
|
||||||
|
{
|
||||||
|
PPvoid_t success = JudyLPrev(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Prev");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::PrevEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = JudyLPrevEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:PrevEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::Last( cell Start)
|
||||||
|
{
|
||||||
|
PPvoid_t success = JudyLLast(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Last");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::LastEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = JudyLLastEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:LastEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::ByCount(cell n, cell Start)
|
||||||
|
{
|
||||||
|
PPvoid_t success = JudyLByCount(Table, n, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Nth");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
@ -1,734 +1,74 @@
|
|||||||
Pvoid_t MasterArray = (Pvoid_t) NULL; //Create the control array
|
#ifndef _ARRAYCLASS_H
|
||||||
|
#define _ARRAYCLASS_H
|
||||||
|
|
||||||
//Create an array that stores whether or not indices are used.
|
#include "JudyIncludes.h"
|
||||||
Pvoid_t MasterArray_Binary = (Pvoid_t) NULL;
|
#include "CBaseList.h"
|
||||||
|
#include "JudyExtra.h"
|
||||||
|
//#include <JudyL.h>
|
||||||
|
|
||||||
void DeleteMasterArray(void);
|
class Array: public CBaseList
|
||||||
|
|
||||||
Word_t NewArray(Word_t Index, Word_t reserve = 0);
|
|
||||||
PPvoid_t Find_Array(Word_t Index, Word_t disable_check = 1, AMX *amx = 0);
|
|
||||||
void DeleteArray(Word_t Index);
|
|
||||||
void ClearArray(Word_t Index);
|
|
||||||
|
|
||||||
template <class Type>
|
|
||||||
void Array_Set(PPvoid_t Array, char* Index, Type value);
|
|
||||||
|
|
||||||
PPvoid_t Array_Get(AMX* amx, PPvoid_t Array, Word_t Index, int ignore_error = 0);
|
|
||||||
void DeleteCell(Pvoid_t* Array, Word_t Index);
|
|
||||||
|
|
||||||
void Delete_MasterArray(void)
|
|
||||||
{
|
{
|
||||||
Word_t
|
private:
|
||||||
Index = 0,
|
Pvoid_t Table;
|
||||||
success = 0;
|
|
||||||
J1F(success, MasterArray_Binary, Index);
|
void ThrowIndexError( cell index, bool disable_check = false );
|
||||||
while( success )
|
void ThrowSearchError(char* msg);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Array() { Table = NULL; }
|
||||||
|
~Array() { Clear(); }
|
||||||
|
void Remove() { delete this; }
|
||||||
|
|
||||||
|
Word_t Clear() { JudyClearList(this); return JudyLFreeArray(&Table, PJE0); }
|
||||||
|
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
|
||||||
|
|
||||||
|
int Delete(cell Key) { return JudyLDel(&Table, Key, PJE0 ); }
|
||||||
|
|
||||||
|
void Set(cell Index, Pvoid_t value, bool disable_check)
|
||||||
{
|
{
|
||||||
DeleteArray( Index ); //Delete array.
|
PPvoid_t PValue = JudyLIns(&Table, Index,PJE0);
|
||||||
J1F(success, MasterArray_Binary, Index); //Get next array
|
*PValue = value;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Word_t NewArray(Word_t Index, Word_t reserve)
|
Pvoid_t Get(cell Index, bool disable_check = false)
|
||||||
{
|
|
||||||
Word_t success; //Dummy for macros.
|
|
||||||
J1T(success, MasterArray_Binary, Index); //Check if bit is already set.
|
|
||||||
|
|
||||||
if (success && reserve)
|
|
||||||
return Index; //If the bit is set but it's 'reserved', return the index.
|
|
||||||
|
|
||||||
//Only do this if the bit is not set.
|
|
||||||
J1FE(success, MasterArray_Binary, Index);
|
|
||||||
J1S(success, MasterArray_Binary, Index);
|
|
||||||
|
|
||||||
PPvoid_t Array = JudyLIns(&MasterArray, Index, PJE0);
|
|
||||||
*Array = (PWord_t) NULL;
|
|
||||||
|
|
||||||
return Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
PPvoid_t Find_Array(Word_t Index, Word_t disable_check, AMX *amx)
|
|
||||||
{
|
|
||||||
Word_t success;
|
|
||||||
J1T(success, MasterArray_Binary, Index);
|
|
||||||
if (success || disable_check)
|
|
||||||
{ //Bit is valid
|
|
||||||
if(!success)
|
|
||||||
NewArray(Index);
|
|
||||||
|
|
||||||
return JudyLGet( MasterArray, Index, PJE0);
|
|
||||||
}
|
|
||||||
MF_LogError(amx,AMX_ERR_NATIVE,"Array %d is invalid", Index);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeleteArray(Word_t Index)
|
|
||||||
{
|
|
||||||
int success;
|
|
||||||
J1T(success, MasterArray_Binary, Index);
|
|
||||||
if (success)
|
|
||||||
{ //If the bit is set, clear and delete array.
|
|
||||||
ClearArray(Index);
|
|
||||||
J1U(success, MasterArray_Binary, Index);
|
|
||||||
JudyLDel(&MasterArray, Index, PJE0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClearArray(Word_t Index)
|
|
||||||
{
|
|
||||||
int success;
|
|
||||||
J1T(success, MasterArray_Binary, Index);
|
|
||||||
if (success) //dont bother with unset arrays.
|
|
||||||
{
|
{
|
||||||
PPvoid_t Array = Find_Array(Index);
|
PPvoid_t PValue = JudyLGet(Table, Index, PJE0);
|
||||||
Word_t index = 0;
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
|
||||||
PPvoid_t PValue = JudyLFirst(*Array, &index, PJE0);
|
|
||||||
while (PValue != NULL)
|
return *PValue;
|
||||||
{
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
elem_value.delete_element();
|
|
||||||
PValue = JudyLNext(*Array, &index, PJE0);
|
|
||||||
}
|
|
||||||
JudyLFreeArray(Array, PJE0);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL new_array(AMX *amx,cell *params)
|
template<class Type>
|
||||||
{
|
void Set(cell Index, Type value)
|
||||||
return NewArray(params[1], params[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Type> //This will support input char*, Vector*, int, and cell_real*.
|
|
||||||
void Array_Set(PPvoid_t Array, int Index, Type value)
|
|
||||||
{
|
|
||||||
PPvoid_t PValue; // pointer to array element value
|
|
||||||
PValue = JudyLIns(Array, Index, PJE0);
|
|
||||||
*PValue = reinterpret_cast<void*>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
PPvoid_t Array_Get(AMX* amx, PPvoid_t Array, int Index, int ignore_error = 0)
|
|
||||||
{
|
|
||||||
PPvoid_t PValue = JudyLGet( *Array, Index, PJE0 );
|
|
||||||
if (PValue == NULL && !ignore_error)
|
|
||||||
MF_LogError(amx, AMX_ERR_NATIVE, "Array index %d is invalid", Index);
|
|
||||||
return PValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeleteCell(PPvoid_t Array, Word_t Index)
|
|
||||||
{
|
|
||||||
JudyLDel(Array, Index, PJE0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL delete_array(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
DeleteArray( params[1] );
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL clear_array(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
ClearArray( params[1] );
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_Save(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1], params[3], amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
int filename_length;
|
|
||||||
char *file = MF_GetAmxString(amx, params[2], 0, &filename_length);
|
|
||||||
file = MF_BuildPathname("%s", file);
|
|
||||||
unlink(file);
|
|
||||||
FILE *ArrayDB = fopen(file,"w");
|
|
||||||
if (!ArrayDB)
|
|
||||||
return 0;
|
|
||||||
Word_t Index = 0;
|
|
||||||
PPvoid_t PValue = JudyLFirst(*Array, &Index, PJE0);
|
|
||||||
element elem = NULL;
|
|
||||||
char elem_type = 0;
|
|
||||||
|
|
||||||
int error;
|
|
||||||
|
|
||||||
REAL vector_data[3] = { 0.0, 0.0, 0.0 };
|
|
||||||
while (PValue)
|
|
||||||
{
|
{
|
||||||
elem = *reinterpret_cast<element*>(*PValue);
|
PPvoid_t PValue = JudyLIns(&Table, Index,PJE0);
|
||||||
elem_type = elem.get_type();
|
*PValue = reinterpret_cast<void*>(value);
|
||||||
|
|
||||||
if (elem_type < elem_type_int || elem_type > elem_type_vector)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
fwrite(&Index, sizeof(int), 1, ArrayDB);
|
|
||||||
fwrite(&elem_type, sizeof(char), 1, ArrayDB);
|
|
||||||
if (elem_type == elem_type_int)
|
|
||||||
{
|
|
||||||
int int_buffer = elem.get_int(error);
|
|
||||||
fwrite(&int_buffer, sizeof(int), 1, ArrayDB);
|
|
||||||
}
|
|
||||||
else if (elem_type == elem_type_real)
|
|
||||||
{
|
|
||||||
REAL flo_buffer = elem.get_flo(error);
|
|
||||||
fwrite(&flo_buffer, sizeof(REAL), 1, ArrayDB);
|
|
||||||
}
|
|
||||||
else if (elem_type == elem_type_char)
|
|
||||||
{
|
|
||||||
const char* str_buffer = elem.get_str(error);
|
|
||||||
short buf_len = strlen(str_buffer);
|
|
||||||
fwrite(&buf_len, sizeof(short), 1, ArrayDB);
|
|
||||||
fwrite(str_buffer, sizeof(char), buf_len, ArrayDB);
|
|
||||||
}
|
|
||||||
else if (elem_type == elem_type_vector)
|
|
||||||
{
|
|
||||||
const Vector* vec_buffer = elem.get_vec(error);
|
|
||||||
fwrite(vec_buffer, sizeof(Vector), 1, ArrayDB);
|
|
||||||
}
|
|
||||||
PValue = JudyLNext(*Array, &Index, PJE0);
|
|
||||||
}
|
}
|
||||||
fclose(ArrayDB);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_Load(AMX *amx, cell *params)
|
template <class Type>
|
||||||
{
|
Type Get(cell Index, Type example, bool disable_check = false)
|
||||||
//params[1]: file
|
|
||||||
int filename_length;
|
|
||||||
char *file = MF_GetAmxString(amx, params[1], 0, &filename_length);
|
|
||||||
file = MF_BuildPathname("%s", file);
|
|
||||||
FILE *ArrayDB = fopen(file, "a+");
|
|
||||||
if (!ArrayDB)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
//params[2]: array to create (optional index supplied)
|
|
||||||
int ArrayIndex = NewArray(params[2], params[3]);
|
|
||||||
ClearArray(ArrayIndex); //make sure the array is empty.
|
|
||||||
PPvoid_t Array = Find_Array(ArrayIndex);
|
|
||||||
while(!feof(ArrayDB))
|
|
||||||
{
|
{
|
||||||
int index = 0; char type = 0;
|
PPvoid_t PValue = JudyLGet(Table, Index, PJE0);
|
||||||
element *elem_value = NULL;
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
|
||||||
fread(&index, sizeof(int), 1, ArrayDB);
|
|
||||||
if (feof(ArrayDB) || ferror(ArrayDB))
|
|
||||||
break;
|
|
||||||
|
|
||||||
fread(&type, sizeof(char), 1, ArrayDB);
|
return (Type)(*PValue);
|
||||||
|
|
||||||
if (type < elem_type_int || type > elem_type_vector)
|
|
||||||
{
|
|
||||||
MF_LogError(amx, AMX_ERR_FORMAT, "Error loading array database \"%s\" into array %d. Bad file.", file, ArrayIndex);
|
|
||||||
return ArrayIndex;
|
|
||||||
}
|
|
||||||
else if (type == elem_type_int)
|
|
||||||
{
|
|
||||||
int value = 0; fread(&value, sizeof(int), 1, ArrayDB);
|
|
||||||
elem_value = new element(value);
|
|
||||||
}
|
|
||||||
else if (type == elem_type_real)
|
|
||||||
{
|
|
||||||
REAL value = 0; fread(&value, sizeof(REAL), 1, ArrayDB);
|
|
||||||
elem_value = new element(value);
|
|
||||||
}
|
|
||||||
else if (type == elem_type_char)
|
|
||||||
{
|
|
||||||
short length; fread(&length, sizeof(short), 1, ArrayDB);
|
|
||||||
char* value = new char[length+1]; fgets(value, length+1, ArrayDB);
|
|
||||||
elem_value = new element(value);
|
|
||||||
delete(value);
|
|
||||||
}
|
|
||||||
else if (type == elem_type_vector)
|
|
||||||
{
|
|
||||||
Vector *value = new Vector(); fread(value, sizeof(Vector), 1, ArrayDB);
|
|
||||||
elem_value = new element(value);
|
|
||||||
}
|
|
||||||
Array_Set(Array,index,elem_value);
|
|
||||||
}
|
}
|
||||||
fclose(ArrayDB);
|
|
||||||
return ArrayIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_Save_ASCII(AMX *amx, cell *params)
|
cell First(cell Start = 0);
|
||||||
{
|
cell Next(cell Start = 0);
|
||||||
//params[1]: file
|
cell Prev(cell Start = -1);
|
||||||
int filename_length;
|
cell Last(cell Start = -1);
|
||||||
char *inputfile = MF_GetAmxString(amx, params[1], 0, &filename_length);
|
|
||||||
inputfile = MF_BuildPathname("%s", inputfile);
|
|
||||||
FILE *ArrayDB = fopen(inputfile, "a+");
|
|
||||||
if (!ArrayDB)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
char *outputfile = MF_GetAmxString(amx, params[2], 0, &filename_length);
|
cell FirstEmpty(cell Start = 0);
|
||||||
outputfile = MF_BuildPathname("%s", outputfile);
|
cell NextEmpty(cell Start = 0);
|
||||||
FILE *ReadableDB = fopen(outputfile, "w");
|
cell PrevEmpty(cell Start = -1);
|
||||||
|
cell LastEmpty(cell Start = -1);
|
||||||
|
|
||||||
char *buffer = "\0";
|
cell ByCount(cell n, cell Start = 0);
|
||||||
char *buffer_two = "\0";
|
cell Count(cell Start = 0, cell Stop = -1) { return JudyLCount(Table, Start, Stop, PJE0); }
|
||||||
|
|
||||||
while(!feof(ArrayDB))
|
bool IsFilled(cell Index) { return ( (Get(Index, true ) != NULL) ? true : false); }
|
||||||
{
|
bool IsEmpty(cell Index) { return ( (Get(Index, true ) == NULL) ? true : false); }
|
||||||
Word_t index = 0; char type = 0;
|
|
||||||
fread(&index, sizeof(int), 1, ArrayDB);
|
|
||||||
if (feof(ArrayDB) || ferror(ArrayDB))
|
|
||||||
break;
|
|
||||||
|
|
||||||
fread(&type, sizeof(char), 1, ArrayDB);
|
|
||||||
|
|
||||||
sprintf(buffer, "Index % 11d\tType %7s,", index, elem_types[type]);
|
|
||||||
if (type < elem_type_int || type > elem_type_vector)
|
|
||||||
{
|
|
||||||
MF_LogError(amx, AMX_ERR_FORMAT, "Error loading array database \"%s\" into readable format. Bad file.", inputfile);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else if (type == elem_type_int)
|
|
||||||
{
|
|
||||||
int value = 0; fread(&value, sizeof(int), 1, ArrayDB);
|
|
||||||
sprintf(buffer, "%s\t\t\tValue: %d\n", buffer, value);
|
|
||||||
}
|
|
||||||
else if (type == elem_type_real)
|
|
||||||
{
|
|
||||||
REAL value = 0; fread(&value, sizeof(REAL), 1, ArrayDB);
|
|
||||||
sprintf(buffer, "%s\t\t\tValue: %f\n", buffer, value);
|
|
||||||
}
|
|
||||||
else if (type == elem_type_char)
|
|
||||||
{
|
|
||||||
short length; fread(&length, sizeof(short), 1, ArrayDB);
|
|
||||||
char* value = new char[length+1]; fgets(value, length+1, ArrayDB);
|
|
||||||
sprintf(buffer, "%s Length: %d\tValue: \"%s\"\n", buffer, length, value);
|
|
||||||
delete value;
|
|
||||||
}
|
|
||||||
else if (type == elem_type_vector)
|
|
||||||
{
|
|
||||||
Vector *value = new Vector(); fread(value, sizeof(Vector), 1, ArrayDB);
|
|
||||||
sprintf(buffer, "%s\t\t\tValue: {%f,%f,%f}\n", buffer, (*value).x, (*value).y, (*value).z);
|
|
||||||
delete value;
|
|
||||||
}
|
|
||||||
fwrite(buffer, sizeof(char), strlen(buffer), ReadableDB);
|
|
||||||
}
|
|
||||||
fclose(ArrayDB);
|
|
||||||
fclose(ReadableDB);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_SetVector(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1], params[4], amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
cell *input_vec = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
Vector *value = new Vector(
|
|
||||||
amx_ctof(input_vec[0]),
|
|
||||||
amx_ctof(input_vec[1]),
|
|
||||||
amx_ctof(input_vec[2])
|
|
||||||
);
|
|
||||||
int Index = params[2];
|
|
||||||
|
|
||||||
PPvoid_t PValue = Array_Get(amx, Array, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(value);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
|
||||||
(*elem_value).set_vec(value);
|
|
||||||
}
|
|
||||||
Array_Set(Array,Index,elem_value);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_GetVector(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1], params[4], amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
int Index = params[2];
|
|
||||||
PPvoid_t PValue = Array_Get(amx, Array, Index, params[4]);
|
|
||||||
|
|
||||||
cell *vAmx = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
|
|
||||||
if( PValue == NULL ) {
|
|
||||||
vAmx[0] = amx_ftoc(0);
|
|
||||||
vAmx[1] = amx_ftoc(0);
|
|
||||||
vAmx[2] = amx_ftoc(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
int error = 0;
|
|
||||||
const Vector retr_vec = *elem_value.get_vec(error);
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
vAmx[0] = amx_ftoc(retr_vec.x);
|
|
||||||
vAmx[1] = amx_ftoc(retr_vec.y);
|
|
||||||
vAmx[2] = amx_ftoc(retr_vec.z);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_SetString(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: array
|
|
||||||
PPvoid_t Array = Find_Array(params[1], params[4], amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: index
|
|
||||||
int Index = params[2];
|
|
||||||
|
|
||||||
//params[3]: value
|
|
||||||
int iLen = 0;
|
|
||||||
char *value = MF_GetAmxString(amx,params[3],1,&iLen);
|
|
||||||
|
|
||||||
//element that is stored at index
|
|
||||||
PPvoid_t PValue = Array_Get(amx, Array, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(value);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
|
||||||
(*elem_value).set_str(value);
|
|
||||||
}
|
|
||||||
Array_Set(Array,Index,elem_value);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_GetString(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: array
|
|
||||||
PPvoid_t Array = Find_Array(params[1], params[5], amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: index
|
|
||||||
int Index = params[2];
|
|
||||||
|
|
||||||
Pvoid_t * PValue = Array_Get(amx, Array, Index, params[5]);
|
|
||||||
|
|
||||||
//params[3] and params[4] are the return string and length respectively.
|
|
||||||
|
|
||||||
if( PValue == NULL ) return MF_SetAmxString( amx , params[3] , "dne", params[4] );
|
|
||||||
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
const char* str_out = elem_value.get_str(error);
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
return MF_SetAmxString( amx , params[3] , str_out, params[4] );
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_SetFloat(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: array
|
|
||||||
PPvoid_t Array = Find_Array(params[1], params[4], amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: index
|
|
||||||
int Index = params[2];
|
|
||||||
|
|
||||||
//params[3]: value
|
|
||||||
PPvoid_t PValue = Array_Get(amx, Array, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(amx_ctof(params[3]));
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
|
||||||
(*elem_value).set_flo(amx_ctof(params[3]));
|
|
||||||
}
|
|
||||||
Array_Set(Array,Index,elem_value);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_GetFloat(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: array
|
|
||||||
PPvoid_t Array = Find_Array(params[1], params[3], amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: index
|
|
||||||
int Index = params[2];
|
|
||||||
|
|
||||||
PPvoid_t PValue = Array_Get(amx, Array, Index, params[3]);
|
|
||||||
|
|
||||||
if( PValue == NULL ) return amx_ftoc(0.0);
|
|
||||||
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
cell retr_float = amx_ftoc(elem_value.get_flo(error));
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
return retr_float;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_SetInt(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: array
|
|
||||||
PPvoid_t Array = Find_Array(params[1], params[3], amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: index
|
|
||||||
int Index = params[2];
|
|
||||||
|
|
||||||
PPvoid_t PValue = Array_Get(amx, Array, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(params[3]);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
|
||||||
(*elem_value).set_int(params[3]);
|
|
||||||
}
|
|
||||||
Array_Set(Array,Index,elem_value);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_GetInt(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: array
|
|
||||||
PPvoid_t Array = Find_Array(params[1], params[3], amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: index
|
|
||||||
int Index = params[2];
|
|
||||||
|
|
||||||
Pvoid_t * PValue = Array_Get(amx, Array, Index, params[3]);
|
|
||||||
|
|
||||||
if( PValue == NULL ) return 0;
|
|
||||||
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
cell retr_int = elem_value.get_int(error);
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
return retr_int;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_size(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
Pvoid_t * Array = Find_Array(params[1],params[4],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
return JudyLCount( *Array, params[2], params[3],PJE0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_count(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
return JudyLCount( MasterArray, params[1], params[2],PJE0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_memory(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
Pvoid_t * Array = Find_Array(params[1],params[2],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
return JudyLMemUsed(*Array);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL delete_cell(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
Pvoid_t * Array = Find_Array(params[1]);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
DeleteCell( Array, params[2] );
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_next(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[4],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
Word_t Index = Word_t(params[2]);
|
|
||||||
cell *success = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudyLNext(*Array, &Index, PJE0);
|
|
||||||
|
|
||||||
*success = (pointer == NULL) ? 0 : 1;
|
|
||||||
return cell(Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_prev(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[4],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
Word_t Index = Word_t(params[2]);
|
|
||||||
cell *success = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudyLPrev(*Array, &Index, PJE0);
|
|
||||||
|
|
||||||
*success = (pointer == NULL) ? 0 : 1;
|
|
||||||
return cell(Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_first(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[4],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
Word_t Index = Word_t(params[2]);
|
|
||||||
cell *success = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudyLFirst(*Array, &Index, PJE0);
|
|
||||||
|
|
||||||
*success = (pointer == NULL) ? 0 : 1;
|
|
||||||
return cell(Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_last(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[4],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
Word_t Index = Word_t(params[2]);
|
|
||||||
cell *success = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudyLLast(*Array, &Index, PJE0);
|
|
||||||
|
|
||||||
*success = (pointer == NULL) ? 0 : 1;
|
|
||||||
return cell(Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_nextempty(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[4],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
Word_t Index = (Word_t)params[2];
|
|
||||||
|
|
||||||
cell *success = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
*success = JudyLNextEmpty(*Array, &Index, PJE0);
|
|
||||||
|
|
||||||
return (cell)Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_prevempty(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[4],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
Word_t Index = (Word_t)params[2];
|
|
||||||
|
|
||||||
cell *success = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
*success = JudyLPrevEmpty(*Array, &Index, PJE0);
|
|
||||||
|
|
||||||
return (cell)Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_firstempty(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[4],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
Word_t Index = (Word_t)params[2];
|
|
||||||
|
|
||||||
cell *success = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
*success = JudyLFirstEmpty(*Array, &Index, PJE0);
|
|
||||||
|
|
||||||
return (cell)Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_lastempty(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[4],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
Word_t Index = (Word_t)params[2];
|
|
||||||
|
|
||||||
cell *success = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
*success = JudyLLastEmpty(*Array, &Index, PJE0);
|
|
||||||
|
|
||||||
return (cell)Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_isempty(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[3],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudyLGet(*Array, params[2], PJE0);
|
|
||||||
|
|
||||||
return (pointer == NULL) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL array_isfilled(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: array
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[3],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: index
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudyLGet(*Array, params[2], PJE0);
|
|
||||||
|
|
||||||
return (pointer != NULL) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Array_ByCount(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Array = Find_Array(params[1],params[4],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
Word_t Index = Word_t(params[3]);
|
|
||||||
cell *success = MF_GetAmxAddr(amx, params[4]);
|
|
||||||
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudyLByCount(*Array, params[2], &Index, PJE0);
|
|
||||||
|
|
||||||
*success = (pointer == NULL) ? 0 : 1;
|
|
||||||
return cell(Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
AMX_NATIVE_INFO array_exports[] = {
|
|
||||||
{ "array_set_string", Array_SetString },
|
|
||||||
{ "array_get_string", Array_GetString },
|
|
||||||
|
|
||||||
{ "array_set_int", Array_SetInt },
|
|
||||||
{ "array_get_int", Array_GetInt },
|
|
||||||
|
|
||||||
{ "array_set_float", Array_SetFloat },
|
|
||||||
{ "array_get_float", Array_GetFloat },
|
|
||||||
|
|
||||||
{ "array_set_vector", Array_SetVector },
|
|
||||||
{ "array_get_vector", Array_GetVector },
|
|
||||||
|
|
||||||
{ "array_isempty", array_isempty },
|
|
||||||
{ "array_isfilled", array_isfilled },
|
|
||||||
|
|
||||||
{ "array_remove", delete_cell },
|
|
||||||
|
|
||||||
{ "array_create", new_array },
|
|
||||||
{ "array_delete", delete_array },
|
|
||||||
{ "array_clear", clear_array },
|
|
||||||
|
|
||||||
{ "array_size", array_size },
|
|
||||||
{ "array_count", array_count },
|
|
||||||
{ "array_memory", array_memory },
|
|
||||||
|
|
||||||
{ "array_nextempty", array_nextempty },
|
|
||||||
{ "array_prevempty", array_prevempty },
|
|
||||||
{ "array_firstempty", array_firstempty },
|
|
||||||
{ "array_lastempty", array_lastempty },
|
|
||||||
{ "array_next", array_next },
|
|
||||||
{ "array_prev", array_prev },
|
|
||||||
{ "array_first", array_first },
|
|
||||||
{ "array_last", array_last },
|
|
||||||
|
|
||||||
{ "array_save", Array_Save },
|
|
||||||
{ "array_load", Array_Load },
|
|
||||||
|
|
||||||
{ "array_get_nth", Array_ByCount },
|
|
||||||
|
|
||||||
{ "array_save_ascii", Array_Save_ASCII },
|
|
||||||
|
|
||||||
{ NULL, NULL }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
36
dlls/arrayx/CBaseList.h
Normal file
36
dlls/arrayx/CBaseList.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#ifndef _BASE_ARRAYCLASS_H
|
||||||
|
#define _BASE_ARRAYCLASS_H
|
||||||
|
|
||||||
|
#include "JudyIncludes.h"
|
||||||
|
|
||||||
|
class CBaseList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual Word_t Clear() =0;
|
||||||
|
virtual Word_t MemoryUsed() =0;
|
||||||
|
|
||||||
|
virtual int Delete(cell Key) =0;
|
||||||
|
virtual void Remove() =0;
|
||||||
|
|
||||||
|
virtual void Set(cell Index, Pvoid_t value, bool disable_check = false) =0;
|
||||||
|
|
||||||
|
virtual Pvoid_t Get(cell Index, bool disable_check = false) =0;
|
||||||
|
|
||||||
|
virtual cell First(cell Start = 0) =0;
|
||||||
|
virtual cell Next(cell Start = 0) =0;
|
||||||
|
virtual cell Prev(cell Start = -1) =0;
|
||||||
|
virtual cell Last(cell Start = -1) =0;
|
||||||
|
|
||||||
|
virtual cell FirstEmpty(cell Start = 0) =0;
|
||||||
|
virtual cell NextEmpty(cell Start = 0) =0;
|
||||||
|
virtual cell PrevEmpty(cell Start = -1) =0;
|
||||||
|
virtual cell LastEmpty(cell Start = -1) =0;
|
||||||
|
|
||||||
|
virtual cell ByCount(cell n, cell Start = 0) =0;
|
||||||
|
virtual cell Count(cell Start = 0, cell Stop = -1) =0;
|
||||||
|
|
||||||
|
virtual bool IsFilled(cell Index) =0;
|
||||||
|
virtual bool IsEmpty(cell Index) =0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
29
dlls/arrayx/CBaseMap.h
Normal file
29
dlls/arrayx/CBaseMap.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef _BASE_MAPCLASS_H
|
||||||
|
#define _BASE_MAPCLASS_H
|
||||||
|
|
||||||
|
#include "JudyIncludes.h"
|
||||||
|
|
||||||
|
class CBaseMap
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual Word_t Clear() =0;
|
||||||
|
virtual Word_t MemoryUsed() =0;
|
||||||
|
|
||||||
|
virtual int Delete(char* Key) =0;
|
||||||
|
virtual void Remove() =0;
|
||||||
|
|
||||||
|
virtual void Set(char* Index, Pvoid_t value, bool disable_check = false) =0;
|
||||||
|
|
||||||
|
virtual Pvoid_t Get(char* Index, bool disable_check = false) =0;
|
||||||
|
|
||||||
|
virtual char* First(char* Start = "") =0;
|
||||||
|
virtual char* Next(char* Start) =0;
|
||||||
|
virtual char* Prev(char* Start) =0;
|
||||||
|
virtual char* Last(char* Start) =0;
|
||||||
|
|
||||||
|
virtual bool IsFilled(char* Index) =0;
|
||||||
|
virtual bool IsEmpty(char* Index) =0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
76
dlls/arrayx/CBinTrie.cpp
Normal file
76
dlls/arrayx/CBinTrie.cpp
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
#include "CBinTrie.h"
|
||||||
|
|
||||||
|
void BinTrie::ThrowSearchError(char* type)
|
||||||
|
{
|
||||||
|
char value[50];
|
||||||
|
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
|
||||||
|
|
||||||
|
throw JudyEx (value,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::First( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1First(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:First");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::FirstEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1FirstEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:FirstEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::Next( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1Next(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Next");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::NextEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1NextEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:NextEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::Prev( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1Prev(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Prev");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::PrevEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1PrevEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:PrevEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::Last( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1Last(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Last");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::LastEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1LastEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:LastEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::ByCount(cell n, cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1ByCount(Table, n, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Nth");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
54
dlls/arrayx/CBinTrie.h
Normal file
54
dlls/arrayx/CBinTrie.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#ifndef _BINTRIECLASS_H
|
||||||
|
#define _BINTRIECLASS_H
|
||||||
|
|
||||||
|
#include "JudyIncludes.h"
|
||||||
|
#include "JudyExtra.h"
|
||||||
|
//#include <Judy1.h>
|
||||||
|
|
||||||
|
class BinTrie
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Pvoid_t Table;
|
||||||
|
|
||||||
|
void ThrowSearchError(char* msg);
|
||||||
|
|
||||||
|
public:
|
||||||
|
BinTrie() { Table = NULL; }
|
||||||
|
~BinTrie() { Clear(); }
|
||||||
|
void Remove() { delete this; }
|
||||||
|
|
||||||
|
Word_t Clear() { JudyClearBinTrie(this); return Judy1FreeArray(&Table, PJE0); }
|
||||||
|
Word_t MemoryUsed() { return Judy1MemUsed(Table); }
|
||||||
|
|
||||||
|
cell Delete(cell Key) { return Judy1Unset(&Table, Key, PJE0 ); }
|
||||||
|
|
||||||
|
cell Set(cell Index, bool val)
|
||||||
|
{
|
||||||
|
if(val == false) return Delete(Index);
|
||||||
|
else return Judy1Set(&Table, Index,PJE0);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Get(cell Index)
|
||||||
|
{
|
||||||
|
cell PValue = Judy1Test(Table, Index, PJE0);
|
||||||
|
return PValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell First(cell Start = 0);
|
||||||
|
cell Next(cell Start = 0);
|
||||||
|
cell Prev(cell Start = -1);
|
||||||
|
cell Last(cell Start = -1);
|
||||||
|
|
||||||
|
cell FirstEmpty(cell Start = 0);
|
||||||
|
cell NextEmpty(cell Start = 0);
|
||||||
|
cell PrevEmpty(cell Start = -1);
|
||||||
|
cell LastEmpty(cell Start = -1);
|
||||||
|
|
||||||
|
cell ByCount(cell n, cell Start);
|
||||||
|
cell Count(cell Start = 0, cell Stop = -1) { return Judy1Count(Table, Start, Stop, PJE0); }
|
||||||
|
|
||||||
|
bool IsFilled(cell Index) { return ( (Get(Index )) ? true : false); }
|
||||||
|
bool IsEmpty(cell Index) { return ( (Get(Index )) ? true : false); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -1,375 +1,82 @@
|
|||||||
#if !defined _JUDYHS_ENABLED_
|
#ifndef _HASHCLASS_INCLUDED
|
||||||
#define _JUDYHS_ENABLED_
|
#define _HASHCLASS_INCLUDED
|
||||||
|
|
||||||
Pvoid_t MasterHashtable = (Pvoid_t) NULL; //Create the new array
|
#include "JudyIncludes.h"
|
||||||
|
#include "CBaseMap.h"
|
||||||
|
//#include <JudyHS.h>
|
||||||
|
|
||||||
//Create an array that stores whether or not indices are used.
|
class Hashtable: public CBaseMap
|
||||||
Pvoid_t MasterHashtable_Binary = (Pvoid_t) NULL;
|
|
||||||
|
|
||||||
void Delete_MasterHashtable(void);
|
|
||||||
|
|
||||||
Word_t New_Hashtable(Word_t Index, Word_t reserve = 0);
|
|
||||||
Pvoid_t* Find_Hashtable(Word_t Index, Word_t disable_check = 1, AMX *amx = 0);
|
|
||||||
void Delete_Hashtable(Word_t Index);
|
|
||||||
void Clear_Hashtable(Word_t Index);
|
|
||||||
|
|
||||||
template <class Type>
|
|
||||||
void Hashtable_Set(PPvoid_t Hashtable, char *Index, Word_t Length, Type value);
|
|
||||||
|
|
||||||
PPvoid_t Hashtable_Get(AMX* amx, Pvoid_t Hashtable, char *Index, int ignore_error = 0);
|
|
||||||
|
|
||||||
void Delete_MasterHashtable(void)
|
|
||||||
{
|
{
|
||||||
Word_t
|
private:
|
||||||
Index = 0,
|
Pvoid_t Table;
|
||||||
success;
|
|
||||||
J1F(success, MasterHashtable_Binary, Index);
|
public:
|
||||||
while( success )
|
Hashtable() { Table = NULL; }
|
||||||
|
~Hashtable() { Clear(); }
|
||||||
|
void Remove() { delete this; }
|
||||||
|
|
||||||
|
Word_t Clear() { return JudyHSFreeArray(&Table, PJE0); }
|
||||||
|
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
|
||||||
|
|
||||||
|
int Delete(char* Key) { return JudyHSDel(&Table, Key, strlen(Key), PJE0 ); }
|
||||||
|
|
||||||
|
void Set(char* Index, Pvoid_t value, bool disable_check)
|
||||||
{
|
{
|
||||||
Delete_Hashtable(Index);
|
int Len = strlen(Index) + 1;
|
||||||
J1F(success, MasterHashtable_Binary, Index);
|
PPvoid_t PValue = JudyHSIns(&Table, Index, Len, PJE0);
|
||||||
|
*PValue = value;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Word_t New_Hashtable(Word_t Index, Word_t reserve)
|
Pvoid_t Get(char* Index, bool disable_check = false)
|
||||||
{
|
|
||||||
Word_t success; //Dummy for macros.
|
|
||||||
J1T(success, MasterHashtable_Binary, Index);
|
|
||||||
|
|
||||||
if (success && reserve)
|
|
||||||
return Index; //If the bit is set but it's 'reserved', return the index.
|
|
||||||
|
|
||||||
//Only do this if the bit is not set or not reserved.
|
|
||||||
J1FE(success, MasterHashtable_Binary, Index);
|
|
||||||
J1S(success, MasterHashtable_Binary, Index);
|
|
||||||
|
|
||||||
PPvoid_t Hashtable = JudyLIns(&MasterHashtable, Index, PJE0);
|
|
||||||
*Hashtable = (PWord_t) NULL;
|
|
||||||
|
|
||||||
return Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
PPvoid_t Find_Hashtable(Word_t Index, Word_t disable_check, AMX* amx)
|
|
||||||
{
|
|
||||||
Word_t success;
|
|
||||||
J1T(success, MasterHashtable_Binary, Index);
|
|
||||||
if (success || disable_check)
|
|
||||||
{ //Bit is valid
|
|
||||||
if(!success)
|
|
||||||
New_Hashtable(Index);
|
|
||||||
|
|
||||||
return JudyLGet(MasterHashtable, Index, PJE0);
|
|
||||||
}
|
|
||||||
MF_LogError(amx,AMX_ERR_NATIVE,"Hashtable %d is invalid.", Index);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Delete_Hashtable(Word_t Index)
|
|
||||||
{
|
|
||||||
int success;
|
|
||||||
J1T(success, MasterHashtable_Binary, Index);
|
|
||||||
if (success)
|
|
||||||
{ //If the bit was set, clear, unset and delist hashtable.
|
|
||||||
Clear_Hashtable(Index);
|
|
||||||
J1U(success, MasterHashtable_Binary, Index);
|
|
||||||
JudyLDel(&MasterHashtable, Index, PJE0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Clear_Hashtable(Word_t Index)
|
|
||||||
{
|
|
||||||
int success;
|
|
||||||
J1T(success, MasterHashtable_Binary, Index);
|
|
||||||
if (success) //dont bother with unset hashtables.
|
|
||||||
{
|
{
|
||||||
PPvoid_t Hashtable = Find_Hashtable(Index);
|
PPvoid_t PValue = JudyHSGet(Table, Index, strlen(Index)+1);
|
||||||
JHSFA(success, *Hashtable);
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
|
||||||
|
|
||||||
|
return *PValue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
template <class Type> //This will support input char*, Vector*, int, and cell_real*.
|
template <class Type>
|
||||||
void Hashtable_Set(PPvoid_t Hashtable, char* Index, Type value)
|
void Set(char* Index, Type value)
|
||||||
{
|
|
||||||
int Len = strlen(Index)+1;
|
|
||||||
PPvoid_t PValue = JudyHSIns(Hashtable, Index, Len, PJE0);
|
|
||||||
*PValue = reinterpret_cast<void*>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
PPvoid_t Hashtable_Get(AMX* amx,PPvoid_t Hashtable, char *Index, int ignore_error = 0)
|
|
||||||
{
|
|
||||||
PPvoid_t PValue = JudyHSGet(*Hashtable, Index, strlen(Index)+1);
|
|
||||||
if (PValue == NULL && !ignore_error)
|
|
||||||
MF_LogError(amx, AMX_ERR_NATIVE, "Hashtable get on index \"%s\" is invalid", Index);
|
|
||||||
return PValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_Create(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
return New_Hashtable(params[1],params[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_Delete(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
Delete_Hashtable( params[1] );
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_Clear(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
Clear_Hashtable( params[1] );
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_SetVector(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Hashtable = Find_Hashtable(params[1], params[4], amx);
|
|
||||||
if (Hashtable == NULL) return 0;
|
|
||||||
|
|
||||||
cell *input_vec = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
Vector *value = new Vector(
|
|
||||||
amx_ctof(input_vec[0]),
|
|
||||||
amx_ctof(input_vec[1]),
|
|
||||||
amx_ctof(input_vec[2])
|
|
||||||
);
|
|
||||||
int strlen;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlen);
|
|
||||||
|
|
||||||
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(value);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
int Len = strlen(Index) + 1;
|
||||||
(*elem_value).set_vec(value);
|
PPvoid_t PValue = JudyHSIns(&Table, Index, Len, PJE0);
|
||||||
|
*PValue = reinterpret_cast<void*>(value);
|
||||||
}
|
}
|
||||||
Hashtable_Set(Hashtable,Index,elem_value);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
template <class Type>
|
||||||
static cell AMX_NATIVE_CALL Hashtable_GetVector(AMX *amx, cell *params)
|
Type Get(char* Index, Type example, bool disable_check = false)
|
||||||
{
|
|
||||||
PPvoid_t Hashtable = Find_Hashtable(params[1], params[4], amx);
|
|
||||||
if (Hashtable == NULL) return 0;
|
|
||||||
|
|
||||||
int strlen;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlen);
|
|
||||||
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, params[4]);
|
|
||||||
|
|
||||||
cell *vAmx = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
|
|
||||||
if( PValue == NULL ) {
|
|
||||||
vAmx[0] = amx_ftoc(0);
|
|
||||||
vAmx[1] = amx_ftoc(0);
|
|
||||||
vAmx[2] = amx_ftoc(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
int error = 0;
|
|
||||||
const Vector retr_vec = *elem_value.get_vec(error);
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
vAmx[0] = amx_ftoc(retr_vec.x);
|
|
||||||
vAmx[1] = amx_ftoc(retr_vec.y);
|
|
||||||
vAmx[2] = amx_ftoc(retr_vec.z);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_SetString(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: hashtable
|
|
||||||
PPvoid_t Hashtable = Find_Hashtable(params[1], params[4], amx);
|
|
||||||
if (Hashtable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
//params[3]: value
|
|
||||||
int iLen = 0;
|
|
||||||
char *value = MF_GetAmxString(amx,params[3],1,&iLen);
|
|
||||||
|
|
||||||
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(value);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
PPvoid_t PValue = JudyHSGet(Table, Index, strlen(Index)+1);
|
||||||
(*elem_value).set_str(value);
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
|
||||||
|
|
||||||
|
return (Type)(*PValue);
|
||||||
}
|
}
|
||||||
Hashtable_Set(Hashtable,Index,elem_value);
|
|
||||||
|
|
||||||
return 1;
|
char* First( char* Start = "") { ThrowSearchError(); return (char*)NULL; }
|
||||||
}
|
char* Next( char* Start = "") { ThrowSearchError(); return (char*)NULL; }
|
||||||
|
char* Prev( char* Start) { ThrowSearchError(); return (char*)NULL; }
|
||||||
|
char* Last( char* Start) { ThrowSearchError(); return (char*)NULL; }
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_GetString(AMX *amx,cell *params)
|
bool IsFilled(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false);}
|
||||||
{
|
bool IsEmpty(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false);}
|
||||||
//params[1]: hashtable
|
|
||||||
PPvoid_t Hashtable = Find_Hashtable(params[1], params[5], amx);
|
|
||||||
if (Hashtable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
protected:
|
||||||
int strlength;
|
void ThrowIndexError( char* index, bool disable_check = false )
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
Pvoid_t * PValue = Hashtable_Get(amx, Hashtable, Index, params[5]);
|
|
||||||
|
|
||||||
//params[3] and params[4] are the return string and length respectively.
|
|
||||||
|
|
||||||
|
|
||||||
if( PValue == NULL )
|
|
||||||
return MF_SetAmxString(amx, params[3] , "dne", params[4] );
|
|
||||||
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
const char* str_out = elem_value.get_str(error);
|
|
||||||
return MF_SetAmxString( amx , params[3] , str_out, params[4] );
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_SetFloat(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: hashtable
|
|
||||||
PPvoid_t Hashtable = Find_Hashtable(params[1], params[4], amx);
|
|
||||||
if (Hashtable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
//params[3]: value
|
|
||||||
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(amx_ctof(params[3]));
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
if(disable_check == true) return;
|
||||||
(*elem_value).set_flo(amx_ctof(params[3]));
|
|
||||||
|
char value[100];
|
||||||
|
sprintf(value,"Function attempted to read non existant index %s", index );
|
||||||
|
|
||||||
|
throw JudyEx(value, true);
|
||||||
}
|
}
|
||||||
Hashtable_Set(Hashtable,Index,elem_value);
|
void ThrowSearchError( void )
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_GetFloat(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: hashtable
|
|
||||||
PPvoid_t Hashtable = Find_Hashtable(params[1], params[3], amx);
|
|
||||||
if (Hashtable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, params[3]);
|
|
||||||
|
|
||||||
if( PValue == NULL ) return amx_ftoc(0.0);
|
|
||||||
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
cell retr_float = amx_ftoc(elem_value.get_flo(error));
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
return retr_float;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_SetInt(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: hashtable
|
|
||||||
PPvoid_t Hashtable = Find_Hashtable(params[1], params[4], amx);
|
|
||||||
if (Hashtable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(params[3]);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
char value[50];
|
||||||
(*elem_value).set_int(params[3]);
|
sprintf(value,"Function attempted to search HashTable!: Invalid action!");
|
||||||
|
|
||||||
|
throw JudyEx(value,true);
|
||||||
}
|
}
|
||||||
Hashtable_Set(Hashtable,Index,elem_value);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_GetInt(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: hashtable
|
|
||||||
PPvoid_t Hashtable = Find_Hashtable(params[1], params[3], amx);
|
|
||||||
if (Hashtable == NULL) return 0;
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
Pvoid_t * PValue = Hashtable_Get(amx, Hashtable, Index, params[3]);
|
|
||||||
|
|
||||||
if( PValue == NULL ) return 0;
|
|
||||||
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
cell retr_int = elem_value.get_int(error);
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
return retr_int;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_Memory(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
Pvoid_t * Array = Find_Hashtable(params[1],params[2],amx);
|
|
||||||
if (Array == NULL) return 0;
|
|
||||||
|
|
||||||
return JudyLMemUsed(*Array);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Hashtable_Remove(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: hashtable
|
|
||||||
PPvoid_t Hashtable = Find_Hashtable(params[1], 0, amx);
|
|
||||||
if (Hashtable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
JudyHSDel(Hashtable, Index, strlength+1, PJE0 );
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
AMX_NATIVE_INFO hashtable_exports[] = {
|
|
||||||
{ "hashtable_set_str", Hashtable_SetString },
|
|
||||||
{ "hashtable_get_str", Hashtable_GetString },
|
|
||||||
|
|
||||||
{ "hashtable_set_vec", Hashtable_SetVector },
|
|
||||||
{ "hashtable_get_vec", Hashtable_GetVector },
|
|
||||||
|
|
||||||
{ "hashtable_set_int", Hashtable_SetInt },
|
|
||||||
{ "hashtable_get_int", Hashtable_GetInt },
|
|
||||||
|
|
||||||
{ "hashtable_set_float", Hashtable_SetFloat },
|
|
||||||
{ "hashtable_get_float", Hashtable_GetFloat },
|
|
||||||
|
|
||||||
{ "hashtable_memory", Hashtable_Memory },
|
|
||||||
|
|
||||||
{ "hashtable_remove", Hashtable_Remove },
|
|
||||||
|
|
||||||
{ "hashtable_create", Hashtable_Create },
|
|
||||||
{ "hashtable_delete", Hashtable_Delete },
|
|
||||||
{ "hashtable_clear", Hashtable_Clear },
|
|
||||||
{ NULL, NULL }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
66
dlls/arrayx/CKeytable.cpp
Normal file
66
dlls/arrayx/CKeytable.cpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#include "CKeytable.h"
|
||||||
|
|
||||||
|
void Keytable::ThrowIndexError( char* index, bool disable_check = false )
|
||||||
|
{
|
||||||
|
if(disable_check == true) return;
|
||||||
|
|
||||||
|
char error[50];
|
||||||
|
sprintf(error,"Index %s is not set.",index);
|
||||||
|
|
||||||
|
throw JudyEx(error,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Keytable::ThrowSearchError(char* type)
|
||||||
|
{
|
||||||
|
char value[50];
|
||||||
|
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
|
||||||
|
|
||||||
|
throw JudyEx(value,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
char* Keytable::First( char* Start)
|
||||||
|
{
|
||||||
|
PPvoid_t index = JudySLFirst(Table, Start, PJE0);
|
||||||
|
if (index == NULL)
|
||||||
|
{
|
||||||
|
sprintf(Start,"dne");
|
||||||
|
ThrowSearchError("Type:First");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* Keytable::Next( char* Start)
|
||||||
|
{
|
||||||
|
PPvoid_t index = JudySLNext(Table, Start, PJE0);
|
||||||
|
if (index == NULL)
|
||||||
|
{
|
||||||
|
sprintf(Start,"dne");
|
||||||
|
ThrowSearchError("Type:Next");
|
||||||
|
}
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* Keytable::Prev( char* Start)
|
||||||
|
{
|
||||||
|
PPvoid_t index = JudySLPrev(Table, Start, PJE0);
|
||||||
|
if (index == NULL)
|
||||||
|
{
|
||||||
|
sprintf(Start,"dne");
|
||||||
|
ThrowSearchError("Type:Prev");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* Keytable::Last( char* Start)
|
||||||
|
{
|
||||||
|
PPvoid_t index = JudySLLast(Table, Start, PJE0);
|
||||||
|
if (index == NULL)
|
||||||
|
{
|
||||||
|
sprintf(Start,"dne");
|
||||||
|
ThrowSearchError("Type:Last");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
@ -1,703 +1,66 @@
|
|||||||
#if !defined _JUDYSL_ENABLED_
|
#ifndef _KEYCLASS_INCLUDED
|
||||||
#define _JUDYSL_ENABLED_
|
#define _KEYCLASS_INCLUDED
|
||||||
|
|
||||||
#define MAXLINELEN 1024
|
#include "JudyIncludes.h"
|
||||||
|
#include "CBaseMap.h"
|
||||||
|
#include "JudyExtra.h"
|
||||||
|
//#include <JudySL.h>
|
||||||
|
|
||||||
Pvoid_t MasterKeytable = (Pvoid_t) NULL; //Create the control array
|
class Keytable: public CBaseMap
|
||||||
|
|
||||||
//Create an array that stores whether or not indices are used.
|
|
||||||
Pvoid_t MasterKeytable_Binary = (Pvoid_t) NULL;
|
|
||||||
|
|
||||||
void Delete_MasterKeytable(void);
|
|
||||||
|
|
||||||
Word_t New_Keytable(Word_t Index, Word_t reserve = 0);
|
|
||||||
PPvoid_t Find_Keytable(Word_t Index, Word_t disable_check = 1, AMX *amx = 0);
|
|
||||||
void Delete_Keytable(Word_t Index);
|
|
||||||
void Clear_Keytable(Word_t Index);
|
|
||||||
|
|
||||||
template <class Type>
|
|
||||||
void Keytable_Set(PPvoid_t Keytable, char *Index, Type value);
|
|
||||||
|
|
||||||
PPvoid_t Keytable_Get(AMX* amx, Pvoid_t Keytable, char *Index, int ignore_error = 0);
|
|
||||||
|
|
||||||
|
|
||||||
void Delete_MasterKeytable(void)
|
|
||||||
{
|
{
|
||||||
Word_t
|
private:
|
||||||
Index = 0,
|
Pvoid_t Table;
|
||||||
success;
|
|
||||||
J1F(success, MasterKeytable_Binary, Index);
|
void ThrowSearchError(char* type);
|
||||||
while( success )
|
void ThrowIndexError( char* index, bool disable_check);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Keytable() { Table = NULL; }
|
||||||
|
~Keytable() { Clear(); }
|
||||||
|
void Remove() { delete this; }
|
||||||
|
|
||||||
|
Word_t Clear() { JudyClearMap(this); return JudySLFreeArray(&Table, PJE0); }
|
||||||
|
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
|
||||||
|
|
||||||
|
int Delete(char* Key) { return JudySLDel(&Table, Key, PJE0 ); }
|
||||||
|
|
||||||
|
void Set(char* Index, Pvoid_t value, bool disable_check)
|
||||||
{
|
{
|
||||||
Delete_Keytable(Index);
|
PPvoid_t PValue = JudySLIns(&Table, Index,PJE0);
|
||||||
J1F(success, MasterKeytable_Binary, Index);
|
*PValue = value;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Word_t New_Keytable(Word_t Index, Word_t reserve)
|
Pvoid_t Get(char* Index, bool disable_check = false)
|
||||||
{
|
|
||||||
Word_t success; //Dummy for macros.
|
|
||||||
J1T(success, MasterKeytable_Binary, Index);
|
|
||||||
|
|
||||||
if (success && reserve)
|
|
||||||
return Index; //If the bit is set but it's 'reserved', return the index.
|
|
||||||
|
|
||||||
//Only do this if the bit is not set or not reserved.
|
|
||||||
J1FE(success, MasterKeytable_Binary, Index);
|
|
||||||
J1S(success, MasterKeytable_Binary, Index);
|
|
||||||
|
|
||||||
PPvoid_t Keytable = JudyLIns(&MasterKeytable, Index, PJE0);
|
|
||||||
*Keytable = (PWord_t) NULL;
|
|
||||||
|
|
||||||
return Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
PPvoid_t Find_Keytable(Word_t Index, Word_t disable_check, AMX* amx)
|
|
||||||
{
|
|
||||||
Word_t success;
|
|
||||||
J1T(success, MasterKeytable_Binary, Index);
|
|
||||||
if (success || disable_check)
|
|
||||||
{ //Bit is valid
|
|
||||||
if(!success)
|
|
||||||
New_Keytable(Index);
|
|
||||||
|
|
||||||
return JudyLGet(MasterKeytable, Index, PJE0);
|
|
||||||
}
|
|
||||||
MF_LogError(amx, AMX_ERR_NATIVE, "Keytable \"%s\" is invalid", Index);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Delete_Keytable(Word_t Index)
|
|
||||||
{
|
|
||||||
int success;
|
|
||||||
J1T(success, MasterKeytable_Binary, Index);
|
|
||||||
if (success)
|
|
||||||
{ //If the bit was set, clear and delete keytable.
|
|
||||||
Clear_Keytable(Index);
|
|
||||||
J1U(success, MasterKeytable_Binary, Index);
|
|
||||||
JudyLDel(&MasterKeytable, Index, PJE0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Clear_Keytable(Word_t Index)
|
|
||||||
{
|
|
||||||
int success;
|
|
||||||
J1T(success, MasterKeytable_Binary, Index);
|
|
||||||
if (success) //dont bother with unset Keytables.
|
|
||||||
{
|
{
|
||||||
PPvoid_t Keytable = Find_Keytable(Index);
|
PPvoid_t PValue = JudySLGet(Table, Index, PJE0);
|
||||||
char *Key = "";
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
|
||||||
PPvoid_t PValue = JudySLFirst(*Keytable, Key, PJE0);
|
|
||||||
while (PValue != NULL)
|
return *PValue;
|
||||||
{
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
elem_value.delete_element();
|
|
||||||
PValue = JudySLNext(*Keytable, Key, PJE0);
|
|
||||||
}
|
|
||||||
JudySLFreeArray(Keytable, PJE0);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
template <class Type>
|
||||||
static cell AMX_NATIVE_CALL Keytable_Save(AMX *amx, cell *params)
|
void Set(char* Index, Type value)
|
||||||
{
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[3], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
int filename_length;
|
|
||||||
char *file = MF_GetAmxString(amx, params[2], 0, &filename_length);
|
|
||||||
file = MF_BuildPathname("%s", file);
|
|
||||||
unlink(file);
|
|
||||||
FILE *KeytableDB = fopen(file,"w");
|
|
||||||
if (!KeytableDB)
|
|
||||||
return 0;
|
|
||||||
char* Key = new char[1024]; Key[0] = '\0';
|
|
||||||
PPvoid_t PValue = JudySLFirst(*Keytable, reinterpret_cast<uint8_t*>(Key), PJE0);
|
|
||||||
element elem = NULL;
|
|
||||||
char elem_type = 0;
|
|
||||||
|
|
||||||
int error;
|
|
||||||
|
|
||||||
REAL vector_data[3] = { 0.0, 0.0, 0.0 };
|
|
||||||
while (PValue)
|
|
||||||
{
|
{
|
||||||
elem = *reinterpret_cast<element*>(*PValue);
|
PPvoid_t PValue = JudySLIns(&Table, Index,PJE0);
|
||||||
elem_type = elem.get_type();
|
*PValue = reinterpret_cast<void*>(value);
|
||||||
|
|
||||||
if (elem_type < elem_type_int || elem_type > elem_type_vector)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
short key_len = strlen(Key);
|
|
||||||
fwrite(&key_len, sizeof(short), 1, KeytableDB);
|
|
||||||
fwrite(Key, sizeof(char), key_len, KeytableDB);
|
|
||||||
fwrite(&elem_type, sizeof(char), 1, KeytableDB);
|
|
||||||
if (elem_type == elem_type_int)
|
|
||||||
{
|
|
||||||
int int_buffer = elem.get_int(error);
|
|
||||||
fwrite(&int_buffer, sizeof(int), 1, KeytableDB);
|
|
||||||
}
|
|
||||||
else if (elem_type == elem_type_real)
|
|
||||||
{
|
|
||||||
REAL flo_buffer = elem.get_flo(error);
|
|
||||||
fwrite(&flo_buffer, sizeof(REAL), 1, KeytableDB);
|
|
||||||
}
|
|
||||||
else if (elem_type == elem_type_char)
|
|
||||||
{
|
|
||||||
const char* str_buffer = elem.get_str(error);
|
|
||||||
short buf_len = strlen(str_buffer);
|
|
||||||
fwrite(&buf_len, sizeof(short), 1, KeytableDB);
|
|
||||||
fwrite(str_buffer, sizeof(char), buf_len, KeytableDB);
|
|
||||||
}
|
|
||||||
else if (elem_type == elem_type_vector)
|
|
||||||
{
|
|
||||||
const Vector* vec_buffer = elem.get_vec(error);
|
|
||||||
fwrite(vec_buffer, sizeof(Vector), 1, KeytableDB);
|
|
||||||
}
|
|
||||||
PValue = JudySLNext(*Keytable, Key, PJE0);
|
|
||||||
}
|
}
|
||||||
fclose(KeytableDB);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_Load(AMX *amx, cell *params)
|
template <class Type>
|
||||||
{
|
Type Get(char* Index, Type example, bool disable_check = false)
|
||||||
//params[1]: file
|
|
||||||
int filename_length;
|
|
||||||
char *file = MF_GetAmxString(amx, params[1], 0, &filename_length);
|
|
||||||
file = MF_BuildPathname("%s", file);
|
|
||||||
FILE *KeytableDB = fopen(file, "a+");
|
|
||||||
if (!KeytableDB)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
//params[2]: keytable to create (optional index supplied)
|
|
||||||
int KeytableIndex = New_Keytable(params[2], params[3]);
|
|
||||||
Clear_Keytable(KeytableIndex); //make sure the keytable is empty.
|
|
||||||
PPvoid_t Keytable = Find_Keytable(KeytableIndex);
|
|
||||||
while(!feof(KeytableDB))
|
|
||||||
{
|
{
|
||||||
char* index = ""; char type = 0; short index_len;
|
PPvoid_t PValue = JudySLGet(Table, Index, PJE0);
|
||||||
element *elem_value = NULL;
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
|
||||||
fread(&index_len, sizeof(short), 1, KeytableDB);
|
|
||||||
index = new char[index_len+1];
|
return (Type)*PValue;
|
||||||
fgets(index, index_len+1, KeytableDB);
|
|
||||||
if (feof(KeytableDB) || ferror(KeytableDB))
|
|
||||||
break;
|
|
||||||
fread(&type, sizeof(char), 1, KeytableDB);
|
|
||||||
if (type < elem_type_int || type > elem_type_vector)
|
|
||||||
{
|
|
||||||
MF_LogError(amx, AMX_ERR_FORMAT, "Error loading keytable database \"%s\" into keytable %d. Bad file.", file, KeytableIndex);
|
|
||||||
return KeytableIndex;
|
|
||||||
}
|
|
||||||
else if (type == elem_type_int)
|
|
||||||
{
|
|
||||||
int value = 0; fread(&value, sizeof(int), 1, KeytableDB);
|
|
||||||
elem_value = new element(value);
|
|
||||||
}
|
|
||||||
else if (type == elem_type_real)
|
|
||||||
{
|
|
||||||
REAL value = 0; fread(&value, sizeof(REAL), 1, KeytableDB);
|
|
||||||
elem_value = new element(value);
|
|
||||||
}
|
|
||||||
else if (type == elem_type_char)
|
|
||||||
{
|
|
||||||
short length; fread(&length, sizeof(short), 1, KeytableDB);
|
|
||||||
char* value = new char[length+1]; fgets(value, length+1, KeytableDB);
|
|
||||||
elem_value = new element(value);
|
|
||||||
delete(value);
|
|
||||||
}
|
|
||||||
else if (type == elem_type_vector)
|
|
||||||
{
|
|
||||||
Vector *value = new Vector(); fread(value, sizeof(Vector), 1, KeytableDB);
|
|
||||||
elem_value = new element(value);
|
|
||||||
}
|
|
||||||
Keytable_Set(Keytable,index,elem_value);
|
|
||||||
delete (index);
|
|
||||||
}
|
}
|
||||||
fclose(KeytableDB);
|
|
||||||
return KeytableIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_Save_ASCII(AMX *amx, cell *params)
|
char* First(char* Start = "");
|
||||||
{
|
char* Next(char* Start = "");
|
||||||
//params[1]: file
|
char* Prev(char* Start = "");
|
||||||
int filename_length;
|
char* Last(char* Start = "");
|
||||||
char *inputfile = MF_GetAmxString(amx, params[1], 0, &filename_length);
|
|
||||||
inputfile = MF_BuildPathname("%s", inputfile);
|
|
||||||
FILE *KeytableDB = fopen(inputfile, "a+");
|
|
||||||
if (!KeytableDB)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
char *outputfile = MF_GetAmxString(amx, params[2], 0, &filename_length);
|
bool IsFilled(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false); }
|
||||||
outputfile = MF_BuildPathname("%s", outputfile);
|
bool IsEmpty(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false); }
|
||||||
FILE *ReadableDB = fopen(outputfile, "w");
|
|
||||||
|
|
||||||
char *buffer = "\0";
|
|
||||||
|
|
||||||
while(!feof(KeytableDB))
|
|
||||||
{
|
|
||||||
char* key = NULL; char type = 0; short key_len;
|
|
||||||
fread(&key_len, sizeof(short), 1, KeytableDB);
|
|
||||||
key = new char[key_len+1];
|
|
||||||
fgets(key, key_len+1, KeytableDB);
|
|
||||||
if (feof(KeytableDB) || ferror(KeytableDB))
|
|
||||||
break;
|
|
||||||
fread(&type, sizeof(char), 1, KeytableDB);
|
|
||||||
|
|
||||||
sprintf(buffer, "Key %-32s Length %3d, Type %7s", key, key_len, elem_types[type]);
|
|
||||||
if (type < elem_type_int || type > elem_type_vector)
|
|
||||||
{
|
|
||||||
MF_LogError(amx, AMX_ERR_FORMAT, "Error loading array database \"%s\" into readable format. Bad file.", inputfile);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else if (type == elem_type_int)
|
|
||||||
{
|
|
||||||
int value = 0; fread(&value, sizeof(int), 1, KeytableDB);
|
|
||||||
fprintf(ReadableDB, "%s\t\t\t\tValue: %d\n", buffer, value);
|
|
||||||
}
|
|
||||||
else if (type == elem_type_real)
|
|
||||||
{
|
|
||||||
REAL value = 0; fread(&value, sizeof(REAL), 1, KeytableDB);
|
|
||||||
fprintf(ReadableDB, "%s\t\t\t\tValue: %f\n", buffer, value);
|
|
||||||
}
|
|
||||||
else if (type == elem_type_char)
|
|
||||||
{
|
|
||||||
short length; fread(&length, sizeof(short), 1, KeytableDB);
|
|
||||||
char* value = new char[length+1]; fgets(value, length+1, KeytableDB);
|
|
||||||
fprintf(ReadableDB, "%s Length %3d\tValue: \"%s\"\n", buffer, length, value);
|
|
||||||
delete value;
|
|
||||||
}
|
|
||||||
else if (type == elem_type_vector)
|
|
||||||
{
|
|
||||||
Vector *value = new Vector(); fread(value, sizeof(Vector), 1, KeytableDB);
|
|
||||||
fprintf(ReadableDB, "%s\t\t\t\tValue: {%f,%f,%f}\n", buffer, (*value).x, (*value).y, (*value).z);
|
|
||||||
delete value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(KeytableDB);
|
|
||||||
fclose(ReadableDB);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Type> //This will support input char*, Vector*, int, and cell_real*.
|
|
||||||
void Keytable_Set(PPvoid_t Keytable, char* Index, Type value)
|
|
||||||
{
|
|
||||||
PPvoid_t PValue; // pointer to keytable element value
|
|
||||||
PValue = JudySLIns(Keytable, Index, PJE0);
|
|
||||||
*PValue = reinterpret_cast<void*>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
PPvoid_t Keytable_Get(AMX* amx, PPvoid_t Keytable, char *Index, int ignore_error = 0)
|
|
||||||
{
|
|
||||||
PPvoid_t PValue = JudySLGet( *Keytable, Index, PJE0 );
|
|
||||||
if (PValue == NULL && !ignore_error)
|
|
||||||
MF_LogError(amx, AMX_ERR_NATIVE, "Keytable get on key \"%s\" is invalid", Index);
|
|
||||||
return PValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_Create(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
return New_Keytable(params[1],params[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_Delete(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
Delete_Keytable( params[1] );
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_Clear(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
Clear_Keytable( params[1] );
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_SetVector(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[4], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
cell *input_vec = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
Vector *value = new Vector(
|
|
||||||
amx_ctof(input_vec[0]),
|
|
||||||
amx_ctof(input_vec[1]),
|
|
||||||
amx_ctof(input_vec[2])
|
|
||||||
);
|
|
||||||
int strlen;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlen);
|
|
||||||
|
|
||||||
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(value);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
|
||||||
(*elem_value).set_vec(value);
|
|
||||||
}
|
|
||||||
Keytable_Set(Keytable,Index,elem_value);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_GetVector(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[4], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
int strlen;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlen);
|
|
||||||
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, params[4]);
|
|
||||||
|
|
||||||
cell *vAmx = MF_GetAmxAddr(amx, params[3]);
|
|
||||||
|
|
||||||
if( PValue == NULL ) {
|
|
||||||
vAmx[0] = amx_ftoc(0);
|
|
||||||
vAmx[1] = amx_ftoc(0);
|
|
||||||
vAmx[2] = amx_ftoc(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
int error = 0;
|
|
||||||
const Vector retr_vec = *elem_value.get_vec(error);
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
vAmx[0] = amx_ftoc(retr_vec.x);
|
|
||||||
vAmx[1] = amx_ftoc(retr_vec.y);
|
|
||||||
vAmx[2] = amx_ftoc(retr_vec.z);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_SetString(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[4], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
//params[3]: value
|
|
||||||
int iLen = 0;
|
|
||||||
char *value = MF_GetAmxString(amx,params[3],1,&iLen);
|
|
||||||
|
|
||||||
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(value);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
|
||||||
(*elem_value).set_str(value);
|
|
||||||
}
|
|
||||||
Keytable_Set(Keytable,Index,elem_value);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_GetString(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[5], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
Pvoid_t * PValue = Keytable_Get(amx, Keytable, Index, params[5]);
|
|
||||||
|
|
||||||
//params[3] and params[4] are the return string and length respectively.
|
|
||||||
|
|
||||||
|
|
||||||
if( PValue == NULL )
|
|
||||||
return MF_SetAmxString(amx, params[3] , "dne", params[4] );
|
|
||||||
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
const char* str_out = elem_value.get_str(error);
|
|
||||||
return MF_SetAmxString( amx , params[3] , str_out, params[4] );
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_SetFloat(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[4], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
//params[3]: value
|
|
||||||
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(amx_ctof(params[3]));
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
|
||||||
(*elem_value).set_flo(amx_ctof(params[3]));
|
|
||||||
}
|
|
||||||
Keytable_Set(Keytable,Index,elem_value);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_GetFloat(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[3], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, params[3]);
|
|
||||||
|
|
||||||
if( PValue == NULL ) return amx_ftoc(0.0);
|
|
||||||
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
cell retr_float = amx_ftoc(elem_value.get_flo(error));
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
return retr_float;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_SetInt(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[4], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, 1);
|
|
||||||
element *elem_value = NULL;
|
|
||||||
if ( PValue == NULL )
|
|
||||||
elem_value = new element(params[3]);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elem_value = reinterpret_cast<element*>(*PValue);
|
|
||||||
(*elem_value).set_int(params[3]);
|
|
||||||
}
|
|
||||||
Keytable_Set(Keytable,Index,elem_value);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_GetInt(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[3], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
Pvoid_t * PValue = Keytable_Get(amx, Keytable, Index, params[3]);
|
|
||||||
|
|
||||||
if( PValue == NULL ) return 0;
|
|
||||||
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
cell retr_int = elem_value.get_int(error);
|
|
||||||
if (error)
|
|
||||||
elem_value.issue_type_error(amx, params[1], Index);
|
|
||||||
return retr_int;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_Memory(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
Pvoid_t * Keytable = Find_Keytable(params[1],params[2],amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
return JudyLMemUsed(*Keytable);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_Remove(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], 0, amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
//Have to delete the element
|
|
||||||
PPvoid_t PValue = JudySLGet(*Keytable, Index, PJE0);
|
|
||||||
if (PValue == NULL) return 1;
|
|
||||||
element elem_value = *reinterpret_cast<element*>(*PValue);
|
|
||||||
elem_value.delete_element();
|
|
||||||
|
|
||||||
JudySLDel(Keytable, Index, PJE0 );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_Next(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[5], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
//params[3], params[4]: return key and length
|
|
||||||
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudySLNext(*Keytable, Index, PJE0);
|
|
||||||
|
|
||||||
if (pointer == NULL) {
|
|
||||||
MF_SetAmxString(amx, params[3], "dne", 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
MF_SetAmxString(amx, params[3], Index, params[4]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_Prev(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[5], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
//params[3], params[4]: return key and length
|
|
||||||
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudySLPrev(*Keytable, Index, PJE0);
|
|
||||||
|
|
||||||
if (pointer == NULL) {
|
|
||||||
MF_SetAmxString(amx, params[3], "dne", 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
MF_SetAmxString(amx, params[3], Index, params[4]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_First(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[5], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
//params[3], params[4]: return key and length
|
|
||||||
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudySLFirst(*Keytable, Index, PJE0);
|
|
||||||
|
|
||||||
if (pointer == NULL) {
|
|
||||||
MF_SetAmxString(amx, params[3], "dne", 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
MF_SetAmxString(amx, params[3], Index, params[4]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Keytable_Last(AMX *amx,cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[5], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
//params[3], params[4]: return key and length
|
|
||||||
|
|
||||||
PPvoid_t pointer;
|
|
||||||
pointer = JudySLLast(*Keytable, Index, PJE0);
|
|
||||||
|
|
||||||
if (pointer == NULL) {
|
|
||||||
MF_SetAmxString(amx, params[3], "dne", 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
MF_SetAmxString(amx, params[3], Index, params[4]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Key_IsEmpty(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[3], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
PPvoid_t pointer = JudySLGet(*Keytable, Index, PJE0);
|
|
||||||
|
|
||||||
return (pointer == NULL) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL Key_IsFilled(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
//params[1]: keytable
|
|
||||||
PPvoid_t Keytable = Find_Keytable(params[1], params[3], amx);
|
|
||||||
if (Keytable == NULL) return 0;
|
|
||||||
|
|
||||||
//params[2]: key
|
|
||||||
int strlength;
|
|
||||||
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
|
|
||||||
|
|
||||||
PPvoid_t pointer = JudySLGet(*Keytable, Index, PJE0);
|
|
||||||
|
|
||||||
return (pointer != NULL) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
AMX_NATIVE_INFO keytable_exports[] = {
|
|
||||||
{ "keytable_set_string", Keytable_SetString },
|
|
||||||
{ "keytable_get_string", Keytable_GetString },
|
|
||||||
|
|
||||||
{ "keytable_set_vector", Keytable_SetVector },
|
|
||||||
{ "keytable_get_vector", Keytable_GetVector },
|
|
||||||
|
|
||||||
{ "keytable_set_int", Keytable_SetInt },
|
|
||||||
{ "keytable_get_int", Keytable_GetInt },
|
|
||||||
|
|
||||||
{ "keytable_set_float", Keytable_SetFloat },
|
|
||||||
{ "keytable_get_float", Keytable_GetFloat },
|
|
||||||
|
|
||||||
{ "keytable_isempty", Key_IsEmpty },
|
|
||||||
{ "keytable_isfilled", Key_IsFilled },
|
|
||||||
|
|
||||||
{ "keytable_memory", Keytable_Memory },
|
|
||||||
|
|
||||||
{ "keytable_remove", Keytable_Remove },
|
|
||||||
|
|
||||||
{ "keytable_create", Keytable_Create },
|
|
||||||
{ "keytable_delete", Keytable_Delete },
|
|
||||||
{ "keytable_clear", Keytable_Clear },
|
|
||||||
|
|
||||||
{ "keytable_next", Keytable_Next },
|
|
||||||
{ "keytable_prev", Keytable_Prev },
|
|
||||||
{ "keytable_first", Keytable_First },
|
|
||||||
{ "keytable_last", Keytable_Last },
|
|
||||||
|
|
||||||
{ "keytable_save", Keytable_Save },
|
|
||||||
{ "keytable_load", Keytable_Load },
|
|
||||||
|
|
||||||
{ "keytable_save_ascii", Keytable_Save_ASCII },
|
|
||||||
|
|
||||||
{ NULL, NULL }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
261
dlls/arrayx/Capsule.cpp
Normal file
261
dlls/arrayx/Capsule.cpp
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
#include "Capsule.h"
|
||||||
|
|
||||||
|
const char* capsule_types[] =
|
||||||
|
{
|
||||||
|
"-NO VALUE-",
|
||||||
|
"BOOLEAN",
|
||||||
|
"INTEGER",
|
||||||
|
"FLOAT",
|
||||||
|
"VECTOR",
|
||||||
|
"STRING"
|
||||||
|
};
|
||||||
|
|
||||||
|
void Capsule::ThrowTypeError(cell get_type)
|
||||||
|
{
|
||||||
|
char ValStr[15];
|
||||||
|
GetAsStr(ValStr);
|
||||||
|
|
||||||
|
char value[100];
|
||||||
|
sprintf(value,"Function attempted to read NON-%s value, actual type is: %s, actual value is: %s", capsule_types[get_type], capsule_types[type], ValStr );
|
||||||
|
|
||||||
|
throw JudyEx(value, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Capsule::CheckEmpty(bool clear)
|
||||||
|
{
|
||||||
|
bool empty = ( data == NULL );
|
||||||
|
|
||||||
|
if(empty != true && clear == true) Clear();
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::Clear()
|
||||||
|
{
|
||||||
|
//This function intelligently creates a pointer x,
|
||||||
|
//which will be of correct type and then deletes it.
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case capsule_type_flo:
|
||||||
|
{
|
||||||
|
REAL *real_val = reinterpret_cast<REAL*>(data);
|
||||||
|
delete real_val;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_vec:
|
||||||
|
{
|
||||||
|
JudyVec *vector_val = reinterpret_cast<JudyVec*>(data);
|
||||||
|
delete vector_val;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_str:
|
||||||
|
{
|
||||||
|
char *char_val = reinterpret_cast<char*>(data);
|
||||||
|
delete char_val;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data = NULL; //Null the address as well. (Used for ints too.)
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Capsule::GetBool( void )
|
||||||
|
{
|
||||||
|
if (type != capsule_type_bool) ThrowTypeError(capsule_type_bool);
|
||||||
|
|
||||||
|
return (data != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::SetBool(bool Value)
|
||||||
|
{
|
||||||
|
CheckEmpty(true);
|
||||||
|
type = capsule_type_bool;
|
||||||
|
if(Value == true) data = reinterpret_cast<Pvoid_t>(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
cell Capsule::GetInt( void )
|
||||||
|
{
|
||||||
|
if (type != capsule_type_int) ThrowTypeError(capsule_type_int);
|
||||||
|
|
||||||
|
return reinterpret_cast<cell>(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::SetInt(cell Value)
|
||||||
|
{
|
||||||
|
CheckEmpty(true);
|
||||||
|
type = capsule_type_int;
|
||||||
|
data = reinterpret_cast<void*>(Value);
|
||||||
|
};
|
||||||
|
|
||||||
|
REAL Capsule::GetFlo( void )
|
||||||
|
{
|
||||||
|
if (type != capsule_type_flo) ThrowTypeError(capsule_type_flo);
|
||||||
|
|
||||||
|
return *reinterpret_cast<REAL*>(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::SetFlo(REAL Value)
|
||||||
|
{
|
||||||
|
CheckEmpty(true);
|
||||||
|
type = capsule_type_flo;
|
||||||
|
data = new REAL(Value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const JudyVec* Capsule::GetVec( void )
|
||||||
|
{
|
||||||
|
if (type != capsule_type_vec) ThrowTypeError(capsule_type_vec);
|
||||||
|
|
||||||
|
return reinterpret_cast<const JudyVec*>(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::SetVec(JudyVec* Value)
|
||||||
|
{
|
||||||
|
CheckEmpty(true);
|
||||||
|
type = capsule_type_vec;
|
||||||
|
data = reinterpret_cast<void*>(Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* Capsule::GetStr( void )
|
||||||
|
{
|
||||||
|
if (type != capsule_type_str) ThrowTypeError(capsule_type_str);
|
||||||
|
|
||||||
|
return reinterpret_cast<const char*>(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::SetStr(char* Value)
|
||||||
|
{
|
||||||
|
CheckEmpty(true);
|
||||||
|
type = capsule_type_str;
|
||||||
|
|
||||||
|
char *string_val = new char[strlen(Value)+1];
|
||||||
|
strcpy(string_val,Value);
|
||||||
|
|
||||||
|
data = reinterpret_cast<void*>(string_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::GetAsStr(char* value)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case capsule_type_bool:
|
||||||
|
sprintf(value, "%i",(cell)GetBool());
|
||||||
|
break;
|
||||||
|
case capsule_type_int:
|
||||||
|
sprintf(value, "%d", GetInt() );
|
||||||
|
break;
|
||||||
|
case capsule_type_flo:
|
||||||
|
sprintf(value, "%f", GetFlo() );
|
||||||
|
break;
|
||||||
|
case capsule_type_vec:
|
||||||
|
sprintf(value, "{%f,%f,%f}", GetVec()->first, GetVec()->second, GetVec()->third);
|
||||||
|
break;
|
||||||
|
case capsule_type_str:
|
||||||
|
sprintf(value, "\"%s\"", GetStr() );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf(value, "-NO VALUE-");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::Save(FILE* capsuleDB)
|
||||||
|
{
|
||||||
|
fwrite(&type,sizeof(char),1,capsuleDB);
|
||||||
|
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case capsule_type_none: { break; }
|
||||||
|
case capsule_type_bool: { bool var = GetBool(); fwrite(&var, sizeof(bool), 1, capsuleDB); break; }
|
||||||
|
case capsule_type_int: { cell var = GetInt(); fwrite(&var, sizeof(cell), 1, capsuleDB); break; }
|
||||||
|
case capsule_type_flo: { fwrite(reinterpret_cast<REAL*>(GetData()), sizeof(REAL), 1, capsuleDB); break; }
|
||||||
|
case capsule_type_str:
|
||||||
|
{
|
||||||
|
const char* str = GetStr();
|
||||||
|
size_t len = strlen(str);
|
||||||
|
fwrite(&len,sizeof(size_t), 1, capsuleDB);
|
||||||
|
fwrite(&str, sizeof(char), len, capsuleDB);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_vec:
|
||||||
|
{
|
||||||
|
const JudyVec* buffer = GetVec();
|
||||||
|
fwrite(buffer, sizeof(JudyVec), 1, capsuleDB);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
char value[20];
|
||||||
|
sprintf(value,"Invalid type found!");
|
||||||
|
|
||||||
|
throw JudyEx(value, true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::Load(FILE* capsuleDB)
|
||||||
|
{
|
||||||
|
fread(&type, sizeof(char), 1, capsuleDB);
|
||||||
|
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case capsule_type_none: { CheckEmpty(true); break; }
|
||||||
|
case capsule_type_bool:
|
||||||
|
{
|
||||||
|
bool value = false;
|
||||||
|
fread(&value, sizeof(bool), 1, capsuleDB);
|
||||||
|
SetBool(value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_int:
|
||||||
|
{
|
||||||
|
cell value = NULL;
|
||||||
|
fread(&value, sizeof(cell), 1, capsuleDB);
|
||||||
|
SetInt(value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_flo:
|
||||||
|
{
|
||||||
|
REAL value = NULL;
|
||||||
|
fread(&value, sizeof(REAL), 1, capsuleDB);
|
||||||
|
SetFlo(value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_str:
|
||||||
|
{
|
||||||
|
size_t length;
|
||||||
|
fread(&length, sizeof(size_t), 1, capsuleDB);
|
||||||
|
|
||||||
|
char* value = new char[length+1];
|
||||||
|
fgets(value, length+1, capsuleDB);
|
||||||
|
|
||||||
|
SetStr(value);
|
||||||
|
delete(value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_vec:
|
||||||
|
{
|
||||||
|
JudyVec* value = new JudyVec(NULL,NULL,NULL);
|
||||||
|
fread(value, sizeof(JudyVec), 1, capsuleDB);
|
||||||
|
|
||||||
|
SetVec(value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
char value[20];
|
||||||
|
sprintf(value,"Invalid type found: %i",(int)type);
|
||||||
|
|
||||||
|
throw JudyEx(value, true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
65
dlls/arrayx/Capsule.h
Normal file
65
dlls/arrayx/Capsule.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#ifndef _JUDYCAP_INCLUDED
|
||||||
|
#define _JUDYCAP_INCLUDED
|
||||||
|
|
||||||
|
#include "JudyIncludes.h"
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
capsule_type_none,
|
||||||
|
capsule_type_bool,
|
||||||
|
capsule_type_int,
|
||||||
|
capsule_type_flo,
|
||||||
|
capsule_type_vec,
|
||||||
|
capsule_type_str
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const char* capsule_types[];
|
||||||
|
|
||||||
|
class Capsule
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Pvoid_t data;
|
||||||
|
char type;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void Clear( void );
|
||||||
|
void ThrowTypeError(cell get_type);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Capsule() { data = NULL; type = capsule_type_none;}
|
||||||
|
~Capsule() { Clear(); }
|
||||||
|
void Remove() { delete this; }
|
||||||
|
|
||||||
|
Capsule(bool set) { SetBool(set); }
|
||||||
|
Capsule(cell set) { SetInt(set); }
|
||||||
|
Capsule(REAL set) { SetFlo(set); }
|
||||||
|
Capsule(JudyVec* set) { SetVec(set); }
|
||||||
|
Capsule(char* set) { SetStr(set); }
|
||||||
|
|
||||||
|
bool GetBool( void );
|
||||||
|
void SetBool(bool set);
|
||||||
|
|
||||||
|
cell GetInt( void );
|
||||||
|
void SetInt(cell set);
|
||||||
|
|
||||||
|
REAL GetFlo( void );
|
||||||
|
void SetFlo(REAL set);
|
||||||
|
|
||||||
|
const JudyVec* GetVec( void );
|
||||||
|
void SetVec(JudyVec* set);
|
||||||
|
|
||||||
|
const char* GetStr( void );
|
||||||
|
void SetStr(char* set);
|
||||||
|
|
||||||
|
void GetAsStr(char* value);
|
||||||
|
|
||||||
|
void Load(FILE* db);
|
||||||
|
void Save(FILE* db);
|
||||||
|
|
||||||
|
bool CheckEmpty(bool clear);
|
||||||
|
|
||||||
|
Pvoid_t GetData( void ) { return data; }
|
||||||
|
char GetType( void ) { return type; }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user