Compare commits
492 Commits
amxmodx-0.
...
amxmodx-0.
Author | SHA1 | Date | |
---|---|---|---|
dd211e7a0b | |||
8761791473 | |||
6697b7b1d3 | |||
3c9a47aae3 | |||
d1675c82b5 | |||
b40643950d | |||
ff5b1dd7cc | |||
3587483fa6 | |||
c9c26b869c | |||
8f18856e91 | |||
ddfba00791 | |||
c6eaa97391 | |||
5eb095b514 | |||
4e0bfe161e | |||
0e681d9bd4 | |||
3d1162ecd9 | |||
3414cd7ce7 | |||
66386cca59 | |||
75396c753c | |||
4edd77faee | |||
91db6c7398 | |||
46390b83ac | |||
89eda75b1f | |||
f14808e009 | |||
b569ea3c3f | |||
f595be47dc | |||
ee3404fea0 | |||
61fc7da654 | |||
14c3930b3d | |||
3efa25a5fb | |||
c29a7d34e5 | |||
daa873d8ed | |||
c09de969eb | |||
b0dd18580c | |||
32deaa261f | |||
3a8e103faf | |||
f4b1c9f78a | |||
618759f390 | |||
ced5d6ff57 | |||
db4041114f | |||
b52d77e8bf | |||
940b0be4b9 | |||
75f49e78b0 | |||
f06359e38f | |||
2733adbb49 | |||
fc4d8f183b | |||
ea70c77dd8 | |||
301a69aacb | |||
92eda7c214 | |||
4800ab292c | |||
34cfce33a1 | |||
fec17424fb | |||
264dd7a10d | |||
6cef4eab4f | |||
f4ada32ec2 | |||
bff8c3cdcf | |||
3b670333de | |||
eb36757ef1 | |||
054b1f8868 | |||
23234fad0b | |||
74dca8b6ef | |||
2a187988f6 | |||
d1ee9ee9ba | |||
380f560fa4 | |||
d9b6fa1f93 | |||
8a57648b87 | |||
80b8591295 | |||
f94aa52974 | |||
ef8ad4a894 | |||
41b6f6bd4a | |||
9e8f380121 | |||
39070081d1 | |||
00d8ffe503 | |||
4ef8530bba | |||
77aa0f4f8e | |||
766246648d | |||
7963eb1cde | |||
02d8b2c523 | |||
227fb0411e | |||
027ae6dc7e | |||
334905e16e | |||
e3fad723b8 | |||
5e52c45968 | |||
e3a2a2bc17 | |||
18b75cb07c | |||
4e1c5a3e02 | |||
5db290890f | |||
b9c83aa4a2 | |||
bb12f71137 | |||
0a3911231b | |||
846ef95c58 | |||
601bb30b7e | |||
9728b79c33 | |||
90baf98057 | |||
8ad6437dd8 | |||
02bf904467 | |||
62e4bbcfe9 | |||
fc15ac1f41 | |||
01770f0e5b | |||
87ff81a499 | |||
981f41aee0 | |||
605ca152c2 | |||
0fc8f0b489 | |||
c511d80da7 | |||
8304fc143c | |||
f3cfd31668 | |||
ef90960121 | |||
3700b8b39f | |||
b83f2f5257 | |||
06f61cf92a | |||
5a5ff6d8ea | |||
bbe2626fd1 | |||
d5646ae238 | |||
df43d897df | |||
687a0f23da | |||
aa0dc4dbaf | |||
de399c54c6 | |||
58d522e4c3 | |||
3b90cca5bd | |||
b7c9cfeea4 | |||
4fcad51d25 | |||
c2a2fc7dbe | |||
3f0d3c257a | |||
ecc07d4b45 | |||
8da965552b | |||
cfe36dea52 | |||
c16eab09ec | |||
d07cc0424d | |||
c669efd609 | |||
c3151b312a | |||
3fc3ece5b0 | |||
6887dfef16 | |||
867e7615ae | |||
5157be6e3d | |||
82ca25b231 | |||
a555f9b3f0 | |||
c1a6ce2565 | |||
8874666109 | |||
5233be593f | |||
0f38a24555 | |||
8d06f80eeb | |||
0983698d2e | |||
dde43b6e0d | |||
4382158b88 | |||
ba69d73785 | |||
be3d078d5a | |||
b8ca4586ad | |||
25750d2f05 | |||
423a467a70 | |||
d6e18a3e97 | |||
a6d5d89209 | |||
16b35006bd | |||
95b638dbcd | |||
c42fef6d48 | |||
d60d19a3d7 | |||
3f1c730863 | |||
89f5a45e1d | |||
2b2149b643 | |||
f074af039b | |||
30ec1eec60 | |||
0e279c5bc9 | |||
525dfceb1d | |||
83fa1aea27 | |||
6e3f2f9616 | |||
6a77edfa97 | |||
b24f44896c | |||
e23726ac54 | |||
fb2be2256f | |||
1ef7f8dd72 | |||
4008743091 | |||
bff11bc18e | |||
6ada631aaf | |||
9042efd195 | |||
04b88c16a9 | |||
1c6636b106 | |||
a6a03bf51e | |||
b05cf94a23 | |||
b641192e73 | |||
d14c107db1 | |||
2e24077b77 | |||
d819c76024 | |||
89b5496dfb | |||
de44b4382a | |||
c71fc25a9d | |||
5527afc91e | |||
47eb690a89 | |||
bb662770e0 | |||
4d04072672 | |||
4c00d8b95d | |||
f828e1c8a0 | |||
34abaa1d56 | |||
768ea7519f | |||
3eed3b7f07 | |||
3419aa4dc5 | |||
54a00466e8 | |||
5133915e9c | |||
895948ca45 | |||
d0c51bd637 | |||
2e028ebe20 | |||
26349730e5 | |||
c0374c5fe5 | |||
ab2794d4bd | |||
e0af113cac | |||
f9a57a83a0 | |||
b7c0c47c05 | |||
2d9ec5295d | |||
b3f01faf38 | |||
58578690ad | |||
4754ccdd1d | |||
f6facb5349 | |||
1728c02561 | |||
c90d922443 | |||
2f1de39dd3 | |||
ec5f944c03 | |||
d43807a248 | |||
1980c524d3 | |||
31604d44a8 | |||
dba30f7ee6 | |||
1aaf540be4 | |||
d3751054da | |||
0c2dbdbc47 | |||
1485014229 | |||
0ea68c81dc | |||
8fbbda13c6 | |||
a96d26d573 | |||
fb7d1c0a7d | |||
d7d8ba1398 | |||
36c78421ae | |||
083fe35188 | |||
9e4a611b7f | |||
4ed906248d | |||
44bb871f7e | |||
c1a138f370 | |||
569ef4d494 | |||
26465afbf7 | |||
e287a2f202 | |||
91decabfde | |||
9a21e3e9d3 | |||
60940512e2 | |||
d4e69d97e0 | |||
f171842cf8 | |||
3d9bf8bc93 | |||
d7325f4209 | |||
5c177aada0 | |||
5c6289e1f0 | |||
844fbf581e | |||
22bac3c8f4 | |||
35ffbf8ca6 | |||
926f995a3a | |||
8589f0bcf5 | |||
1a2ef38588 | |||
fed8228712 | |||
09d0ba039d | |||
f2dcb89609 | |||
69e7cbc722 | |||
54e88bf8a8 | |||
b0315f5d56 | |||
ec55a2ab97 | |||
1082ef31c7 | |||
ee28532c53 | |||
e4294da5bd | |||
1ba9a39b3f | |||
5453b55bdc | |||
16f51ea619 | |||
b209d92a2a | |||
0def8c9354 | |||
ac59f75523 | |||
f2faf990a0 | |||
7f6e9f5e20 | |||
c12b04d302 | |||
9922b5016f | |||
77fffb46b2 | |||
e7cd31b1d5 | |||
9006673b09 | |||
96271810d8 | |||
8377680989 | |||
00582481c6 | |||
c2255016d2 | |||
9e1c5f2808 | |||
897d93a892 | |||
04be9fb703 | |||
acf722e855 | |||
d2fe1dc043 | |||
dafc8bb678 | |||
d303a2e0b7 | |||
7c8e9509ce | |||
7334f968a8 | |||
f5a997069d | |||
c7f8b3f965 | |||
316ddad7ab | |||
4d34270ee9 | |||
2573c9c4d2 | |||
d72b8de045 | |||
49d24f6829 | |||
6f9ec854dc | |||
9a3e713a69 | |||
3ec4ccd9da | |||
5867e3398f | |||
07ed1baee9 | |||
1e1d479d76 | |||
78c191b4c9 | |||
cf65ebf647 | |||
7b626ab632 | |||
90eafe59a6 | |||
a055d3d373 | |||
267db7cc2b | |||
5043a40c51 | |||
0a74f09273 | |||
767795b91e | |||
8089d42eda | |||
6b9c8ac1ea | |||
3c037270a6 | |||
6ac682cc5b | |||
e378c45be7 | |||
66da3375ba | |||
1df654c6a1 | |||
388915e6f8 | |||
4d8a927ff7 | |||
b8721e0123 | |||
59880371e1 | |||
6c73a7d8d1 | |||
4232d68c92 | |||
17faf3af1f | |||
1c3a871831 | |||
a313c5b95b | |||
b23eba293d | |||
08682ab378 | |||
39cb15cc56 | |||
c5d7417f8e | |||
4c202dadb0 | |||
78dc3ffd39 | |||
1d3dd15e61 | |||
02446ac5f1 | |||
2601879c0b | |||
313e0603e9 | |||
1d145d6c79 | |||
213b0e65dc | |||
079a3e8bcd | |||
3010241fbd | |||
f3ea36c5d7 | |||
55dfbefb40 | |||
1aee2c6f81 | |||
226c7300be | |||
f2af6ad1e6 | |||
02d60ded5d | |||
3d0e25a8ef | |||
baef3362ed | |||
8903bc7f04 | |||
fe2e3a1468 | |||
3cbcebae56 | |||
0fe010f4f0 | |||
cd6e51271c | |||
711ad7b3dc | |||
7ed66f0b38 | |||
3c67dcd326 | |||
8d0b5360c2 | |||
44c5265757 | |||
3297cf2e9b | |||
b040f4474b | |||
5094bba5e9 | |||
e0e4f5cb34 | |||
c0d73ce572 | |||
7d3d04b13d | |||
88e199ff10 | |||
ec3ade999a | |||
57e93ef281 | |||
6122364a24 | |||
ff1be08b8a | |||
a66d04d26f | |||
d20e9527f7 | |||
5c72931b94 | |||
276886022e | |||
8df987cf95 | |||
de30d647d4 | |||
7f70805e63 | |||
1822261046 | |||
2a622424a0 | |||
37a5a38be5 | |||
580b20e720 | |||
9a4f15e4ad | |||
dd5c75888a | |||
e8ec0ad5bf | |||
961b92db2c | |||
af6349454d | |||
32b07e4c0c | |||
e73b3bbbb7 | |||
fbb7c0bb92 | |||
04c43f8589 | |||
9d733d7a6b | |||
30ddeda877 | |||
72e5e9885f | |||
5c6b34b1d8 | |||
7a627f75cf | |||
02cb4b94f5 | |||
0b5c02f678 | |||
ec5f9ec5ca | |||
551d51ea42 | |||
560cd184cc | |||
14297c8408 | |||
385fa07884 | |||
35fdb8aa6e | |||
34c6a1d4be | |||
745c595fc8 | |||
e979252742 | |||
90b7dc2b9c | |||
66bed5a1ab | |||
8575c9a637 | |||
e73acf4fe4 | |||
2f37ab7ede | |||
b1dd324354 | |||
5f00f09314 | |||
f06796c275 | |||
e15c151167 | |||
0b2eae8e0a | |||
4fff936626 | |||
e2c9dbaa62 | |||
b2f3a52884 | |||
a720b62aaa | |||
71e6ce30a3 | |||
4ee0573203 | |||
68354f8964 | |||
d0b37726d5 | |||
51e8519d96 | |||
c6d2516df8 | |||
813bc1a212 | |||
aa3c8fa377 | |||
8cb5ad18f5 | |||
b34179e997 | |||
91aacb1036 | |||
2134a7e36d | |||
6da1dc3e4a | |||
b33a53d258 | |||
bec1e418e7 | |||
5c6db6d743 | |||
ac25c5fc60 | |||
1e36d0ca39 | |||
945900605d | |||
3b6d22d3bf | |||
b254f14285 | |||
38e89f11f4 | |||
f4960433bc | |||
ebe778d0ee | |||
36ad12b6b3 | |||
0c022b1543 | |||
4e9de62da6 | |||
727c798892 | |||
d9b768e2cf | |||
c1d75857f3 | |||
6d91af30b8 | |||
a1d36ff75d | |||
9a3e53478e | |||
7703c36a90 | |||
a3d048880f | |||
53f8d12237 | |||
54fb9fbfef | |||
5a80d24780 | |||
b8bbe4ae8f | |||
da13f4797d | |||
6d35912c67 | |||
02be09dd00 | |||
93cd6dbed5 | |||
8c8ccc51c4 | |||
c7982c2bc3 | |||
4015655141 | |||
980ccfddf5 | |||
891be11032 | |||
269a0e4305 | |||
9fb04f552c | |||
19101470fd | |||
fb8a883eec | |||
8d714dd84e | |||
c6c958db2d | |||
185070a9ad | |||
a86c892af2 | |||
5464977fb7 | |||
f5fc9d026f | |||
d5cb120ab4 | |||
7cbe114cf0 | |||
84771f11a7 | |||
8b35ce2145 | |||
9d3ea5513b | |||
94219ae71a | |||
f4130105b0 | |||
e4d11b321d | |||
c53f54fe20 | |||
c95e1d8ae3 | |||
4ee81cd1ca | |||
9a98b20d1b | |||
ff9bce89f2 | |||
2d9e405b18 | |||
4a74dce0cd | |||
473699e7c8 |
@ -419,8 +419,7 @@ void EventsMngr::executeEvents()
|
||||
|
||||
if ((err = amx_Exec((*iter).m_Plugin->getAMX(), NULL, (*iter).m_Func, 1, m_ParseVault ? m_ParseVault[0].iValue : 0)) != AMX_ERR_NONE)
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err,
|
||||
(*iter).m_Plugin->getAMX()->curline, (*iter).m_Plugin->getName());
|
||||
LogError((*iter).m_Plugin->getAMX(), err, "");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -110,7 +110,7 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
int err = amx_Execv(iter->pPlugin->getAMX(), &retVal, iter->func, m_NumParams, realParams);
|
||||
// log runtime error, if any
|
||||
if (err != AMX_ERR_NONE)
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err, iter->pPlugin->getAMX()->curline, iter->pPlugin->getName());
|
||||
LogError(iter->pPlugin->getAMX(), err, "");
|
||||
|
||||
// cleanup strings & arrays
|
||||
for (i = 0; i < m_NumParams; ++i)
|
||||
@ -128,6 +128,8 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
else if (m_ParamTypes[i] == FP_ARRAY)
|
||||
{
|
||||
// copy back
|
||||
if (preparedArrays[params[i]].copyBack)
|
||||
{
|
||||
cell *tmp = physAddrs[i];
|
||||
if (preparedArrays[params[i]].type == Type_Cell)
|
||||
{
|
||||
@ -139,6 +141,7 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
|
||||
*data++ = static_cast<char>(*tmp++ & 0xFF);
|
||||
}
|
||||
}
|
||||
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
|
||||
}
|
||||
}
|
||||
@ -174,6 +177,7 @@ void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *para
|
||||
m_NumParams = numParams;
|
||||
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
||||
m_HasFunc = true;
|
||||
isFree = false;
|
||||
}
|
||||
|
||||
void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
||||
@ -182,10 +186,14 @@ void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const Forwar
|
||||
m_NumParams = numParams;
|
||||
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
|
||||
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
|
||||
isFree = false;
|
||||
}
|
||||
|
||||
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
{
|
||||
if (isFree)
|
||||
return 0;
|
||||
|
||||
const int STRINGEX_MAXLENGTH = 128;
|
||||
|
||||
cell realParams[FORWARD_MAX_PARAMS];
|
||||
@ -254,6 +262,8 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
else if (m_ParamTypes[i] == FP_ARRAY)
|
||||
{
|
||||
// copy back
|
||||
if (preparedArrays[params[i]].copyBack)
|
||||
{
|
||||
cell *tmp = physAddrs[i];
|
||||
if (preparedArrays[params[i]].type == Type_Cell)
|
||||
{
|
||||
@ -265,6 +275,7 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
||||
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
|
||||
*data++ = static_cast<char>(*tmp++ & 0xFF);
|
||||
}
|
||||
}
|
||||
amx_Release(m_Amx, realParams[i]);
|
||||
}
|
||||
}
|
||||
@ -284,20 +295,30 @@ int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int
|
||||
|
||||
int CForwardMngr::registerSPForward(int func, AMX *amx, int numParams, const ForwardParam *paramTypes)
|
||||
{
|
||||
int retVal = (m_SPForwards.size() << 1) | 1;
|
||||
int retVal = -1;
|
||||
CSPForward *pForward;
|
||||
if (m_FreeSPForwards.size())
|
||||
if (!m_FreeSPForwards.empty())
|
||||
{
|
||||
pForward = m_SPForwards[m_FreeSPForwards.back()];
|
||||
m_FreeSPForwards.pop_back();
|
||||
retVal = m_FreeSPForwards.front();
|
||||
pForward = m_SPForwards[retVal >> 1];
|
||||
pForward->Set(func, amx, numParams, paramTypes);
|
||||
if (pForward->getFuncsNum() == 0)
|
||||
return -1;
|
||||
m_FreeSPForwards.pop();
|
||||
}
|
||||
else
|
||||
{
|
||||
retVal = (m_SPForwards.size() << 1) | 1;
|
||||
pForward = new CSPForward();
|
||||
if (!pForward)
|
||||
return -1;
|
||||
pForward->Set(func, amx, numParams, paramTypes);
|
||||
if (pForward->getFuncsNum() == 0)
|
||||
{
|
||||
return -1;
|
||||
delete pForward;
|
||||
}
|
||||
|
||||
m_SPForwards.push_back(pForward);
|
||||
}
|
||||
return retVal;
|
||||
@ -307,11 +328,14 @@ int CForwardMngr::registerSPForward(const char *funcName, AMX *amx, int numParam
|
||||
{
|
||||
int retVal = (m_SPForwards.size() << 1) | 1;
|
||||
CSPForward *pForward;
|
||||
if (m_FreeSPForwards.size())
|
||||
if (!m_FreeSPForwards.empty())
|
||||
{
|
||||
pForward = m_SPForwards[m_FreeSPForwards.back()];
|
||||
m_FreeSPForwards.pop_back();
|
||||
retVal = m_FreeSPForwards.front();
|
||||
pForward = m_SPForwards[retVal>>1]; // >>1 because unregisterSPForward pushes the id which contains the sp flag
|
||||
pForward->Set(funcName, amx, numParams, paramTypes);
|
||||
if (pForward->getFuncsNum() == 0)
|
||||
return -1;
|
||||
m_FreeSPForwards.pop();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -319,6 +343,11 @@ int CForwardMngr::registerSPForward(const char *funcName, AMX *amx, int numParam
|
||||
if (!pForward)
|
||||
return -1;
|
||||
pForward->Set(funcName, amx, numParams, paramTypes);
|
||||
if (pForward->getFuncsNum() == 0)
|
||||
{
|
||||
delete pForward;
|
||||
return -1;
|
||||
}
|
||||
m_SPForwards.push_back(pForward);
|
||||
}
|
||||
return retVal;
|
||||
@ -345,6 +374,12 @@ int CForwardMngr::getParamsNum(int id) const
|
||||
m_Forwards[id >> 1]->getParamsNum();
|
||||
}
|
||||
|
||||
ForwardParam CForwardMngr::getParamType(int id, int paramNum) const
|
||||
{
|
||||
return (id & 1) ? m_SPForwards[id >> 1]->getParamType(paramNum) :
|
||||
m_Forwards[id >> 1]->getParamType(paramNum);
|
||||
}
|
||||
|
||||
void CForwardMngr::clear()
|
||||
{
|
||||
for (ForwardVec::iterator iter = m_Forwards.begin(); iter != m_Forwards.end(); ++iter)
|
||||
@ -359,7 +394,8 @@ void CForwardMngr::clear()
|
||||
|
||||
m_Forwards.clear();
|
||||
m_SPForwards.clear();
|
||||
m_FreeSPForwards.clear();
|
||||
while (!m_FreeSPForwards.empty())
|
||||
m_FreeSPForwards.pop();
|
||||
m_TmpArraysNum = 0;
|
||||
}
|
||||
|
||||
@ -370,7 +406,13 @@ bool CForwardMngr::isSPForward(int id) const
|
||||
|
||||
void CForwardMngr::unregisterSPForward(int id)
|
||||
{
|
||||
m_FreeSPForwards.push_back(id);
|
||||
//make sure the id is valid
|
||||
if ( !isIdValid(id) || m_SPForwards.at(id >> 1)->isFree )
|
||||
return;
|
||||
|
||||
m_SPForwards.at(id >> 1)->isFree = true;
|
||||
|
||||
m_FreeSPForwards.push(id);
|
||||
}
|
||||
|
||||
int registerForward(const char *funcName, ForwardExecType et, ...)
|
||||
@ -447,33 +489,45 @@ cell executeForwards(int id, ...)
|
||||
va_start(argptr, id);
|
||||
for (int i = 0; i < paramsNum && i < FORWARD_MAX_PARAMS; ++i)
|
||||
{
|
||||
if (params[i] == FP_FLOAT)
|
||||
if (g_forwards.getParamType(id, i) == FP_FLOAT)
|
||||
{
|
||||
REAL tmp = (REAL)va_arg(argptr, double); // floats get converted to doubles
|
||||
params[i] = *(cell*)&tmp;
|
||||
}
|
||||
else
|
||||
params[i] = (cell)va_arg(argptr, cell);
|
||||
}
|
||||
va_end(argptr);
|
||||
return g_forwards.executeForwards(id, params);
|
||||
}
|
||||
|
||||
cell CForwardMngr::prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type)
|
||||
cell CForwardMngr::prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type, bool copyBack)
|
||||
{
|
||||
if (m_TmpArraysNum >= FORWARD_MAX_PARAMS)
|
||||
{
|
||||
#ifdef MEMORY_TEST
|
||||
m_validateAllAllocUnits();
|
||||
#endif // MEMORY_TEST
|
||||
AMXXLOG_Log("[AMXX] Forwards with more than 32 parameters are not supported (tried to prepare array # %d).", m_TmpArraysNum + 1);
|
||||
m_TmpArraysNum = 0;
|
||||
return -1;
|
||||
}
|
||||
m_TmpArrays[m_TmpArraysNum].ptr = ptr;
|
||||
m_TmpArrays[m_TmpArraysNum].size = size;
|
||||
m_TmpArrays[m_TmpArraysNum].type = type;
|
||||
m_TmpArrays[m_TmpArraysNum].copyBack = copyBack;
|
||||
|
||||
return m_TmpArraysNum++;
|
||||
}
|
||||
|
||||
cell prepareCellArray(cell *ptr, unsigned int size)
|
||||
cell prepareCellArray(cell *ptr, unsigned int size, bool copyBack)
|
||||
{
|
||||
return g_forwards.prepareArray((void*)ptr, size, Type_Cell);
|
||||
return g_forwards.prepareArray((void*)ptr, size, Type_Cell, copyBack);
|
||||
}
|
||||
|
||||
cell prepareCharArray(char *ptr, unsigned int size)
|
||||
cell prepareCharArray(char *ptr, unsigned int size, bool copyBack)
|
||||
{
|
||||
return g_forwards.prepareArray((void*)ptr, size, Type_Char);
|
||||
return g_forwards.prepareArray((void*)ptr, size, Type_Char, copyBack);
|
||||
}
|
||||
|
||||
void unregisterSPForward(int id)
|
||||
|
@ -46,7 +46,7 @@
|
||||
#ifndef FORWARD_H
|
||||
#define FORWARD_H
|
||||
|
||||
const int FORWARD_MAX_PARAMS = 16;
|
||||
const int FORWARD_MAX_PARAMS = 32;
|
||||
|
||||
enum ForwardExecType
|
||||
{
|
||||
@ -79,6 +79,7 @@ struct ForwardPreparedArray
|
||||
void *ptr;
|
||||
ForwardArrayElemType type;
|
||||
unsigned int size;
|
||||
bool copyBack;
|
||||
};
|
||||
|
||||
// Normal forward
|
||||
@ -108,6 +109,12 @@ public:
|
||||
{
|
||||
return m_Funcs.size();
|
||||
}
|
||||
ForwardParam getParamType(int paramId) const
|
||||
{
|
||||
if (paramId < 0 || paramId >= m_NumParams)
|
||||
return FP_DONE;
|
||||
return m_ParamTypes[paramId];
|
||||
}
|
||||
};
|
||||
|
||||
// Single plugin forward
|
||||
@ -119,6 +126,8 @@ class CSPForward
|
||||
AMX *m_Amx;
|
||||
int m_Func;
|
||||
bool m_HasFunc;
|
||||
public:
|
||||
bool isFree;
|
||||
public:
|
||||
CSPForward() { m_HasFunc = false; }
|
||||
void Set(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
|
||||
@ -133,13 +142,19 @@ public:
|
||||
{
|
||||
return (m_HasFunc) ? 1 : 0;
|
||||
}
|
||||
ForwardParam getParamType(int paramId) const
|
||||
{
|
||||
if (paramId < 0 || paramId >= m_NumParams)
|
||||
return FP_DONE;
|
||||
return m_ParamTypes[paramId];
|
||||
}
|
||||
};
|
||||
|
||||
class CForwardMngr
|
||||
{
|
||||
typedef CVector<CForward*> ForwardVec;
|
||||
typedef CVector<CSPForward*> SPForwardVec;
|
||||
typedef CVector<int> FreeSPVec; // Free SP Forwards
|
||||
typedef CQueue<int> FreeSPVec; // Free SP Forwards
|
||||
|
||||
ForwardVec m_Forwards;
|
||||
|
||||
@ -170,7 +185,9 @@ public:
|
||||
bool isSPForward(int id) const; // check whether forward is single plugin
|
||||
int getParamsNum(int id) const; // get num of params of a forward
|
||||
int getFuncsNum(int id) const; // get num of found functions of a forward
|
||||
cell prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type); // prepare array
|
||||
ForwardParam getParamType(int id, int paramId) const;
|
||||
cell prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type,
|
||||
bool copyBack); // prepare array
|
||||
};
|
||||
|
||||
// (un)register forward
|
||||
@ -182,8 +199,8 @@ void unregisterSPForward(int id);
|
||||
// execute forwards
|
||||
cell executeForwards(int id, ...);
|
||||
// prepare array
|
||||
cell prepareCellArray(cell *ptr, unsigned int size);
|
||||
cell prepareCharArray(char *ptr, unsigned int size);
|
||||
cell prepareCellArray(cell *ptr, unsigned int size, bool copyBack = false);
|
||||
cell prepareCharArray(char *ptr, unsigned int size, bool copyBack = false);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -341,7 +341,7 @@ void CLangMngr::CLang::MergeDefinitions(CQueue<sKeyDef*> &vec)
|
||||
entry->SetKey(key);
|
||||
entry->SetCache(false);
|
||||
} else {
|
||||
AMXXLOG_Log("[AMXX] Language key %s[%s] defined twice", m_LMan->GetKey(key), m_LanguageName);
|
||||
//AMXXLOG_Log("[AMXX] Language key %s[%s] defined twice", m_LMan->GetKey(key), m_LanguageName);
|
||||
}
|
||||
}
|
||||
delete vec.front();
|
||||
@ -497,161 +497,46 @@ int CLangMngr::GetKeyEntry(String &key)
|
||||
return -1;
|
||||
}
|
||||
|
||||
const char *CLangMngr::Format(const char *src, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
va_start(argptr, src);
|
||||
static char outbuf[4096];
|
||||
char *outptr = outbuf;
|
||||
enum State
|
||||
{
|
||||
S_Normal,
|
||||
S_PercentSign,
|
||||
};
|
||||
|
||||
State curState = S_Normal;
|
||||
while (*src)
|
||||
{
|
||||
if (*src == '%' && curState == S_Normal)
|
||||
curState = S_PercentSign;
|
||||
else if (curState == S_PercentSign)
|
||||
{
|
||||
switch (*src)
|
||||
{
|
||||
case 's':
|
||||
{
|
||||
char *tmpArg = va_arg(argptr, char*);
|
||||
while (*tmpArg)
|
||||
*outptr++ = *tmpArg++;
|
||||
break;
|
||||
#define CHECK_PTR(ptr, start, bufsize) if ((ptr) - (start) >= (bufsize)) { \
|
||||
LogError(amx, AMX_ERR_STACKERR, "Buffer overflow in string formatting"); \
|
||||
outbuf[0] = 0; \
|
||||
len = 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() \
|
||||
if (parm > paramCount) \
|
||||
{ \
|
||||
strcpy(outbuf, ""); \
|
||||
len = 0; \
|
||||
LogError(amx, AMX_ERR_PARAMS, "String formatted incorrectly - parameter %d (total %d)", parm, paramCount); \
|
||||
return outbuf; \
|
||||
}
|
||||
case 'f':
|
||||
case 'g':
|
||||
{
|
||||
char format[16];
|
||||
format[0] = '%';
|
||||
char *ptr = format+1;
|
||||
while (!isalpha(*ptr++ = *src++))
|
||||
/*nothing*/;
|
||||
--src;
|
||||
*ptr = 0;
|
||||
sprintf(outptr, format, va_arg(argptr, double));
|
||||
outptr += strlen(outptr);
|
||||
break;
|
||||
}
|
||||
case 'L':
|
||||
{
|
||||
char *langName = va_arg(argptr, char*);
|
||||
const char *cpLangName=NULL;
|
||||
// Handle player ids (1-32) and server language
|
||||
if ((int)langName == LANG_PLAYER)
|
||||
{
|
||||
langName = (char*)m_CurGlobId;
|
||||
}
|
||||
if ((int)langName == LANG_SERVER)
|
||||
{
|
||||
cpLangName = g_vault.get("server_language");
|
||||
} else if ((int)langName >= 1 && (int)langName <= 32) {
|
||||
if ((int)CVAR_GET_FLOAT("amx_client_languages"))
|
||||
{
|
||||
cpLangName = g_vault.get("server_language");
|
||||
} else {
|
||||
cpLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I((int)langName)->pEdict, "lang");
|
||||
}
|
||||
} else {
|
||||
cpLangName = langName;
|
||||
}
|
||||
if (!cpLangName || strlen(cpLangName) < 1)
|
||||
cpLangName = "en";
|
||||
char *key = va_arg(argptr, char*);
|
||||
const char *def = GetDef(cpLangName, key);
|
||||
while (*def)
|
||||
{
|
||||
switch (*def)
|
||||
{
|
||||
case INSERT_NUMBER:
|
||||
{
|
||||
sprintf(outptr, "%d", va_arg(argptr, int));
|
||||
outptr += strlen(outptr);
|
||||
break;
|
||||
}
|
||||
case INSERT_STRING:
|
||||
{
|
||||
char *tmpArg = va_arg(argptr, char*);
|
||||
while (*tmpArg)
|
||||
*outptr++ = *tmpArg++;
|
||||
break;
|
||||
}
|
||||
case INSERT_FLOAT:
|
||||
{
|
||||
double tmpArg = va_arg(argptr, double);
|
||||
sprintf(outptr, "%f", tmpArg);
|
||||
outptr += strlen(outptr);
|
||||
break;
|
||||
}
|
||||
case INSERT_NEWLINE:
|
||||
*outptr++ = '\n';
|
||||
break;
|
||||
default:
|
||||
*outptr++ = *def;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'd':
|
||||
{
|
||||
char format[16];
|
||||
format[0] = '%';
|
||||
char *ptr = format+1;
|
||||
while (!isalpha(*ptr++ = *src++))
|
||||
/*nothing*/;
|
||||
--src;
|
||||
*ptr = 0;
|
||||
sprintf(outptr, format, va_arg(argptr, int));
|
||||
outptr += strlen(outptr);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
*outptr++ = '%';
|
||||
*outptr++ = *src;
|
||||
}
|
||||
curState = S_Normal;
|
||||
}
|
||||
else
|
||||
*outptr++ = *src;
|
||||
++src;
|
||||
}
|
||||
*outptr++ = 0;
|
||||
return outbuf;
|
||||
}
|
||||
|
||||
char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
|
||||
{
|
||||
cell *src = get_amxaddr(amx, params[parm++]);
|
||||
// number of parameters ( for NEXT_PARAM macro )
|
||||
int paramCount = *params / sizeof(cell);
|
||||
// the output buffer
|
||||
static char outbuf[4096];
|
||||
char *outptr = outbuf;
|
||||
enum State
|
||||
{
|
||||
S_Normal,
|
||||
S_PercentSign,
|
||||
};
|
||||
cell *src = get_amxaddr(amx, params[parm++]);
|
||||
|
||||
State curState = S_Normal;
|
||||
while (*src)
|
||||
{
|
||||
if (*src == '%' && curState == S_Normal)
|
||||
curState = S_PercentSign;
|
||||
else if (curState == S_PercentSign)
|
||||
if (*src == '%')
|
||||
{
|
||||
++src;
|
||||
if (*src=='L')
|
||||
{
|
||||
cell langName = params[parm]; // "en" case (langName contains the address to the string)
|
||||
NEXT_PARAM();
|
||||
cell *pAmxLangName = get_amxaddr(amx, params[parm++]); // other cases
|
||||
const char *cpLangName=NULL;
|
||||
// Handle player ids (1-32) and server language
|
||||
if (*pAmxLangName == LANG_PLAYER) // LANG_PLAYER
|
||||
{
|
||||
if ((int)CVAR_GET_FLOAT("amx_client_languages"))
|
||||
if ((int)CVAR_GET_FLOAT("amx_client_languages") == 0)
|
||||
{
|
||||
cpLangName = g_vault.get("server_language");
|
||||
} else {
|
||||
@ -660,20 +545,21 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
|
||||
} else if (*pAmxLangName == LANG_SERVER) { // LANG_SERVER
|
||||
cpLangName = g_vault.get("server_language");
|
||||
} else if (*pAmxLangName >= 1 && *pAmxLangName <= 32) { // Direct Client Id
|
||||
if ((int)CVAR_GET_FLOAT("amx_client_languages"))
|
||||
if ((int)CVAR_GET_FLOAT("amx_client_languages") == 0)
|
||||
{
|
||||
cpLangName = g_vault.get("server_language");
|
||||
} else {
|
||||
cpLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(*pAmxLangName)->pEdict, "lang");
|
||||
}
|
||||
} else { // Language Name
|
||||
int len = 0;
|
||||
cpLangName = get_amxstring(amx, langName, 2, len);
|
||||
int tmplen = 0;
|
||||
cpLangName = get_amxstring(amx, langName, 2, tmplen);
|
||||
}
|
||||
if (!cpLangName || strlen(cpLangName) < 1)
|
||||
cpLangName = "en";
|
||||
int len = 0;
|
||||
char *key = get_amxstring(amx, params[parm++], 1, len);
|
||||
int tmplen = 0;
|
||||
NEXT_PARAM();
|
||||
char *key = get_amxstring(amx, params[parm++], 1, tmplen);
|
||||
const char *def = GetDef(cpLangName, key);
|
||||
if (def == NULL)
|
||||
{
|
||||
@ -687,7 +573,8 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
|
||||
}
|
||||
if (!def)
|
||||
{
|
||||
static char buf[255];
|
||||
static char buf[512];
|
||||
CHECK_PTR((char*)(buf+17+strlen(key)), buf, sizeof(buf));
|
||||
sprintf(buf, "ML_LNOTFOUND: %s", key);
|
||||
def = buf;
|
||||
}
|
||||
@ -697,35 +584,51 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
|
||||
if (*def == '%')
|
||||
{
|
||||
++def;
|
||||
char format[16];
|
||||
static char format[32];
|
||||
format[0] = '%';
|
||||
char *ptr = format+1;
|
||||
while (!isalpha(*ptr++ = *def++))
|
||||
while (ptr-format<sizeof(format) && !isalpha(*ptr++ = *def++))
|
||||
/*nothing*/;
|
||||
ZEROTERM(format);
|
||||
|
||||
*ptr = 0;
|
||||
switch ( *(ptr-1) )
|
||||
{
|
||||
case 's':
|
||||
{
|
||||
char tmpString[256];
|
||||
static char tmpString[4096];
|
||||
char *tmpPtr = tmpString;
|
||||
NEXT_PARAM();
|
||||
cell *tmpCell = get_amxaddr(amx, params[parm++]);
|
||||
while (*tmpCell)
|
||||
while (tmpPtr-tmpString < sizeof(tmpString) && *tmpCell)
|
||||
*tmpPtr++ = *tmpCell++;
|
||||
|
||||
*tmpPtr = 0;
|
||||
sprintf(outptr, format, tmpString);
|
||||
ZEROTERM(outbuf);
|
||||
break;
|
||||
}
|
||||
case 'g':
|
||||
case 'f':
|
||||
{
|
||||
NEXT_PARAM();
|
||||
sprintf(outptr, format, *(REAL*)get_amxaddr(amx, params[parm++]));
|
||||
ZEROTERM(outbuf);
|
||||
break;
|
||||
}
|
||||
case 'i':
|
||||
case 'd':
|
||||
case 'c':
|
||||
{
|
||||
NEXT_PARAM();
|
||||
sprintf(outptr, format, (int)*get_amxaddr(amx, params[parm++]));
|
||||
ZEROTERM(outbuf);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
CHECK_OUTPTR(strlen(format)+1);
|
||||
strcpy(outptr, format);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -737,15 +640,19 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
|
||||
switch (*def)
|
||||
{
|
||||
case 'n':
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = '\n';
|
||||
break;
|
||||
case 't':
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = '\t';
|
||||
break;
|
||||
case '^':
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = '^';
|
||||
break;
|
||||
default:
|
||||
CHECK_OUTPTR(2);
|
||||
*outptr++ = '^';
|
||||
*outptr++ = *def;
|
||||
break;
|
||||
@ -753,58 +660,275 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
|
||||
++def;
|
||||
}
|
||||
else
|
||||
{
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = *def++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char tmpString[256];
|
||||
static char tmpString[4096];
|
||||
char *tmpPtr = tmpString;
|
||||
int tmpLen =0;
|
||||
char format[16];
|
||||
format[0] = '%';
|
||||
int tmpLen = 0;
|
||||
static char format[32] = {'%'};
|
||||
char *ptr = format+1;
|
||||
while (!isalpha(*ptr++ = *src++))
|
||||
if (*src != '%')
|
||||
{
|
||||
while (*src != 0 && ptr-format<sizeof(format) && !isalpha(*ptr++ = *src++))
|
||||
/*nothing*/;
|
||||
--src;
|
||||
*ptr = 0;
|
||||
ZEROTERM(format);
|
||||
--src;
|
||||
switch ( *(ptr-1) )
|
||||
{
|
||||
case 's':
|
||||
{
|
||||
NEXT_PARAM();
|
||||
cell *tmpCell = get_amxaddr(amx, params[parm++]);
|
||||
while (*tmpCell)
|
||||
while (tmpPtr-tmpString<sizeof(tmpString) && *tmpCell)
|
||||
*tmpPtr++ = *tmpCell++;
|
||||
*tmpPtr = 0;
|
||||
sprintf(outptr, format, tmpString);
|
||||
ZEROTERM(outbuf);
|
||||
break;
|
||||
}
|
||||
case 'g':
|
||||
case 'f':
|
||||
{
|
||||
NEXT_PARAM();
|
||||
sprintf(outptr, format, *(REAL*)get_amxaddr(amx, params[parm++]));
|
||||
break;
|
||||
}
|
||||
case 'i':
|
||||
case 'd':
|
||||
case 'c':
|
||||
{
|
||||
NEXT_PARAM();
|
||||
sprintf(outptr, format, (int)*get_amxaddr(amx, params[parm++]));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
CHECK_OUTPTR(strlen(format)+1);
|
||||
strcpy(outptr, format);
|
||||
break;
|
||||
}
|
||||
}
|
||||
outptr += strlen(outptr);
|
||||
} else {
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = '%';
|
||||
}
|
||||
}
|
||||
curState = S_Normal;
|
||||
}
|
||||
else
|
||||
{
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = *src;
|
||||
}
|
||||
++src;
|
||||
}
|
||||
len = outptr - outbuf;
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = 0;
|
||||
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()
|
||||
|
||||
char *CLangMngr::FormatString(const char *fmt, va_list &ap)
|
||||
{
|
||||
// the output buffer
|
||||
static char outbuf[4096];
|
||||
char *outptr = outbuf;
|
||||
const char *src = fmt;
|
||||
|
||||
while (*src)
|
||||
{
|
||||
if (*src == '%')
|
||||
{
|
||||
++src;
|
||||
if (*src=='L')
|
||||
{
|
||||
NEXT_PARAM();
|
||||
const char *pAmxLangName = va_arg(ap, const char*);
|
||||
const char *cpLangName=NULL;
|
||||
// Handle player ids (1-32) and server language
|
||||
if (pAmxLangName == (const char *)LANG_PLAYER) // LANG_PLAYER
|
||||
{
|
||||
if ((int)CVAR_GET_FLOAT("amx_client_languages"))
|
||||
{
|
||||
cpLangName = g_vault.get("server_language");
|
||||
} else {
|
||||
cpLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(m_CurGlobId)->pEdict, "lang");
|
||||
}
|
||||
} else if (pAmxLangName == (const char *)LANG_SERVER) { // LANG_SERVER
|
||||
cpLangName = g_vault.get("server_language");
|
||||
} else if (pAmxLangName >= (const char *)1 && pAmxLangName <= (const char *)32) { // Direct Client Id
|
||||
if ((int)CVAR_GET_FLOAT("amx_client_languages"))
|
||||
{
|
||||
cpLangName = g_vault.get("server_language");
|
||||
} else {
|
||||
cpLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I((int)pAmxLangName)->pEdict, "lang");
|
||||
}
|
||||
} else { // Language Name
|
||||
int tmplen = 0;
|
||||
cpLangName = pAmxLangName;
|
||||
}
|
||||
if (!cpLangName || strlen(cpLangName) < 1)
|
||||
cpLangName = "en";
|
||||
int tmplen = 0;
|
||||
const char *key = va_arg(ap, const char *);
|
||||
const char *def = GetDef(cpLangName, key);
|
||||
if (def == NULL)
|
||||
{
|
||||
if (pAmxLangName != LANG_SERVER)
|
||||
{
|
||||
def = GetDef(g_vault.get("server_language"), key);
|
||||
}
|
||||
if (strcmp(cpLangName, "en")!=0 && strcmp(g_vault.get("server_language"), "en")!=0)
|
||||
{
|
||||
def = GetDef("en", key);
|
||||
}
|
||||
if (!def)
|
||||
{
|
||||
static char buf[512];
|
||||
CHECK_PTR((char*)(buf+17+strlen(key)), buf, sizeof(buf));
|
||||
sprintf(buf, "ML_LNOTFOUND: %s", key);
|
||||
def = buf;
|
||||
}
|
||||
}
|
||||
while (*def)
|
||||
{
|
||||
if (*def == '%')
|
||||
{
|
||||
++def;
|
||||
static char format[32];
|
||||
format[0] = '%';
|
||||
char *ptr = format+1;
|
||||
while (ptr-format<sizeof(format) && !isalpha(*ptr++ = *def++))
|
||||
/*nothing*/;
|
||||
ZEROTERM(format);
|
||||
|
||||
*ptr = 0;
|
||||
vsprintf(outptr, format, ap);
|
||||
// vsprintf doesnt alter the ap, increment here
|
||||
switch (*(ptr-1))
|
||||
{
|
||||
case 'f':
|
||||
va_arg(ap, double);
|
||||
break;
|
||||
case 's':
|
||||
va_arg(ap, char *);
|
||||
break;
|
||||
case 'c':
|
||||
case 'd':
|
||||
case 'i':
|
||||
default: // default: assume int-like parameter
|
||||
va_arg(ap, int);
|
||||
break;
|
||||
}
|
||||
outptr += strlen(outptr);
|
||||
}
|
||||
else if (*def == '^')
|
||||
{
|
||||
++def;
|
||||
switch (*def)
|
||||
{
|
||||
case 'n':
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = '\n';
|
||||
break;
|
||||
case 't':
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = '\t';
|
||||
break;
|
||||
case '^':
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = '^';
|
||||
break;
|
||||
default:
|
||||
CHECK_OUTPTR(2);
|
||||
*outptr++ = '^';
|
||||
*outptr++ = *def;
|
||||
break;
|
||||
}
|
||||
++def;
|
||||
}
|
||||
else
|
||||
{
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = *def++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
static char format[32] = {'%'};
|
||||
char *ptr = format+1;
|
||||
if (*src != '%')
|
||||
{
|
||||
while (*src != 0 && ptr-format<sizeof(format) && !isalpha(*ptr++ = *src++))
|
||||
/*nothing*/;
|
||||
*ptr = 0;
|
||||
ZEROTERM(format);
|
||||
--src;
|
||||
vsprintf(outptr, format, ap);
|
||||
// vsprintf doesnt alter the ap, increment here
|
||||
switch (*(ptr-1))
|
||||
{
|
||||
case 'f':
|
||||
va_arg(ap, double);
|
||||
break;
|
||||
case 's':
|
||||
va_arg(ap, char *);
|
||||
break;
|
||||
case 'c':
|
||||
case 'd':
|
||||
case 'i':
|
||||
default: // default: assume int-like parameter
|
||||
va_arg(ap, int);
|
||||
break;
|
||||
}
|
||||
outptr += strlen(outptr);
|
||||
} else {
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = '%';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = *src;
|
||||
}
|
||||
++src;
|
||||
}
|
||||
CHECK_OUTPTR(1);
|
||||
*outptr++ = 0;
|
||||
return outbuf;
|
||||
}
|
||||
void CLangMngr::MergeDefinitions(const char *lang, CQueue<sKeyDef*> &tmpVec)
|
||||
{
|
||||
CLang * language = GetLang(lang);
|
||||
@ -833,7 +957,7 @@ int CLangMngr::MergeDefinitionFile(const char *file)
|
||||
return 0;
|
||||
}
|
||||
MD5 md5;
|
||||
md5.update(fp);
|
||||
md5.update(fp); // closes for us
|
||||
md5.finalize();
|
||||
char md5buffer[33];
|
||||
md5.hex_digest(md5buffer);
|
||||
@ -901,7 +1025,7 @@ int CLangMngr::MergeDefinitionFile(const char *file)
|
||||
language[0] = buf[1];
|
||||
language[1] = buf[2];
|
||||
language[2] = 0;
|
||||
} else if (buf.size() > 4) {
|
||||
} else {
|
||||
if (!multiline)
|
||||
{
|
||||
pos = buf.find('=');
|
||||
@ -960,6 +1084,7 @@ int CLangMngr::MergeDefinitionFile(const char *file)
|
||||
{
|
||||
MergeDefinitions(language, Defq);
|
||||
}
|
||||
fclose(fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -171,6 +171,7 @@ public:
|
||||
const char *Format(const char *src, ...);
|
||||
// Format a string for an AMX plugin
|
||||
char *FormatAmxString(AMX *amx, cell *params, int parm, int &len);
|
||||
char *FormatString(const char *fmt, va_list &ap);
|
||||
// Save
|
||||
bool Save(const char *filename);
|
||||
// Load
|
||||
|
@ -153,9 +153,11 @@ void LogEventsMngr::executeLogEvents()
|
||||
{
|
||||
int err;
|
||||
bool valid;
|
||||
for(CLogEvent* a = logevents[ logArgc ]; a ; a = a->next){
|
||||
for(CLogEvent* a = logevents[ logArgc ]; a ; a = a->next)
|
||||
{
|
||||
valid = true;
|
||||
for( CLogEvent::LogCond* b = a->filters; b ; b = b->next){
|
||||
for( CLogEvent::LogCond* b = a->filters; b ; b = b->next)
|
||||
{
|
||||
valid = false;
|
||||
for( CLogEvent::LogCondEle* c = b->list; c ; c = c->next) {
|
||||
if ( c->cmp->compareCondition( logArgs[b->argnum] ) == 0 ){
|
||||
@ -163,28 +165,15 @@ void LogEventsMngr::executeLogEvents()
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!valid) break;
|
||||
if (!valid)
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef ENABLEEXEPTIONS
|
||||
try
|
||||
if (valid)
|
||||
{
|
||||
#endif
|
||||
|
||||
if (valid){
|
||||
if ((err = amx_Exec(a->plugin->getAMX(), NULL , a->func , 0)) != AMX_ERR_NONE)
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")",
|
||||
err,a->plugin->getAMX()->curline,a->plugin->getName());
|
||||
LogError(a->plugin->getAMX(), err, "");
|
||||
}
|
||||
|
||||
#ifdef ENABLEEXEPTIONS
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
AMXXLOG_Log( "[AMXX] fatal error at log forward function execution");
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -126,8 +126,9 @@ pfnmodule_engine_g engModuleFunc = {
|
||||
// class CModule
|
||||
// *****************************************************
|
||||
|
||||
CModule::CModule(const char* fname) : m_Filename(fname)
|
||||
CModule::CModule(const char* fname)
|
||||
{
|
||||
m_Filename.assign(fname);
|
||||
clear(false);
|
||||
}
|
||||
|
||||
|
@ -95,7 +95,7 @@ public:
|
||||
inline module_info_s* getInfo() const { return m_InfoOld; } // old
|
||||
inline const amxx_module_info_s* getInfoNew() const { return &m_InfoNew; } // new
|
||||
inline int getStatusValue() { return m_Status; }
|
||||
inline bool operator==( void* fname ) { return !strcmp( m_Filename.c_str() , (char*)fname ); }
|
||||
inline bool operator==( const char* fname ) { return !strcmp( m_Filename.c_str() , fname ); }
|
||||
inline bool isReloadable() { return m_Amxx ? ((m_Status == MODULE_LOADED) && (m_InfoNew.reload != 0)) : ( (m_Status==MODULE_LOADED) && (m_InfoOld->type==RELOAD_MODULE)); }
|
||||
inline bool isAmxx() const { return m_Amxx; }
|
||||
inline const char *getMissingFunc() const { return m_MissingFunc; }
|
||||
|
@ -34,11 +34,11 @@
|
||||
#include "CForward.h"
|
||||
#include "CFile.h"
|
||||
|
||||
CPluginMngr::CPlugin* CPluginMngr::loadPlugin(const char* path, const char* name, char* error) {
|
||||
CPluginMngr::CPlugin* CPluginMngr::loadPlugin(const char* path, const char* name, char* error, int debug) {
|
||||
CPlugin** a = &head;
|
||||
while( *a ) a = &(*a)->next;
|
||||
*a = new CPlugin( pCounter++ ,path,name,error);
|
||||
return *error ? 0 : *a;
|
||||
*a = new CPlugin( pCounter++ ,path,name,error, debug);
|
||||
return (*a);
|
||||
}
|
||||
|
||||
void CPluginMngr::unloadPlugin( CPlugin** a ) {
|
||||
@ -50,7 +50,7 @@ void CPluginMngr::unloadPlugin( CPlugin** a ) {
|
||||
|
||||
int CPluginMngr::loadPluginsFromFile( const char* filename )
|
||||
{
|
||||
File fp( build_pathname("%s",filename) , "r" );
|
||||
FILE *fp = fopen(build_pathname("%s",filename) , "rt");
|
||||
|
||||
if ( !fp )
|
||||
{
|
||||
@ -59,22 +59,40 @@ int CPluginMngr::loadPluginsFromFile( const char* filename )
|
||||
}
|
||||
|
||||
// Find now folder
|
||||
char pluginName[256], line[256], error[256];
|
||||
const char *pluginsDir = get_localinfo("amxx_pluginsdir", "addons/amxx/plugins");
|
||||
char pluginName[256], error[256], debug[256];
|
||||
int debugFlag = 0;
|
||||
const char *pluginsDir = get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins");
|
||||
|
||||
String line;
|
||||
|
||||
while ( fp.getline(line , 255 ) )
|
||||
while ( !feof(fp) )
|
||||
{
|
||||
*pluginName = 0;
|
||||
sscanf(line,"%s",pluginName);
|
||||
*debug = 0;
|
||||
debugFlag = 0;
|
||||
line.clear();
|
||||
line._fread(fp);
|
||||
sscanf(line.c_str(),"%s %s",pluginName, debug);
|
||||
if (!isalnum(*pluginName)) continue;
|
||||
|
||||
CPlugin* plugin = loadPlugin( pluginsDir , pluginName , error );
|
||||
|
||||
if (!plugin)
|
||||
AMXXLOG_Log("[AMXX] %s (plugin \"%s\")", error, pluginName );
|
||||
if (isalnum(*debug) && strcmp(debug, "debug") == 0)
|
||||
{
|
||||
debugFlag = 1;
|
||||
}
|
||||
|
||||
CPlugin* plugin = loadPlugin( pluginsDir , pluginName , error, debugFlag);
|
||||
|
||||
if (plugin->getStatusCode() == ps_bad_load)
|
||||
{
|
||||
char errorMsg[255];
|
||||
sprintf(errorMsg, "%s (plugin \"%s\")", error, pluginName);
|
||||
plugin->setError(errorMsg);
|
||||
AMXXLOG_Log("[AMXX] %s", plugin->getError());
|
||||
}
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return pCounter;
|
||||
}
|
||||
|
||||
@ -87,10 +105,6 @@ void CPluginMngr::clear() {
|
||||
CPluginMngr::CPlugin* CPluginMngr::findPluginFast(AMX *amx)
|
||||
{
|
||||
return (CPlugin*)(amx->userdata[3]);
|
||||
/*CPlugin*a = head;
|
||||
while ( a && &a->amx != amx )
|
||||
a=a->next;
|
||||
return a;*/
|
||||
}
|
||||
|
||||
CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx) {
|
||||
@ -119,7 +133,16 @@ CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name) {
|
||||
|
||||
const char* CPluginMngr::CPlugin::getStatus() const {
|
||||
switch(status){
|
||||
case ps_running: return "running";
|
||||
case ps_running:
|
||||
{
|
||||
if (getAMX()->flags & AMX_FLAG_DEBUG)
|
||||
{
|
||||
return "debug";
|
||||
} else {
|
||||
return "running";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ps_paused: return "paused";
|
||||
case ps_bad_load: return "bad load";
|
||||
case ps_stopped: return "stopped";
|
||||
@ -128,16 +151,20 @@ const char* CPluginMngr::CPlugin::getStatus() const {
|
||||
return "error";
|
||||
}
|
||||
|
||||
CPluginMngr::CPlugin::CPlugin(int i, const char* p,const char* n, char* e) : name(n), title(n) {
|
||||
CPluginMngr::CPlugin::CPlugin(int i, const char* p,const char* n, char* e, int d) : name(n), title(n) {
|
||||
const char* unk = "unknown";
|
||||
title.assign(unk);
|
||||
author.assign(unk);
|
||||
version.assign(unk);
|
||||
char* path = build_pathname("%s/%s",p,n);
|
||||
code = 0;
|
||||
int err = load_amxscript(&amx,&code,path,e );
|
||||
if ( err == AMX_ERR_NONE ) status = ps_running;
|
||||
else status = ps_bad_load;
|
||||
int err = load_amxscript(&amx,&code,path,e, d);
|
||||
if ( err == AMX_ERR_NONE )
|
||||
{
|
||||
status = ps_running;
|
||||
} else {
|
||||
status = ps_bad_load;
|
||||
}
|
||||
amx.userdata[3] = this;
|
||||
paused_fun = 0;
|
||||
next = 0;
|
||||
|
@ -63,11 +63,12 @@ public:
|
||||
String version;
|
||||
String title;
|
||||
String author;
|
||||
String errorMsg;
|
||||
int paused_fun;
|
||||
int status;
|
||||
CPlugin* next;
|
||||
int id;
|
||||
CPlugin(int i , const char* p,const char* n, char* e);
|
||||
CPlugin(int i , const char* p,const char* n, char* e, int d);
|
||||
~CPlugin( );
|
||||
|
||||
public:
|
||||
@ -76,11 +77,15 @@ public:
|
||||
inline const char* getVersion() { return version.c_str();}
|
||||
inline const char* getTitle() { return title.c_str();}
|
||||
inline const char* getAuthor() { return author.c_str();}
|
||||
inline const char* getError() { return errorMsg.c_str();}
|
||||
inline int getStatusCode() { return status; }
|
||||
inline int getId() const { return id; }
|
||||
inline AMX* getAMX() { return &amx; }
|
||||
inline const AMX* getAMX() const { return &amx; }
|
||||
inline void setTitle( const char* n ) { title.assign(n); }
|
||||
inline void setAuthor( const char* n ) { author.assign(n); }
|
||||
inline void setVersion( const char* n ) { version.assign(n); }
|
||||
inline void setError( const char* n ) { errorMsg.assign(n); }
|
||||
inline bool isValid() const { return ((status != ps_bad_load) && (status != ps_locked)); }
|
||||
inline bool isPaused() const { return ( (status == ps_paused) || (status == ps_stopped)); }
|
||||
inline bool isFunctionPaused( int id ) const { return (paused_fun & (1<<id)) ? true : false; }
|
||||
@ -104,7 +109,7 @@ public:
|
||||
|
||||
// Interface
|
||||
|
||||
CPlugin* loadPlugin(const char* path, const char* name, char* error);
|
||||
CPlugin* loadPlugin(const char* path, const char* name, char* error, int debug);
|
||||
void unloadPlugin( CPlugin** a );
|
||||
int loadPluginsFromFile( const char* filename );
|
||||
CPlugin* findPluginFast(AMX *amx);
|
||||
|
@ -71,7 +71,7 @@ public:
|
||||
|
||||
void append(const char *t)
|
||||
{
|
||||
Grow(cSize + strlen(t));
|
||||
Grow(cSize + strlen(t) + 1);
|
||||
strcat(v, t);
|
||||
cSize = strlen(v);
|
||||
}
|
||||
@ -187,7 +187,7 @@ public:
|
||||
{
|
||||
if (c == '\f' || c == '\n' ||
|
||||
c == '\t' || c == '\r' ||
|
||||
c == 'v' || c == ' ')
|
||||
c == '\v' || c == ' ')
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -61,14 +61,11 @@ void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags,
|
||||
|
||||
if (iParamsLen)
|
||||
{
|
||||
// also add a cell to the back with the value 0
|
||||
m_iParamLen = iParamsLen + 1;
|
||||
m_pParams = new cell[m_iParamLen];
|
||||
memcpy(m_pParams, pParams, sizeof(cell)*iParamsLen);
|
||||
m_pParams[iParamsLen] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
m_iParamLen = 0;
|
||||
m_pParams = NULL;
|
||||
}
|
||||
@ -76,9 +73,17 @@ void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags,
|
||||
|
||||
void CTaskMngr::CTask::clear()
|
||||
{
|
||||
if (m_iFunc >= 0)
|
||||
{
|
||||
unregisterSPForward(m_iFunc);
|
||||
m_iFunc = -1;
|
||||
}
|
||||
m_bFree = true;
|
||||
if (m_pParams)
|
||||
{
|
||||
delete [] m_pParams;
|
||||
m_pParams = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool CTaskMngr::CTask::isFree() const
|
||||
@ -114,29 +119,16 @@ void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, f
|
||||
|
||||
if (execute)
|
||||
{
|
||||
if (m_pPlugin->isExecutable(m_iFunc))
|
||||
{
|
||||
int err;
|
||||
if (m_iParamLen) // call with parameters
|
||||
{
|
||||
cell amx_addr, *phys_addr;
|
||||
if (amx_Allot(m_pPlugin->getAMX(), m_iParamLen, &amx_addr, &phys_addr) != AMX_ERR_NONE)
|
||||
AMXXLOG_Log("[AMXX] Failed to allocate AMX memory (task \"%d\") (plugin \"%s\")", m_iId, m_pPlugin->getName());
|
||||
else
|
||||
{
|
||||
copy_amxmemory(phys_addr, m_pParams, m_iParamLen);
|
||||
if ((err = amx_Exec(m_pPlugin->getAMX(), NULL, m_iFunc, 2, amx_addr, m_iId)) != AMX_ERR_NONE)
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (task \"%d\") (plugin \"%s\")", err, m_pPlugin->getAMX()->curline, m_iId, m_pPlugin->getName());
|
||||
cell arr = prepareCellArray(m_pParams, m_iParamLen);
|
||||
executeForwards(m_iFunc, arr, m_iId);
|
||||
} else {
|
||||
executeForwards(m_iFunc, m_iId);
|
||||
}
|
||||
|
||||
amx_Release(m_pPlugin->getAMX(), amx_addr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((err = amx_Exec(m_pPlugin->getAMX(), NULL, m_iFunc, 1, m_iId)) != AMX_ERR_NONE)
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (task \"%d\") (plugin \"%s\")", err, m_pPlugin->getAMX()->curline, m_iId, m_pPlugin->getName());
|
||||
}
|
||||
}
|
||||
if (isFree())
|
||||
return;
|
||||
|
||||
// set new exec time OR remove the task if needed
|
||||
if (m_bLoop || (--m_iRepeat > 0))
|
||||
@ -145,6 +137,8 @@ void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, f
|
||||
}
|
||||
else
|
||||
{
|
||||
unregisterSPForward(m_iFunc);
|
||||
m_iFunc = -1;
|
||||
m_bFree = true;
|
||||
}
|
||||
}
|
||||
|
@ -54,19 +54,19 @@ private:
|
||||
// execution
|
||||
float m_fNextExecTime;
|
||||
public:
|
||||
inline void set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime);
|
||||
inline void clear();
|
||||
inline bool isFree() const;
|
||||
void set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, int iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime);
|
||||
void clear();
|
||||
bool isFree() const;
|
||||
|
||||
inline CPluginMngr::CPlugin *getPlugin() const;
|
||||
inline int getTaskId() const;
|
||||
CPluginMngr::CPlugin *getPlugin() const;
|
||||
int getTaskId() const;
|
||||
|
||||
inline void executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft); // also removes the task if needed
|
||||
void executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft); // also removes the task if needed
|
||||
|
||||
inline void changeBase(float fNewBase);
|
||||
inline void resetNextExecTime(float fCurrentTime);
|
||||
void changeBase(float fNewBase);
|
||||
void resetNextExecTime(float fCurrentTime);
|
||||
|
||||
inline bool shouldRepeat();
|
||||
bool shouldRepeat();
|
||||
|
||||
CTask();
|
||||
~CTask();
|
||||
|
@ -32,6 +32,8 @@
|
||||
#ifndef __CVECTOR_H__
|
||||
#define __CVECTOR_H__
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
// Vector
|
||||
template <class T> class CVector
|
||||
{
|
||||
@ -284,7 +286,7 @@ public:
|
||||
iterator iterAt(size_t pos)
|
||||
{
|
||||
if (pos > m_CurrentUsedSize)
|
||||
ASSERT(0);
|
||||
assert(0);
|
||||
return iterator(m_Data + pos);
|
||||
}
|
||||
|
||||
@ -331,7 +333,7 @@ public:
|
||||
{
|
||||
if (pos > m_CurrentUsedSize)
|
||||
{
|
||||
ASSERT(0);
|
||||
assert(0);
|
||||
}
|
||||
return m_Data[pos];
|
||||
}
|
||||
@ -340,7 +342,7 @@ public:
|
||||
{
|
||||
if (pos > m_CurrentUsedSize)
|
||||
{
|
||||
ASSERT(0);
|
||||
assert(0);
|
||||
}
|
||||
return m_Data[pos];
|
||||
}
|
||||
@ -359,7 +361,7 @@ public:
|
||||
{
|
||||
if (m_CurrentUsedSize < 1)
|
||||
{
|
||||
ASSERT(0);
|
||||
assert(0);
|
||||
}
|
||||
return m_Data[0];
|
||||
}
|
||||
@ -368,7 +370,7 @@ public:
|
||||
{
|
||||
if (m_CurrentUsedSize < 1)
|
||||
{
|
||||
ASSERT(0);
|
||||
assert(0);
|
||||
}
|
||||
return m_Data[0];
|
||||
}
|
||||
@ -377,7 +379,7 @@ public:
|
||||
{
|
||||
if (m_CurrentUsedSize < 1)
|
||||
{
|
||||
ASSERT(0);
|
||||
assert(0);
|
||||
}
|
||||
return m_Data[m_CurrentUsedSize - 1];
|
||||
}
|
||||
@ -386,7 +388,7 @@ public:
|
||||
{
|
||||
if (m_CurrentUsedSize < 1)
|
||||
{
|
||||
ASSERT(0);
|
||||
assert(0);
|
||||
}
|
||||
return m_Data[m_CurrentUsedSize - 1];
|
||||
}
|
||||
|
@ -42,6 +42,12 @@
|
||||
|
||||
; Revision History
|
||||
;------------------
|
||||
; 16 September 2004 by David "BAILOPAN" Anderson
|
||||
; Implemented a compile time toggleable debug hook on OP_CALL and OP_RET.
|
||||
; NOTE: JIT has not had debug hooks since 1999.
|
||||
; 8 September 2004 by David "BAILOPAN" Anderson
|
||||
; Changed OP_LINE call to be compile-time toggle-able between compiling
|
||||
; line ops or not.
|
||||
; 29 June 2004 by G.W.M. Vissers
|
||||
; Translated the thing into NASM. The actual generation of the code is
|
||||
; put into the data section because the code modifies itself whereas the
|
||||
@ -101,15 +107,6 @@
|
||||
; to compute the destination address: It searches backwards now.
|
||||
; 1999/07/08 MP - initial revision
|
||||
|
||||
|
||||
; Controls generation of LINE op-codes: 0 - no, all other values - yes
|
||||
; Beware that, if set to 1, this makes the compiled code slower by a factor of
|
||||
; up to 3!
|
||||
;
|
||||
; GWMV: to generate LINE opcode, %define ALLOWOPLINE
|
||||
;
|
||||
%undef ALLOWOPLINE
|
||||
|
||||
;
|
||||
; If this is set to 1 the JIT generates relocatable code for case tables, too.
|
||||
; If set to 0, a faster variant for switch (using absolute addresses) is
|
||||
@ -156,16 +153,24 @@ _dbgcode: resd 1
|
||||
_dbgaddr: resd 1
|
||||
_dbgparam: resd 1
|
||||
_dbgname: resd 1
|
||||
_usertags: resd 4 ; 4 = AMX_USERNUM (#define'd in amx.h)
|
||||
_userdata: resd 4 ; 4 = AMX_USERNUM (#define'd in amx.h)
|
||||
;usertags and userdata are 16 bytes on AMX Mod X
|
||||
_usertags1: resd 1 ; 4 = AMX_USERNUM (#define'd in amx.h)
|
||||
_usertags2: resd 1 ; 4 = AMX_USERNUM (#define'd in amx.h)
|
||||
_usertags3: resd 1 ; 4 = AMX_USERNUM (#define'd in amx.h)
|
||||
_usertags4: resd 1 ; 4 = AMX_USERNUM (#define'd in amx.h)
|
||||
_userdata1: resd 1 ; 4 = AMX_USERNUM (#define'd in amx.h)
|
||||
_userdata2: resd 1 ; 4 = AMX_USERNUM (#define'd in amx.h)
|
||||
_userdata3: resd 1 ; 4 = AMX_USERNUM (#define'd in amx.h)
|
||||
_userdata4: resd 1 ; 4 = AMX_USERNUM (#define'd in amx.h)
|
||||
_error: resd 1
|
||||
_pri: resd 1
|
||||
_alt: resd 1
|
||||
_reset_stk: resd 1
|
||||
_reset_hea: resd 1
|
||||
_syscall_d: resd 1
|
||||
; the two fields below are for the JIT; they do not exist in
|
||||
; the non-JIT version of the abstract machine
|
||||
; the two fields below are for the JIT
|
||||
; they are included in the non-JIT version for AMX Mod X
|
||||
; this is to make sure that the structs match universally!
|
||||
_reloc_size: resd 1 ; memory block for relocations
|
||||
_code_size: resd 1 ; memory size of the native code
|
||||
endstruc
|
||||
@ -230,6 +235,7 @@ DBG_SYMTAG equ 9
|
||||
|
||||
AMX_FLAG_CHAR16 equ 0001h ; characters are 16-bit
|
||||
AMX_FLAG_DEBUG equ 0002h ; symbolic info. available
|
||||
AMX_FLAG_LINEOPS equ 0020h ; line ops should be parsed [load time only flag] - ~dvander
|
||||
AMX_FLAG_BROWSE equ 4000h
|
||||
AMX_FLAG_RELOC equ 8000h ; jump/call addresses relocated
|
||||
|
||||
@ -272,6 +278,14 @@ AMX_FLAG_RELOC equ 8000h ; jump/call addresses relocated
|
||||
|
||||
;
|
||||
; This is the work horse of the whole JIT: It actually copies the code.
|
||||
; Notes from ~dvander (with help of dJeyL)
|
||||
; This takes a source and ending address pointer in the assembled JIT code.
|
||||
; Then it subtracts them and copies the code in between.
|
||||
; The last parameter is the number of bytes the opcode is so it can jump
|
||||
; to the next one.
|
||||
; Also note that the "in between" code is NEVER executed during the compile
|
||||
; phase of the JIT. It's only assembled in memory, and copied into the
|
||||
; final output bytecode by this function.
|
||||
%macro GO_ON 2-3 4
|
||||
mov esi, %1 ;get source address of JIT code
|
||||
mov ecx,%2-%1 ;get number of bytes to copy
|
||||
@ -287,6 +301,8 @@ AMX_FLAG_RELOC equ 8000h ; jump/call addresses relocated
|
||||
; Nasm can't handle the determination of the maximum code size as was done
|
||||
; in the Masm implementation, since it only does two passes. This macro is
|
||||
; called *after* the code for each Small instruction.
|
||||
; Notes by ~dvander: This just substracts a label's ip from the current ip.
|
||||
; Therefore you get an instant size check - see RELOC
|
||||
%macro CHECKCODESIZE 1
|
||||
%if MAXCODESIZE < $-%1
|
||||
%assign MAXCODESIZE $-%1
|
||||
@ -297,6 +313,11 @@ AMX_FLAG_RELOC equ 8000h ; jump/call addresses relocated
|
||||
; Modify the argument of an x86 instruction with the Small opcode's parameter
|
||||
; before copying the code.
|
||||
;
|
||||
; Notes by ~dvander (thanks to dJeyL) - this will take an address and modify
|
||||
; the dword at it. Since the JIT copies already assembled code, you see
|
||||
; things like "call 12345678h". This is an arbitrary value as putval
|
||||
; will modify it in memory and then GO_ON will add it to the program.
|
||||
; It is important to get the putval address right - it's in bytes.
|
||||
%macro putval 1
|
||||
mov eax,[ebx+4]
|
||||
mov dword [%1],eax
|
||||
@ -305,7 +326,12 @@ AMX_FLAG_RELOC equ 8000h ; jump/call addresses relocated
|
||||
;
|
||||
; Add an entry to the table of addresses which have to be relocated after the
|
||||
; code compilation is done.
|
||||
;
|
||||
; Notes by ~dvander: This is sort of what amx_BrowseRelocate() does, although
|
||||
; relocation is actually done after code generation (this just adds to a
|
||||
; table). Like putval, this takes in an address and marks it to be
|
||||
; rewritten. It is a good idea to just use labels to find relocation
|
||||
; offsets (see OP_CALL and OP_RETN). After code generation, this table
|
||||
; is browsed and the correct threaded jumps are placed.
|
||||
%macro RELOC 1-2 ; adr, dest
|
||||
mov ebp,[reloc_num]
|
||||
%if %0 < 2
|
||||
@ -791,7 +817,7 @@ OP_ALIGN_PRI:
|
||||
CHECKCODESIZE j_align_pri
|
||||
|
||||
OP_ALIGN_ALT:
|
||||
;nop;
|
||||
;nop
|
||||
mov eax,4
|
||||
sub eax,[ebx+4]
|
||||
mov dword [j_align_alt+1],eax
|
||||
@ -1047,22 +1073,119 @@ OP_RET:
|
||||
;good
|
||||
OP_RETN:
|
||||
;nop;
|
||||
GO_ON j_retn, OP_CALL
|
||||
;save registers
|
||||
push eax
|
||||
push ebp
|
||||
;get .amx flags
|
||||
mov ebp,[amxhead]
|
||||
mov eax,[ebp+_h_flags]
|
||||
;check to see if the flag has line ops
|
||||
and eax,AMX_FLAG_DEBUG
|
||||
cmp eax,AMX_FLAG_DEBUG
|
||||
;restore registers
|
||||
pop ebp
|
||||
pop eax
|
||||
;if so, skip down to debug compiler
|
||||
jmp _go_jit_retn_debug
|
||||
|
||||
_go_jit_retn_nodebug:
|
||||
GO_ON j_retn_nodebug, _go_jit_retn_go
|
||||
j_retn_nodebug:
|
||||
jmp [jit_retn]
|
||||
CHECKCODESIZE j_retn_nodebug
|
||||
_go_jit_retn_go:
|
||||
jmp _go_jit_retn_end
|
||||
|
||||
_go_jit_retn_debug:
|
||||
GO_ON j_retn, OP_CALL
|
||||
j_retn:
|
||||
push ebp
|
||||
push eax
|
||||
push edx
|
||||
;get AMX
|
||||
mov ebp,amx
|
||||
;get debug call ptr
|
||||
mov eax,[ebp+_userdata2]
|
||||
;check validity
|
||||
mov edx, dword 0
|
||||
cmp eax, edx
|
||||
je _go_jit_skip_debug
|
||||
xchg esp,esi ;switch stack
|
||||
push 1 ;param 2 mode 1 = pop
|
||||
push ebp ;param 1 - amx
|
||||
call eax ;indirect debug call
|
||||
add esp, 8 ;restore stack
|
||||
xchg esp,esi ;return to AMX stack
|
||||
mov ebp,amx ;restore AMX [necessary?]
|
||||
_go_jit_skip_debug:
|
||||
pop edx
|
||||
pop eax
|
||||
pop ebp
|
||||
jmp [jit_retn]
|
||||
CHECKCODESIZE j_retn
|
||||
_go_jit_retn_end:
|
||||
|
||||
;good
|
||||
OP_CALL:
|
||||
;nop;
|
||||
RELOC 1
|
||||
GO_ON j_call, OP_CALL_I, 8
|
||||
;save registers
|
||||
push eax
|
||||
push ebp
|
||||
;get .amx flags
|
||||
mov ebp,[amxhead]
|
||||
mov eax,[ebp+_h_flags]
|
||||
;check to see if the flag has line ops
|
||||
and eax,AMX_FLAG_DEBUG
|
||||
cmp eax,AMX_FLAG_DEBUG
|
||||
;restore registers
|
||||
pop ebp
|
||||
pop eax
|
||||
;if so, skip down to debug compiler
|
||||
jmp _go_jit_debug
|
||||
|
||||
_go_jit_nodebug:
|
||||
RELOC 1
|
||||
GO_ON j_call_nodebug, _j_call_go_on, 8
|
||||
j_call_nodebug:
|
||||
db 0e8h, 0, 0, 0, 0
|
||||
CHECKCODESIZE j_call_nodebug
|
||||
|
||||
_j_call_go_on:
|
||||
jmp _opcall_end
|
||||
|
||||
_go_jit_debug:
|
||||
;thanks to Julien "dJeyL" Laurent for code relocation explanation
|
||||
RELOC _go_jit_reloc-j_call+1
|
||||
GO_ON j_call, OP_CALL_I, 8
|
||||
j_call:
|
||||
;call 12345678h ; tasm chokes on this out of a sudden
|
||||
; save some registers
|
||||
push ebp
|
||||
push eax
|
||||
push edx
|
||||
; get AMX
|
||||
mov ebp,amx
|
||||
; get debug call pointer
|
||||
mov eax,[ebp+_userdata2]
|
||||
; check to see if it's valid
|
||||
mov edx, dword 0
|
||||
cmp eax,edx
|
||||
je _go_jit_skip_call
|
||||
xchg esp,esi ;switch to caller stack
|
||||
push 2 ;param mode=2, push
|
||||
push ebp ;param amx
|
||||
call eax ;indirect call
|
||||
add esp, 8 ;restore stack
|
||||
xchg esp,esi ;return to AMX stack
|
||||
mov ebp,amx ;restore AMX [necessary?]
|
||||
_go_jit_skip_call:
|
||||
;restore original registers
|
||||
pop edx
|
||||
pop eax
|
||||
pop ebp
|
||||
_go_jit_reloc:
|
||||
db 0e8h, 0, 0, 0, 0
|
||||
CHECKCODESIZE j_call
|
||||
_opcall_end:
|
||||
|
||||
OP_CALL_I:
|
||||
;nop;
|
||||
@ -1734,13 +1857,29 @@ OP_FILE: ;opcode is simply ignored
|
||||
|
||||
OP_LINE:
|
||||
;nop;
|
||||
%ifndef ALLOWOPLINE
|
||||
;~dvander - opline is now variable on compile time :]
|
||||
;save registers
|
||||
push eax
|
||||
push ebp
|
||||
;get .amx flags
|
||||
mov ebp,[amxhead]
|
||||
mov eax,[ebp+_h_flags]
|
||||
;check to see if the flag has line ops
|
||||
and eax,AMX_FLAG_LINEOPS
|
||||
cmp eax,AMX_FLAG_LINEOPS
|
||||
;restore registers
|
||||
pop ebp
|
||||
pop eax
|
||||
;if so, skip down to debug compiler
|
||||
je _go_debug
|
||||
|
||||
mov [ebx],edi ; no line number support: ignore opcode
|
||||
add ebx,12 ; move on to next opcode
|
||||
cmp ebx,[end_code]
|
||||
jae code_gen_done
|
||||
jmp dword [ebx] ; go on with the next opcode
|
||||
%else
|
||||
|
||||
_go_debug:
|
||||
putval j_line+6
|
||||
mov eax,[ebx+8]
|
||||
mov [j_line_sm],eax
|
||||
@ -1750,7 +1889,6 @@ OP_LINE:
|
||||
DD 0 ; space for curline
|
||||
j_line_sm DD 0 ; space for curfile
|
||||
CHECKCODESIZE j_line
|
||||
%endif
|
||||
|
||||
OP_SYMBOL: ;ignored
|
||||
mov [ebx],edi
|
||||
@ -2215,7 +2353,6 @@ JIT_OP_LINE:
|
||||
pop eax
|
||||
jmp ecx ; jump back
|
||||
|
||||
|
||||
JIT_OP_SWITCH:
|
||||
pop ebp ; pop return address = table address
|
||||
mov ecx,[ebp] ; ECX = number of records
|
||||
@ -2233,7 +2370,6 @@ JIT_OP_SWITCH:
|
||||
jmp ebp
|
||||
%endif
|
||||
|
||||
|
||||
; The caller of asm_runJIT() can determine the maximum size of the compiled
|
||||
; code by multiplying the result of this function by the number of opcodes in
|
||||
; Small module.
|
||||
|
@ -1,10 +0,0 @@
|
||||
LIBRARY jits
|
||||
DESCRIPTION "JIT for AMX Mod X"
|
||||
EXPORTS
|
||||
asm_runJIT @1
|
||||
getMaxCodeSize @2
|
||||
amx_exec_asm @3
|
||||
amx_opcodelist @4
|
||||
SECTIONS
|
||||
.data READ WRITE
|
||||
.code EXECUTE
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
amxmodx/JIT/jits.obj
Executable file
BIN
amxmodx/JIT/jits.obj
Executable file
Binary file not shown.
@ -12,23 +12,38 @@
|
||||
# amd64 - compile for AMD64 (impiles no jit)
|
||||
# proc=ix86 - assumed not amd64
|
||||
# clean - clean the specifications above
|
||||
# asm - for ASM implementation
|
||||
# !! TODO - add memory mananger support
|
||||
# lineop - for JIT only, uses slow version
|
||||
|
||||
$PROJECT = "amxx_mm";
|
||||
$PROJECT = "amxmodx_mm";
|
||||
$sdk = "../hlsdk/SourceCode";
|
||||
$mm = "../metamod/metamod";
|
||||
$gccf = "gcc";
|
||||
$ccf = "cc";
|
||||
$amd64_lstdc = "-lstdc++";
|
||||
|
||||
@CPP_SOURCE_FILES = ("meta_api.cpp", "CFile.cpp", "CVault.cpp", "vault.cpp", "float.cpp", "file.cpp", "modules.cpp", "CMisc.cpp", "CTask.cpp", "string.cpp", "amxmodx.cpp", "CEvent.cpp", "CCmd.cpp", "CLogEvent.cpp", "srvcmd.cpp", "strptime.cpp", "amxcore.cpp", "amxtime.cpp", "power.cpp", "amxxlog.cpp", "fakemeta.cpp", "MMGR/MMGR.cpp", "amxxfile.cpp", "CLang.cpp", "md5.cpp", "emsg.cpp", "CForward.cpp", "CPlugin.cpp", "CModule.cpp", "CMenu.cpp", "util.cpp");
|
||||
@CPP_SOURCE_FILES = ("meta_api.cpp", "CFile.cpp", "CVault.cpp", "vault.cpp", "float.cpp", "file.cpp", "modules.cpp", "CMisc.cpp", "CTask.cpp", "string.cpp", "amxmodx.cpp", "CEvent.cpp", "CCmd.cpp", "CLogEvent.cpp", "srvcmd.cpp", "strptime.cpp", "amxcore.cpp", "amxtime.cpp", "power.cpp", "amxxlog.cpp", "fakemeta.cpp", "amxxfile.cpp", "CLang.cpp", "md5.cpp", "emsg.cpp", "CForward.cpp", "CPlugin.cpp", "CModule.cpp", "CMenu.cpp", "util.cpp");
|
||||
|
||||
@C_SOURCE_FILES = ("minilzo/minilzo.c");
|
||||
@C_SOURCE_FILES = ();
|
||||
my %OPTIONS, %OPT;
|
||||
|
||||
$OPT{"debug"} = "-g -ggdb";
|
||||
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\"";
|
||||
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\" -fno-exceptions -fno-rtti";
|
||||
|
||||
$OPTIONS{"include"} = "-I$sdk -I. -I$mm -I$sdk/engine -I$sdk/common -I$sdk/pm_shared -I$sdk/dlls";
|
||||
|
||||
while ($cmd = shift)
|
||||
{
|
||||
if ($cmd =~ /asm/)
|
||||
{
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
die "You cannot compile the ASM core with AMD64 yet.\n";
|
||||
} else {
|
||||
$OPTIONS{"asm"} = 1;
|
||||
}
|
||||
}
|
||||
if ($cmd =~ /jit/)
|
||||
{
|
||||
if ($OPTIONS{"amd64"})
|
||||
@ -38,9 +53,9 @@ while ($cmd = shift)
|
||||
$OPTIONS{"jit"} = 1;
|
||||
}
|
||||
} elsif ($cmd =~ /amd64/) {
|
||||
if ($OPTIONS{"jit"})
|
||||
if ($OPTIONS{"jit"} || $OPTIONS{"asm"})
|
||||
{
|
||||
die "You cannot compile the JIT and AMD64 yet.\n";
|
||||
die "You cannot compile the JIT or ASM and AMD64 yet.\n";
|
||||
} else {
|
||||
$OPTIONS{"amd64"} = 1;
|
||||
}
|
||||
@ -56,19 +71,26 @@ while ($cmd = shift)
|
||||
}
|
||||
} elsif ($cmd =~ /clean/) {
|
||||
$OPTIONS{"clean"} = 1;
|
||||
} elsif ($cmd =~ /lineop/) {
|
||||
$OPTIONS{"lineop"} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
$gcc = `g++ --version`;
|
||||
$gcc = `$gccf --version`;
|
||||
if ($gcc =~ /2\.9/)
|
||||
{
|
||||
`cp amx.cpp amx.c`;
|
||||
#if ($OPTIONS{"jit"})
|
||||
#{
|
||||
# push(@CPP_SOURCE_FILES, "amx.cpp");
|
||||
# $OPT{"opt"} .= " -malign-loops=2 -malign-jumps=2 -malign-functions=2";
|
||||
# } else {
|
||||
`ln -s amx.cpp amx.c`;
|
||||
push(@C_SOURCE_FILES, "amx.c");
|
||||
$OPT{"opt"} .= " -malign-loops=2 -malign-jumps=2 -malign-functions=2";
|
||||
# }
|
||||
} else {
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
`cp amx.cpp amx.c`;
|
||||
`ln -s amx.cpp amx.c`;
|
||||
push(@C_SOURCE_FILES, "amx.c");
|
||||
} else {
|
||||
push(@CPP_SOURCE_FILES, "amx.cpp");
|
||||
@ -95,12 +117,17 @@ if ($OPTIONS{"debug"})
|
||||
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
$cflags .= " -m64 -DSMALL_CELL_SIZE=64 -DHAVE_I64 $cflags";
|
||||
$cflags = " -m64 -DSMALL_CELL_SIZE=64 -DHAVE_I64 $cflags";
|
||||
}
|
||||
|
||||
if ($OPTIONS{"jit"})
|
||||
{
|
||||
$cflags .= "-DJIT";
|
||||
$cflags .= " -DJIT";
|
||||
}
|
||||
|
||||
if ($OPTIONS{"asm"})
|
||||
{
|
||||
$cflags .= " -DASM32";
|
||||
}
|
||||
|
||||
if ($OPTIONS{"debug"})
|
||||
@ -129,8 +156,6 @@ if ($OPTIONS{"amd64"})
|
||||
if ($OPTIONS{"clean"})
|
||||
{
|
||||
`rm $outdir/*.o`;
|
||||
`rm $outdir/MMGR/*.o`;
|
||||
`rm $outdir/minilzo/*.o`;
|
||||
`rm $outdir/$bin`;
|
||||
die("Project cleaned.\n");
|
||||
}
|
||||
@ -152,25 +177,32 @@ for ($i=0; $i<=$#C_SOURCE_FILES; $i++)
|
||||
}
|
||||
if ($OPTIONS{"jit"})
|
||||
{
|
||||
if ($OPTIONS{"lineop"}) {
|
||||
push(@LINK, "JIT/jits-lineop.o");
|
||||
} else {
|
||||
push(@LINK, "JIT/jits.o");
|
||||
}
|
||||
}
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
push(@LINK, "zlib/libz64.a");
|
||||
push(@LINK, $amd64_lstdc);
|
||||
} else {
|
||||
push(@LINK, "zlib/libz.a");
|
||||
}
|
||||
if ($OPTIONS{"asm"})
|
||||
{
|
||||
push(@LINK, "amxexecn.o");
|
||||
}
|
||||
|
||||
if (!(-d $outdir))
|
||||
{
|
||||
mkdir($outdir);
|
||||
}
|
||||
if (!(-d "$outdir/MMGR"))
|
||||
{
|
||||
mkdir("$outdir/MMGR");
|
||||
}
|
||||
if (!(-d "$outdir/JIT"))
|
||||
{
|
||||
mkdir("$outdir/JIT");
|
||||
}
|
||||
if (!(-d "$outdir/minilzo"))
|
||||
{
|
||||
mkdir("$outdir/minilzo");
|
||||
}
|
||||
|
||||
$inc = $OPTIONS{"include"};
|
||||
|
||||
@ -180,13 +212,14 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
$ofile = $file;
|
||||
$ofile =~ s/\.cpp/\.o/;
|
||||
$ofile = "$outdir/$ofile";
|
||||
$gcc = "g++ $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
$gcc = "$gccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
if (-e $ofile)
|
||||
{
|
||||
$file_time = (stat($file))[9];
|
||||
$ofile_time = (stat($file))[9];
|
||||
$ofile_time = (stat($ofile))[9];
|
||||
if ($file_time > $ofile_time)
|
||||
{
|
||||
`rm $ofile`;
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
}
|
||||
@ -202,11 +235,11 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
$ofile = $file;
|
||||
$ofile =~ s/\.c/\.o/;
|
||||
$ofile = "$outdir/$ofile";
|
||||
$gcc = "cc $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
$gcc = "$ccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
if (-e $ofile)
|
||||
{
|
||||
$file_time = (stat($file))[9];
|
||||
$ofile_time = (stat($file))[9];
|
||||
$ofile_time = (stat($ofile))[9];
|
||||
if ($file_time > $ofile_time)
|
||||
{
|
||||
print "$gcc\n";
|
||||
@ -218,5 +251,6 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
}
|
||||
}
|
||||
|
||||
$gcc = "g++ $cflags -shared -ldl -lm @LINK -o $outdir/$bin";
|
||||
$gcc = "$gccf $cflags -shared -ldl -lm @LINK -o $outdir/$bin";
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
|
440
amxmodx/amx.cpp
440
amxmodx/amx.cpp
@ -21,7 +21,7 @@
|
||||
* Version: $Id$
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
// not used
|
||||
#define AMX_NODYNALOAD
|
||||
|
||||
// bad bad workaround but we have to prevent a compiler crash :/
|
||||
@ -39,11 +39,13 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h> /* for wchar_t */
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
#include "osdefs.h"
|
||||
#if defined LINUX
|
||||
#include <sclinux.h>
|
||||
@ -51,27 +53,30 @@
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
#endif
|
||||
#if defined __LCC__ || defined __linux__
|
||||
#if defined __LCC__ || defined __GNUC__
|
||||
#include <wchar.h> /* for wcslen() */
|
||||
#endif
|
||||
#if (defined _Windows && !defined AMX_NODYNALOAD) || (defined JIT && !defined __linux__)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
// this file does not include amxmodx.h so we have to include the mem mngr here
|
||||
// this file does not include amxmodx.h, so we have to include the memory manager here
|
||||
#ifdef MEMORY_TEST
|
||||
#include "mmgr/mmgr.h"
|
||||
#endif //MEMORY_TEST
|
||||
#endif // MEMORY_TEST
|
||||
|
||||
#include "amx.h"
|
||||
|
||||
#ifdef JIT
|
||||
# ifdef __WIN32__
|
||||
# include <windows.h>
|
||||
# include <windows.h> // DWORD, VirtualProtect, ...
|
||||
# elif defined __linux__
|
||||
# include <sys/mman.h>
|
||||
# include <sys/mman.h> // mprotect, PROT_*
|
||||
# include <unistd.h>
|
||||
# else
|
||||
// :TODO:
|
||||
# endif
|
||||
#endif //JIT
|
||||
#endif // JIT
|
||||
|
||||
/* When one or more of the AMX_funcname macris are defined, we want
|
||||
* to compile only those functions. However, when none of these macros
|
||||
@ -423,6 +428,7 @@ int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params)
|
||||
AMX_HEADER *hdr;
|
||||
AMX_FUNCSTUB *func;
|
||||
AMX_NATIVE f;
|
||||
int i =0;
|
||||
|
||||
assert(amx!=NULL);
|
||||
hdr=(AMX_HEADER *)amx->base;
|
||||
@ -432,6 +438,7 @@ int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params)
|
||||
assert(index>=0 && index<(cell)NUMENTRIES(hdr,natives,libraries));
|
||||
func=GETENTRY(hdr,natives,index);
|
||||
f=(AMX_NATIVE)func->address;
|
||||
amx->userdata[2] = (char *)GETENTRYNAME(hdr, func);
|
||||
assert(f!=NULL);
|
||||
|
||||
/* now that we have found the function, patch the program so that any
|
||||
@ -476,9 +483,70 @@ int AMXAPI amx_Debug(AMX *amx)
|
||||
return AMX_ERR_DEBUG;
|
||||
}
|
||||
|
||||
//Here is the actual debugger that AMX Mod X uses
|
||||
int AMXAPI amx_DebugCall(AMX *amx, int mode)
|
||||
{
|
||||
//right away, check for debugging
|
||||
AMX_HEADER *hdr;
|
||||
AMX_DBG *p = 0;
|
||||
AMX_TRACE *t = 0;
|
||||
hdr = (AMX_HEADER *)amx->base;
|
||||
if ( !(amx->flags & AMX_FLAG_DEBUG) || !(amx->flags & AMX_FLAG_LINEOPS))
|
||||
return AMX_ERR_NONE;
|
||||
p = (AMX_DBG *)(amx->userdata[0]);
|
||||
if ( !p )
|
||||
return AMX_ERR_NONE;
|
||||
if (mode == 2)
|
||||
{
|
||||
//mode - push onto the stack
|
||||
t = (AMX_TRACE *)malloc(sizeof(AMX_TRACE));
|
||||
memset(t, 0, sizeof(AMX_TRACE));
|
||||
if (!p->head)
|
||||
{
|
||||
p->head = t;
|
||||
t->prev = NULL;
|
||||
} else {
|
||||
t->prev = p->tail;
|
||||
p->tail->next = t;
|
||||
}
|
||||
p->tail = t;
|
||||
t->line = amx->curline;
|
||||
t->file = amx->curfile;
|
||||
} else if (mode == 1) {
|
||||
//mode <0 - pop from the stack
|
||||
t = p->tail;
|
||||
if (t)
|
||||
{
|
||||
p->tail = t->prev;
|
||||
free(t);
|
||||
}
|
||||
if (p->tail == NULL)
|
||||
p->head = NULL;
|
||||
} else if (mode == 0) {
|
||||
AMX_TRACE *m;
|
||||
//mode == 0 - clear stack
|
||||
t = p->head;
|
||||
while (t)
|
||||
{
|
||||
m = t->next;
|
||||
free(t);
|
||||
t = m;
|
||||
}
|
||||
p->head = 0;
|
||||
p->tail = 0;
|
||||
}
|
||||
|
||||
return AMX_ERR_NONE;
|
||||
}
|
||||
|
||||
#if defined JIT
|
||||
#if defined WIN32 || defined __cplusplus
|
||||
extern "C" int AMXAPI getMaxCodeSize(void);
|
||||
extern "C" int AMXAPI asm_runJIT(void *sourceAMXbase, void *jumparray, void *compiledAMXbase);
|
||||
#else
|
||||
extern int AMXAPI getMaxCodeSize(void);
|
||||
extern int AMXAPI asm_runJIT(void *sourceAMXbase, void *jumparray, void *compiledAMXbase);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SMALL_CELL_SIZE==16
|
||||
@ -500,7 +568,6 @@ static int amx_BrowseRelocate(AMX *amx)
|
||||
cell cip;
|
||||
long codesize;
|
||||
OPCODE op;
|
||||
int debug;
|
||||
int last_sym_global = 0;
|
||||
#if defined __GNUC__ || defined ASM32 || defined JIT
|
||||
cell *opcode_list;
|
||||
@ -527,27 +594,33 @@ static int amx_BrowseRelocate(AMX *amx)
|
||||
assert(OP_MOVS==117);
|
||||
assert(OP_SYMBOL==126);
|
||||
|
||||
/* check the debug hook */
|
||||
amx->dbgcode=DBG_INIT;
|
||||
assert(amx->flags==0);
|
||||
amx->flags=AMX_FLAG_BROWSE;
|
||||
debug= amx->debug(amx)==AMX_ERR_NONE;
|
||||
if (debug)
|
||||
amx->flags|=AMX_FLAG_DEBUG;
|
||||
|
||||
#if (defined __GNUC__ || defined ASM32 || defined JIT) && !defined __64BIT__
|
||||
/* check the debug hook */
|
||||
if ((hdr->flags & AMX_FLAG_LINEOPS) && !(hdr->flags & AMX_FLAG_TRACED))
|
||||
{
|
||||
amx->userdata[0] = (AMX_DBG *)malloc(sizeof(AMX_DBG));
|
||||
amx->userdata[1] = (void *)amx_DebugCall;
|
||||
memset(amx->userdata[0], 0, sizeof(AMX_DBG));
|
||||
amx->flags |= AMX_FLAG_LINEOPS;
|
||||
amx->flags |= AMX_FLAG_TRACED;
|
||||
amx->flags |= AMX_FLAG_DEBUG;
|
||||
} else {
|
||||
amx->userdata[0] = 0;
|
||||
amx->userdata[1] = 0;
|
||||
amx->userdata[2] = 0;
|
||||
}
|
||||
|
||||
#if defined __GNUC__ || defined ASM32 || defined JIT && !defined __64BIT__
|
||||
amx_Exec(amx, (cell*)&opcode_list, 0, 0);
|
||||
#if !defined JIT
|
||||
/* to use direct system requests, a function pointer must fit in a cell;
|
||||
* because the native function's address will be stored as the parameter
|
||||
* of SYSREQ.D
|
||||
*/
|
||||
amx->sysreq_d= (sizeof(AMX_NATIVE)<=sizeof(cell)) ? opcode_list[OP_SYSREQ_D] : 0;
|
||||
amx->sysreq_d=(sizeof(AMX_NATIVE)<=sizeof(cell)) ? opcode_list[OP_SYSREQ_D] : 0;
|
||||
#endif
|
||||
#else
|
||||
/* ANSI C
|
||||
* to use direct system requests, a function pointer must fit in a cell;
|
||||
* see the comment above
|
||||
* because the native function's address will be stored as the parameter
|
||||
* of SYSREQ.D
|
||||
*/
|
||||
amx->sysreq_d= (sizeof(AMX_NATIVE)<=sizeof(cell)) ? OP_SYSREQ_D : 0;
|
||||
#endif
|
||||
@ -717,21 +790,25 @@ static int amx_BrowseRelocate(AMX *amx)
|
||||
DBGPARAM(amx->curfile);
|
||||
amx->dbgname=(char *)(code+(int)cip);
|
||||
cip+=num - sizeof(cell);
|
||||
if (debug) {
|
||||
assert(amx->flags==(AMX_FLAG_DEBUG | AMX_FLAG_BROWSE));
|
||||
amx->dbgcode=DBG_FILE;
|
||||
amx->debug(amx);
|
||||
if (!(hdr->flags & AMX_FLAG_TRACED) && amx->userdata[0] != NULL)
|
||||
{
|
||||
AMX_DBG *pDbg = (AMX_DBG *)(amx->userdata[0]);
|
||||
if (pDbg->numFiles == 0)
|
||||
{
|
||||
pDbg->numFiles++;
|
||||
pDbg->files = (char **)malloc(sizeof(char *) * 1);
|
||||
} else {
|
||||
pDbg->numFiles++;
|
||||
pDbg->files = (char **)realloc(pDbg->files, pDbg->numFiles * sizeof(char*));
|
||||
}
|
||||
pDbg->files[pDbg->numFiles-1] = (char *)malloc((sizeof(char) * strlen(amx->dbgname)) + 1);
|
||||
strcpy(pDbg->files[pDbg->numFiles-1], amx->dbgname);
|
||||
} /* if */
|
||||
break;
|
||||
} /* case */
|
||||
case OP_LINE:
|
||||
DBGPARAM(amx->curline);
|
||||
DBGPARAM(amx->curfile);
|
||||
if (debug) {
|
||||
assert(amx->flags==(AMX_FLAG_DEBUG | AMX_FLAG_BROWSE));
|
||||
amx->dbgcode=DBG_LINE;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
break;
|
||||
case OP_SYMBOL: {
|
||||
cell num;
|
||||
@ -741,29 +818,14 @@ static int amx_BrowseRelocate(AMX *amx)
|
||||
amx->dbgname=(char *)(code+(int)cip);
|
||||
cip+=num - 2*sizeof(cell);
|
||||
last_sym_global = (amx->dbgparam >> 8)==0;
|
||||
if (debug && last_sym_global) { /* do global symbols only */
|
||||
assert(amx->flags==(AMX_FLAG_DEBUG | AMX_FLAG_BROWSE));
|
||||
amx->dbgcode=DBG_SYMBOL;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
break;
|
||||
} /* case */
|
||||
case OP_SRANGE:
|
||||
DBGPARAM(amx->dbgaddr); /* dimension level */
|
||||
DBGPARAM(amx->dbgparam); /* length */
|
||||
if (debug && last_sym_global) { /* do global symbols only */
|
||||
assert(amx->flags==(AMX_FLAG_DEBUG | AMX_FLAG_BROWSE));
|
||||
amx->dbgcode=DBG_SRANGE;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
break;
|
||||
case OP_SYMTAG:
|
||||
DBGPARAM(amx->dbgparam); /* tag id */
|
||||
if (debug && last_sym_global) { /* do global symbols only */
|
||||
assert(amx->flags==(AMX_FLAG_DEBUG | AMX_FLAG_BROWSE));
|
||||
amx->dbgcode=DBG_SYMTAG;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
break;
|
||||
case OP_CASETBL: {
|
||||
cell num;
|
||||
@ -792,6 +854,7 @@ static int amx_BrowseRelocate(AMX *amx)
|
||||
|
||||
amx->flags &= ~AMX_FLAG_BROWSE;
|
||||
amx->flags |= AMX_FLAG_RELOC;
|
||||
amx->flags |= AMX_FLAG_TRACED;
|
||||
return AMX_ERR_NONE;
|
||||
}
|
||||
|
||||
@ -931,8 +994,6 @@ int AMXAPI amx_Init(AMX *amx,void *program)
|
||||
amx->stk=amx->stp;
|
||||
if (amx->callback==NULL)
|
||||
amx->callback=amx_Callback;
|
||||
if (amx->debug==NULL)
|
||||
amx->debug=amx_Debug;
|
||||
amx->curline=0;
|
||||
amx->curfile=0;
|
||||
amx->data=NULL;
|
||||
@ -1049,9 +1110,6 @@ int AMXAPI amx_Init(AMX *amx,void *program)
|
||||
}
|
||||
|
||||
#else /* #if defined __WIN32 __ */
|
||||
|
||||
// TODO: Add cases for Linux, Unix, OS/2, ...
|
||||
|
||||
// DOS32 has no imposed limits on its segments.
|
||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
||||
#pragma argsused
|
||||
@ -1103,7 +1161,7 @@ int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code)
|
||||
*(cell *)((char*)native_code + hdr->dat + hdr->stp - sizeof(cell)) = 0;
|
||||
amx->stk = amx->stp;
|
||||
|
||||
memorySetAccess( asm_runJIT, 20000, mac );
|
||||
memorySetAccess( (void*)asm_runJIT, 20000, mac );
|
||||
return AMX_ERR_NONE;
|
||||
}
|
||||
|
||||
@ -1573,8 +1631,7 @@ static AMX_NATIVE findfunction(const char *name, AMX_NATIVE_INFO *list, int numb
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *no_function;
|
||||
|
||||
const char *no_function; // PM: Nice hack ;)
|
||||
int AMXAPI amx_Register(AMX *amx, AMX_NATIVE_INFO *list, int number)
|
||||
{
|
||||
AMX_FUNCSTUB *func;
|
||||
@ -1594,10 +1651,6 @@ int AMXAPI amx_Register(AMX *amx, AMX_NATIVE_INFO *list, int number)
|
||||
if (func->address==0) {
|
||||
/* this function is not yet located */
|
||||
funcptr=(list!=NULL) ? findfunction(GETENTRYNAME(hdr,func),list,number) : NULL;
|
||||
/* on 64-bit architectures with, only the lower 32-bits of the address
|
||||
* can be stored; hopefully, all addresses can be assumed to have the
|
||||
* same value for the upper 32-bits
|
||||
*/
|
||||
if (funcptr!=NULL)
|
||||
func->address=(ucell)funcptr;
|
||||
else
|
||||
@ -1610,6 +1663,40 @@ int AMXAPI amx_Register(AMX *amx, AMX_NATIVE_INFO *list, int number)
|
||||
} /* for */
|
||||
return err;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL null_native(AMX *amx, cell *params)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void amx_NullNativeTable(AMX *amx)
|
||||
{
|
||||
AMX_FUNCSTUB *func;
|
||||
AMX_HEADER *hdr;
|
||||
int i, numnatives;
|
||||
|
||||
hdr=(AMX_HEADER *)amx->base;
|
||||
if (hdr == NULL)
|
||||
return;
|
||||
if (hdr->magic!=AMX_MAGIC)
|
||||
return;
|
||||
|
||||
numnatives = NUMENTRIES(hdr, natives, libraries);
|
||||
|
||||
func=GETENTRY(hdr, natives, 0);
|
||||
|
||||
for (i=0; i<numnatives; i++)
|
||||
{
|
||||
if (strcmp(GETENTRYNAME(hdr,func), "require_module")==0)
|
||||
{
|
||||
func->address = NULL;
|
||||
} else {
|
||||
func->address = (ucell)null_native;
|
||||
}
|
||||
func=(AMX_FUNCSTUB*)((unsigned char*)func+hdr->defsize);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* AMX_REGISTER || AMX_EXEC || AMX_INIT */
|
||||
|
||||
#if defined AMX_NATIVEINFO
|
||||
@ -1634,7 +1721,7 @@ AMX_NATIVE_INFO * AMXAPI amx_NativeInfo(const char *name, AMX_NATIVE func)
|
||||
#define CHKSTACK() if (stk>amx->stp) return AMX_ERR_STACKLOW
|
||||
#define CHKHEAP() if (hea<amx->hlw) return AMX_ERR_HEAPLOW
|
||||
|
||||
#if defined __GNUC__ && !defined ASM32
|
||||
#if defined __GNUC__ && !defined ASM32 && !defined JIT
|
||||
/* GNU C version uses the "labels as values" extension to create
|
||||
* fast "indirect threaded" interpreter.
|
||||
*/
|
||||
@ -1724,7 +1811,8 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
ucell codesize;
|
||||
int num,i;
|
||||
va_list ap;
|
||||
int debug;
|
||||
AMX_DEBUGCALL tracer = 0;
|
||||
AMX_DBG *pdbg = 0;
|
||||
|
||||
/* HACK: return label table (for amx_BrowseRelocate) if amx structure
|
||||
* has the AMX_FLAG_BROWSE flag set.
|
||||
@ -1732,7 +1820,12 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
if ((amx->flags & AMX_FLAG_BROWSE)==AMX_FLAG_BROWSE) {
|
||||
assert(sizeof(cell)==sizeof(void *));
|
||||
assert(retval!=NULL);
|
||||
*retval=(cell)((amx->flags & AMX_FLAG_DEBUG)==0 ? amx_opcodelist_nodebug : amx_opcodelist);
|
||||
if (amx->flags & AMX_FLAG_DEBUG)
|
||||
{
|
||||
*retval=(cell)(amx_opcodelist);
|
||||
} else {
|
||||
*retval=(cell)(amx_opcodelist_nodebug);
|
||||
}
|
||||
return 0;
|
||||
} /* if */
|
||||
|
||||
@ -1745,7 +1838,6 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
if ((amx->flags & AMX_FLAG_RELOC)==0)
|
||||
return AMX_ERR_INIT;
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
debug= (amx->flags & AMX_FLAG_DEBUG)!=0;
|
||||
|
||||
/* set up the registers */
|
||||
hdr=(AMX_HEADER *)amx->base;
|
||||
@ -1787,15 +1879,6 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
CHKHEAP();
|
||||
init_little_endian();
|
||||
|
||||
if (debug && index!=AMX_EXEC_CONT) {
|
||||
/* set the entry point in the debugger by marking a "call" to the
|
||||
* exported function
|
||||
*/
|
||||
amx->dbgcode=DBG_CALL;
|
||||
amx->dbgaddr=(ucell)((unsigned char*)cip-code);
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
|
||||
/* sanity checks */
|
||||
assert(OP_PUSH_PRI==36);
|
||||
assert(OP_PROC==46);
|
||||
@ -1838,6 +1921,20 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
/* check stack/heap before starting to run */
|
||||
CHKMARGIN();
|
||||
|
||||
if ((amx->flags & AMX_FLAG_DEBUG) && (amx->flags & AMX_FLAG_LINEOPS))
|
||||
{
|
||||
if (amx->userdata[0])
|
||||
{
|
||||
tracer = (AMX_DEBUGCALL)amx->userdata[1];
|
||||
pdbg = (AMX_DBG *)(amx->userdata[0]);
|
||||
if (tracer)
|
||||
{
|
||||
//as a precaution, clear the call stack
|
||||
(tracer)(amx, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* start running */
|
||||
NEXT(cip);
|
||||
|
||||
@ -2101,12 +2198,6 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
stk+=offs;
|
||||
CHKMARGIN();
|
||||
CHKSTACK();
|
||||
if (debug && offs>0) {
|
||||
amx->dbgcode=DBG_CLRSYM;
|
||||
amx->stk=stk;
|
||||
amx->hea=hea;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
NEXT(cip);
|
||||
op_stack_nodebug:
|
||||
GETPARAM(offs);
|
||||
@ -2128,19 +2219,16 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
CHKMARGIN();
|
||||
NEXT(cip);
|
||||
op_ret:
|
||||
if (tracer)
|
||||
{
|
||||
(tracer)(amx, 1);
|
||||
}
|
||||
POP(frm);
|
||||
POP(offs);
|
||||
/* verify the return address */
|
||||
if ((ucell)offs>=codesize)
|
||||
ABORT(amx,AMX_ERR_MEMACCESS);
|
||||
cip=(cell *)(code+(int)offs);
|
||||
if (debug) {
|
||||
amx->stk=stk;
|
||||
amx->hea=hea;
|
||||
amx->dbgcode=DBG_RETURN;
|
||||
amx->dbgparam=pri; /* store "return value" */
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
NEXT(cip);
|
||||
op_ret_nodebug:
|
||||
POP(frm);
|
||||
@ -2151,6 +2239,10 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
cip=(cell *)(code+(int)offs);
|
||||
NEXT(cip);
|
||||
op_retn:
|
||||
if (tracer)
|
||||
{
|
||||
(tracer)(amx, 1);
|
||||
}
|
||||
POP(frm);
|
||||
POP(offs);
|
||||
/* verify the return address */
|
||||
@ -2158,15 +2250,6 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
ABORT(amx,AMX_ERR_MEMACCESS);
|
||||
cip=(cell *)(code+(int)offs);
|
||||
stk+= *(cell *)(data+(int)stk) + sizeof(cell); /* remove parameters from the stack */
|
||||
if (debug) {
|
||||
amx->stk=stk;
|
||||
amx->hea=hea;
|
||||
amx->dbgcode=DBG_RETURN;
|
||||
amx->dbgparam=pri; /* store "return value" */
|
||||
amx->debug(amx);
|
||||
amx->dbgcode=DBG_CLRSYM;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
NEXT(cip);
|
||||
op_retn_nodebug:
|
||||
POP(frm);
|
||||
@ -2178,26 +2261,24 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
stk+= *(cell *)(data+(int)stk) + sizeof(cell); /* remove parameters from the stack */
|
||||
NEXT(cip);
|
||||
op_call:
|
||||
if (tracer)
|
||||
{
|
||||
(tracer)(amx, 2);
|
||||
}
|
||||
PUSH(((unsigned char *)cip-code)+sizeof(cell));/* push address behind instruction */
|
||||
cip=JUMPABS(code, cip); /* jump to the address */
|
||||
if (debug) {
|
||||
amx->dbgcode=DBG_CALL;
|
||||
amx->dbgaddr=(ucell)((unsigned char*)cip-code);
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
NEXT(cip);
|
||||
op_call_nodebug:
|
||||
PUSH(((unsigned char *)cip-code)+sizeof(cell));/* push address behind instruction */
|
||||
cip=JUMPABS(code, cip); /* jump to the address */
|
||||
NEXT(cip);
|
||||
op_call_pri:
|
||||
if (tracer)
|
||||
{
|
||||
(tracer)(amx, 2);
|
||||
}
|
||||
PUSH((unsigned char *)cip-code);
|
||||
cip=(cell *)(code+(int)pri);
|
||||
if (debug) {
|
||||
amx->dbgcode=DBG_CALL;
|
||||
amx->dbgaddr=pri;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
NEXT(cip);
|
||||
op_call_pri_nodebug:
|
||||
PUSH((unsigned char *)cip-code);
|
||||
@ -2529,12 +2610,6 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
amx->pri=pri;
|
||||
amx->alt=alt;
|
||||
amx->cip=(cell)((unsigned char*)cip-code);
|
||||
if (debug) {
|
||||
amx->dbgcode=DBG_TERMINATE;
|
||||
amx->dbgaddr=(cell)((unsigned char *)cip-code);
|
||||
amx->dbgparam=offs;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
if (offs==AMX_ERR_SLEEP) {
|
||||
amx->reset_stk=reset_stk;
|
||||
amx->reset_hea=reset_hea;
|
||||
@ -2611,23 +2686,6 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
GETPARAM(amx->curline);
|
||||
GETPARAM(amx->curfile);
|
||||
if (debug) {
|
||||
amx->frm=frm;
|
||||
amx->stk=stk;
|
||||
amx->hea=hea;
|
||||
amx->dbgcode=DBG_LINE;
|
||||
num=amx->debug(amx);
|
||||
if (num!=AMX_ERR_NONE) {
|
||||
if (num==AMX_ERR_SLEEP) {
|
||||
amx->pri=pri;
|
||||
amx->alt=alt;
|
||||
amx->cip=(cell)((unsigned char*)cip-code);
|
||||
amx->reset_stk=reset_stk;
|
||||
amx->reset_hea=reset_hea;
|
||||
} /* if */
|
||||
ABORT(amx,num);
|
||||
} /* if */
|
||||
} /* if */
|
||||
NEXT(cip);
|
||||
op_line_nodebug:
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
@ -2643,10 +2701,6 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
cip=(cell *)((unsigned char *)cip + (int)offs - 2*sizeof(cell));
|
||||
amx->dbgcode=DBG_SYMBOL;
|
||||
assert((amx->dbgparam >> 8)>0); /* local symbols only */
|
||||
if (debug) {
|
||||
amx->frm=frm; /* debugger needs this to relocate the symbols */
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
NEXT(cip);
|
||||
op_symbol_nodebug:
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
@ -2658,10 +2712,6 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
GETPARAM(amx->dbgaddr); /* dimension level */
|
||||
GETPARAM(amx->dbgparam); /* length */
|
||||
amx->dbgcode=DBG_SRANGE;
|
||||
if (debug) {
|
||||
amx->frm=frm; /* debugger needs this to relocate the symbols */
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
NEXT(cip);
|
||||
op_srange_nodebug:
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
@ -2671,10 +2721,6 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
GETPARAM(amx->dbgparam); /* tag id */
|
||||
amx->dbgcode=DBG_SYMTAG;
|
||||
if (debug) {
|
||||
amx->frm=frm; /* debugger needs this to relocate the symbols */
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
NEXT(cip);
|
||||
op_symtag_nodebug:
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
@ -2736,16 +2782,25 @@ static void *amx_opcodelist_nodebug[] = {
|
||||
#endif
|
||||
#elif defined __GNUC__
|
||||
/* force "cdecl" by adding an "attribute" to the declaration */
|
||||
#if defined __cplusplus
|
||||
extern "C" cell amx_exec_asm(cell *regs,cell *retval,cell stp,cell hea) __attribute__((cdecl));
|
||||
#else
|
||||
extern cell amx_exec_asm(cell *regs,cell *retval,cell stp,cell hea) __attribute__((cdecl));
|
||||
#endif
|
||||
#else
|
||||
/* force "cdecl" by specifying it as a "function class" with the "__cdecl" keyword */
|
||||
extern "C" cell __cdecl amx_exec_asm(cell *regs,cell *retval,cell stp,cell hea);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined ASM32 || defined JIT
|
||||
#if defined WIN32 || defined __cplusplus
|
||||
extern "C" void *amx_opcodelist[];
|
||||
extern "C" void *amx_opcodelist_nodebug[];
|
||||
#else
|
||||
extern void *amx_opcodelist[];
|
||||
extern void *amx_opcodelist_nodebug[];
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
@ -2758,7 +2813,6 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
ucell codesize;
|
||||
int i;
|
||||
va_list ap;
|
||||
int debug;
|
||||
#if defined ASM32 || defined JIT
|
||||
#ifdef __WATCOMC__
|
||||
#pragma aux amx_opcodelist "_*"
|
||||
@ -2770,6 +2824,8 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
cell offs;
|
||||
int num;
|
||||
#endif
|
||||
AMX_DEBUGCALL tracer = 0;
|
||||
AMX_DBG *pdbg = 0;
|
||||
|
||||
#if defined ASM32 || defined JIT
|
||||
/* HACK: return label table (for amx_BrowseRelocate) if amx structure
|
||||
@ -2785,12 +2841,27 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
*/
|
||||
*retval=(cell)amx_opcodelist;
|
||||
#else
|
||||
*retval=(cell)((amx->flags & AMX_FLAG_DEBUG)==0 ? amx_opcodelist_nodebug : amx_opcodelist);
|
||||
if (amx->flags & AMX_FLAG_DEBUG)
|
||||
{
|
||||
*retval=(cell)(amx_opcodelist);
|
||||
} else {
|
||||
*retval=(cell)(amx_opcodelist_nodebug);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
} /* if */
|
||||
#endif
|
||||
|
||||
|
||||
if ((amx->flags & AMX_FLAG_DEBUG) && (amx->flags & AMX_FLAG_LINEOPS))
|
||||
{
|
||||
if (amx->userdata[0])
|
||||
{
|
||||
tracer = (AMX_DEBUGCALL)amx->userdata[1];
|
||||
pdbg = (AMX_DBG *)(amx->userdata[0]);
|
||||
}
|
||||
}
|
||||
|
||||
if (amx->callback==NULL)
|
||||
return AMX_ERR_CALLBACK;
|
||||
i=amx_Register(amx,NULL,0); /* verify that all natives are registered */
|
||||
@ -2800,8 +2871,6 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
if ((amx->flags & AMX_FLAG_RELOC)==0)
|
||||
return AMX_ERR_INIT;
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
debug= (amx->flags & AMX_FLAG_DEBUG)!=0;
|
||||
|
||||
/* set up the registers */
|
||||
hdr=(AMX_HEADER *)amx->base;
|
||||
assert(hdr->magic==AMX_MAGIC);
|
||||
@ -2842,15 +2911,6 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
CHKHEAP();
|
||||
init_little_endian();
|
||||
|
||||
if (debug && index!=AMX_EXEC_CONT) {
|
||||
/* set the entry point in the debugger by marking a "call" to the
|
||||
* exported function
|
||||
*/
|
||||
amx->dbgcode=DBG_CALL;
|
||||
amx->dbgaddr=(ucell)((unsigned char *)cip-code);
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
|
||||
/* sanity checks */
|
||||
assert(OP_PUSH_PRI==36);
|
||||
assert(OP_PROC==46);
|
||||
@ -3188,12 +3248,6 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
stk+=offs;
|
||||
CHKMARGIN();
|
||||
CHKSTACK();
|
||||
if (debug && offs>0) {
|
||||
amx->dbgcode=DBG_CLRSYM;
|
||||
amx->hea=hea;
|
||||
amx->stk=stk;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
break;
|
||||
case OP_HEAP:
|
||||
GETPARAM(offs);
|
||||
@ -3214,13 +3268,6 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
if ((ucell)offs>=codesize)
|
||||
ABORT(amx,AMX_ERR_MEMACCESS);
|
||||
cip=(cell *)(code+(int)offs);
|
||||
if (debug) {
|
||||
amx->stk=stk;
|
||||
amx->hea=hea;
|
||||
amx->dbgcode=DBG_RETURN;
|
||||
amx->dbgparam=pri; /* store "return value" */
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
break;
|
||||
case OP_RETN:
|
||||
POP(frm);
|
||||
@ -3231,33 +3278,22 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
cip=(cell *)(code+(int)offs);
|
||||
stk+= *(cell *)(data+(int)stk) + sizeof(cell); /* remove parameters from the stack */
|
||||
amx->stk=stk;
|
||||
if (debug) {
|
||||
amx->stk=stk;
|
||||
amx->hea=hea;
|
||||
amx->dbgcode=DBG_RETURN;
|
||||
amx->dbgparam=pri; /* store "return value" */
|
||||
amx->debug(amx);
|
||||
amx->dbgcode=DBG_CLRSYM;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
if (tracer)
|
||||
{
|
||||
(tracer)(amx, 1);
|
||||
}
|
||||
break;
|
||||
case OP_CALL:
|
||||
PUSH(((unsigned char *)cip-code)+sizeof(cell));/* skip address */
|
||||
cip=JUMPABS(code, cip); /* jump to the address */
|
||||
if (debug) {
|
||||
amx->dbgcode=DBG_CALL;
|
||||
amx->dbgaddr=(ucell)((unsigned char *)cip-code);
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
if (tracer)
|
||||
{
|
||||
(tracer)(amx, 2);
|
||||
}
|
||||
break;
|
||||
case OP_CALL_PRI:
|
||||
PUSH((unsigned char *)cip-code);
|
||||
cip=(cell *)(code+(int)pri);
|
||||
if (debug) {
|
||||
amx->dbgcode=DBG_CALL;
|
||||
amx->dbgaddr=pri;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
break;
|
||||
case OP_JUMP:
|
||||
/* since the GETPARAM() macro modifies cip, you cannot
|
||||
@ -3585,12 +3621,6 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
amx->pri=pri;
|
||||
amx->alt=alt;
|
||||
amx->cip=(cell)((unsigned char*)cip-code);
|
||||
if (debug) {
|
||||
amx->dbgcode=DBG_TERMINATE;
|
||||
amx->dbgaddr=(cell)((unsigned char *)cip-code);
|
||||
amx->dbgparam=offs;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
if (offs==AMX_ERR_SLEEP) {
|
||||
amx->reset_stk=reset_stk;
|
||||
amx->reset_hea=reset_hea;
|
||||
@ -3667,23 +3697,6 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
GETPARAM(amx->curline);
|
||||
GETPARAM(amx->curfile);
|
||||
if (debug) {
|
||||
amx->frm=frm;
|
||||
amx->stk=stk;
|
||||
amx->hea=hea;
|
||||
amx->dbgcode=DBG_LINE;
|
||||
num=amx->debug(amx);
|
||||
if (num!=AMX_ERR_NONE) {
|
||||
if (num==AMX_ERR_SLEEP) {
|
||||
amx->pri=pri;
|
||||
amx->alt=alt;
|
||||
amx->cip=(cell)((unsigned char*)cip-code);
|
||||
amx->reset_stk=reset_stk;
|
||||
amx->reset_hea=reset_hea;
|
||||
} /* if */
|
||||
ABORT(amx,num);
|
||||
} /* if */
|
||||
} /* if */
|
||||
break;
|
||||
case OP_SYMBOL:
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
@ -3693,30 +3706,15 @@ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...)
|
||||
amx->dbgname=(char *)cip;
|
||||
cip=(cell *)((unsigned char *)cip + (int)offs - 2*sizeof(cell));
|
||||
assert((amx->dbgparam >> 8)>0); /* local symbols only */
|
||||
if (debug) {
|
||||
amx->frm=frm; /* debugger needs this to relocate the symbols */
|
||||
amx->dbgcode=DBG_SYMBOL;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
break;
|
||||
case OP_SRANGE:
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
GETPARAM(amx->dbgaddr); /* dimension level */
|
||||
GETPARAM(amx->dbgparam); /* length */
|
||||
if (debug) {
|
||||
amx->frm=frm; /* debugger needs this to relocate the symbols */
|
||||
amx->dbgcode=DBG_SRANGE;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
break;
|
||||
case OP_SYMTAG:
|
||||
assert((amx->flags & AMX_FLAG_BROWSE)==0);
|
||||
GETPARAM(amx->dbgparam); /* tag id */
|
||||
if (debug) {
|
||||
amx->frm=frm; /* debugger needs this to relocate the symbols */
|
||||
amx->dbgcode=DBG_SYMTAG;
|
||||
amx->debug(amx);
|
||||
} /* if */
|
||||
break;
|
||||
case OP_JUMP_PRI:
|
||||
cip=(cell *)(code+(int)pri);
|
||||
@ -4039,7 +4037,7 @@ static long utf8_lowmark[5] = { 0x80, 0x800, 0x10000, 0x200000, 0x4000000 };
|
||||
*/
|
||||
if (result<utf8_lowmark[followup])
|
||||
goto error;
|
||||
if (result>=0xd800 && result<=0xdfff || result==0xfffe || result==0xffff)
|
||||
if ((result>=0xd800 && result<=0xdfff) || result==0xfffe || result==0xffff)
|
||||
goto error;
|
||||
} /* if */
|
||||
|
||||
|
@ -22,14 +22,12 @@
|
||||
*/
|
||||
|
||||
#if defined __linux__
|
||||
#include "sclinux.h"
|
||||
#include <sclinux.h>
|
||||
#endif
|
||||
|
||||
#ifndef AMX_H_INCLUDED
|
||||
#define AMX_H_INCLUDED
|
||||
|
||||
//#define JIT
|
||||
|
||||
#if defined __LCC__ || defined __DMC__ || defined __linux__
|
||||
#include <stdint.h>
|
||||
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
|
||||
@ -136,6 +134,7 @@ typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, cell *params);
|
||||
typedef int (AMXAPI *AMX_CALLBACK)(struct tagAMX *amx, cell index,
|
||||
cell *result, cell *params);
|
||||
typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
|
||||
typedef int (AMXAPI *AMX_DEBUGCALL)(struct tagAMX *amx, int mode);
|
||||
#if !defined _FAR
|
||||
#define _FAR
|
||||
#endif
|
||||
@ -219,11 +218,9 @@ typedef struct tagAMX {
|
||||
cell reset_stk PACKED;
|
||||
cell reset_hea PACKED;
|
||||
cell sysreq_d PACKED; /* relocated address/value for the SYSREQ.D opcode */
|
||||
#if defined JIT
|
||||
/* support variables for the JIT */
|
||||
int reloc_size PACKED; /* required temporary buffer for relocations */
|
||||
long code_size PACKED; /* estimated memory footprint of the native code */
|
||||
#endif
|
||||
} AMX;
|
||||
|
||||
/* The AMX_HEADER structure is both the memory format as the file format. The
|
||||
@ -250,6 +247,23 @@ typedef struct tagAMX_HEADER {
|
||||
} AMX_HEADER PACKED;
|
||||
#define AMX_MAGIC 0xf1e0
|
||||
|
||||
//double linked list for stack
|
||||
typedef struct tagAMX_TRACE
|
||||
{
|
||||
cell line PACKED;
|
||||
cell file PACKED;
|
||||
struct tagAMX_TRACE *next PACKED;
|
||||
struct tagAMX_TRACE *prev PACKED;
|
||||
} AMX_TRACE PACKED;
|
||||
|
||||
typedef struct tagAMX_DBG
|
||||
{
|
||||
int32_t numFiles PACKED; /* number of chars in array */
|
||||
char **files PACKED; /* array of files */
|
||||
AMX_TRACE *head PACKED; /* begin of link list */
|
||||
AMX_TRACE *tail PACKED; /* end of link list */
|
||||
} AMX_DBG PACKED;
|
||||
|
||||
enum {
|
||||
AMX_ERR_NONE,
|
||||
/* reserve the first 15 error codes for exit codes of the abstract machine */
|
||||
@ -297,6 +311,8 @@ enum {
|
||||
#define AMX_FLAG_COMPACT 0x04 /* compact encoding */
|
||||
#define AMX_FLAG_BIGENDIAN 0x08 /* big endian encoding */
|
||||
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking */
|
||||
#define AMX_FLAG_LINEOPS 0x20 /* line ops are parsed by the JIT [loadtime only flag] */
|
||||
#define AMX_FLAG_TRACED 0x40 /* the file has already been traced */
|
||||
#define AMX_FLAG_BROWSE 0x4000 /* browsing/relocating or executing */
|
||||
#define AMX_FLAG_RELOC 0x8000 /* jump/call addresses relocated */
|
||||
|
||||
@ -337,6 +353,7 @@ uint32_t * AMXAPI amx_Align32(uint32_t *v);
|
||||
#if defined _I64_MAX || defined HAVE_I64
|
||||
uint64_t * AMXAPI amx_Align64(uint64_t *v);
|
||||
#endif
|
||||
|
||||
#if SMALL_CELL_SIZE==32
|
||||
#define amx_AlignCell amx_Align32
|
||||
#elif SMALL_CELL_SIZE==64
|
||||
@ -344,11 +361,13 @@ uint32_t * AMXAPI amx_Align32(uint32_t *v);
|
||||
#else
|
||||
#error Unsupported cell size
|
||||
#endif
|
||||
|
||||
int AMXAPI amx_Allot(AMX *amx, int cells, cell *amx_addr, cell **phys_addr);
|
||||
int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params);
|
||||
int AMXAPI amx_Cleanup(AMX *amx);
|
||||
int AMXAPI amx_Clone(AMX *amxClone, AMX *amxSource, void *data);
|
||||
int AMXAPI amx_Debug(AMX *amx); /* default debug procedure, does nothing */
|
||||
int AMXAPI amx_DebugCall(AMX *amx, int mode);
|
||||
int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...);
|
||||
int AMXAPI amx_Execv(AMX *amx, cell *retval, int index, int numparams, cell params[]);
|
||||
int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index);
|
||||
@ -383,7 +402,7 @@ int AMXAPI amx_StrLen(cell *cstring, int *length);
|
||||
int AMXAPI amx_UTF8Get(const char *string, const char **endptr, cell *value);
|
||||
int AMXAPI amx_UTF8Put(char *string, char **endptr, int maxchars, cell value);
|
||||
int AMXAPI amx_UTF8Check(const char *string);
|
||||
|
||||
void amx_NullNativeTable(AMX *amx);
|
||||
|
||||
#if !defined AMX_NO_ALIGN
|
||||
#if defined __linux__
|
||||
|
2110
amxmodx/amxexecn.asm
Executable file
2110
amxmodx/amxexecn.asm
Executable file
File diff suppressed because it is too large
Load Diff
@ -70,8 +70,8 @@ static cell AMX_NATIVE_CALL emit_sound(AMX *amx, cell *params) /* 7 param */
|
||||
|
||||
int len;
|
||||
char* szSample = get_amxstring(amx,params[3],0,len);
|
||||
float vol = *(REAL *)((void *)¶ms[4]);
|
||||
float att = *(REAL *)((void *)¶ms[5]);
|
||||
REAL vol = amx_ctof(params[4]);
|
||||
REAL att = amx_ctof(params[5]);
|
||||
int channel = params[2];
|
||||
int pitch = params[7];
|
||||
int flags = params[6];
|
||||
@ -273,13 +273,13 @@ static cell AMX_NATIVE_CALL set_hudmessage(AMX *amx, cell *params) /* 11 param
|
||||
g_hudset.r1 = params[1];
|
||||
g_hudset.g1 = params[2];
|
||||
g_hudset.b1 = params[3];
|
||||
g_hudset.x = *(REAL *)((void *)¶ms[4]);
|
||||
g_hudset.y = *(REAL *)((void *)¶ms[5]);
|
||||
g_hudset.x = amx_ctof(params[4]);
|
||||
g_hudset.y = amx_ctof(params[5]);
|
||||
g_hudset.effect = params[6];
|
||||
g_hudset.fxTime = *(REAL *)((void *)¶ms[7]);
|
||||
g_hudset.holdTime = *(REAL *)((void *)¶ms[8]);
|
||||
g_hudset.fadeinTime = *(REAL *)((void *)¶ms[9]);
|
||||
g_hudset.fadeoutTime = *(REAL *)((void *)¶ms[10]);
|
||||
g_hudset.fxTime = amx_ctof(params[7]);
|
||||
g_hudset.holdTime = amx_ctof(params[8]);
|
||||
g_hudset.fadeinTime = amx_ctof(params[9]);
|
||||
g_hudset.fadeoutTime = amx_ctof(params[10]);
|
||||
g_hudset.channel = params[11];
|
||||
return 1;
|
||||
}
|
||||
@ -351,6 +351,15 @@ static cell AMX_NATIVE_CALL is_linux_server(AMX *amx, cell *params)
|
||||
#endif
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL is_amd64_server(AMX *amx, cell *params)
|
||||
{
|
||||
#if SMALL_CELL_SIZE==64
|
||||
return 1;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL is_jit_enabled(AMX *amx, cell *params) // PM: Useless ;P
|
||||
{
|
||||
#ifdef JIT
|
||||
@ -1159,13 +1168,13 @@ static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
int ilen;
|
||||
REAL pFloat = CVAR_GET_FLOAT(get_amxstring(amx,params[1],0,ilen));
|
||||
return *(cell*)((void *)&pFloat);
|
||||
return amx_ftoc(pFloat);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL set_cvar_float(AMX *amx, cell *params) /* 2 param */
|
||||
{
|
||||
int ilen;
|
||||
CVAR_SET_FLOAT(get_amxstring(amx,params[1],0,ilen),*(REAL *)((void *)¶ms[2]));
|
||||
CVAR_SET_FLOAT(get_amxstring(amx,params[1],0,ilen), amx_ctof(params[2]));
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1203,6 +1212,7 @@ static cell AMX_NATIVE_CALL message_begin(AMX *amx, cell *params) /* 4 param */
|
||||
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;
|
||||
@ -1213,12 +1223,13 @@ static cell AMX_NATIVE_CALL message_begin(AMX *amx, cell *params) /* 4 param */
|
||||
vecOrigin[2] = *(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( MSG_ONE, params[2], NULL, INDEXENT(params[4]) );
|
||||
MESSAGE_BEGIN( params[1], params[2], NULL, INDEXENT(params[4]) );
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1584,7 +1595,7 @@ static cell AMX_NATIVE_CALL get_maxplayers(AMX *amx, cell *params)
|
||||
static cell AMX_NATIVE_CALL get_gametime(AMX *amx, cell *params)
|
||||
{
|
||||
REAL pFloat = gpGlobals->time;
|
||||
return *(cell*)((void *)&pFloat);
|
||||
return amx_ftoc(pFloat);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_mapname(AMX *amx, cell *params) /* 2 param */
|
||||
@ -1667,6 +1678,16 @@ static cell AMX_NATIVE_CALL get_user_msgid(AMX *amx, cell *params) /* 1 param */
|
||||
return GET_USER_MSG_ID(PLID, sptemp , NULL );
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_user_msgname(AMX *amx, cell *params) /* get_user_msgname(msg, str[], len) = 3 params */
|
||||
{
|
||||
const char* STRING = GET_USER_MSG_NAME(PLID, params[1], NULL);
|
||||
if (STRING)
|
||||
return set_amxstring(amx, params[2], STRING, params[3]);
|
||||
|
||||
// Comes here if GET_USER_MSG_NAME failed (ie, invalid msg id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL set_task(AMX *amx, cell *params) /* 2 param */
|
||||
{
|
||||
|
||||
@ -1676,23 +1697,27 @@ static cell AMX_NATIVE_CALL set_task(AMX *amx, cell *params) /* 2 param */
|
||||
|
||||
char* stemp = get_amxstring(amx,params[2],1, a );
|
||||
|
||||
if (amx_FindPublic(amx, stemp , &iFunc) != AMX_ERR_NONE){
|
||||
if (params[5])
|
||||
{
|
||||
iFunc = registerSPForwardByName(amx, stemp, FP_ARRAY, FP_CELL, FP_DONE);
|
||||
} else {
|
||||
iFunc = registerSPForwardByName(amx, stemp, FP_CELL, FP_DONE);
|
||||
}
|
||||
if (iFunc == -1)
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")",stemp,plugin->getName() );
|
||||
amx_RaiseError(amx,AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
float base = *(REAL *)((void *)¶ms[1]);
|
||||
float base = amx_ctof(params[1]);
|
||||
|
||||
if ( base < 0.1 )
|
||||
base = 0.1;
|
||||
|
||||
char* temp = get_amxstring(amx,params[6],0,a);
|
||||
|
||||
g_tasksMngr.registerTask( plugin ,
|
||||
iFunc , UTIL_ReadFlags(temp), params[3], base ,
|
||||
params[5] ,
|
||||
get_amxaddr(amx,params[4]) , params[7] );
|
||||
g_tasksMngr.registerTask( plugin , iFunc , UTIL_ReadFlags(temp), params[3], base , params[5] , get_amxaddr(amx,params[4]) , params[7] );
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -1728,7 +1753,7 @@ static cell AMX_NATIVE_CALL register_cvar(AMX *amx, cell *params) /* 3 param */
|
||||
{
|
||||
CPluginMngr::CPlugin *plugin = g_plugins.findPluginFast(amx);
|
||||
CCVar* cvar = new CCVar( temp , plugin->getName() , params[3] ,
|
||||
*(REAL *)((void *)¶ms[4]) );
|
||||
amx_ctof(params[4]) );
|
||||
|
||||
if ( cvar == 0 )
|
||||
return 0;
|
||||
@ -1736,7 +1761,11 @@ static cell AMX_NATIVE_CALL register_cvar(AMX *amx, cell *params) /* 3 param */
|
||||
g_cvars.put( cvar );
|
||||
|
||||
if ( CVAR_GET_POINTER(temp) == 0 )
|
||||
CVAR_REGISTER( cvar->getCvar() );
|
||||
{
|
||||
static cvar_t cvar_reg_helper;
|
||||
cvar_reg_helper = *(cvar->getCvar());
|
||||
CVAR_REGISTER( &cvar_reg_helper );
|
||||
}
|
||||
|
||||
CVAR_SET_STRING( temp ,get_amxstring(amx,params[2],1,i));
|
||||
return 1;
|
||||
@ -2011,10 +2040,10 @@ static cell AMX_NATIVE_CALL get_distance(AMX *amx, cell *params) /* 2 param */
|
||||
|
||||
static cell AMX_NATIVE_CALL random_float(AMX *amx, cell *params) /* 2 param */
|
||||
{
|
||||
float one = *(REAL *)((void *)¶ms[1]);
|
||||
float two = *(REAL *)((void *)¶ms[2]);
|
||||
float one = amx_ctof(params[1]);
|
||||
float two = amx_ctof(params[2]);
|
||||
REAL fRnd = RANDOM_FLOAT(one,two);
|
||||
return *(cell*)((void *)&fRnd);
|
||||
return amx_ftoc(fRnd);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL random_num(AMX *amx, cell *params) /* 2 param */
|
||||
@ -2253,7 +2282,7 @@ static cell AMX_NATIVE_CALL is_module_loaded(AMX *amx, cell *params)
|
||||
int len;
|
||||
char *name = get_amxstring(amx, params[1], 0, len);
|
||||
int id = 0;
|
||||
for (CList<CModule>::iterator iter = g_modules.begin(); iter; ++iter)
|
||||
for (CList<CModule,const char *>::iterator iter = g_modules.begin(); iter; ++iter)
|
||||
{
|
||||
if (stricmp((*iter).getName(), name) == 0)
|
||||
return id;
|
||||
@ -2286,7 +2315,7 @@ static cell AMX_NATIVE_CALL get_modulesnum(AMX *amx, cell *params)
|
||||
// native get_module(id, name[], nameLen, author[], authorLen, version[], versionLen, &status);
|
||||
static cell AMX_NATIVE_CALL get_module(AMX *amx, cell *params)
|
||||
{
|
||||
CList<CModule>::iterator moduleIter;
|
||||
CList<CModule,const char *>::iterator moduleIter;
|
||||
|
||||
// find the module
|
||||
int i = params[1];
|
||||
@ -2300,16 +2329,16 @@ static cell AMX_NATIVE_CALL get_module(AMX *amx, cell *params)
|
||||
if ((*moduleIter).isAmxx())
|
||||
{
|
||||
const amxx_module_info_s *info = (*moduleIter).getInfoNew();
|
||||
set_amxstring(amx, params[2], info->name, params[3]);
|
||||
set_amxstring(amx, params[4], info->author, params[5]);
|
||||
set_amxstring(amx, params[6], info->version, params[7]);
|
||||
set_amxstring(amx, params[2], info && info->name ? info->name : "unk", params[3]);
|
||||
set_amxstring(amx, params[4], info && info->author ? info->author : "unk", params[5]);
|
||||
set_amxstring(amx, params[6], info && info->version ? info->version : "unk", params[7]);
|
||||
}
|
||||
else
|
||||
{
|
||||
module_info_s *info = (*moduleIter).getInfo();
|
||||
set_amxstring(amx, params[2], info->name, params[3]);
|
||||
set_amxstring(amx, params[4], info->author, params[5]);
|
||||
set_amxstring(amx, params[6], info->version, params[7]);
|
||||
set_amxstring(amx, params[2], info && info->name ? info->name : "unk", params[3]);
|
||||
set_amxstring(amx, params[4], info && info->author ? info->author : "unk", params[5]);
|
||||
set_amxstring(amx, params[6], info && info->version ? info->version : "unk", params[7]);
|
||||
}
|
||||
|
||||
// compatibility problem possible
|
||||
@ -2438,7 +2467,7 @@ static cell AMX_NATIVE_CALL callfunc_end(AMX *amx, cell *params)
|
||||
// actual call
|
||||
if ((err = amx_Execv(plugin->getAMX(), &retVal, func, curParam, gparams)) != AMX_ERR_NONE)
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")", err, curPlugin->getAMX()->curline, curPlugin->getName());
|
||||
LogError(amx, err, "");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2469,7 +2498,7 @@ static cell AMX_NATIVE_CALL callfunc_end(AMX *amx, cell *params)
|
||||
|
||||
// native callfunc_push_int(value);
|
||||
// native callfunc_push_float(Float: value);
|
||||
static cell callfunc_push_byval(AMX *amx, cell *params)
|
||||
static cell AMX_NATIVE_CALL callfunc_push_byval(AMX *amx, cell *params)
|
||||
{
|
||||
CPluginMngr::CPlugin *curPlugin = g_plugins.findPluginFast(amx);
|
||||
if (!g_CallFunc_Plugin)
|
||||
@ -2495,7 +2524,7 @@ static cell callfunc_push_byval(AMX *amx, cell *params)
|
||||
|
||||
// native callfunc_push_intref(&value);
|
||||
// native callfunc_push_floatref(Float: &value);
|
||||
static cell callfunc_push_byref(AMX *amx, cell *params)
|
||||
static cell AMX_NATIVE_CALL callfunc_push_byref(AMX *amx, cell *params)
|
||||
{
|
||||
CPluginMngr::CPlugin *curPlugin = g_plugins.findPluginFast(amx);
|
||||
if (!g_CallFunc_Plugin)
|
||||
@ -2553,7 +2582,7 @@ static cell callfunc_push_byref(AMX *amx, cell *params)
|
||||
}
|
||||
|
||||
// native callfunc_push_str(value[]);
|
||||
static cell callfunc_push_str(AMX *amx, cell *params)
|
||||
static cell AMX_NATIVE_CALL callfunc_push_str(AMX *amx, cell *params)
|
||||
{
|
||||
CPluginMngr::CPlugin *curPlugin = g_plugins.findPluginFast(amx);
|
||||
if (!g_CallFunc_Plugin)
|
||||
@ -2614,34 +2643,83 @@ static cell callfunc_push_str(AMX *amx, cell *params)
|
||||
}
|
||||
|
||||
// get_langsnum();
|
||||
static cell get_langsnum(AMX *amx, cell *params)
|
||||
static cell AMX_NATIVE_CALL get_langsnum(AMX *amx, cell *params)
|
||||
{
|
||||
return g_langMngr.GetLangsNum();
|
||||
}
|
||||
|
||||
// get_lang(id, name[(at least 3)]);
|
||||
static cell get_lang(AMX *amx, cell *params)
|
||||
static cell AMX_NATIVE_CALL get_lang(AMX *amx, cell *params)
|
||||
{
|
||||
set_amxstring(amx, params[2], g_langMngr.GetLangName(params[1]), 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// register_dictionary(const filename[]);
|
||||
static cell register_dictionary(AMX *amx, cell *params)
|
||||
static cell AMX_NATIVE_CALL register_dictionary(AMX *amx, cell *params)
|
||||
{
|
||||
int len;
|
||||
int result = g_langMngr.MergeDefinitionFile(build_pathname("%s/lang/%s",
|
||||
get_localinfo("amxx_datadir", "addons/amxx/data"), get_amxstring(amx, params[1], 1, len)));
|
||||
get_localinfo("amxx_datadir", "addons/amxmodx/data"), get_amxstring(amx, params[1], 1, len)));
|
||||
return result;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL plugin_flags(AMX *amx, cell *params)
|
||||
{
|
||||
AMX_HEADER *hdr;
|
||||
hdr = (AMX_HEADER *)amx->base;
|
||||
return hdr->flags;
|
||||
}
|
||||
|
||||
// lang_exists(const name[]);
|
||||
static cell lang_exists(AMX *amx, cell *params)
|
||||
static cell AMX_NATIVE_CALL lang_exists(AMX *amx, cell *params)
|
||||
{
|
||||
int len = 0;
|
||||
return g_langMngr.LangExists(get_amxstring(amx, params[1], 1, len)) ? 1 : 0;
|
||||
}
|
||||
|
||||
cell AMX_NATIVE_CALL require_module(AMX *amx, cell *params)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
String s;
|
||||
|
||||
s.assign(get_amxstring(amx, params[1], 0, len));
|
||||
|
||||
CurModuleList.push(s);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL lang_phrase(AMX *amx, cell *params)
|
||||
{
|
||||
int len = 0;
|
||||
int iLang = params[1];
|
||||
|
||||
const char *cpLangName=NULL;
|
||||
// Handle player ids (1-32) and server language
|
||||
if (iLang == LANG_SERVER) { // LANG_SERVER
|
||||
cpLangName = g_vault.get("server_language");
|
||||
} else if (iLang >= 1 && iLang <= 32) { // Direct Client Id
|
||||
if ((int)CVAR_GET_FLOAT("amx_client_languages") == 0)
|
||||
{
|
||||
cpLangName = g_vault.get("server_language");
|
||||
} else {
|
||||
cpLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(iLang)->pEdict, "lang");
|
||||
}
|
||||
}
|
||||
if (!cpLangName || strlen(cpLangName) < 1)
|
||||
cpLangName = "en";
|
||||
|
||||
const char *str = get_amxstring(amx, params[2], 0, len);
|
||||
|
||||
const char *dat = g_langMngr.GetDef(cpLangName, str);
|
||||
|
||||
set_amxstring(amx, params[3], dat?dat:"ML_LNOTFOUND", params[4]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
AMX_NATIVE_INFO amxmod_Natives[] = {
|
||||
{ "client_cmd", client_cmd },
|
||||
{ "client_print", client_print },
|
||||
@ -2692,6 +2770,7 @@ AMX_NATIVE_INFO amxmod_Natives[] = {
|
||||
{ "get_user_ip", get_user_ip },
|
||||
{ "get_user_menu", get_user_menu},
|
||||
{ "get_user_msgid", get_user_msgid},
|
||||
{ "get_user_msgname", get_user_msgname},
|
||||
{ "get_user_name", get_user_name },
|
||||
{ "get_user_origin", get_user_origin},
|
||||
{ "get_user_ping", get_user_ping },
|
||||
@ -2707,6 +2786,7 @@ AMX_NATIVE_INFO amxmod_Natives[] = {
|
||||
{ "get_xvar_num", get_xvar_num },
|
||||
{ "is_dedicated_server",is_dedicated_server },
|
||||
{ "is_linux_server", is_linux_server },
|
||||
{ "is_amd64_server", is_amd64_server },
|
||||
{ "is_jit_enabled", is_jit_enabled },
|
||||
{ "is_user_authorized", is_user_authorized },
|
||||
{ "is_map_valid", is_map_valid },
|
||||
@ -2741,6 +2821,7 @@ AMX_NATIVE_INFO amxmod_Natives[] = {
|
||||
{ "register_logevent",register_logevent},
|
||||
{ "register_menucmd", register_menucmd },
|
||||
{ "register_menuid", register_menuid },
|
||||
{ "require_module", require_module },
|
||||
{ "register_plugin", register_plugin },
|
||||
{ "register_srvcmd", register_srvcmd },
|
||||
{ "remove_cvar_flags", remove_cvar_flags },
|
||||
@ -2798,5 +2879,7 @@ AMX_NATIVE_INFO amxmod_Natives[] = {
|
||||
{ "lang_exists", lang_exists },
|
||||
{ "md5", amx_md5 },
|
||||
{ "md5_file", amx_md5_file },
|
||||
{ "plugin_flags", plugin_flags},
|
||||
{ "lang_phrase", lang_phrase},
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
@ -140,7 +140,7 @@ extern CList<CCVar> g_cvars;
|
||||
extern CList<ForceObject> g_forcemodels;
|
||||
extern CList<ForceObject> g_forcesounds;
|
||||
extern CList<ForceObject> g_forcegeneric;
|
||||
extern CList<CModule> g_modules;
|
||||
extern CList<CModule,const char *> g_modules;
|
||||
extern CList<CPlayer*> g_auth;
|
||||
extern EventsMngr g_events;
|
||||
extern Grenades g_grenades;
|
||||
@ -157,7 +157,6 @@ extern XVars g_xvars;
|
||||
extern bool g_bmod_cstrike;
|
||||
extern bool g_bmod_dod;
|
||||
extern bool g_dontprecache;
|
||||
extern bool g_initialized;
|
||||
extern int g_srvindex;
|
||||
extern cvar_t* amxmodx_version;
|
||||
extern cvar_t* hostname;
|
||||
@ -243,7 +242,7 @@ AMX* get_amxscript(int, void**,const char**);
|
||||
const char* get_amxscriptname(AMX* amx);
|
||||
char* get_amxstring(AMX *amx,cell amx_addr,int id,int& len);
|
||||
int amxstring_len(cell* cstr);
|
||||
int load_amxscript(AMX* amx, void** program, const char* path, char error[64]);
|
||||
int load_amxscript(AMX* amx, void** program, const char* path, char error[64], int debug);
|
||||
int set_amxnatives(AMX* amx,char error[64]);
|
||||
int set_amxstring(AMX *amx,cell amx_addr,const char *source,int max);
|
||||
int unload_amxscript(AMX* amx,void** program);
|
||||
@ -255,6 +254,8 @@ void* alloc_amxmemory(void**, int size);
|
||||
void free_amxmemory(void **ptr);
|
||||
// get_localinfo
|
||||
const char* get_localinfo( const char* name , const char* def );
|
||||
cell AMX_NATIVE_CALL require_module(AMX *amx, cell *params);
|
||||
void LogError(AMX *amx, int err, const char *fmt, ...);
|
||||
|
||||
enum ModuleCallReason
|
||||
{
|
||||
@ -267,6 +268,7 @@ enum ModuleCallReason
|
||||
extern ModuleCallReason g_ModuleCallReason; // modules.cpp
|
||||
extern CModule *g_CurrentlyCalledModule; // modules.cpp
|
||||
extern const char *g_LastRequestedFunc; // modules.cpp
|
||||
extern CQueue<String> CurModuleList;
|
||||
|
||||
void *Module_ReqFnptr(const char *funcName); // modules.cpp
|
||||
|
||||
|
@ -31,7 +31,7 @@
|
||||
|
||||
#include "amxmodx.h"
|
||||
#include "amxxfile.h"
|
||||
#include "minilzo/minilzo.h"
|
||||
#include "zlib/zlib.h"
|
||||
|
||||
/**********************
|
||||
****** AMXXFILE ******
|
||||
@ -51,7 +51,7 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef lzo_byte mint8_t;
|
||||
typedef char mint8_t;
|
||||
typedef int16_t mint16_t;
|
||||
typedef int32_t mint32_t;
|
||||
|
||||
@ -85,13 +85,6 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
||||
m_Status = Err_None;
|
||||
m_CellSize = cellsize;
|
||||
|
||||
// Make sure the decompressor runs
|
||||
if (lzo_init() != LZO_E_OK)
|
||||
{
|
||||
m_Status = Err_DecompressorInit;
|
||||
return;
|
||||
}
|
||||
|
||||
m_pFile = fopen(filename, "rb");
|
||||
if (!m_pFile)
|
||||
{
|
||||
@ -103,7 +96,7 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
||||
DATAREAD(&magic, sizeof(magic), 1);
|
||||
|
||||
m_OldFile = false;
|
||||
if (magic != 0x524C4542)
|
||||
if (magic != 0x414D5842)
|
||||
{
|
||||
// check for old file
|
||||
AMX_HEADER hdr;
|
||||
@ -131,7 +124,13 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
||||
m_pFile = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if ( magic == 0x524C4542 ) {
|
||||
//we have an invalid, old, RLEB file
|
||||
m_Status = Err_OldFile;
|
||||
fclose(m_pFile);
|
||||
m_pFile = NULL;
|
||||
return;
|
||||
} else {
|
||||
|
||||
// try to find the section
|
||||
mint8_t numOfPlugins;
|
||||
@ -171,6 +170,7 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
|
||||
fseek(m_pFile, 0, SEEK_END);
|
||||
m_SectionLength = ftell(m_pFile) - (long)entry.offset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CAmxxReader::~CAmxxReader()
|
||||
@ -205,11 +205,15 @@ size_t CAmxxReader::GetBufferSize()
|
||||
if (!m_pFile)
|
||||
return 0;
|
||||
|
||||
|
||||
long save = ftell(m_pFile);
|
||||
|
||||
if (m_OldFile)
|
||||
{
|
||||
rewind(m_pFile);
|
||||
AMX_HEADER hdr;
|
||||
DATAREAD(&hdr, sizeof(hdr), 1);
|
||||
fseek(m_pFile, save, SEEK_SET);
|
||||
return hdr.stp;
|
||||
}
|
||||
|
||||
@ -217,6 +221,7 @@ size_t CAmxxReader::GetBufferSize()
|
||||
|
||||
TableEntry entry;
|
||||
DATAREAD(&entry, sizeof(entry), 1);
|
||||
fseek(m_pFile, save, SEEK_SET);
|
||||
return entry.origSize + 1; // +1 : safe
|
||||
}
|
||||
|
||||
@ -255,16 +260,19 @@ CAmxxReader::Error CAmxxReader::GetSection(void *buffer)
|
||||
TableEntry entry;
|
||||
DATAREAD(&entry, sizeof(entry), 1);
|
||||
fseek(m_pFile, entry.offset, SEEK_SET);
|
||||
|
||||
// AMXXLOG_Log("|||| Offset needed: %d At: %d", entry.offset, ftell(m_pFile));
|
||||
uLongf destLen = GetBufferSize();
|
||||
// read the data to a temporary buffer
|
||||
lzo_byte *tempBuffer = new lzo_byte[m_SectionLength + 1];
|
||||
char *tempBuffer = new char[m_SectionLength + 1];
|
||||
//fread(tempBuffer, sizeof(char), m_SectionLength, m_pFile);
|
||||
DATAREAD((void*)tempBuffer, 1, m_SectionLength);
|
||||
// decompress
|
||||
lzo_uint destLen = GetBufferSize();
|
||||
int result = lzo1x_decompress_safe(tempBuffer, m_SectionLength,
|
||||
(lzo_byte*)buffer, &destLen,
|
||||
NULL /*unused*/ );
|
||||
if (result != LZO_E_OK)
|
||||
// AMXXLOG_Log("|||| First Bytes: %d %d %d %d", tempBuffer[0], tempBuffer[1], tempBuffer[2], tempBuffer[3]);
|
||||
int result = uncompress((Bytef *)buffer, &destLen,
|
||||
(Bytef *)tempBuffer, m_SectionLength);
|
||||
delete [] tempBuffer;
|
||||
// AMXXLOG_Log("|||| Result: %d, m_SectionLength=%d, destLen=%d", result, m_SectionLength, destLen);
|
||||
if (result != Z_OK)
|
||||
{
|
||||
m_Status = Err_Decompress;
|
||||
return Err_Decompress;
|
||||
|
@ -44,7 +44,8 @@ public:
|
||||
Err_FileInvalid,
|
||||
Err_SectionNotFound,
|
||||
Err_DecompressorInit,
|
||||
Err_Decompress
|
||||
Err_Decompress,
|
||||
Err_OldFile,
|
||||
};
|
||||
|
||||
private:
|
||||
|
@ -40,6 +40,10 @@
|
||||
#endif
|
||||
#include "amxmodx.h"
|
||||
|
||||
#ifndef __linux__
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
|
||||
CLog::CLog()
|
||||
{
|
||||
m_LogType = 0;
|
||||
@ -60,7 +64,7 @@ void CLog::CloseFile()
|
||||
if (fp)
|
||||
{
|
||||
fclose(fp);
|
||||
fopen(m_LogFile.c_str(), "a+");
|
||||
fp = fopen(m_LogFile.c_str(), "a+");
|
||||
|
||||
// get time
|
||||
time_t td;
|
||||
@ -102,8 +106,11 @@ void CLog::CreateNewFile()
|
||||
ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n");
|
||||
SET_LOCALINFO("amxx_logging", "0");
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(fp, "AMX Mod X log file started (file \"%s/L%02d%02d%03d.log\") (version \"%s\")\n", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i, AMX_VERSION);
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
void CLog::UseFile(const String &fileName)
|
||||
@ -158,7 +165,7 @@ void CLog::Log(const char *fmt, ...)
|
||||
|
||||
va_list arglst;
|
||||
va_start(arglst, fmt);
|
||||
vsprintf(msg, fmt, arglst);
|
||||
vsnprintf(msg, 3071, fmt, arglst);
|
||||
va_end(arglst);
|
||||
|
||||
FILE *pF;
|
||||
@ -181,9 +188,18 @@ void CLog::Log(const char *fmt, ...)
|
||||
{
|
||||
pF = fopen(build_pathname("%s/L%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday), "a+");
|
||||
}
|
||||
if (pF)
|
||||
{
|
||||
fprintf(pF, "L %s: %s\n", date, msg);
|
||||
|
||||
fclose(pF);
|
||||
}
|
||||
else
|
||||
{
|
||||
ALERT(at_logged, "[AMXX] Unexpected fatal logging error (couldn't open %s for a+). AMXX Logging disabled for this map.\n", m_LogFile.c_str());
|
||||
m_LogType = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// print on server console
|
||||
print_srvconsole("L %s: %s\n", date, msg);
|
||||
}
|
||||
@ -194,7 +210,7 @@ void CLog::Log(const char *fmt, ...)
|
||||
char msg[3072];
|
||||
va_list arglst;
|
||||
va_start(arglst, fmt);
|
||||
vsprintf(msg, fmt, arglst);
|
||||
vsnprintf(msg, 3071, fmt, arglst);
|
||||
va_end(arglst);
|
||||
ALERT(at_logged, "%s\n", msg);
|
||||
}
|
||||
|
@ -320,7 +320,7 @@
|
||||
prev_mres = mres; \
|
||||
if (mres == MRES_UNSET) \
|
||||
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnArgs); \
|
||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnName); \
|
||||
} \
|
||||
} \
|
||||
/* Set meta result to the highest value */ \
|
||||
@ -353,7 +353,7 @@
|
||||
prev_mres = mres; \
|
||||
if (mres == MRES_UNSET) \
|
||||
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnArgs); \
|
||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnName); \
|
||||
} \
|
||||
} \
|
||||
/* Set meta result to the highest value */ \
|
||||
@ -379,7 +379,7 @@
|
||||
prev_mres = mres; \
|
||||
if (mres == MRES_UNSET) \
|
||||
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnArgs); \
|
||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnName); \
|
||||
} \
|
||||
} \
|
||||
/* Set meta result to the highest value */ \
|
||||
@ -412,7 +412,10 @@
|
||||
prev_mres = mres; \
|
||||
if (mres == MRES_UNSET) \
|
||||
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has not set meta result in \"%s\"", \
|
||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnArgs); \
|
||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnName); \
|
||||
if (mres == MRES_SUPERCEDE) \
|
||||
AMXXLOG_Log("[AMXX] Module \"%s\" (\"%s\") has set meta result in \"%s\" to supercede", \
|
||||
(*iter).GetInfo()->name, (*iter).GetPath(), #pfnName); \
|
||||
} \
|
||||
} \
|
||||
/* Set meta result to the highest value */ \
|
||||
@ -2341,6 +2344,14 @@ CFakeMeta::CFakeMetaPlugin::~CFakeMetaPlugin()
|
||||
}
|
||||
}
|
||||
|
||||
// ghost_of_evilspy's "could not find memloc for cvar" fix
|
||||
void FakeMeta_New_CVarRegister(cvar_t *pCVar)
|
||||
{
|
||||
static cvar_t tmpvar;
|
||||
tmpvar = *pCVar;
|
||||
CVAR_REGISTER(&tmpvar);
|
||||
}
|
||||
|
||||
int CFakeMeta::CFakeMetaPlugin::Query(mutil_funcs_t *pMetaUtilFuncs)
|
||||
{
|
||||
// Load the library
|
||||
@ -2387,7 +2398,13 @@ int CFakeMeta::CFakeMetaPlugin::Query(mutil_funcs_t *pMetaUtilFuncs)
|
||||
m_Status = PL_BADFILE;
|
||||
return 0;
|
||||
}
|
||||
giveEngFuncsFn(&g_engfuncs, gpGlobals);
|
||||
|
||||
// ghost_of_evilspy's "Could not find memloc for cvar" fix
|
||||
static enginefuncs_t fakemeta_engfuncs;
|
||||
memcpy(&fakemeta_engfuncs, &g_engfuncs, sizeof(enginefuncs_t));
|
||||
// Override cvar register to our own function
|
||||
fakemeta_engfuncs.pfnCVarRegister = FakeMeta_New_CVarRegister;
|
||||
giveEngFuncsFn(&fakemeta_engfuncs, gpGlobals);
|
||||
|
||||
if (queryFn(META_INTERFACE_VERSION, &m_Info, pMetaUtilFuncs) != 1)
|
||||
{
|
||||
@ -2700,7 +2717,7 @@ int CFakeMeta::GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pNewFunctionTable, int *int
|
||||
*interfaceVersion = NEW_DLL_FUNCTIONS_VERSION;
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy( pNewFunctionTable, &g_NewDllFunctionTable, sizeof( DLL_FUNCTIONS ) );
|
||||
memcpy( pNewFunctionTable, &g_NewDllFunctionTable, sizeof( NEW_DLL_FUNCTIONS ) );
|
||||
|
||||
// Make sure there is a core plugin
|
||||
AddCorePlugin();
|
||||
@ -2735,7 +2752,7 @@ int CFakeMeta::GetNewDLLFunctions_Post(NEW_DLL_FUNCTIONS *pNewFunctionTable, int
|
||||
*interfaceVersion = NEW_DLL_FUNCTIONS_VERSION;
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy( pNewFunctionTable, &g_NewDllFunctionTable_Post, sizeof( DLL_FUNCTIONS ) );
|
||||
memcpy( pNewFunctionTable, &g_NewDllFunctionTable_Post, sizeof( NEW_DLL_FUNCTIONS ) );
|
||||
|
||||
// Make sure there is a core plugin
|
||||
AddCorePlugin();
|
||||
|
@ -57,6 +57,23 @@
|
||||
|
||||
CVector<FILE *> FileList;
|
||||
|
||||
class AutoFilePtr
|
||||
{
|
||||
FILE *m_FP;
|
||||
public:
|
||||
AutoFilePtr(FILE *fp) : m_FP(fp)
|
||||
{ }
|
||||
~AutoFilePtr()
|
||||
{
|
||||
if (m_FP)
|
||||
fclose(m_FP);
|
||||
}
|
||||
operator FILE* ()
|
||||
{
|
||||
return m_FP;
|
||||
}
|
||||
};
|
||||
|
||||
static cell AMX_NATIVE_CALL read_dir(AMX *amx, cell *params)
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
@ -230,17 +247,20 @@ static cell AMX_NATIVE_CALL file_size(AMX *amx, cell *params) /* 1 param */
|
||||
{
|
||||
int iLen;
|
||||
char* sFile = get_amxstring(amx,params[1],0,iLen);
|
||||
FILE* fp = fopen(build_pathname("%s",sFile),"r");
|
||||
if ( fp != NULL) {
|
||||
if ( params[0] < 2 || params[2] == 0 ){
|
||||
AutoFilePtr fp(fopen(build_pathname("%s",sFile),"r"));
|
||||
if ( fp != NULL)
|
||||
{
|
||||
if ( params[0] < 2 || params[2] == 0 )
|
||||
{
|
||||
fseek(fp,0,SEEK_END);
|
||||
int size = ftell(fp);
|
||||
fclose(fp);
|
||||
return size;
|
||||
}
|
||||
else if ( params[2] == 1 ){
|
||||
else if ( params[2] == 1 )
|
||||
{
|
||||
int a = 0,lines = 0;
|
||||
while( a != EOF ){
|
||||
while( a != EOF )
|
||||
{
|
||||
++lines;
|
||||
while ( (a = fgetc(fp)) != '\n' && a != EOF )
|
||||
;
|
||||
@ -454,7 +474,7 @@ static cell AMX_NATIVE_CALL amx_filesize(AMX *amx, cell *params)
|
||||
int len;
|
||||
char *file = build_pathname("%s", format_amxstring(amx, params, 1, len));
|
||||
long size;
|
||||
FILE *fp = fopen(file, "rb");
|
||||
AutoFilePtr fp(fopen(file, "rb"));
|
||||
if (fp) {
|
||||
fseek(fp, 0, SEEK_END);
|
||||
size = ftell(fp);
|
||||
|
@ -37,6 +37,19 @@
|
||||
|
||||
#define PI 3.1415926535897932384626433832795
|
||||
|
||||
static REAL FromRadians(REAL angle, int radix)
|
||||
{
|
||||
switch (radix)
|
||||
{
|
||||
case 1: /* degrees, sexagesimal system (technically: degrees/minutes/seconds) */
|
||||
return (REAL)(angle / PI * 180.0);
|
||||
case 2: /* grades, centesimal system */
|
||||
return (REAL)(angle / PI * 200.0);
|
||||
default: /* assume already radian */
|
||||
return angle;
|
||||
} /* switch */
|
||||
}
|
||||
|
||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
||||
#pragma argsused
|
||||
#endif
|
||||
@ -357,6 +370,7 @@ static cell AMX_NATIVE_CALL n_floatatan(AMX *amx, cell *params)
|
||||
REAL fA = amx_ctof(params[1]);
|
||||
fA = ToRadians(fA, params[2]);
|
||||
fA = atan(fA);
|
||||
fA = FromRadians(fA, params[2]);
|
||||
return amx_ftoc(fA);
|
||||
}
|
||||
|
||||
@ -371,8 +385,8 @@ static cell AMX_NATIVE_CALL n_floatacos(AMX *amx, cell *params)
|
||||
* params[2] = radix
|
||||
*/
|
||||
REAL fA = amx_ctof(params[1]);
|
||||
fA = ToRadians(fA, params[2]);
|
||||
fA = acos(fA);
|
||||
fA = FromRadians(fA, params[2]);
|
||||
return amx_ftoc(fA);
|
||||
}
|
||||
|
||||
@ -387,8 +401,8 @@ static cell AMX_NATIVE_CALL n_floatasin(AMX *amx, cell *params)
|
||||
* params[2] = radix
|
||||
*/
|
||||
REAL fA = amx_ctof(params[1]);
|
||||
fA = ToRadians(fA, params[2]);
|
||||
fA = asin(fA);
|
||||
fA = FromRadians(fA, params[2]);
|
||||
return amx_ftoc(fA);
|
||||
}
|
||||
|
||||
@ -407,6 +421,7 @@ static cell AMX_NATIVE_CALL n_floatatan2(AMX *amx, cell *params)
|
||||
REAL fB = amx_ctof(params[2]);
|
||||
REAL fC;
|
||||
fC = atan2(fA, fB);
|
||||
fC = FromRadians(fC, params[3]);
|
||||
return amx_ftoc(fC);
|
||||
}
|
||||
|
||||
|
@ -57,6 +57,7 @@ void (*function)(void*);
|
||||
void (*endfunction)(void*);
|
||||
|
||||
CLog g_log;
|
||||
CQueue<String> CurModuleList;
|
||||
CForwardMngr g_forwards;
|
||||
CList<CPlayer*> g_auth;
|
||||
CList<CCVar> g_cvars;
|
||||
@ -81,12 +82,12 @@ bool g_bmod_dod;
|
||||
bool g_dontprecache;
|
||||
bool g_forcedmodules;
|
||||
bool g_forcedsounds;
|
||||
bool g_initialized;
|
||||
fakecmd_t g_fakecmd;
|
||||
float g_game_restarting;
|
||||
float g_game_timeleft;
|
||||
float g_task_time;
|
||||
float g_auth_time;
|
||||
bool g_initialized = false;
|
||||
|
||||
#ifdef MEMORY_TEST
|
||||
float g_next_memreport_time;
|
||||
@ -105,6 +106,7 @@ int g_srvindex;
|
||||
|
||||
cvar_t init_amxmodx_version = {"amxmodx_version", "", FCVAR_SERVER | FCVAR_SPONLY};
|
||||
cvar_t init_amxmodx_modules = {"amxmodx_modules", "", FCVAR_SPONLY};
|
||||
cvar_t init_amxmodx_debug = {"amx_debug", "1", FCVAR_SPONLY};
|
||||
cvar_t* amxmodx_version = NULL;
|
||||
cvar_t* amxmodx_modules = NULL;
|
||||
cvar_t* hostname = NULL;
|
||||
@ -199,9 +201,8 @@ const char* get_localinfo( const char* name , const char* def )
|
||||
// Initialize AMX stuff and load it's plugins from plugins.ini list
|
||||
// Call precache forward function from plugins
|
||||
int C_Spawn( edict_t *pent ) {
|
||||
|
||||
if ( g_initialized ) RETURN_META_VALUE(MRES_IGNORED, 0);
|
||||
|
||||
if (g_initialized)
|
||||
RETURN_META_VALUE(MRES_IGNORED, 0);
|
||||
g_initialized = true;
|
||||
g_forcedmodules = false;
|
||||
g_forcedsounds = false;
|
||||
@ -211,6 +212,7 @@ int C_Spawn( edict_t *pent ) {
|
||||
hostname = CVAR_GET_POINTER("hostname");
|
||||
mp_timelimit = CVAR_GET_POINTER("mp_timelimit");
|
||||
|
||||
g_forwards.clear();
|
||||
|
||||
g_log.MapChange();
|
||||
|
||||
@ -218,8 +220,8 @@ int C_Spawn( edict_t *pent ) {
|
||||
g_tasksMngr.registerTimers( &gpGlobals->time, &mp_timelimit->value, &g_game_timeleft );
|
||||
|
||||
// ###### Load lang
|
||||
g_langMngr.LoadCache(build_pathname("%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxx/data")));
|
||||
g_langMngr.Load(build_pathname("%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxx/data")));
|
||||
g_langMngr.LoadCache(build_pathname("%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
|
||||
g_langMngr.Load(build_pathname("%s/languages.dat", get_localinfo("amxmodx_datadir", "addons/amxmodx/data")));
|
||||
// ###### Initialize commands prefixes
|
||||
g_commands.registerPrefix( "amx" );
|
||||
g_commands.registerPrefix( "amxx" );
|
||||
@ -229,14 +231,14 @@ int C_Spawn( edict_t *pent ) {
|
||||
g_commands.registerPrefix( "cm_" );
|
||||
|
||||
// make sure localinfos are set
|
||||
get_localinfo("amxx_basedir", "addons/amxx");
|
||||
get_localinfo("amxx_pluginsdir", "addons/amxx/plugins");
|
||||
get_localinfo("amxx_modulesdir", "addons/amxx/modules");
|
||||
get_localinfo("amxx_configsdir", "addons/amxx/configs");
|
||||
get_localinfo("amxx_customdir", "addons/amxx/custom");
|
||||
get_localinfo("amxx_basedir", "addons/amxmodx");
|
||||
get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins");
|
||||
get_localinfo("amxx_modulesdir", "addons/amxmodx/modules");
|
||||
get_localinfo("amxx_configsdir", "addons/amxmodx/configs");
|
||||
get_localinfo("amxx_customdir", "addons/amxmodx/custom");
|
||||
|
||||
// ###### Load modules
|
||||
loadModules(get_localinfo("amxx_modules", "addons/amxx/configs/modules.ini"));
|
||||
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"));
|
||||
attachModules();
|
||||
int loaded = countModules(CountModules_Running); // Call after attachModules so all modules don't have pending stat
|
||||
// Set some info about amx version and modules
|
||||
@ -246,7 +248,7 @@ int C_Spawn( edict_t *pent ) {
|
||||
CVAR_SET_STRING(init_amxmodx_modules.name, buffer);
|
||||
|
||||
// ###### Load Vault
|
||||
g_vault.setSource( build_pathname("%s", get_localinfo("amxx_vault", "addons/amxx/configs/vault.ini")) );
|
||||
g_vault.setSource( build_pathname("%s", get_localinfo("amxx_vault", "addons/amxmodx/configs/vault.ini")) );
|
||||
g_vault.loadVault( );
|
||||
if (strlen(g_vault.get("server_language")) < 1)
|
||||
{
|
||||
@ -268,18 +270,18 @@ int C_Spawn( edict_t *pent ) {
|
||||
memset(g_players[0].flags,-1,sizeof(g_players[0].flags));
|
||||
|
||||
// ###### Load AMX scripts
|
||||
g_plugins.loadPluginsFromFile( get_localinfo("amxx_plugins", "addons/amxx/configs/plugins.ini") );
|
||||
g_plugins.loadPluginsFromFile( get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini") );
|
||||
|
||||
// Register forwards
|
||||
FF_PluginInit = registerForward("plugin_init", ET_IGNORE, FP_DONE);
|
||||
FF_ClientCommand = registerForward("client_command", ET_IGNORE, FP_CELL, FP_DONE);
|
||||
FF_ClientCommand = registerForward("client_command", ET_STOP, FP_CELL, FP_DONE);
|
||||
FF_ClientConnect = registerForward("client_connect", ET_IGNORE, FP_CELL, FP_DONE);
|
||||
FF_ClientDisconnect = registerForward("client_disconnect", ET_IGNORE, FP_CELL, FP_DONE);
|
||||
FF_ClientInfoChanged = registerForward("client_infochanged", ET_IGNORE, FP_CELL, FP_DONE);
|
||||
FF_ClientPutInServer = registerForward("client_putinserver", ET_IGNORE, FP_CELL, FP_DONE);
|
||||
FF_PluginCfg = registerForward("plugin_cfg", ET_IGNORE, FP_DONE);
|
||||
FF_PluginPrecache = registerForward("plugin_precache", ET_IGNORE, FP_DONE);
|
||||
FF_PluginLog = registerForward("plugin_log", ET_IGNORE, FP_DONE);
|
||||
FF_PluginLog = registerForward("plugin_log", ET_STOP, FP_DONE);
|
||||
FF_PluginEnd = registerForward("plugin_end", ET_IGNORE, FP_DONE);
|
||||
FF_InconsistentFile = registerForward("inconsistent_file", ET_STOP, FP_CELL, FP_STRING, FP_STRINGEX, FP_DONE);
|
||||
FF_ClientAuthorized = registerForward("client_authorized", ET_IGNORE, FP_CELL, FP_DONE);
|
||||
@ -398,8 +400,8 @@ void C_ServerActivate_Post( edict_t *pEdictList, int edictCount, int clientMax )
|
||||
executeForwards(FF_PluginCfg);
|
||||
|
||||
// ###### Save lang
|
||||
g_langMngr.Save(build_pathname("%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxx/data")));
|
||||
g_langMngr.SaveCache(build_pathname("%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxx/data")));
|
||||
g_langMngr.Save(build_pathname("%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
|
||||
g_langMngr.SaveCache(build_pathname("%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
|
||||
|
||||
// Correct time in Counter-Strike and other mods (except DOD)
|
||||
if ( !g_bmod_dod) g_game_timeleft = 0;
|
||||
@ -440,27 +442,30 @@ void C_ServerDeactivate() {
|
||||
// However leave AMX modules which are loaded only once
|
||||
void C_ServerDeactivate_Post() {
|
||||
|
||||
g_initialized = false;
|
||||
|
||||
detachReloadModules();
|
||||
|
||||
g_auth.clear();
|
||||
g_forwards.clear();
|
||||
g_commands.clear();
|
||||
g_forcemodels.clear();
|
||||
g_forcesounds.clear();
|
||||
g_forcegeneric.clear();
|
||||
g_grenades.clear();
|
||||
g_tasksMngr.clear();
|
||||
g_forwards.clear();
|
||||
g_logevents.clearLogEvents();
|
||||
g_events.clearEvents();
|
||||
g_menucmds.clear();
|
||||
g_vault.clear();
|
||||
g_xvars.clear();
|
||||
g_plugins.clear();
|
||||
g_langMngr.Save(build_pathname("%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxx/data")));
|
||||
g_langMngr.SaveCache(build_pathname("%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxx/data")));
|
||||
g_langMngr.Save(build_pathname("%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
|
||||
g_langMngr.SaveCache(build_pathname("%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
|
||||
g_langMngr.Clear();
|
||||
//clear module name cache
|
||||
while (!CurModuleList.empty())
|
||||
{
|
||||
CurModuleList.pop();
|
||||
}
|
||||
|
||||
// last memreport
|
||||
#ifdef MEMORY_TEST
|
||||
if (g_memreport_enabled)
|
||||
@ -473,14 +478,14 @@ void C_ServerDeactivate_Post() {
|
||||
tm *curTime = localtime(&td);
|
||||
int i = 0;
|
||||
#ifdef __linux__
|
||||
mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxx")), 0700);
|
||||
mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxmodx")), 0700);
|
||||
#else
|
||||
mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxx")));
|
||||
mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxmodx")));
|
||||
#endif
|
||||
while (true)
|
||||
{
|
||||
char buffer[256];
|
||||
sprintf(buffer, "%s/memreports/D%02d%02d%03d", get_localinfo("amxx_basedir", "addons/amxx"), curTime->tm_mon + 1, curTime->tm_mday, i);
|
||||
sprintf(buffer, "%s/memreports/D%02d%02d%03d", get_localinfo("amxx_basedir", "addons/amxmodx"), curTime->tm_mon + 1, curTime->tm_mday, i);
|
||||
#ifdef __linux__
|
||||
mkdir(build_pathname("%s", g_log_dir.c_str()), 0700);
|
||||
if (mkdir(build_pathname(buffer), 0700) < 0)
|
||||
@ -514,6 +519,7 @@ void C_ServerDeactivate_Post() {
|
||||
}
|
||||
#endif // MEMORY_TEST
|
||||
|
||||
g_initialized = false;
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
@ -632,8 +638,7 @@ void C_ClientCommand( edict_t *pEntity ) {
|
||||
{
|
||||
|
||||
if ((err =amx_Exec((*aa).getPlugin()->getAMX(), &ret , (*aa).getFunction() , 3, pPlayer->index, (*aa).getFlags(),(*aa).getId() )) != AMX_ERR_NONE)
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")",
|
||||
err,(*aa).getPlugin()->getAMX()->curline,(*aa).getPlugin()->getName());
|
||||
LogError((*aa).getPlugin()->getAMX(), err, "");
|
||||
|
||||
if ( ret & 2 ) result = MRES_SUPERCEDE;
|
||||
if ( ret & 1 ) RETURN_META(MRES_SUPERCEDE);
|
||||
@ -672,8 +677,7 @@ void C_ClientCommand( edict_t *pEntity ) {
|
||||
{
|
||||
|
||||
if ( ( err = amx_Exec((*a).getPlugin()->getAMX(), &ret ,(*a).getFunction() , 2, pPlayer->index,pressed_key)) != AMX_ERR_NONE)
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")",
|
||||
err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName());
|
||||
LogError((*a).getPlugin()->getAMX(), err, "");
|
||||
|
||||
if ( ret & 2 ) result = MRES_SUPERCEDE;
|
||||
if ( ret & 1 ) RETURN_META(MRES_SUPERCEDE);
|
||||
@ -738,14 +742,14 @@ void C_StartFrame_Post( void ) {
|
||||
tm *curTime = localtime(&td);
|
||||
int i = 0;
|
||||
#ifdef __linux__
|
||||
mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxx")), 0700);
|
||||
mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxmodx")), 0700);
|
||||
#else
|
||||
mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxx")));
|
||||
mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxmodx")));
|
||||
#endif
|
||||
while (true)
|
||||
{
|
||||
char buffer[256];
|
||||
sprintf(buffer, "%s/memreports/D%02d%02d%03d", get_localinfo("amxx_basedir", "addons/amxx"), curTime->tm_mon + 1, curTime->tm_mday, i);
|
||||
sprintf(buffer, "%s/memreports/D%02d%02d%03d", get_localinfo("amxx_basedir", "addons/amxmodx"), curTime->tm_mon + 1, curTime->tm_mday, i);
|
||||
#ifdef __linux__
|
||||
mkdir(build_pathname("%s", g_log_dir.c_str()), 0700);
|
||||
if (mkdir(build_pathname(buffer), 0700) < 0)
|
||||
@ -878,7 +882,7 @@ void C_MessageEnd_Post(void) {
|
||||
{
|
||||
|
||||
if ((err = amx_Exec((*a).getPlugin()->getAMX(), NULL , (*a).getFunction() , 1, mPlayerIndex /*g_events.getArgInteger(0)*/ )) != AMX_ERR_NONE)
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")",err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName());
|
||||
LogError((*a).getPlugin()->getAMX(), err, "");
|
||||
|
||||
|
||||
++a;
|
||||
@ -981,7 +985,9 @@ void C_AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...)
|
||||
g_logevents.parseLogString( );
|
||||
if (g_logevents.logEventsExist())
|
||||
g_logevents.executeLogEvents( );
|
||||
executeForwards(FF_PluginLog);
|
||||
cell retVal = executeForwards(FF_PluginLog);
|
||||
if (retVal)
|
||||
RETURN_META(MRES_HANDLED);
|
||||
}
|
||||
|
||||
RETURN_META(MRES_IGNORED);
|
||||
@ -1023,13 +1029,14 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
|
||||
gMetaFunctionTable.pfnGetEntityAPI2_Post = GetEntityAPI2_Post;
|
||||
gMetaFunctionTable.pfnGetEngineFunctions = GetEngineFunctions;
|
||||
gMetaFunctionTable.pfnGetEngineFunctions_Post = GetEngineFunctions_Post;
|
||||
//gMetaFunctionTable.pfnGetNewDLLFunctions = GetNewDLLFunctions;
|
||||
//gMetaFunctionTable.pfnGetNewDLLFunctions_Post = GetNewDLLFunctions_Post;
|
||||
gMetaFunctionTable.pfnGetNewDLLFunctions = GetNewDLLFunctions;
|
||||
gMetaFunctionTable.pfnGetNewDLLFunctions_Post = GetNewDLLFunctions_Post;
|
||||
|
||||
memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS));
|
||||
gpGamedllFuncs=pGamedllFuncs;
|
||||
CVAR_REGISTER(&init_amxmodx_version);
|
||||
CVAR_REGISTER(&init_amxmodx_modules);
|
||||
CVAR_REGISTER(&init_amxmodx_debug);
|
||||
amxmodx_version = CVAR_GET_POINTER(init_amxmodx_version.name);
|
||||
REG_SVR_COMMAND("amxx",amx_command);
|
||||
|
||||
@ -1050,7 +1057,7 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
|
||||
|
||||
// ###### Load custom path configuration
|
||||
Vault amx_config;
|
||||
amx_config.setSource(build_pathname("%s", get_localinfo("amxx_cfg", "addons/amxx/configs/core.ini")));
|
||||
amx_config.setSource(build_pathname("%s", get_localinfo("amxx_cfg", "addons/amxmodx/configs/core.ini")));
|
||||
|
||||
if ( amx_config.loadVault() ){
|
||||
Vault::iterator a = amx_config.begin();
|
||||
@ -1062,11 +1069,11 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
|
||||
}
|
||||
|
||||
// ###### Initialize logging here
|
||||
g_log_dir.assign(get_localinfo("amxx_logs", "addons/amxx/logs"));
|
||||
g_log_dir.assign(get_localinfo("amxx_logs", "addons/amxmodx/logs"));
|
||||
|
||||
// ###### Now attach metamod modules
|
||||
// This will also call modules Meta_Query and Meta_Attach functions
|
||||
attachMetaModModules(now, get_localinfo("amxx_modules", "addons/amxx/configs/modules.ini") );
|
||||
attachMetaModModules(now, get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini") );
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
@ -1227,15 +1234,6 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
||||
meta_engfuncs.pfnChangeLevel = C_ChangeLevel;
|
||||
|
||||
return g_FakeMeta.GetEngineFunctions(pengfuncsFromEngine, interfaceVersion, &meta_engfuncs);
|
||||
/*
|
||||
if(*interfaceVersion!=ENGINE_INTERFACE_VERSION) {
|
||||
LOG_ERROR(PLID, "GetEngineFunctions version mismatch; requested=%d ours=%d", *interfaceVersion, ENGINE_INTERFACE_VERSION);
|
||||
*interfaceVersion = ENGINE_INTERFACE_VERSION;
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
|
||||
return(TRUE);
|
||||
*/
|
||||
}
|
||||
|
||||
enginefuncs_t meta_engfuncs_post;
|
||||
@ -1278,15 +1276,6 @@ C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int
|
||||
++iter;
|
||||
}
|
||||
return g_FakeMeta.GetEngineFunctions_Post(pengfuncsFromEngine, interfaceVersion, &meta_engfuncs_post);
|
||||
/*
|
||||
if(*interfaceVersion!=ENGINE_INTERFACE_VERSION) {
|
||||
LOG_ERROR(PLID, "GetEngineFunctions_Post version mismatch; requested=%d ours=%d", *interfaceVersion, ENGINE_INTERFACE_VERSION);
|
||||
*interfaceVersion = ENGINE_INTERFACE_VERSION;
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pengfuncsFromEngine, &meta_engfuncs_post, sizeof(enginefuncs_t));
|
||||
return(TRUE);
|
||||
*/
|
||||
}
|
||||
|
||||
NEW_DLL_FUNCTIONS gNewDLLFunctionTable;
|
||||
|
@ -1,451 +0,0 @@
|
||||
/* lzoconf.h -- configuration for the LZO real-time data compression library
|
||||
|
||||
This file is part of the LZO real-time data compression library.
|
||||
|
||||
Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
The LZO library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
The LZO library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with the LZO library; see the file COPYING.
|
||||
If not, write to the Free Software Foundation, Inc.,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Markus F.X.J. Oberhumer
|
||||
<markus@oberhumer.com>
|
||||
http://www.oberhumer.com/opensource/lzo/
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __LZOCONF_H
|
||||
#define __LZOCONF_H
|
||||
|
||||
#define LZO_VERSION 0x1080
|
||||
#define LZO_VERSION_STRING "1.08"
|
||||
#define LZO_VERSION_DATE "Jul 12 2002"
|
||||
|
||||
/* internal Autoconf configuration file - only used when building LZO */
|
||||
#if defined(LZO_HAVE_CONFIG_H)
|
||||
# include <config.h>
|
||||
#endif
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
// LZO requires a conforming <limits.h>
|
||||
************************************************************************/
|
||||
|
||||
#if !defined(CHAR_BIT) || (CHAR_BIT != 8)
|
||||
# error "invalid CHAR_BIT"
|
||||
#endif
|
||||
#if !defined(UCHAR_MAX) || !defined(UINT_MAX) || !defined(ULONG_MAX)
|
||||
# error "check your compiler installation"
|
||||
#endif
|
||||
#if (USHRT_MAX < 1) || (UINT_MAX < 1) || (ULONG_MAX < 1)
|
||||
# error "your limits.h macros are broken"
|
||||
#endif
|
||||
|
||||
/* workaround a cpp bug under hpux 10.20 */
|
||||
#define LZO_0xffffffffL 4294967295ul
|
||||
|
||||
#if !defined(LZO_UINT32_C)
|
||||
# if (UINT_MAX < LZO_0xffffffffL)
|
||||
# define LZO_UINT32_C(c) c ## UL
|
||||
# else
|
||||
# define LZO_UINT32_C(c) c ## U
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
// architecture defines
|
||||
************************************************************************/
|
||||
|
||||
#if !defined(__LZO_WIN) && !defined(__LZO_DOS) && !defined(__LZO_OS2)
|
||||
# if defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows)
|
||||
# define __LZO_WIN
|
||||
# elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
|
||||
# define __LZO_WIN
|
||||
# elif defined(__NT__) || defined(__NT_DLL__) || defined(__WINDOWS_386__)
|
||||
# define __LZO_WIN
|
||||
# elif defined(__DOS__) || defined(__MSDOS__) || defined(MSDOS)
|
||||
# define __LZO_DOS
|
||||
# elif defined(__OS2__) || defined(__OS2V2__) || defined(OS2)
|
||||
# define __LZO_OS2
|
||||
# elif defined(__palmos__)
|
||||
# define __LZO_PALMOS
|
||||
# elif defined(__TOS__) || defined(__atarist__)
|
||||
# define __LZO_TOS
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if (UINT_MAX < LZO_0xffffffffL)
|
||||
# if defined(__LZO_WIN)
|
||||
# define __LZO_WIN16
|
||||
# elif defined(__LZO_DOS)
|
||||
# define __LZO_DOS16
|
||||
# elif defined(__LZO_PALMOS)
|
||||
# define __LZO_PALMOS16
|
||||
# elif defined(__LZO_TOS)
|
||||
# define __LZO_TOS16
|
||||
# elif defined(__C166__)
|
||||
# else
|
||||
/* porting hint: for pure 16-bit architectures try compiling
|
||||
* everything with -D__LZO_STRICT_16BIT */
|
||||
# error "16-bit target not supported - contact me for porting hints"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined(__LZO_i386)
|
||||
# if defined(__LZO_DOS) || defined(__LZO_WIN16)
|
||||
# define __LZO_i386
|
||||
# elif defined(__i386__) || defined(__386__) || defined(_M_IX86)
|
||||
# define __LZO_i386
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(__LZO_STRICT_16BIT)
|
||||
# if (UINT_MAX < LZO_0xffffffffL)
|
||||
# include <lzo16bit.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* memory checkers */
|
||||
#if !defined(__LZO_CHECKER)
|
||||
# if defined(__BOUNDS_CHECKING_ON)
|
||||
# define __LZO_CHECKER
|
||||
# elif defined(__CHECKER__)
|
||||
# define __LZO_CHECKER
|
||||
# elif defined(__INSURE__)
|
||||
# define __LZO_CHECKER
|
||||
# elif defined(__PURIFY__)
|
||||
# define __LZO_CHECKER
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
// integral and pointer types
|
||||
************************************************************************/
|
||||
|
||||
/* Integral types with 32 bits or more */
|
||||
#if !defined(LZO_UINT32_MAX)
|
||||
# if (UINT_MAX >= LZO_0xffffffffL)
|
||||
typedef unsigned int lzo_uint32;
|
||||
typedef int lzo_int32;
|
||||
# define LZO_UINT32_MAX UINT_MAX
|
||||
# define LZO_INT32_MAX INT_MAX
|
||||
# define LZO_INT32_MIN INT_MIN
|
||||
# elif (ULONG_MAX >= LZO_0xffffffffL)
|
||||
typedef unsigned long lzo_uint32;
|
||||
typedef long lzo_int32;
|
||||
# define LZO_UINT32_MAX ULONG_MAX
|
||||
# define LZO_INT32_MAX LONG_MAX
|
||||
# define LZO_INT32_MIN LONG_MIN
|
||||
# else
|
||||
# error "lzo_uint32"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* lzo_uint is used like size_t */
|
||||
#if !defined(LZO_UINT_MAX)
|
||||
# if (UINT_MAX >= LZO_0xffffffffL)
|
||||
typedef unsigned int lzo_uint;
|
||||
typedef int lzo_int;
|
||||
# define LZO_UINT_MAX UINT_MAX
|
||||
# define LZO_INT_MAX INT_MAX
|
||||
# define LZO_INT_MIN INT_MIN
|
||||
# elif (ULONG_MAX >= LZO_0xffffffffL)
|
||||
typedef unsigned long lzo_uint;
|
||||
typedef long lzo_int;
|
||||
# define LZO_UINT_MAX ULONG_MAX
|
||||
# define LZO_INT_MAX LONG_MAX
|
||||
# define LZO_INT_MIN LONG_MIN
|
||||
# else
|
||||
# error "lzo_uint"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
typedef int lzo_bool;
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
// memory models
|
||||
************************************************************************/
|
||||
|
||||
/* Memory model for the public code segment. */
|
||||
#if !defined(__LZO_CMODEL)
|
||||
# if defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
||||
# define __LZO_CMODEL __far
|
||||
# elif defined(__LZO_i386) && defined(__WATCOMC__)
|
||||
# define __LZO_CMODEL __near
|
||||
# else
|
||||
# define __LZO_CMODEL
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Memory model for the public data segment. */
|
||||
#if !defined(__LZO_DMODEL)
|
||||
# if defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
||||
# define __LZO_DMODEL __far
|
||||
# elif defined(__LZO_i386) && defined(__WATCOMC__)
|
||||
# define __LZO_DMODEL __near
|
||||
# else
|
||||
# define __LZO_DMODEL
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Memory model that allows to access memory at offsets of lzo_uint. */
|
||||
#if !defined(__LZO_MMODEL)
|
||||
# if (LZO_UINT_MAX <= UINT_MAX)
|
||||
# define __LZO_MMODEL
|
||||
# elif defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
||||
# define __LZO_MMODEL __huge
|
||||
# define LZO_999_UNSUPPORTED
|
||||
# elif defined(__LZO_PALMOS16) || defined(__LZO_TOS16)
|
||||
# define __LZO_MMODEL
|
||||
# else
|
||||
# error "__LZO_MMODEL"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* no typedef here because of const-pointer issues */
|
||||
#define lzo_byte unsigned char __LZO_MMODEL
|
||||
#define lzo_bytep unsigned char __LZO_MMODEL *
|
||||
#define lzo_charp char __LZO_MMODEL *
|
||||
#define lzo_voidp void __LZO_MMODEL *
|
||||
#define lzo_shortp short __LZO_MMODEL *
|
||||
#define lzo_ushortp unsigned short __LZO_MMODEL *
|
||||
#define lzo_uint32p lzo_uint32 __LZO_MMODEL *
|
||||
#define lzo_int32p lzo_int32 __LZO_MMODEL *
|
||||
#define lzo_uintp lzo_uint __LZO_MMODEL *
|
||||
#define lzo_intp lzo_int __LZO_MMODEL *
|
||||
#define lzo_voidpp lzo_voidp __LZO_MMODEL *
|
||||
#define lzo_bytepp lzo_bytep __LZO_MMODEL *
|
||||
|
||||
#ifndef lzo_sizeof_dict_t
|
||||
# define lzo_sizeof_dict_t sizeof(lzo_bytep)
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
// calling conventions and function types
|
||||
************************************************************************/
|
||||
|
||||
/* linkage */
|
||||
#if !defined(__LZO_EXTERN_C)
|
||||
# ifdef __cplusplus
|
||||
# define __LZO_EXTERN_C extern "C"
|
||||
# else
|
||||
# define __LZO_EXTERN_C extern
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* calling convention */
|
||||
#if !defined(__LZO_CDECL)
|
||||
# if defined(__LZO_DOS16) || defined(__LZO_WIN16)
|
||||
# define __LZO_CDECL __LZO_CMODEL __cdecl
|
||||
# elif defined(__LZO_i386) && defined(_MSC_VER)
|
||||
# define __LZO_CDECL __LZO_CMODEL __cdecl
|
||||
# elif defined(__LZO_i386) && defined(__WATCOMC__)
|
||||
# define __LZO_CDECL __LZO_CMODEL __cdecl
|
||||
# else
|
||||
# define __LZO_CDECL __LZO_CMODEL
|
||||
# endif
|
||||
#endif
|
||||
#if !defined(__LZO_ENTRY)
|
||||
# define __LZO_ENTRY __LZO_CDECL
|
||||
#endif
|
||||
|
||||
/* C++ exception specification for extern "C" function types */
|
||||
#if !defined(__cplusplus)
|
||||
# undef LZO_NOTHROW
|
||||
# define LZO_NOTHROW
|
||||
#elif !defined(LZO_NOTHROW)
|
||||
# define LZO_NOTHROW
|
||||
#endif
|
||||
|
||||
|
||||
typedef int
|
||||
(__LZO_ENTRY *lzo_compress_t) ( const lzo_byte *src, lzo_uint src_len,
|
||||
lzo_byte *dst, lzo_uintp dst_len,
|
||||
lzo_voidp wrkmem );
|
||||
|
||||
typedef int
|
||||
(__LZO_ENTRY *lzo_decompress_t) ( const lzo_byte *src, lzo_uint src_len,
|
||||
lzo_byte *dst, lzo_uintp dst_len,
|
||||
lzo_voidp wrkmem );
|
||||
|
||||
typedef int
|
||||
(__LZO_ENTRY *lzo_optimize_t) ( lzo_byte *src, lzo_uint src_len,
|
||||
lzo_byte *dst, lzo_uintp dst_len,
|
||||
lzo_voidp wrkmem );
|
||||
|
||||
typedef int
|
||||
(__LZO_ENTRY *lzo_compress_dict_t)(const lzo_byte *src, lzo_uint src_len,
|
||||
lzo_byte *dst, lzo_uintp dst_len,
|
||||
lzo_voidp wrkmem,
|
||||
const lzo_byte *dict, lzo_uint dict_len );
|
||||
|
||||
typedef int
|
||||
(__LZO_ENTRY *lzo_decompress_dict_t)(const lzo_byte *src, lzo_uint src_len,
|
||||
lzo_byte *dst, lzo_uintp dst_len,
|
||||
lzo_voidp wrkmem,
|
||||
const lzo_byte *dict, lzo_uint dict_len );
|
||||
|
||||
|
||||
/* assembler versions always use __cdecl */
|
||||
typedef int
|
||||
(__LZO_CDECL *lzo_compress_asm_t)( const lzo_byte *src, lzo_uint src_len,
|
||||
lzo_byte *dst, lzo_uintp dst_len,
|
||||
lzo_voidp wrkmem );
|
||||
|
||||
typedef int
|
||||
(__LZO_CDECL *lzo_decompress_asm_t)( const lzo_byte *src, lzo_uint src_len,
|
||||
lzo_byte *dst, lzo_uintp dst_len,
|
||||
lzo_voidp wrkmem );
|
||||
|
||||
|
||||
/* a progress indicator callback function */
|
||||
typedef void (__LZO_ENTRY *lzo_progress_callback_t) (lzo_uint, lzo_uint);
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
// export information
|
||||
************************************************************************/
|
||||
|
||||
/* DLL export information */
|
||||
#if !defined(__LZO_EXPORT1)
|
||||
# define __LZO_EXPORT1
|
||||
#endif
|
||||
#if !defined(__LZO_EXPORT2)
|
||||
# define __LZO_EXPORT2
|
||||
#endif
|
||||
|
||||
/* exported calling convention for C functions */
|
||||
#if !defined(LZO_PUBLIC)
|
||||
# define LZO_PUBLIC(_rettype) \
|
||||
__LZO_EXPORT1 _rettype __LZO_EXPORT2 __LZO_ENTRY
|
||||
#endif
|
||||
#if !defined(LZO_EXTERN)
|
||||
# define LZO_EXTERN(_rettype) __LZO_EXTERN_C LZO_PUBLIC(_rettype)
|
||||
#endif
|
||||
#if !defined(LZO_PRIVATE)
|
||||
# define LZO_PRIVATE(_rettype) static _rettype __LZO_ENTRY
|
||||
#endif
|
||||
|
||||
/* exported __cdecl calling convention for assembler functions */
|
||||
#if !defined(LZO_PUBLIC_CDECL)
|
||||
# define LZO_PUBLIC_CDECL(_rettype) \
|
||||
__LZO_EXPORT1 _rettype __LZO_EXPORT2 __LZO_CDECL
|
||||
#endif
|
||||
#if !defined(LZO_EXTERN_CDECL)
|
||||
# define LZO_EXTERN_CDECL(_rettype) __LZO_EXTERN_C LZO_PUBLIC_CDECL(_rettype)
|
||||
#endif
|
||||
|
||||
/* exported global variables (LZO currently uses no static variables and
|
||||
* is fully thread safe) */
|
||||
#if !defined(LZO_PUBLIC_VAR)
|
||||
# define LZO_PUBLIC_VAR(_type) \
|
||||
__LZO_EXPORT1 _type __LZO_EXPORT2 __LZO_DMODEL
|
||||
#endif
|
||||
#if !defined(LZO_EXTERN_VAR)
|
||||
# define LZO_EXTERN_VAR(_type) extern LZO_PUBLIC_VAR(_type)
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
// error codes and prototypes
|
||||
************************************************************************/
|
||||
|
||||
/* Error codes for the compression/decompression functions. Negative
|
||||
* values are errors, positive values will be used for special but
|
||||
* normal events.
|
||||
*/
|
||||
#define LZO_E_OK 0
|
||||
#define LZO_E_ERROR (-1)
|
||||
#define LZO_E_OUT_OF_MEMORY (-2) /* not used right now */
|
||||
#define LZO_E_NOT_COMPRESSIBLE (-3) /* not used right now */
|
||||
#define LZO_E_INPUT_OVERRUN (-4)
|
||||
#define LZO_E_OUTPUT_OVERRUN (-5)
|
||||
#define LZO_E_LOOKBEHIND_OVERRUN (-6)
|
||||
#define LZO_E_EOF_NOT_FOUND (-7)
|
||||
#define LZO_E_INPUT_NOT_CONSUMED (-8)
|
||||
|
||||
|
||||
/* lzo_init() should be the first function you call.
|
||||
* Check the return code !
|
||||
*
|
||||
* lzo_init() is a macro to allow checking that the library and the
|
||||
* compiler's view of various types are consistent.
|
||||
*/
|
||||
#define lzo_init() __lzo_init2(LZO_VERSION,(int)sizeof(short),(int)sizeof(int),\
|
||||
(int)sizeof(long),(int)sizeof(lzo_uint32),(int)sizeof(lzo_uint),\
|
||||
(int)lzo_sizeof_dict_t,(int)sizeof(char *),(int)sizeof(lzo_voidp),\
|
||||
(int)sizeof(lzo_compress_t))
|
||||
LZO_EXTERN(int) __lzo_init2(unsigned,int,int,int,int,int,int,int,int,int);
|
||||
|
||||
/* version functions (useful for shared libraries) */
|
||||
LZO_EXTERN(unsigned) lzo_version(void);
|
||||
LZO_EXTERN(const char *) lzo_version_string(void);
|
||||
LZO_EXTERN(const char *) lzo_version_date(void);
|
||||
LZO_EXTERN(const lzo_charp) _lzo_version_string(void);
|
||||
LZO_EXTERN(const lzo_charp) _lzo_version_date(void);
|
||||
|
||||
/* string functions */
|
||||
LZO_EXTERN(int)
|
||||
lzo_memcmp(const lzo_voidp _s1, const lzo_voidp _s2, lzo_uint _len);
|
||||
LZO_EXTERN(lzo_voidp)
|
||||
lzo_memcpy(lzo_voidp _dest, const lzo_voidp _src, lzo_uint _len);
|
||||
LZO_EXTERN(lzo_voidp)
|
||||
lzo_memmove(lzo_voidp _dest, const lzo_voidp _src, lzo_uint _len);
|
||||
LZO_EXTERN(lzo_voidp)
|
||||
lzo_memset(lzo_voidp _s, int _c, lzo_uint _len);
|
||||
|
||||
/* checksum functions */
|
||||
LZO_EXTERN(lzo_uint32)
|
||||
lzo_adler32(lzo_uint32 _adler, const lzo_byte *_buf, lzo_uint _len);
|
||||
LZO_EXTERN(lzo_uint32)
|
||||
lzo_crc32(lzo_uint32 _c, const lzo_byte *_buf, lzo_uint _len);
|
||||
|
||||
/* misc. */
|
||||
LZO_EXTERN(lzo_bool) lzo_assert(int _expr);
|
||||
LZO_EXTERN(int) _lzo_config_check(void);
|
||||
typedef union { lzo_bytep p; lzo_uint u; } __lzo_pu_u;
|
||||
typedef union { lzo_bytep p; lzo_uint32 u32; } __lzo_pu32_u;
|
||||
typedef union { void *vp; lzo_bytep bp; lzo_uint32 u32; long l; } lzo_align_t;
|
||||
|
||||
/* align a char pointer on a boundary that is a multiple of `size' */
|
||||
LZO_EXTERN(unsigned) __lzo_align_gap(const lzo_voidp _ptr, lzo_uint _size);
|
||||
#define LZO_PTR_ALIGN_UP(_ptr,_size) \
|
||||
((_ptr) + (lzo_uint) __lzo_align_gap((const lzo_voidp)(_ptr),(lzo_uint)(_size)))
|
||||
|
||||
/* deprecated - only for backward compatibility */
|
||||
#define LZO_ALIGN(_ptr,_size) LZO_PTR_ALIGN_UP(_ptr,_size)
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* already included */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,100 +0,0 @@
|
||||
/* minilzo.h -- mini subset of the LZO real-time data compression library
|
||||
|
||||
This file is part of the LZO real-time data compression library.
|
||||
|
||||
Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
The LZO library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
The LZO library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with the LZO library; see the file COPYING.
|
||||
If not, write to the Free Software Foundation, Inc.,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Markus F.X.J. Oberhumer
|
||||
<markus@oberhumer.com>
|
||||
http://www.oberhumer.com/opensource/lzo/
|
||||
*/
|
||||
|
||||
/*
|
||||
* NOTE:
|
||||
* the full LZO package can be found at
|
||||
* http://www.oberhumer.com/opensource/lzo/
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __MINILZO_H
|
||||
#define __MINILZO_H
|
||||
|
||||
#define MINILZO_VERSION 0x1080
|
||||
|
||||
#ifdef __LZOCONF_H
|
||||
# error "you cannot use both LZO and miniLZO"
|
||||
#endif
|
||||
|
||||
#undef LZO_HAVE_CONFIG_H
|
||||
#include "lzoconf.h"
|
||||
|
||||
#if !defined(LZO_VERSION) || (LZO_VERSION != MINILZO_VERSION)
|
||||
# error "version mismatch in header files"
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
//
|
||||
************************************************************************/
|
||||
|
||||
/* Memory required for the wrkmem parameter.
|
||||
* When the required size is 0, you can also pass a NULL pointer.
|
||||
*/
|
||||
|
||||
#define LZO1X_MEM_COMPRESS LZO1X_1_MEM_COMPRESS
|
||||
#define LZO1X_1_MEM_COMPRESS ((lzo_uint32) (16384L * lzo_sizeof_dict_t))
|
||||
#define LZO1X_MEM_DECOMPRESS (0)
|
||||
|
||||
|
||||
/* compression */
|
||||
LZO_EXTERN(int)
|
||||
lzo1x_1_compress ( const lzo_byte *src, lzo_uint src_len,
|
||||
lzo_byte *dst, lzo_uintp dst_len,
|
||||
lzo_voidp wrkmem );
|
||||
|
||||
/* decompression */
|
||||
LZO_EXTERN(int)
|
||||
lzo1x_decompress ( const lzo_byte *src, lzo_uint src_len,
|
||||
lzo_byte *dst, lzo_uintp dst_len,
|
||||
lzo_voidp wrkmem /* NOT USED */ );
|
||||
|
||||
/* safe decompression with overrun testing */
|
||||
LZO_EXTERN(int)
|
||||
lzo1x_decompress_safe ( const lzo_byte *src, lzo_uint src_len,
|
||||
lzo_byte *dst, lzo_uintp dst_len,
|
||||
lzo_voidp wrkmem /* NOT USED */ );
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* already included */
|
||||
|
@ -34,7 +34,7 @@
|
||||
#include "CFile.h"
|
||||
#include "amxxfile.h"
|
||||
|
||||
CList<CModule> g_modules;
|
||||
CList<CModule,const char*> g_modules;
|
||||
CList<CScript,AMX*> g_loadedscripts;
|
||||
|
||||
CModule *g_CurrentlyCalledModule = NULL; // The module we are in at the moment; NULL otherwise
|
||||
@ -44,7 +44,6 @@ ModuleCallReason g_ModuleCallReason;
|
||||
|
||||
extern const char* no_function; // stupid work around
|
||||
|
||||
|
||||
void report_error( int code, char* fmt, ... )
|
||||
{
|
||||
va_list argptr;
|
||||
@ -88,7 +87,7 @@ void free_amxmemory(void **ptr)
|
||||
*ptr = 0;
|
||||
}
|
||||
|
||||
int load_amxscript(AMX *amx, void **program, const char *filename, char error[64])
|
||||
int load_amxscript(AMX *amx, void **program, const char *filename, char error[64], int debug)
|
||||
{
|
||||
*error = 0;
|
||||
CAmxxReader reader(filename, SMALL_CELL_SIZE / 8);
|
||||
@ -132,6 +131,8 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64
|
||||
case CAmxxReader::Err_Decompress:
|
||||
strcpy(error, "Internal error: Decompress");
|
||||
return (amx->error = AMX_ERR_NOTFOUND);
|
||||
case CAmxxReader::Err_OldFile:
|
||||
strcpy(error, "Plugin uses deprecated format. Update compiler");
|
||||
default:
|
||||
strcpy(error, "Unknown error");
|
||||
return (amx->error = AMX_ERR_NOTFOUND);
|
||||
@ -147,6 +148,13 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64
|
||||
return (amx->error = AMX_ERR_FORMAT);
|
||||
}
|
||||
|
||||
if ( (int)CVAR_GET_FLOAT("amx_debug") >= 2 || debug)
|
||||
{
|
||||
//automatic debug mode
|
||||
hdr->flags |= AMX_FLAG_LINEOPS;
|
||||
hdr->flags |= AMX_FLAG_DEBUG;
|
||||
}
|
||||
|
||||
int err;
|
||||
memset(amx, 0, sizeof(*amx));
|
||||
if ((err = amx_Init( amx, *program )) != AMX_ERR_NONE)
|
||||
@ -155,7 +163,6 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64
|
||||
return (amx->error = AMX_ERR_INIT);
|
||||
}
|
||||
|
||||
|
||||
#ifdef JIT
|
||||
void *np = new char[ amx->code_size ];
|
||||
void *rt = new char[ amx->reloc_size ];
|
||||
@ -205,9 +212,96 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64
|
||||
return set_amxnatives(amx,error);
|
||||
}
|
||||
|
||||
const char *StrCaseStr(const char *as, const char *bs)
|
||||
{
|
||||
static char a[256];
|
||||
static char b[256];
|
||||
unsigned int i = 0;
|
||||
unsigned int len = strlen(as);
|
||||
|
||||
if (len > 254)
|
||||
len = 254;
|
||||
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
a[i] = tolower(as[i]);
|
||||
}
|
||||
a[len] = 0;
|
||||
|
||||
len = strlen(bs);
|
||||
|
||||
if (len > 254)
|
||||
len = 254;
|
||||
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
b[i] = tolower(bs[i]);
|
||||
}
|
||||
b[len] = 0;
|
||||
|
||||
return strstr(a,b);
|
||||
}
|
||||
|
||||
//BAILOPAN
|
||||
int CheckModules(AMX *amx, char error[64])
|
||||
{
|
||||
int idx = 0, flag = -1;
|
||||
if (amx_FindPublic(amx, "plugin_modules", &idx) == AMX_ERR_NONE)
|
||||
{
|
||||
cell retVal = 0;
|
||||
int err = 0;
|
||||
if ( (err = amx_Exec(amx, &retVal, idx, 0)) == AMX_ERR_NONE )
|
||||
{
|
||||
unsigned int i = 0;
|
||||
while (!CurModuleList.empty())
|
||||
{
|
||||
if (!flag)
|
||||
{
|
||||
CurModuleList.pop();
|
||||
continue;
|
||||
}
|
||||
//assume module is not found
|
||||
flag = 0;
|
||||
for (CList<CModule,const char *>::iterator pMod = g_modules.begin(); pMod; ++pMod)
|
||||
{
|
||||
if (strcmpi(CurModuleList.front().c_str(), "dbi") == 0)
|
||||
{
|
||||
if (StrCaseStr( (*pMod).getName(), "sql") || strstr( (*pMod).getName(), "dbi" ))
|
||||
{
|
||||
// the module checks in
|
||||
flag = 1;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (strcmpi( (*pMod).getName(), CurModuleList.front().c_str() ) == 0)
|
||||
{
|
||||
flag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//module was not found
|
||||
if (!flag)
|
||||
{
|
||||
sprintf(error, "Module \"%s\" required for plugin. Check modules.ini.", CurModuleList.front().c_str());
|
||||
}
|
||||
CurModuleList.pop();
|
||||
}
|
||||
} else {
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld during module check.", err, amx->curline);
|
||||
//could not execute
|
||||
return -1; //bad! very bad!
|
||||
}
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return flag;
|
||||
}
|
||||
|
||||
int set_amxnatives(AMX* amx,char error[64])
|
||||
{
|
||||
for ( CList<CModule>::iterator a = g_modules.begin(); a ; ++a )
|
||||
for ( CList<CModule,const char *>::iterator a = g_modules.begin(); a ; ++a )
|
||||
{
|
||||
for( CList<AMX_NATIVE_INFO*>::iterator cc =
|
||||
(*a).m_Natives.begin(); cc; ++cc )
|
||||
@ -224,14 +318,29 @@ int set_amxnatives(AMX* amx,char error[64])
|
||||
|
||||
if ( amx_Register(amx, core_Natives, -1) != AMX_ERR_NONE )
|
||||
{
|
||||
sprintf(error,"Function not found (name \"%s\")",no_function);
|
||||
//HACKHACK - if we get here, nullify the plugin's native table
|
||||
//then reregister the one native we need
|
||||
// - BAILOPAN
|
||||
String save;
|
||||
save.assign(no_function);
|
||||
amx_NullNativeTable(amx);
|
||||
AMX_NATIVE_INFO p[] = {
|
||||
{ "require_module", require_module },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
amx_Register(amx, p, -1);
|
||||
if (CheckModules(amx, error) == -1 || *error == 0)
|
||||
{
|
||||
sprintf(error,"Plugin uses an unknown function (name \"%s\") - check your modules.ini.",save.c_str());
|
||||
}
|
||||
return (amx->error = AMX_ERR_NATIVE);
|
||||
}
|
||||
|
||||
CheckModules(amx, error);
|
||||
|
||||
return AMX_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
int unload_amxscript(AMX* amx, void** program)
|
||||
{
|
||||
CList<CScript,AMX*>::iterator a = g_loadedscripts.find( amx );
|
||||
@ -330,7 +439,7 @@ char* build_pathname_addons(char *fmt, ... )
|
||||
|
||||
int add_amxnatives(module_info_s* info,AMX_NATIVE_INFO*natives)
|
||||
{
|
||||
CList<CModule>::iterator a = g_modules.begin();
|
||||
CList<CModule,const char *>::iterator a = g_modules.begin();
|
||||
|
||||
while ( a )
|
||||
{
|
||||
@ -362,9 +471,109 @@ bool validFile(const char* file)
|
||||
#endif
|
||||
}
|
||||
|
||||
void ConvertModuleName(const char *pathString, String &path)
|
||||
{
|
||||
#if SMALL_CELL_SIZE==64
|
||||
char *ptr = strstr(pathString, "i386");
|
||||
if (ptr)
|
||||
{
|
||||
//attempt to fix the binary name
|
||||
*ptr = 0;
|
||||
path.assign(pathString);
|
||||
path.append("amd64.so");
|
||||
} else {
|
||||
ptr = strstr(pathString, ".dll");
|
||||
if (ptr)
|
||||
{
|
||||
*ptr = 0;
|
||||
path.assign(pathString);
|
||||
path.append("_amd64.so");
|
||||
} else {
|
||||
ptr = strstr(pathString, ".so");
|
||||
if (ptr)
|
||||
{
|
||||
path.assign(pathString);
|
||||
} else {
|
||||
//no extension at all
|
||||
path.assign(pathString);
|
||||
path.append("_amd64.so");
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
#ifdef __linux__
|
||||
char *ptr = strstr(pathString, "amd64");
|
||||
if (ptr)
|
||||
{
|
||||
//attempt to fix the binary name
|
||||
*ptr = 0;
|
||||
path.assign(pathString);
|
||||
path.append("i386.so");
|
||||
} else {
|
||||
ptr = strstr(pathString, ".dll");
|
||||
if (ptr)
|
||||
{
|
||||
*ptr = 0;
|
||||
path.assign(pathString);
|
||||
path.append("_i386.so");
|
||||
} else {
|
||||
//check to see if this file even has an extension
|
||||
ptr = strstr(pathString, ".so");
|
||||
if (ptr)
|
||||
{
|
||||
path.assign(pathString);
|
||||
} else {
|
||||
path.assign(pathString);
|
||||
path.append("_i386.so");
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
char *ptr = strstr(pathString, ".dll");
|
||||
if (ptr)
|
||||
{
|
||||
path.assign(pathString);
|
||||
} else {
|
||||
//prevent this from loading .so too
|
||||
ptr = strstr(pathString, ".so");
|
||||
if (ptr)
|
||||
{
|
||||
int i = 0, len = strlen(pathString), c = -1;
|
||||
for (i=len-1; i>=0; i--)
|
||||
{
|
||||
//cut off at first _
|
||||
if (pathString[i] == '_')
|
||||
{
|
||||
//make sure this is a valid _
|
||||
if (i == len-1 || strncmp(&(pathString[i+1]), "amxx", 4) == 0)
|
||||
break;
|
||||
c = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
*ptr = 0;
|
||||
if (c == -1)
|
||||
{
|
||||
path.assign(pathString);
|
||||
path.append(".dll");
|
||||
} else {
|
||||
ptr = (char *)&(pathString[c]);
|
||||
*ptr = 0;
|
||||
path.assign(pathString);
|
||||
path.append(".dll");
|
||||
}
|
||||
} else {
|
||||
path.assign(pathString);
|
||||
path.append(".dll");
|
||||
}
|
||||
}
|
||||
#endif //__linux__
|
||||
#endif //SMALL_CELL_SIZE==64
|
||||
}
|
||||
|
||||
int loadModules(const char* filename)
|
||||
{
|
||||
File fp( build_pathname("%s",filename), "r" );
|
||||
FILE *fp = fopen(build_pathname("%s",filename), "rt");
|
||||
|
||||
if ( !fp )
|
||||
{
|
||||
@ -372,66 +581,90 @@ int loadModules(const char* filename)
|
||||
return 0;
|
||||
}
|
||||
|
||||
char line[256], moduleName[256];
|
||||
char moduleName[256];
|
||||
char pathString[512];
|
||||
String line;
|
||||
int loaded = 0;
|
||||
|
||||
while ( fp.getline( line , 255 ) )
|
||||
String path;
|
||||
|
||||
while (!feof(fp))
|
||||
{
|
||||
if (!line._fread(fp) || line.size() < 1)
|
||||
continue;
|
||||
line.trim();
|
||||
*moduleName = 0;
|
||||
sscanf(line,"%s",moduleName);
|
||||
if (!isalnum(*moduleName) || !validFile(moduleName) )
|
||||
if (sscanf(line.c_str(),"%s",moduleName) == EOF)
|
||||
continue;
|
||||
if (moduleName[0] == ';')
|
||||
continue;
|
||||
|
||||
char* pathname = build_pathname("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxx/modules"), line);
|
||||
|
||||
CList<CModule>::iterator a = g_modules.find( pathname );
|
||||
char* pathname = build_pathname("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxmodx/modules"), moduleName);
|
||||
strcpy(pathString, pathname);
|
||||
|
||||
path.assign("");
|
||||
|
||||
ConvertModuleName(pathString, path);
|
||||
|
||||
if (!validFile(path.c_str()))
|
||||
continue;
|
||||
|
||||
CList<CModule,const char *>::iterator a = g_modules.find( path.c_str() );
|
||||
|
||||
if ( a ) continue; // already loaded
|
||||
|
||||
CModule* cc = new CModule( pathname );
|
||||
CModule* cc = new CModule( path.c_str() );
|
||||
|
||||
if ( cc == 0 ) return loaded;
|
||||
if ( cc == 0 )
|
||||
{
|
||||
fclose(fp);
|
||||
return loaded;
|
||||
}
|
||||
|
||||
cc->queryModule();
|
||||
|
||||
switch( cc->getStatusValue() ) {
|
||||
case MODULE_BADLOAD:
|
||||
report_error( 1 , "[AMXX] Module is not a valid library (file \"%s\")",pathname );
|
||||
report_error( 1 , "[AMXX] Module is not a valid library (file \"%s\")", path.c_str());
|
||||
break;
|
||||
case MODULE_NOINFO:
|
||||
report_error( 1 ,"[AMXX] Couldn't find info. about module (file \"%s\")",pathname );
|
||||
report_error( 1 ,"[AMXX] Couldn't find info. about module (file \"%s\")", path.c_str());
|
||||
break;
|
||||
case MODULE_NOQUERY:
|
||||
report_error( 1 , "[AMXX] Couldn't find \"AMX_Query\" or \"AMXX_Query\" (file \"%s\")", pathname );
|
||||
report_error( 1 , "[AMXX] Couldn't find \"AMX_Query\" or \"AMXX_Query\" (file \"%s\")", path.c_str());
|
||||
break;
|
||||
case MODULE_NOATTACH:
|
||||
report_error( 1 , "[AMXX] Couldn't find \"%s\" (file \"%s\")", cc->isAmxx() ? "AMXX_Attach" : "AMX_Attach", pathname );
|
||||
report_error( 1 , "[AMXX] Couldn't find \"%s\" (file \"%s\")", cc->isAmxx() ? "AMXX_Attach" : "AMX_Attach", path.c_str());
|
||||
break;
|
||||
case MODULE_OLD:
|
||||
report_error( 1 , "[AMXX] Module has a different interface version (file \"%s\")",pathname );
|
||||
report_error( 1 , "[AMXX] Module has a different interface version (file \"%s\")",path.c_str());
|
||||
break;
|
||||
case MODULE_NEWER:
|
||||
report_error(1, "[AMXX] Module has a newer interface version (file \"%s\"). Please download a new amxmodx.", pathname);
|
||||
report_error(1, "[AMXX] Module has a newer interface version (file \"%s\"). Please download a new amxmodx.", path.c_str());
|
||||
break;
|
||||
case MODULE_INTERROR:
|
||||
report_error(1, "[AMXX] Internal error during module load (file \"%s\")", pathname);
|
||||
report_error(1, "[AMXX] Internal error during module load (file \"%s\")", path.c_str());
|
||||
break;
|
||||
case MODULE_NOT64BIT:
|
||||
report_error(1, "[AMXX] Module \"%s\" is not 64 bit compatible.", pathname);
|
||||
report_error(1, "[AMXX] Module \"%s\" is not 64 bit compatible.", path.c_str());
|
||||
break;
|
||||
default:
|
||||
++loaded;
|
||||
}
|
||||
|
||||
g_modules.put( cc );
|
||||
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return loaded;
|
||||
}
|
||||
|
||||
void detachModules()
|
||||
{
|
||||
CList<CModule>::iterator a = g_modules.begin();
|
||||
CList<CModule,const char *>::iterator a = g_modules.begin();
|
||||
|
||||
while ( a )
|
||||
{
|
||||
@ -442,7 +675,7 @@ void detachModules()
|
||||
|
||||
void detachReloadModules()
|
||||
{
|
||||
CList<CModule>::iterator a = g_modules.begin();
|
||||
CList<CModule,const char *>::iterator a = g_modules.begin();
|
||||
|
||||
while ( a )
|
||||
{
|
||||
@ -460,7 +693,7 @@ void detachReloadModules()
|
||||
|
||||
void attachModules()
|
||||
{
|
||||
CList<CModule>::iterator a = g_modules.begin();
|
||||
CList<CModule,const char *>::iterator a = g_modules.begin();
|
||||
|
||||
while ( a )
|
||||
{
|
||||
@ -512,6 +745,7 @@ void attachMetaModModules(PLUG_LOADTIME now, const char* filename)
|
||||
}
|
||||
|
||||
char line[256], moduleName[256];
|
||||
String modPath, mmPath;
|
||||
DLHANDLE module;
|
||||
|
||||
while ( fp.getline( line , 255 ) )
|
||||
@ -519,12 +753,34 @@ void attachMetaModModules(PLUG_LOADTIME now, const char* filename)
|
||||
*moduleName = 0;
|
||||
sscanf(line,"%s",moduleName);
|
||||
|
||||
if (!isalnum(*moduleName) || !validFile(moduleName) )
|
||||
if (!isalnum(*moduleName))
|
||||
continue;
|
||||
|
||||
char* pathname = build_pathname("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxx/modules"), line);
|
||||
char* mmpathname = build_pathname_addons("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxx/modules"), line);
|
||||
module = DLLOAD( pathname ); // link dll
|
||||
char* pathname = build_pathname("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxmodx/modules"), line);
|
||||
char* mmpathname = build_pathname_addons("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxmodx/modules"), line);
|
||||
|
||||
ConvertModuleName(pathname, modPath);
|
||||
ConvertModuleName(mmpathname, mmPath);
|
||||
|
||||
CList<CFakeMeta::CFakeMetaPlugin>::iterator iter = g_FakeMeta.m_Plugins.begin();
|
||||
|
||||
//prevent double loading
|
||||
int foundFlag = 0;
|
||||
|
||||
while (iter)
|
||||
{
|
||||
if ( strcmp( (*iter).GetPath(), mmPath.c_str() ) == 0 )
|
||||
{
|
||||
foundFlag = 1;
|
||||
break;
|
||||
}
|
||||
++iter;
|
||||
}
|
||||
|
||||
if (foundFlag)
|
||||
continue;
|
||||
|
||||
module = DLLOAD( modPath.c_str() ); // link dll
|
||||
|
||||
if ( module )
|
||||
{
|
||||
@ -533,7 +789,7 @@ void attachMetaModModules(PLUG_LOADTIME now, const char* filename)
|
||||
|
||||
if ( a )
|
||||
{
|
||||
g_FakeMeta.AddPlugin(mmpathname);
|
||||
g_FakeMeta.AddPlugin(mmPath.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -546,7 +802,7 @@ void attachMetaModModules(PLUG_LOADTIME now, const char* filename)
|
||||
// Get the number of running modules
|
||||
int countModules(CountModulesMode mode)
|
||||
{
|
||||
CList<CModule>::iterator iter;
|
||||
CList<CModule,const char *>::iterator iter;
|
||||
int num;
|
||||
switch (mode)
|
||||
{
|
||||
@ -579,7 +835,7 @@ int countModules(CountModulesMode mode)
|
||||
// Call all modules' AMXX_PluginsLoaded functions
|
||||
void modules_callPluginsLoaded()
|
||||
{
|
||||
CList<CModule>::iterator iter = g_modules.begin();
|
||||
CList<CModule,const char *>::iterator iter = g_modules.begin();
|
||||
while (iter)
|
||||
{
|
||||
(*iter).CallPluginsLoaded();
|
||||
@ -591,7 +847,7 @@ void modules_callPluginsLoaded()
|
||||
|
||||
int MNF_AddNatives(AMX_NATIVE_INFO* natives)
|
||||
{
|
||||
CList<CModule>::iterator a = g_modules.begin();
|
||||
CList<CModule,const char *>::iterator a = g_modules.begin();
|
||||
|
||||
if (!g_CurrentlyCalledModule || g_ModuleCallReason != ModuleCall_Attach)
|
||||
return FALSE; // may only be called from attach
|
||||
@ -701,6 +957,14 @@ char *MNF_FormatAmxString(AMX *amx, cell *params, int startParam, int *pLen)
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int MNF_GetPlayerFlags(int id)
|
||||
{
|
||||
if (id < 1 || id > gpGlobals->maxClients)
|
||||
return 0;
|
||||
CPlayer *pPlayer = GET_PLAYER_POINTER_I(id);
|
||||
return (pPlayer->flags[0]);
|
||||
}
|
||||
|
||||
void MNF_CopyAmxMemory(cell * dest, const cell * src, int len)
|
||||
{
|
||||
memcpy((void*)dest, (const void *)src, (size_t)len*sizeof(cell));
|
||||
@ -849,11 +1113,199 @@ void MNF_Log(const char *fmt, ...)
|
||||
AMXXLOG_Log("%s", msg);
|
||||
}
|
||||
|
||||
//by BAILOPAN
|
||||
// generic error printing routine
|
||||
void GenericError(AMX *amx, int err, int line, char buf[], const char *file)
|
||||
{
|
||||
static const char *amx_errs[] =
|
||||
{
|
||||
NULL,
|
||||
"forced exit",
|
||||
"assertion failed",
|
||||
"stack error",
|
||||
"index out of bounds",
|
||||
"memory access",
|
||||
"invalid instruction",
|
||||
"stack low",
|
||||
"heap low",
|
||||
"callback",
|
||||
"native",
|
||||
"divide",
|
||||
"sleep",
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
"out of memory", //16
|
||||
"bad file format",
|
||||
"bad file version",
|
||||
"function not found",
|
||||
"invalid entry point",
|
||||
"debugger cannot run",
|
||||
"plugin un or re-initialized",
|
||||
"userdata table full",
|
||||
"JIT failed to initialize",
|
||||
"parameter error",
|
||||
"domain error",
|
||||
};
|
||||
//does this plugin have line ops?
|
||||
const char *geterr = NULL;
|
||||
if (err > 26 || err < 0)
|
||||
geterr = NULL;
|
||||
else
|
||||
geterr = amx_errs[err];
|
||||
if (!(amx->flags & AMX_FLAG_LINEOPS))
|
||||
{
|
||||
if (geterr == NULL)
|
||||
{
|
||||
sprintf(buf, "Run time error %d (plugin \"%s\" - debug not enabled).", err, g_plugins.findPluginFast(amx)->getName());
|
||||
} else {
|
||||
sprintf(buf, "Run time error %d (%s) (plugin \"%s\") - debug not enabled.", err, geterr, g_plugins.findPluginFast(amx)->getName());
|
||||
}
|
||||
} else {
|
||||
if (geterr == NULL)
|
||||
{
|
||||
sprintf(buf, "Run time error %d on line %d (%s \"%s\").", err, line, (file?"file":"plugin"), (file?file:g_plugins.findPluginFast(amx)->getName()));
|
||||
} else {
|
||||
if (err == AMX_ERR_NATIVE && amx->userdata[2])
|
||||
{
|
||||
geterr = (char *)(amx->userdata[2]);
|
||||
sprintf(buf, "Native error in \"%s\" on line %d (%s \"%s\").", geterr, line, (file?"file":"plugin"), (file?file:g_plugins.findPluginFast(amx)->getName()));
|
||||
} else {
|
||||
sprintf(buf, "Run time error %d (%s) on line %d (%s \"%s\").", err, geterr, line, (file?"file":"plugin"), (file?file:g_plugins.findPluginFast(amx)->getName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//by BAILOPAN
|
||||
// debugger engine front end
|
||||
void LogError(AMX *amx, int err, const char *fmt, ...)
|
||||
{
|
||||
//does this plugin have debug info?
|
||||
va_list arg;
|
||||
AMX_DBG *dbg = (AMX_DBG *)(amx->userdata[0]);
|
||||
static char buf[1024];
|
||||
static char vbuf[1024];
|
||||
*buf = 0;
|
||||
*vbuf = 0;
|
||||
|
||||
va_start(arg, fmt);
|
||||
vsprintf(vbuf, fmt, arg);
|
||||
va_end(arg);
|
||||
|
||||
if (!dbg || !(dbg->tail))
|
||||
{
|
||||
if (dbg && amx->curfile < dbg->numFiles && amx->curfile >= 0)
|
||||
{
|
||||
GenericError(amx, err, amx->curline, buf, dbg->files[amx->curfile]);
|
||||
} else {
|
||||
GenericError(amx, err, amx->curline, buf, NULL);
|
||||
}
|
||||
AMXXLOG_Log("[AMXX] %s", buf);
|
||||
if (*vbuf)
|
||||
{
|
||||
AMXXLOG_Log("%s", vbuf);
|
||||
}
|
||||
if (!dbg)
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] To enable debug mode, add \" debug\" after the plugin name in plugins.ini (without quotes).");
|
||||
}
|
||||
} else {
|
||||
AMX_TRACE *t = dbg->tail;
|
||||
AMX_DEBUGCALL tracer = (AMX_DEBUGCALL)(amx->userdata[1]);
|
||||
//actuall
|
||||
cell line = amx->curline;
|
||||
cell file = amx->curfile;
|
||||
int i = 0;
|
||||
GenericError(amx, err, line, buf, NULL);
|
||||
AMXXLOG_Log("[AMXX] %s", buf);
|
||||
if (*vbuf)
|
||||
{
|
||||
AMXXLOG_Log("%s", vbuf);
|
||||
}
|
||||
AMXXLOG_Log("[AMXX] Debug Trace =>");
|
||||
//log the error right away
|
||||
if (file >= dbg->numFiles || file < 0)
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] [%d] Line %d, File \"%s\"", i++, line, g_plugins.findPluginFast(amx)->getName());
|
||||
} else {
|
||||
AMXXLOG_Log("[AMXX] [%d] Line %d, File \"%s\"", i++, line, dbg->files[file]);
|
||||
}
|
||||
while (t != NULL)
|
||||
{
|
||||
line = t->line;
|
||||
file = t->file;
|
||||
if (file >= dbg->numFiles)
|
||||
{
|
||||
AMXXLOG_Log("[AMXX] [%d] Line %d, File \"%s\"", i++, line, g_plugins.findPluginFast(amx)->getName());
|
||||
} else {
|
||||
AMXXLOG_Log("[AMXX] [%d] Line %d, File \"%s\"", i++, line, dbg->files[file]);
|
||||
}
|
||||
if (tracer)
|
||||
(tracer)(amx, 1); //pop
|
||||
t = dbg->tail;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MNF_MergeDefinitionFile(const char *file)
|
||||
{
|
||||
g_langMngr.MergeDefinitionFile(file);
|
||||
}
|
||||
|
||||
edict_t* MNF_GetPlayerEdict(int id)
|
||||
{
|
||||
if (id < 1 || id > gpGlobals->maxClients)
|
||||
return NULL;
|
||||
return (GET_PLAYER_POINTER_I(id)->pEdict);
|
||||
}
|
||||
|
||||
const char *MNF_Format(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
const char *retVal = g_langMngr.FormatString(fmt, ap);
|
||||
va_end(ap);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
const char *MNF_GetPlayerTeam(int id)
|
||||
{
|
||||
if (id < 1 || id > gpGlobals->maxClients)
|
||||
return NULL;
|
||||
|
||||
return (GET_PLAYER_POINTER_I(id)->team.c_str());
|
||||
}
|
||||
|
||||
#ifndef MEMORY_TEST
|
||||
void *MNF_Allocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, const unsigned int allocationType, const size_t reportedSize)
|
||||
{
|
||||
return malloc(reportedSize);
|
||||
}
|
||||
|
||||
void *MNF_Reallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, const unsigned int reallocationType, const size_t reportedSize, void *reportedAddress)
|
||||
{
|
||||
return realloc(reportedAddress, reportedSize);
|
||||
}
|
||||
|
||||
void MNF_Deallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, const unsigned int deallocationType, void *reportedAddress)
|
||||
{
|
||||
free(reportedAddress);
|
||||
}
|
||||
#endif
|
||||
|
||||
// 09/18/2004 : added these two funcs that default to copyBack=false so we don't break all modules
|
||||
cell MNF_PrepareCellArray(cell *ptr, unsigned int size)
|
||||
{
|
||||
return prepareCellArray(ptr, size, false);
|
||||
}
|
||||
|
||||
cell MNF_PrepareCharArray(char *ptr, unsigned int size)
|
||||
{
|
||||
return prepareCharArray(ptr, size, false);
|
||||
}
|
||||
|
||||
|
||||
// Fnptr Request function for the new interface
|
||||
const char *g_LastRequestedFunc = NULL;
|
||||
#define REGISTER_FUNC(name, func) { name, (void*)func },
|
||||
@ -871,7 +1323,9 @@ void *Module_ReqFnptr(const char *funcName)
|
||||
REGISTER_FUNC("PrintSrvConsole", print_srvconsole)
|
||||
REGISTER_FUNC("GetModname", MNF_GetModname)
|
||||
REGISTER_FUNC("Log", MNF_Log)
|
||||
REGISTER_FUNC("LogError", LogError)
|
||||
REGISTER_FUNC("MergeDefinitionFile", MNF_MergeDefinitionFile)
|
||||
REGISTER_FUNC("Format", MNF_Format)
|
||||
|
||||
// Amx scripts loading / unloading / managing
|
||||
REGISTER_FUNC("GetAmxScript", MNF_GetAmxScript)
|
||||
@ -894,6 +1348,7 @@ void *Module_ReqFnptr(const char *funcName)
|
||||
REGISTER_FUNC("amx_Execv", amx_Execv)
|
||||
REGISTER_FUNC("amx_Allot", amx_Allot)
|
||||
REGISTER_FUNC("amx_FindPublic", amx_FindPublic)
|
||||
REGISTER_FUNC("amx_FindNative", amx_FindNative)
|
||||
|
||||
// Natives / Forwards
|
||||
REGISTER_FUNC("AddNatives", MNF_AddNatives)
|
||||
@ -903,10 +1358,13 @@ void *Module_ReqFnptr(const char *funcName)
|
||||
REGISTER_FUNC("RegisterSPForwardByName", registerSPForwardByName)
|
||||
REGISTER_FUNC("UnregisterSPForward", unregisterSPForward)
|
||||
REGISTER_FUNC("ExecuteForward", executeForwards)
|
||||
REGISTER_FUNC("PrepareCellArray", prepareCellArray)
|
||||
REGISTER_FUNC("PrepareCharArray", prepareCharArray)
|
||||
REGISTER_FUNC("PrepareCellArray", MNF_PrepareCellArray)
|
||||
REGISTER_FUNC("PrepareCharArray", MNF_PrepareCharArray)
|
||||
REGISTER_FUNC("PrepareCellArrayA", prepareCellArray)
|
||||
REGISTER_FUNC("PrepareCharArrayA", prepareCharArray)
|
||||
|
||||
// Player
|
||||
REGISTER_FUNC("GetPlayerFlags", MNF_GetPlayerFlags)
|
||||
REGISTER_FUNC("IsPlayerValid", MNF_IsPlayerValid)
|
||||
REGISTER_FUNC("GetPlayerName", MNF_GetPlayerName)
|
||||
REGISTER_FUNC("GetPlayerIP", MNF_GetPlayerIP)
|
||||
@ -917,6 +1375,7 @@ void *Module_ReqFnptr(const char *funcName)
|
||||
REGISTER_FUNC("GetPlayerPlayTime", MNF_GetPlayerPlayTime)
|
||||
REGISTER_FUNC("GetPlayerCurweapon", MNF_GetPlayerCurweapon)
|
||||
REGISTER_FUNC("GetPlayerTeamID", MNF_GetPlayerTeamID)
|
||||
REGISTER_FUNC("GetPlayerTeam", MNF_GetPlayerTeam)
|
||||
REGISTER_FUNC("GetPlayerDeaths", MNF_GetPlayerDeaths)
|
||||
REGISTER_FUNC("GetPlayerFrags", MNF_GetPlayerFrags)
|
||||
REGISTER_FUNC("GetPlayerMenu", MNF_GetPlayerMenu)
|
||||
@ -926,6 +1385,7 @@ void *Module_ReqFnptr(const char *funcName)
|
||||
REGISTER_FUNC("IsPlayerHLTV", MNF_IsPlayerHLTV)
|
||||
REGISTER_FUNC("GetPlayerArmor", MNF_GetPlayerArmor)
|
||||
REGISTER_FUNC("GetPlayerHealth", MNF_GetPlayerHealth)
|
||||
REGISTER_FUNC("GetPlayerEdict", MNF_GetPlayerEdict)
|
||||
REGISTER_FUNC("CellToReal", MNF_CellToReal)
|
||||
REGISTER_FUNC("RealToCell", MNF_RealToCell)
|
||||
|
||||
@ -933,6 +1393,10 @@ void *Module_ReqFnptr(const char *funcName)
|
||||
REGISTER_FUNC("Allocator", m_allocator)
|
||||
REGISTER_FUNC("Deallocator", m_deallocator)
|
||||
REGISTER_FUNC("Reallocator", m_reallocator)
|
||||
#else
|
||||
REGISTER_FUNC("Allocator", MNF_Allocator)
|
||||
REGISTER_FUNC("Deallocator", MNF_Deallocator)
|
||||
REGISTER_FUNC("Reallocator", MNF_Reallocator)
|
||||
#endif // MEMORY_TEST
|
||||
|
||||
REGISTER_FUNC("Haha_HiddenStuff", MNF_HiddenStuff)
|
||||
|
@ -144,7 +144,7 @@ struct pfnmodule_engine_g {
|
||||
const char* (*pfnget_amxscriptname)(AMX* amx); // amx
|
||||
char* (*pfnget_amxstring)(AMX*,cell,int, int&); // amx, src, buffer (0-3), len
|
||||
void (*pfnget_modname)(char*); // modname
|
||||
int (*pfnload_amxscript)(AMX*, void**, const char*, char[64]); // amx, code, path, error info
|
||||
int (*pfnload_amxscript)(AMX*, void**, const char*, char[64], int); // amx, code, path, error info
|
||||
void (*pfnprint_console)(char*, ...); // format, ....
|
||||
void (*pfnreport_error)(int code, char*, ... );
|
||||
int (*pfnset_amxnatives)(AMX*,char[64]); // amx, error info
|
||||
|
@ -42,8 +42,8 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib"
|
||||
OutputFile="debug/amxx_mm.dll"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
|
||||
OutputFile="debug/amxmodx_mm.dll"
|
||||
Version="0.1"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
@ -112,8 +112,8 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib"
|
||||
OutputFile="release/amxx_mm.dll"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
|
||||
OutputFile="release/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
@ -179,8 +179,8 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib"
|
||||
OutputFile="memtestdebug/amxx_mm.dll"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
|
||||
OutputFile="memtestdebug/amxmodx_mm.dll"
|
||||
Version="0.1"
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="TRUE"
|
||||
@ -249,8 +249,8 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib"
|
||||
OutputFile="memtestrelease/amxx_mm.dll"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
|
||||
OutputFile="memtestrelease/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
@ -316,8 +316,8 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib"
|
||||
OutputFile="jitdebug/amxx_mm.dll"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
|
||||
OutputFile="jitdebug/amxmodx_mm.dll"
|
||||
Version="0.1"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
@ -386,8 +386,8 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib"
|
||||
OutputFile="jitrelease/amxx_mm.dll"
|
||||
AdditionalDependencies="..\jit\jits.obj ..\zlib\zlib.lib"
|
||||
OutputFile="jitrelease/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
@ -454,8 +454,8 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib"
|
||||
OutputFile="jitmemtestrelease/amxx_mm.dll"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
|
||||
OutputFile="jitmemtestrelease/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
@ -525,8 +525,8 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib"
|
||||
OutputFile="MaximalSpeed/amxx_mm.dll"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
|
||||
OutputFile="MaximalSpeed/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
@ -646,9 +646,6 @@
|
||||
<File
|
||||
RelativePath="..\meta_api.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\minilzo\minilzo.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\modules.cpp">
|
||||
</File>
|
||||
|
804
amxmodx/msvc/amxmodx_mm.vcproj
Executable file
804
amxmodx/msvc/amxmodx_mm.vcproj
Executable file
@ -0,0 +1,804 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="amxmodx"
|
||||
ProjectGUID="{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
|
||||
SccProjectName=""
|
||||
SccLocalPath="">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\Debug"
|
||||
IntermediateDirectory=".\Debug"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""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="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
|
||||
OutputFile="debug/amxmodx_mm.dll"
|
||||
Version="0.1"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
ModuleDefinitionFile=""
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\debug/amxx_mm.pdb"
|
||||
ImportLibrary=".\debug/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\debug/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\Release"
|
||||
IntermediateDirectory=".\Release"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GlobalOptimizations="TRUE"
|
||||
InlineFunctionExpansion="1"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\release/amxmodx.pch"
|
||||
AssemblerListingLocation=".\release/"
|
||||
ObjectFile=".\release/"
|
||||
ProgramDataBaseFileName=".\release/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
|
||||
OutputFile="release/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
ModuleDefinitionFile=""
|
||||
ProgramDatabaseFile=".\release/amxx_mm.pdb"
|
||||
ImportLibrary=".\release/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\release/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="MemtestDebug|Win32"
|
||||
OutputDirectory="MemtestDebug"
|
||||
IntermediateDirectory="MemtestDebug"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""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="5"
|
||||
StructMemberAlignment="3"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\memtestdebug/amxmodx.pch"
|
||||
AssemblerListingLocation=".\memtestdebug/"
|
||||
ObjectFile=".\memtestdebug/"
|
||||
ProgramDataBaseFileName=".\memtestdebug/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
|
||||
OutputFile="memtestdebug/amxmodx_mm.dll"
|
||||
Version="0.1"
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
ModuleDefinitionFile=""
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\memtestdebug/amxx_mm.pdb"
|
||||
ImportLibrary=".\memtestdebug/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\debug/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="MemtestRelease|Win32"
|
||||
OutputDirectory="MemtestRelease"
|
||||
IntermediateDirectory="MemtestRelease"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GlobalOptimizations="TRUE"
|
||||
InlineFunctionExpansion="1"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\memtestrelease/amxmodx.pch"
|
||||
AssemblerListingLocation=".\memtestrelease/"
|
||||
ObjectFile=".\memtestrelease/"
|
||||
ProgramDataBaseFileName=".\memtestrelease/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib"
|
||||
OutputFile="memtestrelease/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
ModuleDefinitionFile=""
|
||||
ProgramDatabaseFile=".\memtestrelease/amxx_mm.pdb"
|
||||
ImportLibrary=".\memtestrelease/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\release/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="JITDebug|Win32"
|
||||
OutputDirectory="JITDebug"
|
||||
IntermediateDirectory="JITDebug"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared";"C:\Hry\Half-Life\SDK\Multiplayer Source\dlls";"C:\Hry\Half-Life\SDK\Multiplayer Source\engine";"C:\Hry\Half-Life\SDK\Multiplayer Source\common";C:\Files\Programming\metamod\metamod"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
StructMemberAlignment="3"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\jitdebug/amxmodx.pch"
|
||||
AssemblerListingLocation=".\jitdebug/"
|
||||
ObjectFile=".\jitdebug/"
|
||||
ProgramDataBaseFileName=".\jitdebug/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="..\jit\jits.obj ..\zlib\zlib.lib"
|
||||
OutputFile="jitdebug/amxmodx_mm.dll"
|
||||
Version="0.1"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
ModuleDefinitionFile=""
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
|
||||
ImportLibrary=".\jitdebug/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\debug/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="JITRelease|Win32"
|
||||
OutputDirectory="JITRelease"
|
||||
IntermediateDirectory="JITRelease"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GlobalOptimizations="TRUE"
|
||||
InlineFunctionExpansion="1"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\jitrelease/amxmodx.pch"
|
||||
AssemblerListingLocation=".\jitrelease/"
|
||||
ObjectFile=".\jitrelease/"
|
||||
ProgramDataBaseFileName=".\jitrelease/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="..\jit\jits.obj ..\zlib\zlib.lib"
|
||||
OutputFile="jitrelease/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
ModuleDefinitionFile=""
|
||||
ProgramDatabaseFile=".\jitrelease/amxx_mm.pdb"
|
||||
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\release/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="JITMemtestRelease|Win32"
|
||||
OutputDirectory="JITMemtestRelease"
|
||||
IntermediateDirectory="JITMemtestRelease"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GlobalOptimizations="TRUE"
|
||||
InlineFunctionExpansion="1"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST;JIT"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\jitmemtestrelease/amxmodx.pch"
|
||||
AssemblerListingLocation=".\jitmemtestrelease/"
|
||||
ObjectFile=".\jitmemtestrelease/"
|
||||
ProgramDataBaseFileName=".\jitmemtestrelease/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
|
||||
OutputFile="jitmemtestrelease/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
ModuleDefinitionFile=""
|
||||
ProgramDatabaseFile=".\jitmemtestrelease/amxx_mm.pdb"
|
||||
ImportLibrary=".\jitmemtestrelease/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\release/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="MaximalSpeed|Win32"
|
||||
OutputDirectory="MaximalSpeed"
|
||||
IntermediateDirectory="MaximalSpeed"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GlobalOptimizations="TRUE"
|
||||
InlineFunctionExpansion="1"
|
||||
EnableIntrinsicFunctions="TRUE"
|
||||
FavorSizeOrSpeed="1"
|
||||
OptimizeForProcessor="2"
|
||||
OptimizeForWindowsApplication="TRUE"
|
||||
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="amxmodx.h"
|
||||
PrecompiledHeaderFile=".\MaximalSpeed/amxmodx.pch"
|
||||
AssemblerListingLocation=".\MaximalSpeed/"
|
||||
ObjectFile=".\MaximalSpeed/"
|
||||
ProgramDataBaseFileName=".\MaximalSpeed/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\jit\jits.lib ..\zlib\zlib.lib"
|
||||
OutputFile="MaximalSpeed/amxmodx_mm.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="..\extra\lib_win32"
|
||||
ModuleDefinitionFile=""
|
||||
ProgramDatabaseFile=".\MaximalSpeede/amxx_mm.pdb"
|
||||
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\release/amxmodx.tlb"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="..\amx.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxcore.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxmodx.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxtime.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxxfile.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxxlog.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CCmd.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CEvent.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CFile.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CForward.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CLang.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CLogEvent.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CMenu.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CMisc.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CModule.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CPlugin.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CTask.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CVault.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\emsg.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\fakemeta.cpp">
|
||||
<FileConfiguration
|
||||
Name="MemtestDebug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
GeneratePreprocessedFile="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\file.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\float.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\md5.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\meta_api.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\modules.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\power.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\srvcmd.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\string.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\strptime.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\util.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\vault.cpp">
|
||||
</File>
|
||||
<Filter
|
||||
Name="mmgr"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\mmgr\mmgr.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITDebug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="JITRelease|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MaximalSpeed|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="..\amx.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxmodx.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxxfile.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\amxxlog.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CCmd.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CEvent.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CFile.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CForward.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CLang.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CList.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CLogEvent.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CMenu.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CMisc.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CModule.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CPlugin.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CQueue.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CRList.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CString.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CTask.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CVault.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CVector.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\fakemeta.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\md5.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\modules.h">
|
||||
</File>
|
||||
<Filter
|
||||
Name="mmgr"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\mmgr\mmgr.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\mmgr\nommgr.h">
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc">
|
||||
<File
|
||||
RelativePath="..\version.rc">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
@ -45,6 +45,16 @@
|
||||
enginefuncs_t g_engfuncs;
|
||||
globalvars_t *gpGlobals;
|
||||
|
||||
|
||||
|
||||
DLL_FUNCTIONS *g_pFunctionTable;
|
||||
DLL_FUNCTIONS *g_pFunctionTable_Post;
|
||||
enginefuncs_t *g_pengfuncsTable;
|
||||
enginefuncs_t *g_pengfuncsTable_Post;
|
||||
NEW_DLL_FUNCTIONS *g_pNewFunctionsTable;
|
||||
NEW_DLL_FUNCTIONS *g_pNewFunctionsTable_Post;
|
||||
|
||||
|
||||
// GetEntityAPI2 functions
|
||||
static DLL_FUNCTIONS g_EntityAPI_Table =
|
||||
{
|
||||
@ -2114,6 +2124,7 @@ C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersi
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pFunctionTable, &g_EntityAPI_Table, sizeof(DLL_FUNCTIONS));
|
||||
g_pFunctionTable=pFunctionTable;
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
@ -2131,7 +2142,7 @@ C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interface
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy( pFunctionTable, &g_EntityAPI_Post_Table, sizeof( DLL_FUNCTIONS ) );
|
||||
|
||||
g_pFunctionTable_Post=pFunctionTable;
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
@ -2154,6 +2165,7 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pengfuncsFromEngine, &g_EngineFuncs_Table, sizeof(enginefuncs_t));
|
||||
g_pengfuncsTable=pengfuncsFromEngine;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -2171,6 +2183,7 @@ C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pengfuncsFromEngine, &g_EngineFuncs_Post_Table, sizeof(enginefuncs_t));
|
||||
g_pengfuncsTable_Post=pengfuncsFromEngine;
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
@ -2195,6 +2208,7 @@ C_DLLEXPORT int GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pNewFunctionTable,
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pNewFunctionTable, &g_NewFuncs_Table, sizeof(NEW_DLL_FUNCTIONS));
|
||||
g_pNewFunctionsTable=pNewFunctionTable;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -2212,6 +2226,7 @@ C_DLLEXPORT int GetNewDLLFunctions_Post( NEW_DLL_FUNCTIONS *pNewFunctionTable, i
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pNewFunctionTable, &g_NewFuncs_Post_Table, sizeof(NEW_DLL_FUNCTIONS));
|
||||
g_pNewFunctionsTable_Post=pNewFunctionTable;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -2439,11 +2454,14 @@ PFN_GET_AMXSTRINGLEN g_fn_GetAmxStringLen;
|
||||
PFN_FORMAT_AMXSTRING g_fn_FormatAmxString;
|
||||
PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory;
|
||||
PFN_LOG g_fn_Log;
|
||||
PFN_LOG_ERROR g_fn_LogErrorFunc;
|
||||
PFN_RAISE_AMXERROR g_fn_RaiseAmxError;
|
||||
PFN_REGISTER_FORWARD g_fn_RegisterForward;
|
||||
PFN_EXECUTE_FORWARD g_fn_ExecuteForward;
|
||||
PFN_PREPARE_CELLARRAY g_fn_PrepareCellArray;
|
||||
PFN_PREPARE_CHARARRAY g_fn_PrepareCharArray;
|
||||
PFN_PREPARE_CELLARRAY_A g_fn_PrepareCellArrayA;
|
||||
PFN_PREPARE_CHARARRAY_A g_fn_PrepareCharArrayA;
|
||||
PFN_IS_PLAYER_VALID g_fn_IsPlayerValid;
|
||||
PFN_GET_PLAYER_NAME g_fn_GetPlayerName;
|
||||
PFN_GET_PLAYER_IP g_fn_GetPlayerIP;
|
||||
@ -2453,6 +2471,7 @@ PFN_IS_PLAYER_AUTHORIZED g_fn_IsPlayerAuthorized;
|
||||
PFN_GET_PLAYER_TIME g_fn_GetPlayerTime;
|
||||
PFN_GET_PLAYER_PLAYTIME g_fn_GetPlayerPlayTime;
|
||||
PFN_GET_PLAYER_CURWEAPON g_fn_GetPlayerCurweapon;
|
||||
PFN_GET_PLAYER_TEAM g_fn_GetPlayerTeam;
|
||||
PFN_GET_PLAYER_TEAMID g_fn_GetPlayerTeamID;
|
||||
PFN_GET_PLAYER_DEATHS g_fn_GetPlayerDeaths;
|
||||
PFN_GET_PLAYER_MENU g_fn_GetPlayerMenu;
|
||||
@ -2478,6 +2497,10 @@ PFN_REGISTER_SPFORWARD g_fn_RegisterSPForward;
|
||||
PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName;
|
||||
PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward;
|
||||
PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File;
|
||||
PFN_AMX_FINDNATIVE g_fn_AmxFindNative;
|
||||
PFN_GETPLAYERFLAGS g_fn_GetPlayerFlags;
|
||||
PFN_GET_PLAYER_EDICT g_fn_GetPlayerEdict;
|
||||
PFN_FORMAT g_fn_Format;
|
||||
|
||||
// *** Exports ***
|
||||
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
||||
@ -2521,7 +2544,9 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("PrintSrvConsole", g_fn_PrintSrvConsole, PFN_PRINT_SRVCONSOLE);
|
||||
REQFUNC("GetModname", g_fn_GetModname, PFN_GET_MODNAME);
|
||||
REQFUNC("Log", g_fn_Log, PFN_LOG);
|
||||
REQFUNC("LogError", g_fn_LogErrorFunc, PFN_LOG_ERROR);
|
||||
REQFUNC("MergeDefinitionFile", g_fn_MergeDefinition_File, PFN_MERGEDEFINITION_FILE);
|
||||
REQFUNC("Format", g_fn_Format, PFN_FORMAT);
|
||||
|
||||
// Amx scripts
|
||||
REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT);
|
||||
@ -2529,6 +2554,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("FindAmxScriptByName", g_fn_FindAmxScriptByName, PFN_FIND_AMXSCRIPT_BYNAME);
|
||||
REQFUNC("LoadAmxScript", g_fn_LoadAmxScript, PFN_LOAD_AMXSCRIPT);
|
||||
REQFUNC("UnloadAmxScript", g_fn_UnloadAmxScript, PFN_UNLOAD_AMXSCRIPT);
|
||||
REQFUNC("GetAmxScriptName", g_fn_GetAmxScriptName, PFN_GET_AMXSCRIPTNAME);
|
||||
|
||||
// String / mem in amx scripts support
|
||||
REQFUNC("SetAmxString", g_fn_SetAmxString, PFN_SET_AMXSTRING);
|
||||
@ -2542,6 +2568,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("amx_Execv", g_fn_AmxExecv, PFN_AMX_EXECV);
|
||||
REQFUNC("amx_FindPublic", g_fn_AmxFindPublic, PFN_AMX_FINDPUBLIC);
|
||||
REQFUNC("amx_Allot", g_fn_AmxAllot, PFN_AMX_ALLOT);
|
||||
REQFUNC("amx_FindNative", g_fn_AmxFindNative, PFN_AMX_FINDNATIVE);
|
||||
|
||||
// Natives / Forwards
|
||||
REQFUNC("AddNatives", g_fn_AddNatives, PFN_ADD_NATIVES);
|
||||
@ -2553,7 +2580,8 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("ExecuteForward", g_fn_ExecuteForward, PFN_EXECUTE_FORWARD);
|
||||
REQFUNC("PrepareCellArray", g_fn_PrepareCellArray, PFN_PREPARE_CELLARRAY);
|
||||
REQFUNC("PrepareCharArray", g_fn_PrepareCharArray, PFN_PREPARE_CHARARRAY);
|
||||
|
||||
REQFUNC("PrepareCellArrayA", g_fn_PrepareCellArrayA, PFN_PREPARE_CELLARRAY_A);
|
||||
REQFUNC("PrepareCharArrayA", g_fn_PrepareCharArrayA, PFN_PREPARE_CHARARRAY_A);
|
||||
// Player
|
||||
REQFUNC("IsPlayerValid", g_fn_IsPlayerValid, PFN_IS_PLAYER_VALID);
|
||||
REQFUNC("GetPlayerName", g_fn_GetPlayerName, PFN_GET_PLAYER_NAME);
|
||||
@ -2565,6 +2593,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("GetPlayerPlayTime", g_fn_GetPlayerPlayTime, PFN_GET_PLAYER_PLAYTIME);
|
||||
REQFUNC("GetPlayerCurweapon", g_fn_GetPlayerCurweapon, PFN_GET_PLAYER_CURWEAPON);
|
||||
REQFUNC("GetPlayerTeamID", g_fn_GetPlayerTeamID, PFN_GET_PLAYER_TEAMID);
|
||||
REQFUNC("GetPlayerTeam",g_fn_GetPlayerTeam, PFN_GET_PLAYER_TEAM);
|
||||
REQFUNC("GetPlayerDeaths", g_fn_GetPlayerDeaths, PFN_GET_PLAYER_DEATHS);
|
||||
REQFUNC("GetPlayerMenu", g_fn_GetPlayerMenu, PFN_GET_PLAYER_MENU);
|
||||
REQFUNC("GetPlayerKeys", g_fn_GetPlayerKeys, PFN_GET_PLAYER_KEYS);
|
||||
@ -2574,6 +2603,8 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("IsPlayerHLTV", g_fn_IsPlayerHLTV, PFN_IS_PLAYER_HLTV);
|
||||
REQFUNC("GetPlayerArmor", g_fn_GetPlayerArmor, PFN_GET_PLAYER_ARMOR);
|
||||
REQFUNC("GetPlayerHealth", g_fn_GetPlayerHealth, PFN_GET_PLAYER_HEALTH);
|
||||
REQFUNC("GetPlayerFlags", g_fn_GetPlayerFlags, PFN_GETPLAYERFLAGS);
|
||||
REQFUNC("GetPlayerEdict", g_fn_GetPlayerEdict, PFN_GET_PLAYER_EDICT);
|
||||
|
||||
// Memory
|
||||
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
|
||||
@ -2620,6 +2651,18 @@ void MF_Log(const char *fmt, ...)
|
||||
g_fn_Log("[%s] %s", MODULE_NAME, msg);
|
||||
}
|
||||
|
||||
void MF_LogError(AMX *amx, int err, const char *fmt, ...)
|
||||
{
|
||||
// :TODO: Overflow possible here
|
||||
char msg[3072];
|
||||
va_list arglst;
|
||||
va_start(arglst, fmt);
|
||||
vsprintf(msg, fmt, arglst);
|
||||
va_end(arglst);
|
||||
|
||||
g_fn_LogErrorFunc(amx, err, "[%s] %s", MODULE_NAME, msg);
|
||||
}
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
// validate macros
|
||||
@ -2640,11 +2683,14 @@ void ValidateMacros_DontCallThis_Smiley()
|
||||
MF_GetAmxStringLen(NULL);
|
||||
MF_CopyAmxMemory(NULL, NULL, 0);
|
||||
MF_Log("str", "str", 0);
|
||||
MF_LogError(NULL, 0, NULL);
|
||||
MF_RaiseAmxError(NULL, 0);
|
||||
MF_RegisterForward("str", (ForwardExecType)0, 0, 0, 0);
|
||||
MF_ExecuteForward(0, 0, 0);
|
||||
MF_PrepareCellArray(NULL, 0);
|
||||
MF_PrepareCharArray(NULL, 0);
|
||||
MF_PrepareCellArrayA(NULL, 0, true);
|
||||
MF_PrepareCharArrayA(NULL, 0, true);
|
||||
MF_IsPlayerValid(0);
|
||||
MF_GetPlayerName(0);
|
||||
MF_GetPlayerIP(0);
|
||||
@ -2655,6 +2701,7 @@ void ValidateMacros_DontCallThis_Smiley()
|
||||
MF_GetPlayerPlayTime(0);
|
||||
MF_GetPlayerCurweapon(0);
|
||||
MF_GetPlayerTeamID(0);
|
||||
MF_GetPlayerTeam(0);
|
||||
MF_GetPlayerDeaths(0);
|
||||
MF_GetPlayerMenu(0);
|
||||
MF_GetPlayerKeys(0);
|
||||
@ -2668,11 +2715,14 @@ void ValidateMacros_DontCallThis_Smiley()
|
||||
MF_AmxExecv(0, 0, 0, 0, 0);
|
||||
MF_AmxFindPublic(0, 0, 0);
|
||||
MF_AmxAllot(0, 0, 0, 0);
|
||||
MF_LoadAmxScript(0, 0, 0, 0);
|
||||
MF_LoadAmxScript(0, 0, 0, 0, 0);
|
||||
MF_UnloadAmxScript(0, 0);
|
||||
MF_RegisterSPForward(0, 0, 0, 0, 0, 0);
|
||||
MF_RegisterSPForwardByName(0, 0, 0, 0, 0, 0);
|
||||
MF_UnregisterSPForward(0);
|
||||
MF_GetPlayerFrags(0);
|
||||
MF_GetPlayerEdict(0);
|
||||
MF_Format("", 4, "str");
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -2789,7 +2839,7 @@ void *operator new(size_t reportedSize)
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *operator new[](size_t reportedSize)
|
||||
@ -2802,7 +2852,7 @@ void *operator new[](size_t reportedSize)
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Microsoft memory tracking operators
|
||||
@ -2816,7 +2866,7 @@ void *operator new(size_t reportedSize, const char *sourceFile, int sourceLine)
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine)
|
||||
{
|
||||
@ -2828,7 +2878,7 @@ void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void operator delete(void *reportedAddress)
|
||||
|
@ -55,7 +55,7 @@ struct amxx_module_info_s
|
||||
// The next section is copied from the amx.h file
|
||||
// Copyright (c) ITB CompuPhase, 1997-2004
|
||||
|
||||
#if defined __LCC__ || defined __DMC__ || defined __linux__
|
||||
#if defined __LCC__ || defined __DMC__ || defined __linux__ || defined __GNUC__
|
||||
#include <stdint.h>
|
||||
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
|
||||
/* The ISO C99 defines the int16_t and int_32t types. If the compiler got
|
||||
@ -204,11 +204,9 @@ typedef struct tagAMX {
|
||||
cell reset_stk PACKED;
|
||||
cell reset_hea PACKED;
|
||||
cell sysreq_d PACKED; /* relocated address/value for the SYSREQ.D opcode */
|
||||
#if defined JIT
|
||||
/* support variables for the JIT */
|
||||
int reloc_size PACKED; /* required temporary buffer for relocations */
|
||||
long code_size PACKED; /* estimated memory footprint of the native code */
|
||||
#endif
|
||||
} AMX;
|
||||
|
||||
enum {
|
||||
@ -240,6 +238,14 @@ enum {
|
||||
AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */
|
||||
};
|
||||
|
||||
#if !defined AMX_NO_ALIGN
|
||||
#if defined __linux__
|
||||
#pragma pack() /* reset default packing */
|
||||
#else
|
||||
#pragma pack(pop) /* reset previous packing */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
// ***** declare functions *****
|
||||
|
||||
@ -923,7 +929,7 @@ void FN_EngineFprintf(FILE *pfile, char *szFmt, ...);
|
||||
#endif // FN_EngineFprintf
|
||||
|
||||
#ifdef FN_PvAllocEntPrivateData
|
||||
void *FN_PvAllocEntPrivateData(edict_t *pEdict, long cb);
|
||||
void *FN_PvAllocEntPrivateData(edict_t *pEdict, int32 cb);
|
||||
#endif // FN_PvAllocEntPrivateData
|
||||
|
||||
#ifdef FN_PvEntPrivateData
|
||||
@ -1913,11 +1919,14 @@ typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr);
|
||||
typedef char * (*PFN_FORMAT_AMXSTRING) (AMX * /*amx*/, cell * /*params*/, int /*startParam*/, int * /*pLen*/);
|
||||
typedef void (*PFN_COPY_AMXMEMORY) (cell * /*dest*/, const cell * /*src*/, int /*len*/);
|
||||
typedef void (*PFN_LOG) (const char * /*fmt*/, ...);
|
||||
typedef void (*PFN_LOG_ERROR) (AMX * /*amx*/, int /*err*/, const char * /*fmt*/, ...);
|
||||
typedef int (*PFN_RAISE_AMXERROR) (AMX * /*amx*/, int /*error*/);
|
||||
typedef int (*PFN_REGISTER_FORWARD) (const char * /*funcname*/, ForwardExecType /*exectype*/, ... /*paramtypes terminated by PF_DONE*/);
|
||||
typedef int (*PFN_EXECUTE_FORWARD) (int /*id*/, ... /*params*/);
|
||||
typedef cell (*PFN_PREPARE_CELLARRAY) (cell * /*ptr*/, unsigned int /*size*/);
|
||||
typedef cell (*PFN_PREPARE_CHARARRAY) (char * /*ptr*/, unsigned int /*size*/);
|
||||
typedef cell (*PFN_PREPARE_CELLARRAY_A) (cell * /*ptr*/, unsigned int /*size*/, bool /*copyBack*/);
|
||||
typedef cell (*PFN_PREPARE_CHARARRAY_A) (char * /*ptr*/, unsigned int /*size*/, bool /*copyBack*/);
|
||||
typedef int (*PFN_IS_PLAYER_VALID) (int /*id*/);
|
||||
typedef const char * (*PFN_GET_PLAYER_NAME) (int /*id*/);
|
||||
typedef const char * (*PFN_GET_PLAYER_IP) (int /*id*/);
|
||||
@ -1926,7 +1935,9 @@ typedef int (*PFN_IS_PLAYER_BOT) (int /*id*/);
|
||||
typedef int (*PFN_IS_PLAYER_AUTHORIZED) (int /*id*/);
|
||||
typedef float (*PFN_GET_PLAYER_TIME) (int /*id*/);
|
||||
typedef float (*PFN_GET_PLAYER_PLAYTIME) (int /*id*/);
|
||||
typedef int (*PFN_GETPLAYERFLAGS) (int /* id*/);
|
||||
typedef int (*PFN_GET_PLAYER_CURWEAPON) (int /*id*/);
|
||||
typedef const char * (*PFN_GET_PLAYER_TEAM) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_TEAMID) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_DEATHS) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_MENU) (int /*id*/);
|
||||
@ -1937,6 +1948,12 @@ typedef int (*PFN_IS_PLAYER_CONNECTING) (int /*id*/);
|
||||
typedef int (*PFN_IS_PLAYER_HLTV) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_ARMOR) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_HEALTH) (int /*id*/);
|
||||
#ifdef USE_METAMOD
|
||||
typedef edict_t * (*PFN_GET_PLAYER_EDICT) (int /*id*/);
|
||||
#else
|
||||
typedef void * (*PFN_GET_PLAYER_EDICT) (int /*id*/);
|
||||
#endif
|
||||
|
||||
typedef void * (*PFN_ALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
||||
const unsigned int /*type*/, const size_t /*size*/);
|
||||
typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
||||
@ -1947,7 +1964,8 @@ typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*in
|
||||
typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/);
|
||||
typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/);
|
||||
typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/);
|
||||
typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/);
|
||||
typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/);
|
||||
typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */);
|
||||
typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/);
|
||||
typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/);
|
||||
typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/);
|
||||
@ -1955,6 +1973,7 @@ typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*pa
|
||||
typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/);
|
||||
typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/);
|
||||
typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/);
|
||||
typedef const char * (*PFN_FORMAT) (const char * /*fmt*/, ... /*params*/);
|
||||
|
||||
extern PFN_ADD_NATIVES g_fn_AddNatives;
|
||||
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
||||
@ -1971,11 +1990,14 @@ extern PFN_GET_AMXSTRINGLEN g_fn_GetAmxStringLen;
|
||||
extern PFN_FORMAT_AMXSTRING g_fn_FormatAmxString;
|
||||
extern PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory;
|
||||
extern PFN_LOG g_fn_Log;
|
||||
extern PFN_LOG_ERROR g_fn_LogErrorFunc;
|
||||
extern PFN_RAISE_AMXERROR g_fn_RaiseAmxError;
|
||||
extern PFN_REGISTER_FORWARD g_fn_RegisterForward;
|
||||
extern PFN_EXECUTE_FORWARD g_fn_ExecuteForward;
|
||||
extern PFN_PREPARE_CELLARRAY g_fn_PrepareCellArray;
|
||||
extern PFN_PREPARE_CHARARRAY g_fn_PrepareCharArray;
|
||||
extern PFN_PREPARE_CELLARRAY_A g_fn_PrepareCellArrayA;
|
||||
extern PFN_PREPARE_CHARARRAY_A g_fn_PrepareCharArrayA;
|
||||
extern PFN_IS_PLAYER_VALID g_fn_IsPlayerValid;
|
||||
extern PFN_GET_PLAYER_NAME g_fn_GetPlayerName;
|
||||
extern PFN_GET_PLAYER_IP g_fn_GetPlayerIP;
|
||||
@ -2007,6 +2029,11 @@ extern PFN_REGISTER_SPFORWARD g_fn_RegisterSPForward;
|
||||
extern PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName;
|
||||
extern PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward;
|
||||
extern PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File;
|
||||
extern PFN_AMX_FINDNATIVE g_fn_AmxFindNative;
|
||||
extern PFN_GETPLAYERFLAGS g_fn_GetPlayerFlags;
|
||||
extern PFN_GET_PLAYER_EDICT g_fn_GetPlayerEdict;
|
||||
extern PFN_FORMAT g_fn_Format;
|
||||
extern PFN_GET_PLAYER_TEAM g_fn_GetPlayerTeam;
|
||||
|
||||
#ifdef MAY_NEVER_BE_DEFINED
|
||||
// Function prototypes for intellisense and similar systems
|
||||
@ -2026,11 +2053,14 @@ int MF_GetAmxStringLen (const cell *ptr) { }
|
||||
char * MF_FormatAmxString (AMX * amx, cell * params, int startParam, int * pLen) { }
|
||||
void MF_CopyAmxMemory (cell * dest, const cell * src, int len) { }
|
||||
void MF_Log (const char * fmt, ...) { }
|
||||
void MF_LogError (AMX * amx, int err, const char *fmt, ...) { }
|
||||
int MF_RaiseAmxError (AMX * amx, int error) { }
|
||||
int MF_RegisterForward (const char * funcname, ForwardExecType exectype, ...) { }
|
||||
int MF_ExecuteForward (int id, ...) { }
|
||||
cell MF_PrepareCellArray (cell * ptr, unsigned int size) { }
|
||||
cell MF_PrepareCharArray (char * ptr, unsigned int size) { }
|
||||
cell MF_PrepareCellArrayA (cell * ptr, unsigned int size, bool copyBack) { }
|
||||
cell MF_PrepareCharArrayA (char * ptr, unsigned int size, bool copyBack) { }
|
||||
int MF_IsPlayerValid (int id) { }
|
||||
const char * MF_GetPlayerName (int id) { }
|
||||
const char * MF_GetPlayerIP (int id) { }
|
||||
@ -2040,6 +2070,7 @@ int MF_IsPlayerAuthorized (int id) { }
|
||||
float MF_GetPlayerTime (int id) { }
|
||||
float MF_GetPlayerPlayTime (int id) { }
|
||||
int MF_GetPlayerCurweapon (int id) { }
|
||||
const char * MF_GetPlayerTeam (int id) { }
|
||||
int MF_GetPlayerTeamID (int id) { }
|
||||
int MF_GetPlayerDeaths (int id) { }
|
||||
int MF_GetPlayerMenu (int id) { }
|
||||
@ -2055,6 +2086,9 @@ cell amx_ftoc (float x) { }
|
||||
int MF_RegisterSPForwardByName (AMX * amx, const char *str, ...) { }
|
||||
int MF_RegisterSPForward (AMX * amx, int func, ...) { }
|
||||
void MF_UnregisterSPForward (int id) { }
|
||||
int MF_GetPlayerFlags (int id) { }
|
||||
edict_t* MF_GetPlayerEdict (int id) { }
|
||||
const char * MF_Format (const char *fmt, ...) { }
|
||||
#endif // MAY_NEVER_BE_DEFINED
|
||||
|
||||
#define MF_AddNatives g_fn_AddNatives
|
||||
@ -2072,11 +2106,14 @@ void MF_UnregisterSPForward (int id) { }
|
||||
#define MF_GetAmxStringLen g_fn_GetAmxStringLen
|
||||
#define MF_CopyAmxMemory g_fn_CopyAmxMemory
|
||||
void MF_Log(const char *fmt, ...);
|
||||
void MF_LogError(AMX *amx, int err, const char *fmt, ...);
|
||||
#define MF_RaiseAmxError g_fn_RaiseAmxError
|
||||
#define MF_RegisterForward g_fn_RegisterForward
|
||||
#define MF_ExecuteForward g_fn_ExecuteForward
|
||||
#define MF_PrepareCellArray g_fn_PrepareCellArray
|
||||
#define MF_PrepareCharArray g_fn_PrepareCharArray
|
||||
#define MF_PrepareCellArrayA g_fn_PrepareCellArrayA
|
||||
#define MF_PrepareCharArrayA g_fn_PrepareCharArrayA
|
||||
#define MF_IsPlayerValid g_fn_IsPlayerValid
|
||||
#define MF_GetPlayerName g_fn_GetPlayerName
|
||||
#define MF_GetPlayerIP g_fn_GetPlayerIP
|
||||
@ -2086,6 +2123,7 @@ void MF_Log(const char *fmt, ...);
|
||||
#define MF_GetPlayerTime g_fn_GetPlayerTime
|
||||
#define MF_GetPlayerPlayTime g_fn_GetPlayerPlayTime
|
||||
#define MF_GetPlayerCurweapon g_fn_GetPlayerCurweapon
|
||||
#define MF_GetPlayerTeam g_fn_GetPlayerTeam
|
||||
#define MF_GetPlayerTeamID g_fn_GetPlayerTeamID
|
||||
#define MF_GetPlayerDeaths g_fn_GetPlayerDeaths
|
||||
#define MF_GetPlayerMenu g_fn_GetPlayerMenu
|
||||
@ -2100,13 +2138,18 @@ void MF_Log(const char *fmt, ...);
|
||||
#define MF_AmxExecv g_fn_AmxExecv
|
||||
#define MF_AmxFindPublic g_fn_AmxFindPublic
|
||||
#define MF_AmxAllot g_fn_AmxAllot
|
||||
#define MF_AmxFindNative g_fn_AmxFindNative
|
||||
#define MF_LoadAmxScript g_fn_LoadAmxScript
|
||||
#define MF_UnloadAmxScript g_fn_UnloadAmxScript
|
||||
#define MF_MergeDefinitionFile g_fn_MergeDefinition_File
|
||||
#define amx_ctof g_fn_CellToReal
|
||||
#define amx_ftoc g_fn_RealToCell
|
||||
#define MF_RegisterSPForwardByName g_fn_RegisterSPForwardByName
|
||||
#define MF_RegisterSPForward g_fn_RegisterSPForward
|
||||
#define MF_UnregisterSPForward g_fn_UnregisterSPForward
|
||||
#define MF_GetPlayerFlags g_fn_GetPlayerFlags
|
||||
#define MF_GetPlayerEdict g_fn_GetPlayerEdict
|
||||
#define MF_Format g_fn_Format
|
||||
|
||||
/*** Memory ***/
|
||||
void *operator new(size_t reportedSize);
|
||||
|
@ -62,6 +62,18 @@ void amx_command(){
|
||||
++a;
|
||||
}
|
||||
|
||||
a = g_plugins.begin();
|
||||
|
||||
while (a)
|
||||
{
|
||||
if ( (*a).getStatusCode() == ps_bad_load )
|
||||
{
|
||||
//error
|
||||
print_srvconsole("Load fails: %s\n", (*a).getError());
|
||||
}
|
||||
++a;
|
||||
}
|
||||
|
||||
print_srvconsole( "%d plugins, %d running\n",plugins,running );
|
||||
|
||||
}
|
||||
@ -138,7 +150,15 @@ void amx_command(){
|
||||
print_srvconsole( "%s %s\n", Plugin_info.name, Plugin_info.version);
|
||||
print_srvconsole( "author: %s (%s)\n", Plugin_info.author, Plugin_info.url);
|
||||
print_srvconsole( "compiled: %s\n", __DATE__ ", " __TIME__);
|
||||
|
||||
#ifdef JIT
|
||||
print_srvconsole( "Core mode: JIT\n");
|
||||
#else
|
||||
#ifdef ASM32
|
||||
print_srvconsole( "Core mode: ASM\n");
|
||||
#else
|
||||
print_srvconsole( "Core mode: Normal\n");
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
else if (!strcmp(cmd,"modules"))
|
||||
{
|
||||
@ -149,7 +169,7 @@ void amx_command(){
|
||||
int running = 0;
|
||||
int modules = 0;
|
||||
|
||||
CList<CModule>::iterator a = g_modules.begin();
|
||||
CList<CModule,const char *>::iterator a = g_modules.begin();
|
||||
|
||||
while ( a )
|
||||
{
|
||||
@ -165,8 +185,7 @@ void amx_command(){
|
||||
}
|
||||
|
||||
print_srvconsole( "%d modules, %d correct\n",modules,running);
|
||||
}
|
||||
else if (!strcmp(cmd, "gpl"))
|
||||
} else if (!strcmp(cmd, "gpl"))
|
||||
{
|
||||
print_srvconsole("AMX Mod X\n");
|
||||
print_srvconsole("\n");
|
||||
@ -264,10 +283,9 @@ void plugin_srvcmd()
|
||||
|
||||
if ((err = amx_Exec( (*a).getPlugin()->getAMX(), &ret , (*a).getFunction()
|
||||
, 3 , g_srvindex , (*a).getFlags() , (*a).getId() )) != AMX_ERR_NONE)
|
||||
|
||||
AMXXLOG_Log("[AMXX] Run time error %d on line %ld (plugin \"%s\")",
|
||||
err,(*a).getPlugin()->getAMX()->curline,(*a).getPlugin()->getName());
|
||||
|
||||
{
|
||||
LogError((*a).getPlugin()->getAMX(), err, "");
|
||||
}
|
||||
if ( ret ) break;
|
||||
}
|
||||
|
||||
|
@ -448,6 +448,60 @@ char* format_arguments(AMX *amx, int parm,int& len)
|
||||
return *buffer;
|
||||
}
|
||||
|
||||
//added by BAILOPAN for jtp10181
|
||||
//takes a string and breaks it into a 1st param and rest params
|
||||
//different from strbreak because it's more crafted for control
|
||||
static cell AMX_NATIVE_CALL amx_strtok(AMX *amx, cell *params)
|
||||
{
|
||||
int left_pos = 0;
|
||||
int right_pos = 0;
|
||||
unsigned int i = 0;
|
||||
bool done_flag = false;
|
||||
int len = 0;
|
||||
|
||||
//string[]
|
||||
char *string = get_amxstring(amx, params[1], 0, len);
|
||||
//left[]
|
||||
char *left = new char[len+1];
|
||||
//right[]
|
||||
char *right = new char[len+1];
|
||||
int leftMax = params[3];
|
||||
int rightMax = params[5];
|
||||
//token
|
||||
char token = params[6];
|
||||
//trim
|
||||
int trim = params[7];
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
if (trim && !done_flag)
|
||||
{
|
||||
if (isspace(string[i]))
|
||||
{
|
||||
while (isspace(string[++i]));
|
||||
done_flag = true;
|
||||
}
|
||||
}
|
||||
if (!done_flag && string[i] == token)
|
||||
{
|
||||
done_flag = true;
|
||||
i++;
|
||||
}
|
||||
if (done_flag)
|
||||
{
|
||||
right[right_pos++] = string[i];
|
||||
} else {
|
||||
left[left_pos++] = string[i];
|
||||
}
|
||||
}
|
||||
right[right_pos] = 0;
|
||||
left[left_pos] = 0;
|
||||
set_amxstring(amx, params[2], left, leftMax);
|
||||
set_amxstring(amx, params[4], right, rightMax);
|
||||
delete [] left;
|
||||
delete [] right;
|
||||
return 1;
|
||||
}
|
||||
|
||||
//added by BAILOPAN
|
||||
//Takes a string and breaks it into a 1st param and rest params
|
||||
//strbreak(String[], First[], FirstLen, Rest[], RestLen)
|
||||
@ -467,7 +521,7 @@ static cell AMX_NATIVE_CALL strbreak(AMX *amx, cell *params) /* 5 param */
|
||||
int LeftMax = params[3];
|
||||
int RightMax = params[5];
|
||||
|
||||
for (i=0; i<strlen(string); i++) {
|
||||
for (i=0; i<l; i++) {
|
||||
if (string[i] == '"' && !quote_flag) {
|
||||
quote_flag = true;
|
||||
} else if (string[i] == '"' && quote_flag) {
|
||||
@ -611,5 +665,6 @@ AMX_NATIVE_INFO string_Natives[] = {
|
||||
{ "str_to_num", strtonum },
|
||||
{ "trim", amx_trim },
|
||||
{ "ucfirst", amx_ucfirst },
|
||||
{ "strtok", amx_strtok },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
@ -79,12 +79,15 @@ void UTIL_ShowMenu( edict_t* pEdict, int slots, int time, char *menu, int mlen )
|
||||
/* warning - don't pass here const string */
|
||||
void UTIL_ShowMOTD( edict_t *client , char *motd, int mlen, const char *name)
|
||||
{
|
||||
if (!gmsgServerName)
|
||||
if (!gmsgMOTD)
|
||||
return; // :TODO: Maybe output a warning log?
|
||||
|
||||
if (gmsgServerName)
|
||||
{
|
||||
MESSAGE_BEGIN( MSG_ONE , gmsgServerName, NULL, client );
|
||||
WRITE_STRING(name);
|
||||
MESSAGE_END();
|
||||
}
|
||||
|
||||
char *n = motd;
|
||||
char c = 0;
|
||||
@ -104,9 +107,12 @@ void UTIL_ShowMOTD( edict_t *client , char *motd, int mlen, const char *name)
|
||||
motd = n;
|
||||
}
|
||||
|
||||
if (gmsgServerName)
|
||||
{
|
||||
MESSAGE_BEGIN( MSG_ONE , gmsgServerName, NULL, client );
|
||||
WRITE_STRING( hostname->string );
|
||||
MESSAGE_END();
|
||||
}
|
||||
}
|
||||
|
||||
void UTIL_IntToString(int value, char *output)
|
||||
|
BIN
amxmodx/zlib/libz.a
Executable file
BIN
amxmodx/zlib/libz.a
Executable file
Binary file not shown.
BIN
amxmodx/zlib/libz64.a
Executable file
BIN
amxmodx/zlib/libz64.a
Executable file
Binary file not shown.
323
amxmodx/zlib/zconf.h
Executable file
323
amxmodx/zlib/zconf.h
Executable file
@ -0,0 +1,323 @@
|
||||
/* zconf.h -- configuration of the zlib compression library
|
||||
* Copyright (C) 1995-2003 Jean-loup Gailly.
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#ifndef ZCONF_H
|
||||
#define ZCONF_H
|
||||
|
||||
/*
|
||||
* If you *really* need a unique prefix for all types and library functions,
|
||||
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
|
||||
*/
|
||||
#ifdef Z_PREFIX
|
||||
# define deflateInit_ z_deflateInit_
|
||||
# define deflate z_deflate
|
||||
# define deflateEnd z_deflateEnd
|
||||
# define inflateInit_ z_inflateInit_
|
||||
# define inflate z_inflate
|
||||
# define inflateEnd z_inflateEnd
|
||||
# define deflateInit2_ z_deflateInit2_
|
||||
# define deflateSetDictionary z_deflateSetDictionary
|
||||
# define deflateCopy z_deflateCopy
|
||||
# define deflateReset z_deflateReset
|
||||
# define deflatePrime z_deflatePrime
|
||||
# define deflateParams z_deflateParams
|
||||
# define deflateBound z_deflateBound
|
||||
# define inflateInit2_ z_inflateInit2_
|
||||
# define inflateSetDictionary z_inflateSetDictionary
|
||||
# define inflateSync z_inflateSync
|
||||
# define inflateSyncPoint z_inflateSyncPoint
|
||||
# define inflateCopy z_inflateCopy
|
||||
# define inflateReset z_inflateReset
|
||||
# define compress z_compress
|
||||
# define compress2 z_compress2
|
||||
# define compressBound z_compressBound
|
||||
# define uncompress z_uncompress
|
||||
# define adler32 z_adler32
|
||||
# define crc32 z_crc32
|
||||
# define get_crc_table z_get_crc_table
|
||||
|
||||
# define Byte z_Byte
|
||||
# define uInt z_uInt
|
||||
# define uLong z_uLong
|
||||
# define Bytef z_Bytef
|
||||
# define charf z_charf
|
||||
# define intf z_intf
|
||||
# define uIntf z_uIntf
|
||||
# define uLongf z_uLongf
|
||||
# define voidpf z_voidpf
|
||||
# define voidp z_voidp
|
||||
#endif
|
||||
|
||||
#if defined(__MSDOS__) && !defined(MSDOS)
|
||||
# define MSDOS
|
||||
#endif
|
||||
#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
|
||||
# define OS2
|
||||
#endif
|
||||
#if defined(_WINDOWS) && !defined(WINDOWS)
|
||||
# define WINDOWS
|
||||
#endif
|
||||
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
|
||||
# define WIN32
|
||||
#endif
|
||||
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
|
||||
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
|
||||
# ifndef SYS16BIT
|
||||
# define SYS16BIT
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more
|
||||
* than 64k bytes at a time (needed on systems with 16-bit int).
|
||||
*/
|
||||
#ifdef SYS16BIT
|
||||
# define MAXSEG_64K
|
||||
#endif
|
||||
#ifdef MSDOS
|
||||
# define UNALIGNED_OK
|
||||
#endif
|
||||
|
||||
#ifdef __STDC_VERSION__
|
||||
# ifndef STDC
|
||||
# define STDC
|
||||
# endif
|
||||
# if __STDC_VERSION__ >= 199901L
|
||||
# ifndef STDC99
|
||||
# define STDC99
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
|
||||
# define STDC
|
||||
#endif
|
||||
|
||||
#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
|
||||
# define STDC
|
||||
#endif
|
||||
|
||||
#ifndef STDC
|
||||
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
|
||||
# define const /* note: need a more gentle solution here */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Some Mac compilers merge all .h files incorrectly: */
|
||||
#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
|
||||
# define NO_DUMMY_DECL
|
||||
#endif
|
||||
|
||||
/* Maximum value for memLevel in deflateInit2 */
|
||||
#ifndef MAX_MEM_LEVEL
|
||||
# ifdef MAXSEG_64K
|
||||
# define MAX_MEM_LEVEL 8
|
||||
# else
|
||||
# define MAX_MEM_LEVEL 9
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Maximum value for windowBits in deflateInit2 and inflateInit2.
|
||||
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
|
||||
* created by gzip. (Files created by minigzip can still be extracted by
|
||||
* gzip.)
|
||||
*/
|
||||
#ifndef MAX_WBITS
|
||||
# define MAX_WBITS 15 /* 32K LZ77 window */
|
||||
#endif
|
||||
|
||||
/* The memory requirements for deflate are (in bytes):
|
||||
(1 << (windowBits+2)) + (1 << (memLevel+9))
|
||||
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
|
||||
plus a few kilobytes for small objects. For example, if you want to reduce
|
||||
the default memory requirements from 256K to 128K, compile with
|
||||
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
|
||||
Of course this will generally degrade compression (there's no free lunch).
|
||||
|
||||
The memory requirements for inflate are (in bytes) 1 << windowBits
|
||||
that is, 32K for windowBits=15 (default value) plus a few kilobytes
|
||||
for small objects.
|
||||
*/
|
||||
|
||||
/* Type declarations */
|
||||
|
||||
#ifndef OF /* function prototypes */
|
||||
# ifdef STDC
|
||||
# define OF(args) args
|
||||
# else
|
||||
# define OF(args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* The following definitions for FAR are needed only for MSDOS mixed
|
||||
* model programming (small or medium model with some far allocations).
|
||||
* This was tested only with MSC; for other MSDOS compilers you may have
|
||||
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
|
||||
* just define FAR to be empty.
|
||||
*/
|
||||
#ifdef SYS16BIT
|
||||
# if defined(M_I86SM) || defined(M_I86MM)
|
||||
/* MSC small or medium model */
|
||||
# define SMALL_MEDIUM
|
||||
# ifdef _MSC_VER
|
||||
# define FAR _far
|
||||
# else
|
||||
# define FAR far
|
||||
# endif
|
||||
# endif
|
||||
# if (defined(__SMALL__) || defined(__MEDIUM__))
|
||||
/* Turbo C small or medium model */
|
||||
# define SMALL_MEDIUM
|
||||
# ifdef __BORLANDC__
|
||||
# define FAR _far
|
||||
# else
|
||||
# define FAR far
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(WINDOWS) || defined(WIN32)
|
||||
/* If building or using zlib as a DLL, define ZLIB_DLL.
|
||||
* This is not mandatory, but it offers a little performance increase.
|
||||
*/
|
||||
# ifdef ZLIB_DLL
|
||||
# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
|
||||
# ifdef ZLIB_INTERNAL
|
||||
# define ZEXTERN extern __declspec(dllexport)
|
||||
# else
|
||||
# define ZEXTERN extern __declspec(dllimport)
|
||||
# endif
|
||||
# endif
|
||||
# endif /* ZLIB_DLL */
|
||||
/* If building or using zlib with the WINAPI/WINAPIV calling convention,
|
||||
* define ZLIB_WINAPI.
|
||||
* Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
|
||||
*/
|
||||
# ifdef ZLIB_WINAPI
|
||||
# ifdef FAR
|
||||
# undef FAR
|
||||
# endif
|
||||
# include <windows.h>
|
||||
/* No need for _export, use ZLIB.DEF instead. */
|
||||
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
|
||||
# define ZEXPORT WINAPI
|
||||
# ifdef WIN32
|
||||
# define ZEXPORTVA WINAPIV
|
||||
# else
|
||||
# define ZEXPORTVA FAR CDECL
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined (__BEOS__)
|
||||
# ifdef ZLIB_DLL
|
||||
# ifdef ZLIB_INTERNAL
|
||||
# define ZEXPORT __declspec(dllexport)
|
||||
# define ZEXPORTVA __declspec(dllexport)
|
||||
# else
|
||||
# define ZEXPORT __declspec(dllimport)
|
||||
# define ZEXPORTVA __declspec(dllimport)
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef ZEXTERN
|
||||
# define ZEXTERN extern
|
||||
#endif
|
||||
#ifndef ZEXPORT
|
||||
# define ZEXPORT
|
||||
#endif
|
||||
#ifndef ZEXPORTVA
|
||||
# define ZEXPORTVA
|
||||
#endif
|
||||
|
||||
#ifndef FAR
|
||||
# define FAR
|
||||
#endif
|
||||
|
||||
#if !defined(__MACTYPES__)
|
||||
typedef unsigned char Byte; /* 8 bits */
|
||||
#endif
|
||||
typedef unsigned int uInt; /* 16 bits or more */
|
||||
typedef unsigned long uLong; /* 32 bits or more */
|
||||
|
||||
#ifdef SMALL_MEDIUM
|
||||
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
|
||||
# define Bytef Byte FAR
|
||||
#else
|
||||
typedef Byte FAR Bytef;
|
||||
#endif
|
||||
typedef char FAR charf;
|
||||
typedef int FAR intf;
|
||||
typedef uInt FAR uIntf;
|
||||
typedef uLong FAR uLongf;
|
||||
|
||||
#ifdef STDC
|
||||
typedef void const *voidpc;
|
||||
typedef void FAR *voidpf;
|
||||
typedef void *voidp;
|
||||
#else
|
||||
typedef Byte const *voidpc;
|
||||
typedef Byte FAR *voidpf;
|
||||
typedef Byte *voidp;
|
||||
#endif
|
||||
|
||||
#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
|
||||
# include <sys/types.h> /* for off_t */
|
||||
# include <unistd.h> /* for SEEK_* and off_t */
|
||||
# ifdef VMS
|
||||
# include <unixio.h> /* for off_t */
|
||||
# endif
|
||||
# define z_off_t off_t
|
||||
#endif
|
||||
#ifndef SEEK_SET
|
||||
# define SEEK_SET 0 /* Seek from beginning of file. */
|
||||
# define SEEK_CUR 1 /* Seek from current position. */
|
||||
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
|
||||
#endif
|
||||
#ifndef z_off_t
|
||||
# define z_off_t long
|
||||
#endif
|
||||
|
||||
#if defined(__OS400__)
|
||||
#define NO_vsnprintf
|
||||
#endif
|
||||
|
||||
#if defined(__MVS__)
|
||||
# define NO_vsnprintf
|
||||
# ifdef FAR
|
||||
# undef FAR
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* MVS linker does not support external names larger than 8 bytes */
|
||||
#if defined(__MVS__)
|
||||
# pragma map(deflateInit_,"DEIN")
|
||||
# pragma map(deflateInit2_,"DEIN2")
|
||||
# pragma map(deflateEnd,"DEEND")
|
||||
# pragma map(deflateBound,"DEBND")
|
||||
# pragma map(inflateInit_,"ININ")
|
||||
# pragma map(inflateInit2_,"ININ2")
|
||||
# pragma map(inflateEnd,"INEND")
|
||||
# pragma map(inflateSync,"INSY")
|
||||
# pragma map(inflateSetDictionary,"INSEDI")
|
||||
# pragma map(compressBound,"CMBND")
|
||||
# pragma map(inflate_table,"INTABL")
|
||||
# pragma map(inflate_fast,"INFA")
|
||||
# pragma map(inflate_copyright,"INCOPY")
|
||||
#endif
|
||||
|
||||
#endif /* ZCONF_H */
|
1200
amxmodx/zlib/zlib.h
Executable file
1200
amxmodx/zlib/zlib.h
Executable file
File diff suppressed because it is too large
Load Diff
BIN
amxmodx/zlib/zlib.lib
Executable file
BIN
amxmodx/zlib/zlib.lib
Executable file
Binary file not shown.
176
compiler/scasm/Makefile.pl
Executable file
176
compiler/scasm/Makefile.pl
Executable file
@ -0,0 +1,176 @@
|
||||
#!/usr/bin/perl
|
||||
#(C)2004 AMX Mod X Development Team
|
||||
# by David "BAILOPAN" Anderson
|
||||
|
||||
# output will occur in bin.x.proc
|
||||
# where x is debug or opt and proc is ix86 or amd64
|
||||
# You must use this script from the project src dir
|
||||
|
||||
#options =
|
||||
# debug - enable gdb debugging
|
||||
# amd64 - compile for AMD64
|
||||
# proc=ix86 - assumed not amd64
|
||||
# clean - clean the specifications above
|
||||
|
||||
$PROJECT = "sasm";
|
||||
$gccf = "gcc";
|
||||
|
||||
@CPP_SOURCE_FILES = ("amx_compiler.cpp", "amx_data.cpp", "amx_define.cpp", "amx_error.cpp", "amx_label.cpp", "amx_macro.cpp", "amx_natives.cpp", "amx_proc.cpp", "amx_parser.cpp", "amx_symbol.cpp", "amxasm.cpp", "cexpr.cpp");
|
||||
|
||||
@C_SOURCE_FILES = ();
|
||||
my %OPTIONS, %OPT;
|
||||
|
||||
$OPT{"debug"} = "-g -ggdb";
|
||||
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\"";
|
||||
|
||||
$OPTIONS{"include"} = "";
|
||||
|
||||
while ($cmd = shift)
|
||||
{
|
||||
if ($cmd =~ /amd64/) {
|
||||
$OPTIONS{"amd64"} = 1;
|
||||
} elsif ($cmd =~ /debug/) {
|
||||
$OPTIONS{"debug"} = 1;
|
||||
} elsif ($cmd =~ /proc=i(\d)86/) {
|
||||
$proc = $1;
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
die "You cannot compile for i".$proc."86 and AMD64.\n";
|
||||
} else {
|
||||
$OPTIONS{"proc"} = "i".$proc."86";
|
||||
}
|
||||
} elsif ($cmd =~ /clean/) {
|
||||
$OPTIONS{"clean"} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
$gcc = `$gccf --version`;
|
||||
if ($gcc =~ /2\.9/)
|
||||
{
|
||||
$OPT{"opt"} .= " -malign-loops=2 -malign-jumps=2 -malign-functions=2";
|
||||
} else {
|
||||
$OPT{"opt"} .= " -falign-loops=2 -falign-jumps=2 -falign-functions=2";
|
||||
}
|
||||
|
||||
if ($OPTIONS{"debug"})
|
||||
{
|
||||
$cflags = $OPT{"debug"};
|
||||
} else {
|
||||
if (!$OPTIONS{"amd64"})
|
||||
{
|
||||
$proc = $OPTIONS{"proc"};
|
||||
if (!$proc)
|
||||
{
|
||||
$proc = 3;
|
||||
}
|
||||
$cflags = "-march=i".$proc."86 ".$OPT{"opt"};
|
||||
} else {
|
||||
$cflags = $OPT{"opt"};
|
||||
}
|
||||
}
|
||||
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
$cflags .= " -m64 -DHAVE_I64 -DSMALL_CELL_SIZE=64 $cflags";
|
||||
}
|
||||
|
||||
if ($OPTIONS{"debug"})
|
||||
{
|
||||
$outdir = "bin.debug";
|
||||
} else {
|
||||
$outdir = "bin.opt";
|
||||
}
|
||||
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
$outdir .= ".amd64";
|
||||
$bin = $PROJECT."_amd64.so";
|
||||
} else {
|
||||
$proc = $OPTIONS{"proc"};
|
||||
if ($proc)
|
||||
{
|
||||
$outdir .= ".i".$proc."86";
|
||||
$bin = $PROJECT."_i".$proc."86.so";
|
||||
} else {
|
||||
$outdir .= ".i386";
|
||||
$bin = $PROJECT."_i386.so";
|
||||
}
|
||||
}
|
||||
|
||||
unlink("$outdir/$bin");
|
||||
if ($OPTIONS{"clean"})
|
||||
{
|
||||
`rm $outdir/*.o`;
|
||||
die("Project cleaned.\n");
|
||||
}
|
||||
|
||||
#create the dirs
|
||||
#build link list
|
||||
my @LINK;
|
||||
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
{
|
||||
$file = $CPP_SOURCE_FILES[$i];
|
||||
$file =~ s/\.cpp/\.o/;
|
||||
push(@LINK, $outdir."/".$file);
|
||||
}
|
||||
for ($i=0; $i<=$#C_SOURCE_FILES; $i++)
|
||||
{
|
||||
$file = $C_SOURCE_FILES[$i];
|
||||
$file =~ s/\.c/\.o/;
|
||||
push(@LINK, $outdir."/".$file);
|
||||
}
|
||||
|
||||
if (!(-d $outdir))
|
||||
{
|
||||
mkdir($outdir);
|
||||
}
|
||||
|
||||
$inc = $OPTIONS{"include"};
|
||||
|
||||
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
{
|
||||
$file = $CPP_SOURCE_FILES[$i];
|
||||
$ofile = $file;
|
||||
$ofile =~ s/\.cpp/\.o/;
|
||||
$ofile = "$outdir/$ofile";
|
||||
$gcc = "$gccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
if (-e $ofile)
|
||||
{
|
||||
$file_time = (stat($file))[9];
|
||||
$ofile_time = (stat($ofile))[9];
|
||||
if ($file_time > $ofile_time)
|
||||
{
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
}
|
||||
} else {
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
}
|
||||
}
|
||||
|
||||
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
{
|
||||
$file = $C_SOURCE_FILES[$i];
|
||||
$ofile = $file;
|
||||
$ofile =~ s/\.c/\.o/;
|
||||
$ofile = "$outdir/$ofile";
|
||||
$gcc = "cc $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
if (-e $ofile)
|
||||
{
|
||||
$file_time = (stat($file))[9];
|
||||
$ofile_time = (stat($file))[9];
|
||||
if ($file_time > $ofile_time)
|
||||
{
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
}
|
||||
} else {
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
}
|
||||
}
|
||||
|
||||
$gcc = "$gccf $cflags -shared -lstdc++ -ldl -lm @LINK -o $outdir/$bin";
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
@ -70,3 +70,10 @@ amx_extendmap_step 15
|
||||
|
||||
//If you set this to 0, clients cannot chose their language
|
||||
amx_client_languages 1
|
||||
|
||||
// Plugin Debug mode
|
||||
// 0 - No debugging (garbage line numbers)
|
||||
// 1 - Plugins with "debug" option in plugins.ini are put into debug mode
|
||||
// 2 - All plugins are put in debug mode
|
||||
// Note - debug mode will affect JIT performance
|
||||
amx_debug 1
|
@ -14,4 +14,4 @@
|
||||
"Kick player" "amx_kick #%userid%" "b" "u"
|
||||
"Slay player" "amx_slay #%userid%" "bd" "u"
|
||||
"Slap with 1 dmg." "amx_slap #%userid% 1" "bd" "u"
|
||||
"Ban for 5 minutes" "amx_ban #%userid% id 5" "b" "u"
|
||||
"Ban for 5 minutes" "amx_ban #%userid% 5" "b" "u"
|
||||
|
@ -1,16 +1,16 @@
|
||||
; Configuration file for AMX Mod X
|
||||
amxx_logdir addons/amxx/logs
|
||||
amxx_configsdir addons/amxx/configs
|
||||
amxx_datadir addons/amxx/data
|
||||
amxx_modules addons/amxx/configs/modules.ini
|
||||
amxx_plugins addons/amxx/configs/plugins.ini
|
||||
amxx_pluginsdir addons/amxx/plugins
|
||||
amxx_modulesdir addons/amxx/modules
|
||||
amxx_vault addons/amxx/data/vault.ini
|
||||
amxx_logdir addons/amxmodx/logs
|
||||
amxx_configsdir addons/amxmodx/configs
|
||||
amxx_datadir addons/amxmodx/data
|
||||
amxx_modules addons/amxmodx/configs/modules.ini
|
||||
amxx_plugins addons/amxmodx/configs/plugins.ini
|
||||
amxx_pluginsdir addons/amxmodx/plugins
|
||||
amxx_modulesdir addons/amxmodx/modules
|
||||
amxx_vault addons/amxmodx/data/vault.ini
|
||||
|
||||
; Logging mode
|
||||
; 0 - no logging
|
||||
; 1 - one logfile / day
|
||||
; 2 - one logfile / map
|
||||
; 3 - HL Logs
|
||||
amx_logging 1
|
||||
amxx_logging 1
|
||||
|
@ -86,3 +86,10 @@ amx_statsx_freeze -2.0
|
||||
|
||||
//If you set this to 0, clients cannot chose their language
|
||||
amx_client_languages 1
|
||||
|
||||
// Plugin Debug mode
|
||||
// 0 - No debugging (garbage line numbers)
|
||||
// 1 - Plugins with "debug" option in plugins.ini are put into debug mode
|
||||
// 2 - All plugins are put in debug mode
|
||||
// Note - debug mode will affect JIT performance
|
||||
amx_debug 1
|
@ -1,18 +1,18 @@
|
||||
; Configuration file for AMX Mod X
|
||||
amxx_logdir addons/amxx/logs
|
||||
amxx_configsdir addons/amxx/configs
|
||||
amxx_datadir addons/amxx/data
|
||||
amxx_modules addons/amxx/configs/modules.ini
|
||||
amxx_plugins addons/amxx/configs/plugins.ini
|
||||
amxx_pluginsdir addons/amxx/plugins
|
||||
amxx_modulesdir addons/amxx/modules
|
||||
amxx_vault addons/amxx/data/vault.ini
|
||||
csstats_score addons/amxx/data/csstats.amxx
|
||||
csstats addons/amxx/data/csstats.dat
|
||||
amxx_logdir addons/amxmodx/logs
|
||||
amxx_configsdir addons/amxmodx/configs
|
||||
amxx_datadir addons/amxmodx/data
|
||||
amxx_modules addons/amxmodx/configs/modules.ini
|
||||
amxx_plugins addons/amxmodx/configs/plugins.ini
|
||||
amxx_pluginsdir addons/amxmodx/plugins
|
||||
amxx_modulesdir addons/amxmodx/modules
|
||||
amxx_vault addons/amxmodx/data/vault.ini
|
||||
csstats_score addons/amxmodx/data/csstats.amxx
|
||||
csstats addons/amxmodx/data/csstats.dat
|
||||
|
||||
; Logging mode
|
||||
; 0 - no logging
|
||||
; 1 - one logfile / day
|
||||
; 2 - one logfile / map
|
||||
; 3 - HL Logs
|
||||
amx_logging 1
|
||||
amxx_logging 1
|
||||
|
@ -50,14 +50,20 @@ fun_amxx.dll
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
|
||||
; ----------------------------------------------------------
|
||||
; Counter-Strike - adds functions specific to Counter-Strike
|
||||
; ----------------------------------------------------------
|
||||
;cstrike_amxx_i386.so
|
||||
;cstrike_amxx.dll
|
||||
|
||||
; ------------------------------------------------
|
||||
; CS Stats - adds functionality for CS statistical
|
||||
; ------------------------------------------------
|
||||
;csstats_amxx_i386.so
|
||||
;csstats_amxx.dll
|
||||
; -----------------------------------------------------
|
||||
; CSX - adds functionality for CS statistics and events
|
||||
; -----------------------------------------------------
|
||||
;csx_amxx_i386.so
|
||||
;csx_amxx.dll
|
||||
|
@ -19,7 +19,7 @@ mapsmenu.amxx ; maps menu (vote, changelevel)
|
||||
|
||||
; Chat / Messages
|
||||
adminchat.amxx ; console chat commands
|
||||
;antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
scrollmsg.amxx ; displays a scrolling message
|
||||
imessage.amxx ; displays information messages
|
||||
adminvote.amxx ; vote commands
|
||||
@ -35,9 +35,9 @@ statscfg.amxx ; allows to manage stats plugins via menu and commands
|
||||
|
||||
; Counter-Strike
|
||||
;restmenu.amxx ; restrict weapons menu
|
||||
;statsx.amxx ; stats on death or round end (CSStats Module required!)
|
||||
;statsx.amxx ; stats on death or round end (CSX Module required!)
|
||||
;miscstats.amxx ; bunch of events announcement for Counter-Strike
|
||||
;stats_logging.amxx ; weapons stats logging (CSStats Module required!)
|
||||
;stats_logging.amxx ; weapons stats logging (CSX Module required!)
|
||||
|
||||
|
||||
; Custom - Add 3rd party plugins here
|
||||
|
9
configs/cstrike/stats.ini
Executable file
9
configs/cstrike/stats.ini
Executable file
@ -0,0 +1,9 @@
|
||||
;Generated by Stats Configuration Plugin. Do not modify!
|
||||
;Variable Description
|
||||
ShowAttackers ;Show Attackers
|
||||
ShowVictims ;Show Victims
|
||||
ShowStats ;HUD-stats default
|
||||
SayRankStats ;Say /rankstats
|
||||
SayRank ;Say /rank
|
||||
SayTop15 ;Say /top15
|
||||
ShowStats ;HUD-stats default
|
13
configs/custommenuitems.cfg
Executable file
13
configs/custommenuitems.cfg
Executable file
@ -0,0 +1,13 @@
|
||||
// Here you can add menu items from any plugin to Menus Front-End plugin, aka "amxmodmenu".
|
||||
//
|
||||
// Usage: "amx_addmenuitem <menu text> <menu command> <access flags> <plugin name>"
|
||||
//
|
||||
// <menu text>: This is the text displayed in the menu itself for this item.
|
||||
// <menu command>: This is the client command used to access the menu.
|
||||
// <access flags>: Specify what access flags admins must have to use this menu item. (Check users.ini for access flags.)
|
||||
// <plugin name>: This must be the _exact_ (though case insensitive) name of the plugin which holds the menu command. (Use "amxx plugins" in server console, plugin names are listed in Name column.)
|
||||
//
|
||||
// Example: (be sure to use quotes around parameters with spaces!)
|
||||
//
|
||||
// amx_addmenuitem "Weapon Arena" "weaponarena_menu" "hu" "Weapon Arena"
|
||||
|
@ -1,19 +1,19 @@
|
||||
; Configuration file for AMX Mod X
|
||||
amxx_logdir addons/amxx/logs
|
||||
amxx_configsdir addons/amxx/configs
|
||||
amxx_datadir addons/amxx/data
|
||||
amxx_modules addons/amxx/configs/modules.ini
|
||||
amxx_plugins addons/amxx/configs/plugins.ini
|
||||
amxx_pluginsdir addons/amxx/plugins
|
||||
amxx_modulesdir addons/amxx/modules
|
||||
amxx_vault addons/amxx/data/vault.ini
|
||||
amxx_logdir addons/amxmodx/logs
|
||||
amxx_configsdir addons/amxmodx/configs
|
||||
amxx_datadir addons/amxmodx/data
|
||||
amxx_modules addons/amxmodx/configs/modules.ini
|
||||
amxx_plugins addons/amxmodx/configs/plugins.ini
|
||||
amxx_pluginsdir addons/amxmodx/plugins
|
||||
amxx_modulesdir addons/amxmodx/modules
|
||||
amxx_vault addons/amxmodx/data/vault.ini
|
||||
|
||||
; Logging mode
|
||||
; 0 - no logging
|
||||
; 1 - one logfile / day
|
||||
; 2 - one logfile / map
|
||||
; 3 - HL Logs
|
||||
amx_logging 1
|
||||
amxx_logging 1
|
||||
|
||||
dodstats_score addons/amxx/data/dodstats.amxx
|
||||
dodstats addons/amxx/data/dodstats.dat
|
||||
dodstats_score addons/amxmodx/data/dodstats.amxx
|
||||
dodstats addons/amxmodx/data/dodstats.dat
|
||||
|
@ -10,29 +10,38 @@
|
||||
"pausable" "0" "1" "u"
|
||||
"sv_voiceenable" "0" "1" "u"
|
||||
"mp_chattime" "0" "1" "3" "u"
|
||||
"mp_logmessages" "0" "1" "u"
|
||||
"mp_friendlyfire" "0" "1" "u"
|
||||
"mp_allowspectators" "0" "1" "u"
|
||||
"mp_flashlight" "0" "1" "u"
|
||||
"mp_deathmsg" "0" "1" "u"
|
||||
"mp_fadetoblack" "0" "1" "u"
|
||||
"mp_tkpenalty" "-1" "3" "6" "u"
|
||||
"mp_limitallies30cal" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitalliesbar" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitalliescarbine" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_tkpenalty" "0" "3" "6" "u"
|
||||
"mp_spawnbazookas" "0" "1" "u"
|
||||
"mp_limitalliesgarand" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitalliescarbine" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitalliesthompson" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitalliesgreasegun" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitalliesspring" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitalliesthompson" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxisfg42" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxisfg42s" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxisk43" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitalliesbar" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitallies30cal" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitalliesbazooka" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitalliesmortar" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxiskar" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxismg34" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxismg42" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxisk43" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxismp40" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxismp44" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxisscopedkar" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitbritassault" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxisfg42" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxisfg42s" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxismg34" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxismg42" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_combinemglimits" "0" "1" "u"
|
||||
"mp_limitaxispschreck" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitaxismortar" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitbritlight" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitbritmg" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitbritassault" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitbritsniper" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitbritmg" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitbritpiat" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
"mp_limitbritmortar" "-1" "1" "2" "3" "4" "5" "6" "0" "u"
|
||||
|
||||
|
@ -50,6 +50,12 @@ fun_amxx.dll
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
|
||||
; --------------------------------------------------
|
||||
; Day of Defeat Fun - adds functions specific to DoD
|
||||
; --------------------------------------------------
|
||||
|
@ -19,7 +19,7 @@ mapsmenu.amxx ; maps menu (vote, changelevel)
|
||||
|
||||
; Chat / Messages
|
||||
adminchat.amxx ; console chat commands
|
||||
;antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
scrollmsg.amxx ; displays a scrolling message
|
||||
imessage.amxx ; displays information messages
|
||||
adminvote.amxx ; vote commands
|
||||
|
@ -49,3 +49,9 @@ fun_amxx.dll
|
||||
; --------------------------------
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
@ -68,8 +68,23 @@ amx_extendmap_max 90
|
||||
// Step for each extending
|
||||
amx_extendmap_step 15
|
||||
|
||||
//If you set this to 0, clients cannot chose their language
|
||||
amx_client_languages 1
|
||||
|
||||
// Plugin Debug mode
|
||||
// 0 - No debugging (garbage line numbers)
|
||||
// 1 - Plugins with "debug" option in plugins.ini are put into debug mode
|
||||
// 2 - All plugins are put in debug mode
|
||||
// Note - debug mode will affect JIT performance
|
||||
amx_debug 1
|
||||
|
||||
// Ignore the minimum and maximum settings for maps in the mapcycle
|
||||
amx_mapnum_ignore 0
|
||||
|
||||
//If you set this to 0, clients cannot chose their language
|
||||
amx_client_languages 1
|
||||
// Idle Kicker Settings:
|
||||
amx_idle_time 120 // Time players must be idle to be kicked
|
||||
amx_idle_min_players 8 // Minimum players on the server before kicking starts
|
||||
amx_idle_ignore_immunity 1 // Kick idle admins with immunity?
|
||||
|
||||
// Change this value to alter the frequency (in seconds) players can say /stuck to free themselves.
|
||||
//amx_unstuck_frequency 4
|
||||
|
@ -4,24 +4,26 @@
|
||||
|
||||
; Add in your mod's maps here
|
||||
|
||||
co_angst
|
||||
ns_caged
|
||||
ns_hera
|
||||
ns_metal
|
||||
ns_caged
|
||||
co_sava
|
||||
co_angst
|
||||
ns_hera
|
||||
ns_lost
|
||||
ns_nothing
|
||||
co_faceoff
|
||||
ns_mineshaft
|
||||
co_daimos
|
||||
ns_bast
|
||||
ns_origin
|
||||
co_kestrel
|
||||
ns_tanith
|
||||
co_rebirth
|
||||
ns_nancy
|
||||
ns_veil
|
||||
co_core
|
||||
co_ulysses
|
||||
ns_eclipse
|
||||
co_pulse
|
||||
ns_ayumi
|
||||
ns_agora
|
||||
co_ulysses
|
||||
ns_altair
|
||||
|
@ -5,8 +5,8 @@
|
||||
; ------------------------------
|
||||
; Fun - provides extra functions
|
||||
; ------------------------------
|
||||
fun_amxx_i386.so
|
||||
fun_amxx.dll
|
||||
;fun_amxx_i386.so
|
||||
;fun_amxx.dll
|
||||
|
||||
; ----------------------------------------------------
|
||||
; Engine - provides engine functions core to Half-Life
|
||||
@ -50,8 +50,14 @@ fun_amxx.dll
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
|
||||
; -----------------
|
||||
; Natural Selection
|
||||
; -----------------
|
||||
;ns_amxx_i386.so
|
||||
;ns_amxx.dll
|
||||
ns_amxx_i386.so
|
||||
ns_amxx.dll
|
||||
|
40
configs/ns/plugins.ini
Executable file
40
configs/ns/plugins.ini
Executable file
@ -0,0 +1,40 @@
|
||||
; AMX Mod X plugins
|
||||
|
||||
; Admin Base - Always one has to be activated
|
||||
admin.amxx ; admin base (required for any admin-related)
|
||||
;admin_sql.amxx ; admin base - SQL version (comment admin.amxx)
|
||||
|
||||
; Basic
|
||||
admincmd.amxx ; basic admin console commands
|
||||
adminhelp.amxx ; help command for admin console commands
|
||||
adminslots.amxx ; slot reservation
|
||||
multilingual.amxx ; Multi-Lingual management
|
||||
|
||||
; Menus
|
||||
menufront.amxx ; front-end for admin menus
|
||||
cmdmenu.amxx ; command menu (speech, settings)
|
||||
plmenu.amxx ; players menu (kick, ban, client cmds.)
|
||||
;telemenu.amxx ; teleport menu (Fun Module required!)
|
||||
mapsmenu.amxx ; maps menu (vote, changelevel)
|
||||
|
||||
; Chat / Messages
|
||||
adminchat.amxx ; console chat commands
|
||||
antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
scrollmsg.amxx ; displays a scrolling message
|
||||
imessage.amxx ; displays information messages
|
||||
adminvote.amxx ; vote commands
|
||||
|
||||
; Map related
|
||||
nextmap.amxx ; displays next map in mapcycle
|
||||
mapchooser.amxx ; allows to vote for next map
|
||||
timeleft.amxx ; displays time left on map
|
||||
|
||||
; Configuration
|
||||
pausecfg.amxx ; allows to pause and unpause some plugins
|
||||
|
||||
; NS Specific plugins
|
||||
idlekicker.amxx ; kicks idle players
|
||||
nscommands.amxx ; extra commands for Natural-Selection
|
||||
;unstuck.amxx ; Free stuck players (engine & ns modules required!)
|
||||
|
||||
; Custom - Add 3rd party plugins here
|
49
configs/ns/users.ini
Executable file
49
configs/ns/users.ini
Executable file
@ -0,0 +1,49 @@
|
||||
; Users configuration file
|
||||
; File location: $moddir/addons/amxx/configs/users.ini
|
||||
|
||||
; Line starting with ; is a comment
|
||||
|
||||
; Access flags:
|
||||
; a - immunity (can't be kicked/baned/slayed/slaped and affected by other commmands)
|
||||
; b - reservation (can join on reserved slots)
|
||||
; c - amx_kick command
|
||||
; d - amx_ban and amx_unban commands
|
||||
; e - amx_slay and amx_slap commands
|
||||
; f - amx_map command
|
||||
; g - amx_cvar command (not all cvars will be available)
|
||||
; h - amx_cfg command
|
||||
; i - amx_chat and other chat commands
|
||||
; j - amx_vote and other vote commands
|
||||
; k - access to sv_password cvar (by amx_cvar command)
|
||||
; l - access to amx_rcon command and rcon_password cvar (by amx_cvar command)
|
||||
; m - custom level A (for additional plugins)
|
||||
; n - custom level B
|
||||
; o - custom level C
|
||||
; p - custom level D
|
||||
; q - custom level E
|
||||
; r - custom level F
|
||||
; s - custom level G
|
||||
; t - ns commands (amx_random, amx_readyroom, amx_uncomm, amx_alien, amx_marine)
|
||||
; u - menu access
|
||||
; z - user (no admin)
|
||||
|
||||
; Account flags:
|
||||
; a - disconnect player on invalid password
|
||||
; b - clan tag
|
||||
; c - this is steamid/wonid
|
||||
; d - this is ip
|
||||
; e - password is not checked (only name/ip/steamid needed)
|
||||
|
||||
; Password:
|
||||
; Add to your autoexec.cfg: setinfo _pw "<password>"
|
||||
; Change _pw to the value of amx_password_field
|
||||
|
||||
; Format of admin account:
|
||||
; <name|ip|steamid> <password> <access flags> <account flags>
|
||||
|
||||
; Examples of admin accounts:
|
||||
; "STEAM_0:0:123456" "" "abcdefghijklmnopqrstu" "ce"
|
||||
; "123.45.67.89" "" "abcdefghijklmnopqrstu" "de"
|
||||
; "My Name" "my_password" "abcdefghijklmnopqrstu" "a"
|
||||
|
||||
"loopback" "" "abcdefghijklmnopqrstu" "de"
|
@ -19,7 +19,7 @@ mapsmenu.amxx ; maps menu (vote, changelevel)
|
||||
|
||||
; Chat / Messages
|
||||
adminchat.amxx ; console chat commands
|
||||
;antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
scrollmsg.amxx ; displays a scrolling message
|
||||
imessage.amxx ; displays information messages
|
||||
adminvote.amxx ; vote commands
|
||||
|
@ -1,18 +1,18 @@
|
||||
; Configuration file for AMX Mod X
|
||||
amxx_logdir addons/amxx/logs
|
||||
amxx_configsdir addons/amxx/configs
|
||||
amxx_datadir addons/amxx/data
|
||||
amxx_modules addons/amxx/configs/modules.ini
|
||||
amxx_plugins addons/amxx/configs/plugins.ini
|
||||
amxx_pluginsdir addons/amxx/plugins
|
||||
amxx_modulesdir addons/amxx/modules
|
||||
amxx_vault addons/amxx/data/vault.ini
|
||||
tfcstats_score addons/amxx/data/tfcstats.amxx
|
||||
tfcstats addons/amxx/data/tfcstats.dat
|
||||
amxx_logdir addons/amxmodx/logs
|
||||
amxx_configsdir addons/amxmodx/configs
|
||||
amxx_datadir addons/amxmodx/data
|
||||
amxx_modules addons/amxmodx/configs/modules.ini
|
||||
amxx_plugins addons/amxmodx/configs/plugins.ini
|
||||
amxx_pluginsdir addons/amxmodx/plugins
|
||||
amxx_modulesdir addons/amxmodx/modules
|
||||
amxx_vault addons/amxmodx/data/vault.ini
|
||||
tfcstats_score addons/amxmodx/data/tfcstats.amxx
|
||||
tfcstats addons/amxmodx/data/tfcstats.dat
|
||||
|
||||
; Logging mode
|
||||
; 0 - no logging
|
||||
; 1 - one logfile / day
|
||||
; 2 - one logfile / map
|
||||
; 3 - HL Logs
|
||||
amx_logging 1
|
||||
amxx_logging 1
|
||||
|
@ -50,6 +50,12 @@ fun_amxx.dll
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; Team Fortress Classic X - adds functions and stats specific to TFC
|
||||
; ------------------------------------------------------------------
|
||||
|
@ -19,7 +19,7 @@ mapsmenu.amxx ; maps menu (vote, changelevel)
|
||||
|
||||
; Chat / Messages
|
||||
adminchat.amxx ; console chat commands
|
||||
;antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
scrollmsg.amxx ; displays a scrolling message
|
||||
imessage.amxx ; displays information messages
|
||||
adminvote.amxx ; vote commands
|
||||
|
@ -1,18 +1,18 @@
|
||||
; Configuration file for AMX Mod X
|
||||
amxx_logdir addons/amxx/logs
|
||||
amxx_configsdir addons/amxx/configs
|
||||
amxx_datadir addons/amxx/data
|
||||
amxx_modules addons/amxx/configs/modules.inia
|
||||
mxx_plugins addons/amxx/configs/plugins.ini
|
||||
amxx_pluginsdir addons/amxx/plugins
|
||||
amxx_modulesdir addons/amxx/modules
|
||||
amxx_vault addons/amxx/data/vault.ini
|
||||
tsstats_score addons/amxx/data/tsstats.amxx
|
||||
tsstats addons/amxx/data/tsstats.dat
|
||||
amxx_logdir addons/amxmodx/logs
|
||||
amxx_configsdir addons/amxmodx/configs
|
||||
amxx_datadir addons/amxmodx/data
|
||||
amxx_modules addons/amxmodx/configs/modules.ini
|
||||
amxx_plugins addons/amxmodx/configs/plugins.ini
|
||||
amxx_pluginsdir addons/amxmodx/plugins
|
||||
amxx_modulesdir addons/amxmodx/modules
|
||||
amxx_vault addons/amxmodx/data/vault.ini
|
||||
tsstats_score addons/amxmodx/data/tsstats.amxx
|
||||
tsstats addons/amxmodx/data/tsstats.dat
|
||||
|
||||
; Logging mode
|
||||
; 0 - no logging
|
||||
; 1 - one logfile / day
|
||||
; 2 - one logfile / map
|
||||
; 3 - HL Logs
|
||||
amx_logging 1
|
||||
amxx_logging 1
|
||||
|
@ -50,6 +50,12 @@ fun_amxx.dll
|
||||
;sockets_amxx_i386.so
|
||||
;sockets_amxx.dll
|
||||
|
||||
; --------------------------
|
||||
; Regular Expression support
|
||||
; --------------------------
|
||||
;regex_amxx_i386.so
|
||||
;regex_amxx.dll
|
||||
|
||||
; -----------------------------------------------------------
|
||||
; The Specialists X - adds functions and stats specific to TS
|
||||
; -----------------------------------------------------------
|
||||
|
@ -19,7 +19,7 @@ mapsmenu.amxx ; maps menu (vote, changelevel)
|
||||
|
||||
; Chat / Messages
|
||||
adminchat.amxx ; console chat commands
|
||||
;antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
antiflood.amxx ; prevent clients from chat-flooding the server
|
||||
scrollmsg.amxx ; displays a scrolling message
|
||||
imessage.amxx ; displays information messages
|
||||
adminvote.amxx ; vote commands
|
||||
|
@ -130,7 +130,7 @@ void RankSystem::clear(){
|
||||
|
||||
bool RankSystem::loadCalc(const char* filename, char* error)
|
||||
{
|
||||
if ((MF_LoadAmxScript(&calc.amx,&calc.code,filename,error)!=AMX_ERR_NONE)||
|
||||
if ((MF_LoadAmxScript(&calc.amx,&calc.code,filename,error,0)!=AMX_ERR_NONE)||
|
||||
(MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr1, &calc.physAddr1)!=AMX_ERR_NONE)||
|
||||
(MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr2, &calc.physAddr2)!=AMX_ERR_NONE)||
|
||||
(MF_AmxFindPublic(&calc.amx,"get_score",&calc.func)!=AMX_ERR_NONE)){
|
||||
@ -306,4 +306,3 @@ void RankSystem::saveRank( const char* filename )
|
||||
|
||||
fclose(bfp);
|
||||
}
|
||||
|
||||
|
@ -120,4 +120,3 @@ public:
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
$PROJECT = "csstats_amxx";
|
||||
$sdk = "../../../hlsdk/SourceCode";
|
||||
$mm = "../../../metamod/metamod";
|
||||
$gccf = "gcc";
|
||||
|
||||
@CPP_SOURCE_FILES = ("amxxmodule.cpp", "CMisc.cpp", "usermsg.cpp", "meta_api.cpp", "rank.cpp", "CRank.cpp");
|
||||
|
||||
@ -22,7 +23,7 @@ $mm = "../../../metamod/metamod";
|
||||
my %OPTIONS, %OPT;
|
||||
|
||||
$OPT{"debug"} = "-g -ggdb";
|
||||
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\"";
|
||||
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\" -fno-exceptions -fno-rtti";
|
||||
|
||||
$OPTIONS{"include"} = "-I$sdk -I. -I$mm -I$sdk/engine -I$sdk/common -I$sdk/pm_shared -I$sdk/dlls";
|
||||
|
||||
@ -45,7 +46,7 @@ while ($cmd = shift)
|
||||
}
|
||||
}
|
||||
|
||||
$gcc = `g++ --version`;
|
||||
$gcc = `$gccf --version`;
|
||||
if ($gcc =~ /2\.9/)
|
||||
{
|
||||
$OPT{"opt"} .= " -malign-loops=2 -malign-jumps=2 -malign-functions=2";
|
||||
@ -134,11 +135,11 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
$ofile = $file;
|
||||
$ofile =~ s/\.cpp/\.o/;
|
||||
$ofile = "$outdir/$ofile";
|
||||
$gcc = "g++ $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
$gcc = "$gccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
if (-e $ofile)
|
||||
{
|
||||
$file_time = (stat($file))[9];
|
||||
$ofile_time = (stat($file))[9];
|
||||
$ofile_time = (stat($ofile))[9];
|
||||
if ($file_time > $ofile_time)
|
||||
{
|
||||
print "$gcc\n";
|
||||
@ -160,7 +161,7 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
if (-e $ofile)
|
||||
{
|
||||
$file_time = (stat($file))[9];
|
||||
$ofile_time = (stat($file))[9];
|
||||
$ofile_time = (stat($ofile))[9];
|
||||
if ($file_time > $ofile_time)
|
||||
{
|
||||
print "$gcc\n";
|
||||
@ -172,6 +173,6 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
}
|
||||
}
|
||||
|
||||
$gcc = "g++ $cflags -shared -ldl -lm @LINK -o $outdir/$bin";
|
||||
$gcc = "$gccf $cflags -shared -ldl -lm @LINK -o $outdir/$bin";
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
|
@ -2477,6 +2477,11 @@ PFN_CELL_TO_REAL g_fn_CellToReal;
|
||||
PFN_REGISTER_SPFORWARD g_fn_RegisterSPForward;
|
||||
PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName;
|
||||
PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward;
|
||||
PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File;
|
||||
PFN_AMX_FINDNATIVE g_fn_AmxFindNative;
|
||||
PFN_GETPLAYERFLAGS g_fn_GetPlayerFlags;
|
||||
PFN_GET_PLAYER_EDICT g_fn_GetPlayerEdict;
|
||||
PFN_FORMAT g_fn_Format;
|
||||
|
||||
// *** Exports ***
|
||||
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
||||
@ -2520,6 +2525,8 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("PrintSrvConsole", g_fn_PrintSrvConsole, PFN_PRINT_SRVCONSOLE);
|
||||
REQFUNC("GetModname", g_fn_GetModname, PFN_GET_MODNAME);
|
||||
REQFUNC("Log", g_fn_Log, PFN_LOG);
|
||||
REQFUNC("MergeDefinitionFile", g_fn_MergeDefinition_File, PFN_MERGEDEFINITION_FILE);
|
||||
REQFUNC("Format", g_fn_Format, PFN_FORMAT);
|
||||
|
||||
// Amx scripts
|
||||
REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT);
|
||||
@ -2527,6 +2534,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("FindAmxScriptByName", g_fn_FindAmxScriptByName, PFN_FIND_AMXSCRIPT_BYNAME);
|
||||
REQFUNC("LoadAmxScript", g_fn_LoadAmxScript, PFN_LOAD_AMXSCRIPT);
|
||||
REQFUNC("UnloadAmxScript", g_fn_UnloadAmxScript, PFN_UNLOAD_AMXSCRIPT);
|
||||
REQFUNC("GetAmxScriptName", g_fn_GetAmxScriptName, PFN_GET_AMXSCRIPTNAME);
|
||||
|
||||
// String / mem in amx scripts support
|
||||
REQFUNC("SetAmxString", g_fn_SetAmxString, PFN_SET_AMXSTRING);
|
||||
@ -2540,6 +2548,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("amx_Execv", g_fn_AmxExecv, PFN_AMX_EXECV);
|
||||
REQFUNC("amx_FindPublic", g_fn_AmxFindPublic, PFN_AMX_FINDPUBLIC);
|
||||
REQFUNC("amx_Allot", g_fn_AmxAllot, PFN_AMX_ALLOT);
|
||||
REQFUNC("amx_FindNative", g_fn_AmxFindNative, PFN_AMX_FINDNATIVE);
|
||||
|
||||
// Natives / Forwards
|
||||
REQFUNC("AddNatives", g_fn_AddNatives, PFN_ADD_NATIVES);
|
||||
@ -2572,6 +2581,8 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("IsPlayerHLTV", g_fn_IsPlayerHLTV, PFN_IS_PLAYER_HLTV);
|
||||
REQFUNC("GetPlayerArmor", g_fn_GetPlayerArmor, PFN_GET_PLAYER_ARMOR);
|
||||
REQFUNC("GetPlayerHealth", g_fn_GetPlayerHealth, PFN_GET_PLAYER_HEALTH);
|
||||
REQFUNC("GetPlayerFlags", g_fn_GetPlayerFlags, PFN_GETPLAYERFLAGS);
|
||||
REQFUNC("GetPlayerEdict", g_fn_GetPlayerEdict, PFN_GET_PLAYER_EDICT);
|
||||
|
||||
// Memory
|
||||
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
|
||||
@ -2666,11 +2677,14 @@ void ValidateMacros_DontCallThis_Smiley()
|
||||
MF_AmxExecv(0, 0, 0, 0, 0);
|
||||
MF_AmxFindPublic(0, 0, 0);
|
||||
MF_AmxAllot(0, 0, 0, 0);
|
||||
MF_LoadAmxScript(0, 0, 0, 0);
|
||||
MF_LoadAmxScript(0, 0, 0, 0, 0);
|
||||
MF_UnloadAmxScript(0, 0);
|
||||
MF_RegisterSPForward(0, 0, 0, 0, 0, 0);
|
||||
MF_RegisterSPForwardByName(0, 0, 0, 0, 0, 0);
|
||||
MF_UnregisterSPForward(0);
|
||||
MF_GetPlayerFrags(0);
|
||||
MF_GetPlayerEdict(0);
|
||||
MF_Format("", 4, "str");
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -2787,7 +2801,7 @@ void *operator new(size_t reportedSize)
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *operator new[](size_t reportedSize)
|
||||
@ -2800,7 +2814,7 @@ void *operator new[](size_t reportedSize)
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Microsoft memory tracking operators
|
||||
@ -2814,7 +2828,7 @@ void *operator new(size_t reportedSize, const char *sourceFile, int sourceLine)
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine)
|
||||
{
|
||||
@ -2826,7 +2840,7 @@ void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void operator delete(void *reportedAddress)
|
||||
|
@ -204,11 +204,9 @@ typedef struct tagAMX {
|
||||
cell reset_stk PACKED;
|
||||
cell reset_hea PACKED;
|
||||
cell sysreq_d PACKED; /* relocated address/value for the SYSREQ.D opcode */
|
||||
#if defined JIT
|
||||
/* support variables for the JIT */
|
||||
int reloc_size PACKED; /* required temporary buffer for relocations */
|
||||
long code_size PACKED; /* estimated memory footprint of the native code */
|
||||
#endif
|
||||
} AMX;
|
||||
|
||||
enum {
|
||||
@ -240,6 +238,14 @@ enum {
|
||||
AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */
|
||||
};
|
||||
|
||||
#if !defined AMX_NO_ALIGN
|
||||
#if defined __linux__
|
||||
#pragma pack() /* reset default packing */
|
||||
#else
|
||||
#pragma pack(pop) /* reset previous packing */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
// ***** declare functions *****
|
||||
|
||||
@ -1926,6 +1932,7 @@ typedef int (*PFN_IS_PLAYER_BOT) (int /*id*/);
|
||||
typedef int (*PFN_IS_PLAYER_AUTHORIZED) (int /*id*/);
|
||||
typedef float (*PFN_GET_PLAYER_TIME) (int /*id*/);
|
||||
typedef float (*PFN_GET_PLAYER_PLAYTIME) (int /*id*/);
|
||||
typedef int (*PFN_GETPLAYERFLAGS) (int /* id*/);
|
||||
typedef int (*PFN_GET_PLAYER_CURWEAPON) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_TEAMID) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_DEATHS) (int /*id*/);
|
||||
@ -1937,6 +1944,12 @@ typedef int (*PFN_IS_PLAYER_CONNECTING) (int /*id*/);
|
||||
typedef int (*PFN_IS_PLAYER_HLTV) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_ARMOR) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_HEALTH) (int /*id*/);
|
||||
#ifdef USE_METAMOD
|
||||
typedef edict_t * (*PFN_GET_PLAYER_EDICT) (int /*id*/);
|
||||
#else
|
||||
typedef void * (*PFN_GET_PLAYER_EDICT) (int /*id*/);
|
||||
#endif
|
||||
|
||||
typedef void * (*PFN_ALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
||||
const unsigned int /*type*/, const size_t /*size*/);
|
||||
typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
||||
@ -1947,13 +1960,16 @@ typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*in
|
||||
typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/);
|
||||
typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/);
|
||||
typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/);
|
||||
typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/);
|
||||
typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/);
|
||||
typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */);
|
||||
typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/);
|
||||
typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/);
|
||||
typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/);
|
||||
typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/);
|
||||
typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/);
|
||||
typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/);
|
||||
typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/);
|
||||
typedef const char * (*PFN_FORMAT) (const char * /*fmt*/, ... /*params*/);
|
||||
|
||||
extern PFN_ADD_NATIVES g_fn_AddNatives;
|
||||
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
||||
@ -2005,6 +2021,11 @@ extern PFN_CELL_TO_REAL g_fn_CellToReal;
|
||||
extern PFN_REGISTER_SPFORWARD g_fn_RegisterSPForward;
|
||||
extern PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName;
|
||||
extern PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward;
|
||||
extern PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File;
|
||||
extern PFN_AMX_FINDNATIVE g_fn_AmxFindNative;
|
||||
extern PFN_GETPLAYERFLAGS g_fn_GetPlayerFlags;
|
||||
extern PFN_GET_PLAYER_EDICT g_fn_GetPlayerEdict;
|
||||
extern PFN_FORMAT g_fn_Format;
|
||||
|
||||
#ifdef MAY_NEVER_BE_DEFINED
|
||||
// Function prototypes for intellisense and similar systems
|
||||
@ -2053,6 +2074,9 @@ cell amx_ftoc (float x) { }
|
||||
int MF_RegisterSPForwardByName (AMX * amx, const char *str, ...) { }
|
||||
int MF_RegisterSPForward (AMX * amx, int func, ...) { }
|
||||
void MF_UnregisterSPForward (int id) { }
|
||||
int MF_GetPlayerFlags (int id) { }
|
||||
edict_t* MF_GetPlayerEdict (int id) { }
|
||||
const char * MF_Format (const char *fmt, ...) { }
|
||||
#endif // MAY_NEVER_BE_DEFINED
|
||||
|
||||
#define MF_AddNatives g_fn_AddNatives
|
||||
@ -2098,13 +2122,18 @@ void MF_Log(const char *fmt, ...);
|
||||
#define MF_AmxExecv g_fn_AmxExecv
|
||||
#define MF_AmxFindPublic g_fn_AmxFindPublic
|
||||
#define MF_AmxAllot g_fn_AmxAllot
|
||||
#define MF_AmxFindNative g_fn_AmxFindNative
|
||||
#define MF_LoadAmxScript g_fn_LoadAmxScript
|
||||
#define MF_UnloadAmxScript g_fn_UnloadAmxScript
|
||||
#define MF_MergeDefinitionFile g_fn_MergeDefinition_File
|
||||
#define amx_ctof g_fn_CellToReal
|
||||
#define amx_ftoc g_fn_RealToCell
|
||||
#define MF_RegisterSPForwardByName g_fn_RegisterSPForwardByName
|
||||
#define MF_RegisterSPForward g_fn_RegisterSPForward
|
||||
#define MF_UnregisterSPForward g_fn_UnregisterSPForward
|
||||
#define MF_GetPlayerFlags g_fn_GetPlayerFlags
|
||||
#define MF_GetPlayerEdict g_fn_GetPlayerEdict
|
||||
#define MF_Format g_fn_Format;
|
||||
|
||||
/*** Memory ***/
|
||||
void *operator new(size_t reportedSize);
|
||||
|
@ -26,7 +26,6 @@ bool rankBots;
|
||||
int gmsgCurWeapon;
|
||||
int gmsgDeathMsg;
|
||||
int gmsgDamage;
|
||||
int gmsgDamageEnd;
|
||||
int gmsgWeaponList;
|
||||
int gmsgResetHUD;
|
||||
int gmsgAmmoX;
|
||||
@ -57,7 +56,6 @@ struct sUserMsg {
|
||||
} g_user_msg[] = {
|
||||
{ "CurWeapon" , &gmsgCurWeapon , Client_CurWeapon, false },
|
||||
{ "Damage" , &gmsgDamage,Client_Damage, false },
|
||||
{ "Damage" , &gmsgDamageEnd, Client_Damage_End, true },
|
||||
{ "WeaponList" , &gmsgWeaponList, Client_WeaponList, false },
|
||||
{ "ResetHUD" , &gmsgResetHUD,Client_ResetHUD, true },
|
||||
{ "AmmoX" , &gmsgAmmoX, Client_AmmoX , false },
|
||||
@ -289,7 +287,7 @@ void OnMetaAttach() {
|
||||
|
||||
void OnAmxxAttach(){
|
||||
MF_AddNatives(stats_Natives);
|
||||
const char* path = get_localinfo("csstats_score","addons/amxx/data/csstats.amxx");
|
||||
const char* path = get_localinfo("csstats_score");
|
||||
if ( path && *path )
|
||||
{
|
||||
char error[128];
|
||||
@ -299,7 +297,7 @@ void OnAmxxAttach(){
|
||||
if ( !g_rank.begin() )
|
||||
{
|
||||
g_rank.loadRank( MF_BuildPathname("%s",
|
||||
get_localinfo("csstats","addons/amxx/data/csstats.dat") ) );
|
||||
get_localinfo("csstats") ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
#define __MODULECONFIG_H__
|
||||
|
||||
// Module info
|
||||
#define MODULE_NAME "CS Stats"
|
||||
#define MODULE_NAME "CSStats"
|
||||
#define MODULE_VERSION "0.20"
|
||||
#define MODULE_AUTHOR "AMX Mod X Dev Team"
|
||||
#define MODULE_URL "http://www.amxmodx.org"
|
||||
|
@ -52,7 +52,6 @@ extern int mPlayerIndex;
|
||||
extern int mState;
|
||||
|
||||
extern int gmsgCurWeapon;
|
||||
extern int gmsgDamageEnd;
|
||||
extern int gmsgDamage;
|
||||
extern int gmsgWeaponList;
|
||||
extern int gmsgResetHUD;
|
||||
@ -69,7 +68,6 @@ void Client_CurWeapon(void*);
|
||||
void Client_Damage(void*);
|
||||
void Client_WeaponList(void*);
|
||||
void Client_AmmoPickup(void*);
|
||||
void Client_Damage_End(void*);
|
||||
void Client_ScoreInfo(void*);
|
||||
void Client_ResetHUD(void*);
|
||||
|
||||
|
@ -5,12 +5,6 @@
|
||||
|
||||
weaponsVault weaponData[MAX_WEAPONS];
|
||||
|
||||
int damage;
|
||||
int TK;
|
||||
int weapon;
|
||||
int aim;
|
||||
CPlayer *pAttacker;
|
||||
|
||||
int g_Planter;
|
||||
int g_Defuser;
|
||||
|
||||
@ -52,6 +46,13 @@ void Client_WeaponList(void* mValue){
|
||||
|
||||
void Client_Damage(void* mValue){
|
||||
static int bits;
|
||||
static int damage;
|
||||
static int TK;
|
||||
static int weapon;
|
||||
static int aim;
|
||||
static bool ignore;
|
||||
static CPlayer *pAttacker;
|
||||
|
||||
switch (mState++) {
|
||||
case 1:
|
||||
damage = *(int*)mValue;
|
||||
@ -60,7 +61,7 @@ void Client_Damage(void* mValue){
|
||||
bits = *(int*)mValue;
|
||||
break;
|
||||
case 3:
|
||||
if (!mPlayer || !damage || !*(float*)mValue || bits) break;
|
||||
if ( ignore = (!mPlayer || !damage || !*(float*)mValue || bits) ) break;
|
||||
edict_t *enemy;
|
||||
enemy = mPlayer->pEdict->v.dmg_inflictor;
|
||||
|
||||
@ -79,19 +80,19 @@ void Client_Damage(void* mValue){
|
||||
}
|
||||
if( g_grenades.find(enemy , &pAttacker , &weapon ) )
|
||||
pAttacker->saveHit( mPlayer , weapon , damage, aim );
|
||||
}
|
||||
}
|
||||
|
||||
void Client_Damage_End(void* mValue){
|
||||
if ( !mPlayer || !damage || mPlayer->IsAlive() )
|
||||
return;
|
||||
|
||||
break;
|
||||
case 4:
|
||||
if ( ignore || mPlayer->IsAlive() )
|
||||
break;
|
||||
if ( !pAttacker )
|
||||
pAttacker = mPlayer;
|
||||
TK = 0;
|
||||
if ( (mPlayer->teamId == pAttacker->teamId) && (mPlayer != pAttacker) )
|
||||
TK = 1;
|
||||
pAttacker->saveKill(mPlayer,weapon,( aim == 1 ) ? 1:0 ,TK);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Client_CurWeapon(void* mValue){
|
||||
|
@ -15,6 +15,7 @@
|
||||
$PROJECT = "cstrike_amxx";
|
||||
$sdk = "../hlsdk/SourceCode";
|
||||
$mm = "../metamod/metamod";
|
||||
$gccf = "gcc";
|
||||
|
||||
@CPP_SOURCE_FILES = ("CstrikePlayer.cpp", "cstrike.cpp", "amxxmodule.cpp");
|
||||
|
||||
@ -22,7 +23,7 @@ $mm = "../metamod/metamod";
|
||||
my %OPTIONS, %OPT;
|
||||
|
||||
$OPT{"debug"} = "-g -ggdb";
|
||||
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\"";
|
||||
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\" -fno-exceptions -fno-rtti";
|
||||
|
||||
$OPTIONS{"include"} = "-I$sdk -I. -I$mm -I$sdk/engine -I$sdk/common -I$sdk/pm_shared -I$sdk/dlls";
|
||||
|
||||
@ -45,7 +46,7 @@ while ($cmd = shift)
|
||||
}
|
||||
}
|
||||
|
||||
$gcc = `g++ --version`;
|
||||
$gcc = `$gccf --version`;
|
||||
if ($gcc =~ /2\.9/)
|
||||
{
|
||||
$OPT{"opt"} .= " -malign-loops=2 -malign-jumps=2 -malign-functions=2";
|
||||
@ -72,7 +73,7 @@ if ($OPTIONS{"debug"})
|
||||
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
$cflags .= "-m64 -DSMALL_CELLSIZE=64 $cflags";
|
||||
$cflags = " -m64 -DSMALL_CELL_SIZE=64 $cflags";
|
||||
}
|
||||
|
||||
if ($OPTIONS{"debug"})
|
||||
@ -134,11 +135,11 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
$ofile = $file;
|
||||
$ofile =~ s/\.cpp/\.o/;
|
||||
$ofile = "$outdir/$ofile";
|
||||
$gcc = "g++ $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
$gcc = "$gccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
if (-e $ofile)
|
||||
{
|
||||
$file_time = (stat($file))[9];
|
||||
$ofile_time = (stat($file))[9];
|
||||
$ofile_time = (stat($ofile))[9];
|
||||
if ($file_time > $ofile_time)
|
||||
{
|
||||
print "$gcc\n";
|
||||
@ -160,7 +161,7 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
if (-e $ofile)
|
||||
{
|
||||
$file_time = (stat($file))[9];
|
||||
$ofile_time = (stat($file))[9];
|
||||
$ofile_time = (stat($ofile))[9];
|
||||
if ($file_time > $ofile_time)
|
||||
{
|
||||
print "$gcc\n";
|
||||
@ -172,5 +173,6 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
}
|
||||
}
|
||||
|
||||
$gcc = "g++ $cflags -shared -ldl -lm @LINK -o $outdir/$bin";
|
||||
$gcc = "$gccf $cflags -shared -ldl -lm @LINK -o $outdir/$bin";
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
|
@ -45,6 +45,16 @@
|
||||
enginefuncs_t g_engfuncs;
|
||||
globalvars_t *gpGlobals;
|
||||
|
||||
|
||||
|
||||
DLL_FUNCTIONS *g_pFunctionTable;
|
||||
DLL_FUNCTIONS *g_pFunctionTable_Post;
|
||||
enginefuncs_t *g_pengfuncsTable;
|
||||
enginefuncs_t *g_pengfuncsTable_Post;
|
||||
NEW_DLL_FUNCTIONS *g_pNewFunctionsTable;
|
||||
NEW_DLL_FUNCTIONS *g_pNewFunctionsTable_Post;
|
||||
|
||||
|
||||
// GetEntityAPI2 functions
|
||||
static DLL_FUNCTIONS g_EntityAPI_Table =
|
||||
{
|
||||
@ -2114,6 +2124,7 @@ C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersi
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pFunctionTable, &g_EntityAPI_Table, sizeof(DLL_FUNCTIONS));
|
||||
g_pFunctionTable=pFunctionTable;
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
@ -2131,7 +2142,7 @@ C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interface
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy( pFunctionTable, &g_EntityAPI_Post_Table, sizeof( DLL_FUNCTIONS ) );
|
||||
|
||||
g_pFunctionTable_Post=pFunctionTable;
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
@ -2154,6 +2165,7 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pengfuncsFromEngine, &g_EngineFuncs_Table, sizeof(enginefuncs_t));
|
||||
g_pengfuncsTable=pengfuncsFromEngine;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -2171,6 +2183,7 @@ C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pengfuncsFromEngine, &g_EngineFuncs_Post_Table, sizeof(enginefuncs_t));
|
||||
g_pengfuncsTable_Post=pengfuncsFromEngine;
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
@ -2195,6 +2208,7 @@ C_DLLEXPORT int GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pNewFunctionTable,
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pNewFunctionTable, &g_NewFuncs_Table, sizeof(NEW_DLL_FUNCTIONS));
|
||||
g_pNewFunctionsTable=pNewFunctionTable;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -2212,6 +2226,7 @@ C_DLLEXPORT int GetNewDLLFunctions_Post( NEW_DLL_FUNCTIONS *pNewFunctionTable, i
|
||||
return(FALSE);
|
||||
}
|
||||
memcpy(pNewFunctionTable, &g_NewFuncs_Post_Table, sizeof(NEW_DLL_FUNCTIONS));
|
||||
g_pNewFunctionsTable_Post=pNewFunctionTable;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -2439,11 +2454,14 @@ PFN_GET_AMXSTRINGLEN g_fn_GetAmxStringLen;
|
||||
PFN_FORMAT_AMXSTRING g_fn_FormatAmxString;
|
||||
PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory;
|
||||
PFN_LOG g_fn_Log;
|
||||
PFN_LOG_ERROR g_fn_LogErrorFunc;
|
||||
PFN_RAISE_AMXERROR g_fn_RaiseAmxError;
|
||||
PFN_REGISTER_FORWARD g_fn_RegisterForward;
|
||||
PFN_EXECUTE_FORWARD g_fn_ExecuteForward;
|
||||
PFN_PREPARE_CELLARRAY g_fn_PrepareCellArray;
|
||||
PFN_PREPARE_CHARARRAY g_fn_PrepareCharArray;
|
||||
PFN_PREPARE_CELLARRAY_A g_fn_PrepareCellArrayA;
|
||||
PFN_PREPARE_CHARARRAY_A g_fn_PrepareCharArrayA;
|
||||
PFN_IS_PLAYER_VALID g_fn_IsPlayerValid;
|
||||
PFN_GET_PLAYER_NAME g_fn_GetPlayerName;
|
||||
PFN_GET_PLAYER_IP g_fn_GetPlayerIP;
|
||||
@ -2453,6 +2471,7 @@ PFN_IS_PLAYER_AUTHORIZED g_fn_IsPlayerAuthorized;
|
||||
PFN_GET_PLAYER_TIME g_fn_GetPlayerTime;
|
||||
PFN_GET_PLAYER_PLAYTIME g_fn_GetPlayerPlayTime;
|
||||
PFN_GET_PLAYER_CURWEAPON g_fn_GetPlayerCurweapon;
|
||||
PFN_GET_PLAYER_TEAM g_fn_GetPlayerTeam;
|
||||
PFN_GET_PLAYER_TEAMID g_fn_GetPlayerTeamID;
|
||||
PFN_GET_PLAYER_DEATHS g_fn_GetPlayerDeaths;
|
||||
PFN_GET_PLAYER_MENU g_fn_GetPlayerMenu;
|
||||
@ -2477,6 +2496,11 @@ PFN_CELL_TO_REAL g_fn_CellToReal;
|
||||
PFN_REGISTER_SPFORWARD g_fn_RegisterSPForward;
|
||||
PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName;
|
||||
PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward;
|
||||
PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File;
|
||||
PFN_AMX_FINDNATIVE g_fn_AmxFindNative;
|
||||
PFN_GETPLAYERFLAGS g_fn_GetPlayerFlags;
|
||||
PFN_GET_PLAYER_EDICT g_fn_GetPlayerEdict;
|
||||
PFN_FORMAT g_fn_Format;
|
||||
|
||||
// *** Exports ***
|
||||
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
||||
@ -2520,6 +2544,9 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("PrintSrvConsole", g_fn_PrintSrvConsole, PFN_PRINT_SRVCONSOLE);
|
||||
REQFUNC("GetModname", g_fn_GetModname, PFN_GET_MODNAME);
|
||||
REQFUNC("Log", g_fn_Log, PFN_LOG);
|
||||
REQFUNC("LogError", g_fn_LogErrorFunc, PFN_LOG_ERROR);
|
||||
REQFUNC("MergeDefinitionFile", g_fn_MergeDefinition_File, PFN_MERGEDEFINITION_FILE);
|
||||
REQFUNC("Format", g_fn_Format, PFN_FORMAT);
|
||||
|
||||
// Amx scripts
|
||||
REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT);
|
||||
@ -2527,6 +2554,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("FindAmxScriptByName", g_fn_FindAmxScriptByName, PFN_FIND_AMXSCRIPT_BYNAME);
|
||||
REQFUNC("LoadAmxScript", g_fn_LoadAmxScript, PFN_LOAD_AMXSCRIPT);
|
||||
REQFUNC("UnloadAmxScript", g_fn_UnloadAmxScript, PFN_UNLOAD_AMXSCRIPT);
|
||||
REQFUNC("GetAmxScriptName", g_fn_GetAmxScriptName, PFN_GET_AMXSCRIPTNAME);
|
||||
|
||||
// String / mem in amx scripts support
|
||||
REQFUNC("SetAmxString", g_fn_SetAmxString, PFN_SET_AMXSTRING);
|
||||
@ -2540,6 +2568,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("amx_Execv", g_fn_AmxExecv, PFN_AMX_EXECV);
|
||||
REQFUNC("amx_FindPublic", g_fn_AmxFindPublic, PFN_AMX_FINDPUBLIC);
|
||||
REQFUNC("amx_Allot", g_fn_AmxAllot, PFN_AMX_ALLOT);
|
||||
REQFUNC("amx_FindNative", g_fn_AmxFindNative, PFN_AMX_FINDNATIVE);
|
||||
|
||||
// Natives / Forwards
|
||||
REQFUNC("AddNatives", g_fn_AddNatives, PFN_ADD_NATIVES);
|
||||
@ -2551,7 +2580,8 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("ExecuteForward", g_fn_ExecuteForward, PFN_EXECUTE_FORWARD);
|
||||
REQFUNC("PrepareCellArray", g_fn_PrepareCellArray, PFN_PREPARE_CELLARRAY);
|
||||
REQFUNC("PrepareCharArray", g_fn_PrepareCharArray, PFN_PREPARE_CHARARRAY);
|
||||
|
||||
REQFUNC("PrepareCellArrayA", g_fn_PrepareCellArrayA, PFN_PREPARE_CELLARRAY_A);
|
||||
REQFUNC("PrepareCharArrayA", g_fn_PrepareCharArrayA, PFN_PREPARE_CHARARRAY_A);
|
||||
// Player
|
||||
REQFUNC("IsPlayerValid", g_fn_IsPlayerValid, PFN_IS_PLAYER_VALID);
|
||||
REQFUNC("GetPlayerName", g_fn_GetPlayerName, PFN_GET_PLAYER_NAME);
|
||||
@ -2563,6 +2593,7 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("GetPlayerPlayTime", g_fn_GetPlayerPlayTime, PFN_GET_PLAYER_PLAYTIME);
|
||||
REQFUNC("GetPlayerCurweapon", g_fn_GetPlayerCurweapon, PFN_GET_PLAYER_CURWEAPON);
|
||||
REQFUNC("GetPlayerTeamID", g_fn_GetPlayerTeamID, PFN_GET_PLAYER_TEAMID);
|
||||
REQFUNC("GetPlayerTeam",g_fn_GetPlayerTeam, PFN_GET_PLAYER_TEAM);
|
||||
REQFUNC("GetPlayerDeaths", g_fn_GetPlayerDeaths, PFN_GET_PLAYER_DEATHS);
|
||||
REQFUNC("GetPlayerMenu", g_fn_GetPlayerMenu, PFN_GET_PLAYER_MENU);
|
||||
REQFUNC("GetPlayerKeys", g_fn_GetPlayerKeys, PFN_GET_PLAYER_KEYS);
|
||||
@ -2572,6 +2603,8 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
||||
REQFUNC("IsPlayerHLTV", g_fn_IsPlayerHLTV, PFN_IS_PLAYER_HLTV);
|
||||
REQFUNC("GetPlayerArmor", g_fn_GetPlayerArmor, PFN_GET_PLAYER_ARMOR);
|
||||
REQFUNC("GetPlayerHealth", g_fn_GetPlayerHealth, PFN_GET_PLAYER_HEALTH);
|
||||
REQFUNC("GetPlayerFlags", g_fn_GetPlayerFlags, PFN_GETPLAYERFLAGS);
|
||||
REQFUNC("GetPlayerEdict", g_fn_GetPlayerEdict, PFN_GET_PLAYER_EDICT);
|
||||
|
||||
// Memory
|
||||
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
|
||||
@ -2618,6 +2651,18 @@ void MF_Log(const char *fmt, ...)
|
||||
g_fn_Log("[%s] %s", MODULE_NAME, msg);
|
||||
}
|
||||
|
||||
void MF_LogError(AMX *amx, int err, const char *fmt, ...)
|
||||
{
|
||||
// :TODO: Overflow possible here
|
||||
char msg[3072];
|
||||
va_list arglst;
|
||||
va_start(arglst, fmt);
|
||||
vsprintf(msg, fmt, arglst);
|
||||
va_end(arglst);
|
||||
|
||||
g_fn_LogErrorFunc(amx, err, "[%s] %s", MODULE_NAME, msg);
|
||||
}
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
// validate macros
|
||||
@ -2638,11 +2683,14 @@ void ValidateMacros_DontCallThis_Smiley()
|
||||
MF_GetAmxStringLen(NULL);
|
||||
MF_CopyAmxMemory(NULL, NULL, 0);
|
||||
MF_Log("str", "str", 0);
|
||||
MF_LogError(NULL, 0, NULL);
|
||||
MF_RaiseAmxError(NULL, 0);
|
||||
MF_RegisterForward("str", (ForwardExecType)0, 0, 0, 0);
|
||||
MF_ExecuteForward(0, 0, 0);
|
||||
MF_PrepareCellArray(NULL, 0);
|
||||
MF_PrepareCharArray(NULL, 0);
|
||||
MF_PrepareCellArrayA(NULL, 0, true);
|
||||
MF_PrepareCharArrayA(NULL, 0, true);
|
||||
MF_IsPlayerValid(0);
|
||||
MF_GetPlayerName(0);
|
||||
MF_GetPlayerIP(0);
|
||||
@ -2653,6 +2701,7 @@ void ValidateMacros_DontCallThis_Smiley()
|
||||
MF_GetPlayerPlayTime(0);
|
||||
MF_GetPlayerCurweapon(0);
|
||||
MF_GetPlayerTeamID(0);
|
||||
MF_GetPlayerTeam(0);
|
||||
MF_GetPlayerDeaths(0);
|
||||
MF_GetPlayerMenu(0);
|
||||
MF_GetPlayerKeys(0);
|
||||
@ -2666,11 +2715,14 @@ void ValidateMacros_DontCallThis_Smiley()
|
||||
MF_AmxExecv(0, 0, 0, 0, 0);
|
||||
MF_AmxFindPublic(0, 0, 0);
|
||||
MF_AmxAllot(0, 0, 0, 0);
|
||||
MF_LoadAmxScript(0, 0, 0, 0);
|
||||
MF_LoadAmxScript(0, 0, 0, 0, 0);
|
||||
MF_UnloadAmxScript(0, 0);
|
||||
MF_RegisterSPForward(0, 0, 0, 0, 0, 0);
|
||||
MF_RegisterSPForwardByName(0, 0, 0, 0, 0, 0);
|
||||
MF_UnregisterSPForward(0);
|
||||
MF_GetPlayerFrags(0);
|
||||
MF_GetPlayerEdict(0);
|
||||
MF_Format("", 4, "str");
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -2787,7 +2839,7 @@ void *operator new(size_t reportedSize)
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *operator new[](size_t reportedSize)
|
||||
@ -2800,7 +2852,7 @@ void *operator new[](size_t reportedSize)
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Microsoft memory tracking operators
|
||||
@ -2814,7 +2866,7 @@ void *operator new(size_t reportedSize, const char *sourceFile, int sourceLine)
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine)
|
||||
{
|
||||
@ -2826,7 +2878,7 @@ void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine
|
||||
return ptr;
|
||||
|
||||
// allocation failed
|
||||
throw std::bad_alloc();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void operator delete(void *reportedAddress)
|
||||
|
@ -55,7 +55,7 @@ struct amxx_module_info_s
|
||||
// The next section is copied from the amx.h file
|
||||
// Copyright (c) ITB CompuPhase, 1997-2004
|
||||
|
||||
#if defined __LCC__ || defined __DMC__ || defined __linux__
|
||||
#if defined __LCC__ || defined __DMC__ || defined __linux__ || defined __GNUC__
|
||||
#include <stdint.h>
|
||||
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
|
||||
/* The ISO C99 defines the int16_t and int_32t types. If the compiler got
|
||||
@ -204,11 +204,9 @@ typedef struct tagAMX {
|
||||
cell reset_stk PACKED;
|
||||
cell reset_hea PACKED;
|
||||
cell sysreq_d PACKED; /* relocated address/value for the SYSREQ.D opcode */
|
||||
#if defined JIT
|
||||
/* support variables for the JIT */
|
||||
int reloc_size PACKED; /* required temporary buffer for relocations */
|
||||
long code_size PACKED; /* estimated memory footprint of the native code */
|
||||
#endif
|
||||
} AMX;
|
||||
|
||||
enum {
|
||||
@ -240,6 +238,14 @@ enum {
|
||||
AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */
|
||||
};
|
||||
|
||||
#if !defined AMX_NO_ALIGN
|
||||
#if defined __linux__
|
||||
#pragma pack() /* reset default packing */
|
||||
#else
|
||||
#pragma pack(pop) /* reset previous packing */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
// ***** declare functions *****
|
||||
|
||||
@ -257,9 +263,9 @@ void FN_META_QUERY(void);
|
||||
void FN_META_ATTACH(void);
|
||||
#endif // FN_META_ATTACH
|
||||
|
||||
#ifdef FN_META_DETTACH
|
||||
void FN_META_DETTACH(void);
|
||||
#endif // FN_META_DETTACH
|
||||
#ifdef FN_META_DETACH
|
||||
void FN_META_DETACH(void);
|
||||
#endif // FN_META_DETACH
|
||||
|
||||
|
||||
|
||||
@ -923,7 +929,7 @@ void FN_EngineFprintf(FILE *pfile, char *szFmt, ...);
|
||||
#endif // FN_EngineFprintf
|
||||
|
||||
#ifdef FN_PvAllocEntPrivateData
|
||||
void *FN_PvAllocEntPrivateData(edict_t *pEdict, long cb);
|
||||
void *FN_PvAllocEntPrivateData(edict_t *pEdict, int32 cb);
|
||||
#endif // FN_PvAllocEntPrivateData
|
||||
|
||||
#ifdef FN_PvEntPrivateData
|
||||
@ -1869,9 +1875,9 @@ void FN_AMXX_QUERY(void);
|
||||
void FN_AMXX_ATTACH(void);
|
||||
#endif // FN_AMXX_ATTACH
|
||||
|
||||
#ifdef FN_AMXX_DETTACH
|
||||
void FN_AMXX_DETTACH(void);
|
||||
#endif // FN_AMXX_DETTACH
|
||||
#ifdef FN_AMXX_DETACH
|
||||
void FN_AMXX_DETACH(void);
|
||||
#endif // FN_AMXX_DETACH
|
||||
|
||||
#ifdef FN_AMXX_PLUGINSLOADED
|
||||
void FN_AMXX_PLUGINSLOADED(void);
|
||||
@ -1913,11 +1919,14 @@ typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr);
|
||||
typedef char * (*PFN_FORMAT_AMXSTRING) (AMX * /*amx*/, cell * /*params*/, int /*startParam*/, int * /*pLen*/);
|
||||
typedef void (*PFN_COPY_AMXMEMORY) (cell * /*dest*/, const cell * /*src*/, int /*len*/);
|
||||
typedef void (*PFN_LOG) (const char * /*fmt*/, ...);
|
||||
typedef void (*PFN_LOG_ERROR) (AMX * /*amx*/, int /*err*/, const char * /*fmt*/, ...);
|
||||
typedef int (*PFN_RAISE_AMXERROR) (AMX * /*amx*/, int /*error*/);
|
||||
typedef int (*PFN_REGISTER_FORWARD) (const char * /*funcname*/, ForwardExecType /*exectype*/, ... /*paramtypes terminated by PF_DONE*/);
|
||||
typedef int (*PFN_EXECUTE_FORWARD) (int /*id*/, ... /*params*/);
|
||||
typedef cell (*PFN_PREPARE_CELLARRAY) (cell * /*ptr*/, unsigned int /*size*/);
|
||||
typedef cell (*PFN_PREPARE_CHARARRAY) (char * /*ptr*/, unsigned int /*size*/);
|
||||
typedef cell (*PFN_PREPARE_CELLARRAY_A) (cell * /*ptr*/, unsigned int /*size*/, bool /*copyBack*/);
|
||||
typedef cell (*PFN_PREPARE_CHARARRAY_A) (char * /*ptr*/, unsigned int /*size*/, bool /*copyBack*/);
|
||||
typedef int (*PFN_IS_PLAYER_VALID) (int /*id*/);
|
||||
typedef const char * (*PFN_GET_PLAYER_NAME) (int /*id*/);
|
||||
typedef const char * (*PFN_GET_PLAYER_IP) (int /*id*/);
|
||||
@ -1926,7 +1935,9 @@ typedef int (*PFN_IS_PLAYER_BOT) (int /*id*/);
|
||||
typedef int (*PFN_IS_PLAYER_AUTHORIZED) (int /*id*/);
|
||||
typedef float (*PFN_GET_PLAYER_TIME) (int /*id*/);
|
||||
typedef float (*PFN_GET_PLAYER_PLAYTIME) (int /*id*/);
|
||||
typedef int (*PFN_GETPLAYERFLAGS) (int /* id*/);
|
||||
typedef int (*PFN_GET_PLAYER_CURWEAPON) (int /*id*/);
|
||||
typedef const char * (*PFN_GET_PLAYER_TEAM) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_TEAMID) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_DEATHS) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_MENU) (int /*id*/);
|
||||
@ -1937,6 +1948,12 @@ typedef int (*PFN_IS_PLAYER_CONNECTING) (int /*id*/);
|
||||
typedef int (*PFN_IS_PLAYER_HLTV) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_ARMOR) (int /*id*/);
|
||||
typedef int (*PFN_GET_PLAYER_HEALTH) (int /*id*/);
|
||||
#ifdef USE_METAMOD
|
||||
typedef edict_t * (*PFN_GET_PLAYER_EDICT) (int /*id*/);
|
||||
#else
|
||||
typedef void * (*PFN_GET_PLAYER_EDICT) (int /*id*/);
|
||||
#endif
|
||||
|
||||
typedef void * (*PFN_ALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
||||
const unsigned int /*type*/, const size_t /*size*/);
|
||||
typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/,
|
||||
@ -1947,13 +1964,16 @@ typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*in
|
||||
typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/);
|
||||
typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/);
|
||||
typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/);
|
||||
typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/);
|
||||
typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/);
|
||||
typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */);
|
||||
typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/);
|
||||
typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/);
|
||||
typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/);
|
||||
typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/);
|
||||
typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/);
|
||||
typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/);
|
||||
typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/);
|
||||
typedef const char * (*PFN_FORMAT) (const char * /*fmt*/, ... /*params*/);
|
||||
|
||||
extern PFN_ADD_NATIVES g_fn_AddNatives;
|
||||
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
||||
@ -1970,11 +1990,14 @@ extern PFN_GET_AMXSTRINGLEN g_fn_GetAmxStringLen;
|
||||
extern PFN_FORMAT_AMXSTRING g_fn_FormatAmxString;
|
||||
extern PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory;
|
||||
extern PFN_LOG g_fn_Log;
|
||||
extern PFN_LOG_ERROR g_fn_LogErrorFunc;
|
||||
extern PFN_RAISE_AMXERROR g_fn_RaiseAmxError;
|
||||
extern PFN_REGISTER_FORWARD g_fn_RegisterForward;
|
||||
extern PFN_EXECUTE_FORWARD g_fn_ExecuteForward;
|
||||
extern PFN_PREPARE_CELLARRAY g_fn_PrepareCellArray;
|
||||
extern PFN_PREPARE_CHARARRAY g_fn_PrepareCharArray;
|
||||
extern PFN_PREPARE_CELLARRAY_A g_fn_PrepareCellArrayA;
|
||||
extern PFN_PREPARE_CHARARRAY_A g_fn_PrepareCharArrayA;
|
||||
extern PFN_IS_PLAYER_VALID g_fn_IsPlayerValid;
|
||||
extern PFN_GET_PLAYER_NAME g_fn_GetPlayerName;
|
||||
extern PFN_GET_PLAYER_IP g_fn_GetPlayerIP;
|
||||
@ -2005,6 +2028,12 @@ extern PFN_CELL_TO_REAL g_fn_CellToReal;
|
||||
extern PFN_REGISTER_SPFORWARD g_fn_RegisterSPForward;
|
||||
extern PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName;
|
||||
extern PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward;
|
||||
extern PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File;
|
||||
extern PFN_AMX_FINDNATIVE g_fn_AmxFindNative;
|
||||
extern PFN_GETPLAYERFLAGS g_fn_GetPlayerFlags;
|
||||
extern PFN_GET_PLAYER_EDICT g_fn_GetPlayerEdict;
|
||||
extern PFN_FORMAT g_fn_Format;
|
||||
extern PFN_GET_PLAYER_TEAM g_fn_GetPlayerTeam;
|
||||
|
||||
#ifdef MAY_NEVER_BE_DEFINED
|
||||
// Function prototypes for intellisense and similar systems
|
||||
@ -2024,11 +2053,14 @@ int MF_GetAmxStringLen (const cell *ptr) { }
|
||||
char * MF_FormatAmxString (AMX * amx, cell * params, int startParam, int * pLen) { }
|
||||
void MF_CopyAmxMemory (cell * dest, const cell * src, int len) { }
|
||||
void MF_Log (const char * fmt, ...) { }
|
||||
void MF_LogError (AMX * amx, int err, const char *fmt, ...) { }
|
||||
int MF_RaiseAmxError (AMX * amx, int error) { }
|
||||
int MF_RegisterForward (const char * funcname, ForwardExecType exectype, ...) { }
|
||||
int MF_ExecuteForward (int id, ...) { }
|
||||
cell MF_PrepareCellArray (cell * ptr, unsigned int size) { }
|
||||
cell MF_PrepareCharArray (char * ptr, unsigned int size) { }
|
||||
cell MF_PrepareCellArrayA (cell * ptr, unsigned int size, bool copyBack) { }
|
||||
cell MF_PrepareCharArrayA (char * ptr, unsigned int size, bool copyBack) { }
|
||||
int MF_IsPlayerValid (int id) { }
|
||||
const char * MF_GetPlayerName (int id) { }
|
||||
const char * MF_GetPlayerIP (int id) { }
|
||||
@ -2038,6 +2070,7 @@ int MF_IsPlayerAuthorized (int id) { }
|
||||
float MF_GetPlayerTime (int id) { }
|
||||
float MF_GetPlayerPlayTime (int id) { }
|
||||
int MF_GetPlayerCurweapon (int id) { }
|
||||
const char * MF_GetPlayerTeam (int id) { }
|
||||
int MF_GetPlayerTeamID (int id) { }
|
||||
int MF_GetPlayerDeaths (int id) { }
|
||||
int MF_GetPlayerMenu (int id) { }
|
||||
@ -2053,6 +2086,9 @@ cell amx_ftoc (float x) { }
|
||||
int MF_RegisterSPForwardByName (AMX * amx, const char *str, ...) { }
|
||||
int MF_RegisterSPForward (AMX * amx, int func, ...) { }
|
||||
void MF_UnregisterSPForward (int id) { }
|
||||
int MF_GetPlayerFlags (int id) { }
|
||||
edict_t* MF_GetPlayerEdict (int id) { }
|
||||
const char * MF_Format (const char *fmt, ...) { }
|
||||
#endif // MAY_NEVER_BE_DEFINED
|
||||
|
||||
#define MF_AddNatives g_fn_AddNatives
|
||||
@ -2070,11 +2106,14 @@ void MF_UnregisterSPForward (int id) { }
|
||||
#define MF_GetAmxStringLen g_fn_GetAmxStringLen
|
||||
#define MF_CopyAmxMemory g_fn_CopyAmxMemory
|
||||
void MF_Log(const char *fmt, ...);
|
||||
void MF_LogError(AMX *amx, int err, const char *fmt, ...);
|
||||
#define MF_RaiseAmxError g_fn_RaiseAmxError
|
||||
#define MF_RegisterForward g_fn_RegisterForward
|
||||
#define MF_ExecuteForward g_fn_ExecuteForward
|
||||
#define MF_PrepareCellArray g_fn_PrepareCellArray
|
||||
#define MF_PrepareCharArray g_fn_PrepareCharArray
|
||||
#define MF_PrepareCellArrayA g_fn_PrepareCellArrayA
|
||||
#define MF_PrepareCharArrayA g_fn_PrepareCharArrayA
|
||||
#define MF_IsPlayerValid g_fn_IsPlayerValid
|
||||
#define MF_GetPlayerName g_fn_GetPlayerName
|
||||
#define MF_GetPlayerIP g_fn_GetPlayerIP
|
||||
@ -2084,6 +2123,7 @@ void MF_Log(const char *fmt, ...);
|
||||
#define MF_GetPlayerTime g_fn_GetPlayerTime
|
||||
#define MF_GetPlayerPlayTime g_fn_GetPlayerPlayTime
|
||||
#define MF_GetPlayerCurweapon g_fn_GetPlayerCurweapon
|
||||
#define MF_GetPlayerTeam g_fn_GetPlayerTeam
|
||||
#define MF_GetPlayerTeamID g_fn_GetPlayerTeamID
|
||||
#define MF_GetPlayerDeaths g_fn_GetPlayerDeaths
|
||||
#define MF_GetPlayerMenu g_fn_GetPlayerMenu
|
||||
@ -2098,13 +2138,18 @@ void MF_Log(const char *fmt, ...);
|
||||
#define MF_AmxExecv g_fn_AmxExecv
|
||||
#define MF_AmxFindPublic g_fn_AmxFindPublic
|
||||
#define MF_AmxAllot g_fn_AmxAllot
|
||||
#define MF_AmxFindNative g_fn_AmxFindNative
|
||||
#define MF_LoadAmxScript g_fn_LoadAmxScript
|
||||
#define MF_UnloadAmxScript g_fn_UnloadAmxScript
|
||||
#define MF_MergeDefinitionFile g_fn_MergeDefinition_File
|
||||
#define amx_ctof g_fn_CellToReal
|
||||
#define amx_ftoc g_fn_RealToCell
|
||||
#define MF_RegisterSPForwardByName g_fn_RegisterSPForwardByName
|
||||
#define MF_RegisterSPForward g_fn_RegisterSPForward
|
||||
#define MF_UnregisterSPForward g_fn_UnregisterSPForward
|
||||
#define MF_GetPlayerFlags g_fn_GetPlayerFlags
|
||||
#define MF_GetPlayerEdict g_fn_GetPlayerEdict
|
||||
#define MF_Format g_fn_Format
|
||||
|
||||
/*** Memory ***/
|
||||
void *operator new(size_t reportedSize);
|
||||
|
@ -37,11 +37,7 @@
|
||||
|
||||
bool UTIL_IsPlayer(AMX* amx, edict_t* pPlayer) {
|
||||
bool player = false;
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strcmp(STRING(pPlayer->v.classname), "player") == 0)
|
||||
player = true;
|
||||
|
||||
@ -74,20 +70,10 @@ static cell AMX_NATIVE_CALL cs_set_user_money(AMX *amx, cell *params) // cs_set_
|
||||
// params[3] = flash money?
|
||||
|
||||
// Check index
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Fetch player pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
// Give money
|
||||
*((int *)pPlayer->pvPrivateData + OFFSET_CSMONEY) = params[2];
|
||||
@ -107,20 +93,10 @@ static cell AMX_NATIVE_CALL cs_get_user_money(AMX *amx, cell *params) // cs_get_
|
||||
// params[1] = user
|
||||
|
||||
// Check index
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Fetch player pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
// Return money
|
||||
return *((int *)pPlayer->pvPrivateData + OFFSET_CSMONEY);
|
||||
@ -132,20 +108,10 @@ static cell AMX_NATIVE_CALL cs_get_user_deaths(AMX *amx, cell *params) // cs_get
|
||||
// params[1] = user
|
||||
|
||||
// Check index
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Fetch player pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
return *((int *)pPlayer->pvPrivateData + OFFSET_CSDEATHS);
|
||||
}
|
||||
@ -157,20 +123,10 @@ static cell AMX_NATIVE_CALL cs_set_user_deaths(AMX *amx, cell *params) // cs_set
|
||||
// params[2] = new deaths
|
||||
|
||||
// Check index
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Fetch player pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
// Set deaths
|
||||
*((int *)pPlayer->pvPrivateData + OFFSET_CSDEATHS) = params[2];
|
||||
@ -193,24 +149,14 @@ static cell AMX_NATIVE_CALL cs_get_hostage_id(AMX *amx, cell *params) // cs_get_
|
||||
// params[1] = hostage entity index
|
||||
|
||||
// Valid entity should be within range
|
||||
if (params[1] <= gpGlobals->maxClients || params[1] > gpGlobals->maxEntities)
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_ENTITY(params[1]);
|
||||
|
||||
// Make into class pointer
|
||||
edict_t *pEdict = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pEdict)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pEdict = GETEDICT(params[1]);
|
||||
|
||||
// Make sure this is a hostage.
|
||||
if (strcmp(STRING(pEdict->v.classname), "hostage_entity") != 0) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Entity %d (\"%s\") is not a hostage", params[1], STRING(pEdict->v.classname));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -224,21 +170,11 @@ static cell AMX_NATIVE_CALL cs_get_weapon_silenced(AMX *amx, cell *params) // cs
|
||||
// params[1] = weapon index
|
||||
|
||||
// Valid entity should be within range
|
||||
if (params[1] <= gpGlobals->maxClients || params[1] > gpGlobals->maxEntities)
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_NONPLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pWeapon = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pWeapon)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int weapontype = (int)*((int *)pWeapon->pvPrivateData + OFFSET_WEAPONTYPE);
|
||||
int *silencemode = ((int *)pWeapon->pvPrivateData + OFFSET_SILENCER_FIREMODE);
|
||||
switch (weapontype) {
|
||||
@ -254,6 +190,20 @@ static cell AMX_NATIVE_CALL cs_get_weapon_silenced(AMX *amx, cell *params) // cs
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL cs_get_weapon_id(AMX *amx, cell *params) // cs_get_weapon_id(index); = 1 param
|
||||
{
|
||||
// Get weapon type. Corresponds to CSW_*
|
||||
// params[1] = weapon index
|
||||
|
||||
// Valid entity should be within range
|
||||
CHECK_NONPLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pWeapon = INDEXENT(params[1]);
|
||||
|
||||
return *((int *)pWeapon->pvPrivateData + OFFSET_WEAPONTYPE);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL cs_set_weapon_silenced(AMX *amx, cell *params) // cs_set_weapon_silenced(index, silence = 1); = 2 params
|
||||
{
|
||||
// Silence/unsilence gun. Does only work on M4A1 and USP.
|
||||
@ -261,21 +211,11 @@ static cell AMX_NATIVE_CALL cs_set_weapon_silenced(AMX *amx, cell *params) // cs
|
||||
// params[2] = 1, and we silence the gun, 0 and we unsilence gun.
|
||||
|
||||
// Valid entity should be within range
|
||||
if (params[1] <= gpGlobals->maxClients || params[1] > gpGlobals->maxEntities)
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_NONPLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pWeapon = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pWeapon)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int weapontype = (int)*((int *)pWeapon->pvPrivateData + OFFSET_WEAPONTYPE);
|
||||
int *silencemode = ((int *)pWeapon->pvPrivateData + OFFSET_SILENCER_FIREMODE);
|
||||
|
||||
@ -325,21 +265,11 @@ static cell AMX_NATIVE_CALL cs_get_weapon_burstmode(AMX *amx, cell *params) // c
|
||||
// params[1] = weapon index
|
||||
|
||||
// Valid entity should be within range
|
||||
if (params[1] <= gpGlobals->maxClients || params[1] > gpGlobals->maxEntities)
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_NONPLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pWeapon = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pWeapon)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int weapontype = (int)*((int *)pWeapon->pvPrivateData + OFFSET_WEAPONTYPE);
|
||||
int* firemode = ((int *)pWeapon->pvPrivateData + OFFSET_SILENCER_FIREMODE);
|
||||
switch (weapontype) {
|
||||
@ -362,21 +292,11 @@ static cell AMX_NATIVE_CALL cs_set_weapon_burstmode(AMX *amx, cell *params) // c
|
||||
// params[2] = 1, and we set burstmode, 0 and we unset it.
|
||||
|
||||
// Valid entity should be within range
|
||||
if (params[1] <= gpGlobals->maxClients || params[1] > gpGlobals->maxEntities)
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_NONPLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pWeapon = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pWeapon)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int weapontype = (int)*((int *)pWeapon->pvPrivateData + OFFSET_WEAPONTYPE);
|
||||
|
||||
int* firemode = ((int *)pWeapon->pvPrivateData + OFFSET_SILENCER_FIREMODE);
|
||||
@ -432,20 +352,10 @@ static cell AMX_NATIVE_CALL cs_get_user_vip(AMX *amx, cell *params) // cs_get_us
|
||||
// params[1] = user index
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
if ( *((int *)pPlayer->pvPrivateData + OFFSET_VIP) & PLAYER_IS_VIP )
|
||||
return 1;
|
||||
@ -460,20 +370,10 @@ static cell AMX_NATIVE_CALL cs_set_user_vip(AMX *amx, cell *params) // cs_set_us
|
||||
// params[2] = if 1, activate vip, else deactivate vip.
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
if (params[2] == 1) {
|
||||
// Set to "be" vip.
|
||||
@ -522,20 +422,10 @@ static cell AMX_NATIVE_CALL cs_get_user_team(AMX *amx, cell *params) // cs_get_u
|
||||
// params[1] = user index
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
return *((int *)pPlayer->pvPrivateData + OFFSET_TEAM);
|
||||
}
|
||||
@ -548,20 +438,10 @@ static cell AMX_NATIVE_CALL cs_set_user_team(AMX *amx, cell *params) // cs_set_u
|
||||
// params[3] = model = 0
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
int model = params[3];
|
||||
|
||||
@ -589,7 +469,8 @@ static cell AMX_NATIVE_CALL cs_set_user_team(AMX *amx, cell *params) // cs_set_u
|
||||
strcpy(teaminfo, "SPECTATOR");
|
||||
break;
|
||||
default:
|
||||
sprintf(teaminfo, "TEAM_%d", params[2]);
|
||||
int team_nr = (int)params[2];
|
||||
sprintf(teaminfo, "TEAM_%i", team_nr);
|
||||
}
|
||||
MESSAGE_BEGIN(MSG_ALL, GET_USER_MSG_ID(PLID, "TeamInfo", NULL));
|
||||
WRITE_BYTE(params[1]);
|
||||
@ -605,20 +486,10 @@ static cell AMX_NATIVE_CALL cs_get_user_inside_buyzone(AMX *amx, cell *params) /
|
||||
// params[1] = user index
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
return (int)*((int *)pPlayer->pvPrivateData + OFFSET_BUYZONE); // This offset is 0 when outside, 1 when inside.
|
||||
}
|
||||
@ -629,20 +500,10 @@ static cell AMX_NATIVE_CALL cs_get_user_plant(AMX *amx, cell *params) // cs_get_
|
||||
// params[1] = user index
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
if ((int)*((int *)pPlayer->pvPrivateData + OFFSET_DEFUSE_PLANT) & CAN_PLANT_BOMB)
|
||||
return 1;
|
||||
@ -658,20 +519,10 @@ static cell AMX_NATIVE_CALL cs_set_user_plant(AMX *amx, cell *params) // cs_set_
|
||||
// params[3] = show bomb icon?
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
int* plantskill = ((int *)pPlayer->pvPrivateData + OFFSET_DEFUSE_PLANT);
|
||||
|
||||
@ -714,20 +565,10 @@ static cell AMX_NATIVE_CALL cs_get_user_defusekit(AMX *amx, cell *params) // cs_
|
||||
// params[1] = user index
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
if ((int)*((int *)pPlayer->pvPrivateData + OFFSET_DEFUSE_PLANT) & HAS_DEFUSE_KIT)
|
||||
return 1;
|
||||
@ -747,20 +588,10 @@ static cell AMX_NATIVE_CALL cs_set_user_defusekit(AMX *amx, cell *params) // cs_
|
||||
// params[7] = flash = 0
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
int* defusekit = ((int *)pPlayer->pvPrivateData + OFFSET_DEFUSE_PLANT);
|
||||
|
||||
@ -822,20 +653,10 @@ static cell AMX_NATIVE_CALL cs_get_user_backpackammo(AMX *amx, cell *params) //
|
||||
// params[2] = weapon, as in CSW_*
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
int offset;
|
||||
|
||||
@ -897,7 +718,7 @@ static cell AMX_NATIVE_CALL cs_get_user_backpackammo(AMX *amx, cell *params) //
|
||||
offset = OFFSET_C4_AMMO;
|
||||
break;
|
||||
default:
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid weapon id %d", params[2]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -914,20 +735,10 @@ static cell AMX_NATIVE_CALL cs_set_user_backpackammo(AMX *amx, cell *params) //
|
||||
// params[3] = new amount
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
int offset;
|
||||
|
||||
@ -989,7 +800,7 @@ static cell AMX_NATIVE_CALL cs_set_user_backpackammo(AMX *amx, cell *params) //
|
||||
offset = OFFSET_C4_AMMO;
|
||||
break;
|
||||
default:
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid weapon id %d", params[2]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1004,20 +815,10 @@ static cell AMX_NATIVE_CALL cs_get_user_nvg(AMX *amx, cell *params) // cs_get_us
|
||||
// params[1] = user index
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
if ((int)*((int *)pPlayer->pvPrivateData + OFFSET_NVGOGGLES) & HAS_NVGOGGLES)
|
||||
return 1;
|
||||
@ -1032,20 +833,10 @@ static cell AMX_NATIVE_CALL cs_set_user_nvg(AMX *amx, cell *params) // cs_set_us
|
||||
// params[2] = 1 = give, 0 = remove
|
||||
|
||||
// Valid entity should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
int* defusekit = ((int *)pPlayer->pvPrivateData + OFFSET_NVGOGGLES);
|
||||
|
||||
@ -1073,20 +864,9 @@ static cell AMX_NATIVE_CALL cs_get_user_model(AMX *amx, cell *params) // cs_get_
|
||||
// params[3] = max length to set
|
||||
|
||||
// Valid player index should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
CHECK_PLAYER(params[1]);
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
return MF_SetAmxString(amx, params[2], GETCLIENTKEYVALUE(GETINFOKEYBUFFER(pPlayer), "model"), params[3]);
|
||||
}
|
||||
@ -1098,23 +878,13 @@ static cell AMX_NATIVE_CALL cs_set_user_model(AMX *amx, cell *params) // cs_set_
|
||||
// params[2] = model
|
||||
|
||||
// Valid player index should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t* pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t* pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
if (params[2] == -1) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid model %d", params[2]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1137,20 +907,10 @@ static cell AMX_NATIVE_CALL cs_reset_user_model(AMX *amx, cell *params) // cs_re
|
||||
// params[1] = user index
|
||||
|
||||
// Valid player index should be within range
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t* pPlayer = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pPlayer)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t* pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
g_players[params[1]].SetModelled(false);
|
||||
|
||||
@ -1165,29 +925,22 @@ static cell AMX_NATIVE_CALL cs_get_hostage_follow(AMX *amx, cell *params) // cs_
|
||||
// params[1] = hostage index
|
||||
|
||||
// Valid index should be within range
|
||||
if (params[1] <= gpGlobals->maxClients || params[1] > gpGlobals->maxEntities)
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_NONPLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t* pHostage = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pHostage)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Make sure this is a hostage.
|
||||
if (strcmp(STRING(pHostage->v.classname), "hostage_entity") != 0) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Entity %d (\"%s\") is not a hostage", params[1], STRING(pHostage->v.classname));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if !defined __amd64__
|
||||
int following = *((int *)pHostage->pvPrivateData + OFFSET_HOSTAGEFOLLOW);
|
||||
|
||||
#else
|
||||
long following = *((long *)pHostage->pvPrivateData + OFFSET_HOSTAGEFOLLOW);
|
||||
#endif
|
||||
if (following == 0)
|
||||
return following;
|
||||
|
||||
@ -1195,7 +948,7 @@ static cell AMX_NATIVE_CALL cs_get_hostage_follow(AMX *amx, cell *params) // cs_
|
||||
edict_t* pEntity = (edict_t*)following;
|
||||
|
||||
if (FNullEnt(pEntity)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Unknown error finding hostage parameter");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1209,51 +962,39 @@ static cell AMX_NATIVE_CALL cs_set_hostage_follow(AMX *amx, cell *params) // cs_
|
||||
// params[2] = index to follow, if -1 then set hostage to not follow anything
|
||||
|
||||
// Valid index should be within range
|
||||
if (params[1] <= gpGlobals->maxClients || params[1] > gpGlobals->maxEntities)
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_NONPLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t* pHostage = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pHostage)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Make sure this is a hostage.
|
||||
if (strcmp(STRING(pHostage->v.classname), "hostage_entity") != 0) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Entity %d (\"%s\") is not a hostage", params[1], STRING(pHostage->v.classname));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Set to not follow anything?
|
||||
if (params[2] == 0) {
|
||||
#if !defined __amd64__
|
||||
*((int *)pHostage->pvPrivateData + OFFSET_HOSTAGEFOLLOW) = 0;
|
||||
#else
|
||||
*((long *)pHostage->pvPrivateData + OFFSET_HOSTAGEFOLLOW) = 0;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Valid index should be within range
|
||||
if (params[2] < 1 || params[2] > gpGlobals->maxEntities)
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_ENTITY(params[2]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t* pEntity = INDEXENT(params[2]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pEntity)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
edict_t* pEntity = GETEDICT(params[2]);
|
||||
|
||||
#if !defined __amd64__
|
||||
*((int *)pHostage->pvPrivateData + OFFSET_HOSTAGEFOLLOW) = (int)pEntity;
|
||||
|
||||
#else
|
||||
*((long *)pHostage->pvPrivateData + OFFSET_HOSTAGEFOLLOW) = (long)pEntity;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1263,21 +1004,11 @@ static cell AMX_NATIVE_CALL cs_get_weapon_ammo(AMX *amx, cell *params) // cs_get
|
||||
// params[1] = weapon index
|
||||
|
||||
// Valid entity should be within range
|
||||
if (params[1] <= gpGlobals->maxClients || params[1] > gpGlobals->maxEntities)
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_NONPLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pWeapon = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pWeapon)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return *((int *)pWeapon->pvPrivateData + OFFSET_CLIPAMMO);
|
||||
}
|
||||
|
||||
@ -1288,21 +1019,11 @@ static cell AMX_NATIVE_CALL cs_set_weapon_ammo(AMX *amx, cell *params) // cs_set
|
||||
// params[2] = newammo
|
||||
|
||||
// Valid entity should be within range
|
||||
if (params[1] <= gpGlobals->maxClients || params[1] > gpGlobals->maxEntities)
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_NONPLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pWeapon = INDEXENT(params[1]);
|
||||
|
||||
// Check entity validity
|
||||
if (FNullEnt(pWeapon)) {
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
*((int *)pWeapon->pvPrivateData + OFFSET_CLIPAMMO) = params[2];
|
||||
|
||||
return 1;
|
||||
@ -1314,14 +1035,10 @@ static cell AMX_NATIVE_CALL cs_get_user_hasprimary(AMX *amx, cell *params) // cs
|
||||
// params[1] = user index
|
||||
|
||||
// Check player
|
||||
if (!MF_IsPlayerIngame(params[1]))
|
||||
{
|
||||
MF_RaiseAmxError(amx, AMX_ERR_NATIVE);
|
||||
return 0;
|
||||
}
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = INDEXENT(params[1]);
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
return *((int *)pPlayer->pvPrivateData + OFFSET_PRIMARYWEAPON);
|
||||
}
|
||||
@ -1340,6 +1057,104 @@ static cell AMX_NATIVE_CALL cs_set_no_knives(AMX *amx, cell *params) // cs_set_n
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Damaged Soul
|
||||
static cell AMX_NATIVE_CALL cs_get_user_tked(AMX *amx, cell *params) // cs_get_user_tked(index); = 1 param
|
||||
{
|
||||
// Return 1 if user has committed a team killing)
|
||||
// params[1] = user index
|
||||
|
||||
// Check player
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
return *((int *)pPlayer->pvPrivateData + OFFSET_TK);
|
||||
}
|
||||
|
||||
// Damaged Soul
|
||||
static cell AMX_NATIVE_CALL cs_set_user_tked(AMX *amx, cell *params) // cs_set_user_tked(index, tk = 1, subtract = 1); = 2 arguments
|
||||
{
|
||||
// Sets whether or not player has committed a TK.
|
||||
// params[1] = user
|
||||
// params[2] = 1: player has TKed, 0: player hasn't TKed
|
||||
// params[3] = number of frags to subtract
|
||||
|
||||
// Check index
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Fetch player pointer
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
if (params[2]) {
|
||||
*((int *)pPlayer->pvPrivateData + OFFSET_TK) = 1;
|
||||
} else {
|
||||
*((int *)pPlayer->pvPrivateData + OFFSET_TK) = 0;
|
||||
}
|
||||
|
||||
if (params[3]) {
|
||||
pPlayer->v.frags = pPlayer->v.frags - params[3];
|
||||
|
||||
MESSAGE_BEGIN(MSG_ALL, GET_USER_MSG_ID(PLID, "ScoreInfo", NULL));
|
||||
WRITE_BYTE(params[1]); // user index
|
||||
WRITE_SHORT((int)pPlayer->v.frags); // frags
|
||||
WRITE_SHORT(*((int *)pPlayer->pvPrivateData + OFFSET_CSDEATHS)); // deaths
|
||||
WRITE_SHORT(0); // ?
|
||||
WRITE_SHORT(*((int *)pPlayer->pvPrivateData + OFFSET_TEAM)); // team
|
||||
MESSAGE_END();
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL cs_get_user_driving(AMX *amx, cell *params) // cs_get_user_driving(index); = 1 param
|
||||
{
|
||||
// Returns different values depending on if user is driving a value - and if so at what speed.
|
||||
// 0: no driving
|
||||
// 1: driving, but standing still
|
||||
// 2-4: different positive speeds
|
||||
// 5: negative speed (backing)
|
||||
// params[1] = user index
|
||||
|
||||
// Check player
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
// If player driving, return 1, if not, return 0
|
||||
return *((int *)pPlayer->pvPrivateData + OFFSET_ISDRIVING);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL cs_get_user_stationary(AMX *amx, cell *params) // cs_get_user_stationary(index); = 1 param
|
||||
{
|
||||
// Returns 1 if client is using a stationary guns (maybe also other stuff)
|
||||
|
||||
// Check player
|
||||
CHECK_PLAYER(params[1]);
|
||||
|
||||
// Make into edict pointer
|
||||
edict_t *pPlayer = MF_GetPlayerEdict(params[1]);
|
||||
|
||||
// If player driving, return 1, if not, return 0
|
||||
#if !defined __amd64__
|
||||
return *((int *)pPlayer->pvPrivateData + OFFSET_STATIONARY);
|
||||
#else
|
||||
// The 32 bit server return 0 and 1 by itself from this offset, but the amd64 server has 2 and 3 respectively
|
||||
// Doing a simple checking of these defined constants here, and mapping to 0 and 1, to keep our plugin authors sane.
|
||||
// If an unexpected value is encountered, this will be logged.
|
||||
if (AMD64_STATIONARY_NO == *((int *)pPlayer->pvPrivateData + OFFSET_STATIONARY))
|
||||
return 0;
|
||||
else if (AMD64_STATIONARY_YES == *((int *)pPlayer->pvPrivateData + OFFSET_STATIONARY))
|
||||
return 1;
|
||||
else {
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Unexpected value at offset. Please report this to development team @ www.amxmodx.org!");
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
AMX_NATIVE_INFO cstrike_Exports[] = {
|
||||
{"cs_set_user_money", cs_set_user_money},
|
||||
{"cs_get_user_money", cs_get_user_money},
|
||||
@ -1373,6 +1188,11 @@ AMX_NATIVE_INFO cstrike_Exports[] = {
|
||||
{"cs_get_user_hasprim", cs_get_user_hasprimary},
|
||||
{"cs_get_no_knives", cs_get_no_knives},
|
||||
{"cs_set_no_knives", cs_set_no_knives},
|
||||
{"cs_get_weapon_id", cs_get_weapon_id},
|
||||
{"cs_get_user_tked", cs_get_user_tked},
|
||||
{"cs_set_user_tked", cs_set_user_tked},
|
||||
{"cs_get_user_driving", cs_get_user_driving},
|
||||
{"cs_get_user_stationary", cs_get_user_stationary},
|
||||
//------------------- <-- max 19 characters!
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* AMX Mod X
|
||||
/* AMX Mod X
|
||||
* Counter-Strike Module
|
||||
*
|
||||
* by the AMX Mod X Development Team
|
||||
@ -51,38 +51,81 @@
|
||||
#endif // defined __linux__
|
||||
|
||||
// "player" entities
|
||||
#define OFFSET_TEAM 114 + EXTRAOFFSET
|
||||
#define OFFSET_CSMONEY 115 + EXTRAOFFSET
|
||||
#define OFFSET_PRIMARYWEAPON 116 + EXTRAOFFSET
|
||||
#define OFFSET_INTERNALMODEL 126 + EXTRAOFFSET
|
||||
#define OFFSET_NVGOGGLES 129 + EXTRAOFFSET
|
||||
#define OFFSET_DEFUSE_PLANT 193 + EXTRAOFFSET
|
||||
#define OFFSET_VIP 215 + EXTRAOFFSET
|
||||
#define OFFSET_BUYZONE 241 + EXTRAOFFSET
|
||||
#if !defined __amd64__
|
||||
// 32 bit offsets here
|
||||
#define OFFSET_TEAM 114 + EXTRAOFFSET
|
||||
#define OFFSET_CSMONEY 115 + EXTRAOFFSET
|
||||
#define OFFSET_PRIMARYWEAPON 116 + EXTRAOFFSET
|
||||
#define OFFSET_INTERNALMODEL 126 + EXTRAOFFSET
|
||||
#define OFFSET_NVGOGGLES 129 + EXTRAOFFSET
|
||||
#define OFFSET_DEFUSE_PLANT 193 + EXTRAOFFSET
|
||||
#define OFFSET_VIP 209 + EXTRAOFFSET
|
||||
#define OFFSET_TK 216 + EXTRAOFFSET // 040926
|
||||
#define OFFSET_BUYZONE 235 + EXTRAOFFSET
|
||||
#define OFFSET_ISDRIVING 350 + EXTRAOFFSET // 040926
|
||||
#define OFFSET_STATIONARY 362 + EXTRAOFFSET // 040927 (363 works also!)
|
||||
|
||||
#define OFFSET_AWM_AMMO 382 + EXTRAOFFSET
|
||||
#define OFFSET_SCOUT_AMMO 383 + EXTRAOFFSET
|
||||
#define OFFSET_PARA_AMMO 384 + EXTRAOFFSET
|
||||
#define OFFSET_FAMAS_AMMO 385 + EXTRAOFFSET
|
||||
#define OFFSET_M3_AMMO 386 + EXTRAOFFSET
|
||||
#define OFFSET_USP_AMMO 387 + EXTRAOFFSET
|
||||
#define OFFSET_FIVESEVEN_AMMO 388 + EXTRAOFFSET
|
||||
#define OFFSET_DEAGLE_AMMO 389 + EXTRAOFFSET
|
||||
#define OFFSET_P228_AMMO 390 + EXTRAOFFSET
|
||||
#define OFFSET_GLOCK_AMMO 391 + EXTRAOFFSET
|
||||
#define OFFSET_FLASH_AMMO 392 + EXTRAOFFSET
|
||||
#define OFFSET_HE_AMMO 393 + EXTRAOFFSET
|
||||
#define OFFSET_SMOKE_AMMO 394 + EXTRAOFFSET
|
||||
#define OFFSET_C4_AMMO 395 + EXTRAOFFSET
|
||||
#define OFFSET_AWM_AMMO 382 + EXTRAOFFSET
|
||||
#define OFFSET_SCOUT_AMMO 383 + EXTRAOFFSET
|
||||
#define OFFSET_PARA_AMMO 384 + EXTRAOFFSET
|
||||
#define OFFSET_FAMAS_AMMO 385 + EXTRAOFFSET
|
||||
#define OFFSET_M3_AMMO 386 + EXTRAOFFSET
|
||||
#define OFFSET_USP_AMMO 387 + EXTRAOFFSET
|
||||
#define OFFSET_FIVESEVEN_AMMO 388 + EXTRAOFFSET
|
||||
#define OFFSET_DEAGLE_AMMO 389 + EXTRAOFFSET
|
||||
#define OFFSET_P228_AMMO 390 + EXTRAOFFSET
|
||||
#define OFFSET_GLOCK_AMMO 391 + EXTRAOFFSET
|
||||
#define OFFSET_FLASH_AMMO 392 + EXTRAOFFSET
|
||||
#define OFFSET_HE_AMMO 393 + EXTRAOFFSET
|
||||
#define OFFSET_SMOKE_AMMO 394 + EXTRAOFFSET
|
||||
#define OFFSET_C4_AMMO 395 + EXTRAOFFSET
|
||||
|
||||
#define OFFSET_CSDEATHS 449 + EXTRAOFFSET
|
||||
// "weapon_*" entities
|
||||
#define OFFSET_WEAPONTYPE 43 + EXTRAOFFSET
|
||||
#define OFFSET_CLIPAMMO 51 + EXTRAOFFSET
|
||||
#define OFFSET_SILENCER_FIREMODE 74 + EXTRAOFFSET
|
||||
// "hostage_entity" entities
|
||||
#define OFFSET_HOSTAGEFOLLOW 86 + EXTRAOFFSET
|
||||
#define OFFSET_HOSTAGEID 487 + EXTRAOFFSET
|
||||
#define OFFSET_CSDEATHS 444 + EXTRAOFFSET // 040926
|
||||
// "weapon_*" entities
|
||||
#define OFFSET_WEAPONTYPE 43 + EXTRAOFFSET
|
||||
#define OFFSET_CLIPAMMO 51 + EXTRAOFFSET
|
||||
#define OFFSET_SILENCER_FIREMODE 74 + EXTRAOFFSET
|
||||
// "hostage_entity" entities
|
||||
#define OFFSET_HOSTAGEFOLLOW 86 + EXTRAOFFSET
|
||||
#define OFFSET_HOSTAGEID 487 + EXTRAOFFSET
|
||||
#else
|
||||
// Amd64 offsets here
|
||||
#define OFFSET_TEAM 139 + EXTRAOFFSET // +25
|
||||
#define OFFSET_CSMONEY 140 + EXTRAOFFSET // +25
|
||||
#define OFFSET_PRIMARYWEAPON 141 + EXTRAOFFSET // +25
|
||||
#define OFFSET_INTERNALMODEL 152 + EXTRAOFFSET // +26
|
||||
#define OFFSET_NVGOGGLES 155 + EXTRAOFFSET // +26
|
||||
#define OFFSET_DEFUSE_PLANT 219 + EXTRAOFFSET // +26
|
||||
#define OFFSET_VIP 242 + EXTRAOFFSET // +27
|
||||
#define OFFSET_TK 249 + EXTRAOFFSET // +33 040927
|
||||
#define OFFSET_BUYZONE 268 + EXTRAOFFSET // +27
|
||||
#define OFFSET_ISDRIVING 386 + EXTRAOFFSET // 040927
|
||||
#define OFFSET_STATIONARY 400 + EXTRAOFFSET // 040927 (401 works also)
|
||||
|
||||
#define OFFSET_AWM_AMMO 426 + EXTRAOFFSET // +44
|
||||
#define OFFSET_SCOUT_AMMO 427 + EXTRAOFFSET // +44
|
||||
#define OFFSET_PARA_AMMO 428 + EXTRAOFFSET // +44
|
||||
#define OFFSET_FAMAS_AMMO 429 + EXTRAOFFSET // +44
|
||||
#define OFFSET_M3_AMMO 430 + EXTRAOFFSET // +44
|
||||
#define OFFSET_USP_AMMO 431 + EXTRAOFFSET // +44
|
||||
#define OFFSET_FIVESEVEN_AMMO 432 + EXTRAOFFSET // +44
|
||||
#define OFFSET_DEAGLE_AMMO 433 + EXTRAOFFSET // +44
|
||||
#define OFFSET_P228_AMMO 434 + EXTRAOFFSET // +44
|
||||
#define OFFSET_GLOCK_AMMO 435 + EXTRAOFFSET // +44
|
||||
#define OFFSET_FLASH_AMMO 436 + EXTRAOFFSET // +44
|
||||
#define OFFSET_HE_AMMO 437 + EXTRAOFFSET // +44
|
||||
#define OFFSET_SMOKE_AMMO 438 + EXTRAOFFSET // +44
|
||||
#define OFFSET_C4_AMMO 439 + EXTRAOFFSET // +44
|
||||
|
||||
#define OFFSET_CSDEATHS 493 + EXTRAOFFSET // +49
|
||||
// "weapon_*" entities
|
||||
#define OFFSET_WEAPONTYPE 57 + EXTRAOFFSET // +14
|
||||
#define OFFSET_CLIPAMMO 65 + EXTRAOFFSET // +14
|
||||
#define OFFSET_SILENCER_FIREMODE 88 + EXTRAOFFSET // +14
|
||||
// "hostage_entity" entities
|
||||
#define OFFSET_HOSTAGEFOLLOW 51 + EXTRAOFFSET // +21, long=51, int=107! (must use the long* offset because pointers on amd64 are stored the size of longs, 8 bytes, instead of the usual int 4 bytes.)
|
||||
#define OFFSET_HOSTAGEID 516 + EXTRAOFFSET // +29
|
||||
#endif
|
||||
|
||||
// Ids of weapons in CS
|
||||
#define CSW_P228 1
|
||||
@ -149,6 +192,9 @@
|
||||
#define SCOREATTRIB_BOMB 2 // t only
|
||||
#define SCOREATTRIB_VIP 4 // ct only
|
||||
|
||||
#define AMD64_STATIONARY_NO 2
|
||||
#define AMD64_STATIONARY_YES 3
|
||||
|
||||
enum CS_Internal_Models {
|
||||
CS_DONTCHANGE = 0,
|
||||
CS_CT_URBAN = 1,
|
||||
@ -167,3 +213,46 @@ CCstrikePlayer g_players[33];
|
||||
bool g_precachedknife = false;
|
||||
bool g_noknives = false;
|
||||
// Globals above
|
||||
|
||||
#define CHECK_ENTITY(x) \
|
||||
if (x < 0 || x > gpGlobals->maxEntities) { \
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Entity out of range (%d)", x); \
|
||||
return 0; \
|
||||
} else { \
|
||||
if (x <= gpGlobals->maxClients) { \
|
||||
if (!MF_IsPlayerIngame(x)) { \
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (not in-game)", x); \
|
||||
return 0; \
|
||||
} \
|
||||
} else { \
|
||||
if (x != 0 && FNullEnt(INDEXENT(x))) { \
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid entity %d", x); \
|
||||
return 0; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
#define CHECK_PLAYER(x) \
|
||||
if (x < 1 || x > gpGlobals->maxClients) { \
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Player out of range (%d)", x); \
|
||||
return 0; \
|
||||
} else { \
|
||||
if (!MF_IsPlayerIngame(x) || FNullEnt(MF_GetPlayerEdict(x))) { \
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d", x); \
|
||||
return 0; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define CHECK_NONPLAYER(x) \
|
||||
if (x < 1 || x <= gpGlobals->maxClients || x > gpGlobals->maxEntities) { \
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Non-player entity %d out of range", x); \
|
||||
return 0; \
|
||||
} else { \
|
||||
if (FNullEnt(INDEXENT(x))) { \
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid non-player entity %d", x); \
|
||||
return 0; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define GETEDICT(n) \
|
||||
((n >= 1 && n <= gpGlobals->maxClients) ? MF_GetPlayerEdict(n) : INDEXENT(n))
|
@ -118,6 +118,8 @@
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\Release/cstrike.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
@ -212,6 +214,9 @@
|
||||
RelativePath=".\moduleconfig.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="..\plugins\include\cstrike.inc">
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
|
177
dlls/csx/plugins/tp/amx_csx_gasnades.sma
Executable file
177
dlls/csx/plugins/tp/amx_csx_gasnades.sma
Executable file
@ -0,0 +1,177 @@
|
||||
/* Gasnades */
|
||||
|
||||
#include <amxmodx>
|
||||
#include <fun>
|
||||
#include <engine>
|
||||
#include <csx>
|
||||
|
||||
new g_Gas
|
||||
//----------------------------------------------------------------------------------------------
|
||||
public plugin_init()
|
||||
{
|
||||
register_plugin("Gasgrenades", "1.3 (CSX)", "RichoDemus/AssKicR/T(+)rget")
|
||||
|
||||
register_cvar("amx_gasnades", "1")
|
||||
register_cvar("amx_gasdmg", "10")
|
||||
register_cvar("amx_gascheck", "3")
|
||||
register_cvar("amx_gasradius", "200")
|
||||
register_cvar("amx_smokegasp", "1")
|
||||
register_cvar("amx_gasobeyFF", "1")
|
||||
|
||||
g_Gas = custom_weapon_add("gasnade",0,"gasnade")
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------
|
||||
public plugin_precache()
|
||||
{
|
||||
precache_sound("player/gasp1.wav")
|
||||
precache_sound("player/gasp2.wav")
|
||||
}
|
||||
|
||||
public gas(par[])
|
||||
{
|
||||
new grenadeid = par[1]
|
||||
new id = par[0]
|
||||
|
||||
if ( !is_valid_ent(grenadeid) )
|
||||
return
|
||||
|
||||
new player[3], inum, Float:temp_grenade[3], grenade[3], players[32]
|
||||
if(get_cvar_num("amx_gasobeyFF") != 1)
|
||||
get_players(players, inum) // Get number of players
|
||||
else{
|
||||
new FFOn = get_cvar_num("mp_friendlyfire")
|
||||
if(FFOn == 0){
|
||||
new team[33]
|
||||
get_user_team(id, team, 32)
|
||||
if(equali(team, "CT"))
|
||||
get_players(players, inum, "ae", "TERRORIST")
|
||||
else
|
||||
get_players(players, inum, "ae", "CT")
|
||||
}
|
||||
else
|
||||
get_players(players, inum) // Get number of players
|
||||
}
|
||||
entity_get_vector(grenadeid, EV_VEC_origin, temp_grenade) // Get the position of the grenade
|
||||
grenade[0] = floatround(temp_grenade[0])
|
||||
grenade[1] = floatround(temp_grenade[1])
|
||||
grenade[2] = floatround(temp_grenade[2])
|
||||
for(new i = 0; i < inum; ++i){ // Loop through all players
|
||||
get_user_origin(players[i],player,0)
|
||||
new distance = get_distance(grenade, player)
|
||||
|
||||
if((distance < get_cvar_num("amx_gasradius"))){ // Check who is standing close
|
||||
if(get_cvar_num("amx_smokegasp") != 0){
|
||||
if(get_cvar_num("amx_gascheck") >= 1){
|
||||
new number = random_num(1, 2)
|
||||
if(is_user_alive(players[i])){
|
||||
switch (number){
|
||||
case 1:emit_sound(players[i], CHAN_VOICE, "player/gasp1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
|
||||
case 2:emit_sound(players[i], CHAN_VOICE, "player/gasp2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
message_begin(MSG_ONE, get_user_msgid("Damage"), {0,0,0}, players[i])
|
||||
write_byte(30) // dmg_save
|
||||
write_byte(30) // dmg_take
|
||||
write_long((1 << 16)) // visibleDamageBits
|
||||
write_coord(grenade[0]) // damageOrigin.x
|
||||
write_coord(grenade[1]) // damageOrigin.y
|
||||
write_coord(grenade[2]) // damageOrigin.z
|
||||
message_end()
|
||||
if(is_user_alive(id))
|
||||
ExtraDamage(players[i], id, get_cvar_num("amx_gasdmg"), "gasgrenade")
|
||||
}
|
||||
}
|
||||
set_task(get_cvar_float("amx_gascheck"), "gas",grenadeid,par,2) // If the grenade still exists we do a new check in get_cvar_num("amx_gascheck") second
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------
|
||||
public grenade_throw(index,greindex,wId){
|
||||
if ( task_exists(greindex) )
|
||||
remove_task(greindex)
|
||||
if( get_cvar_num("amx_gasnades") !=1 || wId != CSW_SMOKEGRENADE )
|
||||
return PLUGIN_CONTINUE
|
||||
if (g_Gas) custom_weapon_shot(g_Gas,index)
|
||||
new par[2]
|
||||
par[0] = index
|
||||
par[1] = greindex
|
||||
set_task(1.5, "gas", greindex,par,2)
|
||||
return PLUGIN_CONTINUE
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------
|
||||
stock ExtraDamage(id, attacker, damage, weaponDescription[])
|
||||
{
|
||||
if(is_user_alive(id))
|
||||
{
|
||||
new userHealth = get_user_health(id)
|
||||
set_user_health(id, userHealth - damage)
|
||||
if (g_Gas)
|
||||
custom_weapon_dmg(g_Gas,attacker,id,damage)
|
||||
|
||||
if(userHealth - damage <= 0)
|
||||
{
|
||||
logKill(attacker, id, weaponDescription)
|
||||
if(get_user_team(id) != get_user_team(attacker))
|
||||
{
|
||||
// The person dying shouldn't get negative credit for this kill (so add it back)
|
||||
set_user_frags(id, get_user_frags(id) + 1)
|
||||
// The killing should get credit for the frag
|
||||
set_user_frags(attacker, get_user_frags(attacker) + 1)
|
||||
}
|
||||
else
|
||||
{
|
||||
// The person dying shouldn't get negative credit for this kill (so add it back)
|
||||
set_user_frags(id, get_user_frags(id) + 1)
|
||||
// The killer killed a teammember or self
|
||||
// Engine gives credit for the kill so let's take away that + 1
|
||||
set_user_frags(attacker, get_user_frags(attacker) - 2)
|
||||
}
|
||||
}else{
|
||||
if(get_cvar_num("mp_logdetail") == 3){
|
||||
logDmg(attacker, id, weaponDescription,"body",damage,userHealth-damage)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------
|
||||
/* Log a kill using standard HL-logging format */
|
||||
stock logKill(attacker, victim, weaponDescription[])
|
||||
{
|
||||
// Save Hummiliation
|
||||
new namea[24], namev[24], authida[20], authidv[20], teama[10], teamv[10]
|
||||
|
||||
// Info On Attacker
|
||||
get_user_name(attacker, namea, 23)
|
||||
get_user_team(attacker, teama, 9)
|
||||
get_user_authid(attacker, authida, 19)
|
||||
// Info On Victim
|
||||
get_user_name(victim, namev, 23)
|
||||
get_user_team(victim, teamv, 9)
|
||||
get_user_authid(victim, authidv, 19)
|
||||
// Log This Kill
|
||||
log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
|
||||
namea, get_user_userid(attacker), authida, teama, namev, get_user_userid(victim), authidv, teamv, weaponDescription)
|
||||
}
|
||||
|
||||
/* Log damage using standard HL-logging format */
|
||||
stock logDmg(attacker, victim, weaponDescription[],hit[],damage,health)
|
||||
{
|
||||
// Save Hummiliation
|
||||
new namea[24], namev[24], authida[20], authidv[20], teama[10], teamv[10]
|
||||
|
||||
// Info On Attacker
|
||||
get_user_name(attacker, namea, 23)
|
||||
get_user_team(attacker, teama, 9)
|
||||
get_user_authid(attacker, authida, 19)
|
||||
// Info On Victim
|
||||
get_user_name(victim, namev, 23)
|
||||
get_user_team(victim, teamv, 9)
|
||||
get_user_authid(victim, authidv, 19)
|
||||
// Log This Damage
|
||||
log_message("^"%s<%d><%s><%s>^" attacked ^"%s<%d><%s><%s>^" with ^"%s^" (hit ^"%s^") (damage ^"%d^") (health ^"%d^")",
|
||||
namea,get_user_userid(attacker),authida,teama,namev,get_user_userid(victim),authidv,teamv,weaponDescription,hit,damage,health)
|
||||
}
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
299
dlls/csx/source/CMisc.cpp
Executable file
299
dlls/csx/source/CMisc.cpp
Executable file
@ -0,0 +1,299 @@
|
||||
|
||||
|
||||
#include "CMisc.h"
|
||||
#include "rank.h"
|
||||
|
||||
// *****************************************************
|
||||
// class Grenades
|
||||
// *****************************************************
|
||||
void Grenades::put( edict_t* grenade, float time, int type, CPlayer* player )
|
||||
{
|
||||
Obj* a = new Obj;
|
||||
if ( a == 0 ) return;
|
||||
a->player = player;
|
||||
a->grenade = grenade;
|
||||
a->time = gpGlobals->time + time;
|
||||
a->type = type;
|
||||
a->prev = 0;
|
||||
a->next = head;
|
||||
if ( head ) head->prev = a;
|
||||
head = a;
|
||||
}
|
||||
|
||||
bool Grenades::find( edict_t* enemy, CPlayer** p, int* type )
|
||||
{
|
||||
bool found = false;
|
||||
Obj* a = head;
|
||||
while ( a ){
|
||||
if ( a->time > gpGlobals->time ) {
|
||||
if ( a->grenade == enemy ) {
|
||||
found = true;
|
||||
*p = a->player;
|
||||
*type = a->type;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Obj* next = a->next;
|
||||
if (a->prev) a->prev->next = next;
|
||||
else head = next;
|
||||
if (next) next->prev = a->prev;
|
||||
delete a;
|
||||
a = next;
|
||||
continue;
|
||||
}
|
||||
a = a->next;
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Grenades::clear()
|
||||
{
|
||||
while(head){
|
||||
Obj* a = head->next;
|
||||
delete head;
|
||||
head = a;
|
||||
}
|
||||
}
|
||||
|
||||
// *****************************************************
|
||||
// class CPlayer
|
||||
// *****************************************************
|
||||
|
||||
void CPlayer::Disconnect(){
|
||||
|
||||
if ( ignoreBots(pEdict) || !isModuleActive() ) // ignore if he is bot and bots rank is disabled or module is paused
|
||||
return;
|
||||
|
||||
rank->updatePosition( &life );
|
||||
rank = 0;
|
||||
}
|
||||
|
||||
void CPlayer::PutInServer(){
|
||||
|
||||
if ( ignoreBots(pEdict) )
|
||||
return;
|
||||
|
||||
restartStats();
|
||||
const char* name = STRING(pEdict->v.netname);
|
||||
const char* unique = name;
|
||||
switch((int)csstats_rank->value) {
|
||||
case 1:
|
||||
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
|
||||
unique = name; // failed to get authid
|
||||
break;
|
||||
case 2:
|
||||
unique = ip;
|
||||
}
|
||||
rank = g_rank.findEntryInRank( unique , name );
|
||||
}
|
||||
|
||||
void CPlayer::Connect(const char* address ){
|
||||
bot = IsBot();
|
||||
strcpy(ip,address);
|
||||
rank = 0;
|
||||
clearStats = 0.0f;
|
||||
}
|
||||
|
||||
void CPlayer::restartStats(bool all)
|
||||
{
|
||||
if ( all ) memset(weapons,0,sizeof(weapons));
|
||||
memset(weaponsRnd,0,sizeof(weaponsRnd)); //DEC-Weapon (Round) stats
|
||||
memset(attackers,0,sizeof(attackers));
|
||||
memset(victims,0,sizeof(victims));
|
||||
memset(&life,0,sizeof(life));
|
||||
}
|
||||
|
||||
void CPlayer::Init( int pi, edict_t* pe )
|
||||
{
|
||||
pEdict = pe;
|
||||
index = pi;
|
||||
current = 0;
|
||||
clearStats = 0.0f;
|
||||
rank = 0;
|
||||
}
|
||||
|
||||
void CPlayer::saveKill(CPlayer* pVictim, int wweapon, int hhs, int ttk){
|
||||
|
||||
if ( ignoreBots(pEdict,pVictim->pEdict) )
|
||||
return;
|
||||
|
||||
if ( pVictim->index == index ){ // killed self
|
||||
pVictim->weapons[0].deaths++;
|
||||
pVictim->life.deaths++;
|
||||
pVictim->weaponsRnd[0].deaths++; // DEC-Weapon (round) stats
|
||||
return;
|
||||
}
|
||||
|
||||
pVictim->attackers[index].name = weaponData[wweapon].name;
|
||||
pVictim->attackers[index].kills++;
|
||||
pVictim->attackers[index].hs += hhs;
|
||||
pVictim->attackers[index].tks += ttk;
|
||||
pVictim->attackers[0].kills++;
|
||||
pVictim->attackers[0].hs += hhs;
|
||||
pVictim->attackers[0].tks += ttk;
|
||||
pVictim->weapons[pVictim->current].deaths++;
|
||||
pVictim->weapons[0].deaths++;
|
||||
pVictim->life.deaths++;
|
||||
|
||||
|
||||
pVictim->weaponsRnd[pVictim->current].deaths++; // DEC-Weapon (round) stats
|
||||
pVictim->weaponsRnd[0].deaths++; // DEC-Weapon (round) stats
|
||||
|
||||
int vi = pVictim->index;
|
||||
victims[vi].name = weaponData[wweapon].name;
|
||||
victims[vi].deaths++;
|
||||
victims[vi].hs += hhs;
|
||||
victims[vi].tks += ttk;
|
||||
victims[0].deaths++;
|
||||
victims[0].hs += hhs;
|
||||
victims[0].tks += ttk;
|
||||
|
||||
weaponsRnd[wweapon].kills++; // DEC-Weapon (round) stats
|
||||
weaponsRnd[wweapon].hs += hhs; // DEC-Weapon (round) stats
|
||||
weaponsRnd[wweapon].tks += ttk; // DEC-Weapon (round) stats
|
||||
weaponsRnd[0].kills++; // DEC-Weapon (round) stats
|
||||
weaponsRnd[0].hs += hhs; // DEC-Weapon (round) stats
|
||||
weaponsRnd[0].tks += ttk; // DEC-Weapon (round) stats
|
||||
|
||||
weapons[wweapon].kills++;
|
||||
weapons[wweapon].hs += hhs;
|
||||
weapons[wweapon].tks += ttk;
|
||||
weapons[0].kills++;
|
||||
weapons[0].hs += hhs;
|
||||
weapons[0].tks += ttk;
|
||||
life.kills++;
|
||||
life.hs += hhs;
|
||||
life.tks += ttk;
|
||||
}
|
||||
|
||||
void CPlayer::saveHit(CPlayer* pVictim, int wweapon, int ddamage, int bbody){
|
||||
|
||||
if ( ignoreBots(pEdict,pVictim->pEdict) )
|
||||
return;
|
||||
|
||||
if ( index == pVictim->index ) return;
|
||||
|
||||
pVictim->attackers[index].hits++;
|
||||
pVictim->attackers[index].damage += ddamage;
|
||||
pVictim->attackers[index].bodyHits[bbody]++;
|
||||
pVictim->attackers[0].hits++;
|
||||
pVictim->attackers[0].damage += ddamage;
|
||||
pVictim->attackers[0].bodyHits[bbody]++;
|
||||
|
||||
|
||||
int vi = pVictim->index;
|
||||
victims[vi].hits++;
|
||||
victims[vi].damage += ddamage;
|
||||
victims[vi].bodyHits[bbody]++;
|
||||
victims[0].hits++;
|
||||
victims[0].damage += ddamage;
|
||||
victims[0].bodyHits[bbody]++;
|
||||
|
||||
weaponsRnd[wweapon].hits++; // DEC-Weapon (round) stats
|
||||
weaponsRnd[wweapon].damage += ddamage; // DEC-Weapon (round) stats
|
||||
weaponsRnd[wweapon].bodyHits[bbody]++; // DEC-Weapon (round) stats
|
||||
weaponsRnd[0].hits++; // DEC-Weapon (round) stats
|
||||
weaponsRnd[0].damage += ddamage; // DEC-Weapon (round) stats
|
||||
weaponsRnd[0].bodyHits[bbody]++; // DEC-Weapon (round) stats
|
||||
|
||||
weapons[wweapon].hits++;
|
||||
weapons[wweapon].damage += ddamage;
|
||||
weapons[wweapon].bodyHits[bbody]++;
|
||||
weapons[0].hits++;
|
||||
weapons[0].damage += ddamage;
|
||||
weapons[0].bodyHits[bbody]++;
|
||||
|
||||
life.hits++;
|
||||
life.damage += ddamage;
|
||||
life.bodyHits[bbody]++;
|
||||
}
|
||||
|
||||
|
||||
void CPlayer::saveShot(int weapon){
|
||||
|
||||
if ( ignoreBots(pEdict) )
|
||||
return;
|
||||
|
||||
victims[0].shots++;
|
||||
weapons[weapon].shots++;
|
||||
weapons[0].shots++;
|
||||
life.shots++;
|
||||
weaponsRnd[weapon].shots++; // DEC-Weapon (round) stats
|
||||
weaponsRnd[0].shots++; // DEC-Weapon (round) stats
|
||||
}
|
||||
|
||||
|
||||
void CPlayer::saveBPlant(){
|
||||
life.bPlants++;
|
||||
}
|
||||
|
||||
void CPlayer::saveBExplode(){
|
||||
life.bExplosions++;
|
||||
}
|
||||
|
||||
void CPlayer::saveBDefusing(){
|
||||
life.bDefusions++;
|
||||
}
|
||||
|
||||
void CPlayer::saveBDefused(){
|
||||
life.bDefused++;
|
||||
}
|
||||
|
||||
|
||||
// *****************************************************
|
||||
// class Forward
|
||||
// *****************************************************
|
||||
|
||||
void Forward::put( AMX *a , int i ){
|
||||
head = new AmxCall( a, i , head );
|
||||
}
|
||||
|
||||
|
||||
void Forward::clear(){
|
||||
while ( head ) {
|
||||
AmxCall* a = head->next;
|
||||
delete head;
|
||||
head = a;
|
||||
}
|
||||
}
|
||||
|
||||
void Forward::exec(int p1,int p2,int p3,int p4,int p5,int p6){
|
||||
AmxCall* a = head;
|
||||
while ( a ){
|
||||
MF_AmxExec(a->amx, NULL, a->iFunctionIdx, 6,p1, p2, p3, p4, p5, p6);
|
||||
a = a->next;
|
||||
}
|
||||
}
|
||||
|
||||
void Forward::exec(int p1,int p2,int p3,int p4,int p5){
|
||||
AmxCall* a = head;
|
||||
while ( a ){
|
||||
MF_AmxExec(a->amx, NULL, a->iFunctionIdx, 5,p1, p2, p3, p4, p5);
|
||||
a = a->next;
|
||||
}
|
||||
}
|
||||
|
||||
void Forward::exec(int p1,int p2){
|
||||
AmxCall* a = head;
|
||||
while ( a ){
|
||||
MF_AmxExec(a->amx, NULL, a->iFunctionIdx, 2,p1, p2);
|
||||
a = a->next;
|
||||
}
|
||||
}
|
||||
|
||||
// *****************************************************
|
||||
|
||||
bool ignoreBots (edict_t *pEnt, edict_t *pOther){
|
||||
if ( !rankBots && ( pEnt->v.flags & FL_FAKECLIENT || ( pOther && pOther->v.flags & FL_FAKECLIENT ) ) )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isModuleActive(){
|
||||
if ( !(int)CVAR_GET_FLOAT("csstats_pause") )
|
||||
return true;
|
||||
return false;
|
||||
}
|
116
dlls/csx/source/CMisc.h
Executable file
116
dlls/csx/source/CMisc.h
Executable file
@ -0,0 +1,116 @@
|
||||
|
||||
|
||||
#ifndef CMISC_H
|
||||
#define CMISC_H
|
||||
|
||||
#include "amxxmodule.h"
|
||||
#include "CRank.h"
|
||||
|
||||
#define MAX_CWEAPONS 6
|
||||
|
||||
#define CSW_HEGRENADE 4
|
||||
#define CSW_C4 6
|
||||
#define CSW_SMOKEGRENADE 9
|
||||
#define CSW_FLASHBANG 25
|
||||
|
||||
// *****************************************************
|
||||
// class CPlayer
|
||||
// *****************************************************
|
||||
|
||||
struct CPlayer {
|
||||
edict_t* pEdict;
|
||||
char ip[32];
|
||||
int index;
|
||||
int aiming;
|
||||
int current;
|
||||
bool bot;
|
||||
float clearStats;
|
||||
RankSystem::RankStats* rank;
|
||||
|
||||
struct PlayerWeapon : Stats {
|
||||
const char* name;
|
||||
int ammo;
|
||||
int clip;
|
||||
};
|
||||
|
||||
PlayerWeapon weapons[MAX_WEAPONS+MAX_CWEAPONS];
|
||||
PlayerWeapon attackers[33];
|
||||
PlayerWeapon victims[33];
|
||||
Stats weaponsRnd[MAX_WEAPONS+MAX_CWEAPONS]; // DEC-Weapon (Round) stats
|
||||
Stats life;
|
||||
|
||||
int teamId;
|
||||
|
||||
void Init( int pi, edict_t* pe );
|
||||
void Connect(const char* ip );
|
||||
void PutInServer();
|
||||
void Disconnect();
|
||||
void saveKill(CPlayer* pVictim, int weapon, int hs, int tk);
|
||||
void saveHit(CPlayer* pVictim, int weapon, int damage, int aiming);
|
||||
void saveShot(int weapon);
|
||||
|
||||
void saveBPlant();
|
||||
void saveBExplode();
|
||||
void saveBDefusing();
|
||||
void saveBDefused();
|
||||
|
||||
void restartStats(bool all = true);
|
||||
inline bool IsBot(){
|
||||
const char* auth= (*g_engfuncs.pfnGetPlayerAuthId)(pEdict);
|
||||
return ( auth && !strcmp( auth , "BOT" ) );
|
||||
}
|
||||
inline bool IsAlive(){
|
||||
return ((pEdict->v.deadflag==DEAD_NO)&&(pEdict->v.health>0));
|
||||
}
|
||||
};
|
||||
|
||||
// *****************************************************
|
||||
// class Grenades
|
||||
// *****************************************************
|
||||
|
||||
class Grenades
|
||||
{
|
||||
struct Obj
|
||||
{
|
||||
CPlayer* player;
|
||||
edict_t* grenade;
|
||||
float time;
|
||||
int type;
|
||||
Obj* next;
|
||||
Obj* prev;
|
||||
} *head;
|
||||
|
||||
public:
|
||||
Grenades() { head = 0; }
|
||||
~Grenades() { clear(); }
|
||||
void put( edict_t* grenade, float time, int type, CPlayer* player );
|
||||
bool find( edict_t* enemy, CPlayer** p, int* type );
|
||||
void clear();
|
||||
};
|
||||
|
||||
// *****************************************************
|
||||
// class Forward
|
||||
// *****************************************************
|
||||
|
||||
class Forward
|
||||
{
|
||||
struct AmxCall {
|
||||
AMX *amx;
|
||||
int iFunctionIdx;
|
||||
AmxCall* next;
|
||||
AmxCall( AMX *a , int i, AmxCall* n ): amx(a), iFunctionIdx(i), next(n) {}
|
||||
} *head;
|
||||
public:
|
||||
Forward() { head = 0; }
|
||||
~Forward() { clear(); }
|
||||
void clear();
|
||||
void put( AMX *a , int i );
|
||||
void exec(int p1,int p2,int p3,int p4,int p5,int p6);
|
||||
void exec(int p1,int p2,int p3,int p4,int p5);
|
||||
void exec(int p1,int p2);
|
||||
};
|
||||
|
||||
#endif // CMISC_H
|
||||
|
||||
|
||||
|
308
dlls/csx/source/CRank.cpp
Executable file
308
dlls/csx/source/CRank.cpp
Executable file
@ -0,0 +1,308 @@
|
||||
|
||||
|
||||
#include "amxxmodule.h"
|
||||
#include "CRank.h"
|
||||
#include "rank.h"
|
||||
|
||||
// *****************************************************
|
||||
// class Stats
|
||||
// *****************************************************
|
||||
Stats::Stats(){
|
||||
hits = shots = damage = hs = tks = kills = deaths = bDefusions = bDefused = bPlants = bExplosions = 0;
|
||||
memset( bodyHits , 0 ,sizeof( bodyHits ) );
|
||||
}
|
||||
void Stats::commit(Stats* a){
|
||||
hits += a->hits;
|
||||
shots += a->shots;
|
||||
damage += a->damage;
|
||||
hs += a->hs;
|
||||
tks += a->tks;
|
||||
kills += a->kills;
|
||||
deaths += a->deaths;
|
||||
|
||||
bDefusions += a->bDefusions;
|
||||
bDefused += a->bDefused;
|
||||
bPlants += a->bPlants;
|
||||
bExplosions += a->bExplosions;
|
||||
|
||||
for(int i = 1; i < 8; ++i)
|
||||
bodyHits[i] += a->bodyHits[i];
|
||||
}
|
||||
|
||||
|
||||
// *****************************************************
|
||||
// class RankSystem
|
||||
// *****************************************************
|
||||
RankSystem::RankStats::RankStats( const char* uu, const char* nn, RankSystem* pp ) {
|
||||
name = 0;
|
||||
namelen = 0;
|
||||
unique = 0;
|
||||
uniquelen = 0;
|
||||
score = 0;
|
||||
parent = pp;
|
||||
id = ++parent->rankNum;
|
||||
next = prev = 0;
|
||||
setName( nn );
|
||||
setUnique( uu );
|
||||
}
|
||||
|
||||
RankSystem::RankStats::~RankStats() {
|
||||
delete[] name;
|
||||
delete[] unique;
|
||||
--parent->rankNum;
|
||||
}
|
||||
|
||||
void RankSystem::RankStats::setName( const char* nn ) {
|
||||
delete[] name;
|
||||
namelen = strlen(nn) + 1;
|
||||
name = new char[namelen];
|
||||
if ( name )
|
||||
strcpy( name , nn );
|
||||
else
|
||||
namelen = 0;
|
||||
}
|
||||
|
||||
void RankSystem::RankStats::setUnique( const char* nn ) {
|
||||
delete[] unique;
|
||||
uniquelen = strlen(nn) + 1;
|
||||
unique = new char[uniquelen];
|
||||
if ( unique )
|
||||
strcpy( unique , nn );
|
||||
else
|
||||
uniquelen = 0;
|
||||
}
|
||||
|
||||
RankSystem::RankSystem() {
|
||||
head = 0;
|
||||
tail = 0;
|
||||
rankNum = 0;
|
||||
calc.code = 0;
|
||||
}
|
||||
|
||||
RankSystem::~RankSystem() {
|
||||
clear();
|
||||
}
|
||||
|
||||
void RankSystem::put_before( RankStats* a, RankStats* ptr ){
|
||||
a->next = ptr;
|
||||
if ( ptr ){
|
||||
a->prev = ptr->prev;
|
||||
ptr->prev = a;
|
||||
}
|
||||
else{
|
||||
a->prev = head;
|
||||
head = a;
|
||||
}
|
||||
if ( a->prev ) a->prev->next = a;
|
||||
else tail = a;
|
||||
}
|
||||
|
||||
void RankSystem::put_after( RankStats* a, RankStats* ptr ) {
|
||||
a->prev = ptr;
|
||||
if ( ptr ){
|
||||
a->next = ptr->next;
|
||||
ptr->next = a;
|
||||
}
|
||||
else{
|
||||
a->next = tail;
|
||||
tail = a;
|
||||
}
|
||||
if ( a->next ) a->next->prev = a;
|
||||
else head = a;
|
||||
}
|
||||
|
||||
void RankSystem::unlink( RankStats* ptr ){
|
||||
if (ptr->prev) ptr->prev->next = ptr->next;
|
||||
else tail = ptr->next;
|
||||
if (ptr->next) ptr->next->prev = ptr->prev;
|
||||
else head = ptr->prev;
|
||||
}
|
||||
|
||||
void RankSystem::clear(){
|
||||
while( tail ){
|
||||
head = tail->next;
|
||||
delete tail;
|
||||
tail = head;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool RankSystem::loadCalc(const char* filename, char* error)
|
||||
{
|
||||
if ((MF_LoadAmxScript(&calc.amx,&calc.code,filename,error,0)!=AMX_ERR_NONE)||
|
||||
(MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr1, &calc.physAddr1)!=AMX_ERR_NONE)||
|
||||
(MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr2, &calc.physAddr2)!=AMX_ERR_NONE)||
|
||||
(MF_AmxFindPublic(&calc.amx,"get_score",&calc.func)!=AMX_ERR_NONE)){
|
||||
LOG_CONSOLE( PLID, "Couldn't load plugin (file \"%s\")",filename);
|
||||
MF_UnloadAmxScript(&calc.amx, &calc.code);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void RankSystem::unloadCalc()
|
||||
{
|
||||
MF_UnloadAmxScript(&calc.amx , &calc.code);
|
||||
}
|
||||
|
||||
RankSystem::RankStats* RankSystem::findEntryInRank(const char* unique, const char* name )
|
||||
{
|
||||
RankStats* a = head;
|
||||
|
||||
while ( a )
|
||||
{
|
||||
if ( strcmp( a->getUnique() ,unique ) == 0 )
|
||||
return a;
|
||||
|
||||
a = a->prev;
|
||||
}
|
||||
a = new RankStats( unique ,name,this );
|
||||
if ( a == 0 ) return 0;
|
||||
put_after( a , 0 );
|
||||
return a;
|
||||
}
|
||||
|
||||
void RankSystem::updatePos( RankStats* rr , Stats* s )
|
||||
{
|
||||
rr->addStats( s );
|
||||
if ( calc.code ) {
|
||||
calc.physAddr1[0] = rr->kills;
|
||||
calc.physAddr1[1] = rr->deaths;
|
||||
calc.physAddr1[2] = rr->hs;
|
||||
calc.physAddr1[3] = rr->tks;
|
||||
calc.physAddr1[4] = rr->shots;
|
||||
calc.physAddr1[5] = rr->hits;
|
||||
calc.physAddr1[6] = rr->damage;
|
||||
|
||||
calc.physAddr1[7] = rr->bDefusions;
|
||||
calc.physAddr1[8] = rr->bDefused;
|
||||
calc.physAddr1[9] = rr->bPlants;
|
||||
calc.physAddr1[10] = rr->bExplosions;
|
||||
|
||||
for(int i = 1; i < 8; ++i)
|
||||
calc.physAddr2[i] = rr->bodyHits[i];
|
||||
cell result = 0;
|
||||
int err;
|
||||
if ((err = MF_AmxExec(&calc.amx,&result, calc.func ,2,calc.amxAddr1,calc.amxAddr2 )) != AMX_ERR_NONE)
|
||||
LOG_CONSOLE( PLID, "Run time error %d on line %ld (plugin \"%s\")", err,calc.amx.curline,LOCALINFO("csstats_score"));
|
||||
rr->score = result;
|
||||
}
|
||||
else rr->score = rr->kills - rr->deaths;
|
||||
|
||||
|
||||
RankStats* aa = rr->next;
|
||||
while ( aa && (aa->score <= rr->score) ) { // try to nominate
|
||||
rr->goUp();
|
||||
aa->goDown();
|
||||
aa = aa->next; // go to next rank
|
||||
}
|
||||
if ( aa != rr->next )
|
||||
{
|
||||
unlink( rr );
|
||||
put_before( rr, aa );
|
||||
}
|
||||
else
|
||||
{
|
||||
aa = rr->prev;
|
||||
while ( aa && (aa->score > rr->score) ) { // go down
|
||||
rr->goDown();
|
||||
aa->goUp();
|
||||
aa = aa->prev; // go to prev rank
|
||||
}
|
||||
if ( aa != rr->prev ){
|
||||
unlink( rr );
|
||||
put_after( rr, aa );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void RankSystem::loadRank( const char* filename )
|
||||
{
|
||||
FILE *bfp = fopen( filename , "rb" );
|
||||
|
||||
if ( !bfp ) return;
|
||||
|
||||
short int i = 0;
|
||||
fread(&i, 1 , sizeof(short int) , bfp);
|
||||
|
||||
if (i == RANK_VERSION)
|
||||
{
|
||||
Stats d;
|
||||
char unique[64], name[64];
|
||||
fread(&i , 1, sizeof(short int), bfp);
|
||||
|
||||
while( i )
|
||||
{
|
||||
fread(name , i,sizeof(char) , bfp);
|
||||
fread(&i , 1, sizeof(short int), bfp);
|
||||
fread(unique , i,sizeof(char) , bfp);
|
||||
fread(&d.tks, 1,sizeof(int), bfp);
|
||||
fread(&d.damage, 1,sizeof(int), bfp);
|
||||
fread(&d.deaths, 1,sizeof(int), bfp);
|
||||
fread(&d.kills, 1,sizeof(int), bfp);
|
||||
fread(&d.shots, 1,sizeof(int), bfp);
|
||||
fread(&d.hits, 1,sizeof(int), bfp);
|
||||
fread(&d.hs, 1,sizeof(int), bfp);
|
||||
|
||||
fread(&d.bDefusions, 1,sizeof(int), bfp);
|
||||
fread(&d.bDefused, 1,sizeof(int), bfp);
|
||||
fread(&d.bPlants, 1,sizeof(int), bfp);
|
||||
fread(&d.bExplosions, 1,sizeof(int), bfp);
|
||||
|
||||
fread(d.bodyHits, 1,sizeof(d.bodyHits), bfp);
|
||||
fread(&i , 1, sizeof(short int), bfp);
|
||||
|
||||
RankSystem::RankStats* a = findEntryInRank( unique , name );
|
||||
|
||||
if ( a ) a->updatePosition( &d );
|
||||
}
|
||||
}
|
||||
fclose(bfp);
|
||||
}
|
||||
|
||||
void RankSystem::saveRank( const char* filename )
|
||||
{
|
||||
FILE *bfp = fopen(filename, "wb");
|
||||
|
||||
if ( !bfp ) return;
|
||||
|
||||
short int i = RANK_VERSION;
|
||||
|
||||
fwrite(&i, 1, sizeof(short int) , bfp);
|
||||
|
||||
RankSystem::iterator a = front();
|
||||
|
||||
while ( a )
|
||||
{
|
||||
if ( (*a).score != (1<<31) ) // score must be different than mincell
|
||||
{
|
||||
fwrite( &(*a).namelen , 1, sizeof(short int), bfp);
|
||||
fwrite( (*a).name , (*a).namelen , sizeof(char) , bfp);
|
||||
fwrite( &(*a).uniquelen , 1, sizeof(short int), bfp);
|
||||
fwrite( (*a).unique , (*a).uniquelen , sizeof(char) , bfp);
|
||||
fwrite( &(*a).tks, 1, sizeof(int), bfp);
|
||||
fwrite( &(*a).damage, 1, sizeof(int), bfp);
|
||||
fwrite( &(*a).deaths, 1, sizeof(int), bfp);
|
||||
fwrite( &(*a).kills, 1, sizeof(int), bfp);
|
||||
fwrite( &(*a).shots, 1, sizeof(int), bfp);
|
||||
fwrite( &(*a).hits, 1, sizeof(int), bfp);
|
||||
fwrite( &(*a).hs, 1, sizeof(int), bfp);
|
||||
|
||||
fwrite( &(*a).bDefusions, 1, sizeof(int), bfp);
|
||||
fwrite( &(*a).bDefused, 1, sizeof(int), bfp);
|
||||
fwrite( &(*a).bPlants, 1, sizeof(int), bfp);
|
||||
fwrite( &(*a).bExplosions, 1, sizeof(int), bfp);
|
||||
|
||||
fwrite( (*a).bodyHits, 1, sizeof((*a).bodyHits), bfp);
|
||||
}
|
||||
|
||||
--a;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
fwrite( &i , 1, sizeof(short int), bfp); // null terminator
|
||||
|
||||
fclose(bfp);
|
||||
}
|
122
dlls/csx/source/CRank.h
Executable file
122
dlls/csx/source/CRank.h
Executable file
@ -0,0 +1,122 @@
|
||||
|
||||
|
||||
#ifndef CRANK_H
|
||||
#define CRANK_H
|
||||
|
||||
#define RANK_VERSION 11
|
||||
|
||||
#include "amxxmodule.h"
|
||||
|
||||
// *****************************************************
|
||||
// class Stats
|
||||
// *****************************************************
|
||||
|
||||
struct Stats {
|
||||
int hits;
|
||||
int shots;
|
||||
int damage;
|
||||
int hs;
|
||||
int tks;
|
||||
int kills;
|
||||
int deaths;
|
||||
int bodyHits[9]; ////////////////////
|
||||
|
||||
// SiDLuke start
|
||||
int bPlants;
|
||||
int bExplosions;
|
||||
int bDefusions;
|
||||
int bDefused;
|
||||
// SiDLuke end :D
|
||||
|
||||
Stats();
|
||||
void commit(Stats* a);
|
||||
};
|
||||
|
||||
// *****************************************************
|
||||
// class RankSystem
|
||||
// *****************************************************
|
||||
|
||||
class RankSystem
|
||||
{
|
||||
public:
|
||||
class RankStats;
|
||||
friend class RankStats;
|
||||
class iterator;
|
||||
|
||||
class RankStats : public Stats {
|
||||
friend class RankSystem;
|
||||
friend class iterator;
|
||||
RankSystem* parent;
|
||||
RankStats* next;
|
||||
RankStats* prev;
|
||||
char* unique;
|
||||
short int uniquelen;
|
||||
char* name;
|
||||
short int namelen;
|
||||
int score;
|
||||
int id;
|
||||
RankStats( const char* uu, const char* nn, RankSystem* pp );
|
||||
~RankStats();
|
||||
void setUnique( const char* nn );
|
||||
inline void goDown() {++id;}
|
||||
inline void goUp() {--id;}
|
||||
inline void addStats(Stats* a) { commit( a ); }
|
||||
public:
|
||||
void setName( const char* nn );
|
||||
inline const char* getName() const { return name ? name : ""; }
|
||||
inline const char* getUnique() const { return unique ? unique : ""; }
|
||||
inline int getPosition() const { return id; }
|
||||
inline void updatePosition( Stats* points ) {
|
||||
parent->updatePos( this , points );
|
||||
}
|
||||
};
|
||||
|
||||
private:
|
||||
RankStats* head;
|
||||
RankStats* tail;
|
||||
int rankNum;
|
||||
|
||||
struct scoreCalc{
|
||||
AMX amx;
|
||||
void* code;
|
||||
int func;
|
||||
cell amxAddr1;
|
||||
cell amxAddr2;
|
||||
cell *physAddr1;
|
||||
cell *physAddr2;
|
||||
} calc;
|
||||
|
||||
void put_before( RankStats* a, RankStats* ptr );
|
||||
void put_after( RankStats* a, RankStats* ptr );
|
||||
void unlink( RankStats* ptr );
|
||||
void updatePos( RankStats* r , Stats* s );
|
||||
|
||||
public:
|
||||
|
||||
RankSystem();
|
||||
~RankSystem();
|
||||
|
||||
void saveRank( const char* filename );
|
||||
void loadRank( const char* filename );
|
||||
RankStats* findEntryInRank(const char* unique, const char* name );
|
||||
bool loadCalc(const char* filename, char* error);
|
||||
inline int getRankNum( ) const { return rankNum; }
|
||||
void clear();
|
||||
void unloadCalc();
|
||||
|
||||
class iterator {
|
||||
RankStats* ptr;
|
||||
public:
|
||||
iterator(RankStats* a): ptr(a){}
|
||||
inline iterator& operator--() { ptr = ptr->prev; return *this;}
|
||||
inline iterator& operator++() { ptr = ptr->next; return *this; }
|
||||
inline RankStats& operator*() { return *ptr;}
|
||||
operator bool () { return (ptr != 0); }
|
||||
};
|
||||
|
||||
inline iterator front() { return iterator(head); }
|
||||
inline iterator begin() { return iterator(tail); }
|
||||
};
|
||||
|
||||
|
||||
#endif
|
102
dlls/csx/source/Makefile
Executable file
102
dlls/csx/source/Makefile
Executable file
@ -0,0 +1,102 @@
|
||||
MODNAME = csx_amxx
|
||||
SRCFILES = amxxmodule.cpp CMisc.cpp CRank.cpp meta_api.cpp rank.cpp usermsg.cpp
|
||||
|
||||
EXTRA_LIBS_LINUX =
|
||||
EXTRA_LIBS_WIN32 =
|
||||
EXTRA_LIBDIRS_LINUX = -Lextra/lib_linux
|
||||
EXTRA_LIBDIRS_WIN32 = -Lextra/lib_win32
|
||||
|
||||
EXTRA_INCLUDEDIRS = -Iextra/include -I../amx
|
||||
|
||||
EXTRA_FLAGS = -Dstrcmpi=strcasecmp
|
||||
|
||||
AMXDIR=../amx
|
||||
SDKSRC=../sdk
|
||||
METADIR=../metamod
|
||||
|
||||
OBJDIR_LINUX=obj.linux
|
||||
OBJDIR_WIN32=obj.win32
|
||||
SRCDIR=.
|
||||
|
||||
ifdef windir
|
||||
OS=WIN32
|
||||
else
|
||||
OS=LINUX
|
||||
endif
|
||||
|
||||
CC_LINUX=gcc
|
||||
ifeq "$(OS)" "WIN32"
|
||||
CC_WIN32=gcc
|
||||
LD_WINDLL=dllwrap
|
||||
DEFAULT=win32
|
||||
CLEAN=clean_win32
|
||||
else
|
||||
CC_WIN32=/usr/local/cross-tools/i386-mingw32msvc/bin/gcc
|
||||
LD_WINDLL=/usr/local/cross-tools/bin/i386-mingw32msvc-dllwrap
|
||||
DEFAULT=linux win32
|
||||
CLEAN=clean_both
|
||||
endif
|
||||
|
||||
|
||||
LIBFILE_LINUX = $(MODNAME)_i386.so
|
||||
LIBFILE_WIN32 = $(MODNAME).dll
|
||||
TARGET_LINUX = $(OBJDIR_LINUX)/$(LIBFILE_LINUX)
|
||||
TARGET_WIN32 = $(OBJDIR_WIN32)/$(LIBFILE_WIN32)
|
||||
|
||||
FILES_ALL = *.cpp *.h [A-Z]* *.rc
|
||||
ifeq "$(OS)" "LINUX"
|
||||
ASRCFILES := $(shell ls -t $(SRCFILES))
|
||||
else
|
||||
ASRCFILES := $(shell dir /b)
|
||||
endif
|
||||
OBJ_LINUX := $(SRCFILES:%.cpp=$(OBJDIR_LINUX)/%.o)
|
||||
OBJ_WIN32 := $(SRCFILES:%.cpp=$(OBJDIR_WIN32)/%.o)
|
||||
|
||||
CCOPT = -march=i586 -O6 -ffast-math -funroll-loops \
|
||||
-fomit-frame-pointer -fexpensive-optimizations -malign-loops=2 \
|
||||
-malign-jumps=2 -malign-functions=2 -s -DNDEBUG
|
||||
|
||||
INCLUDEDIRS=-I../curl/include -I$(SRCDIR) -I$(AMXDIR) -I$(METADIR) -I$(SDKSRC)/engine -I$(SDKSRC)/common -I$(SDKSRC)/dlls -I$(SDKSRC) $(EXTRA_INCLUDEDIRS)
|
||||
CFLAGS=-Wall -Wno-unknown-pragmas
|
||||
ODEF = -DOPT_TYPE=\"optimized\"
|
||||
CFLAGS:=$(CCOPT) $(CFLAGS) $(ODEF) $(EXTRA_FLAGS)
|
||||
|
||||
DO_CC_LINUX=$(CC_LINUX) $(CFLAGS) -fPIC $(INCLUDEDIRS) -o $@ -c $<
|
||||
DO_CC_WIN32=$(CC_WIN32) $(CFLAGS) $(INCLUDEDIRS) -o $@ -c $<
|
||||
LINK_LINUX=$(CC_LINUX) $(CFLAGS) -shared -ldl -lm $(OBJ_LINUX) $(EXTRA_LIBDIRS_LINUX) $(EXTRA_LIBS_LINUX) -o $@
|
||||
LINK_WIN32=$(LD_WINDLL) -mwindows --add-stdcall-alias $(OBJ_WIN32) $(EXTRA_LIBDIRS_WIN32) $(EXTRA_LIBS_WIN32) -o $@
|
||||
|
||||
$(OBJDIR_LINUX)/%.o: $(SRCDIR)/%.cpp
|
||||
$(DO_CC_LINUX)
|
||||
|
||||
$(OBJDIR_WIN32)/%.o: $(SRCDIR)/%.cpp
|
||||
$(DO_CC_WIN32)
|
||||
|
||||
default: $(DEFAULT)
|
||||
|
||||
$(TARGET_LINUX): $(OBJDIR_LINUX) $(OBJ_LINUX)
|
||||
$(LINK_LINUX)
|
||||
|
||||
$(TARGET_WIN32): $(OBJDIR_WIN32) $(OBJ_WIN32)
|
||||
$(LINK_WIN32)
|
||||
|
||||
$(OBJDIR_LINUX):
|
||||
mkdir $@
|
||||
|
||||
$(OBJDIR_WIN32):
|
||||
mkdir $@
|
||||
|
||||
win32: $(TARGET_WIN32)
|
||||
|
||||
linux: $(TARGET_LINUX)
|
||||
|
||||
clean: $(CLEAN)
|
||||
|
||||
clean_both:
|
||||
-rm -f $(OBJDIR_LINUX)/*
|
||||
-rm -f $(OBJDIR_WIN32)/*
|
||||
|
||||
clean_win32:
|
||||
del /q $(OBJDIR_WIN32)
|
||||
|
||||
|
178
dlls/csx/source/Makefile.pl
Executable file
178
dlls/csx/source/Makefile.pl
Executable file
@ -0,0 +1,178 @@
|
||||
#!/usr/bin/perl
|
||||
#(C)2004 AMX Mod X Development Team
|
||||
# by David "BAILOPAN" Anderson
|
||||
|
||||
# output will occur in bin.x.proc
|
||||
# where x is debug or opt and proc is ix86 or amd64
|
||||
# You must use this script from the project src dir
|
||||
|
||||
#options =
|
||||
# debug - enable gdb debugging
|
||||
# amd64 - compile for AMD64
|
||||
# proc=ix86 - assumed not amd64
|
||||
# clean - clean the specifications above
|
||||
|
||||
$PROJECT = "csx_amxx";
|
||||
$sdk = "../../../hlsdk/SourceCode";
|
||||
$mm = "../../../metamod/metamod";
|
||||
$gccf = "gcc";
|
||||
|
||||
@CPP_SOURCE_FILES = ("amxxmodule.cpp", "CMisc.cpp", "usermsg.cpp", "meta_api.cpp", "rank.cpp", "CRank.cpp");
|
||||
|
||||
@C_SOURCE_FILES = ();
|
||||
my %OPTIONS, %OPT;
|
||||
|
||||
$OPT{"debug"} = "-g -ggdb";
|
||||
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\" -fno-exceptions -fno-rtti";
|
||||
|
||||
$OPTIONS{"include"} = "-I$sdk -I. -I$mm -I$sdk/engine -I$sdk/common -I$sdk/pm_shared -I$sdk/dlls";
|
||||
|
||||
while ($cmd = shift)
|
||||
{
|
||||
if ($cmd =~ /amd64/) {
|
||||
$OPTIONS{"amd64"} = 1;
|
||||
} elsif ($cmd =~ /debug/) {
|
||||
$OPTIONS{"debug"} = 1;
|
||||
} elsif ($cmd =~ /proc=i(\d)86/) {
|
||||
$proc = $1;
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
die "You cannot compile for i".$proc."86 and AMD64.\n";
|
||||
} else {
|
||||
$OPTIONS{"proc"} = "i".$proc."86";
|
||||
}
|
||||
} elsif ($cmd =~ /clean/) {
|
||||
$OPTIONS{"clean"} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
$gcc = `$gccf --version`;
|
||||
if ($gcc =~ /2\.9/)
|
||||
{
|
||||
$OPT{"opt"} .= " -malign-loops=2 -malign-jumps=2 -malign-functions=2";
|
||||
} else {
|
||||
$OPT{"opt"} .= " -falign-loops=2 -falign-jumps=2 -falign-functions=2";
|
||||
}
|
||||
|
||||
if ($OPTIONS{"debug"})
|
||||
{
|
||||
$cflags = $OPT{"debug"};
|
||||
} else {
|
||||
if (!$OPTIONS{"amd64"})
|
||||
{
|
||||
$proc = $OPTIONS{"proc"};
|
||||
if (!$proc)
|
||||
{
|
||||
$proc = 3;
|
||||
}
|
||||
$cflags = "-march=i".$proc."86 ".$OPT{"opt"};
|
||||
} else {
|
||||
$cflags = $OPT{"opt"};
|
||||
}
|
||||
}
|
||||
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
$cflags .= " -m64 -DHAVE_I64 -DSMALL_CELL_SIZE=64 $cflags";
|
||||
}
|
||||
|
||||
if ($OPTIONS{"debug"})
|
||||
{
|
||||
$outdir = "bin.debug";
|
||||
} else {
|
||||
$outdir = "bin.opt";
|
||||
}
|
||||
|
||||
if ($OPTIONS{"amd64"})
|
||||
{
|
||||
$outdir .= ".amd64";
|
||||
$bin = $PROJECT."_amd64.so";
|
||||
} else {
|
||||
$proc = $OPTIONS{"proc"};
|
||||
if ($proc)
|
||||
{
|
||||
$outdir .= ".i".$proc."86";
|
||||
$bin = $PROJECT."_i".$proc."86.so";
|
||||
} else {
|
||||
$outdir .= ".i386";
|
||||
$bin = $PROJECT."_i386.so";
|
||||
}
|
||||
}
|
||||
|
||||
unlink("$outdir/$bin");
|
||||
if ($OPTIONS{"clean"})
|
||||
{
|
||||
`rm $outdir/*.o`;
|
||||
die("Project cleaned.\n");
|
||||
}
|
||||
|
||||
#create the dirs
|
||||
#build link list
|
||||
my @LINK;
|
||||
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
{
|
||||
$file = $CPP_SOURCE_FILES[$i];
|
||||
$file =~ s/\.cpp/\.o/;
|
||||
push(@LINK, $outdir."/".$file);
|
||||
}
|
||||
for ($i=0; $i<=$#C_SOURCE_FILES; $i++)
|
||||
{
|
||||
$file = $C_SOURCE_FILES[$i];
|
||||
$file =~ s/\.c/\.o/;
|
||||
push(@LINK, $outdir."/".$file);
|
||||
}
|
||||
|
||||
if (!(-d $outdir))
|
||||
{
|
||||
mkdir($outdir);
|
||||
}
|
||||
|
||||
$inc = $OPTIONS{"include"};
|
||||
|
||||
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
{
|
||||
$file = $CPP_SOURCE_FILES[$i];
|
||||
$ofile = $file;
|
||||
$ofile =~ s/\.cpp/\.o/;
|
||||
$ofile = "$outdir/$ofile";
|
||||
$gcc = "$gccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
if (-e $ofile)
|
||||
{
|
||||
$file_time = (stat($file))[9];
|
||||
$ofile_time = (stat($ofile))[9];
|
||||
if ($file_time > $ofile_time)
|
||||
{
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
}
|
||||
} else {
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
}
|
||||
}
|
||||
|
||||
for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
|
||||
{
|
||||
$file = $C_SOURCE_FILES[$i];
|
||||
$ofile = $file;
|
||||
$ofile =~ s/\.c/\.o/;
|
||||
$ofile = "$outdir/$ofile";
|
||||
$gcc = "cc $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
|
||||
if (-e $ofile)
|
||||
{
|
||||
$file_time = (stat($file))[9];
|
||||
$ofile_time = (stat($ofile))[9];
|
||||
if ($file_time > $ofile_time)
|
||||
{
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
}
|
||||
} else {
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
||||
}
|
||||
}
|
||||
|
||||
$gcc = "$gccf $cflags -shared -ldl -lm @LINK -o $outdir/$bin";
|
||||
print "$gcc\n";
|
||||
`$gcc`;
|
3042
dlls/csx/source/amxxmodule.cpp
Executable file
3042
dlls/csx/source/amxxmodule.cpp
Executable file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user