1 Commits

Author SHA1 Message Date
6518777115 Tagged 1.70 2006-07-19 20:17:28 +00:00
730 changed files with 102733 additions and 111987 deletions

View File

@ -31,7 +31,6 @@
#include "amxmodx.h"
#include "debugger.h"
#include "binlog.h"
CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes)
{
@ -56,8 +55,6 @@ CForward::CForward(const char *name, ForwardExecType et, int numParams, const Fo
m_Funcs.push_back(tmp);
}
}
m_Name.assign(name);
}
cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
@ -127,9 +124,6 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
// exec
cell retVal;
#if defined BINLOG_ENABLED
g_BinLog.WriteOp(BinLog_CallPubFunc, (*iter).pPlugin->getId(), iter->func);
#endif
int err = amx_Exec(amx, &retVal, iter->func);
// log runtime error, if any
@ -212,16 +206,12 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *paramTypes)
{
char name[sNAMEMAX];
m_Func = func;
m_Amx = amx;
m_NumParams = numParams;
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
m_HasFunc = true;
isFree = false;
name[0] = '\0';
amx_GetPublic(amx, func, name);
m_Name.assign(name);
}
void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
@ -231,7 +221,6 @@ void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const Forwar
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
isFree = false;
m_Name.assign(funcName);
}
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
@ -295,9 +284,6 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
// exec
cell retVal;
#if defined BINLOG_ENABLED
g_BinLog.WriteOp(BinLog_CallPubFunc, pPlugin->getId(), m_Func);
#endif
int err = amx_Exec(m_Amx, &retVal, m_Func);
if (err != AMX_ERR_NONE)
@ -452,11 +438,6 @@ cell CForwardMngr::executeForwards(int id, cell *params)
return retVal;
}
const char *CForwardMngr::getFuncName(int id) const
{
return (id & 1) ? m_SPForwards[id >> 1]->getFuncName() : m_Forwards[id >> 1]->getFuncName();
}
int CForwardMngr::getParamsNum(int id) const
{
return (id & 1) ? m_SPForwards[id >> 1]->getParamsNum() : m_Forwards[id >> 1]->getParamsNum();

View File

@ -93,7 +93,6 @@ class CForward
const char *m_FuncName;
ForwardExecType m_ExecType;
int m_NumParams;
String m_Name;
struct AMXForward
{
@ -121,11 +120,6 @@ public:
{
return m_Funcs.size();
}
const char *getFuncName() const
{
return m_Name.c_str();
}
ForwardParam getParamType(int paramId) const
{
@ -147,7 +141,6 @@ class CSPForward
int m_Func;
bool m_HasFunc;
String m_Name;
public:
bool isFree;
@ -167,11 +160,6 @@ public:
{
return (m_HasFunc) ? 1 : 0;
}
const char *getFuncName() const
{
return m_Name.c_str();
}
ForwardParam getParamType(int paramId) const
{
@ -219,7 +207,6 @@ public:
bool isSPForward(int id) const; // check whether forward is single plugin
int getParamsNum(int id) const; // get num of params of a forward
int getFuncsNum(int id) const; // get num of found functions of a forward
const char *getFuncName(int id) const; // get the function name
ForwardParam getParamType(int id, int paramId) const;
cell prepareArray(void *ptr, unsigned int size, ForwardArrayElemType type, bool copyBack); // prepare array

View File

@ -47,6 +47,41 @@
#define INSERT_STRING 3
#define INSERT_NEWLINE 4
// dictionary format is Fast-Format-Hash-Lookup, v6
#define MAGIC_HDR 0x4646484C
#define FFHL_VERSION 6
#define FFHL_MIN_VERSION 6
/*version history:
* 1 (BAILOPAN) - Simplest form possible, no reverse
* 2 (BAILOPAN) - One language per file with full reverse
* 3 (PM OnoTo) - 2^32 languages per file with full reverse
* 4 (BAILOPAN) - Optimized by separating and relocating tables (normalization)
* 5 (BAILOPAN) - Removed hash storage
* 6 (BAILOPAN) - Arbitrary bump to force reparse.
FORMAT:
Magic 4bytes
Version 1byte
Number of Keys 4bytes
Number of Languages 4bytes
LANG INFO TABLE[]
Language Name 2bytes
Offset 4bytes
KEY TABLE[]
Key Lookup Offset 4bytes
LANGUAGES TABLE[]
Language[]
Definitions 4bytes
Key # 4bytes (0-index into key table)
Def Offset 4bytes
KEY LOOKUP TABLE[]
Key length 1byte
Key string variable
DEF LOOKUP TABLE[]
Def length 2bytes
Def string variable
*/
template<>
int Compare<String>(const String &k1, const String &k2)
{
@ -214,11 +249,76 @@ const char * CLangMngr::CLang::GetDef(int key, int &status)
return def.definition->c_str();
}
// Assumes fp is set to the right position
bool CLangMngr::CLang::SaveDefinitions(FILE *fp, uint32_t &curOffset)
{
unsigned short defLen = 0;
String *pdef;
THash<int, defentry>::iterator iter;
for (iter=m_LookUpTable.begin(); iter!=m_LookUpTable.end(); iter++)
{
pdef = iter->val.definition;
if (!pdef)
continue;
defLen = pdef->size();
fwrite((void *)&defLen, sizeof(unsigned short), 1, fp);
curOffset += sizeof(unsigned short);
fwrite(pdef->c_str(), sizeof(char), defLen, fp);
curOffset += defLen;
}
return true;
}
int CLangMngr::CLang::Entries()
{
return m_entries;
}
// Assumes fp is set to the right position
bool CLangMngr::CLang::Save(FILE *fp, int &defOffset, uint32_t &curOffset)
{
uint32_t keynum = 0;
uint32_t size = 0;
String *pdef;
//:TODO: remove this loop and assertion, use m_entries for size
THash<int, defentry>::iterator iter;
for (iter=m_LookUpTable.begin(); iter!=m_LookUpTable.end(); iter++)
{
if (iter->val.definition)
size++;
}
assert(size == m_entries);
fwrite((void*)&size, sizeof(uint32_t), 1, fp);
curOffset += sizeof(uint32_t);
for (iter=m_LookUpTable.begin(); iter!=m_LookUpTable.end(); iter++)
{
keynum = iter->key;
pdef = iter->val.definition;
if (!pdef)
continue;
fwrite((void *)&keynum, sizeof(uint32_t), 1, fp);
curOffset += sizeof(uint32_t);
fwrite((void *)&defOffset, sizeof(uint32_t), 1, fp);
curOffset += sizeof(uint32_t);
defOffset += sizeof(short);
defOffset += pdef->size();
}
return true;
}
// assumes fp is set to the right position
bool CLangMngr::CLang::Load(FILE *fp)
{
return true;
}
/******** CLangMngr *********/
inline String &make_string(const char *str)
@ -281,6 +381,35 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
return outbuf;
}
const char *CLangMngr::Format(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
const char *retVal = FormatString(fmt, ap);
va_end(ap);
return retVal;
}
#undef CHECK_PTR
#undef CHECK_OUTPR
#undef ZEROTERM
#undef NEXT_PARAM
#define CHECK_PTR(ptr, start, bufsize) if ((ptr) - (start) >= (bufsize)) { \
AMXXLOG_Log("[AMXX] Buffer overflow in formatting"); \
outbuf[0] = 0; \
return outbuf; }
#define CHECK_OUTPTR(offset) CHECK_PTR(outptr+offset, outbuf, sizeof(outbuf))
#define ZEROTERM(buf) buf[(sizeof(buf)/sizeof(buf[0]))-1]=0;
#define NEXT_PARAM()
//this is not implemented....
char *CLangMngr::FormatString(const char *fmt, va_list &ap)
{
return "";
}
void CLangMngr::MergeDefinitions(const char *lang, CQueue<sKeyDef> &tmpVec)
{
CLang * language = GetLang(lang);
@ -509,6 +638,286 @@ void CLangMngr::InvalidateCache()
FileList.clear();
}
bool CLangMngr::Save(const char *filename)
{
FILE *fp = fopen(filename, "wb");
if (!fp)
return false;
uint32_t magic = MAGIC_HDR;
unsigned char version = FFHL_VERSION;
uint32_t langNum = m_Languages.size();
const char *langName = 0;
uint32_t curOffset = 0;
uint32_t keyNum = KeyList.size();
uint32_t ktbSize = KeyList.size() * sizeof(uint32_t);
uint32_t ltbSize = m_Languages.size() * ((sizeof(char)*2) + sizeof(uint32_t));
fwrite((void *)&magic, sizeof(uint32_t), 1, fp);
fwrite((void *)&version, sizeof(unsigned char), 1, fp);
fwrite((void *)&keyNum, sizeof(uint32_t), 1, fp);
fwrite((void *)&langNum, sizeof(uint32_t), 1, fp);
curOffset += sizeof(uint32_t);
curOffset += sizeof(unsigned char);
curOffset += sizeof(uint32_t);
curOffset += sizeof(uint32_t);
uint32_t langOffset = curOffset + ktbSize + ltbSize;
for (unsigned int i = 0; i < m_Languages.size(); i++)
{
langName = m_Languages[i]->GetName();
fwrite(langName, sizeof(char), 2, fp);
curOffset += sizeof(char) * 2;
fwrite((void *)&langOffset, sizeof(uint32_t), 1, fp);
langOffset += sizeof(uint32_t) + (m_Languages[i]->Entries() * (sizeof(uint32_t) * 2));
curOffset += sizeof(uint32_t);
}
//Note - langOffset now points to the start of key lookup table
uint32_t keyHash = 0;
uint32_t keyOffset = langOffset;
for (unsigned int i = 0; i < KeyList.size(); i++)
{
fwrite((void*)&keyOffset, sizeof(uint32_t), 1, fp);
curOffset += sizeof(uint32_t);
keyOffset += sizeof(char);
keyOffset += KeyList[i]->size();
}
//Note - now keyOffset points toward the start of the def table
int defOffset = keyOffset;
for (unsigned int i = 0; i < m_Languages.size(); i++)
{
m_Languages[i]->Save(fp, defOffset, curOffset);
}
//Now, defOffset points toward the END of the file
//curoffset should point toward the key table, so...
unsigned char keyLen = 0;
for (unsigned int i = 0; i < KeyList.size(); i++)
{
keyLen = KeyList[i]->size();
fwrite((void*)&keyLen, sizeof(unsigned char), 1, fp);
curOffset += sizeof(unsigned char);
fwrite(KeyList[i]->c_str(), sizeof(char), keyLen, fp);
curOffset += sizeof(char) * keyLen;
}
//Finally, write the def table
// It's assumed no orders changed...
for (unsigned int i = 0; i < m_Languages.size(); i++)
{
m_Languages[i]->SaveDefinitions(fp, curOffset);
}
fclose(fp);
//done!
return true;
}
bool CLangMngr::SaveCache(const char *filename)
{
FILE *fp = fopen(filename, "wb");
if (!fp)
{
return false;
}
CVector<md5Pair *>::iterator i;
short dictCount = FileList.size();
char len = 0;
fwrite((void *)&dictCount, sizeof(short), 1, fp);
for (i = FileList.begin(); i != FileList.end(); i++)
{
len = (*i)->file.size();
fwrite((void *)&len, sizeof(char), 1, fp);
fwrite((*i)->file.c_str(), sizeof(char), len, fp);
fwrite((*i)->val.c_str(), sizeof(char), 32, fp);
}
fclose(fp);
return true;
}
#define CACHEREAD(expr, type) \
if (! (expr==1) ) { \
FileList.clear(); \
fclose(fp); \
return false; \
}
#define CACHEREAD_S(expr, size) \
if (! (expr==size) ) { \
FileList.clear(); \
fclose(fp); \
return false; \
}
bool CLangMngr::LoadCache(const char *filename)
{
FILE *fp = fopen(filename, "rb");
if (!fp)
{
return false;
}
short dictCount = 0;
char len = 0;
char buf[255];
char md5[34];
CACHEREAD(fread((void*)&dictCount, sizeof(short), 1, fp), short);
md5Pair *p = 0;
for (int i = 1; i <= dictCount; i++)
{
CACHEREAD(fread((void*)&len, sizeof(char), 1, fp), char);
CACHEREAD_S(fread(buf, sizeof(char), len, fp), len);
buf[len] = 0;
CACHEREAD_S(fread(md5, sizeof(char), 32, fp), 32);
md5[32] = 0;
p = new md5Pair;
p->file.assign(buf);
p->val.assign(md5);
FileList.push_back(p);
p = 0;
}
fclose(fp);
return true;
}
#define DATREAD(expr, type) \
if (! (expr==1) ) { \
Clear(); \
fclose(fp); \
return false; \
}
#define DATREAD_S(expr, size) \
if (! (expr==size) ) { \
Clear(); \
fclose(fp); \
return false; \
}
bool CLangMngr::Load(const char *filename)
{
Clear();
FILE *fp = fopen(filename, "rb");
if (!fp)
return false;
uint32_t magic = 0;
uint32_t langCount = 0;
uint32_t keycount = 0;
char version = 0;
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
rewind(fp);
DATREAD(fread((void*)&magic, sizeof(uint32_t), 1, fp), uint32_t);
if (magic != MAGIC_HDR)
return false;
DATREAD(fread((void*)&version, sizeof(char), 1, fp), char);
if (version > FFHL_VERSION || version < FFHL_MIN_VERSION)
return false;
DATREAD(fread((void*)&keycount, sizeof(uint32_t), 1, fp), uint32_t);
DATREAD(fread((void*)&langCount, sizeof(uint32_t), 1, fp), uint32_t);
uint32_t *LangOffsets = new uint32_t[langCount];
char langname[3];
for (unsigned int i = 0; i < langCount; i++)
{
DATREAD_S(fread(langname, sizeof(char), 2, fp), 2);
langname[2] = 0;
GetLang(langname); //this will initialize for us
DATREAD(fread((void *)&(LangOffsets[i]), sizeof(uint32_t), 1, fp), uint32_t);
}
//we should now be at the key table
int ktbOffset = ftell(fp);
unsigned char keylen;
char keybuf[255];
uint32_t bogus;
uint32_t keyoffset, save;
String _tmpkey;
for (unsigned i = 0; i < keycount; i++)
{
if (version == 4)
fread((void*)&(bogus), sizeof(uint32_t), 1, fp);
DATREAD(fread((void*)&keyoffset, sizeof(uint32_t), 1, fp), uint32_t);
if (keyoffset > size-sizeof(uint32_t))
{
Clear();
fclose(fp);
return false;
}
save = ftell(fp);
fseek(fp, keyoffset, SEEK_SET);
DATREAD(fread((void*)&keylen, sizeof(char), 1, fp), char);
DATREAD_S(fread(keybuf, sizeof(char), keylen, fp), keylen);
keybuf[keylen] = 0;
_tmpkey.assign(keybuf);
AddKeyEntry(_tmpkey);
fseek(fp, save, SEEK_SET); //bring back to next key
}
//we should now be at the languages table
uint32_t numentries;
uint32_t keynum;
uint32_t defoffset;
unsigned short deflen;
char valbuf[4096];
for (unsigned int i = 0; i < langCount; i++)
{
DATREAD(fread((void*)&numentries, sizeof(uint32_t), 1, fp), uint32_t);
for (unsigned int j = 0; j < numentries; j++)
{
DATREAD(fread((void *)&keynum, sizeof(uint32_t), 1, fp), uint32_t);
if (version == 4)
{
DATREAD(fread((void *)&bogus, sizeof(uint32_t), 1, fp), uint32_t);
}
DATREAD(fread((void *)&defoffset, sizeof(uint32_t), 1, fp), uint32_t);
if (defoffset > size-sizeof(uint32_t))
{
Clear();
fclose(fp);
return false;
}
save = ftell(fp);
fseek(fp, defoffset, SEEK_SET);
DATREAD(fread((void *)&deflen, sizeof(unsigned short), 1, fp), short);
//:TODO: possible string overflow here.
DATREAD_S(fread(valbuf, sizeof(char), deflen, fp), deflen);
valbuf[deflen] = 0;
m_Languages[i]->AddEntry(keynum, valbuf);
fseek(fp, save, SEEK_SET); //bring back to next entry
}
}
fclose(fp);
delete [] LangOffsets;
//we're done!
return true;
}
CLangMngr::~CLangMngr()
{
Clear();

View File

@ -111,6 +111,11 @@ class CLangMngr
// Get language name
const char *GetName() { return m_LanguageName; }
// Save to file
bool Save(FILE *fp, int &defOffset, uint32_t &curOffset);
bool SaveDefinitions(FILE *fp, uint32_t &curOffset);
// Load
bool Load(FILE *fp);
void SetMngr(CLangMngr *l) { m_LMan = l; }
// Get number of entries
int Entries();
@ -154,8 +159,18 @@ public:
int MergeDefinitionFile(const char *file);
// Get a definition from a lang name and a key
const char *GetDef(const char *langName, const char *key, int &status);
// Format a string
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
bool Load(const char *filename);
// Cache
bool LoadCache(const char *filename);
bool SaveCache(const char *filename);
void InvalidateCache();
// Get index
int GetKeyEntry(String &key);

View File

@ -30,7 +30,6 @@
*/
#include "amxmodx.h"
#include "libraries.h"
#ifndef FAR
#define FAR
@ -42,8 +41,6 @@ typedef int (FAR *QUERYMOD_NEW)(int * /*ifvers*/, amxx_module_info_s * /*modInfo
typedef int (FAR *ATTACHMOD_NEW)(PFN_REQ_FNPTR /*reqFnptrFunc*/);
typedef int (FAR *DETACHMOD_NEW)(void);
typedef void (FAR *PLUGINSLOADED_NEW)(void);
typedef void (*PLUGINSUNLOADED_NEW)(void);
typedef void (*PLUGINSUNLOADING_NEW)(void);
// *****************************************************
// class CModule
@ -82,12 +79,6 @@ void CModule::clear(bool clearFilename)
m_InfoNew.reload = 0;
m_MissingFunc = NULL;
for (size_t i=0; i<m_DestroyableIndexes.size(); i++)
{
delete [] m_Natives[m_DestroyableIndexes[i]];
}
m_DestroyableIndexes.clear();
m_Natives.clear();
}
@ -111,53 +102,6 @@ bool CModule::attachMetamod(const char *mmfile, PLUG_LOADTIME now)
return true;
}
//this ugly function is ultimately something like O(n^4).
//sigh. it shouldn't be needed.
void CModule::rewriteNativeLists(AMX_NATIVE_INFO *list)
{
AMX_NATIVE_INFO *curlist;
for (size_t i=0; i<m_Natives.size(); i++)
{
curlist = m_Natives[i];
bool changed = false;
bool found = false;
CVector<size_t> newlist;
for (size_t j=0; curlist[j].func != NULL; j++)
{
found = false;
for (size_t k=0; list[k].func != NULL; k++)
{
if (strcmp(curlist[j].name, list[k].name) == 0)
{
found = true;
break;
}
}
if (found)
{
changed = true;
//don't break, we have to search it all
} else {
newlist.push_back(j);
}
}
if (changed)
{
//now build the new list
AMX_NATIVE_INFO *rlist = new AMX_NATIVE_INFO[newlist.size()+1];
for (size_t j=0; j<newlist.size(); j++)
{
rlist[j].func = curlist[newlist[j]].func;
rlist[j].name = curlist[newlist[j]].name;
}
rlist[newlist.size()].func = NULL;
rlist[newlist.size()].name = NULL;
m_Natives[i] = rlist;
m_DestroyableIndexes.push_back(i);
}
}
}
bool CModule::attachModule()
{
// old & new
@ -182,7 +126,7 @@ bool CModule::attachModule()
{
case AMXX_OK:
m_Status = MODULE_LOADED;
break;
return true;
case AMXX_PARAM:
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
m_Status = MODULE_INTERROR;
@ -200,13 +144,6 @@ bool CModule::attachModule()
m_Status = MODULE_BADLOAD;
}
if (m_Status == MODULE_LOADED)
{
AddLibrariesFromString(m_InfoNew.library, LibType_Library, LibSource_Module, this);
AddLibrariesFromString(m_InfoNew.libclass, LibType_Class, LibSource_Module, this);
return true;
}
return false;
}
@ -247,36 +184,10 @@ bool CModule::queryModule()
return false;
case AMXX_IFVERS:
if (ifVers < AMXX_INTERFACE_VERSION)
{
//backwards compat for new defs
if (ifVers == 3)
{
g_ModuleCallReason = ModuleCall_Query;
g_CurrentlyCalledModule = this;
retVal = (*queryFunc_New)(&ifVers, &m_InfoNew);
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
if (retVal == AMXX_OK)
{
m_InfoNew.library = m_InfoNew.logtag;
if (StrCaseStr(m_InfoNew.library, "sql")
|| StrCaseStr(m_InfoNew.library, "dbi"))
{
m_InfoNew.libclass = "DBI";
} else {
m_InfoNew.libclass = "";
}
break;
}
return false;
} else {
m_Status = MODULE_OLD;
return false;
}
} else {
m_Status = MODULE_OLD;
else
m_Status = MODULE_NEWER;
return false;
}
return false;
case AMXX_OK:
break;
default:
@ -306,8 +217,6 @@ bool CModule::detachModule()
if (m_Status != MODULE_LOADED)
return false;
RemoveLibraries(this);
if (m_Amxx)
{
DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
@ -335,38 +244,6 @@ bool CModule::detachModule()
return true;
}
void CModule::CallPluginsUnloaded()
{
if (m_Status != MODULE_LOADED)
return;
if (!m_Handle)
return;
PLUGINSUNLOADED_NEW func = (PLUGINSUNLOADED_NEW)DLPROC(m_Handle, "AMXX_PluginsUnloaded");
if (!func)
return;
func();
}
void CModule::CallPluginsUnloading()
{
if (m_Status != MODULE_LOADED)
return;
if (!m_Handle)
return;
PLUGINSUNLOADING_NEW func = (PLUGINSUNLOADING_NEW)DLPROC(m_Handle, "AMXX_PluginsUnloading");
if (!func)
return;
func();
}
void CModule::CallPluginsLoaded()
{
if (m_Status != MODULE_LOADED)

View File

@ -59,8 +59,6 @@ struct amxx_module_info_s
const char *version;
int reload; // reload on mapchange when nonzero
const char *logtag; //added in version 2
const char *library; // added in version 4
const char *libclass; // added in version 4
};
#define AMXX_OK 0 /* no error */
@ -68,7 +66,7 @@ struct amxx_module_info_s
#define AMXX_PARAM 2 /* Invalid parameter */
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
#define AMXX_INTERFACE_VERSION 4
#define AMXX_INTERFACE_VERSION 3
class CModule
{
@ -92,7 +90,6 @@ public:
bool attachModule();
bool queryModule();
bool detachModule();
void rewriteNativeLists(AMX_NATIVE_INFO *list);
#ifndef FAKEMETA
bool attachMetamod(const char *mmfile, PLUG_LOADTIME now);
@ -113,11 +110,8 @@ public:
inline bool IsMetamod() { return m_Metamod; }
void CallPluginsLoaded();
void CallPluginsUnloaded();
void CallPluginsUnloading();
CVector<AMX_NATIVE_INFO*> m_Natives;
CVector<size_t> m_DestroyableIndexes;
CList<AMX_NATIVE_INFO*> m_Natives;
};
#endif //CMODULE_H

View File

@ -36,7 +36,6 @@
#include "amx.h"
#include "natives.h"
#include "debugger.h"
#include "libraries.h"
extern const char *no_function;
@ -108,17 +107,6 @@ int CPluginMngr::loadPluginsFromFile(const char* filename)
line.clear();
line._fread(fp);
/** quick hack */
char *ptr = const_cast<char *>(line.c_str());
while (*ptr)
{
if (*ptr == ';')
{
*ptr = '\0';
} else {
ptr++;
}
}
sscanf(line.c_str(), "%s %s", pluginName, debug);
if (!isalnum(*pluginName))
@ -142,8 +130,6 @@ int CPluginMngr::loadPluginsFromFile(const char* filename)
fclose(fp);
InvalidateCache();
return pCounter;
}
@ -252,8 +238,8 @@ CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, int
if (status == ps_running)
{
m_PauseFwd = registerSPForwardByName(&amx, "plugin_pause", FP_DONE);
m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause", FP_DONE);
m_PauseFwd = registerSPForwardByName(&amx, "plugin_pause");
m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause");
if (amx.flags & AMX_FLAG_DEBUG)
{
@ -397,251 +383,3 @@ void CPluginMngr::CPlugin::unpausePlugin()
executeForwards(m_UnpauseFwd);
}
}
char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
{
List<plcache_entry *>::iterator iter;
plcache_entry *pl;
for (iter=m_plcache.begin(); iter!=m_plcache.end(); iter++)
{
pl = (*iter);
if (pl->path.compare(file) == 0)
{
bufsize = pl->bufsize;
return pl->buffer;
}
}
pl = new plcache_entry;
pl->file = new CAmxxReader(file, sizeof(cell));
pl->buffer = NULL;
if (pl->file->GetStatus() != CAmxxReader::Err_None)
{
delete pl->file;
delete pl;
return NULL;
}
pl->bufsize = pl->file->GetBufferSize();
if (pl->bufsize)
{
pl->buffer = new char[pl->bufsize];
pl->file->GetSection(pl->buffer);
}
if (!pl->buffer || pl->file->GetStatus() != CAmxxReader::Err_None)
{
delete [] pl->buffer;
delete pl->file;
delete pl;
return NULL;
}
pl->path.assign(file);
bufsize = pl->bufsize;
m_plcache.push_back(pl);
return pl->buffer;
}
void CPluginMngr::InvalidateCache()
{
List<plcache_entry *>::iterator iter;
plcache_entry *pl;
for (iter=m_plcache.begin(); iter!=m_plcache.end(); iter++)
{
pl = (*iter);
delete [] pl->buffer;
delete pl->file;
delete pl;
}
m_plcache.clear();
}
void CPluginMngr::InvalidateFileInCache(const char *file, bool freebuf)
{
List<plcache_entry *>::iterator iter;
plcache_entry *pl;
for (iter=m_plcache.begin(); iter!=m_plcache.end(); iter++)
{
pl = (*iter);
if (pl->path.compare(file) == 0)
{
if (freebuf)
delete [] pl->buffer;
delete pl->file;
delete pl;
m_plcache.erase(iter);
return;
}
}
}
void CPluginMngr::CacheAndLoadModules(const char *plugin)
{
size_t progsize;
char *prog = ReadIntoOrFromCache(plugin, progsize);
if (!prog)
return;
AMX_HEADER hdr;
memcpy(&hdr, prog, sizeof(AMX_HEADER));
uint16_t magic = hdr.magic;
amx_Align16(&magic);
if (magic != AMX_MAGIC)
{
return;
}
if (hdr.file_version < MIN_FILE_VERSION ||
hdr.file_version > CUR_FILE_VERSION)
{
return;
}
if ((hdr.defsize != sizeof(AMX_FUNCSTUB)) &&
(hdr.defsize != sizeof(AMX_FUNCSTUBNT)))
{
return;
}
amx_Align32((uint32_t*)&hdr.nametable);
uint16_t *namelength=(uint16_t*)((unsigned char*)prog + (unsigned)hdr.nametable);
amx_Align16(namelength);
if (*namelength>sNAMEMAX)
{
return;
}
if (hdr.stp <= 0)
{
return;
}
AMX amx;
memset(&amx, 0, sizeof(AMX));
amx.base = (unsigned char *)prog;
int num;
char name[sNAMEMAX+1];
num = amx_GetLibraries(&amx);
for (int i=0; i<num; i++)
{
amx_GetLibrary(&amx, i, name, sNAMEMAX);
if (stricmp(name, "Float")==0)
continue;
//awful backwards compat hack
if (stricmp(name, "socket")==0)
strcpy(name, "sockets");
//we don't want to report failed modules here...
LoadModule(name, PT_ANYTIME, true, true);
}
cell tag_id;
amx_NumTags(&amx, &num);
CVector<LibDecoder *> expects;
CVector<LibDecoder *> defaults;
CStack<LibDecoder *> delstack;
for (int i=0; i<num; i++)
{
amx_GetTag(&amx, i, name, &tag_id);
if (name[0] == '?')
{
LibDecoder *dc = new LibDecoder;
delstack.push(dc);
if (DecodeLibCmdString(name, dc))
{
if (dc->cmd == LibCmd_ForceLib)
{
RunLibCommand(dc);
} else if ( (dc->cmd == LibCmd_ExpectClass) ||
(dc->cmd == LibCmd_ExpectLib) )
{
expects.push_back(dc);
} else if (dc->cmd == LibCmd_DefaultLib) {
defaults.push_back(dc);
}
}
}
}
for (size_t i=0; i<expects.size(); i++)
{
RunLibCommand(expects[i]);
}
for (size_t i=0; i<defaults.size(); i++)
{
RunLibCommand(defaults[i]);
}
expects.clear();
defaults.clear();
while (!delstack.empty())
{
delete delstack.front();
delstack.pop();
}
return;
}
void CPluginMngr::CALMFromFile(const char *file)
{
char filename[256];
FILE *fp = fopen(build_pathname_r(filename, sizeof(filename) - 1, "%s", file), "rt");
if (!fp)
{
return;
}
// Find now folder
char pluginName[256];
char line[256];
String rline;
while (!feof(fp))
{
fgets(line, sizeof(line)-1, fp);
if (line[0] == ';' || line[0] == '\n' || line[0] == '\0')
continue;
/** quick hack */
char *ptr = line;
while (*ptr)
{
if (*ptr == ';')
{
*ptr = '\0';
} else {
ptr++;
}
}
rline.assign(line);
rline.trim();
pluginName[0] = '\0';
sscanf(rline.c_str(), "%s", pluginName);
if (!isalnum(*pluginName))
continue;
build_pathname_r(filename, sizeof(filename)-1, "%s/%s", get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins"), pluginName);
CacheAndLoadModules(filename);
}
fclose(fp);
}

View File

@ -32,11 +32,6 @@
#ifndef PLUGIN_H
#define PLUGIN_H
#include "CString.h"
#include "sh_list.h"
#include "amx.h"
#include "amxxfile.h"
// *****************************************************
// class CPluginMngr
// *****************************************************
@ -116,7 +111,7 @@ private:
int pCounter;
public:
CPluginMngr() { head = 0; pCounter = 0; pNatives = NULL; m_Finalized=false;}
~CPluginMngr() { clear(); InvalidateCache(); }
~CPluginMngr() { clear(); }
bool m_Finalized;
AMX_NATIVE_INFO *pNatives;
@ -150,21 +145,6 @@ public:
inline iterator begin() const { return iterator(head); }
inline iterator end() const { return iterator(0); }
public:
struct plcache_entry
{
CAmxxReader *file;
size_t bufsize;
char *buffer;
String path;
};
char *ReadIntoOrFromCache(const char *file, size_t &bufsize);
void InvalidateCache();
void InvalidateFileInCache(const char *file, bool freebuf);
void CacheAndLoadModules(const char *plugin);
void CALMFromFile(const char *file);
private:
List<plcache_entry *> m_plcache;
};
#endif //PLUGIN_H

View File

@ -34,6 +34,16 @@
/*********************** CTask ***********************/
int CTaskMngr::CTask::getTaskId() const
{
return m_iId;
}
CPluginMngr::CPlugin *CTaskMngr::CTask::getPlugin() const
{
return m_pPlugin;
}
void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, cell iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat, float fCurrentTime)
{
clear();
@ -43,7 +53,6 @@ void CTaskMngr::CTask::set(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags,
m_iFunc = iFunc;
m_iId = iId;
m_fBase = fBase;
m_bInExecute = false;
if (iFlags & 2)
{
@ -141,7 +150,6 @@ void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, f
//only bother calling if we have something to call
if (!(m_bLoop && !m_iRepeat))
{
m_bInExecute = true;
if (m_iParamLen) // call with parameters
{
cell arr = prepareCellArray(m_pParams, m_iParamLen);
@ -149,7 +157,6 @@ void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, f
} else {
executeForwards(m_iFunc, m_iId);
}
m_bInExecute = false;
}
if (isFree())
@ -186,7 +193,6 @@ CTaskMngr::CTask::CTask()
m_bLoop = false;
m_bAfterStart = false;
m_bBeforeEnd = false;
m_bInExecute = false;
m_fNextExecTime = 0.0f;

View File

@ -45,7 +45,6 @@ private:
int m_iFunc;
int m_iRepeat;
bool m_bInExecute;
bool m_bLoop;
bool m_bAfterStart;
bool m_bBeforeEnd;
@ -62,15 +61,13 @@ private:
void clear();
bool isFree() const;
inline CPluginMngr::CPlugin *getPlugin() const { return m_pPlugin; }
inline AMX *getAMX() const { return m_pPlugin->getAMX(); }
inline int getTaskId() const { return m_iId; }
CPluginMngr::CPlugin *getPlugin() const;
int getTaskId() const;
void executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft); // also removes the task if needed
void changeBase(float fNewBase);
void resetNextExecTime(float fCurrentTime);
inline bool inExecute() const { return m_bInExecute; }
bool shouldRepeat();
@ -95,11 +92,9 @@ private:
friend bool operator == (const CTask &left, const CTaskDescriptor &right)
{
if (right.m_bFree)
return (left.isFree() && !left.inExecute());
return left.isFree();
return (!left.isFree()) &&
(right.m_pAmx ? left.getAMX() == right.m_pAmx : true) &&
(left.getTaskId() == right.m_iId);
return !left.isFree() && (right.m_pAmx ? left.getPlugin()->getAMX() == right.m_pAmx : true) && left.getTaskId() == right.m_iId;
}
};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -9,19 +9,16 @@ MM_ROOT = ../metamod/metamod
OPT_FLAGS = -O2 -funroll-loops -s -fomit-frame-pointer -pipe
DEBUG_FLAGS = -g -ggdb3
CPP = gcc
NAME = amxmodx
BIN_SUFFIX_32 = mm_i386.so
BIN_SUFFIX_64 = mm_amd64.so
NAME = amxmodx_mm
OBJECTS = meta_api.cpp CFile.cpp CVault.cpp vault.cpp float.cpp file.cpp modules.cpp \
CMisc.cpp CTask.cpp string.cpp amxmodx.cpp CEvent.cpp CCmd.cpp CLogEvent.cpp \
srvcmd.cpp strptime.cpp amxcore.cpp amxtime.cpp power.cpp amxxlog.cpp fakemeta.cpp \
amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp
optimizer.cpp format.cpp
LINK = /lib/libstdc++.a
LINK = -lz /lib/libstdc++.a
INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \
-I$(MM_ROOT) -Lzlib -I$(HLSDK)/common
@ -34,26 +31,21 @@ else
CFLAGS = $(OPT_FLAGS)
endif
ifeq "$(BINLOG)" "true"
NAME := $(NAME)_bl
BIN_DIR := $(BIN_DIR)BinLog
OBJECTS += binlog.cpp
CFLAGS += -DBINLOG_ENABLED
ifeq "$(MMGR)" "true"
OBJECTS += mmgr/mmgr.cpp
CFLAGS += -DMEMORY_TEST
endif
CFLAGS += -DLINUX -DNDEBUG -fPIC -Wno-deprecated -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
ifeq "$(AMD64)" "true"
BINARY = $(NAME)_$(BIN_SUFFIX_64)
CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -DAMD64 -m64
LINK += -lz64
BINARY = $(NAME)_amd64.so
CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -DAMD64 -m64
OBJECTS += JIT/natives-amd64.o
else
BINARY = $(NAME)_$(BIN_SUFFIX_32)
BINARY = $(NAME)_i386.so
OBJECTS += JIT/amxexecn.o JIT/amxjitsn.o JIT/natives-x86.o
OBJECTS += JIT/helpers-x86.o
CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32
LINK += -lz
OPT_FLAGS += -march=i586
endif
@ -70,23 +62,23 @@ amd64:
rm -f zlib/libz.a
$(MAKE) all AMD64=true
amd64_mmgr:
rm -f zlib/libz.a
$(MAKE) all AMD64=true MMGR=true
amd64_debug_mmgr:
rm -f zlib/libz.a
$(MAKE) all AMD64=true DEBUG=true MMGR=true
amd64_debug:
rm -f zlib/libz.a
$(MAKE) all AMD64=true DEBUG=true
amd64_binlog:
rm -f zlib/libz.a
$(MAKE) all AMD64=true BINLOG=true
mmgr:
$(MAKE) all MMGR=true
amd64_binlog_debug:
rm -f zlib/libz.a
$(MAKE) all AMD64=true BINLOG=true DEBUG=true
binlog:
$(MAKE) all BINLOG=true
binlog_debug:
$(MAKE) all BINLOG=true DEBUG=true
debug_mmgr:
$(MAKE) all MMGR=true DEBUG=true
amxmodx: $(OBJ_LINUX)
$(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY)
@ -98,14 +90,7 @@ default: all
clean:
rm -rf Release/*.o
rm -rf Release/$(NAME)_$(BIN_SUFFIX_32)
rm -rf Release/$(NAME)_$(BIN_SUFFIX_64)
rm -rf ReleaseBinLog/*.o
rm -rf ReleaseBinLog/$(NAME)_bl_$(BIN_SUFFIX_32)
rm -rf ReleaseBinLog/$(NAME)_bl_$(BIN_SUFFIX_64)
rm -rf Release/$(BINARY)
rm -rf Debug/*.o
rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32)
rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64)
rm -rf DebugBinLog/*.o
rm -rf DebugBinLog/$(NAME)_bl_$(BIN_SUFFIX_32)
rm -rf DebugBinLog/$(NAME)_bl_$(BIN_SUFFIX_64)
rm -rf Debug/$(BINARY)

View File

@ -462,24 +462,8 @@ int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params)
amx->error=AMX_ERR_NONE;
#if defined BINLOG_ENABLED
binlogfuncs_t *logfuncs = (binlogfuncs_t *)amx->usertags[UT_BINLOGS];
if (logfuncs)
{
logfuncs->pfnLogNative(amx, index, (int)(params[0] / sizeof(cell)));
logfuncs->pfnLogParams(amx, params);
}
#endif //BINLOG_ENABLED
*result = f(amx,params);
#if defined BINLOG_ENABLED
if (logfuncs)
{
logfuncs->pfnLogReturn(amx, *result);
}
#endif
return amx->error;
}
#endif /* defined AMX_INIT */
@ -844,6 +828,19 @@ int AMXAPI amx_Init(AMX *amx, void *program)
{
AMX_HEADER *hdr;
BROWSEHOOK hook = NULL;
#if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD
char libname[sNAMEMAX+8]; /* +1 for '\0', +3 for 'amx' prefix, +4 for extension */
#if defined _Windows
typedef int (FAR WINAPI *AMX_ENTRY)(AMX _FAR *amx);
HINSTANCE hlib;
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
typedef int (*AMX_ENTRY)(AMX *amx);
void *hlib;
#endif
int numlibraries,i;
AMX_FUNCSTUB *lib;
AMX_ENTRY libinit;
#endif
if ((amx->flags & AMX_FLAG_RELOC)!=0)
return AMX_ERR_INIT; /* already initialized (may not do so twice) */
@ -853,6 +850,22 @@ int AMXAPI amx_Init(AMX *amx, void *program)
* multi-byte words
*/
assert(check_endian());
#if BYTE_ORDER==BIG_ENDIAN
amx_Align32((uint32_t*)&hdr->size);
amx_Align16(&hdr->magic);
amx_Align16((uint16_t*)&hdr->flags);
amx_Align16((uint16_t*)&hdr->defsize);
amx_Align32((uint32_t*)&hdr->cod);
amx_Align32((uint32_t*)&hdr->dat);
amx_Align32((uint32_t*)&hdr->hea);
amx_Align32((uint32_t*)&hdr->stp);
amx_Align32((uint32_t*)&hdr->cip);
amx_Align32((uint32_t*)&hdr->publics);
amx_Align32((uint32_t*)&hdr->natives);
amx_Align32((uint32_t*)&hdr->libraries);
amx_Align32((uint32_t*)&hdr->pubvars);
amx_Align32((uint32_t*)&hdr->tags);
#endif
if (hdr->magic!=AMX_MAGIC)
return AMX_ERR_FORMAT;
@ -873,7 +886,13 @@ int AMXAPI amx_Init(AMX *amx, void *program)
} /* if */
if (hdr->stp<=0)
return AMX_ERR_FORMAT;
#if BYTE_ORDER==BIG_ENDIAN
if ((hdr->flags & AMX_FLAG_COMPACT)==0) {
ucell *code=(ucell *)((unsigned char *)program+(int)hdr->cod);
while (code<(ucell *)((unsigned char *)program+(int)hdr->hea))
swapcell(code++);
} /* if */
#endif
assert((hdr->flags & AMX_FLAG_COMPACT)!=0 || hdr->hea == hdr->size);
if ((hdr->flags & AMX_FLAG_COMPACT)!=0) {
#if AMX_COMPACTMARGIN > 2
@ -900,12 +919,108 @@ int AMXAPI amx_Init(AMX *amx, void *program)
amx->callback=amx_Callback;
amx->data=NULL;
/* also align all addresses in the public function, public variable,
* public tag and native function tables --offsets into the name table
* (if present) must also be swapped.
*/
#if BYTE_ORDER==BIG_ENDIAN
{ /* local */
AMX_FUNCSTUB *fs;
int i,num;
fs=GETENTRY(hdr,natives,0);
num=NUMENTRIES(hdr,natives,libraries);
for (i=0; i<num; i++) {
amx_AlignCell(&fs->address); /* redundant, because it should be zero */
if (USENAMETABLE(hdr))
amx_AlignCell(&((AMX_FUNCSTUBNT*)fs)->nameofs);
fs=(AMX_FUNCSTUB*)((unsigned char *)fs+hdr->defsize);
} /* for */
fs=GETENTRY(hdr,publics,0);
assert(hdr->publics<=hdr->natives);
num=NUMENTRIES(hdr,publics,natives);
for (i=0; i<num; i++) {
amx_AlignCell(&fs->address);
if (USENAMETABLE(hdr))
amx_AlignCell(&((AMX_FUNCSTUBNT*)fs)->nameofs);
fs=(AMX_FUNCSTUB*)((unsigned char *)fs+hdr->defsize);
} /* for */
fs=GETENTRY(hdr,pubvars,0);
assert(hdr->pubvars<=hdr->tags);
num=NUMENTRIES(hdr,pubvars,tags);
for (i=0; i<num; i++) {
amx_AlignCell(&fs->address);
if (USENAMETABLE(hdr))
amx_AlignCell(&((AMX_FUNCSTUBNT*)fs)->nameofs);
fs=(AMX_FUNCSTUB*)((unsigned char *)fs+hdr->defsize);
} /* for */
fs=GETENTRY(hdr,tags,0);
if (hdr->file_version<7) {
assert(hdr->tags<=hdr->cod);
num=NUMENTRIES(hdr,tags,cod);
} else {
assert(hdr->tags<=hdr->nametable);
num=NUMENTRIES(hdr,tags,nametable);
} /* if */
for (i=0; i<num; i++) {
amx_AlignCell(&fs->address);
if (USENAMETABLE(hdr))
amx_AlignCell(&((AMX_FUNCSTUBNT*)fs)->nameofs);
fs=(AMX_FUNCSTUB*)((unsigned char *)fs+hdr->defsize);
} /* for */
} /* local */
#endif
/* relocate call and jump instructions */
hook = (BROWSEHOOK)amx->usertags[UT_BROWSEHOOK];
if (hook)
hook(amx, NULL, NULL);
amx_BrowseRelocate(amx);
/* load any extension modules that the AMX refers to */
#if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD
hdr=(AMX_HEADER *)amx->base;
numlibraries=NUMENTRIES(hdr,libraries,pubvars);
for (i=0; i<numlibraries; i++) {
lib=GETENTRY(hdr,libraries,i);
strcpy(libname,"amx");
strcat(libname,GETENTRYNAME(hdr,lib));
#if defined _Windows
strcat(libname,".dll");
#if defined __WIN32__
hlib=LoadLibraryA(libname);
#else
hlib=LoadLibrary(libname);
if (hlib<=HINSTANCE_ERROR)
hlib=NULL;
#endif
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
strcat(libname,".so");
hlib=dlopen(libname,RTLD_NOW);
#endif
if (hlib!=NULL) {
/* a library that cannot be loaded or that does not have the required
* initialization function is simply ignored
*/
char funcname[sNAMEMAX+9]; /* +1 for '\0', +4 for 'amx_', +4 for 'Init' */
strcpy(funcname,"amx_");
strcat(funcname,GETENTRYNAME(hdr,lib));
strcat(funcname,"Init");
#if defined _Windows
libinit=(AMX_ENTRY)GetProcAddress(hlib,funcname);
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
libinit=(AMX_ENTRY)dlsym(hlib,funcname);
#endif
if (libinit!=NULL)
libinit(amx);
} /* if */
lib->address=(ucell)hlib;
} /* for */
#endif
return AMX_ERR_NONE;
}
@ -1481,36 +1596,6 @@ int AMXAPI amx_RegisterToAny(AMX *amx, AMX_NATIVE f)
return err;
}
int AMXAPI amx_Reregister(AMX *amx, const AMX_NATIVE_INFO *list, int number)
{
AMX_FUNCSTUB *func;
AMX_HEADER *hdr;
int i,numnatives,count=0;
AMX_NATIVE funcptr;
hdr=(AMX_HEADER *)amx->base;
assert(hdr!=NULL);
assert(hdr->magic==AMX_MAGIC);
assert(hdr->natives<=hdr->libraries);
numnatives=NUMENTRIES(hdr,natives,libraries);
count=0;
func=GETENTRY(hdr,natives,0);
for (i=0; i<numnatives; i++) {
if (func->address!=0) {
/* this function is located */
funcptr=(list!=NULL) ? findfunction(GETENTRYNAME(hdr,func),list,number) : NULL;
if (funcptr!=NULL)
{
func->address=(ucell)funcptr;
count++;
}
} /* if */
func=(AMX_FUNCSTUB*)((unsigned char*)func+hdr->defsize);
} /* for */
return count;
}
int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *list, int number)
{
AMX_FUNCSTUB *func;
@ -1531,12 +1616,12 @@ int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *list, int number)
/* this function is not yet located */
funcptr=(list!=NULL) ? findfunction(GETENTRYNAME(hdr,func),list,number) : NULL;
if (funcptr!=NULL)
{
{
func->address=(ucell)funcptr;
} else {
no_function = GETENTRYNAME(hdr,func);
err=AMX_ERR_NOTFOUND;
}
}
} /* if */
func=(AMX_FUNCSTUB*)((unsigned char*)func+hdr->defsize);
} /* for */

View File

@ -166,14 +166,6 @@ typedef int (AMXAPI *AMX_NATIVE_FILTER)(struct tagAMX *amx, int index);
#pragma warning(disable:4103) /* disable warning message 4103 that complains
* about pragma pack in a header file */
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
#if _MSC_VER >= 1400
// MSVC8 - Replace POSIX stricmp with ISO C++ conformant one as it is deprecated
#define stricmp _stricmp
// Need this because of some stupid bug
#pragma warning (disable : 4996)
#endif
#endif
/* Some compilers do not support the #pragma align, which should be fine. Some
@ -344,7 +336,6 @@ enum {
#define UT_NATIVE 3
#define UT_OPTIMIZER 2
#define UT_BROWSEHOOK 1
#define UT_BINLOGS 0
typedef void (*BROWSEHOOK)(AMX *amx, cell *oplist, cell *cip);
@ -410,7 +401,6 @@ int AMXAPI amx_PushArray(AMX *amx, cell *amx_addr, cell **phys_addr, const cell
int AMXAPI amx_PushString(AMX *amx, cell *amx_addr, cell **phys_addr, const char *string, int pack, int use_wchar);
int AMXAPI amx_RaiseError(AMX *amx, int error);
int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *nativelist, int number);
int AMXAPI amx_Reregister(AMX *amx, const AMX_NATIVE_INFO *nativelist, int number);
int AMXAPI amx_RegisterToAny(AMX *amx, AMX_NATIVE f);
int AMXAPI amx_Release(AMX *amx, cell amx_addr);
int AMXAPI amx_SetCallback(AMX *amx, AMX_CALLBACK callback);
@ -450,15 +440,6 @@ int AMXAPI amx_GetStringOld(char *dest,const cell *source,int use_wchar);
#endif
#endif
#if defined BINLOG_ENABLED
typedef struct tagBINLOG
{
void (*pfnLogNative)(AMX *amx, int native, int params);
void (*pfnLogReturn)(AMX *amx, cell retval);
void (*pfnLogParams)(AMX *amx, cell *params);
} binlogfuncs_t;
#endif
#ifdef __cplusplus
}
#endif

View File

@ -1473,23 +1473,11 @@ OP_FLOAT_ROUND:
mov [ebp], eax
fldcw [ebp]
;calculate
sub esp,4
push 0
fld dword [edi+ecx+4]
test edx,edx
jz .correct
jmp .skip_correct
.correct:
fadd st0
fadd dword [g_round_nearest]
fistp dword [esp]
pop eax
sar eax,1
jmp .done
.skip_correct:
frndint
fistp dword [esp]
pop eax
.done:
pop edx
;restore bits
pop ebp
@ -1605,8 +1593,6 @@ Start_DATA
lodb_and DD 0ffh, 0ffffh, 0, 0ffffffffh
g_round_nearest DD 0.5
GLOBAL g_flags
g_flags:
DD -1
@ -1754,10 +1740,10 @@ _amx_opcodelist DD OP_INVALID
DD OP_SYSREQ_D
DD OP_SYMTAG
DD OP_BREAK
DD OP_FLOAT_MUL
DD OP_FLOAT_DIV
DD OP_FLOAT_ADD
DD OP_FLOAT_SUB
DD OP_FLOAT_TO
DD OP_FLOAT_ROUND
DD OP_FLOAT_CMP
DD OP_FLOAT_MUL
DD OP_FLOAT_DIV
DD OP_FLOAT_ADD
DD OP_FLOAT_SUB
DD OP_FLOAT_TO
DD OP_FLOAT_ROUND
DD OP_FLOAT_CMP

View File

@ -1962,23 +1962,11 @@ OP_FLOAT_ROUND:
mov [ebp], eax
fldcw [ebp]
;calculate
sub esp,4
push 0
fld dword [esi+4]
test edx,edx
jz .correct
jmp .skip_correct
.correct:
fadd st0
fadd dword [g_round_nearest]
fistp dword [esp]
pop eax
sar eax,1
jmp .done
.skip_correct:
frndint
fistp dword [esp]
pop eax
.done:
pop edx
;restore bits
pop ebp
@ -2434,10 +2422,6 @@ g_flagsjit:
DD -1
DD 0
DD 1
global g_round_nearest
g_round_nearest:
DD 0.5
global amx_opcodelist_jit, _amx_opcodelist_jit

View File

@ -33,8 +33,6 @@
#include "amxmodx.h"
#include "natives.h"
#include "debugger.h"
#include "binlog.h"
#include "libraries.h"
static cell AMX_NATIVE_CALL get_xvar_id(AMX *amx, cell *params)
{
@ -60,7 +58,7 @@ static cell AMX_NATIVE_CALL set_xvar_num(AMX *amx, cell *params)
{
if (g_xvars.setValue(params[1], params[2]))
{
LogError(amx, AMX_ERR_NATIVE, "Invalid xvar id");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -357,24 +355,8 @@ static cell AMX_NATIVE_CALL show_hudmessage(AMX *amx, cell *params) /* 2 param *
int len = 0;
g_langMngr.SetDefLang(params[1]);
char* message = NULL;
/**
* Earlier versions would ignore invalid bounds.
* Now, bounds are only checked for internal operations.
* "channel" stores the valid channel that core uses.
* "g_hudset.channel" stores the direct channel passed to the engine.
*/
bool aut = (g_hudset.channel == -1) ? true : false;
int channel = -1;
if (!aut)
{
/**
* guarantee this to be between 0-4
* if it's not auto, we don't care
*/
channel = abs(g_hudset.channel % 5);
}
if (params[1] == 0)
{
for (int i = 1; i <= gpGlobals->maxClients; ++i)
@ -387,12 +369,10 @@ static cell AMX_NATIVE_CALL show_hudmessage(AMX *amx, cell *params) /* 2 param *
message = UTIL_SplitHudMessage(format_amxstring(amx, params, 2, len));
if (aut)
{
channel = pPlayer->NextHUDChannel();
pPlayer->channels[channel] = gpGlobals->time;
g_hudset.channel = channel;
g_hudset.channel = pPlayer->NextHUDChannel();
pPlayer->channels[g_hudset.channel] = gpGlobals->time;
}
//don't need to set g_hudset!
pPlayer->hudmap[channel] = 0;
pPlayer->hudmap[g_hudset.channel] = 0;
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
}
}
@ -412,11 +392,10 @@ static cell AMX_NATIVE_CALL show_hudmessage(AMX *amx, cell *params) /* 2 param *
{
if (aut)
{
channel = pPlayer->NextHUDChannel();
pPlayer->channels[channel] = gpGlobals->time;
g_hudset.channel = channel;
g_hudset.channel = pPlayer->NextHUDChannel();
pPlayer->channels[g_hudset.channel] = gpGlobals->time;
}
pPlayer->hudmap[channel] = 0;
pPlayer->hudmap[g_hudset.channel] = 0;
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
}
}
@ -554,11 +533,6 @@ static cell AMX_NATIVE_CALL is_user_alive(AMX *amx, cell *params) /* 1 param */
return ((pPlayer->ingame && pPlayer->IsAlive()) ? 1 : 0);
}
static cell AMX_NATIVE_CALL get_amxx_verstring(AMX *amx, cell *params) /* 2 params */
{
return set_amxstring(amx, params[1], AMX_VERSION, params[2]);
}
static cell AMX_NATIVE_CALL get_user_frags(AMX *amx, cell *params) /* 1 param */
{
int index = params[1];
@ -653,20 +627,6 @@ static cell AMX_NATIVE_CALL get_weaponname(AMX *amx, cell *params) /* 3 param */
return set_amxstring(amx, params[2], g_weaponsData[index].fullName.c_str(), params[3]);
}
static cell AMX_NATIVE_CALL get_weaponid(AMX *amx, cell *params)
{
int ilen;
const char *name = get_amxstring(amx, params[1], 0, ilen);
for (int i = 1; i < MAX_WEAPONS; i++)
{
if (!strcmp(g_weaponsData[i].fullName.c_str(), name))
return g_weaponsData[i].iId;
}
return 0;
}
static cell AMX_NATIVE_CALL get_user_weapons(AMX *amx, cell *params) /* 3 param */
{
int index = params[1];
@ -1058,20 +1018,12 @@ static cell AMX_NATIVE_CALL register_plugin(AMX *amx, cell *params) /* 3 param *
{
CPluginMngr::CPlugin* a = g_plugins.findPluginFast(amx);
int i;
char *title = get_amxstring(amx, params[1], 0, i);
char *vers = get_amxstring(amx, params[2], 1, i);
char *author = get_amxstring(amx, params[3], 2, i);
#if defined BINLOG_ENABLED
g_BinLog.WriteOp(BinLog_Registered, a->getId(), title, vers);
#endif
a->setTitle(title);
a->setVersion(vers);
a->setAuthor(author);
a->setTitle(get_amxstring(amx, params[1], 0, i));
a->setVersion(get_amxstring(amx, params[2], 0, i));
a->setAuthor(get_amxstring(amx, params[3], 0, i));
return a->getId();
return 1;
}
static cell AMX_NATIVE_CALL register_menucmd(AMX *amx, cell *params) /* 3 param */
@ -1143,7 +1095,7 @@ static cell AMX_NATIVE_CALL amx_md5_file(AMX *amx, cell *params)
if (!fp)
{
LogError(amx, AMX_ERR_NATIVE, "Cant open file \"%s\"", file);
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -1350,7 +1302,8 @@ static cell AMX_NATIVE_CALL register_event(AMX *amx, cell *params) /* 2 param */
if ((pos = g_events.getEventId(sTemp)) == 0)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid event (name \"%s\") (plugin \"%s\")", sTemp, plugin->getName());
AMXXLOG_Log("[AMXX] Invalid event (name \"%s\") (plugin \"%s\")", sTemp, plugin->getName());
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -1556,9 +1509,7 @@ static cell AMX_NATIVE_CALL get_pcvar_float(AMX *amx, cell *params)
return 0;
}
REAL val = (REAL)ptr->value;
return amx_ftoc(val);
return amx_ftoc(ptr->value);
}
static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params) /* 1 param */
@ -1642,6 +1593,116 @@ static cell AMX_NATIVE_CALL set_cvar_string(AMX *amx, cell *params) /* 2 param *
return 1;
}
static cell AMX_NATIVE_CALL message_begin(AMX *amx, cell *params) /* 4 param */
{
int numparam = *params / sizeof(cell);
float vecOrigin[3];
cell *cpOrigin;
if (params[2] < 1 || ((params[2] > 63) // maximal number of engine messages
&& !GET_USER_MSG_NAME(PLID, params[2], NULL)))
{
AMXXLOG_Log("[AMXX] Plugin called message_begin with an invalid message id (%d).", params[2]);
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
switch (params[1])
{
case MSG_BROADCAST:
case MSG_ALL:
case MSG_SPEC:
MESSAGE_BEGIN(params[1], params[2], NULL);
break;
case MSG_PVS: case MSG_PAS:
case MSG_PVS_R: case MSG_PAS_R:
if (numparam < 3)
{
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
cpOrigin = get_amxaddr(amx, params[3]);
vecOrigin[0] = static_cast<float>(*cpOrigin);
vecOrigin[1] = static_cast<float>(*(cpOrigin + 1));
vecOrigin[2] = static_cast<float>(*(cpOrigin + 2));
MESSAGE_BEGIN(params[1], params[2], vecOrigin);
break;
case MSG_ONE_UNRELIABLE:
case MSG_ONE:
if (numparam < 4)
{
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
MESSAGE_BEGIN(params[1], params[2], NULL, INDEXENT(params[4]));
break;
}
return 1;
}
static cell AMX_NATIVE_CALL message_end(AMX *amx, cell *params)
{
MESSAGE_END();
return 1;
}
static cell AMX_NATIVE_CALL write_byte(AMX *amx, cell *params) /* 1 param */
{
WRITE_BYTE(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL write_char(AMX *amx, cell *params) /* 1 param */
{
WRITE_CHAR(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL write_short(AMX *amx, cell *params) /* 1 param */
{
WRITE_SHORT(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL write_long(AMX *amx, cell *params) /* 1 param */
{
WRITE_LONG(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL write_entity(AMX *amx, cell *params) /* 1 param */
{
WRITE_ENTITY(params[1]);
return 1;
}
static cell AMX_NATIVE_CALL write_angle(AMX *amx, cell *params) /* 1 param */
{
WRITE_ANGLE(static_cast<float>(params[1]));
return 1;
}
static cell AMX_NATIVE_CALL write_coord(AMX *amx, cell *params) /* 1 param */
{
WRITE_COORD(static_cast<float>(params[1]));
return 1;
}
static cell AMX_NATIVE_CALL write_string(AMX *amx, cell *params) /* 1 param */
{
int a;
WRITE_STRING(get_amxstring(amx, params[1], 3, a));
return 1;
}
static cell AMX_NATIVE_CALL log_message(AMX *amx, cell *params) /* 1 param */
{
int len;
@ -1736,6 +1797,12 @@ static cell AMX_NATIVE_CALL get_time(AMX *amx, cell *params) /* 3 param */
time_t td = time(NULL);
tm* lt = localtime(&td);
if (lt == 0)
{
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
char szDate[512];
strftime(szDate, 511, sptemp, lt);
@ -1752,7 +1819,7 @@ static cell AMX_NATIVE_CALL format_time(AMX *amx, cell *params) /* 3 param */
if (lt == 0)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't get localtime");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -1778,7 +1845,7 @@ static cell AMX_NATIVE_CALL parse_time(AMX *amx, cell *params) /* 3 param */
if (mytime == 0)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't get localtime");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -1789,7 +1856,7 @@ static cell AMX_NATIVE_CALL parse_time(AMX *amx, cell *params) /* 3 param */
if (mytime == 0)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't get localtime");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -1827,7 +1894,7 @@ static cell AMX_NATIVE_CALL read_data(AMX *amx, cell *params) /* 3 param */
return set_amxstring(amx, params[2], g_events.getArgString(params[1]), *get_amxaddr(amx, params[3]));
default:
cell *fCell = get_amxaddr(amx, params[2]);
REAL fparam = (REAL)g_events.getArgFloat(params[1]);
float fparam = g_events.getArgFloat(params[1]);
fCell[0] = amx_ftoc(fparam);
return (int)fparam;
}
@ -1887,8 +1954,6 @@ static cell AMX_NATIVE_CALL get_players(AMX *amx, cell *params) /* 4 param */
continue;
if ((flags & 16) && (pPlayer->teamId != team))
continue;
if ((flags & 128) && (pPlayer->pEdict->v.flags & FL_PROXY))
continue;
if (flags & 32)
{
if (flags & 64)
@ -2003,7 +2068,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 = (REAL)gpGlobals->time;
REAL pFloat = gpGlobals->time;
return amx_ftoc(pFloat);
}
@ -2141,7 +2206,9 @@ static cell AMX_NATIVE_CALL set_task(AMX *amx, cell *params) /* 2 param */
if (iFunc == -1)
{
LogError(amx, AMX_ERR_NATIVE, "Function is not present (function \"%s\") (plugin \"%s\")", stemp, plugin->getName());
AMXXLOG_Log("[AMXX] Function is not present (function \"%s\") (plugin \"%s\")", stemp, plugin->getName());
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -2307,7 +2374,7 @@ static cell AMX_NATIVE_CALL pause(AMX *amx, cell *params) /* 3 param */
if (flags & 2) // pause function
{
LogError(amx, AMX_ERR_NATIVE, "This usage of the native pause() has been deprecated!");
AMXXLOG_Log("[AMXX] This usage of the native pause() has been deprecated!");
return 1;
}
else if (flags & 4)
@ -2343,7 +2410,7 @@ static cell AMX_NATIVE_CALL unpause(AMX *amx, cell *params) /* 3 param */
if (flags & 2)
{
LogError(amx, AMX_ERR_NATIVE, "This usage of the native pause() has been deprecated!");
AMXXLOG_Log("[AMXX] This usage of the native pause() has been deprecated!");
return 1;
}
else if (flags & 4)
@ -2498,12 +2565,12 @@ static cell AMX_NATIVE_CALL precache_sound(AMX *amx, cell *params) /* 1 param */
{
if (g_dontprecache)
{
LogError(amx, AMX_ERR_NATIVE, "Precaching not allowed");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
int len;
char* sptemp = get_amxstring(amx, params[1], 0, len);
int ilen;
char* sptemp = get_amxstring(amx, params[1], 0, ilen);
PRECACHE_SOUND((char*)STRING(ALLOC_STRING(sptemp)));
@ -2514,28 +2581,40 @@ static cell AMX_NATIVE_CALL precache_model(AMX *amx, cell *params) /* 1 param */
{
if (g_dontprecache)
{
LogError(amx, AMX_ERR_NATIVE, "Precaching not allowed");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
int len;
char* sptemp = get_amxstring(amx, params[1], 0, len);
int ilen;
char* sptemp = get_amxstring(amx, params[1], 0, ilen);
return PRECACHE_MODEL((char*)STRING(ALLOC_STRING(sptemp)));
}
static cell AMX_NATIVE_CALL precache_generic(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL get_distance(AMX *amx, cell *params) /* 2 param */
{
if (g_dontprecache)
{
LogError(amx, AMX_ERR_NATIVE, "Precaching not allowed");
return 0;
}
cell *cpVec1 = get_amxaddr(amx, params[1]);
cell *cpVec2 = get_amxaddr(amx, params[2]);
Vector vec1 = Vector((float)cpVec1[0], (float)cpVec1[1], (float)cpVec1[2]);
Vector vec2 = Vector((float)cpVec2[0], (float)cpVec2[1], (float)cpVec2[2]);
int iDist = (int)((vec1 - vec2).Length());
return iDist;
}
int len;
char* sptemp = get_amxstring(amx, params[1], 0, len);
static cell AMX_NATIVE_CALL get_distance_f(AMX *amx, cell *params)
{
cell *cpVec1 = get_amxaddr(amx, params[1]);
cell *cpVec2 = get_amxaddr(amx, params[2]);
Vector vec1 = Vector((float)amx_ctof(cpVec1[0]), (float)amx_ctof(cpVec1[1]), (float)amx_ctof(cpVec1[2]));
Vector vec2 = Vector((float)amx_ctof(cpVec2[0]), (float)amx_ctof(cpVec2[1]), (float)amx_ctof(cpVec2[2]));
return PRECACHE_GENERIC((char*)STRING(ALLOC_STRING(sptemp)));
REAL fDist = (REAL) (vec1 - vec2).Length();
return amx_ftoc(fDist);
}
static cell AMX_NATIVE_CALL random_float(AMX *amx, cell *params) /* 2 param */
@ -2754,7 +2833,7 @@ static cell AMX_NATIVE_CALL parse_loguser(AMX *amx, cell *params)
if (len < 6) // no user to parse!?
{
LogError(amx, AMX_ERR_NATIVE, "No user name specified");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -2778,7 +2857,7 @@ static cell AMX_NATIVE_CALL parse_loguser(AMX *amx, cell *params)
/******** GET AUTHID **********/
if (len <= 0)
{
LogError(amx, AMX_ERR_NATIVE, "No Authid found");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -2801,7 +2880,7 @@ static cell AMX_NATIVE_CALL parse_loguser(AMX *amx, cell *params)
/******** GET USERID **********/
if (len <= 0)
{
LogError(amx, AMX_ERR_NATIVE, "No Userid found");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -3109,7 +3188,6 @@ static cell AMX_NATIVE_CALL callfunc_begin(AMX *amx, cell *params)
// set globals
g_CallFunc_Plugin = plugin;
g_CallFunc_Func = func;
g_CallFunc_CurParam = 0;
return 1; // success: 1
}
@ -3127,13 +3205,6 @@ static cell AMX_NATIVE_CALL callfunc_begin_i(AMX *amx, cell *params)
if (!plugin)
return -1;
if (g_CallFunc_Plugin)
{
// scripter's fault
LogError(amx, AMX_ERR_NATIVE, "callfunc_begin called without callfunc_end");
return 0;
}
if (params[1] < 0)
{
LogError(amx, AMX_ERR_NATIVE, "Public function %d is invalid", params[1]);
@ -3145,7 +3216,6 @@ static cell AMX_NATIVE_CALL callfunc_begin_i(AMX *amx, cell *params)
g_CallFunc_Plugin = plugin;
g_CallFunc_Func = params[1];
g_CallFunc_CurParam = 0;
return 1;
}
@ -3274,7 +3344,8 @@ static cell AMX_NATIVE_CALL callfunc_push_byval(AMX *amx, cell *params)
if (g_CallFunc_CurParam == CALLFUNC_MAXPARAMS)
{
LogError(amx, AMX_ERR_NATIVE, "Callfunc_push_xxx: maximal parameters num: %d", CALLFUNC_MAXPARAMS);
AMXXLOG_Log("[AMXX] callfunc_push_xxx: maximal parameters num: %d", CALLFUNC_MAXPARAMS);
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -3615,10 +3686,6 @@ static cell AMX_NATIVE_CALL amx_abort(AMX *amx, cell *params)
if (pPlugin)
filename = pPlugin->getName();
//we were in a callfunc?
if (g_CallFunc_Plugin == pPlugin)
g_CallFunc_Plugin = NULL;
if (fmt)
LogError(amx, err, "[%s] %s", filename, fmt);
else
@ -3632,18 +3699,43 @@ static cell AMX_NATIVE_CALL module_exists(AMX *amx, cell *params)
int len;
char *module = get_amxstring(amx, params[1], 0, len);
if (!FindLibrary(module, LibType_Library))
return FindLibrary(module, LibType_Class);
CList<CModule, const char *>::iterator a;
return true;
}
bool isdbi = false, found = false;
const amxx_module_info_s *info;
if (stricmp(module, "dbi") == 0)
isdbi = true;
static cell AMX_NATIVE_CALL LibraryExists(AMX *amx, cell *params)
{
int len;
char *library = get_amxstring(amx, params[1], 0, len);
for (a = g_modules.begin(); a; ++a)
{
if ((*a).getStatusValue() == MODULE_LOADED)
{
info = (*a).getInfoNew();
if (info)
{
if (isdbi)
{
if (info->logtag && (StrCaseStr(info->logtag, "sql") || StrCaseStr(info->logtag, "dbi")))
{
found = true;
break;
}
} else {
if (info->logtag && (stricmp(info->logtag, module) == 0))
{
found = true;
break;
}
}
}
}
}
if (!found)
found = LibraryExists(module);
return FindLibrary(library, static_cast<LibType>(params[2]));
return (found ? 1 : 0);
}
static cell AMX_NATIVE_CALL set_fail_state(AMX *amx, cell *params)
@ -3725,7 +3817,7 @@ static cell AMX_NATIVE_CALL CreateOneForward(AMX *amx, cell *params)
for (cell i=3; i<=count; i++)
ps[i-3] = *get_amxaddr(amx, params[i]);
return registerSPForwardByNameC(p->getAMX(), funcname, ps, count-2);
return registerSPForwardByNameC(amx, funcname, ps, count-2);
}
static cell AMX_NATIVE_CALL PrepareArray(AMX *amx, cell *params)
@ -3742,7 +3834,7 @@ static cell AMX_NATIVE_CALL ExecuteForward(AMX *amx, cell *params)
int id = static_cast<int>(params[1]);
int str_id = 0;
int len;
cell *addr = get_amxaddr(amx, params[2]);
cell *addr = get_amxaddr(amx, params[1]);
if (!g_forwards.isIdValid(id))
return 0;
@ -3799,7 +3891,8 @@ static cell AMX_NATIVE_CALL CreateHudSyncObj(AMX *amx, cell *params)
return static_cast<cell>(g_hudsync.size());
}
void CheckAndClearPlayerHUD(CPlayer *player, int &channel, unsigned int sync_obj)
hudtextparms_t temp_hud_stuff;
void CheckAndClearPlayerHUD(CPlayer *player, unsigned int channel, unsigned int sync_obj)
{
/**
* player and channel should be guaranteed to be good to go.
@ -3811,8 +3904,27 @@ void CheckAndClearPlayerHUD(CPlayer *player, int &channel, unsigned int sync_obj
//check if the last sync on this channel was this sync obj
if (player->hudmap[last_channel] == sync_obj + 1)
{
//if so, we can safely REUSE it
channel = (int)last_channel;
//if so, we can safely CLEAR it.
temp_hud_stuff.a1 = 0;
temp_hud_stuff.a2 = 0;
temp_hud_stuff.r2 = 255;
temp_hud_stuff.g2 = 255;
temp_hud_stuff.b2 = 250;
temp_hud_stuff.r1 = 0;
temp_hud_stuff.g1 = 0;
temp_hud_stuff.b1 = 0;
temp_hud_stuff.x = 0.0f;
temp_hud_stuff.y = 0.0f;
temp_hud_stuff.effect = 0;
temp_hud_stuff.fxTime = 0.0f;
temp_hud_stuff.holdTime = 0.01;
temp_hud_stuff.fadeinTime = 0.0f;
temp_hud_stuff.fadeoutTime = 0.0f;
temp_hud_stuff.channel = last_channel;
static char msg[255];
msg[0] = '\0';
char *msg_ptr = UTIL_SplitHudMessage(msg);
UTIL_HudMessage(player->pEdict, temp_hud_stuff, msg_ptr);
}
//set the new states
@ -3822,7 +3934,6 @@ void CheckAndClearPlayerHUD(CPlayer *player, int &channel, unsigned int sync_obj
static cell AMX_NATIVE_CALL ClearSyncHud(AMX *amx, cell *params)
{
int len = 0;
int index = params[1];
unsigned int sync_obj = static_cast<unsigned int>(params[2]) - 1;
@ -3832,24 +3943,19 @@ static cell AMX_NATIVE_CALL ClearSyncHud(AMX *amx, cell *params)
return 0;
}
g_langMngr.SetDefLang(params[1]);
cell *plist = g_hudsync[sync_obj];
if (index == 0)
{
for (int i = 1; i <= gpGlobals->maxClients; ++i)
CPlayer *pPlayer;
for (int i = 1; i <= gpGlobals->maxClients; i++)
{
CPlayer *pPlayer = GET_PLAYER_POINTER_I(i);
pPlayer = GET_PLAYER_POINTER_I(i);
int channel;
if (pPlayer->ingame)
{
g_langMngr.SetDefLang(i);
channel = pPlayer->NextHUDChannel();
CheckAndClearPlayerHUD(pPlayer, channel, sync_obj);
pPlayer->channels[channel] = gpGlobals->time;
g_hudset.channel = channel;
UTIL_HudMessage(pPlayer->pEdict, g_hudset, "");
}
if (!pPlayer->ingame)
continue;
CheckAndClearPlayerHUD(pPlayer, plist[pPlayer->index], sync_obj);
}
} else {
if (index < 1 || index > gpGlobals->maxClients)
@ -3857,20 +3963,16 @@ static cell AMX_NATIVE_CALL ClearSyncHud(AMX *amx, cell *params)
LogError(amx, AMX_ERR_NATIVE, "Invalid player id %d", index);
return 0;
}
CPlayer* pPlayer = GET_PLAYER_POINTER_I(index);
if (pPlayer->ingame)
{
int channel = pPlayer->NextHUDChannel();
CheckAndClearPlayerHUD(pPlayer, channel, sync_obj);
pPlayer->channels[channel] = gpGlobals->time;
g_hudset.channel = channel;
UTIL_HudMessage(pPlayer->pEdict, g_hudset, "");
CheckAndClearPlayerHUD(pPlayer, plist[pPlayer->index], sync_obj);
}
}
return len;
return 1;
}
//params[1] - target
@ -3897,14 +3999,12 @@ static cell AMX_NATIVE_CALL ShowSyncHudMsg(AMX *amx, cell *params)
{
CPlayer *pPlayer = GET_PLAYER_POINTER_I(i);
int channel;
if (pPlayer->ingame)
{
g_langMngr.SetDefLang(i);
channel = pPlayer->NextHUDChannel();
CheckAndClearPlayerHUD(pPlayer, channel, sync_obj);
pPlayer->channels[channel] = gpGlobals->time;
g_hudset.channel = channel;
g_hudset.channel = pPlayer->NextHUDChannel();
pPlayer->channels[g_hudset.channel] = gpGlobals->time;
CheckAndClearPlayerHUD(pPlayer, g_hudset.channel, sync_obj);
message = UTIL_SplitHudMessage(format_amxstring(amx, params, 3, len));
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
}
@ -3920,10 +4020,9 @@ static cell AMX_NATIVE_CALL ShowSyncHudMsg(AMX *amx, cell *params)
if (pPlayer->ingame)
{
int channel = pPlayer->NextHUDChannel();
CheckAndClearPlayerHUD(pPlayer, channel, sync_obj);
pPlayer->channels[channel] = gpGlobals->time;
g_hudset.channel = channel;
g_hudset.channel = pPlayer->NextHUDChannel();
pPlayer->channels[g_hudset.channel] = gpGlobals->time;
CheckAndClearPlayerHUD(pPlayer, g_hudset.channel, sync_obj);
message = UTIL_SplitHudMessage(format_amxstring(amx, params, 3, len));
UTIL_HudMessage(pPlayer->pEdict, g_hudset, message);
}
@ -3932,43 +4031,9 @@ static cell AMX_NATIVE_CALL ShowSyncHudMsg(AMX *amx, cell *params)
return len;
}
static cell AMX_NATIVE_CALL is_user_hacking(AMX *amx, cell *params)
{
return g_bmod_cstrike ? 1 : 0;
}
static cell AMX_NATIVE_CALL arrayset(AMX *amx, cell *params)
{
memset(get_amxaddr(amx, params[1]), params[2], params[3] * sizeof(cell));
return 1;
}
static cell AMX_NATIVE_CALL amxx_setpl_curweap(AMX *amx, cell *params)
{
if (params[1] < 1 || params[1] > gpGlobals->maxClients)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid client %d", params[1]);
return 0;
}
CPlayer *p = GET_PLAYER_POINTER_I(params[1]);
if (!p->ingame)
{
LogError(amx, AMX_ERR_NATIVE, "Player %d not ingame", params[1]);
return 0;
}
p->current = params[2];
return 1;
}
AMX_NATIVE_INFO amxmodx_Natives[] =
{
{"abort", amx_abort},
{"arrayset", arrayset},
{"get_addr_val", get_addr_val},
{"get_var_addr", get_var_addr},
{"set_addr_val", set_addr_val},
@ -4002,6 +4067,8 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"get_cvar_num", get_cvar_num},
{"get_cvar_pointer", get_cvar_pointer},
{"get_cvar_string", get_cvar_string},
{"get_distance", get_distance},
{"get_distance_f", get_distance_f},
{"get_flags", get_flags},
{"get_func_id", get_func_id},
{"get_gametime", get_gametime},
@ -4026,7 +4093,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"get_systime", get_systime},
{"get_time", get_time},
{"get_timeleft", get_timeleft},
{"get_amxx_verstring", get_amxx_verstring},
{"get_user_aiming", get_user_aiming},
{"get_user_ammo", get_user_ammo},
{"get_user_armor", get_user_armor},
@ -4051,7 +4117,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"hcsardhnexsnu", register_byval},
{"get_user_weapon", get_user_weapon},
{"get_user_weapons", get_user_weapons},
{"get_weaponid", get_weaponid},
{"get_weaponname", get_weaponname},
{"get_xvar_float", get_xvar_num},
{"get_xvar_id", get_xvar_id},
@ -4069,7 +4134,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"is_user_bot", is_user_bot},
{"is_user_connected", is_user_connected},
{"is_user_connecting", is_user_connecting},
{"is_user_hacking", is_user_hacking},
{"is_user_hltv", is_user_hltv},
{"lang_exists", lang_exists},
{"log_amx", log_amx},
@ -4077,6 +4141,8 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"log_to_file", log_to_file},
{"md5", amx_md5},
{"md5_file", amx_md5_file},
{"message_begin", message_begin},
{"message_end", message_end},
{"module_exists", module_exists},
{"mkdir", amx_mkdir},
{"next_hudchannel", next_hudchannel},
@ -4087,7 +4153,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"plugin_flags", plugin_flags},
{"precache_model", precache_model},
{"precache_sound", precache_sound},
{"precache_generic", precache_generic},
{"query_client_cvar", query_client_cvar},
{"random_float", random_float},
{"random_num", random_num},
@ -4141,6 +4206,14 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"user_has_weapon", user_has_weapon},
{"user_kill", user_kill},
{"user_slap", user_slap},
{"write_angle", write_angle},
{"write_byte", write_byte},
{"write_char", write_char},
{"write_coord", write_coord},
{"write_entity", write_entity},
{"write_long", write_long},
{"write_short", write_short},
{"write_string", write_string},
{"xvar_exists", xvar_exists},
{"ClearSyncHud", ClearSyncHud},
{"CreateHudSyncObj", CreateHudSyncObj},
@ -4150,6 +4223,5 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"ExecuteForward", ExecuteForward},
{"PrepareArray", PrepareArray},
{"ShowSyncHudMsg", ShowSyncHudMsg},
{"LibraryExists", LibraryExists},
{NULL, NULL}
};

View File

@ -42,13 +42,8 @@
#include <extdll.h>
#include <meta_api.h>
#ifdef _MSC_VER
// MSVC8 - replace POSIX functions with ISO C++ conformant ones as they are deprecated
#if _MSC_VER >= 1400
#define unlink _unlink
#define mkdir _mkdir
#define strdup _strdup
#endif
#ifdef MEMORY_TEST
#include "mmgr/mmgr.h"
#endif
#include "md5.h"
@ -72,8 +67,7 @@
#include "amxxlog.h"
#define AMXXLOG_Log g_log.Log
#define AMXXLOG_Error g_log.LogError
#define AMX_VERSION "1.75a"
#define AMX_VERSION "1.70"
extern AMX_NATIVE_INFO core_Natives[];
extern AMX_NATIVE_INFO time_Natives[];
@ -83,8 +77,6 @@ extern AMX_NATIVE_INFO file_Natives[];
extern AMX_NATIVE_INFO float_Natives[];
extern AMX_NATIVE_INFO string_Natives[];
extern AMX_NATIVE_INFO vault_Natives[];
extern AMX_NATIVE_INFO msg_Natives[];
extern AMX_NATIVE_INFO vector_Natives[];
#ifndef __linux__
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
@ -265,8 +257,6 @@ enum CountModulesMode
int countModules(CountModulesMode mode);
void modules_callPluginsLoaded();
void modules_callPluginsUnloaded();
void modules_callPluginsUnloading();
cell* get_amxaddr(AMX *amx, cell amx_addr);
char* build_pathname(char *fmt, ...);
@ -338,6 +328,4 @@ struct func_s
const char *desc;
};
extern enginefuncs_t *g_pEngTable;
#endif // AMXMODX_H

View File

@ -54,7 +54,7 @@ static cell AMX_NATIVE_CALL _time(AMX *amx, cell *params)
/* the time() function returns the number of seconds since January 1 1970
* in Universal Coordinated Time (the successor to Greenwich Mean Time)
*/
return (cell)sec1970;
return sec1970;
}
#if defined __BORLANDC__ || defined __WATCOMC__

View File

@ -109,7 +109,7 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
{
DATAREAD(&m_Bh.version, sizeof(int16_t), 1);
if (m_Bh.version > MAGIC_VERSION)
if (m_Bh.version != MAGIC_VERSION)
{
m_Status = Err_OldFile;
fclose(m_pFile);

View File

@ -48,7 +48,6 @@ CLog::CLog()
{
m_LogType = 0;
m_LogFile.clear();
m_FoundError = false;
}
CLog::~CLog()
@ -93,13 +92,11 @@ void CLog::CreateNewFile()
time(&td);
tm *curTime = localtime(&td);
char file[256];
int i = 0;
while (true)
{
build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i);
FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists
FILE *pTmpFile = fopen(m_LogFile.c_str(), "r"); // open for reading to check whether the file exists
if (!pTmpFile)
break;
@ -107,7 +104,6 @@ void CLog::CreateNewFile()
fclose(pTmpFile);
++i;
}
m_LogFile.assign(file);
// Log logfile start
FILE *fp = fopen(m_LogFile.c_str(), "w");
@ -227,45 +223,3 @@ void CLog::Log(const char *fmt, ...)
ALERT(at_logged, "%s\n", msg_);
}
}
void CLog::LogError(const char *fmt, ...)
{
static char file[256];
if (m_FoundError)
return;
// get time
time_t td;
time(&td);
tm *curTime = localtime(&td);
char date[32];
strftime(date, 31, "%m/%d/%Y - %H:%M:%S", curTime);
// msg
static char msg[3072];
va_list arglst;
va_start(arglst, fmt);
vsnprintf(msg, 3071, fmt, arglst);
va_end(arglst);
FILE *pF = NULL;
build_pathname_r(file, sizeof(file)-1, "%s/error_%02d%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100);
pF = fopen(file, "a+");
if (pF)
{
fprintf(pF, "L %s: %s\n", date, msg);
fclose(pF);
} else {
ALERT(at_logged, "[AMXX] Unexpected fatal logging error (couldn't open %s for a+). AMXX Error Logging disabled for this map.\n", file);
m_FoundError = true;
return;
}
// print on server console
print_srvconsole("L %s: %s\n", date, msg);
}

View File

@ -36,7 +36,6 @@ class CLog
private:
String m_LogFile;
int m_LogType;
bool m_FoundError;
void GetLastFile(int &outMonth, int &outDay, String &outFilename);
void UseFile(const String &fileName);
@ -48,7 +47,6 @@ public:
void CloseFile();
void MapChange();
void Log(const char *fmt, ...);
void LogError(const char *fmt, ...);
};
#endif // __AMXXLOG_H__

View File

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

View File

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

View File

@ -31,7 +31,6 @@
#include "amxmodx.h"
#include "debugger.h"
#include "binlog.h"
#if !defined WIN32 && !defined _WIN32
#define _snprintf snprintf
@ -308,19 +307,6 @@ void Debugger::StepI()
{
assert(m_Top >= 0 && m_Top < (int)m_pCalls.size());
#if defined BINLOG_ENABLED
if (g_binlog_level & 32)
{
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(m_pAmx);
if (pl)
{
long line;
dbg_LookupLine(m_pAmxDbg, m_pAmx->cip, &line);
g_BinLog.WriteOp(BinLog_SetLine, pl->getId(), (int)(line + 1));
}
}
#endif
m_pCalls[m_Top]->StepI(m_pAmx->frm, m_pAmx->cip);
}
@ -556,15 +542,15 @@ void Debugger::Clear()
void Debugger::DisplayTrace(const char *message)
{
if (message != NULL)
AMXXLOG_Error("%s", message);
AMXXLOG_Log("%s", message);
char buffer[512];
FormatError(buffer, sizeof(buffer)-1);
const char *filename = _GetFilename();
AMXXLOG_Error("[AMXX] Displaying debug trace (plugin \"%s\")", filename);
AMXXLOG_Error("[AMXX] %s", buffer);
AMXXLOG_Log("[AMXX] Displaying debug trace (plugin \"%s\")", filename);
AMXXLOG_Log("[AMXX] %s", buffer);
int count = 0;
long lLine;
@ -573,7 +559,7 @@ void Debugger::DisplayTrace(const char *message)
while (pTrace)
{
GetTraceInfo(pTrace, lLine, function, file);
AMXXLOG_Error(
AMXXLOG_Log(
"[AMXX] [%d] %s::%s (line %d)",
count,
file,
@ -633,14 +619,12 @@ void Debugger::GenericMessage(AMX *amx, int err)
Debugger::FmtGenericMsg(amx, err, buffer, sizeof(buffer)-1);
if (buffer[0] != '\0')
AMXXLOG_Error("[AMXX] %s", buffer);
AMXXLOG_Log("[AMXX] %s", buffer);
}
Debugger::~Debugger()
{
Clear();
dbg_FreeInfo(m_pAmxDbg);
delete m_pAmxDbg;
}
int Handler::SetErrorHandler(const char *function)
@ -649,7 +633,7 @@ int Handler::SetErrorHandler(const char *function)
error = amx_FindPublic(m_pAmx, function, &m_iErrFunc);
if (error != AMX_ERR_NONE && m_iErrFunc < 0)
if (error != AMX_ERR_NONE && m_iErrFunc < 1)
m_iErrFunc = -1;
return error;
@ -661,7 +645,7 @@ int Handler::SetModuleFilter(const char *function)
error = amx_FindPublic(m_pAmx, function, &m_iModFunc);
if (error != AMX_ERR_NONE && m_iModFunc < 0)
if (error != AMX_ERR_NONE && m_iModFunc < 1)
m_iModFunc = -1;
return error;
@ -695,9 +679,9 @@ const char *Handler::GetLastMsg()
return m_MsgCache.c_str();
}
int Handler::HandleModule(const char *module, bool isClass)
int Handler::HandleModule(const char *module)
{
if (m_iModFunc < 0)
if (m_iModFunc < 1)
return 0;
/**
@ -711,7 +695,6 @@ int Handler::HandleModule(const char *module, bool isClass)
//temporarily set prenit
m_pAmx->flags |= AMX_FLAG_PRENIT;
amx_Push(m_pAmx, isClass ? 1 : 0);
amx_PushString(m_pAmx, &hea_addr, &phys_addr, module, 0, 0);
int err = amx_Exec(m_pAmx, &retval, m_iModFunc);
amx_Release(m_pAmx, hea_addr);
@ -765,7 +748,7 @@ int Handler::HandleNative(const char *native, int index, int trap)
}
if (!trap)
{
AMXXLOG_Error("[AMXX] Runtime failure %d occurred in native filter. Aborting plugin load.", err);
AMXXLOG_Log("[AMXX] Runtime failure %d occurred in native filter. Aborting plugin load.", err);
return 0;
}
//handle this manually.
@ -776,7 +759,7 @@ int Handler::HandleNative(const char *native, int index, int trap)
} else if (err != -1) {
LogError(m_pAmx, err, NULL);
}
AMXXLOG_Error("[AMXX] NOTE: Runtime failures in native filters are not good!");
AMXXLOG_Log("[AMXX] NOTE: Runtime failures in native filters are not good!");
retval = 0;
}
if (!trap)
@ -836,10 +819,10 @@ int Handler::HandleError(const char *msg)
pDebugger->DisplayTrace(msg);
} else {
if (GetLastMsg())
AMXXLOG_Error("%s", GetLastMsg());
AMXXLOG_Log("%s", GetLastMsg());
Debugger::GenericMessage(m_pAmx, err);
}
AMXXLOG_Error("[AMXX] NOTE: Runtime failures in an error filter are not good!");
AMXXLOG_Log("[AMXX] NOTE: Runtime failures in an error filter are not good!");
}
if (pDebugger)
@ -867,7 +850,7 @@ static cell AMX_NATIVE_CALL set_error_filter(AMX *amx, cell *params)
if (!pHandler)
{
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
AMXXLOG_Error("[AMXX] Plugin not initialized correctly.");
AMXXLOG_Log("[AMXX] Plugin not initialized correctly.");
return 0;
}
@ -875,7 +858,7 @@ static cell AMX_NATIVE_CALL set_error_filter(AMX *amx, cell *params)
if (err != AMX_ERR_NONE)
{
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
AMXXLOG_Error("[AMXX] Function not found: %s", function);
AMXXLOG_Log("[AMXX] Function not found: %s", function);
return 0;
}
@ -955,7 +938,7 @@ static cell AMX_NATIVE_CALL set_native_filter(AMX *amx, cell *params)
if (!pHandler)
{
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
AMXXLOG_Error("[AMXX] Plugin not initialized correctly.");
AMXXLOG_Log("[AMXX] Plugin not initialized correctly.");
return 0;
}
@ -974,7 +957,7 @@ static cell AMX_NATIVE_CALL set_native_filter(AMX *amx, cell *params)
if (err != AMX_ERR_NONE)
{
Debugger::GenericMessage(amx, AMX_ERR_NOTFOUND);
AMXXLOG_Error("[AMXX] Function not found: %s", function);
AMXXLOG_Log("[AMXX] Function not found: %s", function);
return 0;
}

View File

@ -167,7 +167,7 @@ public:
public:
int HandleError(const char *msg);
int HandleNative(const char *native, int index, int trap);
int HandleModule(const char *module, bool isClass=false);
int HandleModule(const char *module);
public:
bool IsHandling() const { return m_Handling; }
void SetErrorMsg(const char *msg);

View File

@ -51,6 +51,8 @@
#include <io.h>
#endif
#include <extdll.h>
#include <meta_api.h>
#include "amxmodx.h"
CVector<FILE *> FileList;
@ -139,7 +141,7 @@ static cell AMX_NATIVE_CALL read_file(AMX *amx, cell *params) /* 5 param */
if ((fp =fopen(build_pathname("%s", szFile), "r")) == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't read file \"%s\"", szFile);
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -183,7 +185,7 @@ static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */
{
if ((pFile = fopen(sFile, "a")) == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -199,7 +201,7 @@ static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */
{
if ((pFile = fopen(sFile, "w")) == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -219,7 +221,7 @@ static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */
if ((pTemp = tmpfile()) == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't create temp file");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -249,7 +251,7 @@ static cell AMX_NATIVE_CALL write_file(AMX *amx, cell *params) /* 3 param */
// now rewrite because file can be now smaller...
if ((pFile = fopen(sFile, "w")) == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't write file \"%s\"", sFile);
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -305,7 +307,27 @@ static cell AMX_NATIVE_CALL dir_exists(AMX *amx, cell *params) /* 1 param */
char *sFile = get_amxstring(amx, params[1], 0, iLen);
char *file = build_pathname("%s", sFile);
return DirExists(file) ? 1 : 0;
#if defined WIN32 || defined _WIN32
DWORD attr = GetFileAttributes(file);
if (attr == INVALID_FILE_ATTRIBUTES)
return 0;
if (attr == FILE_ATTRIBUTE_DIRECTORY)
return 1;
return 0;
#else
struct stat s;
if (stat(file, &s) != 0)
return 0;
if (S_ISDIR(s.st_mode))
return 1;
return 0;
#endif
}
static cell AMX_NATIVE_CALL file_size(AMX *amx, cell *params) /* 1 param */
@ -554,18 +576,6 @@ static cell AMX_NATIVE_CALL amx_fread_blocks(AMX *amx, cell *params)
return 0;
}
static cell AMX_NATIVE_CALL amx_fputs(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
int len;
char *str = get_amxstring(amx, params[2], 0, len);
return fputs(str, fp);
}
static cell AMX_NATIVE_CALL amx_fgets(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
@ -751,67 +761,6 @@ static cell AMX_NATIVE_CALL amx_get_dir(AMX *amx, cell *params)
#endif
}
//native fgetc( file );
static cell AMX_NATIVE_CALL amx_fgetc(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
return fgetc(fp);
}
//native fputc( file, data );
static cell AMX_NATIVE_CALL amx_fputc(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
return fputc(static_cast<int>(params[2]), fp);
}
//native ungetc( file, data );
static cell AMX_NATIVE_CALL amx_ungetc(AMX *amx, cell *params)
{
FILE *fp = (FILE *)params[1];
if (!fp)
return 0;
return ungetc(static_cast<int>(params[2]), fp);
}
#if defined __linux__
#define _rmdir rmdir
#endif
static cell AMX_NATIVE_CALL amx_rmdir(AMX *amx, cell *params)
{
int len;
char* sFile = build_pathname("%s", get_amxstring(amx, params[1], 0, len));
if (_rmdir(sFile) != 0)
return 0;
return 1;
}
static cell AMX_NATIVE_CALL amx_rename(AMX *amx, cell *params)
{
int len;
char *fold = get_amxstring(amx, params[1], 0, len);
char *fnew = get_amxstring(amx, params[2], 1, len);
#if defined __linux__
return (rename(fold, fnew) == 0);
#elif defined WIN32
return MoveFileA(fold, fnew);
#endif
}
AMX_NATIVE_INFO file_Natives[] =
{
{"delete_file", delete_file},
@ -836,16 +785,10 @@ AMX_NATIVE_INFO file_Natives[] =
{"ftell", amx_ftell},
{"filesize", amx_filesize},
{"unlink", delete_file},
{"build_pathname", amx_build_pathname},
{"build_pathname", amx_build_pathname},
{"dir_exists", dir_exists},
{"open_dir", amx_open_dir},
{"close_dir", amx_close_dir},
{"next_file", amx_get_dir},
{"fgetc", amx_fgetc},
{"fputc", amx_fputc},
{"fungetc", amx_ungetc},
{"rmdir", amx_rmdir},
{"fputs", amx_fputs},
{"rename_file", amx_rename},
{NULL, NULL}
};

View File

@ -80,14 +80,14 @@ const char *translate(AMX *amx, cell amxaddr, const char *key)
const char *testlang = amx_mldebug->string;
if (!g_langMngr.LangExists(testlang))
{
AMXXLOG_Error("[AMXX] \"%s\" is an invalid debug language", testlang);
AMXXLOG_Log("[AMXX] \"%s\" is an invalid debug language", testlang);
validlang = false;
}
g_langMngr.GetDef(testlang, key, debug_status);
if (validlang && debug_status == ERR_BADKEY)
AMXXLOG_Error("[AMXX] Language key \"%s\" not found for language \"%s\", check \"%s\"", key, testlang, GetFileName(amx));
AMXXLOG_Log("[AMXX] Language key \"%s\" not found for language \"%s\", check \"%s\"", key, testlang, GetFileName(amx));
}
if (def == NULL)
@ -96,7 +96,7 @@ const char *translate(AMX *amx, cell amxaddr, const char *key)
{
if (status == ERR_BADLANG && (BadLang_Table.AltFindOrInsert(pLangName).last + 120.0f < gpGlobals->time))
{
AMXXLOG_Error("[AMXX] Language \"%s\" not found", pLangName);
AMXXLOG_Log("[AMXX] Language \"%s\" not found", pLangName);
BadLang_Table.AltFindOrInsert(pLangName).last = gpGlobals->time;
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -33,18 +33,12 @@
#if defined WIN32
#include <direct.h>
#else
#include <dirent.h>
#endif
#include "amxmodx.h"
#include "fakemeta.h"
#include "newmenus.h"
#include "natives.h"
#include "binlog.h"
#include "optimizer.h"
#include "libraries.h"
#include "messages.h"
plugin_info_t Plugin_info =
{
@ -153,57 +147,6 @@ int FF_InconsistentFile = -1;
int FF_ClientAuthorized = -1;
int FF_ChangeLevel = -1;
void ParseAndOrAdd(CStack<String *> & files, const char *name)
{
if (strncmp(name, "plugins-", 8) == 0)
{
#if !defined WIN32
size_t len = strlen(name);
if (strcmp(&name[len-4], ".ini") == 0)
{
#endif
String *pString = new String(name);
files.push(pString);
#if !defined WIN32
}
#endif
}
}
void BuildPluginFileList(CStack<String *> & files)
{
char path[255];
#if defined WIN32
build_pathname_r(path, sizeof(path)-1, "%s/*.ini", get_localinfo("amxx_configsdir", "addons/amxmodx/configs"));
_finddata_t fd;
intptr_t handle = _findfirst(path, &fd);
if (handle < 0)
return;
while (!_findnext(handle, &fd))
{
ParseAndOrAdd(files, fd.name);
}
_findclose(handle);
#elif defined __linux__
build_pathname_r(path, sizeof(path)-1, "%s/", get_localinfo("amxx_configsdir", "addons/amxmodx/configs"));
struct dirent *ep;
DIR *dp;
if ((dp = opendir(path)) == NULL)
return;
while ( (ep=readdir(dp)) != NULL )
{
ParseAndOrAdd(files, ep->d_name);
}
closedir (dp);
#endif
}
// Precache stuff from force consistency calls
// or check for pointed files won't be done
int C_PrecacheModel(char *s)
@ -299,6 +242,15 @@ int C_Spawn(edict_t *pent)
// ###### Initialize task manager
g_tasksMngr.registerTimers(&gpGlobals->time, &mp_timelimit->value, &g_game_timeleft);
// ###### Load lang
char file[256];
if (!g_langMngr.Load(build_pathname_r(file, sizeof(file) - 1, "%s/languages.dat", get_localinfo("amxmodx_datadir", "addons/amxmodx/data"))))
{
g_langMngr.InvalidateCache();
} else {
g_langMngr.LoadCache(build_pathname_r(file, sizeof(file) - 1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
}
// ###### Initialize commands prefixes
g_commands.registerPrefix("amx");
g_commands.registerPrefix("amxx");
@ -316,20 +268,6 @@ int C_Spawn(edict_t *pent)
// ###### Load modules
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"), PT_ANYTIME);
g_plugins.CALMFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
CStack<String *> files;
BuildPluginFileList(files);
char path[255];
while (!files.empty())
{
String *pString = files.front();
snprintf(path, sizeof(path)-1, "%s/%s",
get_localinfo("amxx_configsdir", "addons/amxmodx/configs"),
pString->c_str());
g_plugins.CALMFromFile(path);
delete pString;
files.pop();
}
int loaded = countModules(CountModules_Running); // Call after attachModules so all modules don't have pending stat
// Set some info about amx version and modules
@ -339,7 +277,6 @@ int C_Spawn(edict_t *pent)
CVAR_SET_STRING(init_amxmodx_modules.name, buffer);
// ###### Load Vault
char file[255];
g_vault.setSource(build_pathname_r(file, sizeof(file) - 1, "%s", get_localinfo("amxx_vault", "addons/amxmodx/configs/vault.ini")));
g_vault.loadVault();
@ -361,23 +298,8 @@ int C_Spawn(edict_t *pent)
// Set server flags
memset(g_players[0].flags, -1, sizeof(g_players[0].flags));
g_opt_level = atoi(get_localinfo("optimizer", "7"));
if (!g_opt_level)
g_opt_level = 7;
// ###### Load AMX scripts
g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
BuildPluginFileList(files);
while (!files.empty())
{
String *pString = files.front();
snprintf(path, sizeof(path)-1, "%s/%s",
get_localinfo("amxx_configsdir", "addons/amxmodx/configs"),
pString->c_str());
g_plugins.loadPluginsFromFile(path);
delete pString;
files.pop();
}
g_plugins.Finalize();
// Register forwards
@ -395,15 +317,6 @@ int C_Spawn(edict_t *pent)
FF_ClientAuthorized = registerForward("client_authorized", ET_IGNORE, FP_CELL, FP_DONE);
FF_ChangeLevel = registerForward("server_changelevel", ET_STOP, FP_STRING, FP_DONE);
#if defined BINLOG_ENABLED
if (!g_BinLog.Open())
{
LOG_ERROR(PLID, "Binary log failed to open.");
}
g_binlog_level = atoi(get_localinfo("bin_logging", "17"));
g_binlog_maxsize = atoi(get_localinfo("max_binlog_size", "20"));
#endif
modules_callPluginsLoaded();
// ###### Call precache forward function
@ -517,6 +430,11 @@ void C_ServerActivate_Post(edict_t *pEdictList, int edictCount, int clientMax)
executeForwards(FF_PluginInit);
executeForwards(FF_PluginCfg);
// ###### Save lang
char file[256];
g_langMngr.Save(build_pathname_r(file, sizeof(file) - 1, "%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
g_langMngr.SaveCache(build_pathname_r(file, sizeof(file) - 1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
// Correct time in Counter-Strike and other mods (except DOD)
if (!g_bmod_dod)
g_game_timeleft = 0;
@ -568,8 +486,6 @@ void C_ServerDeactivate_Post()
{
if (!g_initialized)
RETURN_META(MRES_IGNORED);
modules_callPluginsUnloading();
detachReloadModules();
g_auth.clear();
@ -588,10 +504,13 @@ void C_ServerDeactivate_Post()
g_xvars.clear();
g_plugins.clear();
ClearPluginLibraries();
modules_callPluginsUnloaded();
ClearMessages();
char file[256];
g_langMngr.Save(build_pathname_r(file, sizeof(file) - 1, "%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
g_langMngr.SaveCache(build_pathname_r(file, sizeof(file) - 1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
g_langMngr.Clear();
for (unsigned int i=0; i<g_hudsync.size(); i++)
delete [] g_hudsync[i];
g_hudsync.clear();
@ -650,10 +569,6 @@ void C_ServerDeactivate_Post()
}
#endif // MEMORY_TEST
#if defined BINLOG_ENABLED
g_BinLog.Close();
#endif
g_initialized = false;
RETURN_META(MRES_IGNORED);
@ -1351,8 +1266,6 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
// This will also call modules Meta_Query and Meta_Attach functions
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"), now);
GET_HOOK_TABLES(PLID, &g_pEngTable, NULL, NULL);
return (TRUE);
}
@ -1364,8 +1277,6 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
return (FALSE);
}
modules_callPluginsUnloading();
g_auth.clear();
g_forwards.clear();
g_commands.clear();
@ -1382,11 +1293,6 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
g_xvars.clear();
g_plugins.clear();
g_cvars.clear();
g_langMngr.Clear();
ClearMessages();
modules_callPluginsUnloaded();
detachModules();
@ -1394,9 +1300,6 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
Module_UncacheFunctions();
ClearLibraries(LibSource_Plugin);
ClearLibraries(LibSource_Module);
return (TRUE);
}
@ -1532,18 +1435,6 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
meta_engfuncs.pfnPrecacheSound = C_PrecacheSound;
meta_engfuncs.pfnChangeLevel = C_ChangeLevel;
/* message stuff from messages.h/cpp */
meta_engfuncs.pfnMessageBegin = C_MessageBegin;
meta_engfuncs.pfnMessageEnd = C_MessageEnd;
meta_engfuncs.pfnWriteAngle = C_WriteAngle;
meta_engfuncs.pfnWriteByte = C_WriteByte;
meta_engfuncs.pfnWriteChar = C_WriteChar;
meta_engfuncs.pfnWriteCoord = C_WriteCoord;
meta_engfuncs.pfnWriteEntity = C_WriteEntity;
meta_engfuncs.pfnWriteLong = C_WriteLong;
meta_engfuncs.pfnWriteShort = C_WriteShort;
meta_engfuncs.pfnWriteString = C_WriteString;
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
return 1;

File diff suppressed because it is too large Load Diff

View File

@ -72,20 +72,12 @@ typedef enum
} PlayerProp;
int CheckModules(AMX *amx, char error[128]);
bool LoadModule(const char *shortname, PLUG_LOADTIME now, bool simplify=true, bool noFileBail=false);
const char *StrCaseStr(const char *as, const char *bs);
class Debugger;
Debugger *DisableDebugHandler(AMX *amx);
void EnableDebugHandler(AMX *amx, Debugger *pd);
bool DirExists(const char *dir);
const char* GetFileName(AMX *amx);
inline cell FloatToCell(float input)
{
REAL output = input;
return *(cell *)&output;
}
#endif // __MODULES_H__

View File

@ -5,20 +5,32 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx", "amxmodx_mm.vcpro
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
JITDebug = JITDebug
JITDebugBinLog = JITDebugBinLog
JITMemtestRelease = JITMemtestRelease
JITRelease = JITRelease
JITReleaseBinLog = JITReleaseBinLog
MaximalSpeed = MaximalSpeed
MemtestDebug = MemtestDebug
MemtestRelease = MemtestRelease
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Debug.ActiveCfg = Debug|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Debug.Build.0 = Debug|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug.ActiveCfg = JITDebug|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebug.Build.0 = JITDebug|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog.ActiveCfg = JITDebugBinLog|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITDebugBinLog.Build.0 = JITDebugBinLog|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITMemtestRelease.ActiveCfg = JITMemtestRelease|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITMemtestRelease.Build.0 = JITMemtestRelease|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease.ActiveCfg = JITRelease|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITRelease.Build.0 = JITRelease|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog.ActiveCfg = JITReleaseBinLog|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.JITReleaseBinLog.Build.0 = JITReleaseBinLog|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MaximalSpeed.ActiveCfg = MaximalSpeed|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MaximalSpeed.Build.0 = MaximalSpeed|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestDebug.ActiveCfg = MemtestDebug|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestDebug.Build.0 = MemtestDebug|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestRelease.ActiveCfg = MemtestRelease|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.MemtestRelease.Build.0 = MemtestRelease|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Release.ActiveCfg = Release|Win32
{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection

View File

@ -4,7 +4,6 @@
Version="7.10"
Name="amxmodx"
ProjectGUID="{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
RootNamespace="amxmodx"
SccProjectName=""
SccLocalPath="">
<Platforms>
@ -12,6 +11,287 @@
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="&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\dlls&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\engine&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\common&quot;;C:\Files\Programming\metamod\metamod"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
StructMemberAlignment="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\debug/amxmodx.pch"
AssemblerListingLocation=".\debug/"
ObjectFile=".\debug/"
ProgramDataBaseFileName=".\debug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="..\JIT\natives-x86.obj ..\zlib\zlib.lib"
OutputFile="debug/amxmodx_mm.dll"
Version="0.1"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="MSVCRT"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\debug/amxx_mm.pdb"
ImportLibrary=".\debug/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\release/amxmodx.pch"
AssemblerListingLocation=".\release/"
ObjectFile=".\release/"
ProgramDataBaseFileName=".\release/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib ..\JIT\natives-x86.obj"
OutputFile="release/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="LIBC"
ModuleDefinitionFile=""
ProgramDatabaseFile=".\release/amxx_mm.pdb"
ImportLibrary=".\release/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="MemtestDebug|Win32"
OutputDirectory="MemtestDebug"
IntermediateDirectory="MemtestDebug"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\pm_shared&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\dlls&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\engine&quot;;&quot;C:\Hry\Half-Life\SDK\Multiplayer Source\common&quot;;C:\Files\Programming\metamod\metamod"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
StructMemberAlignment="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\memtestdebug/amxmodx.pch"
AssemblerListingLocation=".\memtestdebug/"
ObjectFile=".\memtestdebug/"
ProgramDataBaseFileName=".\memtestdebug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib ..\JIT\natives-x86.obj"
OutputFile="memtestdebug/amxmodx_mm.dll"
Version="1.6.5.0"
LinkIncremental="2"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="MSVCRT"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\memtestdebug/amxx_mm.pdb"
ImportLibrary=".\memtestdebug/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="MemtestRelease|Win32"
OutputDirectory="MemtestRelease"
IntermediateDirectory="MemtestRelease"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\memtestrelease/amxmodx.pch"
AssemblerListingLocation=".\memtestrelease/"
ObjectFile=".\memtestrelease/"
ProgramDataBaseFileName=".\memtestrelease/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\zlib\zlib.lib ..\JIT\natives-x86.obj"
OutputFile="memtestrelease/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="MSVCRT"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\memtestrelease/amxx_mm.pdb"
GenerateMapFile="TRUE"
MapExports="TRUE"
ImportLibrary=".\memtestrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="JITDebug|Win32"
OutputDirectory="JITDebug"
@ -46,14 +326,14 @@
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
OutputFile="jitdebug/amxmodx_mm.dll"
Version="0.1"
LinkIncremental="2"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
IgnoreDefaultLibraryNames="MSVCRT"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\jitdebug/amxmodx_mm.pdb"
ImportLibrary=".\jitdebug/amxmodx_mm.lib"/>
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
ImportLibrary=".\jitdebug/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
@ -130,7 +410,7 @@
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\jitrelease/amxmodx_mm.pdb"
GenerateMapFile="TRUE"
ImportLibrary=".\jitrelease/amxmodx_mm.lib"/>
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
@ -160,30 +440,31 @@
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="JITDebugBinLog|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
Name="JITMemtestRelease|Win32"
OutputDirectory="JITMemtestRelease"
IntermediateDirectory="JITMemtestRelease"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=""
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT;BINLOG_ENABLED"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
StructMemberAlignment="3"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
AdditionalIncludeDirectories="..\..\metamod\metamod,..\..\hlsdk\sourcecode\common,..\..\hlsdk\sourcecode\engine,..\..\hlsdk\sourcecode\dlls,..\..\hlsdk\sourcecode\pm_shared,..\extra\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;MEMORY_TEST;JIT;ASM32;PAWN_CELL_SIZE=32"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitdebugbinlog/amxmodx.pch"
AssemblerListingLocation=".\jitdebugbinlog/"
ObjectFile=".\jitdebugbinlog/"
ProgramDataBaseFileName=".\jitdebugbinlog/"
PrecompiledHeaderFile=".\jitmemtestrelease/amxmodx.pch"
AssemblerListingLocation=".\jitmemtestrelease/"
ObjectFile=".\jitmemtestrelease/"
ProgramDataBaseFileName=".\jitmemtestrelease/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
@ -191,23 +472,22 @@
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
OutputFile="jitdebugbinlog/amxmodx_bl_mm.dll"
Version="0.1"
LinkIncremental="2"
OutputFile="jitmemtestrelease/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="MSVCRT;LIBC"
IgnoreDefaultLibraryNames="MSVCRT"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\jitdebugbinlog/amxmodx_bl_mm.pdb"
ImportLibrary=".\jitdebugbinlog/amxmodx_bl_mm.lib"/>
ProgramDatabaseFile=".\jitmemtestrelease/amxx_mm.pdb"
ImportLibrary=".\jitmemtestrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"/>
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
@ -216,7 +496,7 @@
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
@ -230,54 +510,48 @@
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="JITReleaseBinLog|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
Name="MaximalSpeed|Win32"
OutputDirectory="MaximalSpeed"
IntermediateDirectory="MaximalSpeed"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
EnableIntrinsicFunctions="TRUE"
FavorSizeOrSpeed="1"
OmitFramePointers="TRUE"
OptimizeForProcessor="0"
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;ASM32;PAWN_CELL_SIZE=32;BINLOG_ENABLED"
IgnoreStandardIncludePath="FALSE"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitreleasebinlog/amxmodx.pch"
AssemblerListingLocation=".\jitreleasebinlog/"
ObjectFile=".\jitreleasebinlog/"
ProgramDataBaseFileName=".\jitreleasebinlog/"
PrecompiledHeaderFile=".\MaximalSpeed/amxmodx.pch"
AssemblerListingLocation=".\MaximalSpeed/"
ObjectFile=".\MaximalSpeed/"
ProgramDataBaseFileName=".\MaximalSpeed/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="3"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="..\zlib\zlib.lib ..\JIT\amxjitsn.obj ..\JIT\amxexecn.obj ..\JIT\natives-x86.obj"
OutputFile="jitreleasebinlog/amxmodx_bl_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"
IgnoreDefaultLibraryNames="MSVCRT"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\jitreleasebinlog/amxmodx_bl_mm.pdb"
GenerateMapFile="TRUE"
ImportLibrary=".\jitreleasebinlog/amxmodx_bl_mm.lib"/>
ProgramDatabaseFile=".\MaximalSpeede/amxx_mm.pdb"
ImportLibrary=".\jitrelease/amxx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
@ -334,21 +608,6 @@
<File
RelativePath="..\amxxlog.cpp">
</File>
<File
RelativePath="..\binlog.cpp">
<FileConfiguration
Name="JITDebug|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="JITRelease|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
</File>
<File
RelativePath="..\CCmd.cpp">
</File>
@ -381,6 +640,12 @@
</File>
<File
RelativePath="..\CTask.cpp">
<FileConfiguration
Name="JITRelease|Win32">
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="0"/>
</FileConfiguration>
</File>
<File
RelativePath="..\CVault.cpp">
@ -393,6 +658,12 @@
</File>
<File
RelativePath="..\fakemeta.cpp">
<FileConfiguration
Name="MemtestDebug|Win32">
<Tool
Name="VCCLCompilerTool"
GeneratePreprocessedFile="0"/>
</FileConfiguration>
</File>
<File
RelativePath="..\file.cpp">
@ -408,22 +679,10 @@
Name="VCCLCompilerTool"
AssemblerOutput="4"/>
</FileConfiguration>
<FileConfiguration
Name="JITReleaseBinLog|Win32">
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="4"/>
</FileConfiguration>
</File>
<File
RelativePath="..\libraries.cpp">
</File>
<File
RelativePath="..\md5.cpp">
</File>
<File
RelativePath="..\messages.cpp">
</File>
<File
RelativePath="..\meta_api.cpp">
</File>
@ -453,12 +712,6 @@
Name="VCCLCompilerTool"
AssemblerOutput="2"/>
</FileConfiguration>
<FileConfiguration
Name="JITReleaseBinLog|Win32">
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="2"/>
</FileConfiguration>
</File>
<File
RelativePath="..\strptime.cpp">
@ -469,9 +722,43 @@
<File
RelativePath="..\vault.cpp">
</File>
<File
RelativePath="..\vector.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"
@ -491,9 +778,6 @@
<File
RelativePath="..\amxxlog.h">
</File>
<File
RelativePath="..\binlog.h">
</File>
<File
RelativePath="..\CCmd.h">
</File>
@ -551,18 +835,12 @@
<File
RelativePath="..\format.h">
</File>
<File
RelativePath="..\libraries.h">
</File>
<File
RelativePath="..\md5.h">
</File>
<File
RelativePath="..\menus.h">
</File>
<File
RelativePath="..\messages.h">
</File>
<File
RelativePath="..\modules.h">
</File>
@ -593,6 +871,16 @@
<File
RelativePath="..\zlib\zlib.h">
</File>
<Filter
Name="mmgr"
Filter="">
<File
RelativePath="..\mmgr\mmgr.h">
</File>
<File
RelativePath="..\mmgr\nommgr.h">
</File>
</Filter>
</Filter>
<Filter
Name="Resource Files"
@ -613,28 +901,42 @@
<File
RelativePath="..\amxjitsn.asm">
</File>
<File
RelativePath="..\helpers-x86.asm">
</File>
<File
RelativePath="..\natives-amd64.asm">
</File>
<File
RelativePath="..\natives-x86.asm">
</File>
<Filter
Name="Builds"
Filter="">
<File
RelativePath="..\Jit\helpers-x86.obj">
</File>
</Filter>
</Filter>
<Filter
Name="SDK"
Filter="">
<File
RelativePath="..\sdk\amxxmodule.cpp">
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="MemtestDebug|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="MemtestRelease|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="JITDebug|Win32"
ExcludedFromBuild="TRUE">
@ -648,13 +950,13 @@
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="JITDebugBinLog|Win32"
Name="JITMemtestRelease|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="JITReleaseBinLog|Win32"
Name="MaximalSpeed|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>

View File

@ -1,26 +0,0 @@

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

View File

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

View File

@ -32,7 +32,6 @@
#include "sh_stack.h"
#include "natives.h"
#include "debugger.h"
#include "libraries.h"
#ifdef __linux__
#include <malloc.h>
@ -48,6 +47,7 @@
CStack<int> g_ErrorStk;
CVector<regnative *> g_RegNatives;
CStack<regnative *> g_NativeStack;
CVector<String> g_Libraries;
static char g_errorStr[512] = {0};
bool g_Initialized = false;
@ -68,28 +68,11 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
return 0;
}
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx);
CPluginMngr::CPlugin *pNativePlugin = g_plugins.findPluginFast(pNative->amx);
if (!pNativePlugin->isExecutable(pNative->func))
{
LogError(amx, AMX_ERR_NATIVE, "Called dynanative into a paused plugin.");
pPlugin->setStatus(ps_paused);
return 0;
}
if (pNative->caller)
{
LogError(amx, AMX_ERR_NATIVE, "Bug caught! Please contact the AMX Mod X Dev Team.");
return 0;
}
//parameter stack
//NOTE: it is possible that recursive register native calling
// could potentially be somehow damaged here.
//so, a :TODO: - make the stack unique, rather than a known ptr
pNative->caller = amx;
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx);
int err = 0;
cell ret = 0;
g_ErrorStk.push(0);
@ -129,8 +112,6 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
g_NativeStack.pop();
g_ErrorStk.pop();
pNative->caller = NULL;
return ret;
}
@ -362,7 +343,7 @@ static cell AMX_NATIVE_CALL register_library(AMX *amx, cell *params)
int len;
char *lib = get_amxstring(amx, params[1], 0, len);
AddLibrary(lib, LibType_Library, LibSource_Plugin, g_plugins.findPluginFast(amx));
AddPluginLibrary(lib);
return 1;
}
@ -389,7 +370,6 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
regnative *pNative = new regnative;
pNative->amx = amx;
pNative->func = idx;
pNative->caller = NULL;
//we'll apply a safety buffer too
//make our function
@ -416,9 +396,27 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
return 1;
}
bool LibraryExists(const char *name)
{
for (size_t i=0; i<g_Libraries.size(); i++)
{
if (stricmp(g_Libraries[i].c_str(), name)==0)
return true;
}
return false;
}
void AddPluginLibrary(const char *name)
{
String f(name);
g_Libraries.push_back(f);
}
void ClearPluginLibraries()
{
ClearLibraries(LibSource_Plugin);
g_Libraries.clear();
for (size_t i=0; i<g_RegNatives.size(); i++)
{
delete [] g_RegNatives[i]->pfn;

View File

@ -61,7 +61,9 @@ extern "C" int amxx_DynaFunc(AMX *amx, cell *params);
extern "C" int amxx_DynaCodesize();
AMX_NATIVE_INFO *BuildNativeTable();
void AddPluginLibrary(const char *name);
void ClearPluginLibraries();
bool LibraryExists(const char *name);
//I couldn't resist :)
extern AMX_NATIVE_INFO g_NativeNatives[];

View File

@ -151,7 +151,7 @@ int Menu::PagekeyToItem(page_t page, item_t key)
if (num_pages == 1 || !items_per_page)
{
if (key > m_Items.size())
if (m_AlwaysExit && key > m_Items.size())
return MENU_EXIT;
else
return key-1;
@ -221,18 +221,10 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
m_Text.clear();
char buffer[255];
if (items_per_page && (pages != 1))
{
if (m_AutoColors)
_snprintf(buffer, sizeof(buffer)-1, "\\y%s %d/%d\n\\w\n", m_Title.c_str(), page + 1, pages);
else
_snprintf(buffer, sizeof(buffer)-1, "%s %d/%d\n\n", m_Title.c_str(), page + 1, pages);
} else {
if (m_AutoColors)
_snprintf(buffer, sizeof(buffer)-1, "\\y%s\n\\w\n", m_Title.c_str());
else
_snprintf(buffer, sizeof(buffer)-1, "%s\n\n", m_Title.c_str());
}
if (m_AutoColors)
_snprintf(buffer, sizeof(buffer)-1, "\\y%s %d/%d\n\\w\n", m_Title.c_str(), page + 1, pages);
else
_snprintf(buffer, sizeof(buffer)-1, "%s %d/%d\n\n", m_Title.c_str(), page + 1, pages);
m_Text.append(buffer);
@ -759,39 +751,6 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
return 0; } \
Menu *pMenu = g_NewMenus[p];
static cell AMX_NATIVE_CALL menu_cancel(AMX *amx, cell *params)
{
int index = params[1];
if (index < 1 || index > gpGlobals->maxClients)
{
LogError(amx, AMX_ERR_NATIVE, "Player %d is not valid", index);
return 0;
}
CPlayer *player = GET_PLAYER_POINTER_I(index);
if (!player->ingame)
{
LogError(amx, AMX_ERR_NATIVE, "Played %d is not in game", index);
return 0;
}
int menu = player->newmenu;
if (menu < 0 || menu >= (int)g_NewMenus.size() || !g_NewMenus[menu])
return 0;
Menu *pMenu = g_NewMenus[menu];
player->newmenu = -1;
player->menu = 0;
executeForwards(pMenu->func,
static_cast<cell>(index),
static_cast<cell>(pMenu->thisId),
static_cast<cell>(MENU_EXIT));
return 1;
}
static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
{
GETMENU_R(params[1]);
@ -807,12 +766,12 @@ static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
player = GET_PLAYER_POINTER_I(i);
if (player->newmenu == pMenu->thisId)
{
player->newmenu = -1;
player->menu = 0;
executeForwards(pMenu->func,
static_cast<cell>(i),
static_cast<cell>(pMenu->thisId),
static_cast<cell>(MENU_EXIT));
player->newmenu = -1;
player->menu = 0;
}
}
g_NewMenus[params[1]] = NULL;
@ -865,7 +824,6 @@ AMX_NATIVE_INFO g_NewMenuNatives[] =
{"menu_item_setname", menu_item_setname},
{"menu_destroy", menu_destroy},
{"menu_setprop", menu_setprop},
{"menu_cancel", menu_cancel},
{"player_menu_info", player_menu_info},
{NULL, NULL},
};

View File

@ -1,8 +1,6 @@
#include <string.h>
#include "optimizer.h"
int g_opt_level = 0;
#define OP_SYSREQ_C 123
#define OP_NOP 134
#define OP_FLOAT_MUL 138
@ -84,32 +82,14 @@ void _Setup_Optimizer_Stage2(AMX *amx, cell *oplist, cell *cip)
opt->natives[i] = -1;
amx->usertags[UT_OPTIMIZER] = (void *)opt;
if (g_opt_level & 1)
{
FIND_NATIVE("floatmul", N_Float_Mul);
FIND_NATIVE("floatdiv", N_Float_Div);
FIND_NATIVE("floatadd", N_Float_Add);
FIND_NATIVE("floatsub", N_Float_Sub);
}
if (g_opt_level & 4)
{
FIND_NATIVE("float", N_Float_To);
FIND_NATIVE("floatround", N_Float_Round);
}
if (g_opt_level & 2)
{
#if !defined AMD64
if (amxx_CpuSupport())
{
#endif
FIND_NATIVE("floatcmp", N_Float_Cmp);
#if !defined AMD64
} else {
g_opt_level &= ~(2);
}
#endif
}
FIND_NATIVE("floatmul", N_Float_Mul);
FIND_NATIVE("floatdiv", N_Float_Div);
FIND_NATIVE("floatadd", N_Float_Add);
FIND_NATIVE("floatsub", N_Float_Sub);
FIND_NATIVE("float", N_Float_To);
FIND_NATIVE("floatround", N_Float_Round);
FIND_NATIVE("floatcmp", N_Float_Cmp);
//we don't do these yet because of radix stuff >:\
//FIND_NATIVE("floatsin", N_Float_Sin);
//FIND_NATIVE("floatcos", N_Float_Cos);

View File

@ -22,8 +22,5 @@ struct optimizer_s
};
void SetupOptimizer(AMX *amx);
extern "C" int amxx_CpuSupport();
extern int g_opt_level;
#endif //_INCLUDE_AMXMODX_OPTIMIZER_H

View File

@ -2430,9 +2430,7 @@ static amxx_module_info_s g_ModuleInfo =
#else // MODULE_RELOAD_ON_MAPCHANGE
0,
#endif // MODULE_RELOAD_ON_MAPCHANGE
MODULE_LOGTAG,
MODULE_LIBRARY,
MODULE_LIBCLASS
MODULE_LOGTAG
};
// Storage for the requested functions
@ -2508,13 +2506,6 @@ PFN_SET_TEAM_INFO g_fn_SetTeamInfo;
PFN_PLAYER_PROP_ADDR g_fn_PlayerPropAddr;
PFN_REG_AUTH_FUNC g_fn_RegAuthFunc;
PFN_UNREG_AUTH_FUNC g_fn_UnregAuthFunc;
PFN_FINDLIBRARY g_fn_FindLibrary;
PFN_ADDLIBRARIES g_fn_AddLibraries;
PFN_REMOVELIBRARIES g_fn_RemoveLibraries;
PFN_OVERRIDENATIVES g_fn_OverrideNatives;
PFN_GETLOCALINFO g_fn_GetLocalInfo;
PFN_AMX_REREGISTER g_fn_AmxReRegister;
PFN_REGISTERFUNCTIONEX g_fn_RegisterFunctionEx;
// *** Exports ***
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
@ -2565,7 +2556,6 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
REQFUNC("MergeDefinitionFile", g_fn_MergeDefinition_File, PFN_MERGEDEFINITION_FILE);
REQFUNC("Format", g_fn_Format, PFN_FORMAT);
REQFUNC("RegisterFunction", g_fn_RegisterFunction, PFN_REGISTERFUNCTION);
REQFUNC("RegisterFunctionEx", g_fn_RegisterFunctionEx, PFN_REGISTERFUNCTIONEX);
// Amx scripts
REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT);
@ -2630,14 +2620,6 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
REQFUNC("RegAuthFunc", g_fn_RegAuthFunc, PFN_REG_AUTH_FUNC);
REQFUNC("UnregAuthFunc", g_fn_UnregAuthFunc, PFN_UNREG_AUTH_FUNC);
//Added in 1.75
REQFUNC("FindLibrary", g_fn_FindLibrary, PFN_FINDLIBRARY);
REQFUNC("AddLibraries", g_fn_AddLibraries, PFN_ADDLIBRARIES);
REQFUNC("RemoveLibraries", g_fn_RemoveLibraries, PFN_REMOVELIBRARIES);
REQFUNC("OverrideNatives", g_fn_OverrideNatives, PFN_OVERRIDENATIVES);
REQFUNC("GetLocalInfo", g_fn_GetLocalInfo, PFN_GETLOCALINFO);
REQFUNC("AmxReregister", g_fn_AmxReRegister, PFN_AMX_REREGISTER);
#ifdef MEMORY_TEST
// Memory
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
@ -2672,27 +2654,14 @@ C_DLLEXPORT int AMXX_PluginsLoaded()
return AMXX_OK;
}
C_DLLEXPORT void AMXX_PluginsUnloaded()
{
#ifdef FN_AMXX_PLUGINSUNLOADED
FN_AMXX_PLUGINSUNLOADED();
#endif // FN_AMXX_PLUGINSUNLOADED
}
C_DLLEXPORT void AMXX_PluginsUnloading()
{
#ifdef FN_AMXX_PLUGINSUNLOADING
FN_AMXX_PLUGINSUNLOADING();
#endif // FN_AMXX_PLUGINSUNLOADING
}
// Advanced MF functions
void MF_Log(const char *fmt, ...)
{
// :TODO: Overflow possible here
char msg[3072];
va_list arglst;
va_start(arglst, fmt);
vsnprintf(msg, sizeof(msg) - 1, fmt, arglst);
vsprintf(msg, fmt, arglst);
va_end(arglst);
g_fn_Log("[%s] %s", MODULE_LOGTAG, msg);
@ -2700,10 +2669,11 @@ void MF_Log(const char *fmt, ...)
void MF_LogError(AMX *amx, int err, const char *fmt, ...)
{
// :TODO: Overflow possible here
char msg[3072];
va_list arglst;
va_start(arglst, fmt);
vsnprintf(msg, sizeof(msg) - 1, fmt, arglst);
vsprintf(msg, fmt, arglst);
va_end(arglst);
g_fn_LogErrorFunc(amx, err, "[%s] %s", MODULE_LOGTAG, msg);
@ -2771,15 +2741,10 @@ void ValidateMacros_DontCallThis_Smiley()
MF_GetPlayerEdict(0);
MF_Format("", 4, "str");
MF_RegisterFunction(NULL, "");
MF_RegisterFunctionEx(NULL, "");
MF_SetPlayerTeamInfo(0, 0, "");
MF_PlayerPropAddr(0, 0);
MF_RegAuthFunc(NULL);
MF_UnregAuthFunc(NULL);
MF_FindLibrary(NULL, LibType_Class);
MF_AddLibraries(NULL, LibType_Class, NULL);
MF_RemoveLibraries(NULL);
MF_OverrideNatives(NULL, NULL);
}
#endif

View File

@ -34,8 +34,7 @@
// module interface version was 1
// 2 - added logtag to struct (amxx1.1-rc1)
// 3 - added new tagAMX structure (amxx1.5)
// 4 - added new 'library' setting for direct loading
#define AMXX_INTERFACE_VERSION 4
#define AMXX_INTERFACE_VERSION 3
// amxx module info
struct amxx_module_info_s
@ -45,8 +44,6 @@ struct amxx_module_info_s
const char *version;
int reload; // reload on mapchange when nonzero
const char *logtag; // added in version 2
const char *library; // added in version 4
const char *libclass; // added in version 4
};
// return values from functions called by amxx
@ -156,137 +153,9 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
#endif
#if defined _MSC_VER
#pragma warning(disable:4103) /* disable warning message 4103 that complains
* about pragma pack in a header file */
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
#if _MSC_VER >= 1400
#if !defined NO_MSVC8_AUTO_COMPAT
/* Disable deprecation warnings concerning unsafe CRT functions */
#if !defined _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_DEPRECATE
#endif
/* Replace the POSIX function with ISO C++ conformant ones as they are now deprecated */
#define access _access
#define cabs _cabs
#define cgets _cgets
#define chdir _chdir
#define chmod _chmod
#define chsize _chsize
#define close _close
#define cprintf _cprintf
#define cputs _cputts
#define creat _creat
#define cscanf _cscanf
#define cwait _cwait
#define dup _dup
#define dup2 _dup2
#define ecvt _ecvt
#define eof _eof
#define execl _execl
#define execle _execle
#define execlp _execlp
#define execlpe _execlpe
#define execv _execv
#define execve _execv
#define execvp _execvp
#define execvpe _execvpe
#define fcloseall _fcloseall
#define fcvt _fcvt
#define fdopen _fdopen
#define fgetchar _fgetchar
#define filelength _filelength
#define fileno _fileno
#define flushall _flushall
#define fputchar _fputchar
#define gcvt _gcvt
#define getch _getch
#define getche _getche
#define getcwd _getcwd
#define getpid _getpid
#define getw _getw
#define hypot _hypot
#define inp _inp
#define inpw _inpw
#define isascii __isascii
#define isatty _isatty
#define iscsym __iscsym
#define iscsymf __iscsymf
#define itoa _itoa
#define j0 _j0
#define j1 _j1
#define jn _jn
#define kbhit _kbhit
#define lfind _lfind
#define locking _locking
#define lsearch _lsearch
#define lseek _lseek
#define ltoa _ltoa
#define memccpy _memccpy
#define memicmp _memicmp
#define mkdir _mkdir
#define mktemp _mktemp
#define open _open
#define outp _outp
#define outpw _outpw
#define putch _putch
#define putenv _putenv
#define putw _putw
#define read _read
#define rmdir _rmdir
#define rmtmp _rmtmp
#define setmode _setmode
#define sopen _sopen
#define spawnl _spawnl
#define spawnle _spawnle
#define spawnlp _spawnlp
#define spawnlpe _spawnlpe
#define spawnv _spawnv
#define spawnve _spawnve
#define spawnvp _spawnvp
#define spawnvpe _spawnvpe
#define strcmpi _strcmpi
#define strdup _strdup
#define stricmp _stricmp
#define strlwr _strlwr
#define strnicmp _strnicmp
#define strnset _strnset
#define strrev _strrev
#define strset _strset
#define strupr _strupr
#define swab _swab
#define tell _tell
#define tempnam _tempnam
#define toascii __toascii
#define tzset _tzset
#define ultoa _ultoa
#define umask _umask
#define ungetch _ungetch
#define unlink _unlink
#define wcsdup _wcsdup
#define wcsicmp _wcsicmp
#define wcsicoll _wcsicoll
#define wcslwr _wcslwr
#define wcsnicmp _wcsnicmp
#define wcsnset _wcsnset
#define wcsrev _wcsrev
#define wcsset _wcsset
#define wcsupr _wcsupr
#define write _write
#define y0 _y0
#define y1 _y1
#define yn _yn
/* Disable deprecation warnings because MSVC8 seemingly thinks the ISO C++ conformant
* functions above are deprecated. */
#pragma warning (disable:4996)
#endif
#else
#define vsnprintf _vsnprintf
#endif
#pragma warning(disable:4103) /* disable warning message 4103 that complains
* about pragma pack in a header file */
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
#endif
@ -2035,14 +1904,6 @@ void FN_AMXX_DETACH(void);
void FN_AMXX_PLUGINSLOADED(void);
#endif // FN_AMXX_PLUGINSLOADED
#ifdef FN_AMXX_PLUGINSUNLOADING
void FN_AMXX_PLUGINSUNLOADING(void);
#endif // FN_AMXX_PLUGINSUNLOADING
#ifdef FN_AMXX_PLUGINSUNLOADED
void FN_AMXX_PLUGINSUNLOADED(void);
#endif // FN_AMXX_PLUGINSUNLOADED
// *** Types ***
typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
@ -2089,12 +1950,6 @@ enum PlayerProp
Player_NewmenuPage, //int
};
enum LibType
{
LibType_Library,
LibType_Class
};
typedef void (*AUTHORIZEFUNC)(int player, const char *authstring);
typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/);
@ -2176,13 +2031,6 @@ typedef int (*PFN_AMX_PUSH) (AMX * /*amx*/, cell /*value*/);
typedef int (*PFN_SET_TEAM_INFO) (int /*player */, int /*teamid */, const char * /*name */);
typedef void (*PFN_REG_AUTH_FUNC) (AUTHORIZEFUNC);
typedef void (*PFN_UNREG_AUTH_FUNC) (AUTHORIZEFUNC);
typedef int (*PFN_FINDLIBRARY) (const char * /*name*/, LibType /*type*/);
typedef size_t (*PFN_ADDLIBRARIES) (const char * /*name*/, LibType /*type*/, void * /*parent*/);
typedef size_t (*PFN_REMOVELIBRARIES) (void * /*parent*/);
typedef void (*PFN_OVERRIDENATIVES) (AMX_NATIVE_INFO * /*natives*/, const char * /*myname*/);
typedef const char * (*PFN_GETLOCALINFO) (const char * /*name*/, const char * /*def*/);
typedef int (*PFN_AMX_REREGISTER) (AMX * /*amx*/, AMX_NATIVE_INFO * /*list*/, int /*list*/);
typedef void * (*PFN_REGISTERFUNCTIONEX) (void * /*pfn*/, const char * /*desc*/);
extern PFN_ADD_NATIVES g_fn_AddNatives;
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
@ -2250,13 +2098,6 @@ extern PFN_SET_TEAM_INFO g_fn_SetTeamInfo;
extern PFN_PLAYER_PROP_ADDR g_fn_PlayerPropAddr;
extern PFN_REG_AUTH_FUNC g_fn_RegAuthFunc;
extern PFN_UNREG_AUTH_FUNC g_fn_UnregAuthFunc;
extern PFN_FINDLIBRARY g_fn_FindLibrary;
extern PFN_ADDLIBRARIES g_fn_AddLibraries;
extern PFN_REMOVELIBRARIES g_fn_RemoveLibraries;
extern PFN_OVERRIDENATIVES g_fn_OverrideNatives;
extern PFN_GETLOCALINFO g_fn_GetLocalInfo;
extern PFN_AMX_REREGISTER g_fn_AmxReRegister;
extern PFN_REGISTERFUNCTIONEX g_fn_RegisterFunctionEx;
#ifdef MAY_NEVER_BE_DEFINED
// Function prototypes for intellisense and similar systems
@ -2321,13 +2162,6 @@ int MF_SetPlayerTeamInfo (int id, int teamid, const char *teamname) { }
void * MF_PlayerPropAddr (int id, int prop) { }
void MF_RegAuthFunc (AUTHORIZEFUNC fn) { }
void MF_UnregAuthFunc (AUTHORIZEFUNC fn) { }
int MF_FindLibrary (const char *name, LibType type) { }
size_t MF_AddLibraries (const char *name, LibType type, void *parent) { }
size_t MF_RemoveLibraries (void *parent) { }
void MF_OverrideNatives (AMX_NATIVE_INFO *natives, const char *myname) { }
const char * MF_GetLocalInfo (const char *name, const char *def) { }
int MF_AmxReRegister (AMX *amx, AMX_NATIVE_INFO *list, int number) { return 0; }
void * MF_RegisterFunctionEx (void *pfn, const char *description) { }
#endif // MAY_NEVER_BE_DEFINED
#define MF_AddNatives g_fn_AddNatives
@ -2397,13 +2231,6 @@ void MF_LogError(AMX *amx, int err, const char *fmt, ...);
#define MF_PlayerPropAddr g_fn_PlayerPropAddr
#define MF_RegAuthFunc g_fn_RegAuthFunc
#define MF_UnregAuthFunc g_fn_UnregAuthFunc
#define MF_FindLibrary g_fn_FindLibrary
#define MF_AddLibraries g_fn_AddLibraries
#define MF_RemoveLibraries g_fn_RemoveLibraries
#define MF_OverrideNatives g_fn_OverrideNatives
#define MF_GetLocalInfo g_fn_GetLocalInfo
#define MF_AmxReRegister g_fn_AmxReRegister
#define MF_RegisterFunctionEx g_fn_RegisterFunctionEx
#ifdef MEMORY_TEST
/*** Memory ***/

View File

@ -3,24 +3,12 @@
#ifndef __MODULECONFIG_H__
#define __MODULECONFIG_H__
/** Module info
* -The logtag is the tag that the module's log messages will be
* prepended with.
* -The library is the name that the #pragma library
* message will have prepended.
* -The library class is the class of libraries that
* a module belongs to (like DBI). Keep it "" to
* ignore.
* -For both library and library class, you can use a comma
* to add multiple entries.
*/
// Module info
#define MODULE_NAME "--ENTER NAME HERE--"
#define MODULE_VERSION "--ENTER VERSION HERE--"
#define MODULE_AUTHOR "--ENTER AUTHOR HERE--"
#define MODULE_URL "--ENTER URL HERE--"
#define MODULE_LOGTAG "--ENTER LOGTAG HERE--"
#define MODULE_LIBRARY "--ENTER LIBRARY HERE--"
#define MODULE_LIBCLASS ""
// If you want the module not to be reloaded on mapchange, remove / comment out the next line
#define MODULE_RELOAD_ON_MAPCHANGE
@ -43,35 +31,18 @@
// It allows you to compile without libstdc++.so as a dependency
// #define NO_ALLOC_OVERRIDES
// Uncomment this if you are using MSVC8 or greater and want to fix some of the compatibility issues yourself
// #define NO_MSVC8_AUTO_COMPAT
/**
* AMXX Init functions
* Also consider using FN_META_*
*/
/** AMXX query */
// - AMXX Init functions
// Also consider using FN_META_*
// AMXX query
//#define FN_AMXX_QUERY OnAmxxQuery
/** AMXX attach
* Do native functions init here (MF_AddNatives)
*/
// AMXX attach
// Do native functions init here (MF_AddNatives)
//#define FN_AMXX_ATTACH OnAmxxAttach
/** AMXX Detach (unload) */
// AMXX detach
//#define FN_AMXX_DETACH OnAmxxDetach
/** All plugins loaded
* Do forward functions init here (MF_RegisterForward)
*/
//#define FN_AMXX_PLUGINSLOADED OnPluginsLoaded
/** All plugins are about to be unloaded */
//#define FN_AMXX_PLUGINSUNLOADING OnPluginsUnloading
/** All plugins are now unloaded */
//#define FN_AMXX_PLUGINSUNLOADED OnPluginsUnloaded
// All plugins loaded
// Do forward functions init here (MF_RegisterForward)
// #define FN_AMXX_PLUGINSLOADED OnPluginsLoaded
/**** METAMOD ****/
// If your module doesn't use metamod, you may close the file now :)

View File

@ -11,13 +11,6 @@
#ifndef _INCLUDE_SMM_LIST_H
#define _INCLUDE_SMM_LIST_H
// MSVC8 fix for offsetof macro redefition warnings
#ifdef _MSC_VER
#if _MSC_VER >= 1400
#undef offsetof
#endif
#endif
#include <new>
#include <malloc.h>

View File

@ -39,7 +39,7 @@ void amx_command()
{
print_srvconsole("Currently loaded plugins:\n");
print_srvconsole(" %-23.22s %-8.7s %-17.16s %-16.15s %-9.8s\n", "name", "version", "author", "file", "status");
print_srvconsole(" %-18.17s %-8.7s %-17.16s %-16.15s %-9.8s\n", "name", "version", "author", "file", "status");
int plugins = 0;
int running = 0;
@ -52,7 +52,7 @@ void amx_command()
if ((*a).isValid() && !(*a).isPaused())
++running;
print_srvconsole(" [%3d] %-23.22s %-8.7s %-17.16s %-16.15s %-9.8s\n", plugins, (*a).getTitle(), (*a).getVersion(), (*a).getAuthor(), (*a).getName(), (*a).getStatus());
print_srvconsole(" [%3d] %-18.17s %-8.7s %-17.16s %-16.15s %-9.8s\n", plugins, (*a).getTitle(), (*a).getVersion(), (*a).getAuthor(), (*a).getName(), (*a).getStatus());
++a;
}

View File

@ -32,7 +32,6 @@
#include <ctype.h>
#include "amxmodx.h"
#include "format.h"
#include "binlog.h"
const char* stristr(const char* str, const char* substr)
{
@ -58,18 +57,7 @@ const char* stristr(const char* str, const char* substr)
char* format_amxstring(AMX *amx, cell *params, int parm, int& len)
{
#if !defined BINLOG_ENABLED
return g_langMngr.FormatAmxString(amx, params, parm, len);
#else
char *ans = g_langMngr.FormatAmxString(amx, params, parm, len);
if (g_binlog_level & 4)
{
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
if (pl)
g_BinLog.WriteOp(BinLog_FormatString, pl->getId(), parm, len, ans);
}
return ans;
#endif
}
int amxstring_len(cell* a)
@ -91,15 +79,6 @@ int set_amxstring(AMX *amx, cell amx_addr, const char *source, int max)
{
register cell* dest = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
register cell* start = dest;
#if defined BINLOG_ENABLED
if (g_binlog_level & 2)
{
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
if (pl)
g_BinLog.WriteOp(BinLog_SetString, pl->getId(), amx_addr, max, source);
}
#endif
while (max-- && *source)
*dest++ = (cell)*source++;
@ -114,21 +93,12 @@ extern "C" size_t get_amxstring_r(AMX *amx, cell amx_addr, char *destination, in
register cell *source = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
register char *dest = destination;
char *start = dest;
while (maxlen-- && *source)
*dest++=(char)(*source++);
*dest = '\0';
#if defined BINLOG_ENABLED
if (g_binlog_level & 2)
{
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
if (pl)
g_BinLog.WriteOp(BinLog_GetString, pl->getId(), amx_addr, destination);
}
#endif
return dest - start;
}
@ -142,15 +112,6 @@ char* get_amxstring(AMX *amx, cell amx_addr, int id, int& len)
while ((*dest++=(char)(*source++)));
len = --dest - start;
#if defined BINLOG_ENABLED
if (g_binlog_level & 2)
{
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
if (pl)
g_BinLog.WriteOp(BinLog_GetString, pl->getId(), amx_addr, start);
}
#endif
return start;
}
@ -318,7 +279,7 @@ static cell AMX_NATIVE_CALL numtostr(AMX *amx, cell *params) /* 3 param */
{
char szTemp[32];
sprintf(szTemp, "%d", (int)params[1]);
return set_amxstring(amx, params[2], szTemp, params[3]);
}
@ -796,7 +757,7 @@ do_copy:
i++;
const char *start = had_quotes ? &(string[beg+1]) : &(string[beg]);
size_t _end = had_quotes ? (i==len-1 ? 1 : 2) : 0;
size_t end = (pos - _end > (size_t)LeftMax) ? (size_t)LeftMax : pos - _end;
size_t end = (pos - _end > LeftMax) ? LeftMax : pos - _end;
size_t to_go = end-beg;
if (end && to_go)
{
@ -804,7 +765,7 @@ do_copy:
*left++ = (cell)*start++;
}
*left = '\0';
end = (len-i+1 > (size_t)RightMax) ? (size_t)RightMax : len-i+1;
end = (len-i+1 > RightMax) ? RightMax : len-i+1;
if (end)
{
start = &(string[i]);
@ -832,7 +793,7 @@ static cell AMX_NATIVE_CALL format_args(AMX *amx, cell *params)
if (pos < 0)
{
LogError(amx, AMX_ERR_NATIVE, "Pos has to be a positive number");
amx_RaiseError(amx, AMX_ERR_NATIVE);
return 0;
}
@ -973,67 +934,6 @@ static cell AMX_NATIVE_CALL n_strfind(AMX *amx, cell *params)
return (find - str);
}
static cell AMX_NATIVE_CALL vformat(AMX *amx, cell *params)
{
int vargPos = static_cast<int>(params[4]);
/** get the parent parameter array */
AMX_HEADER *hdr = (AMX_HEADER *)amx->base;
cell *local_params = (cell *)(
(char *)amx->base + (cell)hdr->dat +
(cell)amx->frm + (2 * sizeof(cell))
);
cell max = local_params[0] / sizeof(cell);
if (vargPos > (int)max + 1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos);
return 0;
}
/**
* check for bounds clipping
*/
cell addr_start = params[1];
cell addr_end = addr_start + params[2];
bool copy = false;
for (int i = vargPos; i <= max; i++)
{
//does this clip the bounds?
if ( (local_params[i] >= addr_start)
&& (local_params[i] <= addr_end) )
{
copy = true;
break;
}
}
/* get destination info */
cell *fmt = get_amxaddr(amx, params[3]);
cell *realdest = get_amxaddr(amx, params[1]);
size_t maxlen = static_cast<size_t>(params[2]);
cell *dest = realdest;
/* if this is necessary... */
static cell cpbuf[4096];
if (copy)
dest = cpbuf;
/* perform format */
size_t total = atcprintf(dest, maxlen, fmt, amx, local_params, &vargPos);
/* copy back */
if (copy)
{
memcpy(realdest, dest, (total+1) * sizeof(cell));
}
return total;
}
AMX_NATIVE_INFO string_Natives[] =
{
{"add", add},
@ -1069,6 +969,5 @@ AMX_NATIVE_INFO string_Natives[] =
{"strcmp", n_strcmp},
{"str_to_float", str_to_float},
{"float_to_str", float_to_str},
{"vformat", vformat},
{NULL, NULL}
};

View File

@ -14,16 +14,6 @@
#define strnicmp strncasecmp
#endif
#if _MSC_VER
#if _MSC_VER >= 1400
// MSVC8 - Replace POSIX stricmp with ISO C++ conformant one as it is deprecated
#define stricmp _stricmp
// Need this because of some stupid bug
#pragma warning (disable : 4996)
#endif
#endif
// this file does not include amxmodx.h, so we have to include the memory manager here
#ifdef MEMORY_TEST
#include "mmgr/mmgr.h"

View File

@ -1,205 +0,0 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
#include "amxmodx.h"
#define ANGLEVECTORS_FORWARD 1
#define ANGLEVECTORS_RIGHT 2
#define ANGLEVECTORS_UP 3
static cell AMX_NATIVE_CALL get_distance(AMX *amx, cell *params)
{
cell *cpVec1 = get_amxaddr(amx, params[1]);
cell *cpVec2 = get_amxaddr(amx, params[2]);
Vector vec1 = Vector((float)cpVec1[0], (float)cpVec1[1], (float)cpVec1[2]);
Vector vec2 = Vector((float)cpVec2[0], (float)cpVec2[1], (float)cpVec2[2]);
int iDist = (int)((vec1 - vec2).Length());
return iDist;
}
static cell AMX_NATIVE_CALL get_distance_f(AMX *amx, cell *params)
{
cell *cpVec1 = get_amxaddr(amx, params[1]);
cell *cpVec2 = get_amxaddr(amx, params[2]);
Vector vec1 = Vector((float)amx_ctof(cpVec1[0]), (float)amx_ctof(cpVec1[1]), (float)amx_ctof(cpVec1[2]));
Vector vec2 = Vector((float)amx_ctof(cpVec2[0]), (float)amx_ctof(cpVec2[1]), (float)amx_ctof(cpVec2[2]));
REAL fDist = (REAL) (vec1 - vec2).Length();
return amx_ftoc(fDist);
}
static cell AMX_NATIVE_CALL VelocityByAim(AMX *amx, cell *params)
{
int iEnt = params[1];
int iVelocity = params[2];
cell *vRet = get_amxaddr(amx, params[3]);
Vector vVector = Vector(0, 0, 0);
edict_t *pEnt = NULL;
if (iEnt < 0 || iEnt > gpGlobals->maxEntities)
{
LogError(amx, AMX_ERR_NATIVE, "Entity out of range (%d)", iEnt);
return 0;
}
else
{
if (iEnt > 0 && iEnt <= gpGlobals->maxClients)
{
if (!GET_PLAYER_POINTER_I(iEnt)->ingame)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (not ingame)", iEnt);
return 0;
}
pEnt = GET_PLAYER_POINTER_I(iEnt)->pEdict;
} else {
pEnt = INDEXENT(iEnt);
}
}
if (!pEnt)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid entity %d (nullent)", iEnt);
return 0;
}
MAKE_VECTORS(pEnt->v.v_angle);
vVector = gpGlobals->v_forward * iVelocity;
vRet[0] = FloatToCell(vVector.x);
vRet[1] = FloatToCell(vVector.y);
vRet[2] = FloatToCell(vVector.z);
return 1;
}
static cell AMX_NATIVE_CALL vector_to_angle(AMX *amx, cell *params)
{
cell *cAddr = get_amxaddr(amx, params[1]);
REAL fX = amx_ctof(cAddr[0]);
REAL fY = amx_ctof(cAddr[1]);
REAL fZ = amx_ctof(cAddr[2]);
Vector vVector = Vector(fX, fY, fZ);
Vector vAngle = Vector(0, 0, 0);
VEC_TO_ANGLES(vVector, vAngle);
cell *vRet = get_amxaddr(amx, params[2]);
vRet[0] = FloatToCell(vAngle.x);
vRet[1] = FloatToCell(vAngle.y);
vRet[2] = FloatToCell(vAngle.z);
return 1;
}
static cell AMX_NATIVE_CALL angle_vector(AMX *amx, cell *params)
{
Vector v_angles, v_forward, v_right, v_up, v_return;
cell *vCell = get_amxaddr(amx, params[1]);
v_angles.x = amx_ctof(vCell[0]);
v_angles.y = amx_ctof(vCell[1]);
v_angles.z = amx_ctof(vCell[2]);
g_engfuncs.pfnAngleVectors(v_angles, v_forward, v_right, v_up);
switch (params[2])
{
case ANGLEVECTORS_FORWARD:
v_return = v_forward;
break;
case ANGLEVECTORS_RIGHT:
v_return = v_right;
break;
case ANGLEVECTORS_UP:
v_return = v_up;
break;
}
vCell = get_amxaddr(amx, params[3]);
vCell[0] = FloatToCell(v_return.x);
vCell[1] = FloatToCell(v_return.y);
vCell[2] = FloatToCell(v_return.z);
return 1;
}
static cell AMX_NATIVE_CALL vector_length(AMX *amx, cell *params)
{
cell *cAddr = get_amxaddr(amx, params[1]);
REAL fX = amx_ctof(cAddr[0]);
REAL fY = amx_ctof(cAddr[1]);
REAL fZ = amx_ctof(cAddr[2]);
Vector vVector = Vector(fX, fY, fZ);
REAL fLength = vVector.Length();
return amx_ftoc(fLength);
}
static cell AMX_NATIVE_CALL vector_distance(AMX *amx, cell *params)
{
cell *cAddr = get_amxaddr(amx, params[1]);
cell *cAddr2 = get_amxaddr(amx, params[2]);
REAL fX = amx_ctof(cAddr[0]);
REAL fY = amx_ctof(cAddr[1]);
REAL fZ = amx_ctof(cAddr[2]);
REAL fX2 = amx_ctof(cAddr2[0]);
REAL fY2 = amx_ctof(cAddr2[1]);
REAL fZ2 = amx_ctof(cAddr2[2]);
Vector vVector = Vector(fX, fY, fZ);
Vector vVector2 = Vector(fX2, fY2, fZ2);
REAL fLength = (vVector - vVector2).Length();
return amx_ftoc(fLength);
}
AMX_NATIVE_INFO vector_Natives[] = {
{"get_distance", get_distance},
{"get_distance_f", get_distance_f},
{"velocity_by_aim", VelocityByAim},
{"vector_to_angle", vector_to_angle},
{"angle_vector", angle_vector},
{"vector_length", vector_length},
{"vector_distance", vector_distance},
{NULL, NULL},
};

View File

@ -1,5 +1,6 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
@ -26,8 +27,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,7,5,1
PRODUCTVERSION 1,7,5,1
FILEVERSION 1,7,0,0
PRODUCTVERSION 1,7,0,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -44,12 +45,12 @@ BEGIN
BEGIN
VALUE "Comments", "AMX Mod X"
VALUE "FileDescription", "AMX Mod X"
VALUE "FileVersion", "1.75a"
VALUE "FileVersion", "1.70"
VALUE "InternalName", "amxmodx"
VALUE "LegalCopyright", "Copyright (c) 2004-2006, AMX Mod X Dev Team"
VALUE "OriginalFilename", "amxmodx_mm.dll"
VALUE "ProductName", "AMX Mod X"
VALUE "ProductVersion", "1.75a"
VALUE "ProductVersion", "1.70"
END
END
BLOCK "VarFileInfo"

Binary file not shown.

View File

@ -62,7 +62,7 @@ int main(int argc, char **argv)
}
pc_printf("Welcome to the AMX Mod X %s Compiler.\n", VERSION_STRING);
pc_printf("Copyright (c) 1997-2006 ITB CompuPhase, AMX Mod X Team\n\n");
pc_printf("Copyright (c) 1997-2005 ITB CompuPhase, AMX Mod X Team\n\n");
if (argc < 2)
{

View File

@ -1,7 +1,9 @@
#ifndef _AMXXSC_INCLUDE_H
#define _AMXXSC_INCLUDE_H
#define VERSION_STRING "1.75-300"
#define VERSION_STRING "1.70-300"
#define VERSION 03000
#define MAGIC_HEADER 0x414D5842
#define MAGIC_HEADER2 0x414D5858
#define MAGIC_VERSION 0x0300

View File

@ -61,8 +61,6 @@
#include <windows.h>
#endif
#include <time.h>
#include "sc.h"
#define VERSION_STR "3.0.3367-amxx"
#define VERSION_INT 0x300
@ -127,7 +125,6 @@ static void dostate(void);
static void addwhile(int *ptr);
static void delwhile(void);
static int *readwhile(void);
static void inst_datetime_defines(void);
static int lastst = 0; /* last executed statement type */
static int nestlevel = 0; /* number of active (open) compound statements */
@ -385,23 +382,6 @@ long pc_lengthbin(void *handle)
#endif /* !defined NO_MAIN */
void inst_datetime_defines()
{
char date[64];
char ltime[64];
time_t td;
struct tm *curtime;
time(&td);
curtime = localtime(&td);
strftime(date, 31, "\"%m/%d/%Y\"", curtime);
strftime(ltime, 31, "\"%H:%M:%S\"", curtime);
insert_subst("__DATE__", date, 8);
insert_subst("__TIME__", ltime, 8);
}
/* "main" of the compiler
*/
@ -551,7 +531,7 @@ int pc_compile(int argc, char *argv[])
delete_symbols(&glbtab,0,TRUE,FALSE);
#if !defined NO_DEFINE
delete_substtable();
inst_datetime_defines();
insert_subst("__DATE__", "\"" __DATE__ "\"", 8);
#endif
resetglobals();
sc_ctrlchar=sc_ctrlchar_org;
@ -615,7 +595,7 @@ int pc_compile(int argc, char *argv[])
delete_symbols(&glbtab,0,TRUE,FALSE);
#if !defined NO_DEFINE
delete_substtable();
inst_datetime_defines();
insert_subst("__DATE__", "\"" __DATE__ "\"", 8);
#endif
resetglobals();
sc_ctrlchar=sc_ctrlchar_org;

View File

@ -1016,29 +1016,8 @@ static int command(void)
} /* if */
} else if (strcmp(str,"dynamic")==0) {
preproc_expr(&sc_stksize,NULL);
} else if ( !strcmp(str,"library") ||
!strcmp(str, "reqlib") ||
!strcmp(str, "reqclass") ||
!strcmp(str, "loadlib") ||
!strcmp(str, "explib") ||
!strcmp(str, "expclass") ||
!strcmp(str, "defclasslib") ) {
char name[sNAMEMAX+1],sname[sNAMEMAX+1];
const char *prefix = "";
sname[0] = '\0';
sname[1] = '\0';
if (!strcmp(str, "reqlib"))
prefix = "?rl_";
else if (!strcmp(str, "reqclass"))
prefix = "?rc_";
else if (!strcmp(str, "loadlib"))
prefix = "?f_";
else if (!strcmp(str, "explib"))
prefix = "?el_";
else if (!strcmp(str, "expclass"))
prefix = "?ec_";
else if (!strcmp(str, "defclasslib"))
prefix = "?d_";
} else if (strcmp(str,"library")==0) {
char name[sNAMEMAX+1];
while (*lptr<=' ' && *lptr!='\0')
lptr++;
if (*lptr=='"') {
@ -1048,20 +1027,6 @@ static int command(void)
for (i=0; i<sizeof name && (alphanum(*lptr) || *lptr=='-'); i++,lptr++)
name[i]=*lptr;
name[i]='\0';
if (!strncmp(str, "exp", 3) || !strncmp(str, "def", 3))
{
while (*lptr && isspace(*lptr))
lptr++;
for (i=1; i<sizeof sname && alphanum(*lptr); i++,lptr++)
sname[i]=*lptr;
sname[i] = '\0';
if (!sname[1])
{
error(45);
} else {
sname[0] = '_';
}
}
} /* if */
if (strlen(name)==0) {
curlibrary=NULL;
@ -1069,22 +1034,8 @@ static int command(void)
pc_addlibtable=FALSE;
} else {
/* add the name if it does not yet exist in the table */
char newname[sNAMEMAX+1];
if (strlen(name) + strlen(prefix) + strlen(sname) <= sNAMEMAX)
{
strcpy(newname, prefix);
strcat(newname, name);
strcat(newname, sname);
if (newname[0] != '?')
{
if (find_constval(&libname_tab,newname,0)==NULL)
{
curlibrary=append_constval(&libname_tab,newname,0,0);
}
} else {
exporttag(pc_addtag(newname));
}
}
if (find_constval(&libname_tab,name,0)==NULL)
curlibrary=append_constval(&libname_tab,name,0,0);
} /* if */
} else if (strcmp(str,"pack")==0) {
cell val;

View File

@ -14,26 +14,3 @@ amxx_vault addons/amxmodx/data/vault.ini
; 2 - one logfile / map
; 3 - HL Logs
amxx_logging 1
; Binary logging level
; add these up to get what you want
; these only work with bin logging binaries
; 1 - default
; 2 - log internal string sets/gets
; 4 - log internal formats
; 8 - log all native params
; 16 - log internal function calls (only in debug mode)
; 32 - log line number accesses (only in debug mode)
bin_logging 49
; Maximum binary log size, in megs
max_binlog_size 20
; Plugin optimization flags - add these up to get what you want
; lowering these may stop crashes on very old CPUs
; set 65536 to disable optimizer, NOT 0!
;-------------
; 1 - float arithmetic
; 2 - float comparisons
; 4 - float rounding
optimizer 7

View File

@ -16,26 +16,3 @@ csstats addons/amxmodx/data/csstats.dat
; 2 - one logfile / map
; 3 - HL Logs
amxx_logging 1
; Binary logging level
; add these up to get what you want
; these only work with bin logging binaries
; 1 - default
; 2 - log internal string sets/gets
; 4 - log internal formats
; 8 - log all native params
; 16 - log internal function calls (only in debug mode)
; 32 - log line number accesses (only in debug mode)
bin_logging 49
; Maximum binary log size, in megs
max_binlog_size 20
; Plugin optimization flags - add these up to get what you want
; lowering these may stop crashes on very old CPUs
; set 65536 to disable optimizer, NOT 0!
;-------------
; 1 - float arithmetic
; 2 - float comparisons
; 4 - float rounding
optimizer 7

View File

@ -14,6 +14,7 @@
"mp_friendlyfire" "0" "1" "u"
"mp_limitteams" "0" "1" "2" "u"
"mp_autoteambalance" "0" "1" "2" "u"
"mp_limitteams" "0" "1" "2" "u"
"allow_spectators" "0" "1" "u"
"mp_freezetime" "0" "6" "u"
"mp_buytime" "1" "0.5" "u"

View File

@ -1,39 +1,83 @@
; AMX Mod X Modules
; You can specify both linux & win32 modules here
; To enable a module, remove the semi-colon from the line
;;;
; To enable a module, remove the semi-colon (;) in front of its name.
; If it's not here, simply add it its name, one per line.
; You don't need to write the _amxx part or the file extension.
;;;
; ------------------------------
; Fun - provides extra functions
; ------------------------------
fun_amxx_i386.so
fun_amxx.dll
fun_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SQL Modules usually need to be enabled manually ;;
;; You can have any number on at a time. Use ;;
;; amx_sql_type in sql.cfg to specify the default ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ----------------------------------------------------
; Engine - provides engine functions core to Half-Life
; ----------------------------------------------------
;engine_amxx_i386.so
;engine_amxx.dll
;engine_amxx_amd64.so
;mysql
;sqlite
; ----------------------------------------------------------
; Fakemeta - provides a massive interface into the HL engine
; ----------------------------------------------------------
;fakemeta_amxx_i386.so
;fakemeta_amxx.dll
;fakemeta_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Put third party modules below here. ;;
;; You can just list their names, without the _amxx ;;
;; or file extension. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; -------------------------------------------
; Database Access - only enable one of these
; -------------------------------------------
; MySQL
;mysql_amxx_i386.so
;mysql_amxx.dll
;mysql_amxx_amd64.so
; PostgreSQL
;pgsql_amxx_i386.so
;pgsql_amxx.dll
; Microsoft SQL
;mssql_amxx.dll
; SQLite
;sqlite_amxx.dll
;sqlite_amxx_i386.so
;sqlite_amxx_amd64.so
; ---------------------------------------------
; GeoIP - determines the country of ip adresses
; ---------------------------------------------
;geoip_amxx_i386.so
;geoip_amxx.dll
;geoip_amxx_amd64.so
; --------------------------------
; Sockets - network socket support
; --------------------------------
;sockets_amxx_i386.so
;sockets_amxx.dll
;sockets_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; These modules will be auto-detected and loaded ;;
;; as needed. You do not need to enable them here ;;
;; unless you have problems. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; --------------------------
; Regular Expression support
; --------------------------
;regex_amxx_i386.so
;regex_amxx.dll
;regex_amxx_amd64.so
fun
;engine
;fakemeta
;geoip
;sockets
;regex
;nvault
cstrike
csx
; --------------------
; Binary Vault support
; --------------------
;nvault_amxx_i386.so
;nvault_amxx.dll
;nvault_amxx_amd64.so
; ----------------------------------------------------------
; Counter-Strike - adds functions specific to Counter-Strike
; ----------------------------------------------------------
cstrike_amxx_i386.so
cstrike_amxx.dll
cstrike_amxx_amd64.so
; -----------------------------------------------------
; CSX - adds functionality for CS statistics and events
; -----------------------------------------------------
csx_amxx_i386.so
csx_amxx.dll
csx_amxx_amd64.so

View File

@ -17,26 +17,3 @@ amxx_logging 1
dodstats_score addons/amxmodx/data/dodstats.amxx
dodstats addons/amxmodx/data/dodstats.dat
; Binary logging level
; add these up to get what you want
; these only work with bin logging binaries
; 1 - default
; 2 - log internal string sets/gets
; 4 - log internal formats
; 8 - log all native params
; 16 - log internal function calls (only in debug mode)
; 32 - log line number accesses (only in debug mode)
bin_logging 49
; Maximum binary log size, in megs
max_binlog_size 20
; Plugin optimization flags - add these up to get what you want
; lowering these may stop crashes on very old CPUs
; set 65536 to disable optimizer, NOT 0!
;-------------
; 1 - float arithmetic
; 2 - float comparisons
; 4 - float rounding
optimizer 7

View File

@ -1,39 +1,83 @@
; AMX Mod X Modules
; You can specify both linux & win32 modules here
; To enable a module, remove the semi-colon from the line
;;;
; To enable a module, remove the semi-colon (;) in front of its name.
; If it's not here, simply add it its name, one per line.
; You don't need to write the _amxx part or the file extension.
;;;
; ------------------------------
; Fun - provides extra functions
; ------------------------------
fun_amxx_i386.so
fun_amxx.dll
fun_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SQL Modules usually need to be enabled manually ;;
;; You can have any number on at a time. Use ;;
;; amx_sql_type in sql.cfg to specify the default ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ----------------------------------------------------
; Engine - provides engine functions core to Half-Life
; ----------------------------------------------------
;engine_amxx_i386.so
;engine_amxx.dll
;engine_amxx_amd64.so
;mysql
;sqlite
; ----------------------------------------------------------
; Fakemeta - provides a massive interface into the HL engine
; ----------------------------------------------------------
;fakemeta_amxx_i386.so
;fakemeta_amxx.dll
;fakemeta_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Put third party modules below here. ;;
;; You can just list their names, without the _amxx ;;
;; or file extension. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; -------------------------------------------
; Database Access - only enable one of these
; -------------------------------------------
; MySQL
;mysql_amxx_i386.so
;mysql_amxx.dll
;mysql_amxx_amd64.so
; PostgreSQL
;pgsql_amxx_i386.so
;pgsql_amxx.dll
; Microsoft SQL
;mssql_amxx.dll
; SQLite
;sqlite_amxx.dll
;sqlite_amxx_i386.so
;sqlite_amxx_amd64.so
; ---------------------------------------------
; GeoIP - determines the country of ip adresses
; ---------------------------------------------
;geoip_amxx_i386.so
;geoip_amxx.dll
;geoip_amxx_amd64.so
; --------------------------------
; Sockets - network socket support
; --------------------------------
;sockets_amxx_i386.so
;sockets_amxx.dll
;sockets_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; These modules will be auto-detected and loaded ;;
;; as needed. You do not need to enable them here ;;
;; unless you have problems. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; --------------------------
; Regular Expression support
; --------------------------
;regex_amxx_i386.so
;regex_amxx.dll
;regex_amxx_amd64.so
fun
;engine
;fakemeta
;geoip
;sockets
;regex
;nvault
dodfun
dodx
; --------------------
; Binary Vault support
; --------------------
;nvault_amxx_i386.so
;nvault_amxx.dll
;nvault_amxx_amd64.so
; --------------------------------------------------
; Day of Defeat Fun - adds functions specific to DoD
; --------------------------------------------------
dodfun_amxx_i386.so
dodfun_amxx.dll
dodfun_amxx_amd64.so
; -------------------------------------------------------
; Day of Defeat X - adds stats and addition DoD functions
; -------------------------------------------------------
dodx_amxx_i386.so
dodx_amxx.dll
dodx_amxx_amd64.so

View File

@ -1,37 +1,69 @@
; AMX Mod X Modules
; You can specify both linux & win32 modules here
; To enable a module, remove the semi-colon from the line
;;;
; To enable a module, remove the semi-colon (;) in front of its name.
; If it's not here, simply add it its name, one per line.
; You don't need to write the _amxx part or the file extension.
;;;
; ------------------------------
; Fun - provides extra functions
; ------------------------------
fun_amxx_i386.so
fun_amxx.dll
fun_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SQL Modules usually need to be enabled manually ;;
;; You can have any number on at a time. Use ;;
;; amx_sql_type in sql.cfg to specify the default ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ----------------------------------------------------
; Engine - provides engine functions core to Half-Life
; ----------------------------------------------------
engine_amxx_i386.so
engine_amxx.dll
engine_amxx_amd64.so
;mysql
;sqlite
; ----------------------------------------------------------
; Fakemeta - provides a massive interface into the HL engine
; ----------------------------------------------------------
fakemeta_amxx_i386.so
fakemeta_amxx.dll
fakemeta_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Put third party modules below here. ;;
;; You can just list their names, without the _amxx ;;
;; or file extension. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; -------------------------------------------
; Database Access - only enable one of these
; -------------------------------------------
; MySQL
;mysql_amxx_i386.so
;mysql_amxx.dll
;mysql_amxx_amd64.so
; PostgreSQL
;pgsql_amxx_i386.so
;pgsql_amxx.dll
; Microsoft SQL
;mssql_amxx.dll
; SQLite
;sqlite_amxx.dll
;sqlite_amxx_i386.so
;sqlite_amxx_amd64.so
; ---------------------------------------------
; GeoIP - determines the country of ip adresses
; ---------------------------------------------
;geoip_amxx_i386.so
;geoip_amxx.dll
;geoip_amxx_amd64.so
; --------------------------------
; Sockets - network socket support
; --------------------------------
;sockets_amxx_i386.so
;sockets_amxx.dll
;sockets_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; These modules will be auto-detected and loaded ;;
;; as needed. You do not need to enable them here ;;
;; unless you have problems. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; --------------------------
; Regular Expression support
; --------------------------
;regex_amxx_i386.so
;regex_amxx.dll
;regex_amxx_amd64.so
fun
engine
fakemeta
;geoip
;sockets
;regex
;nvault
; --------------------
; Binary Vault support
; --------------------
;nvault_amxx_i386.so
;nvault_amxx.dll
;nvault_amxx_amd64.so

View File

@ -1,37 +1,69 @@
; AMX Mod X Modules
; You can specify both linux & win32 modules here
; To enable a module, remove the semi-colon from the line
;;;
; To enable a module, remove the semi-colon (;) in front of its name.
; If it's not here, simply add it its name, one per line.
; You don't need to write the _amxx part or the file extension.
;;;
; ------------------------------
; Fun - provides extra functions
; ------------------------------
fun_amxx_i386.so
fun_amxx.dll
fun_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SQL Modules usually need to be enabled manually ;;
;; You can have any number on at a time. Use ;;
;; amx_sql_type in sql.cfg to specify the default ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ----------------------------------------------------
; Engine - provides engine functions core to Half-Life
; ----------------------------------------------------
;engine_amxx_i386.so
;engine_amxx.dll
;engine_amxx_amd64.so
;mysql
;sqlite
; ----------------------------------------------------------
; Fakemeta - provides a massive interface into the HL engine
; ----------------------------------------------------------
;fakemeta_amxx_i386.so
;fakemeta_amxx.dll
;fakemeta_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Put third party modules below here. ;;
;; You can just list their names, without the _amxx ;;
;; or file extension. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; -------------------------------------------
; Database Access - only enable one of these
; -------------------------------------------
; MySQL
;mysql_amxx_i386.so
;mysql_amxx.dll
;mysql_amxx_amd64.so
; PostgreSQL
;pgsql_amxx_i386.so
;pgsql_amxx.dll
; Microsoft SQL
;mssql_amxx.dll
; SQLite
;sqlite_amxx.dll
;sqlite_amxx_i386.so
;sqlite_amxx_amd64.so
; ---------------------------------------------
; GeoIP - determines the country of ip adresses
; ---------------------------------------------
;geoip_amxx_i386.so
;geoip_amxx.dll
;geoip_amxx_amd64.so
; --------------------------------
; Sockets - network socket support
; --------------------------------
;sockets_amxx_i386.so
;sockets_amxx.dll
;sockets_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; These modules will be auto-detected and loaded ;;
;; as needed. You do not need to enable them here ;;
;; unless you have problems. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; --------------------------
; Regular Expression support
; --------------------------
;regex_amxx_i386.so
;regex_amxx.dll
;regex_amxx_amd64.so
;fun
;engine
;fakemeta
;geoip
;sockets
;regex
;nvault
; --------------------
; Binary Vault support
; --------------------
;nvault_amxx_i386.so
;nvault_amxx.dll
;nvault_amxx_amd64.so

View File

@ -1,38 +1,76 @@
; AMX Mod X Modules
; You can specify both linux & win32 modules here
; To enable a module, remove the semi-colon from the line
;;;
; To enable a module, remove the semi-colon (;) in front of its name.
; If it's not here, simply add it its name, one per line.
; You don't need to write the _amxx part or the file extension.
;;;
; ------------------------------
; Fun - provides extra functions
; ------------------------------
fun_amxx_i386.so
fun_amxx.dll
fun_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SQL Modules usually need to be enabled manually ;;
;; You can have any number on at a time. Use ;;
;; amx_sql_type in sql.cfg to specify the default ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ----------------------------------------------------
; Engine - provides engine functions core to Half-Life
; ----------------------------------------------------
;engine_amxx_i386.so
;engine_amxx.dll
;engine_amxx_amd64.so
;mysql
;sqlite
; ----------------------------------------------------------
; Fakemeta - provides a massive interface into the HL engine
; ----------------------------------------------------------
;fakemeta_amxx_i386.so
;fakemeta_amxx.dll
;fakemeta_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Put third party modules below here. ;;
;; You can just list their names, without the _amxx ;;
;; or file extension. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; -------------------------------------------
; Database Access - only enable one of these
; -------------------------------------------
; MySQL
;mysql_amxx_i386.so
;mysql_amxx.dll
;mysql_amxx_amd64.so
; PostgreSQL
;pgsql_amxx_i386.so
;pgsql_amxx.dll
; Microsoft SQL
;mssql_amxx.dll
; SQLite
;sqlite_amxx.dll
;sqlite_amxx_i386.so
;sqlite_amxx_amd64.so
; ---------------------------------------------
; GeoIP - determines the country of ip adresses
; ---------------------------------------------
;geoip_amxx_i386.so
;geoip_amxx.dll
;geoip_amxx_amd64.so
; --------------------------------
; Sockets - network socket support
; --------------------------------
;sockets_amxx_i386.so
;sockets_amxx.dll
;sockets_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; These modules will be auto-detected and loaded ;;
;; as needed. You do not need to enable them here ;;
;; unless you have problems. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; --------------------------
; Regular Expression support
; --------------------------
;regex_amxx_i386.so
;regex_amxx.dll
;regex_amxx_amd64.so
fun
;engine
;fakemeta
;geoip
;sockets
;regex
;nvault
ns
; --------------------
; Binary Vault support
; --------------------
;nvault_amxx_i386.so
;nvault_amxx.dll
;nvault_amxx_amd64.so
; -----------------
; Natural Selection
; -----------------
ns_amxx_i386.so
ns_amxx.dll
ns_amxx_amd64.so

View File

@ -4,11 +4,8 @@
// *NOTE* Linux users may encounter problems if they specify "localhost" instead of "127.0.0.1"
// We recommend using your server IP address instead of its name
// *NOTE* amx_sql_type specifies the DEFAULT database type which admin.sma will use.
amx_sql_host "127.0.0.1"
amx_sql_user "root"
amx_sql_pass ""
amx_sql_db "amx"
amx_sql_table "admins"
amx_sql_type "mysql"
amx_sql_db "amx"
amx_sql_table "admins"

View File

@ -16,26 +16,3 @@ tfcstats addons/amxmodx/data/tfcstats.dat
; 2 - one logfile / map
; 3 - HL Logs
amxx_logging 1
; Binary logging level
; add these up to get what you want
; these only work with bin logging binaries
; 1 - default
; 2 - log internal string sets/gets
; 4 - log internal formats
; 8 - log all native params
; 16 - log internal function calls (only in debug mode)
; 32 - log line number accesses (only in debug mode)
bin_logging 49
; Maximum binary log size, in megs
max_binlog_size 20
; Plugin optimization flags - add these up to get what you want
; lowering these may stop crashes on very old CPUs
; set 65536 to disable optimizer, NOT 0!
;-------------
; 1 - float arithmetic
; 2 - float comparisons
; 4 - float rounding
optimizer 7

View File

@ -1,38 +1,76 @@
; AMX Mod X Modules
; You can specify both linux & win32 modules here
; To enable a module, remove the semi-colon from the line
;;;
; To enable a module, remove the semi-colon (;) in front of its name.
; If it's not here, simply add it its name, one per line.
; You don't need to write the _amxx part or the file extension.
;;;
; ------------------------------
; Fun - provides extra functions
; ------------------------------
fun_amxx_i386.so
fun_amxx.dll
fun_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SQL Modules usually need to be enabled manually ;;
;; You can have any number on at a time. Use ;;
;; amx_sql_type in sql.cfg to specify the default ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ----------------------------------------------------
; Engine - provides engine functions core to Half-Life
; ----------------------------------------------------
;engine_amxx_i386.so
;engine_amxx.dll
;engine_amxx_amd64.so
;mysql
;sqlite
; ----------------------------------------------------------
; Fakemeta - provides a massive interface into the HL engine
; ----------------------------------------------------------
;fakemeta_amxx_i386.so
;fakemeta_amxx.dll
;fakemeta_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Put third party modules below here. ;;
;; You can just list their names, without the _amxx ;;
;; or file extension. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; -------------------------------------------
; Database Access - only enable one of these
; -------------------------------------------
; MySQL
;mysql_amxx_i386.so
;mysql_amxx.dll
;mysql_amxx_amd64.so
; PostgreSQL
;pgsql_amxx_i386.so
;pgsql_amxx.dll
; Microsoft SQL
;mssql_amxx.dll
; SQLite
;sqlite_amxx.dll
;sqlite_amxx_i386.so
;sqlite_amxx_amd64.so
; ---------------------------------------------
; GeoIP - determines the country of ip adresses
; ---------------------------------------------
;geoip_amxx_i386.so
;geoip_amxx.dll
;geoip_amxx_amd64.so
; --------------------------------
; Sockets - network socket support
; --------------------------------
;sockets_amxx_i386.so
;sockets_amxx.dll
;sockets_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; These modules will be auto-detected and loaded ;;
;; as needed. You do not need to enable them here ;;
;; unless you have problems. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; --------------------------
; Regular Expression support
; --------------------------
;regex_amxx_i386.so
;regex_amxx.dll
;regex_amxx_amd64.so
fun
;engine
;fakemeta
;geoip
;sockets
;regex
;nvault
tfcx
; --------------------
; Binary Vault support
; --------------------
;nvault_amxx_i386.so
;nvault_amxx.dll
;nvault_amxx_amd64.so
; ------------------------------------------------------------------
; Team Fortress Classic X - adds functions and stats specific to TFC
; ------------------------------------------------------------------
tfcx_amxx_i386.so
tfcx_amxx.dll
tfcx_amxx_amd64.so

View File

@ -16,26 +16,3 @@ tsstats addons/amxmodx/data/tsstats.dat
; 2 - one logfile / map
; 3 - HL Logs
amxx_logging 1
; Binary logging level
; add these up to get what you want
; these only work with bin logging binaries
; 1 - default
; 2 - log internal string sets/gets
; 4 - log internal formats
; 8 - log all native params
; 16 - log internal function calls (only in debug mode)
; 32 - log line number accesses (only in debug mode)
bin_logging 49
; Maximum binary log size, in megs
max_binlog_size 20
; Plugin optimization flags - add these up to get what you want
; lowering these may stop crashes on very old CPUs
; set 65536 to disable optimizer, NOT 0!
;-------------
; 1 - float arithmetic
; 2 - float comparisons
; 4 - float rounding
optimizer 7

View File

@ -1,39 +1,83 @@
; AMX Mod X Modules
; You can specify both linux & win32 modules here
; To enable a module, remove the semi-colon from the line
;;;
; To enable a module, remove the semi-colon (;) in front of its name.
; If it's not here, simply add it its name, one per line.
; You don't need to write the _amxx part or the file extension.
;;;
; ------------------------------
; Fun - provides extra functions
; ------------------------------
fun_amxx_i386.so
fun_amxx.dll
fun_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SQL Modules usually need to be enabled manually ;;
;; You can have any number on at a time. Use ;;
;; amx_sql_type in sql.cfg to specify the default ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ----------------------------------------------------
; Engine - provides engine functions core to Half-Life
; ----------------------------------------------------
;engine_amxx_i386.so
;engine_amxx.dll
;engine_amxx_amd64.so
;mysql
;sqlite
; ----------------------------------------------------------
; Fakemeta - provides a massive interface into the HL engine
; ----------------------------------------------------------
;fakemeta_amxx_i386.so
;fakemeta_amxx.dll
;fakemeta_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Put third party modules below here. ;;
;; You can just list their names, without the _amxx ;;
;; or file extension. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; -------------------------------------------
; Database Access - only enable one of these
; -------------------------------------------
; MySQL
;mysql_amxx_i386.so
;mysql_amxx.dll
;mysql_amxx_amd64.so
; PostgreSQL
;pgsql_amxx_i386.so
;pgsql_amxx.dll
; Microsoft SQL
;mssql_amxx.dll
; SQLite
;sqlite_amxx.dll
;sqlite_amxx_i386.so
;sqlite_amxx_amd64.so
; ---------------------------------------------
; GeoIP - determines the country of ip adresses
; ---------------------------------------------
;geoip_amxx_i386.so
;geoip_amxx.dll
;geoip_amxx_amd64.so
; --------------------------------
; Sockets - network socket support
; --------------------------------
;sockets_amxx_i386.so
;sockets_amxx.dll
;sockets_amxx_amd64.so
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; These modules will be auto-detected and loaded ;;
;; as needed. You do not need to enable them here ;;
;; unless you have problems. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; --------------------------
; Regular Expression support
; --------------------------
;regex_amxx_i386.so
;regex_amxx.dll
;regex_amxx_amd64.so
fun
;engine
;fakemeta
;geoip
;sockets
;regex
;nvault
tsx
tsfun
; --------------------
; Binary Vault support
; --------------------
;nvault_amxx_i386.so
;nvault_amxx.dll
;nvault_amxx_amd64.so
; -----------------------------------------------------------
; The Specialists X - adds functions and stats specific to TS
; -----------------------------------------------------------
tsx_amxx_i386.so
tsx_amxx.dll
tsx_amxx_amd64.so
; -----------------------------------------------------------
; The Specialists Fun - more functionality
; -----------------------------------------------------------
tsfun_amxx_i386.so
tsfun_amxx.dll
tsfun_amxx_amd64.so

View File

@ -31,7 +31,7 @@ static cell AMX_NATIVE_CALL get_user_level(AMX *amx,cell *params)
static cell AMX_NATIVE_CALL set_user_level(AMX *amx,cell *params)
{
if(GetUserLevel(params[1]) > params[2])
if(GetUserLevel(params[0]) > params[2])
{
MF_LogError(amx,AMX_ERR_NATIVE,"Must set to a level higher than current one!");
return 0;

View File

@ -1,34 +0,0 @@
#include "amxxmodule.h"
#include "ComboArray.h"
extern AMX_NATIVE_INFO bintrie_exports[];
extern AMX_NATIVE_INFO bintrie_usage_exports[];
extern ComboArray MasterTrie;
extern AMX_NATIVE_INFO list_exports[];
extern AMX_NATIVE_INFO list_creation_exports[];
extern ComboArray MasterList;
extern AMX_NATIVE_INFO map_exports[];
extern AMX_NATIVE_INFO map_creation_exports[];
extern ComboArray MasterMap;
void OnAmxxAttach( void )
{
MF_AddNatives(bintrie_exports);
MF_AddNatives(bintrie_usage_exports);
MF_AddNatives(list_exports);
MF_AddNatives(list_creation_exports);
MF_AddNatives(map_exports);
MF_AddNatives(map_creation_exports);
}
void OnAmxxDetach( void )
{
JudyClearMasterTrie(&MasterTrie);
JudyClearMasterList(&MasterList);
JudyClearMasterMap(&MasterMap);
}

View File

@ -1,175 +0,0 @@
# Microsoft Developer Studio Generated Dependency File, included by Array.mak
.\Array.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CArray.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\ComboArray.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\BinTrieNatives.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\BinTrieNativeFunctions.h"\
".\Capsule.h"\
".\CArray.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\ComboArray.h"\
".\GenericNatives.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\NativeIncludes.h"\
".\osdefs.h"\
.\Capsule.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\CArray.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CArray.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\CBinTrie.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\CKeytable.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CKeytable.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\JudyExtra.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\moduleconfig.h"\
".\osdefs.h"\
.\ListNatives.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CArray.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\ComboArray.h"\
".\GenericNatives.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\ListNativeFunctions.h"\
".\moduleconfig.h"\
".\NativeIncludes.h"\
".\osdefs.h"\
.\MapNatives.cpp : \
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\amxxmodule.h"\
".\Capsule.h"\
".\CArray.h"\
".\CBaseList.h"\
".\CBaseMap.h"\
".\CBinTrie.h"\
".\CHashtable.h"\
".\CKeytable.h"\
".\ComboArray.h"\
".\ComboTable.h"\
".\GenericNatives.h"\
".\Judy.h"\
".\JudyEx.h"\
".\JudyExtra.h"\
".\JudyIncludes.h"\
".\JudyVar.h"\
".\JudyVec.h"\
".\MapNativeFunctions.h"\
".\moduleconfig.h"\
".\NativeIncludes.h"\
".\osdefs.h"\
.\amxxmodule.cpp : \
".\amxxmodule.h"\
".\moduleconfig.h"\

View File

@ -4,7 +4,7 @@
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=Array - Win32 Debug
CFG=ARRAY - WIN32 RELEASE
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
@ -13,12 +13,11 @@ CFG=Array - Win32 Debug
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "Array.mak" CFG="Array - Win32 Debug"
!MESSAGE NMAKE /f "Array.mak" CFG="ARRAY - WIN32 RELEASE"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "Array - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "Array - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
@ -28,101 +27,45 @@ CFG=Array - Win32 Debug
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "Array - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_MFC 2
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /FR /YX /FD /c
# ADD CPP /nologo /MD /W3 /vmg /vms /GX /ZI /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /D "_WINDLL" /D "_AFXDLL" /U "DLLEXPORT" /FR /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
!ELSEIF "$(CFG)" == "Array - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
!ENDIF
# ADD LINK32 /nologo /dll /machine:I386
# SUBTRACT LINK32 /incremental:yes
# Begin Target
# Name "Array - Win32 Release"
# Name "Array - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\Array.cpp
SOURCE=.\amxxmodule.cpp
# SUBTRACT CPP /Z<none>
# End Source File
# Begin Source File
SOURCE=.\BinTrieNatives.cpp
# End Source File
# Begin Source File
SOURCE=.\Capsule.cpp
# End Source File
# Begin Source File
SOURCE=.\CArray.cpp
# End Source File
# Begin Source File
SOURCE=.\CBinTrie.cpp
# End Source File
# Begin Source File
SOURCE=.\CKeytable.cpp
# End Source File
# Begin Source File
SOURCE=.\JudyExtra.cpp
# End Source File
# Begin Source File
SOURCE=.\ListNatives.cpp
# End Source File
# Begin Source File
SOURCE=.\MapNatives.cpp
SOURCE=.\array.cpp
# SUBTRACT CPP /Z<none> /u
# End Source File
# End Group
# Begin Group "Header Files"
@ -130,7 +73,7 @@ SOURCE=.\MapNatives.cpp
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\Capsule.h
SOURCE=.\amxxmodule.h
# End Source File
# Begin Source File
@ -138,18 +81,6 @@ SOURCE=.\CArray.h
# End Source File
# Begin Source File
SOURCE=.\CBaseList.h
# End Source File
# Begin Source File
SOURCE=.\CBaseMap.h
# End Source File
# Begin Source File
SOURCE=.\CBinTrie.h
# End Source File
# Begin Source File
SOURCE=.\CHashtable.h
# End Source File
# Begin Source File
@ -158,15 +89,11 @@ SOURCE=.\CKeytable.h
# End Source File
# Begin Source File
SOURCE=.\ComboArray.h
SOURCE=.\element.h
# End Source File
# Begin Source File
SOURCE=.\ComboTable.h
# End Source File
# Begin Source File
SOURCE=.\JudyIncludes.h
SOURCE=.\moduleconfig.h
# End Source File
# End Group
# Begin Group "Resource Files"
@ -174,63 +101,7 @@ SOURCE=.\JudyIncludes.h
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# Begin Source File
SOURCE=.\amxxmodule.cpp
# End Source File
# Begin Source File
SOURCE=.\amxxmodule.h
# End Source File
# Begin Source File
SOURCE=.\BinTrieNativeFunctions.h
# End Source File
# Begin Source File
SOURCE=.\GenericNatives.h
# End Source File
# Begin Source File
SOURCE=.\Judy.h
# End Source File
# Begin Source File
SOURCE=.\JudyEx.h
# End Source File
# Begin Source File
SOURCE=.\JudyExtra.h
# End Source File
# Begin Source File
SOURCE=.\JudyVar.h
# End Source File
# Begin Source File
SOURCE=.\JudyVec.h
# End Source File
# Begin Source File
SOURCE=.\ListNativeFunctions.h
# End Source File
# Begin Source File
SOURCE=.\MapNativeFunctions.h
# End Source File
# Begin Source File
SOURCE=.\moduleconfig.h
# End Source File
# Begin Source File
SOURCE=.\NativeIncludes.h
# End Source File
# Begin Source File
SOURCE=.\osdefs.h
# End Source File
# Begin Source File
SOURCE=.\Judy.lib
SOURCE="..\module\Judy-1.0.1\src\Judy.lib"
# End Source File
# End Group
# End Target

View File

@ -1,29 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "Array"=".\Array.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

Binary file not shown.

Binary file not shown.

View File

@ -1,110 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: Array - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPED.tmp" with contents
[
/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /FR"Release/" /Fp"Release/Array.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
"C:\Array\Array.cpp"
"C:\Array\BinTrieNatives.cpp"
"C:\Array\Capsule.cpp"
"C:\Array\CArray.cpp"
"C:\Array\CBinTrie.cpp"
"C:\Array\CKeytable.cpp"
"C:\Array\JudyExtra.cpp"
"C:\Array\ListNatives.cpp"
"C:\Array\MapNatives.cpp"
"C:\Array\amxxmodule.cpp"
]
Creating command line "cl.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPED.tmp"
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPEE.tmp" with contents
[
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /pdb:"Release/Array.pdb" /machine:I386 /out:"Release/Array.dll" /implib:"Release/Array.lib"
.\Release\Array.obj
.\Release\BinTrieNatives.obj
.\Release\Capsule.obj
.\Release\CArray.obj
.\Release\CBinTrie.obj
.\Release\CKeytable.obj
.\Release\JudyExtra.obj
.\Release\ListNatives.obj
.\Release\MapNatives.obj
.\Release\amxxmodule.obj
.\Judy.lib
]
Creating command line "link.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPEE.tmp"
<h3>Output Window</h3>
Compiling...
Array.cpp
BinTrieNatives.cpp
Capsule.cpp
CArray.cpp
CBinTrie.cpp
CKeytable.cpp
JudyExtra.cpp
C:\Array\JudyExtra.cpp(10) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(15) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(20) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(23) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(34) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(41) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(66) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(102) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(107) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(112) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(115) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(127) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(132) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(137) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(140) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(160) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(164) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(167) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(190) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(205) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(210) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(215) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(218) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(230) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(235) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(240) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(243) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(258) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(266) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(274) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(277) : warning C4101: 'e' : unreferenced local variable
C:\Array\JudyExtra.cpp(305) : warning C4101: 'e' : unreferenced local variable
ListNatives.cpp
MapNatives.cpp
amxxmodule.cpp
Linking...
Creating library Release/Array.lib and object Release/Array.exp
LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPF2.tmp" with contents
[
/nologo /o"Release/Array.bsc"
.\Release\Array.sbr
.\Release\BinTrieNatives.sbr
.\Release\Capsule.sbr
.\Release\CArray.sbr
.\Release\CBinTrie.sbr
.\Release\CKeytable.sbr
.\Release\JudyExtra.sbr
.\Release\ListNatives.sbr
.\Release\MapNatives.sbr
.\Release\amxxmodule.sbr]
Creating command line "bscmake.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPF2.tmp"
Creating browse info file...
<h3>Output Window</h3>
<h3>Results</h3>
Array.dll - 0 error(s), 33 warning(s)
</pre>
</body>
</html>

View File

@ -1,18 +1,15 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dodx", "dodx.vcproj", "{9008A886-2DD0-443C-B468-AD84868D89B0}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Array", "Array.vcproj", "{11B6F2E4-A603-4559-8E64-FFBF9541E238}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{9008A886-2DD0-443C-B468-AD84868D89B0}.Debug.ActiveCfg = Debug|Win32
{9008A886-2DD0-443C-B468-AD84868D89B0}.Debug.Build.0 = Debug|Win32
{9008A886-2DD0-443C-B468-AD84868D89B0}.Release.ActiveCfg = Release|Win32
{9008A886-2DD0-443C-B468-AD84868D89B0}.Release.Build.0 = Release|Win32
{11B6F2E4-A603-4559-8E64-FFBF9541E238}.Release.ActiveCfg = Release|Win32
{11B6F2E4-A603-4559-8E64-FFBF9541E238}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection

151
dlls/arrayx/Array.vcproj Normal file
View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="Array"
SccProjectName=""
SccLocalPath=""
Keyword="MFCProj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="2"
UseOfMFC="2"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg /vms"
Optimization="2"
InlineFunctionExpansion="1"
PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;_USRDLL;ARRAY_EXPORTS"
StringPooling="TRUE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Release/Array.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
BrowseInformation="1"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
UndefinePreprocessorDefinitions="DLLEXPORT"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile=".\Release/array_amxx.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
ProgramDatabaseFile=".\Release/Array.pdb"
ImportLibrary=".\Release/Array.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\Release/Array.tlb"
HeaderFileName=""/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File
RelativePath="amxxmodule.cpp">
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg /vms /vmg /vms"
Optimization="2"
PreprocessorDefinitions=""
BrowseInformation="1"
DebugInformationFormat="0"
UndefinePreprocessorDefinitions=""/>
</FileConfiguration>
</File>
<File
RelativePath="array.cpp">
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg /vms /vmg /vms"
Optimization="2"
PreprocessorDefinitions=""
BrowseInformation="1"
DebugInformationFormat="0"
UndefinePreprocessorDefinitions=""/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl">
<File
RelativePath="amxxmodule.h">
</File>
<File
RelativePath="CArray.h">
</File>
<File
RelativePath="CHashtable.h">
</File>
<File
RelativePath="CKeytable.h">
</File>
<File
RelativePath="element.h">
</File>
<File
RelativePath="moduleconfig.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
<File
RelativePath=".\Judy-1.0.1\src\Judy.lib">
</File>
<File
RelativePath=".\osdefs.h">
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,78 +0,0 @@
#ifndef _bintrie_NATIVE_FUNC_INC_H
#define _bintrie_NATIVE_FUNC_INC_H
#define JUDY_GLUE_FUNC( x , y ) x ## y
#define JUDY_GLUE_STR( x, y ) #x#y
#define JUDY_MASTER_EDIT_FUNCTIONS
#define JUDY_MASTER_CLEAR_FUNC JUDY_GLUE_FUNC( bintrie , _clear )
#define JUDY_MASTER_CLEAR_STR JUDY_GLUE_STR ( bintrie , _clear )
#define JUDY_MASTER_DELETE_FUNC JUDY_GLUE_FUNC( bintrie , _delete )
#define JUDY_MASTER_DELETE_STR JUDY_GLUE_STR ( bintrie , _delete )
#define JUDY_MASTER_IO_FUNCTIONS
#define JUDY_MASTER_SAVE_FUNC JUDY_GLUE_FUNC( bintrie , _save )
#define JUDY_MASTER_SAVE_STR JUDY_GLUE_STR ( bintrie , _save )
#define JUDY_SAVE_FUNC(bin,file) JudySaveBinTrie(bin , file )
#define JUDY_MASTER_LOAD_FUNC JUDY_GLUE_FUNC( bintrie , _load )
#define JUDY_MASTER_LOAD_STR JUDY_GLUE_STR ( bintrie , _load )
#define JUDY_LOAD_FUNC(bin, file) JudyLoadBinTrie(bin , file )
#define JUDY_MASTER_AMOUNT_FUNCTIONS
#define JUDY_MASTER_COUNT_FUNC JUDY_GLUE_FUNC( bintrie , _count )
#define JUDY_MASTER_COUNT_STR JUDY_GLUE_STR ( bintrie , _count )
#define JUDY_MASTER_BYCOUNT_FUNC JUDY_GLUE_FUNC( bintrie , _bycount )
#define JUDY_MASTER_BYCOUNT_STR JUDY_GLUE_STR ( bintrie , _bycount )
#define JUDY_SLAVE_AMOUNT_FUNCTIONS
#define JUDY_SLAVE_COUNT_FUNC JUDY_GLUE_FUNC( bintrie , _size )
#define JUDY_SLAVE_COUNT_STR JUDY_GLUE_STR ( bintrie , _size )
#define JUDY_SLAVE_BYCOUNT_FUNC JUDY_GLUE_FUNC( bintrie , _get_nth )
#define JUDY_SLAVE_BYCOUNT_STR JUDY_GLUE_STR ( bintrie , _get_nth )
#define JUDY_SLAVE_EDIT_FUNCTIONS
#define JUDY_SLAVE_MEMORY_FUNC JUDY_GLUE_FUNC( bintrie , _memory )
#define JUDY_SLAVE_MEMORY_STR JUDY_GLUE_STR ( bintrie , _memory )
#define JUDY_SLAVE_ISFILLED_FUNC JUDY_GLUE_FUNC( bintrie , _isfilled )
#define JUDY_SLAVE_ISFILLED_STR JUDY_GLUE_STR ( bintrie , _isfilled )
#define JUDY_SLAVE_ISEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _isempty )
#define JUDY_SLAVE_ISEMPTY_STR JUDY_GLUE_STR ( bintrie , _isempty )
#define NO_JUDY_SLAVE_REMOVE_FUNC
#define JUDY_SLAVE_SEARCH_FUNCTIONS
#define JUDY_SLAVE_FIRST_FUNC JUDY_GLUE_FUNC( bintrie , _first )
#define JUDY_SLAVE_LAST_FUNC JUDY_GLUE_FUNC( bintrie , _last )
#define JUDY_SLAVE_FIRST_STR JUDY_GLUE_STR ( bintrie , _first )
#define JUDY_SLAVE_LAST_STR JUDY_GLUE_STR ( bintrie , _last )
#define JUDY_SLAVE_NEXT_FUNC JUDY_GLUE_FUNC( bintrie , _next )
#define JUDY_SLAVE_PREV_FUNC JUDY_GLUE_FUNC( bintrie , _prev )
#define JUDY_SLAVE_NEXT_STR JUDY_GLUE_STR ( bintrie , _next )
#define JUDY_SLAVE_PREV_STR JUDY_GLUE_STR ( bintrie , _prev )
#define JUDY_SLAVE_SEARCH_EMPTY_FUNCTIONS
#define JUDY_SLAVE_FIRSTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _firstempty )
#define JUDY_SLAVE_LASTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _lastempty )
#define JUDY_SLAVE_FIRSTEMPTY_STR JUDY_GLUE_STR ( bintrie , _firstempty )
#define JUDY_SLAVE_LASTEMPTY_STR JUDY_GLUE_STR ( bintrie , _lastempty )
#define JUDY_SLAVE_NEXTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _nextempty )
#define JUDY_SLAVE_PREVEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _prevempty )
#define JUDY_SLAVE_NEXTEMPTY_STR JUDY_GLUE_STR ( bintrie , _nextempty )
#define JUDY_SLAVE_PREVEMPTY_STR JUDY_GLUE_STR ( bintrie , _prevempty )
#endif

View File

@ -1,69 +0,0 @@
#include "CBinTrie.h"
#define KEY_TYPE cell
#define DYNAMIC_UNIT_TYPE BinTrie
#define STORAGE_TYPE cell
#define MASTER_NAME MasterTrie
#define EXPORT_NAME bintrie_exports
#define SEARCH_ERROR_OFFSET 0
#define GET_KEY(params, num) params[num]
#define SET_KEY(stuff, parameter) stuff
#include "BinTrieNativeFunctions.h"
#include "NativeIncludes.h"
static cell AMX_NATIVE_CALL bintrie_create(AMX *amx,cell *params)
{
DTYPE* Unit;
M_ITYPE Index = params[1];
JUDY_CREATE_INDEX(MNAME,Unit,BinTrie,Index);
return Index;
}
static cell AMX_NATIVE_CALL bintrie_set(AMX *amx,cell *params)
{
DTYPE* Unit = NULL;
JUDY_GET_INDEX(MNAME,Unit, params[1]);
ITYPE Indice = JUDY_GET_KEY(params,2);
bool Value = (params[3] != NULL);
try { return Unit->Set(Indice, Value ); }
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Set Function ");
}
static cell AMX_NATIVE_CALL bintrie_get(AMX *amx,cell *params)
{
DTYPE* Unit = NULL;
JUDY_GET_INDEX(MNAME,Unit, params[1]);
ITYPE Indice = JUDY_GET_KEY(params,2);
try { return Unit->Get(Indice ); }
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Get Function ");
}
static cell AMX_NATIVE_CALL bintrie_remove(AMX *amx,cell *params)
{
DTYPE* Unit = NULL;
JUDY_GET_INDEX(MNAME,Unit, params[1]);
ITYPE Indice = JUDY_GET_KEY(params,2);
try { return Unit->Delete(Indice ); }
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Delete Function ");
}
AMX_NATIVE_INFO bintrie_usage_exports[] =
{
{ "bintrie_create", bintrie_create },
{ "bintrie_set", bintrie_set },
{ "bintrie_get", bintrie_get },
{ "bintrie_remove", bintrie_remove },
{ NULL, NULL }
};

View File

@ -1,87 +0,0 @@
#include "CArray.h"
void Array::ThrowSearchError(char* type)
{
char value[50];
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
throw JudyEx(value,false);
}
void Array::ThrowIndexError( cell index, bool disable_check )
{
if(disable_check == true) return;
char error[50];
sprintf(error,"Index %i is not set.",index);
throw JudyEx(error,true);
}
cell Array::First( cell Start)
{
PPvoid_t success = JudyLFirst(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:First");
return Start;
}
cell Array::FirstEmpty( cell Start)
{
cell success = JudyLFirstEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:FirstEmpty");
return Start;
}
cell Array::Next( cell Start)
{
PPvoid_t success = JudyLNext(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Next");
return Start;
}
cell Array::NextEmpty( cell Start)
{
cell success = JudyLNextEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:NextEmpty");
return Start;
}
cell Array::Prev( cell Start)
{
PPvoid_t success = JudyLPrev(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Prev");
return Start;
}
cell Array::PrevEmpty( cell Start)
{
cell success = JudyLPrevEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:PrevEmpty");
return Start;
}
cell Array::Last( cell Start)
{
PPvoid_t success = JudyLLast(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Last");
return Start;
}
cell Array::LastEmpty( cell Start)
{
cell success = JudyLLastEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:LastEmpty");
return Start;
}
cell Array::ByCount(cell n, cell Start)
{
PPvoid_t success = JudyLByCount(Table, n, reinterpret_cast<Word_t *>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Nth");
return Start;
}

View File

@ -1,74 +1,734 @@
#ifndef _ARRAYCLASS_H
#define _ARRAYCLASS_H
Pvoid_t MasterArray = (Pvoid_t) NULL; //Create the control array
#include "JudyIncludes.h"
#include "CBaseList.h"
#include "JudyExtra.h"
//#include <JudyL.h>
//Create an array that stores whether or not indices are used.
Pvoid_t MasterArray_Binary = (Pvoid_t) NULL;
class Array: public CBaseList
void DeleteMasterArray(void);
Word_t NewArray(Word_t Index, Word_t reserve = 0);
PPvoid_t Find_Array(Word_t Index, Word_t disable_check = 1, AMX *amx = 0);
void DeleteArray(Word_t Index);
void ClearArray(Word_t Index);
template <class Type>
void Array_Set(PPvoid_t Array, char* Index, Type value);
PPvoid_t Array_Get(AMX* amx, PPvoid_t Array, Word_t Index, int ignore_error = 0);
void DeleteCell(Pvoid_t* Array, Word_t Index);
void Delete_MasterArray(void)
{
private:
Pvoid_t Table;
Word_t
Index = 0,
success = 0;
J1F(success, MasterArray_Binary, Index);
while( success )
{
DeleteArray( Index ); //Delete array.
J1F(success, MasterArray_Binary, Index); //Get next array
}
}
Word_t NewArray(Word_t Index, Word_t reserve)
{
Word_t success; //Dummy for macros.
J1T(success, MasterArray_Binary, Index); //Check if bit is already set.
if (success && reserve)
return Index; //If the bit is set but it's 'reserved', return the index.
//Only do this if the bit is not set.
J1FE(success, MasterArray_Binary, Index);
J1S(success, MasterArray_Binary, Index);
PPvoid_t Array = JudyLIns(&MasterArray, Index, PJE0);
*Array = (PWord_t) NULL;
return Index;
}
PPvoid_t Find_Array(Word_t Index, Word_t disable_check, AMX *amx)
{
Word_t success;
J1T(success, MasterArray_Binary, Index);
if (success || disable_check)
{ //Bit is valid
if(!success)
NewArray(Index);
return JudyLGet( MasterArray, Index, PJE0);
}
MF_LogError(amx,AMX_ERR_NATIVE,"Array %d is invalid", Index);
return NULL;
}
void DeleteArray(Word_t Index)
{
int success;
J1T(success, MasterArray_Binary, Index);
if (success)
{ //If the bit is set, clear and delete array.
ClearArray(Index);
J1U(success, MasterArray_Binary, Index);
JudyLDel(&MasterArray, Index, PJE0);
}
}
void ClearArray(Word_t Index)
{
int success;
J1T(success, MasterArray_Binary, Index);
if (success) //dont bother with unset arrays.
{
PPvoid_t Array = Find_Array(Index);
Word_t index = 0;
PPvoid_t PValue = JudyLFirst(*Array, &index, PJE0);
while (PValue != NULL)
{
element elem_value = *reinterpret_cast<element*>(*PValue);
elem_value.delete_element();
PValue = JudyLNext(*Array, &index, PJE0);
}
JudyLFreeArray(Array, PJE0);
}
}
static cell AMX_NATIVE_CALL new_array(AMX *amx,cell *params)
{
return NewArray(params[1], params[2]);
}
template <class Type> //This will support input char*, Vector*, int, and cell_real*.
void Array_Set(PPvoid_t Array, int Index, Type value)
{
PPvoid_t PValue; // pointer to array element value
PValue = JudyLIns(Array, Index, PJE0);
*PValue = reinterpret_cast<void*>(value);
}
PPvoid_t Array_Get(AMX* amx, PPvoid_t Array, int Index, int ignore_error = 0)
{
PPvoid_t PValue = JudyLGet( *Array, Index, PJE0 );
if (PValue == NULL && !ignore_error)
MF_LogError(amx, AMX_ERR_NATIVE, "Array index %d is invalid", Index);
return PValue;
}
void DeleteCell(PPvoid_t Array, Word_t Index)
{
JudyLDel(Array, Index, PJE0);
}
static cell AMX_NATIVE_CALL delete_array(AMX *amx,cell *params)
{
DeleteArray( params[1] );
return 1;
}
static cell AMX_NATIVE_CALL clear_array(AMX *amx,cell *params)
{
ClearArray( params[1] );
return 1;
}
static cell AMX_NATIVE_CALL Array_Save(AMX *amx, cell *params)
{
PPvoid_t Array = Find_Array(params[1], params[3], amx);
if (Array == NULL) return 0;
int filename_length;
char *file = MF_GetAmxString(amx, params[2], 0, &filename_length);
file = MF_BuildPathname("%s", file);
unlink(file);
FILE *ArrayDB = fopen(file,"w");
if (!ArrayDB)
return 0;
Word_t Index = 0;
PPvoid_t PValue = JudyLFirst(*Array, &Index, PJE0);
element elem = NULL;
char elem_type = 0;
int error;
void ThrowIndexError( cell index, bool disable_check = false );
void ThrowSearchError(char* msg);
public:
Array() { Table = NULL; }
~Array() { Clear(); }
void Remove() { delete this; }
Word_t Clear() { JudyClearList(this); return JudyLFreeArray(&Table, PJE0); }
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
int Delete(cell Key) { return JudyLDel(&Table, Key, PJE0 ); }
void Set(cell Index, Pvoid_t value, bool disable_check)
REAL vector_data[3] = { 0.0, 0.0, 0.0 };
while (PValue)
{
PPvoid_t PValue = JudyLIns(&Table, Index,PJE0);
*PValue = value;
}
elem = *reinterpret_cast<element*>(*PValue);
elem_type = elem.get_type();
Pvoid_t Get(cell Index, bool disable_check = false)
{
PPvoid_t PValue = JudyLGet(Table, Index, PJE0);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
if (elem_type < elem_type_int || elem_type > elem_type_vector)
continue;
return *PValue;
fwrite(&Index, sizeof(int), 1, ArrayDB);
fwrite(&elem_type, sizeof(char), 1, ArrayDB);
if (elem_type == elem_type_int)
{
int int_buffer = elem.get_int(error);
fwrite(&int_buffer, sizeof(int), 1, ArrayDB);
}
else if (elem_type == elem_type_real)
{
REAL flo_buffer = elem.get_flo(error);
fwrite(&flo_buffer, sizeof(REAL), 1, ArrayDB);
}
else if (elem_type == elem_type_char)
{
const char* str_buffer = elem.get_str(error);
short buf_len = strlen(str_buffer);
fwrite(&buf_len, sizeof(short), 1, ArrayDB);
fwrite(str_buffer, sizeof(char), buf_len, ArrayDB);
}
else if (elem_type == elem_type_vector)
{
const Vector* vec_buffer = elem.get_vec(error);
fwrite(vec_buffer, sizeof(Vector), 1, ArrayDB);
}
PValue = JudyLNext(*Array, &Index, PJE0);
}
fclose(ArrayDB);
return 1;
}
template<class Type>
void Set(cell Index, Type value)
static cell AMX_NATIVE_CALL Array_Load(AMX *amx, cell *params)
{
//params[1]: file
int filename_length;
char *file = MF_GetAmxString(amx, params[1], 0, &filename_length);
file = MF_BuildPathname("%s", file);
FILE *ArrayDB = fopen(file, "a+");
if (!ArrayDB)
return 0;
//params[2]: array to create (optional index supplied)
int ArrayIndex = NewArray(params[2], params[3]);
ClearArray(ArrayIndex); //make sure the array is empty.
PPvoid_t Array = Find_Array(ArrayIndex);
while(!feof(ArrayDB))
{
PPvoid_t PValue = JudyLIns(&Table, Index,PJE0);
*PValue = reinterpret_cast<void*>(value);
int index = 0; char type = 0;
element *elem_value = NULL;
fread(&index, sizeof(int), 1, ArrayDB);
if (feof(ArrayDB) || ferror(ArrayDB))
break;
fread(&type, sizeof(char), 1, ArrayDB);
if (type < elem_type_int || type > elem_type_vector)
{
MF_LogError(amx, AMX_ERR_FORMAT, "Error loading array database \"%s\" into array %d. Bad file.", file, ArrayIndex);
return ArrayIndex;
}
else if (type == elem_type_int)
{
int value = 0; fread(&value, sizeof(int), 1, ArrayDB);
elem_value = new element(value);
}
else if (type == elem_type_real)
{
REAL value = 0; fread(&value, sizeof(REAL), 1, ArrayDB);
elem_value = new element(value);
}
else if (type == elem_type_char)
{
short length; fread(&length, sizeof(short), 1, ArrayDB);
char* value = new char[length+1]; fgets(value, length+1, ArrayDB);
elem_value = new element(value);
delete(value);
}
else if (type == elem_type_vector)
{
Vector *value = new Vector(); fread(value, sizeof(Vector), 1, ArrayDB);
elem_value = new element(value);
}
Array_Set(Array,index,elem_value);
}
fclose(ArrayDB);
return ArrayIndex;
}
static cell AMX_NATIVE_CALL Array_Save_ASCII(AMX *amx, cell *params)
{
//params[1]: file
int filename_length;
char *inputfile = MF_GetAmxString(amx, params[1], 0, &filename_length);
inputfile = MF_BuildPathname("%s", inputfile);
FILE *ArrayDB = fopen(inputfile, "a+");
if (!ArrayDB)
return 0;
char *outputfile = MF_GetAmxString(amx, params[2], 0, &filename_length);
outputfile = MF_BuildPathname("%s", outputfile);
FILE *ReadableDB = fopen(outputfile, "w");
char *buffer = "\0";
char *buffer_two = "\0";
while(!feof(ArrayDB))
{
Word_t index = 0; char type = 0;
fread(&index, sizeof(int), 1, ArrayDB);
if (feof(ArrayDB) || ferror(ArrayDB))
break;
fread(&type, sizeof(char), 1, ArrayDB);
sprintf(buffer, "Index % 11d\tType %7s,", index, elem_types[type]);
if (type < elem_type_int || type > elem_type_vector)
{
MF_LogError(amx, AMX_ERR_FORMAT, "Error loading array database \"%s\" into readable format. Bad file.", inputfile);
return 0;
}
else if (type == elem_type_int)
{
int value = 0; fread(&value, sizeof(int), 1, ArrayDB);
sprintf(buffer, "%s\t\t\tValue: %d\n", buffer, value);
}
else if (type == elem_type_real)
{
REAL value = 0; fread(&value, sizeof(REAL), 1, ArrayDB);
sprintf(buffer, "%s\t\t\tValue: %f\n", buffer, value);
}
else if (type == elem_type_char)
{
short length; fread(&length, sizeof(short), 1, ArrayDB);
char* value = new char[length+1]; fgets(value, length+1, ArrayDB);
sprintf(buffer, "%s Length: %d\tValue: \"%s\"\n", buffer, length, value);
delete value;
}
else if (type == elem_type_vector)
{
Vector *value = new Vector(); fread(value, sizeof(Vector), 1, ArrayDB);
sprintf(buffer, "%s\t\t\tValue: {%f,%f,%f}\n", buffer, (*value).x, (*value).y, (*value).z);
delete value;
}
fwrite(buffer, sizeof(char), strlen(buffer), ReadableDB);
}
fclose(ArrayDB);
fclose(ReadableDB);
return 1;
}
static cell AMX_NATIVE_CALL Array_SetVector(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1], params[4], amx);
if (Array == NULL) return 0;
cell *input_vec = MF_GetAmxAddr(amx, params[3]);
Vector *value = new Vector(
amx_ctof(input_vec[0]),
amx_ctof(input_vec[1]),
amx_ctof(input_vec[2])
);
int Index = params[2];
PPvoid_t PValue = Array_Get(amx, Array, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(value);
else
{
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_vec(value);
}
Array_Set(Array,Index,elem_value);
return 1;
}
static cell AMX_NATIVE_CALL Array_GetVector(AMX *amx, cell *params)
{
PPvoid_t Array = Find_Array(params[1], params[4], amx);
if (Array == NULL) return 0;
int Index = params[2];
PPvoid_t PValue = Array_Get(amx, Array, Index, params[4]);
cell *vAmx = MF_GetAmxAddr(amx, params[3]);
if( PValue == NULL ) {
vAmx[0] = amx_ftoc(0);
vAmx[1] = amx_ftoc(0);
vAmx[2] = amx_ftoc(0);
return 0;
}
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
const Vector retr_vec = *elem_value.get_vec(error);
if (error)
elem_value.issue_type_error(amx, params[1], Index);
vAmx[0] = amx_ftoc(retr_vec.x);
vAmx[1] = amx_ftoc(retr_vec.y);
vAmx[2] = amx_ftoc(retr_vec.z);
return 1;
}
static cell AMX_NATIVE_CALL Array_SetString(AMX *amx,cell *params)
{
//params[1]: array
PPvoid_t Array = Find_Array(params[1], params[4], amx);
if (Array == NULL) return 0;
//params[2]: index
int Index = params[2];
//params[3]: value
int iLen = 0;
char *value = MF_GetAmxString(amx,params[3],1,&iLen);
//element that is stored at index
PPvoid_t PValue = Array_Get(amx, Array, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(value);
else
{
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_str(value);
}
Array_Set(Array,Index,elem_value);
return 1;
}
static cell AMX_NATIVE_CALL Array_GetString(AMX *amx,cell *params)
{
//params[1]: array
PPvoid_t Array = Find_Array(params[1], params[5], amx);
if (Array == NULL) return 0;
//params[2]: index
int Index = params[2];
template <class Type>
Type Get(cell Index, Type example, bool disable_check = false)
Pvoid_t * PValue = Array_Get(amx, Array, Index, params[5]);
//params[3] and params[4] are the return string and length respectively.
if( PValue == NULL ) return MF_SetAmxString( amx , params[3] , "dne", params[4] );
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
const char* str_out = elem_value.get_str(error);
if (error)
elem_value.issue_type_error(amx, params[1], Index);
return MF_SetAmxString( amx , params[3] , str_out, params[4] );
}
static cell AMX_NATIVE_CALL Array_SetFloat(AMX *amx,cell *params)
{
//params[1]: array
PPvoid_t Array = Find_Array(params[1], params[4], amx);
if (Array == NULL) return 0;
//params[2]: index
int Index = params[2];
//params[3]: value
PPvoid_t PValue = Array_Get(amx, Array, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(amx_ctof(params[3]));
else
{
PPvoid_t PValue = JudyLGet(Table, Index, PJE0);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
return (Type)(*PValue);
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_flo(amx_ctof(params[3]));
}
Array_Set(Array,Index,elem_value);
cell First(cell Start = 0);
cell Next(cell Start = 0);
cell Prev(cell Start = -1);
cell Last(cell Start = -1);
return 1;
}
cell FirstEmpty(cell Start = 0);
cell NextEmpty(cell Start = 0);
cell PrevEmpty(cell Start = -1);
cell LastEmpty(cell Start = -1);
static cell AMX_NATIVE_CALL Array_GetFloat(AMX *amx,cell *params)
{
//params[1]: array
PPvoid_t Array = Find_Array(params[1], params[3], amx);
if (Array == NULL) return 0;
cell ByCount(cell n, cell Start = 0);
cell Count(cell Start = 0, cell Stop = -1) { return JudyLCount(Table, Start, Stop, PJE0); }
//params[2]: index
int Index = params[2];
bool IsFilled(cell Index) { return ( (Get(Index, true ) != NULL) ? true : false); }
bool IsEmpty(cell Index) { return ( (Get(Index, true ) == NULL) ? true : false); }
};
PPvoid_t PValue = Array_Get(amx, Array, Index, params[3]);
#endif
if( PValue == NULL ) return amx_ftoc(0.0);
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
cell retr_float = amx_ftoc(elem_value.get_flo(error));
if (error)
elem_value.issue_type_error(amx, params[1], Index);
return retr_float;
}
static cell AMX_NATIVE_CALL Array_SetInt(AMX *amx,cell *params)
{
//params[1]: array
PPvoid_t Array = Find_Array(params[1], params[3], amx);
if (Array == NULL) return 0;
//params[2]: index
int Index = params[2];
PPvoid_t PValue = Array_Get(amx, Array, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(params[3]);
else
{
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_int(params[3]);
}
Array_Set(Array,Index,elem_value);
return 1;
}
static cell AMX_NATIVE_CALL Array_GetInt(AMX *amx,cell *params)
{
//params[1]: array
PPvoid_t Array = Find_Array(params[1], params[3], amx);
if (Array == NULL) return 0;
//params[2]: index
int Index = params[2];
Pvoid_t * PValue = Array_Get(amx, Array, Index, params[3]);
if( PValue == NULL ) return 0;
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
cell retr_int = elem_value.get_int(error);
if (error)
elem_value.issue_type_error(amx, params[1], Index);
return retr_int;
}
static cell AMX_NATIVE_CALL array_size(AMX *amx,cell *params)
{
Pvoid_t * Array = Find_Array(params[1],params[4],amx);
if (Array == NULL) return 0;
return JudyLCount( *Array, params[2], params[3],PJE0);
}
static cell AMX_NATIVE_CALL array_count(AMX *amx,cell *params)
{
return JudyLCount( MasterArray, params[1], params[2],PJE0);
}
static cell AMX_NATIVE_CALL array_memory(AMX *amx,cell *params)
{
Pvoid_t * Array = Find_Array(params[1],params[2],amx);
if (Array == NULL) return 0;
return JudyLMemUsed(*Array);
}
static cell AMX_NATIVE_CALL delete_cell(AMX *amx,cell *params)
{
Pvoid_t * Array = Find_Array(params[1]);
if (Array == NULL) return 0;
DeleteCell( Array, params[2] );
return 1;
}
static cell AMX_NATIVE_CALL array_next(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1],params[4],amx);
if (Array == NULL) return 0;
Word_t Index = Word_t(params[2]);
cell *success = MF_GetAmxAddr(amx, params[3]);
PPvoid_t pointer;
pointer = JudyLNext(*Array, &Index, PJE0);
*success = (pointer == NULL) ? 0 : 1;
return cell(Index);
}
static cell AMX_NATIVE_CALL array_prev(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1],params[4],amx);
if (Array == NULL) return 0;
Word_t Index = Word_t(params[2]);
cell *success = MF_GetAmxAddr(amx, params[3]);
PPvoid_t pointer;
pointer = JudyLPrev(*Array, &Index, PJE0);
*success = (pointer == NULL) ? 0 : 1;
return cell(Index);
}
static cell AMX_NATIVE_CALL array_first(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1],params[4],amx);
if (Array == NULL) return 0;
Word_t Index = Word_t(params[2]);
cell *success = MF_GetAmxAddr(amx, params[3]);
PPvoid_t pointer;
pointer = JudyLFirst(*Array, &Index, PJE0);
*success = (pointer == NULL) ? 0 : 1;
return cell(Index);
}
static cell AMX_NATIVE_CALL array_last(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1],params[4],amx);
if (Array == NULL) return 0;
Word_t Index = Word_t(params[2]);
cell *success = MF_GetAmxAddr(amx, params[3]);
PPvoid_t pointer;
pointer = JudyLLast(*Array, &Index, PJE0);
*success = (pointer == NULL) ? 0 : 1;
return cell(Index);
}
static cell AMX_NATIVE_CALL array_nextempty(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1],params[4],amx);
if (Array == NULL) return 0;
Word_t Index = (Word_t)params[2];
cell *success = MF_GetAmxAddr(amx, params[3]);
*success = JudyLNextEmpty(*Array, &Index, PJE0);
return (cell)Index;
}
static cell AMX_NATIVE_CALL array_prevempty(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1],params[4],amx);
if (Array == NULL) return 0;
Word_t Index = (Word_t)params[2];
cell *success = MF_GetAmxAddr(amx, params[3]);
*success = JudyLPrevEmpty(*Array, &Index, PJE0);
return (cell)Index;
}
static cell AMX_NATIVE_CALL array_firstempty(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1],params[4],amx);
if (Array == NULL) return 0;
Word_t Index = (Word_t)params[2];
cell *success = MF_GetAmxAddr(amx, params[3]);
*success = JudyLFirstEmpty(*Array, &Index, PJE0);
return (cell)Index;
}
static cell AMX_NATIVE_CALL array_lastempty(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1],params[4],amx);
if (Array == NULL) return 0;
Word_t Index = (Word_t)params[2];
cell *success = MF_GetAmxAddr(amx, params[3]);
*success = JudyLLastEmpty(*Array, &Index, PJE0);
return (cell)Index;
}
static cell AMX_NATIVE_CALL array_isempty(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1],params[3],amx);
if (Array == NULL) return 0;
PPvoid_t pointer;
pointer = JudyLGet(*Array, params[2], PJE0);
return (pointer == NULL) ? 1 : 0;
}
static cell AMX_NATIVE_CALL array_isfilled(AMX *amx,cell *params)
{
//params[1]: array
PPvoid_t Array = Find_Array(params[1],params[3],amx);
if (Array == NULL) return 0;
//params[2]: index
PPvoid_t pointer;
pointer = JudyLGet(*Array, params[2], PJE0);
return (pointer != NULL) ? 1 : 0;
}
static cell AMX_NATIVE_CALL Array_ByCount(AMX *amx,cell *params)
{
PPvoid_t Array = Find_Array(params[1],params[4],amx);
if (Array == NULL) return 0;
Word_t Index = Word_t(params[3]);
cell *success = MF_GetAmxAddr(amx, params[4]);
PPvoid_t pointer;
pointer = JudyLByCount(*Array, params[2], &Index, PJE0);
*success = (pointer == NULL) ? 0 : 1;
return cell(Index);
}
AMX_NATIVE_INFO array_exports[] = {
{ "array_set_string", Array_SetString },
{ "array_get_string", Array_GetString },
{ "array_set_int", Array_SetInt },
{ "array_get_int", Array_GetInt },
{ "array_set_float", Array_SetFloat },
{ "array_get_float", Array_GetFloat },
{ "array_set_vector", Array_SetVector },
{ "array_get_vector", Array_GetVector },
{ "array_isempty", array_isempty },
{ "array_isfilled", array_isfilled },
{ "array_remove", delete_cell },
{ "array_create", new_array },
{ "array_delete", delete_array },
{ "array_clear", clear_array },
{ "array_size", array_size },
{ "array_count", array_count },
{ "array_memory", array_memory },
{ "array_nextempty", array_nextempty },
{ "array_prevempty", array_prevempty },
{ "array_firstempty", array_firstempty },
{ "array_lastempty", array_lastempty },
{ "array_next", array_next },
{ "array_prev", array_prev },
{ "array_first", array_first },
{ "array_last", array_last },
{ "array_save", Array_Save },
{ "array_load", Array_Load },
{ "array_get_nth", Array_ByCount },
{ "array_save_ascii", Array_Save_ASCII },
{ NULL, NULL }
};

View File

@ -1,36 +0,0 @@
#ifndef _BASE_ARRAYCLASS_H
#define _BASE_ARRAYCLASS_H
#include "JudyIncludes.h"
class CBaseList
{
public:
virtual Word_t Clear() =0;
virtual Word_t MemoryUsed() =0;
virtual int Delete(cell Key) =0;
virtual void Remove() =0;
virtual void Set(cell Index, Pvoid_t value, bool disable_check = false) =0;
virtual Pvoid_t Get(cell Index, bool disable_check = false) =0;
virtual cell First(cell Start = 0) =0;
virtual cell Next(cell Start = 0) =0;
virtual cell Prev(cell Start = -1) =0;
virtual cell Last(cell Start = -1) =0;
virtual cell FirstEmpty(cell Start = 0) =0;
virtual cell NextEmpty(cell Start = 0) =0;
virtual cell PrevEmpty(cell Start = -1) =0;
virtual cell LastEmpty(cell Start = -1) =0;
virtual cell ByCount(cell n, cell Start = 0) =0;
virtual cell Count(cell Start = 0, cell Stop = -1) =0;
virtual bool IsFilled(cell Index) =0;
virtual bool IsEmpty(cell Index) =0;
};
#endif

View File

@ -1,29 +0,0 @@
#ifndef _BASE_MAPCLASS_H
#define _BASE_MAPCLASS_H
#include "JudyIncludes.h"
class CBaseMap
{
public:
virtual Word_t Clear() =0;
virtual Word_t MemoryUsed() =0;
virtual int Delete(char* Key) =0;
virtual void Remove() =0;
virtual void Set(char* Index, Pvoid_t value, bool disable_check = false) =0;
virtual Pvoid_t Get(char* Index, bool disable_check = false) =0;
virtual char* First(char* Start = "") =0;
virtual char* Next(char* Start) =0;
virtual char* Prev(char* Start) =0;
virtual char* Last(char* Start) =0;
virtual bool IsFilled(char* Index) =0;
virtual bool IsEmpty(char* Index) =0;
};
#endif

View File

@ -1,76 +0,0 @@
#include "CBinTrie.h"
void BinTrie::ThrowSearchError(char* type)
{
char value[50];
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
throw JudyEx (value,false);
}
cell BinTrie::First( cell Start)
{
cell success = Judy1First(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:First");
return Start;
}
cell BinTrie::FirstEmpty( cell Start)
{
cell success = Judy1FirstEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:FirstEmpty");
return Start;
}
cell BinTrie::Next( cell Start)
{
cell success = Judy1Next(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Next");
return Start;
}
cell BinTrie::NextEmpty( cell Start)
{
cell success = Judy1NextEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:NextEmpty");
return Start;
}
cell BinTrie::Prev( cell Start)
{
cell success = Judy1Prev(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Prev");
return Start;
}
cell BinTrie::PrevEmpty( cell Start)
{
cell success = Judy1PrevEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:PrevEmpty");
return Start;
}
cell BinTrie::Last( cell Start)
{
cell success = Judy1Last(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Last");
return Start;
}
cell BinTrie::LastEmpty( cell Start)
{
cell success = Judy1LastEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:LastEmpty");
return Start;
}
cell BinTrie::ByCount(cell n, cell Start)
{
cell success = Judy1ByCount(Table, n, reinterpret_cast<unsigned int*>(&Start), PJE0);
if (success == NULL) ThrowSearchError("Type:Nth");
return Start;
}

View File

@ -1,54 +0,0 @@
#ifndef _BINTRIECLASS_H
#define _BINTRIECLASS_H
#include "JudyIncludes.h"
#include "JudyExtra.h"
//#include <Judy1.h>
class BinTrie
{
private:
Pvoid_t Table;
void ThrowSearchError(char* msg);
public:
BinTrie() { Table = NULL; }
~BinTrie() { Clear(); }
void Remove() { delete this; }
Word_t Clear() { JudyClearBinTrie(this); return Judy1FreeArray(&Table, PJE0); }
Word_t MemoryUsed() { return Judy1MemUsed(Table); }
cell Delete(cell Key) { return Judy1Unset(&Table, Key, PJE0 ); }
cell Set(cell Index, bool val)
{
if(val == false) return Delete(Index);
else return Judy1Set(&Table, Index,PJE0);
}
cell Get(cell Index)
{
cell PValue = Judy1Test(Table, Index, PJE0);
return PValue;
}
cell First(cell Start = 0);
cell Next(cell Start = 0);
cell Prev(cell Start = -1);
cell Last(cell Start = -1);
cell FirstEmpty(cell Start = 0);
cell NextEmpty(cell Start = 0);
cell PrevEmpty(cell Start = -1);
cell LastEmpty(cell Start = -1);
cell ByCount(cell n, cell Start);
cell Count(cell Start = 0, cell Stop = -1) { return Judy1Count(Table, Start, Stop, PJE0); }
bool IsFilled(cell Index) { return ( (Get(Index )) ? true : false); }
bool IsEmpty(cell Index) { return ( (Get(Index )) ? true : false); }
};
#endif

View File

@ -1,82 +1,375 @@
#ifndef _HASHCLASS_INCLUDED
#define _HASHCLASS_INCLUDED
#if !defined _JUDYHS_ENABLED_
#define _JUDYHS_ENABLED_
#include "JudyIncludes.h"
#include "CBaseMap.h"
//#include <JudyHS.h>
Pvoid_t MasterHashtable = (Pvoid_t) NULL; //Create the new array
class Hashtable: public CBaseMap
//Create an array that stores whether or not indices are used.
Pvoid_t MasterHashtable_Binary = (Pvoid_t) NULL;
void Delete_MasterHashtable(void);
Word_t New_Hashtable(Word_t Index, Word_t reserve = 0);
Pvoid_t* Find_Hashtable(Word_t Index, Word_t disable_check = 1, AMX *amx = 0);
void Delete_Hashtable(Word_t Index);
void Clear_Hashtable(Word_t Index);
template <class Type>
void Hashtable_Set(PPvoid_t Hashtable, char *Index, Word_t Length, Type value);
PPvoid_t Hashtable_Get(AMX* amx, Pvoid_t Hashtable, char *Index, int ignore_error = 0);
void Delete_MasterHashtable(void)
{
private:
Pvoid_t Table;
public:
Hashtable() { Table = NULL; }
~Hashtable() { Clear(); }
void Remove() { delete this; }
Word_t Clear() { return JudyHSFreeArray(&Table, PJE0); }
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
int Delete(char* Key) { return JudyHSDel(&Table, Key, strlen(Key), PJE0 ); }
void Set(char* Index, Pvoid_t value, bool disable_check)
Word_t
Index = 0,
success;
J1F(success, MasterHashtable_Binary, Index);
while( success )
{
int Len = strlen(Index) + 1;
PPvoid_t PValue = JudyHSIns(&Table, Index, Len, PJE0);
*PValue = value;
Delete_Hashtable(Index);
J1F(success, MasterHashtable_Binary, Index);
}
}
Pvoid_t Get(char* Index, bool disable_check = false)
Word_t New_Hashtable(Word_t Index, Word_t reserve)
{
Word_t success; //Dummy for macros.
J1T(success, MasterHashtable_Binary, Index);
if (success && reserve)
return Index; //If the bit is set but it's 'reserved', return the index.
//Only do this if the bit is not set or not reserved.
J1FE(success, MasterHashtable_Binary, Index);
J1S(success, MasterHashtable_Binary, Index);
PPvoid_t Hashtable = JudyLIns(&MasterHashtable, Index, PJE0);
*Hashtable = (PWord_t) NULL;
return Index;
}
PPvoid_t Find_Hashtable(Word_t Index, Word_t disable_check, AMX* amx)
{
Word_t success;
J1T(success, MasterHashtable_Binary, Index);
if (success || disable_check)
{ //Bit is valid
if(!success)
New_Hashtable(Index);
return JudyLGet(MasterHashtable, Index, PJE0);
}
MF_LogError(amx,AMX_ERR_NATIVE,"Hashtable %d is invalid.", Index);
return NULL;
}
void Delete_Hashtable(Word_t Index)
{
int success;
J1T(success, MasterHashtable_Binary, Index);
if (success)
{ //If the bit was set, clear, unset and delist hashtable.
Clear_Hashtable(Index);
J1U(success, MasterHashtable_Binary, Index);
JudyLDel(&MasterHashtable, Index, PJE0);
}
}
void Clear_Hashtable(Word_t Index)
{
int success;
J1T(success, MasterHashtable_Binary, Index);
if (success) //dont bother with unset hashtables.
{
PPvoid_t PValue = JudyHSGet(Table, Index, strlen(Index)+1);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
return *PValue;
PPvoid_t Hashtable = Find_Hashtable(Index);
JHSFA(success, *Hashtable);
}
}
template <class Type>
void Set(char* Index, Type value)
template <class Type> //This will support input char*, Vector*, int, and cell_real*.
void Hashtable_Set(PPvoid_t Hashtable, char* Index, Type value)
{
int Len = strlen(Index)+1;
PPvoid_t PValue = JudyHSIns(Hashtable, Index, Len, PJE0);
*PValue = reinterpret_cast<void*>(value);
}
PPvoid_t Hashtable_Get(AMX* amx,PPvoid_t Hashtable, char *Index, int ignore_error = 0)
{
PPvoid_t PValue = JudyHSGet(*Hashtable, Index, strlen(Index)+1);
if (PValue == NULL && !ignore_error)
MF_LogError(amx, AMX_ERR_NATIVE, "Hashtable get on index \"%s\" is invalid", Index);
return PValue;
}
static cell AMX_NATIVE_CALL Hashtable_Create(AMX *amx, cell *params)
{
return New_Hashtable(params[1],params[2]);
}
static cell AMX_NATIVE_CALL Hashtable_Delete(AMX *amx, cell *params)
{
Delete_Hashtable( params[1] );
return 1;
}
static cell AMX_NATIVE_CALL Hashtable_Clear(AMX *amx, cell *params)
{
Clear_Hashtable( params[1] );
return 1;
}
static cell AMX_NATIVE_CALL Hashtable_SetVector(AMX *amx,cell *params)
{
PPvoid_t Hashtable = Find_Hashtable(params[1], params[4], amx);
if (Hashtable == NULL) return 0;
cell *input_vec = MF_GetAmxAddr(amx, params[3]);
Vector *value = new Vector(
amx_ctof(input_vec[0]),
amx_ctof(input_vec[1]),
amx_ctof(input_vec[2])
);
int strlen;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlen);
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(value);
else
{
int Len = strlen(Index) + 1;
PPvoid_t PValue = JudyHSIns(&Table, Index, Len, PJE0);
*PValue = reinterpret_cast<void*>(value);
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_vec(value);
}
Hashtable_Set(Hashtable,Index,elem_value);
return 1;
}
static cell AMX_NATIVE_CALL Hashtable_GetVector(AMX *amx, cell *params)
{
PPvoid_t Hashtable = Find_Hashtable(params[1], params[4], amx);
if (Hashtable == NULL) return 0;
int strlen;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlen);
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, params[4]);
cell *vAmx = MF_GetAmxAddr(amx, params[3]);
if( PValue == NULL ) {
vAmx[0] = amx_ftoc(0);
vAmx[1] = amx_ftoc(0);
vAmx[2] = amx_ftoc(0);
return 0;
}
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
const Vector retr_vec = *elem_value.get_vec(error);
if (error)
elem_value.issue_type_error(amx, params[1], Index);
vAmx[0] = amx_ftoc(retr_vec.x);
vAmx[1] = amx_ftoc(retr_vec.y);
vAmx[2] = amx_ftoc(retr_vec.z);
return 1;
}
static cell AMX_NATIVE_CALL Hashtable_SetString(AMX *amx,cell *params)
{
//params[1]: hashtable
PPvoid_t Hashtable = Find_Hashtable(params[1], params[4], amx);
if (Hashtable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
//params[3]: value
int iLen = 0;
char *value = MF_GetAmxString(amx,params[3],1,&iLen);
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(value);
else
{
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_str(value);
}
Hashtable_Set(Hashtable,Index,elem_value);
return 1;
}
static cell AMX_NATIVE_CALL Hashtable_GetString(AMX *amx,cell *params)
{
//params[1]: hashtable
PPvoid_t Hashtable = Find_Hashtable(params[1], params[5], amx);
if (Hashtable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
template <class Type>
Type Get(char* Index, Type example, bool disable_check = false)
{
PPvoid_t PValue = JudyHSGet(Table, Index, strlen(Index)+1);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
Pvoid_t * PValue = Hashtable_Get(amx, Hashtable, Index, params[5]);
return (Type)(*PValue);
}
char* First( char* Start = "") { ThrowSearchError(); return (char*)NULL; }
char* Next( char* Start = "") { ThrowSearchError(); return (char*)NULL; }
char* Prev( char* Start) { ThrowSearchError(); return (char*)NULL; }
char* Last( char* Start) { ThrowSearchError(); return (char*)NULL; }
//params[3] and params[4] are the return string and length respectively.
bool IsFilled(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false);}
bool IsEmpty(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false);}
protected:
void ThrowIndexError( char* index, bool disable_check = false )
if( PValue == NULL )
return MF_SetAmxString(amx, params[3] , "dne", params[4] );
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
if (error)
elem_value.issue_type_error(amx, params[1], Index);
const char* str_out = elem_value.get_str(error);
return MF_SetAmxString( amx , params[3] , str_out, params[4] );
}
static cell AMX_NATIVE_CALL Hashtable_SetFloat(AMX *amx,cell *params)
{
//params[1]: hashtable
PPvoid_t Hashtable = Find_Hashtable(params[1], params[4], amx);
if (Hashtable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
//params[3]: value
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(amx_ctof(params[3]));
else
{
if(disable_check == true) return;
char value[100];
sprintf(value,"Function attempted to read non existant index %s", index );
throw JudyEx(value, true);
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_flo(amx_ctof(params[3]));
}
void ThrowSearchError( void )
{
char value[50];
sprintf(value,"Function attempted to search HashTable!: Invalid action!");
Hashtable_Set(Hashtable,Index,elem_value);
throw JudyEx(value,true);
return 1;
}
static cell AMX_NATIVE_CALL Hashtable_GetFloat(AMX *amx,cell *params)
{
//params[1]: hashtable
PPvoid_t Hashtable = Find_Hashtable(params[1], params[3], amx);
if (Hashtable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, params[3]);
if( PValue == NULL ) return amx_ftoc(0.0);
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
cell retr_float = amx_ftoc(elem_value.get_flo(error));
if (error)
elem_value.issue_type_error(amx, params[1], Index);
return retr_float;
}
static cell AMX_NATIVE_CALL Hashtable_SetInt(AMX *amx,cell *params)
{
//params[1]: hashtable
PPvoid_t Hashtable = Find_Hashtable(params[1], params[4], amx);
if (Hashtable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
PPvoid_t PValue = Hashtable_Get(amx, Hashtable, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(params[3]);
else
{
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_int(params[3]);
}
Hashtable_Set(Hashtable,Index,elem_value);
return 1;
}
static cell AMX_NATIVE_CALL Hashtable_GetInt(AMX *amx,cell *params)
{
//params[1]: hashtable
PPvoid_t Hashtable = Find_Hashtable(params[1], params[3], amx);
if (Hashtable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
Pvoid_t * PValue = Hashtable_Get(amx, Hashtable, Index, params[3]);
if( PValue == NULL ) return 0;
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
cell retr_int = elem_value.get_int(error);
if (error)
elem_value.issue_type_error(amx, params[1], Index);
return retr_int;
}
static cell AMX_NATIVE_CALL Hashtable_Memory(AMX *amx,cell *params)
{
Pvoid_t * Array = Find_Hashtable(params[1],params[2],amx);
if (Array == NULL) return 0;
return JudyLMemUsed(*Array);
}
static cell AMX_NATIVE_CALL Hashtable_Remove(AMX *amx,cell *params)
{
//params[1]: hashtable
PPvoid_t Hashtable = Find_Hashtable(params[1], 0, amx);
if (Hashtable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
JudyHSDel(Hashtable, Index, strlength+1, PJE0 );
return 1;
}
AMX_NATIVE_INFO hashtable_exports[] = {
{ "hashtable_set_str", Hashtable_SetString },
{ "hashtable_get_str", Hashtable_GetString },
{ "hashtable_set_vec", Hashtable_SetVector },
{ "hashtable_get_vec", Hashtable_GetVector },
{ "hashtable_set_int", Hashtable_SetInt },
{ "hashtable_get_int", Hashtable_GetInt },
{ "hashtable_set_float", Hashtable_SetFloat },
{ "hashtable_get_float", Hashtable_GetFloat },
{ "hashtable_memory", Hashtable_Memory },
{ "hashtable_remove", Hashtable_Remove },
{ "hashtable_create", Hashtable_Create },
{ "hashtable_delete", Hashtable_Delete },
{ "hashtable_clear", Hashtable_Clear },
{ NULL, NULL }
};
#endif

View File

@ -1,66 +0,0 @@
#include "CKeytable.h"
void Keytable::ThrowIndexError( char* index, bool disable_check = false )
{
if(disable_check == true) return;
char error[50];
sprintf(error,"Index %s is not set.",index);
throw JudyEx(error,true);
}
void Keytable::ThrowSearchError(char* type)
{
char value[50];
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
throw JudyEx(value,false);
}
char* Keytable::First( char* Start)
{
PPvoid_t index = JudySLFirst(Table, Start, PJE0);
if (index == NULL)
{
sprintf(Start,"dne");
ThrowSearchError("Type:First");
}
return Start;
}
char* Keytable::Next( char* Start)
{
PPvoid_t index = JudySLNext(Table, Start, PJE0);
if (index == NULL)
{
sprintf(Start,"dne");
ThrowSearchError("Type:Next");
}
return Start;
}
char* Keytable::Prev( char* Start)
{
PPvoid_t index = JudySLPrev(Table, Start, PJE0);
if (index == NULL)
{
sprintf(Start,"dne");
ThrowSearchError("Type:Prev");
}
return Start;
}
char* Keytable::Last( char* Start)
{
PPvoid_t index = JudySLLast(Table, Start, PJE0);
if (index == NULL)
{
sprintf(Start,"dne");
ThrowSearchError("Type:Last");
}
return Start;
}

View File

@ -1,66 +1,703 @@
#ifndef _KEYCLASS_INCLUDED
#define _KEYCLASS_INCLUDED
#if !defined _JUDYSL_ENABLED_
#define _JUDYSL_ENABLED_
#include "JudyIncludes.h"
#include "CBaseMap.h"
#include "JudyExtra.h"
//#include <JudySL.h>
#define MAXLINELEN 1024
class Keytable: public CBaseMap
Pvoid_t MasterKeytable = (Pvoid_t) NULL; //Create the control array
//Create an array that stores whether or not indices are used.
Pvoid_t MasterKeytable_Binary = (Pvoid_t) NULL;
void Delete_MasterKeytable(void);
Word_t New_Keytable(Word_t Index, Word_t reserve = 0);
PPvoid_t Find_Keytable(Word_t Index, Word_t disable_check = 1, AMX *amx = 0);
void Delete_Keytable(Word_t Index);
void Clear_Keytable(Word_t Index);
template <class Type>
void Keytable_Set(PPvoid_t Keytable, char *Index, Type value);
PPvoid_t Keytable_Get(AMX* amx, Pvoid_t Keytable, char *Index, int ignore_error = 0);
void Delete_MasterKeytable(void)
{
private:
Pvoid_t Table;
void ThrowSearchError(char* type);
void ThrowIndexError( char* index, bool disable_check);
public:
Keytable() { Table = NULL; }
~Keytable() { Clear(); }
void Remove() { delete this; }
Word_t Clear() { JudyClearMap(this); return JudySLFreeArray(&Table, PJE0); }
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
int Delete(char* Key) { return JudySLDel(&Table, Key, PJE0 ); }
void Set(char* Index, Pvoid_t value, bool disable_check)
Word_t
Index = 0,
success;
J1F(success, MasterKeytable_Binary, Index);
while( success )
{
PPvoid_t PValue = JudySLIns(&Table, Index,PJE0);
*PValue = value;
Delete_Keytable(Index);
J1F(success, MasterKeytable_Binary, Index);
}
}
Pvoid_t Get(char* Index, bool disable_check = false)
Word_t New_Keytable(Word_t Index, Word_t reserve)
{
Word_t success; //Dummy for macros.
J1T(success, MasterKeytable_Binary, Index);
if (success && reserve)
return Index; //If the bit is set but it's 'reserved', return the index.
//Only do this if the bit is not set or not reserved.
J1FE(success, MasterKeytable_Binary, Index);
J1S(success, MasterKeytable_Binary, Index);
PPvoid_t Keytable = JudyLIns(&MasterKeytable, Index, PJE0);
*Keytable = (PWord_t) NULL;
return Index;
}
PPvoid_t Find_Keytable(Word_t Index, Word_t disable_check, AMX* amx)
{
Word_t success;
J1T(success, MasterKeytable_Binary, Index);
if (success || disable_check)
{ //Bit is valid
if(!success)
New_Keytable(Index);
return JudyLGet(MasterKeytable, Index, PJE0);
}
MF_LogError(amx, AMX_ERR_NATIVE, "Keytable \"%s\" is invalid", Index);
return NULL;
}
void Delete_Keytable(Word_t Index)
{
int success;
J1T(success, MasterKeytable_Binary, Index);
if (success)
{ //If the bit was set, clear and delete keytable.
Clear_Keytable(Index);
J1U(success, MasterKeytable_Binary, Index);
JudyLDel(&MasterKeytable, Index, PJE0);
}
}
void Clear_Keytable(Word_t Index)
{
int success;
J1T(success, MasterKeytable_Binary, Index);
if (success) //dont bother with unset Keytables.
{
PPvoid_t PValue = JudySLGet(Table, Index, PJE0);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
return *PValue;
PPvoid_t Keytable = Find_Keytable(Index);
char *Key = "";
PPvoid_t PValue = JudySLFirst(*Keytable, Key, PJE0);
while (PValue != NULL)
{
element elem_value = *reinterpret_cast<element*>(*PValue);
elem_value.delete_element();
PValue = JudySLNext(*Keytable, Key, PJE0);
}
JudySLFreeArray(Keytable, PJE0);
}
}
template <class Type>
void Set(char* Index, Type value)
{
PPvoid_t PValue = JudySLIns(&Table, Index,PJE0);
*PValue = reinterpret_cast<void*>(value);
}
static cell AMX_NATIVE_CALL Keytable_Save(AMX *amx, cell *params)
{
PPvoid_t Keytable = Find_Keytable(params[1], params[3], amx);
if (Keytable == NULL) return 0;
int filename_length;
char *file = MF_GetAmxString(amx, params[2], 0, &filename_length);
file = MF_BuildPathname("%s", file);
unlink(file);
FILE *KeytableDB = fopen(file,"w");
if (!KeytableDB)
return 0;
char* Key = new char[1024]; Key[0] = '\0';
PPvoid_t PValue = JudySLFirst(*Keytable, reinterpret_cast<uint8_t*>(Key), PJE0);
element elem = NULL;
char elem_type = 0;
int error;
template <class Type>
Type Get(char* Index, Type example, bool disable_check = false)
REAL vector_data[3] = { 0.0, 0.0, 0.0 };
while (PValue)
{
PPvoid_t PValue = JudySLGet(Table, Index, PJE0);
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
elem = *reinterpret_cast<element*>(*PValue);
elem_type = elem.get_type();
return (Type)*PValue;
if (elem_type < elem_type_int || elem_type > elem_type_vector)
continue;
short key_len = strlen(Key);
fwrite(&key_len, sizeof(short), 1, KeytableDB);
fwrite(Key, sizeof(char), key_len, KeytableDB);
fwrite(&elem_type, sizeof(char), 1, KeytableDB);
if (elem_type == elem_type_int)
{
int int_buffer = elem.get_int(error);
fwrite(&int_buffer, sizeof(int), 1, KeytableDB);
}
else if (elem_type == elem_type_real)
{
REAL flo_buffer = elem.get_flo(error);
fwrite(&flo_buffer, sizeof(REAL), 1, KeytableDB);
}
else if (elem_type == elem_type_char)
{
const char* str_buffer = elem.get_str(error);
short buf_len = strlen(str_buffer);
fwrite(&buf_len, sizeof(short), 1, KeytableDB);
fwrite(str_buffer, sizeof(char), buf_len, KeytableDB);
}
else if (elem_type == elem_type_vector)
{
const Vector* vec_buffer = elem.get_vec(error);
fwrite(vec_buffer, sizeof(Vector), 1, KeytableDB);
}
PValue = JudySLNext(*Keytable, Key, PJE0);
}
fclose(KeytableDB);
return 1;
}
char* First(char* Start = "");
char* Next(char* Start = "");
char* Prev(char* Start = "");
char* Last(char* Start = "");
static cell AMX_NATIVE_CALL Keytable_Load(AMX *amx, cell *params)
{
//params[1]: file
int filename_length;
char *file = MF_GetAmxString(amx, params[1], 0, &filename_length);
file = MF_BuildPathname("%s", file);
FILE *KeytableDB = fopen(file, "a+");
if (!KeytableDB)
return 0;
bool IsFilled(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false); }
bool IsEmpty(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false); }
//params[2]: keytable to create (optional index supplied)
int KeytableIndex = New_Keytable(params[2], params[3]);
Clear_Keytable(KeytableIndex); //make sure the keytable is empty.
PPvoid_t Keytable = Find_Keytable(KeytableIndex);
while(!feof(KeytableDB))
{
char* index = ""; char type = 0; short index_len;
element *elem_value = NULL;
fread(&index_len, sizeof(short), 1, KeytableDB);
index = new char[index_len+1];
fgets(index, index_len+1, KeytableDB);
if (feof(KeytableDB) || ferror(KeytableDB))
break;
fread(&type, sizeof(char), 1, KeytableDB);
if (type < elem_type_int || type > elem_type_vector)
{
MF_LogError(amx, AMX_ERR_FORMAT, "Error loading keytable database \"%s\" into keytable %d. Bad file.", file, KeytableIndex);
return KeytableIndex;
}
else if (type == elem_type_int)
{
int value = 0; fread(&value, sizeof(int), 1, KeytableDB);
elem_value = new element(value);
}
else if (type == elem_type_real)
{
REAL value = 0; fread(&value, sizeof(REAL), 1, KeytableDB);
elem_value = new element(value);
}
else if (type == elem_type_char)
{
short length; fread(&length, sizeof(short), 1, KeytableDB);
char* value = new char[length+1]; fgets(value, length+1, KeytableDB);
elem_value = new element(value);
delete(value);
}
else if (type == elem_type_vector)
{
Vector *value = new Vector(); fread(value, sizeof(Vector), 1, KeytableDB);
elem_value = new element(value);
}
Keytable_Set(Keytable,index,elem_value);
delete (index);
}
fclose(KeytableDB);
return KeytableIndex;
}
static cell AMX_NATIVE_CALL Keytable_Save_ASCII(AMX *amx, cell *params)
{
//params[1]: file
int filename_length;
char *inputfile = MF_GetAmxString(amx, params[1], 0, &filename_length);
inputfile = MF_BuildPathname("%s", inputfile);
FILE *KeytableDB = fopen(inputfile, "a+");
if (!KeytableDB)
return 0;
char *outputfile = MF_GetAmxString(amx, params[2], 0, &filename_length);
outputfile = MF_BuildPathname("%s", outputfile);
FILE *ReadableDB = fopen(outputfile, "w");
char *buffer = "\0";
while(!feof(KeytableDB))
{
char* key = NULL; char type = 0; short key_len;
fread(&key_len, sizeof(short), 1, KeytableDB);
key = new char[key_len+1];
fgets(key, key_len+1, KeytableDB);
if (feof(KeytableDB) || ferror(KeytableDB))
break;
fread(&type, sizeof(char), 1, KeytableDB);
sprintf(buffer, "Key %-32s Length %3d, Type %7s", key, key_len, elem_types[type]);
if (type < elem_type_int || type > elem_type_vector)
{
MF_LogError(amx, AMX_ERR_FORMAT, "Error loading array database \"%s\" into readable format. Bad file.", inputfile);
return 0;
}
else if (type == elem_type_int)
{
int value = 0; fread(&value, sizeof(int), 1, KeytableDB);
fprintf(ReadableDB, "%s\t\t\t\tValue: %d\n", buffer, value);
}
else if (type == elem_type_real)
{
REAL value = 0; fread(&value, sizeof(REAL), 1, KeytableDB);
fprintf(ReadableDB, "%s\t\t\t\tValue: %f\n", buffer, value);
}
else if (type == elem_type_char)
{
short length; fread(&length, sizeof(short), 1, KeytableDB);
char* value = new char[length+1]; fgets(value, length+1, KeytableDB);
fprintf(ReadableDB, "%s Length %3d\tValue: \"%s\"\n", buffer, length, value);
delete value;
}
else if (type == elem_type_vector)
{
Vector *value = new Vector(); fread(value, sizeof(Vector), 1, KeytableDB);
fprintf(ReadableDB, "%s\t\t\t\tValue: {%f,%f,%f}\n", buffer, (*value).x, (*value).y, (*value).z);
delete value;
}
}
fclose(KeytableDB);
fclose(ReadableDB);
return 1;
}
template <class Type> //This will support input char*, Vector*, int, and cell_real*.
void Keytable_Set(PPvoid_t Keytable, char* Index, Type value)
{
PPvoid_t PValue; // pointer to keytable element value
PValue = JudySLIns(Keytable, Index, PJE0);
*PValue = reinterpret_cast<void*>(value);
}
PPvoid_t Keytable_Get(AMX* amx, PPvoid_t Keytable, char *Index, int ignore_error = 0)
{
PPvoid_t PValue = JudySLGet( *Keytable, Index, PJE0 );
if (PValue == NULL && !ignore_error)
MF_LogError(amx, AMX_ERR_NATIVE, "Keytable get on key \"%s\" is invalid", Index);
return PValue;
}
static cell AMX_NATIVE_CALL Keytable_Create(AMX *amx, cell *params)
{
return New_Keytable(params[1],params[2]);
}
static cell AMX_NATIVE_CALL Keytable_Delete(AMX *amx, cell *params)
{
Delete_Keytable( params[1] );
return 1;
}
static cell AMX_NATIVE_CALL Keytable_Clear(AMX *amx, cell *params)
{
Clear_Keytable( params[1] );
return 1;
}
static cell AMX_NATIVE_CALL Keytable_SetVector(AMX *amx,cell *params)
{
PPvoid_t Keytable = Find_Keytable(params[1], params[4], amx);
if (Keytable == NULL) return 0;
cell *input_vec = MF_GetAmxAddr(amx, params[3]);
Vector *value = new Vector(
amx_ctof(input_vec[0]),
amx_ctof(input_vec[1]),
amx_ctof(input_vec[2])
);
int strlen;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlen);
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(value);
else
{
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_vec(value);
}
Keytable_Set(Keytable,Index,elem_value);
return 1;
}
static cell AMX_NATIVE_CALL Keytable_GetVector(AMX *amx, cell *params)
{
PPvoid_t Keytable = Find_Keytable(params[1], params[4], amx);
if (Keytable == NULL) return 0;
int strlen;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlen);
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, params[4]);
cell *vAmx = MF_GetAmxAddr(amx, params[3]);
if( PValue == NULL ) {
vAmx[0] = amx_ftoc(0);
vAmx[1] = amx_ftoc(0);
vAmx[2] = amx_ftoc(0);
return 0;
}
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
const Vector retr_vec = *elem_value.get_vec(error);
if (error)
elem_value.issue_type_error(amx, params[1], Index);
vAmx[0] = amx_ftoc(retr_vec.x);
vAmx[1] = amx_ftoc(retr_vec.y);
vAmx[2] = amx_ftoc(retr_vec.z);
return 1;
}
static cell AMX_NATIVE_CALL Keytable_SetString(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[4], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
//params[3]: value
int iLen = 0;
char *value = MF_GetAmxString(amx,params[3],1,&iLen);
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(value);
else
{
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_str(value);
}
Keytable_Set(Keytable,Index,elem_value);
return 1;
}
static cell AMX_NATIVE_CALL Keytable_GetString(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[5], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
Pvoid_t * PValue = Keytable_Get(amx, Keytable, Index, params[5]);
//params[3] and params[4] are the return string and length respectively.
if( PValue == NULL )
return MF_SetAmxString(amx, params[3] , "dne", params[4] );
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
if (error)
elem_value.issue_type_error(amx, params[1], Index);
const char* str_out = elem_value.get_str(error);
return MF_SetAmxString( amx , params[3] , str_out, params[4] );
}
static cell AMX_NATIVE_CALL Keytable_SetFloat(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[4], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
//params[3]: value
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(amx_ctof(params[3]));
else
{
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_flo(amx_ctof(params[3]));
}
Keytable_Set(Keytable,Index,elem_value);
return 1;
}
static cell AMX_NATIVE_CALL Keytable_GetFloat(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[3], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, params[3]);
if( PValue == NULL ) return amx_ftoc(0.0);
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
cell retr_float = amx_ftoc(elem_value.get_flo(error));
if (error)
elem_value.issue_type_error(amx, params[1], Index);
return retr_float;
}
static cell AMX_NATIVE_CALL Keytable_SetInt(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[4], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
PPvoid_t PValue = Keytable_Get(amx, Keytable, Index, 1);
element *elem_value = NULL;
if ( PValue == NULL )
elem_value = new element(params[3]);
else
{
elem_value = reinterpret_cast<element*>(*PValue);
(*elem_value).set_int(params[3]);
}
Keytable_Set(Keytable,Index,elem_value);
return 1;
}
static cell AMX_NATIVE_CALL Keytable_GetInt(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[3], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
Pvoid_t * PValue = Keytable_Get(amx, Keytable, Index, params[3]);
if( PValue == NULL ) return 0;
element elem_value = *reinterpret_cast<element*>(*PValue);
int error = 0;
cell retr_int = elem_value.get_int(error);
if (error)
elem_value.issue_type_error(amx, params[1], Index);
return retr_int;
}
static cell AMX_NATIVE_CALL Keytable_Memory(AMX *amx,cell *params)
{
Pvoid_t * Keytable = Find_Keytable(params[1],params[2],amx);
if (Keytable == NULL) return 0;
return JudyLMemUsed(*Keytable);
}
static cell AMX_NATIVE_CALL Keytable_Remove(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], 0, amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
//Have to delete the element
PPvoid_t PValue = JudySLGet(*Keytable, Index, PJE0);
if (PValue == NULL) return 1;
element elem_value = *reinterpret_cast<element*>(*PValue);
elem_value.delete_element();
JudySLDel(Keytable, Index, PJE0 );
return 1;
}
static cell AMX_NATIVE_CALL Keytable_Next(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[5], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
//params[3], params[4]: return key and length
PPvoid_t pointer;
pointer = JudySLNext(*Keytable, Index, PJE0);
if (pointer == NULL) {
MF_SetAmxString(amx, params[3], "dne", 0);
return 0;
}
MF_SetAmxString(amx, params[3], Index, params[4]);
return 1;
}
static cell AMX_NATIVE_CALL Keytable_Prev(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[5], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
//params[3], params[4]: return key and length
PPvoid_t pointer;
pointer = JudySLPrev(*Keytable, Index, PJE0);
if (pointer == NULL) {
MF_SetAmxString(amx, params[3], "dne", 0);
return 0;
}
MF_SetAmxString(amx, params[3], Index, params[4]);
return 1;
}
static cell AMX_NATIVE_CALL Keytable_First(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[5], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
//params[3], params[4]: return key and length
PPvoid_t pointer;
pointer = JudySLFirst(*Keytable, Index, PJE0);
if (pointer == NULL) {
MF_SetAmxString(amx, params[3], "dne", 0);
return 0;
}
MF_SetAmxString(amx, params[3], Index, params[4]);
return 1;
}
static cell AMX_NATIVE_CALL Keytable_Last(AMX *amx,cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[5], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
//params[3], params[4]: return key and length
PPvoid_t pointer;
pointer = JudySLLast(*Keytable, Index, PJE0);
if (pointer == NULL) {
MF_SetAmxString(amx, params[3], "dne", 0);
return 0;
}
MF_SetAmxString(amx, params[3], Index, params[4]);
return 1;
}
static cell AMX_NATIVE_CALL Key_IsEmpty(AMX *amx, cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[3], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
PPvoid_t pointer = JudySLGet(*Keytable, Index, PJE0);
return (pointer == NULL) ? 1 : 0;
}
static cell AMX_NATIVE_CALL Key_IsFilled(AMX *amx, cell *params)
{
//params[1]: keytable
PPvoid_t Keytable = Find_Keytable(params[1], params[3], amx);
if (Keytable == NULL) return 0;
//params[2]: key
int strlength;
char *Index = MF_GetAmxString(amx, params[2], 0, &strlength);
PPvoid_t pointer = JudySLGet(*Keytable, Index, PJE0);
return (pointer != NULL) ? 1 : 0;
}
AMX_NATIVE_INFO keytable_exports[] = {
{ "keytable_set_string", Keytable_SetString },
{ "keytable_get_string", Keytable_GetString },
{ "keytable_set_vector", Keytable_SetVector },
{ "keytable_get_vector", Keytable_GetVector },
{ "keytable_set_int", Keytable_SetInt },
{ "keytable_get_int", Keytable_GetInt },
{ "keytable_set_float", Keytable_SetFloat },
{ "keytable_get_float", Keytable_GetFloat },
{ "keytable_isempty", Key_IsEmpty },
{ "keytable_isfilled", Key_IsFilled },
{ "keytable_memory", Keytable_Memory },
{ "keytable_remove", Keytable_Remove },
{ "keytable_create", Keytable_Create },
{ "keytable_delete", Keytable_Delete },
{ "keytable_clear", Keytable_Clear },
{ "keytable_next", Keytable_Next },
{ "keytable_prev", Keytable_Prev },
{ "keytable_first", Keytable_First },
{ "keytable_last", Keytable_Last },
{ "keytable_save", Keytable_Save },
{ "keytable_load", Keytable_Load },
{ "keytable_save_ascii", Keytable_Save_ASCII },
{ NULL, NULL }
};
#endif

View File

@ -1,261 +0,0 @@
#include "Capsule.h"
const char* capsule_types[] =
{
"-NO VALUE-",
"BOOLEAN",
"INTEGER",
"FLOAT",
"VECTOR",
"STRING"
};
void Capsule::ThrowTypeError(cell get_type)
{
char ValStr[15];
GetAsStr(ValStr);
char value[100];
sprintf(value,"Function attempted to read NON-%s value, actual type is: %s, actual value is: %s", capsule_types[get_type], capsule_types[type], ValStr );
throw JudyEx(value, true);
}
bool Capsule::CheckEmpty(bool clear)
{
bool empty = ( data == NULL );
if(empty != true && clear == true) Clear();
return empty;
}
void Capsule::Clear()
{
//This function intelligently creates a pointer x,
//which will be of correct type and then deletes it.
switch (type)
{
case capsule_type_flo:
{
REAL *real_val = reinterpret_cast<REAL*>(data);
delete real_val;
break;
}
case capsule_type_vec:
{
JudyVec *vector_val = reinterpret_cast<JudyVec*>(data);
delete vector_val;
break;
}
case capsule_type_str:
{
char *char_val = reinterpret_cast<char*>(data);
delete char_val;
break;
}
}
data = NULL; //Null the address as well. (Used for ints too.)
}
bool Capsule::GetBool( void )
{
if (type != capsule_type_bool) ThrowTypeError(capsule_type_bool);
return (data != NULL);
}
void Capsule::SetBool(bool Value)
{
CheckEmpty(true);
type = capsule_type_bool;
if(Value == true) data = reinterpret_cast<Pvoid_t>(1);
};
cell Capsule::GetInt( void )
{
if (type != capsule_type_int) ThrowTypeError(capsule_type_int);
return reinterpret_cast<cell>(data);
}
void Capsule::SetInt(cell Value)
{
CheckEmpty(true);
type = capsule_type_int;
data = reinterpret_cast<void*>(Value);
};
REAL Capsule::GetFlo( void )
{
if (type != capsule_type_flo) ThrowTypeError(capsule_type_flo);
return *reinterpret_cast<REAL*>(data);
}
void Capsule::SetFlo(REAL Value)
{
CheckEmpty(true);
type = capsule_type_flo;
data = new REAL(Value);
};
const JudyVec* Capsule::GetVec( void )
{
if (type != capsule_type_vec) ThrowTypeError(capsule_type_vec);
return reinterpret_cast<const JudyVec*>(data);
}
void Capsule::SetVec(JudyVec* Value)
{
CheckEmpty(true);
type = capsule_type_vec;
data = reinterpret_cast<void*>(Value);
}
const char* Capsule::GetStr( void )
{
if (type != capsule_type_str) ThrowTypeError(capsule_type_str);
return reinterpret_cast<const char*>(data);
}
void Capsule::SetStr(char* Value)
{
CheckEmpty(true);
type = capsule_type_str;
char *string_val = new char[strlen(Value)+1];
strcpy(string_val,Value);
data = reinterpret_cast<void*>(string_val);
}
void Capsule::GetAsStr(char* value)
{
switch (type)
{
case capsule_type_bool:
sprintf(value, "%i",(cell)GetBool());
break;
case capsule_type_int:
sprintf(value, "%d", GetInt() );
break;
case capsule_type_flo:
sprintf(value, "%f", GetFlo() );
break;
case capsule_type_vec:
sprintf(value, "{%f,%f,%f}", GetVec()->first, GetVec()->second, GetVec()->third);
break;
case capsule_type_str:
sprintf(value, "\"%s\"", GetStr() );
break;
default:
sprintf(value, "-NO VALUE-");
}
}
void Capsule::Save(FILE* capsuleDB)
{
fwrite(&type,sizeof(char),1,capsuleDB);
switch(type)
{
case capsule_type_none: { break; }
case capsule_type_bool: { bool var = GetBool(); fwrite(&var, sizeof(bool), 1, capsuleDB); break; }
case capsule_type_int: { cell var = GetInt(); fwrite(&var, sizeof(cell), 1, capsuleDB); break; }
case capsule_type_flo: { fwrite(reinterpret_cast<REAL*>(GetData()), sizeof(REAL), 1, capsuleDB); break; }
case capsule_type_str:
{
const char* str = GetStr();
size_t len = strlen(str);
fwrite(&len,sizeof(size_t), 1, capsuleDB);
fwrite(&str, sizeof(char), len, capsuleDB);
break;
}
case capsule_type_vec:
{
const JudyVec* buffer = GetVec();
fwrite(buffer, sizeof(JudyVec), 1, capsuleDB);
break;
}
default:
{
char value[20];
sprintf(value,"Invalid type found!");
throw JudyEx(value, true);
break;
}
};
}
void Capsule::Load(FILE* capsuleDB)
{
fread(&type, sizeof(char), 1, capsuleDB);
switch(type)
{
case capsule_type_none: { CheckEmpty(true); break; }
case capsule_type_bool:
{
bool value = false;
fread(&value, sizeof(bool), 1, capsuleDB);
SetBool(value);
break;
}
case capsule_type_int:
{
cell value = NULL;
fread(&value, sizeof(cell), 1, capsuleDB);
SetInt(value);
break;
}
case capsule_type_flo:
{
REAL value = NULL;
fread(&value, sizeof(REAL), 1, capsuleDB);
SetFlo(value);
break;
}
case capsule_type_str:
{
size_t length;
fread(&length, sizeof(size_t), 1, capsuleDB);
char* value = new char[length+1];
fgets(value, length+1, capsuleDB);
SetStr(value);
delete(value);
break;
}
case capsule_type_vec:
{
JudyVec* value = new JudyVec(NULL,NULL,NULL);
fread(value, sizeof(JudyVec), 1, capsuleDB);
SetVec(value);
break;
}
default:
{
char value[20];
sprintf(value,"Invalid type found: %i",(int)type);
throw JudyEx(value, true);
}
};
}

View File

@ -1,65 +0,0 @@
#ifndef _JUDYCAP_INCLUDED
#define _JUDYCAP_INCLUDED
#include "JudyIncludes.h"
enum
{
capsule_type_none,
capsule_type_bool,
capsule_type_int,
capsule_type_flo,
capsule_type_vec,
capsule_type_str
};
extern const char* capsule_types[];
class Capsule
{
private:
Pvoid_t data;
char type;
protected:
void Clear( void );
void ThrowTypeError(cell get_type);
public:
Capsule() { data = NULL; type = capsule_type_none;}
~Capsule() { Clear(); }
void Remove() { delete this; }
Capsule(bool set) { SetBool(set); }
Capsule(cell set) { SetInt(set); }
Capsule(REAL set) { SetFlo(set); }
Capsule(JudyVec* set) { SetVec(set); }
Capsule(char* set) { SetStr(set); }
bool GetBool( void );
void SetBool(bool set);
cell GetInt( void );
void SetInt(cell set);
REAL GetFlo( void );
void SetFlo(REAL set);
const JudyVec* GetVec( void );
void SetVec(JudyVec* set);
const char* GetStr( void );
void SetStr(char* set);
void GetAsStr(char* value);
void Load(FILE* db);
void Save(FILE* db);
bool CheckEmpty(bool clear);
Pvoid_t GetData( void ) { return data; }
char GetType( void ) { return type; }
};
#endif

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