Compare commits
1 Commits
amxmodx-1.
...
amxmodx-1.
Author | SHA1 | Date | |
---|---|---|---|
16b7c37d24 |
@ -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;
|
||||||
|
@ -1,413 +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");
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
|
@ -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
|
|
@ -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;
|
||||||
@ -43,17 +43,11 @@ CForward::CForward(const char *name, ForwardExecType et, int numParams, const Fo
|
|||||||
|
|
||||||
// find funcs
|
// find funcs
|
||||||
int func;
|
int func;
|
||||||
|
AMXForward *tmp = NULL;
|
||||||
m_Funcs.clear();
|
m_Funcs.clear();
|
||||||
|
|
||||||
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;
|
||||||
@ -75,6 +69,8 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
|||||||
|
|
||||||
cell globRetVal = 0;
|
cell globRetVal = 0;
|
||||||
|
|
||||||
|
unsigned int id = 0;
|
||||||
|
|
||||||
AMXForwardList::iterator iter;
|
AMXForwardList::iterator iter;
|
||||||
|
|
||||||
for (iter = m_Funcs.begin(); iter != m_Funcs.end(); iter++)
|
for (iter = m_Funcs.begin(); iter != m_Funcs.end(); iter++)
|
||||||
@ -89,7 +85,7 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
|
|||||||
pDebugger->BeginExec();
|
pDebugger->BeginExec();
|
||||||
|
|
||||||
// handle strings & arrays
|
// handle strings & arrays
|
||||||
int i;
|
int i, ax = 0;
|
||||||
|
|
||||||
for (i = 0; i < m_NumParams; ++i)
|
for (i = 0; i < m_NumParams; ++i)
|
||||||
{
|
{
|
||||||
@ -130,7 +126,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 +222,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 +232,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 +244,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 +352,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 +446,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;
|
||||||
@ -481,22 +454,9 @@ cell CForwardMngr::executeForwards(int id, cell *params)
|
|||||||
|
|
||||||
const char *CForwardMngr::getFuncName(int id) const
|
const char *CForwardMngr::getFuncName(int id) const
|
||||||
{
|
{
|
||||||
if (!isIdValid(id))
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return (id & 1) ? m_SPForwards[id >> 1]->getFuncName() : m_Forwards[id >> 1]->getFuncName();
|
return (id & 1) ? m_SPForwards[id >> 1]->getFuncName() : m_Forwards[id >> 1]->getFuncName();
|
||||||
}
|
}
|
||||||
|
|
||||||
int CForwardMngr::getFuncsNum(int id) const
|
|
||||||
{
|
|
||||||
if (!isIdValid(id))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return (id & 1) ? m_SPForwards[id >> 1]->getFuncsNum() : m_Forwards[id >> 1]->getFuncsNum();
|
|
||||||
}
|
|
||||||
|
|
||||||
int CForwardMngr::getParamsNum(int id) const
|
int CForwardMngr::getParamsNum(int id) const
|
||||||
{
|
{
|
||||||
return (id & 1) ? m_SPForwards[id >> 1]->getParamsNum() : m_Forwards[id >> 1]->getParamsNum();
|
return (id & 1) ? m_SPForwards[id >> 1]->getParamsNum() : m_Forwards[id >> 1]->getParamsNum();
|
||||||
@ -504,10 +464,6 @@ int CForwardMngr::getParamsNum(int id) const
|
|||||||
|
|
||||||
ForwardParam CForwardMngr::getParamType(int id, int paramNum) const
|
ForwardParam CForwardMngr::getParamType(int id, int paramNum) const
|
||||||
{
|
{
|
||||||
if (!isIdValid(id))
|
|
||||||
{
|
|
||||||
return FP_DONE;
|
|
||||||
}
|
|
||||||
return (id & 1) ? m_SPForwards[id >> 1]->getParamType(paramNum) : m_Forwards[id >> 1]->getParamType(paramNum);
|
return (id & 1) ? m_SPForwards[id >> 1]->getParamType(paramNum) : m_Forwards[id >> 1]->getParamType(paramNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -543,63 +499,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;
|
||||||
|
|
||||||
if (fwd->m_InExec)
|
|
||||||
{
|
|
||||||
fwd->m_ToDelete = true;
|
|
||||||
} else {
|
|
||||||
fwd->isFree = true;
|
|
||||||
m_FreeSPForwards.push(id);
|
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, ...)
|
||||||
|
@ -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, ...);
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "CLang.h"
|
#include "CLang.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
#include "amxmod_compat.h"
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#define _snprintf snprintf
|
#define _snprintf snprintf
|
||||||
@ -66,10 +65,7 @@ int HashFunction<String>(const String &k)
|
|||||||
unsigned long hash = 5381;
|
unsigned long hash = 5381;
|
||||||
register const char *str = k.c_str();
|
register const char *str = k.c_str();
|
||||||
register char c;
|
register char c;
|
||||||
while ((c = *str++))
|
while (c = *str++) hash = ((hash << 5) + hash) + c; // hash*33 + c
|
||||||
{
|
|
||||||
hash = ((hash << 5) + hash) + c; // hash*33 + c
|
|
||||||
}
|
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,10 +75,7 @@ int HashAlt<const char *>(char const * const &k)
|
|||||||
unsigned long hash = 5381;
|
unsigned long hash = 5381;
|
||||||
register const char *str = k;
|
register const char *str = k;
|
||||||
register char c;
|
register char c;
|
||||||
while ((c = *str++))
|
while (c = *str++) hash = ((hash << 5) + hash) + c; // hash*33 + c
|
||||||
{
|
|
||||||
hash = ((hash << 5) + hash) + c; // hash*33 + c
|
|
||||||
}
|
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -257,7 +250,7 @@ int CLangMngr::GetKeyEntry(const char *key)
|
|||||||
return val.index;
|
return val.index;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CLangMngr::AddKeyEntry(const char *key)
|
int CLangMngr::AddKeyEntry(String &key)
|
||||||
{
|
{
|
||||||
keytbl_val val;
|
keytbl_val val;
|
||||||
val.index = static_cast<int>(KeyList.size());
|
val.index = static_cast<int>(KeyList.size());
|
||||||
@ -270,11 +263,6 @@ int CLangMngr::AddKeyEntry(const char *key)
|
|||||||
return val.index;
|
return val.index;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CLangMngr::AddKeyEntry(String &key)
|
|
||||||
{
|
|
||||||
return AddKeyEntry(key.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
int CLangMngr::GetKeyEntry(String &key)
|
int CLangMngr::GetKeyEntry(String &key)
|
||||||
{
|
{
|
||||||
keytbl_val &val = KeyTable[key];
|
keytbl_val &val = KeyTable[key];
|
||||||
@ -288,23 +276,7 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
|
|||||||
static char outbuf[4096];
|
static char outbuf[4096];
|
||||||
cell *addr = get_amxaddr(amx, params[parm++]);
|
cell *addr = get_amxaddr(amx, params[parm++]);
|
||||||
|
|
||||||
if (amx->flags & AMX_FLAG_OLDFILE)
|
|
||||||
{
|
|
||||||
if (*addr & BCOMPAT_TRANSLATE_BITS)
|
|
||||||
{
|
|
||||||
const char *key, *def;
|
|
||||||
if (!translate_bcompat(amx, addr, &key, &def))
|
|
||||||
{
|
|
||||||
goto normal_string;
|
|
||||||
}
|
|
||||||
len = atcprintf(outbuf, sizeof(outbuf)-1, def, amx, params, &parm);
|
|
||||||
} else {
|
|
||||||
goto normal_string;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
normal_string:
|
|
||||||
len = atcprintf(outbuf, sizeof(outbuf)-1, addr, amx, params, &parm);
|
len = atcprintf(outbuf, sizeof(outbuf)-1, addr, amx, params, &parm);
|
||||||
}
|
|
||||||
|
|
||||||
return outbuf;
|
return outbuf;
|
||||||
}
|
}
|
||||||
@ -381,7 +353,7 @@ int CLangMngr::MergeDefinitionFile(const char *file)
|
|||||||
CQueue<sKeyDef> Defq;
|
CQueue<sKeyDef> Defq;
|
||||||
String buf;
|
String buf;
|
||||||
char language[3];
|
char language[3];
|
||||||
sKeyDef tmpEntry = {NULL, 0};
|
sKeyDef tmpEntry;
|
||||||
|
|
||||||
while (!feof(fp))
|
while (!feof(fp))
|
||||||
{
|
{
|
||||||
@ -598,7 +570,7 @@ bool CLangMngr::LangExists(const char *langName)
|
|||||||
char buf[3] = {0};
|
char buf[3] = {0};
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while ((buf[i] = tolower(*langName++)))
|
while (buf[i] = tolower(*langName++))
|
||||||
{
|
{
|
||||||
if (++i == 2)
|
if (++i == 2)
|
||||||
break;
|
break;
|
||||||
|
@ -127,11 +127,9 @@ class CLangMngr
|
|||||||
public:
|
public:
|
||||||
void AddEntry(int key, const char *definition);
|
void AddEntry(int key, const char *definition);
|
||||||
};
|
};
|
||||||
public:
|
|
||||||
// Merge definitions into a language
|
// Merge definitions into a language
|
||||||
void MergeDefinitions(const char *lang, CQueue <sKeyDef> &tmpVec);
|
void MergeDefinitions(const char *lang, CQueue <sKeyDef> &tmpVec);
|
||||||
|
|
||||||
private:
|
|
||||||
// strip lowercase; make lower if needed
|
// strip lowercase; make lower if needed
|
||||||
static size_t strip(char *str, char *newstr, bool makelower = false);
|
static size_t strip(char *str, char *newstr, bool makelower = false);
|
||||||
|
|
||||||
@ -162,11 +160,11 @@ public:
|
|||||||
// Get index
|
// Get index
|
||||||
int GetKeyEntry(String &key);
|
int GetKeyEntry(String &key);
|
||||||
int GetKeyEntry(const char *key);
|
int GetKeyEntry(const char *key);
|
||||||
|
int GetKeyIndex(const char *key);
|
||||||
// Get key from index
|
// Get key from index
|
||||||
const char *GetKey(int key);
|
const char *GetKey(int key);
|
||||||
// Add key
|
// Add key
|
||||||
int AddKeyEntry(String &key);
|
int AddKeyEntry(String &key);
|
||||||
int AddKeyEntry(const char *key);
|
|
||||||
|
|
||||||
// Get the number of languages
|
// Get the number of languages
|
||||||
int GetLangsNum();
|
int GetLangsNum();
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -40,6 +40,7 @@ void CPlayer::Init(edict_t* e, int i)
|
|||||||
pEdict = e;
|
pEdict = e;
|
||||||
initialized = false;
|
initialized = false;
|
||||||
ingame = false;
|
ingame = false;
|
||||||
|
bot = false;
|
||||||
authorized = false;
|
authorized = false;
|
||||||
|
|
||||||
current = 0;
|
current = 0;
|
||||||
@ -87,6 +88,7 @@ void CPlayer::Disconnect()
|
|||||||
}
|
}
|
||||||
queries.clear();
|
queries.clear();
|
||||||
|
|
||||||
|
bot = 0;
|
||||||
menu = 0;
|
menu = 0;
|
||||||
newmenu = -1;
|
newmenu = -1;
|
||||||
}
|
}
|
||||||
@ -115,6 +117,7 @@ bool CPlayer::Connect(const char* connectname, const char* ipaddress)
|
|||||||
name.assign(connectname);
|
name.assign(connectname);
|
||||||
ip.assign(ipaddress);
|
ip.assign(ipaddress);
|
||||||
time = gpGlobals->time;
|
time = gpGlobals->time;
|
||||||
|
bot = IsBot();
|
||||||
death_killer = 0;
|
death_killer = 0;
|
||||||
menu = 0;
|
menu = 0;
|
||||||
newmenu = -1;
|
newmenu = -1;
|
||||||
|
@ -58,7 +58,6 @@ public:
|
|||||||
inline const char* getPluginName() { return plugin.c_str(); }
|
inline const char* getPluginName() { return plugin.c_str(); }
|
||||||
inline const char* getName() { return name.c_str(); }
|
inline const char* getName() { return name.c_str(); }
|
||||||
inline bool operator == (const char* string) { return (strcmp(name.c_str(), string) == 0); }
|
inline bool operator == (const char* string) { return (strcmp(name.c_str(), string) == 0); }
|
||||||
int plugin_id;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
@ -84,6 +83,7 @@ public:
|
|||||||
|
|
||||||
bool initialized;
|
bool initialized;
|
||||||
bool ingame;
|
bool ingame;
|
||||||
|
bool bot;
|
||||||
bool authorized;
|
bool authorized;
|
||||||
bool vgui;
|
bool vgui;
|
||||||
|
|
||||||
@ -118,6 +118,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 +131,7 @@ public:
|
|||||||
|
|
||||||
inline bool IsBot()
|
inline bool IsBot()
|
||||||
{
|
{
|
||||||
if ((pEdict->v.flags & FL_FAKECLIENT) == FL_FAKECLIENT)
|
return ((pEdict->v.flags & FL_FAKECLIENT) ? true : false);
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *auth = GETPLAYERAUTHID(pEdict);
|
|
||||||
if (auth && (strcmp(auth, "BOT") == 0))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool IsAlive()
|
inline bool IsAlive()
|
||||||
@ -296,87 +286,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
|
||||||
|
@ -89,7 +89,6 @@ void CModule::clear(bool clearFilename)
|
|||||||
|
|
||||||
m_DestroyableIndexes.clear();
|
m_DestroyableIndexes.clear();
|
||||||
m_Natives.clear();
|
m_Natives.clear();
|
||||||
m_NewNatives.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CModule::attachMetamod(const char *mmfile, PLUG_LOADTIME now)
|
bool CModule::attachMetamod(const char *mmfile, PLUG_LOADTIME now)
|
||||||
|
@ -117,7 +117,6 @@ public:
|
|||||||
void CallPluginsUnloading();
|
void CallPluginsUnloading();
|
||||||
|
|
||||||
CVector<AMX_NATIVE_INFO*> m_Natives;
|
CVector<AMX_NATIVE_INFO*> m_Natives;
|
||||||
CVector<AMX_NATIVE_INFO*> m_NewNatives; // Natives for new (AMXX, not AMX) plugins only
|
|
||||||
CVector<size_t> m_DestroyableIndexes;
|
CVector<size_t> m_DestroyableIndexes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -81,17 +81,14 @@ void CPluginMngr::Finalize()
|
|||||||
m_Finalized = true;
|
m_Finalized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
|
int CPluginMngr::loadPluginsFromFile(const char* filename)
|
||||||
{
|
{
|
||||||
char file[256];
|
char file[256];
|
||||||
FILE *fp = fopen(build_pathname_r(file, sizeof(file) - 1, "%s", filename), "rt");
|
FILE *fp = fopen(build_pathname_r(file, sizeof(file) - 1, "%s", filename), "rt");
|
||||||
|
|
||||||
if (!fp)
|
if (!fp)
|
||||||
{
|
{
|
||||||
if (warn)
|
AMXXLOG_Log("[AMXX] Plugins list not found (file \"%s\")", filename);
|
||||||
{
|
|
||||||
AMXXLOG_Error("[AMXX] Plugins list not found (file \"%s\")", filename);
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,8 +99,6 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
|
|||||||
|
|
||||||
String line;
|
String line;
|
||||||
|
|
||||||
List<String *>::iterator block_iter;
|
|
||||||
|
|
||||||
while (!feof(fp))
|
while (!feof(fp))
|
||||||
{
|
{
|
||||||
pluginName[0] = '\0';
|
pluginName[0] = '\0';
|
||||||
@ -127,37 +122,13 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
|
|||||||
sscanf(line.c_str(), "%s %s", pluginName, debug);
|
sscanf(line.c_str(), "%s %s", pluginName, debug);
|
||||||
|
|
||||||
if (!isalnum(*pluginName))
|
if (!isalnum(*pluginName))
|
||||||
{
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
if (isalnum(*debug) && !strcmp(debug, "debug"))
|
if (isalnum(*debug) && strcmp(debug, "debug") == 0)
|
||||||
{
|
{
|
||||||
debugFlag = 1;
|
debugFlag = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool skip = false;
|
|
||||||
for (block_iter = m_BlockList.begin();
|
|
||||||
block_iter != m_BlockList.end();
|
|
||||||
block_iter++)
|
|
||||||
{
|
|
||||||
if ((*block_iter)->compare(pluginName) == 0)
|
|
||||||
{
|
|
||||||
skip = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (skip || !strcmp(debug, "disabled"))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
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,12 +136,14 @@ 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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
|
InvalidateCache();
|
||||||
|
|
||||||
return pCounter;
|
return pCounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,14 +161,6 @@ void CPluginMngr::clear()
|
|||||||
delete [] pNatives;
|
delete [] pNatives;
|
||||||
pNatives = NULL;
|
pNatives = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String *>::iterator iter = m_BlockList.begin();
|
|
||||||
while (iter != m_BlockList.end())
|
|
||||||
{
|
|
||||||
delete (*iter);
|
|
||||||
iter = m_BlockList.erase(iter);
|
|
||||||
}
|
|
||||||
m_BlockList.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx)
|
CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx)
|
||||||
@ -236,17 +201,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 +228,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,18 +387,16 @@ 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
|
char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
|
||||||
{
|
{
|
||||||
@ -466,8 +417,7 @@ char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
|
|||||||
|
|
||||||
pl->file = new CAmxxReader(file, sizeof(cell));
|
pl->file = new CAmxxReader(file, sizeof(cell));
|
||||||
pl->buffer = NULL;
|
pl->buffer = NULL;
|
||||||
if (pl->file->GetStatus() != CAmxxReader::Err_None ||
|
if (pl->file->GetStatus() != CAmxxReader::Err_None)
|
||||||
pl->file->IsOldFile())
|
|
||||||
{
|
{
|
||||||
delete pl->file;
|
delete pl->file;
|
||||||
delete pl;
|
delete pl;
|
||||||
@ -666,9 +616,7 @@ void CPluginMngr::CALMFromFile(const char *file)
|
|||||||
{
|
{
|
||||||
fgets(line, sizeof(line)-1, fp);
|
fgets(line, sizeof(line)-1, fp);
|
||||||
if (line[0] == ';' || line[0] == '\n' || line[0] == '\0')
|
if (line[0] == ';' || line[0] == '\n' || line[0] == '\0')
|
||||||
{
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
/** quick hack */
|
/** quick hack */
|
||||||
char *ptr = line;
|
char *ptr = line;
|
||||||
@ -687,28 +635,8 @@ void CPluginMngr::CALMFromFile(const char *file)
|
|||||||
pluginName[0] = '\0';
|
pluginName[0] = '\0';
|
||||||
sscanf(rline.c_str(), "%s", pluginName);
|
sscanf(rline.c_str(), "%s", pluginName);
|
||||||
|
|
||||||
/* HACK: see if there's a 'disabled' coming up
|
|
||||||
* new block for scopying flexibility
|
|
||||||
*/
|
|
||||||
if (1)
|
|
||||||
{
|
|
||||||
const char *_ptr = rline.c_str() + strlen(pluginName);
|
|
||||||
while (*_ptr != '\0' && isspace(*_ptr))
|
|
||||||
{
|
|
||||||
_ptr++;
|
|
||||||
}
|
|
||||||
if ((*_ptr != '\0') && !strcmp(_ptr, "disabled"))
|
|
||||||
{
|
|
||||||
String *pString = new String(pluginName);
|
|
||||||
m_BlockList.push_back(pString);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isalnum(*pluginName))
|
if (!isalnum(*pluginName))
|
||||||
{
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
build_pathname_r(filename, sizeof(filename)-1, "%s/%s", get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins"), pluginName);
|
build_pathname_r(filename, sizeof(filename)-1, "%s/%s", get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins"), pluginName);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
@ -128,7 +125,7 @@ public:
|
|||||||
|
|
||||||
CPlugin* loadPlugin(const char* path, const char* name, char* error, int debug);
|
CPlugin* loadPlugin(const char* path, const char* name, char* error, int debug);
|
||||||
void unloadPlugin(CPlugin** a);
|
void unloadPlugin(CPlugin** a);
|
||||||
int loadPluginsFromFile(const char* filename, bool warn=true);
|
int loadPluginsFromFile(const char* filename);
|
||||||
|
|
||||||
inline CPlugin* findPluginFast(AMX *amx) { return (CPlugin*)(amx->userdata[UD_FINDPLUGIN]); }
|
inline CPlugin* findPluginFast(AMX *amx) { return (CPlugin*)(amx->userdata[UD_FINDPLUGIN]); }
|
||||||
CPlugin* findPlugin(AMX *amx);
|
CPlugin* findPlugin(AMX *amx);
|
||||||
@ -168,7 +165,6 @@ public:
|
|||||||
void CALMFromFile(const char *file);
|
void CALMFromFile(const char *file);
|
||||||
private:
|
private:
|
||||||
List<plcache_entry *> m_plcache;
|
List<plcache_entry *> m_plcache;
|
||||||
List<String *> m_BlockList;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //PLUGIN_H
|
#endif //PLUGIN_H
|
||||||
|
@ -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);
|
||||||
|
@ -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,17 +57,13 @@ 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
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -1,14 +1,14 @@
|
|||||||
#(C)2004-2005 AMX Mod X Development Team
|
#(C)2004-2005 AMX Mod X Development Team
|
||||||
# Makefile written by David "BAILOPAN" Anderson
|
# Makefile written by David "BAILOPAN" Anderson
|
||||||
|
|
||||||
HLSDK = ../../hlsdk
|
HLSDK = ../hlsdk/SourceCode
|
||||||
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
|
OPT_FLAGS = -O2 -funroll-loops -s -fomit-frame-pointer -pipe
|
||||||
DEBUG_FLAGS = -g -ggdb3
|
DEBUG_FLAGS = -g -ggdb3
|
||||||
CPP = gcc-4.1
|
CPP = gcc
|
||||||
NAME = amxmodx
|
NAME = amxmodx
|
||||||
|
|
||||||
BIN_SUFFIX_32 = mm_i386.so
|
BIN_SUFFIX_32 = mm_i386.so
|
||||||
@ -19,20 +19,13 @@ OBJECTS = meta_api.cpp CFile.cpp CVault.cpp vault.cpp float.cpp file.cpp modules
|
|||||||
srvcmd.cpp strptime.cpp amxcore.cpp amxtime.cpp power.cpp amxxlog.cpp fakemeta.cpp \
|
srvcmd.cpp strptime.cpp amxcore.cpp amxtime.cpp power.cpp amxxlog.cpp fakemeta.cpp \
|
||||||
amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \
|
amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \
|
||||||
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
|
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
|
||||||
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp sorting.cpp \
|
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp
|
||||||
amxmod_compat.cpp nongpl_matches.cpp CFlagManager.cpp datastructs.cpp
|
|
||||||
|
|
||||||
LINK = -lgcc -static-libgcc
|
LINK = /lib/libstdc++.a
|
||||||
|
|
||||||
INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \
|
INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \
|
||||||
-I$(MM_ROOT) -Lzlib -I$(HLSDK)/common
|
-I$(MM_ROOT) -Lzlib -I$(HLSDK)/common
|
||||||
|
|
||||||
GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1)
|
|
||||||
|
|
||||||
ifeq "$(GCC_VERSION)" "4"
|
|
||||||
OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq "$(DEBUG)" "true"
|
ifeq "$(DEBUG)" "true"
|
||||||
BIN_DIR = Debug
|
BIN_DIR = Debug
|
||||||
CFLAGS = $(DEBUG_FLAGS)
|
CFLAGS = $(DEBUG_FLAGS)
|
||||||
@ -48,7 +41,7 @@ ifeq "$(BINLOG)" "true"
|
|||||||
CFLAGS += -DBINLOG_ENABLED
|
CFLAGS += -DBINLOG_ENABLED
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += -DLINUX -DNDEBUG -DAMX_NOPROPLIST -fPIC -Wall -Werror -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
|
CFLAGS += -DLINUX -DNDEBUG -fPIC -Wno-deprecated -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
|
||||||
|
|
||||||
ifeq "$(AMD64)" "true"
|
ifeq "$(AMD64)" "true"
|
||||||
BINARY = $(NAME)_$(BIN_SUFFIX_64)
|
BINARY = $(NAME)_$(BIN_SUFFIX_64)
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#define AMX_NODYNALOAD
|
#define AMX_NODYNALOAD
|
||||||
#define AMX_ANSIONLY
|
#define AMX_ANSIONLY
|
||||||
|
|
||||||
#if !defined __linux__ && BUILD_PLATFORM == WINDOWS && BUILD_TYPE == RELEASE && BUILD_COMPILER == MSVC && PAWN_CELL_SIZE == 64
|
#if BUILD_PLATFORM == WINDOWS && BUILD_TYPE == RELEASE && BUILD_COMPILER == MSVC && PAWN_CELL_SIZE == 64
|
||||||
/* bad bad workaround but we have to prevent a compiler crash :/ */
|
/* bad bad workaround but we have to prevent a compiler crash :/ */
|
||||||
#pragma optimize("g",off)
|
#pragma optimize("g",off)
|
||||||
#endif
|
#endif
|
||||||
@ -973,25 +973,26 @@ 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;
|
||||||
|
amx->hea = hdr->hea;
|
||||||
|
amx->stp = hdr->stp - sizeof(cell);
|
||||||
/* also put a sentinel for strings at the top the stack */
|
/* also put a sentinel for strings at the top the stack */
|
||||||
*(cell *)((char*)native_code + hdr->dat + amx->stp - sizeof(cell)) = 0;
|
*(cell *)((char*)native_code + hdr->dat + hdr->stp - sizeof(cell)) = 0;
|
||||||
/* update the required memory size (the previous value was a
|
amx->stk = amx->stp;
|
||||||
* conservative estimate, now we know the exact size)
|
|
||||||
*/
|
|
||||||
amx->code_size = (hdr->dat + amx->stp + sizeof(cell)) & ~3;
|
|
||||||
} /* if */
|
} /* if */
|
||||||
|
|
||||||
return (res == 0) ? AMX_ERR_NONE : AMX_ERR_INIT_JIT;
|
return (res == 0) ? AMX_ERR_NONE : AMX_ERR_INIT_JIT;
|
||||||
|
@ -214,7 +214,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 {
|
||||||
@ -265,8 +265,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 */
|
||||||
@ -322,7 +322,6 @@ enum {
|
|||||||
#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_BYTEOPC 0x08 /* opcode is a byte (not a cell) */
|
||||||
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking; no STMT opcode */
|
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking; no STMT opcode */
|
||||||
#define AMX_FLAG_OLDFILE 0x20 /* Old AMX Mod plugin */
|
|
||||||
#define AMX_FLAG_PRENIT 0x100 /* pre-initialized, do not check natives */
|
#define AMX_FLAG_PRENIT 0x100 /* pre-initialized, do not check natives */
|
||||||
#define AMX_FLAG_NTVREG 0x1000 /* all native functions are registered */
|
#define AMX_FLAG_NTVREG 0x1000 /* all native functions are registered */
|
||||||
#define AMX_FLAG_JITC 0x2000 /* abstract machine is JIT compiled */
|
#define AMX_FLAG_JITC 0x2000 /* abstract machine is JIT compiled */
|
||||||
|
@ -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 */
|
||||||
} PACKED 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 */
|
||||||
} PACKED 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 */
|
||||||
} PACKED 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 */
|
||||||
} PACKED 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 */
|
||||||
} PACKED 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 */
|
||||||
} PACKED 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 */
|
||||||
} PACKED 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 */
|
||||||
} PACKED 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;
|
||||||
} 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) */
|
||||||
|
@ -2122,9 +2122,7 @@ err_heaplow:
|
|||||||
_CHKMARGIN_HEAP:
|
_CHKMARGIN_HEAP:
|
||||||
cmp esi,stp
|
cmp esi,stp
|
||||||
jg err_stacklow
|
jg err_stacklow
|
||||||
mov ebp,amx
|
cmp dword hea,0
|
||||||
mov ebp,[ebp+_hlw]
|
|
||||||
cmp dword hea,ebp
|
|
||||||
jl err_heaplow
|
jl err_heaplow
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -1,117 +0,0 @@
|
|||||||
#include "amxmodx.h"
|
|
||||||
#include "amxmod_compat.h"
|
|
||||||
#include "format.h"
|
|
||||||
|
|
||||||
bool GetTranslation(amxtrans_t trans, int &key, int &dest, int &lang)
|
|
||||||
{
|
|
||||||
key = (trans & BCOMPAT_TRANSLATE_KEYMASK);
|
|
||||||
dest = (trans >> BCOMPAT_TRANSLATE_DESTRSH) & BCOMPAT_TRANSLATE_DESTMASK;
|
|
||||||
lang = (trans >> BCOMPAT_TRANSLATE_LANGRSH) & BCOMPAT_TRANSLATE_LANGMASK;
|
|
||||||
|
|
||||||
if (dest == 0x3F)
|
|
||||||
{
|
|
||||||
dest = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lang == 0x1F)
|
|
||||||
{
|
|
||||||
lang = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool translate_bcompat(AMX *amx, cell *source, const char **_key, const char **_def)
|
|
||||||
{
|
|
||||||
amxtrans_t trans = static_cast<amxtrans_t>(*source);
|
|
||||||
int key, _dest, lang;
|
|
||||||
if (!GetTranslation(trans, key, _dest, lang))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
cell amx_addr, *phys_addr;
|
|
||||||
if (amx_Allot(amx, 3, &amx_addr, &phys_addr) != AMX_ERR_NONE)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_dest == -1)
|
|
||||||
{
|
|
||||||
*phys_addr = LANG_PLAYER;
|
|
||||||
} else if (_dest == 0) {
|
|
||||||
*phys_addr = LANG_SERVER;
|
|
||||||
} else if (lang >= 0 && lang < g_langMngr.GetLangsNum()) {
|
|
||||||
const char *name = g_langMngr.GetLangName(lang);
|
|
||||||
phys_addr[0] = static_cast<cell>(name[0]);
|
|
||||||
phys_addr[1] = static_cast<cell>(name[1]);
|
|
||||||
phys_addr[2] = static_cast<cell>('\0');
|
|
||||||
} else {
|
|
||||||
*phys_addr = LANG_SERVER;
|
|
||||||
}
|
|
||||||
|
|
||||||
//not optimized but it works, eh
|
|
||||||
//if someone cares they can make a translate() wrapper that takes the key # in directly
|
|
||||||
const char *r_key = g_langMngr.GetKey(key);
|
|
||||||
const char *def = translate(amx, amx_addr, r_key);
|
|
||||||
if (!def)
|
|
||||||
{
|
|
||||||
def = r_key;
|
|
||||||
}
|
|
||||||
amx_Release(amx, amx_addr);
|
|
||||||
|
|
||||||
*_key = g_langMngr.GetKey(key);
|
|
||||||
*_def = def;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL amx_translate(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
char *key = get_amxstring(amx, params[1], 0, len);
|
|
||||||
|
|
||||||
amxtrans_t trans;
|
|
||||||
|
|
||||||
int suki = g_langMngr.GetKeyEntry(key);
|
|
||||||
//Some AMX Mod plugins do not register everything they need. Prevent a crash.
|
|
||||||
if (suki == -1)
|
|
||||||
{
|
|
||||||
suki = g_langMngr.AddKeyEntry(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (suki > BCOMPAT_TRANSLATE_KEYMASK)
|
|
||||||
{
|
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not enough translation space, aborting!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
trans = suki & BCOMPAT_TRANSLATE_KEYMASK;
|
|
||||||
int dest = static_cast<int>(params[2]);
|
|
||||||
int lang = static_cast<int>(params[3]);
|
|
||||||
if (dest == -1)
|
|
||||||
{
|
|
||||||
trans |= (0x3F << BCOMPAT_TRANSLATE_DESTRSH);
|
|
||||||
} else {
|
|
||||||
trans |= (dest & BCOMPAT_TRANSLATE_DESTMASK) << BCOMPAT_TRANSLATE_DESTRSH;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lang == -1)
|
|
||||||
{
|
|
||||||
trans |= (0x1F << BCOMPAT_TRANSLATE_LANGRSH);
|
|
||||||
} else {
|
|
||||||
trans |= (lang & BCOMPAT_TRANSLATE_LANGMASK) << BCOMPAT_TRANSLATE_LANGRSH;
|
|
||||||
}
|
|
||||||
|
|
||||||
trans |= BCOMPAT_TRANSLATE_BITS;
|
|
||||||
|
|
||||||
return static_cast<cell>(trans);
|
|
||||||
}
|
|
||||||
|
|
||||||
AMX_NATIVE_INFO g_BcompatNatives[] =
|
|
||||||
{
|
|
||||||
{"translate", amx_translate},
|
|
||||||
|
|
||||||
{NULL, NULL},
|
|
||||||
};
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
|||||||
#ifndef _INCLUDE_AMXMOD_CORE_COMPAT_H
|
|
||||||
#define _INCLUDE_AMXMOD_CORE_COMPAT_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* New format for translation:
|
|
||||||
* Note that we only support:
|
|
||||||
* 4k keys
|
|
||||||
* 32 languages
|
|
||||||
* 0000 0000 0000 0000 0000 0000 0000 0000
|
|
||||||
* | key id |
|
|
||||||
* | | <- dest id
|
|
||||||
* | | <- lang id
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BCOMPAT_TRANSLATE_BITS 0xFF000000
|
|
||||||
#define BCOMPAT_TRANSLATE_KEYMASK 0xFFF
|
|
||||||
#define BCOMPAT_TRANSLATE_DESTMASK 0x3F
|
|
||||||
#define BCOMPAT_TRANSLATE_DESTRSH 12
|
|
||||||
#define BCOMPAT_TRANSLATE_LANGMASK 0x1F
|
|
||||||
#define BCOMPAT_TRANSLATE_LANGRSH 18
|
|
||||||
|
|
||||||
typedef unsigned int amxtrans_t;
|
|
||||||
|
|
||||||
bool GetTranslation(amxtrans_t trans, int &key, int &dest, int &lang);
|
|
||||||
|
|
||||||
extern AMX_NATIVE_INFO g_BcompatNatives[];
|
|
||||||
|
|
||||||
#endif //_INCLUDE_AMXMOD_CORE_COMPAT_H
|
|
File diff suppressed because it is too large
Load Diff
@ -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.75"
|
||||||
|
|
||||||
extern AMX_NATIVE_INFO core_Natives[];
|
extern AMX_NATIVE_INFO core_Natives[];
|
||||||
extern AMX_NATIVE_INFO time_Natives[];
|
extern AMX_NATIVE_INFO time_Natives[];
|
||||||
@ -83,8 +85,6 @@ extern AMX_NATIVE_INFO string_Natives[];
|
|||||||
extern AMX_NATIVE_INFO vault_Natives[];
|
extern AMX_NATIVE_INFO vault_Natives[];
|
||||||
extern AMX_NATIVE_INFO msg_Natives[];
|
extern AMX_NATIVE_INFO 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_DataStructNatives[];
|
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
|
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
|
||||||
@ -114,14 +114,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 +174,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 +338,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
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
|
|
||||||
struct TableEntry
|
struct TableEntry
|
||||||
{
|
{
|
||||||
mint8_t cellSize;
|
mint8_t cellSize PACKED;
|
||||||
mint32_t origSize PACKED; // contains AMX_HEADER->stp
|
mint32_t origSize PACKED; // contains AMX_HEADER->stp
|
||||||
mint32_t offset PACKED;
|
mint32_t offset PACKED;
|
||||||
};
|
};
|
||||||
@ -300,7 +300,7 @@ size_t CAmxxReader::GetBufferSize()
|
|||||||
|
|
||||||
#undef DATAREAD
|
#undef DATAREAD
|
||||||
#define DATAREAD(addr, itemsize, itemcount) \
|
#define DATAREAD(addr, itemsize, itemcount) \
|
||||||
if (fread(addr, itemsize, itemcount, m_pFile) != static_cast<size_t>(itemcount)) \
|
if (fread(addr, itemsize, itemcount, m_pFile) != itemcount) \
|
||||||
{ \
|
{ \
|
||||||
if (feof(m_pFile)) \
|
if (feof(m_pFile)) \
|
||||||
m_Status = Err_FileInvalid; \
|
m_Status = Err_FileInvalid; \
|
||||||
|
@ -92,7 +92,6 @@ public:
|
|||||||
Error GetStatus(); // Get the current status
|
Error GetStatus(); // Get the current status
|
||||||
size_t GetBufferSize(); // Get the size for the buffer
|
size_t GetBufferSize(); // Get the size for the buffer
|
||||||
Error GetSection(void *buffer); // Copy the currently selected section to the buffer
|
Error GetSection(void *buffer); // Copy the currently selected section to the buffer
|
||||||
inline bool IsOldFile() const { return m_OldFile; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __AMXXFILE_H__
|
#endif // __AMXXFILE_H__
|
||||||
|
@ -44,14 +44,11 @@
|
|||||||
#define vsnprintf _vsnprintf
|
#define vsnprintf _vsnprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "svn_version.h"
|
|
||||||
|
|
||||||
CLog::CLog()
|
CLog::CLog()
|
||||||
{
|
{
|
||||||
m_LogType = 0;
|
m_LogType = 0;
|
||||||
m_LogFile.clear();
|
m_LogFile.clear();
|
||||||
m_FoundError = false;
|
m_FoundError = false;
|
||||||
m_LoggedErrMap = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CLog::~CLog()
|
CLog::~CLog()
|
||||||
@ -97,13 +94,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 +117,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -152,17 +147,17 @@ void CLog::MapChange()
|
|||||||
print_srvconsole("[AMXX] Invalid amxx_logging value; setting back to 1...");
|
print_srvconsole("[AMXX] Invalid amxx_logging value; setting back to 1...");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_LoggedErrMap = false;
|
|
||||||
|
|
||||||
if (m_LogType == 2)
|
if (m_LogType == 2)
|
||||||
{
|
{
|
||||||
// create new logfile
|
// create new logfile
|
||||||
CreateNewFile();
|
CreateNewFile();
|
||||||
} else if (m_LogType == 1) {
|
|
||||||
Log("-------- Mapchange to %s --------", STRING(gpGlobals->mapname));
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else if (m_LogType == 1)
|
||||||
|
{
|
||||||
|
Log("-------- Mapchange to %s --------", STRING(gpGlobals->mapname));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLog::Log(const char *fmt, ...)
|
void CLog::Log(const char *fmt, ...)
|
||||||
@ -204,7 +199,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+");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,7 +215,9 @@ void CLog::Log(const char *fmt, ...)
|
|||||||
|
|
||||||
// print on server console
|
// print on server console
|
||||||
print_srvconsole("L %s: %s\n", date, msg);
|
print_srvconsole("L %s: %s\n", date, msg);
|
||||||
} else if (m_LogType == 3) {
|
}
|
||||||
|
else if (m_LogType == 3)
|
||||||
|
{
|
||||||
// build message
|
// build message
|
||||||
static char msg_[3072];
|
static char msg_[3072];
|
||||||
va_list arglst;
|
va_list arglst;
|
||||||
@ -234,12 +231,9 @@ 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)
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
// get time
|
// get time
|
||||||
time_t td;
|
time_t td;
|
||||||
@ -254,22 +248,15 @@ void CLog::LogError(const char *fmt, ...)
|
|||||||
|
|
||||||
va_list arglst;
|
va_list arglst;
|
||||||
va_start(arglst, fmt);
|
va_start(arglst, fmt);
|
||||||
vsnprintf(msg, sizeof(msg)-1, fmt, arglst);
|
vsnprintf(msg, 3071, fmt, arglst);
|
||||||
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)
|
||||||
{
|
{
|
||||||
if (!m_LoggedErrMap)
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
m_LoggedErrMap = true;
|
|
||||||
}
|
|
||||||
fprintf(pF, "L %s: %s\n", date, msg);
|
fprintf(pF, "L %s: %s\n", date, msg);
|
||||||
fclose(pF);
|
fclose(pF);
|
||||||
} else {
|
} else {
|
||||||
|
@ -37,7 +37,6 @@ private:
|
|||||||
String m_LogFile;
|
String m_LogFile;
|
||||||
int m_LogType;
|
int m_LogType;
|
||||||
bool m_FoundError;
|
bool m_FoundError;
|
||||||
bool m_LoggedErrMap;
|
|
||||||
|
|
||||||
void GetLastFile(int &outMonth, int &outDay, String &outFilename);
|
void GetLastFile(int &outMonth, int &outDay, String &outFilename);
|
||||||
void UseFile(const String &fileName);
|
void UseFile(const String &fileName);
|
||||||
|
@ -3,40 +3,11 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "binlog.h"
|
#include "binlog.h"
|
||||||
#include "debugger.h"
|
|
||||||
|
|
||||||
BinLog g_BinLog;
|
BinLog g_BinLog;
|
||||||
int g_binlog_level = 0;
|
int g_binlog_level = 0;
|
||||||
int g_binlog_maxsize = 0;
|
int g_binlog_maxsize = 0;
|
||||||
|
|
||||||
// Helper function to get a filename index
|
|
||||||
#define USHR(x) ((unsigned int)(x)>>1)
|
|
||||||
int LookupFile(AMX_DBG *amxdbg, ucell address)
|
|
||||||
{
|
|
||||||
int high, low, mid;
|
|
||||||
|
|
||||||
high = amxdbg->hdr->files;
|
|
||||||
low = -1;
|
|
||||||
|
|
||||||
while (high - low > 1)
|
|
||||||
{
|
|
||||||
mid = USHR(low + high);
|
|
||||||
if (amxdbg->filetbl[mid]->address <= address)
|
|
||||||
{
|
|
||||||
low = mid;
|
|
||||||
} else {
|
|
||||||
high = mid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (low == -1)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return low;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool BinLog::Open()
|
bool BinLog::Open()
|
||||||
{
|
{
|
||||||
const char *data = get_localinfo("amxmodx_datadir", "addons/amxmodx/data");
|
const char *data = get_localinfo("amxmodx_datadir", "addons/amxmodx/data");
|
||||||
@ -139,21 +110,6 @@ void BinLog::WriteOp(BinLogOp op, int plug, ...)
|
|||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, plug);
|
va_start(ap, plug);
|
||||||
|
|
||||||
AMX *amx = NULL;
|
|
||||||
bool debug = false;
|
|
||||||
AMX_DBG *dbg = NULL;
|
|
||||||
CPluginMngr::CPlugin *pl = NULL;
|
|
||||||
|
|
||||||
if (plug != -1)
|
|
||||||
{
|
|
||||||
pl = g_plugins.findPlugin(plug);
|
|
||||||
if ((debug = pl->isDebug()))
|
|
||||||
{
|
|
||||||
amx = pl->getAMX();
|
|
||||||
dbg = static_cast<Debugger *>(amx->userdata[UD_DEBUGGER])->m_pAmxDbg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
case BinLog_Registered:
|
case BinLog_Registered:
|
||||||
@ -170,19 +126,10 @@ void BinLog::WriteOp(BinLogOp op, int plug, ...)
|
|||||||
}
|
}
|
||||||
case BinLog_NativeCall:
|
case BinLog_NativeCall:
|
||||||
{
|
{
|
||||||
int file;
|
|
||||||
int native = va_arg(ap, int);
|
int native = va_arg(ap, int);
|
||||||
int params = va_arg(ap, int);
|
int params = va_arg(ap, int);
|
||||||
fwrite(&native, sizeof(int), 1, fp);
|
fwrite(&native, sizeof(int), 1, fp);
|
||||||
fwrite(¶ms, sizeof(int), 1, fp);
|
fwrite(¶ms, sizeof(int), 1, fp);
|
||||||
if (debug)
|
|
||||||
{
|
|
||||||
file = LookupFile(dbg, amx->cip);
|
|
||||||
fwrite(&file, sizeof(int), 1, fp);
|
|
||||||
} else {
|
|
||||||
file = 0;
|
|
||||||
fwrite(&file, sizeof(int), 1, fp);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BinLog_NativeRet:
|
case BinLog_NativeRet:
|
||||||
@ -203,32 +150,14 @@ void BinLog::WriteOp(BinLogOp op, int plug, ...)
|
|||||||
}
|
}
|
||||||
case BinLog_CallPubFunc:
|
case BinLog_CallPubFunc:
|
||||||
{
|
{
|
||||||
int file;
|
|
||||||
int num = va_arg(ap, int);
|
int num = va_arg(ap, int);
|
||||||
fwrite(&num, sizeof(int), 1, fp);
|
fwrite(&num, sizeof(int), 1, fp);
|
||||||
if (debug)
|
|
||||||
{
|
|
||||||
file = LookupFile(dbg, amx->cip);
|
|
||||||
fwrite(&file, sizeof(int), 1, fp);
|
|
||||||
} else {
|
|
||||||
file = 0;
|
|
||||||
fwrite(&file, sizeof(int), 1, fp);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BinLog_SetLine:
|
case BinLog_SetLine:
|
||||||
{
|
{
|
||||||
int file;
|
|
||||||
int line = va_arg(ap, int);
|
int line = va_arg(ap, int);
|
||||||
fwrite(&line, sizeof(int), 1, fp);
|
fwrite(&line, sizeof(int), 1, fp);
|
||||||
if (debug)
|
|
||||||
{
|
|
||||||
file = LookupFile(dbg, amx->cip);
|
|
||||||
fwrite(&file, sizeof(int), 1, fp);
|
|
||||||
} else {
|
|
||||||
file = 0;
|
|
||||||
fwrite(&file, sizeof(int), 1, fp);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BinLog_FormatString:
|
case BinLog_FormatString:
|
||||||
@ -300,37 +229,17 @@ void BinLog::WritePluginDB(FILE *fp)
|
|||||||
fwrite(&c, sizeof(char), 1, fp);
|
fwrite(&c, sizeof(char), 1, fp);
|
||||||
if (c)
|
if (c)
|
||||||
{
|
{
|
||||||
Debugger *pd = NULL;
|
|
||||||
len = (char)strlen(pl->getName());
|
len = (char)strlen(pl->getName());
|
||||||
fwrite(&len, sizeof(char), 1, fp);
|
fwrite(&len, sizeof(char), 1, fp);
|
||||||
len++;
|
len++;
|
||||||
fwrite(pl->getName(), sizeof(char), len, fp);
|
fwrite(pl->getName(), sizeof(char), len, fp);
|
||||||
int natives, publics, files;
|
int natives, publics;
|
||||||
AMX *amx = pl->getAMX();
|
AMX *amx = pl->getAMX();
|
||||||
// Write the number of Filenames
|
|
||||||
if (c == 2)
|
|
||||||
{
|
|
||||||
pd = static_cast<Debugger *>(amx->userdata[UD_DEBUGGER]);
|
|
||||||
files = pd->m_pAmxDbg->hdr->files;
|
|
||||||
fwrite(&files, sizeof(int), 1, fp);
|
|
||||||
}
|
|
||||||
amx_NumNatives(amx, &natives);
|
amx_NumNatives(amx, &natives);
|
||||||
amx_NumPublics(amx, &publics);
|
amx_NumPublics(amx, &publics);
|
||||||
fwrite(&natives, sizeof(int), 1, fp);
|
fwrite(&natives, sizeof(int), 1, fp);
|
||||||
fwrite(&publics, sizeof(int), 1, fp);
|
fwrite(&publics, sizeof(int), 1, fp);
|
||||||
char name[34];
|
char name[34];
|
||||||
// Write the Filenames to the binfile
|
|
||||||
if (c == 2)
|
|
||||||
{
|
|
||||||
AMX_DBG_FILE **ftable = pd->m_pAmxDbg->filetbl;
|
|
||||||
for (int i=0; i<files; i++)
|
|
||||||
{
|
|
||||||
len = (char)strlen(ftable[i]->name);
|
|
||||||
fwrite(&len, sizeof(char), 1, fp);
|
|
||||||
len++;
|
|
||||||
fwrite(ftable[i]->name, sizeof(char), len, fp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (int i=0; i<natives; i++)
|
for (int i=0; i<natives; i++)
|
||||||
{
|
{
|
||||||
amx_GetNative(amx, i, name);
|
amx_GetNative(amx, i, name);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include "CString.h"
|
#include "CString.h"
|
||||||
|
|
||||||
#define BINLOG_MAGIC 0x414D424C
|
#define BINLOG_MAGIC 0x414D424C
|
||||||
#define BINLOG_VERSION 0x0300
|
#define BINLOG_VERSION 0x0200
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format of binlog:
|
* Format of binlog:
|
||||||
@ -17,14 +17,8 @@
|
|||||||
* [
|
* [
|
||||||
* uint8 status codes
|
* uint8 status codes
|
||||||
* str[int8] filename
|
* str[int8] filename
|
||||||
* if(status==2)
|
|
||||||
* uint32 num filenames
|
|
||||||
* uint32 num natives
|
* uint32 num natives
|
||||||
* uint32 num publics
|
* uint32 num publics
|
||||||
* if (status==2)
|
|
||||||
* [
|
|
||||||
* str[uint8] file name
|
|
||||||
* ]
|
|
||||||
* [
|
* [
|
||||||
* str[uint8] native name
|
* str[uint8] native name
|
||||||
* ]
|
* ]
|
||||||
@ -39,18 +33,17 @@
|
|||||||
* int32 plugin id
|
* int32 plugin id
|
||||||
* <extra info>
|
* <extra info>
|
||||||
* ]
|
* ]
|
||||||
* If filename id is 0 skip as plugin was not in debug mode, if -1 there was an error.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum BinLogOp
|
enum BinLogOp
|
||||||
{
|
{
|
||||||
BinLog_Start=1,
|
BinLog_Start=1,
|
||||||
BinLog_End,
|
BinLog_End,
|
||||||
BinLog_NativeCall, //<int32 native id> <int32_t num_params> <int32_t filename id>
|
BinLog_NativeCall, //<int32 native id> <int32_t num_params>
|
||||||
BinLog_NativeError, //<int32 errornum> <str[int16] string>
|
BinLog_NativeError, //<int32 errornum> <str[int16] string>
|
||||||
BinLog_NativeRet, //<cell value>
|
BinLog_NativeRet, //<cell value>
|
||||||
BinLog_CallPubFunc, //<int32 public id> <int32_t filename id>
|
BinLog_CallPubFunc, //<int32 public id>
|
||||||
BinLog_SetLine, //<int32 line no#> <int32_t filename id>
|
BinLog_SetLine, //<int32 line no#>
|
||||||
BinLog_Registered, //<string title> <string version>
|
BinLog_Registered, //<string title> <string version>
|
||||||
BinLog_FormatString, //<int32 param#> <int32 maxlen> <str[int16] string>
|
BinLog_FormatString, //<int32 param#> <int32 maxlen> <str[int16] string>
|
||||||
BinLog_NativeParams, //<int32 num> <cell ...>
|
BinLog_NativeParams, //<int32 num> <cell ...>
|
||||||
|
@ -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 }
|
|
||||||
};
|
|
@ -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
|
|
@ -388,9 +388,9 @@ int Debugger::FormatError(char *buffer, size_t maxLength)
|
|||||||
int error = pTracer->m_Error;
|
int error = pTracer->m_Error;
|
||||||
const char *gen_err = GenericError(error);
|
const char *gen_err = GenericError(error);
|
||||||
int size = 0;
|
int size = 0;
|
||||||
//trace_info_t *pTrace = pTracer->GetEnd();
|
trace_info_t *pTrace = pTracer->GetEnd();
|
||||||
//cell cip = _CipAsVa(m_pAmx->cip);
|
cell cip = _CipAsVa(m_pAmx->cip);
|
||||||
//cell *p_cip = NULL;
|
cell *p_cip = NULL;
|
||||||
int amx_err = AMX_ERR_NONE;
|
int amx_err = AMX_ERR_NONE;
|
||||||
|
|
||||||
size += _snprintf(buffer, maxLength, "Run time error %d: %s ", error, gen_err);
|
size += _snprintf(buffer, maxLength, "Run time error %d: %s ", error, gen_err);
|
||||||
@ -608,7 +608,6 @@ const char *Debugger::_GetFilename()
|
|||||||
void Debugger::FmtGenericMsg(AMX *amx, int error, char buffer[], size_t maxLength)
|
void Debugger::FmtGenericMsg(AMX *amx, int error, char buffer[], size_t maxLength)
|
||||||
{
|
{
|
||||||
const char *filename = "";
|
const char *filename = "";
|
||||||
char native[sNAMEMAX+1];
|
|
||||||
|
|
||||||
CList<CScript,AMX*>::iterator a = g_loadedscripts.find(amx);
|
CList<CScript,AMX*>::iterator a = g_loadedscripts.find(amx);
|
||||||
if (a)
|
if (a)
|
||||||
@ -623,16 +622,8 @@ void Debugger::FmtGenericMsg(AMX *amx, int error, char buffer[], size_t maxLengt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error == AMX_ERR_EXIT)
|
|
||||||
{
|
|
||||||
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") - %s", error, filename, GenericError(AMX_ERR_EXIT));
|
|
||||||
} else if (error == AMX_ERR_NATIVE) {
|
|
||||||
amx_GetNative(amx, reinterpret_cast<long>(amx->usertags[UT_NATIVE]), native);
|
|
||||||
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") (native \"%s\") - debug not enabled!", error, filename, native);
|
|
||||||
} else {
|
|
||||||
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") - debug not enabled!", error, filename);
|
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") - debug not enabled!", error, filename);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void Debugger::GenericMessage(AMX *amx, int err)
|
void Debugger::GenericMessage(AMX *amx, int err)
|
||||||
{
|
{
|
||||||
|
@ -50,7 +50,7 @@ public:
|
|||||||
|
|
||||||
struct trace_info
|
struct trace_info
|
||||||
{
|
{
|
||||||
trace_info() : cip(0), frm(0), next(NULL), prev(NULL), used(false) {};
|
trace_info() : cip(0), frm(0), used(false), next(NULL), prev(NULL) {};
|
||||||
|
|
||||||
cell cip;
|
cell cip;
|
||||||
cell frm;
|
cell frm;
|
||||||
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,7 +358,7 @@ static cell AMX_NATIVE_CALL file_size(AMX *amx, cell *params) /* 1 param */
|
|||||||
|
|
||||||
static cell AMX_NATIVE_CALL amx_fopen(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL amx_fopen(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
int len;
|
int len, j = -1;
|
||||||
char *file = build_pathname("%s", get_amxstring(amx, params[1], 1, len));
|
char *file = build_pathname("%s", get_amxstring(amx, params[1], 1, len));
|
||||||
char *flags = get_amxstring(amx, params[2], 0, len);
|
char *flags = get_amxstring(amx, params[2], 0, len);
|
||||||
|
|
||||||
@ -385,7 +385,7 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
|
|||||||
char *a = new char[blocks];
|
char *a = new char[blocks];
|
||||||
char *ptr = a;
|
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;
|
||||||
@ -395,7 +395,7 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
|
|||||||
short *a = new short[blocks];
|
short *a = new short[blocks];
|
||||||
short *ptr = a;
|
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;
|
||||||
@ -405,7 +405,7 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
|
|||||||
int *a = new int[blocks];
|
int *a = new int[blocks];
|
||||||
int *ptr = a;
|
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 +438,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -682,13 +682,13 @@ static cell AMX_NATIVE_CALL amx_open_dir(AMX *amx, cell *params)
|
|||||||
DIR *dp = opendir(dirname);
|
DIR *dp = opendir(dirname);
|
||||||
|
|
||||||
if (!dp)
|
if (!dp)
|
||||||
return 0;
|
return NULL;
|
||||||
struct dirent *ep = readdir(dp);
|
struct dirent *ep = readdir(dp);
|
||||||
|
|
||||||
if (!ep)
|
if (!ep)
|
||||||
{
|
{
|
||||||
closedir(dp);
|
closedir(dp);
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_amxstring(amx, params[2], ep->d_name, params[3]);
|
set_amxstring(amx, params[2], ep->d_name, params[3]);
|
||||||
@ -802,59 +802,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 +847,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}
|
||||||
};
|
};
|
||||||
|
@ -368,6 +368,7 @@ static cell AMX_NATIVE_CALL n_floatatan(AMX *amx, cell *params)
|
|||||||
* params[2] = radix
|
* params[2] = radix
|
||||||
*/
|
*/
|
||||||
REAL fA = amx_ctof(params[1]);
|
REAL fA = amx_ctof(params[1]);
|
||||||
|
fA = ToRadians(fA, params[2]);
|
||||||
fA = atan(fA);
|
fA = atan(fA);
|
||||||
fA = FromRadians(fA, params[2]);
|
fA = FromRadians(fA, params[2]);
|
||||||
return amx_ftoc(fA);
|
return amx_ftoc(fA);
|
||||||
@ -424,54 +425,6 @@ static cell AMX_NATIVE_CALL n_floatatan2(AMX *amx, cell *params)
|
|||||||
return amx_ftoc(fC);
|
return amx_ftoc(fC);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
|
||||||
#pragma argsused
|
|
||||||
#endif
|
|
||||||
/* Added by DS */
|
|
||||||
static cell AMX_NATIVE_CALL n_floatsinh(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* params[1] = angle
|
|
||||||
* params[2] = radix
|
|
||||||
*/
|
|
||||||
REAL fA = amx_ctof(params[1]);
|
|
||||||
fA = ToRadians(fA, params[2]);
|
|
||||||
fA = sinh(fA);
|
|
||||||
return amx_ftoc(fA);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
|
||||||
#pragma argsused
|
|
||||||
#endif
|
|
||||||
/* Added by DS */
|
|
||||||
static cell AMX_NATIVE_CALL n_floatcosh(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* params[1] = angle
|
|
||||||
* params[2] = radix
|
|
||||||
*/
|
|
||||||
REAL fA = amx_ctof(params[1]);
|
|
||||||
fA = ToRadians(fA, params[2]);
|
|
||||||
fA = cosh(fA);
|
|
||||||
return amx_ftoc(fA);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
|
||||||
#pragma argsused
|
|
||||||
#endif
|
|
||||||
/* Added by DS */
|
|
||||||
static cell AMX_NATIVE_CALL n_floattanh(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* params[1] = angle
|
|
||||||
* params[2] = radix
|
|
||||||
*/
|
|
||||||
REAL fA = amx_ctof(params[1]);
|
|
||||||
fA = ToRadians(fA, params[2]);
|
|
||||||
fA = tanh(fA);
|
|
||||||
return amx_ftoc(fA);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined __BORLANDC__ || defined __WATCOMC__
|
#if defined __BORLANDC__ || defined __WATCOMC__
|
||||||
#pragma argsused
|
#pragma argsused
|
||||||
#endif
|
#endif
|
||||||
@ -504,9 +457,6 @@ AMX_NATIVE_INFO float_Natives[] = {
|
|||||||
{ "floatacos", n_floatacos },
|
{ "floatacos", n_floatacos },
|
||||||
{ "floatatan", n_floatatan },
|
{ "floatatan", n_floatatan },
|
||||||
{ "floatatan2", n_floatatan2 },
|
{ "floatatan2", n_floatatan2 },
|
||||||
{ "floatsinh", n_floatsinh },
|
|
||||||
{ "floatcosh", n_floatcosh },
|
|
||||||
{ "floattanh", n_floattanh },
|
|
||||||
{ NULL, NULL } /* terminator */
|
{ NULL, NULL } /* terminator */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
#include "datastructs.h"
|
|
||||||
#include "amxmod_compat.h"
|
|
||||||
|
|
||||||
//Adapted from Quake3's vsprintf
|
//Adapted from Quake3's vsprintf
|
||||||
// thanks to cybermind for linking me to this :)
|
// thanks to cybermind for linking me to this :)
|
||||||
@ -19,7 +17,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')
|
||||||
@ -227,50 +224,6 @@ void AddFloat(U **buf_p, size_t &maxlen, double fval, int width, int prec)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename U>
|
|
||||||
void AddUInt(U **buf_p, size_t &maxlen, unsigned int val, int width, int flags)
|
|
||||||
{
|
|
||||||
U text[32];
|
|
||||||
int digits;
|
|
||||||
U *buf;
|
|
||||||
|
|
||||||
digits = 0;
|
|
||||||
do {
|
|
||||||
text[digits++] = '0' + val % 10;
|
|
||||||
val /= 10;
|
|
||||||
} while (val);
|
|
||||||
|
|
||||||
buf = *buf_p;
|
|
||||||
|
|
||||||
if( !(flags & LADJUST) )
|
|
||||||
{
|
|
||||||
while (digits < width && maxlen)
|
|
||||||
{
|
|
||||||
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
|
|
||||||
width--;
|
|
||||||
maxlen--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (digits-- && maxlen)
|
|
||||||
{
|
|
||||||
*buf++ = text[digits];
|
|
||||||
width--;
|
|
||||||
maxlen--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & LADJUST)
|
|
||||||
{
|
|
||||||
while (width-- && maxlen)
|
|
||||||
{
|
|
||||||
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
|
|
||||||
maxlen--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*buf_p = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename U>
|
template <typename U>
|
||||||
void AddInt(U **buf_p, size_t &maxlen, int val, int width, int flags)
|
void AddInt(U **buf_p, size_t &maxlen, int val, int width, int flags)
|
||||||
{
|
{
|
||||||
@ -278,21 +231,15 @@ void AddInt(U **buf_p, size_t &maxlen, int val, int width, int flags)
|
|||||||
int digits;
|
int digits;
|
||||||
int signedVal;
|
int signedVal;
|
||||||
U *buf;
|
U *buf;
|
||||||
unsigned int unsignedVal;
|
|
||||||
|
|
||||||
digits = 0;
|
digits = 0;
|
||||||
signedVal = val;
|
signedVal = val;
|
||||||
if (val < 0)
|
if (val < 0)
|
||||||
{
|
val = -val;
|
||||||
/* we want the unsigned version */
|
|
||||||
unsignedVal = abs(val);
|
|
||||||
} else {
|
|
||||||
unsignedVal = val;
|
|
||||||
}
|
|
||||||
do {
|
do {
|
||||||
text[digits++] = '0' + unsignedVal % 10;
|
text[digits++] = '0' + val % 10;
|
||||||
unsignedVal /= 10;
|
val /= 10;
|
||||||
} while (unsignedVal);
|
} while (val);
|
||||||
|
|
||||||
if (signedVal < 0)
|
if (signedVal < 0)
|
||||||
text[digits++] = '-';
|
text[digits++] = '-';
|
||||||
@ -328,66 +275,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)
|
||||||
{
|
{
|
||||||
@ -465,7 +352,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':
|
||||||
@ -474,62 +360,13 @@ reswitch:
|
|||||||
AddInt(&buf_p, llen, *get_amxaddr(amx, params[arg]), width, flags);
|
AddInt(&buf_p, llen, *get_amxaddr(amx, params[arg]), width, flags);
|
||||||
arg++;
|
arg++;
|
||||||
break;
|
break;
|
||||||
case 'u':
|
|
||||||
CHECK_ARGS(0);
|
|
||||||
AddUInt(&buf_p, llen, static_cast<unsigned int>(*get_amxaddr(amx, params[arg])), width, flags);
|
|
||||||
arg++;
|
|
||||||
break;
|
|
||||||
case 'f':
|
case 'f':
|
||||||
CHECK_ARGS(0);
|
CHECK_ARGS(0);
|
||||||
AddFloat(&buf_p, llen, amx_ctof(*get_amxaddr(amx, params[arg])), width, prec);
|
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)
|
|
||||||
{
|
|
||||||
cell *addr = get_amxaddr(amx, params[arg]);
|
|
||||||
if (*addr & BCOMPAT_TRANSLATE_BITS)
|
|
||||||
{
|
|
||||||
const char *key, *def;
|
|
||||||
if (!translate_bcompat(amx, addr, &key, &def))
|
|
||||||
{
|
|
||||||
goto break_to_normal_string;
|
|
||||||
}
|
|
||||||
arg++;
|
|
||||||
size_t written = atcprintf(buf_p, llen, def, amx, params, &arg);
|
|
||||||
buf_p += written;
|
|
||||||
llen -= written;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break_to_normal_string:
|
|
||||||
AddString(&buf_p, llen, get_amxaddr(amx, params[arg]), width, prec);
|
AddString(&buf_p, llen, get_amxaddr(amx, params[arg]), width, prec);
|
||||||
arg++;
|
arg++;
|
||||||
break;
|
break;
|
||||||
|
@ -5,7 +5,4 @@
|
|||||||
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);
|
||||||
|
|
||||||
const char *translate(AMX *amx, cell amxaddr, const char *key);
|
|
||||||
bool translate_bcompat(AMX *amx, cell *source, const char **_key, const char **_def);
|
|
||||||
|
|
||||||
#endif //_INCLUDE_FORMATTING_H
|
#endif //_INCLUDE_FORMATTING_H
|
||||||
|
@ -184,7 +184,7 @@ LibError RunLibCommand(const LibDecoder *enc)
|
|||||||
|
|
||||||
if ( (enc->cmd == LibCmd_ReqLib) || (enc->cmd == LibCmd_ReqClass) )
|
if ( (enc->cmd == LibCmd_ReqLib) || (enc->cmd == LibCmd_ReqClass) )
|
||||||
{
|
{
|
||||||
LibType expect = LibType_Library;
|
LibType expect;
|
||||||
|
|
||||||
if (enc->cmd == LibCmd_ReqLib)
|
if (enc->cmd == LibCmd_ReqLib)
|
||||||
expect = LibType_Library;
|
expect = LibType_Library;
|
||||||
@ -202,7 +202,7 @@ LibError RunLibCommand(const LibDecoder *enc)
|
|||||||
}
|
}
|
||||||
if (expect == LibType_Library)
|
if (expect == LibType_Library)
|
||||||
return LibErr_NoLibrary;
|
return LibErr_NoLibrary;
|
||||||
else if (expect == LibType_Class)
|
else if (expect = LibType_Class)
|
||||||
return LibErr_NoClass;
|
return LibErr_NoClass;
|
||||||
|
|
||||||
return LibErr_NoLibrary;
|
return LibErr_NoLibrary;
|
||||||
|
@ -111,7 +111,7 @@ void MD5::update(FILE *file){
|
|||||||
unsigned char buffer[1024];
|
unsigned char buffer[1024];
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
while ((len=fread(buffer, 1, 1024, file)))
|
while (len=fread(buffer, 1, 1024, file))
|
||||||
update(buffer, len);
|
update(buffer, len);
|
||||||
|
|
||||||
fclose (file);
|
fclose (file);
|
||||||
|
@ -9,8 +9,6 @@
|
|||||||
|
|
||||||
#define MAX_MESSAGES 255
|
#define MAX_MESSAGES 255
|
||||||
|
|
||||||
#define MSGBLOCK_SET 0
|
|
||||||
#define MSGBLOCK_GET 1
|
|
||||||
#define BLOCK_NOT 0
|
#define BLOCK_NOT 0
|
||||||
#define BLOCK_ONCE 1
|
#define BLOCK_ONCE 1
|
||||||
#define BLOCK_SET 2
|
#define BLOCK_SET 2
|
||||||
|
@ -39,30 +39,23 @@
|
|||||||
|
|
||||||
#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"
|
||||||
#include "optimizer.h"
|
#include "optimizer.h"
|
||||||
#include "libraries.h"
|
#include "libraries.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
#include "amxmod_compat.h"
|
|
||||||
|
|
||||||
#include "datastructs.h"
|
|
||||||
#include "CFlagManager.h"
|
|
||||||
#include "svn_version.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 +72,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 +85,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;
|
||||||
@ -103,7 +95,6 @@ String g_log_dir;
|
|||||||
String g_mod_name;
|
String g_mod_name;
|
||||||
XVars g_xvars;
|
XVars g_xvars;
|
||||||
|
|
||||||
bool g_bmod_tfc;
|
|
||||||
bool g_bmod_cstrike;
|
bool g_bmod_cstrike;
|
||||||
bool g_bmod_dod;
|
bool g_bmod_dod;
|
||||||
bool g_dontprecache;
|
bool g_dontprecache;
|
||||||
@ -179,18 +170,16 @@ void ParseAndOrAdd(CStack<String *> & files, const char *name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BuildPluginFileList(const char *initialdir, CStack<String *> & files)
|
void BuildPluginFileList(CStack<String *> & files)
|
||||||
{
|
{
|
||||||
char path[255];
|
char path[255];
|
||||||
#if defined WIN32
|
#if defined WIN32
|
||||||
build_pathname_r(path, sizeof(path)-1, "%s/*.ini", initialdir);
|
build_pathname_r(path, sizeof(path)-1, "%s/*.ini", get_localinfo("amxx_configsdir", "addons/amxmodx/configs"));
|
||||||
_finddata_t fd;
|
_finddata_t fd;
|
||||||
intptr_t handle = _findfirst(path, &fd);
|
intptr_t handle = _findfirst(path, &fd);
|
||||||
|
|
||||||
if (handle < 0)
|
if (handle < 0)
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
while (!_findnext(handle, &fd))
|
while (!_findnext(handle, &fd))
|
||||||
{
|
{
|
||||||
@ -199,14 +188,12 @@ void BuildPluginFileList(const char *initialdir, CStack<String *> & files)
|
|||||||
|
|
||||||
_findclose(handle);
|
_findclose(handle);
|
||||||
#elif defined __linux__
|
#elif defined __linux__
|
||||||
build_pathname_r(path, sizeof(path)-1, "%s/", initialdir);
|
build_pathname_r(path, sizeof(path)-1, "%s/", get_localinfo("amxx_configsdir", "addons/amxmodx/configs"));
|
||||||
struct dirent *ep;
|
struct dirent *ep;
|
||||||
DIR *dp;
|
DIR *dp;
|
||||||
|
|
||||||
if ((dp = opendir(path)) == NULL)
|
if ((dp = opendir(path)) == NULL)
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
while ( (ep=readdir(dp)) != NULL )
|
while ( (ep=readdir(dp)) != NULL )
|
||||||
{
|
{
|
||||||
@ -217,41 +204,6 @@ void BuildPluginFileList(const char *initialdir, CStack<String *> & files)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
//Loads a plugin list into the Plugin Cache and Load Modules cache
|
|
||||||
void LoadExtraPluginsToPCALM(const char *initialdir)
|
|
||||||
{
|
|
||||||
CStack<String *> files;
|
|
||||||
BuildPluginFileList(initialdir, files);
|
|
||||||
char path[255];
|
|
||||||
while (!files.empty())
|
|
||||||
{
|
|
||||||
String *pString = files.front();
|
|
||||||
snprintf(path, sizeof(path)-1, "%s/%s",
|
|
||||||
initialdir,
|
|
||||||
pString->c_str());
|
|
||||||
g_plugins.CALMFromFile(path);
|
|
||||||
delete pString;
|
|
||||||
files.pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void LoadExtraPluginsFromDir(const char *initialdir)
|
|
||||||
{
|
|
||||||
CStack<String *> files;
|
|
||||||
char path[255];
|
|
||||||
BuildPluginFileList(initialdir, files);
|
|
||||||
while (!files.empty())
|
|
||||||
{
|
|
||||||
String *pString = files.front();
|
|
||||||
snprintf(path, sizeof(path)-1, "%s/%s",
|
|
||||||
initialdir,
|
|
||||||
pString->c_str());
|
|
||||||
g_plugins.loadPluginsFromFile(path);
|
|
||||||
delete pString;
|
|
||||||
files.pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Precache stuff from force consistency calls
|
// Precache stuff from force consistency calls
|
||||||
// or check for pointed files won't be done
|
// or check for pointed files won't be done
|
||||||
int C_PrecacheModel(char *s)
|
int C_PrecacheModel(char *s)
|
||||||
@ -316,27 +268,11 @@ const char* get_localinfo(const char* name, const char* def)
|
|||||||
const char* b = LOCALINFO((char*)name);
|
const char* b = LOCALINFO((char*)name);
|
||||||
|
|
||||||
if (b == 0 || *b == 0)
|
if (b == 0 || *b == 0)
|
||||||
{
|
|
||||||
SET_LOCALINFO((char*)name, (char*)(b = def));
|
SET_LOCALINFO((char*)name, (char*)(b = def));
|
||||||
}
|
|
||||||
|
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* get_localinfo_r(const char *name, const char *def, char buffer[], size_t maxlength)
|
|
||||||
{
|
|
||||||
const char* b = LOCALINFO((char*)name);
|
|
||||||
|
|
||||||
if (b == 0 || *b == 0)
|
|
||||||
{
|
|
||||||
SET_LOCALINFO((char*)name, (char*)(b = def));
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(buffer, maxlength, "%s", b);
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Very first point at map load
|
// Very first point at map load
|
||||||
// Load AMX modules for new native functions
|
// Load AMX modules for new native functions
|
||||||
// Initialize AMX stuff and load it's plugins from plugins.ini list
|
// Initialize AMX stuff and load it's plugins from plugins.ini list
|
||||||
@ -344,9 +280,7 @@ const char* get_localinfo_r(const char *name, const char *def, char buffer[], si
|
|||||||
int C_Spawn(edict_t *pent)
|
int C_Spawn(edict_t *pent)
|
||||||
{
|
{
|
||||||
if (g_initialized)
|
if (g_initialized)
|
||||||
{
|
|
||||||
RETURN_META_VALUE(MRES_IGNORED, 0);
|
RETURN_META_VALUE(MRES_IGNORED, 0);
|
||||||
}
|
|
||||||
|
|
||||||
g_activated = false;
|
g_activated = false;
|
||||||
g_initialized = true;
|
g_initialized = true;
|
||||||
@ -358,22 +292,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();
|
||||||
@ -396,61 +314,26 @@ int C_Spawn(edict_t *pent)
|
|||||||
get_localinfo("amxx_configsdir", "addons/amxmodx/configs");
|
get_localinfo("amxx_configsdir", "addons/amxmodx/configs");
|
||||||
get_localinfo("amxx_customdir", "addons/amxmodx/custom");
|
get_localinfo("amxx_customdir", "addons/amxmodx/custom");
|
||||||
|
|
||||||
// make sure bcompat localinfos are set
|
|
||||||
get_localinfo("amx_basedir", "addons/amxmodx");
|
|
||||||
get_localinfo("amx_configdir", "addons/amxmodx/configs");
|
|
||||||
get_localinfo("amx_langdir", "addons/amxmodx/data/amxmod-lang");
|
|
||||||
get_localinfo("amx_modulesdir", "addons/amxmodx/modules");
|
|
||||||
get_localinfo("amx_pluginsdir", "addons/amxmodx/plugins");
|
|
||||||
get_localinfo("amx_logdir", "addons/amxmodx/logs");
|
|
||||||
|
|
||||||
FlagMan.LoadFile();
|
|
||||||
|
|
||||||
for (unsigned int i=0; i<VectorHolder.size(); i++)
|
|
||||||
{
|
|
||||||
delete VectorHolder[i];
|
|
||||||
};
|
|
||||||
VectorHolder.clear();
|
|
||||||
|
|
||||||
char map_pluginsfile_path[256];
|
|
||||||
char prefixed_map_pluginsfile[256];
|
|
||||||
char configs_dir[256];
|
|
||||||
|
|
||||||
// ###### Load modules
|
// ###### Load modules
|
||||||
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"), PT_ANYTIME);
|
loadModules(get_localinfo("amxx_modules", "addons/amxmodx/configs/modules.ini"), PT_ANYTIME);
|
||||||
|
|
||||||
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);
|
CStack<String *> files;
|
||||||
char temporaryMap[64], *tmap_ptr;
|
BuildPluginFileList(files);
|
||||||
|
char path[255];
|
||||||
snprintf(temporaryMap, sizeof(temporaryMap), "%s", STRING(gpGlobals->mapname));
|
while (!files.empty())
|
||||||
|
|
||||||
prefixed_map_pluginsfile[0] = '\0';
|
|
||||||
if ((tmap_ptr = strchr(temporaryMap, '_')) != NULL)
|
|
||||||
{
|
{
|
||||||
// this map has a prefix
|
String *pString = files.front();
|
||||||
|
snprintf(path, sizeof(path)-1, "%s/%s",
|
||||||
*tmap_ptr = '\0';
|
get_localinfo("amxx_configsdir", "addons/amxmodx/configs"),
|
||||||
snprintf(prefixed_map_pluginsfile,
|
pString->c_str());
|
||||||
sizeof(prefixed_map_pluginsfile),
|
g_plugins.CALMFromFile(path);
|
||||||
"%s/maps/plugins-%s.ini",
|
delete pString;
|
||||||
configs_dir,
|
files.pop();
|
||||||
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);
|
|
||||||
|
|
||||||
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);
|
||||||
@ -482,17 +365,20 @@ int C_Spawn(edict_t *pent)
|
|||||||
if (!g_opt_level)
|
if (!g_opt_level)
|
||||||
g_opt_level = 7;
|
g_opt_level = 7;
|
||||||
|
|
||||||
// ###### Load AMX Mod X plugins
|
// ###### Load AMX scripts
|
||||||
g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
||||||
LoadExtraPluginsFromDir(configs_dir);
|
BuildPluginFileList(files);
|
||||||
g_plugins.loadPluginsFromFile(map_pluginsfile_path, false);
|
while (!files.empty())
|
||||||
if (prefixed_map_pluginsfile[0] != '\0')
|
|
||||||
{
|
{
|
||||||
g_plugins.loadPluginsFromFile(prefixed_map_pluginsfile, false);
|
String *pString = files.front();
|
||||||
|
snprintf(path, sizeof(path)-1, "%s/%s",
|
||||||
|
get_localinfo("amxx_configsdir", "addons/amxmodx/configs"),
|
||||||
|
pString->c_str());
|
||||||
|
g_plugins.loadPluginsFromFile(path);
|
||||||
|
delete pString;
|
||||||
|
files.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
g_plugins.Finalize();
|
g_plugins.Finalize();
|
||||||
g_plugins.InvalidateCache();
|
|
||||||
|
|
||||||
// Register forwards
|
// Register forwards
|
||||||
FF_PluginInit = registerForward("plugin_init", ET_IGNORE, FP_DONE);
|
FF_PluginInit = registerForward("plugin_init", ET_IGNORE, FP_DONE);
|
||||||
@ -706,19 +592,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)
|
||||||
@ -785,7 +662,7 @@ void C_ServerDeactivate_Post()
|
|||||||
BOOL C_ClientConnect_Post(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128])
|
BOOL C_ClientConnect_Post(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128])
|
||||||
{
|
{
|
||||||
CPlayer* pPlayer = GET_PLAYER_POINTER(pEntity);
|
CPlayer* pPlayer = GET_PLAYER_POINTER(pEntity);
|
||||||
if (!pPlayer->IsBot())
|
if (!pPlayer->bot)
|
||||||
{
|
{
|
||||||
bool a = pPlayer->Connect(pszName, pszAddress);
|
bool a = pPlayer->Connect(pszName, pszAddress);
|
||||||
executeForwards(FF_ClientConnect, static_cast<cell>(pPlayer->index));
|
executeForwards(FF_ClientConnect, static_cast<cell>(pPlayer->index));
|
||||||
@ -833,7 +710,7 @@ void C_ClientDisconnect(edict_t *pEntity)
|
|||||||
void C_ClientPutInServer_Post(edict_t *pEntity)
|
void C_ClientPutInServer_Post(edict_t *pEntity)
|
||||||
{
|
{
|
||||||
CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity);
|
CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity);
|
||||||
if (!pPlayer->IsBot())
|
if (!pPlayer->bot)
|
||||||
{
|
{
|
||||||
pPlayer->PutInServer();
|
pPlayer->PutInServer();
|
||||||
++g_players_num;
|
++g_players_num;
|
||||||
@ -853,7 +730,9 @@ void C_ClientUserInfoChanged_Post(edict_t *pEntity, char *infobuffer)
|
|||||||
if (pPlayer->ingame)
|
if (pPlayer->ingame)
|
||||||
{
|
{
|
||||||
pPlayer->name.assign(name); // Make sure player have name up to date
|
pPlayer->name.assign(name); // Make sure player have name up to date
|
||||||
} else if (pPlayer->IsBot()) {
|
}
|
||||||
|
else if (pPlayer->IsBot())
|
||||||
|
{
|
||||||
pPlayer->Connect(name, "127.0.0.1"/*CVAR_GET_STRING("net_address")*/);
|
pPlayer->Connect(name, "127.0.0.1"/*CVAR_GET_STRING("net_address")*/);
|
||||||
|
|
||||||
executeForwards(FF_ClientConnect, static_cast<cell>(pPlayer->index));
|
executeForwards(FF_ClientConnect, static_cast<cell>(pPlayer->index));
|
||||||
@ -902,11 +781,10 @@ void C_ClientCommand(edict_t *pEntity)
|
|||||||
|
|
||||||
sprintf(buf, "%s %s\n", Plugin_info.name, Plugin_info.version);
|
sprintf(buf, "%s %s\n", Plugin_info.name, Plugin_info.version);
|
||||||
CLIENT_PRINT(pEntity, print_console, buf);
|
CLIENT_PRINT(pEntity, print_console, buf);
|
||||||
len = sprintf(buf, "Authors: \n David \"BAILOPAN\" Anderson, Pavol \"PM OnoTo\" Marko, Felix \"SniperBeamer\" Geyer\n");
|
len = sprintf(buf, "Authors: David \"BAILOPAN\" Anderson, Pavol \"PM OnoTo\" Marko, Felix \"SniperBeamer\" Geyer\n");
|
||||||
len += sprintf(&buf[len], " Jonny \"Got His Gun\" Bergstrom, Lukasz \"SidLuke\" Wlasinski\n");
|
len += sprintf(&buf[len], "Authors: Jonny \"Got His Gun\" Bergstrom, Lukasz \"SidLuke\" Wlasinski\n");
|
||||||
CLIENT_PRINT(pEntity, print_console, buf);
|
CLIENT_PRINT(pEntity, print_console, buf);
|
||||||
len = sprintf(buf, " Christian \"Basic-Master\" Hammacher, Borja \"faluco\" Ferrer\n");
|
len = sprintf(buf, "Authors: Christian \"Basic-Master\" Hammacher, Borja \"faluco\" Ferrer\n");
|
||||||
len += sprintf(&buf[len], " Scott \"Damaged Soul\" Ehlert\n");
|
|
||||||
len += sprintf(&buf[len], "Compiled: %s\nURL:http://www.amxmodx.org/\n", __DATE__ ", " __TIME__);
|
len += sprintf(&buf[len], "Compiled: %s\nURL:http://www.amxmodx.org/\n", __DATE__ ", " __TIME__);
|
||||||
CLIENT_PRINT(pEntity, print_console, buf);
|
CLIENT_PRINT(pEntity, print_console, buf);
|
||||||
#ifdef JIT
|
#ifdef JIT
|
||||||
@ -965,63 +843,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 */
|
MenuMngr::iterator a = g_menucmds.begin();
|
||||||
int func_was_executed = -1;
|
|
||||||
|
while (a)
|
||||||
|
{
|
||||||
|
if ((*a).matchCommand(menuid, bit_key) && (*a).getPlugin()->isExecutable((*a).getFunction()))
|
||||||
|
{
|
||||||
if (pPlayer->newmenu != -1)
|
if (pPlayer->newmenu != -1)
|
||||||
{
|
{
|
||||||
int menu = pPlayer->newmenu;
|
int menu = pPlayer->newmenu;
|
||||||
pPlayer->newmenu = -1;
|
pPlayer->newmenu = -1;
|
||||||
|
|
||||||
if (menu >= 0 && menu < (int)g_NewMenus.size() && g_NewMenus[menu])
|
if (menu >= 0 && menu < (int)g_NewMenus.size())
|
||||||
{
|
{
|
||||||
Menu *pMenu = g_NewMenus[menu];
|
Menu *pMenu = g_NewMenus[menu];
|
||||||
int item = pMenu->PagekeyToItem(pPlayer->page, pressed_key+1);
|
int item = pMenu->PagekeyToItem(pPlayer->page, pressed_key+1);
|
||||||
|
|
||||||
if (item == MENU_BACK)
|
if (item == MENU_BACK)
|
||||||
{
|
{
|
||||||
pMenu->Display(pPlayer->index, pPlayer->page - 1);
|
pMenu->Display(pPlayer->index, pPlayer->page - 1);
|
||||||
} else if (item == MENU_MORE) {
|
} else if (item == MENU_MORE) {
|
||||||
pMenu->Display(pPlayer->index, pPlayer->page + 1);
|
pMenu->Display(pPlayer->index, pPlayer->page + 1);
|
||||||
} else {
|
} else {
|
||||||
ret = executeForwards(pMenu->func, static_cast<cell>(pPlayer->index), static_cast<cell>(menu), static_cast<cell>(item));
|
ret = executeForwards((*a).getFunction(), static_cast<cell>(pPlayer->index), static_cast<cell>(menu), static_cast<cell>(item));
|
||||||
|
|
||||||
if (ret & 2)
|
if (ret & 2)
|
||||||
{
|
|
||||||
result = MRES_SUPERCEDE;
|
result = MRES_SUPERCEDE;
|
||||||
} else if (ret & 1) {
|
else if (ret & 1)
|
||||||
RETURN_META(MRES_SUPERCEDE);
|
RETURN_META(MRES_SUPERCEDE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
if (pPlayer->newmenu != -1)
|
||||||
* No matter what we marked it as executed, since the callback styles are
|
break;
|
||||||
* entirely different. After all, this is a backwards compat shim.
|
} else {
|
||||||
*/
|
|
||||||
func_was_executed = pMenu->func;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now, do old menus */
|
|
||||||
MenuMngr::iterator a = g_menucmds.begin();
|
|
||||||
|
|
||||||
while (a)
|
|
||||||
{
|
|
||||||
g_menucmds.SetWatchIter(a);
|
|
||||||
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),
|
ret = executeForwards((*a).getFunction(), static_cast<cell>(pPlayer->index),
|
||||||
static_cast<cell>(pressed_key), 0);
|
static_cast<cell>(pressed_key), 0);
|
||||||
|
|
||||||
if (ret & 2) result = MRES_SUPERCEDE;
|
if (ret & 2) result = MRES_SUPERCEDE;
|
||||||
if (ret & 1) RETURN_META(MRES_SUPERCEDE);
|
if (ret & 1) RETURN_META(MRES_SUPERCEDE);
|
||||||
}
|
}
|
||||||
if (g_menucmds.GetWatchIter() != a)
|
|
||||||
{
|
|
||||||
a = g_menucmds.GetWatchIter();
|
|
||||||
} else {
|
|
||||||
++a;
|
|
||||||
}
|
}
|
||||||
|
++a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1137,6 +999,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 {
|
||||||
@ -1278,18 +1154,17 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
void C_AlertMessage(ALERT_TYPE atype, char *szFmt, ...)
|
void C_AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...)
|
||||||
{
|
{
|
||||||
if (atype != at_logged)
|
if (atype != at_logged)
|
||||||
{
|
|
||||||
RETURN_META(MRES_IGNORED);
|
RETURN_META(MRES_IGNORED);
|
||||||
}
|
|
||||||
|
|
||||||
/* There are also more messages but we want only logs
|
/* There are also more messages but we want only logs
|
||||||
at_notice,
|
at_notice,
|
||||||
@ -1300,11 +1175,8 @@ void C_AlertMessage(ALERT_TYPE atype, char *szFmt, ...)
|
|||||||
at_logged // Server print to console ( only in multiplayer games ).
|
at_logged // Server print to console ( only in multiplayer games ).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
cell retVal = 0;
|
|
||||||
|
|
||||||
// execute logevents and plugin_log forward
|
// execute logevents and plugin_log forward
|
||||||
if (g_logevents.logEventsExist()
|
if (g_logevents.logEventsExist() || FF_PluginLog >= 0)
|
||||||
|| g_forwards.getFuncsNum(FF_PluginLog))
|
|
||||||
{
|
{
|
||||||
va_list logArgPtr;
|
va_list logArgPtr;
|
||||||
va_start(logArgPtr, szFmt);
|
va_start(logArgPtr, szFmt);
|
||||||
@ -1313,16 +1185,12 @@ void C_AlertMessage(ALERT_TYPE atype, char *szFmt, ...)
|
|||||||
g_logevents.parseLogString();
|
g_logevents.parseLogString();
|
||||||
|
|
||||||
if (g_logevents.logEventsExist())
|
if (g_logevents.logEventsExist())
|
||||||
{
|
|
||||||
g_logevents.executeLogEvents();
|
g_logevents.executeLogEvents();
|
||||||
}
|
|
||||||
|
|
||||||
retVal = executeForwards(FF_PluginLog);
|
cell retVal = executeForwards(FF_PluginLog);
|
||||||
}
|
|
||||||
|
|
||||||
if (retVal)
|
if (retVal)
|
||||||
{
|
RETURN_META(MRES_HANDLED);
|
||||||
RETURN_META(MRES_SUPERCEDE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN_META(MRES_IGNORED);
|
RETURN_META(MRES_IGNORED);
|
||||||
@ -1456,7 +1324,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");
|
||||||
|
|
||||||
@ -1485,8 +1353,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1657,7 +1523,6 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
|||||||
} else {
|
} else {
|
||||||
g_bmod_cstrike = false;
|
g_bmod_cstrike = false;
|
||||||
g_bmod_dod = !stricmp(g_mod_name.c_str(), "dod");
|
g_bmod_dod = !stricmp(g_mod_name.c_str(), "dod");
|
||||||
g_bmod_tfc = !stricmp(g_mod_name.c_str(), "tfc");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_engfuncs.pfnCmd_Argc = C_Cmd_Argc;
|
meta_engfuncs.pfnCmd_Argc = C_Cmd_Argc;
|
||||||
@ -1679,8 +1544,6 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
|||||||
meta_engfuncs.pfnWriteShort = C_WriteShort;
|
meta_engfuncs.pfnWriteShort = C_WriteShort;
|
||||||
meta_engfuncs.pfnWriteString = C_WriteString;
|
meta_engfuncs.pfnWriteString = C_WriteString;
|
||||||
|
|
||||||
meta_engfuncs.pfnAlertMessage = C_AlertMessage;
|
|
||||||
|
|
||||||
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
|
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -1702,6 +1565,7 @@ C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int
|
|||||||
meta_engfuncs_post.pfnWriteCoord = C_WriteCoord_Post;
|
meta_engfuncs_post.pfnWriteCoord = C_WriteCoord_Post;
|
||||||
meta_engfuncs_post.pfnWriteString = C_WriteString_Post;
|
meta_engfuncs_post.pfnWriteString = C_WriteString_Post;
|
||||||
meta_engfuncs_post.pfnWriteEntity = C_WriteEntity_Post;
|
meta_engfuncs_post.pfnWriteEntity = C_WriteEntity_Post;
|
||||||
|
meta_engfuncs_post.pfnAlertMessage = C_AlertMessage_Post;
|
||||||
meta_engfuncs_post.pfnRegUserMsg = C_RegUserMsg_Post;
|
meta_engfuncs_post.pfnRegUserMsg = C_RegUserMsg_Post;
|
||||||
|
|
||||||
memcpy(pengfuncsFromEngine, &meta_engfuncs_post, sizeof(enginefuncs_t));
|
memcpy(pengfuncsFromEngine, &meta_engfuncs_post, sizeof(enginefuncs_t));
|
||||||
|
@ -48,7 +48,6 @@
|
|||||||
#include "binlog.h"
|
#include "binlog.h"
|
||||||
#include "libraries.h"
|
#include "libraries.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
#include "amxmod_compat.h"
|
|
||||||
|
|
||||||
CList<CModule, const char*> g_modules;
|
CList<CModule, const char*> g_modules;
|
||||||
CList<CScript, AMX*> g_loadedscripts;
|
CList<CScript, AMX*> g_loadedscripts;
|
||||||
@ -166,7 +165,6 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64
|
|||||||
*error = 0;
|
*error = 0;
|
||||||
size_t bufSize;
|
size_t bufSize;
|
||||||
*program = (void *)g_plugins.ReadIntoOrFromCache(filename, bufSize);
|
*program = (void *)g_plugins.ReadIntoOrFromCache(filename, bufSize);
|
||||||
bool oldfile = false;
|
|
||||||
if (!*program)
|
if (!*program)
|
||||||
{
|
{
|
||||||
CAmxxReader reader(filename, PAWN_CELL_SIZE / 8);
|
CAmxxReader reader(filename, PAWN_CELL_SIZE / 8);
|
||||||
@ -220,8 +218,6 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64
|
|||||||
strcpy(error, "Unknown error");
|
strcpy(error, "Unknown error");
|
||||||
return (amx->error = AMX_ERR_NOTFOUND);
|
return (amx->error = AMX_ERR_NOTFOUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
oldfile = reader.IsOldFile();
|
|
||||||
} else {
|
} else {
|
||||||
g_plugins.InvalidateFileInCache(filename, false);
|
g_plugins.InvalidateFileInCache(filename, false);
|
||||||
}
|
}
|
||||||
@ -317,7 +313,7 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64
|
|||||||
//set this again because amx_Init() erases it!
|
//set this again because amx_Init() erases it!
|
||||||
amx->flags |= AMX_FLAG_JITC;
|
amx->flags |= AMX_FLAG_JITC;
|
||||||
amx->flags &= (~AMX_FLAG_DEBUG);
|
amx->flags &= (~AMX_FLAG_DEBUG);
|
||||||
amx->sysreq_d = 0;
|
amx->sysreq_d = NULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,17 +369,6 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (oldfile)
|
|
||||||
{
|
|
||||||
amx->flags |= AMX_FLAG_OLDFILE;
|
|
||||||
} else {
|
|
||||||
cell addr;
|
|
||||||
if (amx_FindPubVar(amx, "__b_old_plugin", &addr) == AMX_ERR_NONE)
|
|
||||||
{
|
|
||||||
amx->flags |= AMX_FLAG_OLDFILE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CScript* aa = new CScript(amx, *program, filename);
|
CScript* aa = new CScript(amx, *program, filename);
|
||||||
|
|
||||||
g_loadedscripts.put(aa);
|
g_loadedscripts.put(aa);
|
||||||
@ -557,12 +542,6 @@ int set_amxnatives(AMX* amx, char error[128])
|
|||||||
{
|
{
|
||||||
amx_Register(amx, cm->m_Natives[i], -1);
|
amx_Register(amx, cm->m_Natives[i], -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < cm->m_NewNatives.size(); i++)
|
|
||||||
{
|
|
||||||
if (!(amx->flags & AMX_FLAG_OLDFILE))
|
|
||||||
amx_Register(amx, cm->m_NewNatives[i], -1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
amx_Register(amx, string_Natives, -1);
|
amx_Register(amx, string_Natives, -1);
|
||||||
@ -577,13 +556,6 @@ int set_amxnatives(AMX* amx, char error[128])
|
|||||||
amx_Register(amx, g_DebugNatives, -1);
|
amx_Register(amx, g_DebugNatives, -1);
|
||||||
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_DataStructNatives, -1);
|
|
||||||
|
|
||||||
if (amx->flags & AMX_FLAG_OLDFILE)
|
|
||||||
{
|
|
||||||
amx_Register(amx, g_BcompatNatives, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
//we're not actually gonna check these here anymore
|
//we're not actually gonna check these here anymore
|
||||||
amx->flags |= AMX_FLAG_PRENIT;
|
amx->flags |= AMX_FLAG_PRENIT;
|
||||||
@ -599,7 +571,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!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -612,9 +584,7 @@ int set_amxnatives(AMX* amx, char error[128])
|
|||||||
|
|
||||||
int unload_amxscript(AMX* amx, void** program)
|
int unload_amxscript(AMX* amx, void** program)
|
||||||
{
|
{
|
||||||
#if !defined AMD64
|
|
||||||
int flags = amx->flags;
|
int flags = amx->flags;
|
||||||
#endif
|
|
||||||
|
|
||||||
Debugger *pDebugger = (Debugger *)amx->userdata[UD_DEBUGGER];
|
Debugger *pDebugger = (Debugger *)amx->userdata[UD_DEBUGGER];
|
||||||
if (pDebugger)
|
if (pDebugger)
|
||||||
@ -722,7 +692,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);
|
||||||
@ -734,10 +710,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -746,7 +723,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;
|
||||||
@ -758,10 +741,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -782,16 +766,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;
|
||||||
@ -809,7 +800,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)
|
||||||
{
|
{
|
||||||
@ -870,7 +861,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__
|
||||||
@ -1184,18 +1175,6 @@ int MNF_AddNatives(AMX_NATIVE_INFO* natives)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int MNF_AddNewNatives(AMX_NATIVE_INFO *natives)
|
|
||||||
{
|
|
||||||
CList<CModule, const char *>::iterator a = g_modules.begin();
|
|
||||||
|
|
||||||
if (!g_CurrentlyCalledModule || g_ModuleCallReason != ModuleCall_Attach)
|
|
||||||
return FALSE; // may only be called from attach
|
|
||||||
|
|
||||||
g_CurrentlyCalledModule->m_NewNatives.push_back(natives);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *MNF_GetModname(void)
|
const char *MNF_GetModname(void)
|
||||||
{
|
{
|
||||||
// :TODO: Do we have to do this??
|
// :TODO: Do we have to do this??
|
||||||
@ -1215,7 +1194,7 @@ AMX *MNF_GetAmxScript(int id)
|
|||||||
while (iter && id--)
|
while (iter && id--)
|
||||||
++iter;
|
++iter;
|
||||||
|
|
||||||
if (iter == 0)
|
if (iter == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return (*iter).getAMX();
|
return (*iter).getAMX();
|
||||||
@ -1228,7 +1207,7 @@ const char *MNF_GetAmxScriptName(int id)
|
|||||||
while (iter && id--)
|
while (iter && id--)
|
||||||
++iter;
|
++iter;
|
||||||
|
|
||||||
if (iter == 0)
|
if (iter == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return (*iter).getName();
|
return (*iter).getName();
|
||||||
@ -1558,9 +1537,7 @@ extern "C" void LogError(AMX *amx, int err, const char *fmt, ...)
|
|||||||
#if defined BINLOG_ENABLED
|
#if defined BINLOG_ENABLED
|
||||||
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
|
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
|
||||||
if (pl)
|
if (pl)
|
||||||
{
|
|
||||||
g_BinLog.WriteOp(BinLog_NativeError, pl->getId(), err, msg_buffer);
|
g_BinLog.WriteOp(BinLog_NativeError, pl->getId(), err, msg_buffer);
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//give the plugin first chance to handle any sort of error
|
//give the plugin first chance to handle any sort of error
|
||||||
@ -1569,19 +1546,14 @@ extern "C" void LogError(AMX *amx, int err, const char *fmt, ...)
|
|||||||
if (pHandler->InNativeFilter())
|
if (pHandler->InNativeFilter())
|
||||||
{
|
{
|
||||||
if (pDebugger)
|
if (pDebugger)
|
||||||
{
|
|
||||||
pDebugger->EndExec();
|
pDebugger->EndExec();
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (pHandler)
|
if (pHandler)
|
||||||
{
|
{
|
||||||
if (pHandler->IsHandling())
|
if (pHandler->IsHandling())
|
||||||
{
|
{
|
||||||
if (fmt != NULL)
|
if (fmt != NULL)
|
||||||
{
|
|
||||||
pHandler->SetErrorMsg(msg_buffer);
|
pHandler->SetErrorMsg(msg_buffer);
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1597,15 +1569,10 @@ extern "C" void LogError(AMX *amx, int err, const char *fmt, ...)
|
|||||||
if (!pDebugger)
|
if (!pDebugger)
|
||||||
{
|
{
|
||||||
if (fmt)
|
if (fmt)
|
||||||
{
|
|
||||||
AMXXLOG_Error("%s", msg_buffer);
|
AMXXLOG_Error("%s", msg_buffer);
|
||||||
}
|
|
||||||
|
|
||||||
Debugger::GenericMessage(amx, err);
|
Debugger::GenericMessage(amx, err);
|
||||||
if (err != AMX_ERR_EXIT)
|
|
||||||
{
|
|
||||||
AMXXLOG_Error("[AMXX] To enable debug mode, add \"debug\" after the plugin name in plugins.ini (without quotes).");
|
AMXXLOG_Error("[AMXX] To enable debug mode, add \"debug\" after the plugin name in plugins.ini (without quotes).");
|
||||||
}
|
|
||||||
//destroy original error code so the original is not displayed again
|
//destroy original error code so the original is not displayed again
|
||||||
} else {
|
} else {
|
||||||
pDebugger->SetTracedError(err);
|
pDebugger->SetTracedError(err);
|
||||||
@ -1760,33 +1727,6 @@ const char *MNF_GetLocalInfo(char *name, const char *def)
|
|||||||
return get_localinfo(name, def);
|
return get_localinfo(name, def);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MNF_MessageBlock(int mode, int msg, int *opt)
|
|
||||||
{
|
|
||||||
switch (mode)
|
|
||||||
{
|
|
||||||
case MSGBLOCK_SET:
|
|
||||||
{
|
|
||||||
if (msg < 0 || msg > MAX_MESSAGES || opt == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int _opt = msgBlocks[msg];
|
|
||||||
msgBlocks[msg] = *opt;
|
|
||||||
*opt = _opt;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MSGBLOCK_GET:
|
|
||||||
{
|
|
||||||
if (msg < 0 || msg > MAX_MESSAGES || opt == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*opt = msgBlocks[msg];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void *MNF_PlayerPropAddr(int id, int prop)
|
void *MNF_PlayerPropAddr(int id, int prop)
|
||||||
{
|
{
|
||||||
if (id < 1 || id > gpGlobals->maxClients)
|
if (id < 1 || id > gpGlobals->maxClients)
|
||||||
@ -1888,7 +1828,6 @@ void Module_CacheFunctions()
|
|||||||
|
|
||||||
// Natives / Forwards
|
// Natives / Forwards
|
||||||
REGISTER_FUNC("AddNatives", MNF_AddNatives)
|
REGISTER_FUNC("AddNatives", MNF_AddNatives)
|
||||||
REGISTER_FUNC("AddNewNatives", MNF_AddNewNatives)
|
|
||||||
REGISTER_FUNC("RaiseAmxError", amx_RaiseError)
|
REGISTER_FUNC("RaiseAmxError", amx_RaiseError)
|
||||||
REGISTER_FUNC("RegisterForward", registerForward)
|
REGISTER_FUNC("RegisterForward", registerForward)
|
||||||
REGISTER_FUNC("RegisterSPForward", registerSPForward)
|
REGISTER_FUNC("RegisterSPForward", registerSPForward)
|
||||||
@ -1937,8 +1876,6 @@ void Module_CacheFunctions()
|
|||||||
REGISTER_FUNC("OverrideNatives", MNF_OverrideNatives);
|
REGISTER_FUNC("OverrideNatives", MNF_OverrideNatives);
|
||||||
REGISTER_FUNC("GetLocalInfo", MNF_GetLocalInfo);
|
REGISTER_FUNC("GetLocalInfo", MNF_GetLocalInfo);
|
||||||
|
|
||||||
REGISTER_FUNC("MessageBlock", MNF_MessageBlock);
|
|
||||||
|
|
||||||
#ifdef MEMORY_TEST
|
#ifdef MEMORY_TEST
|
||||||
REGISTER_FUNC("Allocator", m_allocator)
|
REGISTER_FUNC("Allocator", m_allocator)
|
||||||
REGISTER_FUNC("Deallocator", m_deallocator)
|
REGISTER_FUNC("Deallocator", m_deallocator)
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
#define DLLEXPORT __declspec(dllexport)
|
#define DLLEXPORT __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define DLLEXPORT __attribute__((visibility("default")))
|
#define DLLEXPORT
|
||||||
#define WINAPI
|
#define WINAPI
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
12
amxmodx/msvc/.cvsignore
Executable file
12
amxmodx/msvc/.cvsignore
Executable 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
292
amxmodx/msvc/amxmodx_mm.dsp
Executable 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
29
amxmodx/msvc/amxmodx_mm.dsw
Executable 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>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
@ -322,9 +322,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\amxdbg.cpp">
|
RelativePath="..\amxdbg.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\amxmod_compat.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\amxmodx.cpp">
|
RelativePath="..\amxmodx.cpp">
|
||||||
</File>
|
</File>
|
||||||
@ -361,9 +358,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\CFile.cpp">
|
RelativePath="..\CFile.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\CFlagManager.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CForward.cpp">
|
RelativePath="..\CForward.cpp">
|
||||||
</File>
|
</File>
|
||||||
@ -391,9 +385,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\CVault.cpp">
|
RelativePath="..\CVault.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\datastructs.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\debugger.cpp">
|
RelativePath="..\debugger.cpp">
|
||||||
</File>
|
</File>
|
||||||
@ -445,18 +436,12 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\newmenus.cpp">
|
RelativePath="..\newmenus.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\nongpl_matches.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\optimizer.cpp">
|
RelativePath="..\optimizer.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\power.cpp">
|
RelativePath="..\power.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\sorting.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\srvcmd.cpp">
|
RelativePath="..\srvcmd.cpp">
|
||||||
</File>
|
</File>
|
||||||
@ -497,9 +482,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\amxdbg.h">
|
RelativePath="..\amxdbg.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\amxmod_compat.h">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\amxmodx.h">
|
RelativePath="..\amxmodx.h">
|
||||||
</File>
|
</File>
|
||||||
@ -521,9 +503,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\CFile.h">
|
RelativePath="..\CFile.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\CFlagManager.h">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CForward.h">
|
RelativePath="..\CForward.h">
|
||||||
</File>
|
</File>
|
||||||
@ -563,9 +542,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\CVector.h">
|
RelativePath="..\CVector.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\datastructs.h">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\debugger.h">
|
RelativePath="..\debugger.h">
|
||||||
</File>
|
</File>
|
||||||
@ -596,9 +572,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\newmenus.h">
|
RelativePath="..\newmenus.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\nongpl_matches.h">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\optimizer.h">
|
RelativePath="..\optimizer.h">
|
||||||
</File>
|
</File>
|
||||||
@ -614,9 +587,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\sh_tinyhash.h">
|
RelativePath="..\sh_tinyhash.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\svn_version.h">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\zlib\zconf.h">
|
RelativePath="..\zlib\zconf.h">
|
||||||
</File>
|
</File>
|
||||||
@ -697,92 +667,6 @@
|
|||||||
RelativePath="..\sdk\moduleconfig.h">
|
RelativePath="..\sdk\moduleconfig.h">
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
|
||||||
Name="Pawn Includes"
|
|
||||||
Filter="">
|
|
||||||
<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"
|
|
||||||
Filter="">
|
|
||||||
<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>
|
@ -453,10 +453,6 @@
|
|||||||
RelativePath="..\amxdbg.cpp"
|
RelativePath="..\amxdbg.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\amxmod_compat.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\amxmodx.cpp"
|
RelativePath="..\amxmodx.cpp"
|
||||||
>
|
>
|
||||||
@ -505,10 +501,6 @@
|
|||||||
RelativePath="..\CFile.cpp"
|
RelativePath="..\CFile.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\CFlagManager.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CForward.cpp"
|
RelativePath="..\CForward.cpp"
|
||||||
>
|
>
|
||||||
@ -613,10 +605,6 @@
|
|||||||
RelativePath="..\newmenus.cpp"
|
RelativePath="..\newmenus.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\nongpl_matches.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\optimizer.cpp"
|
RelativePath="..\optimizer.cpp"
|
||||||
>
|
>
|
||||||
@ -625,10 +613,6 @@
|
|||||||
RelativePath="..\power.cpp"
|
RelativePath="..\power.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\sorting.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\srvcmd.cpp"
|
RelativePath="..\srvcmd.cpp"
|
||||||
>
|
>
|
||||||
@ -682,10 +666,6 @@
|
|||||||
RelativePath="..\amxdbg.h"
|
RelativePath="..\amxdbg.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\amxmod_compat.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\amxmodx.h"
|
RelativePath="..\amxmodx.h"
|
||||||
>
|
>
|
||||||
@ -714,10 +694,6 @@
|
|||||||
RelativePath="..\CFile.h"
|
RelativePath="..\CFile.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\CFlagManager.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CForward.h"
|
RelativePath="..\CForward.h"
|
||||||
>
|
>
|
||||||
@ -770,14 +746,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"
|
||||||
>
|
>
|
||||||
@ -798,6 +766,10 @@
|
|||||||
RelativePath="..\md5.h"
|
RelativePath="..\md5.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\menus.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\messages.h"
|
RelativePath="..\messages.h"
|
||||||
>
|
>
|
||||||
@ -814,10 +786,6 @@
|
|||||||
RelativePath="..\newmenus.h"
|
RelativePath="..\newmenus.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\nongpl_matches.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\optimizer.h"
|
RelativePath="..\optimizer.h"
|
||||||
>
|
>
|
||||||
@ -838,10 +806,6 @@
|
|||||||
RelativePath="..\sh_tinyhash.h"
|
RelativePath="..\sh_tinyhash.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\svn_version.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\zlib\zconf.h"
|
RelativePath="..\zlib\zconf.h"
|
||||||
>
|
>
|
||||||
@ -944,118 +908,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>
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#include "natives.h"
|
#include "natives.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
#include "libraries.h"
|
#include "libraries.h"
|
||||||
#include "format.h"
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
@ -46,16 +45,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 +78,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--)
|
|
||||||
{
|
|
||||||
g_Params[i] = params[i];
|
|
||||||
}
|
|
||||||
} else if (pNative->style == 1) {
|
|
||||||
/**
|
|
||||||
* 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--)
|
||||||
{
|
pNative->params[i] = params[i];
|
||||||
|
} else if (pNative->style == 1) {
|
||||||
|
//use dJeyL's system .. very clever!
|
||||||
|
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 +121,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 +137,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 +163,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 +172,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 +186,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 +209,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 +256,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 +279,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 +305,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];
|
||||||
@ -356,84 +328,26 @@ static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
if (!g_pCurNative || (g_pCurNative->amx != amx))
|
|
||||||
{
|
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_pCurNative->style)
|
|
||||||
{
|
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int vargPos = static_cast<int>(params[4]);
|
|
||||||
int fargPos = static_cast<int>(params[3]);
|
|
||||||
|
|
||||||
cell max = g_Params[0] / sizeof(cell);
|
|
||||||
if (vargPos > (int)max + 1)
|
|
||||||
{
|
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (fargPos > (int)max + 1)
|
|
||||||
{
|
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Invalid fmtarg parameter passed: %d", fargPos);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get destination info */
|
|
||||||
cell *fmt;
|
|
||||||
if (fargPos == 0)
|
|
||||||
{
|
|
||||||
if (params[0] / sizeof(cell) != 5)
|
|
||||||
{
|
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Expected fmtarg as fifth parameter, found none");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
fmt = get_amxaddr(amx, params[5]);
|
|
||||||
} else {
|
|
||||||
fmt = get_amxaddr(g_pCaller, g_Params[fargPos]);
|
|
||||||
}
|
|
||||||
cell *realdest = get_amxaddr(amx, params[1]);
|
|
||||||
size_t maxlen = static_cast<size_t>(params[2]);
|
|
||||||
cell *dest = realdest;
|
|
||||||
|
|
||||||
/* if this is necessary... */
|
|
||||||
static cell cpbuf[4096];
|
|
||||||
dest = cpbuf;
|
|
||||||
|
|
||||||
/* perform format */
|
|
||||||
size_t total = atcprintf(dest, maxlen, fmt, g_pCaller, g_Params, &vargPos);
|
|
||||||
|
|
||||||
/* copy back */
|
|
||||||
memcpy(realdest, dest, (total+1) * sizeof(cell));
|
|
||||||
|
|
||||||
return total;
|
|
||||||
}
|
|
||||||
|
|
||||||
//This is basically right from dJeyL's lib_convert function
|
//This is basically right from dJeyL's lib_convert function
|
||||||
//This awesome hack modifies the stack frame to have an address offset
|
//This awesome hack modifies the stack frame to have an address offset
|
||||||
// that will align to the other plugin's memory.
|
// that will align to the other plugin's memory.
|
||||||
//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 +389,7 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
|
|||||||
regnative *pNative = new regnative;
|
regnative *pNative = new regnative;
|
||||||
pNative->amx = amx;
|
pNative->amx = amx;
|
||||||
pNative->func = idx;
|
pNative->func = idx;
|
||||||
|
pNative->caller = NULL;
|
||||||
|
|
||||||
//we'll apply a safety buffer too
|
//we'll apply a safety buffer too
|
||||||
//make our function
|
//make our function
|
||||||
@ -529,7 +444,6 @@ AMX_NATIVE_INFO g_NativeNatives[] = {
|
|||||||
{"set_float_byref", set_param_byref},
|
{"set_float_byref", set_param_byref},
|
||||||
{"get_array_f", get_array},
|
{"get_array_f", get_array},
|
||||||
{"set_array_f", set_array},
|
{"set_array_f", set_array},
|
||||||
{"vdformat", vdformat},
|
|
||||||
{"param_convert", param_convert},
|
{"param_convert", param_convert},
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
|
@ -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);
|
||||||
|
@ -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,16 +37,12 @@ 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)
|
||||||
{
|
{
|
||||||
@ -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] == 1)
|
|
||||||
{
|
|
||||||
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] == 1)
|
|
||||||
{
|
|
||||||
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] == 1)
|
|
||||||
{
|
|
||||||
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++;
|
||||||
@ -452,119 +326,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] == 1)
|
if (pItem->blanks[j] == 1)
|
||||||
{
|
|
||||||
option++;
|
option++;
|
||||||
}
|
|
||||||
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])
|
||||||
|
{
|
||||||
|
case MENU_BACK:
|
||||||
{
|
{
|
||||||
if (flags & Display_Back)
|
if (flags & Display_Back)
|
||||||
{
|
{
|
||||||
keys |= (1<<option++);
|
keys |= (1<<option++);
|
||||||
if (m_AutoColors)
|
|
||||||
{
|
|
||||||
_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 {
|
|
||||||
_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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_Text.append(buffer);
|
m_Text.append(buffer);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MENU_MORE:
|
||||||
|
{
|
||||||
if (flags & Display_Next)
|
if (flags & Display_Next)
|
||||||
{
|
{
|
||||||
keys |= (1<<option++);
|
keys |= (1<<option++);
|
||||||
if (m_AutoColors)
|
|
||||||
{
|
|
||||||
_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 {
|
|
||||||
_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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_Text.append(buffer);
|
m_Text.append(buffer);
|
||||||
} else {
|
|
||||||
/* Keep padding */
|
|
||||||
option += 2;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
if (!m_NeverExit)
|
}
|
||||||
|
case MENU_EXIT:
|
||||||
|
{
|
||||||
|
if (flags & Display_Exit)
|
||||||
{
|
{
|
||||||
keys |= (1<<option++);
|
keys |= (1<<option++);
|
||||||
if (m_AutoColors)
|
|
||||||
{
|
|
||||||
_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_EXIT)].c_str()
|
||||||
m_OptNames[abs(MENU_EXIT)].c_str());
|
);
|
||||||
} else {
|
|
||||||
_snprintf(buffer,
|
|
||||||
sizeof(buffer)-1,
|
|
||||||
"%d. %s\n",
|
|
||||||
option == 10 ? 0 : option,
|
|
||||||
m_OptNames[abs(MENU_EXIT)].c_str());
|
|
||||||
}
|
|
||||||
m_Text.append(buffer);
|
m_Text.append(buffer);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_Text.c_str();
|
return m_Text.c_str();
|
||||||
@ -592,20 +426,25 @@ 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)
|
||||||
@ -685,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;
|
||||||
|
|
||||||
@ -843,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]);
|
||||||
@ -885,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:
|
||||||
@ -911,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:
|
||||||
@ -967,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++)
|
||||||
{
|
{
|
||||||
@ -1015,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;
|
||||||
}
|
}
|
||||||
|
@ -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,7 +49,6 @@
|
|||||||
#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);
|
||||||
|
|
||||||
@ -75,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);
|
||||||
@ -94,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;
|
||||||
|
@ -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},
|
|
||||||
};
|
|
@ -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_
|
|
@ -110,7 +110,7 @@ void _Setup_Optimizer_Stage2(AMX *amx, cell *oplist, cell *cip)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/* we don't do these yet because of radix stuff >:\ */
|
//we don't do these yet because of radix stuff >:\
|
||||||
//FIND_NATIVE("floatsin", N_Float_Sin);
|
//FIND_NATIVE("floatsin", N_Float_Sin);
|
||||||
//FIND_NATIVE("floatcos", N_Float_Cos);
|
//FIND_NATIVE("floatcos", N_Float_Cos);
|
||||||
//FIND_NATIVE("floattan", N_Float_Tan);
|
//FIND_NATIVE("floattan", N_Float_Tan);
|
||||||
|
@ -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
|
||||||
@ -2437,7 +2437,6 @@ static amxx_module_info_s g_ModuleInfo =
|
|||||||
|
|
||||||
// Storage for the requested functions
|
// Storage for the requested functions
|
||||||
PFN_ADD_NATIVES g_fn_AddNatives;
|
PFN_ADD_NATIVES g_fn_AddNatives;
|
||||||
PFN_ADD_NEW_NATIVES g_fn_AddNewNatives;
|
|
||||||
PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
||||||
PFN_BUILD_PATHNAME_R g_fn_BuildPathnameR;
|
PFN_BUILD_PATHNAME_R g_fn_BuildPathnameR;
|
||||||
PFN_GET_AMXADDR g_fn_GetAmxAddr;
|
PFN_GET_AMXADDR g_fn_GetAmxAddr;
|
||||||
@ -2516,7 +2515,6 @@ PFN_OVERRIDENATIVES g_fn_OverrideNatives;
|
|||||||
PFN_GETLOCALINFO g_fn_GetLocalInfo;
|
PFN_GETLOCALINFO g_fn_GetLocalInfo;
|
||||||
PFN_AMX_REREGISTER g_fn_AmxReRegister;
|
PFN_AMX_REREGISTER g_fn_AmxReRegister;
|
||||||
PFN_REGISTERFUNCTIONEX g_fn_RegisterFunctionEx;
|
PFN_REGISTERFUNCTIONEX g_fn_RegisterFunctionEx;
|
||||||
PFN_MESSAGE_BLOCK g_fn_MessageBlock;
|
|
||||||
|
|
||||||
// *** Exports ***
|
// *** Exports ***
|
||||||
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo)
|
||||||
@ -2593,7 +2591,6 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|||||||
|
|
||||||
// Natives / Forwards
|
// Natives / Forwards
|
||||||
REQFUNC("AddNatives", g_fn_AddNatives, PFN_ADD_NATIVES);
|
REQFUNC("AddNatives", g_fn_AddNatives, PFN_ADD_NATIVES);
|
||||||
REQFUNC("AddNewNatives", g_fn_AddNewNatives, PFN_ADD_NEW_NATIVES);
|
|
||||||
REQFUNC("RaiseAmxError", g_fn_RaiseAmxError, PFN_RAISE_AMXERROR);
|
REQFUNC("RaiseAmxError", g_fn_RaiseAmxError, PFN_RAISE_AMXERROR);
|
||||||
REQFUNC("RegisterForward", g_fn_RegisterForward, PFN_REGISTER_FORWARD);
|
REQFUNC("RegisterForward", g_fn_RegisterForward, PFN_REGISTER_FORWARD);
|
||||||
REQFUNC("RegisterSPForward", g_fn_RegisterSPForward, PFN_REGISTER_SPFORWARD);
|
REQFUNC("RegisterSPForward", g_fn_RegisterSPForward, PFN_REGISTER_SPFORWARD);
|
||||||
@ -2641,8 +2638,6 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc)
|
|||||||
REQFUNC("GetLocalInfo", g_fn_GetLocalInfo, PFN_GETLOCALINFO);
|
REQFUNC("GetLocalInfo", g_fn_GetLocalInfo, PFN_GETLOCALINFO);
|
||||||
REQFUNC("AmxReregister", g_fn_AmxReRegister, PFN_AMX_REREGISTER);
|
REQFUNC("AmxReregister", g_fn_AmxReRegister, PFN_AMX_REREGISTER);
|
||||||
|
|
||||||
REQFUNC("MessageBlock", g_fn_MessageBlock, PFN_MESSAGE_BLOCK);
|
|
||||||
|
|
||||||
#ifdef MEMORY_TEST
|
#ifdef MEMORY_TEST
|
||||||
// Memory
|
// Memory
|
||||||
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
|
REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR);
|
||||||
@ -2785,7 +2780,6 @@ void ValidateMacros_DontCallThis_Smiley()
|
|||||||
MF_AddLibraries(NULL, LibType_Class, NULL);
|
MF_AddLibraries(NULL, LibType_Class, NULL);
|
||||||
MF_RemoveLibraries(NULL);
|
MF_RemoveLibraries(NULL);
|
||||||
MF_OverrideNatives(NULL, NULL);
|
MF_OverrideNatives(NULL, NULL);
|
||||||
MF_MessageBlock(0, 0, NULL);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
#define DLLEXPORT __declspec(dllexport)
|
#define DLLEXPORT __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define DLLEXPORT __attribute__((visibility("default")))
|
#define DLLEXPORT
|
||||||
#define LINUX
|
#define LINUX
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1077,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
|
||||||
@ -1141,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
|
||||||
@ -1189,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
|
||||||
@ -1658,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
|
||||||
@ -1722,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
|
||||||
@ -1770,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
|
||||||
@ -2095,16 +2095,9 @@ enum LibType
|
|||||||
LibType_Class
|
LibType_Class
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MSGBLOCK_SET 0
|
|
||||||
#define MSGBLOCK_GET 1
|
|
||||||
#define BLOCK_NOT 0
|
|
||||||
#define BLOCK_ONCE 1
|
|
||||||
#define BLOCK_SET 2
|
|
||||||
|
|
||||||
typedef void (*AUTHORIZEFUNC)(int player, const char *authstring);
|
typedef void (*AUTHORIZEFUNC)(int player, const char *authstring);
|
||||||
|
|
||||||
typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/);
|
typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/);
|
||||||
typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/);
|
|
||||||
typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...);
|
typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...);
|
||||||
typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...);
|
typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...);
|
||||||
typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/);
|
typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/);
|
||||||
@ -2190,10 +2183,8 @@ typedef void (*PFN_OVERRIDENATIVES) (AMX_NATIVE_INFO * /*natives*/, const ch
|
|||||||
typedef const char * (*PFN_GETLOCALINFO) (const char * /*name*/, const char * /*def*/);
|
typedef const char * (*PFN_GETLOCALINFO) (const char * /*name*/, const char * /*def*/);
|
||||||
typedef int (*PFN_AMX_REREGISTER) (AMX * /*amx*/, AMX_NATIVE_INFO * /*list*/, int /*list*/);
|
typedef int (*PFN_AMX_REREGISTER) (AMX * /*amx*/, AMX_NATIVE_INFO * /*list*/, int /*list*/);
|
||||||
typedef void * (*PFN_REGISTERFUNCTIONEX) (void * /*pfn*/, const char * /*desc*/);
|
typedef void * (*PFN_REGISTERFUNCTIONEX) (void * /*pfn*/, const char * /*desc*/);
|
||||||
typedef void (*PFN_MESSAGE_BLOCK) (int /* mode */, int /* message */, int * /* opt */);
|
|
||||||
|
|
||||||
extern PFN_ADD_NATIVES g_fn_AddNatives;
|
extern PFN_ADD_NATIVES g_fn_AddNatives;
|
||||||
extern PFN_ADD_NEW_NATIVES g_fn_AddNewNatives;
|
|
||||||
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
extern PFN_BUILD_PATHNAME g_fn_BuildPathname;
|
||||||
extern PFN_BUILD_PATHNAME_R g_fn_BuildPathnameR;
|
extern PFN_BUILD_PATHNAME_R g_fn_BuildPathnameR;
|
||||||
extern PFN_GET_AMXADDR g_fn_GetAmxAddr;
|
extern PFN_GET_AMXADDR g_fn_GetAmxAddr;
|
||||||
@ -2266,13 +2257,11 @@ extern PFN_OVERRIDENATIVES g_fn_OverrideNatives;
|
|||||||
extern PFN_GETLOCALINFO g_fn_GetLocalInfo;
|
extern PFN_GETLOCALINFO g_fn_GetLocalInfo;
|
||||||
extern PFN_AMX_REREGISTER g_fn_AmxReRegister;
|
extern PFN_AMX_REREGISTER g_fn_AmxReRegister;
|
||||||
extern PFN_REGISTERFUNCTIONEX g_fn_RegisterFunctionEx;
|
extern PFN_REGISTERFUNCTIONEX g_fn_RegisterFunctionEx;
|
||||||
extern PFN_MESSAGE_BLOCK g_fn_MessageBlock;
|
|
||||||
|
|
||||||
#ifdef MAY_NEVER_BE_DEFINED
|
#ifdef MAY_NEVER_BE_DEFINED
|
||||||
// Function prototypes for intellisense and similar systems
|
// Function prototypes for intellisense and similar systems
|
||||||
// They understand #if 0 so we use #ifdef MAY_NEVER_BE_DEFINED
|
// They understand #if 0 so we use #ifdef MAY_NEVER_BE_DEFINED
|
||||||
int MF_AddNatives (const AMX_NATIVE_INFO *list) { }
|
int MF_AddNatives (const AMX_NATIVE_INFO *list) { }
|
||||||
int MF_AddNewNatives (const AMX_NATIVE_INFO *list) { }
|
|
||||||
char * MF_BuildPathname (const char * format, ...) { }
|
char * MF_BuildPathname (const char * format, ...) { }
|
||||||
char * MF_BuildPathnameR (char *buffer, size_t maxlen, const char *fmt, ...) { }
|
char * MF_BuildPathnameR (char *buffer, size_t maxlen, const char *fmt, ...) { }
|
||||||
cell * MF_GetAmxAddr (AMX * amx, cell offset) { }
|
cell * MF_GetAmxAddr (AMX * amx, cell offset) { }
|
||||||
@ -2339,11 +2328,9 @@ void MF_OverrideNatives (AMX_NATIVE_INFO *natives, const char *myname) { }
|
|||||||
const char * MF_GetLocalInfo (const char *name, const char *def) { }
|
const char * MF_GetLocalInfo (const char *name, const char *def) { }
|
||||||
int MF_AmxReRegister (AMX *amx, AMX_NATIVE_INFO *list, int number) { return 0; }
|
int MF_AmxReRegister (AMX *amx, AMX_NATIVE_INFO *list, int number) { return 0; }
|
||||||
void * MF_RegisterFunctionEx (void *pfn, const char *description) { }
|
void * MF_RegisterFunctionEx (void *pfn, const char *description) { }
|
||||||
void * MF_MessageBlock (int mode, int msg, int *opt) { }
|
|
||||||
#endif // MAY_NEVER_BE_DEFINED
|
#endif // MAY_NEVER_BE_DEFINED
|
||||||
|
|
||||||
#define MF_AddNatives g_fn_AddNatives
|
#define MF_AddNatives g_fn_AddNatives
|
||||||
#define MF_AddNewNatives g_fn_AddNewNatives
|
|
||||||
#define MF_BuildPathname g_fn_BuildPathname
|
#define MF_BuildPathname g_fn_BuildPathname
|
||||||
#define MF_BuildPathnameR g_fn_BuildPathnameR
|
#define MF_BuildPathnameR g_fn_BuildPathnameR
|
||||||
#define MF_FormatAmxString g_fn_FormatAmxString
|
#define MF_FormatAmxString g_fn_FormatAmxString
|
||||||
@ -2417,7 +2404,6 @@ void MF_LogError(AMX *amx, int err, const char *fmt, ...);
|
|||||||
#define MF_GetLocalInfo g_fn_GetLocalInfo
|
#define MF_GetLocalInfo g_fn_GetLocalInfo
|
||||||
#define MF_AmxReRegister g_fn_AmxReRegister
|
#define MF_AmxReRegister g_fn_AmxReRegister
|
||||||
#define MF_RegisterFunctionEx g_fn_RegisterFunctionEx
|
#define MF_RegisterFunctionEx g_fn_RegisterFunctionEx
|
||||||
#define MF_MessageBlock g_fn_MessageBlock
|
|
||||||
|
|
||||||
#ifdef MEMORY_TEST
|
#ifdef MEMORY_TEST
|
||||||
/*** Memory ***/
|
/*** Memory ***/
|
||||||
|
@ -1,360 +0,0 @@
|
|||||||
#include "amxmodx.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/***********************************
|
|
||||||
* About the double array hack *
|
|
||||||
***************************
|
|
||||||
|
|
||||||
Double arrays in Pawn are vectors offset by the current offset. For example:
|
|
||||||
|
|
||||||
new array[2][2]
|
|
||||||
|
|
||||||
In this array, index 0 contains the offset from the current offset which
|
|
||||||
results in the final vector [2] (at [0][2]). Meaning, to dereference [1][2],
|
|
||||||
it is equivalent to:
|
|
||||||
|
|
||||||
address = &array[1] + array[1] + 2 * sizeof(cell)
|
|
||||||
|
|
||||||
The fact that each offset is from the _current_ position rather than the _base_
|
|
||||||
position is very important. It means that if you to try to swap vector positions,
|
|
||||||
the offsets will no longer match, because their current position has changed. A
|
|
||||||
simple and ingenious way around this is to back up the positions in a separate array,
|
|
||||||
then to overwrite each position in the old array with absolute indices. Pseudo C++ code:
|
|
||||||
|
|
||||||
cell *array; //assumed to be set to the 2+D array
|
|
||||||
cell *old_offsets = new cell[2];
|
|
||||||
for (int i=0; i<2; i++)
|
|
||||||
{
|
|
||||||
old_offsets = array[i];
|
|
||||||
array[i] = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
Now, you can swap the array indices with no problem, and do a reverse-lookup to find the original addresses.
|
|
||||||
After sorting/modification is done, you must relocate the new indices. For example, if the two vectors in our
|
|
||||||
demo array were swapped, array[0] would be 1 and array[1] would be 0. This is invalid to the virtual machine.
|
|
||||||
Luckily, this is also simple -- all the information is there.
|
|
||||||
|
|
||||||
for (int i=0; i<2; i++)
|
|
||||||
{
|
|
||||||
//get the # of the vector we want to relocate in
|
|
||||||
cell vector_index = array[i];
|
|
||||||
//get the real address of this vector
|
|
||||||
char *real_address = (char *)array + (vector_index * sizeof(cell)) + old_offsets[vector_index];
|
|
||||||
//calc and store the new distance offset
|
|
||||||
array[i] = real_address - ( (char *)array + (vector_index + sizeof(cell)) )
|
|
||||||
}
|
|
||||||
|
|
||||||
Note that the inner expression can be heavily reduced; it is expanded for readability.
|
|
||||||
**********************************/
|
|
||||||
|
|
||||||
enum SortOrder
|
|
||||||
{
|
|
||||||
Sort_Ascending = 0,
|
|
||||||
Sort_Descending = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
int sort_ints_asc(const void *int1, const void *int2)
|
|
||||||
{
|
|
||||||
return (*(int *)int1) - (*(int *)int2);
|
|
||||||
}
|
|
||||||
|
|
||||||
int sort_ints_desc(const void *int1, const void *int2)
|
|
||||||
{
|
|
||||||
return (*(int *)int2) - (*(int *)int1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL SortIntegers(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
cell *array = get_amxaddr(amx, params[1]);
|
|
||||||
cell array_size = params[2];
|
|
||||||
cell type = params[3];
|
|
||||||
|
|
||||||
if (type == Sort_Ascending)
|
|
||||||
{
|
|
||||||
qsort(array, array_size, sizeof(cell), sort_ints_asc);
|
|
||||||
} else {
|
|
||||||
qsort(array, array_size, sizeof(cell), sort_ints_desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sort_floats_asc(const void *float1, const void *float2)
|
|
||||||
{
|
|
||||||
REAL r1 = *(REAL *)float1;
|
|
||||||
REAL r2 = *(REAL *)float2;
|
|
||||||
|
|
||||||
if (r1 < r2)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
} else if (r2 < r1) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int sort_floats_desc(const void *float1, const void *float2)
|
|
||||||
{
|
|
||||||
REAL r1 = *(REAL *)float1;
|
|
||||||
REAL r2 = *(REAL *)float2;
|
|
||||||
|
|
||||||
if (r1 < r2)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
} else if (r2 < r1) {
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL SortFloats(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
cell *array = get_amxaddr(amx, params[1]);
|
|
||||||
cell array_size = params[2];
|
|
||||||
cell type = params[3];
|
|
||||||
|
|
||||||
if (type == Sort_Ascending)
|
|
||||||
{
|
|
||||||
qsort(array, array_size, sizeof(cell), sort_floats_asc);
|
|
||||||
} else {
|
|
||||||
qsort(array, array_size, sizeof(cell), sort_floats_desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell *g_CurStringArray = NULL;
|
|
||||||
static cell *g_CurRebaseMap = NULL;
|
|
||||||
|
|
||||||
int sort_strings_asc(const void *blk1, const void *blk2)
|
|
||||||
{
|
|
||||||
cell reloc1 = *(cell *)blk1;
|
|
||||||
cell reloc2 = *(cell *)blk2;
|
|
||||||
|
|
||||||
register cell *str1 = (cell *)((char *)(&g_CurStringArray[reloc1]) + g_CurRebaseMap[reloc1]);
|
|
||||||
register cell *str2 = (cell *)((char *)(&g_CurStringArray[reloc2]) + g_CurRebaseMap[reloc2]);
|
|
||||||
|
|
||||||
while (*str1 == *str2++)
|
|
||||||
{
|
|
||||||
if (*str1++ == 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (*str1 - *(str2 - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
int sort_strings_desc(const void *blk1, const void *blk2)
|
|
||||||
{
|
|
||||||
cell reloc1 = *(cell *)blk1;
|
|
||||||
cell reloc2 = *(cell *)blk2;
|
|
||||||
|
|
||||||
register cell *str1 = (cell *)((char *)(&g_CurStringArray[reloc1]) + g_CurRebaseMap[reloc1]);
|
|
||||||
register cell *str2 = (cell *)((char *)(&g_CurStringArray[reloc2]) + g_CurRebaseMap[reloc2]);
|
|
||||||
|
|
||||||
while (*str1 == *str2++)
|
|
||||||
{
|
|
||||||
if (*str1++ == 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (*(str2 - 1) - *str1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL SortStrings(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
cell *array = get_amxaddr(amx, params[1]);
|
|
||||||
cell array_size = params[2];
|
|
||||||
cell type = params[3];
|
|
||||||
|
|
||||||
/** HACKHACK - back up the old indices, replace the indices with something easier */
|
|
||||||
cell amx_addr, *phys_addr;
|
|
||||||
int err;
|
|
||||||
if ((err=amx_Allot(amx, array_size, &amx_addr, &phys_addr)) != AMX_ERR_NONE)
|
|
||||||
{
|
|
||||||
LogError(amx, err, "Ran out of memory");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_CurStringArray = array;
|
|
||||||
g_CurRebaseMap = phys_addr;
|
|
||||||
|
|
||||||
for (int i=0; i<array_size; i++)
|
|
||||||
{
|
|
||||||
phys_addr[i] = array[i];
|
|
||||||
array[i] = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type == Sort_Ascending)
|
|
||||||
{
|
|
||||||
qsort(array, array_size, sizeof(cell), sort_strings_asc);
|
|
||||||
} else {
|
|
||||||
qsort(array, array_size, sizeof(cell), sort_strings_desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* END HACKHACK - restore what we damaged so Pawn doesn't throw up.
|
|
||||||
* We'll browse through each index of the array and patch up the distance.
|
|
||||||
*/
|
|
||||||
for (int i=0; i<array_size; i++)
|
|
||||||
{
|
|
||||||
/* Compute the final address of the old array and subtract the new location.
|
|
||||||
* This is the fixed up distance.
|
|
||||||
*/
|
|
||||||
array[i] = ((char *)&array[array[i]] + phys_addr[array[i]]) - (char *)&array[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
amx_Release(amx, amx_addr);
|
|
||||||
|
|
||||||
g_CurStringArray = NULL;
|
|
||||||
g_CurRebaseMap = NULL;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sort_info
|
|
||||||
{
|
|
||||||
int pfn;
|
|
||||||
cell data_addr;
|
|
||||||
cell data_size;
|
|
||||||
cell array_addr;
|
|
||||||
cell *array_base;
|
|
||||||
cell *array_remap;
|
|
||||||
AMX *amx;
|
|
||||||
};
|
|
||||||
|
|
||||||
static CStack<sort_info *> g_AMXSortStack;
|
|
||||||
|
|
||||||
int sort1d_amx_custom(const void *elem1, const void *elem2)
|
|
||||||
{
|
|
||||||
cell c1 = *(cell *)elem1;
|
|
||||||
cell c2 = *(cell *)elem2;
|
|
||||||
sort_info *pInfo = g_AMXSortStack.front();
|
|
||||||
|
|
||||||
return executeForwards(pInfo->pfn, c1, c2, pInfo->array_addr, pInfo->data_addr, pInfo->data_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL SortCustom1D(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
cell *array = get_amxaddr(amx, params[1]);
|
|
||||||
cell array_size = params[2];
|
|
||||||
int len;
|
|
||||||
const char *funcname = get_amxstring(amx, params[3], 0, len);
|
|
||||||
|
|
||||||
int pfn = registerSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
|
||||||
if (pfn < 0)
|
|
||||||
{
|
|
||||||
LogError(amx, AMX_ERR_NATIVE, "The public function \"%s\" was not found.", funcname);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
sort_info *pInfo = new sort_info;
|
|
||||||
|
|
||||||
pInfo->pfn = pfn;
|
|
||||||
pInfo->data_addr = params[4];
|
|
||||||
pInfo->data_size = params[5];
|
|
||||||
pInfo->array_addr = params[1];
|
|
||||||
pInfo->array_remap = NULL;
|
|
||||||
pInfo->array_base = NULL;
|
|
||||||
|
|
||||||
g_AMXSortStack.push(pInfo);
|
|
||||||
qsort(array, array_size, sizeof(cell), sort1d_amx_custom);
|
|
||||||
g_AMXSortStack.pop();
|
|
||||||
|
|
||||||
unregisterSPForward(pfn);
|
|
||||||
delete pInfo;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sort2d_amx_custom(const void *elem1, const void *elem2)
|
|
||||||
{
|
|
||||||
cell c1 = *(cell *)elem1;
|
|
||||||
cell c2 = *(cell *)elem2;
|
|
||||||
sort_info *pInfo = g_AMXSortStack.front();
|
|
||||||
|
|
||||||
cell c1_addr = pInfo->array_addr + (c1 * sizeof(cell)) + pInfo->array_remap[c1];
|
|
||||||
cell c2_addr = pInfo->array_addr + (c2 * sizeof(cell)) + pInfo->array_remap[c2];
|
|
||||||
|
|
||||||
//cell *c1_r = get_amxaddr(pInfo->amx, c1_addr);
|
|
||||||
//cell *c2_r = get_amxaddr(pInfo->amx, c2_addr);
|
|
||||||
|
|
||||||
return executeForwards(pInfo->pfn, c1_addr, c2_addr, pInfo->array_addr, pInfo->data_addr, pInfo->data_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL SortCustom2D(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
cell *array = get_amxaddr(amx, params[1]);
|
|
||||||
cell array_size = params[2];
|
|
||||||
int len;
|
|
||||||
const char *funcname = get_amxstring(amx, params[3], 0, len);
|
|
||||||
|
|
||||||
/** back up the old indices, replace the indices with something easier */
|
|
||||||
cell amx_addr, *phys_addr;
|
|
||||||
int err;
|
|
||||||
if ((err=amx_Allot(amx, array_size, &amx_addr, &phys_addr)) != AMX_ERR_NONE)
|
|
||||||
{
|
|
||||||
LogError(amx, err, "Ran out of memory");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int pfn = registerSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
|
|
||||||
if (pfn < 0)
|
|
||||||
{
|
|
||||||
amx_Release(amx, amx_addr);
|
|
||||||
LogError(amx, AMX_ERR_NATIVE, "The public function \"%s\" was not found.", funcname);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
sort_info *pInfo = new sort_info;
|
|
||||||
|
|
||||||
pInfo->pfn = pfn;
|
|
||||||
pInfo->data_addr = params[4];
|
|
||||||
pInfo->data_size = params[5];
|
|
||||||
pInfo->array_addr = params[1];
|
|
||||||
pInfo->amx = amx;
|
|
||||||
|
|
||||||
/** Same process as in strings, back up the old indices for later fixup */
|
|
||||||
pInfo->array_base = array;
|
|
||||||
pInfo->array_remap = phys_addr;
|
|
||||||
|
|
||||||
for (int i=0; i<array_size; i++)
|
|
||||||
{
|
|
||||||
phys_addr[i] = array[i];
|
|
||||||
array[i] = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_AMXSortStack.push(pInfo);
|
|
||||||
qsort(array, array_size, sizeof(cell), sort2d_amx_custom);
|
|
||||||
g_AMXSortStack.pop();
|
|
||||||
|
|
||||||
/** Fixup process! */
|
|
||||||
for (int i=0; i<array_size; i++)
|
|
||||||
{
|
|
||||||
/* Compute the final address of the old array and subtract the new location.
|
|
||||||
* This is the fixed up distance.
|
|
||||||
*/
|
|
||||||
array[i] = ((char *)&array[array[i]] + phys_addr[array[i]]) - (char *)&array[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
amx_Release(amx, amx_addr);
|
|
||||||
unregisterSPForward(pInfo->pfn);
|
|
||||||
delete pInfo;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
AMX_NATIVE_INFO g_SortNatives[] =
|
|
||||||
{
|
|
||||||
{"SortIntegers", SortIntegers},
|
|
||||||
{"SortFloats", SortFloats},
|
|
||||||
{"SortStrings", SortStrings},
|
|
||||||
{"SortCustom1D", SortCustom1D},
|
|
||||||
{"SortCustom2D", SortCustom2D},
|
|
||||||
|
|
||||||
{NULL, NULL},
|
|
||||||
};
|
|
@ -39,7 +39,7 @@ void amx_command()
|
|||||||
{
|
{
|
||||||
|
|
||||||
print_srvconsole("Currently loaded plugins:\n");
|
print_srvconsole("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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,29 +82,13 @@ void amx_command()
|
|||||||
CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin);
|
CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin);
|
||||||
|
|
||||||
if (plugin && plugin->isValid())
|
if (plugin && plugin->isValid())
|
||||||
{
|
|
||||||
if (plugin->isPaused())
|
|
||||||
{
|
|
||||||
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();
|
plugin->pausePlugin();
|
||||||
print_srvconsole("Paused plugin \"%s\"\n", plugin->getName());
|
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)
|
||||||
{
|
{
|
||||||
const char* sPlugin = CMD_ARGV(2);
|
const char* sPlugin = CMD_ARGV(2);
|
||||||
@ -112,22 +96,15 @@ void amx_command()
|
|||||||
CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin);
|
CPluginMngr::CPlugin *plugin = g_plugins.findPlugin(sPlugin);
|
||||||
|
|
||||||
if (plugin && plugin->isValid() && plugin->isPaused())
|
if (plugin && plugin->isValid() && plugin->isPaused())
|
||||||
{
|
|
||||||
if (plugin->isStopped())
|
|
||||||
{
|
|
||||||
print_srvconsole("Plugin \"%s\" is stopped and may not be unpaused.\n", plugin->getName());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
plugin->unpausePlugin();
|
plugin->unpausePlugin();
|
||||||
print_srvconsole("Unpaused plugin \"%s\"\n", plugin->getName());
|
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,25 +114,10 @@ void amx_command()
|
|||||||
|
|
||||||
int ammount = 0;
|
int ammount = 0;
|
||||||
|
|
||||||
if (CMD_ARGC() > 2) // Searching for cvars registered to a plugin
|
|
||||||
{
|
|
||||||
const char* targetname = CMD_ARGV(2);
|
|
||||||
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)
|
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(" [%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,38 +131,22 @@ 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
|
|
||||||
{
|
|
||||||
const char* targetname = CMD_ARGV(2);
|
|
||||||
size_t len = strlen(targetname);
|
|
||||||
while (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)
|
while (a)
|
||||||
{
|
{
|
||||||
UTIL_GetFlags(access, (*a).getFlags());
|
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());
|
print_srvconsole(" [%3d] %-24.23s %-16.15s %-8.7s %-16.15s\n", ++ammount, (*a).getCmdLine(), access, (*a).getCmdType(), (*a).getPlugin()->getName());
|
||||||
++a;
|
++a;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
print_srvconsole("%d commands\n",ammount);
|
print_srvconsole("%d commands\n",ammount);
|
||||||
}
|
}
|
||||||
else if (!strcmp(cmd, "version"))
|
else if (!strcmp(cmd, "version"))
|
||||||
{
|
{
|
||||||
print_srvconsole("%s %s (%s)\n", Plugin_info.name, Plugin_info.version, Plugin_info.url);
|
print_srvconsole("%s %s (%s)\n", Plugin_info.name, Plugin_info.version, Plugin_info.url);
|
||||||
print_srvconsole("Authors:\n\tDavid \"BAILOPAN\" Anderson, Pavol \"PM OnoTo\" Marko\n");
|
print_srvconsole("Authors: David \"BAILOPAN\" Anderson, Pavol \"PM OnoTo\" Marko\n");
|
||||||
print_srvconsole("\tFelix \"SniperBeamer\" Geyer, Jonny \"Got His Gun\" Bergstrom\n");
|
print_srvconsole("\tFelix \"SniperBeamer\" Geyer, Jonny \"Got His Gun\" Bergstrom\n");
|
||||||
print_srvconsole("\tLukasz \"SidLuke\" Wlasinski, Christian \"Basic-Master\" Hammacher\n");
|
print_srvconsole("\tLukasz \"SidLuke\" Wlasinski, Christian \"Basic-Master\" Hammacher\n");
|
||||||
print_srvconsole("\tBorja \"faluco\" Ferrer, Scott \"Damaged Soul\" Ehlert\n");
|
print_srvconsole("\tBorja \"faluco\" Ferrer\n");
|
||||||
print_srvconsole("Compiled: %s\n", __DATE__ ", " __TIME__);
|
print_srvconsole("Compiled: %s\n", __DATE__ ", " __TIME__);
|
||||||
#if defined JIT && !defined ASM32
|
#if defined JIT && !defined ASM32
|
||||||
print_srvconsole("Core mode: JIT Only\n");
|
print_srvconsole("Core mode: JIT Only\n");
|
||||||
@ -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");
|
||||||
}
|
}
|
||||||
@ -307,6 +253,7 @@ void amx_command()
|
|||||||
|
|
||||||
void plugin_srvcmd()
|
void plugin_srvcmd()
|
||||||
{
|
{
|
||||||
|
cell ret = 0;
|
||||||
const char* cmd = CMD_ARGV(0);
|
const char* cmd = CMD_ARGV(0);
|
||||||
|
|
||||||
CmdMngr::iterator a = g_commands.srvcmdbegin();
|
CmdMngr::iterator a = g_commands.srvcmdbegin();
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
#include "binlog.h"
|
#include "binlog.h"
|
||||||
#include "amxmod_compat.h"
|
|
||||||
|
|
||||||
const char* stristr(const char* str, const char* substr)
|
const char* stristr(const char* str, const char* substr)
|
||||||
{
|
{
|
||||||
@ -116,21 +115,8 @@ extern "C" size_t get_amxstring_r(AMX *amx, cell amx_addr, char *destination, in
|
|||||||
register char *dest = destination;
|
register char *dest = destination;
|
||||||
char *start = dest;
|
char *start = dest;
|
||||||
|
|
||||||
if ( (amx->flags & AMX_FLAG_OLDFILE) &&
|
|
||||||
(*source & BCOMPAT_TRANSLATE_BITS) )
|
|
||||||
{
|
|
||||||
const char *def, *key;
|
|
||||||
if (!translate_bcompat(amx, source, &key, &def))
|
|
||||||
{
|
|
||||||
goto normal_string;
|
|
||||||
}
|
|
||||||
while (maxlen-- && *def)
|
|
||||||
*dest++=(*source++);
|
|
||||||
} else {
|
|
||||||
normal_string:
|
|
||||||
while (maxlen-- && *source)
|
while (maxlen-- && *source)
|
||||||
*dest++=(char)(*source++);
|
*dest++=(char)(*source++);
|
||||||
}
|
|
||||||
|
|
||||||
*dest = '\0';
|
*dest = '\0';
|
||||||
|
|
||||||
@ -153,22 +139,9 @@ char *get_amxstring(AMX *amx, cell amx_addr, int id, int& len)
|
|||||||
register char* dest = buffor[id];
|
register char* dest = buffor[id];
|
||||||
char* start = dest;
|
char* start = dest;
|
||||||
|
|
||||||
if ( (amx->flags & AMX_FLAG_OLDFILE) &&
|
|
||||||
(*source & BCOMPAT_TRANSLATE_BITS) )
|
|
||||||
{
|
|
||||||
const char *def, *key;
|
|
||||||
if (!translate_bcompat(amx, source, &key, &def))
|
|
||||||
{
|
|
||||||
goto normal_string;
|
|
||||||
}
|
|
||||||
while ( (*dest++ = (*def++)) );
|
|
||||||
len = --dest - start;
|
|
||||||
} else {
|
|
||||||
normal_string:
|
|
||||||
while ((*dest++=(char)(*source++)));
|
while ((*dest++=(char)(*source++)));
|
||||||
|
|
||||||
len = --dest - start;
|
len = --dest - start;
|
||||||
}
|
|
||||||
|
|
||||||
#if defined BINLOG_ENABLED
|
#if defined BINLOG_ENABLED
|
||||||
if (g_binlog_level & 2)
|
if (g_binlog_level & 2)
|
||||||
@ -443,43 +416,16 @@ static cell AMX_NATIVE_CALL add(AMX *amx, cell *params) /* 4 param */
|
|||||||
static cell AMX_NATIVE_CALL copy(AMX *amx, cell *params) /* 4 param */
|
static cell AMX_NATIVE_CALL copy(AMX *amx, cell *params) /* 4 param */
|
||||||
{
|
{
|
||||||
cell *src = get_amxaddr(amx, params[3]);
|
cell *src = get_amxaddr(amx, params[3]);
|
||||||
|
cell *dest = get_amxaddr(amx, params[1]);
|
||||||
|
cell *start = dest;
|
||||||
int c = params[2];
|
int c = params[2];
|
||||||
|
|
||||||
if (amx->flags & AMX_FLAG_OLDFILE)
|
|
||||||
{
|
|
||||||
if (*src & BCOMPAT_TRANSLATE_BITS)
|
|
||||||
{
|
|
||||||
const char *key, *def;
|
|
||||||
if (!translate_bcompat(amx, src, &key, &def))
|
|
||||||
{
|
|
||||||
goto normal_string;
|
|
||||||
}
|
|
||||||
cell *dest = get_amxaddr(amx, params[1]);
|
|
||||||
cell *start = dest;
|
|
||||||
while (c-- && *def)
|
|
||||||
{
|
|
||||||
*dest++ = static_cast<cell>(*def++);
|
|
||||||
}
|
|
||||||
*dest = '\0';
|
|
||||||
|
|
||||||
return dest-start;
|
|
||||||
} else {
|
|
||||||
goto normal_string;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
normal_string:
|
|
||||||
cell *dest = get_amxaddr(amx, params[1]);
|
|
||||||
cell *start = dest;
|
|
||||||
|
|
||||||
while (c-- && *src)
|
while (c-- && *src)
|
||||||
{
|
|
||||||
*dest++ =* src++;
|
*dest++ =* src++;
|
||||||
}
|
*dest = 0;
|
||||||
*dest = '\0';
|
|
||||||
|
|
||||||
return (dest - start);
|
return (dest - start);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL copyc(AMX *amx, cell *params) /* 4 param */
|
static cell AMX_NATIVE_CALL copyc(AMX *amx, cell *params) /* 4 param */
|
||||||
{
|
{
|
||||||
@ -595,26 +541,7 @@ static cell AMX_NATIVE_CALL format(AMX *amx, cell *params) /* 3 param */
|
|||||||
if (copy)
|
if (copy)
|
||||||
buf = g_cpbuf;
|
buf = g_cpbuf;
|
||||||
int param = 4;
|
int param = 4;
|
||||||
size_t total = 0;
|
size_t total = atcprintf(buf, maxlen, fmt, amx, params, ¶m);
|
||||||
|
|
||||||
if (amx->flags & AMX_FLAG_OLDFILE)
|
|
||||||
{
|
|
||||||
if (*fmt & BCOMPAT_TRANSLATE_BITS)
|
|
||||||
{
|
|
||||||
const char *key, *def;
|
|
||||||
if (!translate_bcompat(amx, fmt, &key, &def))
|
|
||||||
{
|
|
||||||
goto normal_string;
|
|
||||||
}
|
|
||||||
total = atcprintf(buf, maxlen, def, amx, params, ¶m);
|
|
||||||
} else {
|
|
||||||
goto normal_string;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
normal_string:
|
|
||||||
total = atcprintf(buf, maxlen, fmt, amx, params, ¶m);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (copy)
|
if (copy)
|
||||||
{
|
{
|
||||||
/* copy back */
|
/* copy back */
|
||||||
@ -936,6 +863,7 @@ static cell AMX_NATIVE_CALL is_alpha(AMX *amx, cell *params)
|
|||||||
|
|
||||||
static cell AMX_NATIVE_CALL amx_ucfirst(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL amx_ucfirst(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
|
int len = 0;
|
||||||
cell *str = get_amxaddr(amx, params[1]);
|
cell *str = get_amxaddr(amx, params[1]);
|
||||||
|
|
||||||
if (!isalpha((char)str[0]) || !(str[0] & (1<<5)))
|
if (!isalpha((char)str[0]) || !(str[0] & (1<<5)))
|
||||||
@ -1016,6 +944,7 @@ static cell AMX_NATIVE_CALL n_strfind(AMX *amx, cell *params)
|
|||||||
int sublen;
|
int sublen;
|
||||||
char *sub = get_amxstring(amx, params[2], 1, sublen);
|
char *sub = get_amxstring(amx, params[2], 1, sublen);
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
bool igcase = params[3] ? true : false;
|
bool igcase = params[3] ? true : false;
|
||||||
|
|
||||||
if (igcase)
|
if (igcase)
|
||||||
@ -1035,6 +964,7 @@ static cell AMX_NATIVE_CALL n_strfind(AMX *amx, cell *params)
|
|||||||
if (params[4] > len)
|
if (params[4] > len)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
char *pos = &(str[params[4]]);
|
||||||
char *find = strstr(str, sub);
|
char *find = strstr(str, sub);
|
||||||
|
|
||||||
if (!find)
|
if (!find)
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
#ifndef _INCLUDE_SVN_VERSION_H_
|
|
||||||
#define _INCLUDE_SVN_VERSION_H_
|
|
||||||
|
|
||||||
#define SVN_VERSION_STRING "1.8.0.3660"
|
|
||||||
#define SVN_VERSION_DWORD 1,8,0,3660
|
|
||||||
#define SVN_VERSION_PRODUCT "1.8.0"
|
|
||||||
|
|
||||||
#endif //_INCLUDE_SVN_VERSION_H_
|
|
@ -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_
|
|
@ -32,7 +32,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
|
|
||||||
#if defined __linux__ && !defined _vsnprintf
|
#ifdef __linux__
|
||||||
#define _vsnprintf vsnprintf
|
#define _vsnprintf vsnprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -347,4 +347,3 @@ void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1,
|
|||||||
// unset the global "fake" flag
|
// unset the global "fake" flag
|
||||||
g_fakecmd.fake = false;
|
g_fakecmd.fake = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,13 +141,10 @@ static cell AMX_NATIVE_CALL angle_vector(AMX *amx, cell *params)
|
|||||||
{
|
{
|
||||||
case ANGLEVECTORS_FORWARD:
|
case ANGLEVECTORS_FORWARD:
|
||||||
v_return = v_forward;
|
v_return = v_forward;
|
||||||
break;
|
|
||||||
case ANGLEVECTORS_RIGHT:
|
case ANGLEVECTORS_RIGHT:
|
||||||
v_return = v_right;
|
v_return = v_right;
|
||||||
break;
|
|
||||||
case ANGLEVECTORS_UP:
|
case ANGLEVECTORS_UP:
|
||||||
v_return = v_up;
|
v_return = v_up;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vCell = get_amxaddr(amx,params[3]);
|
vCell = get_amxaddr(amx,params[3]);
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
// Microsoft Visual C++ generated resource script.
|
// Microsoft Visual C++ generated resource script.
|
||||||
//
|
//
|
||||||
|
|
||||||
#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 +26,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION SVN_VERSION_DWORD
|
FILEVERSION 1,7,5,0
|
||||||
PRODUCTVERSION SVN_VERSION_DWORD
|
PRODUCTVERSION 1,7,5,0
|
||||||
FILEFLAGSMASK 0x17L
|
FILEFLAGSMASK 0x17L
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@ -44,12 +44,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "Comments", "AMX Mod X"
|
VALUE "Comments", "AMX Mod X"
|
||||||
VALUE "FileDescription", "AMX Mod X"
|
VALUE "FileDescription", "AMX Mod X"
|
||||||
VALUE "FileVersion", SVN_VERSION_STRING
|
VALUE "FileVersion", "1.75"
|
||||||
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.75"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
### EDIT BELOW FOR OTHER PROJECTS ###
|
### EDIT BELOW FOR OTHER PROJECTS ###
|
||||||
|
|
||||||
OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing
|
OPT_FLAGS = -O3 -funroll-loops -s -pipe
|
||||||
DEBUG_FLAGS = -g -ggdb3
|
DEBUG_FLAGS = -g -ggdb3
|
||||||
CPP = gcc-4.1
|
CPP = gcc
|
||||||
BINARY = amxxpc
|
BINARY = amxxpc
|
||||||
|
|
||||||
OBJECTS = amx.cpp amxxpc.cpp Binary.cpp
|
OBJECTS = amx.cpp amxxpc.cpp Binary.cpp
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#ifndef _AMXXSC_INCLUDE_H
|
#ifndef _AMXXSC_INCLUDE_H
|
||||||
#define _AMXXSC_INCLUDE_H
|
#define _AMXXSC_INCLUDE_H
|
||||||
|
|
||||||
#define VERSION_STRING "1.76-300"
|
#define VERSION_STRING "1.75-300"
|
||||||
#define MAGIC_HEADER2 0x414D5858
|
#define MAGIC_HEADER2 0x414D5858
|
||||||
#define MAGIC_VERSION 0x0300
|
#define MAGIC_VERSION 0x0300
|
||||||
|
|
||||||
|
Binary file not shown.
@ -3,14 +3,13 @@
|
|||||||
|
|
||||||
### EDIT BELOW FOR OTHER PROJECTS ###
|
### EDIT BELOW FOR OTHER PROJECTS ###
|
||||||
|
|
||||||
OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -fvisibility=hidden
|
OPT_FLAGS = -O3 -funroll-loops -s -pipe
|
||||||
DEBUG_FLAGS = -g -ggdb3
|
DEBUG_FLAGS = -g -ggdb3
|
||||||
CPP = gcc-4.1
|
CPP = gcc
|
||||||
NAME = amxxpc
|
NAME = amxxpc
|
||||||
|
|
||||||
OBJECTS = sc1.c sc2.c sc3.c sc4.c sc5.c sc6.c sc7.c scvars.c scmemfil.c \
|
OBJECTS = sc1.c sc2.c sc3.c sc4.c sc5.c sc6.c sc7.c scvars.c scmemfil.c \
|
||||||
scstate.c sclist.c sci18n.c scexpand.c pawncc.c libpawnc.c prefix.c \
|
scstate.c sclist.c sci18n.c scexpand.c pawncc.c libpawnc.c prefix.c
|
||||||
memfile.c
|
|
||||||
|
|
||||||
LINK = -lpthread
|
LINK = -lpthread
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
__declspec (dllexport)
|
__declspec (dllexport)
|
||||||
void EXCOMPILER(int argc, char **argv)
|
void EXCOMPILER(int argc, char **argv)
|
||||||
# else
|
# else
|
||||||
void extern __attribute__((visibility("default"))) EXCOMPILER(int argc, char **argv)
|
void extern EXCOMPILER(int argc, char **argv)
|
||||||
# endif
|
# endif
|
||||||
{
|
{
|
||||||
pc_compile(argc, argv);
|
pc_compile(argc, argv);
|
||||||
@ -70,7 +70,7 @@
|
|||||||
__declspec (dllexport)
|
__declspec (dllexport)
|
||||||
int pc_printf(const char *message,...)
|
int pc_printf(const char *message,...)
|
||||||
#else
|
#else
|
||||||
extern int __attribute__((visibility("default"))) pc_printf(const char *message,...)
|
extern int pc_printf(const char *message,...)
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
int pc_printf(const char *message, ...)
|
int pc_printf(const char *message, ...)
|
||||||
|
@ -310,9 +310,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath=".\libpawnc.c">
|
RelativePath=".\libpawnc.c">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\memfile.c">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\sc1.c">
|
RelativePath=".\sc1.c">
|
||||||
</File>
|
</File>
|
||||||
@ -360,9 +357,6 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath=".\amx.h">
|
RelativePath=".\amx.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\memfile.h">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\sc.h">
|
RelativePath=".\sc.h">
|
||||||
</File>
|
</File>
|
||||||
|
@ -1,105 +0,0 @@
|
|||||||
#include "memfile.h"
|
|
||||||
#include <string.h>
|
|
||||||
#include "osdefs.h"
|
|
||||||
|
|
||||||
memfile_t *memfile_creat(const char *name, size_t init)
|
|
||||||
{
|
|
||||||
memfile_t mf;
|
|
||||||
memfile_t *pmf;
|
|
||||||
|
|
||||||
mf.size = init;
|
|
||||||
mf.base = (char *)malloc(init);
|
|
||||||
mf.usedoffs = 0;
|
|
||||||
if (!mf.base)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mf.offs = 0;
|
|
||||||
mf._static = 0;
|
|
||||||
|
|
||||||
pmf = (memfile_t *)malloc(sizeof(memfile_t));
|
|
||||||
memcpy(pmf, &mf, sizeof(memfile_t));
|
|
||||||
|
|
||||||
pmf->name = strdup(name);
|
|
||||||
|
|
||||||
return pmf;
|
|
||||||
}
|
|
||||||
|
|
||||||
void memfile_destroy(memfile_t *mf)
|
|
||||||
{
|
|
||||||
if (!mf->_static)
|
|
||||||
{
|
|
||||||
free(mf->name);
|
|
||||||
free(mf->base);
|
|
||||||
free(mf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void memfile_seek(memfile_t *mf, long seek)
|
|
||||||
{
|
|
||||||
mf->offs = seek;
|
|
||||||
}
|
|
||||||
|
|
||||||
long memfile_tell(memfile_t *mf)
|
|
||||||
{
|
|
||||||
return mf->offs;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t memfile_read(memfile_t *mf, void *buffer, size_t maxsize)
|
|
||||||
{
|
|
||||||
if (!maxsize || mf->offs >= mf->usedoffs)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mf->usedoffs - mf->offs < (long)maxsize)
|
|
||||||
{
|
|
||||||
maxsize = mf->usedoffs - mf->offs;
|
|
||||||
if (!maxsize)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(buffer, mf->base + mf->offs, maxsize);
|
|
||||||
|
|
||||||
mf->offs += maxsize;
|
|
||||||
|
|
||||||
return maxsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
int memfile_write(memfile_t *mf, void *buffer, size_t size)
|
|
||||||
{
|
|
||||||
if (mf->offs + size > mf->size)
|
|
||||||
{
|
|
||||||
size_t newsize = (mf->size + size) * 2;
|
|
||||||
if (mf->_static)
|
|
||||||
{
|
|
||||||
char *oldbase = mf->base;
|
|
||||||
mf->base = (char *)malloc(newsize);
|
|
||||||
if (!mf->base)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
memcpy(mf->base, oldbase, mf->size);
|
|
||||||
} else {
|
|
||||||
mf->base = (char *)realloc(mf->base, newsize);
|
|
||||||
if (!mf->base)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mf->_static = 0;
|
|
||||||
mf->size = newsize;
|
|
||||||
}
|
|
||||||
memcpy(mf->base + mf->offs, buffer, size);
|
|
||||||
mf->offs += size;
|
|
||||||
|
|
||||||
if (mf->offs > mf->usedoffs)
|
|
||||||
{
|
|
||||||
mf->usedoffs = mf->offs;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
#ifndef _INCLUDE_MEMFILE_H
|
|
||||||
#define _INCLUDE_MEMFILE_H
|
|
||||||
|
|
||||||
#include <malloc.h>
|
|
||||||
|
|
||||||
typedef struct memfile_s
|
|
||||||
{
|
|
||||||
char *name;
|
|
||||||
char *base;
|
|
||||||
long offs;
|
|
||||||
long usedoffs;
|
|
||||||
size_t size;
|
|
||||||
int _static;
|
|
||||||
} memfile_t;
|
|
||||||
|
|
||||||
memfile_t *memfile_creat(const char *name, size_t init);
|
|
||||||
void memfile_destroy(memfile_t *mf);
|
|
||||||
void memfile_seek(memfile_t *mf, long seek);
|
|
||||||
int memfile_write(memfile_t *mf, void *buffer, size_t size);
|
|
||||||
size_t memfile_read(memfile_t *mf, void *buffer, size_t maxsize);
|
|
||||||
long memfile_tell(memfile_t *mf);
|
|
||||||
|
|
||||||
#endif //_INCLUDE_MEMFILE_H
|
|
@ -446,7 +446,7 @@ int pc_enablewarning(int number,int enable);
|
|||||||
__declspec (dllexport)
|
__declspec (dllexport)
|
||||||
int pc_printf(const char *message,...);
|
int pc_printf(const char *message,...);
|
||||||
#else
|
#else
|
||||||
extern int __attribute__((visibility("default"))) pc_printf(const char *message,...);
|
extern int pc_printf(const char *message,...);
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
int pc_printf(const char *message, ...) INVISIBLE;
|
int pc_printf(const char *message, ...) INVISIBLE;
|
||||||
@ -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 */
|
||||||
|
@ -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,
|
||||||
@ -1405,8 +1403,6 @@ static void setconstants(void)
|
|||||||
|
|
||||||
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))
|
||||||
debug=2;
|
debug=2;
|
||||||
|
@ -1344,7 +1344,6 @@ 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:
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
@ -994,8 +993,6 @@ static int hier13(value *lval)
|
|||||||
value lval2 = {0};
|
value lval2 = {0};
|
||||||
int array1,array2;
|
int array1,array2;
|
||||||
|
|
||||||
int orig_heap=decl_heap;
|
|
||||||
int diff1=0,diff2=0;
|
|
||||||
if (lvalue) {
|
if (lvalue) {
|
||||||
rvalue(lval);
|
rvalue(lval);
|
||||||
} else if (lval->ident==iCONSTEXPR) {
|
} else if (lval->ident==iCONSTEXPR) {
|
||||||
@ -1012,10 +1009,6 @@ static int hier13(value *lval)
|
|||||||
sc_allowtags=(short)POPSTK_I(); /* restore */
|
sc_allowtags=(short)POPSTK_I(); /* restore */
|
||||||
jumplabel(flab2);
|
jumplabel(flab2);
|
||||||
setlabel(flab1);
|
setlabel(flab1);
|
||||||
if (orig_heap!=decl_heap) {
|
|
||||||
diff1=abs(decl_heap-orig_heap);
|
|
||||||
decl_heap=orig_heap;
|
|
||||||
}
|
|
||||||
needtoken(':');
|
needtoken(':');
|
||||||
if (hier13(&lval2))
|
if (hier13(&lval2))
|
||||||
rvalue(&lval2);
|
rvalue(&lval2);
|
||||||
@ -1038,15 +1031,6 @@ static int hier13(value *lval)
|
|||||||
lval->ident=iREFARRAY; /* iARRAY becomes iREFARRAY */
|
lval->ident=iREFARRAY; /* iARRAY becomes iREFARRAY */
|
||||||
else if (lval->ident!=iREFARRAY)
|
else if (lval->ident!=iREFARRAY)
|
||||||
lval->ident=iEXPRESSION; /* iREFARRAY stays iREFARRAY, rest becomes iEXPRESSION */
|
lval->ident=iEXPRESSION; /* iREFARRAY stays iREFARRAY, rest becomes iEXPRESSION */
|
||||||
if (orig_heap!=decl_heap) {
|
|
||||||
diff2=abs(decl_heap-orig_heap);
|
|
||||||
decl_heap=orig_heap;
|
|
||||||
}
|
|
||||||
if (diff1==diff2) {
|
|
||||||
decl_heap+=(diff1/2);
|
|
||||||
} else {
|
|
||||||
decl_heap+=(diff1+diff2);
|
|
||||||
}
|
|
||||||
return FALSE; /* conditional expression is no lvalue */
|
return FALSE; /* conditional expression is no lvalue */
|
||||||
} else {
|
} else {
|
||||||
return lvalue;
|
return lvalue;
|
||||||
|
@ -236,15 +236,6 @@ static stringlist includepaths = {NULL, NULL}; /* directory list for include fi
|
|||||||
|
|
||||||
SC_FUNC stringlist *insert_path(char *path)
|
SC_FUNC stringlist *insert_path(char *path)
|
||||||
{
|
{
|
||||||
char *extra_path = malloc(strlen(path) + 16);
|
|
||||||
strcpy(extra_path, path);
|
|
||||||
#if defined __linux__
|
|
||||||
strcat(extra_path, "/amxmod_compat/");
|
|
||||||
#else if defined WIN32 || defined _WIN32
|
|
||||||
strcat(extra_path, "\\amxmod_compat\\");
|
|
||||||
#endif
|
|
||||||
insert_string(&includepaths, extra_path);
|
|
||||||
free(extra_path);
|
|
||||||
return insert_string(&includepaths,path);
|
return insert_string(&includepaths,path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "memfile.h"
|
|
||||||
|
|
||||||
#if defined FORTIFY
|
#if defined FORTIFY
|
||||||
#include "fortify.h"
|
#include "fortify.h"
|
||||||
@ -45,7 +44,11 @@
|
|||||||
* buffer points to the "file name"
|
* buffer points to the "file name"
|
||||||
* bufpos is the current "file pointer"
|
* bufpos is the current "file pointer"
|
||||||
*/
|
*/
|
||||||
typedef memfile_t MEMFILE;
|
typedef struct tagMEMFILE {
|
||||||
|
struct tagMEMFILE *next;
|
||||||
|
unsigned char *buffer;
|
||||||
|
long bufpos;
|
||||||
|
} MEMFILE;
|
||||||
#define tMEMFILE 1
|
#define tMEMFILE 1
|
||||||
|
|
||||||
#include "sc.h"
|
#include "sc.h"
|
||||||
@ -53,12 +56,33 @@ typedef memfile_t MEMFILE;
|
|||||||
|
|
||||||
MEMFILE *mfcreate(char *filename)
|
MEMFILE *mfcreate(char *filename)
|
||||||
{
|
{
|
||||||
return memfile_creat(filename, 4096);
|
MEMFILE *mf;
|
||||||
|
|
||||||
|
/* create a first block that only holds the name */
|
||||||
|
mf=(MEMFILE*)malloc(sizeof(MEMFILE));
|
||||||
|
if (mf==NULL)
|
||||||
|
return NULL;
|
||||||
|
memset(mf,0,sizeof(MEMFILE));
|
||||||
|
mf->buffer=(unsigned char*)strdup(filename);
|
||||||
|
if (mf->buffer==NULL) {
|
||||||
|
free(mf);
|
||||||
|
return NULL;
|
||||||
|
} /* if */
|
||||||
|
return mf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mfclose(MEMFILE *mf)
|
void mfclose(MEMFILE *mf)
|
||||||
{
|
{
|
||||||
memfile_destroy(mf);
|
MEMFILE *next;
|
||||||
|
|
||||||
|
assert(mf!=NULL);
|
||||||
|
while (mf!=NULL) {
|
||||||
|
next=mf->next;
|
||||||
|
assert(mf->buffer!=NULL);
|
||||||
|
free(mf->buffer);
|
||||||
|
free(mf);
|
||||||
|
mf=next;
|
||||||
|
} /* while */
|
||||||
}
|
}
|
||||||
|
|
||||||
int mfdump(MEMFILE *mf)
|
int mfdump(MEMFILE *mf)
|
||||||
@ -68,12 +92,19 @@ int mfdump(MEMFILE *mf)
|
|||||||
|
|
||||||
assert(mf!=NULL);
|
assert(mf!=NULL);
|
||||||
/* create the file */
|
/* create the file */
|
||||||
fp=fopen(mf->name, "wb");
|
fp=fopen((char*)mf->buffer,"wb");
|
||||||
if (fp==NULL)
|
if (fp==NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
okay=1;
|
okay=1;
|
||||||
okay = okay & (fwrite(mf->base, mf->usedoffs, 1, fp)==(size_t)mf->usedoffs);
|
mf=mf->next;
|
||||||
|
while (mf!=NULL) {
|
||||||
|
assert(mf->buffer!=NULL);
|
||||||
|
/* all blocks except the last should be fully filled */
|
||||||
|
assert(mf->next==NULL || (unsigned long)mf->bufpos==BUFFERSIZE);
|
||||||
|
okay=okay && fwrite(mf->buffer,1,(size_t)mf->bufpos,fp)==(size_t)mf->bufpos;
|
||||||
|
mf=mf->next;
|
||||||
|
} /* while */
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return okay;
|
return okay;
|
||||||
@ -81,7 +112,19 @@ int mfdump(MEMFILE *mf)
|
|||||||
|
|
||||||
long mflength(MEMFILE *mf)
|
long mflength(MEMFILE *mf)
|
||||||
{
|
{
|
||||||
return mf->usedoffs;
|
long length;
|
||||||
|
|
||||||
|
assert(mf!=NULL);
|
||||||
|
/* find the size of the memory file */
|
||||||
|
length=0L;
|
||||||
|
mf=mf->next; /* skip initial block */
|
||||||
|
while (mf!=NULL) {
|
||||||
|
assert(mf->next==NULL || (unsigned long)mf->bufpos==BUFFERSIZE);
|
||||||
|
length+=mf->bufpos;
|
||||||
|
mf=mf->next;
|
||||||
|
} /* while */
|
||||||
|
|
||||||
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
long mfseek(MEMFILE *mf,long offset,int whence)
|
long mfseek(MEMFILE *mf,long offset,int whence)
|
||||||
@ -89,7 +132,7 @@ long mfseek(MEMFILE *mf,long offset,int whence)
|
|||||||
long length;
|
long length;
|
||||||
|
|
||||||
assert(mf!=NULL);
|
assert(mf!=NULL);
|
||||||
if (mf->usedoffs == 0)
|
if (mf->next==NULL)
|
||||||
return 0L; /* early exit: not a single byte in the file */
|
return 0L; /* early exit: not a single byte in the file */
|
||||||
|
|
||||||
/* find the size of the memory file */
|
/* find the size of the memory file */
|
||||||
@ -100,7 +143,7 @@ long mfseek(MEMFILE *mf,long offset,int whence)
|
|||||||
case SEEK_SET:
|
case SEEK_SET:
|
||||||
break;
|
break;
|
||||||
case SEEK_CUR:
|
case SEEK_CUR:
|
||||||
offset+=mf->offs;
|
offset+=mf->bufpos;
|
||||||
break;
|
break;
|
||||||
case SEEK_END:
|
case SEEK_END:
|
||||||
assert(offset<=0);
|
assert(offset<=0);
|
||||||
@ -115,18 +158,136 @@ long mfseek(MEMFILE *mf,long offset,int whence)
|
|||||||
offset=length;
|
offset=length;
|
||||||
|
|
||||||
/* set new position and return it */
|
/* set new position and return it */
|
||||||
memfile_seek(mf, offset);
|
mf->bufpos=offset;
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int mfwrite(MEMFILE *mf,unsigned char *buffer,unsigned int size)
|
unsigned int mfwrite(MEMFILE *mf,unsigned char *buffer,unsigned int size)
|
||||||
{
|
{
|
||||||
return (memfile_write(mf, buffer, size) ? size : 0);
|
long length;
|
||||||
|
long numblocks;
|
||||||
|
int blockpos,blocksize;
|
||||||
|
unsigned int bytes;
|
||||||
|
MEMFILE *block;
|
||||||
|
|
||||||
|
assert(mf!=NULL);
|
||||||
|
|
||||||
|
/* see whether more memory must be allocated */
|
||||||
|
length=mflength(mf);
|
||||||
|
assert(mf->bufpos>=0 && mf->bufpos<=length);
|
||||||
|
numblocks=(length+BUFFERSIZE-1)/BUFFERSIZE; /* # allocated blocks */
|
||||||
|
while (mf->bufpos+size>numblocks*BUFFERSIZE) {
|
||||||
|
/* append a block */
|
||||||
|
MEMFILE *last;
|
||||||
|
block=(MEMFILE*)malloc(sizeof(MEMFILE));
|
||||||
|
if (block==NULL)
|
||||||
|
return 0;
|
||||||
|
memset(block,0,sizeof(MEMFILE));
|
||||||
|
block->buffer=(unsigned char*)malloc(BUFFERSIZE);
|
||||||
|
if (block->buffer==NULL) {
|
||||||
|
free(block);
|
||||||
|
return 0;
|
||||||
|
} /* if */
|
||||||
|
for (last=mf; last->next!=NULL; last=last->next)
|
||||||
|
/* nothing */;
|
||||||
|
assert(last!=NULL);
|
||||||
|
assert(last->next==NULL);
|
||||||
|
last->next=block;
|
||||||
|
numblocks++;
|
||||||
|
} /* while */
|
||||||
|
|
||||||
|
if (size==0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* find the block to start writing to */
|
||||||
|
numblocks=mf->bufpos/BUFFERSIZE; /* # blocks to skip */
|
||||||
|
block=mf->next;
|
||||||
|
while (numblocks-->0) {
|
||||||
|
assert(block!=NULL);
|
||||||
|
block=block->next;
|
||||||
|
} /* while */
|
||||||
|
assert(block!=NULL);
|
||||||
|
|
||||||
|
/* copy into memory */
|
||||||
|
bytes=0;
|
||||||
|
blockpos=(int)(mf->bufpos % BUFFERSIZE);
|
||||||
|
do {
|
||||||
|
blocksize=BUFFERSIZE-blockpos;
|
||||||
|
assert(blocksize>=0);
|
||||||
|
if ((unsigned int)blocksize>size)
|
||||||
|
blocksize=size;
|
||||||
|
|
||||||
|
assert(block!=NULL);
|
||||||
|
memcpy(block->buffer+blockpos,buffer,blocksize);
|
||||||
|
buffer+=blocksize;
|
||||||
|
size-=blocksize;
|
||||||
|
bytes+=blocksize;
|
||||||
|
|
||||||
|
if (blockpos+blocksize>block->bufpos)
|
||||||
|
block->bufpos=blockpos+blocksize;
|
||||||
|
assert(block->bufpos>=0 && (unsigned long)block->bufpos<=BUFFERSIZE);
|
||||||
|
block=block->next;
|
||||||
|
blockpos=0;
|
||||||
|
} while (size>0);
|
||||||
|
|
||||||
|
/* adjust file pointer */
|
||||||
|
mf->bufpos+=bytes;
|
||||||
|
|
||||||
|
return bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int mfread(MEMFILE *mf,unsigned char *buffer,unsigned int size)
|
unsigned int mfread(MEMFILE *mf,unsigned char *buffer,unsigned int size)
|
||||||
{
|
{
|
||||||
return memfile_read(mf, buffer, size);
|
long length;
|
||||||
|
long numblocks;
|
||||||
|
int blockpos,blocksize;
|
||||||
|
unsigned int bytes;
|
||||||
|
MEMFILE *block;
|
||||||
|
|
||||||
|
assert(mf!=NULL);
|
||||||
|
|
||||||
|
/* adjust the size to read */
|
||||||
|
length=mflength(mf);
|
||||||
|
assert(mf->bufpos>=0 && mf->bufpos<=length);
|
||||||
|
if (mf->bufpos+size>(unsigned long)length)
|
||||||
|
size=(int)(length-mf->bufpos);
|
||||||
|
assert(mf->bufpos+size<=(unsigned long)length);
|
||||||
|
if (size==0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* find the block to start reading from */
|
||||||
|
numblocks=mf->bufpos/BUFFERSIZE; /* # blocks to skip */
|
||||||
|
block=mf->next;
|
||||||
|
while (numblocks-->0) {
|
||||||
|
assert(block!=NULL);
|
||||||
|
block=block->next;
|
||||||
|
} /* while */
|
||||||
|
assert(block!=NULL);
|
||||||
|
|
||||||
|
/* copy out of memory */
|
||||||
|
bytes=0;
|
||||||
|
blockpos=(int)(mf->bufpos % BUFFERSIZE);
|
||||||
|
do {
|
||||||
|
blocksize=BUFFERSIZE-blockpos;
|
||||||
|
if ((unsigned int)blocksize>size)
|
||||||
|
blocksize=size;
|
||||||
|
|
||||||
|
assert(block!=NULL);
|
||||||
|
assert(block->bufpos>=0 && (unsigned long)block->bufpos<=BUFFERSIZE);
|
||||||
|
assert(blockpos+blocksize<=block->bufpos);
|
||||||
|
memcpy(buffer,block->buffer+blockpos,blocksize);
|
||||||
|
buffer+=blocksize;
|
||||||
|
size-=blocksize;
|
||||||
|
bytes+=blocksize;
|
||||||
|
|
||||||
|
block=block->next;
|
||||||
|
blockpos=0;
|
||||||
|
} while (size>0);
|
||||||
|
|
||||||
|
/* adjust file pointer */
|
||||||
|
mf->bufpos+=bytes;
|
||||||
|
|
||||||
|
return bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *mfgets(MEMFILE *mf,char *string,unsigned int size)
|
char *mfgets(MEMFILE *mf,char *string,unsigned int size)
|
||||||
|
@ -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: 1 5
|
|
||||||
amx_plmenu_slapdmg 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
|
||||||
//
|
|
||||||
// Default value: ""
|
|
||||||
amx_mldebug ""
|
amx_mldebug ""
|
1
configs/conmotd.txt
Executable file
1
configs/conmotd.txt
Executable file
@ -0,0 +1 @@
|
|||||||
|
For newest AMX Mod X and many plugins visit http://www.amxmodx.org/
|
@ -1,5 +1,5 @@
|
|||||||
; Configuration file for AMX Mod X
|
; Configuration file for AMX Mod X
|
||||||
amxx_logs addons/amxmodx/logs
|
amxx_logdir addons/amxmodx/logs
|
||||||
amxx_configsdir addons/amxmodx/configs
|
amxx_configsdir addons/amxmodx/configs
|
||||||
amxx_datadir addons/amxmodx/data
|
amxx_datadir addons/amxmodx/data
|
||||||
amxx_modules addons/amxmodx/configs/modules.ini
|
amxx_modules addons/amxmodx/configs/modules.ini
|
||||||
|
@ -1,65 +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
|
||||||
|
|
||||||
// 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
|
||||||
@ -68,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
|
||||||
@ -127,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
|
||||||
//
|
|
||||||
// Default value: ""
|
|
||||||
amx_mldebug ""
|
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
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
; Configuration file for AMX Mod X
|
; Configuration file for AMX Mod X
|
||||||
amxx_logs addons/amxmodx/logs
|
amxx_logdir addons/amxmodx/logs
|
||||||
amxx_configsdir addons/amxmodx/configs
|
amxx_configsdir addons/amxmodx/configs
|
||||||
amxx_datadir addons/amxmodx/data
|
amxx_datadir addons/amxmodx/data
|
||||||
amxx_modules addons/amxmodx/configs/modules.ini
|
amxx_modules addons/amxmodx/configs/modules.ini
|
||||||
|
@ -39,7 +39,5 @@ statsx.amxx ; stats on death or round end (CSX Module required!)
|
|||||||
;miscstats.amxx ; bunch of events announcement for Counter-Strike
|
;miscstats.amxx ; bunch of events announcement for Counter-Strike
|
||||||
;stats_logging.amxx ; weapons stats logging (CSX Module required!)
|
;stats_logging.amxx ; weapons stats logging (CSX Module required!)
|
||||||
|
|
||||||
; Enable to use AMX Mod plugins
|
|
||||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
|
||||||
|
|
||||||
; Custom - Add 3rd party plugins here
|
; Custom - Add 3rd party plugins here
|
||||||
|
@ -6,3 +6,4 @@ ShowStats ;HUD-stats default
|
|||||||
SayRankStats ;Say /rankstats
|
SayRankStats ;Say /rankstats
|
||||||
SayRank ;Say /rank
|
SayRank ;Say /rank
|
||||||
SayTop15 ;Say /top15
|
SayTop15 ;Say /top15
|
||||||
|
ShowStats ;HUD-stats default
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
; Configuration file for AMX Mod X
|
; Configuration file for AMX Mod X
|
||||||
amxx_logs addons/amxmodx/logs
|
amxx_logdir addons/amxmodx/logs
|
||||||
amxx_configsdir addons/amxmodx/configs
|
amxx_configsdir addons/amxmodx/configs
|
||||||
amxx_datadir addons/amxmodx/data
|
amxx_datadir addons/amxmodx/data
|
||||||
amxx_modules addons/amxmodx/configs/modules.ini
|
amxx_modules addons/amxmodx/configs/modules.ini
|
||||||
|
@ -38,7 +38,5 @@ statscfg.amxx ; allows to manage stats plugins via menu and commands
|
|||||||
;statssounds.amxx ; precache plugin for stats plugins
|
;statssounds.amxx ; precache plugin for stats plugins
|
||||||
;stats_logging.amxx ; weapons stats logging (DoD Module required!)
|
;stats_logging.amxx ; weapons stats logging (DoD Module required!)
|
||||||
|
|
||||||
; Enable to use AMX Mod plugins
|
|
||||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
|
||||||
|
|
||||||
; Custom - Add 3rd party plugins here
|
; Custom - Add 3rd party plugins here
|
||||||
|
@ -33,8 +33,6 @@ timeleft.amxx ; displays time left on map
|
|||||||
pausecfg.amxx ; allows to pause and unpause some plugins
|
pausecfg.amxx ; allows to pause and unpause some plugins
|
||||||
statscfg.amxx ; allows to manage stats plugins via menu and commands
|
statscfg.amxx ; allows to manage stats plugins via menu and commands
|
||||||
|
|
||||||
; Enable to use AMX Mod plugins
|
|
||||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
|
||||||
|
|
||||||
; Custom - Add 3rd party plugins here
|
; 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
|
||||||
|
1798
configs/hamdata.ini
1798
configs/hamdata.ini
File diff suppressed because it is too large
Load Diff
@ -1,65 +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
|
||||||
|
|
||||||
// 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
|
||||||
@ -68,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 180" "ab 120" "ab 60" "bcde 11"
|
|
||||||
amx_time_display "ab 180" "ab 120" "ab 60" "bcde 11"
|
amx_time_display "ab 180" "ab 120" "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
|
||||||
@ -127,50 +79,20 @@ 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
|
||||||
|
|
||||||
|
// Ignore the minimum and maximum settings for maps in the mapcycle
|
||||||
|
amx_mapnum_ignore 0
|
||||||
|
|
||||||
|
// Idle Kicker Settings:
|
||||||
|
amx_idle_time 120 // Time players must be idle to be kicked
|
||||||
|
amx_idle_min_players 8 // Minimum players on the server before kicking starts
|
||||||
|
amx_idle_ignore_immunity 1 // Kick idle admins with immunity?
|
||||||
|
|
||||||
|
// Change this value to alter the frequency (in seconds) players can say /stuck to free themselves.
|
||||||
|
//amx_unstuck_frequency 4
|
||||||
|
|
||||||
// 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
|
||||||
//
|
|
||||||
// Default value: ""
|
|
||||||
amx_mldebug ""
|
amx_mldebug ""
|
||||||
|
|
||||||
//
|
|
||||||
// Beginning of Natural-Selection specific configurations.
|
|
||||||
//
|
|
||||||
|
|
||||||
// Ignore the minimum and maximum settings for maps in the mapcycle
|
|
||||||
//
|
|
||||||
// Default value: 0
|
|
||||||
amx_mapnum_ignore 0
|
|
||||||
|
|
||||||
// Idle Kicker Settings
|
|
||||||
// Requires the "idlekicker.amxx" plugin to be enabled.
|
|
||||||
|
|
||||||
// Time players must be idle to be kicked, in seconds.
|
|
||||||
//
|
|
||||||
// Default value: 120
|
|
||||||
amx_idle_time 120
|
|
||||||
|
|
||||||
// Minimum players on the server before the plugin begins kicking.
|
|
||||||
//
|
|
||||||
// Default value: 8
|
|
||||||
amx_idle_min_players 8
|
|
||||||
|
|
||||||
// Whether or not to kick admins with immunity. 1 will kick, 0 will not.
|
|
||||||
//
|
|
||||||
// Default value: 1
|
|
||||||
amx_idle_ignore_immunity 1
|
|
||||||
|
|
||||||
|
|
||||||
// Unstuck settings
|
|
||||||
// Requires the "unstuck.amxx" plugin to be enabled.
|
|
||||||
|
|
||||||
// Change this value to alter the frequency (in seconds) players can
|
|
||||||
// say /stuck to free themselves.
|
|
||||||
//
|
|
||||||
// Default value: 4
|
|
||||||
amx_unstuck_frequency 4
|
|
||||||
|
@ -37,7 +37,4 @@ idlekicker.amxx ; kicks idle players
|
|||||||
nscommands.amxx ; extra commands for Natural-Selection
|
nscommands.amxx ; extra commands for Natural-Selection
|
||||||
;unstuck.amxx ; Free stuck players (engine & ns modules required!)
|
;unstuck.amxx ; Free stuck players (engine & ns modules required!)
|
||||||
|
|
||||||
; Enable to use AMX Mod plugins
|
|
||||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
|
||||||
|
|
||||||
; Custom - Add 3rd party plugins here
|
; Custom - Add 3rd party plugins here
|
||||||
|
@ -33,8 +33,5 @@ timeleft.amxx ; displays time left on map
|
|||||||
pausecfg.amxx ; allows to pause and unpause some plugins
|
pausecfg.amxx ; allows to pause and unpause some plugins
|
||||||
statscfg.amxx ; allows to manage stats plugins via menu and commands
|
statscfg.amxx ; allows to manage stats plugins via menu and commands
|
||||||
|
|
||||||
; Enable to use AMX Mod plugins
|
|
||||||
;amxmod_compat.amxx ; AMX Mod backwards compatibility layer
|
|
||||||
|
|
||||||
|
|
||||||
; Custom - Add 3rd party plugins here
|
; Custom - Add 3rd party plugins here
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user