ddnet/src/engine/shared/console.h

226 lines
6.6 KiB
C
Raw Normal View History

2010-11-20 10:37:14 +00:00
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
2010-05-29 07:25:38 +00:00
#ifndef ENGINE_SHARED_CONSOLE_H
#define ENGINE_SHARED_CONSOLE_H
#include "memheap.h"
#include <base/math.h>
2010-05-29 07:25:38 +00:00
#include <engine/console.h>
#include <engine/storage.h>
2010-05-29 07:25:38 +00:00
class CConsole : public IConsole
{
class CCommand : public CCommandInfo
{
public:
CCommand *m_pNext;
int m_Flags;
bool m_Temp;
2010-05-29 07:25:38 +00:00
FCommandCallback m_pfnCallback;
void *m_pUserData;
virtual const CCommandInfo *NextCommandInfo(int AccessLevel, int FlagMask) const;
void SetAccessLevel(int AccessLevel) { m_AccessLevel = clamp(AccessLevel, (int)(ACCESS_LEVEL_ADMIN), (int)(ACCESS_LEVEL_USER)); }
2010-05-29 07:25:38 +00:00
};
2010-05-29 07:25:38 +00:00
class CChain
{
public:
FChainCommandCallback m_pfnChainCallback;
FCommandCallback m_pfnCallback;
void *m_pCallbackUserData;
void *m_pUserData;
};
int m_FlagMask;
bool m_StoreCommands;
2020-10-27 17:57:14 +00:00
const char *m_apStrokeStr[2];
2010-05-29 07:25:38 +00:00
CCommand *m_pFirstCommand;
class CExecFile
{
public:
const char *m_pFilename;
CExecFile *m_pPrev;
2010-05-29 07:25:38 +00:00
};
2010-05-29 07:25:38 +00:00
CExecFile *m_pFirstExec;
class CConfig *m_pConfig;
2010-05-29 07:25:38 +00:00
class IStorage *m_pStorage;
int m_AccessLevel;
2010-05-29 07:25:38 +00:00
CCommand *m_pRecycleList;
CHeap m_TempCommands;
2010-05-29 07:25:38 +00:00
static void Con_Chain(IResult *pResult, void *pUserData);
static void Con_Echo(IResult *pResult, void *pUserData);
static void Con_Exec(IResult *pResult, void *pUserData);
static void ConToggle(IResult *pResult, void *pUser);
static void ConToggleStroke(IResult *pResult, void *pUser);
static void ConCommandAccess(IResult *pResult, void *pUser);
static void ConCommandStatus(IConsole::IResult *pResult, void *pUser);
2010-05-29 07:25:38 +00:00
void ExecuteLineStroked(int Stroke, const char *pStr, int ClientID = -1, bool InterpretSemicolons = true);
FTeeHistorianCommandCallback m_pfnTeeHistorianCommandCallback;
void *m_pTeeHistorianCommandUserdata;
2010-05-29 07:25:38 +00:00
enum
{
2014-04-18 22:40:21 +00:00
CONSOLE_MAX_STR_LENGTH = 8192,
MAX_PARTS = (CONSOLE_MAX_STR_LENGTH + 1) / 2
2010-05-29 07:25:38 +00:00
};
2010-05-29 07:25:38 +00:00
class CResult : public IResult
{
public:
char m_aStringStorage[CONSOLE_MAX_STR_LENGTH + 1];
2010-05-29 07:25:38 +00:00
char *m_pArgsStart;
2010-05-29 07:25:38 +00:00
const char *m_pCommand;
const char *m_apArgs[MAX_PARTS];
CResult()
{
mem_zero(m_aStringStorage, sizeof(m_aStringStorage));
m_pArgsStart = 0;
m_pCommand = 0;
mem_zero(m_apArgs, sizeof(m_apArgs));
}
CResult &operator=(const CResult &Other)
{
if(this != &Other)
{
IResult::operator=(Other);
mem_copy(m_aStringStorage, Other.m_aStringStorage, sizeof(m_aStringStorage));
m_pArgsStart = m_aStringStorage + (Other.m_pArgsStart - Other.m_aStringStorage);
m_pCommand = m_aStringStorage + (Other.m_pCommand - Other.m_aStringStorage);
2011-01-10 23:57:44 +00:00
for(unsigned i = 0; i < Other.m_NumArgs; ++i)
m_apArgs[i] = m_aStringStorage + (Other.m_apArgs[i] - Other.m_aStringStorage);
}
return *this;
}
2010-05-29 07:25:38 +00:00
void AddArgument(const char *pArg)
{
m_apArgs[m_NumArgs++] = pArg;
}
virtual const char *GetString(unsigned Index);
virtual int GetInteger(unsigned Index);
virtual float GetFloat(unsigned Index);
2020-06-18 16:47:46 +00:00
virtual ColorHSLA GetColor(unsigned Index, bool Light);
2011-09-25 16:04:29 +00:00
2020-08-19 09:38:49 +00:00
virtual void RemoveArgument(unsigned Index)
{
dbg_assert(Index < m_NumArgs, "invalid argument index");
for(unsigned i = Index; i < m_NumArgs - 1; i++)
m_apArgs[i] = m_apArgs[i + 1];
m_apArgs[m_NumArgs--] = 0;
}
2011-09-25 16:04:29 +00:00
// DDRace
enum
{
VICTIM_NONE = -3,
VICTIM_ME = -2,
VICTIM_ALL = -1,
2011-09-25 16:04:29 +00:00
};
int m_Victim;
void ResetVictim();
bool HasVictim();
void SetVictim(int Victim);
void SetVictim(const char *pVictim);
virtual int GetVictim();
2010-05-29 07:25:38 +00:00
};
2010-05-29 07:25:38 +00:00
int ParseStart(CResult *pResult, const char *pString, int Length);
int ParseArgs(CResult *pResult, const char *pFormat);
/*
this function will set pFormat to the next parameter (i,s,r,v,?) it contains and
return the parameter; descriptions in brackets like [file] will be skipped;
returns '\0' if there is no next parameter; expects pFormat to point at a
parameter
*/
char NextParam(const char *&pFormat);
class CExecutionQueue
{
CHeap m_Queue;
public:
struct CQueueEntry
{
CQueueEntry *m_pNext;
FCommandCallback m_pfnCommandCallback;
void *m_pCommandUserData;
CResult m_Result;
} * m_pFirst, *m_pLast;
void AddEntry()
{
CQueueEntry *pEntry = static_cast<CQueueEntry *>(m_Queue.Allocate(sizeof(CQueueEntry)));
pEntry->m_pNext = 0;
if(!m_pFirst)
m_pFirst = pEntry;
if(m_pLast)
m_pLast->m_pNext = pEntry;
m_pLast = pEntry;
(void)new(&(pEntry->m_Result)) CResult;
}
void Reset()
{
m_Queue.Reset();
m_pFirst = m_pLast = 0;
}
} m_ExecutionQueue;
void AddCommandSorted(CCommand *pCommand);
CCommand *FindCommand(const char *pName, int FlagMask);
2010-05-29 07:25:38 +00:00
public:
CConfig *Config() { return m_pConfig; }
CConsole(int FlagMask);
2017-07-21 13:19:44 +00:00
~CConsole();
2010-05-29 07:25:38 +00:00
virtual void Init();
2011-12-30 18:12:31 +00:00
virtual const CCommandInfo *FirstCommandInfo(int AccessLevel, int FlagMask) const;
virtual const CCommandInfo *GetCommandInfo(const char *pName, int FlagMask, bool Temp);
virtual void PossibleCommands(const char *pStr, int FlagMask, bool Temp, FPossibleCallback pfnCallback, void *pUser);
2010-05-29 07:25:38 +00:00
virtual void ParseArguments(int NumArgs, const char **ppArguments);
virtual void Register(const char *pName, const char *pParams, int Flags, FCommandCallback pfnFunc, void *pUser, const char *pHelp);
virtual void RegisterTemp(const char *pName, const char *pParams, int Flags, const char *pHelp);
virtual void DeregisterTemp(const char *pName);
virtual void DeregisterTempAll();
2010-05-29 07:25:38 +00:00
virtual void Chain(const char *pName, FChainCommandCallback pfnChainFunc, void *pUser);
virtual void StoreCommands(bool Store);
virtual bool LineIsValid(const char *pStr);
virtual void ExecuteLine(const char *pStr, int ClientID = -1, bool InterpretSemicolons = true);
virtual void ExecuteLineFlag(const char *pStr, int FlagMask, int ClientID = -1, bool InterpretSemicolons = true);
virtual void ExecuteFile(const char *pFilename, int ClientID = -1, bool LogFailure = false, int StorageType = IStorage::TYPE_ALL);
2010-05-29 07:25:38 +00:00
virtual char *Format(char *pBuf, int Size, const char *pFrom, const char *pStr);
virtual void Print(int Level, const char *pFrom, const char *pStr, ColorRGBA PrintColor = gs_ConsoleDefaultColor);
virtual void SetTeeHistorianCommandCallback(FTeeHistorianCommandCallback pfnCallback, void *pUser);
virtual void InitChecksum(CChecksumData *pData) const;
void SetAccessLevel(int AccessLevel) { m_AccessLevel = clamp(AccessLevel, (int)(ACCESS_LEVEL_ADMIN), (int)(ACCESS_LEVEL_USER)); }
void ResetServerGameSettings();
// DDRace
2011-08-27 12:12:13 +00:00
static void ConUserCommandStatus(IConsole::IResult *pResult, void *pUser);
2011-08-31 13:41:32 +00:00
void SetFlagMask(int FlagMask) { m_FlagMask = FlagMask; }
2010-05-29 07:25:38 +00:00
};
#endif