1 Commits

Author SHA1 Message Date
6066c7510d Tagged 1.76a 2006-09-26 03:44:09 +00:00
927 changed files with 126282 additions and 124785 deletions

View File

@ -124,6 +124,8 @@ CmdMngr::Command* CmdMngr::getCmd(long int id, int type, int access)
int CmdMngr::getCmdNum(int type, int access) int CmdMngr::getCmdNum(int type, int access)
{ {
if ((access == buf_access) && (type == buf_type))
return buf_num; // once calculated don't have to be done again
buf_access = access; buf_access = access;
buf_type = type; buf_type = type;

View File

@ -78,7 +78,7 @@ public:
inline bool matchCommandLine(const char* cmd, const char* arg) { return (!stricmp(command.c_str() + prefix, cmd + prefix) && (argument.empty() || !stricmp(argument.c_str(), arg))); } inline bool matchCommandLine(const char* cmd, const char* arg) { return (!stricmp(command.c_str() + prefix, cmd + prefix) && (argument.empty() || !stricmp(argument.c_str(), arg))); }
inline bool matchCommand(const char* cmd) { return (!strcmp(command.c_str(), cmd)); } inline bool matchCommand(const char* cmd) { return (!strcmp(command.c_str(), cmd)); }
inline int getFunction() const { return function; } inline int getFunction() const { return function; }
inline bool gotAccess(int f) const { return (!flags || ((flags & f) != 0)); } inline bool gotAccess(int f) const { return (!flags || ((flags & f) == flags)); }
inline CPluginMngr::CPlugin* getPlugin() { return plugin; } inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
inline bool isViewable() const { return listable; } inline bool isViewable() const { return listable; }
inline int getFlags() const { return flags; } inline int getFlags() const { return flags; }

View File

@ -1,418 +0,0 @@
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "sh_list.h"
#include "CString.h"
#include "amxmodx.h"
#include "CFlagManager.h"
void CFlagManager::SetFile(const char *Filename)
{
m_strConfigFile.assign(g_mod_name.c_str());
m_strConfigFile.append("/");
m_strConfigFile.append(get_localinfo("amxx_configsdir","addons/amxmodx/configs"));
m_strConfigFile.append("/");
m_strConfigFile.append(Filename);
CreateIfNotExist();
}
const int CFlagManager::LoadFile(const int force)
{
CheckIfDisabled();
// If we're disabled get the hell out. now.
if (m_iDisabled)
{
return 0;
}
// if we're not forcing this, and NeedToLoad says we dont have to
// then just stop
if (!force && !NeedToLoad())
{
return 0;
};
this->Clear();
// We need to load the file
FILE *File;
File=fopen(m_strConfigFile.c_str(),"r");
if (!File)
{
AMXXLOG_Log("[AMXX] FlagManager: Cannot open file \"%s\" (FILE pointer null!)",m_strConfigFile.c_str());
return -1;
};
// Trying to copy this almost exactly as other configs are read...
String Line;
char Command[256];
char Flags[256];
String TempLine;
while (!feof(File))
{
Line._fread(File);
char *nonconst=const_cast<char *>(Line.c_str());
// Strip out comments
while (*nonconst)
{
if (*nonconst==';') // End the line at comments
{
*nonconst='\0';
}
else
{
nonconst++;
}
};
Command[0]='\0';
Flags[0]='\0';
// Extract the command
TempLine.assign(Line.c_str());
nonconst=const_cast<char *>(TempLine.c_str());
char *start=NULL;
char *end=NULL;
// move up line until the first ", mark this down as the start
// then find the second " and mark it down as the end
while (*nonconst!='\0')
{
if (*nonconst=='"')
{
if (start==NULL)
{
start=nonconst+1;
}
else
{
end=nonconst;
goto done_with_command;
}
}
nonconst++;
}
done_with_command:
// invalid line?
if (start==NULL || end==NULL)
{
// TODO: maybe warn for an invalid non-commented line?
continue;
}
*end='\0';
strncpy(Command,start,sizeof(Command)-1);
// Now do the same thing for the flags
nonconst=++end;
start=NULL;
end=NULL;
// move up line until the first ", mark this down as the start
// then find the second " and mark it down as the end
while (*nonconst!='\0')
{
if (*nonconst=='"')
{
if (start==NULL)
{
start=nonconst+1;
}
else
{
end=nonconst;
goto done_with_flags;
}
}
nonconst++;
}
done_with_flags:
// invalid line?
if (start==NULL || end==NULL)
{
// TODO: maybe warn for an invalid non-commented line?
continue;
}
*end='\0';
strncpy(Flags,start,sizeof(Flags)-1);
//if (!isalnum(*Command))
if (*Command == '"' ||
*Command == '\0')
{
continue;
};
// Done sucking the command and flags out of the line
// now insert this command into the linked list
AddFromFile(const_cast<const char*>(&Command[0]),&Flags[0]);
nonconst=const_cast<char *>(Line.c_str());
*nonconst='\0';
};
fclose(File);
return 1;
}
/**
* This gets called from LoadFile
* Do NOT flag the entries as NeedToWrite
* No comment is passed from the file because
* this should never get written
*/
void CFlagManager::AddFromFile(const char *Command, const char *Flags)
{
CFlagEntry *Entry=new CFlagEntry;
Entry->SetName(Command);
Entry->SetFlags(Flags);
// Link it
m_FlagList.push_back(Entry);
};
void CFlagManager::LookupOrAdd(const char *Command, int &Flags, AMX *Plugin)
{
if (m_iDisabled) // if disabled in core.ini stop
{
return;
}
int TempFlags=Flags;
if (TempFlags==-1)
{
TempFlags=0;
}
List<CFlagEntry *>::iterator iter;
List<CFlagEntry *>::iterator end;
iter=m_FlagList.begin();
end=m_FlagList.end();
while (iter!=end)
{
if (strcmp((*iter)->GetName()->c_str(),Command)==0)
{
CFlagEntry *Entry=(*iter);
if (Entry->IsHidden()) // "!" flag, exclude this function
{
return;
}
// Found, byref the new flags
Flags=Entry->Flags();
// Move it to the back of the list for faster lookup for the rest
m_FlagList.erase(iter);
m_FlagList.push_back(Entry);
return;
}
iter++;
}
// was not found, add it
CFlagEntry *Entry=new CFlagEntry;
Entry->SetName(Command);
Entry->SetFlags(TempFlags);
if (Plugin)
{
CPluginMngr::CPlugin* a = g_plugins.findPluginFast(Plugin);
if (a)
{
Entry->SetComment(a->getName());
}
}
// This entry was added from a register_* native
// it needs to be written during map change
Entry->SetNeedWritten(1);
// Link it
m_FlagList.push_back(Entry);
}
void CFlagManager::WriteCommands(void)
{
List<CFlagEntry *>::iterator iter;
List<CFlagEntry *>::iterator end;
FILE *File;
int NeedToRead=0;
// First off check the modified time of this file
// if it matches the stored modified time, then update
// after we write so we do not re-read next map
struct stat TempStat;
stat(m_strConfigFile.c_str(),&TempStat);
if (TempStat.st_mtime != m_Stat.st_mtime)
{
NeedToRead=1;
};
File=fopen(m_strConfigFile.c_str(),"a");
if (!File)
{
return;
}
iter=m_FlagList.begin();
end=m_FlagList.end();
while (iter!=end)
{
if ((*iter)->NeedWritten())
{
if ((*iter)->GetComment()->size())
{
fprintf(File,"\"%s\" \t\"%s\" ; %s\n",(*iter)->GetName()->c_str(),(*iter)->GetFlags()->c_str(),(*iter)->GetComment()->c_str());
}
else
{
fprintf(File,"\"%s\" \t\"%s\"\n",(*iter)->GetName()->c_str(),(*iter)->GetFlags()->c_str());
}
(*iter)->SetNeedWritten(0);
}
++iter;
};
fclose(File);
// If NeedToRead was 0, then update the timestamp
// that was saved so we do not re-read this file
// next map
if (!NeedToRead)
{
stat(m_strConfigFile.c_str(),&TempStat);
m_Stat.st_mtime=TempStat.st_mtime;
}
}
int CFlagManager::ShouldIAddThisCommand(const AMX *amx, const cell *params, const char *cmdname) const
{
// If flagmanager is disabled then ignore this
if (m_iDisabled)
{
return 0;
}
// If 5th param exists it was compiled after this change was made
// if it does not exist, try our logic at the end of this function
// 5th param being > 0 means explicit yes
// < 0 means auto detect (default is -1), treat it like there was no 5th param
// 0 means explicit no
if ((params[0] / sizeof(cell)) >= 5)
{
if (params[5]>0) // This command was explicitly told to be included
{
return 1;
}
else if (params[5]==0) // this command was explicitly told to NOT be used
{
return 0;
}
}
// auto detect if we should use this command
// if command access is -1 (default, not set to ADMIN_ALL or any other access), then no
if (params[3]==-1)
{
return 0;
}
// if command is (or starts with) "say", then no
if (strncmp(cmdname,"say",3)==0)
{
return 0;
}
// else use it
return 1;
};
void CFlagManager::Clear(void)
{
List<CFlagEntry *>::iterator iter;
List<CFlagEntry *>::iterator end;
iter=m_FlagList.begin();
end=m_FlagList.end();
while (iter!=end)
{
delete (*iter);
++iter;
}
m_FlagList.clear();
};
void CFlagManager::CheckIfDisabled(void)
{
if (atoi(get_localinfo("disableflagman","0"))==0)
{
m_iDisabled=0;
}
else
{
m_iDisabled=1;
}
};

View File

@ -1,218 +0,0 @@
#ifndef CFLAGMANAGER_H
#define CFLAGMANAGER_H
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "sh_list.h"
#include "CString.h"
#include "amxmodx.h"
class CFlagEntry
{
private:
String m_strName; // command name ("amx_slap")
String m_strFlags; // string flags ("a","b")
String m_strComment; // comment to write ("; admincmd.amxx")
int m_iFlags; // bitmask flags
int m_iNeedWritten; // write this command on map change?
int m_iHidden; // set to 1 when the command is set to "!" access in
// the .ini file: this means do not process this command
public:
CFlagEntry()
{
m_iNeedWritten=0;
m_iFlags=0;
m_iHidden=0;
};
const int NeedWritten(void) const
{
return m_iNeedWritten;
};
void SetNeedWritten(const int i=1)
{
m_iNeedWritten=i;
};
const String *GetName(void) const
{
return &m_strName;
};
const String *GetFlags(void) const
{
return &m_strFlags;
};
const String *GetComment(void) const
{
return &m_strComment;
};
const int Flags(void) const
{
return m_iFlags;
};
void SetName(const char *data)
{
m_strName.assign(data);
};
void SetFlags(const char *flags)
{
// If this is a "!" entry then stop
if (flags && flags[0]=='!')
{
SetHidden(1);
return;
}
m_strFlags.assign(flags);
m_iFlags=UTIL_ReadFlags(flags);
};
void SetFlags(const int flags)
{
m_iFlags=flags;
char FlagsString[32];
UTIL_GetFlags(FlagsString, flags);
m_strFlags.assign(FlagsString);
};
void SetComment(const char *comment)
{
m_strComment.assign(comment);
};
void SetHidden(int i=1)
{
m_iHidden=i;
};
int IsHidden(void) const
{
return m_iHidden;
};
};
class CFlagManager
{
private:
List<CFlagEntry *> m_FlagList;
String m_strConfigFile;
struct stat m_Stat;
int m_iForceRead;
int m_iDisabled;
void CreateIfNotExist(void) const
{
FILE *fp;
fp=fopen(m_strConfigFile.c_str(),"r");
if (!fp)
{
// File does not exist, create the header
fp=fopen(m_strConfigFile.c_str(),"a");
if (fp)
{
fprintf(fp,"; This file will store the commands used by plugins, and their access level\n");
fprintf(fp,"; To change the access of a command, edit the flags beside it and then\n");
fprintf(fp,"; change the server's map.\n;\n");
fprintf(fp,"; Example: If I wanted to change the amx_slap access to require\n");
fprintf(fp,"; RCON access (flag \"l\") I would change this:\n");
fprintf(fp,"; \"amx_slap\" \"e\" ; admincmd.amxx\n");
fprintf(fp,"; To this:\n");
fprintf(fp,"; \"amx_slap\" \"l\" ; admincmd.amxx\n;\n");
fprintf(fp,"; To disable a specific command from being used with the command manager\n");
fprintf(fp,"; and to only use the plugin-specified access set the flag to \"!\"\n;\n");
fprintf(fp,"; NOTE: The plugin name at the end is just for reference to what plugin\n");
fprintf(fp,"; uses what commands. It is ignored.\n\n");
fclose(fp);
};
}
};
/**
* Returns 1 if the timestamp for the file is different than the one we have loaded
* 0 otherwise
*/
inline int NeedToLoad(void)
{
struct stat TempStat;
stat(m_strConfigFile.c_str(),&TempStat);
// If the modified timestamp does not match the stored
// timestamp than we need to re-read this file.
// Otherwise, ignore the file.
if (TempStat.st_mtime != m_Stat.st_mtime)
{
// Save down the modified timestamp
m_Stat.st_mtime=TempStat.st_mtime;
return 1;
};
return 0;
};
public:
CFlagManager()
{
memset(&m_Stat,0x0,sizeof(struct stat));
m_iDisabled=0;
m_iForceRead=0;
};
~CFlagManager()
{
};
/**
* Sets the filename in relation to amxmodx/configs
*/
void SetFile(const char *Filename="cmdaccess.ini");
const char *GetFile(void) const { return m_strConfigFile.c_str(); };
/**
* Parse the file, and load all entries
* Returns 1 on success, 0 on refusal (no need to), and -1 on error
*/
const int LoadFile(const int force=0);
/**
* Checks if the command exists in the list
* If it does, it byrefs the flags for it
* If it does not, it adds it to the list
* These are added from register_*cmd calls
*/
void LookupOrAdd(const char *Command, int &Flags, AMX *Plugin);
/**
* Write the commands back to the file
*/
void WriteCommands(void);
/**
* Add this straight from the cmdaccess.ini file
*/
void AddFromFile(const char *Command, const char *Flags);
/**
* Checks if this command should be added to flagman or not
* This is only checked when adding commands from the register_* natives
* If an admin manually adds a command to cmdaccess.ini it will be used
* regardless of whatever this function would say should be done with it
*/
int ShouldIAddThisCommand(const AMX *amx, const cell *params, const char *cmdname) const;
void Clear(void);
void CheckIfDisabled(void);
};
#endif // CFLAGMANAGER_H

View File

@ -33,7 +33,7 @@
#include "debugger.h" #include "debugger.h"
#include "binlog.h" #include "binlog.h"
CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes, int fwd_type) CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes)
{ {
m_FuncName = name; m_FuncName = name;
m_ExecType = et; m_ExecType = et;
@ -47,13 +47,6 @@ CForward::CForward(const char *name, ForwardExecType et, int numParams, const Fo
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter) for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
{ {
if ((fwd_type != FORWARD_ALL) &&
((fwd_type == FORWARD_ONLY_NEW && ((*iter).getAMX()->flags & AMX_FLAG_OLDFILE))
|| (fwd_type == FORWARD_ONLY_OLD && !((*iter).getAMX()->flags & AMX_FLAG_OLDFILE))
))
{
continue;
}
if ((*iter).isValid() && amx_FindPublic((*iter).getAMX(), name, &func) == AMX_ERR_NONE) if ((*iter).isValid() && amx_FindPublic((*iter).getAMX(), name, &func) == AMX_ERR_NONE)
{ {
AMXForward tmp; AMXForward tmp;
@ -130,7 +123,7 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
} }
// exec // exec
cell retVal = 0; cell retVal;
#if defined BINLOG_ENABLED #if defined BINLOG_ENABLED
g_BinLog.WriteOp(BinLog_CallPubFunc, (*iter).pPlugin->getId(), iter->func); g_BinLog.WriteOp(BinLog_CallPubFunc, (*iter).pPlugin->getId(), iter->func);
#endif #endif
@ -226,8 +219,6 @@ void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *para
name[0] = '\0'; name[0] = '\0';
amx_GetPublic(amx, func, name); amx_GetPublic(amx, func, name);
m_Name.assign(name); m_Name.assign(name);
m_ToDelete = false;
m_InExec = false;
} }
void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes) void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
@ -238,8 +229,6 @@ void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const Forwar
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE); m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
isFree = false; isFree = false;
m_Name.assign(funcName); m_Name.assign(funcName);
m_ToDelete = false;
m_InExec = false;
} }
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays) cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
@ -252,15 +241,13 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
cell realParams[FORWARD_MAX_PARAMS]; cell realParams[FORWARD_MAX_PARAMS];
cell *physAddrs[FORWARD_MAX_PARAMS]; cell *physAddrs[FORWARD_MAX_PARAMS];
if (!m_HasFunc || m_ToDelete) if (!m_HasFunc)
return 0; return 0;
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(m_Amx); CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(m_Amx);
if (!pPlugin->isExecutable(m_Func)) if (!pPlugin->isExecutable(m_Func))
return 0; return 0;
m_InExec = true;
Debugger *pDebugger = (Debugger *)m_Amx->userdata[UD_DEBUGGER]; Debugger *pDebugger = (Debugger *)m_Amx->userdata[UD_DEBUGGER];
if (pDebugger) if (pDebugger)
pDebugger->BeginExec(); pDebugger->BeginExec();
@ -362,20 +349,16 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
} }
} }
m_InExec = false;
return retVal; return retVal;
} }
int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam * paramTypes, int fwd_type) int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam * paramTypes)
{ {
int retVal = m_Forwards.size() << 1; int retVal = m_Forwards.size() << 1;
CForward *tmp = new CForward(funcName, et, numParams, paramTypes, fwd_type); CForward *tmp = new CForward(funcName, et, numParams, paramTypes);
if (!tmp) if (!tmp)
{
return -1; // should be invalid return -1; // should be invalid
}
m_Forwards.push_back(tmp); m_Forwards.push_back(tmp);
@ -460,20 +443,7 @@ bool CForwardMngr::isIdValid(int id) const
cell CForwardMngr::executeForwards(int id, cell *params) cell CForwardMngr::executeForwards(int id, cell *params)
{ {
int retVal; int retVal = (id & 1) ? m_SPForwards[id >> 1]->execute(params, m_TmpArrays) : m_Forwards[id >> 1]->execute(params, m_TmpArrays);
if (id & 1)
{
CSPForward *fwd = m_SPForwards[id >> 1];
retVal = fwd->execute(params, m_TmpArrays);
if (fwd->m_ToDelete)
{
fwd->m_ToDelete = false;
unregisterSPForward(id);
}
} else {
retVal = m_Forwards[id >> 1]->execute(params, m_TmpArrays);
}
m_TmpArraysNum = 0; m_TmpArraysNum = 0;
return retVal; return retVal;
@ -543,63 +513,20 @@ void CForwardMngr::unregisterSPForward(int id)
{ {
//make sure the id is valid //make sure the id is valid
if (!isIdValid(id) || m_SPForwards.at(id >> 1)->isFree) if (!isIdValid(id) || m_SPForwards.at(id >> 1)->isFree)
{
return; return;
}
CSPForward *fwd = m_SPForwards.at(id >> 1); m_SPForwards.at(id >> 1)->isFree = true;
m_FreeSPForwards.push(id);
if (fwd->m_InExec)
{
fwd->m_ToDelete = true;
} else {
fwd->isFree = true;
m_FreeSPForwards.push(id);
}
} }
int CForwardMngr::duplicateSPForward(int id) int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num)
{
if (!isIdValid(id) || m_SPForwards.at(id >> 1)->isFree)
{
return -1;
}
CSPForward *fwd = m_SPForwards.at(id >> 1);
return registerSPForward(fwd->m_Func, fwd->m_Amx, fwd->m_NumParams, fwd->m_ParamTypes);
}
int CForwardMngr::isSameSPForward(int id1, int id2)
{
if (!isIdValid(id1) || !isIdValid(id2))
{
return false;
}
CSPForward *fwd1 = m_SPForwards.at(id1 >> 1);
CSPForward *fwd2 = m_SPForwards.at(id2 >> 1);
if (fwd1->isFree || fwd2->isFree)
{
return false;
}
return ((fwd1->m_Amx == fwd2->m_Amx)
&& (fwd1->m_Func == fwd2->m_Func)
&& (fwd1->m_NumParams == fwd2->m_NumParams));
}
int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num, int fwd_type)
{ {
ForwardParam params[FORWARD_MAX_PARAMS]; ForwardParam params[FORWARD_MAX_PARAMS];
for (size_t i=0; i<num; i++) for (size_t i=0; i<num; i++)
{
params[i] = static_cast<ForwardParam>(list[i]); params[i] = static_cast<ForwardParam>(list[i]);
}
return g_forwards.registerForward(funcName, et, num, params, fwd_type); return g_forwards.registerForward(funcName, et, num, params);
} }
int registerForward(const char *funcName, ForwardExecType et, ...) int registerForward(const char *funcName, ForwardExecType et, ...)

View File

@ -51,10 +51,6 @@
const int FORWARD_MAX_PARAMS = 32; const int FORWARD_MAX_PARAMS = 32;
#define FORWARD_ONLY_OLD 1
#define FORWARD_ONLY_NEW 2
#define FORWARD_ALL 3
enum ForwardExecType enum ForwardExecType
{ {
ET_IGNORE = 0, // Ignore return vaue ET_IGNORE = 0, // Ignore return vaue
@ -111,7 +107,7 @@ class CForward
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS]; ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
public: public:
CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam * paramTypes, int fwd_type=FORWARD_ALL); CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam * paramTypes);
CForward() {} // leaves everything unitialized' CForward() {} // leaves everything unitialized'
cell execute(cell *params, ForwardPreparedArray *preparedArrays); cell execute(cell *params, ForwardPreparedArray *preparedArrays);
@ -143,7 +139,6 @@ public:
// Single plugin forward // Single plugin forward
class CSPForward class CSPForward
{ {
friend class CForwardMngr;
const char *m_FuncName; const char *m_FuncName;
int m_NumParams; int m_NumParams;
@ -153,8 +148,6 @@ class CSPForward
int m_Func; int m_Func;
bool m_HasFunc; bool m_HasFunc;
String m_Name; String m_Name;
bool m_InExec;
bool m_ToDelete;
public: public:
bool isFree; bool isFree;
@ -210,15 +203,13 @@ public:
// Interface // Interface
// Register normal forward // Register normal forward
int registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam *paramTypes, int fwd_type=FORWARD_ALL); int registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam *paramTypes);
// Register single plugin forward // Register single plugin forward
int registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes); int registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
int registerSPForward(int func, AMX *amx, int numParams, const ForwardParam * paramTypes); int registerSPForward(int func, AMX *amx, int numParams, const ForwardParam * paramTypes);
// Unregister single plugin forward // Unregister single plugin forward
void unregisterSPForward(int id); void unregisterSPForward(int id);
int duplicateSPForward(int id);
int isSameSPForward(int id1, int id2);
// execute forward // execute forward
cell executeForwards(int id, cell *params); cell executeForwards(int id, cell *params);
@ -236,7 +227,7 @@ public:
// (un)register forward // (un)register forward
int registerForward(const char *funcName, ForwardExecType et, ...); int registerForward(const char *funcName, ForwardExecType et, ...);
int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num, int fwd_type=FORWARD_ALL); int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num);
int registerSPForwardByName(AMX *amx, const char *funcName, ...); int registerSPForwardByName(AMX *amx, const char *funcName, ...);
int registerSPForwardByNameC(AMX *amx, const char *funcName, cell *list, size_t num); int registerSPForwardByNameC(AMX *amx, const char *funcName, cell *list, size_t num);
int registerSPForward(AMX *amx, int func, ...); int registerSPForward(AMX *amx, int func, ...);

View File

@ -35,15 +35,13 @@
// ***************************************************** // *****************************************************
// class MenuMngr // class MenuMngr
// ***************************************************** // *****************************************************
MenuMngr::MenuCommand::MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f, bool new_menu) MenuMngr::MenuCommand::MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f)
{ {
plugin = a; plugin = a;
keys = k; keys = k;
menuid = mi; menuid = mi;
next = 0;
is_new_menu = new_menu;
function = f; function = f;
next = 0;
} }
MenuMngr::~MenuMngr() MenuMngr::~MenuMngr()
@ -63,47 +61,66 @@ int MenuMngr::findMenuId(const char* name, AMX* amx)
return 0; return 0;
} }
void MenuMngr::removeMenuId(int id)
{
MenuIdEle *n = headid;
MenuIdEle *l = NULL;
while (n)
{
if (n->id == id)
{
if (l)
l->next = n->next;
else
headid = n->next;
delete n;
break;
}
l = n;
n = n->next;
}
MenuCommand *c = headcmd;
MenuCommand *lc = NULL;
MenuCommand *tmp;
while (c)
{
if (c->menuid == id)
{
if (lc)
lc->next = c->next;
else
headcmd = c->next;
tmp = c->next;
delete c;
c = tmp;
} else {
lc = c;
c = c->next;
}
}
}
int MenuMngr::registerMenuId(const char* n, AMX* a) int MenuMngr::registerMenuId(const char* n, AMX* a)
{ {
int id = findMenuId(n, a); int id = findMenuId(n, a);
if (id) if (id)
{
return id; return id;
}
headid = new MenuIdEle(n, a, headid); headid = new MenuIdEle(n, a, headid);
if (!headid)
return 0; // :TODO: Better error report
return headid->id; return headid->id;
} }
void MenuMngr::registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f, bool from_new_menu) void MenuMngr::registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f)
{ {
MenuCommand **temp = &headcmd; MenuCommand** temp = &headcmd;
if (from_new_menu) while (*temp) temp = &(*temp)->next;
{ *temp = new MenuCommand(a, mi, k, f);
MenuCommand *ptr;
while (*temp)
{
ptr = *temp;
if (ptr->is_new_menu
&& ptr->plugin == a
&& ptr->menuid == mi)
{
if (g_forwards.isSameSPForward(ptr->function, f))
{
return;
}
}
temp = &(*temp)->next;
}
} else {
while (*temp)
{
temp = &(*temp)->next;
}
}
*temp = new MenuCommand(a, mi, k, f, from_new_menu);
} }
void MenuMngr::clear() void MenuMngr::clear()
@ -123,13 +140,4 @@ void MenuMngr::clear()
} }
} }
MenuMngr::iterator MenuMngr::SetWatchIter(MenuMngr::iterator iter)
{
MenuMngr::iterator old = m_watch_iter;
m_watch_iter = iter;
return old;
}
int MenuMngr::MenuIdEle::uniqueid = 0; int MenuMngr::MenuIdEle::uniqueid = 0;

View File

@ -66,34 +66,29 @@ private:
int menuid; int menuid;
int keys; int keys;
int function; int function;
int is_new_menu;
MenuCommand* next; MenuCommand* next;
MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f, bool new_menu=false); MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f);
public: public:
inline int getFunction() { return function; } inline int getFunction() { return function; }
inline CPluginMngr::CPlugin* getPlugin() { return plugin; } inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
inline bool matchCommand(int m, int k) inline bool matchCommand(int m, int k) { return ((m == menuid) && (keys & k)); }
{
return ((m == menuid) && (keys & k));
}
} *headcmd; } *headcmd;
public: public:
MenuMngr() : m_watch_iter(end()) MenuMngr() { headid = 0; headcmd = 0; }
{ headid = NULL; headcmd = NULL; }
~MenuMngr(); ~MenuMngr();
// Interface // Interface
int findMenuId(const char* name, AMX* a = 0); int findMenuId(const char* name, AMX* a = 0);
int registerMenuId(const char* n, AMX* a); int registerMenuId(const char* n, AMX* a);
void registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f, bool from_new_menu=false); void removeMenuId(int id);
void registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f);
void clear(); void clear();
class iterator class iterator
{ {
friend class MenuMngr;
MenuCommand* a; MenuCommand* a;
public: public:
iterator(MenuCommand*aa) : a(aa) {} iterator(MenuCommand*aa) : a(aa) {}
@ -106,13 +101,6 @@ public:
inline iterator begin() const { return iterator(headcmd); } inline iterator begin() const { return iterator(headcmd); }
inline iterator end() const { return iterator(0); } inline iterator end() const { return iterator(0); }
MenuMngr::iterator SetWatchIter(MenuMngr::iterator iter);
inline MenuMngr::iterator GetWatchIter() { return m_watch_iter; }
private:
MenuMngr::iterator m_watch_iter;
}; };
extern MenuMngr g_menucmds;
#endif //MENUS_H #endif //MENUS_H

View File

@ -40,6 +40,8 @@ void CPlayer::Init(edict_t* e, int i)
pEdict = e; pEdict = e;
initialized = false; initialized = false;
ingame = false; ingame = false;
bot_value = false;
bot_cached = false;
authorized = false; authorized = false;
current = 0; current = 0;
@ -87,6 +89,8 @@ void CPlayer::Disconnect()
} }
queries.clear(); queries.clear();
bot_value = false;
bot_cached = false;
menu = 0; menu = 0;
newmenu = -1; newmenu = -1;
} }
@ -112,6 +116,8 @@ int CPlayer::NextHUDChannel()
bool CPlayer::Connect(const char* connectname, const char* ipaddress) bool CPlayer::Connect(const char* connectname, const char* ipaddress)
{ {
bot_value = false;
bot_cached = false;
name.assign(connectname); name.assign(connectname);
ip.assign(ipaddress); ip.assign(ipaddress);
time = gpGlobals->time; time = gpGlobals->time;

View File

@ -84,6 +84,8 @@ public:
bool initialized; bool initialized;
bool ingame; bool ingame;
bool bot_cached;
bool bot_value;
bool authorized; bool authorized;
bool vgui; bool vgui;
@ -118,6 +120,7 @@ public:
cell hudmap[5]; cell hudmap[5];
Vector lastTrace; Vector lastTrace;
Vector thisTrace;
Vector lastHit; Vector lastHit;
List<ClientCvarQuery_Info *> queries; List<ClientCvarQuery_Info *> queries;
@ -130,18 +133,24 @@ public:
inline bool IsBot() inline bool IsBot()
{ {
if ((pEdict->v.flags & FL_FAKECLIENT) == FL_FAKECLIENT) if (!bot_cached)
{ {
return true; bot_value = false;
if (pEdict->v.flags & FL_FAKECLIENT)
{
bot_value = true;
bot_cached = true;
} else {
const char *auth = GETPLAYERAUTHID(pEdict);
if (auth && (strcmp(auth, "BOT") == 0))
{
bot_value = true;
bot_cached = true;
}
}
} }
const char *auth = GETPLAYERAUTHID(pEdict); return bot_value;
if (auth && (strcmp(auth, "BOT") == 0))
{
return true;
}
return false;
} }
inline bool IsAlive() inline bool IsAlive()
@ -296,87 +305,4 @@ public:
inline bool isNewTeam() { return newTeam ? true : false; } inline bool isNewTeam() { return newTeam ? true : false; }
}; };
class CAdminData
{
private:
cell m_AuthData[44];
cell m_Password[32];
cell m_Flags;
cell m_Access;
public:
CAdminData()
{
m_AuthData[0]=0;
m_Password[0]=0;
m_Flags=0;
m_Access=0;
};
void SetAccess(cell Access)
{
m_Access=Access;
};
cell GetAccess(void) const
{
return m_Access;
};
void SetFlags(cell Flags)
{
m_Flags=Flags;
};
cell GetFlags(void) const
{
return m_Flags;
};
void SetAuthID(const cell *Input)
{
unsigned int i=0;
while (i<sizeof(m_AuthData)-1)
{
if ((m_AuthData[i++]=*Input++)==0)
{
return;
}
}
m_AuthData[sizeof(m_AuthData)-1]=0;
};
const cell *GetAuthID(void) const
{
return &m_AuthData[0];
};
void SetPass(const cell *Input)
{
unsigned int i=0;
while (i<sizeof(m_Password)-1)
{
if ((m_Password[i++]=*Input++)==0)
{
return;
}
}
m_Password[sizeof(m_Password)-1]=0;
};
const cell *GetPass(void) const
{
return &m_Password[0];
};
CAdminData & operator = (const CAdminData &src)
{
this->SetAccess(src.GetAccess());
this->SetFlags(src.GetFlags());
this->SetAuthID(src.GetAuthID());
this->SetPass(src.GetPass());
return *this;
}
};
#endif //CMISC_H #endif //CMISC_H

View File

@ -39,7 +39,6 @@
// New // New
typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/); typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
typedef int (FAR *QUERYMOD_NEW)(int * /*ifvers*/, amxx_module_info_s * /*modInfo*/); typedef int (FAR *QUERYMOD_NEW)(int * /*ifvers*/, amxx_module_info_s * /*modInfo*/);
typedef int (FAR *CHECKGAME_NEW)(const char *);
typedef int (FAR *ATTACHMOD_NEW)(PFN_REQ_FNPTR /*reqFnptrFunc*/); typedef int (FAR *ATTACHMOD_NEW)(PFN_REQ_FNPTR /*reqFnptrFunc*/);
typedef int (FAR *DETACHMOD_NEW)(void); typedef int (FAR *DETACHMOD_NEW)(void);
typedef void (FAR *PLUGINSLOADED_NEW)(void); typedef void (FAR *PLUGINSLOADED_NEW)(void);
@ -220,9 +219,6 @@ bool CModule::queryModule()
m_Handle = DLLOAD(m_Filename.c_str()); // load file m_Handle = DLLOAD(m_Filename.c_str()); // load file
if (!m_Handle) if (!m_Handle)
{ {
#if defined __linux__
AMXXLOG_Log("[AMXX] Module \"%s\" failed to load (%s)", m_Filename.c_str(), dlerror());
#endif
m_Status = MODULE_BADLOAD; m_Status = MODULE_BADLOAD;
return false; return false;
} }
@ -297,33 +293,6 @@ bool CModule::queryModule()
return false; return false;
} }
// Lastly, check to see if this module is able to load on this game mod
CHECKGAME_NEW checkGame_New = (CHECKGAME_NEW)DLPROC(m_Handle, "AMXX_CheckGame");
if (checkGame_New)
{
// This is an optional check; do not fail modules that do not have it
int ret = checkGame_New(g_mod_name.c_str());
if (ret != AMXX_GAME_OK)
{
switch (ret)
{
case AMXX_GAME_BAD:
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") reported that it cannot load on game \"%s\"", m_Filename.c_str(), getVersion(), g_mod_name.c_str());
m_Status = MODULE_BADGAME;
break;
default:
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an unknown CheckGame code (value: %d)", m_Filename.c_str(), getVersion(), ret);
m_Status = MODULE_BADLOAD;
break;
}
return false;
}
}
m_Status = MODULE_QUERY; m_Status = MODULE_QUERY;
return true; return true;
} else { } else {
@ -431,7 +400,6 @@ const char* CModule::getStatus() const
case MODULE_NEWER: return "newer"; case MODULE_NEWER: return "newer";
case MODULE_INTERROR: return "internal err"; case MODULE_INTERROR: return "internal err";
case MODULE_NOT64BIT: return "not 64bit"; case MODULE_NOT64BIT: return "not 64bit";
case MODULE_BADGAME: return "bad game";
default: break; default: break;
} }

View File

@ -49,8 +49,7 @@ enum MODULE_STATUS
MODULE_NEWER, // newer interface MODULE_NEWER, // newer interface
MODULE_INTERROR, // Internal error MODULE_INTERROR, // Internal error
MODULE_FUNCNOTPRESENT, // Function not present MODULE_FUNCNOTPRESENT, // Function not present
MODULE_NOT64BIT, // Not 64 bit compatible MODULE_NOT64BIT // Not 64 bit compatible
MODULE_BADGAME, // Module cannot load on the current game mod
}; };
struct amxx_module_info_s struct amxx_module_info_s
@ -69,9 +68,6 @@ struct amxx_module_info_s
#define AMXX_PARAM 2 /* Invalid parameter */ #define AMXX_PARAM 2 /* Invalid parameter */
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */ #define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
#define AMXX_GAME_OK 0 /* Module can load on this game. */
#define AMXX_GAME_BAD 1 /* Module cannot load on this game. */
#define AMXX_INTERFACE_VERSION 4 #define AMXX_INTERFACE_VERSION 4
class CModule class CModule

View File

@ -90,7 +90,7 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
{ {
if (warn) if (warn)
{ {
AMXXLOG_Error("[AMXX] Plugins list not found (file \"%s\")", filename); AMXXLOG_Log("[AMXX] Plugins list not found (file \"%s\")", filename);
} }
return 1; return 1;
} }
@ -153,11 +153,6 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
continue; continue;
} }
if (findPlugin(pluginName) != NULL)
{
continue;
}
CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, debugFlag); CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, debugFlag);
if (plugin->getStatusCode() == ps_bad_load) if (plugin->getStatusCode() == ps_bad_load)
@ -165,7 +160,7 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
char errorMsg[255]; char errorMsg[255];
sprintf(errorMsg, "%s (plugin \"%s\")", error, pluginName); sprintf(errorMsg, "%s (plugin \"%s\")", error, pluginName);
plugin->setError(errorMsg); plugin->setError(errorMsg);
AMXXLOG_Error("[AMXX] %s", plugin->getError()); AMXXLOG_Log("[AMXX] %s", plugin->getError());
} }
} }
@ -217,7 +212,7 @@ CPluginMngr::CPlugin* CPluginMngr::findPlugin(int index)
return a; return a;
} }
CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name) CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name)
{ {
if (!name) if (!name)
@ -236,17 +231,6 @@ CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name)
return a; return a;
} }
void CPluginMngr::CPlugin::AddToFailCounter(unsigned int i)
{
failcounter += i;
if ((failcounter >= 3)
&& (status ))
{
errorMsg.assign("This plugin is non-GPL which violates AMX Mod X's license.");
status = ps_bad_load;
}
}
const char* CPluginMngr::CPlugin::getStatus() const const char* CPluginMngr::CPlugin::getStatus() const
{ {
switch (status) switch (status)
@ -274,7 +258,6 @@ CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, int
{ {
const char* unk = "unknown"; const char* unk = "unknown";
failcounter = 0;
title.assign(unk); title.assign(unk);
author.assign(unk); author.assign(unk);
version.assign(unk); version.assign(unk);
@ -434,16 +417,14 @@ void CPluginMngr::CPlugin::pausePlugin()
// Unpause a plugin // Unpause a plugin
void CPluginMngr::CPlugin::unpausePlugin() void CPluginMngr::CPlugin::unpausePlugin()
{ {
if (isValid() && (getStatusCode() != ps_stopped)) if (isValid())
{ {
// set status first so the function will be marked executable // set status first so the function will be marked executable
setStatus(ps_running); setStatus(ps_running);
// call plugin_unpause if provided // call plugin_unpause if provided
if (m_UnpauseFwd != -1) if (m_UnpauseFwd != -1)
{
executeForwards(m_UnpauseFwd); executeForwards(m_UnpauseFwd);
}
} }
} }

View File

@ -71,7 +71,6 @@ public:
String author; String author;
String errorMsg; String errorMsg;
unsigned int failcounter;
int m_PauseFwd; int m_PauseFwd;
int m_UnpauseFwd; int m_UnpauseFwd;
int paused_fun; int paused_fun;
@ -99,11 +98,9 @@ public:
inline void setError(const char* n) { errorMsg.assign(n); } inline void setError(const char* n) { errorMsg.assign(n); }
inline bool isValid() const { return (status >= ps_paused); } inline bool isValid() const { return (status >= ps_paused); }
inline bool isPaused() const { return ((status == ps_paused) || (status == ps_stopped)); } inline bool isPaused() const { return ((status == ps_paused) || (status == ps_stopped)); }
inline bool isStopped() const { return (status == ps_stopped); }
inline bool isExecutable(int id) const { return (isValid() && !isPaused()); } inline bool isExecutable(int id) const { return (isValid() && !isPaused()); }
void Finalize(); void Finalize();
void AddToFailCounter(unsigned int i);
void pausePlugin(); void pausePlugin();
void unpausePlugin(); void unpausePlugin();
void pauseFunction(int id); void pauseFunction(int id);

View File

@ -129,7 +129,7 @@ public:
} }
//Added this for amxx inclusion //Added this for amxx inclusion
bool empty() const bool empty()
{ {
if (!v) if (!v)
return true; return true;
@ -140,7 +140,7 @@ public:
return false; return false;
} }
size_t size() const size_t size()
{ {
if (v) if (v)
return strlen(v); return strlen(v);

View File

@ -37,20 +37,12 @@
// Vector // Vector
template <class T> class CVector template <class T> class CVector
{ {
bool Grow(size_t amount) bool Grow()
{ {
// automatic grow // automatic grow
size_t newSize = m_Size * 2; size_t newSize = m_Size * 2;
if (newSize == 0) if (newSize == 0)
{ newSize = 8; // a good init value
newSize = 8;
}
while (m_CurrentUsedSize + amount > newSize)
{
newSize *= 2;
}
T *newData = new T[newSize]; T *newData = new T[newSize];
if (!newData) if (!newData)
return false; return false;
@ -65,16 +57,12 @@ template <class T> class CVector
return true; return true;
} }
bool GrowIfNeeded(size_t amount) bool GrowIfNeeded()
{ {
if (m_CurrentUsedSize + amount >= m_Size) if (m_CurrentUsedSize >= m_Size)
{ return Grow();
return Grow(amount);
}
else else
{
return true; return true;
}
} }
bool ChangeSize(size_t size) bool ChangeSize(size_t size)
@ -341,13 +329,14 @@ public:
bool push_back(const T & elem) bool push_back(const T & elem)
{ {
if (!GrowIfNeeded(1)) ++m_CurrentUsedSize;
if (!GrowIfNeeded())
{ {
--m_CurrentUsedSize;
return false; return false;
} }
m_Data[m_CurrentUsedSize++] = elem; m_Data[m_CurrentUsedSize - 1] = elem;
return true; return true;
} }
@ -445,13 +434,13 @@ public:
size_t ofs = where - begin(); size_t ofs = where - begin();
if (!GrowIfNeeded(1)) ++m_CurrentUsedSize;
if (!GrowIfNeeded())
{ {
--m_CurrentUsedSize;
return false; return false;
} }
++m_CurrentUsedSize;
where = begin() + ofs; where = begin() + ofs;
// Move subsequent entries // Move subsequent entries

View File

@ -2,11 +2,11 @@
# Makefile written by David "BAILOPAN" Anderson # Makefile written by David "BAILOPAN" Anderson
HLSDK = ../../hlsdk HLSDK = ../../hlsdk
MM_ROOT = ../../metamod/metamod MM_ROOT = ../metamod/metamod
### EDIT BELOW FOR OTHER PROJECTS ### ### EDIT BELOW FOR OTHER PROJECTS ###
OPT_FLAGS = -O2 -fno-strict-aliasing -funroll-loops -s -fomit-frame-pointer -pipe -DNDEBUG OPT_FLAGS = -O2 -fno-strict-aliasing -funroll-loops -s -fomit-frame-pointer -pipe
DEBUG_FLAGS = -g -ggdb3 DEBUG_FLAGS = -g -ggdb3
CPP = gcc-4.1 CPP = gcc-4.1
NAME = amxmodx NAME = amxmodx
@ -20,8 +20,7 @@ OBJECTS = meta_api.cpp CFile.cpp CVault.cpp vault.cpp float.cpp file.cpp modules
amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \ amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \ CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp sorting.cpp \ optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp sorting.cpp \
amxmod_compat.cpp nongpl_matches.cpp CFlagManager.cpp datastructs.cpp \ amxmod_compat.cpp
trie_natives.cpp
LINK = -lgcc -static-libgcc LINK = -lgcc -static-libgcc
@ -49,7 +48,7 @@ ifeq "$(BINLOG)" "true"
CFLAGS += -DBINLOG_ENABLED CFLAGS += -DBINLOG_ENABLED
endif endif
CFLAGS += -DLINUX -DAMX_NOPROPLIST -Wall -Werror -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions CFLAGS += -DLINUX -DNDEBUG -DAMX_NOPROPLIST -fPIC -Wall -Werror -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
ifeq "$(AMD64)" "true" ifeq "$(AMD64)" "true"
BINARY = $(NAME)_$(BIN_SUFFIX_64) BINARY = $(NAME)_$(BIN_SUFFIX_64)
@ -63,7 +62,6 @@ else
CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32
LINK += -lz LINK += -lz
OPT_FLAGS += -march=i586 OPT_FLAGS += -march=i586
CFLAGS += -m32
endif endif
OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o)

View File

@ -803,7 +803,7 @@ static void expand(unsigned char *code, long codesize, long memsize)
do { do {
codesize--; codesize--;
/* no input byte should be shifted out completely */ /* no input byte should be shifted out completely */
assert(shift<static_cast<int>(8*sizeof(cell))); assert(shift<8*sizeof(cell));
/* we work from the end of a sequence backwards; the final code in /* we work from the end of a sequence backwards; the final code in
* a sequence may not have the continuation bit set */ * a sequence may not have the continuation bit set */
assert(shift>0 || (code[(size_t)codesize] & 0x80)==0); assert(shift>0 || (code[(size_t)codesize] & 0x80)==0);
@ -973,25 +973,27 @@ int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code)
memcpy(native_code, amx->base, ((AMX_HEADER *)(amx->base))->cod); memcpy(native_code, amx->base, ((AMX_HEADER *)(amx->base))->cod);
hdr = (AMX_HEADER *)native_code; hdr = (AMX_HEADER *)native_code;
/* JIT rulz! (TM) */ /* JIT rulz! (TM) */
/* MP: added check for correct compilation */ /* MP: added check for correct compilation */
//Fixed bug (thanks T(+)rget) //Fixed bug (thanks T(+)rget)
if ((res = asm_runJIT(amx->base, reloc_table, native_code)) == 0) if ((res = asm_runJIT(amx->base, reloc_table, native_code)) == 0)
{ {
/* update the required memory size (the previous value was a
* conservative estimate, now we know the exact size)
*/
amx->code_size = (hdr->dat + hdr->stp + 3) & ~3;
/* The compiled code is relocatable, since only relative jumps are /* The compiled code is relocatable, since only relative jumps are
* used for destinations within the generated code and absoulute * used for destinations within the generated code and absoulute
* addresses for jumps into the runtime, which is fixed in memory. * addresses for jumps into the runtime, which is fixed in memory.
*/ */
amx->base = (unsigned char*) native_code; amx->base = (unsigned char*) native_code;
amx->cip = hdr->cip; amx->cip = hdr->cip;
/* also put a sentinel for strings at the top the stack */ amx->hea = hdr->hea;
*(cell *)((char*)native_code + hdr->dat + amx->stp - sizeof(cell)) = 0; amx->stp = hdr->stp - sizeof(cell);
/* update the required memory size (the previous value was a amx->hlw = hdr->hea;
* conservative estimate, now we know the exact size) /* also put a sentinel for strings at the top the stack */
*/ *(cell *)((char*)native_code + hdr->dat + hdr->stp - sizeof(cell)) = 0;
amx->code_size = (hdr->dat + amx->stp + sizeof(cell)) & ~3; amx->stk = amx->stp;
} /* if */ } /* if */
return (res == 0) ? AMX_ERR_NONE : AMX_ERR_INIT_JIT; return (res == 0) ? AMX_ERR_NONE : AMX_ERR_INIT_JIT;

View File

@ -31,37 +31,10 @@
#include <time.h> #include <time.h>
#include "amxmodx.h" #include "amxmodx.h"
#include "CMenu.h"
#include "natives.h" #include "natives.h"
#include "debugger.h" #include "debugger.h"
#include "binlog.h" #include "binlog.h"
#include "libraries.h" #include "libraries.h"
#include "CFlagManager.h"
#include "nongpl_matches.h"
#include "format.h"
#include "svn_version.h"
extern CFlagManager FlagMan;
CVector<CAdminData *> DynamicAdmins;
char CVarTempBuffer[64];
const char *invis_cvar_list[5] = {"amxmodx_version", "amxmodx_modules", "amx_debug", "amx_mldebug", "amx_client_languages"};
bool CheckBadConList(const char *cvar, int type)
{
int i = 0;
while (NONGPL_CVAR_LIST[i].cvar != NULL)
{
if (NONGPL_CVAR_LIST[i].type == type
&& strcmp(NONGPL_CVAR_LIST[i].cvar, cvar) == 0)
{
return true;
}
i++;
}
return false;
}
static cell AMX_NATIVE_CALL get_xvar_id(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_xvar_id(AMX *amx, cell *params)
{ {
@ -596,7 +569,7 @@ static cell AMX_NATIVE_CALL is_user_alive(AMX *amx, cell *params) /* 1 param */
static cell AMX_NATIVE_CALL get_amxx_verstring(AMX *amx, cell *params) /* 2 params */ static cell AMX_NATIVE_CALL get_amxx_verstring(AMX *amx, cell *params) /* 2 params */
{ {
return set_amxstring(amx, params[1], SVN_VERSION_STRING, params[2]); return set_amxstring(amx, params[1], AMX_VERSION, params[2]);
} }
static cell AMX_NATIVE_CALL get_user_frags(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL get_user_frags(AMX *amx, cell *params) /* 1 param */
@ -724,15 +697,8 @@ static cell AMX_NATIVE_CALL get_user_weapons(AMX *amx, cell *params) /* 3 param
cell *cpNum = get_amxaddr(amx, params[3]); cell *cpNum = get_amxaddr(amx, params[3]);
cell *cpIds = get_amxaddr(amx, params[2]); cell *cpIds = get_amxaddr(amx, params[2]);
*cpIds = 0; *cpIds = 0;
int weapons = pPlayer->pEdict->v.weapons & ~(1<<31); // don't count last element int weapons = pPlayer->pEdict->v.weapons & ~(1<<31); // don't count last element
if (g_bmod_dod)
{
// Don't ignore that last element for dod
weapons = pPlayer->pEdict->v.weapons;
}
for (int i = 1; i < MAX_WEAPONS; ++i) for (int i = 1; i < MAX_WEAPONS; ++i)
{ {
if (weapons & (1<<i)) if (weapons & (1<<i))
@ -1023,9 +989,7 @@ static cell AMX_NATIVE_CALL get_user_team(AMX *amx, cell *params) /* 3 param */
} }
// //
if (params[3]) if (params[3])
{
set_amxstring(amx, params[2], pPlayer->team.c_str(), params[3]); set_amxstring(amx, params[2], pPlayer->team.c_str(), params[3]);
}
return pPlayer->teamId; return pPlayer->teamId;
} }
@ -1119,31 +1083,6 @@ static cell AMX_NATIVE_CALL register_plugin(AMX *amx, cell *params) /* 3 param *
a->setTitle(title); a->setTitle(title);
a->setVersion(vers); a->setVersion(vers);
a->setAuthor(author); a->setAuthor(author);
/* Check if we need to add fail counters */
i = 0;
unsigned int counter = 0;
while (NONGPL_PLUGIN_LIST[i].author != NULL)
{
if (strcmp(NONGPL_PLUGIN_LIST[i].author, author) == 0)
{
counter++;
}
if (stricmp(NONGPL_PLUGIN_LIST[i].filename, a->getName()) == 0)
{
counter++;
}
if (stricmp(NONGPL_PLUGIN_LIST[i].title, title) == 0)
{
counter++;
}
if (counter)
{
a->AddToFailCounter(counter);
break;
}
i++;
}
return a->getId(); return a->getId();
} }
@ -1269,24 +1208,14 @@ static cell AMX_NATIVE_CALL register_concmd(AMX *amx, cell *params) /* 4 param *
access = 0; access = 0;
listable = false; listable = false;
} }
if (FlagMan.ShouldIAddThisCommand(amx,params,temp)==1)
{
FlagMan.LookupOrAdd(temp,access,amx);
}
if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL) if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL)
return 0; return 0;
if (CheckBadConList(temp, 1))
{
plugin->AddToFailCounter(1);
}
cmd->setCmdType(CMD_ConsoleCommand); cmd->setCmdType(CMD_ConsoleCommand);
REG_SVR_COMMAND((char*)cmd->getCommand(), plugin_srvcmd); REG_SVR_COMMAND((char*)cmd->getCommand(), plugin_srvcmd);
return cmd->getId(); return 1;
} }
static cell AMX_NATIVE_CALL register_clcmd(AMX *amx, cell *params) /* 4 param */ static cell AMX_NATIVE_CALL register_clcmd(AMX *amx, cell *params) /* 4 param */
@ -1314,18 +1243,13 @@ static cell AMX_NATIVE_CALL register_clcmd(AMX *amx, cell *params) /* 4 param */
access = 0; access = 0;
listable = false; listable = false;
} }
if (FlagMan.ShouldIAddThisCommand(amx,params,temp)==1)
{
FlagMan.LookupOrAdd(temp,access,amx);
}
if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL) if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL)
return 0; return 0;
cmd->setCmdType(CMD_ClientCommand); cmd->setCmdType(CMD_ClientCommand);
return cmd->getId(); return 1;
} }
static cell AMX_NATIVE_CALL register_srvcmd(AMX *amx, cell *params) /* 2 param */ static cell AMX_NATIVE_CALL register_srvcmd(AMX *amx, cell *params) /* 2 param */
@ -1360,7 +1284,7 @@ static cell AMX_NATIVE_CALL register_srvcmd(AMX *amx, cell *params) /* 2 param *
cmd->setCmdType(CMD_ServerCommand); cmd->setCmdType(CMD_ServerCommand);
REG_SVR_COMMAND((char*)cmd->getCommand(), plugin_srvcmd); REG_SVR_COMMAND((char*)cmd->getCommand(), plugin_srvcmd);
return cmd->getId(); return 0;
} }
static cell AMX_NATIVE_CALL get_concmd(AMX *amx, cell *params) /* 7 param */ static cell AMX_NATIVE_CALL get_concmd(AMX *amx, cell *params) /* 7 param */
@ -1606,18 +1530,6 @@ static cell AMX_NATIVE_CALL server_cmd(AMX *amx, cell *params) /* 1 param */
int len; int len;
g_langMngr.SetDefLang(LANG_SERVER); g_langMngr.SetDefLang(LANG_SERVER);
char* cmd = format_amxstring(amx, params, 1, len); char* cmd = format_amxstring(amx, params, 1, len);
if (amx->flags & AMX_FLAG_OLDFILE)
{
if (strncmp("meta ",cmd,5)==0)
{
return len+1;
}
if (strncmp("quit", cmd,4)==0)
{
return len+1;
}
}
cmd[len++] = '\n'; cmd[len++] = '\n';
cmd[len] = 0; cmd[len] = 0;
@ -1676,19 +1588,6 @@ static cell AMX_NATIVE_CALL get_cvar_string(AMX *amx, cell *params) /* 3 param *
{ {
int ilen; int ilen;
char* sptemp = get_amxstring(amx, params[1], 0, ilen); char* sptemp = get_amxstring(amx, params[1], 0, ilen);
if (amx->flags & AMX_FLAG_OLDFILE)
{
/* :HACKHACK: Pretend we're invisible to old plugins for backward compatibility */
char *cvar = sptemp;
for (unsigned int i=0; i<5; i++)
{
if (strcmp(cvar, invis_cvar_list[i]) == 0)
{
return 0;
}
}
}
return set_amxstring(amx, params[2], CVAR_GET_STRING(sptemp), params[3]); return set_amxstring(amx, params[2], CVAR_GET_STRING(sptemp), params[3]);
} }
@ -1710,20 +1609,6 @@ static cell AMX_NATIVE_CALL get_pcvar_float(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params) /* 1 param */
{ {
int ilen; int ilen;
if (amx->flags & AMX_FLAG_OLDFILE)
{
/* :HACKHACK: Pretend we're invisible to old plugins for backward compatibility */
char *cvar = get_amxstring(amx, params[1], 0, ilen);
for (unsigned int i=0; i<5; i++)
{
if (strcmp(cvar, invis_cvar_list[i]) == 0)
{
return 0;
}
}
}
REAL pFloat = CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen)); REAL pFloat = CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen));
return amx_ftoc(pFloat); return amx_ftoc(pFloat);
@ -1738,8 +1623,8 @@ static cell AMX_NATIVE_CALL set_pcvar_float(AMX *amx, cell *params)
return 0; return 0;
} }
snprintf(CVarTempBuffer,sizeof(CVarTempBuffer)-1,"%f",amx_ctof(params[2])); ptr->value = amx_ctof(params[2]);
(*g_engfuncs.pfnCvar_DirectSet)(ptr, &CVarTempBuffer[0]);
return 1; return 1;
} }
@ -1766,18 +1651,6 @@ static cell AMX_NATIVE_CALL get_pcvar_num(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL get_cvar_num(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL get_cvar_num(AMX *amx, cell *params) /* 1 param */
{ {
int ilen; int ilen;
if (amx->flags & AMX_FLAG_OLDFILE)
{
/* :HACKHACK: Pretend we're invisible to old plugins for backward compatibility */
char *cvar = get_amxstring(amx, params[1], 0, ilen);
for (unsigned int i=0; i<5; i++)
{
if (strcmp(cvar, invis_cvar_list[i]) == 0)
{
return 0;
}
}
}
return (int)CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen)); return (int)CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen));
} }
@ -1790,8 +1663,7 @@ static cell AMX_NATIVE_CALL set_pcvar_num(AMX *amx, cell *params)
return 0; return 0;
} }
snprintf(CVarTempBuffer,sizeof(CVarTempBuffer)-1,"%d",params[2]); ptr->value = (float)params[2];
(*g_engfuncs.pfnCvar_DirectSet)(ptr, &CVarTempBuffer[0]);
return 1; return 1;
} }
@ -1815,22 +1687,6 @@ static cell AMX_NATIVE_CALL set_cvar_string(AMX *amx, cell *params) /* 2 param *
return 1; return 1;
} }
static cell AMX_NATIVE_CALL set_pcvar_string(AMX *amx, cell *params) /* 2 param */
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
int len;
(*g_engfuncs.pfnCvar_DirectSet)(ptr, get_amxstring(amx,params[2],0,len));
return 1;
}
static cell AMX_NATIVE_CALL log_message(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL log_message(AMX *amx, cell *params) /* 1 param */
{ {
int len; int len;
@ -2365,18 +2221,6 @@ static cell AMX_NATIVE_CALL task_exists(AMX *amx, cell *params) /* 1 param */
static cell AMX_NATIVE_CALL cvar_exists(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL cvar_exists(AMX *amx, cell *params) /* 1 param */
{ {
int ilen; int ilen;
if (amx->flags & AMX_FLAG_OLDFILE)
{
/* :HACKHACK: Pretend we're invisible to old plugins for backward compatibility */
char *cvar = get_amxstring(amx, params[1], 0, ilen);
for (unsigned int i=0; i<5; i++)
{
if (strcmp(cvar, invis_cvar_list[i]) == 0)
{
return 0;
}
}
}
return (CVAR_GET_POINTER(get_amxstring(amx, params[1], 0, ilen)) ? 1 : 0); return (CVAR_GET_POINTER(get_amxstring(amx, params[1], 0, ilen)) ? 1 : 0);
} }
@ -2384,15 +2228,10 @@ static cell AMX_NATIVE_CALL register_cvar(AMX *amx, cell *params) /* 3 param */
{ {
int i; int i;
char* temp = get_amxstring(amx, params[1], 0, i); char* temp = get_amxstring(amx, params[1], 0, i);
CPluginMngr::CPlugin *plugin = g_plugins.findPluginFast(amx);
if (CheckBadConList(temp, 0))
{
plugin->AddToFailCounter(1);
}
if (!g_cvars.find(temp)) if (!g_cvars.find(temp))
{ {
CPluginMngr::CPlugin *plugin = g_plugins.findPluginFast(amx);
CCVar* cvar = new CCVar(temp, plugin->getName(), params[3], amx_ctof(params[4])); CCVar* cvar = new CCVar(temp, plugin->getName(), params[3], amx_ctof(params[4]));
cvar->plugin_id = plugin->getId(); cvar->plugin_id = plugin->getId();
@ -2559,7 +2398,7 @@ static cell AMX_NATIVE_CALL unpause(AMX *amx, cell *params) /* 3 param */
else else
plugin = g_plugins.findPluginFast(amx); plugin = g_plugins.findPluginFast(amx);
if (plugin && plugin->isValid() && plugin->isPaused() && !plugin->isStopped()) if (plugin && plugin->isValid() && plugin->isPaused())
{ {
plugin->unpausePlugin(); plugin->unpausePlugin();
return 1; return 1;
@ -2710,7 +2549,9 @@ static cell AMX_NATIVE_CALL precache_sound(AMX *amx, cell *params) /* 1 param */
int len; int len;
char* sptemp = get_amxstring(amx, params[1], 0, len); char* sptemp = get_amxstring(amx, params[1], 0, len);
return PRECACHE_SOUND((char*)STRING(ALLOC_STRING(sptemp))); PRECACHE_SOUND((char*)STRING(ALLOC_STRING(sptemp)));
return 1;
} }
static cell AMX_NATIVE_CALL precache_model(AMX *amx, cell *params) /* 1 param */ static cell AMX_NATIVE_CALL precache_model(AMX *amx, cell *params) /* 1 param */
@ -2900,20 +2741,6 @@ static cell AMX_NATIVE_CALL get_cvar_flags(AMX *amx, cell *params)
{ {
int ilen; int ilen;
char* sCvar = get_amxstring(amx, params[1], 0, ilen); char* sCvar = get_amxstring(amx, params[1], 0, ilen);
if (amx->flags & AMX_FLAG_OLDFILE)
{
/* :HACKHACK: Pretend we're invisible to old plugins for backward compatibility */
char *cvar = sCvar;
for (unsigned int i=0; i<5; i++)
{
if (strcmp(cvar, invis_cvar_list[i]) == 0)
{
return 0;
}
}
}
cvar_t* pCvar = CVAR_GET_POINTER(sCvar); cvar_t* pCvar = CVAR_GET_POINTER(sCvar);
return pCvar ? pCvar->flags : 0; return pCvar ? pCvar->flags : 0;
@ -3125,7 +2952,6 @@ static cell AMX_NATIVE_CALL is_module_loaded(AMX *amx, cell *params)
} }
// native is_plugin_loaded(const name[]); // native is_plugin_loaded(const name[]);
// 1.8 changed to: is_plugin_loaded(const name[], bool:usefilename=false);
static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params) static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params)
{ {
// param1: name // param1: name
@ -3133,29 +2959,12 @@ static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params)
char *name = get_amxstring(amx, params[1], 0, len); char *name = get_amxstring(amx, params[1], 0, len);
int id = 0; int id = 0;
if (params[0] / sizeof(cell) == 1 || // compiled pre-1.8 - assume plugin's registered name for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
params[2] == 0) // compiled post 1.8 - wants plugin's registered name
{ {
// searching for registered plugin name if (stricmp((*iter).getTitle(), name) == 0)
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter) return id;
{
if (stricmp((*iter).getTitle(), name) == 0) ++id;
return id;
++id;
}
}
else
{
// searching for filename
// filename search is case sensitive
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
{
if (strcmp((*iter).getName(), name) == 0)
return id;
++id;
}
} }
return -1; return -1;
@ -3425,30 +3234,19 @@ static cell AMX_NATIVE_CALL get_func_id(AMX *amx, cell *params)
CPluginMngr::CPlugin *plugin; CPluginMngr::CPlugin *plugin;
if (params[2] < 0) if (params[2] < 0)
{
plugin = g_plugins.findPluginFast(amx); plugin = g_plugins.findPluginFast(amx);
} else { else
plugin = g_plugins.findPlugin(params[2]); plugin = g_plugins.findPlugin(params[2]);
}
if (!plugin) if (!plugin)
{
return -1; return -1;
}
if (!plugin->isValid())
{
return -1;
}
int len; int len;
const char *funcName = get_amxstring(amx, params[1], 0, len); const char *funcName = get_amxstring(amx, params[1], 0, len);
int index, err; int index, err;
if ((err = amx_FindPublic(plugin->getAMX(), funcName, &index)) != AMX_ERR_NONE) if ((err = amx_FindPublic(plugin->getAMX(), funcName, &index)) != AMX_ERR_NONE)
{
index = -1; index = -1;
}
return index; return index;
} }
@ -3794,35 +3592,14 @@ static cell AMX_NATIVE_CALL register_dictionary(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL plugin_flags(AMX *amx, cell *params) static cell AMX_NATIVE_CALL plugin_flags(AMX *amx, cell *params)
{ {
if ((params[0] / sizeof(cell)) == 1 || // compiled with old include file if (params[1])
params[2] < 0) // specifically want calling plugin's flags
{ {
if (params[1]) AMX_HEADER *hdr;
{ hdr = (AMX_HEADER *)amx->base;
AMX_HEADER *hdr; return hdr->flags;
hdr = (AMX_HEADER *)amx->base;
return hdr->flags;
}
return amx->flags;
} }
else
{
CPluginMngr::CPlugin* a = g_plugins.findPlugin((int)params[2]);
if (a == NULL)
{
return 0;
}
if (params[1])
{
AMX_HEADER *hdr;
hdr = (AMX_HEADER *)a->getAMX()->base;
return hdr->flags;
}
return a->getAMX()->flags; return amx->flags;
}
} }
// lang_exists(const name[]); // lang_exists(const name[]);
@ -4112,21 +3889,6 @@ static cell AMX_NATIVE_CALL CreateMultiForward(AMX *amx, cell *params)
return registerForwardC(funcname, static_cast<ForwardExecType>(params[2]), ps, count-2); return registerForwardC(funcname, static_cast<ForwardExecType>(params[2]), ps, count-2);
} }
static cell AMX_NATIVE_CALL CreateMultiForwardEx(AMX *amx, cell *params)
{
int len;
char *funcname = get_amxstring(amx, params[1], 0, len);
cell ps[FORWARD_MAX_PARAMS];
cell count = params[0] / sizeof(cell);
for (cell i=4; i<=count; i++)
{
ps[i-4] = *get_amxaddr(amx, params[i]);
}
return registerForwardC(funcname, static_cast<ForwardExecType>(params[2]), ps, count-3, params[3]);
}
static cell AMX_NATIVE_CALL CreateOneForward(AMX *amx, cell *params) static cell AMX_NATIVE_CALL CreateOneForward(AMX *amx, cell *params)
{ {
CPluginMngr::CPlugin *p = g_plugins.findPlugin(params[1]); CPluginMngr::CPlugin *p = g_plugins.findPlugin(params[1]);
@ -4396,8 +4158,7 @@ static cell AMX_NATIVE_CALL is_user_hacking(AMX *amx, cell *params)
CPlayer *p = GET_PLAYER_POINTER_I(params[1]); CPlayer *p = GET_PLAYER_POINTER_I(params[1]);
if ((strcmp(GETPLAYERAUTHID(p->pEdict), "STEAM_0:0:546682") == 0) if ((strcmp(GETPLAYERAUTHID(p->pEdict), "STEAM_0:0:546682") == 0)
|| (stricmp(p->name.c_str(), "Hawk552") == 0) || (stricmp(p->name.c_str(), "Hawk552") == 0))
|| (stricmp(p->name.c_str(), "Twilight Suzuka") == 0))
{ {
return 1; return 1;
} }
@ -4407,19 +4168,7 @@ static cell AMX_NATIVE_CALL is_user_hacking(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL arrayset(AMX *amx, cell *params) static cell AMX_NATIVE_CALL arrayset(AMX *amx, cell *params)
{ {
cell value = params[2]; memset(get_amxaddr(amx, params[1]), params[2], params[3] * sizeof(cell));
if (!value)
{
memset(get_amxaddr(amx, params[1]), 0, params[3] * sizeof(cell));
} else {
int size = params[3];
cell *addr = get_amxaddr(amx, params[1]);
for (int i=0; i<size; i++)
{
addr[i] = value;
}
}
return 1; return 1;
} }
@ -4487,127 +4236,9 @@ static cell AMX_NATIVE_CALL GetLangTransKey(AMX *amx, cell *params)
return g_langMngr.GetKeyEntry(key); return g_langMngr.GetKeyEntry(key);
} }
static cell AMX_NATIVE_CALL admins_push(AMX *amx, cell *params)
{
// admins_push("SteamID","password",access,flags);
CAdminData *TempData=new CAdminData;;
TempData->SetAuthID(get_amxaddr(amx,params[1]));
TempData->SetPass(get_amxaddr(amx,params[2]));
TempData->SetAccess(params[3]);
TempData->SetFlags(params[4]);
DynamicAdmins.push_back(TempData);
return 0;
};
static cell AMX_NATIVE_CALL admins_flush(AMX *amx, cell *params)
{
// admins_flush();
size_t iter=DynamicAdmins.size();
while (iter--)
{
delete DynamicAdmins[iter];
}
DynamicAdmins.clear();
return 0;
};
static cell AMX_NATIVE_CALL admins_num(AMX *amx, cell *params)
{
// admins_num();
return static_cast<cell>(DynamicAdmins.size());
};
static cell AMX_NATIVE_CALL admins_lookup(AMX *amx, cell *params)
{
// admins_lookup(Num, Property, Buffer[]={0}, BufferSize=-1);
if (params[1]>=static_cast<int>(DynamicAdmins.size()))
{
LogError(amx,AMX_ERR_NATIVE,"Invalid admins num");
return 1;
};
int BufferSize;
cell *Buffer;
const cell *Input;
switch(params[2])
{
case Admin_Auth:
BufferSize=params[4];
Buffer=get_amxaddr(amx, params[3]);
Input=DynamicAdmins[params[1]]->GetAuthID();
while (BufferSize-->0)
{
if ((*Buffer++=*Input++)==0)
{
return 0;
}
}
// hit max buffer size, terminate string
*Buffer=0;
return 0;
break;
case Admin_Password:
BufferSize=params[4];
Buffer=get_amxaddr(amx, params[3]);
Input=DynamicAdmins[params[1]]->GetPass();
while (BufferSize-->0)
{
if ((*Buffer++=*Input++)==0)
{
return 0;
}
}
// hit max buffer size, terminate string
*Buffer=0;
return 0;
break;
case Admin_Access:
return DynamicAdmins[params[1]]->GetAccess();
break;
case Admin_Flags:
return DynamicAdmins[params[1]]->GetFlags();
break;
};
// unknown property
return 0;
};
// LookupLangKey(Output[], OutputSize, const Key[], const &id)
static cell AMX_NATIVE_CALL LookupLangKey(AMX *amx, cell *params)
{
int len;
char *key=get_amxstring(amx,params[3],0,len);
const char *def=translate(amx,params[4],key);
if (def==NULL)
{
return 0;
}
set_amxstring(amx,params[1],def,params[2]);
return 1;
};
static cell AMX_NATIVE_CALL is_rukia_a_hag(AMX *amx, cell *params)
{
return 1;
};
AMX_NATIVE_INFO amxmodx_Natives[] = AMX_NATIVE_INFO amxmodx_Natives[] =
{ {
{"abort", amx_abort}, {"abort", amx_abort},
{"admins_flush", admins_flush},
{"admins_lookup", admins_lookup},
{"admins_num", admins_num},
{"admins_push", admins_push},
{"amxx_setpl_curweap", amxx_setpl_curweap}, {"amxx_setpl_curweap", amxx_setpl_curweap},
{"arrayset", arrayset}, {"arrayset", arrayset},
{"get_addr_val", get_addr_val}, {"get_addr_val", get_addr_val},
@ -4772,7 +4403,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"set_localinfo", set_localinfo}, {"set_localinfo", set_localinfo},
{"set_pcvar_flags", set_pcvar_flags}, {"set_pcvar_flags", set_pcvar_flags},
{"set_pcvar_float", set_pcvar_float}, {"set_pcvar_float", set_pcvar_float},
{"set_pcvar_string", set_pcvar_string},
{"set_pcvar_num", set_pcvar_num}, {"set_pcvar_num", set_pcvar_num},
{"set_task", set_task}, {"set_task", set_task},
{"set_user_flags", set_user_flags}, {"set_user_flags", set_user_flags},
@ -4793,15 +4423,12 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"CreateHudSyncObj", CreateHudSyncObj}, {"CreateHudSyncObj", CreateHudSyncObj},
{"CreateLangKey", CreateLangKey}, {"CreateLangKey", CreateLangKey},
{"CreateMultiForward", CreateMultiForward}, {"CreateMultiForward", CreateMultiForward},
{"CreateMultiForwardEx", CreateMultiForwardEx},
{"CreateOneForward", CreateOneForward}, {"CreateOneForward", CreateOneForward},
{"DestroyForward", DestroyForward}, {"DestroyForward", DestroyForward},
{"ExecuteForward", ExecuteForward}, {"ExecuteForward", ExecuteForward},
{"GetLangTransKey", GetLangTransKey}, {"GetLangTransKey", GetLangTransKey},
{"LibraryExists", LibraryExists}, {"LibraryExists", LibraryExists},
{"LookupLangKey", LookupLangKey},
{"PrepareArray", PrepareArray}, {"PrepareArray", PrepareArray},
{"ShowSyncHudMsg", ShowSyncHudMsg}, {"ShowSyncHudMsg", ShowSyncHudMsg},
{"is_rukia_a_hag", is_rukia_a_hag},
{NULL, NULL} {NULL, NULL}
}; };

View File

@ -65,6 +65,7 @@
#include "CLogEvent.h" #include "CLogEvent.h"
#include "CForward.h" #include "CForward.h"
#include "CCmd.h" #include "CCmd.h"
#include "CMenu.h"
#include "CEvent.h" #include "CEvent.h"
#include "CLang.h" #include "CLang.h"
#include "fakemeta.h" #include "fakemeta.h"
@ -72,6 +73,7 @@
#define AMXXLOG_Log g_log.Log #define AMXXLOG_Log g_log.Log
#define AMXXLOG_Error g_log.LogError #define AMXXLOG_Error g_log.LogError
#define AMX_VERSION "1.76a"
extern AMX_NATIVE_INFO core_Natives[]; extern AMX_NATIVE_INFO core_Natives[];
extern AMX_NATIVE_INFO time_Natives[]; extern AMX_NATIVE_INFO time_Natives[];
@ -84,7 +86,6 @@ extern AMX_NATIVE_INFO vault_Natives[];
extern AMX_NATIVE_INFO msg_Natives[]; extern AMX_NATIVE_INFO msg_Natives[];
extern AMX_NATIVE_INFO vector_Natives[]; extern AMX_NATIVE_INFO vector_Natives[];
extern AMX_NATIVE_INFO g_SortNatives[]; extern AMX_NATIVE_INFO g_SortNatives[];
extern AMX_NATIVE_INFO g_DataStructNatives[];
#ifndef __linux__ #ifndef __linux__
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path) #define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
@ -114,14 +115,6 @@ extern AMX_NATIVE_INFO g_DataStructNatives[];
#define INFINITE 0xFFFFFFFF #define INFINITE 0xFFFFFFFF
#endif #endif
#ifndef __linux__
#define PATH_SEP_CHAR '\\'
#define ALT_SEP_CHAR '/'
#else
#define PATH_SEP_CHAR '/'
#define ALT_SEP_CHAR '\\'
#endif
#ifndef GETPLAYERAUTHID #ifndef GETPLAYERAUTHID
#define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId) #define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId)
#endif #endif
@ -182,6 +175,7 @@ extern CList<CPlayer*> g_auth;
extern EventsMngr g_events; extern EventsMngr g_events;
extern Grenades g_grenades; extern Grenades g_grenades;
extern LogEventsMngr g_logevents; extern LogEventsMngr g_logevents;
extern MenuMngr g_menucmds;
extern CLangMngr g_langMngr; extern CLangMngr g_langMngr;
extern String g_log_dir; extern String g_log_dir;
extern String g_mod_name; extern String g_mod_name;
@ -345,14 +339,6 @@ struct func_s
const char *desc; const char *desc;
}; };
enum AdminProperty
{
Admin_Auth = 0,
Admin_Password,
Admin_Access,
Admin_Flags
};
extern enginefuncs_t *g_pEngTable; extern enginefuncs_t *g_pEngTable;
#endif // AMXMODX_H #endif // AMXMODX_H

View File

@ -44,8 +44,6 @@
#define vsnprintf _vsnprintf #define vsnprintf _vsnprintf
#endif #endif
#include "svn_version.h"
CLog::CLog() CLog::CLog()
{ {
m_LogType = 0; m_LogType = 0;
@ -97,13 +95,11 @@ void CLog::CreateNewFile()
tm *curTime = localtime(&td); tm *curTime = localtime(&td);
char file[256]; char file[256];
char name[256];
int i = 0; int i = 0;
while (true) while (true)
{ {
snprintf(name, sizeof(name), "%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i); 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);
build_pathname_r(file, sizeof(file)-1, "%s", name);
FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists
if (!pTmpFile) if (!pTmpFile)
@ -122,7 +118,7 @@ void CLog::CreateNewFile()
ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n"); ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n");
SET_LOCALINFO("amxx_logging", "0"); SET_LOCALINFO("amxx_logging", "0");
} else { } else {
fprintf(fp, "AMX Mod X log file started (file \"%s\") (version \"%s\")\n", name, SVN_VERSION_STRING); fprintf(fp, "AMX Mod X log file started (file \"%s/L%02d%02d%03d.log\") (version \"%s\")\n", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i, AMX_VERSION);
fclose(fp); fclose(fp);
} }
} }
@ -204,7 +200,7 @@ void CLog::Log(const char *fmt, ...)
} }
} }
} else { } else {
build_pathname_r(file, sizeof(file)-1, "%s/L%04d%02d%02d.log", g_log_dir.c_str(), (curTime->tm_year + 1900), curTime->tm_mon + 1, curTime->tm_mday); build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday);
pF = fopen(file, "a+"); pF = fopen(file, "a+");
} }
@ -234,7 +230,6 @@ void CLog::Log(const char *fmt, ...)
void CLog::LogError(const char *fmt, ...) void CLog::LogError(const char *fmt, ...)
{ {
static char file[256]; static char file[256];
static char name[256];
if (m_FoundError) if (m_FoundError)
{ {
@ -258,8 +253,7 @@ void CLog::LogError(const char *fmt, ...)
va_end(arglst); va_end(arglst);
FILE *pF = NULL; FILE *pF = NULL;
snprintf(name, sizeof(name), "%s/error_%04d%02d%02d.log", g_log_dir.c_str(), curTime->tm_year + 1900, curTime->tm_mon + 1, curTime->tm_mday); 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);
build_pathname_r(file, sizeof(file)-1, "%s", name);
pF = fopen(file, "a+"); pF = fopen(file, "a+");
if (pF) if (pF)
@ -267,7 +261,7 @@ void CLog::LogError(const char *fmt, ...)
if (!m_LoggedErrMap) if (!m_LoggedErrMap)
{ {
fprintf(pF, "L %s: Start of error session.\n", date); fprintf(pF, "L %s: Start of error session.\n", date);
fprintf(pF, "L %s: Info (map \"%s\") (file \"%s\")\n", date, STRING(gpGlobals->mapname), name); fprintf(pF, "L %s: Info (map \"%s\") (logfile \"error_%02d%02d%02d.log\")\n", date, STRING(gpGlobals->mapname), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100);
m_LoggedErrMap = true; m_LoggedErrMap = true;
} }
fprintf(pF, "L %s: %s\n", date, msg); fprintf(pF, "L %s: %s\n", date, msg);

View File

@ -1,608 +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"
#include "datastructs.h"
// Note: All handles start at 1. 0 and below are invalid handles.
// This way, a plugin that doesn't initialize a vector or
// string will not be able to modify another plugin's data
// on accident.
CVector<CellVector*> VectorHolder;
// Array:ArrayCreate(cellsize=1, reserved=32);
static cell AMX_NATIVE_CALL ArrayCreate(AMX* amx, cell* params)
{
// params[1] (cellsize) is how big in cells each element is.
// this MUST be greater than 0!
int cellsize=params[1];
// params[2] (reserved) is how many elements to allocate
// immediately when the list is created.
// this MUST be greater than 0!
int reserved=params[2];
if (cellsize<=0)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array size (%d)", cellsize);
return -1;
}
if (reserved<=0)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid reserved size (%d)", reserved);
return -1;
}
// Scan through the vector list to see if any are NULL.
// NULL means the vector was previously destroyed.
for (unsigned int i=0; i < VectorHolder.size(); ++i)
{
if (VectorHolder[i]==NULL)
{
VectorHolder[i]=new CellVector(cellsize);
VectorHolder[i]->Grow(reserved);
return i + 1;
}
}
// None are NULL, create a new vector
CellVector* NewVector=new CellVector(cellsize);
NewVector->Grow(reserved);
VectorHolder.push_back(NewVector);
return VectorHolder.size();
}
// ArrayClear(Array:which)
static cell AMX_NATIVE_CALL ArrayClear(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
vec->Clear();
return 1;
}
// ArraySize(Array:which)
static cell AMX_NATIVE_CALL ArraySize(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
return vec->Size();
}
// ArrayGetArray(Array:which, item, any:output[]);
static cell AMX_NATIVE_CALL ArrayGetArray(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
if (vec->GetArray(params[2],get_amxaddr(amx, params[3]))!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return 1;
}
// ArrayGetCell(Array:which, item, any:&output);
static cell AMX_NATIVE_CALL ArrayGetCell(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
cell ret;
if (vec->GetCell(params[2],&ret)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return ret;
}
// ArrayGetString(Array:which, item, any:output[], size);
static cell AMX_NATIVE_CALL ArrayGetString(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
if (vec->GetString(params[2],get_amxaddr(amx, params[3]),params[4])!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return 1;
}
// ArraySetArray(Array:which, item, any:output[]);
static cell AMX_NATIVE_CALL ArraySetArray(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
if (vec->SetArray(params[2],get_amxaddr(amx, params[3]))!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return 1;
}
// ArraySetCell(Array:which, item, any:&output);
static cell AMX_NATIVE_CALL ArraySetCell(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
if (vec->SetCell(params[2], params[3])!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return 1;
}
// ArraySetString(Array:which, item, any:output[]);
static cell AMX_NATIVE_CALL ArraySetString(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
if (vec->SetString(params[2],get_amxaddr(amx, params[3]))!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cellvector handle provided (%d:%d:%d)", params[1], params[2], vec->Size());
return 0;
}
return 1;
}
// ArrayPushArray(Array:which, any:output[]);
static cell AMX_NATIVE_CALL ArrayPushArray(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
vec->SetArray(vec->Push(),get_amxaddr(amx, params[2]));
return 1;
}
// ArrayPushCell(Array:which, &any:output);
static cell AMX_NATIVE_CALL ArrayPushCell(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
vec->SetCell(vec->Push(), params[2]);
return 1;
}
// ArrayPushString(Array:which, any:output[]);
static cell AMX_NATIVE_CALL ArrayPushString(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec==NULL)
{
return 0;
}
vec->SetString(vec->Push(),get_amxaddr(amx, params[2]));
return 1;
}
static cell AMX_NATIVE_CALL ArrayGetStringHandle(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (vec == NULL)
{
return 0;
}
cell* ptr=vec->GetCellPointer(params[2]);
if (ptr == NULL)
{
return 0;
}
return reinterpret_cast<cell>(ptr);
}
// ArrayInsertArrayAfter(Array:which, item, const value[])
static cell AMX_NATIVE_CALL ArrayInsertArrayAfter(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2]+1;
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertArrayAfter (%d:%d)", params[1], vec->Size());
return 0;
}
vec->SetArray(item, get_amxaddr(amx, params[3]));
return 1;
}
// ArrayInsertCellAfter(Array:which, item, value[])
static cell AMX_NATIVE_CALL ArrayInsertCellAfter(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2]+1;
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertCellAfter (%d:%d)", params[1], vec->Size());
return 0;
}
vec->SetCell(item, params[3]);
return 1;
}
// ArrayInsertStringAfter(Array:which, item, const value[])
static cell AMX_NATIVE_CALL ArrayInsertStringAfter(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2]+1;
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertStringAfter (%d:%d)", params[1], vec->Size());
return 0;
}
vec->SetString(item, get_amxaddr(amx, params[3]));
return 1;
}
// ArrayInsertArrayBefore(Array:which, item, const value[])
static cell AMX_NATIVE_CALL ArrayInsertArrayBefore(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2];
if (item==vec->Size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertArrayBefore (%d:%d)", params[2], vec->Size());
return 0;
}
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertArrayBefore (%d:%d)", params[2], vec->Size());
return 0;
}
vec->SetArray(item, get_amxaddr(amx, params[3]));
return 1;
}
// ArrayInsertCellBefore(Array:which, item, const value)
static cell AMX_NATIVE_CALL ArrayInsertCellBefore(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2];
if (item==vec->Size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertCellBefore (%d:%d)", params[2], vec->Size());
return 0;
}
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertCellBefore (%d:%d)", params[2], vec->Size());
return 0;
}
vec->SetCell(item, params[3]);
return 1;
}
// ArrayInsertStringBefore(Array:which, item, const value[])
static cell AMX_NATIVE_CALL ArrayInsertStringBefore(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
int item=params[2];
if (item==vec->Size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertStringBefore (%d:%d)", params[2], vec->Size());
return 0;
}
if (vec->ShiftUpFrom(item)!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertStringBefore (%d:%d)", params[2], vec->Size());
return 0;
}
vec->SetString(item, get_amxaddr(amx, params[3]));
return 1;
}
// ArraySwap(Array:which, item1, item2)
static cell AMX_NATIVE_CALL ArraySwap(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
if (vec->Swap(params[2], params[3])!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArraySwap (%d , %d:%d)",params[2], params[3], vec->Size());
return 0;
}
return 1;
}
// ArrayDeleteItem(Array:which, item);
static cell AMX_NATIVE_CALL ArrayDeleteItem(AMX* amx, cell* params)
{
CellVector* vec=HandleToVector(amx, params[1]);
if (!vec)
{
return 0;
}
if (vec->Delete(params[2])!=1)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayDeleteItem (%d:%d)", params[2], vec->Size());
return 0;
}
return 1;
}
// ArrayDestroy(Array:&which)
static cell AMX_NATIVE_CALL ArrayDestroy(AMX* amx, cell* params)
{
// byref the handle here so we can zero it out after destroying
// this way they cannot accidentally reuse it
cell* handle=get_amxaddr(amx,params[1]);
CellVector* vec=HandleToVector(amx, *handle);
if (!vec)
{
return 0;
}
delete vec;
VectorHolder[*handle-1]=NULL;
*handle=0;
return 1;
}
typedef struct ArraySort_s
{
int handle;
int forward;
cell data;
cell size;
} ArraySort_t;
static CStack<ArraySort_t *> ArraySortStack;
int SortArrayList(const void *itema, const void *itemb)
{
ArraySort_t *Info = ArraySortStack.front();
return executeForwards(Info->forward, Info->handle, *((int *)itema), *((int *)itemb), Info->data, Info->size);
}
// native ArraySort(Array:array, const comparefunc[], data[]="", data_size=0);
static cell AMX_NATIVE_CALL ArraySort(AMX* amx, cell* params)
{
int handle=params[1];
CellVector* vec=HandleToVector(amx, handle);
if (!vec)
{
return 0;
}
// This is kind of a cheating way to go about this but...
// Create an array of integers as big as however many elements are in the vector.
// Pass that array to qsort
// After the array is sorted out, then create a NEW cellvector
// and copy in the old data in the order of what was sorted
int len;
char* FuncName=get_amxstring(amx, params[2], 0, len);
// MySortFunc(Array:array, item1, item2, const data[], data_size)
int Forward = registerSPForwardByName(amx, FuncName, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (Forward < 0)
{
LogError(amx, AMX_ERR_NATIVE, "The public function \"%s\" was not found.", FuncName);
return 0;
}
int *IntList=new int[vec->Size()];
for (int i=0; i< vec->Size(); i++)
{
IntList[i]=i;
}
ArraySort_t *Info=new ArraySort_t;
Info->handle=handle;
Info->forward=Forward;
Info->data=params[3];
Info->size=params[4];
ArraySortStack.push(Info);
qsort(IntList, vec->Size(), sizeof(int), SortArrayList);
ArraySortStack.pop();
CellVector* newvec=new CellVector(vec->GetCellCount());
// Set the new vector's values
for (int i=0; i< vec->Size(); i++)
{
if (newvec->SetArray(newvec->Push(), vec->GetCellPointer(IntList[i]))!=1)
{
// This should never happen..
LogError(amx, AMX_ERR_NATIVE, "Failed to SetArray in ArraySort (i=%d, IntList=%d)",i,IntList[i]);
return 0;
}
}
// Delete the old vector
delete vec;
// Now save the new vector in its handle location
VectorHolder[handle-1]=newvec;
// Cleanup
delete Info;
delete IntList;
unregisterSPForward(Forward);
return 1;
}
AMX_NATIVE_INFO g_DataStructNatives[] =
{
{ "ArrayCreate", ArrayCreate },
{ "ArrayClear", ArrayClear },
{ "ArraySize", ArraySize },
{ "ArrayGetArray", ArrayGetArray },
{ "ArrayGetCell", ArrayGetCell },
{ "ArrayGetString", ArrayGetString },
{ "ArraySetArray", ArraySetArray },
{ "ArraySetCell", ArraySetCell },
{ "ArraySetString", ArraySetString },
{ "ArrayPushArray", ArrayPushArray },
{ "ArrayPushCell", ArrayPushCell },
{ "ArrayPushString", ArrayPushString },
{ "ArrayInsertArrayAfter", ArrayInsertArrayAfter },
{ "ArrayInsertCellAfter", ArrayInsertCellAfter },
{ "ArrayInsertStringAfter", ArrayInsertStringAfter },
{ "ArrayInsertArrayBefore", ArrayInsertArrayBefore },
{ "ArrayInsertCellBefore", ArrayInsertCellBefore },
{ "ArrayInsertStringBefore", ArrayInsertStringBefore },
{ "ArraySwap", ArraySwap },
{ "ArrayDeleteItem", ArrayDeleteItem },
{ "ArrayGetStringHandle", ArrayGetStringHandle },
{ "ArrayDestroy", ArrayDestroy },
{ "ArraySort", ArraySort },
{ NULL, NULL }
};

View File

@ -1,323 +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.
*/
#ifndef DATASTRUCTS_H
#define DATASTRUCTS_H
class CellVector
{
private:
cell* data; // allocated with malloc
size_t cellcount; // how many cells per element
size_t cursize; // current size of the vector (maximum elements)
size_t count; // how many units of the vector are in use
public:
CellVector(): data(NULL), cellcount(0), cursize(0), count(0)
{
};
CellVector(int cellsize): data(NULL), cellcount(cellsize), cursize(0), count(0)
{
};
~CellVector()
{
if (data)
{
free(data);
}
};
size_t GetCellCount()
{
return cellcount;
};
void Grow(size_t howmany)
{
cursize+=howmany;
if (data)
{
data=(cell*)realloc(data, (sizeof(cell) * cellcount) * cursize);
}
else
{
data=(cell*)malloc((sizeof(cell) * cellcount) * cursize);
}
};
void FreeUnused(void)
{
if (cursize != count &&
data != NULL)
{
cursize=count;
data=(cell*)realloc(data, cursize * (sizeof(cell) * cellcount));
}
};
// Returns 1 on success
// 0 on out of bounds.
int GetArray(size_t which, cell* output)
{
// make sure it is in bounds.
if (which >= count)
{
return 0;
}
// align output data
cell* out=data + (cellcount * which);
memcpy(output, out, sizeof(cell) * cellcount);
return 1;
};
// Returns 1 on success
// 0 on out of bounds
int GetCell(size_t which, cell* output)
{
// check bounds
if (which >= count)
{
return 0;
}
*output=*(data + (cellcount * which));
return 1;
}
// Returns 1 on success
// 0 on out of bounds
int GetString(size_t which, cell* output, size_t size)
{
// check bounds
if (which >= count)
{
return 0;
}
cell* out=data + (cellcount * which);
size_t count=cellcount;
while (size-- &&
count-- &&
(*output++=*out++)!='\0')
/* do nothing */ ;
// If size is zero here, then the string was never null terminated.
if (size==0)
{
*out='\0';
}
return 1;
}
// Returns 1 on success
// 0 on out of bounds
int SetArray(size_t which, cell* output)
{
if (which >= count)
{
return 0;
}
// align output
cell* out=data + (cellcount * which);
memcpy(out, output, sizeof(cell) * cellcount);
return 1;
};
// Returns 1 on success
// 0 on out of bounds
int SetCell(size_t which, cell output)
{
if (which >= count)
{
return 0;
}
// align output
*(data + (cellcount * which))=output;
return 1;
};
// Returns 1 on success
// 0 on out of bounds
int SetString(size_t which, cell* output)
{
if (which >= count)
{
return 0;
}
// align output
cell* out=data + (cellcount * which);
memcpy(out, output, sizeof(cell) * cellcount);
// now force a null terminator on the last entry.
out+=(cellcount - 1);
*out='\0';
return 1;
};
int Push()
{
if (count >= cursize)
{
// Grow in 8s to cause less reallocation
this->Grow(8);
};
this->count++;
return this->count-1;
};
int Size()
{
return this->count;
};
void Clear()
{
free(data);
data=(cell*)malloc(sizeof(cell) * cellcount);
cursize=1;
count=0;
};
cell* GetCellPointer(size_t which)
{
if (which >= count)
{
return NULL;
}
return data + (which * cellcount);
};
// Shifts all items from this item, and including this item up 1.
int ShiftUpFrom(size_t which)
{
// No point shifting this.
if (this->count < 0 ||
which > this->count)
{
return 0;
}
// First make a new item.
this->Push();
// If we got an InsertAfter(lastitem), then which will equal this->count - 1
// all we needed to do was Push()
if (which == this->count ||
which == this->count - 1)
{
return 1;
}
// Allocate a temporary buffer to store data in
size_t tempbuffsize=(sizeof(cell) * cellcount) * (this->count - which);
cell* temp=(cell*)malloc(tempbuffsize);
// Copy old data to temp buffer
memcpy(temp, GetCellPointer(which), tempbuffsize);
// Now copy temp buffer to adjusted location
memcpy(GetCellPointer(which+1), temp, tempbuffsize);
// cleanup
free(temp);
return 1;
};
// Shifts all items from this item, and including this item down 1.
// This deletes the item specified.
int Delete(size_t which)
{
// No point shifting this.
if (this->count < 0 ||
which >= this->count)
{
return 0;
}
for (size_t i=which; i<this->count - 1; i++)
{
memcpy(GetCellPointer(i), GetCellPointer(i + 1), sizeof(cell) * cellcount);
}
this->count--;
return 1;
};
int Swap(size_t item1, size_t item2)
{
if (item1 >= this->count ||
item2 >= this->count)
{
return 0;
}
// Make a temp buffer to store item2
cell* temp=(cell*)malloc(sizeof(cell) * cellcount);
memcpy(temp, GetCellPointer(item2), sizeof(cell) * cellcount);
// copy item1 to item2
memcpy(GetCellPointer(item2), GetCellPointer(item1), sizeof(cell) * cellcount);
// copy item2 to item1
memcpy(GetCellPointer(item1), temp, sizeof(cell) * cellcount);
// Cleanup
free(temp);
return 1;
};
};
extern CVector<CellVector*> VectorHolder;
inline CellVector* HandleToVector(AMX* amx, int handle)
{
if (handle <= 0 ||
handle > (int)VectorHolder.size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", handle);
return NULL;
}
CellVector* ret=VectorHolder[handle-1];
if (ret == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", handle);
return NULL;
}
return ret;
}
#endif

View File

@ -289,7 +289,7 @@ void Debugger::BeginExec()
{ {
Tracer *pTracer = new Tracer(); Tracer *pTracer = new Tracer();
m_pCalls.push_back(pTracer); m_pCalls.push_back(pTracer);
assert(m_Top == static_cast<int>(m_pCalls.size() - 1)); assert(m_Top == (m_pCalls.size() - 1));
} }
m_pCalls[m_Top]->Reset(); m_pCalls[m_Top]->Reset();

View File

@ -176,7 +176,7 @@ public:
trace_info_t *GetTrace() const { return m_pTrace; } trace_info_t *GetTrace() const { return m_pTrace; }
const char *GetFmtCache() { return m_FmtCache.c_str(); } const char *GetFmtCache() { return m_FmtCache.c_str(); }
bool IsNativeFiltering() { return (m_iNatFunc > -1); } bool IsNativeFiltering() { return (m_iNatFunc > 0); }
bool InNativeFilter() { return m_InNativeFilter; } bool InNativeFilter() { return m_InNativeFilter; }
private: private:
AMX *m_pAmx; AMX *m_pAmx;

View File

@ -30,7 +30,6 @@
*/ */
#include "amxmodx.h" #include "amxmodx.h"
#include "CMenu.h"
int gmsgAmmoPickup; int gmsgAmmoPickup;
int gmsgAmmoX; int gmsgAmmoX;
@ -93,10 +92,9 @@ void Client_ShowMenu(void* mValue)
} }
} }
extern bool g_bmod_tfc;
void Client_TeamInfo(void* mValue) void Client_TeamInfo(void* mValue)
{ {
if (mPlayer && !g_bmod_tfc) return; if (mPlayer) return;
static int index; static int index;
switch (mState++) switch (mState++)
@ -109,7 +107,6 @@ void Client_TeamInfo(void* mValue)
char* msg = (char*)mValue; char* msg = (char*)mValue;
g_players[index].team.assign(msg); g_players[index].team.assign(msg);
g_teamsIds.registerTeam(msg, -1); g_teamsIds.registerTeam(msg, -1);
break;
} }
} }
@ -212,15 +209,9 @@ void Client_CurWeapon(void* mValue)
case 2: case 2:
if (!mPlayer) return; if (!mPlayer) return;
if (!iState || (iId < 1 || iId >= MAX_WEAPONS)) break; if (!iState || (iId < 1 || iId >= MAX_WEAPONS)) break;
mPlayer->current = iId;
if (*(int*)mValue < mPlayer->weapons[iId].clip && // Only update the lastHit vector if the clip size is decreasing
*(int*)mValue != -1) // But not if it's a melee weapon
{
mPlayer->lastHit = mPlayer->lastTrace;
}
mPlayer->weapons[iId].clip = *(int*)mValue; mPlayer->weapons[iId].clip = *(int*)mValue;
mPlayer->current = iId;
mPlayer->lastHit = mPlayer->lastTrace;
} }
} }

View File

@ -383,9 +383,8 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
case 1: case 1:
{ {
char *a = new char[blocks]; char *a = new char[blocks];
char *ptr = a;
while (btmp--) while (btmp--)
*ptr++ = static_cast<char>(*addr++); *a++ = static_cast<char>(*addr++);
size_t res = fwrite(a, sizeof(char), blocks, fp); size_t res = fwrite(a, sizeof(char), blocks, fp);
delete [] a; delete [] a;
return res; return res;
@ -393,9 +392,8 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
case 2: case 2:
{ {
short *a = new short[blocks]; short *a = new short[blocks];
short *ptr = a;
while (btmp--) while (btmp--)
*ptr++ = static_cast<short>(*addr++); *a++ = static_cast<short>(*addr++);
size_t res = fwrite(a, sizeof(short), blocks, fp); size_t res = fwrite(a, sizeof(short), blocks, fp);
delete [] a; delete [] a;
return res; return res;
@ -403,9 +401,8 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
case 4: case 4:
{ {
int *a = new int[blocks]; int *a = new int[blocks];
int *ptr = a;
while (btmp--) while (btmp--)
*ptr++ = static_cast<int>(*addr++); *a++ = static_cast<int>(*addr++);
size_t res = fwrite(a, sizeof(int), blocks, fp); size_t res = fwrite(a, sizeof(int), blocks, fp);
delete [] a; delete [] a;
return res; return res;
@ -438,7 +435,7 @@ static cell AMX_NATIVE_CALL amx_fwrite(AMX *amx, cell *params)
case 4: case 4:
{ {
int c = static_cast<int>(params[2]); int c = static_cast<int>(params[2]);
return fwrite(&c, sizeof(int), 1, fp); return fwrite(&c, sizeof(short), 1, fp);
} }
} }
@ -516,7 +513,7 @@ static cell AMX_NATIVE_CALL amx_fread_blocks(AMX *amx, cell *params)
cell *addr = get_amxaddr(amx, params[2]); cell *addr = get_amxaddr(amx, params[2]);
size_t blocks = params[3]; size_t blocks = params[3];
switch (params[4]) switch (params[3])
{ {
case 1: //char case 1: //char
{ {
@ -802,59 +799,16 @@ static cell AMX_NATIVE_CALL amx_rmdir(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL amx_rename(AMX *amx, cell *params) static cell AMX_NATIVE_CALL amx_rename(AMX *amx, cell *params)
{ {
int len; int len;
char f_old_r[260];
char f_new_r[260];
char *fold = get_amxstring(amx, params[1], 0, len); char *fold = get_amxstring(amx, params[1], 0, len);
char *fnew = get_amxstring(amx, params[2], 1, len); char *fnew = get_amxstring(amx, params[2], 1, len);
if (params[0] / sizeof(cell) == 3 && params[3])
{
build_pathname_r(f_old_r, sizeof(f_old_r)-1, "%s", fold);
build_pathname_r(f_new_r, sizeof(f_new_r)-1, "%s", fnew);
} else {
snprintf(f_old_r, sizeof(f_old_r)-1, "%s", fold);
snprintf(f_new_r, sizeof(f_new_r)-1, "%s", fnew);
}
#if defined __linux__ #if defined __linux__
return (rename(f_old_r, f_new_r) == 0); return (rename(fold, fnew) == 0);
#elif defined WIN32 #elif defined WIN32
return MoveFileA(f_old_r, f_new_r); return MoveFileA(fold, fnew);
#endif #endif
} }
static cell LoadFileForMe(AMX *amx, cell *params)
{
int len;
char *file = get_amxstring(amx, params[1], 0, len);
char path[256];
build_pathname_r(path, sizeof(path), "%s", file);
byte *addr = LOAD_FILE_FOR_ME(path, &len);
if (addr == NULL)
{
return -1;
}
cell *buffer = get_amxaddr(amx, params[2]);
cell maxlength = params[3];
cell *bytes_avail = get_amxaddr(amx, params[4]);
*bytes_avail = len;
cell count;
for (count = 0; count < len && count < maxlength; count++)
{
buffer[count] = addr[count];
}
FREE_FILE(addr);
return count;
}
AMX_NATIVE_INFO file_Natives[] = AMX_NATIVE_INFO file_Natives[] =
{ {
{"delete_file", delete_file}, {"delete_file", delete_file},
@ -890,6 +844,5 @@ AMX_NATIVE_INFO file_Natives[] =
{"rmdir", amx_rmdir}, {"rmdir", amx_rmdir},
{"fputs", amx_fputs}, {"fputs", amx_fputs},
{"rename_file", amx_rename}, {"rename_file", amx_rename},
{"LoadFileForMe", LoadFileForMe},
{NULL, NULL} {NULL, NULL}
}; };

View File

@ -1,6 +1,5 @@
#include "amxmodx.h" #include "amxmodx.h"
#include "format.h" #include "format.h"
#include "datastructs.h"
#include "amxmod_compat.h" #include "amxmod_compat.h"
//Adapted from Quake3's vsprintf //Adapted from Quake3's vsprintf
@ -19,7 +18,6 @@
#define SHORTINT 0x00000040 /* short integer */ #define SHORTINT 0x00000040 /* short integer */
#define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */ #define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */
#define FPT 0x00000100 /* floating point number */ #define FPT 0x00000100 /* floating point number */
#define UPPERDIGITS 0x00000200 /* make alpha digits uppercase */
#define to_digit(c) ((c) - '0') #define to_digit(c) ((c) - '0')
#define is_digit(c) ((unsigned)to_digit(c) <= 9) #define is_digit(c) ((unsigned)to_digit(c) <= 9)
#define to_char(n) ((n) + '0') #define to_char(n) ((n) + '0')
@ -160,125 +158,71 @@ void AddString(U **buf_p, size_t &maxlen, const cell *string, int width, int pre
} }
template <typename U> template <typename U>
void AddFloat(U **buf_p, size_t &maxlen, double fval, int width, int prec, int flags) void AddFloat(U **buf_p, size_t &maxlen, double fval, int width, int prec)
{ {
int digits; // non-fraction part digits U text[32];
double tmp; // temporary int digits;
U *buf = *buf_p; // output buffer pointer double signedVal;
int val; // temporary U *buf;
int sign = 0; // 0: positive, 1: negative int val;
int fieldlength; // for padding
int significant_digits = 0; // number of significant digits written
const int MAX_SIGNIFICANT_DIGITS = 16;
// default precision
if (prec < 0)
{
prec = 6;
}
// get the sign // get the sign
signedVal = fval;
if (fval < 0) if (fval < 0)
{
fval = -fval; fval = -fval;
sign = 1;
}
// compute whole-part digits count // write the float number
digits = (int)log10(fval) + 1; digits = 0;
val = (int)fval;
do {
text[digits++] = '0' + val % 10;
val /= 10;
} while (val);
// Only print 0.something if 0 < fval < 1 if (signedVal < 0)
if (digits < 1) text[digits++] = '-';
buf = *buf_p;
while (digits < width && maxlen)
{ {
digits = 1; *buf++ = ' ';
} width--;
// compute the field length
fieldlength = digits + prec + ((prec > 0) ? 1 : 0) + sign;
// minus sign BEFORE left padding if padding with zeros
if (sign && maxlen && (flags & ZEROPAD))
{
*buf++ = '-';
maxlen--; maxlen--;
} }
// right justify if required while (digits-- && maxlen)
if ((flags & LADJUST) == 0)
{ {
while ((fieldlength < width) && maxlen) *buf++ = text[digits];
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
width--;
maxlen--;
}
}
// minus sign AFTER left padding if padding with spaces
if (sign && maxlen && !(flags & ZEROPAD))
{
*buf++ = '-';
maxlen--; maxlen--;
} }
// write the whole part *buf_p = buf;
tmp = pow(10.0, digits-1);
while ((digits--) && maxlen) if (prec < 0)
prec = 6;
// write the fraction
digits = 0;
while (digits < prec)
{ {
if (++significant_digits > MAX_SIGNIFICANT_DIGITS) fval -= (int) fval;
{ fval *= 10.0;
*buf++ = '0'; val = (int) fval;
} text[digits++] = '0' + val % 10;
else
{
val = (int)(fval / tmp);
*buf++ = '0' + val;
fval -= val * tmp;
tmp *= 0.1;
}
maxlen--;
} }
// write the fraction part if (digits > 0 && maxlen)
if (maxlen)
{ {
buf = *buf_p;
*buf++ = '.'; *buf++ = '.';
maxlen--; maxlen--;
} for (prec = 0; maxlen && prec < digits; prec++)
tmp = pow(10.0, prec);
fval *= tmp;
while (prec-- && maxlen)
{
if (++significant_digits > MAX_SIGNIFICANT_DIGITS)
{ {
*buf++ = '0'; *buf++ = text[prec];
}
else
{
tmp *= 0.1;
val = (int)(fval / tmp);
*buf++ = '0' + val;
fval -= val * tmp;
}
maxlen--;
}
// left justify if required
if (flags & LADJUST)
{
while ((fieldlength < width) && maxlen)
{
// right-padding only with spaces, ZEROPAD is ignored
*buf++ = ' ';
width--;
maxlen--; maxlen--;
} }
*buf_p = buf;
} }
// update parent's buffer pointer
*buf_p = buf;
} }
template <typename U> template <typename U>
@ -382,66 +326,6 @@ void AddInt(U **buf_p, size_t &maxlen, int val, int width, int flags)
*buf_p = buf; *buf_p = buf;
} }
template <typename U>
void AddHex(U **buf_p, size_t &maxlen, unsigned int val, int width, int flags)
{
U text[32];
int digits;
U *buf;
U digit;
int hexadjust;
if (flags & UPPERDIGITS)
{
hexadjust = 'A' - '9' - 1;
} else {
hexadjust = 'a' - '9' - 1;
}
digits = 0;
do
{
digit = ('0' + val % 16);
if (digit > '9')
{
digit += hexadjust;
}
text[digits++] = digit;
val /= 16;
} while (val);
buf = *buf_p;
if( !(flags & LADJUST) )
{
while (digits < width && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
width--;
maxlen--;
}
}
while (digits-- && maxlen)
{
*buf++ = text[digits];
width--;
maxlen--;
}
if (flags & LADJUST)
{
while (width-- && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
maxlen--;
}
}
*buf_p = buf;
}
template <typename D, typename S> template <typename D, typename S>
size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param) size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param)
{ {
@ -519,7 +403,6 @@ reswitch:
case 'c': case 'c':
CHECK_ARGS(0); CHECK_ARGS(0);
*buf_p++ = static_cast<D>(*get_amxaddr(amx, params[arg])); *buf_p++ = static_cast<D>(*get_amxaddr(amx, params[arg]));
llen--;
arg++; arg++;
break; break;
case 'd': case 'd':
@ -535,35 +418,9 @@ reswitch:
break; break;
case 'f': case 'f':
CHECK_ARGS(0); CHECK_ARGS(0);
AddFloat(&buf_p, llen, amx_ctof(*get_amxaddr(amx, params[arg])), width, prec, flags); AddFloat(&buf_p, llen, amx_ctof(*get_amxaddr(amx, params[arg])), width, prec);
arg++; arg++;
break; break;
case 'X':
CHECK_ARGS(0);
flags |= UPPERDIGITS;
AddHex(&buf_p, llen, static_cast<unsigned int>(*get_amxaddr(amx, params[arg])), width, flags);
arg++;
break;
case 'x':
CHECK_ARGS(0);
AddHex(&buf_p, llen, static_cast<unsigned int>(*get_amxaddr(amx, params[arg])), width, flags);
arg++;
break;
case 'a':
{
CHECK_ARGS(0);
// %a is passed a pointer directly to a cell string.
cell* ptr=reinterpret_cast<cell*>(*get_amxaddr(amx, params[arg]));
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid vector string handle provided (%d)", *get_amxaddr(amx, params[arg]));
return 0;
}
AddString(&buf_p, llen, ptr, width, prec);
arg++;
break;
}
case 's': case 's':
CHECK_ARGS(0); CHECK_ARGS(0);
if (amx->flags & AMX_FLAG_OLDFILE) if (amx->flags & AMX_FLAG_OLDFILE)

View File

@ -2,8 +2,7 @@
#include "messages.h" #include "messages.h"
Message Msg; Message Msg;
//CVector<int> msgHooks[256]; CVector<int> msgHooks[256];
RegisteredMessage msgHooks[256];
int msgBlocks[256] = {BLOCK_NOT}; int msgBlocks[256] = {BLOCK_NOT};
int msgDest; int msgDest;
int msgType; int msgType;
@ -17,7 +16,7 @@ void ClearMessages()
{ {
for (size_t i=0; i<MAX_MESSAGES; i++) for (size_t i=0; i<MAX_MESSAGES; i++)
{ {
msgHooks[i].Clear(); msgHooks[i].clear();
msgBlocks[i] = BLOCK_NOT; msgBlocks[i] = BLOCK_NOT;
} }
} }
@ -201,7 +200,7 @@ void C_MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *e
inblock = true; inblock = true;
msgType = msg_type; msgType = msg_type;
RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_SUPERCEDE);
} else if (msgHooks[msg_type].Hooked()) { } else if (msgHooks[msg_type].size()) {
inhook = true; inhook = true;
msgDest = msg_dest; msgDest = msg_dest;
msgType = msg_type; msgType = msg_type;
@ -319,8 +318,8 @@ void C_WriteEntity(int iValue)
void C_MessageEnd(void) void C_MessageEnd(void)
{ {
int mres = 0; int mres = 0, mresB = 0;
unsigned int i = 0;
if (inblock) if (inblock)
{ {
inblock = false; inblock = false;
@ -330,17 +329,12 @@ void C_MessageEnd(void)
} }
RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_SUPERCEDE);
} else if (inhook) { } else if (inhook) {
mres = msgHooks[msgType].Execute((cell)msgType, (cell)msgDest, (cell)ENTINDEX(msgpEntity));
/*
for (i=0; i<msgHooks[msgType].size(); i++) for (i=0; i<msgHooks[msgType].size(); i++)
{ {
mresB = executeForwards(msgHooks[msgType].at(i), (cell)msgType, (cell)msgDest, (cell)ENTINDEX(msgpEntity)); mresB = executeForwards(msgHooks[msgType].at(i), (cell)msgType, (cell)msgDest, (cell)ENTINDEX(msgpEntity));
if (mresB > mres) if (mresB > mres)
mres = mresB; mres = mresB;
} }
*/
inhook = false; inhook = false;
if (mres & 1) if (mres & 1)
{ {
@ -483,7 +477,7 @@ static cell AMX_NATIVE_CALL register_message(AMX *amx, cell *params)
int id = registerSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE); int id = registerSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (id != -1) if (id != -1)
{ {
msgHooks[params[1]].AddHook(id); msgHooks[params[1]].push_back(id);
return id; return id;
} else { } else {
LogError(amx, AMX_ERR_NOTFOUND, "Could not find function \"%s\"", name); LogError(amx, AMX_ERR_NOTFOUND, "Could not find function \"%s\"", name);
@ -494,29 +488,6 @@ static cell AMX_NATIVE_CALL register_message(AMX *amx, cell *params)
return 0; return 0;
} }
// unregister_message(msgid, msghandle)
static cell AMX_NATIVE_CALL unregister_message(AMX *amx, cell *params)
{
if (!Msg.Ready())
Msg.Init();
if (params[1]>0 && params[1] < 256)
{
int id = params[2];
if (id != -1)
{
msgHooks[params[1]].RemoveHook(id);
return id;
} else {
LogError(amx, AMX_ERR_NOTFOUND, "Invalid registered message handle");
return -1;
}
}
return 0;
}
static cell AMX_NATIVE_CALL set_msg_block(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_msg_block(AMX *amx, cell *params)
{ {
int msgid = params[1]; int msgid = params[1];
@ -804,7 +775,6 @@ AMX_NATIVE_INFO msg_Natives[] =
{"write_string", write_string}, {"write_string", write_string},
{"register_message", register_message}, {"register_message", register_message},
{"unregister_message", unregister_message},
{"set_msg_block", set_msg_block}, {"set_msg_block", set_msg_block},
{"get_msg_block", get_msg_block}, {"get_msg_block", get_msg_block},

View File

@ -6,7 +6,6 @@
#include "amx.h" #include "amx.h"
#include "CVector.h" #include "CVector.h"
#include "CString.h" #include "CString.h"
#include "sh_stack.h"
#define MAX_MESSAGES 255 #define MAX_MESSAGES 255
@ -16,136 +15,6 @@
#define BLOCK_ONCE 1 #define BLOCK_ONCE 1
#define BLOCK_SET 2 #define BLOCK_SET 2
class RegisteredMessage
{
private:
CVector<int> m_Forwards;
CStack<int> m_InExecution;
bool m_Cleanup;
public:
RegisteredMessage() : m_Cleanup(false) { }
~RegisteredMessage() { this->Clear(); }
void AddHook(int fwd)
{
m_Forwards.push_back(fwd);
}
bool RemoveHook(int fwd)
{
// Don't erase a forward if we're in the middle of execution; this
// could throw off the iterator that is going through the forwards
// and executing them. Instead, unregister the forward and set it
// to -1 from within the vector.
if (m_InExecution.size())
{
this->m_Cleanup = true;
CVector<int>::iterator iter = m_Forwards.begin();
CVector<int>::iterator end = m_Forwards.end();
while (iter != end)
{
if (*iter == fwd)
{
if (*iter != -1)
{
unregisterSPForward(*iter);
}
*iter = -1;
return true;
}
else
{
iter++;
}
}
}
else
{
CVector<int>::iterator iter = m_Forwards.begin();
CVector<int>::iterator end = m_Forwards.end();
while (iter != end)
{
if (*iter == fwd)
{
if (fwd != -1)
{
unregisterSPForward(fwd);
m_Forwards.erase(iter);
return true;
}
else
{
// -1 could be in here more than once
m_Forwards.erase(iter);
}
}
else
{
iter++;
}
}
}
return false;
}
void Clear()
{
while (m_InExecution.size())
{
m_InExecution.pop();
}
for (size_t i = 0; i < m_Forwards.size(); i++)
{
int fwd = m_Forwards[i];
if (fwd != -1)
{
unregisterSPForward(m_Forwards[i]);
}
}
m_Forwards.clear();
}
cell Execute(cell type, cell dest, cell entity)
{
m_InExecution.push(1);
cell res = 0;
cell thisres = 0;
for (size_t i = 0; i < m_Forwards.size(); i++)
{
int fwd = m_Forwards[i];
if (fwd != -1)
{
thisres = executeForwards(fwd, type, dest, entity);
if (thisres > res)
{
res = thisres;
}
}
}
m_InExecution.pop();
if (m_InExecution.size() == 0 && m_Cleanup)
{
this->RemoveHook(-1);
}
return res;
}
bool Hooked() const
{
return m_Forwards.size() != 0;
}
};
enum msgtype enum msgtype
{ {
arg_byte = 1, arg_byte = 1,
@ -207,7 +76,7 @@ void C_WriteString(const char *sz);
void C_WriteEntity(int iValue); void C_WriteEntity(int iValue);
void C_MessageEnd(void); void C_MessageEnd(void);
extern RegisteredMessage msgHooks[256]; extern CVector<int> msgHooks[256];
extern int msgBlocks[256]; extern int msgBlocks[256];
void ClearMessages(); void ClearMessages();

View File

@ -39,7 +39,6 @@
#include "amxmodx.h" #include "amxmodx.h"
#include "fakemeta.h" #include "fakemeta.h"
#include "CMenu.h"
#include "newmenus.h" #include "newmenus.h"
#include "natives.h" #include "natives.h"
#include "binlog.h" #include "binlog.h"
@ -48,21 +47,16 @@
#include "messages.h" #include "messages.h"
#include "amxmod_compat.h" #include "amxmod_compat.h"
#include "datastructs.h"
#include "CFlagManager.h"
#include "svn_version.h"
#include "trie_natives.h"
plugin_info_t Plugin_info = plugin_info_t Plugin_info =
{ {
META_INTERFACE_VERSION, // ifvers META_INTERFACE_VERSION, // ifvers
"AMX Mod X", // name "AMX Mod X", // name
SVN_VERSION_STRING, // version AMX_VERSION, // version
__DATE__, // date __DATE__, // date
"AMX Mod X Dev Team", // author "AMX Mod X Dev Team", // author
"http://www.amxmodx.org", // url "http://www.amxmodx.org", // url
"AMXX", // logtag "AMXX", // logtag
PT_STARTUP, // (when) loadable PT_ANYTIME, // (when) loadable
PT_ANYTIME, // (when) unloadable PT_ANYTIME, // (when) unloadable
}; };
@ -79,7 +73,6 @@ void (*function)(void*);
void (*endfunction)(void*); void (*endfunction)(void*);
extern List<AUTHORIZEFUNC> g_auth_funcs; extern List<AUTHORIZEFUNC> g_auth_funcs;
extern CVector<CAdminData *> DynamicAdmins;
CLog g_log; CLog g_log;
CForwardMngr g_forwards; CForwardMngr g_forwards;
@ -93,7 +86,7 @@ CPlayer* mPlayer;
CPluginMngr g_plugins; CPluginMngr g_plugins;
CTaskMngr g_tasksMngr; CTaskMngr g_tasksMngr;
CmdMngr g_commands; CmdMngr g_commands;
CFlagManager FlagMan;
EventsMngr g_events; EventsMngr g_events;
Grenades g_grenades; Grenades g_grenades;
LogEventsMngr g_logevents; LogEventsMngr g_logevents;
@ -358,22 +351,6 @@ int C_Spawn(edict_t *pent)
hostname = CVAR_GET_POINTER("hostname"); hostname = CVAR_GET_POINTER("hostname");
mp_timelimit = CVAR_GET_POINTER("mp_timelimit"); mp_timelimit = CVAR_GET_POINTER("mp_timelimit");
// Fix for crashing on mods that do not have mp_timelimit
if (mp_timelimit == NULL)
{
static cvar_t timelimit_holder;
timelimit_holder.name = "mp_timelimit";
timelimit_holder.string = "0";
timelimit_holder.flags = 0;
timelimit_holder.value = 0.0;
CVAR_REGISTER(&timelimit_holder);
mp_timelimit = &timelimit_holder;
}
g_forwards.clear(); g_forwards.clear();
g_log.MapChange(); g_log.MapChange();
@ -404,17 +381,7 @@ int C_Spawn(edict_t *pent)
get_localinfo("amx_pluginsdir", "addons/amxmodx/plugins"); get_localinfo("amx_pluginsdir", "addons/amxmodx/plugins");
get_localinfo("amx_logdir", "addons/amxmodx/logs"); get_localinfo("amx_logdir", "addons/amxmodx/logs");
FlagMan.LoadFile();
for (unsigned int i=0; i<VectorHolder.size(); i++)
{
delete VectorHolder[i];
};
VectorHolder.clear();
g_TrieHandles.clear();
char map_pluginsfile_path[256]; char map_pluginsfile_path[256];
char prefixed_map_pluginsfile[256];
char configs_dir[256]; char configs_dir[256];
// ###### Load modules // ###### Load modules
@ -423,35 +390,16 @@ int C_Spawn(edict_t *pent)
get_localinfo_r("amxx_configsdir", "addons/amxmodx/configs", configs_dir, sizeof(configs_dir)-1); get_localinfo_r("amxx_configsdir", "addons/amxmodx/configs", configs_dir, sizeof(configs_dir)-1);
g_plugins.CALMFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini")); g_plugins.CALMFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
LoadExtraPluginsToPCALM(configs_dir); LoadExtraPluginsToPCALM(configs_dir);
char temporaryMap[64], *tmap_ptr; snprintf(map_pluginsfile_path, sizeof(map_pluginsfile_path)-1,
"%s/maps/plugins-%s.ini",
snprintf(temporaryMap, sizeof(temporaryMap), "%s", STRING(gpGlobals->mapname)); configs_dir,
STRING(gpGlobals->mapname));
prefixed_map_pluginsfile[0] = '\0';
if ((tmap_ptr = strchr(temporaryMap, '_')) != NULL)
{
// this map has a prefix
*tmap_ptr = '\0';
snprintf(prefixed_map_pluginsfile,
sizeof(prefixed_map_pluginsfile),
"%s/maps/plugins-%s.ini",
configs_dir,
temporaryMap);
g_plugins.CALMFromFile(prefixed_map_pluginsfile);
}
snprintf(map_pluginsfile_path,
sizeof(map_pluginsfile_path),
"%s/maps/plugins-%s.ini",
configs_dir,
STRING(gpGlobals->mapname));
g_plugins.CALMFromFile(map_pluginsfile_path); g_plugins.CALMFromFile(map_pluginsfile_path);
int loaded = countModules(CountModules_Running); // Call after attachModules so all modules don't have pending stat int loaded = countModules(CountModules_Running); // Call after attachModules so all modules don't have pending stat
// Set some info about amx version and modules // Set some info about amx version and modules
CVAR_SET_STRING(init_amxmodx_version.name, SVN_VERSION_STRING); CVAR_SET_STRING(init_amxmodx_version.name, AMX_VERSION);
char buffer[32]; char buffer[32];
sprintf(buffer, "%d", loaded); sprintf(buffer, "%d", loaded);
CVAR_SET_STRING(init_amxmodx_modules.name, buffer); CVAR_SET_STRING(init_amxmodx_modules.name, buffer);
@ -487,11 +435,6 @@ int C_Spawn(edict_t *pent)
g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini")); g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
LoadExtraPluginsFromDir(configs_dir); LoadExtraPluginsFromDir(configs_dir);
g_plugins.loadPluginsFromFile(map_pluginsfile_path, false); g_plugins.loadPluginsFromFile(map_pluginsfile_path, false);
if (prefixed_map_pluginsfile[0] != '\0')
{
g_plugins.loadPluginsFromFile(prefixed_map_pluginsfile, false);
}
g_plugins.Finalize(); g_plugins.Finalize();
g_plugins.InvalidateCache(); g_plugins.InvalidateCache();
@ -707,19 +650,10 @@ void C_ServerDeactivate_Post()
ClearMessages(); ClearMessages();
// Flush the dynamic admins list
for (size_t iter=DynamicAdmins.size();iter--; )
{
delete DynamicAdmins[iter];
}
DynamicAdmins.clear();
for (unsigned int i=0; i<g_hudsync.size(); i++) for (unsigned int i=0; i<g_hudsync.size(); i++)
delete [] g_hudsync[i]; delete [] g_hudsync[i];
g_hudsync.clear(); g_hudsync.clear();
FlagMan.WriteCommands();
// last memreport // last memreport
#ifdef MEMORY_TEST #ifdef MEMORY_TEST
if (g_memreport_enabled) if (g_memreport_enabled)
@ -966,63 +900,47 @@ void C_ClientCommand(edict_t *pEntity)
int menuid = pPlayer->menu; int menuid = pPlayer->menu;
pPlayer->menu = 0; pPlayer->menu = 0;
/* First, do new menus */
int func_was_executed = -1;
if (pPlayer->newmenu != -1)
{
int menu = pPlayer->newmenu;
pPlayer->newmenu = -1;
if (menu >= 0 && menu < (int)g_NewMenus.size() && g_NewMenus[menu])
{
Menu *pMenu = g_NewMenus[menu];
int item = pMenu->PagekeyToItem(pPlayer->page, pressed_key+1);
if (item == MENU_BACK)
{
pMenu->Display(pPlayer->index, pPlayer->page - 1);
} else if (item == MENU_MORE) {
pMenu->Display(pPlayer->index, pPlayer->page + 1);
} else {
ret = executeForwards(pMenu->func, static_cast<cell>(pPlayer->index), static_cast<cell>(menu), static_cast<cell>(item));
if (ret & 2)
{
result = MRES_SUPERCEDE;
} else if (ret & 1) {
RETURN_META(MRES_SUPERCEDE);
}
}
/**
* No matter what we marked it as executed, since the callback styles are
* entirely different. After all, this is a backwards compat shim.
*/
func_was_executed = pMenu->func;
}
}
/* Now, do old menus */
MenuMngr::iterator a = g_menucmds.begin(); MenuMngr::iterator a = g_menucmds.begin();
while (a) while (a)
{ {
g_menucmds.SetWatchIter(a); if ((*a).matchCommand(menuid, bit_key) && (*a).getPlugin()->isExecutable((*a).getFunction()))
if ((*a).matchCommand(menuid, bit_key)
&& (*a).getPlugin()->isExecutable((*a).getFunction())
&& (func_was_executed == -1
|| !g_forwards.isSameSPForward(func_was_executed, (*a).getFunction()))
)
{ {
ret = executeForwards((*a).getFunction(), static_cast<cell>(pPlayer->index), if (pPlayer->newmenu != -1)
static_cast<cell>(pressed_key), 0); {
int menu = pPlayer->newmenu;
if (ret & 2) result = MRES_SUPERCEDE; pPlayer->newmenu = -1;
if (ret & 1) RETURN_META(MRES_SUPERCEDE);
} if (menu >= 0 && menu < (int)g_NewMenus.size())
if (g_menucmds.GetWatchIter() != a) {
{ Menu *pMenu = g_NewMenus[menu];
a = g_menucmds.GetWatchIter(); int item = pMenu->PagekeyToItem(pPlayer->page, pressed_key+1);
} else {
++a; if (item == MENU_BACK)
{
pMenu->Display(pPlayer->index, pPlayer->page - 1);
} else if (item == MENU_MORE) {
pMenu->Display(pPlayer->index, pPlayer->page + 1);
} else {
ret = executeForwards((*a).getFunction(), static_cast<cell>(pPlayer->index), static_cast<cell>(menu), static_cast<cell>(item));
if (ret & 2)
result = MRES_SUPERCEDE;
else if (ret & 1)
RETURN_META(MRES_SUPERCEDE);
}
}
if (pPlayer->newmenu != -1)
break;
} else {
ret = executeForwards((*a).getFunction(), static_cast<cell>(pPlayer->index),
static_cast<cell>(pressed_key), 0);
if (ret & 2) result = MRES_SUPERCEDE;
if (ret & 1) RETURN_META(MRES_SUPERCEDE);
}
} }
++a;
} }
} }
} }
@ -1138,6 +1056,20 @@ void C_MessageBegin_Post(int msg_dest, int msg_type, const float *pOrigin, edict
{ {
if (ed) if (ed)
{ {
if (gmsgBattery == msg_type && g_bmod_cstrike)
{
void* ptr = GET_PRIVATE(ed);
#ifdef __linux__
int *z = (int*)ptr + 0x171;
#else
int *z = (int*)ptr + 0x16C;
#endif
int stop = (int)ed->v.armorvalue;
*z = stop;
ed->v.armorvalue = (float)stop;
}
mPlayerIndex = ENTINDEX(ed); mPlayerIndex = ENTINDEX(ed);
mPlayer = GET_PLAYER_POINTER_I(mPlayerIndex); mPlayer = GET_PLAYER_POINTER_I(mPlayerIndex);
} else { } else {
@ -1279,7 +1211,8 @@ void C_TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t
if (ptr->pHit && (ptr->pHit->v.flags & (FL_CLIENT | FL_FAKECLIENT))) if (ptr->pHit && (ptr->pHit->v.flags & (FL_CLIENT | FL_FAKECLIENT)))
pPlayer->aiming = ptr->iHitgroup; pPlayer->aiming = ptr->iHitgroup;
pPlayer->lastTrace = ptr->vecEndPos; pPlayer->lastTrace = pPlayer->thisTrace;
pPlayer->thisTrace = ptr->vecEndPos;
} }
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
@ -1457,7 +1390,7 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
// ###### Print short GPL // ###### Print short GPL
print_srvconsole("\n AMX Mod X version %s Copyright (c) 2004-2006 AMX Mod X Development Team \n" print_srvconsole("\n AMX Mod X version %s Copyright (c) 2004-2006 AMX Mod X Development Team \n"
" AMX Mod X comes with ABSOLUTELY NO WARRANTY; for details type `amxx gpl'.\n", SVN_VERSION_STRING); " AMX Mod X comes with ABSOLUTELY NO WARRANTY; for details type `amxx gpl'.\n", AMX_VERSION);
print_srvconsole(" This is free software and you are welcome to redistribute it under \n" print_srvconsole(" This is free software and you are welcome to redistribute it under \n"
" certain conditions; type 'amxx gpl' for details.\n \n"); " certain conditions; type 'amxx gpl' for details.\n \n");
@ -1486,8 +1419,6 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
GET_HOOK_TABLES(PLID, &g_pEngTable, NULL, NULL); GET_HOOK_TABLES(PLID, &g_pEngTable, NULL, NULL);
FlagMan.SetFile("cmdaccess.ini");
return (TRUE); return (TRUE);
} }

View File

@ -49,7 +49,6 @@
#include "libraries.h" #include "libraries.h"
#include "messages.h" #include "messages.h"
#include "amxmod_compat.h" #include "amxmod_compat.h"
#include "trie_natives.h"
CList<CModule, const char*> g_modules; CList<CModule, const char*> g_modules;
CList<CScript, AMX*> g_loadedscripts; CList<CScript, AMX*> g_loadedscripts;
@ -579,8 +578,6 @@ int set_amxnatives(AMX* amx, char error[128])
amx_Register(amx, msg_Natives, -1); amx_Register(amx, msg_Natives, -1);
amx_Register(amx, vector_Natives, -1); amx_Register(amx, vector_Natives, -1);
amx_Register(amx, g_SortNatives, -1); amx_Register(amx, g_SortNatives, -1);
amx_Register(amx, g_DataStructNatives, -1);
amx_Register(amx, trie_Natives, -1);
if (amx->flags & AMX_FLAG_OLDFILE) if (amx->flags & AMX_FLAG_OLDFILE)
{ {
@ -601,7 +598,7 @@ int set_amxnatives(AMX* amx, char error[128])
if ((err = amx_Exec(amx, &retval, idx)) != AMX_ERR_NONE) if ((err = amx_Exec(amx, &retval, idx)) != AMX_ERR_NONE)
{ {
Debugger::GenericMessage(amx, err); Debugger::GenericMessage(amx, err);
AMXXLOG_Log("An error occurred in plugin_natives. This is dangerous!"); AMXXLOG_Log("An error occurred in plugins_native. This is dangerous!");
} }
} }
@ -724,7 +721,13 @@ char* build_pathname(char *fmt, ...)
{ {
static char string[256]; static char string[256];
int b; int b;
int a = b = snprintf(string, 255, "%s%c", g_mod_name.c_str(), PATH_SEP_CHAR); int a = b = snprintf(string, 255,
#ifndef __linux__
"%s\\",
#else
"%s/",
#endif
g_mod_name.c_str());
va_list argptr; va_list argptr;
va_start(argptr, fmt); va_start(argptr, fmt);
@ -736,10 +739,11 @@ char* build_pathname(char *fmt, ...)
while (*path) while (*path)
{ {
if (*path == ALT_SEP_CHAR) #ifndef __linux__
{ if (*path == '/') *path = '\\';
*path = PATH_SEP_CHAR; #else
} if (*path == '\\') *path = '/';
#endif
++path; ++path;
} }
@ -748,7 +752,13 @@ char* build_pathname(char *fmt, ...)
char *build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...) char *build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...)
{ {
snprintf(buffer, maxlen, "%s%c", g_mod_name.c_str(), PATH_SEP_CHAR); snprintf(buffer, maxlen,
#ifdef __linux__
"%s/",
#else
"%s\\",
#endif
g_mod_name.c_str());
size_t len = strlen(buffer); size_t len = strlen(buffer);
char *ptr = buffer + len; char *ptr = buffer + len;
@ -760,10 +770,11 @@ char *build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...)
while (*ptr) while (*ptr)
{ {
if (*ptr == ALT_SEP_CHAR) #ifndef __linux__
{ if (*ptr == '/') *ptr = '\\';
*ptr = PATH_SEP_CHAR; #else
} if (*ptr == '\\') *ptr = '/';
#endif
++ptr; ++ptr;
} }
@ -784,16 +795,23 @@ char* build_pathname_addons(char *fmt, ...)
while (*path) while (*path)
{ {
if (*path == ALT_SEP_CHAR) #ifndef __linux__
{ if (*path == '/') *path = '\\';
*path = PATH_SEP_CHAR; #else
} if (*path == '\\') *path = '/';
#endif
++path; ++path;
} }
return string; return string;
} }
#if defined WIN32
#define SEPCHAR '\\'
#elif defined __linux__
#define SEPCHAR '/'
#endif
bool ConvertModuleName(const char *pathString, String &path) bool ConvertModuleName(const char *pathString, String &path)
{ {
String local; String local;
@ -811,7 +829,7 @@ bool ConvertModuleName(const char *pathString, String &path)
/* run to filename instead of dir */ /* run to filename instead of dir */
char *ptr = tmpname; char *ptr = tmpname;
ptr = tmpname + len - 1; ptr = tmpname + len - 1;
while (ptr >= tmpname && *ptr != PATH_SEP_CHAR) while (ptr >= tmpname && *ptr != SEPCHAR)
ptr--; ptr--;
if (ptr >= tmpname) if (ptr >= tmpname)
{ {
@ -872,7 +890,7 @@ bool ConvertModuleName(const char *pathString, String &path)
} }
path.assign(orig_path); path.assign(orig_path);
path.append(PATH_SEP_CHAR); path.append(SEPCHAR);
path.append(tmpname); path.append(tmpname);
path.append("_amxx"); path.append("_amxx");
#if defined __linux__ #if defined __linux__
@ -958,9 +976,6 @@ bool LoadModule(const char *shortname, PLUG_LOADTIME now, bool simplify, bool no
case MODULE_NOT64BIT: case MODULE_NOT64BIT:
report_error(1, "[AMXX] Module \"%s\" is not 64 bit compatible.", path.c_str()); report_error(1, "[AMXX] Module \"%s\" is not 64 bit compatible.", path.c_str());
break; break;
case MODULE_BADGAME:
report_error(1, "[AMXX] Module \"%s\" cannot load on game \"%s\"", path.c_str(), g_mod_name.c_str());
break;
default: default:
error = false; error = false;
break; break;

12
amxmodx/msvc/.cvsignore Executable file
View File

@ -0,0 +1,12 @@
amxmodx.sln
amxmodx.suo
amxmodx.aps
amxmodx.ncb
Debug
JITDebug
JITMemtestRelease
JITRelease
MaximalSpeed
MemtestDebug
MemtestRelease
Release

292
amxmodx/msvc/amxmodx_mm.dsp Executable file
View File

@ -0,0 +1,292 @@
# Microsoft Developer Studio Project File - Name="amxmodx_mm" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=amxmodx_mm - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "amxmodx_mm.mak".
!MESSAGE
!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 "amxmodx_mm.mak" CFG="amxmodx_mm - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "amxmodx_mm - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "amxmodx_mm - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "amxmodx_mm - 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_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 "amxmodx_mm_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\metamod\metamod" /I "..\..\hlsdk\sourcecode\common" /I "..\..\hlsdk\sourcecode\engine" /I "..\..\hlsdk\sourcecode\dlls" /I "..\..\hlsdk\sourcecode\pm_shared" /I "..\extra\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "amxmodx_mm_EXPORTS" /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"
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 /def:".\amxmodx_mm.def" /out:"release/amxx_mm.dll" /libpath:"..\extra\lib_win32"
# Begin Custom Build
TargetPath=.\release\amxx_mm.dll
TargetName=amxx_mm
InputPath=.\release\amxx_mm.dll
SOURCE="$(InputPath)"
"$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
copy $(TargetPath) D:\SIERRA\Half-Life\cstrike\addons\amx\dlls
# End Custom Build
!ELSEIF "$(CFG)" == "amxmodx_mm - 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 Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "amxmodx_mm_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /Zp4 /MTd /W3 /Gm /GX /ZI /Od /I "..\..\metamod\metamod" /I "..\...\hlsdk\sourcecode\common" /I "..\...\hlsdk\sourcecode\engine" /I "..\...\hlsdk\sourcecode\dlls" /I "..\...\hlsdk\sourcecode\pm_shared" /I "..\extra\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "amxmodx_mm_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 /def:".\amxmodx_mm.def" /out:"debug/amxx_mm.dll" /pdbtype:sept /libpath:"..\extra\lib_win32"
# SUBTRACT LINK32 /incremental:no /nodefaultlib
# Begin Custom Build
TargetPath=.\debug\amxx_mm.dll
TargetName=amxx_mm
InputPath=.\debug\amxx_mm.dll
SOURCE="$(InputPath)"
"$(TargetName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
copy $(TargetPath) D:\SIERRA\Half-Life\cstrike\addons\amx\dlls
# End Custom Build
!ENDIF
# Begin Target
# Name "amxmodx_mm - Win32 Release"
# Name "amxmodx_mm - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=..\amx.c
# End Source File
# Begin Source File
SOURCE=..\amxcore.c
# End Source File
# Begin Source File
SOURCE=..\amxmodx.cpp
# End Source File
# Begin Source File
SOURCE=..\amxtime.c
# End Source File
# Begin Source File
SOURCE=..\amxxlog.cpp
# End Source File
# Begin Source File
SOURCE=..\CCmd.cpp
# End Source File
# Begin Source File
SOURCE=..\CEvent.cpp
# End Source File
# Begin Source File
SOURCE=..\CFile.cpp
# End Source File
# Begin Source File
SOURCE=..\CForward.cpp
# End Source File
# Begin Source File
SOURCE=..\CLogEvent.cpp
# End Source File
# Begin Source File
SOURCE=..\CMenu.cpp
# End Source File
# Begin Source File
SOURCE=..\CMisc.cpp
# End Source File
# Begin Source File
SOURCE=..\CModule.cpp
# End Source File
# Begin Source File
SOURCE=..\CPlugin.cpp
# End Source File
# Begin Source File
SOURCE=..\CString.cpp
# End Source File
# Begin Source File
SOURCE=..\CTask.cpp
# End Source File
# Begin Source File
SOURCE=..\CVault.cpp
# End Source File
# Begin Source File
SOURCE=..\emsg.cpp
# End Source File
# Begin Source File
SOURCE=..\file.cpp
# End Source File
# Begin Source File
SOURCE=..\float.cpp
# End Source File
# Begin Source File
SOURCE=..\meta_api.cpp
# End Source File
# Begin Source File
SOURCE=..\modules.cpp
# End Source File
# Begin Source File
SOURCE=..\power.c
# End Source File
# Begin Source File
SOURCE=..\srvcmd.cpp
# End Source File
# Begin Source File
SOURCE=..\string.cpp
# End Source File
# Begin Source File
SOURCE=..\strptime.cpp
# End Source File
# Begin Source File
SOURCE=..\util.cpp
# End Source File
# Begin Source File
SOURCE=..\vault.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=..\amxmodx.h
# End Source File
# Begin Source File
SOURCE=..\CCmd.h
# End Source File
# Begin Source File
SOURCE=..\CEvent.h
# End Source File
# Begin Source File
SOURCE=..\CFile.h
# End Source File
# Begin Source File
SOURCE=..\CForward.h
# End Source File
# Begin Source File
SOURCE=..\CList.h
# End Source File
# Begin Source File
SOURCE=..\CLogEvent.h
# End Source File
# Begin Source File
SOURCE=..\CMenu.h
# End Source File
# Begin Source File
SOURCE=..\CMisc.h
# End Source File
# Begin Source File
SOURCE=..\CModule.h
# End Source File
# Begin Source File
SOURCE=..\CPlugin.h
# End Source File
# Begin Source File
SOURCE=..\CString.h
# End Source File
# Begin Source File
SOURCE=..\CTask.h
# End Source File
# Begin Source File
SOURCE=..\CVault.h
# End Source File
# Begin Source File
SOURCE=..\modules.h
# End Source File
# End Group
# End Target
# End Project

29
amxmodx/msvc/amxmodx_mm.dsw Executable file
View File

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

27
amxmodx/msvc/amxmodx_mm.sln Executable file
View File

@ -0,0 +1,27 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxmodx", "amxmodx_mm.vcproj", "{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
JITDebug = JITDebug
JITDebugBinLog = JITDebugBinLog
JITRelease = JITRelease
JITReleaseBinLog = JITReleaseBinLog
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{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}.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
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

682
amxmodx/msvc/amxmodx_mm.vcproj Executable file
View File

@ -0,0 +1,682 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="amxmodx"
ProjectGUID="{2BF64D1A-AC89-41B0-9D02-FB8CB610F850}"
RootNamespace="amxmodx"
SccProjectName=""
SccLocalPath="">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="JITDebug|Win32"
OutputDirectory="JITDebug"
IntermediateDirectory="JITDebug"
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"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
StructMemberAlignment="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitdebug/amxmodx.pch"
AssemblerListingLocation=".\jitdebug/"
ObjectFile=".\jitdebug/"
ProgramDataBaseFileName=".\jitdebug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="..\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/amxmodx_mm.pdb"
ImportLibrary=".\jitdebug/amxmodx_mm.lib"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\debug/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="JITRelease|Win32"
OutputDirectory="JITRelease"
IntermediateDirectory="JITRelease"
ConfigurationType="2"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="1"
EnableIntrinsicFunctions="TRUE"
FavorSizeOrSpeed="1"
OmitFramePointers="TRUE"
OptimizeForProcessor="0"
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"
IgnoreStandardIncludePath="FALSE"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitrelease/amxmodx.pch"
AssemblerListingLocation=".\jitrelease/"
ObjectFile=".\jitrelease/"
ProgramDataBaseFileName=".\jitrelease/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
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="jitrelease/amxmodx_mm.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="MSVCRT"
ModuleDefinitionFile=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\jitrelease/amxmodx_mm.pdb"
GenerateMapFile="TRUE"
ImportLibrary=".\jitrelease/amxmodx_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="JITDebugBinLog|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
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"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitdebugbinlog/amxmodx.pch"
AssemblerListingLocation=".\jitdebugbinlog/"
ObjectFile=".\jitdebugbinlog/"
ProgramDataBaseFileName=".\jitdebugbinlog/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
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="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="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="JITReleaseBinLog|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
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"
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"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="amxmodx.h"
PrecompiledHeaderFile=".\jitreleasebinlog/amxmodx.pch"
AssemblerListingLocation=".\jitreleasebinlog/"
ObjectFile=".\jitreleasebinlog/"
ProgramDataBaseFileName=".\jitreleasebinlog/"
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"
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"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\release/amxmodx.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File
RelativePath="..\amx.cpp">
</File>
<File
RelativePath="..\amxcore.cpp">
</File>
<File
RelativePath="..\amxdbg.cpp">
</File>
<File
RelativePath="..\amxmod_compat.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="..\sorting.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="..\amxmod_compat.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"
Filter="">
<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"
Filter="">
<File
RelativePath="..\Jit\helpers-x86.obj">
</File>
</Filter>
</Filter>
<Filter
Name="SDK"
Filter="">
<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

@ -47,7 +47,7 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="&quot;$(METAMOD)&quot;;&quot;$(HLSDK)\common&quot;;&quot;$(HLSDK)\engine&quot;;&quot;$(HLSDK)\dlls&quot;;&quot;$(HLSDK)\pm_shared&quot;" AdditionalIncludeDirectories=""
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT;_CRT_SECURE_NO_DEPRECATE"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
@ -85,7 +85,7 @@
LinkIncremental="2" LinkIncremental="2"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\extra\lib_win32" AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="LIBC;LIBCD;LIBCMT" IgnoreDefaultLibraryNames="MSVCRT;LIBC"
ModuleDefinitionFile="" ModuleDefinitionFile=""
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb" ProgramDatabaseFile=".\jitdebug/amxx_mm.pdb"
@ -153,7 +153,7 @@
EnableIntrinsicFunctions="true" EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1" FavorSizeOrSpeed="1"
OmitFramePointers="true" OmitFramePointers="true"
AdditionalIncludeDirectories="&quot;$(METAMOD)&quot;;&quot;$(HLSDK)\common&quot;;&quot;$(HLSDK)\engine&quot;;&quot;$(HLSDK)\dlls&quot;;&quot;$(HLSDK)\pm_shared&quot;" 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" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT;ASM32;PAWN_CELL_SIZE=32;_CRT_SECURE_NO_DEPRECATE"
IgnoreStandardIncludePath="false" IgnoreStandardIncludePath="false"
StringPooling="true" StringPooling="true"
@ -192,7 +192,7 @@
LinkIncremental="1" LinkIncremental="1"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\extra\lib_win32" AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="LIBC;LIBCD;LIBCMTD" IgnoreDefaultLibraryNames="MSVCRT;LIBC"
ModuleDefinitionFile="" ModuleDefinitionFile=""
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile=".\jitrelease/amxmodx_mm.pdb" ProgramDatabaseFile=".\jitrelease/amxmodx_mm.pdb"
@ -257,7 +257,7 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="&quot;$(METAMOD)&quot;;&quot;$(HLSDK)\common&quot;;&quot;$(HLSDK)\engine&quot;;&quot;$(HLSDK)\dlls&quot;;&quot;$(HLSDK)\pm_shared&quot;" AdditionalIncludeDirectories=""
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT;BINLOG_ENABLED;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;PAWN_CELL_SIZE=32;ASM32;JIT;BINLOG_ENABLED;_CRT_SECURE_NO_DEPRECATE"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
@ -295,7 +295,7 @@
LinkIncremental="2" LinkIncremental="2"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\extra\lib_win32" AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="LIBC;LIBCD;LIBCMT" IgnoreDefaultLibraryNames="MSVCRT;LIBC"
ModuleDefinitionFile="" ModuleDefinitionFile=""
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile=".\jitdebugbinlog/amxmodx_bl_mm.pdb" ProgramDatabaseFile=".\jitdebugbinlog/amxmodx_bl_mm.pdb"
@ -363,7 +363,7 @@
EnableIntrinsicFunctions="true" EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1" FavorSizeOrSpeed="1"
OmitFramePointers="true" OmitFramePointers="true"
AdditionalIncludeDirectories="&quot;$(METAMOD)&quot;;&quot;$(HLSDK)\common&quot;;&quot;$(HLSDK)\engine&quot;;&quot;$(HLSDK)\dlls&quot;;&quot;$(HLSDK)\pm_shared&quot;" 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" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;amxmodx_EXPORTS;JIT;ASM32;PAWN_CELL_SIZE=32;BINLOG_ENABLED;_CRT_SECURE_NO_DEPRECATE"
IgnoreStandardIncludePath="false" IgnoreStandardIncludePath="false"
StringPooling="true" StringPooling="true"
@ -401,7 +401,7 @@
LinkIncremental="1" LinkIncremental="1"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\extra\lib_win32" AdditionalLibraryDirectories="..\extra\lib_win32"
IgnoreDefaultLibraryNames="LIBC;LIBCD;LIBCMTD" IgnoreDefaultLibraryNames="MSVCRT;LIBC"
ModuleDefinitionFile="" ModuleDefinitionFile=""
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile=".\jitreleasebinlog/amxmodx_bl_mm.pdb" ProgramDatabaseFile=".\jitreleasebinlog/amxmodx_bl_mm.pdb"
@ -505,10 +505,6 @@
RelativePath="..\CFile.cpp" RelativePath="..\CFile.cpp"
> >
</File> </File>
<File
RelativePath="..\CFlagManager.cpp"
>
</File>
<File <File
RelativePath="..\CForward.cpp" RelativePath="..\CForward.cpp"
> >
@ -613,10 +609,6 @@
RelativePath="..\newmenus.cpp" RelativePath="..\newmenus.cpp"
> >
</File> </File>
<File
RelativePath="..\nongpl_matches.cpp"
>
</File>
<File <File
RelativePath="..\optimizer.cpp" RelativePath="..\optimizer.cpp"
> >
@ -657,10 +649,6 @@
RelativePath="..\strptime.cpp" RelativePath="..\strptime.cpp"
> >
</File> </File>
<File
RelativePath="..\trie_natives.cpp"
>
</File>
<File <File
RelativePath="..\util.cpp" RelativePath="..\util.cpp"
> >
@ -718,10 +706,6 @@
RelativePath="..\CFile.h" RelativePath="..\CFile.h"
> >
</File> </File>
<File
RelativePath="..\CFlagManager.h"
>
</File>
<File <File
RelativePath="..\CForward.h" RelativePath="..\CForward.h"
> >
@ -774,14 +758,6 @@
RelativePath="..\CVector.h" RelativePath="..\CVector.h"
> >
</File> </File>
<File
RelativePath="..\datastructs.cpp"
>
</File>
<File
RelativePath="..\datastructs.h"
>
</File>
<File <File
RelativePath="..\debugger.h" RelativePath="..\debugger.h"
> >
@ -802,6 +778,10 @@
RelativePath="..\md5.h" RelativePath="..\md5.h"
> >
</File> </File>
<File
RelativePath="..\menus.h"
>
</File>
<File <File
RelativePath="..\messages.h" RelativePath="..\messages.h"
> >
@ -818,10 +798,6 @@
RelativePath="..\newmenus.h" RelativePath="..\newmenus.h"
> >
</File> </File>
<File
RelativePath="..\nongpl_matches.h"
>
</File>
<File <File
RelativePath="..\optimizer.h" RelativePath="..\optimizer.h"
> >
@ -842,14 +818,6 @@
RelativePath="..\sh_tinyhash.h" RelativePath="..\sh_tinyhash.h"
> >
</File> </File>
<File
RelativePath="..\svn_version.h"
>
</File>
<File
RelativePath="..\trie_natives.h"
>
</File>
<File <File
RelativePath="..\zlib\zconf.h" RelativePath="..\zlib\zconf.h"
> >
@ -952,118 +920,6 @@
> >
</File> </File>
</Filter> </Filter>
<Filter
Name="Pawn Includes"
>
<File
RelativePath="..\..\plugins\include\amxconst.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmisc.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmodx.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\core.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\file.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\float.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\lang.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\message_const.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\message_stocks.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\messages.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\sorting.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\string.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\svn_version.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\time.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\vault.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\vector.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\xs.inc"
>
</File>
<Filter
Name="AMX Mod Compat"
>
<File
RelativePath="..\..\plugins\include\amxmod_compat\amxmod.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\maths.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\mysql.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\translator.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\Vexd_Utilities.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\VexdUM.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\VexdUM_const.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\VexdUM_stock.inc"
>
</File>
<File
RelativePath="..\..\plugins\include\amxmod_compat\xtrafun.inc"
>
</File>
</Filter>
</Filter>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>

View File

@ -46,16 +46,12 @@
//With the exception for param_convert, which was written by //With the exception for param_convert, which was written by
// Julien "dJeyL" Laurent // Julien "dJeyL" Laurent
CStack<int> g_ErrorStk;
CVector<regnative *> g_RegNatives; CVector<regnative *> g_RegNatives;
CStack<regnative *> g_NativeStack;
static char g_errorStr[512] = {0}; static char g_errorStr[512] = {0};
bool g_Initialized = false; bool g_Initialized = false;
/* Stack stuff */
regnative *g_pCurNative = NULL;
AMX *g_pCaller = NULL;
cell g_Params[CALLFUNC_MAXPARAMS];
int g_CurError = AMX_ERR_NONE;
int amxx_DynaCallback(int idx, AMX *amx, cell *params) int amxx_DynaCallback(int idx, AMX *amx, cell *params)
{ {
if (idx < 0 || idx >= (int)g_RegNatives.size()) if (idx < 0 || idx >= (int)g_RegNatives.size())
@ -83,55 +79,37 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
return 0; return 0;
} }
/* Save old values on ZE STACK */ if (pNative->caller)
AMX *pSaveCaller = g_pCaller;
cell saveParams[CALLFUNC_MAXPARAMS];
regnative *pSaveNative = g_pCurNative;
int saveError = g_CurError;
if (pSaveNative)
{ {
for (ucell i = 0; i <= g_Params[0] / sizeof(cell); i++) LogError(amx, AMX_ERR_NATIVE, "Bug caught! Please contact the AMX Mod X Dev Team.");
{ return 0;
saveParams[i] = g_Params[i];
}
} }
/* Save current info */ //parameter stack
g_CurError = AMX_ERR_NONE; //NOTE: it is possible that recursive register native calling
g_pCaller = amx; // could potentially be somehow damaged here.
g_pCurNative = pNative; //so, a :TODO: - make the stack unique, rather than a known ptr
pNative->caller = amx;
int err = 0; int err = 0;
cell ret = 0; cell ret = 0;
g_ErrorStk.push(0);
g_NativeStack.push(pNative);
if (pNative->style == 0) if (pNative->style == 0)
{ {
amx_Push(pNative->amx, numParams); amx_Push(pNative->amx, numParams);
amx_Push(pNative->amx, pPlugin->getId()); amx_Push(pNative->amx, pPlugin->getId());
for (int i=numParams; i>=0; i--) for (int i=numParams; i>=0; i--)
{ pNative->params[i] = params[i];
g_Params[i] = params[i];
}
} else if (pNative->style == 1) { } else if (pNative->style == 1) {
/** //use dJeyL's system .. very clever!
* use dJeyL's system .. very clever!
* NOTE: clever, but doesn't work at all since the JIT does bounds checking
* this should REALLY be deprecated
*/
for (int i=numParams; i>=1; i--) for (int i=numParams; i>=1; i--)
{
amx_Push(pNative->amx, params[i]); amx_Push(pNative->amx, params[i]);
}
} }
Debugger *pDebugger = (Debugger *)pNative->amx->userdata[UD_DEBUGGER]; Debugger *pDebugger = (Debugger *)pNative->amx->userdata[UD_DEBUGGER];
if (pDebugger) if (pDebugger)
{
pDebugger->BeginExec(); pDebugger->BeginExec();
}
err=amx_Exec(pNative->amx, &ret, pNative->func); err=amx_Exec(pNative->amx, &ret, pNative->func);
if (err != AMX_ERR_NONE) if (err != AMX_ERR_NONE)
{ {
if (pDebugger && pDebugger->ErrorExists()) if (pDebugger && pDebugger->ErrorExists())
@ -144,26 +122,15 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
pNative->amx->error = AMX_ERR_NONE; pNative->amx->error = AMX_ERR_NONE;
//furthermore, log an error in the parent plugin. //furthermore, log an error in the parent plugin.
LogError(amx, AMX_ERR_NATIVE, "Unhandled dynamic native error"); LogError(amx, AMX_ERR_NATIVE, "Unhandled dynamic native error");
} else if (g_CurError != AMX_ERR_NONE) { } else if (g_ErrorStk.front()) {
LogError(amx, g_CurError, g_errorStr); LogError(amx, g_ErrorStk.front(), g_errorStr);
} }
if (pDebugger) if (pDebugger)
{
pDebugger->EndExec(); pDebugger->EndExec();
} g_NativeStack.pop();
g_ErrorStk.pop();
/* Restore everything */ pNative->caller = NULL;
g_pCurNative = pSaveNative;
g_CurError = saveError;
g_pCaller = pSaveCaller;
if (pSaveNative)
{
for (ucell i = 0; i <= saveParams[0] / sizeof(cell); i++)
{
g_Params[i] = saveParams[i];
}
}
return ret; return ret;
} }
@ -171,9 +138,7 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
AMX_NATIVE_INFO *BuildNativeTable() AMX_NATIVE_INFO *BuildNativeTable()
{ {
if (g_RegNatives.size() < 1) if (g_RegNatives.size() < 1)
{
return NULL; return NULL;
}
AMX_NATIVE_INFO *pNatives = new AMX_NATIVE_INFO[g_RegNatives.size() + 1]; AMX_NATIVE_INFO *pNatives = new AMX_NATIVE_INFO[g_RegNatives.size() + 1];
@ -199,7 +164,8 @@ static cell AMX_NATIVE_CALL log_error(AMX *amx, cell *params)
char *err = format_amxstring(amx, params, 2, len); char *err = format_amxstring(amx, params, 2, len);
_snprintf(g_errorStr, sizeof(g_errorStr), "%s", err); _snprintf(g_errorStr, sizeof(g_errorStr), "%s", err);
g_CurError = params[1]; g_ErrorStk.pop();
g_ErrorStk.push(params[1]);
return 1; return 1;
} }
@ -207,12 +173,13 @@ static cell AMX_NATIVE_CALL log_error(AMX *amx, cell *params)
//get_string(param, dest[], len) //get_string(param, dest[], len)
static cell AMX_NATIVE_CALL get_string(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_string(AMX *amx, cell *params)
{ {
if (!g_pCurNative || (g_pCurNative->amx != amx)) if (!g_NativeStack.size())
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
if (g_pCurNative->style) regnative *pNative = g_NativeStack.front();
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
@ -220,19 +187,20 @@ static cell AMX_NATIVE_CALL get_string(AMX *amx, cell *params)
int p = params[1]; int p = params[1];
int len; int len;
char *str = get_amxstring(g_pCaller, g_Params[p], 0, len); char *str = get_amxstring(pNative->caller, pNative->params[p], 0, len);
return set_amxstring(amx, params[2], str, params[3]); return set_amxstring(amx, params[2], str, params[3]);
} }
//set_string(param, source[], maxlen) //set_string(param, source[], maxlen)
static cell AMX_NATIVE_CALL set_string(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_string(AMX *amx, cell *params)
{ {
if (!g_pCurNative || (g_pCurNative->amx != amx)) if (!g_NativeStack.size())
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
if (g_pCurNative->style) regnative *pNative = g_NativeStack.front();
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
@ -242,44 +210,46 @@ static cell AMX_NATIVE_CALL set_string(AMX *amx, cell *params)
int len; int len;
char *str = get_amxstring(amx, params[2], 0, len); char *str = get_amxstring(amx, params[2], 0, len);
return set_amxstring(g_pCaller, g_Params[p], str, params[3]); return set_amxstring(pNative->caller, pNative->params[p], str, params[3]);
} }
//get a byvalue parameter //get a byvalue parameter
//get_param(num) //get_param(num)
static cell AMX_NATIVE_CALL get_param(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_param(AMX *amx, cell *params)
{ {
if (!g_pCurNative || (g_pCurNative->amx != amx)) if (!g_NativeStack.size())
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
if (g_pCurNative->style) regnative *pNative = g_NativeStack.front();
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
int p = params[1]; int p = params[1];
return g_Params[p]; return pNative->params[p];
} }
//get_param_byref(num) //get_param_byref(num)
static cell AMX_NATIVE_CALL get_param_byref(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_param_byref(AMX *amx, cell *params)
{ {
if (!g_pCurNative || (g_pCurNative->amx != amx)) if (!g_NativeStack.size())
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
if (g_pCurNative->style) regnative *pNative = g_NativeStack.front();
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
int p = params[1]; int p = params[1];
cell *addr = get_amxaddr(g_pCaller, g_Params[p]); cell *addr = get_amxaddr(pNative->caller, pNative->params[p]);
return addr[0]; return addr[0];
} }
@ -287,19 +257,20 @@ static cell AMX_NATIVE_CALL get_param_byref(AMX *amx, cell *params)
//set_param_byref(num, val) //set_param_byref(num, val)
static cell AMX_NATIVE_CALL set_param_byref(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_param_byref(AMX *amx, cell *params)
{ {
if (!g_pCurNative || (g_pCurNative->amx != amx)) if (!g_NativeStack.size())
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
if (g_pCurNative->style) regnative *pNative = g_NativeStack.front();
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
int p = params[1]; int p = params[1];
cell *addr = get_amxaddr(g_pCaller, g_Params[p]); cell *addr = get_amxaddr(pNative->caller, pNative->params[p]);
addr[0] = params[2]; addr[0] = params[2];
@ -309,19 +280,20 @@ static cell AMX_NATIVE_CALL set_param_byref(AMX *amx, cell *params)
//get_array(param, dest[], size) //get_array(param, dest[], size)
static cell AMX_NATIVE_CALL get_array(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_array(AMX *amx, cell *params)
{ {
if (!g_pCurNative || (g_pCurNative->amx != amx)) if (!g_NativeStack.size())
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
if (g_pCurNative->style) regnative *pNative = g_NativeStack.front();
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
int p = params[1]; int p = params[1];
cell *source = get_amxaddr(g_pCaller, g_Params[p]); cell *source = get_amxaddr(pNative->caller, pNative->params[p]);
cell *dest = get_amxaddr(amx, params[2]); cell *dest = get_amxaddr(amx, params[2]);
int size = params[3]; int size = params[3];
@ -334,19 +306,20 @@ static cell AMX_NATIVE_CALL get_array(AMX *amx, cell *params)
//set_array(param, source[], size) //set_array(param, source[], size)
static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
{ {
if (!g_pCurNative || (g_pCurNative->amx != amx)) if (!g_NativeStack.size())
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
if (g_pCurNative->style) regnative *pNative = g_NativeStack.front();
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
int p = params[1]; int p = params[1];
cell *dest = get_amxaddr(g_pCaller, g_Params[p]); cell *dest = get_amxaddr(pNative->caller, pNative->params[p]);
cell *source = get_amxaddr(amx, params[2]); cell *source = get_amxaddr(amx, params[2]);
int size = params[3]; int size = params[3];
@ -358,13 +331,15 @@ static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params) static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
{ {
if (!g_pCurNative || (g_pCurNative->amx != amx)) if (!g_NativeStack.size())
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
if (g_pCurNative->style) regnative *pNative = g_NativeStack.front();
if (pNative->style)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
@ -373,7 +348,10 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
int vargPos = static_cast<int>(params[4]); int vargPos = static_cast<int>(params[4]);
int fargPos = static_cast<int>(params[3]); int fargPos = static_cast<int>(params[3]);
cell max = g_Params[0] / sizeof(cell); /** get the parent parameter array */
cell *local_params = pNative->params;
cell max = local_params[0] / sizeof(cell);
if (vargPos > (int)max + 1) if (vargPos > (int)max + 1)
{ {
LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos); LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos);
@ -396,7 +374,7 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
} }
fmt = get_amxaddr(amx, params[5]); fmt = get_amxaddr(amx, params[5]);
} else { } else {
fmt = get_amxaddr(g_pCaller, g_Params[fargPos]); fmt = get_amxaddr(pNative->caller, pNative->params[fargPos]);
} }
cell *realdest = get_amxaddr(amx, params[1]); cell *realdest = get_amxaddr(amx, params[1]);
size_t maxlen = static_cast<size_t>(params[2]); size_t maxlen = static_cast<size_t>(params[2]);
@ -407,7 +385,7 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
dest = cpbuf; dest = cpbuf;
/* perform format */ /* perform format */
size_t total = atcprintf(dest, maxlen, fmt, g_pCaller, g_Params, &vargPos); size_t total = atcprintf(dest, maxlen, fmt, pNative->caller, local_params, &vargPos);
/* copy back */ /* copy back */
memcpy(realdest, dest, (total+1) * sizeof(cell)); memcpy(realdest, dest, (total+1) * sizeof(cell));
@ -421,19 +399,20 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
//I've no idea how he thought of this, but it's great. No idea how well it works. //I've no idea how he thought of this, but it's great. No idea how well it works.
static cell AMX_NATIVE_CALL param_convert(AMX *amx, cell *params) static cell AMX_NATIVE_CALL param_convert(AMX *amx, cell *params)
{ {
if (!g_pCurNative || (g_pCurNative->amx != amx)) if (!g_NativeStack.size())
{ {
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
return 0; return 0;
} }
if (g_pCurNative->style != 1) regnative *pNative = g_NativeStack.front();
if (pNative->style != 1)
{ {
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native"); LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
return 0; return 0;
} }
cell p = params[1]; cell p = params[1];
AMX *caller = g_pCaller; AMX *caller = pNative->caller;
unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat; unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat;
unsigned char *realdata = caller->base+(int)((AMX_HEADER *)caller->base)->dat; unsigned char *realdata = caller->base+(int)((AMX_HEADER *)caller->base)->dat;
@ -475,6 +454,7 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
regnative *pNative = new regnative; regnative *pNative = new regnative;
pNative->amx = amx; pNative->amx = amx;
pNative->func = idx; pNative->func = idx;
pNative->caller = NULL;
//we'll apply a safety buffer too //we'll apply a safety buffer too
//make our function //make our function

View File

@ -50,7 +50,9 @@ struct regnative
String name; String name;
char *pfn; char *pfn;
int func; int func;
AMX *caller;
int style; int style;
cell params[CALLFUNC_MAXPARAMS];
}; };
extern "C" void amxx_DynaInit(void *ptr); extern "C" void amxx_DynaInit(void *ptr);

View File

@ -29,7 +29,6 @@
*/ */
#include "amxmodx.h" #include "amxmodx.h"
#include "CMenu.h"
#include "newmenus.h" #include "newmenus.h"
CVector<Menu *> g_NewMenus; CVector<Menu *> g_NewMenus;
@ -38,15 +37,11 @@ CStack<int> g_MenuFreeStack;
void ClearMenus() void ClearMenus()
{ {
for (size_t i = 0; i < g_NewMenus.size(); i++) for (size_t i = 0; i < g_NewMenus.size(); i++)
{
delete g_NewMenus[i]; delete g_NewMenus[i];
}
g_NewMenus.clear(); g_NewMenus.clear();
while (!g_MenuFreeStack.empty()) while (!g_MenuFreeStack.empty())
{
g_MenuFreeStack.pop(); g_MenuFreeStack.pop();
}
} }
void validate_menu_text(char *str) void validate_menu_text(char *str)
@ -61,7 +56,7 @@ void validate_menu_text(char *str)
str++; str++;
char c = tolower(*str); char c = tolower(*str);
if (c == 'r' || c == 'w' if (c == 'r' || c == 'w'
|| c== 'y' || c == 'd') || c== 'w' || c == 'd')
{ {
str++; str++;
offs += 2; offs += 2;
@ -69,51 +64,42 @@ void validate_menu_text(char *str)
} }
} }
if (offs) if (offs)
{
*(str-offs) = *str; *(str-offs) = *str;
}
str++; str++;
} }
if (offs) if (offs)
{
*(str-offs) = '\0'; *(str-offs) = '\0';
}
} }
} }
Menu::Menu(const char *title, AMX *amx, int fid) : m_Title(title), m_ItemColor("\\r"), Menu::Menu(const char *title, int mid, int tid)
m_NeverExit(false), m_AutoColors(g_coloredmenus), thisId(0), func(fid),
isDestroying(false), items_per_page(7)
{ {
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx); m_Title.assign(title);
menuId = g_menucmds.registerMenuId(title, amx); menuId = mid;
thisId = tid;
if (strcmp(pPlugin->getName(), "war3ft.amxx") == 0)
{
const char *version = pPlugin->getVersion();
if (strncmp(pPlugin->getVersion(), "3.0 RC", 6) == 0
&& atoi(&version[6]) <= 8)
{
g_menucmds.registerMenuCmd(
g_plugins.findPluginFast(amx),
menuId,
-1,
g_forwards.duplicateSPForward(fid),
true);
}
}
m_OptNames[abs(MENU_BACK)].assign("Back"); m_OptNames[abs(MENU_BACK)].assign("Back");
m_OptNames[abs(MENU_MORE)].assign("More"); m_OptNames[abs(MENU_MORE)].assign("More");
m_OptNames[abs(MENU_EXIT)].assign("Exit"); m_OptNames[abs(MENU_EXIT)].assign("Exit");
m_OptOrders[0] = MENU_BACK;
m_OptOrders[1] = MENU_MORE;
m_OptOrders[2] = MENU_EXIT;
m_AlwaysExit = false;
m_NeverExit = false;
m_AutoColors = g_coloredmenus;
items_per_page = 7;
func = 0;
padding = 0;
isDestroying = false;
} }
Menu::~Menu() Menu::~Menu()
{ {
for (size_t i = 0; i < m_Items.size(); i++) for (size_t i = 0; i < m_Items.size(); i++)
{
delete m_Items[i]; delete m_Items[i];
}
unregisterSPForward(this->func); unregisterSPForward(this->func);
@ -153,9 +139,7 @@ size_t Menu::GetPageCount()
{ {
size_t items = GetItemCount(); size_t items = GetItemCount();
if (items_per_page == 0) if (items_per_page == 0)
{
return 1; return 1;
}
return ((items/items_per_page) + ((items % items_per_page) ? 1 : 0)); return ((items/items_per_page) + ((items % items_per_page) ? 1 : 0));
} }
@ -168,123 +152,34 @@ int Menu::PagekeyToItem(page_t page, item_t key)
if (num_pages == 1 || !items_per_page) if (num_pages == 1 || !items_per_page)
{ {
if (key > m_Items.size()) if (key > m_Items.size())
{
return MENU_EXIT; return MENU_EXIT;
} else { else
return key-1; return key-1;
}
} else { } else {
//first page //first page
if (page == 0) if (page == 0)
{ {
/* The algorithm for spaces here is same as a middle page. */ if (key == items_per_page + 1)
item_t new_key = key;
for (size_t i=start; i<(start+key-1) && i<m_Items.size(); i++)
{
for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
{
if (m_Items[i]->blanks[j].EatNumber())
{
if (!new_key)
{
break;
}
new_key--;
}
if (!new_key)
{
break;
}
}
}
key = new_key;
if (key == items_per_page + 2)
{
return MENU_MORE; return MENU_MORE;
} else if (key == items_per_page + 3) { else if (key == items_per_page + 2)
return MENU_EXIT;
else
return (start + key - 1);
} else if (page == num_pages - 1) {
//last page
size_t remaining = m_Items.size() - start;
if (key == remaining + 1)
{
return MENU_BACK;
} else if (key == remaining + 2) {
return MENU_EXIT; return MENU_EXIT;
} else { } else {
return (start + key - 1); return (start + key - 1);
} }
} else if (page == num_pages - 1) {
//last page
item_t item_tracker = 0; // tracks how many valid items we have passed so far.
size_t remaining = m_Items.size() - start;
item_t new_key = key;
// For every item that takes up a slot (item or padded blank)
// we subtract one from new key.
// For every item (not blanks), we increase item_tracker.
// When new_key equals 0, item_tracker will then be set to
// whatever valid item was selected.
for (size_t i=m_Items.size() - remaining; i<m_Items.size(); i++)
{
item_tracker++;
if (new_key<=1) // If new_key is 0, or will be 0 after the next decrease
{
new_key=0;
break;
}
new_key--;
for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
{
if (m_Items[i]->blanks[j].EatNumber())
{
new_key--;
}
if (!new_key)
{
break;
}
}
}
// If new_key doesn't equal zero, then a back/exit button was pressed.
if (new_key!=0)
{
if (key == items_per_page + 1)
{
return MENU_BACK;
}
else if (key == items_per_page + 3)
{
return MENU_EXIT;
}
// MENU_MORE should never happen here.
}
// otherwise our item is now start + item_tracker - 1
return (start + item_tracker - 1);
} else { } else {
/* The algorithm for spaces here is a bit harder. We have to subtract
* one from the key for each space we find along the way.
*/
item_t new_key = key;
for (size_t i=start; i<(start+items_per_page-1) && i<m_Items.size(); i++)
{
for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
{
if (m_Items[i]->blanks[j].EatNumber())
{
if (!new_key)
{
break;
}
new_key--;
}
if (!new_key)
{
break;
}
}
}
key = new_key;
if (key > items_per_page && (key-items_per_page<=3)) if (key > items_per_page && (key-items_per_page<=3))
{ {
unsigned int num = key - items_per_page - 1; return m_OptOrders[key-items_per_page-1];
static int map[] = {MENU_BACK, MENU_MORE, MENU_EXIT};
return map[num];
} else { } else {
return (start + key - 1); return (start + key - 1);
} }
@ -345,10 +240,10 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
{ {
Display_Back = (1<<0), Display_Back = (1<<0),
Display_Next = (1<<1), Display_Next = (1<<1),
Display_Exit = (1<<2),
}; };
int flags = Display_Back|Display_Next; int flags = Display_Back|Display_Next;
item_t start = page * items_per_page; item_t start = page * items_per_page;
item_t end = 0; item_t end = 0;
if (items_per_page) if (items_per_page)
@ -360,18 +255,17 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
} else { } else {
end = start + items_per_page - 1; end = start + items_per_page - 1;
} }
if (!m_NeverExit && (m_AlwaysExit || (page == 0 || page == pages-1)))
flags |= Display_Exit;
} else { } else {
end = numItems - 1; end = numItems - 1;
if (end > 10) if (end > 10)
{
end = 10; end = 10;
} flags = 0;
} }
if (page == 0) if (page == 0)
{
flags &= ~Display_Back; flags &= ~Display_Back;
}
menuitem *pItem = NULL; menuitem *pItem = NULL;
@ -380,66 +274,46 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
bool enabled = true; bool enabled = true;
int ret = 0; int ret = 0;
int slots = 0; int slots = 0;
int option_display = 0;
for (item_t i = start; i <= end; i++) for (item_t i = start; i <= end; i++)
{ {
// reset enabled
enabled = true;
pItem = m_Items[i]; pItem = m_Items[i];
if (pItem->access && !(pItem->access & g_players[player].flags[0])) if (pItem->access && !(pItem->access & g_players[player].flags[0]))
{
enabled = false; enabled = false;
}
if (pItem->handler != -1) if (pItem->handler != -1)
{ {
ret = executeForwards(pItem->handler, static_cast<cell>(player), static_cast<cell>(thisId), static_cast<cell>(i)); ret = executeForwards(pItem->handler, static_cast<cell>(player), static_cast<cell>(thisId), static_cast<cell>(i));
if (ret == ITEM_ENABLED) if (ret == ITEM_ENABLED)
{
enabled = true; enabled = true;
} else if (ret == ITEM_DISABLED) { else if (ret == ITEM_DISABLED)
enabled = false; enabled = false;
}
} }
if (pItem->pfn) if (pItem->pfn)
{ {
ret = (pItem->pfn)(player, thisId, i); ret = (pItem->pfn)(player, thisId, i);
if (ret == ITEM_ENABLED) if (ret == ITEM_ENABLED)
{
enabled = true; enabled = true;
} else if (ret == ITEM_DISABLED) { else if (ret == ITEM_DISABLED)
enabled = false; enabled = false;
}
} }
if (enabled) if (enabled)
{ {
keys |= (1<<option); keys |= (1<<option);
}
option_display = ++option;
if (option_display == 10)
{
option_display = 0;
}
if (enabled)
{
if (m_AutoColors) if (m_AutoColors)
{ _snprintf(buffer, sizeof(buffer)-1, "\\r%d.\\w %s\n", ++option, pItem->name.c_str());
_snprintf(buffer, sizeof(buffer)-1, "%s%d.\\w %s\n", m_ItemColor.c_str(),option_display, pItem->name.c_str()); else
} else { _snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", ++option, pItem->name.c_str());
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", option_display, pItem->name.c_str());
}
} else { } else {
if (m_AutoColors) if (m_AutoColors)
{ {
_snprintf(buffer, sizeof(buffer)-1, "\\d%d. %s\n\\w", option_display, pItem->name.c_str()); _snprintf(buffer, sizeof(buffer)-1, "\\d%d. %s\n\\w", ++option, pItem->name.c_str());
} else { } else {
_snprintf(buffer, sizeof(buffer)-1, "#. %s\n", pItem->name.c_str()); _snprintf(buffer, sizeof(buffer)-1, "#. %s\n", pItem->name.c_str());
option++;
} }
} }
slots++; slots++;
@ -451,120 +325,79 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
{ {
for (size_t j=0; j<pItem->blanks.size(); j++) for (size_t j=0; j<pItem->blanks.size(); j++)
{ {
if (pItem->blanks[j].EatNumber()) if (pItem->blanks[j] == 1)
{
option++; option++;
}
m_Text.append(pItem->blanks[j].GetDisplay());
m_Text.append("\n"); m_Text.append("\n");
slots++; slots++;
} }
} }
} }
if (items_per_page) if (padding == 1 && items_per_page)
{ {
/* Pad spaces until we reach the end of the max possible items */ int pad = items_per_page;
for (unsigned int i=(unsigned)slots; i<items_per_page; i++) if (flags & Display_Back)
pad--;
if (flags & Display_Next)
pad--;
if (flags & Display_Exit)
pad--;
for (int i=slots+1; i<=pad; i++)
{ {
m_Text.append("\n"); m_Text.append("\n");
option++; option++;
} }
/* Make sure there is at least one visual pad */ }
m_Text.append("\n");
/* Don't bother if there is only one page */ for (int i=0; i<3; i++)
if (pages > 1) {
switch (m_OptOrders[i])
{ {
if (flags & Display_Back) case MENU_BACK:
{ {
keys |= (1<<option++); if (flags & Display_Back)
if (m_AutoColors)
{ {
keys |= (1<<option++);
_snprintf(buffer, _snprintf(buffer,
sizeof(buffer)-1, sizeof(buffer)-1,
"%s%d. \\w%s\n", m_AutoColors ? "\\r%d. \\w%s\n" : "%d. %s\n",
m_ItemColor.c_str(), option,
option == 10 ? 0 : option, m_OptNames[abs(MENU_BACK)].c_str()
m_OptNames[abs(MENU_BACK)].c_str()); );
} else { m_Text.append(buffer);
_snprintf(buffer,
sizeof(buffer)-1,
"%d. %s\n",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_BACK)].c_str());
}
} else {
option++;
if (m_AutoColors)
{
_snprintf(buffer,
sizeof(buffer)-1,
"\\d%d. %s\n\\w",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_BACK)].c_str());
} else {
_snprintf(buffer, sizeof(buffer)-1, "#. %s\n", m_OptNames[abs(MENU_BACK)].c_str());
} }
break;
} }
m_Text.append(buffer); case MENU_MORE:
if (flags & Display_Next)
{ {
keys |= (1<<option++); if (flags & Display_Next)
if (m_AutoColors)
{ {
keys |= (1<<option++);
_snprintf(buffer, _snprintf(buffer,
sizeof(buffer)-1, sizeof(buffer)-1,
"%s%d. \\w%s\n", m_AutoColors ? "\\r%d. \\w%s\n" : "%d. %s\n",
m_ItemColor.c_str(), option,
option == 10 ? 0 : option, m_OptNames[abs(MENU_MORE)].c_str()
m_OptNames[abs(MENU_MORE)].c_str()); );
} else { m_Text.append(buffer);
_snprintf(buffer,
sizeof(buffer)-1,
"%d. %s\n",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_MORE)].c_str());
}
} else {
option++;
if (m_AutoColors)
{
_snprintf(buffer,
sizeof(buffer)-1,
"\\d%d. %s\n\\w",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_MORE)].c_str());
} else {
_snprintf(buffer, sizeof(buffer)-1, "#. %s\n", m_OptNames[abs(MENU_MORE)].c_str());
} }
break;
} }
m_Text.append(buffer); case MENU_EXIT:
} else {
/* Keep padding */
option += 2;
}
if (!m_NeverExit)
{
keys |= (1<<option++);
if (m_AutoColors)
{ {
_snprintf(buffer, if (flags & Display_Exit)
sizeof(buffer)-1, {
"%s%d. \\w%s\n", keys |= (1<<option++);
m_ItemColor.c_str(), _snprintf(buffer,
option == 10 ? 0 : option, sizeof(buffer)-1,
m_OptNames[abs(MENU_EXIT)].c_str()); m_AutoColors ? "\\r%d. \\w%s\n" : "%d. %s\n",
} else { option,
_snprintf(buffer, m_OptNames[abs(MENU_EXIT)].c_str()
sizeof(buffer)-1, );
"%d. %s\n", m_Text.append(buffer);
option == 10 ? 0 : option, }
m_OptNames[abs(MENU_EXIT)].c_str()); break;
} }
m_Text.append(buffer);
} }
} }
@ -593,21 +426,27 @@ static cell AMX_NATIVE_CALL menu_create(AMX *amx, cell *params)
return 0; return 0;
} }
Menu *pMenu = new Menu(title, amx, func); int id = g_menucmds.registerMenuId(title, amx);
g_menucmds.registerMenuCmd(g_plugins.findPluginFast(amx), id, 1023, func);
Menu *pMenu = new Menu(title, id, 0);
pMenu->func = func;
if (g_MenuFreeStack.empty()) if (g_MenuFreeStack.empty())
{ {
g_NewMenus.push_back(pMenu); g_NewMenus.push_back(pMenu);
pMenu->thisId = (int)g_NewMenus.size() - 1; pMenu->thisId = (int)g_NewMenus.size() - 1;
return (int)g_NewMenus.size() - 1;
} else { } else {
int pos = g_MenuFreeStack.front(); int pos = g_MenuFreeStack.front();
g_MenuFreeStack.pop(); g_MenuFreeStack.pop();
g_NewMenus[pos] = pMenu; g_NewMenus[pos] = pMenu;
pMenu->thisId = pos; pMenu->thisId = pos;
return pos;
} }
return pMenu->thisId;
} }
static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params) static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params)
{ {
GETMENU(params[1]); GETMENU(params[1]);
@ -625,51 +464,7 @@ static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params)
} }
menuitem *item = pMenu->m_Items[pMenu->m_Items.size() - 1]; menuitem *item = pMenu->m_Items[pMenu->m_Items.size() - 1];
item->blanks.push_back(params[2]);
BlankItem a;
a.SetBlank();
if (params[2] == 1)
a.SetEatNumber(true);
else
a.SetEatNumber(false);
item->blanks.push_back(a);
return 1;
}
static cell AMX_NATIVE_CALL menu_addtext(AMX *amx, cell *params)
{
GETMENU(params[1]);
if (params[2] && (!pMenu->items_per_page && pMenu->GetItemCount() >= 10))
{
LogError(amx, AMX_ERR_NATIVE, "Non-paginated menus are limited to 10 items.");
return 0;
}
if (!pMenu->m_Items.size())
{
LogError(amx, AMX_ERR_NATIVE, "Blanks can only be added after items.");
return 0;
}
menuitem *item = pMenu->m_Items[pMenu->m_Items.size() - 1];
BlankItem a;
int len;
a.SetText(get_amxstring(amx, params[2], 0, len));
if (params[3] == 1)
a.SetEatNumber(true);
else
a.SetEatNumber(false);
item->blanks.push_back(a);
return 1; return 1;
} }
@ -729,36 +524,6 @@ static cell AMX_NATIVE_CALL menu_display(AMX *amx, cell *params)
int page = params[3]; int page = params[3];
CPlayer* pPlayer = GET_PLAYER_POINTER_I(player); CPlayer* pPlayer = GET_PLAYER_POINTER_I(player);
/* If the stupid handler keeps drawing menus,
* We need to keep cancelling them. But we put in a quick infinite loop
* counter to prevent this from going nuts.
*/
int menu;
int loops = 0;
while ((menu = pPlayer->newmenu) >= 0)
{
if ((size_t)menu >= g_NewMenus.size() || !g_NewMenus[menu])
{
break;
}
Menu *pOther = g_NewMenus[menu];
pPlayer->newmenu = -1;
pPlayer->menu = 0;
executeForwards(pOther->func,
static_cast<cell>(player),
static_cast<cell>(pOther->thisId),
static_cast<cell>(MENU_EXIT));
/* Infinite loop counter */
if (++loops >= 10)
{
LogError(amx, AMX_ERR_NATIVE, "Plugin called menu_display when item=MENU_EXIT");
return 0;
}
}
// This will set the expire time of the menu to infinite // This will set the expire time of the menu to infinite
pPlayer->menuexpire = INFINITE; pPlayer->menuexpire = INFINITE;
@ -887,13 +652,6 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
switch (params[2]) switch (params[2])
{ {
case MPROP_SET_NUMBER_COLOR:
{
char *str = get_amxstring(amx, params[3], 0, len);
validate_menu_text(str);
pMenu->m_ItemColor.assign(str);
break;
}
case MPROP_PERPAGE: case MPROP_PERPAGE:
{ {
cell count = *get_amxaddr(amx, params[3]); cell count = *get_amxaddr(amx, params[3]);
@ -929,23 +687,51 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
case MPROP_TITLE: case MPROP_TITLE:
{ {
char *str = get_amxstring(amx, params[3], 0, len); char *str = get_amxstring(amx, params[3], 0, len);
int old = pMenu->menuId;
g_menucmds.removeMenuId(old);
pMenu->m_Title.assign(str); pMenu->m_Title.assign(str);
pMenu->menuId = g_menucmds.registerMenuId(str, amx);
g_menucmds.registerMenuCmd(
g_plugins.findPluginFast(amx),
pMenu->menuId,
1023,
pMenu->func);
CPlayer *pl;
/**
* NOTE - this is actually bogus
* the client's screen won't actually match the cmd here
* I think, this scenario needs to be tested.
*/
for (int i=1; i<=gpGlobals->maxClients; i++)
{
pl = GET_PLAYER_POINTER_I(i);
if (pl->menu == old)
pl->menu = pMenu->menuId;
}
break; break;
} }
case MPROP_EXITALL: case MPROP_EXITALL:
{ {
cell ans = *get_amxaddr(amx, params[3]); cell ans = *get_amxaddr(amx, params[3]);
if (ans == 1 || ans == 0) if (ans == 1)
{ {
pMenu->m_AlwaysExit = true;
pMenu->m_NeverExit = false;
} else if (ans == 0) {
pMenu->m_AlwaysExit = false;
pMenu->m_NeverExit = false; pMenu->m_NeverExit = false;
} else if (ans == -1) { } else if (ans == -1) {
pMenu->m_NeverExit = true; pMenu->m_NeverExit = true;
pMenu->m_AlwaysExit = false;
} }
break; break;
} }
case MPROP_ORDER: case MPROP_ORDER:
{ {
/* Ignored as of 1.8.0 */ cell *addr = get_amxaddr(amx, params[3]);
pMenu->m_OptOrders[0] = addr[0];
pMenu->m_OptOrders[1] = addr[1];
pMenu->m_OptOrders[2] = addr[2];
break; break;
} }
case MPROP_NOCOLORS: case MPROP_NOCOLORS:
@ -955,7 +741,7 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
} }
case MPROP_PADMENU: case MPROP_PADMENU:
{ {
/* Ignored as of 1.8.0 */ pMenu->padding = *get_amxaddr(amx, params[3]);
break; break;
} }
default: default:
@ -1011,12 +797,10 @@ static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
GETMENU_R(params[1]); GETMENU_R(params[1]);
if (pMenu->isDestroying) if (pMenu->isDestroying)
{
return 0; //prevent infinite recursion return 0; //prevent infinite recursion
}
pMenu->isDestroying = true; pMenu->isDestroying = true;
g_menucmds.removeMenuId(pMenu->menuId);
CPlayer *player; CPlayer *player;
for (int i=1; i<=gpGlobals->maxClients; i++) for (int i=1; i<=gpGlobals->maxClients; i++)
{ {
@ -1059,16 +843,8 @@ static cell AMX_NATIVE_CALL player_menu_info(AMX *amx, cell *params)
*m = player->menu; *m = player->menu;
*n = player->newmenu; *n = player->newmenu;
if (params[0] / sizeof(cell) == 4)
{
cell *addr = get_amxaddr(amx, params[4]);
*addr = player->page;
}
if ( (*m != 0 && *m != -1) || (*n != -1)) if ( (*m != 0 && *m != -1) || (*n != -1))
{
return 1; return 1;
}
return 0; return 0;
} }
@ -1078,7 +854,6 @@ AMX_NATIVE_INFO g_NewMenuNatives[] =
{"menu_create", menu_create}, {"menu_create", menu_create},
{"menu_additem", menu_additem}, {"menu_additem", menu_additem},
{"menu_addblank", menu_addblank}, {"menu_addblank", menu_addblank},
{"menu_addtext", menu_addtext},
{"menu_pages", menu_pages}, {"menu_pages", menu_pages},
{"menu_items", menu_items}, {"menu_items", menu_items},
{"menu_display", menu_display}, {"menu_display", menu_display},

View File

@ -39,7 +39,6 @@
#define ITEM_ENABLED 1 #define ITEM_ENABLED 1
#define ITEM_DISABLED 2 #define ITEM_DISABLED 2
#define MAX_MENU_ITEMS 10
#define MPROP_PERPAGE 1 #define MPROP_PERPAGE 1
#define MPROP_BACKNAME 2 #define MPROP_BACKNAME 2
@ -50,50 +49,9 @@
#define MPROP_ORDER 7 #define MPROP_ORDER 7
#define MPROP_NOCOLORS 8 #define MPROP_NOCOLORS 8
#define MPROP_PADMENU 9 #define MPROP_PADMENU 9
#define MPROP_SET_NUMBER_COLOR 10
typedef int (*MENUITEM_CALLBACK)(int, int, int); typedef int (*MENUITEM_CALLBACK)(int, int, int);
class BlankItem
{
private:
char *m_text;
bool m_num;
public:
BlankItem() : m_text(NULL), m_num(false) { }
BlankItem(BlankItem &src) { this->copyFrom(src); }
~BlankItem() { free(m_text); }
void copyFrom(BlankItem &src)
{
m_text = src.m_text;
m_num = src.m_num;
src.m_text = NULL; // stop the src from freeing the buffer
}
BlankItem &operator = (const BlankItem &src) { this->copyFrom(const_cast<BlankItem&>(src)); return *this; }
/* is this text instead of a blank */
bool IsText() { return m_text != NULL; }
/* is this a blank instead of text */
bool IsBlank() { return m_text == NULL; }
/* does this item take up a number */
bool EatNumber() { return m_num; }
/* the text this item is to display */
const char *GetDisplay() { return m_text == NULL ? "" : m_text; }
/* sets this item to use a blank */
void SetBlank() { free(m_text); m_text = NULL; }
/* sets this item to display text */
void SetText(const char *text) { free(m_text); m_text = strdup(text); }
/* sets whether or not this item takes up a line */
void SetEatNumber(bool val) { m_num = val; }
};
struct menuitem struct menuitem
{ {
String name; String name;
@ -105,7 +63,7 @@ struct menuitem
MENUITEM_CALLBACK pfn; MENUITEM_CALLBACK pfn;
size_t id; size_t id;
CVector<BlankItem> blanks; CVector<int> blanks;
}; };
typedef unsigned int menu_t; typedef unsigned int menu_t;
@ -115,7 +73,7 @@ typedef unsigned int page_t;
class Menu class Menu
{ {
public: public:
Menu(const char *title, AMX *amx, int fid); Menu(const char *title, int menuId, int thisId);
~Menu(); ~Menu();
menuitem *GetMenuItem(item_t item); menuitem *GetMenuItem(item_t item);
@ -134,14 +92,16 @@ public:
String m_Text; String m_Text;
String m_OptNames[4]; String m_OptNames[4];
int m_OptOrders[3];
String m_ItemColor; bool m_AlwaysExit;
bool m_NeverExit; bool m_NeverExit;
bool m_AutoColors; bool m_AutoColors;
int menuId; int menuId;
int thisId; int thisId;
int func; int func;
int padding;
bool isDestroying; bool isDestroying;
public: public:
unsigned int items_per_page; unsigned int items_per_page;

View File

@ -1,23 +0,0 @@
#include <string.h>
#include "nongpl_matches.h"
NONGPL_PLUGIN_T NONGPL_PLUGIN_LIST[] =
{
{"Live", "CZ Gun Game", "czgungame.amxx"},
{"Live", "AMXX Gun Game", "czgungame.amxx"},
{NULL, NULL, NULL},
};
NONGPL_CVAR_T NONGPL_CVAR_LIST[] =
{
{"gg_mode", 0},
{"gg_warmuptimer", 0},
{"gg_ff", 0},
{"gg_fflevel", 0},
{"gg_stats", 0},
{"gg_dm", 0},
{"gg_turbo", 0},
{"amx_ggreset", 1},
{"amx_gg", 1},
{NULL, 0},
};

View File

@ -1,51 +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.
*/
#ifndef _INCLUDE_AMXMODX_NONGPL_MATCHES_H_
#define _INCLUDE_AMXMODX_NONGPL_MATCHES_H_
struct NONGPL_PLUGIN_T
{
const char *author;
const char *title;
const char *filename;
};
struct NONGPL_CVAR_T
{
const char *cvar;
int type;
};
extern NONGPL_PLUGIN_T NONGPL_PLUGIN_LIST[];
extern NONGPL_CVAR_T NONGPL_CVAR_LIST[];
#endif //_INCLUDE_AMXMODX_NONGPL_MATCHES_H_

View File

@ -2284,7 +2284,7 @@ C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_
} }
#ifdef FN_META_QUERY #ifdef FN_META_QUERY
FN_META_QUERY(); return FN_META_QUERY();
#endif // FN_META_QUERY #endif // FN_META_QUERY
return 1; return 1;
@ -2327,7 +2327,7 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
} }
#ifdef FN_META_DETACH #ifdef FN_META_DETACH
FN_META_DETACH(); return FN_META_DETACH();
#endif // FN_META_DETACH #endif // FN_META_DETACH
return TRUE; return TRUE;
} }
@ -2374,7 +2374,7 @@ C_DLLEXPORT void __stdcall GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine,
gpGlobals = pGlobals; gpGlobals = pGlobals;
// NOTE! Have to call logging function _after_ copying into g_engfuncs, so // NOTE! Have to call logging function _after_ copying into g_engfuncs, so
// that g_engfuncs.pfnAlertMessage() can be resolved properly, heh. :) // that g_engfuncs.pfnAlertMessage() can be resolved properly, heh. :)
// UTIL_LogPrintf("[%s] dev: called: GiveFnptrsToDll\n", Plugin_info.logtag); UTIL_LogPrintf("[%s] dev: called: GiveFnptrsToDll\n", Plugin_info.logtag);
// --> ** Function core // --> ** Function core
#ifdef _MSC_VER #ifdef _MSC_VER
@ -2548,14 +2548,6 @@ C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo
// request optional function // request optional function
#define REQFUNC_OPT(name, fptr, type) fptr = (type)reqFnptrFunc(name) #define REQFUNC_OPT(name, fptr, type) fptr = (type)reqFnptrFunc(name)
C_DLLEXPORT int AMXX_CheckGame(const char *game)
{
#ifdef FN_AMXX_CHECKGAME
return FN_AMXX_CHECKGAME(game);
#else
return AMXX_GAME_OK;
#endif
}
C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc) C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
{ {
// Check pointer // Check pointer

View File

@ -10,7 +10,6 @@
// config // config
#include "moduleconfig.h" #include "moduleconfig.h"
#include <stddef.h> // size_t
// metamod include files // metamod include files
#ifdef USE_METAMOD #ifdef USE_METAMOD
#include <extdll.h> #include <extdll.h>
@ -56,9 +55,6 @@ struct amxx_module_info_s
#define AMXX_PARAM 2 /* Invalid parameter */ #define AMXX_PARAM 2 /* Invalid parameter */
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */ #define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
#define AMXX_GAME_OK 0 /* This module can load on the current game mod. */
#define AMXX_GAME_BAD 1 /* This module can not load on the current game mod. */
// *** Small stuff *** // *** Small stuff ***
// The next section is copied from the amx.h file // The next section is copied from the amx.h file
// Copyright (c) ITB CompuPhase, 1997-2005 // Copyright (c) ITB CompuPhase, 1997-2005
@ -1081,7 +1077,7 @@ void FN_AlertMessage(ALERT_TYPE atype, char *szFmt, ...);
#endif // FN_AlertMessage #endif // FN_AlertMessage
#ifdef FN_EngineFprintf #ifdef FN_EngineFprintf
void FN_EngineFprintf(void *pfile, char *szFmt, ...); void FN_EngineFprintf(FILE *pfile, char *szFmt, ...);
#endif // FN_EngineFprintf #endif // FN_EngineFprintf
#ifdef FN_PvAllocEntPrivateData #ifdef FN_PvAllocEntPrivateData
@ -1145,11 +1141,11 @@ void FN_GetBonePosition(const edict_t *pEdict, int iBone, float *rgflOrigin, flo
#endif // FN_GetBonePosition #endif // FN_GetBonePosition
#ifdef FN_FunctionFromName #ifdef FN_FunctionFromName
uint32 FN_FunctionFromName(const char *pName); unsigned long FN_FunctionFromName(const char *pName);
#endif // FN_FunctionFromName #endif // FN_FunctionFromName
#ifdef FN_NameForFunction #ifdef FN_NameForFunction
const char *FN_NameForFunction(uint32); const char *FN_NameForFunction(unsigned long function);
#endif // FN_NameForFunction #endif // FN_NameForFunction
#ifdef FN_ClientPrintf #ifdef FN_ClientPrintf
@ -1193,7 +1189,7 @@ CRC32_t FN_CRC32_Final(CRC32_t pulCRC);
#endif // FN_CRC32_Final #endif // FN_CRC32_Final
#ifdef FN_RandomLong #ifdef FN_RandomLong
int32 FN_RandomLong(int32 lLow, int32 lHigh); long FN_RandomLong(long lLow, long lHigh);
#endif // FN_RandomLong #endif // FN_RandomLong
#ifdef FN_RandomFloat #ifdef FN_RandomFloat
@ -1662,11 +1658,11 @@ void FN_AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...);
#endif // FN_AlertMessage_Post #endif // FN_AlertMessage_Post
#ifdef FN_EngineFprintf_Post #ifdef FN_EngineFprintf_Post
void FN_EngineFprintf_Post(void *pfile, char *szFmt, ...); void FN_EngineFprintf_Post(FILE *pfile, char *szFmt, ...);
#endif // FN_EngineFprintf_Post #endif // FN_EngineFprintf_Post
#ifdef FN_PvAllocEntPrivateData_Post #ifdef FN_PvAllocEntPrivateData_Post
void *FN_PvAllocEntPrivateData_Post(edict_t *pEdict, int32 cb); void *FN_PvAllocEntPrivateData_Post(edict_t *pEdict, long cb);
#endif // FN_PvAllocEntPrivateData_Post #endif // FN_PvAllocEntPrivateData_Post
#ifdef FN_PvEntPrivateData_Post #ifdef FN_PvEntPrivateData_Post
@ -1726,11 +1722,11 @@ void FN_GetBonePosition_Post(const edict_t *pEdict, int iBone, float *rgflOrigin
#endif // FN_GetBonePosition_Post #endif // FN_GetBonePosition_Post
#ifdef FN_FunctionFromName_Post #ifdef FN_FunctionFromName_Post
uint32 FN_FunctionFromName_Post(const char *pName); unsigned long FN_FunctionFromName_Post(const char *pName);
#endif // FN_FunctionFromName_Post #endif // FN_FunctionFromName_Post
#ifdef FN_NameForFunction_Post #ifdef FN_NameForFunction_Post
const char *FN_NameForFunction_Post(uint32); const char *FN_NameForFunction_Post(unsigned long function);
#endif // FN_NameForFunction_Post #endif // FN_NameForFunction_Post
#ifdef FN_ClientPrintf_Post #ifdef FN_ClientPrintf_Post
@ -1774,7 +1770,7 @@ CRC32_t FN_CRC32_Final_Post(CRC32_t pulCRC);
#endif // FN_CRC32_Final_Post #endif // FN_CRC32_Final_Post
#ifdef FN_RandomLong_Post #ifdef FN_RandomLong_Post
int32 FN_RandomLong_Post(int32 lLow, int32 lHigh); long FN_RandomLong_Post(long lLow, long lHigh);
#endif // FN_RandomLong_Post #endif // FN_RandomLong_Post
#ifdef FN_RandomFloat_Post #ifdef FN_RandomFloat_Post
@ -2027,10 +2023,6 @@ int FN_ShouldCollide_Post(edict_t *pentTouched, edict_t *pentOther);
void FN_AMXX_QUERY(void); void FN_AMXX_QUERY(void);
#endif // FN_AMXX_QUERY #endif // FN_AMXX_QUERY
#ifdef FN_AMXX_CHECKGAME
int FN_AMXX_CHECKGAME(const char *);
#endif // FN_AMXX_CHECKGAME
#ifdef FN_AMXX_ATTACH #ifdef FN_AMXX_ATTACH
void FN_AMXX_ATTACH(void); void FN_AMXX_ATTACH(void);
#endif // FN_AMXX_ATTACH #endif // FN_AMXX_ATTACH

View File

@ -54,12 +54,6 @@
/** AMXX query */ /** AMXX query */
//#define FN_AMXX_QUERY OnAmxxQuery //#define FN_AMXX_QUERY OnAmxxQuery
/** AMXX Check Game - module API is NOT available here.
* Return AMXX_GAME_OK if this module can load on the game, AMXX_GAME_BAD if it cannot.
* syntax: int AmxxCheckGame(const char *game)
*/
//#define FN_AMXX_CHECKGAME AmxxCheckGame
/** AMXX attach /** AMXX attach
* Do native functions init here (MF_AddNatives) * Do native functions init here (MF_AddNatives)
*/ */

File diff suppressed because it is too large Load Diff

View File

@ -265,7 +265,6 @@ static cell AMX_NATIVE_CALL SortCustom1D(AMX *amx, cell *params)
qsort(array, array_size, sizeof(cell), sort1d_amx_custom); qsort(array, array_size, sizeof(cell), sort1d_amx_custom);
g_AMXSortStack.pop(); g_AMXSortStack.pop();
unregisterSPForward(pfn);
delete pInfo; delete pInfo;
return 1; return 1;

View File

@ -39,7 +39,7 @@ void amx_command()
{ {
print_srvconsole("Currently loaded plugins:\n"); print_srvconsole("Currently loaded plugins:\n");
print_srvconsole(" %-23.22s %-11.10s %-17.16s %-16.15s %-9.8s\n", "name", "version", "author", "file", "status"); print_srvconsole(" %-23.22s %-8.7s %-17.16s %-16.15s %-9.8s\n", "name", "version", "author", "file", "status");
int plugins = 0; int plugins = 0;
int running = 0; int running = 0;
@ -52,7 +52,7 @@ void amx_command()
if ((*a).isValid() && !(*a).isPaused()) if ((*a).isValid() && !(*a).isPaused())
++running; ++running;
print_srvconsole(" [%3d] %-23.22s %-11.10s %-17.16s %-16.15s %-9.8s\n", plugins, (*a).getTitle(), (*a).getVersion(), (*a).getAuthor(), (*a).getName(), (*a).getStatus()); print_srvconsole(" [%3d] %-23.22s %-8.7s %-17.16s %-16.15s %-9.8s\n", plugins, (*a).getTitle(), (*a).getVersion(), (*a).getAuthor(), (*a).getName(), (*a).getStatus());
++a; ++a;
} }
@ -83,27 +83,11 @@ void amx_command()
if (plugin && plugin->isValid()) if (plugin && plugin->isValid())
{ {
if (plugin->isPaused()) plugin->pausePlugin();
{ print_srvconsole("Paused plugin \"%s\"\n", plugin->getName());
if (plugin->isStopped())
{
print_srvconsole("Plugin \"%s\" is stopped and may not be paused.\n",plugin->getName());
}
else
{
print_srvconsole("Plugin \"%s\" is already paused.\n",plugin->getName());
}
}
else
{
plugin->pausePlugin();
print_srvconsole("Paused plugin \"%s\"\n", plugin->getName());
}
} }
else else
{
print_srvconsole("Couldn't find plugin matching \"%s\"\n", sPlugin); print_srvconsole("Couldn't find plugin matching \"%s\"\n", sPlugin);
}
} }
else if (!strcmp(cmd, "unpause") && CMD_ARGC() > 2) else if (!strcmp(cmd, "unpause") && CMD_ARGC() > 2)
{ {
@ -113,21 +97,14 @@ void amx_command()
if (plugin && plugin->isValid() && plugin->isPaused()) if (plugin && plugin->isValid() && plugin->isPaused())
{ {
if (plugin->isStopped()) plugin->unpausePlugin();
{ print_srvconsole("Unpaused plugin \"%s\"\n", plugin->getName());
print_srvconsole("Plugin \"%s\" is stopped and may not be unpaused.\n", plugin->getName());
}
else
{
plugin->unpausePlugin();
print_srvconsole("Unpaused plugin \"%s\"\n", plugin->getName());
}
} }
else if (!plugin) else if (!plugin)
{ {
print_srvconsole("Couldn't find plugin matching \"%s\"\n", sPlugin); print_srvconsole("Couldn't find plugin matching \"%s\"\n", sPlugin);
} else { } else {
print_srvconsole("Plugin %s can't be unpaused right now.\n", sPlugin); print_srvconsole("Plugin %s can't be unpaused right now.", sPlugin);
} }
} }
else if (!strcmp(cmd, "cvars")) else if (!strcmp(cmd, "cvars"))
@ -137,24 +114,9 @@ void amx_command()
int ammount = 0; int ammount = 0;
if (CMD_ARGC() > 2) // Searching for cvars registered to a plugin for (CList<CCVar>::iterator a = g_cvars.begin(); a; ++a)
{ {
const char* targetname = CMD_ARGV(2); print_srvconsole(" [%3d] %-24.23s %-24.23s %-16.15s\n", ++ammount, (*a).getName(), CVAR_GET_STRING((*a).getName()), (*a).getPluginName());
size_t len = strlen(targetname);
for (CList<CCVar>::iterator a = g_cvars.begin(); a; ++a)
{
if (strncmp((*a).getPluginName(), targetname, len) == 0)
{
print_srvconsole(" [%3d] %-24.23s %-24.23s %-16.15s\n", ++ammount, (*a).getName(), CVAR_GET_STRING((*a).getName()), (*a).getPluginName());
}
}
}
else // No search
{
for (CList<CCVar>::iterator a = g_cvars.begin(); a; ++a)
{
print_srvconsole(" [%3d] %-24.23s %-24.23s %-16.15s\n", ++ammount, (*a).getName(), CVAR_GET_STRING((*a).getName()), (*a).getPluginName());
}
} }
print_srvconsole("%d cvars\n", ammount); print_srvconsole("%d cvars\n", ammount);
@ -169,29 +131,13 @@ void amx_command()
CmdMngr::iterator a = g_commands.begin(CMD_ConsoleCommand); CmdMngr::iterator a = g_commands.begin(CMD_ConsoleCommand);
if (CMD_ARGC() > 2) // Searching for commands registered to a plugin while (a)
{ {
const char* targetname = CMD_ARGV(2); UTIL_GetFlags(access, (*a).getFlags());
size_t len = strlen(targetname); print_srvconsole(" [%3d] %-24.23s %-16.15s %-8.7s %-16.15s\n", ++ammount, (*a).getCmdLine(), access, (*a).getCmdType(), (*a).getPlugin()->getName());
while (a) ++a;
{
if (strncmp((*a).getPlugin()->getName(), targetname, len) == 0)
{
UTIL_GetFlags(access, (*a).getFlags());
print_srvconsole(" [%3d] %-24.23s %-16.15s %-8.7s %-16.15s\n", ++ammount, (*a).getCmdLine(), access, (*a).getCmdType(), (*a).getPlugin()->getName());
}
++a;
}
}
else // No search
{
while (a)
{
UTIL_GetFlags(access, (*a).getFlags());
print_srvconsole(" [%3d] %-24.23s %-16.15s %-8.7s %-16.15s\n", ++ammount, (*a).getCmdLine(), access, (*a).getCmdType(), (*a).getPlugin()->getName());
++a;
}
} }
print_srvconsole("%d commands\n",ammount); print_srvconsole("%d commands\n",ammount);
} }
else if (!strcmp(cmd, "version")) else if (!strcmp(cmd, "version"))
@ -215,7 +161,7 @@ void amx_command()
else if (!strcmp(cmd, "modules")) else if (!strcmp(cmd, "modules"))
{ {
print_srvconsole("Currently loaded modules:\n"); print_srvconsole("Currently loaded modules:\n");
print_srvconsole(" %-23.22s %-11.10s %-20.19s %-11.10s\n", "name", "version", "author", "status"); print_srvconsole(" %-23.22s %-8.7s %-20.19s %-11.10s\n", "name", "version", "author", "status");
int running = 0; int running = 0;
int modules = 0; int modules = 0;
@ -228,7 +174,7 @@ void amx_command()
++running; ++running;
++modules; ++modules;
print_srvconsole(" [%2d] %-23.22s %-11.10s %-20.19s %-11.10s\n", modules, (*a).getName(), (*a).getVersion(), (*a).getAuthor(), (*a).getStatus()); print_srvconsole(" [%2d] %-23.22s %-8.7s %-20.19s %-11.10s\n", modules, (*a).getName(), (*a).getVersion(), (*a).getAuthor(), (*a).getStatus());
++a; ++a;
} }
@ -298,8 +244,8 @@ void amx_command()
print_srvconsole(" gpl - print the license\n"); print_srvconsole(" gpl - print the license\n");
print_srvconsole(" plugins - list plugins currently loaded\n"); print_srvconsole(" plugins - list plugins currently loaded\n");
print_srvconsole(" modules - list modules currently loaded\n"); print_srvconsole(" modules - list modules currently loaded\n");
print_srvconsole(" cvars [ plugin ] - list cvars registered by plugins\n"); print_srvconsole(" cvars - list cvars registered by plugins\n");
print_srvconsole(" cmds [ plugin ] - list commands registered by plugins\n"); print_srvconsole(" cmds - list commands registered by plugins\n");
print_srvconsole(" pause < plugin > - pause a running plugin\n"); print_srvconsole(" pause < plugin > - pause a running plugin\n");
print_srvconsole(" unpause < plugin > - unpause a previously paused plugin\n"); print_srvconsole(" unpause < plugin > - unpause a previously paused plugin\n");
} }

View File

@ -1,8 +0,0 @@
#ifndef _INCLUDE_SVN_VERSION_H_
#define _INCLUDE_SVN_VERSION_H_
#define SVN_VERSION_STRING "1.8.1.3746"
#define SVN_VERSION_DWORD 1,8,1,3746
#define SVN_VERSION_PRODUCT "1.8.1"
#endif //_INCLUDE_SVN_VERSION_H_

View File

@ -1,8 +0,0 @@
#ifndef _INCLUDE_SVN_VERSION_H_
#define _INCLUDE_SVN_VERSION_H_
#define SVN_VERSION_STRING "$PMAJOR$.$PMINOR$.$PREVISION$.$GLOBAL_BUILD$"
#define SVN_VERSION_DWORD $PMAJOR$,$PMINOR$,$PREVISION$,$GLOBAL_BUILD$
#define SVN_VERSION_PRODUCT "$PMAJOR$.$PMINOR$.$PREVISION$"
#endif //_INCLUDE_SVN_VERSION_H_

View File

@ -1,316 +0,0 @@
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include "amxmodx.h"
#include "sm_trie_tpl.h"
#include "trie_natives.h"
#ifndef NDEBUG
size_t trie_free_count = 0;
size_t trie_malloc_count = 0;
#endif
TrieHandles g_TrieHandles;
typedef KTrie<TrieData> celltrie;
void triedata_dtor(TrieData *ptr)
{
ptr->freeCells();
}
// native Trie:TrieCreate();
static cell AMX_NATIVE_CALL TrieCreate(AMX *amx, cell *params)
{
return static_cast<cell>(g_TrieHandles.create());
}
// native Trie::TrieClear(Trie:handle);
static cell AMX_NATIVE_CALL TrieClear(AMX *amx, cell *params)
{
celltrie *t = g_TrieHandles.lookup(params[1]);
if (t == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid trie handle provided (%d)", params[1]);
return 0;
}
t->run_destructor(triedata_dtor);
t->clear();
return 1;
}
// native TrieSetCell(Trie:handle, const key[], any:value);
static cell AMX_NATIVE_CALL TrieSetCell(AMX *amx, cell *params)
{
celltrie *t = g_TrieHandles.lookup(params[1]);
if (t == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid trie handle provided (%d)", params[1]);
return 0;
}
TrieData *td = NULL;
int len;
const char *key = get_amxstring(amx, params[2], 0, len);
if ((td = t->retrieve(key)) == NULL)
{
TrieData dummy;
t->insert(key, dummy);
td = t->retrieve(key);
// should never, ever happen
if (td == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't KTrie::retrieve(), handle: %d", params[1]);
return 0;
}
}
td->setCell(params[3]);
return 1;
}
// native TrieSetString(Trie:handle, const key[], const data[]);
static cell AMX_NATIVE_CALL TrieSetString(AMX *amx, cell *params)
{
celltrie *t = g_TrieHandles.lookup(params[1]);
if (t == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid trie handle provided (%d)", params[1]);
return 0;
}
TrieData *td = NULL;
int len;
const char *key = get_amxstring(amx, params[2], 0, len);
if ((td = t->retrieve(key)) == NULL)
{
TrieData dummy;
t->insert(key, dummy);
td = t->retrieve(key);
// should never, ever happen
if (td == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't KTrie::retrieve(), handle: %d", params[1]);
return 0;
}
}
td->setString(get_amxaddr(amx, params[3]));
return 1;
}
// native TrieSetArray(Trie:handle, const key[], const any:buffer[], buffsize)
static cell AMX_NATIVE_CALL TrieSetArray(AMX *amx, cell *params)
{
celltrie *t = g_TrieHandles.lookup(params[2]);
if (t == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid trie handle provided (%d)", params[1]);
return 0;
}
TrieData *td = NULL;
int len;
const char *key = get_amxstring(amx, params[2], 0, len);
if ((td = t->retrieve(key)) == NULL)
{
TrieData dummy;
t->insert(key, dummy);
td = t->retrieve(key);
// should never, ever happen
if (td == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Couldn't KTrie::retrieve(), handle: %d", params[1]);
return 0;
}
}
td->setArray(get_amxaddr(amx, params[3]), params[4]);
return 1;
}
// native bool:TrieGetCell(Trie:handle, const key[], &any:value);
static cell AMX_NATIVE_CALL TrieGetCell(AMX *amx, cell *params)
{
celltrie *t = g_TrieHandles.lookup(params[1]);
if (t == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid trie handle provided (%d)", params[1]);
return 0;
}
TrieData *td = NULL;
int len;
const char *key = get_amxstring(amx, params[2], 0, len);
if ((td = t->retrieve(key)) == NULL)
{
return 0;
}
cell *ptr = get_amxaddr(amx, params[3]);
if (!td->getCell(ptr))
{
return 0;
}
return 1;
}
// native bool:TrieGetString(Trie:handle, const key[], buff[], len);
static cell AMX_NATIVE_CALL TrieGetString(AMX *amx, cell *params)
{
celltrie *t = g_TrieHandles.lookup(params[1]);
if (t == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid trie handle provided (%d)", params[1]);
return 0;
}
TrieData *td = NULL;
int len;
const char *key = get_amxstring(amx, params[2], 0, len);
if ((td = t->retrieve(key)) == NULL)
{
return 0;
}
cell *ptr = get_amxaddr(amx, params[3]);
if (!td->getString(ptr, params[4]))
{
return 0;
}
return 1;
}
// native bool:TrieGetArray(Trie:handle, const key[], any:buff[], len);
static cell AMX_NATIVE_CALL TrieGetArray(AMX *amx, cell *params)
{
celltrie *t = g_TrieHandles.lookup(params[1]);
if (t == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid trie handle provided (%d)", params[1]);
return 0;
}
TrieData *td = NULL;
int len;
const char *key = get_amxstring(amx, params[2], 0, len);
if ((td = t->retrieve(key)) == NULL)
{
return 0;
}
cell *ptr = get_amxaddr(amx, params[3]);
if (!td->getArray(ptr, params[4]))
{
return 0;
}
return 1;
}
// native bool:TrieKeyExists(Trie:handle, const key[]);
static cell AMX_NATIVE_CALL TrieKeyExists(AMX *amx, cell *params)
{
celltrie *t = g_TrieHandles.lookup(params[1]);
if (t == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid trie handle provided (%d)", params[1]);
return 0;
}
int len;
const char *key = get_amxstring(amx, params[2], 0, len);
return t->retrieve(key) != NULL ? 1 : 0;
}
// native bool:TrieDeleteKey(Trie:handle, const key[]);
static cell AMX_NATIVE_CALL TrieDeleteKey(AMX *amx, cell *params)
{
celltrie *t = g_TrieHandles.lookup(params[1]);
if (t == NULL)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid trie handle provided (%d)", params[1]);
return 0;
}
int len;
const char *key = get_amxstring(amx, params[2], 0, len);
TrieData *td = t->retrieve(key);
if (td != NULL)
{
td->freeCells();
}
return t->remove(key) ? 1 : 0;
}
//native TrieDestroy(&Trie:handle)
static cell AMX_NATIVE_CALL TrieDestroy(AMX *amx, cell *params)
{
cell *ptr = get_amxaddr(amx, params[1]);
celltrie *t = g_TrieHandles.lookup(*ptr);
if (t == NULL)
{
return 0;
}
t->run_destructor(triedata_dtor);
if (g_TrieHandles.destroy(*ptr))
{
*ptr = 0;
return 1;
}
return 0;
}
#ifndef NDEBUG
static cell AMX_NATIVE_CALL TrieMallocCount(AMX *amx, cell *params)
{
return trie_malloc_count;
}
static cell AMX_NATIVE_CALL TrieFreeCount(AMX *amx, cell *params)
{
return trie_free_count;
}
#endif
AMX_NATIVE_INFO trie_Natives[] =
{
{ "TrieCreate", TrieCreate },
{ "TrieClear", TrieClear },
{ "TrieSetCell", TrieSetCell },
{ "TrieSetString", TrieSetString },
{ "TrieSetArray", TrieSetArray },
{ "TrieGetCell", TrieGetCell },
{ "TrieGetString", TrieGetString },
{ "TrieGetArray", TrieGetArray },
{ "TrieDeleteKey", TrieDeleteKey },
{ "TrieKeyExists", TrieKeyExists },
{ "TrieDestroy", TrieDestroy },
#ifndef NDEBUG
{ "TrieMallocCount", TrieMallocCount },
{ "TrieFreeCount", TrieFreeCount },
#endif
{ NULL, NULL }
};

View File

@ -1,211 +0,0 @@
#ifndef _TRIE_NATIVES_H_
#define _TRIE_NATIVES_H_
#include "amxmodx.h"
#include "sm_trie_tpl.h"
#include "CVector.h"
#define TRIE_DATA_UNSET 0
#define TRIE_DATA_CELL 1
#define TRIE_DATA_STRING 2
#define TRIE_DATA_ARRAY 3
#ifndef NDEBUG
extern size_t trie_malloc_count;
extern size_t trie_free_count;
#endif
class TrieData
{
private:
cell *m_data;
cell m_cell;
cell m_cellcount;
int m_type;
void needCells(cell cellcount)
{
if (m_cellcount < cellcount)
{
if (m_data != NULL)
{
free(m_data);
#ifndef NDEBUG
trie_free_count++;
#endif
}
size_t neededbytes = cellcount * sizeof(cell);
m_data = static_cast<cell *>(malloc(neededbytes));
#ifndef NDEBUG
trie_malloc_count++;
#endif
m_cellcount = cellcount;
}
}
public:
void freeCells()
{
if (m_data)
{
#ifndef NDEBUG
trie_free_count++;
#endif
free(m_data);
m_data = NULL;
}
m_cellcount = 0;
}
TrieData() : m_data(NULL), m_cell(0), m_cellcount(0), m_type(TRIE_DATA_UNSET) { }
TrieData(const TrieData &src) : m_data(src.m_data),
m_cell(src.m_cell),
m_cellcount(src.m_cellcount),
m_type(src.m_type) { }
~TrieData() { }
int getType() { return m_type; }
void setCell(cell value)
{
freeCells();
m_cell = value;
m_type = TRIE_DATA_CELL;
}
void setString(cell *value)
{
cell len = 0;
cell *p = value;
while (*p++ != 0)
{
len++;
}
len += 1; // zero terminator
needCells(len);
memcpy(m_data, value, sizeof(cell) * len);
m_type = TRIE_DATA_STRING;
}
void setArray(cell *value, cell size)
{
if (size <= 0)
return;
needCells(size);
memcpy(m_data, value, sizeof(cell) * size);
m_type = TRIE_DATA_ARRAY;
}
bool getCell(cell *out)
{
if (m_type == TRIE_DATA_CELL)
{
*out = m_cell;
return true;
}
return false;
}
bool getString(cell *out, cell max)
{
if (m_type == TRIE_DATA_STRING && max >= 0)
{
memcpy(out, m_data, (max > m_cellcount ? m_cellcount : max) * sizeof(cell));
return true;
}
return false;
}
bool getArray(cell *out, cell max)
{
if (m_type == TRIE_DATA_ARRAY && max >= 0)
{
memcpy(out, m_data, (max > m_cellcount ? m_cellcount : max) * sizeof(cell));
return true;
}
return false;
}
void clear()
{
freeCells();
m_type = TRIE_DATA_UNSET;
}
};
class TrieHandles
{
private:
CVector< KTrie< TrieData > *> m_tries;
public:
TrieHandles() { }
~TrieHandles()
{
this->clear();
}
void clear()
{
for (size_t i = 0; i < m_tries.size(); i++)
{
if (m_tries[i] != NULL)
{
delete m_tries[i];
}
}
m_tries.clear();
}
KTrie<TrieData> *lookup(int handle)
{
handle--;
if (handle < 0 || handle >= static_cast<int>(m_tries.size()))
{
return NULL;
}
return m_tries[handle];
}
int create()
{
for (size_t i = 0; i < m_tries.size(); i++)
{
if (m_tries[i] == NULL)
{
// reuse handle
m_tries[i] = new KTrie<TrieData>;
return static_cast<int>(i) + 1;
}
}
m_tries.push_back(new KTrie<TrieData>);
return m_tries.size();
}
bool destroy(int handle)
{
handle--;
if (handle < 0 || handle >= static_cast<int>(m_tries.size()))
{
return false;
}
if (m_tries[handle] == NULL)
{
return false;
}
delete m_tries[handle];
m_tries[handle] = NULL;
return true;
}
};
extern TrieHandles g_TrieHandles;
extern AMX_NATIVE_INFO trie_Natives[];
#endif

View File

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

View File

@ -1,5 +1,5 @@
/* zconf.h -- configuration of the zlib compression library /* zconf.h -- configuration of the zlib compression library
* Copyright (C) 1995-2005 Jean-loup Gailly. * Copyright (C) 1995-2003 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -13,50 +13,43 @@
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
*/ */
#ifdef Z_PREFIX #ifdef Z_PREFIX
# define deflateInit_ z_deflateInit_ # define deflateInit_ z_deflateInit_
# define deflate z_deflate # define deflate z_deflate
# define deflateEnd z_deflateEnd # define deflateEnd z_deflateEnd
# define inflateInit_ z_inflateInit_ # define inflateInit_ z_inflateInit_
# define inflate z_inflate # define inflate z_inflate
# define inflateEnd z_inflateEnd # define inflateEnd z_inflateEnd
# define deflateInit2_ z_deflateInit2_ # define deflateInit2_ z_deflateInit2_
# define deflateSetDictionary z_deflateSetDictionary # define deflateSetDictionary z_deflateSetDictionary
# define deflateCopy z_deflateCopy # define deflateCopy z_deflateCopy
# define deflateReset z_deflateReset # define deflateReset z_deflateReset
# define deflateParams z_deflateParams # define deflatePrime z_deflatePrime
# define deflateBound z_deflateBound # define deflateParams z_deflateParams
# define deflatePrime z_deflatePrime # define deflateBound z_deflateBound
# define inflateInit2_ z_inflateInit2_ # define inflateInit2_ z_inflateInit2_
# define inflateSetDictionary z_inflateSetDictionary # define inflateSetDictionary z_inflateSetDictionary
# define inflateSync z_inflateSync # define inflateSync z_inflateSync
# define inflateSyncPoint z_inflateSyncPoint # define inflateSyncPoint z_inflateSyncPoint
# define inflateCopy z_inflateCopy # define inflateCopy z_inflateCopy
# define inflateReset z_inflateReset # define inflateReset z_inflateReset
# define inflateBack z_inflateBack # define compress z_compress
# define inflateBackEnd z_inflateBackEnd # define compress2 z_compress2
# define compress z_compress # define compressBound z_compressBound
# define compress2 z_compress2 # define uncompress z_uncompress
# define compressBound z_compressBound # define adler32 z_adler32
# define uncompress z_uncompress # define crc32 z_crc32
# define adler32 z_adler32 # define get_crc_table z_get_crc_table
# define crc32 z_crc32
# define get_crc_table z_get_crc_table
# define zError z_zError
# define alloc_func z_alloc_func # define Byte z_Byte
# define free_func z_free_func # define uInt z_uInt
# define in_func z_in_func # define uLong z_uLong
# define out_func z_out_func # define Bytef z_Bytef
# define Byte z_Byte # define charf z_charf
# define uInt z_uInt # define intf z_intf
# define uLong z_uLong # define uIntf z_uIntf
# define Bytef z_Bytef # define uLongf z_uLongf
# define charf z_charf # define voidpf z_voidpf
# define intf z_intf # define voidp z_voidp
# define uIntf z_uIntf
# define uLongf z_uLongf
# define voidpf z_voidpf
# define voidp z_voidp
#endif #endif
#if defined(__MSDOS__) && !defined(MSDOS) #if defined(__MSDOS__) && !defined(MSDOS)
@ -68,10 +61,8 @@
#if defined(_WINDOWS) && !defined(WINDOWS) #if defined(_WINDOWS) && !defined(WINDOWS)
# define WINDOWS # define WINDOWS
#endif #endif
#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
# ifndef WIN32 # define WIN32
# define WIN32
# endif
#endif #endif
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
@ -290,7 +281,7 @@ typedef uLong FAR uLongf;
# ifdef VMS # ifdef VMS
# include <unixio.h> /* for off_t */ # include <unixio.h> /* for off_t */
# endif # endif
# define z_off_t off_t # define z_off_t off_t
#endif #endif
#ifndef SEEK_SET #ifndef SEEK_SET
# define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_SET 0 /* Seek from beginning of file. */
@ -298,11 +289,11 @@ typedef uLong FAR uLongf;
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
#endif #endif
#ifndef z_off_t #ifndef z_off_t
# define z_off_t long # define z_off_t long
#endif #endif
#if defined(__OS400__) #if defined(__OS400__)
# define NO_vsnprintf #define NO_vsnprintf
#endif #endif
#if defined(__MVS__) #if defined(__MVS__)

Binary file not shown.

View File

@ -10,7 +10,7 @@ BINARY = amxxpc
OBJECTS = amx.cpp amxxpc.cpp Binary.cpp OBJECTS = amx.cpp amxxpc.cpp Binary.cpp
LINK = -lz /lib32/libstdc++.a LINK = -lz /lib/libstdc++.a
INCLUDE = -I. -L. INCLUDE = -I. -L.
@ -27,14 +27,14 @@ CFLAGS += -DLINUX -DNDEBUG -Wno-deprecated -fexceptions -DHAVE_STDINT_H -DAMX_AN
OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o)
$(BIN_DIR)/%.o: %.cpp $(BIN_DIR)/%.o: %.cpp
$(CPP) $(INCLUDE) $(CFLAGS) -m32 -o $@ -c $< $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $<
all: all:
mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)
$(MAKE) amxxpc $(MAKE) amxxpc
amxxpc: $(OBJ_LINUX) amxxpc: $(OBJ_LINUX)
$(CPP) $(INCLUDE) $(CFLAGS) -m32 $(OBJ_LINUX) $(LINK) -ldl -lm -o$(BIN_DIR)/$(BINARY) $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -ldl -lm -o$(BIN_DIR)/$(BINARY)
default: all default: all

View File

@ -212,7 +212,7 @@ typedef struct tagAMX_NATIVE_INFO {
typedef struct tagAMX_FUNCSTUB { typedef struct tagAMX_FUNCSTUB {
ucell address PACKED; ucell address PACKED;
char name[sEXPMAX+1]; char name[sEXPMAX+1] PACKED;
} PACKED AMX_FUNCSTUB; } PACKED AMX_FUNCSTUB;
typedef struct tagFUNCSTUBNT { typedef struct tagFUNCSTUBNT {
@ -260,8 +260,8 @@ typedef struct tagAMX {
typedef struct tagAMX_HEADER { typedef struct tagAMX_HEADER {
int32_t size PACKED; /* size of the "file" */ int32_t size PACKED; /* size of the "file" */
uint16_t magic PACKED; /* signature */ uint16_t magic PACKED; /* signature */
char file_version; /* file format version */ char file_version PACKED; /* file format version */
char amx_version; /* required version of the AMX */ char amx_version PACKED; /* required version of the AMX */
int16_t flags PACKED; int16_t flags PACKED;
int16_t defsize PACKED; /* size of a definition record */ int16_t defsize PACKED; /* size of a definition record */
int32_t cod PACKED; /* initial value of COD - code block */ int32_t cod PACKED; /* initial value of COD - code block */

View File

@ -65,8 +65,8 @@ extern "C" {
typedef struct tagAMX_DBG_HDR { typedef struct tagAMX_DBG_HDR {
int32_t size PACKED; /* size of the debug information chunk */ int32_t size PACKED; /* size of the debug information chunk */
uint16_t magic PACKED; /* signature, must be 0xf1ef */ uint16_t magic PACKED; /* signature, must be 0xf1ef */
char file_version; /* file format version */ char file_version PACKED; /* file format version */
char amx_version; /* required version of the AMX */ char amx_version PACKED; /* required version of the AMX */
int16_t flags PACKED; /* currently unused */ int16_t flags PACKED; /* currently unused */
int16_t files PACKED; /* number of entries in the "file" table */ int16_t files PACKED; /* number of entries in the "file" table */
int16_t lines PACKED; /* number of entries in the "line" table */ int16_t lines PACKED; /* number of entries in the "line" table */
@ -74,51 +74,51 @@ typedef struct tagAMX_DBG_HDR {
int16_t tags PACKED; /* number of entries in the "tag" table */ int16_t tags PACKED; /* number of entries in the "tag" table */
int16_t automatons PACKED; /* number of entries in the "automaton" table */ int16_t automatons PACKED; /* number of entries in the "automaton" table */
int16_t states PACKED; /* number of entries in the "state" table */ int16_t states PACKED; /* number of entries in the "state" table */
} AMX_DBG_HDR; } AMX_DBG_HDR PACKED;
#define AMX_DBG_MAGIC 0xf1ef #define AMX_DBG_MAGIC 0xf1ef
typedef struct tagAMX_DBG_FILE { typedef struct tagAMX_DBG_FILE {
ucell address PACKED; /* address in the code segment where generated code (for this file) starts */ ucell address PACKED; /* address in the code segment where generated code (for this file) starts */
const char name[1]; /* ASCII string, zero-terminated */ const char name[1] PACKED; /* ASCII string, zero-terminated */
} AMX_DBG_FILE; } AMX_DBG_FILE PACKED;
typedef struct tagAMX_DBG_LINE { typedef struct tagAMX_DBG_LINE {
ucell address PACKED; /* address in the code segment where generated code (for this line) starts */ ucell address PACKED; /* address in the code segment where generated code (for this line) starts */
int32_t line PACKED; /* line number */ int32_t line PACKED; /* line number */
} AMX_DBG_LINE; } AMX_DBG_LINE PACKED;
typedef struct tagAMX_DBG_SYMBOL { typedef struct tagAMX_DBG_SYMBOL {
ucell address PACKED; /* address in the data segment or relative to the frame */ ucell address PACKED; /* address in the data segment or relative to the frame */
int16_t tag PACKED; /* tag for the symbol */ int16_t tag PACKED; /* tag for the symbol */
ucell codestart PACKED; /* address in the code segment from which this symbol is valid (in scope) */ ucell codestart PACKED; /* address in the code segment from which this symbol is valid (in scope) */
ucell codeend PACKED; /* address in the code segment until which this symbol is valid (in scope) */ ucell codeend PACKED; /* address in the code segment until which this symbol is valid (in scope) */
char ident; /* kind of symbol (function/variable) */ char ident PACKED; /* kind of symbol (function/variable) */
char vclass; /* class of symbol (global/local) */ char vclass PACKED; /* class of symbol (global/local) */
int16_t dim PACKED; /* number of dimensions */ int16_t dim PACKED; /* number of dimensions */
const char name[1]; /* ASCII string, zero-terminated */ const char name[1] PACKED; /* ASCII string, zero-terminated */
} AMX_DBG_SYMBOL; } AMX_DBG_SYMBOL PACKED;
typedef struct tagAMX_DBG_SYMDIM { typedef struct tagAMX_DBG_SYMDIM {
int16_t tag PACKED; /* tag for the array dimension */ int16_t tag PACKED; /* tag for the array dimension */
ucell size PACKED; /* size of the array dimension */ ucell size PACKED; /* size of the array dimension */
} AMX_DBG_SYMDIM; } AMX_DBG_SYMDIM PACKED;
typedef struct tagAMX_DBG_TAG { typedef struct tagAMX_DBG_TAG {
int16_t tag PACKED; /* tag id */ int16_t tag PACKED; /* tag id */
const char name[1]; /* ASCII string, zero-terminated */ const char name[1] PACKED; /* ASCII string, zero-terminated */
} AMX_DBG_TAG; } AMX_DBG_TAG PACKED;
typedef struct tagAMX_DBG_MACHINE { typedef struct tagAMX_DBG_MACHINE {
int16_t automaton PACKED; /* automaton id */ int16_t automaton PACKED; /* automaton id */
ucell address PACKED; /* address of state variable */ ucell address PACKED; /* address of state variable */
const char name[1]; /* ASCII string, zero-terminated */ const char name[1] PACKED; /* ASCII string, zero-terminated */
} AMX_DBG_MACHINE; } AMX_DBG_MACHINE PACKED;
typedef struct tagAMX_DBG_STATE { typedef struct tagAMX_DBG_STATE {
int16_t state PACKED; /* state id */ int16_t state PACKED; /* state id */
int16_t automaton PACKED; /* automaton id */ int16_t automaton PACKED; /* automaton id */
const char name[1]; /* ASCII string, zero-terminated */ const char name[1] PACKED; /* ASCII string, zero-terminated */
} AMX_DBG_STATE; } AMX_DBG_STATE PACKED;
typedef struct tagAMX_DBG { typedef struct tagAMX_DBG {
AMX_DBG_HDR _FAR *hdr PACKED; /* points to the AMX_DBG header */ AMX_DBG_HDR _FAR *hdr PACKED; /* points to the AMX_DBG header */
@ -128,7 +128,7 @@ typedef struct tagAMX_DBG {
AMX_DBG_TAG _FAR **tagtbl PACKED; AMX_DBG_TAG _FAR **tagtbl PACKED;
AMX_DBG_MACHINE _FAR **automatontbl PACKED; AMX_DBG_MACHINE _FAR **automatontbl PACKED;
AMX_DBG_STATE _FAR **statetbl PACKED; AMX_DBG_STATE _FAR **statetbl PACKED;
} AMX_DBG; } AMX_DBG PACKED;
#if !defined iVARIABLE #if !defined iVARIABLE
#define iVARIABLE 1 /* cell that has an address and that can be fetched directly (lvalue) */ #define iVARIABLE 1 /* cell that has an address and that can be fetched directly (lvalue) */

View File

@ -12,13 +12,6 @@
#include "amxxpc.h" #include "amxxpc.h"
#include "Binary.h" #include "Binary.h"
#ifdef _MSC_VER
// MSVC8 - replace POSIX functions with ISO C++ conformant ones as they are deprecated
#if _MSC_VER >= 1400
#define unlink _unlink
#endif
#endif
static PRINTF pc_printf = NULL; static PRINTF pc_printf = NULL;
void ReadFileIntoPl(abl *pl, FILE *fp); void ReadFileIntoPl(abl *pl, FILE *fp);

View File

@ -1,7 +1,7 @@
#ifndef _AMXXSC_INCLUDE_H #ifndef _AMXXSC_INCLUDE_H
#define _AMXXSC_INCLUDE_H #define _AMXXSC_INCLUDE_H
#define VERSION_STRING "1.8.1-300" #define VERSION_STRING "1.76-300"
#define MAGIC_HEADER2 0x414D5858 #define MAGIC_HEADER2 0x414D5858
#define MAGIC_VERSION 0x0300 #define MAGIC_VERSION 0x0300

View File

@ -1,20 +1,21 @@
 Microsoft Visual Studio Solution File, Format Version 8.00
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxxpc", "amxxpc.vcproj", "{39412290-D01C-472F-A439-AB5592A04C08}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "amxxpc", "amxxpc.vcproj", "{39412290-D01C-472F-A439-AB5592A04C08}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfiguration) = preSolution
Debug|Win32 = Debug|Win32 Debug = Debug
Release|Win32 = Release|Win32 Release = Release
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfiguration) = postSolution
{39412290-D01C-472F-A439-AB5592A04C08}.Debug|Win32.ActiveCfg = Debug|Win32 {39412290-D01C-472F-A439-AB5592A04C08}.Debug.ActiveCfg = Debug|Win32
{39412290-D01C-472F-A439-AB5592A04C08}.Debug|Win32.Build.0 = Debug|Win32 {39412290-D01C-472F-A439-AB5592A04C08}.Debug.Build.0 = Debug|Win32
{39412290-D01C-472F-A439-AB5592A04C08}.Release|Win32.ActiveCfg = Release|Win32 {39412290-D01C-472F-A439-AB5592A04C08}.Release.ActiveCfg = Release|Win32
{39412290-D01C-472F-A439-AB5592A04C08}.Release|Win32.Build.0 = Release|Win32 {39412290-D01C-472F-A439-AB5592A04C08}.Release.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(ExtensibilityGlobals) = postSolution
HideSolutionNode = FALSE EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View File

@ -1,178 +1,111 @@
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="7.10"
Name="amxxpc" Name="amxxpc"
ProjectGUID="{39412290-D01C-472F-A439-AB5592A04C08}" ProjectGUID="{39412290-D01C-472F-A439-AB5592A04C08}"
RootNamespace="amxxpc" Keyword="Win32Proj">
Keyword="Win32Proj"
>
<Platforms> <Platforms>
<Platform <Platform
Name="Win32" Name="Win32"/>
/>
</Platforms> </Platforms>
<ToolFiles>
</ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
OutputDirectory="Debug" OutputDirectory="Debug"
IntermediateDirectory="Debug" IntermediateDirectory="Debug"
ConfigurationType="1" ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" CharacterSet="2">
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true" MinimalRebuild="TRUE"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="5"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4" DebugInformationFormat="4"/>
/>
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCCustomBuildTool"/>
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="zlib.lib" AdditionalDependencies="zlib.lib"
OutputFile="$(OutDir)/amxxpc.exe" OutputFile="$(OutDir)/amxxpc.exe"
LinkIncremental="2" LinkIncremental="2"
GenerateDebugInformation="true" GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/amxxpc.pdb" ProgramDatabaseFile="$(OutDir)/amxxpc.pdb"
SubSystem="1" SubSystem="1"
TargetMachine="1" TargetMachine="1"/>
/>
<Tool <Tool
Name="VCALinkTool" Name="VCMIDLTool"/>
/>
<Tool <Tool
Name="VCManifestTool" Name="VCPostBuildEventTool"/>
/>
<Tool <Tool
Name="VCXDCMakeTool" Name="VCPreBuildEventTool"/>
/>
<Tool <Tool
Name="VCBscMakeTool" Name="VCPreLinkEventTool"/>
/>
<Tool <Tool
Name="VCFxCopTool" Name="VCResourceCompilerTool"/>
/>
<Tool <Tool
Name="VCAppVerifierTool" Name="VCWebServiceProxyGeneratorTool"/>
/>
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCXMLDataGeneratorTool"/>
/>
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCWebDeploymentTool"/>
/> <Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
OutputDirectory="Release" OutputDirectory="Release"
IntermediateDirectory="Release" IntermediateDirectory="Release"
ConfigurationType="1" ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" CharacterSet="2">
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="0" RuntimeLibrary="4"
StructMemberAlignment="0" StructMemberAlignment="0"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="false" Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3" DebugInformationFormat="3"/>
/>
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCCustomBuildTool"/>
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="zlib.lib" AdditionalDependencies="zlib.lib"
OutputFile="$(OutDir)/amxxpc.exe" OutputFile="$(OutDir)/amxxpc.exe"
LinkIncremental="1" LinkIncremental="1"
GenerateDebugInformation="true" GenerateDebugInformation="TRUE"
SubSystem="1" SubSystem="1"
OptimizeReferences="2" OptimizeReferences="2"
EnableCOMDATFolding="2" EnableCOMDATFolding="2"
TargetMachine="1" TargetMachine="1"/>
/>
<Tool <Tool
Name="VCALinkTool" Name="VCMIDLTool"/>
/>
<Tool <Tool
Name="VCManifestTool" Name="VCPostBuildEventTool"/>
/>
<Tool <Tool
Name="VCXDCMakeTool" Name="VCPreBuildEventTool"/>
/>
<Tool <Tool
Name="VCBscMakeTool" Name="VCPreLinkEventTool"/>
/>
<Tool <Tool
Name="VCFxCopTool" Name="VCResourceCompilerTool"/>
/>
<Tool <Tool
Name="VCAppVerifierTool" Name="VCWebServiceProxyGeneratorTool"/>
/>
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCXMLDataGeneratorTool"/>
/>
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCWebDeploymentTool"/>
/> <Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
@ -181,75 +114,58 @@
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
>
<File <File
RelativePath=".\amx.cpp" RelativePath=".\amx.cpp">
>
</File> </File>
<File <File
RelativePath=".\amxxpc.cpp" RelativePath=".\amxxpc.cpp">
>
</File> </File>
<File <File
RelativePath=".\Binary.cpp" RelativePath=".\Binary.cpp">
>
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
>
<File <File
RelativePath=".\amx.h" RelativePath=".\amx.h">
>
</File> </File>
<File <File
RelativePath=".\amxdbg.h" RelativePath=".\amxdbg.h">
>
</File> </File>
<File <File
RelativePath=".\amxxpc.h" RelativePath=".\amxxpc.h">
>
</File> </File>
<File <File
RelativePath=".\Binary.h" RelativePath=".\Binary.h">
>
</File> </File>
<File <File
RelativePath=".\osdefs.h" RelativePath=".\osdefs.h">
>
</File> </File>
<File <File
RelativePath=".\resource.h" RelativePath=".\resource.h">
>
</File> </File>
<File <File
RelativePath=".\resource1.h" RelativePath=".\resource1.h">
>
</File> </File>
<File <File
RelativePath=".\sclinux.h" RelativePath=".\sclinux.h">
>
</File> </File>
<File <File
RelativePath=".\zconf.h" RelativePath=".\zconf.h">
>
</File> </File>
<File <File
RelativePath=".\zlib.h" RelativePath=".\zlib.h">
>
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
>
<File <File
RelativePath=".\amxxpc1.rc" RelativePath=".\amxxpc1.rc">
>
</File> </File>
</Filter> </Filter>
</Files> </Files>

Binary file not shown.

View File

@ -1,5 +1,5 @@
/* zconf.h -- configuration of the zlib compression library /* zconf.h -- configuration of the zlib compression library
* Copyright (C) 1995-2005 Jean-loup Gailly. * Copyright (C) 1995-2003 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -13,50 +13,43 @@
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
*/ */
#ifdef Z_PREFIX #ifdef Z_PREFIX
# define deflateInit_ z_deflateInit_ # define deflateInit_ z_deflateInit_
# define deflate z_deflate # define deflate z_deflate
# define deflateEnd z_deflateEnd # define deflateEnd z_deflateEnd
# define inflateInit_ z_inflateInit_ # define inflateInit_ z_inflateInit_
# define inflate z_inflate # define inflate z_inflate
# define inflateEnd z_inflateEnd # define inflateEnd z_inflateEnd
# define deflateInit2_ z_deflateInit2_ # define deflateInit2_ z_deflateInit2_
# define deflateSetDictionary z_deflateSetDictionary # define deflateSetDictionary z_deflateSetDictionary
# define deflateCopy z_deflateCopy # define deflateCopy z_deflateCopy
# define deflateReset z_deflateReset # define deflateReset z_deflateReset
# define deflateParams z_deflateParams # define deflatePrime z_deflatePrime
# define deflateBound z_deflateBound # define deflateParams z_deflateParams
# define deflatePrime z_deflatePrime # define deflateBound z_deflateBound
# define inflateInit2_ z_inflateInit2_ # define inflateInit2_ z_inflateInit2_
# define inflateSetDictionary z_inflateSetDictionary # define inflateSetDictionary z_inflateSetDictionary
# define inflateSync z_inflateSync # define inflateSync z_inflateSync
# define inflateSyncPoint z_inflateSyncPoint # define inflateSyncPoint z_inflateSyncPoint
# define inflateCopy z_inflateCopy # define inflateCopy z_inflateCopy
# define inflateReset z_inflateReset # define inflateReset z_inflateReset
# define inflateBack z_inflateBack # define compress z_compress
# define inflateBackEnd z_inflateBackEnd # define compress2 z_compress2
# define compress z_compress # define compressBound z_compressBound
# define compress2 z_compress2 # define uncompress z_uncompress
# define compressBound z_compressBound # define adler32 z_adler32
# define uncompress z_uncompress # define crc32 z_crc32
# define adler32 z_adler32 # define get_crc_table z_get_crc_table
# define crc32 z_crc32
# define get_crc_table z_get_crc_table
# define zError z_zError
# define alloc_func z_alloc_func # define Byte z_Byte
# define free_func z_free_func # define uInt z_uInt
# define in_func z_in_func # define uLong z_uLong
# define out_func z_out_func # define Bytef z_Bytef
# define Byte z_Byte # define charf z_charf
# define uInt z_uInt # define intf z_intf
# define uLong z_uLong # define uIntf z_uIntf
# define Bytef z_Bytef # define uLongf z_uLongf
# define charf z_charf # define voidpf z_voidpf
# define intf z_intf # define voidp z_voidp
# define uIntf z_uIntf
# define uLongf z_uLongf
# define voidpf z_voidpf
# define voidp z_voidp
#endif #endif
#if defined(__MSDOS__) && !defined(MSDOS) #if defined(__MSDOS__) && !defined(MSDOS)
@ -68,10 +61,8 @@
#if defined(_WINDOWS) && !defined(WINDOWS) #if defined(_WINDOWS) && !defined(WINDOWS)
# define WINDOWS # define WINDOWS
#endif #endif
#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
# ifndef WIN32 # define WIN32
# define WIN32
# endif
#endif #endif
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
@ -290,7 +281,7 @@ typedef uLong FAR uLongf;
# ifdef VMS # ifdef VMS
# include <unixio.h> /* for off_t */ # include <unixio.h> /* for off_t */
# endif # endif
# define z_off_t off_t # define z_off_t off_t
#endif #endif
#ifndef SEEK_SET #ifndef SEEK_SET
# define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_SET 0 /* Seek from beginning of file. */
@ -298,11 +289,11 @@ typedef uLong FAR uLongf;
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
#endif #endif
#ifndef z_off_t #ifndef z_off_t
# define z_off_t long # define z_off_t long
#endif #endif
#if defined(__OS400__) #if defined(__OS400__)
# define NO_vsnprintf #define NO_vsnprintf
#endif #endif
#if defined(__MVS__) #if defined(__MVS__)

View File

@ -1,7 +1,7 @@
/* zlib.h -- interface of the 'zlib' general purpose compression library /* zlib.h -- interface of the 'zlib' general purpose compression library
version 1.2.3, July 18th, 2005 version 1.2.1, November 17th, 2003
Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -37,8 +37,8 @@
extern "C" { extern "C" {
#endif #endif
#define ZLIB_VERSION "1.2.3" #define ZLIB_VERSION "1.2.1"
#define ZLIB_VERNUM 0x1230 #define ZLIB_VERNUM 0x1210
/* /*
The 'zlib' compression library provides in-memory compression and The 'zlib' compression library provides in-memory compression and
@ -53,22 +53,24 @@ extern "C" {
application must provide more input and/or consume the output application must provide more input and/or consume the output
(providing more output space) before each call. (providing more output space) before each call.
The compressed data format used by default by the in-memory functions is The compressed data format used by the in-memory functions is the zlib
the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped format, which is a zlib wrapper documented in RFC 1950, wrapped around a
around a deflate stream, which is itself documented in RFC 1951. deflate stream, which is itself documented in RFC 1951.
The library also supports reading and writing files in gzip (.gz) format The library also supports reading and writing files in gzip (.gz) format
with an interface similar to that of stdio using the functions that start with an interface similar to that of stdio using the functions that start
with "gz". The gzip format is different from the zlib format. gzip is a with "gz". The gzip format is different from the zlib format. gzip is a
gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
This library can optionally read and write gzip streams in memory as well.
The zlib format was designed to be compact and fast for use in memory The zlib format was designed to be compact and fast for use in memory
and on communications channels. The gzip format was designed for single- and on communications channels. The gzip format was designed for single-
file compression on file systems, has a larger header than zlib to maintain file compression on file systems, has a larger header than zlib to maintain
directory information, and uses a different, slower check method than zlib. directory information, and uses a different, slower check method than zlib.
This library does not provide any functions to write gzip files in memory.
However such functions could be easily written using zlib's deflate function,
the documentation in the gzip RFC, and the examples in gzio.c.
The library does not install any signal handler. The decoder checks The library does not install any signal handler. The decoder checks
the consistency of the compressed data, so the library should never the consistency of the compressed data, so the library should never
crash even in case of corrupted input. crash even in case of corrupted input.
@ -95,36 +97,13 @@ typedef struct z_stream_s {
free_func zfree; /* used to free the internal state */ free_func zfree; /* used to free the internal state */
voidpf opaque; /* private data object passed to zalloc and zfree */ voidpf opaque; /* private data object passed to zalloc and zfree */
int data_type; /* best guess about the data type: binary or text */ int data_type; /* best guess about the data type: ascii or binary */
uLong adler; /* adler32 value of the uncompressed data */ uLong adler; /* adler32 value of the uncompressed data */
uLong reserved; /* reserved for future use */ uLong reserved; /* reserved for future use */
} z_stream; } z_stream;
typedef z_stream FAR *z_streamp; typedef z_stream FAR *z_streamp;
/*
gzip header information passed to and from zlib routines. See RFC 1952
for more details on the meanings of these fields.
*/
typedef struct gz_header_s {
int text; /* true if compressed data believed to be text */
uLong time; /* modification time */
int xflags; /* extra flags (not used when writing a gzip file) */
int os; /* operating system */
Bytef *extra; /* pointer to extra field or Z_NULL if none */
uInt extra_len; /* extra field length (valid if extra != Z_NULL) */
uInt extra_max; /* space at extra (only when reading header) */
Bytef *name; /* pointer to zero-terminated file name or Z_NULL */
uInt name_max; /* space at name (only when reading header) */
Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */
uInt comm_max; /* space at comment (only when reading header) */
int hcrc; /* true if there was or will be a header crc */
int done; /* true when done reading gzip header (not used
when writing a gzip file) */
} gz_header;
typedef gz_header FAR *gz_headerp;
/* /*
The application must update next_in and avail_in when avail_in has The application must update next_in and avail_in when avail_in has
dropped to zero. It must update next_out and avail_out when avail_out dropped to zero. It must update next_out and avail_out when avail_out
@ -189,13 +168,11 @@ typedef gz_header FAR *gz_headerp;
#define Z_FILTERED 1 #define Z_FILTERED 1
#define Z_HUFFMAN_ONLY 2 #define Z_HUFFMAN_ONLY 2
#define Z_RLE 3 #define Z_RLE 3
#define Z_FIXED 4
#define Z_DEFAULT_STRATEGY 0 #define Z_DEFAULT_STRATEGY 0
/* compression strategy; see deflateInit2() below for details */ /* compression strategy; see deflateInit2() below for details */
#define Z_BINARY 0 #define Z_BINARY 0
#define Z_TEXT 1 #define Z_ASCII 1
#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */
#define Z_UNKNOWN 2 #define Z_UNKNOWN 2
/* Possible values of the data_type field (though see inflate()) */ /* Possible values of the data_type field (though see inflate()) */
@ -269,10 +246,6 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
and with zero avail_out, it must be called again after making room in the and with zero avail_out, it must be called again after making room in the
output buffer because there might be more output pending. output buffer because there might be more output pending.
Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
decide how much data to accumualte before producing output, in order to
maximize compression.
If the parameter flush is set to Z_SYNC_FLUSH, all pending output is If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
flushed to the output buffer and the output is aligned on a byte boundary, so flushed to the output buffer and the output is aligned on a byte boundary, so
that the decompressor can get all input data available so far. (In particular that the decompressor can get all input data available so far. (In particular
@ -284,7 +257,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
Z_SYNC_FLUSH, and the compression state is reset so that decompression can Z_SYNC_FLUSH, and the compression state is reset so that decompression can
restart from this point if previous compressed data has been damaged or if restart from this point if previous compressed data has been damaged or if
random access is desired. Using Z_FULL_FLUSH too often can seriously degrade random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
compression. the compression.
If deflate returns with avail_out == 0, this function must be called again If deflate returns with avail_out == 0, this function must be called again
with the same value of the flush parameter and more output space (updated with the same value of the flush parameter and more output space (updated
@ -309,8 +282,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
deflate() sets strm->adler to the adler32 checksum of all input read deflate() sets strm->adler to the adler32 checksum of all input read
so far (that is, total_in bytes). so far (that is, total_in bytes).
deflate() may update strm->data_type if it can make a good guess about deflate() may update data_type if it can make a good guess about
the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
binary. This field is only for information purposes and does not affect binary. This field is only for information purposes and does not affect
the compression algorithm in any manner. the compression algorithm in any manner.
@ -392,11 +365,11 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,
Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much
output as possible to the output buffer. Z_BLOCK requests that inflate() stop output as possible to the output buffer. Z_BLOCK requests that inflate() stop
if and when it gets to the next deflate block boundary. When decoding the if and when it get to the next deflate block boundary. When decoding the zlib
zlib or gzip format, this will cause inflate() to return immediately after or gzip format, this will cause inflate() to return immediately after the
the header and before the first block. When doing a raw inflate, inflate() header and before the first block. When doing a raw inflate, inflate() will
will go ahead and process the first block, and will return when it gets to go ahead and process the first block, and will return when it gets to the end
the end of that block, or when it runs out of data. of that block, or when it runs out of data.
The Z_BLOCK option assists in appending to or combining deflate streams. The Z_BLOCK option assists in appending to or combining deflate streams.
Also to assist in this, on return inflate() will set strm->data_type to the Also to assist in this, on return inflate() will set strm->data_type to the
@ -428,7 +401,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
because Z_BLOCK is used. because Z_BLOCK is used.
If a preset dictionary is needed after this call (see inflateSetDictionary If a preset dictionary is needed after this call (see inflateSetDictionary
below), inflate sets strm->adler to the adler32 checksum of the dictionary below), inflate sets strm-adler to the adler32 checksum of the dictionary
chosen by the compressor and returns Z_NEED_DICT; otherwise it sets chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
strm->adler to the adler32 checksum of all output produced so far (that is, strm->adler to the adler32 checksum of all output produced so far (that is,
total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
@ -505,8 +478,7 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
16 to windowBits to write a simple gzip header and trailer around the 16 to windowBits to write a simple gzip header and trailer around the
compressed data instead of a zlib wrapper. The gzip header will have no compressed data instead of a zlib wrapper. The gzip header will have no
file name, no extra data, no comment, no modification time (set to zero), file name, no extra data, no comment, no modification time (set to zero),
no header crc, and the operating system will be set to 255 (unknown). If a no header crc, and the operating system will be set to 255 (unknown).
gzip stream is being written, strm->adler is a crc32 instead of an adler32.
The memLevel parameter specifies how much memory should be allocated The memLevel parameter specifies how much memory should be allocated
for the internal compression state. memLevel=1 uses minimum memory but for the internal compression state. memLevel=1 uses minimum memory but
@ -525,9 +497,7 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as
Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy
parameter only affects the compression ratio but not the correctness of the parameter only affects the compression ratio but not the correctness of the
compressed output even if it is not set appropriately. Z_FIXED prevents the compressed output even if it is not set appropriately.
use of dynamic Huffman codes, allowing for a simpler decoder for special
applications.
deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
@ -556,9 +526,7 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
deflateInit or deflateInit2, a part of the dictionary may in effect be deflateInit or deflateInit2, a part of the dictionary may in effect be
discarded, for example if the dictionary is larger than the window size in discarded, for example if the dictionary is larger than the window size in
deflate or deflate2. Thus the strings most likely to be useful should be deflate or deflate2. Thus the strings most likely to be useful should be
put at the end of the dictionary, not at the front. In addition, the put at the end of the dictionary, not at the front.
current implementation of deflate will use at most the window size minus
262 bytes of the provided dictionary.
Upon return of this function, strm->adler is set to the adler32 value Upon return of this function, strm->adler is set to the adler32 value
of the dictionary; the decompressor may later use this value to determine of the dictionary; the decompressor may later use this value to determine
@ -624,23 +592,6 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
if strm->avail_out was zero. if strm->avail_out was zero.
*/ */
ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
int good_length,
int max_lazy,
int nice_length,
int max_chain));
/*
Fine tune deflate's internal compression parameters. This should only be
used by someone who understands the algorithm used by zlib's deflate for
searching for the best matching string, and even then only by the most
fanatic optimizer trying to squeeze out the last compressed bit for their
specific input data. Read the deflate.c source code for the meaning of the
max_lazy, good_length, nice_length, and max_chain parameters.
deflateTune() can be called after deflateInit() or deflateInit2(), and
returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
*/
ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
uLong sourceLen)); uLong sourceLen));
/* /*
@ -666,30 +617,6 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
stream state was inconsistent. stream state was inconsistent.
*/ */
ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
gz_headerp head));
/*
deflateSetHeader() provides gzip header information for when a gzip
stream is requested by deflateInit2(). deflateSetHeader() may be called
after deflateInit2() or deflateReset() and before the first call of
deflate(). The text, time, os, extra field, name, and comment information
in the provided gz_header structure are written to the gzip header (xflag is
ignored -- the extra flags are set according to the compression level). The
caller must assure that, if not Z_NULL, name and comment are terminated with
a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
available there. If hcrc is true, a gzip header crc is included. Note that
the current versions of the command-line version of gzip (up through version
1.3.x) do not support header crc's, and will report that it is a "multi-part
gzip file" and give up.
If deflateSetHeader is not used, the default gzip header has text false,
the time set to zero, and os set to 255, with no extra, name, or comment
fields. The gzip header is returned to the default state by deflateReset().
deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
stream state was inconsistent.
*/
/* /*
ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
int windowBits)); int windowBits));
@ -722,15 +649,14 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
windowBits can also be greater than 15 for optional gzip decoding. Add windowBits can also be greater than 15 for optional gzip decoding. Add
32 to windowBits to enable zlib and gzip decoding with automatic header 32 to windowBits to enable zlib and gzip decoding with automatic header
detection, or add 16 to decode only the gzip format (the zlib format will detection, or add 16 to decode only the gzip format (the zlib format will
return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is return a Z_DATA_ERROR).
a crc32 instead of an adler32.
inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
is set to null if there is no error message. inflateInit2 does not perform memLevel). msg is set to null if there is no error message. inflateInit2
any decompression apart from reading the zlib header if present: this will does not perform any decompression apart from reading the zlib header if
be done by inflate(). (So next_in and avail_in may be modified, but next_out present: this will be done by inflate(). (So next_in and avail_in may be
and avail_out are unchanged.) modified, but next_out and avail_out are unchanged.)
*/ */
ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
@ -738,14 +664,11 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
uInt dictLength)); uInt dictLength));
/* /*
Initializes the decompression dictionary from the given uncompressed byte Initializes the decompression dictionary from the given uncompressed byte
sequence. This function must be called immediately after a call of inflate, sequence. This function must be called immediately after a call of inflate
if that call returned Z_NEED_DICT. The dictionary chosen by the compressor if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
can be determined from the adler32 value returned by that call of inflate. can be determined from the adler32 value returned by this call of
The compressor and decompressor must use exactly the same dictionary (see inflate. The compressor and decompressor must use exactly the same
deflateSetDictionary). For raw inflate, this function can be called dictionary (see deflateSetDictionary).
immediately after inflateInit2() or inflateReset() and before any call of
inflate() to set the dictionary. The application must insure that the
dictionary that was used for compression is provided.
inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
parameter is invalid (such as NULL dictionary) or the stream state is parameter is invalid (such as NULL dictionary) or the stream state is
@ -796,64 +719,8 @@ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
stream state was inconsistent (such as zalloc or state being NULL). stream state was inconsistent (such as zalloc or state being NULL).
*/ */
ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
int bits,
int value));
/* /*
This function inserts bits in the inflate input stream. The intent is ZEXTERN int ZEXPORT inflateBackInit OF((z_stream FAR *strm, int windowBits,
that this function is used to start inflating at a bit position in the
middle of a byte. The provided bits will be used before any bytes are used
from next_in. This function should only be used with raw inflate, and
should be used before the first inflate() call after inflateInit2() or
inflateReset(). bits must be less than or equal to 16, and that many of the
least significant bits of value will be inserted in the input.
inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
stream state was inconsistent.
*/
ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
gz_headerp head));
/*
inflateGetHeader() requests that gzip header information be stored in the
provided gz_header structure. inflateGetHeader() may be called after
inflateInit2() or inflateReset(), and before the first call of inflate().
As inflate() processes the gzip stream, head->done is zero until the header
is completed, at which time head->done is set to one. If a zlib stream is
being decoded, then head->done is set to -1 to indicate that there will be
no gzip header information forthcoming. Note that Z_BLOCK can be used to
force inflate() to return immediately after header processing is complete
and before any actual data is decompressed.
The text, time, xflags, and os fields are filled in with the gzip header
contents. hcrc is set to true if there is a header CRC. (The header CRC
was valid if done is set to one.) If extra is not Z_NULL, then extra_max
contains the maximum number of bytes to write to extra. Once done is true,
extra_len contains the actual extra field length, and extra contains the
extra field, or that field truncated if extra_max is less than extra_len.
If name is not Z_NULL, then up to name_max characters are written there,
terminated with a zero unless the length is greater than name_max. If
comment is not Z_NULL, then up to comm_max characters are written there,
terminated with a zero unless the length is greater than comm_max. When
any of extra, name, or comment are not Z_NULL and the respective field is
not present in the header, then that field is set to Z_NULL to signal its
absence. This allows the use of deflateSetHeader() with the returned
structure to duplicate the header. However if those fields are set to
allocated memory, then the application will need to save those pointers
elsewhere so that they can be eventually freed.
If inflateGetHeader is not used, then the header information is simply
discarded. The header is always checked for validity, including the header
CRC if present. inflateReset() will reset the process to discard the header
information. The application would need to call inflateGetHeader() again to
retrieve the header from the next gzip stream.
inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
stream state was inconsistent.
*/
/*
ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
unsigned char FAR *window)); unsigned char FAR *window));
Initialize the internal stream state for decompression using inflateBack() Initialize the internal stream state for decompression using inflateBack()
@ -877,7 +744,7 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, ZEXTERN int ZEXPORT inflateBack OF((z_stream FAR *strm,
in_func in, void FAR *in_desc, in_func in, void FAR *in_desc,
out_func out, void FAR *out_desc)); out_func out, void FAR *out_desc));
/* /*
@ -946,7 +813,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
that inflateBack() cannot return Z_OK. that inflateBack() cannot return Z_OK.
*/ */
ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); ZEXTERN int ZEXPORT inflateBackEnd OF((z_stream FAR *strm));
/* /*
All memory allocated by inflateBackInit() is freed. All memory allocated by inflateBackInit() is freed.
@ -1220,12 +1087,6 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file));
input stream, otherwise zero. input stream, otherwise zero.
*/ */
ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
/*
Returns 1 if file is being read directly without decompression, otherwise
zero.
*/
ZEXTERN int ZEXPORT gzclose OF((gzFile file)); ZEXTERN int ZEXPORT gzclose OF((gzFile file));
/* /*
Flushes all pending output if necessary, closes the compressed file Flushes all pending output if necessary, closes the compressed file
@ -1258,6 +1119,7 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
*/ */
ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
/* /*
Update a running Adler-32 checksum with the bytes buf[0..len-1] and Update a running Adler-32 checksum with the bytes buf[0..len-1] and
return the updated checksum. If buf is NULL, this function returns return the updated checksum. If buf is NULL, this function returns
@ -1273,21 +1135,12 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
if (adler != original_adler) error(); if (adler != original_adler) error();
*/ */
ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
z_off_t len2));
/*
Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.
*/
ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
/* /*
Update a running CRC-32 with the bytes buf[0..len-1] and return the Update a running crc with the bytes buf[0..len-1] and return the updated
updated CRC-32. If buf is NULL, this function returns the required initial crc. If buf is NULL, this function returns the required initial value
value for the for the crc. Pre- and post-conditioning (one's complement) is for the crc. Pre- and post-conditioning (one's complement) is performed
performed within this function so it shouldn't be done by the application. within this function so it shouldn't be done by the application.
Usage example: Usage example:
uLong crc = crc32(0L, Z_NULL, 0); uLong crc = crc32(0L, Z_NULL, 0);
@ -1298,16 +1151,6 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
if (crc != original_crc) error(); if (crc != original_crc) error();
*/ */
ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
/*
Combine two CRC-32 check values into one. For two sequences of bytes,
seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
len2.
*/
/* various hacks, don't look :) */ /* various hacks, don't look :) */
@ -1324,7 +1167,7 @@ ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
int stream_size)); int stream_size));
ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
const char *version, int stream_size)); const char *version, int stream_size));
ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, ZEXTERN int ZEXPORT inflateBackInit_ OF((z_stream FAR *strm, int windowBits,
unsigned char FAR *window, unsigned char FAR *window,
const char *version, const char *version,
int stream_size)); int stream_size));
@ -1346,7 +1189,7 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
struct internal_state {int dummy;}; /* hack for buggy compilers */ struct internal_state {int dummy;}; /* hack for buggy compilers */
#endif #endif
ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN const char * ZEXPORT zError OF((int err));
ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));

Binary file not shown.

View File

@ -26,13 +26,13 @@ else
CFLAGS += -DPAWN_CELL_SIZE=32 CFLAGS += -DPAWN_CELL_SIZE=32
endif endif
CFLAGS += -DLINUX -DNDEBUG -DHAVE_STDINT_H -DENABLE_BINRELOC -DNO_MAIN -DPAWNC_DLL -static-libgcc CFLAGS += -DLINUX -DNDEBUG -fPIC -DHAVE_STDINT_H -DENABLE_BINRELOC -DNO_MAIN -DPAWNC_DLL -static-libgcc
CFLAGS += $(OPT_FLAGS) CFLAGS += $(OPT_FLAGS)
OBJ_LINUX := $(OBJECTS:%.c=$(BIN_DIR)/%.o) OBJ_LINUX := $(OBJECTS:%.c=$(BIN_DIR)/%.o)
$(BIN_DIR)/%.o: %.c $(BIN_DIR)/%.o: %.c
$(CPP) $(INCLUDE) $(CFLAGS) -m32 -o $@ -c $< $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $<
all: all:
mkdir -p Release32 mkdir -p Release32
@ -41,7 +41,7 @@ all:
$(MAKE) pawn_make PAWN64=true $(MAKE) pawn_make PAWN64=true
pawn_make: $(OBJ_LINUX) pawn_make: $(OBJ_LINUX)
$(CPP) $(INCLUDE) $(CFLAGS) -m32 $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY)
debug: debug:
$(MAKE) all DEBUG=true $(MAKE) all DEBUG=true

View File

@ -21,15 +21,6 @@
* Version: $Id$ * Version: $Id$
*/ */
#ifdef _MSC_VER
// MSVC8 - replace POSIX functions with ISO C++ conformant ones as they are deprecated
#if _MSC_VER >= 1400
#define access _access
#define chdir _chdir
#define stricmp _stricmp
#endif
#endif
#if defined FREEBSD && !defined __FreeBSD__ #if defined FREEBSD && !defined __FreeBSD__
#define __FreeBSD__ #define __FreeBSD__
#endif #endif
@ -221,7 +212,7 @@ typedef struct tagAMX_NATIVE_INFO {
typedef struct tagAMX_FUNCSTUB { typedef struct tagAMX_FUNCSTUB {
ucell address PACKED; ucell address PACKED;
char name[sEXPMAX+1]; char name[sEXPMAX+1] PACKED;
} PACKED AMX_FUNCSTUB; } PACKED AMX_FUNCSTUB;
typedef struct tagFUNCSTUBNT { typedef struct tagFUNCSTUBNT {
@ -269,8 +260,8 @@ typedef struct tagAMX {
typedef struct tagAMX_HEADER { typedef struct tagAMX_HEADER {
int32_t size PACKED; /* size of the "file" */ int32_t size PACKED; /* size of the "file" */
uint16_t magic PACKED; /* signature */ uint16_t magic PACKED; /* signature */
char file_version; /* file format version */ char file_version PACKED; /* file format version */
char amx_version; /* required version of the AMX */ char amx_version PACKED; /* required version of the AMX */
int16_t flags PACKED; int16_t flags PACKED;
int16_t defsize PACKED; /* size of a definition record */ int16_t defsize PACKED; /* size of a definition record */
int32_t cod PACKED; /* initial value of COD - code block */ int32_t cod PACKED; /* initial value of COD - code block */

View File

@ -65,8 +65,8 @@ extern "C" {
typedef struct tagAMX_DBG_HDR { typedef struct tagAMX_DBG_HDR {
int32_t size PACKED; /* size of the debug information chunk */ int32_t size PACKED; /* size of the debug information chunk */
uint16_t magic PACKED; /* signature, must be 0xf1ef */ uint16_t magic PACKED; /* signature, must be 0xf1ef */
char file_version; /* file format version */ char file_version PACKED; /* file format version */
char amx_version; /* required version of the AMX */ char amx_version PACKED; /* required version of the AMX */
int16_t flags PACKED; /* currently unused */ int16_t flags PACKED; /* currently unused */
int16_t files PACKED; /* number of entries in the "file" table */ int16_t files PACKED; /* number of entries in the "file" table */
int16_t lines PACKED; /* number of entries in the "line" table */ int16_t lines PACKED; /* number of entries in the "line" table */
@ -74,51 +74,51 @@ typedef struct tagAMX_DBG_HDR {
int16_t tags PACKED; /* number of entries in the "tag" table */ int16_t tags PACKED; /* number of entries in the "tag" table */
int16_t automatons PACKED; /* number of entries in the "automaton" table */ int16_t automatons PACKED; /* number of entries in the "automaton" table */
int16_t states PACKED; /* number of entries in the "state" table */ int16_t states PACKED; /* number of entries in the "state" table */
} AMX_DBG_HDR; } AMX_DBG_HDR PACKED;
#define AMX_DBG_MAGIC 0xf1ef #define AMX_DBG_MAGIC 0xf1ef
typedef struct tagAMX_DBG_FILE { typedef struct tagAMX_DBG_FILE {
ucell address PACKED; /* address in the code segment where generated code (for this file) starts */ ucell address PACKED; /* address in the code segment where generated code (for this file) starts */
const char name[1]; /* ASCII string, zero-terminated */ const char name[1] PACKED; /* ASCII string, zero-terminated */
} AMX_DBG_FILE; } AMX_DBG_FILE PACKED;
typedef struct tagAMX_DBG_LINE { typedef struct tagAMX_DBG_LINE {
ucell address PACKED; /* address in the code segment where generated code (for this line) starts */ ucell address PACKED; /* address in the code segment where generated code (for this line) starts */
int32_t line PACKED; /* line number */ int32_t line PACKED; /* line number */
} AMX_DBG_LINE; } AMX_DBG_LINE PACKED;
typedef struct tagAMX_DBG_SYMBOL { typedef struct tagAMX_DBG_SYMBOL {
ucell address PACKED; /* address in the data segment or relative to the frame */ ucell address PACKED; /* address in the data segment or relative to the frame */
int16_t tag PACKED; /* tag for the symbol */ int16_t tag PACKED; /* tag for the symbol */
ucell codestart PACKED; /* address in the code segment from which this symbol is valid (in scope) */ ucell codestart PACKED; /* address in the code segment from which this symbol is valid (in scope) */
ucell codeend PACKED; /* address in the code segment until which this symbol is valid (in scope) */ ucell codeend PACKED; /* address in the code segment until which this symbol is valid (in scope) */
char ident; /* kind of symbol (function/variable) */ char ident PACKED; /* kind of symbol (function/variable) */
char vclass; /* class of symbol (global/local) */ char vclass PACKED; /* class of symbol (global/local) */
int16_t dim PACKED; /* number of dimensions */ int16_t dim PACKED; /* number of dimensions */
const char name[1]; /* ASCII string, zero-terminated */ const char name[1] PACKED; /* ASCII string, zero-terminated */
} AMX_DBG_SYMBOL; } AMX_DBG_SYMBOL PACKED;
typedef struct tagAMX_DBG_SYMDIM { typedef struct tagAMX_DBG_SYMDIM {
int16_t tag PACKED; /* tag for the array dimension */ int16_t tag PACKED; /* tag for the array dimension */
ucell size PACKED; /* size of the array dimension */ ucell size PACKED; /* size of the array dimension */
} AMX_DBG_SYMDIM; } AMX_DBG_SYMDIM PACKED;
typedef struct tagAMX_DBG_TAG { typedef struct tagAMX_DBG_TAG {
int16_t tag PACKED; /* tag id */ int16_t tag PACKED; /* tag id */
const char name[1]; /* ASCII string, zero-terminated */ const char name[1] PACKED; /* ASCII string, zero-terminated */
} AMX_DBG_TAG; } AMX_DBG_TAG PACKED;
typedef struct tagAMX_DBG_MACHINE { typedef struct tagAMX_DBG_MACHINE {
int16_t automaton PACKED; /* automaton id */ int16_t automaton PACKED; /* automaton id */
ucell address PACKED; /* address of state variable */ ucell address PACKED; /* address of state variable */
const char name[1]; /* ASCII string, zero-terminated */ const char name[1] PACKED; /* ASCII string, zero-terminated */
} AMX_DBG_MACHINE; } AMX_DBG_MACHINE PACKED;
typedef struct tagAMX_DBG_STATE { typedef struct tagAMX_DBG_STATE {
int16_t state PACKED; /* state id */ int16_t state PACKED; /* state id */
int16_t automaton PACKED; /* automaton id */ int16_t automaton PACKED; /* automaton id */
const char name[1]; /* ASCII string, zero-terminated */ const char name[1] PACKED; /* ASCII string, zero-terminated */
} AMX_DBG_STATE; } AMX_DBG_STATE PACKED;
typedef struct tagAMX_DBG { typedef struct tagAMX_DBG {
AMX_DBG_HDR _FAR *hdr PACKED; /* points to the AMX_DBG header */ AMX_DBG_HDR _FAR *hdr PACKED; /* points to the AMX_DBG header */
@ -128,7 +128,7 @@ typedef struct tagAMX_DBG {
AMX_DBG_TAG _FAR **tagtbl PACKED; AMX_DBG_TAG _FAR **tagtbl PACKED;
AMX_DBG_MACHINE _FAR **automatontbl PACKED; AMX_DBG_MACHINE _FAR **automatontbl PACKED;
AMX_DBG_STATE _FAR **statetbl PACKED; AMX_DBG_STATE _FAR **statetbl PACKED;
} AMX_DBG; } AMX_DBG PACKED;
#if !defined iVARIABLE #if !defined iVARIABLE
#define iVARIABLE 1 /* cell that has an address and that can be fetched directly (lvalue) */ #define iVARIABLE 1 /* cell that has an address and that can be fetched directly (lvalue) */

View File

@ -1,26 +1,33 @@
 Microsoft Visual Studio Solution File, Format Version 8.00
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpc300", "libpc300.vcproj", "{19B72687-080B-437A-917A-12AEB0031635}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpc300", "libpc300.vcproj", "{19B72687-080B-437A-917A-12AEB0031635}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfiguration) = preSolution
Debug32|Win32 = Debug32|Win32 Debug = Debug
Debug64|Win32 = Debug64|Win32 Debug32 = Debug32
Release32|Win32 = Release32|Win32 Debug64 = Debug64
Release64|Win32 = Release64|Win32 Release = Release
Release32 = Release32
Release64 = Release64
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfiguration) = postSolution
{19B72687-080B-437A-917A-12AEB0031635}.Debug32|Win32.ActiveCfg = Debug32|Win32 {19B72687-080B-437A-917A-12AEB0031635}.Debug.ActiveCfg = Release|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Debug32|Win32.Build.0 = Debug32|Win32 {19B72687-080B-437A-917A-12AEB0031635}.Debug.Build.0 = Release|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Debug64|Win32.ActiveCfg = Debug64|Win32 {19B72687-080B-437A-917A-12AEB0031635}.Debug32.ActiveCfg = Debug32|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Debug64|Win32.Build.0 = Debug64|Win32 {19B72687-080B-437A-917A-12AEB0031635}.Debug32.Build.0 = Debug32|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Release32|Win32.ActiveCfg = Release32|Win32 {19B72687-080B-437A-917A-12AEB0031635}.Debug64.ActiveCfg = Debug64|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Release32|Win32.Build.0 = Release32|Win32 {19B72687-080B-437A-917A-12AEB0031635}.Debug64.Build.0 = Debug64|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Release64|Win32.ActiveCfg = Release64|Win32 {19B72687-080B-437A-917A-12AEB0031635}.Release.ActiveCfg = Release|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Release64|Win32.Build.0 = Release64|Win32 {19B72687-080B-437A-917A-12AEB0031635}.Release.Build.0 = Release|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Release32.ActiveCfg = Release32|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Release32.Build.0 = Release32|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Release64.ActiveCfg = Release64|Win32
{19B72687-080B-437A-917A-12AEB0031635}.Release64.Build.0 = Release64|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(ExtensibilityGlobals) = postSolution
HideSolutionNode = FALSE EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View File

@ -1,335 +1,303 @@
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="7.10"
Name="libpc300" Name="libpc300"
ProjectGUID="{19B72687-080B-437A-917A-12AEB0031635}" ProjectGUID="{19B72687-080B-437A-917A-12AEB0031635}"
RootNamespace="libpc300" RootNamespace="libpc300"
Keyword="Win32Proj" Keyword="Win32Proj">
>
<Platforms> <Platforms>
<Platform <Platform
Name="Win32" Name="Win32"/>
/>
</Platforms> </Platforms>
<ToolFiles>
</ToolFiles>
<Configurations> <Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="2"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBPC300_EXPORTS"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/libpc300.dll"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/libpc300.pdb"
SubSystem="2"
ImportLibrary="$(OutDir)/libpc300.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<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"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBPC300_EXPORTS"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/libpc300.dll"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
ImportLibrary="$(OutDir)/libpc300.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration <Configuration
Name="Release32|Win32" Name="Release32|Win32"
OutputDirectory="$(ConfigurationName)" OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2" ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" CharacterSet="2">
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBPC300_EXPORTS;PAWNC_DLL;PAWN_CELL_SIZE=32;NO_MAIN;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBPC300_EXPORTS;PAWNC_DLL;PAWN_CELL_SIZE=32;NO_MAIN"
RuntimeLibrary="0" RuntimeLibrary="0"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="false" Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3" DebugInformationFormat="3"/>
/>
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCCustomBuildTool"/>
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
OutputFile="$(OutDir)/amxxpc32.dll" OutputFile="$(OutDir)/amxxpc32.dll"
LinkIncremental="1" LinkIncremental="1"
GenerateDebugInformation="true" GenerateDebugInformation="TRUE"
SubSystem="2" SubSystem="2"
OptimizeReferences="2" OptimizeReferences="2"
EnableCOMDATFolding="2" EnableCOMDATFolding="2"
ImportLibrary="$(OutDir)/libpc300.lib" ImportLibrary="$(OutDir)/libpc300.lib"
TargetMachine="1" TargetMachine="1"/>
/>
<Tool <Tool
Name="VCALinkTool" Name="VCMIDLTool"/>
/>
<Tool <Tool
Name="VCManifestTool" Name="VCPostBuildEventTool"/>
/>
<Tool <Tool
Name="VCXDCMakeTool" Name="VCPreBuildEventTool"/>
/>
<Tool <Tool
Name="VCBscMakeTool" Name="VCPreLinkEventTool"/>
/>
<Tool <Tool
Name="VCFxCopTool" Name="VCResourceCompilerTool"/>
/>
<Tool <Tool
Name="VCAppVerifierTool" Name="VCWebServiceProxyGeneratorTool"/>
/>
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCXMLDataGeneratorTool"/>
/>
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCWebDeploymentTool"/>
/> <Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release64|Win32" Name="Release64|Win32"
OutputDirectory="$(ConfigurationName)" OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2" ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" CharacterSet="2">
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBPC300_EXPORTS;PAWNC_DLL;PAWN_CELL_SIZE=64;NO_MAIN;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBPC300_EXPORTS;PAWNC_DLL;PAWN_CELL_SIZE=64;NO_MAIN"
RuntimeLibrary="0" RuntimeLibrary="0"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="false" Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3" DebugInformationFormat="3"/>
/>
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCCustomBuildTool"/>
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
OutputFile="$(OutDir)/amxxpc64.dll" OutputFile="$(OutDir)/amxxpc64.dll"
LinkIncremental="1" LinkIncremental="1"
GenerateDebugInformation="true" GenerateDebugInformation="TRUE"
SubSystem="2" SubSystem="2"
OptimizeReferences="2" OptimizeReferences="2"
EnableCOMDATFolding="2" EnableCOMDATFolding="2"
ImportLibrary="$(OutDir)/libpc300.lib" ImportLibrary="$(OutDir)/libpc300.lib"
TargetMachine="1" TargetMachine="1"/>
/>
<Tool <Tool
Name="VCALinkTool" Name="VCMIDLTool"/>
/>
<Tool <Tool
Name="VCManifestTool" Name="VCPostBuildEventTool"/>
/>
<Tool <Tool
Name="VCXDCMakeTool" Name="VCPreBuildEventTool"/>
/>
<Tool <Tool
Name="VCBscMakeTool" Name="VCPreLinkEventTool"/>
/>
<Tool <Tool
Name="VCFxCopTool" Name="VCResourceCompilerTool"/>
/>
<Tool <Tool
Name="VCAppVerifierTool" Name="VCWebServiceProxyGeneratorTool"/>
/>
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCXMLDataGeneratorTool"/>
/>
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCWebDeploymentTool"/>
/> <Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration> </Configuration>
<Configuration <Configuration
Name="Debug32|Win32" Name="Debug32|Win32"
OutputDirectory="$(ConfigurationName)" OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2" ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" CharacterSet="2">
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBPC300_EXPORTS;PAWNC_DLL;PAWN_CELL_SIZE=32;NO_MAIN;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBPC300_EXPORTS;PAWNC_DLL;PAWN_CELL_SIZE=32;NO_MAIN"
MinimalRebuild="true" MinimalRebuild="TRUE"
BasicRuntimeChecks="1" BasicRuntimeChecks="1"
RuntimeLibrary="1" RuntimeLibrary="1"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="false" Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="4" DebugInformationFormat="4"/>
/>
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCCustomBuildTool"/>
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
OutputFile="$(OutDir)/amxxpc32.dll" OutputFile="$(OutDir)/amxxpc32.dll"
LinkIncremental="2" LinkIncremental="2"
GenerateDebugInformation="true" GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/libpc300.pdb" ProgramDatabaseFile="$(OutDir)/libpc300.pdb"
SubSystem="2" SubSystem="2"
ImportLibrary="$(OutDir)/libpc300.lib" ImportLibrary="$(OutDir)/libpc300.lib"
TargetMachine="1" TargetMachine="1"/>
/>
<Tool <Tool
Name="VCALinkTool" Name="VCMIDLTool"/>
/>
<Tool <Tool
Name="VCManifestTool" Name="VCPostBuildEventTool"/>
/>
<Tool <Tool
Name="VCXDCMakeTool" Name="VCPreBuildEventTool"/>
/>
<Tool <Tool
Name="VCBscMakeTool" Name="VCPreLinkEventTool"/>
/>
<Tool <Tool
Name="VCFxCopTool" Name="VCResourceCompilerTool"/>
/>
<Tool <Tool
Name="VCAppVerifierTool" Name="VCWebServiceProxyGeneratorTool"/>
/>
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCXMLDataGeneratorTool"/>
/>
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCWebDeploymentTool"/>
/> <Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration> </Configuration>
<Configuration <Configuration
Name="Debug64|Win32" Name="Debug64|Win32"
OutputDirectory="$(ConfigurationName)" OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2" ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" CharacterSet="2">
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBPC300_EXPORTS;PAWNC_DLL;PAWN_CELL_SIZE=64;NO_MAIN;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBPC300_EXPORTS;PAWNC_DLL;PAWN_CELL_SIZE=64;NO_MAIN"
MinimalRebuild="true" MinimalRebuild="TRUE"
BasicRuntimeChecks="1" BasicRuntimeChecks="1"
RuntimeLibrary="1" RuntimeLibrary="1"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="false" Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="4" DebugInformationFormat="4"/>
/>
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCCustomBuildTool"/>
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
OutputFile="$(OutDir)/amxxpc64.dll" OutputFile="$(OutDir)/amxxpc64.dll"
LinkIncremental="2" LinkIncremental="2"
GenerateDebugInformation="true" GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/libpc300.pdb" ProgramDatabaseFile="$(OutDir)/libpc300.pdb"
SubSystem="2" SubSystem="2"
ImportLibrary="$(OutDir)/libpc300.lib" ImportLibrary="$(OutDir)/libpc300.lib"
TargetMachine="1" TargetMachine="1"/>
/>
<Tool <Tool
Name="VCALinkTool" Name="VCMIDLTool"/>
/>
<Tool <Tool
Name="VCManifestTool" Name="VCPostBuildEventTool"/>
/>
<Tool <Tool
Name="VCXDCMakeTool" Name="VCPreBuildEventTool"/>
/>
<Tool <Tool
Name="VCBscMakeTool" Name="VCPreLinkEventTool"/>
/>
<Tool <Tool
Name="VCFxCopTool" Name="VCResourceCompilerTool"/>
/>
<Tool <Tool
Name="VCAppVerifierTool" Name="VCWebServiceProxyGeneratorTool"/>
/>
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCXMLDataGeneratorTool"/>
/>
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCWebDeploymentTool"/>
/> <Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
@ -338,103 +306,79 @@
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
>
<File <File
RelativePath=".\libpawnc.c" RelativePath=".\libpawnc.c">
>
</File> </File>
<File <File
RelativePath=".\memfile.c" RelativePath=".\memfile.c">
>
</File> </File>
<File <File
RelativePath=".\sc1.c" RelativePath=".\sc1.c">
>
</File> </File>
<File <File
RelativePath=".\sc2.c" RelativePath=".\sc2.c">
>
</File> </File>
<File <File
RelativePath=".\sc3.c" RelativePath=".\sc3.c">
>
</File> </File>
<File <File
RelativePath=".\sc4.c" RelativePath=".\sc4.c">
>
</File> </File>
<File <File
RelativePath=".\sc5.c" RelativePath=".\sc5.c">
>
</File> </File>
<File <File
RelativePath=".\sc6.c" RelativePath=".\sc6.c">
>
</File> </File>
<File <File
RelativePath=".\sc7.c" RelativePath=".\sc7.c">
>
</File> </File>
<File <File
RelativePath=".\scexpand.c" RelativePath=".\scexpand.c">
>
</File> </File>
<File <File
RelativePath=".\sci18n.c" RelativePath=".\sci18n.c">
>
</File> </File>
<File <File
RelativePath=".\sclist.c" RelativePath=".\sclist.c">
>
</File> </File>
<File <File
RelativePath=".\scmemfil.c" RelativePath=".\scmemfil.c">
>
</File> </File>
<File <File
RelativePath=".\scstate.c" RelativePath=".\scstate.c">
>
</File> </File>
<File <File
RelativePath=".\scvars.c" RelativePath=".\scvars.c">
>
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
>
<File <File
RelativePath=".\amx.h" RelativePath=".\amx.h">
>
</File> </File>
<File <File
RelativePath=".\memfile.h" RelativePath=".\memfile.h">
>
</File> </File>
<File <File
RelativePath=".\sc.h" RelativePath=".\sc.h">
>
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
>
<File <File
RelativePath=".\libpawnc.rc" RelativePath=".\libpawnc.rc">
>
</File> </File>
<File <File
RelativePath=".\sc5.scp" RelativePath=".\sc5.scp">
>
</File> </File>
<File <File
RelativePath=".\sc7.scp" RelativePath=".\sc7.scp">
>
</File> </File>
</Filter> </Filter>
</Files> </Files>

View File

@ -21,11 +21,7 @@ memfile_t *memfile_creat(const char *name, size_t init)
pmf = (memfile_t *)malloc(sizeof(memfile_t)); pmf = (memfile_t *)malloc(sizeof(memfile_t));
memcpy(pmf, &mf, sizeof(memfile_t)); memcpy(pmf, &mf, sizeof(memfile_t));
#if defined _MSC_VER
pmf->name = _strdup(name);
#else
pmf->name = strdup(name); pmf->name = strdup(name);
#endif
return pmf; return pmf;
} }

View File

@ -1,14 +1,6 @@
#ifndef _INCLUDE_MEMFILE_H #ifndef _INCLUDE_MEMFILE_H
#define _INCLUDE_MEMFILE_H #define _INCLUDE_MEMFILE_H
#ifdef _MSC_VER
// MSVC8 - replace POSIX functions with ISO C++ conformant ones as they are deprecated
#if _MSC_VER >= 1400
#define strdup _strdup
#pragma warning(disable : 4996)
#endif
#endif
#include <malloc.h> #include <malloc.h>
typedef struct memfile_s typedef struct memfile_s

View File

@ -785,8 +785,6 @@ SC_VDECL short sc_is_utf8; /* is this source file in UTF-8 encoding */
SC_VDECL constvalue sc_automaton_tab; /* automaton table */ SC_VDECL constvalue sc_automaton_tab; /* automaton table */
SC_VDECL constvalue sc_state_tab; /* state table */ SC_VDECL constvalue sc_state_tab; /* state table */
SC_VDECL int pc_anytag;
SC_VDECL FILE *inpf; /* file read from (source or include) */ SC_VDECL FILE *inpf; /* file read from (source or include) */
SC_VDECL FILE *inpf_org; /* main source file */ SC_VDECL FILE *inpf_org; /* main source file */
SC_VDECL FILE *outf; /* file written to */ SC_VDECL FILE *outf; /* file written to */

View File

@ -67,8 +67,6 @@
#define VERSION_STR "3.0.3367-amxx" #define VERSION_STR "3.0.3367-amxx"
#define VERSION_INT 0x300 #define VERSION_INT 0x300
int pc_anytag;
static void resetglobals(void); static void resetglobals(void);
static void initglobals(void); static void initglobals(void);
static void setopt(int argc,char **argv,char *oname,char *ename,char *pname, static void setopt(int argc,char **argv,char *oname,char *ename,char *pname,
@ -1404,8 +1402,6 @@ static void setconstants(void)
add_constant("ucharmax",(1 << (sizeof(cell)-1)*8)-1,sGLOBAL,0); add_constant("ucharmax",(1 << (sizeof(cell)-1)*8)-1,sGLOBAL,0);
add_constant("__Pawn",VERSION_INT,sGLOBAL,0); add_constant("__Pawn",VERSION_INT,sGLOBAL,0);
pc_anytag=pc_addtag("any");
debug=0; debug=0;
if ((sc_debug & (sCHKBOUNDS | sSYMBOLIC))==(sCHKBOUNDS | sSYMBOLIC)) if ((sc_debug & (sCHKBOUNDS | sSYMBOLIC))==(sCHKBOUNDS | sSYMBOLIC))

View File

@ -1344,8 +1344,7 @@ static int command(void)
case tpERROR: case tpERROR:
while (*lptr<=' ' && *lptr!='\0') while (*lptr<=' ' && *lptr!='\0')
lptr++; lptr++;
if (!SKIPPING) error(111,lptr); /* user error */
error(111,lptr); /* user error */
break; break;
default: default:
error(31); /* unknown compiler directive */ error(31); /* unknown compiler directive */

View File

@ -284,13 +284,12 @@ static void (*unopers[])(void) = { lneg, neg, user_inc, user_dec };
SC_FUNC int matchtag(int formaltag,int actualtag,int allowcoerce) SC_FUNC int matchtag(int formaltag,int actualtag,int allowcoerce)
{ {
if (formaltag!=actualtag && formaltag!=pc_anytag && actualtag!=pc_anytag) { if (formaltag!=actualtag) {
/* if the formal tag is zero and the actual tag is not "fixed", the actual /* if the formal tag is zero and the actual tag is not "fixed", the actual
* tag is "coerced" to zero * tag is "coerced" to zero
*/ */
if (!allowcoerce || formaltag!=0 || (actualtag & FIXEDTAG)!=0) if (!allowcoerce || formaltag!=0 || (actualtag & FIXEDTAG)!=0)
return FALSE; return FALSE;
} /* if */ } /* if */
return TRUE; return TRUE;
} }

View File

@ -240,7 +240,7 @@ SC_FUNC stringlist *insert_path(char *path)
strcpy(extra_path, path); strcpy(extra_path, path);
#if defined __linux__ #if defined __linux__
strcat(extra_path, "/amxmod_compat/"); strcat(extra_path, "/amxmod_compat/");
#elif defined WIN32 || defined _WIN32 #else if defined WIN32 || defined _WIN32
strcat(extra_path, "\\amxmod_compat\\"); strcat(extra_path, "\\amxmod_compat\\");
#endif #endif
insert_string(&includepaths, extra_path); insert_string(&includepaths, extra_path);

View File

@ -2,12 +2,12 @@ CPPFILES = amxasm.cpp cexpr.cpp amx_symbol.cpp amx_proc.cpp \
amx_parser.cpp amx_natives.cpp amx_macro.cpp amx_label.cpp \ amx_parser.cpp amx_natives.cpp amx_macro.cpp amx_label.cpp \
amx_error.cpp amx_define.cpp amx_data.cpp amx_compiler.cpp amx_error.cpp amx_define.cpp amx_data.cpp amx_compiler.cpp
FLAGS = -march=i386 -m32 FLAGS = -march=i386
all: sasm all: sasm
sasm: sasm:
g++ $(FLAGS) -DHAVE_STDINT_H -Wall $(CPPFILES) -o sasm -s g++ $(FLAGS) -Wall $(CPPFILES) -o sasm -s
clean: clean:
-rm *.o -rm *.o

View File

@ -21,7 +21,7 @@ $gccf = "gcc";
my %OPTIONS, %OPT; my %OPTIONS, %OPT;
$OPT{"debug"} = "-g -ggdb"; $OPT{"debug"} = "-g -ggdb";
$OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DHAVE_STDINT_H -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\""; $OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\"";
$OPTIONS{"include"} = ""; $OPTIONS{"include"} = "";
@ -63,7 +63,7 @@ if ($OPTIONS{"debug"})
{ {
$proc = 3; $proc = 3;
} }
$cflags = "-march=i".$proc."86 -m32 ".$OPT{"opt"}; $cflags = "-march=i".$proc."86 ".$OPT{"opt"};
} else { } else {
$cflags = $OPT{"opt"}; $cflags = $OPT{"opt"};
} }
@ -133,7 +133,7 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
$ofile = $file; $ofile = $file;
$ofile =~ s/\.cpp/\.o/; $ofile =~ s/\.cpp/\.o/;
$ofile = "$outdir/$ofile"; $ofile = "$outdir/$ofile";
$gcc = "$gccf $cflags -Dstrcmpi=strcasecmp $inc -c $file -o $ofile"; $gcc = "$gccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
if (-e $ofile) if (-e $ofile)
{ {
$file_time = (stat($file))[9]; $file_time = (stat($file))[9];
@ -155,7 +155,7 @@ for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++)
$ofile = $file; $ofile = $file;
$ofile =~ s/\.c/\.o/; $ofile =~ s/\.c/\.o/;
$ofile = "$outdir/$ofile"; $ofile = "$outdir/$ofile";
$gcc = "cc $cflags -Dstrcmpi=strcasecmp $inc -c $file -o $ofile"; $gcc = "cc $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile";
if (-e $ofile) if (-e $ofile)
{ {
$file_time = (stat($file))[9]; $file_time = (stat($file))[9];

View File

@ -1,6 +1,6 @@
/* Pawn Abstract Machine (for the Pawn language) /* Abstract Machine for the Small compiler
* *
* Copyright (c) ITB CompuPhase, 1997-2005 * Copyright (c) ITB CompuPhase, 1997-2004
* *
* This software is provided "as-is", without any express or implied warranty. * This software is provided "as-is", without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from * In no event will the authors be held liable for any damages arising from
@ -21,90 +21,53 @@
* Version: $Id$ * Version: $Id$
*/ */
#if defined FREEBSD && !defined __FreeBSD__ #if defined LINUX
#define __FreeBSD__
#endif
#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
#include <sclinux.h> #include <sclinux.h>
#endif #endif
#ifndef AMX_H_INCLUDED #ifndef AMX_H_INCLUDED
#define AMX_H_INCLUDED #define AMX_H_INCLUDED
#if defined HAVE_STDINT_H #if defined __LCC__ || defined __DMC__ || defined LINUX
#include <stdint.h> #include <stdint.h>
#else #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
#if defined __LCC__ || defined __DMC__ || defined LINUX /* The ISO C99 defines the int16_t and int_32t types. If the compiler got
#if defined HAVE_INTTYPES_H * here, these types are probably undefined.
#include <inttypes.h> */
#if defined __FreeBSD__
#include <inttypes.h>
#else
typedef short int int16_t;
typedef unsigned short int uint16_t;
#if defined SN_TARGET_PS2
typedef int int32_t;
typedef unsigned int uint32_t;
#else #else
#include <stdint.h> typedef long int int32_t;
typedef unsigned long int uint32_t;
#endif #endif
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L #if defined __WIN32__ || defined _WIN32 || defined WIN32
/* The ISO C99 defines the int16_t and int_32t types. If the compiler got typedef __int64 int64_t;
* here, these types are probably undefined. typedef unsigned __int64 uint64_t;
*/ #define HAVE_I64
#if defined __MACH__ #elif defined __GNUC__
#include <ppc/types.h> typedef long long int64_t;
typedef unsigned short int uint16_t; typedef unsigned long long uint64_t;
typedef unsigned long int uint32_t; #define HAVE_I64
#elif defined __FreeBSD__
#include <inttypes.h>
#else
typedef short int int16_t;
typedef unsigned short int uint16_t;
#if defined SN_TARGET_PS2
typedef int int32_t;
typedef unsigned int uint32_t;
#else
typedef long int int32_t;
typedef unsigned long int uint32_t;
#endif
#if defined __WIN32__ || defined _WIN32 || defined WIN32
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
#define HAVE_I64
#elif defined __GNUC__
typedef long long int64_t;
typedef unsigned long long uint64_t;
#define HAVE_I64
#endif
#endif #endif
#endif #endif
#define HAVE_STDINT_H
#endif
#if defined _LP64 || defined WIN64 || defined _WIN64
#if !defined __64BIT__
#define __64BIT__
#endif
#endif #endif
#if HAVE_ALLOCA_H
#include <alloca.h>
#endif
#if defined __WIN32__ || defined _WIN32 || defined WIN32 /* || defined __MSDOS__ */ #if defined __WIN32__ || defined _WIN32 || defined WIN32 /* || defined __MSDOS__ */
#if !defined alloca #if !defined alloca
#define alloca(n) _alloca(n) #define alloca(n) _alloca(n)
#endif #endif
#endif #endif
#if !defined arraysize
#define arraysize(array) (sizeof(array) / sizeof((array)[0]))
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#if defined PAWN_DLL
#if !defined AMX_NATIVE_CALL
#define AMX_NATIVE_CALL __stdcall
#endif
#if !defined AMXAPI
#define AMXAPI __stdcall
#endif
#endif
/* calling convention for native functions */ /* calling convention for native functions */
#if !defined AMX_NATIVE_CALL #if !defined AMX_NATIVE_CALL
#define AMX_NATIVE_CALL #define AMX_NATIVE_CALL
@ -115,8 +78,6 @@ extern "C" {
#define AMXAPI __stdcall #define AMXAPI __stdcall
#elif defined CDECL #elif defined CDECL
#define AMXAPI __cdecl #define AMXAPI __cdecl
#elif defined GCC_HASCLASSVISIBILITY
#define AMXAPI __attribute__ ((visibility("default")))
#else #else
#define AMXAPI #define AMXAPI
#endif #endif
@ -134,30 +95,31 @@ extern "C" {
* 5 (tagnames table) 4 * 5 (tagnames table) 4
* 6 (reformatted header) 6 * 6 (reformatted header) 6
* 7 (name table, opcodes SYMTAG & SYSREQ.D) 7 * 7 (name table, opcodes SYMTAG & SYSREQ.D) 7
* 8 (opcode STMT, renewed debug interface) 8
*/ */
#define CUR_FILE_VERSION 8 /* current file version; also the current AMX version */ #define CUR_FILE_VERSION 7 /* current file version; also the current AMX version */
#define MIN_FILE_VERSION 6 /* lowest supported file format version for the current AMX version */ #define MIN_FILE_VERSION 6 /* lowest supported file format version for the current AMX version */
#define MIN_AMX_VERSION 8 /* minimum AMX version needed to support the current file format */ #define MIN_AMX_VERSION 7 /* minimum AMX version needed to support the current file format */
#if !defined PAWN_CELL_SIZE #if defined BIT16
#define PAWN_CELL_SIZE 32 /* by default, use 32-bit cells */ #define SMALL_CELL_SIZE 16 /* for backward compatibility */
#endif #endif
#if PAWN_CELL_SIZE==16 #if !defined SMALL_CELL_SIZE
#define SMALL_CELL_SIZE 32 /* by default, use 32-bit cells */
#endif
#if SMALL_CELL_SIZE==16
typedef uint16_t ucell; typedef uint16_t ucell;
typedef int16_t cell; typedef int16_t cell;
#elif PAWN_CELL_SIZE==32 #elif SMALL_CELL_SIZE==32
typedef uint32_t ucell; typedef uint32_t ucell;
typedef int32_t cell; typedef int32_t cell;
#elif PAWN_CELL_SIZE==64 #elif SMALL_CELL_SIZE==64
typedef uint64_t ucell; typedef uint64_t ucell;
typedef int64_t cell; typedef int64_t cell;
#else #else
#error Unsupported cell size (PAWN_CELL_SIZE) #error Unsupported cell size (SMALL_CELL_SIZE)
#endif #endif
#define UNPACKEDMAX ((1L << (sizeof(cell)-1)*8) - 1) #define UNPACKEDMAX ((1 << (sizeof(cell)-1)*8) - 1)
#define UNLIMITED (~1u >> 1)
struct tagAMX; struct tagAMX;
typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, cell *params); typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, cell *params);
@ -177,7 +139,7 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
/* Some compilers do not support the #pragma align, which should be fine. Some /* Some compilers do not support the #pragma align, which should be fine. Some
* compilers give a warning on unknown #pragmas, which is not so fine... * compilers give a warning on unknown #pragmas, which is not so fine...
*/ */
#if (defined SN_TARGET_PS2 || defined __GNUC__) && !defined AMX_NO_ALIGN #if defined SN_TARGET_PS2 || defined __GNUC__
#define AMX_NO_ALIGN #define AMX_NO_ALIGN
#endif #endif
@ -188,10 +150,8 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
#endif #endif
#if !defined AMX_NO_ALIGN #if !defined AMX_NO_ALIGN
#if defined LINUX || defined __FreeBSD__ #if defined LINUX
#pragma pack(1) /* structures must be packed (byte-aligned) */ #pragma pack(1) /* structures must be packed (byte-aligned) */
#elif defined MACOS && defined __MWERKS__
#pragma options align=mac68k
#else #else
#pragma pack(push) #pragma pack(push)
#pragma pack(1) /* structures must be packed (byte-aligned) */ #pragma pack(1) /* structures must be packed (byte-aligned) */
@ -201,30 +161,25 @@ typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
#endif #endif
#endif #endif
typedef struct tagAMX_NATIVE_INFO { typedef struct {
const char _FAR *name PACKED; const char _FAR *name PACKED;
AMX_NATIVE func PACKED; AMX_NATIVE func PACKED;
} PACKED AMX_NATIVE_INFO; } AMX_NATIVE_INFO PACKED;
#define AMX_USERNUM 4 #define AMX_USERNUM 4
#define sEXPMAX 19 /* maximum name length for file version <= 6 */ #define sEXPMAX 19 /* maximum name length for file version <= 6 */
#define sNAMEMAX 31 /* maximum name length of symbol name */ #define sNAMEMAX 31 /* maximum name length of symbol name */
typedef struct tagAMX_FUNCSTUB { typedef struct tagAMX_FUNCSTUB {
ucell address PACKED; uint32_t address PACKED;
char name[sEXPMAX+1]; char name[sEXPMAX+1] PACKED;
} PACKED AMX_FUNCSTUB; } AMX_FUNCSTUB PACKED;
typedef struct tagFUNCSTUBNT {
ucell address PACKED;
ucell nameofs PACKED; //we need this for amxx to be backwards comaptible
} PACKED AMX_FUNCSTUBNT;
/* The AMX structure is the internal structure for many functions. Not all /* The AMX structure is the internal structure for many functions. Not all
* fields are valid at all times; many fields are cached in local variables. * fields are valid at all times; many fields are cached in local variables.
*/ */
typedef struct tagAMX { typedef struct tagAMX {
unsigned char _FAR *base PACKED; /* points to the AMX header plus the code, optionally also the data */ unsigned char _FAR *base PACKED; /* points to the AMX header ("amxhdr") plus the code, optionally also the data */
unsigned char _FAR *data PACKED; /* points to separate data+stack+heap, may be NULL */ unsigned char _FAR *data PACKED; /* points to separate data+stack+heap, may be NULL */
AMX_CALLBACK callback PACKED; AMX_CALLBACK callback PACKED;
AMX_DEBUG debug PACKED; /* debug callback */ AMX_DEBUG debug PACKED; /* debug callback */
@ -236,23 +191,30 @@ typedef struct tagAMX {
cell stk PACKED; /* stack pointer: relative to base + amxhdr->dat */ cell stk PACKED; /* stack pointer: relative to base + amxhdr->dat */
cell stp PACKED; /* top of the stack: relative to base + amxhdr->dat */ cell stp PACKED; /* top of the stack: relative to base + amxhdr->dat */
int flags PACKED; /* current status, see amx_Flags() */ int flags PACKED; /* current status, see amx_Flags() */
/* for assertions and debug hook */
cell curline PACKED;
cell curfile PACKED;
int dbgcode PACKED;
cell dbgaddr PACKED;
cell dbgparam PACKED;
char _FAR *dbgname PACKED;
/* user data */ /* user data */
long usertags[AMX_USERNUM] PACKED; long usertags[AMX_USERNUM] PACKED;
void _FAR *userdata[AMX_USERNUM] PACKED; void _FAR *userdata[AMX_USERNUM] PACKED;
/* native functions can raise an error */ /* native functions can raise an error */
int error PACKED; int error PACKED;
/* passing parameters requires a "count" field */
int paramcount;
/* the sleep opcode needs to store the full AMX status */ /* the sleep opcode needs to store the full AMX status */
cell pri PACKED; cell pri PACKED;
cell alt PACKED; cell alt PACKED;
cell reset_stk PACKED; cell reset_stk PACKED;
cell reset_hea PACKED; cell reset_hea PACKED;
cell sysreq_d PACKED; /* relocated address/value for the SYSREQ.D opcode */ cell sysreq_d PACKED; /* relocated address/value for the SYSREQ.D opcode */
/* support variables for the JIT */ #if defined JIT
int reloc_size PACKED; /* required temporary buffer for relocations */ /* support variables for the JIT */
long code_size PACKED; /* estimated memory footprint of the native code */ int reloc_size PACKED; /* required temporary buffer for relocations */
} PACKED AMX; long code_size PACKED; /* estimated memory footprint of the native code */
#endif
} AMX PACKED;
/* The AMX_HEADER structure is both the memory format as the file format. The /* The AMX_HEADER structure is both the memory format as the file format. The
* structure is used internaly. * structure is used internaly.
@ -260,8 +222,8 @@ typedef struct tagAMX {
typedef struct tagAMX_HEADER { typedef struct tagAMX_HEADER {
int32_t size PACKED; /* size of the "file" */ int32_t size PACKED; /* size of the "file" */
uint16_t magic PACKED; /* signature */ uint16_t magic PACKED; /* signature */
char file_version; /* file format version */ char file_version PACKED; /* file format version */
char amx_version; /* required version of the AMX */ char amx_version PACKED; /* required version of the AMX */
int16_t flags PACKED; int16_t flags PACKED;
int16_t defsize PACKED; /* size of a definition record */ int16_t defsize PACKED; /* size of a definition record */
int32_t cod PACKED; /* initial value of COD - code block */ int32_t cod PACKED; /* initial value of COD - code block */
@ -274,11 +236,9 @@ typedef struct tagAMX_HEADER {
int32_t libraries PACKED; /* offset to the table of libraries */ int32_t libraries PACKED; /* offset to the table of libraries */
int32_t pubvars PACKED; /* the "public variables" table */ int32_t pubvars PACKED; /* the "public variables" table */
int32_t tags PACKED; /* the "public tagnames" table */ int32_t tags PACKED; /* the "public tagnames" table */
int32_t nametable PACKED; /* name table */ int32_t nametable PACKED; /* name table, file version 7 only */
} PACKED AMX_HEADER; } AMX_HEADER PACKED;
#define AMX_MAGIC 0xf1e0
//This is always the same for us
#define AMX_MAGIC 0xf1e0
enum { enum {
AMX_ERR_NONE, AMX_ERR_NONE,
@ -295,7 +255,6 @@ enum {
AMX_ERR_NATIVE, /* native function failed */ AMX_ERR_NATIVE, /* native function failed */
AMX_ERR_DIVIDE, /* divide by zero */ AMX_ERR_DIVIDE, /* divide by zero */
AMX_ERR_SLEEP, /* go into sleepmode - code can be restarted */ AMX_ERR_SLEEP, /* go into sleepmode - code can be restarted */
AMX_ERR_INVSTATE, /* invalid state for this access */
AMX_ERR_MEMORY = 16, /* out of memory */ AMX_ERR_MEMORY = 16, /* out of memory */
AMX_ERR_FORMAT, /* invalid file format */ AMX_ERR_FORMAT, /* invalid file format */
@ -308,17 +267,27 @@ enum {
AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */
AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_PARAMS, /* parameter error */
AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */
AMX_ERR_GENERAL, /* general error (unknown or unspecific error) */ };
enum {
DBG_INIT, /* query/initialize */
DBG_FILE, /* file number in curfile, filename in name */
DBG_LINE, /* line number in curline, file number in curfile */
DBG_SYMBOL, /* address in dbgaddr, class/type in dbgparam */
DBG_CLRSYM, /* stack address below which locals should be removed. stack address in stk */
DBG_CALL, /* function call, address jumped to in dbgaddr */
DBG_RETURN, /* function returns */
DBG_TERMINATE, /* program ends, code address in dbgaddr, reason in dbgparam */
DBG_SRANGE, /* symbol size and dimensions (arrays); level in dbgaddr (!); length in dbgparam */
DBG_SYMTAG, /* tag of the most recent symbol (if non-zero), tag in dbgparam */
}; };
/* AMX_FLAG_CHAR16 0x01 no longer used */ /* AMX_FLAG_CHAR16 0x01 no longer used */
#define AMX_FLAG_DEBUG 0x02 /* symbolic info. available */ #define AMX_FLAG_DEBUG 0x02 /* symbolic info. available */
#define AMX_FLAG_COMPACT 0x04 /* compact encoding */ #define AMX_FLAG_COMPACT 0x04 /* compact encoding */
#define AMX_FLAG_BYTEOPC 0x08 /* opcode is a byte (not a cell) */ #define AMX_FLAG_BIGENDIAN 0x08 /* big endian encoding */
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking; no STMT opcode */ #define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking */
#define AMX_FLAG_NTVREG 0x1000 /* all native functions are registered */ #define AMX_FLAG_BROWSE 0x4000 /* browsing/relocating or executing */
#define AMX_FLAG_JITC 0x2000 /* abstract machine is JIT compiled */
#define AMX_FLAG_BROWSE 0x4000 /* busy browsing */
#define AMX_FLAG_RELOC 0x8000 /* jump/call addresses relocated */ #define AMX_FLAG_RELOC 0x8000 /* jump/call addresses relocated */
#define AMX_EXEC_MAIN -1 /* start at program entry point */ #define AMX_EXEC_MAIN -1 /* start at program entry point */
@ -326,18 +295,16 @@ enum {
#define AMX_USERTAG(a,b,c,d) ((a) | ((b)<<8) | ((long)(c)<<16) | ((long)(d)<<24)) #define AMX_USERTAG(a,b,c,d) ((a) | ((b)<<8) | ((long)(c)<<16) | ((long)(d)<<24))
#if !defined AMX_COMPACTMARGIN #define AMX_EXPANDMARGIN 64
#define AMX_COMPACTMARGIN 64
#endif
/* for native functions that use floating point parameters, the following /* for native functions that use floating point parameters, the following
* two macros are convenient for casting a "cell" into a "float" type _without_ * two macros are convenient for casting a "cell" into a "float" type _without_
* changing the bit pattern * changing the bit pattern
*/ */
#if PAWN_CELL_SIZE==32 #if SMALL_CELL_SIZE==32
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */ #define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
#define amx_ctof(c) ( * ((float*)&c) ) /* cell to float */ #define amx_ctof(c) ( * ((float*)&c) ) /* cell to float */
#elif PAWN_CELL_SIZE==64 #elif SMALL_CELL_SIZE==64
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */ #define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
#define amx_ctof(c) ( * ((double*)&c) ) /* cell to float */ #define amx_ctof(c) ( * ((double*)&c) ) /* cell to float */
#else #else
@ -351,7 +318,7 @@ enum {
amx_StrLen(amx_cstr_, &amx_length_); \ amx_StrLen(amx_cstr_, &amx_length_); \
if (amx_length_ > 0 && \ if (amx_length_ > 0 && \
((result) = (void*)alloca((amx_length_ + 1) * sizeof(*(result)))) != NULL) \ ((result) = (void*)alloca((amx_length_ + 1) * sizeof(*(result)))) != NULL) \
amx_GetString((char*)(result), amx_cstr_, sizeof(*(result))>1, amx_length_); \ amx_GetString((char*)(result), amx_cstr_, sizeof(*(result))>1); \
else (result) = NULL; \ else (result) = NULL; \
} while (0) } while (0)
@ -364,7 +331,9 @@ int AMXAPI amx_Allot(AMX *amx, int cells, cell *amx_addr, cell **phys_addr);
int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params); int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params);
int AMXAPI amx_Cleanup(AMX *amx); int AMXAPI amx_Cleanup(AMX *amx);
int AMXAPI amx_Clone(AMX *amxClone, AMX *amxSource, void *data); int AMXAPI amx_Clone(AMX *amxClone, AMX *amxSource, void *data);
int AMXAPI amx_Exec(AMX *amx, cell *retval, int index); int AMXAPI amx_Debug(AMX *amx); /* default debug procedure, does nothing */
int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...);
int AMXAPI amx_Execv(AMX *amx, cell *retval, int index, int numparams, cell params[]);
int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index); int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index);
int AMXAPI amx_FindPublic(AMX *amx, const char *funcname, int *index); int AMXAPI amx_FindPublic(AMX *amx, const char *funcname, int *index);
int AMXAPI amx_FindPubVar(AMX *amx, const char *varname, cell *amx_addr); int AMXAPI amx_FindPubVar(AMX *amx, const char *varname, cell *amx_addr);
@ -374,52 +343,34 @@ int AMXAPI amx_GetAddr(AMX *amx,cell amx_addr,cell **phys_addr);
int AMXAPI amx_GetNative(AMX *amx, int index, char *funcname); int AMXAPI amx_GetNative(AMX *amx, int index, char *funcname);
int AMXAPI amx_GetPublic(AMX *amx, int index, char *funcname); int AMXAPI amx_GetPublic(AMX *amx, int index, char *funcname);
int AMXAPI amx_GetPubVar(AMX *amx, int index, char *varname, cell *amx_addr); int AMXAPI amx_GetPubVar(AMX *amx, int index, char *varname, cell *amx_addr);
int AMXAPI amx_GetString(char *dest,const cell *source, int use_wchar, size_t size); int AMXAPI amx_GetString(char *dest,const cell *source, int use_wchar);
int AMXAPI amx_GetTag(AMX *amx, int index, char *tagname, cell *tag_id); int AMXAPI amx_GetTag(AMX *amx, int index, char *tagname, cell *tag_id);
int AMXAPI amx_GetUserData(AMX *amx, long tag, void **ptr); int AMXAPI amx_GetUserData(AMX *amx, long tag, void **ptr);
int AMXAPI amx_Init(AMX *amx, void *program); int AMXAPI amx_Init(AMX *amx, void *program);
int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code); int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code);
int AMXAPI amx_MemInfo(AMX *amx, long *codesize, long *datasize, long *stackheap); int AMXAPI amx_MemInfo(AMX *amx, long *codesize, long *datasize, long *stackheap);
int AMXAPI amx_NameLength(AMX *amx, int *length); int AMXAPI amx_NameLength(AMX *amx, int *length);
AMX_NATIVE_INFO * AMXAPI amx_NativeInfo(const char *name, AMX_NATIVE func); AMX_NATIVE_INFO * AMXAPI amx_NativeInfo(const char *name,AMX_NATIVE func);
int AMXAPI amx_NumNatives(AMX *amx, int *number); int AMXAPI amx_NumNatives(AMX *amx, int *number);
int AMXAPI amx_NumPublics(AMX *amx, int *number); int AMXAPI amx_NumPublics(AMX *amx, int *number);
int AMXAPI amx_NumPubVars(AMX *amx, int *number); int AMXAPI amx_NumPubVars(AMX *amx, int *number);
int AMXAPI amx_NumTags(AMX *amx, int *number); int AMXAPI amx_NumTags(AMX *amx, int *number);
int AMXAPI amx_Push(AMX *amx, cell value);
int AMXAPI amx_PushArray(AMX *amx, cell *amx_addr, cell **phys_addr, const cell array[], int numcells);
int AMXAPI amx_PushString(AMX *amx, cell *amx_addr, cell **phys_addr, const char *string, int pack, int use_wchar);
int AMXAPI amx_RaiseError(AMX *amx, int error); int AMXAPI amx_RaiseError(AMX *amx, int error);
int AMXAPI amx_Register(AMX *amx, const AMX_NATIVE_INFO *nativelist, int number); int AMXAPI amx_Register(AMX *amx, AMX_NATIVE_INFO *nativelist, int number);
int AMXAPI amx_Release(AMX *amx, cell amx_addr); int AMXAPI amx_Release(AMX *amx, cell amx_addr);
int AMXAPI amx_SetCallback(AMX *amx, AMX_CALLBACK callback); int AMXAPI amx_SetCallback(AMX *amx, AMX_CALLBACK callback);
int AMXAPI amx_SetDebugHook(AMX *amx, AMX_DEBUG debug); int AMXAPI amx_SetDebugHook(AMX *amx, AMX_DEBUG debug);
int AMXAPI amx_SetString(cell *dest, const char *source, int pack, int use_wchar, size_t size); int AMXAPI amx_SetString(cell *dest, const char *source, int pack, int use_wchar);
int AMXAPI amx_SetUserData(AMX *amx, long tag, void *ptr); int AMXAPI amx_SetUserData(AMX *amx, long tag, void *ptr);
int AMXAPI amx_StrLen(const cell *cstring, int *length); int AMXAPI amx_StrLen(cell *cstring, int *length);
int AMXAPI amx_UTF8Check(const char *string, int *length);
int AMXAPI amx_UTF8Get(const char *string, const char **endptr, cell *value); int AMXAPI amx_UTF8Get(const char *string, const char **endptr, cell *value);
int AMXAPI amx_UTF8Len(const cell *cstr, int *length);
int AMXAPI amx_UTF8Put(char *string, char **endptr, int maxchars, cell value); int AMXAPI amx_UTF8Put(char *string, char **endptr, int maxchars, cell value);
int AMXAPI amx_UTF8Check(const char *string);
#if PAWN_CELL_SIZE==16
#define amx_AlignCell(v) amx_Align16(v)
#elif PAWN_CELL_SIZE==32
#define amx_AlignCell(v) amx_Align32(v)
#elif PAWN_CELL_SIZE==64 && (defined _I64_MAX || defined HAVE_I64)
#define amx_AlignCell(v) amx_Align64(v)
#else
#error Unsupported cell size
#endif
#define amx_RegisterFunc(amx, name, func) \
amx_Register((amx), amx_NativeInfo((name),(func)), 1);
#if !defined AMX_NO_ALIGN #if !defined AMX_NO_ALIGN
#if defined LINUX || defined __FreeBSD__ #if defined LINUX
#pragma pack() /* reset default packing */ #pragma pack() /* reset default packing */
#elif defined MACOS && defined __MWERKS__
#pragma options align=reset
#else #else
#pragma pack(pop) /* reset previous packing */ #pragma pack(pop) /* reset previous packing */
#endif #endif

View File

@ -1,20 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assembler", "assembler.vcproj", "{FFFC86BE-94E7-458A-A61B-4D0F3B45658B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{FFFC86BE-94E7-458A-A61B-4D0F3B45658B}.Debug|Win32.ActiveCfg = Debug|Win32
{FFFC86BE-94E7-458A-A61B-4D0F3B45658B}.Debug|Win32.Build.0 = Debug|Win32
{FFFC86BE-94E7-458A-A61B-4D0F3B45658B}.Release|Win32.ActiveCfg = Release|Win32
{FFFC86BE-94E7-458A-A61B-4D0F3B45658B}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -1,175 +1,108 @@
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="7.10"
Name="assembler" Name="assembler"
ProjectGUID="{FFFC86BE-94E7-458A-A61B-4D0F3B45658B}" ProjectGUID="{FFFC86BE-94E7-458A-A61B-4D0F3B45658B}"
RootNamespace="assembler" Keyword="Win32Proj">
Keyword="Win32Proj"
>
<Platforms> <Platforms>
<Platform <Platform
Name="Win32" Name="Win32"/>
/>
</Platforms> </Platforms>
<ToolFiles>
</ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
OutputDirectory="Debug" OutputDirectory="Debug"
IntermediateDirectory="Debug" IntermediateDirectory="Debug"
ConfigurationType="1" ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" CharacterSet="2">
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true" MinimalRebuild="TRUE"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="5"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4" DebugInformationFormat="4"/>
/>
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCCustomBuildTool"/>
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
OutputFile="$(OutDir)/sasm.exe" OutputFile="$(OutDir)/sasm.exe"
LinkIncremental="2" LinkIncremental="2"
GenerateDebugInformation="true" GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/assembler.pdb" ProgramDatabaseFile="$(OutDir)/assembler.pdb"
SubSystem="1" SubSystem="1"
TargetMachine="1" TargetMachine="1"/>
/>
<Tool <Tool
Name="VCALinkTool" Name="VCMIDLTool"/>
/>
<Tool <Tool
Name="VCManifestTool" Name="VCPostBuildEventTool"/>
/>
<Tool <Tool
Name="VCXDCMakeTool" Name="VCPreBuildEventTool"/>
/>
<Tool <Tool
Name="VCBscMakeTool" Name="VCPreLinkEventTool"/>
/>
<Tool <Tool
Name="VCFxCopTool" Name="VCResourceCompilerTool"/>
/>
<Tool <Tool
Name="VCAppVerifierTool" Name="VCWebServiceProxyGeneratorTool"/>
/>
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCXMLDataGeneratorTool"/>
/>
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCWebDeploymentTool"/>
/> <Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
OutputDirectory="Release" OutputDirectory="Release"
IntermediateDirectory="Release" IntermediateDirectory="Release"
ConfigurationType="1" ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" CharacterSet="2">
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="0" RuntimeLibrary="4"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3" DebugInformationFormat="3"/>
/>
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCCustomBuildTool"/>
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
OutputFile="$(OutDir)/sasm.exe" OutputFile="$(OutDir)/sasm.exe"
LinkIncremental="1" LinkIncremental="1"
GenerateDebugInformation="true" GenerateDebugInformation="TRUE"
SubSystem="1" SubSystem="1"
OptimizeReferences="2" OptimizeReferences="2"
EnableCOMDATFolding="2" EnableCOMDATFolding="2"
TargetMachine="1" TargetMachine="1"/>
/>
<Tool <Tool
Name="VCALinkTool" Name="VCMIDLTool"/>
/>
<Tool <Tool
Name="VCManifestTool" Name="VCPostBuildEventTool"/>
/>
<Tool <Tool
Name="VCXDCMakeTool" Name="VCPreBuildEventTool"/>
/>
<Tool <Tool
Name="VCBscMakeTool" Name="VCPreLinkEventTool"/>
/>
<Tool <Tool
Name="VCFxCopTool" Name="VCResourceCompilerTool"/>
/>
<Tool <Tool
Name="VCAppVerifierTool" Name="VCWebServiceProxyGeneratorTool"/>
/>
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCXMLDataGeneratorTool"/>
/>
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCWebDeploymentTool"/>
/> <Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
@ -178,117 +111,89 @@
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
>
<File <File
RelativePath=".\amx_compiler.cpp" RelativePath=".\amx_compiler.cpp">
>
</File> </File>
<File <File
RelativePath=".\amx_data.cpp" RelativePath=".\amx_data.cpp">
>
</File> </File>
<File <File
RelativePath=".\amx_define.cpp" RelativePath=".\amx_define.cpp">
>
</File> </File>
<File <File
RelativePath=".\amx_error.cpp" RelativePath=".\amx_error.cpp">
>
</File> </File>
<File <File
RelativePath=".\amx_label.cpp" RelativePath=".\amx_label.cpp">
>
</File> </File>
<File <File
RelativePath=".\amx_macro.cpp" RelativePath=".\amx_macro.cpp">
>
</File> </File>
<File <File
RelativePath=".\amx_natives.cpp" RelativePath=".\amx_natives.cpp">
>
</File> </File>
<File <File
RelativePath=".\amx_parser.cpp" RelativePath=".\amx_parser.cpp">
>
</File> </File>
<File <File
RelativePath=".\amx_proc.cpp" RelativePath=".\amx_proc.cpp">
>
</File> </File>
<File <File
RelativePath=".\amx_symbol.cpp" RelativePath=".\amx_symbol.cpp">
>
</File> </File>
<File <File
RelativePath=".\amxasm.cpp" RelativePath=".\amxasm.cpp">
>
</File> </File>
<File <File
RelativePath=".\cexpr.cpp" RelativePath=".\cexpr.cpp">
>
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
>
<File <File
RelativePath=".\amx.h" RelativePath=".\amx.h">
>
</File> </File>
<File <File
RelativePath=".\amx_compiler.h" RelativePath=".\amx_compiler.h">
>
</File> </File>
<File <File
RelativePath=".\amx_data.h" RelativePath=".\amx_data.h">
>
</File> </File>
<File <File
RelativePath=".\amx_define.h" RelativePath=".\amx_define.h">
>
</File> </File>
<File <File
RelativePath=".\amx_error.h" RelativePath=".\amx_error.h">
>
</File> </File>
<File <File
RelativePath=".\amx_label.h" RelativePath=".\amx_label.h">
>
</File> </File>
<File <File
RelativePath=".\amx_macro.h" RelativePath=".\amx_macro.h">
>
</File> </File>
<File <File
RelativePath=".\amx_nametable.h" RelativePath=".\amx_nametable.h">
>
</File> </File>
<File <File
RelativePath=".\amx_natives.h" RelativePath=".\amx_natives.h">
>
</File> </File>
<File <File
RelativePath=".\amx_parser.h" RelativePath=".\amx_parser.h">
>
</File> </File>
<File <File
RelativePath=".\amx_proc.h" RelativePath=".\amx_proc.h">
>
</File> </File>
<File <File
RelativePath=".\amx_symbol.h" RelativePath=".\amx_symbol.h">
>
</File> </File>
<File <File
RelativePath=".\amxasm.h" RelativePath=".\amxasm.h">
>
</File> </File>
<File <File
RelativePath=".\cexpr.h" RelativePath=".\cexpr.h">
>
</File> </File>
</Filter> </Filter>
</Files> </Files>

Binary file not shown.

Binary file not shown.

View File

@ -1,75 +1,42 @@
// AMX Mod X Configuration File // AMX Configuration File
echo Executing AMX Mod X Configuration File echo Executing AMX Mod X Configuration File
// Default access for all non admin players (see users.ini for access details) // Default access for all non admin players (see users.ini for access details)
//
// Default value: "z"
amx_default_access "z" amx_default_access "z"
// Name of setinfo which should store a password on a client (you should change this) // Name of setinfo which should store a password on a client (you should change this)
// Note: Always prefix the field with an underscore (aka: "_")
// (Example: setinfo _pw "password") // (Example: setinfo _pw "password")
//
// Default value: "_pw"
amx_password_field "_pw" amx_password_field "_pw"
// Mode of logging to a server // Mode of logging to a server
// 0 - disable logging, players won't be checked (and access won't be set) // 0 - disable logging, players won't be checked (and access won't be set)
// 1 - normal mode which obey flags set in accounts // 1 - normal mode which obey flags set in accounts
// 2 - kick all players not on list // 2 - kick all players not on list
//
// Default value: 1
amx_mode 1 amx_mode 1
// Show admins activity // Show admins activity
// 0 - disabled // 0 - disabled
// 1 - show without admin name // 1 - show without admin name
// 2 - show with name // 2 - show with name
//
// Default value: 2
amx_show_activity 2 amx_show_activity 2
// Frequency in seconds and text of scrolling message // Frequency in seconds and text of scrolling message
//
// Default value: "Welcome to %hostname% -- This server is using AMX Mod X" 600
amx_scrollmsg "Welcome to %hostname% -- This server is using AMX Mod X" 600 amx_scrollmsg "Welcome to %hostname% -- This server is using AMX Mod X" 600
// Center typed colored messages (last parameter is a color in RRRGGGBBB format) // Center typed colored messages (last parameter is a color in RRRGGGBBB format)
//
// Default values: "Welcome to %hostname%" "000255100"
// "This server is using AMX ModX\nVisit http://www.amxmodx.org" "000100255"
amx_imessage "Welcome to %hostname%" "000255100" amx_imessage "Welcome to %hostname%" "000255100"
amx_imessage "This server is using AMX Mod X\nVisit http://www.amxmodx.org" "000100255" amx_imessage "This server is using AMX Mod X\nVisit http://www.amxmodx.org" "000100255"
// Frequency in seconds of colored messages // Frequency in seconds of colored messages
//
// Default value: 180
amx_freq_imessage 180 amx_freq_imessage 180
// Ban times for the main ban menu (amx_banmenu)
// Use 0 for permanent ban.
// Default values: 0 5 10 15 30 45 60
amx_plmenu_bantimes 0 5 10 15 30 45 60
// Slap damage amounts for the main slap menu (amx_slapmenu)
// Slay is automatically inserted as the first option.
// Default values: 0 1 5
amx_plmenu_slapdmg 0 1 5
// Set in seconds how fast players can chat (chat-flood protection) // Set in seconds how fast players can chat (chat-flood protection)
//
// Default value: 0.75
amx_flood_time 0.75 amx_flood_time 0.75
// Amount of slots to reserve. // Amount of reserved slots, amx_hideslots must be 1 to use this cvar (for more details see comments in plugin source)
//
// Default value: 0
amx_reservation 0 amx_reservation 0
// If you set this to 1, you can hide slots on your server. // If you set this to 1, you can hide slots on your server
// If server "full" of public slots and slots hidden, you must manually connect with connect console command
//
// Default value: 0
amx_hideslots 0 amx_hideslots 0
// Displaying of time remaining // Displaying of time remaining
@ -78,58 +45,33 @@ amx_hideslots 0
// c - don't add "remaining" (only in voice) // c - don't add "remaining" (only in voice)
// d - don't add "hours/minutes/seconds" (only in voice) // d - don't add "hours/minutes/seconds" (only in voice)
// e - show/speak if current time is less than this set in parameter // e - show/speak if current time is less than this set in parameter
//
// Default value: "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11"
amx_time_display "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11" amx_time_display "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11"
// Announce "say thetime" and "say timeleft" with voice, set to 0 to disable. // Announce "say thetime" and "say timeleft" with voice
//
// Default value: 1
amx_time_voice 1 amx_time_voice 1
// Minimum delay in seconds between two voting sessions // Minimum delay in seconds between two voting sessions
//
// Default value: 10
amx_vote_delay 10 amx_vote_delay 10
// How long voting session goes on // How long voting session goes on
//
// Default value: 10
amx_vote_time 10 amx_vote_time 10
// Display who votes for what option, set to 0 to disable, 1 to enable. // Display who votes for what option
//
// Default value: 1
amx_vote_answers 1 amx_vote_answers 1
// Some ratios for voting success // Some ratios for voting success
// Default value: 0.40
amx_votekick_ratio 0.40 amx_votekick_ratio 0.40
// Default value: 0.40
amx_voteban_ratio 0.40 amx_voteban_ratio 0.40
// Default value: 0.40
amx_votemap_ratio 0.40 amx_votemap_ratio 0.40
// Default value: 0.02
amx_vote_ratio 0.02 amx_vote_ratio 0.02
// Max. time to which map can be extended // Max. time to which map can be extended
//
// Default value: 90
amx_extendmap_max 90 amx_extendmap_max 90
// Step for each extending // Step for each extending
//
// Default value: 15
amx_extendmap_step 15 amx_extendmap_step 15
// If you set this to 0, clients cannot chose their language, instead they use //If you set this to 0, clients cannot chose their language
// whatever language the server is configured to use.
//
// Default value: 1
amx_client_languages 1 amx_client_languages 1
// Plugin Debug mode // Plugin Debug mode
@ -137,13 +79,9 @@ amx_client_languages 1
// 1 - Plugins with "debug" option in plugins.ini are put into debug mode // 1 - Plugins with "debug" option in plugins.ini are put into debug mode
// 2 - All plugins are put in debug mode // 2 - All plugins are put in debug mode
// Note - debug mode will affect JIT performance // Note - debug mode will affect JIT performance
//
// Default value: 1
amx_debug 1 amx_debug 1
// Plugin MultiLingual Debug // Plugin MultiLingual Debug
// To debug a language put its 2 letter code between quotes ("en", "de", etc) // To debug a language put its 2 letter code between quotes ("en", "de", etc)
// "" means disabled // "" means disabled
// amx_mldebug ""
// Default value: ""
amx_mldebug ""

1
configs/conmotd.txt Executable file
View File

@ -0,0 +1 @@
For newest AMX Mod X and many plugins visit http://www.amxmodx.org/

View File

@ -1,75 +1,42 @@
// AMX Mod X Configuration File // AMX Configuration File
echo Executing AMX Mod X Configuration File echo Executing AMX Mod X Configuration File
// Default access for all non admin players (see users.ini for access details) // Default access for all non admin players (see users.ini for access details)
//
// Default value: "z"
amx_default_access "z" amx_default_access "z"
// Name of setinfo which should store a password on a client (you should change this) // Name of setinfo which should store a password on a client (you should change this)
// Note: Always prefix the field with an underscore (aka: "_")
// (Example: setinfo _pw "password") // (Example: setinfo _pw "password")
//
// Default value: "_pw"
amx_password_field "_pw" amx_password_field "_pw"
// Mode of logging to a server // Mode of logging to a server
// 0 - disable logging, players won't be checked (and access won't be set) // 0 - disable logging, players won't be checked (and access won't be set)
// 1 - normal mode which obey flags set in accounts // 1 - normal mode which obey flags set in accounts
// 2 - kick all players not on list // 2 - kick all players not on list
//
// Default value: 1
amx_mode 1 amx_mode 1
// Show admins activity // Show admins activity
// 0 - disabled // 0 - disabled
// 1 - show without admin name // 1 - show without admin name
// 2 - show with name // 2 - show with name
//
// Default value: 2
amx_show_activity 2 amx_show_activity 2
// Frequency in seconds and text of scrolling message // Frequency in seconds and text of scrolling message
//
// Default value: "Welcome to %hostname% -- This server is using AMX Mod X" 600
amx_scrollmsg "Welcome to %hostname% -- This server is using AMX Mod X" 600 amx_scrollmsg "Welcome to %hostname% -- This server is using AMX Mod X" 600
// Center typed colored messages (last parameter is a color in RRRGGGBBB format) // Center typed colored messages (last parameter is a color in RRRGGGBBB format)
//
// Default values: "Welcome to %hostname%" "000255100"
// "This server is using AMX ModX\nVisit http://www.amxmodx.org" "000100255"
amx_imessage "Welcome to %hostname%" "000255100" amx_imessage "Welcome to %hostname%" "000255100"
amx_imessage "This server is using AMX Mod X\nVisit http://www.amxmodx.org" "000100255" amx_imessage "This server is using AMX Mod X\nVisit http://www.amxmodx.org" "000100255"
// Frequency in seconds of colored messages // Frequency in seconds of colored messages
//
// Default value: 180
amx_freq_imessage 180 amx_freq_imessage 180
// Ban times for the main ban menu (amx_banmenu)
// Use 0 for permanent ban
// Default values: 0 5 10 15 30 45 60
amx_plmenu_bantimes 0 5 10 15 30 45 60
// Slap damage amounts for the main slap menu (amx_slapmenu)
// Slay is automaticall inserted as the first option
// Default values: 0 1 5
amx_plmenu_slapdmg 0 1 5
// Set in seconds how fast players can chat (chat-flood protection) // Set in seconds how fast players can chat (chat-flood protection)
//
// Default value: 0.75
amx_flood_time 0.75 amx_flood_time 0.75
// Amount of slots to reserve. // Amount of reserved slots, amx_hideslots must be 1 to use this cvar (for more details see comments in plugin source)
//
// Default value: 0
amx_reservation 0 amx_reservation 0
// If you set this to 1, you can hide slots on your server. // If you set this to 1, you can hide slots on your server
// If server "full" of public slots and slots hidden, you must manually connect with connect console command
//
// Default value: 0
amx_hideslots 0 amx_hideslots 0
// Displaying of time remaining // Displaying of time remaining
@ -78,58 +45,49 @@ amx_hideslots 0
// c - don't add "remaining" (only in voice) // c - don't add "remaining" (only in voice)
// d - don't add "hours/minutes/seconds" (only in voice) // d - don't add "hours/minutes/seconds" (only in voice)
// e - show/speak if current time is less than this set in parameter // e - show/speak if current time is less than this set in parameter
//
// Default value: "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11"
amx_time_display "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11" amx_time_display "ab 1200" "ab 600" "ab 300" "ab 180" "ab 60" "bcde 11"
// Announce "say thetime" and "say timeleft" with voice, set to 0 to disable. // Announce "say thetime" and "say timeleft" with voice
//
// Default value: 1
amx_time_voice 1 amx_time_voice 1
// Minimum delay in seconds between two voting sessions // Minimum delay in seconds between two voting sessions
//
// Default value: 10
amx_vote_delay 10 amx_vote_delay 10
// How long voting session goes on // How long voting session goes on
//
// Default value: 10
amx_vote_time 10 amx_vote_time 10
// Display who votes for what option, set to 0 to disable, 1 to enable. // Display who votes for what option
//
// Default value: 1
amx_vote_answers 1 amx_vote_answers 1
// Some ratios for voting success // Some ratios for voting success
// Default value: 0.40
amx_votekick_ratio 0.40 amx_votekick_ratio 0.40
// Default value: 0.40
amx_voteban_ratio 0.40 amx_voteban_ratio 0.40
// Default value: 0.40
amx_votemap_ratio 0.40 amx_votemap_ratio 0.40
// Default value: 0.02
amx_vote_ratio 0.02 amx_vote_ratio 0.02
// Max. time to which map can be extended // Max. time to which map can be extended
//
// Default value: 90
amx_extendmap_max 90 amx_extendmap_max 90
// Step for each extending // Step for each extending
//
// Default value: 15
amx_extendmap_step 15 amx_extendmap_step 15
// If you set this to 0, clients cannot chose their language, instead they use // Rank mode
// whatever language the server is configured to use. // 0 - by nick
// // 1 - by authid
// Default value: 1 // 2 - by ip
csstats_rank 1
// Max size of the stats file
csstats_maxsize 3500
// Duration of HUD-statistics
amx_statsx_duration 12.0
// HUD-statistics display limit relative round freeze end
// Negative time will clear the HUD-statstics before the round freeze time has ended
amx_statsx_freeze -2.0
//If you set this to 0, clients cannot chose their language
amx_client_languages 1 amx_client_languages 1
// Plugin Debug mode // Plugin Debug mode
@ -137,47 +95,9 @@ amx_client_languages 1
// 1 - Plugins with "debug" option in plugins.ini are put into debug mode // 1 - Plugins with "debug" option in plugins.ini are put into debug mode
// 2 - All plugins are put in debug mode // 2 - All plugins are put in debug mode
// Note - debug mode will affect JIT performance // Note - debug mode will affect JIT performance
//
// Default value: 1
amx_debug 1 amx_debug 1
// Plugin MultiLingual Debug // Plugin MultiLingual Debug
// To debug a language put its 2 letter code between quotes ("en", "de", etc) // To debug a language put its 2 letter code between quotes ("en", "de", etc)
// "" means disabled // "" means disabled
// amx_mldebug ""
// Default value: ""
amx_mldebug ""
//
// Beginning of Counter-Strike package specific configurations.
//
// Rank mode
// 0 - by nick
// 1 - by authid
// 2 - by ip
//
// Default value: 1
csstats_rank 1
// Max size of the stats file
//
// Default value: 3500
csstats_maxsize 3500
// Whether or not to rank bots with csstats - set to 1 to rank bots, 0 otherwise.
//
// Default value: 0
csstats_rankbots 0
// Duration of HUD-statistics
//
// Default value: 12.0
amx_statsx_duration 12.0
// HUD-statistics display limit relative round freeze end
// Negative time will clear the HUD-statstics before the round freeze time has ended
//
// Default value: -2.0
amx_statsx_freeze -2.0

View File

@ -7,9 +7,8 @@ amxx_plugins addons/amxmodx/configs/plugins.ini
amxx_pluginsdir addons/amxmodx/plugins amxx_pluginsdir addons/amxmodx/plugins
amxx_modulesdir addons/amxmodx/modules amxx_modulesdir addons/amxmodx/modules
amxx_vault addons/amxmodx/data/vault.ini amxx_vault addons/amxmodx/data/vault.ini
; It is important that "csstats" comes before "csstats_score"
csstats addons/amxmodx/data/csstats.dat
csstats_score addons/amxmodx/data/csstats.amxx csstats_score addons/amxmodx/data/csstats.amxx
csstats addons/amxmodx/data/csstats.dat
; Logging mode ; Logging mode
; 0 - no logging ; 0 - no logging

View File

@ -37,4 +37,3 @@ fun
;nvault ;nvault
cstrike cstrike
csx csx
;hamsandwich

View File

@ -16,7 +16,6 @@ cmdmenu.amxx ; command menu (speech, settings)
plmenu.amxx ; players menu (kick, ban, client cmds.) plmenu.amxx ; players menu (kick, ban, client cmds.)
;telemenu.amxx ; teleport menu (Fun Module required!) ;telemenu.amxx ; teleport menu (Fun Module required!)
mapsmenu.amxx ; maps menu (vote, changelevel) mapsmenu.amxx ; maps menu (vote, changelevel)
pluginmenu.amxx ; Menus for commands/cvars organized by plugin
; Chat / Messages ; Chat / Messages
adminchat.amxx ; console chat commands adminchat.amxx ; console chat commands

View File

@ -15,9 +15,8 @@ amxx_vault addons/amxmodx/data/vault.ini
; 3 - HL Logs ; 3 - HL Logs
amxx_logging 1 amxx_logging 1
; It is important that "dodstats" comes before "dodstats_score"
dodstats addons/amxmodx/data/dodstats.dat
dodstats_score addons/amxmodx/data/dodstats.amxx dodstats_score addons/amxmodx/data/dodstats.amxx
dodstats addons/amxmodx/data/dodstats.dat
; Binary logging level ; Binary logging level
; add these up to get what you want ; add these up to get what you want

View File

@ -37,4 +37,3 @@ fun
;nvault ;nvault
dodfun dodfun
dodx dodx
;hamsandwich

View File

@ -16,7 +16,6 @@ cmdmenu.amxx ; command menu (speech, settings)
plmenu.amxx ; players menu (kick, ban, client cmds.) plmenu.amxx ; players menu (kick, ban, client cmds.)
;telemenu.amxx ; teleport menu (Fun Module required!) ;telemenu.amxx ; teleport menu (Fun Module required!)
mapsmenu.amxx ; maps menu (vote, changelevel) mapsmenu.amxx ; maps menu (vote, changelevel)
pluginmenu.amxx ; Menus for commands/cvars organized by plugin
; Chat / Messages ; Chat / Messages
adminchat.amxx ; console chat commands adminchat.amxx ; console chat commands

View File

@ -35,4 +35,3 @@ fakemeta
;sockets ;sockets
;regex ;regex
;nvault ;nvault
;hamsandwich

View File

@ -16,7 +16,6 @@ cmdmenu.amxx ; command menu (speech, settings)
plmenu.amxx ; players menu (kick, ban, client cmds.) plmenu.amxx ; players menu (kick, ban, client cmds.)
;telemenu.amxx ; teleport menu (Fun Module required!) ;telemenu.amxx ; teleport menu (Fun Module required!)
mapsmenu.amxx ; maps menu (vote, changelevel) mapsmenu.amxx ; maps menu (vote, changelevel)
pluginmenu.amxx ; Menus for commands/cvars organized by plugin
; Chat / Messages ; Chat / Messages
adminchat.amxx ; console chat commands adminchat.amxx ; console chat commands
@ -39,4 +38,4 @@ statscfg.amxx ; allows to manage stats plugins via menu and commands
; Custom - Add 3rd party plugins here ; Custom - Add 3rd party plugins here
EvolutionX.Core.amxx ; Adds extra plugin functions for Earth's Special Forces EvolutionX.Core.amxx ; Adds extra plugin functions for Earth's Special Forces
; (made by the Corona Bytes team of EVM) ; (made by the Corona Bytes team of EVM)

File diff suppressed because it is too large Load Diff

View File

@ -35,4 +35,3 @@
;sockets ;sockets
;regex ;regex
;nvault ;nvault
;hamsandwich

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