attempted merge at 1.77 back into trunk... Oh MY GOD
This commit is contained in:
409
amxmodx/CFlagManager.cpp
Normal file
409
amxmodx/CFlagManager.cpp
Normal file
@ -0,0 +1,409 @@
|
||||
#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))
|
||||
{
|
||||
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;
|
||||
}
|
||||
};
|
219
amxmodx/CFlagManager.h
Normal file
219
amxmodx/CFlagManager.h
Normal file
@ -0,0 +1,219 @@
|
||||
#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()
|
||||
{
|
||||
WriteCommands();
|
||||
};
|
||||
|
||||
/**
|
||||
* 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
|
@ -304,4 +304,87 @@ public:
|
||||
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
|
||||
|
@ -129,7 +129,7 @@ public:
|
||||
}
|
||||
|
||||
//Added this for amxx inclusion
|
||||
bool empty()
|
||||
bool empty() const
|
||||
{
|
||||
if (!v)
|
||||
return true;
|
||||
@ -140,7 +140,7 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t size()
|
||||
size_t size() const
|
||||
{
|
||||
if (v)
|
||||
return strlen(v);
|
||||
|
@ -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 \
|
||||
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 \
|
||||
amxmod_compat.cpp nongpl_matches.cpp
|
||||
amxmod_compat.cpp nongpl_matches.cpp CFlagManager.cpp
|
||||
|
||||
LINK = -lgcc -static-libgcc
|
||||
|
||||
|
@ -35,8 +35,13 @@
|
||||
#include "debugger.h"
|
||||
#include "binlog.h"
|
||||
#include "libraries.h"
|
||||
#include "CFlagManager.h"
|
||||
#include "nongpl_matches.h"
|
||||
|
||||
extern CFlagManager FlagMan;
|
||||
CVector<CAdminData *> DynamicAdmins;
|
||||
char CVarTempBuffer[64];
|
||||
|
||||
const char *invis_cvar_list[5] = {"amxmodx_version", "amxmodx_modules", "amx_debug", "amx_mldebug", "amx_client_languages"};
|
||||
|
||||
bool CheckBadConList(const char *cvar, int type)
|
||||
@ -1254,7 +1259,12 @@ static cell AMX_NATIVE_CALL register_concmd(AMX *amx, cell *params) /* 4 param *
|
||||
access = 0;
|
||||
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)
|
||||
return 0;
|
||||
|
||||
@ -1294,7 +1304,12 @@ static cell AMX_NATIVE_CALL register_clcmd(AMX *amx, cell *params) /* 4 param */
|
||||
access = 0;
|
||||
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)
|
||||
return 0;
|
||||
|
||||
@ -1713,8 +1728,8 @@ static cell AMX_NATIVE_CALL set_pcvar_float(AMX *amx, cell *params)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ptr->value = amx_ctof(params[2]);
|
||||
|
||||
snprintf(CVarTempBuffer,sizeof(CVarTempBuffer)-1,"%f",amx_ctof(params[2]));
|
||||
(*g_engfuncs.pfnCvar_DirectSet)(ptr, &CVarTempBuffer[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1735,7 +1750,7 @@ static cell AMX_NATIVE_CALL get_pcvar_num(AMX *amx, cell *params)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (int)ptr->value;
|
||||
return atoi(ptr->string);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL get_cvar_num(AMX *amx, cell *params) /* 1 param */
|
||||
@ -1753,7 +1768,7 @@ static cell AMX_NATIVE_CALL get_cvar_num(AMX *amx, cell *params) /* 1 param */
|
||||
}
|
||||
}
|
||||
}
|
||||
return (int)CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen));
|
||||
return atoi(CVAR_GET_STRING(get_amxstring(amx, params[1], 0, ilen)));
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL set_pcvar_num(AMX *amx, cell *params)
|
||||
@ -1765,7 +1780,8 @@ static cell AMX_NATIVE_CALL set_pcvar_num(AMX *amx, cell *params)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ptr->value = (float)params[2];
|
||||
snprintf(CVarTempBuffer,sizeof(CVarTempBuffer)-1,"%d",params[2]);
|
||||
(*g_engfuncs.pfnCvar_DirectSet)(ptr, &CVarTempBuffer[0]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -1789,6 +1805,22 @@ static cell AMX_NATIVE_CALL set_cvar_string(AMX *amx, cell *params) /* 2 param *
|
||||
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 */
|
||||
{
|
||||
int len;
|
||||
@ -4408,9 +4440,109 @@ static cell AMX_NATIVE_CALL GetLangTransKey(AMX *amx, cell *params)
|
||||
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;
|
||||
};
|
||||
|
||||
AMX_NATIVE_INFO amxmodx_Natives[] =
|
||||
{
|
||||
{"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},
|
||||
{"arrayset", arrayset},
|
||||
{"get_addr_val", get_addr_val},
|
||||
@ -4575,6 +4707,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
||||
{"set_localinfo", set_localinfo},
|
||||
{"set_pcvar_flags", set_pcvar_flags},
|
||||
{"set_pcvar_float", set_pcvar_float},
|
||||
{"set_pcvar_string", set_pcvar_string},
|
||||
{"set_pcvar_num", set_pcvar_num},
|
||||
{"set_task", set_task},
|
||||
{"set_user_flags", set_user_flags},
|
||||
|
@ -339,6 +339,14 @@ struct func_s
|
||||
const char *desc;
|
||||
};
|
||||
|
||||
enum AdminProperty
|
||||
{
|
||||
Admin_Auth = 0,
|
||||
Admin_Password,
|
||||
Admin_Access,
|
||||
Admin_Flags
|
||||
};
|
||||
|
||||
extern enginefuncs_t *g_pEngTable;
|
||||
|
||||
#endif // AMXMODX_H
|
||||
|
@ -47,6 +47,9 @@
|
||||
#include "messages.h"
|
||||
#include "amxmod_compat.h"
|
||||
|
||||
#include "CFlagManager.h"
|
||||
|
||||
|
||||
plugin_info_t Plugin_info =
|
||||
{
|
||||
META_INTERFACE_VERSION, // ifvers
|
||||
@ -73,6 +76,7 @@ void (*function)(void*);
|
||||
void (*endfunction)(void*);
|
||||
|
||||
extern List<AUTHORIZEFUNC> g_auth_funcs;
|
||||
extern CVector<CAdminData *> DynamicAdmins;
|
||||
|
||||
CLog g_log;
|
||||
CForwardMngr g_forwards;
|
||||
@ -86,7 +90,7 @@ CPlayer* mPlayer;
|
||||
CPluginMngr g_plugins;
|
||||
CTaskMngr g_tasksMngr;
|
||||
CmdMngr g_commands;
|
||||
|
||||
CFlagManager FlagMan;
|
||||
EventsMngr g_events;
|
||||
Grenades g_grenades;
|
||||
LogEventsMngr g_logevents;
|
||||
@ -381,6 +385,8 @@ int C_Spawn(edict_t *pent)
|
||||
get_localinfo("amx_pluginsdir", "addons/amxmodx/plugins");
|
||||
get_localinfo("amx_logdir", "addons/amxmodx/logs");
|
||||
|
||||
FlagMan.LoadFile();
|
||||
|
||||
char map_pluginsfile_path[256];
|
||||
char configs_dir[256];
|
||||
|
||||
@ -390,6 +396,31 @@ int C_Spawn(edict_t *pent)
|
||||
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"));
|
||||
LoadExtraPluginsToPCALM(configs_dir);
|
||||
char temporaryMap[64];
|
||||
|
||||
strncpy(temporaryMap,STRING(gpGlobals->mapname),sizeof(temporaryMap)-1);
|
||||
|
||||
int i=0;
|
||||
|
||||
while (temporaryMap[i]!='_' && temporaryMap[i]!='\0')
|
||||
{
|
||||
++i;
|
||||
}
|
||||
|
||||
|
||||
if (temporaryMap[i]=='_')
|
||||
{
|
||||
// this map has a prefix
|
||||
|
||||
temporaryMap[i]='\0';
|
||||
snprintf(map_pluginsfile_path, sizeof(map_pluginsfile_path)-1,
|
||||
"%s/maps/prefixes/plugins-%s.ini",
|
||||
configs_dir,
|
||||
temporaryMap);
|
||||
g_plugins.CALMFromFile(map_pluginsfile_path);
|
||||
|
||||
}
|
||||
|
||||
snprintf(map_pluginsfile_path, sizeof(map_pluginsfile_path)-1,
|
||||
"%s/maps/plugins-%s.ini",
|
||||
configs_dir,
|
||||
@ -650,10 +681,19 @@ void C_ServerDeactivate_Post()
|
||||
|
||||
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++)
|
||||
delete [] g_hudsync[i];
|
||||
g_hudsync.clear();
|
||||
|
||||
FlagMan.WriteCommands();
|
||||
|
||||
// last memreport
|
||||
#ifdef MEMORY_TEST
|
||||
if (g_memreport_enabled)
|
||||
@ -1062,20 +1102,6 @@ void C_MessageBegin_Post(int msg_dest, int msg_type, const float *pOrigin, edict
|
||||
{
|
||||
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);
|
||||
mPlayer = GET_PLAYER_POINTER_I(mPlayerIndex);
|
||||
} else {
|
||||
@ -1424,6 +1450,8 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
|
||||
|
||||
GET_HOOK_TABLES(PLID, &g_pEngTable, NULL, NULL);
|
||||
|
||||
FlagMan.SetFile("cmdaccess.ini");
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
@ -361,6 +361,9 @@
|
||||
<File
|
||||
RelativePath="..\CFile.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CFlagManager.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CForward.cpp">
|
||||
</File>
|
||||
@ -515,6 +518,9 @@
|
||||
<File
|
||||
RelativePath="..\CFile.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CFlagManager.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CForward.h">
|
||||
</File>
|
||||
|
@ -505,6 +505,10 @@
|
||||
RelativePath="..\CFile.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CFlagManager.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CForward.cpp"
|
||||
>
|
||||
@ -710,6 +714,10 @@
|
||||
RelativePath="..\CFile.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CFlagManager.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CForward.h"
|
||||
>
|
||||
|
@ -892,7 +892,9 @@ static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
|
||||
GETMENU_R(params[1]);
|
||||
|
||||
if (pMenu->isDestroying)
|
||||
{
|
||||
return 0; //prevent infinite recursion
|
||||
}
|
||||
|
||||
pMenu->isDestroying = true;
|
||||
g_menucmds.removeMenuId(pMenu->menuId);
|
||||
@ -938,8 +940,16 @@ static cell AMX_NATIVE_CALL player_menu_info(AMX *amx, cell *params)
|
||||
*m = player->menu;
|
||||
*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))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user