Compare commits
1 Commits
amxmodx-1.
...
amxmodx-1.
Author | SHA1 | Date | |
---|---|---|---|
a54c4f530d |
@ -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
|
|
@ -130,7 +130,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
|
||||||
@ -543,9 +543,7 @@ 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);
|
CSPForward *fwd = m_SPForwards.at(id >> 1);
|
||||||
|
|
||||||
@ -558,38 +556,6 @@ void CForwardMngr::unregisterSPForward(int id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int CForwardMngr::duplicateSPForward(int id)
|
|
||||||
{
|
|
||||||
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)
|
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];
|
||||||
|
@ -217,8 +217,6 @@ public:
|
|||||||
|
|
||||||
// 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);
|
||||||
|
@ -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,70 @@ 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 (m_watch_iter.a == c)
|
||||||
|
{
|
||||||
|
++m_watch_iter;
|
||||||
|
}
|
||||||
|
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()
|
||||||
|
@ -66,17 +66,13 @@ 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:
|
||||||
@ -88,7 +84,8 @@ public:
|
|||||||
|
|
||||||
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
|
||||||
@ -113,6 +110,4 @@ private:
|
|||||||
MenuMngr::iterator m_watch_iter;
|
MenuMngr::iterator m_watch_iter;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern MenuMngr g_menucmds;
|
|
||||||
|
|
||||||
#endif //MENUS_H
|
#endif //MENUS_H
|
||||||
|
@ -40,6 +40,8 @@ void CPlayer::Init(edict_t* e, int i)
|
|||||||
pEdict = e;
|
pEdict = e;
|
||||||
initialized = false;
|
initialized = false;
|
||||||
ingame = false;
|
ingame = false;
|
||||||
|
bot_value = false;
|
||||||
|
bot_cached = false;
|
||||||
authorized = false;
|
authorized = false;
|
||||||
|
|
||||||
current = 0;
|
current = 0;
|
||||||
@ -87,6 +89,8 @@ void CPlayer::Disconnect()
|
|||||||
}
|
}
|
||||||
queries.clear();
|
queries.clear();
|
||||||
|
|
||||||
|
bot_value = false;
|
||||||
|
bot_cached = false;
|
||||||
menu = 0;
|
menu = 0;
|
||||||
newmenu = -1;
|
newmenu = -1;
|
||||||
}
|
}
|
||||||
@ -112,6 +116,8 @@ int CPlayer::NextHUDChannel()
|
|||||||
|
|
||||||
bool CPlayer::Connect(const char* connectname, const char* ipaddress)
|
bool CPlayer::Connect(const char* connectname, const char* ipaddress)
|
||||||
{
|
{
|
||||||
|
bot_value = false;
|
||||||
|
bot_cached = false;
|
||||||
name.assign(connectname);
|
name.assign(connectname);
|
||||||
ip.assign(ipaddress);
|
ip.assign(ipaddress);
|
||||||
time = gpGlobals->time;
|
time = gpGlobals->time;
|
||||||
|
103
amxmodx/CMisc.h
103
amxmodx/CMisc.h
@ -84,6 +84,8 @@ public:
|
|||||||
|
|
||||||
bool initialized;
|
bool initialized;
|
||||||
bool ingame;
|
bool ingame;
|
||||||
|
bool bot_cached;
|
||||||
|
bool bot_value;
|
||||||
bool authorized;
|
bool authorized;
|
||||||
bool vgui;
|
bool vgui;
|
||||||
|
|
||||||
@ -130,18 +132,24 @@ public:
|
|||||||
|
|
||||||
inline bool IsBot()
|
inline bool IsBot()
|
||||||
{
|
{
|
||||||
if ((pEdict->v.flags & FL_FAKECLIENT) == FL_FAKECLIENT)
|
if (!bot_cached)
|
||||||
{
|
{
|
||||||
return true;
|
bot_value = false;
|
||||||
}
|
if (pEdict->v.flags & FL_FAKECLIENT)
|
||||||
|
{
|
||||||
|
bot_value = true;
|
||||||
|
bot_cached = true;
|
||||||
|
} else {
|
||||||
const char *auth = GETPLAYERAUTHID(pEdict);
|
const char *auth = GETPLAYERAUTHID(pEdict);
|
||||||
if (auth && (strcmp(auth, "BOT") == 0))
|
if (auth && (strcmp(auth, "BOT") == 0))
|
||||||
{
|
{
|
||||||
return true;
|
bot_value = true;
|
||||||
|
bot_cached = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return bot_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool IsAlive()
|
inline bool IsAlive()
|
||||||
@ -296,87 +304,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
|
||||||
|
@ -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
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# Makefile written by David "BAILOPAN" Anderson
|
# Makefile written by David "BAILOPAN" Anderson
|
||||||
|
|
||||||
HLSDK = ../../hlsdk
|
HLSDK = ../../hlsdk
|
||||||
MM_ROOT = ../../metamod/metamod
|
MM_ROOT = ../metamod/metamod
|
||||||
|
|
||||||
### EDIT BELOW FOR OTHER PROJECTS ###
|
### EDIT BELOW FOR OTHER PROJECTS ###
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ OBJECTS = meta_api.cpp CFile.cpp CVault.cpp vault.cpp float.cpp file.cpp modules
|
|||||||
amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \
|
amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \
|
||||||
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
|
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
|
||||||
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp sorting.cpp \
|
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp sorting.cpp \
|
||||||
amxmod_compat.cpp nongpl_matches.cpp CFlagManager.cpp datastructs.cpp
|
amxmod_compat.cpp nongpl_matches.cpp
|
||||||
|
|
||||||
LINK = -lgcc -static-libgcc
|
LINK = -lgcc -static-libgcc
|
||||||
|
|
||||||
|
@ -973,25 +973,27 @@ int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code)
|
|||||||
memcpy(native_code, amx->base, ((AMX_HEADER *)(amx->base))->cod);
|
memcpy(native_code, amx->base, ((AMX_HEADER *)(amx->base))->cod);
|
||||||
hdr = (AMX_HEADER *)native_code;
|
hdr = (AMX_HEADER *)native_code;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* JIT rulz! (TM) */
|
/* JIT rulz! (TM) */
|
||||||
/* MP: added check for correct compilation */
|
/* MP: added check for correct compilation */
|
||||||
//Fixed bug (thanks T(+)rget)
|
//Fixed bug (thanks T(+)rget)
|
||||||
if ((res = asm_runJIT(amx->base, reloc_table, native_code)) == 0)
|
if ((res = asm_runJIT(amx->base, reloc_table, native_code)) == 0)
|
||||||
{
|
{
|
||||||
|
/* update the required memory size (the previous value was a
|
||||||
|
* conservative estimate, now we know the exact size)
|
||||||
|
*/
|
||||||
|
amx->code_size = (hdr->dat + hdr->stp + 3) & ~3;
|
||||||
/* The compiled code is relocatable, since only relative jumps are
|
/* The compiled code is relocatable, since only relative jumps are
|
||||||
* used for destinations within the generated code and absoulute
|
* used for destinations within the generated code and absoulute
|
||||||
* addresses for jumps into the runtime, which is fixed in memory.
|
* addresses for jumps into the runtime, which is fixed in memory.
|
||||||
*/
|
*/
|
||||||
amx->base = (unsigned char*) native_code;
|
amx->base = (unsigned char*) native_code;
|
||||||
amx->cip = hdr->cip;
|
amx->cip = hdr->cip;
|
||||||
|
amx->hea = hdr->hea;
|
||||||
|
amx->stp = hdr->stp - sizeof(cell);
|
||||||
|
amx->hlw = hdr->hea;
|
||||||
/* 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;
|
||||||
|
@ -31,19 +31,11 @@
|
|||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "CMenu.h"
|
|
||||||
#include "natives.h"
|
#include "natives.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
#include "binlog.h"
|
#include "binlog.h"
|
||||||
#include "libraries.h"
|
#include "libraries.h"
|
||||||
#include "CFlagManager.h"
|
|
||||||
#include "nongpl_matches.h"
|
#include "nongpl_matches.h"
|
||||||
#include "format.h"
|
|
||||||
#include "svn_version.h"
|
|
||||||
|
|
||||||
extern CFlagManager FlagMan;
|
|
||||||
CVector<CAdminData *> DynamicAdmins;
|
|
||||||
char CVarTempBuffer[64];
|
|
||||||
|
|
||||||
const char *invis_cvar_list[5] = {"amxmodx_version", "amxmodx_modules", "amx_debug", "amx_mldebug", "amx_client_languages"};
|
const char *invis_cvar_list[5] = {"amxmodx_version", "amxmodx_modules", "amx_debug", "amx_mldebug", "amx_client_languages"};
|
||||||
|
|
||||||
@ -596,7 +588,7 @@ static cell AMX_NATIVE_CALL is_user_alive(AMX *amx, cell *params) /* 1 param */
|
|||||||
|
|
||||||
static cell AMX_NATIVE_CALL get_amxx_verstring(AMX *amx, cell *params) /* 2 params */
|
static cell AMX_NATIVE_CALL get_amxx_verstring(AMX *amx, cell *params) /* 2 params */
|
||||||
{
|
{
|
||||||
return set_amxstring(amx, params[1], SVN_VERSION_STRING, params[2]);
|
return set_amxstring(amx, params[1], AMX_VERSION, params[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL get_user_frags(AMX *amx, cell *params) /* 1 param */
|
static cell AMX_NATIVE_CALL get_user_frags(AMX *amx, cell *params) /* 1 param */
|
||||||
@ -724,15 +716,8 @@ static cell AMX_NATIVE_CALL get_user_weapons(AMX *amx, cell *params) /* 3 param
|
|||||||
cell *cpNum = get_amxaddr(amx, params[3]);
|
cell *cpNum = get_amxaddr(amx, params[3]);
|
||||||
cell *cpIds = get_amxaddr(amx, params[2]);
|
cell *cpIds = get_amxaddr(amx, params[2]);
|
||||||
*cpIds = 0;
|
*cpIds = 0;
|
||||||
|
|
||||||
int weapons = pPlayer->pEdict->v.weapons & ~(1<<31); // don't count last element
|
int weapons = pPlayer->pEdict->v.weapons & ~(1<<31); // don't count last element
|
||||||
|
|
||||||
if (g_bmod_dod)
|
|
||||||
{
|
|
||||||
// Don't ignore that last element for dod
|
|
||||||
weapons = pPlayer->pEdict->v.weapons;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 1; i < MAX_WEAPONS; ++i)
|
for (int i = 1; i < MAX_WEAPONS; ++i)
|
||||||
{
|
{
|
||||||
if (weapons & (1<<i))
|
if (weapons & (1<<i))
|
||||||
@ -1270,11 +1255,6 @@ static cell AMX_NATIVE_CALL register_concmd(AMX *amx, cell *params) /* 4 param *
|
|||||||
listable = false;
|
listable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FlagMan.ShouldIAddThisCommand(amx,params,temp)==1)
|
|
||||||
{
|
|
||||||
FlagMan.LookupOrAdd(temp,access,amx);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL)
|
if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1315,11 +1295,6 @@ static cell AMX_NATIVE_CALL register_clcmd(AMX *amx, cell *params) /* 4 param */
|
|||||||
listable = false;
|
listable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FlagMan.ShouldIAddThisCommand(amx,params,temp)==1)
|
|
||||||
{
|
|
||||||
FlagMan.LookupOrAdd(temp,access,amx);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL)
|
if ((cmd = g_commands.registerCommand(plugin, idx, temp, info, access, listable)) == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1738,8 +1713,8 @@ static cell AMX_NATIVE_CALL set_pcvar_float(AMX *amx, cell *params)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(CVarTempBuffer,sizeof(CVarTempBuffer)-1,"%f",amx_ctof(params[2]));
|
ptr->value = amx_ctof(params[2]);
|
||||||
(*g_engfuncs.pfnCvar_DirectSet)(ptr, &CVarTempBuffer[0]);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1790,8 +1765,7 @@ static cell AMX_NATIVE_CALL set_pcvar_num(AMX *amx, cell *params)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(CVarTempBuffer,sizeof(CVarTempBuffer)-1,"%d",params[2]);
|
ptr->value = (float)params[2];
|
||||||
(*g_engfuncs.pfnCvar_DirectSet)(ptr, &CVarTempBuffer[0]);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1815,22 +1789,6 @@ static cell AMX_NATIVE_CALL set_cvar_string(AMX *amx, cell *params) /* 2 param *
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL set_pcvar_string(AMX *amx, cell *params) /* 2 param */
|
|
||||||
{
|
|
||||||
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
|
|
||||||
if (!ptr)
|
|
||||||
{
|
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int len;
|
|
||||||
|
|
||||||
(*g_engfuncs.pfnCvar_DirectSet)(ptr, get_amxstring(amx,params[2],0,len));
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL log_message(AMX *amx, cell *params) /* 1 param */
|
static cell AMX_NATIVE_CALL log_message(AMX *amx, cell *params) /* 1 param */
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
@ -2710,7 +2668,9 @@ static cell AMX_NATIVE_CALL precache_sound(AMX *amx, cell *params) /* 1 param */
|
|||||||
int len;
|
int len;
|
||||||
char* sptemp = get_amxstring(amx, params[1], 0, len);
|
char* sptemp = get_amxstring(amx, params[1], 0, len);
|
||||||
|
|
||||||
return PRECACHE_SOUND((char*)STRING(ALLOC_STRING(sptemp)));
|
PRECACHE_SOUND((char*)STRING(ALLOC_STRING(sptemp)));
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL precache_model(AMX *amx, cell *params) /* 1 param */
|
static cell AMX_NATIVE_CALL precache_model(AMX *amx, cell *params) /* 1 param */
|
||||||
@ -3125,7 +3085,6 @@ static cell AMX_NATIVE_CALL is_module_loaded(AMX *amx, cell *params)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// native is_plugin_loaded(const name[]);
|
// native is_plugin_loaded(const name[]);
|
||||||
// 1.8 changed to: is_plugin_loaded(const name[], bool:usefilename=false);
|
|
||||||
static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
// param1: name
|
// param1: name
|
||||||
@ -3133,10 +3092,6 @@ static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params)
|
|||||||
char *name = get_amxstring(amx, params[1], 0, len);
|
char *name = get_amxstring(amx, params[1], 0, len);
|
||||||
int id = 0;
|
int id = 0;
|
||||||
|
|
||||||
if (params[0] / sizeof(cell) == 1 || // compiled pre-1.8 - assume plugin's registered name
|
|
||||||
params[2] == 0) // compiled post 1.8 - wants plugin's registered name
|
|
||||||
{
|
|
||||||
// searching for registered plugin name
|
|
||||||
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
|
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
|
||||||
{
|
{
|
||||||
if (stricmp((*iter).getTitle(), name) == 0)
|
if (stricmp((*iter).getTitle(), name) == 0)
|
||||||
@ -3144,19 +3099,6 @@ static cell AMX_NATIVE_CALL is_plugin_loaded(AMX *amx, cell *params)
|
|||||||
|
|
||||||
++id;
|
++id;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// searching for filename
|
|
||||||
// filename search is case sensitive
|
|
||||||
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
|
|
||||||
{
|
|
||||||
if (strcmp((*iter).getName(), name) == 0)
|
|
||||||
return id;
|
|
||||||
|
|
||||||
++id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -3793,9 +3735,6 @@ static cell AMX_NATIVE_CALL register_dictionary(AMX *amx, cell *params)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL plugin_flags(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL plugin_flags(AMX *amx, cell *params)
|
||||||
{
|
|
||||||
if ((params[0] / sizeof(cell)) == 1 || // compiled with old include file
|
|
||||||
params[2] < 0) // specifically want calling plugin's flags
|
|
||||||
{
|
{
|
||||||
if (params[1])
|
if (params[1])
|
||||||
{
|
{
|
||||||
@ -3806,24 +3745,6 @@ static cell AMX_NATIVE_CALL plugin_flags(AMX *amx, cell *params)
|
|||||||
|
|
||||||
return amx->flags;
|
return amx->flags;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
CPluginMngr::CPlugin* a = g_plugins.findPlugin((int)params[2]);
|
|
||||||
|
|
||||||
if (a == NULL)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (params[1])
|
|
||||||
{
|
|
||||||
AMX_HEADER *hdr;
|
|
||||||
hdr = (AMX_HEADER *)a->getAMX()->base;
|
|
||||||
return hdr->flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
return a->getAMX()->flags;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// lang_exists(const name[]);
|
// lang_exists(const name[]);
|
||||||
static cell AMX_NATIVE_CALL lang_exists(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL lang_exists(AMX *amx, cell *params)
|
||||||
@ -4487,124 +4408,9 @@ static cell AMX_NATIVE_CALL GetLangTransKey(AMX *amx, cell *params)
|
|||||||
return g_langMngr.GetKeyEntry(key);
|
return g_langMngr.GetKeyEntry(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL admins_push(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
// admins_push("SteamID","password",access,flags);
|
|
||||||
CAdminData *TempData=new CAdminData;;
|
|
||||||
|
|
||||||
TempData->SetAuthID(get_amxaddr(amx,params[1]));
|
|
||||||
TempData->SetPass(get_amxaddr(amx,params[2]));
|
|
||||||
TempData->SetAccess(params[3]);
|
|
||||||
TempData->SetFlags(params[4]);
|
|
||||||
|
|
||||||
DynamicAdmins.push_back(TempData);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
static cell AMX_NATIVE_CALL admins_flush(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
// admins_flush();
|
|
||||||
|
|
||||||
size_t iter=DynamicAdmins.size();
|
|
||||||
|
|
||||||
while (iter--)
|
|
||||||
{
|
|
||||||
delete DynamicAdmins[iter];
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicAdmins.clear();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
};
|
|
||||||
static cell AMX_NATIVE_CALL admins_num(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
// admins_num();
|
|
||||||
|
|
||||||
return static_cast<cell>(DynamicAdmins.size());
|
|
||||||
};
|
|
||||||
static cell AMX_NATIVE_CALL admins_lookup(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
// admins_lookup(Num, Property, Buffer[]={0}, BufferSize=-1);
|
|
||||||
|
|
||||||
if (params[1]>=static_cast<int>(DynamicAdmins.size()))
|
|
||||||
{
|
|
||||||
LogError(amx,AMX_ERR_NATIVE,"Invalid admins num");
|
|
||||||
return 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
int BufferSize;
|
|
||||||
cell *Buffer;
|
|
||||||
const cell *Input;
|
|
||||||
|
|
||||||
switch(params[2])
|
|
||||||
{
|
|
||||||
case Admin_Auth:
|
|
||||||
BufferSize=params[4];
|
|
||||||
Buffer=get_amxaddr(amx, params[3]);
|
|
||||||
Input=DynamicAdmins[params[1]]->GetAuthID();
|
|
||||||
|
|
||||||
while (BufferSize-->0)
|
|
||||||
{
|
|
||||||
if ((*Buffer++=*Input++)==0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// hit max buffer size, terminate string
|
|
||||||
*Buffer=0;
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case Admin_Password:
|
|
||||||
BufferSize=params[4];
|
|
||||||
Buffer=get_amxaddr(amx, params[3]);
|
|
||||||
Input=DynamicAdmins[params[1]]->GetPass();
|
|
||||||
|
|
||||||
while (BufferSize-->0)
|
|
||||||
{
|
|
||||||
if ((*Buffer++=*Input++)==0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// hit max buffer size, terminate string
|
|
||||||
*Buffer=0;
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case Admin_Access:
|
|
||||||
return DynamicAdmins[params[1]]->GetAccess();
|
|
||||||
break;
|
|
||||||
case Admin_Flags:
|
|
||||||
return DynamicAdmins[params[1]]->GetFlags();
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
|
|
||||||
// unknown property
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
// LookupLangKey(Output[], OutputSize, const Key[], const &id)
|
|
||||||
static cell AMX_NATIVE_CALL LookupLangKey(AMX *amx, cell *params)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
char *key=get_amxstring(amx,params[3],0,len);
|
|
||||||
const char *def=translate(amx,params[4],key);
|
|
||||||
|
|
||||||
if (def==NULL)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_amxstring(amx,params[1],def,params[2]);
|
|
||||||
return 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
AMX_NATIVE_INFO amxmodx_Natives[] =
|
AMX_NATIVE_INFO amxmodx_Natives[] =
|
||||||
{
|
{
|
||||||
{"abort", amx_abort},
|
{"abort", amx_abort},
|
||||||
{"admins_flush", admins_flush},
|
|
||||||
{"admins_lookup", admins_lookup},
|
|
||||||
{"admins_num", admins_num},
|
|
||||||
{"admins_push", admins_push},
|
|
||||||
{"amxx_setpl_curweap", amxx_setpl_curweap},
|
{"amxx_setpl_curweap", amxx_setpl_curweap},
|
||||||
{"arrayset", arrayset},
|
{"arrayset", arrayset},
|
||||||
{"get_addr_val", get_addr_val},
|
{"get_addr_val", get_addr_val},
|
||||||
@ -4769,7 +4575,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
|||||||
{"set_localinfo", set_localinfo},
|
{"set_localinfo", set_localinfo},
|
||||||
{"set_pcvar_flags", set_pcvar_flags},
|
{"set_pcvar_flags", set_pcvar_flags},
|
||||||
{"set_pcvar_float", set_pcvar_float},
|
{"set_pcvar_float", set_pcvar_float},
|
||||||
{"set_pcvar_string", set_pcvar_string},
|
|
||||||
{"set_pcvar_num", set_pcvar_num},
|
{"set_pcvar_num", set_pcvar_num},
|
||||||
{"set_task", set_task},
|
{"set_task", set_task},
|
||||||
{"set_user_flags", set_user_flags},
|
{"set_user_flags", set_user_flags},
|
||||||
@ -4796,7 +4601,6 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
|||||||
{"ExecuteForward", ExecuteForward},
|
{"ExecuteForward", ExecuteForward},
|
||||||
{"GetLangTransKey", GetLangTransKey},
|
{"GetLangTransKey", GetLangTransKey},
|
||||||
{"LibraryExists", LibraryExists},
|
{"LibraryExists", LibraryExists},
|
||||||
{"LookupLangKey", LookupLangKey},
|
|
||||||
{"PrepareArray", PrepareArray},
|
{"PrepareArray", PrepareArray},
|
||||||
{"ShowSyncHudMsg", ShowSyncHudMsg},
|
{"ShowSyncHudMsg", ShowSyncHudMsg},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
|
@ -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.76d"
|
||||||
|
|
||||||
extern AMX_NATIVE_INFO core_Natives[];
|
extern AMX_NATIVE_INFO core_Natives[];
|
||||||
extern AMX_NATIVE_INFO time_Natives[];
|
extern AMX_NATIVE_INFO time_Natives[];
|
||||||
@ -84,7 +86,6 @@ extern AMX_NATIVE_INFO vault_Natives[];
|
|||||||
extern AMX_NATIVE_INFO msg_Natives[];
|
extern AMX_NATIVE_INFO msg_Natives[];
|
||||||
extern AMX_NATIVE_INFO vector_Natives[];
|
extern AMX_NATIVE_INFO vector_Natives[];
|
||||||
extern AMX_NATIVE_INFO g_SortNatives[];
|
extern AMX_NATIVE_INFO g_SortNatives[];
|
||||||
extern AMX_NATIVE_INFO g_DataStructNatives[];
|
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
|
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
|
||||||
@ -114,14 +115,6 @@ extern AMX_NATIVE_INFO g_DataStructNatives[];
|
|||||||
#define INFINITE 0xFFFFFFFF
|
#define INFINITE 0xFFFFFFFF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __linux__
|
|
||||||
#define PATH_SEP_CHAR '\\'
|
|
||||||
#define ALT_SEP_CHAR '/'
|
|
||||||
#else
|
|
||||||
#define PATH_SEP_CHAR '/'
|
|
||||||
#define ALT_SEP_CHAR '\\'
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef GETPLAYERAUTHID
|
#ifndef GETPLAYERAUTHID
|
||||||
#define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId)
|
#define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId)
|
||||||
#endif
|
#endif
|
||||||
@ -182,6 +175,7 @@ extern CList<CPlayer*> g_auth;
|
|||||||
extern EventsMngr g_events;
|
extern EventsMngr g_events;
|
||||||
extern Grenades g_grenades;
|
extern Grenades g_grenades;
|
||||||
extern LogEventsMngr g_logevents;
|
extern LogEventsMngr g_logevents;
|
||||||
|
extern MenuMngr g_menucmds;
|
||||||
extern CLangMngr g_langMngr;
|
extern CLangMngr g_langMngr;
|
||||||
extern String g_log_dir;
|
extern String g_log_dir;
|
||||||
extern String g_mod_name;
|
extern String g_mod_name;
|
||||||
@ -345,14 +339,6 @@ struct func_s
|
|||||||
const char *desc;
|
const char *desc;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum AdminProperty
|
|
||||||
{
|
|
||||||
Admin_Auth = 0,
|
|
||||||
Admin_Password,
|
|
||||||
Admin_Access,
|
|
||||||
Admin_Flags
|
|
||||||
};
|
|
||||||
|
|
||||||
extern enginefuncs_t *g_pEngTable;
|
extern enginefuncs_t *g_pEngTable;
|
||||||
|
|
||||||
#endif // AMXMODX_H
|
#endif // AMXMODX_H
|
||||||
|
@ -44,8 +44,6 @@
|
|||||||
#define vsnprintf _vsnprintf
|
#define vsnprintf _vsnprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "svn_version.h"
|
|
||||||
|
|
||||||
CLog::CLog()
|
CLog::CLog()
|
||||||
{
|
{
|
||||||
m_LogType = 0;
|
m_LogType = 0;
|
||||||
@ -97,13 +95,11 @@ void CLog::CreateNewFile()
|
|||||||
tm *curTime = localtime(&td);
|
tm *curTime = localtime(&td);
|
||||||
|
|
||||||
char file[256];
|
char file[256];
|
||||||
char name[256];
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
snprintf(name, sizeof(name), "%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i);
|
build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i);
|
||||||
build_pathname_r(file, sizeof(file)-1, "%s", name);
|
|
||||||
FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists
|
FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists
|
||||||
|
|
||||||
if (!pTmpFile)
|
if (!pTmpFile)
|
||||||
@ -122,7 +118,7 @@ void CLog::CreateNewFile()
|
|||||||
ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n");
|
ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n");
|
||||||
SET_LOCALINFO("amxx_logging", "0");
|
SET_LOCALINFO("amxx_logging", "0");
|
||||||
} else {
|
} else {
|
||||||
fprintf(fp, "AMX Mod X log file started (file \"%s\") (version \"%s\")\n", name, SVN_VERSION_STRING);
|
fprintf(fp, "AMX Mod X log file started (file \"%s/L%02d%02d%03d.log\") (version \"%s\")\n", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i, AMX_VERSION);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -204,7 +200,7 @@ void CLog::Log(const char *fmt, ...)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
build_pathname_r(file, sizeof(file)-1, "%s/L%04d%02d%02d.log", g_log_dir.c_str(), (curTime->tm_year + 1900), curTime->tm_mon + 1, curTime->tm_mday);
|
build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday);
|
||||||
pF = fopen(file, "a+");
|
pF = fopen(file, "a+");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,7 +230,6 @@ void CLog::Log(const char *fmt, ...)
|
|||||||
void CLog::LogError(const char *fmt, ...)
|
void CLog::LogError(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
static char file[256];
|
static char file[256];
|
||||||
static char name[256];
|
|
||||||
|
|
||||||
if (m_FoundError)
|
if (m_FoundError)
|
||||||
{
|
{
|
||||||
@ -258,8 +253,7 @@ void CLog::LogError(const char *fmt, ...)
|
|||||||
va_end(arglst);
|
va_end(arglst);
|
||||||
|
|
||||||
FILE *pF = NULL;
|
FILE *pF = NULL;
|
||||||
snprintf(name, sizeof(name), "%s/error_%04d%02d%02d.log", g_log_dir.c_str(), curTime->tm_year + 1900, curTime->tm_mon + 1, curTime->tm_mday);
|
build_pathname_r(file, sizeof(file)-1, "%s/error_%02d%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100);
|
||||||
build_pathname_r(file, sizeof(file)-1, "%s", name);
|
|
||||||
pF = fopen(file, "a+");
|
pF = fopen(file, "a+");
|
||||||
|
|
||||||
if (pF)
|
if (pF)
|
||||||
@ -267,7 +261,7 @@ void CLog::LogError(const char *fmt, ...)
|
|||||||
if (!m_LoggedErrMap)
|
if (!m_LoggedErrMap)
|
||||||
{
|
{
|
||||||
fprintf(pF, "L %s: Start of error session.\n", date);
|
fprintf(pF, "L %s: Start of error session.\n", date);
|
||||||
fprintf(pF, "L %s: Info (map \"%s\") (file \"%s\")\n", date, STRING(gpGlobals->mapname), name);
|
fprintf(pF, "L %s: Info (map \"%s\") (logfile \"error_%02d%02d%02d.log\")\n", date, STRING(gpGlobals->mapname), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100);
|
||||||
m_LoggedErrMap = true;
|
m_LoggedErrMap = true;
|
||||||
}
|
}
|
||||||
fprintf(pF, "L %s: %s\n", date, msg);
|
fprintf(pF, "L %s: %s\n", date, msg);
|
||||||
|
@ -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
|
|
@ -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;
|
||||||
@ -212,15 +211,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,9 +383,8 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
|
|||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
char *a = new char[blocks];
|
char *a = new char[blocks];
|
||||||
char *ptr = a;
|
|
||||||
while (btmp--)
|
while (btmp--)
|
||||||
*ptr++ = static_cast<char>(*addr++);
|
*a++ = static_cast<char>(*addr++);
|
||||||
size_t res = fwrite(a, sizeof(char), blocks, fp);
|
size_t res = fwrite(a, sizeof(char), blocks, fp);
|
||||||
delete [] a;
|
delete [] a;
|
||||||
return res;
|
return res;
|
||||||
@ -393,9 +392,8 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
|
|||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
short *a = new short[blocks];
|
short *a = new short[blocks];
|
||||||
short *ptr = a;
|
|
||||||
while (btmp--)
|
while (btmp--)
|
||||||
*ptr++ = static_cast<short>(*addr++);
|
*a++ = static_cast<short>(*addr++);
|
||||||
size_t res = fwrite(a, sizeof(short), blocks, fp);
|
size_t res = fwrite(a, sizeof(short), blocks, fp);
|
||||||
delete [] a;
|
delete [] a;
|
||||||
return res;
|
return res;
|
||||||
@ -403,9 +401,8 @@ static cell AMX_NATIVE_CALL amx_fwrite_blocks(AMX *amx, cell *params)
|
|||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
int *a = new int[blocks];
|
int *a = new int[blocks];
|
||||||
int *ptr = a;
|
|
||||||
while (btmp--)
|
while (btmp--)
|
||||||
*ptr++ = static_cast<int>(*addr++);
|
*a++ = static_cast<int>(*addr++);
|
||||||
size_t res = fwrite(a, sizeof(int), blocks, fp);
|
size_t res = fwrite(a, sizeof(int), blocks, fp);
|
||||||
delete [] a;
|
delete [] a;
|
||||||
return res;
|
return res;
|
||||||
@ -824,37 +821,6 @@ static cell AMX_NATIVE_CALL amx_rename(AMX *amx, cell *params)
|
|||||||
#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 +856,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}
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
#include "datastructs.h"
|
|
||||||
#include "amxmod_compat.h"
|
#include "amxmod_compat.h"
|
||||||
|
|
||||||
//Adapted from Quake3's vsprintf
|
//Adapted from Quake3's vsprintf
|
||||||
@ -19,7 +18,6 @@
|
|||||||
#define SHORTINT 0x00000040 /* short integer */
|
#define SHORTINT 0x00000040 /* short integer */
|
||||||
#define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */
|
#define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */
|
||||||
#define FPT 0x00000100 /* floating point number */
|
#define FPT 0x00000100 /* floating point number */
|
||||||
#define UPPERDIGITS 0x00000200 /* make alpha digits uppercase */
|
|
||||||
#define to_digit(c) ((c) - '0')
|
#define to_digit(c) ((c) - '0')
|
||||||
#define is_digit(c) ((unsigned)to_digit(c) <= 9)
|
#define is_digit(c) ((unsigned)to_digit(c) <= 9)
|
||||||
#define to_char(n) ((n) + '0')
|
#define to_char(n) ((n) + '0')
|
||||||
@ -328,66 +326,6 @@ void AddInt(U **buf_p, size_t &maxlen, int val, int width, int flags)
|
|||||||
*buf_p = buf;
|
*buf_p = buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename U>
|
|
||||||
void AddHex(U **buf_p, size_t &maxlen, unsigned int val, int width, int flags)
|
|
||||||
{
|
|
||||||
U text[32];
|
|
||||||
int digits;
|
|
||||||
U *buf;
|
|
||||||
U digit;
|
|
||||||
int hexadjust;
|
|
||||||
|
|
||||||
if (flags & UPPERDIGITS)
|
|
||||||
{
|
|
||||||
hexadjust = 'A' - '9' - 1;
|
|
||||||
} else {
|
|
||||||
hexadjust = 'a' - '9' - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
digits = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
digit = ('0' + val % 16);
|
|
||||||
if (digit > '9')
|
|
||||||
{
|
|
||||||
digit += hexadjust;
|
|
||||||
}
|
|
||||||
|
|
||||||
text[digits++] = digit;
|
|
||||||
val /= 16;
|
|
||||||
} while (val);
|
|
||||||
|
|
||||||
buf = *buf_p;
|
|
||||||
|
|
||||||
if( !(flags & LADJUST) )
|
|
||||||
{
|
|
||||||
while (digits < width && maxlen)
|
|
||||||
{
|
|
||||||
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
|
|
||||||
width--;
|
|
||||||
maxlen--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (digits-- && maxlen)
|
|
||||||
{
|
|
||||||
*buf++ = text[digits];
|
|
||||||
width--;
|
|
||||||
maxlen--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & LADJUST)
|
|
||||||
{
|
|
||||||
while (width-- && maxlen)
|
|
||||||
{
|
|
||||||
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
|
|
||||||
maxlen--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*buf_p = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename D, typename S>
|
template <typename D, typename S>
|
||||||
size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param)
|
size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param)
|
||||||
{
|
{
|
||||||
@ -484,32 +422,6 @@ reswitch:
|
|||||||
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)
|
if (amx->flags & AMX_FLAG_OLDFILE)
|
||||||
|
@ -39,7 +39,6 @@
|
|||||||
|
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
#include "fakemeta.h"
|
#include "fakemeta.h"
|
||||||
#include "CMenu.h"
|
|
||||||
#include "newmenus.h"
|
#include "newmenus.h"
|
||||||
#include "natives.h"
|
#include "natives.h"
|
||||||
#include "binlog.h"
|
#include "binlog.h"
|
||||||
@ -48,21 +47,16 @@
|
|||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
#include "amxmod_compat.h"
|
#include "amxmod_compat.h"
|
||||||
|
|
||||||
#include "datastructs.h"
|
|
||||||
#include "CFlagManager.h"
|
|
||||||
#include "svn_version.h"
|
|
||||||
|
|
||||||
|
|
||||||
plugin_info_t Plugin_info =
|
plugin_info_t Plugin_info =
|
||||||
{
|
{
|
||||||
META_INTERFACE_VERSION, // ifvers
|
META_INTERFACE_VERSION, // ifvers
|
||||||
"AMX Mod X", // name
|
"AMX Mod X", // name
|
||||||
SVN_VERSION_STRING, // version
|
AMX_VERSION, // version
|
||||||
__DATE__, // date
|
__DATE__, // date
|
||||||
"AMX Mod X Dev Team", // author
|
"AMX Mod X Dev Team", // author
|
||||||
"http://www.amxmodx.org", // url
|
"http://www.amxmodx.org", // url
|
||||||
"AMXX", // logtag
|
"AMXX", // logtag
|
||||||
PT_STARTUP, // (when) loadable
|
PT_ANYTIME, // (when) loadable
|
||||||
PT_ANYTIME, // (when) unloadable
|
PT_ANYTIME, // (when) unloadable
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -79,7 +73,6 @@ void (*function)(void*);
|
|||||||
void (*endfunction)(void*);
|
void (*endfunction)(void*);
|
||||||
|
|
||||||
extern List<AUTHORIZEFUNC> g_auth_funcs;
|
extern List<AUTHORIZEFUNC> g_auth_funcs;
|
||||||
extern CVector<CAdminData *> DynamicAdmins;
|
|
||||||
|
|
||||||
CLog g_log;
|
CLog g_log;
|
||||||
CForwardMngr g_forwards;
|
CForwardMngr g_forwards;
|
||||||
@ -93,7 +86,7 @@ CPlayer* mPlayer;
|
|||||||
CPluginMngr g_plugins;
|
CPluginMngr g_plugins;
|
||||||
CTaskMngr g_tasksMngr;
|
CTaskMngr g_tasksMngr;
|
||||||
CmdMngr g_commands;
|
CmdMngr g_commands;
|
||||||
CFlagManager FlagMan;
|
|
||||||
EventsMngr g_events;
|
EventsMngr g_events;
|
||||||
Grenades g_grenades;
|
Grenades g_grenades;
|
||||||
LogEventsMngr g_logevents;
|
LogEventsMngr g_logevents;
|
||||||
@ -358,22 +351,6 @@ int C_Spawn(edict_t *pent)
|
|||||||
hostname = CVAR_GET_POINTER("hostname");
|
hostname = CVAR_GET_POINTER("hostname");
|
||||||
mp_timelimit = CVAR_GET_POINTER("mp_timelimit");
|
mp_timelimit = CVAR_GET_POINTER("mp_timelimit");
|
||||||
|
|
||||||
// Fix for crashing on mods that do not have mp_timelimit
|
|
||||||
if (mp_timelimit == NULL)
|
|
||||||
{
|
|
||||||
static cvar_t timelimit_holder;
|
|
||||||
|
|
||||||
timelimit_holder.name = "mp_timelimit";
|
|
||||||
timelimit_holder.string = "0";
|
|
||||||
timelimit_holder.flags = 0;
|
|
||||||
timelimit_holder.value = 0.0;
|
|
||||||
|
|
||||||
CVAR_REGISTER(&timelimit_holder);
|
|
||||||
|
|
||||||
mp_timelimit = &timelimit_holder;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
g_forwards.clear();
|
g_forwards.clear();
|
||||||
|
|
||||||
g_log.MapChange();
|
g_log.MapChange();
|
||||||
@ -404,16 +381,7 @@ int C_Spawn(edict_t *pent)
|
|||||||
get_localinfo("amx_pluginsdir", "addons/amxmodx/plugins");
|
get_localinfo("amx_pluginsdir", "addons/amxmodx/plugins");
|
||||||
get_localinfo("amx_logdir", "addons/amxmodx/logs");
|
get_localinfo("amx_logdir", "addons/amxmodx/logs");
|
||||||
|
|
||||||
FlagMan.LoadFile();
|
|
||||||
|
|
||||||
for (unsigned int i=0; i<VectorHolder.size(); i++)
|
|
||||||
{
|
|
||||||
delete VectorHolder[i];
|
|
||||||
};
|
|
||||||
VectorHolder.clear();
|
|
||||||
|
|
||||||
char map_pluginsfile_path[256];
|
char map_pluginsfile_path[256];
|
||||||
char prefixed_map_pluginsfile[256];
|
|
||||||
char configs_dir[256];
|
char configs_dir[256];
|
||||||
|
|
||||||
// ###### Load modules
|
// ###### Load modules
|
||||||
@ -422,26 +390,7 @@ int C_Spawn(edict_t *pent)
|
|||||||
get_localinfo_r("amxx_configsdir", "addons/amxmodx/configs", configs_dir, sizeof(configs_dir)-1);
|
get_localinfo_r("amxx_configsdir", "addons/amxmodx/configs", configs_dir, sizeof(configs_dir)-1);
|
||||||
g_plugins.CALMFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
g_plugins.CALMFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
||||||
LoadExtraPluginsToPCALM(configs_dir);
|
LoadExtraPluginsToPCALM(configs_dir);
|
||||||
char temporaryMap[64], *tmap_ptr;
|
snprintf(map_pluginsfile_path, sizeof(map_pluginsfile_path)-1,
|
||||||
|
|
||||||
snprintf(temporaryMap, sizeof(temporaryMap), "%s", STRING(gpGlobals->mapname));
|
|
||||||
|
|
||||||
prefixed_map_pluginsfile[0] = '\0';
|
|
||||||
if ((tmap_ptr = strchr(temporaryMap, '_')) != NULL)
|
|
||||||
{
|
|
||||||
// this map has a prefix
|
|
||||||
|
|
||||||
*tmap_ptr = '\0';
|
|
||||||
snprintf(prefixed_map_pluginsfile,
|
|
||||||
sizeof(prefixed_map_pluginsfile),
|
|
||||||
"%s/maps/plugins-%s.ini",
|
|
||||||
configs_dir,
|
|
||||||
temporaryMap);
|
|
||||||
g_plugins.CALMFromFile(prefixed_map_pluginsfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(map_pluginsfile_path,
|
|
||||||
sizeof(map_pluginsfile_path),
|
|
||||||
"%s/maps/plugins-%s.ini",
|
"%s/maps/plugins-%s.ini",
|
||||||
configs_dir,
|
configs_dir,
|
||||||
STRING(gpGlobals->mapname));
|
STRING(gpGlobals->mapname));
|
||||||
@ -450,7 +399,7 @@ int C_Spawn(edict_t *pent)
|
|||||||
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);
|
||||||
@ -486,11 +435,6 @@ int C_Spawn(edict_t *pent)
|
|||||||
g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
g_plugins.loadPluginsFromFile(get_localinfo("amxx_plugins", "addons/amxmodx/configs/plugins.ini"));
|
||||||
LoadExtraPluginsFromDir(configs_dir);
|
LoadExtraPluginsFromDir(configs_dir);
|
||||||
g_plugins.loadPluginsFromFile(map_pluginsfile_path, false);
|
g_plugins.loadPluginsFromFile(map_pluginsfile_path, false);
|
||||||
if (prefixed_map_pluginsfile[0] != '\0')
|
|
||||||
{
|
|
||||||
g_plugins.loadPluginsFromFile(prefixed_map_pluginsfile, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_plugins.Finalize();
|
g_plugins.Finalize();
|
||||||
g_plugins.InvalidateCache();
|
g_plugins.InvalidateCache();
|
||||||
|
|
||||||
@ -706,19 +650,10 @@ void C_ServerDeactivate_Post()
|
|||||||
|
|
||||||
ClearMessages();
|
ClearMessages();
|
||||||
|
|
||||||
// Flush the dynamic admins list
|
|
||||||
for (size_t iter=DynamicAdmins.size();iter--; )
|
|
||||||
{
|
|
||||||
delete DynamicAdmins[iter];
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicAdmins.clear();
|
|
||||||
for (unsigned int i=0; i<g_hudsync.size(); i++)
|
for (unsigned int i=0; i<g_hudsync.size(); i++)
|
||||||
delete [] g_hudsync[i];
|
delete [] g_hudsync[i];
|
||||||
g_hudsync.clear();
|
g_hudsync.clear();
|
||||||
|
|
||||||
FlagMan.WriteCommands();
|
|
||||||
|
|
||||||
// last memreport
|
// last memreport
|
||||||
#ifdef MEMORY_TEST
|
#ifdef MEMORY_TEST
|
||||||
if (g_memreport_enabled)
|
if (g_memreport_enabled)
|
||||||
@ -965,57 +900,47 @@ void C_ClientCommand(edict_t *pEntity)
|
|||||||
int menuid = pPlayer->menu;
|
int menuid = pPlayer->menu;
|
||||||
pPlayer->menu = 0;
|
pPlayer->menu = 0;
|
||||||
|
|
||||||
/* First, do new menus */
|
MenuMngr::iterator a = g_menucmds.begin();
|
||||||
int func_was_executed = -1;
|
|
||||||
|
while (a)
|
||||||
|
{
|
||||||
|
g_menucmds.SetWatchIter(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)
|
if (g_menucmds.GetWatchIter() != a)
|
||||||
{
|
{
|
||||||
a = g_menucmds.GetWatchIter();
|
a = g_menucmds.GetWatchIter();
|
||||||
@ -1137,6 +1062,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 {
|
||||||
@ -1456,7 +1395,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 +1424,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -578,7 +578,6 @@ int set_amxnatives(AMX* amx, char error[128])
|
|||||||
amx_Register(amx, msg_Natives, -1);
|
amx_Register(amx, msg_Natives, -1);
|
||||||
amx_Register(amx, vector_Natives, -1);
|
amx_Register(amx, vector_Natives, -1);
|
||||||
amx_Register(amx, g_SortNatives, -1);
|
amx_Register(amx, g_SortNatives, -1);
|
||||||
amx_Register(amx, g_DataStructNatives, -1);
|
|
||||||
|
|
||||||
if (amx->flags & AMX_FLAG_OLDFILE)
|
if (amx->flags & AMX_FLAG_OLDFILE)
|
||||||
{
|
{
|
||||||
@ -722,7 +721,13 @@ char* build_pathname(char *fmt, ...)
|
|||||||
{
|
{
|
||||||
static char string[256];
|
static char string[256];
|
||||||
int b;
|
int b;
|
||||||
int a = b = snprintf(string, 255, "%s%c", g_mod_name.c_str(), PATH_SEP_CHAR);
|
int a = b = snprintf(string, 255,
|
||||||
|
#ifndef __linux__
|
||||||
|
"%s\\",
|
||||||
|
#else
|
||||||
|
"%s/",
|
||||||
|
#endif
|
||||||
|
g_mod_name.c_str());
|
||||||
|
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
va_start(argptr, fmt);
|
va_start(argptr, fmt);
|
||||||
@ -734,10 +739,11 @@ char* build_pathname(char *fmt, ...)
|
|||||||
|
|
||||||
while (*path)
|
while (*path)
|
||||||
{
|
{
|
||||||
if (*path == ALT_SEP_CHAR)
|
#ifndef __linux__
|
||||||
{
|
if (*path == '/') *path = '\\';
|
||||||
*path = PATH_SEP_CHAR;
|
#else
|
||||||
}
|
if (*path == '\\') *path = '/';
|
||||||
|
#endif
|
||||||
++path;
|
++path;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -746,7 +752,13 @@ char* build_pathname(char *fmt, ...)
|
|||||||
|
|
||||||
char *build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...)
|
char *build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...)
|
||||||
{
|
{
|
||||||
snprintf(buffer, maxlen, "%s%c", g_mod_name.c_str(), PATH_SEP_CHAR);
|
snprintf(buffer, maxlen,
|
||||||
|
#ifdef __linux__
|
||||||
|
"%s/",
|
||||||
|
#else
|
||||||
|
"%s\\",
|
||||||
|
#endif
|
||||||
|
g_mod_name.c_str());
|
||||||
|
|
||||||
size_t len = strlen(buffer);
|
size_t len = strlen(buffer);
|
||||||
char *ptr = buffer + len;
|
char *ptr = buffer + len;
|
||||||
@ -758,10 +770,11 @@ char *build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...)
|
|||||||
|
|
||||||
while (*ptr)
|
while (*ptr)
|
||||||
{
|
{
|
||||||
if (*ptr == ALT_SEP_CHAR)
|
#ifndef __linux__
|
||||||
{
|
if (*ptr == '/') *ptr = '\\';
|
||||||
*ptr = PATH_SEP_CHAR;
|
#else
|
||||||
}
|
if (*ptr == '\\') *ptr = '/';
|
||||||
|
#endif
|
||||||
++ptr;
|
++ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -782,16 +795,23 @@ char* build_pathname_addons(char *fmt, ...)
|
|||||||
|
|
||||||
while (*path)
|
while (*path)
|
||||||
{
|
{
|
||||||
if (*path == ALT_SEP_CHAR)
|
#ifndef __linux__
|
||||||
{
|
if (*path == '/') *path = '\\';
|
||||||
*path = PATH_SEP_CHAR;
|
#else
|
||||||
}
|
if (*path == '\\') *path = '/';
|
||||||
|
#endif
|
||||||
++path;
|
++path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined WIN32
|
||||||
|
#define SEPCHAR '\\'
|
||||||
|
#elif defined __linux__
|
||||||
|
#define SEPCHAR '/'
|
||||||
|
#endif
|
||||||
|
|
||||||
bool ConvertModuleName(const char *pathString, String &path)
|
bool ConvertModuleName(const char *pathString, String &path)
|
||||||
{
|
{
|
||||||
String local;
|
String local;
|
||||||
@ -809,7 +829,7 @@ bool ConvertModuleName(const char *pathString, String &path)
|
|||||||
/* run to filename instead of dir */
|
/* run to filename instead of dir */
|
||||||
char *ptr = tmpname;
|
char *ptr = tmpname;
|
||||||
ptr = tmpname + len - 1;
|
ptr = tmpname + len - 1;
|
||||||
while (ptr >= tmpname && *ptr != PATH_SEP_CHAR)
|
while (ptr >= tmpname && *ptr != SEPCHAR)
|
||||||
ptr--;
|
ptr--;
|
||||||
if (ptr >= tmpname)
|
if (ptr >= tmpname)
|
||||||
{
|
{
|
||||||
@ -870,7 +890,7 @@ bool ConvertModuleName(const char *pathString, String &path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
path.assign(orig_path);
|
path.assign(orig_path);
|
||||||
path.append(PATH_SEP_CHAR);
|
path.append(SEPCHAR);
|
||||||
path.append(tmpname);
|
path.append(tmpname);
|
||||||
path.append("_amxx");
|
path.append("_amxx");
|
||||||
#if defined __linux__
|
#if defined __linux__
|
||||||
|
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>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
@ -361,9 +361,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 +388,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>
|
||||||
@ -521,9 +515,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 +554,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>
|
||||||
@ -614,9 +602,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 +682,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>
|
@ -505,10 +505,6 @@
|
|||||||
RelativePath="..\CFile.cpp"
|
RelativePath="..\CFile.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\CFlagManager.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CForward.cpp"
|
RelativePath="..\CForward.cpp"
|
||||||
>
|
>
|
||||||
@ -714,10 +710,6 @@
|
|||||||
RelativePath="..\CFile.h"
|
RelativePath="..\CFile.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\CFlagManager.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CForward.h"
|
RelativePath="..\CForward.h"
|
||||||
>
|
>
|
||||||
@ -770,14 +762,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"
|
||||||
>
|
>
|
||||||
@ -838,10 +822,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 +924,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>
|
||||||
|
@ -46,16 +46,12 @@
|
|||||||
//With the exception for param_convert, which was written by
|
//With the exception for param_convert, which was written by
|
||||||
// Julien "dJeyL" Laurent
|
// Julien "dJeyL" Laurent
|
||||||
|
|
||||||
|
CStack<int> g_ErrorStk;
|
||||||
CVector<regnative *> g_RegNatives;
|
CVector<regnative *> g_RegNatives;
|
||||||
|
CStack<regnative *> g_NativeStack;
|
||||||
static char g_errorStr[512] = {0};
|
static char g_errorStr[512] = {0};
|
||||||
bool g_Initialized = false;
|
bool g_Initialized = false;
|
||||||
|
|
||||||
/* Stack stuff */
|
|
||||||
regnative *g_pCurNative = NULL;
|
|
||||||
AMX *g_pCaller = NULL;
|
|
||||||
cell g_Params[CALLFUNC_MAXPARAMS];
|
|
||||||
int g_CurError = AMX_ERR_NONE;
|
|
||||||
|
|
||||||
int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
if (idx < 0 || idx >= (int)g_RegNatives.size())
|
if (idx < 0 || idx >= (int)g_RegNatives.size())
|
||||||
@ -83,55 +79,37 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save old values on ZE STACK */
|
if (pNative->caller)
|
||||||
AMX *pSaveCaller = g_pCaller;
|
|
||||||
cell saveParams[CALLFUNC_MAXPARAMS];
|
|
||||||
regnative *pSaveNative = g_pCurNative;
|
|
||||||
int saveError = g_CurError;
|
|
||||||
|
|
||||||
if (pSaveNative)
|
|
||||||
{
|
{
|
||||||
for (ucell i = 0; i <= g_Params[0] / sizeof(cell); i++)
|
LogError(amx, AMX_ERR_NATIVE, "Bug caught! Please contact the AMX Mod X Dev Team.");
|
||||||
{
|
return 0;
|
||||||
saveParams[i] = g_Params[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save current info */
|
//parameter stack
|
||||||
g_CurError = AMX_ERR_NONE;
|
//NOTE: it is possible that recursive register native calling
|
||||||
g_pCaller = amx;
|
// could potentially be somehow damaged here.
|
||||||
g_pCurNative = pNative;
|
//so, a :TODO: - make the stack unique, rather than a known ptr
|
||||||
|
pNative->caller = amx;
|
||||||
|
|
||||||
int err = 0;
|
int err = 0;
|
||||||
cell ret = 0;
|
cell ret = 0;
|
||||||
|
g_ErrorStk.push(0);
|
||||||
|
g_NativeStack.push(pNative);
|
||||||
if (pNative->style == 0)
|
if (pNative->style == 0)
|
||||||
{
|
{
|
||||||
amx_Push(pNative->amx, numParams);
|
amx_Push(pNative->amx, numParams);
|
||||||
amx_Push(pNative->amx, pPlugin->getId());
|
amx_Push(pNative->amx, pPlugin->getId());
|
||||||
for (int i=numParams; i>=0; i--)
|
for (int i=numParams; i>=0; i--)
|
||||||
{
|
pNative->params[i] = params[i];
|
||||||
g_Params[i] = params[i];
|
|
||||||
}
|
|
||||||
} else if (pNative->style == 1) {
|
} else if (pNative->style == 1) {
|
||||||
/**
|
//use dJeyL's system .. very clever!
|
||||||
* use dJeyL's system .. very clever!
|
|
||||||
* NOTE: clever, but doesn't work at all since the JIT does bounds checking
|
|
||||||
* this should REALLY be deprecated
|
|
||||||
*/
|
|
||||||
for (int i=numParams; i>=1; i--)
|
for (int i=numParams; i>=1; i--)
|
||||||
{
|
|
||||||
amx_Push(pNative->amx, params[i]);
|
amx_Push(pNative->amx, params[i]);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Debugger *pDebugger = (Debugger *)pNative->amx->userdata[UD_DEBUGGER];
|
Debugger *pDebugger = (Debugger *)pNative->amx->userdata[UD_DEBUGGER];
|
||||||
if (pDebugger)
|
if (pDebugger)
|
||||||
{
|
|
||||||
pDebugger->BeginExec();
|
pDebugger->BeginExec();
|
||||||
}
|
|
||||||
|
|
||||||
err=amx_Exec(pNative->amx, &ret, pNative->func);
|
err=amx_Exec(pNative->amx, &ret, pNative->func);
|
||||||
|
|
||||||
if (err != AMX_ERR_NONE)
|
if (err != AMX_ERR_NONE)
|
||||||
{
|
{
|
||||||
if (pDebugger && pDebugger->ErrorExists())
|
if (pDebugger && pDebugger->ErrorExists())
|
||||||
@ -144,26 +122,15 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
|||||||
pNative->amx->error = AMX_ERR_NONE;
|
pNative->amx->error = AMX_ERR_NONE;
|
||||||
//furthermore, log an error in the parent plugin.
|
//furthermore, log an error in the parent plugin.
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Unhandled dynamic native error");
|
LogError(amx, AMX_ERR_NATIVE, "Unhandled dynamic native error");
|
||||||
} else if (g_CurError != AMX_ERR_NONE) {
|
} else if (g_ErrorStk.front()) {
|
||||||
LogError(amx, g_CurError, g_errorStr);
|
LogError(amx, g_ErrorStk.front(), g_errorStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pDebugger)
|
if (pDebugger)
|
||||||
{
|
|
||||||
pDebugger->EndExec();
|
pDebugger->EndExec();
|
||||||
}
|
g_NativeStack.pop();
|
||||||
|
g_ErrorStk.pop();
|
||||||
|
|
||||||
/* Restore everything */
|
pNative->caller = NULL;
|
||||||
g_pCurNative = pSaveNative;
|
|
||||||
g_CurError = saveError;
|
|
||||||
g_pCaller = pSaveCaller;
|
|
||||||
if (pSaveNative)
|
|
||||||
{
|
|
||||||
for (ucell i = 0; i <= saveParams[0] / sizeof(cell); i++)
|
|
||||||
{
|
|
||||||
g_Params[i] = saveParams[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -171,9 +138,7 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
|||||||
AMX_NATIVE_INFO *BuildNativeTable()
|
AMX_NATIVE_INFO *BuildNativeTable()
|
||||||
{
|
{
|
||||||
if (g_RegNatives.size() < 1)
|
if (g_RegNatives.size() < 1)
|
||||||
{
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
AMX_NATIVE_INFO *pNatives = new AMX_NATIVE_INFO[g_RegNatives.size() + 1];
|
AMX_NATIVE_INFO *pNatives = new AMX_NATIVE_INFO[g_RegNatives.size() + 1];
|
||||||
|
|
||||||
@ -199,7 +164,8 @@ static cell AMX_NATIVE_CALL log_error(AMX *amx, cell *params)
|
|||||||
char *err = format_amxstring(amx, params, 2, len);
|
char *err = format_amxstring(amx, params, 2, len);
|
||||||
|
|
||||||
_snprintf(g_errorStr, sizeof(g_errorStr), "%s", err);
|
_snprintf(g_errorStr, sizeof(g_errorStr), "%s", err);
|
||||||
g_CurError = params[1];
|
g_ErrorStk.pop();
|
||||||
|
g_ErrorStk.push(params[1]);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -207,12 +173,13 @@ static cell AMX_NATIVE_CALL log_error(AMX *amx, cell *params)
|
|||||||
//get_string(param, dest[], len)
|
//get_string(param, dest[], len)
|
||||||
static cell AMX_NATIVE_CALL get_string(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL get_string(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
if (!g_pCurNative || (g_pCurNative->amx != amx))
|
if (!g_NativeStack.size())
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (g_pCurNative->style)
|
regnative *pNative = g_NativeStack.front();
|
||||||
|
if (pNative->style)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
@ -220,19 +187,20 @@ static cell AMX_NATIVE_CALL get_string(AMX *amx, cell *params)
|
|||||||
int p = params[1];
|
int p = params[1];
|
||||||
|
|
||||||
int len;
|
int len;
|
||||||
char *str = get_amxstring(g_pCaller, g_Params[p], 0, len);
|
char *str = get_amxstring(pNative->caller, pNative->params[p], 0, len);
|
||||||
return set_amxstring(amx, params[2], str, params[3]);
|
return set_amxstring(amx, params[2], str, params[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//set_string(param, source[], maxlen)
|
//set_string(param, source[], maxlen)
|
||||||
static cell AMX_NATIVE_CALL set_string(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL set_string(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
if (!g_pCurNative || (g_pCurNative->amx != amx))
|
if (!g_NativeStack.size())
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (g_pCurNative->style)
|
regnative *pNative = g_NativeStack.front();
|
||||||
|
if (pNative->style)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
@ -242,44 +210,46 @@ static cell AMX_NATIVE_CALL set_string(AMX *amx, cell *params)
|
|||||||
int len;
|
int len;
|
||||||
char *str = get_amxstring(amx, params[2], 0, len);
|
char *str = get_amxstring(amx, params[2], 0, len);
|
||||||
|
|
||||||
return set_amxstring(g_pCaller, g_Params[p], str, params[3]);
|
return set_amxstring(pNative->caller, pNative->params[p], str, params[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//get a byvalue parameter
|
//get a byvalue parameter
|
||||||
//get_param(num)
|
//get_param(num)
|
||||||
static cell AMX_NATIVE_CALL get_param(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL get_param(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
if (!g_pCurNative || (g_pCurNative->amx != amx))
|
if (!g_NativeStack.size())
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (g_pCurNative->style)
|
regnative *pNative = g_NativeStack.front();
|
||||||
|
if (pNative->style)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int p = params[1];
|
int p = params[1];
|
||||||
|
|
||||||
return g_Params[p];
|
return pNative->params[p];
|
||||||
}
|
}
|
||||||
|
|
||||||
//get_param_byref(num)
|
//get_param_byref(num)
|
||||||
static cell AMX_NATIVE_CALL get_param_byref(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL get_param_byref(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
if (!g_pCurNative || (g_pCurNative->amx != amx))
|
if (!g_NativeStack.size())
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (g_pCurNative->style)
|
regnative *pNative = g_NativeStack.front();
|
||||||
|
if (pNative->style)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int p = params[1];
|
int p = params[1];
|
||||||
|
|
||||||
cell *addr = get_amxaddr(g_pCaller, g_Params[p]);
|
cell *addr = get_amxaddr(pNative->caller, pNative->params[p]);
|
||||||
|
|
||||||
return addr[0];
|
return addr[0];
|
||||||
}
|
}
|
||||||
@ -287,19 +257,20 @@ static cell AMX_NATIVE_CALL get_param_byref(AMX *amx, cell *params)
|
|||||||
//set_param_byref(num, val)
|
//set_param_byref(num, val)
|
||||||
static cell AMX_NATIVE_CALL set_param_byref(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL set_param_byref(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
if (!g_pCurNative || (g_pCurNative->amx != amx))
|
if (!g_NativeStack.size())
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (g_pCurNative->style)
|
regnative *pNative = g_NativeStack.front();
|
||||||
|
if (pNative->style)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int p = params[1];
|
int p = params[1];
|
||||||
|
|
||||||
cell *addr = get_amxaddr(g_pCaller, g_Params[p]);
|
cell *addr = get_amxaddr(pNative->caller, pNative->params[p]);
|
||||||
|
|
||||||
addr[0] = params[2];
|
addr[0] = params[2];
|
||||||
|
|
||||||
@ -309,19 +280,20 @@ static cell AMX_NATIVE_CALL set_param_byref(AMX *amx, cell *params)
|
|||||||
//get_array(param, dest[], size)
|
//get_array(param, dest[], size)
|
||||||
static cell AMX_NATIVE_CALL get_array(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL get_array(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
if (!g_pCurNative || (g_pCurNative->amx != amx))
|
if (!g_NativeStack.size())
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (g_pCurNative->style)
|
regnative *pNative = g_NativeStack.front();
|
||||||
|
if (pNative->style)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int p = params[1];
|
int p = params[1];
|
||||||
|
|
||||||
cell *source = get_amxaddr(g_pCaller, g_Params[p]);
|
cell *source = get_amxaddr(pNative->caller, pNative->params[p]);
|
||||||
cell *dest = get_amxaddr(amx, params[2]);
|
cell *dest = get_amxaddr(amx, params[2]);
|
||||||
|
|
||||||
int size = params[3];
|
int size = params[3];
|
||||||
@ -334,19 +306,20 @@ static cell AMX_NATIVE_CALL get_array(AMX *amx, cell *params)
|
|||||||
//set_array(param, source[], size)
|
//set_array(param, source[], size)
|
||||||
static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
if (!g_pCurNative || (g_pCurNative->amx != amx))
|
if (!g_NativeStack.size())
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (g_pCurNative->style)
|
regnative *pNative = g_NativeStack.front();
|
||||||
|
if (pNative->style)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int p = params[1];
|
int p = params[1];
|
||||||
|
|
||||||
cell *dest = get_amxaddr(g_pCaller, g_Params[p]);
|
cell *dest = get_amxaddr(pNative->caller, pNative->params[p]);
|
||||||
cell *source = get_amxaddr(amx, params[2]);
|
cell *source = get_amxaddr(amx, params[2]);
|
||||||
|
|
||||||
int size = params[3];
|
int size = params[3];
|
||||||
@ -358,13 +331,15 @@ static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
|
|||||||
|
|
||||||
static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
if (!g_pCurNative || (g_pCurNative->amx != amx))
|
if (!g_NativeStack.size())
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_pCurNative->style)
|
regnative *pNative = g_NativeStack.front();
|
||||||
|
|
||||||
|
if (pNative->style)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
@ -373,7 +348,10 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
|
|||||||
int vargPos = static_cast<int>(params[4]);
|
int vargPos = static_cast<int>(params[4]);
|
||||||
int fargPos = static_cast<int>(params[3]);
|
int fargPos = static_cast<int>(params[3]);
|
||||||
|
|
||||||
cell max = g_Params[0] / sizeof(cell);
|
/** get the parent parameter array */
|
||||||
|
cell *local_params = pNative->params;
|
||||||
|
|
||||||
|
cell max = local_params[0] / sizeof(cell);
|
||||||
if (vargPos > (int)max + 1)
|
if (vargPos > (int)max + 1)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos);
|
LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos);
|
||||||
@ -396,7 +374,7 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
|
|||||||
}
|
}
|
||||||
fmt = get_amxaddr(amx, params[5]);
|
fmt = get_amxaddr(amx, params[5]);
|
||||||
} else {
|
} else {
|
||||||
fmt = get_amxaddr(g_pCaller, g_Params[fargPos]);
|
fmt = get_amxaddr(pNative->caller, pNative->params[fargPos]);
|
||||||
}
|
}
|
||||||
cell *realdest = get_amxaddr(amx, params[1]);
|
cell *realdest = get_amxaddr(amx, params[1]);
|
||||||
size_t maxlen = static_cast<size_t>(params[2]);
|
size_t maxlen = static_cast<size_t>(params[2]);
|
||||||
@ -407,7 +385,7 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
|
|||||||
dest = cpbuf;
|
dest = cpbuf;
|
||||||
|
|
||||||
/* perform format */
|
/* perform format */
|
||||||
size_t total = atcprintf(dest, maxlen, fmt, g_pCaller, g_Params, &vargPos);
|
size_t total = atcprintf(dest, maxlen, fmt, pNative->caller, local_params, &vargPos);
|
||||||
|
|
||||||
/* copy back */
|
/* copy back */
|
||||||
memcpy(realdest, dest, (total+1) * sizeof(cell));
|
memcpy(realdest, dest, (total+1) * sizeof(cell));
|
||||||
@ -421,19 +399,20 @@ static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
|
|||||||
//I've no idea how he thought of this, but it's great. No idea how well it works.
|
//I've no idea how he thought of this, but it's great. No idea how well it works.
|
||||||
static cell AMX_NATIVE_CALL param_convert(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL param_convert(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
if (!g_pCurNative || (g_pCurNative->amx != amx))
|
if (!g_NativeStack.size())
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (g_pCurNative->style != 1)
|
regnative *pNative = g_NativeStack.front();
|
||||||
|
if (pNative->style != 1)
|
||||||
{
|
{
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
cell p = params[1];
|
cell p = params[1];
|
||||||
|
|
||||||
AMX *caller = g_pCaller;
|
AMX *caller = pNative->caller;
|
||||||
|
|
||||||
unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat;
|
unsigned char *data =amx->base+(int)((AMX_HEADER *)amx->base)->dat;
|
||||||
unsigned char *realdata = caller->base+(int)((AMX_HEADER *)caller->base)->dat;
|
unsigned char *realdata = caller->base+(int)((AMX_HEADER *)caller->base)->dat;
|
||||||
@ -475,6 +454,7 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params)
|
|||||||
regnative *pNative = new regnative;
|
regnative *pNative = new regnative;
|
||||||
pNative->amx = amx;
|
pNative->amx = amx;
|
||||||
pNative->func = idx;
|
pNative->func = idx;
|
||||||
|
pNative->caller = NULL;
|
||||||
|
|
||||||
//we'll apply a safety buffer too
|
//we'll apply a safety buffer too
|
||||||
//make our function
|
//make our function
|
||||||
|
@ -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;
|
||||||
@ -81,31 +80,28 @@ void validate_menu_text(char *str)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
@ -168,11 +164,9 @@ 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)
|
||||||
@ -198,70 +192,42 @@ int Menu::PagekeyToItem(page_t page, item_t key)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
key = new_key;
|
key = new_key;
|
||||||
if (key == items_per_page + 2)
|
if (key == items_per_page + 1)
|
||||||
{
|
{
|
||||||
return MENU_MORE;
|
return MENU_MORE;
|
||||||
} else if (key == items_per_page + 3) {
|
} else if (key == items_per_page + 2) {
|
||||||
return MENU_EXIT;
|
return MENU_EXIT;
|
||||||
} else {
|
} else {
|
||||||
return (start + key - 1);
|
return (start + key - 1);
|
||||||
}
|
}
|
||||||
} else if (page == num_pages - 1) {
|
} else if (page == num_pages - 1) {
|
||||||
//last page
|
//last page
|
||||||
item_t item_tracker = 0; // tracks how many valid items we have passed so far.
|
|
||||||
size_t remaining = m_Items.size() - start;
|
size_t remaining = m_Items.size() - start;
|
||||||
item_t new_key = key;
|
/* We have to add one remaining for each "bumping" space */
|
||||||
|
|
||||||
// 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++)
|
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++)
|
for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
|
||||||
{
|
{
|
||||||
if (m_Items[i]->blanks[j] == 1)
|
if (m_Items[i]->blanks[j] == 1)
|
||||||
{
|
{
|
||||||
new_key--;
|
remaining++;
|
||||||
}
|
|
||||||
if (!new_key)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If new_key doesn't equal zero, then a back/exit button was pressed.
|
if (key == remaining + 1)
|
||||||
if (new_key!=0)
|
|
||||||
{
|
|
||||||
if (key == items_per_page + 1)
|
|
||||||
{
|
{
|
||||||
return MENU_BACK;
|
return MENU_BACK;
|
||||||
}
|
} else if (key == remaining + 2) {
|
||||||
else if (key == items_per_page + 3)
|
|
||||||
{
|
|
||||||
return MENU_EXIT;
|
return MENU_EXIT;
|
||||||
|
} else {
|
||||||
|
return (start + key - 1);
|
||||||
}
|
}
|
||||||
// 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
|
/* 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.
|
* one from the key for each space we find along the way.
|
||||||
*/
|
*/
|
||||||
item_t new_key = key;
|
item_t new_key = key;
|
||||||
for (size_t i=start; i<(start+items_per_page-1) && i<m_Items.size(); i++)
|
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++)
|
for (size_t j=0; j<m_Items[i]->blanks.size(); j++)
|
||||||
{
|
{
|
||||||
@ -282,9 +248,7 @@ int Menu::PagekeyToItem(page_t page, item_t key)
|
|||||||
key = new_key;
|
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 +309,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 +324,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;
|
||||||
|
|
||||||
@ -384,8 +347,6 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
|
|||||||
|
|
||||||
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]))
|
||||||
@ -430,7 +391,7 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
|
|||||||
{
|
{
|
||||||
if (m_AutoColors)
|
if (m_AutoColors)
|
||||||
{
|
{
|
||||||
_snprintf(buffer, sizeof(buffer)-1, "%s%d.\\w %s\n", m_ItemColor.c_str(),option_display, pItem->name.c_str());
|
_snprintf(buffer, sizeof(buffer)-1, "\\r%d.\\w %s\n", option_display, pItem->name.c_str());
|
||||||
} else {
|
} else {
|
||||||
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", option_display, pItem->name.c_str());
|
_snprintf(buffer, sizeof(buffer)-1, "%d. %s\n", option_display, pItem->name.c_str());
|
||||||
}
|
}
|
||||||
@ -461,110 +422,78 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 +521,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 +619,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 +747,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 +782,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 +836,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 +892,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 +938,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;
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
NONGPL_PLUGIN_T NONGPL_PLUGIN_LIST[] =
|
NONGPL_PLUGIN_T NONGPL_PLUGIN_LIST[] =
|
||||||
{
|
{
|
||||||
{"Live", "CZ Gun Game", "czgungame.amxx"},
|
{"Live", "CZ Gun Game", "czgungame.amxx"},
|
||||||
{"Live", "AMXX Gun Game", "czgungame.amxx"},
|
|
||||||
{NULL, NULL, NULL},
|
{NULL, NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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;
|
||||||
@ -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
|
||||||
|
@ -265,7 +265,6 @@ static cell AMX_NATIVE_CALL SortCustom1D(AMX *amx, cell *params)
|
|||||||
qsort(array, array_size, sizeof(cell), sort1d_amx_custom);
|
qsort(array, array_size, sizeof(cell), sort1d_amx_custom);
|
||||||
g_AMXSortStack.pop();
|
g_AMXSortStack.pop();
|
||||||
|
|
||||||
unregisterSPForward(pfn);
|
|
||||||
delete pInfo;
|
delete pInfo;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,25 +137,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,29 +154,13 @@ void amx_command()
|
|||||||
|
|
||||||
CmdMngr::iterator a = g_commands.begin(CMD_ConsoleCommand);
|
CmdMngr::iterator a = g_commands.begin(CMD_ConsoleCommand);
|
||||||
|
|
||||||
if (CMD_ARGC() > 2) // Searching for commands registered to a plugin
|
|
||||||
{
|
|
||||||
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"))
|
||||||
@ -215,7 +184,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 +197,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 +267,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");
|
||||||
}
|
}
|
||||||
|
@ -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_
|
|
@ -1,12 +1,13 @@
|
|||||||
// Microsoft Visual C++ generated resource script.
|
// Microsoft Visual C++ generated resource script.
|
||||||
//
|
//
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
#define APSTUDIO_READONLY_SYMBOLS
|
#define APSTUDIO_READONLY_SYMBOLS
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Generated from the TEXTINCLUDE 2 resource.
|
// Generated from the TEXTINCLUDE 2 resource.
|
||||||
//
|
//
|
||||||
#include "winres.h"
|
#include "winres.h"
|
||||||
#include "svn_version.h"
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
#undef APSTUDIO_READONLY_SYMBOLS
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
@ -26,8 +27,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION SVN_VERSION_DWORD
|
FILEVERSION 1,7,6,3387
|
||||||
PRODUCTVERSION SVN_VERSION_DWORD
|
PRODUCTVERSION 1,7,6,3387
|
||||||
FILEFLAGSMASK 0x17L
|
FILEFLAGSMASK 0x17L
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@ -44,12 +45,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "Comments", "AMX Mod X"
|
VALUE "Comments", "AMX Mod X"
|
||||||
VALUE "FileDescription", "AMX Mod X"
|
VALUE "FileDescription", "AMX Mod X"
|
||||||
VALUE "FileVersion", SVN_VERSION_STRING
|
VALUE "FileVersion", "1.76d"
|
||||||
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.76d"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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,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
|
|
||||||
|
|
||||||
|
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
|
|
||||||
|
3051
dlls/BB/amxxmodule.cpp
Normal file
3051
dlls/BB/amxxmodule.cpp
Normal file
File diff suppressed because it is too large
Load Diff
2239
dlls/BB/amxxmodule.h
Normal file
2239
dlls/BB/amxxmodule.h
Normal file
File diff suppressed because it is too large
Load Diff
144
dlls/BB/bb.cpp
Normal file
144
dlls/BB/bb.cpp
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
#include "bb.h"
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL get_user_exp(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
return amx_ftoc(GetUserExp(params[1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL set_user_exp(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
float Exp = amx_ctof(params[2]);
|
||||||
|
SetUserExp(params[1], Exp );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL get_user_points(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
return amx_ftoc(GetUserPoints(params[1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL set_user_points(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
float Exp = amx_ctof(params[2]);
|
||||||
|
SetUserPoints(params[1], Exp );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL get_user_level(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
return GetUserLevel(params[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL set_user_level(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
if(GetUserLevel(params[1]) > params[2])
|
||||||
|
{
|
||||||
|
MF_LogError(amx,AMX_ERR_NATIVE,"Must set to a level higher than current one!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
SetUserLevel(params[1], params[2] );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL get_user_speed(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
return GetUserSpeed(params[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL set_user_speed(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
SetUserSpeed(params[1], params[2] );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL get_user_hitpoints(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
return GetUserHitPoints(params[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL set_user_hitpoints(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
SetUserHitPoints(params[1], params[2] );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL get_user_skill(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
return GetUserSkill(params[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL set_user_skill(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
SetUserSkill(params[1], params[2] );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL send_progress_bar(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
float time = amx_ctof(params[3]);
|
||||||
|
SendProgressBar(params[1], MF_GetAmxString( amx, params[2], 0, &len ), time );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL send_show_objective(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
SendShowObjective(params[1], MF_GetAmxString( amx, params[2], 0, &len ) );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL send_show_message(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
float time = amx_ctof(params[2]);
|
||||||
|
SendShowMessage(params[1], time, MF_GetAmxString( amx, params[2], 0, &len ), MF_GetAmxString( amx, params[3], 0, &len ) );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL reset_user_hud(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
UpdateBBHud( params[1] );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL is_user_zombie(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
return IsUserZombie(params[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AMX_NATIVE_INFO bb_Exports[] =
|
||||||
|
{
|
||||||
|
{"bb_is_user_zombie",is_user_zombie},
|
||||||
|
{"bb_reset_user_hud", reset_user_hud},
|
||||||
|
|
||||||
|
{"bb_show_message",send_show_message},
|
||||||
|
{"bb_show_objective", send_show_objective},
|
||||||
|
{"bb_show_progress_bar", send_progress_bar},
|
||||||
|
|
||||||
|
{"bb_get_user_skill",get_user_skill},
|
||||||
|
{"bb_set_user_skill", set_user_skill},
|
||||||
|
|
||||||
|
{"bb_get_user_hitpoints",get_user_hitpoints},
|
||||||
|
{"bb_set_user_hitpoints", set_user_hitpoints},
|
||||||
|
|
||||||
|
{"bb_get_user_speed",get_user_speed},
|
||||||
|
{"bb_set_user_speed", set_user_speed},
|
||||||
|
|
||||||
|
{"bb_get_user_exp",get_user_exp},
|
||||||
|
{"bb_set_user_exp", set_user_exp},
|
||||||
|
|
||||||
|
{"bb_get_user_points",get_user_points},
|
||||||
|
{"bb_set_user_points", set_user_points},
|
||||||
|
|
||||||
|
{"bb_get_user_level",get_user_level},
|
||||||
|
{"bb_set_user_level", set_user_level},
|
||||||
|
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
void OnAmxxAttach()
|
||||||
|
{
|
||||||
|
MF_AddNatives(bb_Exports);
|
||||||
|
}
|
115
dlls/BB/bb.h
Normal file
115
dlls/BB/bb.h
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
// prevent double include
|
||||||
|
#ifndef __BB_H__
|
||||||
|
#define __BB_H__
|
||||||
|
|
||||||
|
#include "pdata.h"
|
||||||
|
#include "bb_const.h"
|
||||||
|
|
||||||
|
void UpdateBBHud( long& target);
|
||||||
|
|
||||||
|
inline float GetUserExp( long& target)
|
||||||
|
{ return GetPData(target, BB_PDATA_EXP, 100.0); }
|
||||||
|
|
||||||
|
inline void SetUserExp( long& target, float& exp)
|
||||||
|
{ SetPData(target, BB_PDATA_EXP, exp); }
|
||||||
|
|
||||||
|
inline float GetUserPoints( long& target)
|
||||||
|
{ return GetPData(target, BB_PDATA_POINT, 100.0); }
|
||||||
|
|
||||||
|
inline void SetUserPoints( long& target, float& points)
|
||||||
|
{SetPData(target, BB_PDATA_POINT, points, true);}
|
||||||
|
|
||||||
|
inline long GetUserLevel(long& target)
|
||||||
|
{ return GetPData(target,BB_PDATA_LEVEL,100); }
|
||||||
|
|
||||||
|
inline void SetUserLevel(long& target, long& level)
|
||||||
|
{
|
||||||
|
long i;
|
||||||
|
float totalxp = 0.0;
|
||||||
|
|
||||||
|
for(i=1;i<=level;i++) {
|
||||||
|
totalxp += 150.0 + ((i-1) * 300.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetUserExp( target, totalxp );
|
||||||
|
|
||||||
|
MESSAGE_BEGIN(MSG_ONE,120, NULL, MF_GetPlayerEdict( target) );
|
||||||
|
WRITE_COORD(0);
|
||||||
|
WRITE_BYTE(level);
|
||||||
|
WRITE_BYTE( GetUserPoints(target) );
|
||||||
|
MESSAGE_END();
|
||||||
|
|
||||||
|
MESSAGE_BEGIN(MSG_ALL,81, NULL, MF_GetPlayerEdict( target ));
|
||||||
|
WRITE_BYTE( target );
|
||||||
|
WRITE_SHORT( MF_GetPlayerFrags( target ) );
|
||||||
|
WRITE_SHORT( MF_GetPlayerDeaths( target ) );
|
||||||
|
WRITE_BYTE(level);
|
||||||
|
MESSAGE_END();
|
||||||
|
|
||||||
|
SetPData(target,BB_PDATA_LEVEL,level);
|
||||||
|
SetPData(target,BB_PDATA_LEVEL - 1,level);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline long GetUserSpeed(long& target)
|
||||||
|
{ return GetPData(target,BB_PDATA_SPEED,100); }
|
||||||
|
|
||||||
|
inline void SetUserSpeed(long& target, long& speed)
|
||||||
|
{ SetPData(target,BB_PDATA_SPEED,speed, true);}
|
||||||
|
|
||||||
|
inline long GetUserHitPoints(long& target)
|
||||||
|
{ return GetPData(target,BB_PDATA_HITPOINTS,100); }
|
||||||
|
|
||||||
|
inline void SetUserHitPoints(long& target, long& hitpoints)
|
||||||
|
{ SetPData(target,BB_PDATA_HITPOINTS,hitpoints, true); }
|
||||||
|
|
||||||
|
inline long GetUserSkill(long& target)
|
||||||
|
{ return GetPData(target,BB_PDATA_SKILL,100); }
|
||||||
|
|
||||||
|
inline void SetUserSkill(long& target, long& skill )
|
||||||
|
{ SetPData(target,BB_PDATA_SKILL,skill,true); }
|
||||||
|
|
||||||
|
inline bool IsUserZombie(long& target)
|
||||||
|
{
|
||||||
|
return ( (MF_GetPlayerEdict( target ))->v.team == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void SendProgressBar( long& target, char* message, float& time)
|
||||||
|
{
|
||||||
|
MESSAGE_BEGIN(MSG_ONE, 122, NULL, MF_GetPlayerEdict( target));
|
||||||
|
WRITE_STRING(message);
|
||||||
|
WRITE_COORD(time);
|
||||||
|
MESSAGE_END();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void SendShowObjective( long& target, char* message)
|
||||||
|
{
|
||||||
|
MESSAGE_BEGIN(MSG_ONE, 122, NULL, MF_GetPlayerEdict( target));
|
||||||
|
WRITE_COORD(-1);
|
||||||
|
WRITE_BYTE(144);
|
||||||
|
WRITE_STRING(message);
|
||||||
|
MESSAGE_END();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void SendShowMessage( long& target, float& duration, char* message, char* message2)
|
||||||
|
{
|
||||||
|
MESSAGE_BEGIN(MSG_ONE, 122, NULL, MF_GetPlayerEdict( target));
|
||||||
|
WRITE_COORD(duration);
|
||||||
|
WRITE_BYTE(32);
|
||||||
|
WRITE_STRING(message);
|
||||||
|
WRITE_STRING(message2);
|
||||||
|
MESSAGE_END();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateBBHud( long& target)
|
||||||
|
{
|
||||||
|
MESSAGE_BEGIN( MSG_ONE, 113, NULL, MF_GetPlayerEdict( target) );
|
||||||
|
WRITE_BYTE( GetUserHitPoints(target) );
|
||||||
|
WRITE_BYTE( GetUserSpeed(target) );
|
||||||
|
WRITE_BYTE( GetUserSkill(target) );
|
||||||
|
WRITE_BYTE( GetUserPoints(target) );
|
||||||
|
MESSAGE_END();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
47
dlls/BB/bb.inc
Normal file
47
dlls/BB/bb.inc
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/* BrainBread Fun Module
|
||||||
|
*
|
||||||
|
* (c) 2005, XxAvalanchexX (converted to module by Rukia)
|
||||||
|
*
|
||||||
|
* This file is provided as is (no warranties).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined _brainbread_included
|
||||||
|
#endinput
|
||||||
|
#endif
|
||||||
|
#define _brainbread_included
|
||||||
|
|
||||||
|
#pragma library BBFUN
|
||||||
|
|
||||||
|
#include <bb_const>
|
||||||
|
#include <bb_stocks>
|
||||||
|
|
||||||
|
native bb_is_user_zombie(id)
|
||||||
|
native bb_reset_user_hud(id)
|
||||||
|
|
||||||
|
native bb_show_message(id,Float:time = -1,message[],message2[] = "")
|
||||||
|
native bb_show_objective(id,message[] = "")
|
||||||
|
native bb_show_progress_bar(id,message[],time = 10)
|
||||||
|
|
||||||
|
native bb_get_user_skill(id)
|
||||||
|
native bb_set_user_skill(id,skill)
|
||||||
|
stock bb_add_user_skill(id,skill) bb_set_user_skill(id,bb_get_user_skill(id) + skill)
|
||||||
|
|
||||||
|
native Float:bb_get_user_exp(id)
|
||||||
|
native bb_set_user_exp(id,Float:exp)
|
||||||
|
stock bb_add_user_exp(id,Float:exp) bb_set_user_exp(id,bb_get_user_exp(id) + exp)
|
||||||
|
|
||||||
|
native Float:bb_get_user_points(id)
|
||||||
|
native bb_set_user_points(id,Float:points)
|
||||||
|
stock bb_add_user_points(id,Float:points) bb_set_user_ponts(id,bb_get_user_points(id) + points)
|
||||||
|
|
||||||
|
native bb_get_user_level(id)
|
||||||
|
native bb_set_user_level(id,level)
|
||||||
|
stock bb_add_user_level(id,level) bb_set_user_level(id,bb_get_user_level(id) + level)
|
||||||
|
|
||||||
|
native bb_get_user_speed(id)
|
||||||
|
native bb_set_user_speed(id,speed)
|
||||||
|
stock bb_add_user_speed(id,speed) bb_set_user_speed(id,bb_get_user_speed(id) + speed)
|
||||||
|
|
||||||
|
native bb_get_user_hitpoints(id)
|
||||||
|
native bb_set_user_hitpoints(id,hitpoints)
|
||||||
|
stock bb_add_user_hitpoints(id,hitpoints) bb_set_user_hitpoints(id,bb_get_user_hitpoints(id) + hitpoints)
|
BIN
dlls/BB/bb.ncb
Normal file
BIN
dlls/BB/bb.ncb
Normal file
Binary file not shown.
@ -1,5 +1,5 @@
|
|||||||
Microsoft Visual Studio Solution File, Format Version 8.00
|
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cstrike", "cstrike.vcproj", "{AB148B92-4F47-42E6-8268-AB4E588EC6A2}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bb", "bb.vcproj", "{29798873-02F2-4075-AFE7-58CE8F9B5124}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
@ -9,10 +9,10 @@ Global
|
|||||||
Release = Release
|
Release = Release
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfiguration) = postSolution
|
GlobalSection(ProjectConfiguration) = postSolution
|
||||||
{AB148B92-4F47-42E6-8268-AB4E588EC6A2}.Debug.ActiveCfg = Debug|Win32
|
{29798873-02F2-4075-AFE7-58CE8F9B5124}.Debug.ActiveCfg = Debug|Win32
|
||||||
{AB148B92-4F47-42E6-8268-AB4E588EC6A2}.Debug.Build.0 = Debug|Win32
|
{29798873-02F2-4075-AFE7-58CE8F9B5124}.Debug.Build.0 = Debug|Win32
|
||||||
{AB148B92-4F47-42E6-8268-AB4E588EC6A2}.Release.ActiveCfg = Release|Win32
|
{29798873-02F2-4075-AFE7-58CE8F9B5124}.Release.ActiveCfg = Release|Win32
|
||||||
{AB148B92-4F47-42E6-8268-AB4E588EC6A2}.Release.Build.0 = Release|Win32
|
{29798873-02F2-4075-AFE7-58CE8F9B5124}.Release.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
EndGlobalSection
|
EndGlobalSection
|
96
dlls/cstrike/csx/msvc7/csx.vcproj → dlls/BB/bb.vcproj
Executable file → Normal file
96
dlls/cstrike/csx/msvc7/csx.vcproj → dlls/BB/bb.vcproj
Executable file → Normal file
@ -2,8 +2,8 @@
|
|||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="7.10"
|
Version="7.10"
|
||||||
Name="csx"
|
Name="bb"
|
||||||
ProjectGUID="{1DC4A99A-F23F-4AAE-881C-79D157C91155}"
|
ProjectGUID="{29798873-02F2-4075-AFE7-58CE8F9B5124}"
|
||||||
SccProjectName=""
|
SccProjectName=""
|
||||||
SccLocalPath="">
|
SccLocalPath="">
|
||||||
<Platforms>
|
<Platforms>
|
||||||
@ -22,31 +22,27 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
Optimization="2"
|
Optimization="2"
|
||||||
InlineFunctionExpansion="1"
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;bb_EXPORTS"
|
||||||
AdditionalIncludeDirectories="..\;..\sdk"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;csx_EXPORTS;JIT"
|
|
||||||
StringPooling="TRUE"
|
StringPooling="TRUE"
|
||||||
RuntimeLibrary="4"
|
RuntimeLibrary="4"
|
||||||
StructMemberAlignment="0"
|
|
||||||
EnableFunctionLevelLinking="FALSE"
|
|
||||||
UsePrecompiledHeader="2"
|
UsePrecompiledHeader="2"
|
||||||
PrecompiledHeaderFile=".\Release/csx.pch"
|
PrecompiledHeaderFile=".\Release/bb.pch"
|
||||||
AssemblerListingLocation=".\Release/"
|
AssemblerListingLocation=".\Release/"
|
||||||
ObjectFile=".\Release/"
|
ObjectFile=".\Release/"
|
||||||
ProgramDataBaseFileName=".\Release/"
|
ProgramDataBaseFileName=".\Release/"
|
||||||
BrowseInformation="1"
|
BrowseInformation="1"
|
||||||
WarningLevel="3"
|
WarningLevel="3"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"/>
|
||||||
CompileAs="0"/>
|
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCustomBuildTool"/>
|
Name="VCCustomBuildTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
OutputFile="Release/csx_amxx.dll"
|
OutputFile=".\Release/bb_amxx.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
ProgramDatabaseFile=".\Release/csx_amxx.pdb"
|
ModuleDefinitionFile=""
|
||||||
ImportLibrary=".\Release/csx_amxx.lib"
|
ProgramDatabaseFile=".\Release/bb.pdb"
|
||||||
|
ImportLibrary=".\Release/bb.lib"
|
||||||
TargetMachine="1"/>
|
TargetMachine="1"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCMIDLTool"
|
Name="VCMIDLTool"
|
||||||
@ -54,7 +50,7 @@
|
|||||||
MkTypLibCompatible="TRUE"
|
MkTypLibCompatible="TRUE"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
TargetEnvironment="1"
|
TargetEnvironment="1"
|
||||||
TypeLibraryName=".\Release/csx.tlb"
|
TypeLibraryName=".\Release/bb.tlb"
|
||||||
HeaderFileName=""/>
|
HeaderFileName=""/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCPostBuildEventTool"/>
|
Name="VCPostBuildEventTool"/>
|
||||||
@ -65,7 +61,7 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCResourceCompilerTool"
|
Name="VCResourceCompilerTool"
|
||||||
PreprocessorDefinitions="NDEBUG"
|
PreprocessorDefinitions="NDEBUG"
|
||||||
Culture="1033"/>
|
Culture="1053"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
@ -88,30 +84,29 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
Optimization="0"
|
Optimization="0"
|
||||||
AdditionalIncludeDirectories="..\;..\sdk"
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;bb_EXPORTS"
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;csx_EXPORTS"
|
|
||||||
BasicRuntimeChecks="3"
|
BasicRuntimeChecks="3"
|
||||||
RuntimeLibrary="5"
|
RuntimeLibrary="5"
|
||||||
UsePrecompiledHeader="2"
|
UsePrecompiledHeader="2"
|
||||||
PrecompiledHeaderFile=".\Debug/csx.pch"
|
PrecompiledHeaderFile=".\Debug/bb.pch"
|
||||||
AssemblerListingLocation=".\Debug/"
|
AssemblerListingLocation=".\Debug/"
|
||||||
ObjectFile=".\Debug/"
|
ObjectFile=".\Debug/"
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
ProgramDataBaseFileName=".\Debug/"
|
||||||
BrowseInformation="1"
|
BrowseInformation="1"
|
||||||
WarningLevel="3"
|
WarningLevel="3"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
DebugInformationFormat="3"
|
DebugInformationFormat="4"/>
|
||||||
CompileAs="0"/>
|
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCustomBuildTool"/>
|
Name="VCCustomBuildTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
OutputFile="Debug/csx_amxx.dll"
|
OutputFile="Debug/bb_amxx.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
|
ModuleDefinitionFile=""
|
||||||
GenerateDebugInformation="TRUE"
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile=".\Debug/csx_amxx.pdb"
|
ProgramDatabaseFile=".\Debug/bb_debug.pdb"
|
||||||
ImportLibrary=".\Debug/csx_amxx.lib"
|
ImportLibrary=".\Debug/bb_debug.lib"
|
||||||
TargetMachine="1"/>
|
TargetMachine="1"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCMIDLTool"
|
Name="VCMIDLTool"
|
||||||
@ -119,7 +114,7 @@
|
|||||||
MkTypLibCompatible="TRUE"
|
MkTypLibCompatible="TRUE"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
TargetEnvironment="1"
|
TargetEnvironment="1"
|
||||||
TypeLibraryName=".\Debug/csx.tlb"
|
TypeLibraryName=".\Debug/bb.tlb"
|
||||||
HeaderFileName=""/>
|
HeaderFileName=""/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCPostBuildEventTool"/>
|
Name="VCPostBuildEventTool"/>
|
||||||
@ -130,7 +125,7 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCResourceCompilerTool"
|
Name="VCResourceCompilerTool"
|
||||||
PreprocessorDefinitions="_DEBUG"
|
PreprocessorDefinitions="_DEBUG"
|
||||||
Culture="1033"/>
|
Culture="1053"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
@ -150,63 +145,34 @@
|
|||||||
Name="Source Files"
|
Name="Source Files"
|
||||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CMisc.cpp">
|
RelativePath=".\amxxmodule.cpp">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CRank.cpp">
|
RelativePath=".\bb.cpp">
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\meta_api.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\rank.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\usermsg.cpp">
|
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Header Files"
|
Name="Header Files"
|
||||||
Filter="h;hpp;hxx;hm;inl">
|
Filter="h;hpp;hxx;hm;inl">
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CMisc.h">
|
RelativePath=".\amxxmodule.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\CRank.h">
|
RelativePath=".\bb.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\rank.h">
|
RelativePath=".\bb_const.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\svn_version.h">
|
RelativePath=".\moduleconfig.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\pdata.h">
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="SDK"
|
Name="Resource Files"
|
||||||
Filter="">
|
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
|
||||||
<File
|
|
||||||
RelativePath="..\sdk\moduleconfig.h">
|
|
||||||
</File>
|
|
||||||
<Filter
|
|
||||||
Name="SDK Base"
|
|
||||||
Filter="">
|
|
||||||
<File
|
|
||||||
RelativePath="..\sdk\amxxmodule.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\sdk\amxxmodule.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Pawn Includes"
|
|
||||||
Filter="">
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\..\plugins\include\csstats.inc">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\..\plugins\include\csx.inc">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
</Filter>
|
||||||
</Files>
|
</Files>
|
||||||
<Globals>
|
<Globals>
|
12
dlls/BB/bb_const.h
Normal file
12
dlls/BB/bb_const.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// prevent double include
|
||||||
|
#ifndef __BB_CONST__
|
||||||
|
#define __BB_CONST__
|
||||||
|
|
||||||
|
#define BB_PDATA_LEVEL 505
|
||||||
|
#define BB_PDATA_EXP 4
|
||||||
|
#define BB_PDATA_POINT 432
|
||||||
|
#define BB_PDATA_SPEED 501
|
||||||
|
#define BB_PDATA_HITPOINTS 502
|
||||||
|
#define BB_PDATA_SKILL 503
|
||||||
|
|
||||||
|
#endif
|
26
dlls/BB/bb_const.inc
Normal file
26
dlls/BB/bb_const.inc
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/* BrainBread Fun Module Constants
|
||||||
|
*
|
||||||
|
* (c) 2005, XxAvalanchexX (converted to module by Rukia)
|
||||||
|
*
|
||||||
|
* This file is provided as is (no warranties).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined _brainbread_const_included
|
||||||
|
#endinput
|
||||||
|
#endif
|
||||||
|
#define _brainbread_const_included
|
||||||
|
|
||||||
|
|
||||||
|
#define SPRAY_BSPRITZ 1
|
||||||
|
#define SPRAY_BGUSH 2
|
||||||
|
#define SPRAY_SMOKEPUFF 4
|
||||||
|
#define SPRAY_EXPLOSION 5
|
||||||
|
|
||||||
|
#define DOT_GREEN 1
|
||||||
|
#define DOT_RED 2
|
||||||
|
#define DOT_WHITE 3
|
||||||
|
#define DOT_LTBLUE 4
|
||||||
|
#define DOT_BLUE 5
|
||||||
|
#define DOT_ORANGE 6
|
||||||
|
#define DOT_FLYELLOW 7
|
||||||
|
#define DOT_FLGREEN 8
|
112
dlls/BB/bb_stocks.inc
Normal file
112
dlls/BB/bb_stocks.inc
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/* BrainBread Fun Module Stocks
|
||||||
|
*
|
||||||
|
* (c) 2005, XxAvalanchexX (converted to module by Rukia)
|
||||||
|
*
|
||||||
|
* This file is provided as is (no warranties).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined _brainbread_stocks_included
|
||||||
|
#endinput
|
||||||
|
#endif
|
||||||
|
#define _brainbread_stocks_included
|
||||||
|
|
||||||
|
/* Used to create a spray */
|
||||||
|
stock bb_spray(type,origin[3]) {
|
||||||
|
|
||||||
|
/* type: type of spray, see below */
|
||||||
|
/* origin: origin of where spray comes from */
|
||||||
|
|
||||||
|
/* TYPES:
|
||||||
|
SPRAY_BSPRITZ (1) = Blood spritz
|
||||||
|
SPRAY_BGUSH (2) = Blood gush
|
||||||
|
SPRAY_SMOKEPUFF (4) = Smoke puffs
|
||||||
|
SPRAY_EXPLOSION (5) = Firey explosion */
|
||||||
|
|
||||||
|
message_begin(MSG_PVS,118,origin,0);
|
||||||
|
write_byte(type);
|
||||||
|
write_coord(origin[0]);
|
||||||
|
write_coord(origin[1]);
|
||||||
|
write_coord(origin[2]);
|
||||||
|
write_coord(random_num(-1,1));
|
||||||
|
write_coord(random_num(-1,1));
|
||||||
|
write_coord(random_num(-1,1));
|
||||||
|
write_coord(random_num(-1,1));
|
||||||
|
write_coord(random_num(-1,1));
|
||||||
|
write_coord(random_num(-1,1));
|
||||||
|
message_end();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Used to create a spray, with more parameters */
|
||||||
|
stock bb_spray_adv(type,origin[3],size[3],dir[3]) {
|
||||||
|
|
||||||
|
/* type: type of spray, see below */
|
||||||
|
/* origin: origin of where spray comes from */
|
||||||
|
/* size: size of spray, in XYZ format (I think), use a small number like -1 to 1 */
|
||||||
|
/* dir: direction of spray, in XYZ format (I think), use a small number like -1 to 1 */
|
||||||
|
|
||||||
|
/* TYPES:
|
||||||
|
SPRAY_BSPRITZ (1) = Blood spritz
|
||||||
|
SPRAY_BGUSH (2) = Blood gush
|
||||||
|
SPRAY_SMOKEPUFF (4) = Smoke puffs
|
||||||
|
SPRAY_EXPLOSION (5) = Firey explosion */
|
||||||
|
|
||||||
|
message_begin(MSG_PVS,118,origin,0);
|
||||||
|
write_byte(type);
|
||||||
|
write_coord(origin[0]);
|
||||||
|
write_coord(origin[1]);
|
||||||
|
write_coord(origin[2]);
|
||||||
|
write_coord(size[0]);
|
||||||
|
write_coord(size[1]);
|
||||||
|
write_coord(size[2]);
|
||||||
|
write_coord(dir[0]);
|
||||||
|
write_coord(dir[1]);
|
||||||
|
write_coord(dir[2]);
|
||||||
|
message_end();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Used to set dots on the radar */
|
||||||
|
stock bb_radar(id,dot_id,dot_origin[3],dot_status,dot_type) {
|
||||||
|
|
||||||
|
/* dot_id: unique ID for this dot, use same ID to modify the same dot */
|
||||||
|
/* dot_origin: the origin of where to place this dot */
|
||||||
|
/* dot_status: 0 to remove the dot, 1 to add or modify the dot */
|
||||||
|
/* dot_type: the type of dot, see below */
|
||||||
|
|
||||||
|
/* dot_origin and dot_type need not be set accurately when removing the dot */
|
||||||
|
|
||||||
|
/* TYPES:
|
||||||
|
DOT_GREEN (1) = Green Dot, used to mark teammates
|
||||||
|
DOT_RED (2) = Red Dot, used to mark enemies for zombies
|
||||||
|
DOT_WHITE (3) = White Dot, used to mark mission zones
|
||||||
|
DOT_LTBLUE (4) = Light Blue Dot, not used for BrainBread
|
||||||
|
DOT_BLUE (5) = Blue Dot, used to mark the BlackHawk
|
||||||
|
DOT_ORANGE (6) = Orange Dot, not used for BrainBread
|
||||||
|
DOT_FLYELLOW (7) = Flashing Yellow Dot, used to mark the Case or Fred
|
||||||
|
DOT_FLGREEN (8) = Flashing Green Dot, not used for BrainBread,
|
||||||
|
it stops flashing and turns to white after 3 seconds */
|
||||||
|
|
||||||
|
message_begin(MSG_ONE,93,{0,0,0},id);
|
||||||
|
write_short(dot_id);
|
||||||
|
write_byte(1);
|
||||||
|
write_coord(dot_origin[0]);
|
||||||
|
write_coord(dot_origin[1]);
|
||||||
|
write_coord(dot_origin[2]);
|
||||||
|
write_byte(1);
|
||||||
|
message_end();
|
||||||
|
|
||||||
|
message_begin(MSG_ONE,93,{0,0,0},id);
|
||||||
|
write_short(dot_id);
|
||||||
|
write_byte((dot_status > 0) ? 2 : 0);
|
||||||
|
|
||||||
|
if(dot_status > 0) {
|
||||||
|
write_byte(dot_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
message_end();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
462
dlls/BB/moduleconfig.h
Normal file
462
dlls/BB/moduleconfig.h
Normal file
@ -0,0 +1,462 @@
|
|||||||
|
// Configuration
|
||||||
|
|
||||||
|
#ifndef __MODULECONFIG_H__
|
||||||
|
#define __MODULECONFIG_H__
|
||||||
|
|
||||||
|
// Module info
|
||||||
|
#define MODULE_NAME "BBFUN"
|
||||||
|
#define MODULE_VERSION "1.65"
|
||||||
|
#define MODULE_AUTHOR "Avalanche"
|
||||||
|
#define MODULE_URL "www.rcrclansite.com"
|
||||||
|
#define MODULE_LOGTAG "BB"
|
||||||
|
// If you want the module not to be reloaded on mapchange, remove / comment out the next line
|
||||||
|
#define MODULE_RELOAD_ON_MAPCHANGE
|
||||||
|
|
||||||
|
#ifdef __DATE__
|
||||||
|
#define MODULE_DATE __DATE__
|
||||||
|
#else // __DATE__
|
||||||
|
#define MODULE_DATE "Today"
|
||||||
|
#endif // __DATE__
|
||||||
|
|
||||||
|
// metamod plugin?
|
||||||
|
#define USE_METAMOD
|
||||||
|
|
||||||
|
// - AMXX Init functions
|
||||||
|
// Also consider using FN_META_*
|
||||||
|
// AMXX query
|
||||||
|
//#define FN_AMXX_QUERY OnAmxxQuery
|
||||||
|
// AMXX attach
|
||||||
|
// Do native functions init here (MF_AddNatives)
|
||||||
|
#define FN_AMXX_ATTACH OnAmxxAttach
|
||||||
|
// AMXX detach
|
||||||
|
// #define FN_AMXX_DETACH OnAmxxDetach
|
||||||
|
// All plugins loaded
|
||||||
|
// Do forward functions init here (MF_RegisterForward)
|
||||||
|
// #define FN_AMXX_PLUGINSLOADED OnPluginsLoaded
|
||||||
|
|
||||||
|
/**** METAMOD ****/
|
||||||
|
// If your module doesn't use metamod, you may close the file now :)
|
||||||
|
#ifdef USE_METAMOD
|
||||||
|
// ----
|
||||||
|
// Hook Functions
|
||||||
|
// Uncomment these to be called
|
||||||
|
// You can also change the function name
|
||||||
|
|
||||||
|
// - Metamod init functions
|
||||||
|
// Also consider using FN_AMXX_*
|
||||||
|
// Meta query
|
||||||
|
//#define FN_META_QUERY OnMetaQuery
|
||||||
|
// Meta attach
|
||||||
|
//#define FN_META_ATTACH OnMetaAttach
|
||||||
|
// Meta detach
|
||||||
|
//#define FN_META_DETACH OnMetaDetach
|
||||||
|
|
||||||
|
// (wd) are Will Day's notes
|
||||||
|
// - GetEntityAPI2 functions
|
||||||
|
// #define FN_GameDLLInit GameDLLInit /* pfnGameInit() */
|
||||||
|
// #define FN_DispatchSpawn DispatchSpawn /* pfnSpawn() */
|
||||||
|
// #define FN_DispatchThink DispatchThink /* pfnThink() */
|
||||||
|
// #define FN_DispatchUse DispatchUse /* pfnUse() */
|
||||||
|
// #define FN_DispatchTouch DispatchTouch /* pfnTouch() */
|
||||||
|
// #define FN_DispatchBlocked DispatchBlocked /* pfnBlocked() */
|
||||||
|
// #define FN_DispatchKeyValue DispatchKeyValue /* pfnKeyValue() */
|
||||||
|
// #define FN_DispatchSave DispatchSave /* pfnSave() */
|
||||||
|
// #define FN_DispatchRestore DispatchRestore /* pfnRestore() */
|
||||||
|
// #define FN_DispatchObjectCollsionBox DispatchObjectCollsionBox /* pfnSetAbsBox() */
|
||||||
|
// #define FN_SaveWriteFields SaveWriteFields /* pfnSaveWriteFields() */
|
||||||
|
// #define FN_SaveReadFields SaveReadFields /* pfnSaveReadFields() */
|
||||||
|
// #define FN_SaveGlobalState SaveGlobalState /* pfnSaveGlobalState() */
|
||||||
|
// #define FN_RestoreGlobalState RestoreGlobalState /* pfnRestoreGlobalState() */
|
||||||
|
// #define FN_ResetGlobalState ResetGlobalState /* pfnResetGlobalState() */
|
||||||
|
// #define FN_ClientConnect ClientConnect /* pfnClientConnect() (wd) Client has connected */
|
||||||
|
// #define FN_ClientDisconnect ClientDisconnect /* pfnClientDisconnect() (wd) Player has left the game */
|
||||||
|
// #define FN_ClientKill ClientKill /* pfnClientKill() (wd) Player has typed "kill" */
|
||||||
|
// #define FN_ClientPutInServer ClientPutInServer /* pfnClientPutInServer() (wd) Client is entering the game */
|
||||||
|
// #define FN_ClientCommand ClientCommand /* pfnClientCommand() (wd) Player has sent a command (typed or from a bind) */
|
||||||
|
// #define FN_ClientUserInfoChanged ClientUserInfoChanged /* pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure */
|
||||||
|
// #define FN_ServerActivate ServerActivate /* pfnServerActivate() (wd) Server is starting a new map */
|
||||||
|
// #define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */
|
||||||
|
// #define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */
|
||||||
|
// #define FN_PlayerPostThink PlayerPostThink /* pfnPlayerPostThink() */
|
||||||
|
// #define FN_StartFrame StartFrame /* pfnStartFrame() */
|
||||||
|
// #define FN_ParmsNewLevel ParmsNewLevel /* pfnParmsNewLevel() */
|
||||||
|
// #define FN_ParmsChangeLevel ParmsChangeLevel /* pfnParmsChangeLevel() */
|
||||||
|
// #define FN_GetGameDescription GetGameDescription /* pfnGetGameDescription() Returns string describing current .dll. E.g. "TeamFotrress 2" "Half-Life" */
|
||||||
|
// #define FN_PlayerCustomization PlayerCustomization /* pfnPlayerCustomization() Notifies .dll of new customization for player. */
|
||||||
|
// #define FN_SpectatorConnect SpectatorConnect /* pfnSpectatorConnect() Called when spectator joins server */
|
||||||
|
// #define FN_SpectatorDisconnect SpectatorDisconnect /* pfnSpectatorDisconnect() Called when spectator leaves the server */
|
||||||
|
// #define FN_SpectatorThink SpectatorThink /* pfnSpectatorThink() Called when spectator sends a command packet (usercmd_t) */
|
||||||
|
// #define FN_Sys_Error Sys_Error /* pfnSys_Error() Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint. SDK2 */
|
||||||
|
// #define FN_PM_Move PM_Move /* pfnPM_Move() (wd) SDK2 */
|
||||||
|
// #define FN_PM_Init PM_Init /* pfnPM_Init() Server version of player movement initialization; (wd) SDK2 */
|
||||||
|
// #define FN_PM_FindTextureType PM_FindTextureType /* pfnPM_FindTextureType() (wd) SDK2 */
|
||||||
|
// #define FN_SetupVisibility SetupVisibility /* pfnSetupVisibility() Set up PVS and PAS for networking for this client; (wd) SDK2 */
|
||||||
|
// #define FN_UpdateClientData UpdateClientData /* pfnUpdateClientData() Set up data sent only to specific client; (wd) SDK2 */
|
||||||
|
// #define FN_AddToFullPack AddToFullPack /* pfnAddToFullPack() (wd) SDK2 */
|
||||||
|
// #define FN_CreateBaseline CreateBaseline /* pfnCreateBaseline() Tweak entity baseline for network encoding allows setup of player baselines too.; (wd) SDK2 */
|
||||||
|
// #define FN_RegisterEncoders RegisterEncoders /* pfnRegisterEncoders() Callbacks for network encoding; (wd) SDK2 */
|
||||||
|
// #define FN_GetWeaponData GetWeaponData /* pfnGetWeaponData() (wd) SDK2 */
|
||||||
|
// #define FN_CmdStart CmdStart /* pfnCmdStart() (wd) SDK2 */
|
||||||
|
// #define FN_CmdEnd CmdEnd /* pfnCmdEnd() (wd) SDK2 */
|
||||||
|
// #define FN_ConnectionlessPacket ConnectionlessPacket /* pfnConnectionlessPacket() (wd) SDK2 */
|
||||||
|
// #define FN_GetHullBounds GetHullBounds /* pfnGetHullBounds() (wd) SDK2 */
|
||||||
|
// #define FN_CreateInstancedBaselines CreateInstancedBaselines /* pfnCreateInstancedBaselines() (wd) SDK2 */
|
||||||
|
// #define FN_InconsistentFile InconsistentFile /* pfnInconsistentFile() (wd) SDK2 */
|
||||||
|
// #define FN_AllowLagCompensation AllowLagCompensation /* pfnAllowLagCompensation() (wd) SDK2 */
|
||||||
|
|
||||||
|
// - GetEntityAPI2_Post functions
|
||||||
|
// #define FN_GameDLLInit_Post GameDLLInit_Post
|
||||||
|
// #define FN_DispatchSpawn_Post DispatchSpawn_Post
|
||||||
|
// #define FN_DispatchThink_Post DispatchThink_Post
|
||||||
|
// #define FN_DispatchUse_Post DispatchUse_Post
|
||||||
|
// #define FN_DispatchTouch_Post DispatchTouch_Post
|
||||||
|
// #define FN_DispatchBlocked_Post DispatchBlocked_Post
|
||||||
|
// #define FN_DispatchKeyValue_Post DispatchKeyValue_Post
|
||||||
|
// #define FN_DispatchSave_Post DispatchSave_Post
|
||||||
|
// #define FN_DispatchRestore_Post DispatchRestore_Post
|
||||||
|
// #define FN_DispatchObjectCollsionBox_Post DispatchObjectCollsionBox_Post
|
||||||
|
// #define FN_SaveWriteFields_Post SaveWriteFields_Post
|
||||||
|
// #define FN_SaveReadFields_Post SaveReadFields_Post
|
||||||
|
// #define FN_SaveGlobalState_Post SaveGlobalState_Post
|
||||||
|
// #define FN_RestoreGlobalState_Post RestoreGlobalState_Post
|
||||||
|
// #define FN_ResetGlobalState_Post ResetGlobalState_Post
|
||||||
|
// #define FN_ClientConnect_Post ClientConnect_Post
|
||||||
|
// #define FN_ClientDisconnect_Post ClientDisconnect_Post
|
||||||
|
// #define FN_ClientKill_Post ClientKill_Post
|
||||||
|
// #define FN_ClientPutInServer_Post ClientPutInServer_Post
|
||||||
|
// #define FN_ClientCommand_Post ClientCommand_Post
|
||||||
|
// #define FN_ClientUserInfoChanged_Post ClientUserInfoChanged_Post
|
||||||
|
// #define FN_ServerActivate_Post ServerActivate_Post
|
||||||
|
// #define FN_ServerDeactivate_Post ServerDeactivate_Post
|
||||||
|
// #define FN_PlayerPreThink_Post PlayerPreThink_Post
|
||||||
|
// #define FN_PlayerPostThink_Post PlayerPostThink_Post
|
||||||
|
// #define FN_StartFrame_Post StartFrame_Post
|
||||||
|
// #define FN_ParmsNewLevel_Post ParmsNewLevel_Post
|
||||||
|
// #define FN_ParmsChangeLevel_Post ParmsChangeLevel_Post
|
||||||
|
// #define FN_GetGameDescription_Post GetGameDescription_Post
|
||||||
|
// #define FN_PlayerCustomization_Post PlayerCustomization_Post
|
||||||
|
// #define FN_SpectatorConnect_Post SpectatorConnect_Post
|
||||||
|
// #define FN_SpectatorDisconnect_Post SpectatorDisconnect_Post
|
||||||
|
// #define FN_SpectatorThink_Post SpectatorThink_Post
|
||||||
|
// #define FN_Sys_Error_Post Sys_Error_Post
|
||||||
|
// #define FN_PM_Move_Post PM_Move_Post
|
||||||
|
// #define FN_PM_Init_Post PM_Init_Post
|
||||||
|
// #define FN_PM_FindTextureType_Post PM_FindTextureType_Post
|
||||||
|
// #define FN_SetupVisibility_Post SetupVisibility_Post
|
||||||
|
// #define FN_UpdateClientData_Post UpdateClientData_Post
|
||||||
|
// #define FN_AddToFullPack_Post AddToFullPack_Post
|
||||||
|
// #define FN_CreateBaseline_Post CreateBaseline_Post
|
||||||
|
// #define FN_RegisterEncoders_Post RegisterEncoders_Post
|
||||||
|
// #define FN_GetWeaponData_Post GetWeaponData_Post
|
||||||
|
// #define FN_CmdStart_Post CmdStart_Post
|
||||||
|
// #define FN_CmdEnd_Post CmdEnd_Post
|
||||||
|
// #define FN_ConnectionlessPacket_Post ConnectionlessPacket_Post
|
||||||
|
// #define FN_GetHullBounds_Post GetHullBounds_Post
|
||||||
|
// #define FN_CreateInstancedBaselines_Post CreateInstancedBaselines_Post
|
||||||
|
// #define FN_InconsistentFile_Post InconsistentFile_Post
|
||||||
|
// #define FN_AllowLagCompensation_Post AllowLagCompensation_Post
|
||||||
|
|
||||||
|
// - GetEngineAPI functions
|
||||||
|
// #define FN_PrecacheModel PrecacheModel
|
||||||
|
// #define FN_PrecacheSound PrecacheSound
|
||||||
|
// #define FN_SetModel SetModel
|
||||||
|
// #define FN_ModelIndex ModelIndex
|
||||||
|
// #define FN_ModelFrames ModelFrames
|
||||||
|
// #define FN_SetSize SetSize
|
||||||
|
// #define FN_ChangeLevel ChangeLevel
|
||||||
|
// #define FN_GetSpawnParms GetSpawnParms
|
||||||
|
// #define FN_SaveSpawnParms SaveSpawnParms
|
||||||
|
// #define FN_VecToYaw VecToYaw
|
||||||
|
// #define FN_VecToAngles VecToAngles
|
||||||
|
// #define FN_MoveToOrigin MoveToOrigin
|
||||||
|
// #define FN_ChangeYaw ChangeYaw
|
||||||
|
// #define FN_ChangePitch ChangePitch
|
||||||
|
// #define FN_FindEntityByString FindEntityByString
|
||||||
|
// #define FN_GetEntityIllum GetEntityIllum
|
||||||
|
// #define FN_FindEntityInSphere FindEntityInSphere
|
||||||
|
// #define FN_FindClientInPVS FindClientInPVS
|
||||||
|
// #define FN_EntitiesInPVS EntitiesInPVS
|
||||||
|
// #define FN_MakeVectors MakeVectors
|
||||||
|
// #define FN_AngleVectors AngleVectors
|
||||||
|
// #define FN_CreateEntity CreateEntity
|
||||||
|
// #define FN_RemoveEntity RemoveEntity
|
||||||
|
// #define FN_CreateNamedEntity CreateNamedEntity
|
||||||
|
// #define FN_MakeStatic MakeStatic
|
||||||
|
// #define FN_EntIsOnFloor EntIsOnFloor
|
||||||
|
// #define FN_DropToFloor DropToFloor
|
||||||
|
// #define FN_WalkMove WalkMove
|
||||||
|
// #define FN_SetOrigin SetOrigin
|
||||||
|
// #define FN_EmitSound EmitSound
|
||||||
|
// #define FN_EmitAmbientSound EmitAmbientSound
|
||||||
|
// #define FN_TraceLine TraceLine
|
||||||
|
// #define FN_TraceToss TraceToss
|
||||||
|
// #define FN_TraceMonsterHull TraceMonsterHull
|
||||||
|
// #define FN_TraceHull TraceHull
|
||||||
|
// #define FN_TraceModel TraceModel
|
||||||
|
// #define FN_TraceTexture TraceTexture
|
||||||
|
// #define FN_TraceSphere TraceSphere
|
||||||
|
// #define FN_GetAimVector GetAimVector
|
||||||
|
// #define FN_ServerCommand ServerCommand
|
||||||
|
// #define FN_ServerExecute ServerExecute
|
||||||
|
// #define FN_engClientCommand engClientCommand
|
||||||
|
// #define FN_ParticleEffect ParticleEffect
|
||||||
|
// #define FN_LightStyle LightStyle
|
||||||
|
// #define FN_DecalIndex DecalIndex
|
||||||
|
// #define FN_PointContents PointContents
|
||||||
|
// #define FN_MessageBegin MessageBegin
|
||||||
|
// #define FN_MessageEnd MessageEnd
|
||||||
|
// #define FN_WriteByte WriteByte
|
||||||
|
// #define FN_WriteChar WriteChar
|
||||||
|
// #define FN_WriteShort WriteShort
|
||||||
|
// #define FN_WriteLong WriteLong
|
||||||
|
// #define FN_WriteAngle WriteAngle
|
||||||
|
// #define FN_WriteCoord WriteCoord
|
||||||
|
// #define FN_WriteString WriteString
|
||||||
|
// #define FN_WriteEntity WriteEntity
|
||||||
|
// #define FN_CVarRegister CVarRegister
|
||||||
|
// #define FN_CVarGetFloat CVarGetFloat
|
||||||
|
// #define FN_CVarGetString CVarGetString
|
||||||
|
// #define FN_CVarSetFloat CVarSetFloat
|
||||||
|
// #define FN_CVarSetString CVarSetString
|
||||||
|
// #define FN_AlertMessage AlertMessage
|
||||||
|
// #define FN_EngineFprintf EngineFprintf
|
||||||
|
// #define FN_PvAllocEntPrivateData PvAllocEntPrivateData
|
||||||
|
// #define FN_PvEntPrivateData PvEntPrivateData
|
||||||
|
// #define FN_FreeEntPrivateData FreeEntPrivateData
|
||||||
|
// #define FN_SzFromIndex SzFromIndex
|
||||||
|
// #define FN_AllocString AllocString
|
||||||
|
// #define FN_GetVarsOfEnt GetVarsOfEnt
|
||||||
|
// #define FN_PEntityOfEntOffset PEntityOfEntOffset
|
||||||
|
// #define FN_EntOffsetOfPEntity EntOffsetOfPEntity
|
||||||
|
// #define FN_IndexOfEdict IndexOfEdict
|
||||||
|
// #define FN_PEntityOfEntIndex PEntityOfEntIndex
|
||||||
|
// #define FN_FindEntityByVars FindEntityByVars
|
||||||
|
// #define FN_GetModelPtr GetModelPtr
|
||||||
|
// #define FN_RegUserMsg RegUserMsg
|
||||||
|
// #define FN_AnimationAutomove AnimationAutomove
|
||||||
|
// #define FN_GetBonePosition GetBonePosition
|
||||||
|
// #define FN_FunctionFromName FunctionFromName
|
||||||
|
// #define FN_NameForFunction NameForFunction
|
||||||
|
// #define FN_ClientPrintf ClientPrintf
|
||||||
|
// #define FN_ServerPrint ServerPrint
|
||||||
|
// #define FN_Cmd_Args Cmd_Args
|
||||||
|
// #define FN_Cmd_Argv Cmd_Argv
|
||||||
|
// #define FN_Cmd_Argc Cmd_Argc
|
||||||
|
// #define FN_GetAttachment GetAttachment
|
||||||
|
// #define FN_CRC32_Init CRC32_Init
|
||||||
|
// #define FN_CRC32_ProcessBuffer CRC32_ProcessBuffer
|
||||||
|
// #define FN_CRC32_ProcessByte CRC32_ProcessByte
|
||||||
|
// #define FN_CRC32_Final CRC32_Final
|
||||||
|
// #define FN_RandomLong RandomLong
|
||||||
|
// #define FN_RandomFloat RandomFloat
|
||||||
|
// #define FN_SetView SetView
|
||||||
|
// #define FN_Time Time
|
||||||
|
// #define FN_CrosshairAngle CrosshairAngle
|
||||||
|
// #define FN_LoadFileForMe LoadFileForMe
|
||||||
|
// #define FN_FreeFile FreeFile
|
||||||
|
// #define FN_EndSection EndSection
|
||||||
|
// #define FN_CompareFileTime CompareFileTime
|
||||||
|
// #define FN_GetGameDir GetGameDir
|
||||||
|
// #define FN_Cvar_RegisterVariable Cvar_RegisterVariable
|
||||||
|
// #define FN_FadeClientVolume FadeClientVolume
|
||||||
|
// #define FN_SetClientMaxspeed SetClientMaxspeed
|
||||||
|
// #define FN_CreateFakeClient CreateFakeClient
|
||||||
|
// #define FN_RunPlayerMove RunPlayerMove
|
||||||
|
// #define FN_NumberOfEntities NumberOfEntities
|
||||||
|
// #define FN_GetInfoKeyBuffer GetInfoKeyBuffer
|
||||||
|
// #define FN_InfoKeyValue InfoKeyValue
|
||||||
|
// #define FN_SetKeyValue SetKeyValue
|
||||||
|
// #define FN_SetClientKeyValue SetClientKeyValue
|
||||||
|
// #define FN_IsMapValid IsMapValid
|
||||||
|
// #define FN_StaticDecal StaticDecal
|
||||||
|
// #define FN_PrecacheGeneric PrecacheGeneric
|
||||||
|
// #define FN_GetPlayerUserId GetPlayerUserId
|
||||||
|
// #define FN_BuildSoundMsg BuildSoundMsg
|
||||||
|
// #define FN_IsDedicatedServer IsDedicatedServer
|
||||||
|
// #define FN_CVarGetPointer CVarGetPointer
|
||||||
|
// #define FN_GetPlayerWONId GetPlayerWONId
|
||||||
|
// #define FN_Info_RemoveKey Info_RemoveKey
|
||||||
|
// #define FN_GetPhysicsKeyValue GetPhysicsKeyValue
|
||||||
|
// #define FN_SetPhysicsKeyValue SetPhysicsKeyValue
|
||||||
|
// #define FN_GetPhysicsInfoString GetPhysicsInfoString
|
||||||
|
// #define FN_PrecacheEvent PrecacheEvent
|
||||||
|
// #define FN_PlaybackEvent PlaybackEvent
|
||||||
|
// #define FN_SetFatPVS SetFatPVS
|
||||||
|
// #define FN_SetFatPAS SetFatPAS
|
||||||
|
// #define FN_CheckVisibility CheckVisibility
|
||||||
|
// #define FN_DeltaSetField DeltaSetField
|
||||||
|
// #define FN_DeltaUnsetField DeltaUnsetField
|
||||||
|
// #define FN_DeltaAddEncoder DeltaAddEncoder
|
||||||
|
// #define FN_GetCurrentPlayer GetCurrentPlayer
|
||||||
|
// #define FN_CanSkipPlayer CanSkipPlayer
|
||||||
|
// #define FN_DeltaFindField DeltaFindField
|
||||||
|
// #define FN_DeltaSetFieldByIndex DeltaSetFieldByIndex
|
||||||
|
// #define FN_DeltaUnsetFieldByIndex DeltaUnsetFieldByIndex
|
||||||
|
// #define FN_SetGroupMask SetGroupMask
|
||||||
|
// #define FN_engCreateInstancedBaseline engCreateInstancedBaseline
|
||||||
|
// #define FN_Cvar_DirectSet Cvar_DirectSet
|
||||||
|
// #define FN_ForceUnmodified ForceUnmodified
|
||||||
|
// #define FN_GetPlayerStats GetPlayerStats
|
||||||
|
// #define FN_AddServerCommand AddServerCommand
|
||||||
|
// #define FN_Voice_GetClientListening Voice_GetClientListening
|
||||||
|
// #define FN_Voice_SetClientListening Voice_SetClientListening
|
||||||
|
// #define FN_GetPlayerAuthId GetPlayerAuthId
|
||||||
|
|
||||||
|
// - GetEngineAPI_Post functions
|
||||||
|
// #define FN_PrecacheModel_Post PrecacheModel_Post
|
||||||
|
// #define FN_PrecacheSound_Post PrecacheSound_Post
|
||||||
|
// #define FN_SetModel_Post SetModel_Post
|
||||||
|
// #define FN_ModelIndex_Post ModelIndex_Post
|
||||||
|
// #define FN_ModelFrames_Post ModelFrames_Post
|
||||||
|
// #define FN_SetSize_Post SetSize_Post
|
||||||
|
// #define FN_ChangeLevel_Post ChangeLevel_Post
|
||||||
|
// #define FN_GetSpawnParms_Post GetSpawnParms_Post
|
||||||
|
// #define FN_SaveSpawnParms_Post SaveSpawnParms_Post
|
||||||
|
// #define FN_VecToYaw_Post VecToYaw_Post
|
||||||
|
// #define FN_VecToAngles_Post VecToAngles_Post
|
||||||
|
// #define FN_MoveToOrigin_Post MoveToOrigin_Post
|
||||||
|
// #define FN_ChangeYaw_Post ChangeYaw_Post
|
||||||
|
// #define FN_ChangePitch_Post ChangePitch_Post
|
||||||
|
// #define FN_FindEntityByString_Post FindEntityByString_Post
|
||||||
|
// #define FN_GetEntityIllum_Post GetEntityIllum_Post
|
||||||
|
// #define FN_FindEntityInSphere_Post FindEntityInSphere_Post
|
||||||
|
// #define FN_FindClientInPVS_Post FindClientInPVS_Post
|
||||||
|
// #define FN_EntitiesInPVS_Post EntitiesInPVS_Post
|
||||||
|
// #define FN_MakeVectors_Post MakeVectors_Post
|
||||||
|
// #define FN_AngleVectors_Post AngleVectors_Post
|
||||||
|
// #define FN_CreateEntity_Post CreateEntity_Post
|
||||||
|
// #define FN_RemoveEntity_Post RemoveEntity_Post
|
||||||
|
// #define FN_CreateNamedEntity_Post CreateNamedEntity_Post
|
||||||
|
// #define FN_MakeStatic_Post MakeStatic_Post
|
||||||
|
// #define FN_EntIsOnFloor_Post EntIsOnFloor_Post
|
||||||
|
// #define FN_DropToFloor_Post DropToFloor_Post
|
||||||
|
// #define FN_WalkMove_Post WalkMove_Post
|
||||||
|
// #define FN_SetOrigin_Post SetOrigin_Post
|
||||||
|
// #define FN_EmitSound_Post EmitSound_Post
|
||||||
|
// #define FN_EmitAmbientSound_Post EmitAmbientSound_Post
|
||||||
|
// #define FN_TraceLine_Post TraceLine_Post
|
||||||
|
// #define FN_TraceToss_Post TraceToss_Post
|
||||||
|
// #define FN_TraceMonsterHull_Post TraceMonsterHull_Post
|
||||||
|
// #define FN_TraceHull_Post TraceHull_Post
|
||||||
|
// #define FN_TraceModel_Post TraceModel_Post
|
||||||
|
// #define FN_TraceTexture_Post TraceTexture_Post
|
||||||
|
// #define FN_TraceSphere_Post TraceSphere_Post
|
||||||
|
// #define FN_GetAimVector_Post GetAimVector_Post
|
||||||
|
// #define FN_ServerCommand_Post ServerCommand_Post
|
||||||
|
// #define FN_ServerExecute_Post ServerExecute_Post
|
||||||
|
// #define FN_engClientCommand_Post engClientCommand_Post
|
||||||
|
// #define FN_ParticleEffect_Post ParticleEffect_Post
|
||||||
|
// #define FN_LightStyle_Post LightStyle_Post
|
||||||
|
// #define FN_DecalIndex_Post DecalIndex_Post
|
||||||
|
// #define FN_PointContents_Post PointContents_Post
|
||||||
|
// #define FN_MessageBegin_Post MessageBegin_Post
|
||||||
|
// #define FN_MessageEnd_Post MessageEnd_Post
|
||||||
|
// #define FN_WriteByte_Post WriteByte_Post
|
||||||
|
// #define FN_WriteChar_Post WriteChar_Post
|
||||||
|
// #define FN_WriteShort_Post WriteShort_Post
|
||||||
|
// #define FN_WriteLong_Post WriteLong_Post
|
||||||
|
// #define FN_WriteAngle_Post WriteAngle_Post
|
||||||
|
// #define FN_WriteCoord_Post WriteCoord_Post
|
||||||
|
// #define FN_WriteString_Post WriteString_Post
|
||||||
|
// #define FN_WriteEntity_Post WriteEntity_Post
|
||||||
|
// #define FN_CVarRegister_Post CVarRegister_Post
|
||||||
|
// #define FN_CVarGetFloat_Post CVarGetFloat_Post
|
||||||
|
// #define FN_CVarGetString_Post CVarGetString_Post
|
||||||
|
// #define FN_CVarSetFloat_Post CVarSetFloat_Post
|
||||||
|
// #define FN_CVarSetString_Post CVarSetString_Post
|
||||||
|
// #define FN_AlertMessage_Post AlertMessage_Post
|
||||||
|
// #define FN_EngineFprintf_Post EngineFprintf_Post
|
||||||
|
// #define FN_PvAllocEntPrivateData_Post PvAllocEntPrivateData_Post
|
||||||
|
// #define FN_PvEntPrivateData_Post PvEntPrivateData_Post
|
||||||
|
// #define FN_FreeEntPrivateData_Post FreeEntPrivateData_Post
|
||||||
|
// #define FN_SzFromIndex_Post SzFromIndex_Post
|
||||||
|
// #define FN_AllocString_Post AllocString_Post
|
||||||
|
// #define FN_GetVarsOfEnt_Post GetVarsOfEnt_Post
|
||||||
|
// #define FN_PEntityOfEntOffset_Post PEntityOfEntOffset_Post
|
||||||
|
// #define FN_EntOffsetOfPEntity_Post EntOffsetOfPEntity_Post
|
||||||
|
// #define FN_IndexOfEdict_Post IndexOfEdict_Post
|
||||||
|
// #define FN_PEntityOfEntIndex_Post PEntityOfEntIndex_Post
|
||||||
|
// #define FN_FindEntityByVars_Post FindEntityByVars_Post
|
||||||
|
// #define FN_GetModelPtr_Post GetModelPtr_Post
|
||||||
|
// #define FN_RegUserMsg_Post RegUserMsg_Post
|
||||||
|
// #define FN_AnimationAutomove_Post AnimationAutomove_Post
|
||||||
|
// #define FN_GetBonePosition_Post GetBonePosition_Post
|
||||||
|
// #define FN_FunctionFromName_Post FunctionFromName_Post
|
||||||
|
// #define FN_NameForFunction_Post NameForFunction_Post
|
||||||
|
// #define FN_ClientPrintf_Post ClientPrintf_Post
|
||||||
|
// #define FN_ServerPrint_Post ServerPrint_Post
|
||||||
|
// #define FN_Cmd_Args_Post Cmd_Args_Post
|
||||||
|
// #define FN_Cmd_Argv_Post Cmd_Argv_Post
|
||||||
|
// #define FN_Cmd_Argc_Post Cmd_Argc_Post
|
||||||
|
// #define FN_GetAttachment_Post GetAttachment_Post
|
||||||
|
// #define FN_CRC32_Init_Post CRC32_Init_Post
|
||||||
|
// #define FN_CRC32_ProcessBuffer_Post CRC32_ProcessBuffer_Post
|
||||||
|
// #define FN_CRC32_ProcessByte_Post CRC32_ProcessByte_Post
|
||||||
|
// #define FN_CRC32_Final_Post CRC32_Final_Post
|
||||||
|
// #define FN_RandomLong_Post RandomLong_Post
|
||||||
|
// #define FN_RandomFloat_Post RandomFloat_Post
|
||||||
|
// #define FN_SetView_Post SetView_Post
|
||||||
|
// #define FN_Time_Post Time_Post
|
||||||
|
// #define FN_CrosshairAngle_Post CrosshairAngle_Post
|
||||||
|
// #define FN_LoadFileForMe_Post LoadFileForMe_Post
|
||||||
|
// #define FN_FreeFile_Post FreeFile_Post
|
||||||
|
// #define FN_EndSection_Post EndSection_Post
|
||||||
|
// #define FN_CompareFileTime_Post CompareFileTime_Post
|
||||||
|
// #define FN_GetGameDir_Post GetGameDir_Post
|
||||||
|
// #define FN_Cvar_RegisterVariable_Post Cvar_RegisterVariable_Post
|
||||||
|
// #define FN_FadeClientVolume_Post FadeClientVolume_Post
|
||||||
|
// #define FN_SetClientMaxspeed_Post SetClientMaxspeed_Post
|
||||||
|
// #define FN_CreateFakeClient_Post CreateFakeClient_Post
|
||||||
|
// #define FN_RunPlayerMove_Post RunPlayerMove_Post
|
||||||
|
// #define FN_NumberOfEntities_Post NumberOfEntities_Post
|
||||||
|
// #define FN_GetInfoKeyBuffer_Post GetInfoKeyBuffer_Post
|
||||||
|
// #define FN_InfoKeyValue_Post InfoKeyValue_Post
|
||||||
|
// #define FN_SetKeyValue_Post SetKeyValue_Post
|
||||||
|
// #define FN_SetClientKeyValue_Post SetClientKeyValue_Post
|
||||||
|
// #define FN_IsMapValid_Post IsMapValid_Post
|
||||||
|
// #define FN_StaticDecal_Post StaticDecal_Post
|
||||||
|
// #define FN_PrecacheGeneric_Post PrecacheGeneric_Post
|
||||||
|
// #define FN_GetPlayerUserId_Post GetPlayerUserId_Post
|
||||||
|
// #define FN_BuildSoundMsg_Post BuildSoundMsg_Post
|
||||||
|
// #define FN_IsDedicatedServer_Post IsDedicatedServer_Post
|
||||||
|
// #define FN_CVarGetPointer_Post CVarGetPointer_Post
|
||||||
|
// #define FN_GetPlayerWONId_Post GetPlayerWONId_Post
|
||||||
|
// #define FN_Info_RemoveKey_Post Info_RemoveKey_Post
|
||||||
|
// #define FN_GetPhysicsKeyValue_Post GetPhysicsKeyValue_Post
|
||||||
|
// #define FN_SetPhysicsKeyValue_Post SetPhysicsKeyValue_Post
|
||||||
|
// #define FN_GetPhysicsInfoString_Post GetPhysicsInfoString_Post
|
||||||
|
// #define FN_PrecacheEvent_Post PrecacheEvent_Post
|
||||||
|
// #define FN_PlaybackEvent_Post PlaybackEvent_Post
|
||||||
|
// #define FN_SetFatPVS_Post SetFatPVS_Post
|
||||||
|
// #define FN_SetFatPAS_Post SetFatPAS_Post
|
||||||
|
// #define FN_CheckVisibility_Post CheckVisibility_Post
|
||||||
|
// #define FN_DeltaSetField_Post DeltaSetField_Post
|
||||||
|
// #define FN_DeltaUnsetField_Post DeltaUnsetField_Post
|
||||||
|
// #define FN_DeltaAddEncoder_Post DeltaAddEncoder_Post
|
||||||
|
// #define FN_GetCurrentPlayer_Post GetCurrentPlayer_Post
|
||||||
|
// #define FN_CanSkipPlayer_Post CanSkipPlayer_Post
|
||||||
|
// #define FN_DeltaFindField_Post DeltaFindField_Post
|
||||||
|
// #define FN_DeltaSetFieldByIndex_Post DeltaSetFieldByIndex_Post
|
||||||
|
// #define FN_DeltaUnsetFieldByIndex_Post DeltaUnsetFieldByIndex_Post
|
||||||
|
// #define FN_SetGroupMask_Post SetGroupMask_Post
|
||||||
|
// #define FN_engCreateInstancedBaseline_Post engCreateInstancedBaseline_Post
|
||||||
|
// #define FN_Cvar_DirectSet_Post Cvar_DirectSet_Post
|
||||||
|
// #define FN_ForceUnmodified_Post ForceUnmodified_Post
|
||||||
|
// #define FN_GetPlayerStats_Post GetPlayerStats_Post
|
||||||
|
// #define FN_AddServerCommand_Post AddServerCommand_Post
|
||||||
|
// #define FN_Voice_GetClientListening_Post Voice_GetClientListening_Post
|
||||||
|
// #define FN_Voice_SetClientListening_Post Voice_SetClientListening_Post
|
||||||
|
// #define FN_GetPlayerAuthId_Post GetPlayerAuthId_Post
|
||||||
|
|
||||||
|
// #define FN_OnFreeEntPrivateData OnFreeEntPrivateData
|
||||||
|
// #define FN_GameShutdown GameShutdown
|
||||||
|
// #define FN_ShouldCollide ShouldCollide
|
||||||
|
|
||||||
|
// #define FN_OnFreeEntPrivateData_Post OnFreeEntPrivateData_Post
|
||||||
|
// #define FN_GameShutdown_Post GameShutdown_Post
|
||||||
|
// #define FN_ShouldCollide_Post ShouldCollide_Post
|
||||||
|
|
||||||
|
|
||||||
|
#endif // USE_METAMOD
|
||||||
|
|
||||||
|
#endif // __MODULECONFIG_H__
|
40
dlls/BB/pdata.h
Normal file
40
dlls/BB/pdata.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// prevent double include
|
||||||
|
#ifndef __PDATA_H__
|
||||||
|
#define __PDATA_H__
|
||||||
|
|
||||||
|
#include <extdll.h>
|
||||||
|
#include "amxxmodule.h"
|
||||||
|
|
||||||
|
#if defined __linux__
|
||||||
|
#define EXTRAOFFSET 5 // offsets 5 higher in Linux builds
|
||||||
|
#else
|
||||||
|
#define EXTRAOFFSET 0 // no change in Windows builds
|
||||||
|
#endif // defined __linux__
|
||||||
|
|
||||||
|
inline edict_t* MF_GetEntityEdict( long& EntID )
|
||||||
|
{
|
||||||
|
if( (EntID > 0) && (EntID <= (gpGlobals->maxClients) ) )
|
||||||
|
return MF_GetPlayerEdict( EntID );
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename ValueType>
|
||||||
|
inline void SetPData( long& targetid, long offset, ValueType value, bool reset = false )
|
||||||
|
{
|
||||||
|
edict_t* target = MF_GetEntityEdict( targetid );
|
||||||
|
if(target == NULL) return;
|
||||||
|
|
||||||
|
*((ValueType *)target->pvPrivateData + offset + EXTRAOFFSET) = value;
|
||||||
|
if(reset) UpdateBBHud( targetid );
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename ValueType>
|
||||||
|
inline ValueType GetPData( long& targetid, long offset, ValueType value )
|
||||||
|
{
|
||||||
|
edict_t* target = MF_GetEntityEdict( targetid );
|
||||||
|
if(target == NULL) return NULL;
|
||||||
|
return *((ValueType *)target->pvPrivateData + offset + EXTRAOFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
48
dlls/MemHack/MemConst.h
Normal file
48
dlls/MemHack/MemConst.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#ifndef __MEMCONST_H__
|
||||||
|
#define __MEMCONST_H__
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "amxxmodule.h"
|
||||||
|
|
||||||
|
// Define memory address type
|
||||||
|
#ifdef __amd64__
|
||||||
|
typedef uint64_t maddress;
|
||||||
|
#else
|
||||||
|
typedef uint32_t maddress;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Number of bytes for different data types
|
||||||
|
#define BYTE_BYTES 1
|
||||||
|
#define WORD_BYTES 2
|
||||||
|
#define DWORD_BYTES 4
|
||||||
|
#define QWORD_BYTES 8
|
||||||
|
#define FLOAT_BYTES 4
|
||||||
|
|
||||||
|
// Return codes for MemoryProtect
|
||||||
|
#define MP_FAIL -1
|
||||||
|
#define MP_OK 0
|
||||||
|
|
||||||
|
// Memory protection constants
|
||||||
|
#ifdef __linux__
|
||||||
|
#define MPROT_CODE PROT_READ|PROT_EXEC
|
||||||
|
#define MPROT_DATA PROT_READ|PROT_WRITE
|
||||||
|
#define MPROT_RODATA PROT_READ
|
||||||
|
#define MPROT_CODE_EDIT PROT_READ|PROT_WRITE|PROT_EXEC
|
||||||
|
#define MPROT_RODATA_EDIT PROT_READ|PROT_WRITE
|
||||||
|
#else
|
||||||
|
#define MPROT_CODE PAGE_EXECUTE_READ
|
||||||
|
#define MPROT_DATA PAGE_READWRITE
|
||||||
|
#define MPROT_RODATA PAGE_READONLY
|
||||||
|
#define MPROT_CODE_EDIT PAGE_EXECUTE_READWRITE
|
||||||
|
#define MPROT_RODATA_EDIT PAGE_READWRITE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Memory area types
|
||||||
|
#define MEMTYPE_CODE 0 // Code (usually .text segment, requires mprotect or VirtualProtect)
|
||||||
|
#define MEMTYPE_DATA 1 // Data (usually .data segment, writable by default)
|
||||||
|
#define MEMTYPE_RODATA 2 // Read-Only Data (usually .rodata on Linux, .rdata on Windows)
|
||||||
|
|
||||||
|
#endif // #ifndef __MEMHACK_H__
|
16
dlls/MemHack/MemHack.cpp
Normal file
16
dlls/MemHack/MemHack.cpp
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include "MemMisc.h"
|
||||||
|
|
||||||
|
extern AMX_NATIVE_INFO read_natives[];
|
||||||
|
extern AMX_NATIVE_INFO write_natives[];
|
||||||
|
extern AMX_NATIVE_INFO misc_natives[];
|
||||||
|
|
||||||
|
void OnAmxxAttach()
|
||||||
|
{
|
||||||
|
// Get Base Addresses for dll and engine; exit if unavailable.
|
||||||
|
if(GetBaseAddresses() == false) return MF_LogError(NULL,AMX_ERR_MEMACCESS,"Unable to get base address of game or mod .dll!");
|
||||||
|
|
||||||
|
// Add natives if base is found.
|
||||||
|
MF_AddNatives(read_natives);
|
||||||
|
MF_AddNatives(write_natives);
|
||||||
|
MF_AddNatives(misc_natives);
|
||||||
|
}
|
BIN
dlls/MemHack/MemHack.ncb
Normal file
BIN
dlls/MemHack/MemHack.ncb
Normal file
Binary file not shown.
@ -1,7 +1,6 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
# Visual Studio 2005
|
# Visual C++ Express 2005
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tsx", "tsx.vcproj", "{7F18E00C-6271-4CAB-B18A-746BE3EC68E7}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "memhack", "MemHack.vcproj", "{B0190B77-FE9B-495F-8D7E-74D458EBE635}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@ -9,10 +8,10 @@ Global
|
|||||||
Release|Win32 = Release|Win32
|
Release|Win32 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{7F18E00C-6271-4CAB-B18A-746BE3EC68E7}.Debug|Win32.ActiveCfg = Debug|Win32
|
{B0190B77-FE9B-495F-8D7E-74D458EBE635}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
{7F18E00C-6271-4CAB-B18A-746BE3EC68E7}.Debug|Win32.Build.0 = Debug|Win32
|
{B0190B77-FE9B-495F-8D7E-74D458EBE635}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{7F18E00C-6271-4CAB-B18A-746BE3EC68E7}.Release|Win32.ActiveCfg = Release|Win32
|
{B0190B77-FE9B-495F-8D7E-74D458EBE635}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{7F18E00C-6271-4CAB-B18A-746BE3EC68E7}.Release|Win32.Build.0 = Release|Win32
|
{B0190B77-FE9B-495F-8D7E-74D458EBE635}.Release|Win32.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
@ -2,9 +2,8 @@
|
|||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8.00"
|
Version="8.00"
|
||||||
Name="hamsandwich"
|
Name="memhack"
|
||||||
ProjectGUID="{5E393C37-22F2-4CA2-9022-6400DC582447}"
|
ProjectGUID="{B0190B77-FE9B-495F-8D7E-74D458EBE635}"
|
||||||
RootNamespace="hamsandwich"
|
|
||||||
Keyword="Win32Proj"
|
Keyword="Win32Proj"
|
||||||
>
|
>
|
||||||
<Platforms>
|
<Platforms>
|
||||||
@ -41,16 +40,16 @@
|
|||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
Optimization="0"
|
Optimization="0"
|
||||||
AdditionalIncludeDirectories="..\..\..\..\hlsdk\dlls;..\..\..\..\hlsdk\common;..\..\..\..\hlsdk\engine\;..\..\..\..\hlsdk\pm_shared; ..\..\..\metamod\metamod"
|
AdditionalIncludeDirectories=""C:\Program Files\Steam\hlsdk\Multiplayer Source\metamod\metamod-1.17.3\metamod";"C:\Program Files\Steam\hlsdk\Multiplayer Source\common";"C:\Program Files\Steam\hlsdk\Multiplayer Source\engine";"C:\Program Files\Steam\hlsdk\Multiplayer Source\dlls";"C:\Program Files\Steam\hlsdk\Multiplayer Source\pm_shared""
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL"
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MEMHACK_EXPORTS"
|
||||||
MinimalRebuild="true"
|
MinimalRebuild="true"
|
||||||
BasicRuntimeChecks="3"
|
BasicRuntimeChecks="3"
|
||||||
RuntimeLibrary="1"
|
RuntimeLibrary="1"
|
||||||
RuntimeTypeInfo="false"
|
StructMemberAlignment="3"
|
||||||
UsePrecompiledHeader="0"
|
UsePrecompiledHeader="0"
|
||||||
WarningLevel="3"
|
WarningLevel="3"
|
||||||
Detect64BitPortabilityProblems="false"
|
Detect64BitPortabilityProblems="false"
|
||||||
DebugInformationFormat="3"
|
DebugInformationFormat="4"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCManagedResourceCompilerTool"
|
Name="VCManagedResourceCompilerTool"
|
||||||
@ -63,12 +62,12 @@
|
|||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
OutputFile="$(OutDir)/hamsandwich_amxx.dll"
|
OutputFile="$(OutDir)/memhack_amxx.dll"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(OutDir)/hamsandwich.pdb"
|
ProgramDatabaseFile="$(OutDir)/memhack.pdb"
|
||||||
SubSystem="2"
|
SubSystem="2"
|
||||||
ImportLibrary="$(OutDir)/hamsandwich.lib"
|
ImportLibrary="$(OutDir)/memhack.lib"
|
||||||
TargetMachine="1"
|
TargetMachine="1"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
@ -94,7 +93,6 @@
|
|||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCPostBuildEventTool"
|
Name="VCPostBuildEventTool"
|
||||||
CommandLine="copy $(OutDir)\hamsandwich_amxx.dll c:\hlds\cstrike\addons\amxmodx\modules"
|
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
<Configuration
|
<Configuration
|
||||||
@ -122,14 +120,15 @@
|
|||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
AdditionalIncludeDirectories="..\..\..\..\hlsdk\dlls;..\..\..\..\hlsdk\common;..\..\..\..\hlsdk\engine\;..\..\..\..\hlsdk\pm_shared; ..\..\..\metamod\metamod"
|
Optimization="0"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL"
|
AdditionalIncludeDirectories=""C:\Program Files\Steam\hlsdk\Multiplayer Source\metamod\metamod-1.17.3\metamod";"C:\Program Files\Steam\hlsdk\Multiplayer Source\common";"C:\Program Files\Steam\hlsdk\Multiplayer Source\engine";"C:\Program Files\Steam\hlsdk\Multiplayer Source\dlls";"C:\Program Files\Steam\hlsdk\Multiplayer Source\pm_shared""
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MEMHACK_EXPORTS"
|
||||||
RuntimeLibrary="0"
|
RuntimeLibrary="0"
|
||||||
RuntimeTypeInfo="false"
|
StructMemberAlignment="3"
|
||||||
UsePrecompiledHeader="0"
|
UsePrecompiledHeader="0"
|
||||||
WarningLevel="3"
|
WarningLevel="3"
|
||||||
Detect64BitPortabilityProblems="false"
|
Detect64BitPortabilityProblems="false"
|
||||||
DebugInformationFormat="3"
|
DebugInformationFormat="0"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCManagedResourceCompilerTool"
|
Name="VCManagedResourceCompilerTool"
|
||||||
@ -142,13 +141,14 @@
|
|||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
OutputFile="$(OutDir)/hamsandwich_amxx.dll"
|
OutputFile="$(OutDir)/memhack_amxx.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="false"
|
||||||
SubSystem="2"
|
SubSystem="2"
|
||||||
OptimizeReferences="2"
|
OptimizeReferences="2"
|
||||||
EnableCOMDATFolding="2"
|
EnableCOMDATFolding="2"
|
||||||
ImportLibrary="$(OutDir)/hamsandwich.lib"
|
OptimizeForWindows98="1"
|
||||||
|
ImportLibrary="$(OutDir)/memhack.lib"
|
||||||
TargetMachine="1"
|
TargetMachine="1"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
@ -181,133 +181,73 @@
|
|||||||
</References>
|
</References>
|
||||||
<Files>
|
<Files>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Hooks"
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
>
|
>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\call_funcs.cpp"
|
RelativePath=".\amxxmodule.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\call_funcs.h"
|
RelativePath=".\MemHack.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\forward.h"
|
RelativePath=".\MemMisc.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\hook.h"
|
RelativePath=".\MemMiscNatives.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\hook_callbacks.cpp"
|
RelativePath=".\MemRead.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\hook_callbacks.h"
|
RelativePath=".\MemReadNatives.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\hook_create.cpp"
|
RelativePath=".\MemWrite.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\hook_create.h"
|
RelativePath=".\MemWriteNatives.cpp"
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\hook_native.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\hooklist.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\typetocell.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<Filter
|
|
||||||
Name="Trampolines"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\Trampolines.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="sdk"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\sdk\amxxmodule.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\sdk\amxxmodule.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\sdk\moduleconfig.h"
|
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Config File"
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
>
|
>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\config_parser.cpp"
|
RelativePath=".\amxxmodule.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\MemConst.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\MemMisc.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\MemRead.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\MemWrite.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\moduleconfig.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
|
||||||
Name="Data Handler"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\CString.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\DataHandler.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\DataHandler.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\pdata.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\sh_stack.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<File
|
|
||||||
RelativePath="..\amxx_api.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\ham_const.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\ham_utils.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\NEW_Util.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\offsets.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\srvcmd.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Files>
|
</Files>
|
||||||
<Globals>
|
<Globals>
|
||||||
</Globals>
|
</Globals>
|
111
dlls/MemHack/MemMisc.cpp
Normal file
111
dlls/MemHack/MemMisc.cpp
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
#include "MemConst.h"
|
||||||
|
|
||||||
|
// Game memory addresses
|
||||||
|
maddress gameDllAddress = NULL;
|
||||||
|
maddress gameEngAddress = NULL;
|
||||||
|
|
||||||
|
bool GetBaseAddress(void *pAddr, maddress &pBaseAddr/*, size_t *memLength*/)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
MEMORY_BASIC_INFORMATION mem;
|
||||||
|
if (!VirtualQuery(pAddr, &mem, sizeof(mem)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pBaseAddr = (maddress)mem.AllocationBase;
|
||||||
|
|
||||||
|
IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *)(mem.AllocationBase);
|
||||||
|
IMAGE_NT_HEADERS *pe = reinterpret_cast<IMAGE_NT_HEADERS*>( (unsigned long)dos + (unsigned long)dos->e_lfanew );
|
||||||
|
if (pe->Signature != IMAGE_NT_SIGNATURE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
//if (memLength)
|
||||||
|
//*memLength = (size_t)(pe->OptionalHeader.SizeOfImage);
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
Dl_info info;
|
||||||
|
struct stat buf;
|
||||||
|
|
||||||
|
if (!dladdr(pAddr, &info))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!info.dli_fbase || !info.dli_fname)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (stat(info.dli_fname, &buf) != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (pBaseAddr)
|
||||||
|
*pBaseAddr = (unsigned char *)info.dli_fbase;
|
||||||
|
//if (memLength)
|
||||||
|
//*memLength = buf.st_size;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wrapper for mprotect and VirtualProtect */
|
||||||
|
int MemoryProtect(void *addr, size_t len, unsigned long newProt, unsigned long *oldProt, char memType) {
|
||||||
|
int retVal;
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
maddress alignAddr = (maddress)addr - ((maddress)addr % pageSize);
|
||||||
|
retVal = mprotect((void*)alignAddr, pageSize, newProt);
|
||||||
|
|
||||||
|
// Linux's mprotect doesn't get the old protection flags, so we have to fake it
|
||||||
|
switch (memType) {
|
||||||
|
case MEMTYPE_CODE:
|
||||||
|
*oldProt = MPROT_CODE;
|
||||||
|
break;
|
||||||
|
case MEMTYPE_RODATA:
|
||||||
|
*oldProt = MPROT_RODATA;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*oldProt = MPROT_CODE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
retVal = VirtualProtect(addr, len, newProt, oldProt);
|
||||||
|
// This will match the Windows return value with the Linux ones, done for consistency
|
||||||
|
if (retVal == 0) {
|
||||||
|
retVal = -1;
|
||||||
|
} else {
|
||||||
|
retVal = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Linux won't work till I fix it for MEMTYPE_DATA
|
||||||
|
#ifdef __linux__
|
||||||
|
// Data section stuff
|
||||||
|
maddress dataSectionStart;
|
||||||
|
maddress dataSectionOffset;
|
||||||
|
|
||||||
|
int pageSize = sysconf(_SC_PAGESIZE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Gets real memory address */
|
||||||
|
maddress GetRealMemoryAddress(maddress baseaddress, maddress address, char memType)
|
||||||
|
{
|
||||||
|
if(baseaddress == NULL) return address;
|
||||||
|
|
||||||
|
maddress realAddress = address;
|
||||||
|
|
||||||
|
switch (memType)
|
||||||
|
{
|
||||||
|
case MEMTYPE_CODE: case MEMTYPE_RODATA:
|
||||||
|
realAddress = baseaddress + address;
|
||||||
|
break;
|
||||||
|
case MEMTYPE_DATA:
|
||||||
|
// Linux's data segment is in a not so simple place in memory
|
||||||
|
#ifdef __linux__
|
||||||
|
realAddress = dataSectionStart + (address - dataSectionOffset);
|
||||||
|
#else
|
||||||
|
realAddress = baseaddress + address;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return realAddress;
|
||||||
|
}
|
38
dlls/MemHack/MemMisc.h
Normal file
38
dlls/MemHack/MemMisc.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#ifndef __MEMMISC_H__
|
||||||
|
#define __MEMMISC_H__
|
||||||
|
|
||||||
|
#include "MemConst.h"
|
||||||
|
|
||||||
|
#define SAMPLE_DLLFUNC reinterpret_cast<void*>(gpGamedllFuncs->dllapi_table->pfnThink)
|
||||||
|
#define SAMPLE_ENGFUNC reinterpret_cast<void*>(g_engfuncs.pfnChangeLevel)
|
||||||
|
|
||||||
|
extern maddress gameDllAddress;
|
||||||
|
extern maddress gameEngAddress;
|
||||||
|
|
||||||
|
inline maddress PickBaseAddress(long num)
|
||||||
|
{
|
||||||
|
if(num == 0) return gameDllAddress;
|
||||||
|
else if(num == 1) return gameEngAddress;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern int MemoryProtect(void *addr, size_t len, unsigned long newProt, unsigned long *oldProt, char memType = MEMTYPE_CODE);
|
||||||
|
extern maddress GetRealMemoryAddress(maddress baseaddress,maddress address, char memType);
|
||||||
|
|
||||||
|
extern bool GetBaseAddress(void *pAddr, maddress &pBaseAddr);
|
||||||
|
|
||||||
|
inline bool GetBaseAddresses( void )
|
||||||
|
{
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
success = GetBaseAddress(SAMPLE_DLLFUNC, gameDllAddress);
|
||||||
|
if(success == false) return false;
|
||||||
|
|
||||||
|
success = GetBaseAddress(SAMPLE_ENGFUNC, gameEngAddress);
|
||||||
|
if(success == false) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
33
dlls/MemHack/MemMiscNatives.cpp
Normal file
33
dlls/MemHack/MemMiscNatives.cpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#include "MemMisc.h"
|
||||||
|
|
||||||
|
#define NATIVE_MISC_ADDRESS params[1]
|
||||||
|
#define NATIVE_MISC_BASEADDRESS PickBaseAddress(params[2])
|
||||||
|
#define NATIVE_MISC_FLAGS params[3]
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_get_base(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
cell *success = MF_GetAmxAddr(amx, params[2]);
|
||||||
|
maddress BaseAddr = NULL;
|
||||||
|
|
||||||
|
bool is_success = GetBaseAddress((void*)(params[1]), BaseAddr);
|
||||||
|
*success = is_success;
|
||||||
|
|
||||||
|
return cell(BaseAddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_get_realaddr(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
return (cell)GetRealMemoryAddress(NATIVE_MISC_ADDRESS,NATIVE_MISC_BASEADDRESS,NATIVE_MISC_FLAGS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_return_addr(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
return (cell)PickBaseAddress(params[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
AMX_NATIVE_INFO misc_natives[] = {
|
||||||
|
{ "memhack_get_base", memhack_get_base },
|
||||||
|
{ "memhack_get_realaddr", memhack_get_realaddr },
|
||||||
|
{ "memhack_return_addr", memhack_return_addr },
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
56
dlls/MemHack/MemRead.cpp
Normal file
56
dlls/MemHack/MemRead.cpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#include "MemMisc.h"
|
||||||
|
|
||||||
|
/* Functions that read different data types in memory */
|
||||||
|
|
||||||
|
template <typename Type>
|
||||||
|
Type UTIL_ReadMemory(maddress BaseAddress, maddress StartAddress, char MemType, Type returnType)
|
||||||
|
{
|
||||||
|
maddress EndAddress = GetRealMemoryAddress(BaseAddress, StartAddress, MemType);
|
||||||
|
|
||||||
|
return *(Type*)EndAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
char UTIL_ReadMemory_Byte(maddress BaseAddress, maddress address, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_ReadMemory( BaseAddress, address, memType, char(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
short UTIL_ReadMemory_Word(maddress BaseAddress, maddress address, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_ReadMemory( BaseAddress, address, memType, short(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t UTIL_ReadMemory_Dword(maddress BaseAddress, maddress address, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_ReadMemory( BaseAddress, address, memType, int32_t(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
long long UTIL_ReadMemory_Qword(maddress BaseAddress, maddress address, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_ReadMemory( BaseAddress, address, memType, (long long)(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
float UTIL_ReadMemory_Float(maddress BaseAddress, maddress address, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_ReadMemory( BaseAddress, address, memType, float(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char UTIL_ReadMemory_UnsignedByte(maddress BaseAddress, maddress address, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_ReadMemory( BaseAddress, address, memType, (unsigned char)(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short UTIL_ReadMemory_UnsignedWord(maddress BaseAddress, maddress address, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_ReadMemory( BaseAddress, address, memType, (unsigned short)(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t UTIL_ReadMemory_UnsignedDword(maddress BaseAddress, maddress address, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_ReadMemory( BaseAddress, address, memType, uint32_t(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
maddress UTIL_ReadMemory_Pointer(maddress BaseAddress, maddress address, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_ReadMemory( BaseAddress, address, memType, maddress(NULL));
|
||||||
|
}
|
23
dlls/MemHack/MemRead.h
Normal file
23
dlls/MemHack/MemRead.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifndef __MEMREAD_H__
|
||||||
|
#define __MEMREAD_H__
|
||||||
|
|
||||||
|
#include "MemMisc.h"
|
||||||
|
|
||||||
|
// Functions that read different data types in memory
|
||||||
|
|
||||||
|
// Base function
|
||||||
|
template <typename Type>
|
||||||
|
extern Type UTIL_ReadMemory(maddress BaseAddress, maddress StartAddress, char MemType, Type returnType);
|
||||||
|
|
||||||
|
// Inline stocks
|
||||||
|
inline char UTIL_ReadMemory_Byte (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
|
||||||
|
inline short UTIL_ReadMemory_Word (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
|
||||||
|
inline int32_t UTIL_ReadMemory_Dword (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
|
||||||
|
inline long long UTIL_ReadMemory_Qword (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
|
||||||
|
inline float UTIL_ReadMemory_Float (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
|
||||||
|
inline unsigned char UTIL_ReadMemory_UnsignedByte (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
|
||||||
|
inline unsigned short UTIL_ReadMemory_UnsignedWord (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
|
||||||
|
inline uint32_t UTIL_ReadMemory_UnsignedDword (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
|
||||||
|
inline maddress UTIL_ReadMemory_Pointer (maddress baseaddress, maddress address, char memType = MEMTYPE_DATA);
|
||||||
|
|
||||||
|
#endif
|
78
dlls/MemHack/MemReadNatives.cpp
Normal file
78
dlls/MemHack/MemReadNatives.cpp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#include "MemRead.h"
|
||||||
|
|
||||||
|
#define NATIVE_HACK_BASEADDRESS PickBaseAddress(params[2])
|
||||||
|
#define NATIVE_HACK_ADDRESS params[1]
|
||||||
|
#define NATIVE_HACK_FLAGS params[3]
|
||||||
|
#define NATIVE_HACK_SIGNED params[4]
|
||||||
|
#define NATIVE_HACK_MEMORY NATIVE_HACK_BASEADDRESS, NATIVE_HACK_ADDRESS, NATIVE_HACK_FLAGS
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_get_char(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
if(NATIVE_HACK_SIGNED)
|
||||||
|
{
|
||||||
|
char HackedMemory = UTIL_ReadMemory_Byte(NATIVE_HACK_MEMORY);
|
||||||
|
return (cell)(HackedMemory);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned char HackedMemory = UTIL_ReadMemory_UnsignedByte(NATIVE_HACK_MEMORY);
|
||||||
|
return (cell)(HackedMemory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_get_short(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
if(NATIVE_HACK_SIGNED)
|
||||||
|
{
|
||||||
|
short HackedMemory = UTIL_ReadMemory_Word(NATIVE_HACK_MEMORY);
|
||||||
|
return (cell)(HackedMemory);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned short HackedMemory = UTIL_ReadMemory_UnsignedWord(NATIVE_HACK_MEMORY);
|
||||||
|
return (cell)(HackedMemory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_get_long(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
if(NATIVE_HACK_SIGNED)
|
||||||
|
{
|
||||||
|
long HackedMemory = UTIL_ReadMemory_Dword(NATIVE_HACK_MEMORY);
|
||||||
|
return (cell)(HackedMemory);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned long HackedMemory = UTIL_ReadMemory_UnsignedDword(NATIVE_HACK_MEMORY);
|
||||||
|
return (cell)(HackedMemory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_get_quad(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
long long HackedMemory = UTIL_ReadMemory_Qword(NATIVE_HACK_MEMORY);
|
||||||
|
return amx_ftoc(float(HackedMemory));
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_get_float(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
float HackedMemory = UTIL_ReadMemory_Float(NATIVE_HACK_MEMORY);
|
||||||
|
return amx_ftoc(HackedMemory);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_get_pointer(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
maddress HackedMemory = UTIL_ReadMemory_Pointer(NATIVE_HACK_MEMORY);
|
||||||
|
return (cell)(HackedMemory);
|
||||||
|
}
|
||||||
|
|
||||||
|
AMX_NATIVE_INFO read_natives[] = {
|
||||||
|
{ "memhack_get_char", memhack_get_char },
|
||||||
|
{ "memhack_get_short", memhack_get_short },
|
||||||
|
{ "memhack_get_long", memhack_get_long },
|
||||||
|
|
||||||
|
{ "memhack_get_float", memhack_get_float },
|
||||||
|
{ "memhack_get_quad", memhack_get_quad },
|
||||||
|
{ "memhack_get_pointer", memhack_get_pointer },
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
78
dlls/MemHack/MemWrite.cpp
Normal file
78
dlls/MemHack/MemWrite.cpp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#include "MemMisc.h"
|
||||||
|
|
||||||
|
/* Functions that patch different data types in memory */
|
||||||
|
template <typename Type>
|
||||||
|
int UTIL_PatchMemory(maddress baseaddress, maddress address, Type patch, char memType, size_t byteType, bool extraProtect)
|
||||||
|
{
|
||||||
|
unsigned long oldProtect = 0;
|
||||||
|
maddress realAddress = GetRealMemoryAddress(baseaddress, address, memType);
|
||||||
|
|
||||||
|
switch (memType)
|
||||||
|
{
|
||||||
|
case MEMTYPE_CODE:
|
||||||
|
if (MemoryProtect((void*)realAddress, byteType, MPROT_CODE_EDIT, &oldProtect, memType) == MP_FAIL) return MP_FAIL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MEMTYPE_RODATA:
|
||||||
|
if (MemoryProtect((void*)realAddress, byteType, MPROT_RODATA_EDIT, &oldProtect, memType) == MP_FAIL) return MP_FAIL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*(Type*)realAddress = patch;
|
||||||
|
|
||||||
|
if (memType == MEMTYPE_CODE)
|
||||||
|
{
|
||||||
|
MemoryProtect((void*)realAddress, byteType, oldProtect, &oldProtect);
|
||||||
|
}
|
||||||
|
else if(extraProtect == true)
|
||||||
|
{
|
||||||
|
if(memType == MEMTYPE_RODATA) MemoryProtect((void*)realAddress, byteType, oldProtect, &oldProtect);
|
||||||
|
}
|
||||||
|
|
||||||
|
return MP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int UTIL_PatchMemory_Byte(maddress baseaddress, maddress address, char patch, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_PatchMemory(baseaddress, address, (char)patch, memType, BYTE_BYTES, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UTIL_PatchMemory_Word(maddress baseaddress, maddress address, short patch, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_PatchMemory(baseaddress, address, (short)patch, memType, WORD_BYTES, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UTIL_PatchMemory_Dword(maddress baseaddress, maddress address, int32_t patch, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_PatchMemory(baseaddress, address, (int32_t)patch, memType, DWORD_BYTES, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UTIL_PatchMemory_Qword(maddress baseaddress, maddress address, long long patch, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_PatchMemory(baseaddress, address, (long long)patch, memType, QWORD_BYTES, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UTIL_PatchMemory_Float(maddress baseaddress, maddress address, float patch, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_PatchMemory(baseaddress, address, (float)patch, memType, FLOAT_BYTES, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UTIL_PatchMemory_UnsignedByte(maddress baseaddress, maddress address, unsigned char patch, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_PatchMemory(baseaddress, address, (unsigned char)patch, memType, BYTE_BYTES, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UTIL_PatchMemory_UnsignedWord(maddress baseaddress, maddress address, unsigned short patch, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_PatchMemory(baseaddress, address, (unsigned short)patch, memType, WORD_BYTES, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UTIL_PatchMemory_UnsignedDword(maddress baseaddress, maddress address, uint32_t patch, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_PatchMemory(baseaddress, address, (uint32_t)patch, memType, DWORD_BYTES, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UTIL_PatchMemory_Pointer(maddress baseaddress, maddress address, maddress patch, char memType)
|
||||||
|
{
|
||||||
|
return UTIL_PatchMemory(baseaddress, address, (maddress)patch, memType, DWORD_BYTES, true);
|
||||||
|
}
|
23
dlls/MemHack/MemWrite.h
Normal file
23
dlls/MemHack/MemWrite.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifndef __MEMWRITE_H__
|
||||||
|
#define __MEMWRITE_H__
|
||||||
|
|
||||||
|
#include "MemMisc.h"
|
||||||
|
|
||||||
|
// Functions that patch different data types in memory
|
||||||
|
|
||||||
|
// Base function
|
||||||
|
template <typename Type>
|
||||||
|
inline int UTIL_PatchMemory(maddress baseaddress, maddress address, Type patch, char memType, size_t byteType, bool extraProtect);
|
||||||
|
|
||||||
|
// Inline stocks
|
||||||
|
extern inline int UTIL_PatchMemory_Byte (maddress baseaddress, maddress address, char patch, char memType = MEMTYPE_DATA);
|
||||||
|
extern inline int UTIL_PatchMemory_Word (maddress baseaddress, maddress address, short patch, char memType = MEMTYPE_DATA);
|
||||||
|
extern inline int UTIL_PatchMemory_Dword (maddress baseaddress, maddress address, int32_t patch, char memType = MEMTYPE_DATA);
|
||||||
|
extern inline int UTIL_PatchMemory_Qword (maddress baseaddress, maddress address, long long patch, char memType = MEMTYPE_DATA);
|
||||||
|
extern inline int UTIL_PatchMemory_Float (maddress baseaddress, maddress address, float patch, char memType = MEMTYPE_DATA);
|
||||||
|
extern inline int UTIL_PatchMemory_UnsignedByte (maddress baseaddress, maddress address, unsigned char patch, char memType = MEMTYPE_DATA);
|
||||||
|
extern inline int UTIL_PatchMemory_UnsignedWord (maddress baseaddress, maddress address, unsigned short patch, char memType = MEMTYPE_DATA);
|
||||||
|
extern inline int UTIL_PatchMemory_UnsignedDword (maddress baseaddress, maddress address, uint32_t patch, char memType = MEMTYPE_DATA);
|
||||||
|
extern inline int UTIL_PatchMemory_Pointer (maddress baseaddress, maddress address, maddress patch, char memType = MEMTYPE_DATA);
|
||||||
|
|
||||||
|
#endif
|
72
dlls/MemHack/MemWriteNatives.cpp
Normal file
72
dlls/MemHack/MemWriteNatives.cpp
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#include "MemWrite.h"
|
||||||
|
|
||||||
|
#define NATIVE_PATCH_BASEADDRESS PickBaseAddress(params[2])
|
||||||
|
#define NATIVE_PATCH_ADDRESS params[1]
|
||||||
|
#define NATIVE_PATCH_FLAGS params[4]
|
||||||
|
#define NATIVE_PATCH_SIGNED params[5]
|
||||||
|
#define NATIVE_PATCH_PARAMETER params[3]
|
||||||
|
|
||||||
|
#define NATIVE_PATCH_MEMORY NATIVE_PATCH_BASEADDRESS, NATIVE_PATCH_ADDRESS
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_set_char(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
if(NATIVE_PATCH_SIGNED)
|
||||||
|
{
|
||||||
|
return (cell)UTIL_PatchMemory_Byte(NATIVE_PATCH_MEMORY, (char)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (cell)UTIL_PatchMemory_UnsignedByte(NATIVE_PATCH_MEMORY, (unsigned char)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_set_short(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
if(NATIVE_PATCH_SIGNED)
|
||||||
|
{
|
||||||
|
return (cell)UTIL_PatchMemory_Word(NATIVE_PATCH_MEMORY, (short)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (cell)UTIL_PatchMemory_UnsignedWord(NATIVE_PATCH_MEMORY, (unsigned short)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_set_long(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
if(NATIVE_PATCH_SIGNED)
|
||||||
|
{
|
||||||
|
return (cell)UTIL_PatchMemory_Dword(NATIVE_PATCH_MEMORY, (long)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (cell)UTIL_PatchMemory_Dword(NATIVE_PATCH_MEMORY, (unsigned long)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_set_quad(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
return (cell)UTIL_PatchMemory_Qword(NATIVE_PATCH_MEMORY, (long long)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_set_float(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
return (cell)UTIL_PatchMemory_Float(NATIVE_PATCH_MEMORY, amx_ctof(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL memhack_set_pointer(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
return (cell)UTIL_PatchMemory_Pointer(NATIVE_PATCH_MEMORY, (maddress)(NATIVE_PATCH_PARAMETER), NATIVE_PATCH_FLAGS);
|
||||||
|
}
|
||||||
|
|
||||||
|
AMX_NATIVE_INFO write_natives[] = {
|
||||||
|
{ "memhack_set_char", memhack_set_char },
|
||||||
|
{ "memhack_set_short", memhack_set_short },
|
||||||
|
{ "memhack_set_long", memhack_set_long },
|
||||||
|
|
||||||
|
{ "memhack_set_float", memhack_set_float },
|
||||||
|
{ "memhack_set_quad", memhack_set_quad },
|
||||||
|
{ "memhack_set_pointer", memhack_set_pointer },
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
||||||
|
|
3078
dlls/MemHack/amxxmodule.cpp
Normal file
3078
dlls/MemHack/amxxmodule.cpp
Normal file
File diff suppressed because it is too large
Load Diff
2241
dlls/MemHack/amxxmodule.h
Normal file
2241
dlls/MemHack/amxxmodule.h
Normal file
File diff suppressed because it is too large
Load Diff
20
dlls/MemHack/memhack.inc
Normal file
20
dlls/MemHack/memhack.inc
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include <memhack_const>
|
||||||
|
|
||||||
|
native memhack_get_char(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
|
||||||
|
native memhack_get_short(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
|
||||||
|
native memhack_get_long(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
|
||||||
|
|
||||||
|
native Float:memhack_get_float(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA);
|
||||||
|
native Float:memhack_get_quad(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA);
|
||||||
|
native memhack_get_pointer(address,baseaddress = DLLBASE, memtype = MEMTYPE_DATA);
|
||||||
|
|
||||||
|
native memhack_set_char(address,baseaddress = DLLBASE, new_val, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
|
||||||
|
native memhack_set_short(address,baseaddress = DLLBASE, new_val, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
|
||||||
|
native memhack_set_long(address,baseaddress = DLLBASE, new_val, memtype = MEMTYPE_DATA, signtype = MEM_SIGNED);
|
||||||
|
|
||||||
|
native memhack_set_float(address,baseaddress = DLLBASE, Float:new_val, memtype = MEMTYPE_DATA);
|
||||||
|
native memhack_set_quad(address,baseaddress = DLLBASE,Float:new_val, memtype = MEMTYPE_DATA);
|
||||||
|
native memhack_set_pointer(address,baseaddress = DLLBASE, new_val, memtype = MEMTYPE_DATA);
|
||||||
|
|
||||||
|
native memhack_get_base(func_addr,&success);
|
||||||
|
native memhack_get_realaddr(address,baseaddress,memtype = MEMTYPE_DATA);
|
23
dlls/MemHack/memhack_const.inc
Normal file
23
dlls/MemHack/memhack_const.inc
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#if defined _memhack_const_included
|
||||||
|
#endinput
|
||||||
|
#endif
|
||||||
|
#define _memhack_const_included
|
||||||
|
|
||||||
|
// Different Address Bases
|
||||||
|
#define MEM_DLLBASE 0
|
||||||
|
#define MEM_ENGBASE 1
|
||||||
|
#define MEM_NULLBASE 2
|
||||||
|
|
||||||
|
// Signed or unsigned
|
||||||
|
#define MEM_SIGNED 0
|
||||||
|
#define MEM_UNSIGNED 1
|
||||||
|
|
||||||
|
// Memory area types
|
||||||
|
#define MEMTYPE_CODE 0 // Code (usually .text segment, requires mprotect or VirtualProtect)
|
||||||
|
#define MEMTYPE_DATA 1 // Data (usually .data segment, writable by default)
|
||||||
|
#define MEMTYPE_RODATA 2 // Read-Only Data (usually .rodata on Linux, .rdata on Windows)
|
||||||
|
|
||||||
|
// Return codes for patching (set natives)
|
||||||
|
#define MP_FAIL -1
|
||||||
|
#define MP_OK 0
|
||||||
|
|
463
dlls/MemHack/moduleconfig.h
Normal file
463
dlls/MemHack/moduleconfig.h
Normal file
@ -0,0 +1,463 @@
|
|||||||
|
// Configuration
|
||||||
|
|
||||||
|
#ifndef __MODULECONFIG_H__
|
||||||
|
#define __MODULECONFIG_H__
|
||||||
|
|
||||||
|
// Module info
|
||||||
|
#define MODULE_NAME "MemHack"
|
||||||
|
#define MODULE_VERSION "1.65"
|
||||||
|
#define MODULE_AUTHOR "SD and Rukia"
|
||||||
|
#define MODULE_URL "www.amxmodx.org"
|
||||||
|
#define MODULE_LOGTAG "MEMHACK"
|
||||||
|
// If you want the module not to be reloaded on mapchange, remove / comment out the next line
|
||||||
|
#define MODULE_RELOAD_ON_MAPCHANGE
|
||||||
|
|
||||||
|
#ifdef __DATE__
|
||||||
|
#define MODULE_DATE __DATE__
|
||||||
|
#else // __DATE__
|
||||||
|
#define MODULE_DATE "Unknown"
|
||||||
|
#endif // __DATE__
|
||||||
|
|
||||||
|
// metamod plugin?
|
||||||
|
#define USE_METAMOD
|
||||||
|
|
||||||
|
// - AMXX Init functions
|
||||||
|
// Also consider using FN_META_*
|
||||||
|
// AMXX query
|
||||||
|
//#define FN_AMXX_QUERY OnAmxxQuery
|
||||||
|
// AMXX attach
|
||||||
|
// Do native functions init here (MF_AddNatives)
|
||||||
|
#define FN_AMXX_ATTACH OnAmxxAttach
|
||||||
|
// AMXX dettach
|
||||||
|
//#define FN_AMXX_DETTACH OnAmxxDettach
|
||||||
|
// All plugins loaded
|
||||||
|
// Do forward functions init here (MF_RegisterForward)
|
||||||
|
// #define FN_AMXX_PLUGINSLOADED OnPluginsLoaded
|
||||||
|
|
||||||
|
/**** METAMOD ****/
|
||||||
|
// If your module doesn't use metamod, you may close the file now :)
|
||||||
|
#ifdef USE_METAMOD
|
||||||
|
// ----
|
||||||
|
// Hook Functions
|
||||||
|
// Uncomment these to be called
|
||||||
|
// You can also change the function name
|
||||||
|
|
||||||
|
// - Metamod init functions
|
||||||
|
// Also consider using FN_AMXX_*
|
||||||
|
// Meta query
|
||||||
|
//#define FN_META_QUERY OnMetaQuery
|
||||||
|
// Meta attach
|
||||||
|
//#define FN_META_ATTACH OnMetaAttach
|
||||||
|
// Meta dettach
|
||||||
|
//#define FN_META_DETTACH OnMetaDettach
|
||||||
|
|
||||||
|
// (wd) are Will Day's notes
|
||||||
|
// - GetEntityAPI2 functions
|
||||||
|
// #define FN_GameDLLInit GameDLLInit /* pfnGameInit() */
|
||||||
|
// #define FN_DispatchSpawn DispatchSpawn /* pfnSpawn() */
|
||||||
|
// #define FN_DispatchThink DispatchThink /* pfnThink() */
|
||||||
|
// #define FN_DispatchUse DispatchUse /* pfnUse() */
|
||||||
|
// #define FN_DispatchTouch DispatchTouch /* pfnTouch() */
|
||||||
|
// #define FN_DispatchBlocked DispatchBlocked /* pfnBlocked() */
|
||||||
|
// #define FN_DispatchKeyValue DispatchKeyValue /* pfnKeyValue() */
|
||||||
|
// #define FN_DispatchSave DispatchSave /* pfnSave() */
|
||||||
|
// #define FN_DispatchRestore DispatchRestore /* pfnRestore() */
|
||||||
|
// #define FN_DispatchObjectCollsionBox DispatchObjectCollsionBox /* pfnSetAbsBox() */
|
||||||
|
// #define FN_SaveWriteFields SaveWriteFields /* pfnSaveWriteFields() */
|
||||||
|
// #define FN_SaveReadFields SaveReadFields /* pfnSaveReadFields() */
|
||||||
|
// #define FN_SaveGlobalState SaveGlobalState /* pfnSaveGlobalState() */
|
||||||
|
// #define FN_RestoreGlobalState RestoreGlobalState /* pfnRestoreGlobalState() */
|
||||||
|
// #define FN_ResetGlobalState ResetGlobalState /* pfnResetGlobalState() */
|
||||||
|
// #define FN_ClientConnect ClientConnect /* pfnClientConnect() (wd) Client has connected */
|
||||||
|
// #define FN_ClientDisconnect ClientDisconnect /* pfnClientDisconnect() (wd) Player has left the game */
|
||||||
|
// #define FN_ClientKill ClientKill /* pfnClientKill() (wd) Player has typed "kill" */
|
||||||
|
// #define FN_ClientPutInServer ClientPutInServer /* pfnClientPutInServer() (wd) Client is entering the game */
|
||||||
|
// #define FN_ClientCommand ClientCommand /* pfnClientCommand() (wd) Player has sent a command (typed or from a bind) */
|
||||||
|
// #define FN_ClientUserInfoChanged ClientUserInfoChanged /* pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure */
|
||||||
|
// #define FN_ServerActivate ServerActivate /* pfnServerActivate() (wd) Server is starting a new map */
|
||||||
|
// #define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */
|
||||||
|
// #define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */
|
||||||
|
// #define FN_PlayerPostThink PlayerPostThink /* pfnPlayerPostThink() */
|
||||||
|
// #define FN_StartFrame StartFrame /* pfnStartFrame() */
|
||||||
|
// #define FN_ParmsNewLevel ParmsNewLevel /* pfnParmsNewLevel() */
|
||||||
|
// #define FN_ParmsChangeLevel ParmsChangeLevel /* pfnParmsChangeLevel() */
|
||||||
|
// #define FN_GetGameDescription GetGameDescription /* pfnGetGameDescription() Returns string describing current .dll. E.g. "TeamFotrress 2" "Half-Life" */
|
||||||
|
// #define FN_PlayerCustomization PlayerCustomization /* pfnPlayerCustomization() Notifies .dll of new customization for player. */
|
||||||
|
// #define FN_SpectatorConnect SpectatorConnect /* pfnSpectatorConnect() Called when spectator joins server */
|
||||||
|
// #define FN_SpectatorDisconnect SpectatorDisconnect /* pfnSpectatorDisconnect() Called when spectator leaves the server */
|
||||||
|
// #define FN_SpectatorThink SpectatorThink /* pfnSpectatorThink() Called when spectator sends a command packet (usercmd_t) */
|
||||||
|
// #define FN_Sys_Error Sys_Error /* pfnSys_Error() Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint. SDK2 */
|
||||||
|
// #define FN_PM_Move PM_Move /* pfnPM_Move() (wd) SDK2 */
|
||||||
|
// #define FN_PM_Init PM_Init /* pfnPM_Init() Server version of player movement initialization; (wd) SDK2 */
|
||||||
|
// #define FN_PM_FindTextureType PM_FindTextureType /* pfnPM_FindTextureType() (wd) SDK2 */
|
||||||
|
// #define FN_SetupVisibility SetupVisibility /* pfnSetupVisibility() Set up PVS and PAS for networking for this client; (wd) SDK2 */
|
||||||
|
// #define FN_UpdateClientData UpdateClientData /* pfnUpdateClientData() Set up data sent only to specific client; (wd) SDK2 */
|
||||||
|
// #define FN_AddToFullPack AddToFullPack /* pfnAddToFullPack() (wd) SDK2 */
|
||||||
|
// #define FN_CreateBaseline CreateBaseline /* pfnCreateBaseline() Tweak entity baseline for network encoding allows setup of player baselines too.; (wd) SDK2 */
|
||||||
|
// #define FN_RegisterEncoders RegisterEncoders /* pfnRegisterEncoders() Callbacks for network encoding; (wd) SDK2 */
|
||||||
|
// #define FN_GetWeaponData GetWeaponData /* pfnGetWeaponData() (wd) SDK2 */
|
||||||
|
// #define FN_CmdStart CmdStart /* pfnCmdStart() (wd) SDK2 */
|
||||||
|
// #define FN_CmdEnd CmdEnd /* pfnCmdEnd() (wd) SDK2 */
|
||||||
|
// #define FN_ConnectionlessPacket ConnectionlessPacket /* pfnConnectionlessPacket() (wd) SDK2 */
|
||||||
|
// #define FN_GetHullBounds GetHullBounds /* pfnGetHullBounds() (wd) SDK2 */
|
||||||
|
// #define FN_CreateInstancedBaselines CreateInstancedBaselines /* pfnCreateInstancedBaselines() (wd) SDK2 */
|
||||||
|
// #define FN_InconsistentFile InconsistentFile /* pfnInconsistentFile() (wd) SDK2 */
|
||||||
|
// #define FN_AllowLagCompensation AllowLagCompensation /* pfnAllowLagCompensation() (wd) SDK2 */
|
||||||
|
|
||||||
|
// - GetEntityAPI2_Post functions
|
||||||
|
// #define FN_GameDLLInit_Post GameDLLInit_Post
|
||||||
|
// #define FN_DispatchSpawn_Post DispatchSpawn_Post
|
||||||
|
// #define FN_DispatchThink_Post DispatchThink_Post
|
||||||
|
// #define FN_DispatchUse_Post DispatchUse_Post
|
||||||
|
// #define FN_DispatchTouch_Post DispatchTouch_Post
|
||||||
|
// #define FN_DispatchBlocked_Post DispatchBlocked_Post
|
||||||
|
// #define FN_DispatchKeyValue_Post DispatchKeyValue_Post
|
||||||
|
// #define FN_DispatchSave_Post DispatchSave_Post
|
||||||
|
// #define FN_DispatchRestore_Post DispatchRestore_Post
|
||||||
|
// #define FN_DispatchObjectCollsionBox_Post DispatchObjectCollsionBox_Post
|
||||||
|
// #define FN_SaveWriteFields_Post SaveWriteFields_Post
|
||||||
|
// #define FN_SaveReadFields_Post SaveReadFields_Post
|
||||||
|
// #define FN_SaveGlobalState_Post SaveGlobalState_Post
|
||||||
|
// #define FN_RestoreGlobalState_Post RestoreGlobalState_Post
|
||||||
|
// #define FN_ResetGlobalState_Post ResetGlobalState_Post
|
||||||
|
// #define FN_ClientConnect_Post ClientConnect_Post
|
||||||
|
// #define FN_ClientDisconnect_Post ClientDisconnect_Post
|
||||||
|
// #define FN_ClientKill_Post ClientKill_Post
|
||||||
|
// #define FN_ClientPutInServer_Post ClientPutInServer_Post
|
||||||
|
// #define FN_ClientCommand_Post ClientCommand_Post
|
||||||
|
// #define FN_ClientUserInfoChanged_Post ClientUserInfoChanged_Post
|
||||||
|
// #define FN_ServerActivate_Post ServerActivate_Post
|
||||||
|
// #define FN_ServerDeactivate_Post ServerDeactivate_Post
|
||||||
|
// #define FN_PlayerPreThink_Post PlayerPreThink_Post
|
||||||
|
// #define FN_PlayerPostThink_Post PlayerPostThink_Post
|
||||||
|
// #define FN_StartFrame_Post StartFrame_Post
|
||||||
|
// #define FN_ParmsNewLevel_Post ParmsNewLevel_Post
|
||||||
|
// #define FN_ParmsChangeLevel_Post ParmsChangeLevel_Post
|
||||||
|
// #define FN_GetGameDescription_Post GetGameDescription_Post
|
||||||
|
// #define FN_PlayerCustomization_Post PlayerCustomization_Post
|
||||||
|
// #define FN_SpectatorConnect_Post SpectatorConnect_Post
|
||||||
|
// #define FN_SpectatorDisconnect_Post SpectatorDisconnect_Post
|
||||||
|
// #define FN_SpectatorThink_Post SpectatorThink_Post
|
||||||
|
// #define FN_Sys_Error_Post Sys_Error_Post
|
||||||
|
// #define FN_PM_Move_Post PM_Move_Post
|
||||||
|
// #define FN_PM_Init_Post PM_Init_Post
|
||||||
|
// #define FN_PM_FindTextureType_Post PM_FindTextureType_Post
|
||||||
|
// #define FN_SetupVisibility_Post SetupVisibility_Post
|
||||||
|
// #define FN_UpdateClientData_Post UpdateClientData_Post
|
||||||
|
// #define FN_AddToFullPack_Post AddToFullPack_Post
|
||||||
|
// #define FN_CreateBaseline_Post CreateBaseline_Post
|
||||||
|
// #define FN_RegisterEncoders_Post RegisterEncoders_Post
|
||||||
|
// #define FN_GetWeaponData_Post GetWeaponData_Post
|
||||||
|
// #define FN_CmdStart_Post CmdStart_Post
|
||||||
|
// #define FN_CmdEnd_Post CmdEnd_Post
|
||||||
|
// #define FN_ConnectionlessPacket_Post ConnectionlessPacket_Post
|
||||||
|
// #define FN_GetHullBounds_Post GetHullBounds_Post
|
||||||
|
// #define FN_CreateInstancedBaselines_Post CreateInstancedBaselines_Post
|
||||||
|
// #define FN_InconsistentFile_Post InconsistentFile_Post
|
||||||
|
// #define FN_AllowLagCompensation_Post AllowLagCompensation_Post
|
||||||
|
|
||||||
|
// - GetEngineAPI functions
|
||||||
|
// #define FN_PrecacheModel PrecacheModel
|
||||||
|
// #define FN_PrecacheSound PrecacheSound
|
||||||
|
// #define FN_SetModel SetModel
|
||||||
|
// #define FN_ModelIndex ModelIndex
|
||||||
|
// #define FN_ModelFrames ModelFrames
|
||||||
|
// #define FN_SetSize SetSize
|
||||||
|
// #define FN_ChangeLevel ChangeLevel
|
||||||
|
// #define FN_GetSpawnParms GetSpawnParms
|
||||||
|
// #define FN_SaveSpawnParms SaveSpawnParms
|
||||||
|
// #define FN_VecToYaw VecToYaw
|
||||||
|
// #define FN_VecToAngles VecToAngles
|
||||||
|
// #define FN_MoveToOrigin MoveToOrigin
|
||||||
|
// #define FN_ChangeYaw ChangeYaw
|
||||||
|
// #define FN_ChangePitch ChangePitch
|
||||||
|
// #define FN_FindEntityByString FindEntityByString
|
||||||
|
// #define FN_GetEntityIllum GetEntityIllum
|
||||||
|
// #define FN_FindEntityInSphere FindEntityInSphere
|
||||||
|
// #define FN_FindClientInPVS FindClientInPVS
|
||||||
|
// #define FN_EntitiesInPVS EntitiesInPVS
|
||||||
|
// #define FN_MakeVectors MakeVectors
|
||||||
|
// #define FN_AngleVectors AngleVectors
|
||||||
|
// #define FN_CreateEntity CreateEntity
|
||||||
|
// #define FN_RemoveEntity RemoveEntity
|
||||||
|
// #define FN_CreateNamedEntity CreateNamedEntity
|
||||||
|
// #define FN_MakeStatic MakeStatic
|
||||||
|
// #define FN_EntIsOnFloor EntIsOnFloor
|
||||||
|
// #define FN_DropToFloor DropToFloor
|
||||||
|
// #define FN_WalkMove WalkMove
|
||||||
|
// #define FN_SetOrigin SetOrigin
|
||||||
|
// #define FN_EmitSound EmitSound
|
||||||
|
// #define FN_EmitAmbientSound EmitAmbientSound
|
||||||
|
// #define FN_TraceLine TraceLine
|
||||||
|
// #define FN_TraceToss TraceToss
|
||||||
|
// #define FN_TraceMonsterHull TraceMonsterHull
|
||||||
|
// #define FN_TraceHull TraceHull
|
||||||
|
// #define FN_TraceModel TraceModel
|
||||||
|
// #define FN_TraceTexture TraceTexture
|
||||||
|
// #define FN_TraceSphere TraceSphere
|
||||||
|
// #define FN_GetAimVector GetAimVector
|
||||||
|
// #define FN_ServerCommand ServerCommand
|
||||||
|
// #define FN_ServerExecute ServerExecute
|
||||||
|
// #define FN_engClientCommand engClientCommand
|
||||||
|
// #define FN_ParticleEffect ParticleEffect
|
||||||
|
// #define FN_LightStyle LightStyle
|
||||||
|
// #define FN_DecalIndex DecalIndex
|
||||||
|
// #define FN_PointContents PointContents
|
||||||
|
// #define FN_MessageBegin MessageBegin
|
||||||
|
// #define FN_MessageEnd MessageEnd
|
||||||
|
// #define FN_WriteByte WriteByte
|
||||||
|
// #define FN_WriteChar WriteChar
|
||||||
|
// #define FN_WriteShort WriteShort
|
||||||
|
// #define FN_WriteLong WriteLong
|
||||||
|
// #define FN_WriteAngle WriteAngle
|
||||||
|
// #define FN_WriteCoord WriteCoord
|
||||||
|
// #define FN_WriteString WriteString
|
||||||
|
// #define FN_WriteEntity WriteEntity
|
||||||
|
// #define FN_CVarRegister CVarRegister
|
||||||
|
// #define FN_CVarGetFloat CVarGetFloat
|
||||||
|
// #define FN_CVarGetString CVarGetString
|
||||||
|
// #define FN_CVarSetFloat CVarSetFloat
|
||||||
|
// #define FN_CVarSetString CVarSetString
|
||||||
|
// #define FN_AlertMessage AlertMessage
|
||||||
|
// #define FN_EngineFprintf EngineFprintf
|
||||||
|
// #define FN_PvAllocEntPrivateData PvAllocEntPrivateData
|
||||||
|
// #define FN_PvEntPrivateData PvEntPrivateData
|
||||||
|
// #define FN_FreeEntPrivateData FreeEntPrivateData
|
||||||
|
// #define FN_SzFromIndex SzFromIndex
|
||||||
|
// #define FN_AllocString AllocString
|
||||||
|
// #define FN_GetVarsOfEnt GetVarsOfEnt
|
||||||
|
// #define FN_PEntityOfEntOffset PEntityOfEntOffset
|
||||||
|
// #define FN_EntOffsetOfPEntity EntOffsetOfPEntity
|
||||||
|
// #define FN_IndexOfEdict IndexOfEdict
|
||||||
|
// #define FN_PEntityOfEntIndex PEntityOfEntIndex
|
||||||
|
// #define FN_FindEntityByVars FindEntityByVars
|
||||||
|
// #define FN_GetModelPtr GetModelPtr
|
||||||
|
// #define FN_RegUserMsg RegUserMsg
|
||||||
|
// #define FN_AnimationAutomove AnimationAutomove
|
||||||
|
// #define FN_GetBonePosition GetBonePosition
|
||||||
|
// #define FN_FunctionFromName FunctionFromName
|
||||||
|
// #define FN_NameForFunction NameForFunction
|
||||||
|
// #define FN_ClientPrintf ClientPrintf
|
||||||
|
// #define FN_ServerPrint ServerPrint
|
||||||
|
// #define FN_Cmd_Args Cmd_Args
|
||||||
|
// #define FN_Cmd_Argv Cmd_Argv
|
||||||
|
// #define FN_Cmd_Argc Cmd_Argc
|
||||||
|
// #define FN_GetAttachment GetAttachment
|
||||||
|
// #define FN_CRC32_Init CRC32_Init
|
||||||
|
// #define FN_CRC32_ProcessBuffer CRC32_ProcessBuffer
|
||||||
|
// #define FN_CRC32_ProcessByte CRC32_ProcessByte
|
||||||
|
// #define FN_CRC32_Final CRC32_Final
|
||||||
|
// #define FN_RandomLong RandomLong
|
||||||
|
// #define FN_RandomFloat RandomFloat
|
||||||
|
// #define FN_SetView SetView
|
||||||
|
// #define FN_Time Time
|
||||||
|
// #define FN_CrosshairAngle CrosshairAngle
|
||||||
|
// #define FN_LoadFileForMe LoadFileForMe
|
||||||
|
// #define FN_FreeFile FreeFile
|
||||||
|
// #define FN_EndSection EndSection
|
||||||
|
// #define FN_CompareFileTime CompareFileTime
|
||||||
|
// #define FN_GetGameDir GetGameDir
|
||||||
|
// #define FN_Cvar_RegisterVariable Cvar_RegisterVariable
|
||||||
|
// #define FN_FadeClientVolume FadeClientVolume
|
||||||
|
// #define FN_SetClientMaxspeed SetClientMaxspeed
|
||||||
|
// #define FN_CreateFakeClient CreateFakeClient
|
||||||
|
// #define FN_RunPlayerMove RunPlayerMove
|
||||||
|
// #define FN_NumberOfEntities NumberOfEntities
|
||||||
|
// #define FN_GetInfoKeyBuffer GetInfoKeyBuffer
|
||||||
|
// #define FN_InfoKeyValue InfoKeyValue
|
||||||
|
// #define FN_SetKeyValue SetKeyValue
|
||||||
|
// #define FN_SetClientKeyValue SetClientKeyValue
|
||||||
|
// #define FN_IsMapValid IsMapValid
|
||||||
|
// #define FN_StaticDecal StaticDecal
|
||||||
|
// #define FN_PrecacheGeneric PrecacheGeneric
|
||||||
|
// #define FN_GetPlayerUserId GetPlayerUserId
|
||||||
|
// #define FN_BuildSoundMsg BuildSoundMsg
|
||||||
|
// #define FN_IsDedicatedServer IsDedicatedServer
|
||||||
|
// #define FN_CVarGetPointer CVarGetPointer
|
||||||
|
// #define FN_GetPlayerWONId GetPlayerWONId
|
||||||
|
// #define FN_Info_RemoveKey Info_RemoveKey
|
||||||
|
// #define FN_GetPhysicsKeyValue GetPhysicsKeyValue
|
||||||
|
// #define FN_SetPhysicsKeyValue SetPhysicsKeyValue
|
||||||
|
// #define FN_GetPhysicsInfoString GetPhysicsInfoString
|
||||||
|
// #define FN_PrecacheEvent PrecacheEvent
|
||||||
|
// #define FN_PlaybackEvent PlaybackEvent
|
||||||
|
// #define FN_SetFatPVS SetFatPVS
|
||||||
|
// #define FN_SetFatPAS SetFatPAS
|
||||||
|
// #define FN_CheckVisibility CheckVisibility
|
||||||
|
// #define FN_DeltaSetField DeltaSetField
|
||||||
|
// #define FN_DeltaUnsetField DeltaUnsetField
|
||||||
|
// #define FN_DeltaAddEncoder DeltaAddEncoder
|
||||||
|
// #define FN_GetCurrentPlayer GetCurrentPlayer
|
||||||
|
// #define FN_CanSkipPlayer CanSkipPlayer
|
||||||
|
// #define FN_DeltaFindField DeltaFindField
|
||||||
|
// #define FN_DeltaSetFieldByIndex DeltaSetFieldByIndex
|
||||||
|
// #define FN_DeltaUnsetFieldByIndex DeltaUnsetFieldByIndex
|
||||||
|
// #define FN_SetGroupMask SetGroupMask
|
||||||
|
// #define FN_engCreateInstancedBaseline engCreateInstancedBaseline
|
||||||
|
// #define FN_Cvar_DirectSet Cvar_DirectSet
|
||||||
|
// #define FN_ForceUnmodified ForceUnmodified
|
||||||
|
// #define FN_GetPlayerStats GetPlayerStats
|
||||||
|
// #define FN_AddServerCommand AddServerCommand
|
||||||
|
// #define FN_Voice_GetClientListening Voice_GetClientListening
|
||||||
|
// #define FN_Voice_SetClientListening Voice_SetClientListening
|
||||||
|
// #define FN_GetPlayerAuthId GetPlayerAuthId
|
||||||
|
|
||||||
|
// - GetEngineAPI_Post functions
|
||||||
|
// #define FN_PrecacheModel_Post PrecacheModel_Post
|
||||||
|
// #define FN_PrecacheSound_Post PrecacheSound_Post
|
||||||
|
// #define FN_SetModel_Post SetModel_Post
|
||||||
|
// #define FN_ModelIndex_Post ModelIndex_Post
|
||||||
|
// #define FN_ModelFrames_Post ModelFrames_Post
|
||||||
|
// #define FN_SetSize_Post SetSize_Post
|
||||||
|
// #define FN_ChangeLevel_Post ChangeLevel_Post
|
||||||
|
// #define FN_GetSpawnParms_Post GetSpawnParms_Post
|
||||||
|
// #define FN_SaveSpawnParms_Post SaveSpawnParms_Post
|
||||||
|
// #define FN_VecToYaw_Post VecToYaw_Post
|
||||||
|
// #define FN_VecToAngles_Post VecToAngles_Post
|
||||||
|
// #define FN_MoveToOrigin_Post MoveToOrigin_Post
|
||||||
|
// #define FN_ChangeYaw_Post ChangeYaw_Post
|
||||||
|
// #define FN_ChangePitch_Post ChangePitch_Post
|
||||||
|
// #define FN_FindEntityByString_Post FindEntityByString_Post
|
||||||
|
// #define FN_GetEntityIllum_Post GetEntityIllum_Post
|
||||||
|
// #define FN_FindEntityInSphere_Post FindEntityInSphere_Post
|
||||||
|
// #define FN_FindClientInPVS_Post FindClientInPVS_Post
|
||||||
|
// #define FN_EntitiesInPVS_Post EntitiesInPVS_Post
|
||||||
|
// #define FN_MakeVectors_Post MakeVectors_Post
|
||||||
|
// #define FN_AngleVectors_Post AngleVectors_Post
|
||||||
|
// #define FN_CreateEntity_Post CreateEntity_Post
|
||||||
|
// #define FN_RemoveEntity_Post RemoveEntity_Post
|
||||||
|
// #define FN_CreateNamedEntity_Post CreateNamedEntity_Post
|
||||||
|
// #define FN_MakeStatic_Post MakeStatic_Post
|
||||||
|
// #define FN_EntIsOnFloor_Post EntIsOnFloor_Post
|
||||||
|
// #define FN_DropToFloor_Post DropToFloor_Post
|
||||||
|
// #define FN_WalkMove_Post WalkMove_Post
|
||||||
|
// #define FN_SetOrigin_Post SetOrigin_Post
|
||||||
|
// #define FN_EmitSound_Post EmitSound_Post
|
||||||
|
// #define FN_EmitAmbientSound_Post EmitAmbientSound_Post
|
||||||
|
// #define FN_TraceLine_Post TraceLine_Post
|
||||||
|
// #define FN_TraceToss_Post TraceToss_Post
|
||||||
|
// #define FN_TraceMonsterHull_Post TraceMonsterHull_Post
|
||||||
|
// #define FN_TraceHull_Post TraceHull_Post
|
||||||
|
// #define FN_TraceModel_Post TraceModel_Post
|
||||||
|
// #define FN_TraceTexture_Post TraceTexture_Post
|
||||||
|
// #define FN_TraceSphere_Post TraceSphere_Post
|
||||||
|
// #define FN_GetAimVector_Post GetAimVector_Post
|
||||||
|
// #define FN_ServerCommand_Post ServerCommand_Post
|
||||||
|
// #define FN_ServerExecute_Post ServerExecute_Post
|
||||||
|
// #define FN_engClientCommand_Post engClientCommand_Post
|
||||||
|
// #define FN_ParticleEffect_Post ParticleEffect_Post
|
||||||
|
// #define FN_LightStyle_Post LightStyle_Post
|
||||||
|
// #define FN_DecalIndex_Post DecalIndex_Post
|
||||||
|
// #define FN_PointContents_Post PointContents_Post
|
||||||
|
// #define FN_MessageBegin_Post MessageBegin_Post
|
||||||
|
// #define FN_MessageEnd_Post MessageEnd_Post
|
||||||
|
// #define FN_WriteByte_Post WriteByte_Post
|
||||||
|
// #define FN_WriteChar_Post WriteChar_Post
|
||||||
|
// #define FN_WriteShort_Post WriteShort_Post
|
||||||
|
// #define FN_WriteLong_Post WriteLong_Post
|
||||||
|
// #define FN_WriteAngle_Post WriteAngle_Post
|
||||||
|
// #define FN_WriteCoord_Post WriteCoord_Post
|
||||||
|
// #define FN_WriteString_Post WriteString_Post
|
||||||
|
// #define FN_WriteEntity_Post WriteEntity_Post
|
||||||
|
// #define FN_CVarRegister_Post CVarRegister_Post
|
||||||
|
// #define FN_CVarGetFloat_Post CVarGetFloat_Post
|
||||||
|
// #define FN_CVarGetString_Post CVarGetString_Post
|
||||||
|
// #define FN_CVarSetFloat_Post CVarSetFloat_Post
|
||||||
|
// #define FN_CVarSetString_Post CVarSetString_Post
|
||||||
|
// #define FN_AlertMessage_Post AlertMessage_Post
|
||||||
|
// #define FN_EngineFprintf_Post EngineFprintf_Post
|
||||||
|
// #define FN_PvAllocEntPrivateData_Post PvAllocEntPrivateData_Post
|
||||||
|
// #define FN_PvEntPrivateData_Post PvEntPrivateData_Post
|
||||||
|
// #define FN_FreeEntPrivateData_Post FreeEntPrivateData_Post
|
||||||
|
// #define FN_SzFromIndex_Post SzFromIndex_Post
|
||||||
|
// #define FN_AllocString_Post AllocString_Post
|
||||||
|
// #define FN_GetVarsOfEnt_Post GetVarsOfEnt_Post
|
||||||
|
// #define FN_PEntityOfEntOffset_Post PEntityOfEntOffset_Post
|
||||||
|
// #define FN_EntOffsetOfPEntity_Post EntOffsetOfPEntity_Post
|
||||||
|
// #define FN_IndexOfEdict_Post IndexOfEdict_Post
|
||||||
|
// #define FN_PEntityOfEntIndex_Post PEntityOfEntIndex_Post
|
||||||
|
// #define FN_FindEntityByVars_Post FindEntityByVars_Post
|
||||||
|
// #define FN_GetModelPtr_Post GetModelPtr_Post
|
||||||
|
// #define FN_RegUserMsg_Post RegUserMsg_Post
|
||||||
|
// #define FN_AnimationAutomove_Post AnimationAutomove_Post
|
||||||
|
// #define FN_GetBonePosition_Post GetBonePosition_Post
|
||||||
|
// #define FN_FunctionFromName_Post FunctionFromName_Post
|
||||||
|
// #define FN_NameForFunction_Post NameForFunction_Post
|
||||||
|
// #define FN_ClientPrintf_Post ClientPrintf_Post
|
||||||
|
// #define FN_ServerPrint_Post ServerPrint_Post
|
||||||
|
// #define FN_Cmd_Args_Post Cmd_Args_Post
|
||||||
|
// #define FN_Cmd_Argv_Post Cmd_Argv_Post
|
||||||
|
// #define FN_Cmd_Argc_Post Cmd_Argc_Post
|
||||||
|
// #define FN_GetAttachment_Post GetAttachment_Post
|
||||||
|
// #define FN_CRC32_Init_Post CRC32_Init_Post
|
||||||
|
// #define FN_CRC32_ProcessBuffer_Post CRC32_ProcessBuffer_Post
|
||||||
|
// #define FN_CRC32_ProcessByte_Post CRC32_ProcessByte_Post
|
||||||
|
// #define FN_CRC32_Final_Post CRC32_Final_Post
|
||||||
|
// #define FN_RandomLong_Post RandomLong_Post
|
||||||
|
// #define FN_RandomFloat_Post RandomFloat_Post
|
||||||
|
// #define FN_SetView_Post SetView_Post
|
||||||
|
// #define FN_Time_Post Time_Post
|
||||||
|
// #define FN_CrosshairAngle_Post CrosshairAngle_Post
|
||||||
|
// #define FN_LoadFileForMe_Post LoadFileForMe_Post
|
||||||
|
// #define FN_FreeFile_Post FreeFile_Post
|
||||||
|
// #define FN_EndSection_Post EndSection_Post
|
||||||
|
// #define FN_CompareFileTime_Post CompareFileTime_Post
|
||||||
|
// #define FN_GetGameDir_Post GetGameDir_Post
|
||||||
|
// #define FN_Cvar_RegisterVariable_Post Cvar_RegisterVariable_Post
|
||||||
|
// #define FN_FadeClientVolume_Post FadeClientVolume_Post
|
||||||
|
// #define FN_SetClientMaxspeed_Post SetClientMaxspeed_Post
|
||||||
|
// #define FN_CreateFakeClient_Post CreateFakeClient_Post
|
||||||
|
// #define FN_RunPlayerMove_Post RunPlayerMove_Post
|
||||||
|
// #define FN_NumberOfEntities_Post NumberOfEntities_Post
|
||||||
|
// #define FN_GetInfoKeyBuffer_Post GetInfoKeyBuffer_Post
|
||||||
|
// #define FN_InfoKeyValue_Post InfoKeyValue_Post
|
||||||
|
// #define FN_SetKeyValue_Post SetKeyValue_Post
|
||||||
|
// #define FN_SetClientKeyValue_Post SetClientKeyValue_Post
|
||||||
|
// #define FN_IsMapValid_Post IsMapValid_Post
|
||||||
|
// #define FN_StaticDecal_Post StaticDecal_Post
|
||||||
|
// #define FN_PrecacheGeneric_Post PrecacheGeneric_Post
|
||||||
|
// #define FN_GetPlayerUserId_Post GetPlayerUserId_Post
|
||||||
|
// #define FN_BuildSoundMsg_Post BuildSoundMsg_Post
|
||||||
|
// #define FN_IsDedicatedServer_Post IsDedicatedServer_Post
|
||||||
|
// #define FN_CVarGetPointer_Post CVarGetPointer_Post
|
||||||
|
// #define FN_GetPlayerWONId_Post GetPlayerWONId_Post
|
||||||
|
// #define FN_Info_RemoveKey_Post Info_RemoveKey_Post
|
||||||
|
// #define FN_GetPhysicsKeyValue_Post GetPhysicsKeyValue_Post
|
||||||
|
// #define FN_SetPhysicsKeyValue_Post SetPhysicsKeyValue_Post
|
||||||
|
// #define FN_GetPhysicsInfoString_Post GetPhysicsInfoString_Post
|
||||||
|
// #define FN_PrecacheEvent_Post PrecacheEvent_Post
|
||||||
|
// #define FN_PlaybackEvent_Post PlaybackEvent_Post
|
||||||
|
// #define FN_SetFatPVS_Post SetFatPVS_Post
|
||||||
|
// #define FN_SetFatPAS_Post SetFatPAS_Post
|
||||||
|
// #define FN_CheckVisibility_Post CheckVisibility_Post
|
||||||
|
// #define FN_DeltaSetField_Post DeltaSetField_Post
|
||||||
|
// #define FN_DeltaUnsetField_Post DeltaUnsetField_Post
|
||||||
|
// #define FN_DeltaAddEncoder_Post DeltaAddEncoder_Post
|
||||||
|
// #define FN_GetCurrentPlayer_Post GetCurrentPlayer_Post
|
||||||
|
// #define FN_CanSkipPlayer_Post CanSkipPlayer_Post
|
||||||
|
// #define FN_DeltaFindField_Post DeltaFindField_Post
|
||||||
|
// #define FN_DeltaSetFieldByIndex_Post DeltaSetFieldByIndex_Post
|
||||||
|
// #define FN_DeltaUnsetFieldByIndex_Post DeltaUnsetFieldByIndex_Post
|
||||||
|
// #define FN_SetGroupMask_Post SetGroupMask_Post
|
||||||
|
// #define FN_engCreateInstancedBaseline_Post engCreateInstancedBaseline_Post
|
||||||
|
// #define FN_Cvar_DirectSet_Post Cvar_DirectSet_Post
|
||||||
|
// #define FN_ForceUnmodified_Post ForceUnmodified_Post
|
||||||
|
// #define FN_GetPlayerStats_Post GetPlayerStats_Post
|
||||||
|
// #define FN_AddServerCommand_Post AddServerCommand_Post
|
||||||
|
// #define FN_Voice_GetClientListening_Post Voice_GetClientListening_Post
|
||||||
|
// #define FN_Voice_SetClientListening_Post Voice_SetClientListening_Post
|
||||||
|
// #define FN_GetPlayerAuthId_Post GetPlayerAuthId_Post
|
||||||
|
|
||||||
|
// #define FN_OnFreeEntPrivateData OnFreeEntPrivateData
|
||||||
|
// #define FN_GameShutdown GameShutdown
|
||||||
|
// #define FN_ShouldCollide ShouldCollide
|
||||||
|
|
||||||
|
// #define FN_OnFreeEntPrivateData_Post OnFreeEntPrivateData_Post
|
||||||
|
// #define FN_GameShutdown_Post GameShutdown_Post
|
||||||
|
// #define FN_ShouldCollide_Post ShouldCollide_Post
|
||||||
|
|
||||||
|
|
||||||
|
#endif // USE_METAMOD
|
||||||
|
|
||||||
|
#endif // __MODULECONFIG_H__
|
||||||
|
|
34
dlls/arrayx/Array.cpp
Normal file
34
dlls/arrayx/Array.cpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#include "amxxmodule.h"
|
||||||
|
#include "ComboArray.h"
|
||||||
|
|
||||||
|
extern AMX_NATIVE_INFO bintrie_exports[];
|
||||||
|
extern AMX_NATIVE_INFO bintrie_usage_exports[];
|
||||||
|
extern ComboArray MasterTrie;
|
||||||
|
|
||||||
|
extern AMX_NATIVE_INFO list_exports[];
|
||||||
|
extern AMX_NATIVE_INFO list_creation_exports[];
|
||||||
|
extern ComboArray MasterList;
|
||||||
|
|
||||||
|
extern AMX_NATIVE_INFO map_exports[];
|
||||||
|
extern AMX_NATIVE_INFO map_creation_exports[];
|
||||||
|
extern ComboArray MasterMap;
|
||||||
|
|
||||||
|
|
||||||
|
void OnAmxxAttach( void )
|
||||||
|
{
|
||||||
|
MF_AddNatives(bintrie_exports);
|
||||||
|
MF_AddNatives(bintrie_usage_exports);
|
||||||
|
|
||||||
|
MF_AddNatives(list_exports);
|
||||||
|
MF_AddNatives(list_creation_exports);
|
||||||
|
|
||||||
|
MF_AddNatives(map_exports);
|
||||||
|
MF_AddNatives(map_creation_exports);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnAmxxDetach( void )
|
||||||
|
{
|
||||||
|
JudyClearMasterTrie(&MasterTrie);
|
||||||
|
JudyClearMasterList(&MasterList);
|
||||||
|
JudyClearMasterMap(&MasterMap);
|
||||||
|
}
|
175
dlls/arrayx/Array.dep
Normal file
175
dlls/arrayx/Array.dep
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
# Microsoft Developer Studio Generated Dependency File, included by Array.mak
|
||||||
|
|
||||||
|
.\Array.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CArray.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\ComboArray.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\BinTrieNatives.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\BinTrieNativeFunctions.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CArray.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\ComboArray.h"\
|
||||||
|
".\GenericNatives.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\NativeIncludes.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\Capsule.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\CArray.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CArray.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\CBinTrie.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\CKeytable.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CKeytable.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\JudyExtra.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\ListNatives.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CArray.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\ComboArray.h"\
|
||||||
|
".\GenericNatives.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\ListNativeFunctions.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\NativeIncludes.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\MapNatives.cpp : \
|
||||||
|
"..\..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\Capsule.h"\
|
||||||
|
".\CArray.h"\
|
||||||
|
".\CBaseList.h"\
|
||||||
|
".\CBaseMap.h"\
|
||||||
|
".\CBinTrie.h"\
|
||||||
|
".\CHashtable.h"\
|
||||||
|
".\CKeytable.h"\
|
||||||
|
".\ComboArray.h"\
|
||||||
|
".\ComboTable.h"\
|
||||||
|
".\GenericNatives.h"\
|
||||||
|
".\Judy.h"\
|
||||||
|
".\JudyEx.h"\
|
||||||
|
".\JudyExtra.h"\
|
||||||
|
".\JudyIncludes.h"\
|
||||||
|
".\JudyVar.h"\
|
||||||
|
".\JudyVec.h"\
|
||||||
|
".\MapNativeFunctions.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
".\NativeIncludes.h"\
|
||||||
|
".\osdefs.h"\
|
||||||
|
|
||||||
|
|
||||||
|
.\amxxmodule.cpp : \
|
||||||
|
".\amxxmodule.h"\
|
||||||
|
".\moduleconfig.h"\
|
||||||
|
|
237
dlls/arrayx/Array.dsp
Normal file
237
dlls/arrayx/Array.dsp
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
# Microsoft Developer Studio Project File - Name="Array" - Package Owner=<4>
|
||||||
|
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||||
|
# ** DO NOT EDIT **
|
||||||
|
|
||||||
|
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||||
|
|
||||||
|
CFG=Array - 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 "Array.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 "Array.mak" CFG="Array - Win32 Debug"
|
||||||
|
!MESSAGE
|
||||||
|
!MESSAGE Possible choices for configuration are:
|
||||||
|
!MESSAGE
|
||||||
|
!MESSAGE "Array - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||||
|
!MESSAGE "Array - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||||
|
!MESSAGE
|
||||||
|
|
||||||
|
# Begin Project
|
||||||
|
# PROP AllowPerConfigDependencies 0
|
||||||
|
# PROP Scc_ProjName ""
|
||||||
|
# PROP Scc_LocalPath ""
|
||||||
|
CPP=cl.exe
|
||||||
|
MTL=midl.exe
|
||||||
|
RSC=rc.exe
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "Array - Win32 Release"
|
||||||
|
|
||||||
|
# PROP BASE Use_MFC 0
|
||||||
|
# PROP BASE Use_Debug_Libraries 0
|
||||||
|
# PROP BASE Output_Dir "Release"
|
||||||
|
# PROP BASE Intermediate_Dir "Release"
|
||||||
|
# PROP BASE Target_Dir ""
|
||||||
|
# PROP Use_MFC 0
|
||||||
|
# PROP Use_Debug_Libraries 0
|
||||||
|
# PROP Output_Dir "Release"
|
||||||
|
# PROP Intermediate_Dir "Release"
|
||||||
|
# PROP Target_Dir ""
|
||||||
|
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /c
|
||||||
|
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /FR /YX /FD /c
|
||||||
|
# ADD 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
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "Array - Win32 Debug"
|
||||||
|
|
||||||
|
# PROP BASE Use_MFC 0
|
||||||
|
# PROP BASE Use_Debug_Libraries 1
|
||||||
|
# PROP BASE Output_Dir "Debug"
|
||||||
|
# PROP BASE Intermediate_Dir "Debug"
|
||||||
|
# PROP BASE Target_Dir ""
|
||||||
|
# PROP Use_MFC 0
|
||||||
|
# PROP Use_Debug_Libraries 1
|
||||||
|
# PROP Output_Dir "Debug"
|
||||||
|
# PROP Intermediate_Dir "Debug"
|
||||||
|
# PROP Target_Dir ""
|
||||||
|
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /GZ /c
|
||||||
|
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /GZ /c
|
||||||
|
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
|
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
|
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||||
|
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||||
|
BSC32=bscmake.exe
|
||||||
|
# ADD BASE BSC32 /nologo
|
||||||
|
# ADD BSC32 /nologo
|
||||||
|
LINK32=link.exe
|
||||||
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||||
|
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
|
# Begin Target
|
||||||
|
|
||||||
|
# Name "Array - Win32 Release"
|
||||||
|
# Name "Array - Win32 Debug"
|
||||||
|
# Begin Group "Source Files"
|
||||||
|
|
||||||
|
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\Array.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\BinTrieNatives.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\Capsule.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CArray.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CBinTrie.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CKeytable.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyExtra.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\ListNatives.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\MapNatives.cpp
|
||||||
|
# End Source File
|
||||||
|
# End Group
|
||||||
|
# Begin Group "Header Files"
|
||||||
|
|
||||||
|
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\Capsule.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CArray.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CBaseList.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CBaseMap.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CBinTrie.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CHashtable.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CKeytable.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\ComboArray.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\ComboTable.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyIncludes.h
|
||||||
|
# End Source File
|
||||||
|
# End Group
|
||||||
|
# Begin Group "Resource Files"
|
||||||
|
|
||||||
|
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\amxxmodule.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\amxxmodule.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\BinTrieNativeFunctions.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\GenericNatives.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\Judy.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyEx.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyExtra.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyVar.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\JudyVec.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\ListNativeFunctions.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\MapNativeFunctions.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\moduleconfig.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\NativeIncludes.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\osdefs.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\Judy.lib
|
||||||
|
# End Source File
|
||||||
|
# End Group
|
||||||
|
# End Target
|
||||||
|
# End Project
|
29
dlls/arrayx/Array.dsw
Normal file
29
dlls/arrayx/Array.dsw
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||||
|
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
Project: "Array"=".\Array.dsp" - Package Owner=<4>
|
||||||
|
|
||||||
|
Package=<5>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Package=<4>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
Global:
|
||||||
|
|
||||||
|
Package=<5>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Package=<3>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
BIN
dlls/arrayx/Array.ncb
Normal file
BIN
dlls/arrayx/Array.ncb
Normal file
Binary file not shown.
BIN
dlls/arrayx/Array.opt
Normal file
BIN
dlls/arrayx/Array.opt
Normal file
Binary file not shown.
110
dlls/arrayx/Array.plg
Normal file
110
dlls/arrayx/Array.plg
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<pre>
|
||||||
|
<h1>Build Log</h1>
|
||||||
|
<h3>
|
||||||
|
--------------------Configuration: Array - Win32 Release--------------------
|
||||||
|
</h3>
|
||||||
|
<h3>Command Lines</h3>
|
||||||
|
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPED.tmp" with contents
|
||||||
|
[
|
||||||
|
/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /FR"Release/" /Fp"Release/Array.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
|
||||||
|
"C:\Array\Array.cpp"
|
||||||
|
"C:\Array\BinTrieNatives.cpp"
|
||||||
|
"C:\Array\Capsule.cpp"
|
||||||
|
"C:\Array\CArray.cpp"
|
||||||
|
"C:\Array\CBinTrie.cpp"
|
||||||
|
"C:\Array\CKeytable.cpp"
|
||||||
|
"C:\Array\JudyExtra.cpp"
|
||||||
|
"C:\Array\ListNatives.cpp"
|
||||||
|
"C:\Array\MapNatives.cpp"
|
||||||
|
"C:\Array\amxxmodule.cpp"
|
||||||
|
]
|
||||||
|
Creating command line "cl.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPED.tmp"
|
||||||
|
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPEE.tmp" with contents
|
||||||
|
[
|
||||||
|
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /pdb:"Release/Array.pdb" /machine:I386 /out:"Release/Array.dll" /implib:"Release/Array.lib"
|
||||||
|
.\Release\Array.obj
|
||||||
|
.\Release\BinTrieNatives.obj
|
||||||
|
.\Release\Capsule.obj
|
||||||
|
.\Release\CArray.obj
|
||||||
|
.\Release\CBinTrie.obj
|
||||||
|
.\Release\CKeytable.obj
|
||||||
|
.\Release\JudyExtra.obj
|
||||||
|
.\Release\ListNatives.obj
|
||||||
|
.\Release\MapNatives.obj
|
||||||
|
.\Release\amxxmodule.obj
|
||||||
|
.\Judy.lib
|
||||||
|
]
|
||||||
|
Creating command line "link.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPEE.tmp"
|
||||||
|
<h3>Output Window</h3>
|
||||||
|
Compiling...
|
||||||
|
Array.cpp
|
||||||
|
BinTrieNatives.cpp
|
||||||
|
Capsule.cpp
|
||||||
|
CArray.cpp
|
||||||
|
CBinTrie.cpp
|
||||||
|
CKeytable.cpp
|
||||||
|
JudyExtra.cpp
|
||||||
|
C:\Array\JudyExtra.cpp(10) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(15) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(20) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(23) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(34) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(41) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(66) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(102) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(107) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(112) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(115) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(127) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(132) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(137) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(140) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(160) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(164) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(167) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(190) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(205) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(210) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(215) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(218) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(230) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(235) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(240) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(243) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(258) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(266) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(274) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(277) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
C:\Array\JudyExtra.cpp(305) : warning C4101: 'e' : unreferenced local variable
|
||||||
|
ListNatives.cpp
|
||||||
|
MapNatives.cpp
|
||||||
|
amxxmodule.cpp
|
||||||
|
Linking...
|
||||||
|
Creating library Release/Array.lib and object Release/Array.exp
|
||||||
|
LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library
|
||||||
|
Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPF2.tmp" with contents
|
||||||
|
[
|
||||||
|
/nologo /o"Release/Array.bsc"
|
||||||
|
.\Release\Array.sbr
|
||||||
|
.\Release\BinTrieNatives.sbr
|
||||||
|
.\Release\Capsule.sbr
|
||||||
|
.\Release\CArray.sbr
|
||||||
|
.\Release\CBinTrie.sbr
|
||||||
|
.\Release\CKeytable.sbr
|
||||||
|
.\Release\JudyExtra.sbr
|
||||||
|
.\Release\ListNatives.sbr
|
||||||
|
.\Release\MapNatives.sbr
|
||||||
|
.\Release\amxxmodule.sbr]
|
||||||
|
Creating command line "bscmake.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPF2.tmp"
|
||||||
|
Creating browse info file...
|
||||||
|
<h3>Output Window</h3>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h3>Results</h3>
|
||||||
|
Array.dll - 0 error(s), 33 warning(s)
|
||||||
|
</pre>
|
||||||
|
</body>
|
||||||
|
</html>
|
78
dlls/arrayx/BinTrieNativeFunctions.h
Normal file
78
dlls/arrayx/BinTrieNativeFunctions.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#ifndef _bintrie_NATIVE_FUNC_INC_H
|
||||||
|
#define _bintrie_NATIVE_FUNC_INC_H
|
||||||
|
|
||||||
|
#define JUDY_GLUE_FUNC( x , y ) x ## y
|
||||||
|
|
||||||
|
#define JUDY_GLUE_STR( x, y ) #x#y
|
||||||
|
|
||||||
|
#define JUDY_MASTER_EDIT_FUNCTIONS
|
||||||
|
#define JUDY_MASTER_CLEAR_FUNC JUDY_GLUE_FUNC( bintrie , _clear )
|
||||||
|
#define JUDY_MASTER_CLEAR_STR JUDY_GLUE_STR ( bintrie , _clear )
|
||||||
|
|
||||||
|
#define JUDY_MASTER_DELETE_FUNC JUDY_GLUE_FUNC( bintrie , _delete )
|
||||||
|
#define JUDY_MASTER_DELETE_STR JUDY_GLUE_STR ( bintrie , _delete )
|
||||||
|
|
||||||
|
#define JUDY_MASTER_IO_FUNCTIONS
|
||||||
|
|
||||||
|
#define JUDY_MASTER_SAVE_FUNC JUDY_GLUE_FUNC( bintrie , _save )
|
||||||
|
#define JUDY_MASTER_SAVE_STR JUDY_GLUE_STR ( bintrie , _save )
|
||||||
|
#define JUDY_SAVE_FUNC(bin,file) JudySaveBinTrie(bin , file )
|
||||||
|
|
||||||
|
#define JUDY_MASTER_LOAD_FUNC JUDY_GLUE_FUNC( bintrie , _load )
|
||||||
|
#define JUDY_MASTER_LOAD_STR JUDY_GLUE_STR ( bintrie , _load )
|
||||||
|
#define JUDY_LOAD_FUNC(bin, file) JudyLoadBinTrie(bin , file )
|
||||||
|
|
||||||
|
#define JUDY_MASTER_AMOUNT_FUNCTIONS
|
||||||
|
#define JUDY_MASTER_COUNT_FUNC JUDY_GLUE_FUNC( bintrie , _count )
|
||||||
|
#define JUDY_MASTER_COUNT_STR JUDY_GLUE_STR ( bintrie , _count )
|
||||||
|
|
||||||
|
#define JUDY_MASTER_BYCOUNT_FUNC JUDY_GLUE_FUNC( bintrie , _bycount )
|
||||||
|
#define JUDY_MASTER_BYCOUNT_STR JUDY_GLUE_STR ( bintrie , _bycount )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_AMOUNT_FUNCTIONS
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_COUNT_FUNC JUDY_GLUE_FUNC( bintrie , _size )
|
||||||
|
#define JUDY_SLAVE_COUNT_STR JUDY_GLUE_STR ( bintrie , _size )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_BYCOUNT_FUNC JUDY_GLUE_FUNC( bintrie , _get_nth )
|
||||||
|
#define JUDY_SLAVE_BYCOUNT_STR JUDY_GLUE_STR ( bintrie , _get_nth )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_EDIT_FUNCTIONS
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_MEMORY_FUNC JUDY_GLUE_FUNC( bintrie , _memory )
|
||||||
|
#define JUDY_SLAVE_MEMORY_STR JUDY_GLUE_STR ( bintrie , _memory )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_ISFILLED_FUNC JUDY_GLUE_FUNC( bintrie , _isfilled )
|
||||||
|
#define JUDY_SLAVE_ISFILLED_STR JUDY_GLUE_STR ( bintrie , _isfilled )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_ISEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _isempty )
|
||||||
|
#define JUDY_SLAVE_ISEMPTY_STR JUDY_GLUE_STR ( bintrie , _isempty )
|
||||||
|
|
||||||
|
#define NO_JUDY_SLAVE_REMOVE_FUNC
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_SEARCH_FUNCTIONS
|
||||||
|
#define JUDY_SLAVE_FIRST_FUNC JUDY_GLUE_FUNC( bintrie , _first )
|
||||||
|
#define JUDY_SLAVE_LAST_FUNC JUDY_GLUE_FUNC( bintrie , _last )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_FIRST_STR JUDY_GLUE_STR ( bintrie , _first )
|
||||||
|
#define JUDY_SLAVE_LAST_STR JUDY_GLUE_STR ( bintrie , _last )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_NEXT_FUNC JUDY_GLUE_FUNC( bintrie , _next )
|
||||||
|
#define JUDY_SLAVE_PREV_FUNC JUDY_GLUE_FUNC( bintrie , _prev )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_NEXT_STR JUDY_GLUE_STR ( bintrie , _next )
|
||||||
|
#define JUDY_SLAVE_PREV_STR JUDY_GLUE_STR ( bintrie , _prev )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_SEARCH_EMPTY_FUNCTIONS
|
||||||
|
#define JUDY_SLAVE_FIRSTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _firstempty )
|
||||||
|
#define JUDY_SLAVE_LASTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _lastempty )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_FIRSTEMPTY_STR JUDY_GLUE_STR ( bintrie , _firstempty )
|
||||||
|
#define JUDY_SLAVE_LASTEMPTY_STR JUDY_GLUE_STR ( bintrie , _lastempty )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_NEXTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _nextempty )
|
||||||
|
#define JUDY_SLAVE_PREVEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _prevempty )
|
||||||
|
|
||||||
|
#define JUDY_SLAVE_NEXTEMPTY_STR JUDY_GLUE_STR ( bintrie , _nextempty )
|
||||||
|
#define JUDY_SLAVE_PREVEMPTY_STR JUDY_GLUE_STR ( bintrie , _prevempty )
|
||||||
|
#endif
|
69
dlls/arrayx/BinTrieNatives.cpp
Normal file
69
dlls/arrayx/BinTrieNatives.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#include "CBinTrie.h"
|
||||||
|
|
||||||
|
#define KEY_TYPE cell
|
||||||
|
#define DYNAMIC_UNIT_TYPE BinTrie
|
||||||
|
#define STORAGE_TYPE cell
|
||||||
|
#define MASTER_NAME MasterTrie
|
||||||
|
#define EXPORT_NAME bintrie_exports
|
||||||
|
|
||||||
|
#define SEARCH_ERROR_OFFSET 0
|
||||||
|
|
||||||
|
#define GET_KEY(params, num) params[num]
|
||||||
|
#define SET_KEY(stuff, parameter) stuff
|
||||||
|
|
||||||
|
#include "BinTrieNativeFunctions.h"
|
||||||
|
#include "NativeIncludes.h"
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL bintrie_create(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
DTYPE* Unit;
|
||||||
|
M_ITYPE Index = params[1];
|
||||||
|
|
||||||
|
JUDY_CREATE_INDEX(MNAME,Unit,BinTrie,Index);
|
||||||
|
return Index;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL bintrie_set(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
DTYPE* Unit = NULL;
|
||||||
|
|
||||||
|
JUDY_GET_INDEX(MNAME,Unit, params[1]);
|
||||||
|
ITYPE Indice = JUDY_GET_KEY(params,2);
|
||||||
|
bool Value = (params[3] != NULL);
|
||||||
|
|
||||||
|
try { return Unit->Set(Indice, Value ); }
|
||||||
|
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Set Function ");
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL bintrie_get(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
DTYPE* Unit = NULL;
|
||||||
|
|
||||||
|
JUDY_GET_INDEX(MNAME,Unit, params[1]);
|
||||||
|
ITYPE Indice = JUDY_GET_KEY(params,2);
|
||||||
|
|
||||||
|
try { return Unit->Get(Indice ); }
|
||||||
|
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Get Function ");
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL bintrie_remove(AMX *amx,cell *params)
|
||||||
|
{
|
||||||
|
DTYPE* Unit = NULL;
|
||||||
|
|
||||||
|
JUDY_GET_INDEX(MNAME,Unit, params[1]);
|
||||||
|
ITYPE Indice = JUDY_GET_KEY(params,2);
|
||||||
|
|
||||||
|
try { return Unit->Delete(Indice ); }
|
||||||
|
JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Delete Function ");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AMX_NATIVE_INFO bintrie_usage_exports[] =
|
||||||
|
{
|
||||||
|
{ "bintrie_create", bintrie_create },
|
||||||
|
{ "bintrie_set", bintrie_set },
|
||||||
|
{ "bintrie_get", bintrie_get },
|
||||||
|
{ "bintrie_remove", bintrie_remove },
|
||||||
|
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
87
dlls/arrayx/CArray.cpp
Normal file
87
dlls/arrayx/CArray.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#include "CArray.h"
|
||||||
|
|
||||||
|
void Array::ThrowSearchError(char* type)
|
||||||
|
{
|
||||||
|
char value[50];
|
||||||
|
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
|
||||||
|
|
||||||
|
throw JudyEx(value,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Array::ThrowIndexError( cell index, bool disable_check )
|
||||||
|
{
|
||||||
|
if(disable_check == true) return;
|
||||||
|
|
||||||
|
char error[50];
|
||||||
|
sprintf(error,"Index %i is not set.",index);
|
||||||
|
|
||||||
|
throw JudyEx(error,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::First( cell Start)
|
||||||
|
{
|
||||||
|
PPvoid_t success = JudyLFirst(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:First");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::FirstEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = JudyLFirstEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:FirstEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::Next( cell Start)
|
||||||
|
{
|
||||||
|
PPvoid_t success = JudyLNext(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Next");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::NextEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = JudyLNextEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:NextEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::Prev( cell Start)
|
||||||
|
{
|
||||||
|
PPvoid_t success = JudyLPrev(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Prev");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::PrevEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = JudyLPrevEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:PrevEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::Last( cell Start)
|
||||||
|
{
|
||||||
|
PPvoid_t success = JudyLLast(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Last");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::LastEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = JudyLLastEmpty(Table, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:LastEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Array::ByCount(cell n, cell Start)
|
||||||
|
{
|
||||||
|
PPvoid_t success = JudyLByCount(Table, n, reinterpret_cast<Word_t *>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Nth");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
74
dlls/arrayx/CArray.h
Normal file
74
dlls/arrayx/CArray.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#ifndef _ARRAYCLASS_H
|
||||||
|
#define _ARRAYCLASS_H
|
||||||
|
|
||||||
|
#include "JudyIncludes.h"
|
||||||
|
#include "CBaseList.h"
|
||||||
|
#include "JudyExtra.h"
|
||||||
|
//#include <JudyL.h>
|
||||||
|
|
||||||
|
class Array: public CBaseList
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Pvoid_t Table;
|
||||||
|
|
||||||
|
void ThrowIndexError( cell index, bool disable_check = false );
|
||||||
|
void ThrowSearchError(char* msg);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Array() { Table = NULL; }
|
||||||
|
~Array() { Clear(); }
|
||||||
|
void Remove() { delete this; }
|
||||||
|
|
||||||
|
Word_t Clear() { JudyClearList(this); return JudyLFreeArray(&Table, PJE0); }
|
||||||
|
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
|
||||||
|
|
||||||
|
int Delete(cell Key) { return JudyLDel(&Table, Key, PJE0 ); }
|
||||||
|
|
||||||
|
void Set(cell Index, Pvoid_t value, bool disable_check)
|
||||||
|
{
|
||||||
|
PPvoid_t PValue = JudyLIns(&Table, Index,PJE0);
|
||||||
|
*PValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pvoid_t Get(cell Index, bool disable_check = false)
|
||||||
|
{
|
||||||
|
PPvoid_t PValue = JudyLGet(Table, Index, PJE0);
|
||||||
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
|
||||||
|
|
||||||
|
return *PValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Set(cell Index, Type value)
|
||||||
|
{
|
||||||
|
PPvoid_t PValue = JudyLIns(&Table, Index,PJE0);
|
||||||
|
*PValue = reinterpret_cast<void*>(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Type>
|
||||||
|
Type Get(cell Index, Type example, bool disable_check = false)
|
||||||
|
{
|
||||||
|
PPvoid_t PValue = JudyLGet(Table, Index, PJE0);
|
||||||
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
|
||||||
|
|
||||||
|
return (Type)(*PValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell First(cell Start = 0);
|
||||||
|
cell Next(cell Start = 0);
|
||||||
|
cell Prev(cell Start = -1);
|
||||||
|
cell Last(cell Start = -1);
|
||||||
|
|
||||||
|
cell FirstEmpty(cell Start = 0);
|
||||||
|
cell NextEmpty(cell Start = 0);
|
||||||
|
cell PrevEmpty(cell Start = -1);
|
||||||
|
cell LastEmpty(cell Start = -1);
|
||||||
|
|
||||||
|
cell ByCount(cell n, cell Start = 0);
|
||||||
|
cell Count(cell Start = 0, cell Stop = -1) { return JudyLCount(Table, Start, Stop, PJE0); }
|
||||||
|
|
||||||
|
bool IsFilled(cell Index) { return ( (Get(Index, true ) != NULL) ? true : false); }
|
||||||
|
bool IsEmpty(cell Index) { return ( (Get(Index, true ) == NULL) ? true : false); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
36
dlls/arrayx/CBaseList.h
Normal file
36
dlls/arrayx/CBaseList.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#ifndef _BASE_ARRAYCLASS_H
|
||||||
|
#define _BASE_ARRAYCLASS_H
|
||||||
|
|
||||||
|
#include "JudyIncludes.h"
|
||||||
|
|
||||||
|
class CBaseList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual Word_t Clear() =0;
|
||||||
|
virtual Word_t MemoryUsed() =0;
|
||||||
|
|
||||||
|
virtual int Delete(cell Key) =0;
|
||||||
|
virtual void Remove() =0;
|
||||||
|
|
||||||
|
virtual void Set(cell Index, Pvoid_t value, bool disable_check = false) =0;
|
||||||
|
|
||||||
|
virtual Pvoid_t Get(cell Index, bool disable_check = false) =0;
|
||||||
|
|
||||||
|
virtual cell First(cell Start = 0) =0;
|
||||||
|
virtual cell Next(cell Start = 0) =0;
|
||||||
|
virtual cell Prev(cell Start = -1) =0;
|
||||||
|
virtual cell Last(cell Start = -1) =0;
|
||||||
|
|
||||||
|
virtual cell FirstEmpty(cell Start = 0) =0;
|
||||||
|
virtual cell NextEmpty(cell Start = 0) =0;
|
||||||
|
virtual cell PrevEmpty(cell Start = -1) =0;
|
||||||
|
virtual cell LastEmpty(cell Start = -1) =0;
|
||||||
|
|
||||||
|
virtual cell ByCount(cell n, cell Start = 0) =0;
|
||||||
|
virtual cell Count(cell Start = 0, cell Stop = -1) =0;
|
||||||
|
|
||||||
|
virtual bool IsFilled(cell Index) =0;
|
||||||
|
virtual bool IsEmpty(cell Index) =0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
29
dlls/arrayx/CBaseMap.h
Normal file
29
dlls/arrayx/CBaseMap.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef _BASE_MAPCLASS_H
|
||||||
|
#define _BASE_MAPCLASS_H
|
||||||
|
|
||||||
|
#include "JudyIncludes.h"
|
||||||
|
|
||||||
|
class CBaseMap
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual Word_t Clear() =0;
|
||||||
|
virtual Word_t MemoryUsed() =0;
|
||||||
|
|
||||||
|
virtual int Delete(char* Key) =0;
|
||||||
|
virtual void Remove() =0;
|
||||||
|
|
||||||
|
virtual void Set(char* Index, Pvoid_t value, bool disable_check = false) =0;
|
||||||
|
|
||||||
|
virtual Pvoid_t Get(char* Index, bool disable_check = false) =0;
|
||||||
|
|
||||||
|
virtual char* First(char* Start = "") =0;
|
||||||
|
virtual char* Next(char* Start) =0;
|
||||||
|
virtual char* Prev(char* Start) =0;
|
||||||
|
virtual char* Last(char* Start) =0;
|
||||||
|
|
||||||
|
virtual bool IsFilled(char* Index) =0;
|
||||||
|
virtual bool IsEmpty(char* Index) =0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
76
dlls/arrayx/CBinTrie.cpp
Normal file
76
dlls/arrayx/CBinTrie.cpp
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
#include "CBinTrie.h"
|
||||||
|
|
||||||
|
void BinTrie::ThrowSearchError(char* type)
|
||||||
|
{
|
||||||
|
char value[50];
|
||||||
|
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
|
||||||
|
|
||||||
|
throw JudyEx (value,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::First( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1First(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:First");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::FirstEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1FirstEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:FirstEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::Next( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1Next(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Next");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::NextEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1NextEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:NextEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::Prev( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1Prev(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Prev");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::PrevEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1PrevEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:PrevEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::Last( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1Last(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Last");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::LastEmpty( cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1LastEmpty(Table, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:LastEmpty");
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell BinTrie::ByCount(cell n, cell Start)
|
||||||
|
{
|
||||||
|
cell success = Judy1ByCount(Table, n, reinterpret_cast<unsigned int*>(&Start), PJE0);
|
||||||
|
if (success == NULL) ThrowSearchError("Type:Nth");
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
54
dlls/arrayx/CBinTrie.h
Normal file
54
dlls/arrayx/CBinTrie.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#ifndef _BINTRIECLASS_H
|
||||||
|
#define _BINTRIECLASS_H
|
||||||
|
|
||||||
|
#include "JudyIncludes.h"
|
||||||
|
#include "JudyExtra.h"
|
||||||
|
//#include <Judy1.h>
|
||||||
|
|
||||||
|
class BinTrie
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Pvoid_t Table;
|
||||||
|
|
||||||
|
void ThrowSearchError(char* msg);
|
||||||
|
|
||||||
|
public:
|
||||||
|
BinTrie() { Table = NULL; }
|
||||||
|
~BinTrie() { Clear(); }
|
||||||
|
void Remove() { delete this; }
|
||||||
|
|
||||||
|
Word_t Clear() { JudyClearBinTrie(this); return Judy1FreeArray(&Table, PJE0); }
|
||||||
|
Word_t MemoryUsed() { return Judy1MemUsed(Table); }
|
||||||
|
|
||||||
|
cell Delete(cell Key) { return Judy1Unset(&Table, Key, PJE0 ); }
|
||||||
|
|
||||||
|
cell Set(cell Index, bool val)
|
||||||
|
{
|
||||||
|
if(val == false) return Delete(Index);
|
||||||
|
else return Judy1Set(&Table, Index,PJE0);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell Get(cell Index)
|
||||||
|
{
|
||||||
|
cell PValue = Judy1Test(Table, Index, PJE0);
|
||||||
|
return PValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell First(cell Start = 0);
|
||||||
|
cell Next(cell Start = 0);
|
||||||
|
cell Prev(cell Start = -1);
|
||||||
|
cell Last(cell Start = -1);
|
||||||
|
|
||||||
|
cell FirstEmpty(cell Start = 0);
|
||||||
|
cell NextEmpty(cell Start = 0);
|
||||||
|
cell PrevEmpty(cell Start = -1);
|
||||||
|
cell LastEmpty(cell Start = -1);
|
||||||
|
|
||||||
|
cell ByCount(cell n, cell Start);
|
||||||
|
cell Count(cell Start = 0, cell Stop = -1) { return Judy1Count(Table, Start, Stop, PJE0); }
|
||||||
|
|
||||||
|
bool IsFilled(cell Index) { return ( (Get(Index )) ? true : false); }
|
||||||
|
bool IsEmpty(cell Index) { return ( (Get(Index )) ? true : false); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
82
dlls/arrayx/CHashtable.h
Normal file
82
dlls/arrayx/CHashtable.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#ifndef _HASHCLASS_INCLUDED
|
||||||
|
#define _HASHCLASS_INCLUDED
|
||||||
|
|
||||||
|
#include "JudyIncludes.h"
|
||||||
|
#include "CBaseMap.h"
|
||||||
|
//#include <JudyHS.h>
|
||||||
|
|
||||||
|
class Hashtable: public CBaseMap
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Pvoid_t Table;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Hashtable() { Table = NULL; }
|
||||||
|
~Hashtable() { Clear(); }
|
||||||
|
void Remove() { delete this; }
|
||||||
|
|
||||||
|
Word_t Clear() { return JudyHSFreeArray(&Table, PJE0); }
|
||||||
|
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
|
||||||
|
|
||||||
|
int Delete(char* Key) { return JudyHSDel(&Table, Key, strlen(Key), PJE0 ); }
|
||||||
|
|
||||||
|
void Set(char* Index, Pvoid_t value, bool disable_check)
|
||||||
|
{
|
||||||
|
int Len = strlen(Index) + 1;
|
||||||
|
PPvoid_t PValue = JudyHSIns(&Table, Index, Len, PJE0);
|
||||||
|
*PValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pvoid_t Get(char* Index, bool disable_check = false)
|
||||||
|
{
|
||||||
|
PPvoid_t PValue = JudyHSGet(Table, Index, strlen(Index)+1);
|
||||||
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
|
||||||
|
|
||||||
|
return *PValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Type>
|
||||||
|
void Set(char* Index, Type value)
|
||||||
|
{
|
||||||
|
int Len = strlen(Index) + 1;
|
||||||
|
PPvoid_t PValue = JudyHSIns(&Table, Index, Len, PJE0);
|
||||||
|
*PValue = reinterpret_cast<void*>(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Type>
|
||||||
|
Type Get(char* Index, Type example, bool disable_check = false)
|
||||||
|
{
|
||||||
|
PPvoid_t PValue = JudyHSGet(Table, Index, strlen(Index)+1);
|
||||||
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
|
||||||
|
|
||||||
|
return (Type)(*PValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
char* First( char* Start = "") { ThrowSearchError(); return (char*)NULL; }
|
||||||
|
char* Next( char* Start = "") { ThrowSearchError(); return (char*)NULL; }
|
||||||
|
char* Prev( char* Start) { ThrowSearchError(); return (char*)NULL; }
|
||||||
|
char* Last( char* Start) { ThrowSearchError(); return (char*)NULL; }
|
||||||
|
|
||||||
|
bool IsFilled(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false);}
|
||||||
|
bool IsEmpty(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false);}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void ThrowIndexError( char* index, bool disable_check = false )
|
||||||
|
{
|
||||||
|
if(disable_check == true) return;
|
||||||
|
|
||||||
|
char value[100];
|
||||||
|
sprintf(value,"Function attempted to read non existant index %s", index );
|
||||||
|
|
||||||
|
throw JudyEx(value, true);
|
||||||
|
}
|
||||||
|
void ThrowSearchError( void )
|
||||||
|
{
|
||||||
|
char value[50];
|
||||||
|
sprintf(value,"Function attempted to search HashTable!: Invalid action!");
|
||||||
|
|
||||||
|
throw JudyEx(value,true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
66
dlls/arrayx/CKeytable.cpp
Normal file
66
dlls/arrayx/CKeytable.cpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#include "CKeytable.h"
|
||||||
|
|
||||||
|
void Keytable::ThrowIndexError( char* index, bool disable_check = false )
|
||||||
|
{
|
||||||
|
if(disable_check == true) return;
|
||||||
|
|
||||||
|
char error[50];
|
||||||
|
sprintf(error,"Index %s is not set.",index);
|
||||||
|
|
||||||
|
throw JudyEx(error,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Keytable::ThrowSearchError(char* type)
|
||||||
|
{
|
||||||
|
char value[50];
|
||||||
|
sprintf(value,"Function attempted to search %s: Judy returned NULL value", type);
|
||||||
|
|
||||||
|
throw JudyEx(value,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
char* Keytable::First( char* Start)
|
||||||
|
{
|
||||||
|
PPvoid_t index = JudySLFirst(Table, Start, PJE0);
|
||||||
|
if (index == NULL)
|
||||||
|
{
|
||||||
|
sprintf(Start,"dne");
|
||||||
|
ThrowSearchError("Type:First");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* Keytable::Next( char* Start)
|
||||||
|
{
|
||||||
|
PPvoid_t index = JudySLNext(Table, Start, PJE0);
|
||||||
|
if (index == NULL)
|
||||||
|
{
|
||||||
|
sprintf(Start,"dne");
|
||||||
|
ThrowSearchError("Type:Next");
|
||||||
|
}
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* Keytable::Prev( char* Start)
|
||||||
|
{
|
||||||
|
PPvoid_t index = JudySLPrev(Table, Start, PJE0);
|
||||||
|
if (index == NULL)
|
||||||
|
{
|
||||||
|
sprintf(Start,"dne");
|
||||||
|
ThrowSearchError("Type:Prev");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* Keytable::Last( char* Start)
|
||||||
|
{
|
||||||
|
PPvoid_t index = JudySLLast(Table, Start, PJE0);
|
||||||
|
if (index == NULL)
|
||||||
|
{
|
||||||
|
sprintf(Start,"dne");
|
||||||
|
ThrowSearchError("Type:Last");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Start;
|
||||||
|
}
|
66
dlls/arrayx/CKeytable.h
Normal file
66
dlls/arrayx/CKeytable.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#ifndef _KEYCLASS_INCLUDED
|
||||||
|
#define _KEYCLASS_INCLUDED
|
||||||
|
|
||||||
|
#include "JudyIncludes.h"
|
||||||
|
#include "CBaseMap.h"
|
||||||
|
#include "JudyExtra.h"
|
||||||
|
//#include <JudySL.h>
|
||||||
|
|
||||||
|
class Keytable: public CBaseMap
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Pvoid_t Table;
|
||||||
|
|
||||||
|
void ThrowSearchError(char* type);
|
||||||
|
void ThrowIndexError( char* index, bool disable_check);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Keytable() { Table = NULL; }
|
||||||
|
~Keytable() { Clear(); }
|
||||||
|
void Remove() { delete this; }
|
||||||
|
|
||||||
|
Word_t Clear() { JudyClearMap(this); return JudySLFreeArray(&Table, PJE0); }
|
||||||
|
Word_t MemoryUsed() { return JudyLMemUsed(Table); }
|
||||||
|
|
||||||
|
int Delete(char* Key) { return JudySLDel(&Table, Key, PJE0 ); }
|
||||||
|
|
||||||
|
void Set(char* Index, Pvoid_t value, bool disable_check)
|
||||||
|
{
|
||||||
|
PPvoid_t PValue = JudySLIns(&Table, Index,PJE0);
|
||||||
|
*PValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pvoid_t Get(char* Index, bool disable_check = false)
|
||||||
|
{
|
||||||
|
PPvoid_t PValue = JudySLGet(Table, Index, PJE0);
|
||||||
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; }
|
||||||
|
|
||||||
|
return *PValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Type>
|
||||||
|
void Set(char* Index, Type value)
|
||||||
|
{
|
||||||
|
PPvoid_t PValue = JudySLIns(&Table, Index,PJE0);
|
||||||
|
*PValue = reinterpret_cast<void*>(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Type>
|
||||||
|
Type Get(char* Index, Type example, bool disable_check = false)
|
||||||
|
{
|
||||||
|
PPvoid_t PValue = JudySLGet(Table, Index, PJE0);
|
||||||
|
if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; }
|
||||||
|
|
||||||
|
return (Type)*PValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* First(char* Start = "");
|
||||||
|
char* Next(char* Start = "");
|
||||||
|
char* Prev(char* Start = "");
|
||||||
|
char* Last(char* Start = "");
|
||||||
|
|
||||||
|
bool IsFilled(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false); }
|
||||||
|
bool IsEmpty(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
261
dlls/arrayx/Capsule.cpp
Normal file
261
dlls/arrayx/Capsule.cpp
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
#include "Capsule.h"
|
||||||
|
|
||||||
|
const char* capsule_types[] =
|
||||||
|
{
|
||||||
|
"-NO VALUE-",
|
||||||
|
"BOOLEAN",
|
||||||
|
"INTEGER",
|
||||||
|
"FLOAT",
|
||||||
|
"VECTOR",
|
||||||
|
"STRING"
|
||||||
|
};
|
||||||
|
|
||||||
|
void Capsule::ThrowTypeError(cell get_type)
|
||||||
|
{
|
||||||
|
char ValStr[15];
|
||||||
|
GetAsStr(ValStr);
|
||||||
|
|
||||||
|
char value[100];
|
||||||
|
sprintf(value,"Function attempted to read NON-%s value, actual type is: %s, actual value is: %s", capsule_types[get_type], capsule_types[type], ValStr );
|
||||||
|
|
||||||
|
throw JudyEx(value, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Capsule::CheckEmpty(bool clear)
|
||||||
|
{
|
||||||
|
bool empty = ( data == NULL );
|
||||||
|
|
||||||
|
if(empty != true && clear == true) Clear();
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::Clear()
|
||||||
|
{
|
||||||
|
//This function intelligently creates a pointer x,
|
||||||
|
//which will be of correct type and then deletes it.
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case capsule_type_flo:
|
||||||
|
{
|
||||||
|
REAL *real_val = reinterpret_cast<REAL*>(data);
|
||||||
|
delete real_val;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_vec:
|
||||||
|
{
|
||||||
|
JudyVec *vector_val = reinterpret_cast<JudyVec*>(data);
|
||||||
|
delete vector_val;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_str:
|
||||||
|
{
|
||||||
|
char *char_val = reinterpret_cast<char*>(data);
|
||||||
|
delete char_val;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data = NULL; //Null the address as well. (Used for ints too.)
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Capsule::GetBool( void )
|
||||||
|
{
|
||||||
|
if (type != capsule_type_bool) ThrowTypeError(capsule_type_bool);
|
||||||
|
|
||||||
|
return (data != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::SetBool(bool Value)
|
||||||
|
{
|
||||||
|
CheckEmpty(true);
|
||||||
|
type = capsule_type_bool;
|
||||||
|
if(Value == true) data = reinterpret_cast<Pvoid_t>(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
cell Capsule::GetInt( void )
|
||||||
|
{
|
||||||
|
if (type != capsule_type_int) ThrowTypeError(capsule_type_int);
|
||||||
|
|
||||||
|
return reinterpret_cast<cell>(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::SetInt(cell Value)
|
||||||
|
{
|
||||||
|
CheckEmpty(true);
|
||||||
|
type = capsule_type_int;
|
||||||
|
data = reinterpret_cast<void*>(Value);
|
||||||
|
};
|
||||||
|
|
||||||
|
REAL Capsule::GetFlo( void )
|
||||||
|
{
|
||||||
|
if (type != capsule_type_flo) ThrowTypeError(capsule_type_flo);
|
||||||
|
|
||||||
|
return *reinterpret_cast<REAL*>(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::SetFlo(REAL Value)
|
||||||
|
{
|
||||||
|
CheckEmpty(true);
|
||||||
|
type = capsule_type_flo;
|
||||||
|
data = new REAL(Value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const JudyVec* Capsule::GetVec( void )
|
||||||
|
{
|
||||||
|
if (type != capsule_type_vec) ThrowTypeError(capsule_type_vec);
|
||||||
|
|
||||||
|
return reinterpret_cast<const JudyVec*>(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::SetVec(JudyVec* Value)
|
||||||
|
{
|
||||||
|
CheckEmpty(true);
|
||||||
|
type = capsule_type_vec;
|
||||||
|
data = reinterpret_cast<void*>(Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* Capsule::GetStr( void )
|
||||||
|
{
|
||||||
|
if (type != capsule_type_str) ThrowTypeError(capsule_type_str);
|
||||||
|
|
||||||
|
return reinterpret_cast<const char*>(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::SetStr(char* Value)
|
||||||
|
{
|
||||||
|
CheckEmpty(true);
|
||||||
|
type = capsule_type_str;
|
||||||
|
|
||||||
|
char *string_val = new char[strlen(Value)+1];
|
||||||
|
strcpy(string_val,Value);
|
||||||
|
|
||||||
|
data = reinterpret_cast<void*>(string_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::GetAsStr(char* value)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case capsule_type_bool:
|
||||||
|
sprintf(value, "%i",(cell)GetBool());
|
||||||
|
break;
|
||||||
|
case capsule_type_int:
|
||||||
|
sprintf(value, "%d", GetInt() );
|
||||||
|
break;
|
||||||
|
case capsule_type_flo:
|
||||||
|
sprintf(value, "%f", GetFlo() );
|
||||||
|
break;
|
||||||
|
case capsule_type_vec:
|
||||||
|
sprintf(value, "{%f,%f,%f}", GetVec()->first, GetVec()->second, GetVec()->third);
|
||||||
|
break;
|
||||||
|
case capsule_type_str:
|
||||||
|
sprintf(value, "\"%s\"", GetStr() );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf(value, "-NO VALUE-");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::Save(FILE* capsuleDB)
|
||||||
|
{
|
||||||
|
fwrite(&type,sizeof(char),1,capsuleDB);
|
||||||
|
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case capsule_type_none: { break; }
|
||||||
|
case capsule_type_bool: { bool var = GetBool(); fwrite(&var, sizeof(bool), 1, capsuleDB); break; }
|
||||||
|
case capsule_type_int: { cell var = GetInt(); fwrite(&var, sizeof(cell), 1, capsuleDB); break; }
|
||||||
|
case capsule_type_flo: { fwrite(reinterpret_cast<REAL*>(GetData()), sizeof(REAL), 1, capsuleDB); break; }
|
||||||
|
case capsule_type_str:
|
||||||
|
{
|
||||||
|
const char* str = GetStr();
|
||||||
|
size_t len = strlen(str);
|
||||||
|
fwrite(&len,sizeof(size_t), 1, capsuleDB);
|
||||||
|
fwrite(&str, sizeof(char), len, capsuleDB);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_vec:
|
||||||
|
{
|
||||||
|
const JudyVec* buffer = GetVec();
|
||||||
|
fwrite(buffer, sizeof(JudyVec), 1, capsuleDB);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
char value[20];
|
||||||
|
sprintf(value,"Invalid type found!");
|
||||||
|
|
||||||
|
throw JudyEx(value, true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void Capsule::Load(FILE* capsuleDB)
|
||||||
|
{
|
||||||
|
fread(&type, sizeof(char), 1, capsuleDB);
|
||||||
|
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case capsule_type_none: { CheckEmpty(true); break; }
|
||||||
|
case capsule_type_bool:
|
||||||
|
{
|
||||||
|
bool value = false;
|
||||||
|
fread(&value, sizeof(bool), 1, capsuleDB);
|
||||||
|
SetBool(value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_int:
|
||||||
|
{
|
||||||
|
cell value = NULL;
|
||||||
|
fread(&value, sizeof(cell), 1, capsuleDB);
|
||||||
|
SetInt(value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_flo:
|
||||||
|
{
|
||||||
|
REAL value = NULL;
|
||||||
|
fread(&value, sizeof(REAL), 1, capsuleDB);
|
||||||
|
SetFlo(value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_str:
|
||||||
|
{
|
||||||
|
size_t length;
|
||||||
|
fread(&length, sizeof(size_t), 1, capsuleDB);
|
||||||
|
|
||||||
|
char* value = new char[length+1];
|
||||||
|
fgets(value, length+1, capsuleDB);
|
||||||
|
|
||||||
|
SetStr(value);
|
||||||
|
delete(value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case capsule_type_vec:
|
||||||
|
{
|
||||||
|
JudyVec* value = new JudyVec(NULL,NULL,NULL);
|
||||||
|
fread(value, sizeof(JudyVec), 1, capsuleDB);
|
||||||
|
|
||||||
|
SetVec(value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
char value[20];
|
||||||
|
sprintf(value,"Invalid type found: %i",(int)type);
|
||||||
|
|
||||||
|
throw JudyEx(value, true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user