Ugh, initial import of core config file stuff
Warning: This is positively terrible code. It works, but needs A LOT of work still :\ --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40667
This commit is contained in:
parent
af77decdab
commit
ddfe6d84d6
12
configs/core.cfg
Normal file
12
configs/core.cfg
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
"Core"
|
||||||
|
{
|
||||||
|
"BasePath" "addons/sourcemod"
|
||||||
|
|
||||||
|
"Logging" "on"
|
||||||
|
|
||||||
|
"LogMode" "daily"
|
||||||
|
|
||||||
|
"ServerLang" "en"
|
||||||
|
|
||||||
|
"InvalidOpt" "hello"
|
||||||
|
}
|
133
core/CoreConfig.cpp
Normal file
133
core/CoreConfig.cpp
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
/**
|
||||||
|
* vim: set ts=4 :
|
||||||
|
* ===============================================================
|
||||||
|
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
|
||||||
|
* ===============================================================
|
||||||
|
*
|
||||||
|
* This file is not open source and may not be copied without explicit
|
||||||
|
* written permission of AlliedModders LLC. This file may not be redistributed
|
||||||
|
* in whole or significant part.
|
||||||
|
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "CoreConfig.h"
|
||||||
|
#include "sourcemod.h"
|
||||||
|
#include "sourcemm_api.h"
|
||||||
|
#include "sm_srvcmds.h"
|
||||||
|
#include "LibrarySys.h"
|
||||||
|
#include "TextParsers.h"
|
||||||
|
#include "Logger.h"
|
||||||
|
|
||||||
|
#ifdef PLATFORM_WINDOWS
|
||||||
|
ConVar sm_corecfgfile("sm_corecfgfile", "addons\\sourcemod\\configs\\core.cfg", 0, "SourceMod core configuration file");
|
||||||
|
#else
|
||||||
|
ConVar sm_corecfgfile("sm_corecfgfile", "addons/sourcemod/configs/core.cfg", 0, "SourceMod core configuration file");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CoreConfig g_CoreConfig;
|
||||||
|
|
||||||
|
void CoreConfig::OnSourceModAllInitialized()
|
||||||
|
{
|
||||||
|
g_RootMenu.AddRootConsoleCommand("config", "Set core configuration options", this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CoreConfig::OnSourceModShutdown()
|
||||||
|
{
|
||||||
|
g_RootMenu.RemoveRootConsoleCommand("config", this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CoreConfig::OnRootConsoleCommand(const char *command, unsigned int argcount)
|
||||||
|
{
|
||||||
|
if (argcount >= 4)
|
||||||
|
{
|
||||||
|
const char *option = engine->Cmd_Argv(2);
|
||||||
|
const char *value = engine->Cmd_Argv(3);
|
||||||
|
|
||||||
|
CoreConfigErr err = SetConfigOption(option, value);
|
||||||
|
|
||||||
|
switch (err)
|
||||||
|
{
|
||||||
|
case CoreConfig_NoRuntime:
|
||||||
|
g_RootMenu.ConsolePrint("[SM] Cannot set \"%s\" while SourceMod is running.", option);
|
||||||
|
break;
|
||||||
|
case CoreConfig_InvalidValue:
|
||||||
|
g_RootMenu.ConsolePrint("[SM] Invalid value \"%s\" specified for configuration option \"%s\"", value, option);
|
||||||
|
break;
|
||||||
|
case CoreConfig_InvalidOption:
|
||||||
|
g_RootMenu.ConsolePrint("[SM] Invalid configuration option specified: %s", option);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_RootMenu.ConsolePrint("[SM] Usage: sm config <option> <value>");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CoreConfig::Initialize()
|
||||||
|
{
|
||||||
|
SMCParseError err;
|
||||||
|
char filePath[PLATFORM_MAX_PATH];
|
||||||
|
|
||||||
|
/* Try to get command line value of core config convar */
|
||||||
|
const char *corecfg = icvar->GetCommandLineValue("sm_corecfgfile");
|
||||||
|
|
||||||
|
/* If sm_corecfgfile not specified on command line, use default value */
|
||||||
|
if (!corecfg)
|
||||||
|
{
|
||||||
|
corecfg = sm_corecfgfile.GetDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Format path to config file */
|
||||||
|
g_LibSys.PathFormat(filePath, sizeof(filePath), "%s/%s", g_SourceMod.GetModPath(), corecfg);
|
||||||
|
|
||||||
|
/* Parse config file */
|
||||||
|
if ((err=g_TextParser.ParseFile_SMC(filePath, this, NULL, NULL))
|
||||||
|
!= SMCParse_Okay)
|
||||||
|
{
|
||||||
|
/* :TODO: This won't actually log or print anything :( - So fix that somehow */
|
||||||
|
g_Logger.LogError("[SM] Error encountered parsing core config file: %s", g_TextParser.GetSMCErrorString(err));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SMCParseResult CoreConfig::ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes)
|
||||||
|
{
|
||||||
|
CoreConfigErr err = SetConfigOption(key, value);
|
||||||
|
|
||||||
|
if (err == CoreConfig_InvalidOption)
|
||||||
|
{
|
||||||
|
g_Logger.LogError("[SM] Warning: Ignoring invalid option \"%s\" in configuration file.", key);
|
||||||
|
} else if (err == CoreConfig_InvalidValue) {
|
||||||
|
g_Logger.LogError("[SM] Warning encountered parsing core configuration file.");
|
||||||
|
g_Logger.LogError("[SM] Invalid value \"%s\" specified for option \"%s\"", value, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return SMCParse_Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
CoreConfigErr CoreConfig::SetConfigOption(const char *option, const char *value)
|
||||||
|
{
|
||||||
|
CoreConfigErr err = CoreConfig_TOTAL;
|
||||||
|
CoreConfigErr currentErr;
|
||||||
|
|
||||||
|
/* Notify! */
|
||||||
|
SMGlobalClass *pBase = SMGlobalClass::head;
|
||||||
|
while (pBase)
|
||||||
|
{
|
||||||
|
currentErr = pBase->OnSourceModConfigChanged(option, value);
|
||||||
|
|
||||||
|
/* Lowest error code has priority */
|
||||||
|
if (currentErr < err)
|
||||||
|
{
|
||||||
|
err = currentErr;
|
||||||
|
}
|
||||||
|
|
||||||
|
pBase = pBase->m_pGlobalClassNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
50
core/CoreConfig.h
Normal file
50
core/CoreConfig.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
* vim: set ts=4 :
|
||||||
|
* ===============================================================
|
||||||
|
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
|
||||||
|
* ===============================================================
|
||||||
|
*
|
||||||
|
* This file is not open source and may not be copied without explicit
|
||||||
|
* written permission of AlliedModders LLC. This file may not be redistributed
|
||||||
|
* in whole or significant part.
|
||||||
|
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_SOURCEMOD_CORECONFIG_H_
|
||||||
|
#define _INCLUDE_SOURCEMOD_CORECONFIG_H_
|
||||||
|
|
||||||
|
#include "sm_globals.h"
|
||||||
|
#include <ITextParsers.h>
|
||||||
|
#include <IRootConsoleMenu.h>
|
||||||
|
|
||||||
|
using namespace SourceMod;
|
||||||
|
|
||||||
|
class CoreConfig :
|
||||||
|
public SMGlobalClass,
|
||||||
|
public ITextListener_SMC,
|
||||||
|
public IRootConsoleCommand
|
||||||
|
{
|
||||||
|
public: // SMGlobalClass
|
||||||
|
void OnSourceModAllInitialized();
|
||||||
|
void OnSourceModShutdown();
|
||||||
|
public: // ITextListener_SMC
|
||||||
|
SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes);
|
||||||
|
public: // IRootConsoleCommand
|
||||||
|
void OnRootConsoleCommand(const char *command, unsigned int argcount);
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Initializes CoreConfig by reading from core.cfg file
|
||||||
|
*/
|
||||||
|
void Initialize();
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Sets configuration option by notifying SourceMod components that rely on core.cfg
|
||||||
|
*/
|
||||||
|
CoreConfigErr SetConfigOption(const char *option, const char *value);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern CoreConfig g_CoreConfig;
|
||||||
|
|
||||||
|
#endif // _INCLUDE_SOURCEMOD_CORECONFIG_H_
|
@ -25,10 +25,51 @@ Logger g_Logger;
|
|||||||
* :TODO: This should be creating the log folder if it doesn't exist
|
* :TODO: This should be creating the log folder if it doesn't exist
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
CoreConfigErr Logger::OnSourceModConfigChanged(const char *option, const char *value)
|
||||||
|
{
|
||||||
|
if (strcasecmp(option, "Logging") == 0)
|
||||||
|
{
|
||||||
|
bool state = true;
|
||||||
|
|
||||||
|
if (strcasecmp(value, "on") == 0)
|
||||||
|
{
|
||||||
|
state = true;
|
||||||
|
} else if (strcasecmp(value, "off") == 0) {
|
||||||
|
state = false;
|
||||||
|
} else {
|
||||||
|
return CoreConfig_InvalidValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_FirstPass)
|
||||||
|
{
|
||||||
|
m_InitialState = state;
|
||||||
|
m_FirstPass = false;
|
||||||
|
} else {
|
||||||
|
state ? g_Logger.EnableLogging() : g_Logger.DisableLogging();
|
||||||
|
}
|
||||||
|
|
||||||
|
return CoreConfig_Okay;
|
||||||
|
} else if (strcasecmp(option, "LogMode") == 0) {
|
||||||
|
if (strcasecmp(value, "daily") == 0)
|
||||||
|
{
|
||||||
|
m_Mode = LoggingMode_Daily;
|
||||||
|
} else if (strcasecmp(value, "map") == 0) {
|
||||||
|
m_Mode = LoggingMode_PerMap;
|
||||||
|
} else if (strcasecmp(value, "game") == 0) {
|
||||||
|
m_Mode = LoggingMode_Game;
|
||||||
|
} else {
|
||||||
|
return CoreConfig_InvalidValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CoreConfig_Okay;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CoreConfig_InvalidOption;
|
||||||
|
}
|
||||||
|
|
||||||
void Logger::OnSourceModStartup(bool late)
|
void Logger::OnSourceModStartup(bool late)
|
||||||
{
|
{
|
||||||
//:TODO: read these options from a file, dont hardcode them
|
InitLogger(m_Mode, m_InitialState);
|
||||||
InitLogger(LoggingMode_Daily, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::OnSourceModAllShutdown()
|
void Logger::OnSourceModAllShutdown()
|
||||||
@ -43,6 +84,9 @@ void Logger::_NewMapFile()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Append "Log file closed" to previous log file */
|
||||||
|
_CloseFile();
|
||||||
|
|
||||||
char _filename[256];
|
char _filename[256];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
@ -113,7 +157,7 @@ void Logger::_CloseFile()
|
|||||||
|
|
||||||
void Logger::InitLogger(LoggingMode mode, bool startlogging)
|
void Logger::InitLogger(LoggingMode mode, bool startlogging)
|
||||||
{
|
{
|
||||||
m_mode = mode;
|
m_Mode = mode;
|
||||||
m_Active = startlogging;
|
m_Active = startlogging;
|
||||||
|
|
||||||
time_t t;
|
time_t t;
|
||||||
@ -125,7 +169,7 @@ void Logger::InitLogger(LoggingMode mode, bool startlogging)
|
|||||||
g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/errors_%02d%02d%02d.log", curtime->tm_mon + 1, curtime->tm_mday, curtime->tm_year - 100);
|
g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/errors_%02d%02d%02d.log", curtime->tm_mon + 1, curtime->tm_mday, curtime->tm_year - 100);
|
||||||
m_ErrFileName.assign(_filename);
|
m_ErrFileName.assign(_filename);
|
||||||
|
|
||||||
switch (m_mode)
|
switch (m_Mode)
|
||||||
{
|
{
|
||||||
case LoggingMode_PerMap:
|
case LoggingMode_PerMap:
|
||||||
{
|
{
|
||||||
@ -162,11 +206,11 @@ void Logger::LogMessage(const char *vafmt, ...)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_mode == LoggingMode_HL2)
|
if (m_Mode == LoggingMode_Game)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, vafmt);
|
va_start(ap, vafmt);
|
||||||
_PrintToHL2Log(vafmt, ap);
|
_PrintToGameLog(vafmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -190,7 +234,7 @@ void Logger::LogMessage(const char *vafmt, ...)
|
|||||||
strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
|
strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
|
||||||
|
|
||||||
FILE *fp = NULL;
|
FILE *fp = NULL;
|
||||||
if (m_mode == LoggingMode_PerMap)
|
if (m_Mode == LoggingMode_PerMap)
|
||||||
{
|
{
|
||||||
fp = fopen(m_NrmFileName.c_str(), "a+");
|
fp = fopen(m_NrmFileName.c_str(), "a+");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
@ -287,7 +331,7 @@ void Logger::MapChange(const char *mapname)
|
|||||||
{
|
{
|
||||||
m_CurMapName.assign(mapname);
|
m_CurMapName.assign(mapname);
|
||||||
|
|
||||||
switch (m_mode)
|
switch (m_Mode)
|
||||||
{
|
{
|
||||||
case LoggingMode_Daily:
|
case LoggingMode_Daily:
|
||||||
{
|
{
|
||||||
@ -313,7 +357,7 @@ void Logger::MapChange(const char *mapname)
|
|||||||
m_ErrMapStart = false;
|
m_ErrMapStart = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::_PrintToHL2Log(const char *fmt, va_list ap)
|
void Logger::_PrintToGameLog(const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
char msg[3072];
|
char msg[3072];
|
||||||
size_t len;
|
size_t len;
|
||||||
@ -348,7 +392,7 @@ const char *Logger::GetLogFileName(LogType type) const
|
|||||||
|
|
||||||
LoggingMode Logger::GetLoggingMode() const
|
LoggingMode Logger::GetLoggingMode() const
|
||||||
{
|
{
|
||||||
return m_mode;
|
return m_Mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::EnableLogging()
|
void Logger::EnableLogging()
|
||||||
|
@ -30,14 +30,15 @@ enum LoggingMode
|
|||||||
{
|
{
|
||||||
LoggingMode_Daily,
|
LoggingMode_Daily,
|
||||||
LoggingMode_PerMap,
|
LoggingMode_PerMap,
|
||||||
LoggingMode_HL2
|
LoggingMode_Game
|
||||||
};
|
};
|
||||||
|
|
||||||
class Logger : public SMGlobalClass
|
class Logger : public SMGlobalClass
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Logger() : m_ErrMapStart(false), m_Active(false), m_DelayedStart(false), m_DailyPrintHdr(false) {}
|
Logger() : m_Mode(LoggingMode_Daily), m_ErrMapStart(false), m_Active(false), m_DelayedStart(false), m_DailyPrintHdr(false), m_InitialState(true), m_FirstPass(true) {}
|
||||||
public: //SMGlobalClass
|
public: //SMGlobalClass
|
||||||
|
CoreConfigErr OnSourceModConfigChanged(const char *option, const char *value);
|
||||||
void OnSourceModStartup(bool late);
|
void OnSourceModStartup(bool late);
|
||||||
void OnSourceModAllShutdown();
|
void OnSourceModAllShutdown();
|
||||||
public:
|
public:
|
||||||
@ -53,17 +54,19 @@ public:
|
|||||||
private:
|
private:
|
||||||
void _CloseFile();
|
void _CloseFile();
|
||||||
void _NewMapFile();
|
void _NewMapFile();
|
||||||
void _PrintToHL2Log(const char *fmt, va_list ap);
|
void _PrintToGameLog(const char *fmt, va_list ap);
|
||||||
private:
|
private:
|
||||||
String m_NrmFileName;
|
String m_NrmFileName;
|
||||||
String m_ErrFileName;
|
String m_ErrFileName;
|
||||||
String m_CurMapName;
|
String m_CurMapName;
|
||||||
LoggingMode m_mode;
|
LoggingMode m_Mode;
|
||||||
int m_CurDay;
|
int m_CurDay;
|
||||||
bool m_ErrMapStart;
|
bool m_ErrMapStart;
|
||||||
bool m_Active;
|
bool m_Active;
|
||||||
bool m_DelayedStart;
|
bool m_DelayedStart;
|
||||||
bool m_DailyPrintHdr;
|
bool m_DailyPrintHdr;
|
||||||
|
bool m_InitialState;
|
||||||
|
bool m_FirstPass;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Logger g_Logger;
|
extern Logger g_Logger;
|
||||||
|
@ -584,6 +584,7 @@ Translator::Translator()
|
|||||||
{
|
{
|
||||||
m_pStringTab = new BaseStringTable(2048);
|
m_pStringTab = new BaseStringTable(2048);
|
||||||
m_pLCodeLookup = sm_trie_create();
|
m_pLCodeLookup = sm_trie_create();
|
||||||
|
strncopy(m_ServerLangCode, "en", sizeof(m_ServerLangCode));
|
||||||
}
|
}
|
||||||
|
|
||||||
Translator::~Translator()
|
Translator::~Translator()
|
||||||
@ -603,6 +604,17 @@ Translator::~Translator()
|
|||||||
delete m_pStringTab;
|
delete m_pStringTab;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CoreConfigErr Translator::OnSourceModConfigChanged(const char *option, const char *value)
|
||||||
|
{
|
||||||
|
if (strcasecmp(option, "ServerLang") == 0)
|
||||||
|
{
|
||||||
|
strncopy(m_ServerLangCode, value, sizeof(m_ServerLangCode));
|
||||||
|
return CoreConfig_Okay;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CoreConfig_InvalidOption;
|
||||||
|
}
|
||||||
|
|
||||||
void Translator::OnSourceModAllInitialized()
|
void Translator::OnSourceModAllInitialized()
|
||||||
{
|
{
|
||||||
AddLanguage("en", "English");
|
AddLanguage("en", "English");
|
||||||
@ -801,9 +813,16 @@ TransError Translator::CoreTrans(int client,
|
|||||||
return Trans_BadPhraseFile;
|
return Trans_BadPhraseFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Using server lang temporarily until client lang stuff is implemented */
|
||||||
|
unsigned int serverLang;
|
||||||
|
if (!sm_trie_retrieve(m_pLCodeLookup, m_ServerLangCode, (void **)&serverLang))
|
||||||
|
{
|
||||||
|
return Trans_BadLanguage;
|
||||||
|
}
|
||||||
|
|
||||||
Translation trans;
|
Translation trans;
|
||||||
TransError err;
|
TransError err;
|
||||||
if ((err=g_pCorePhrases->GetTranslation(phrase, 0, &trans)) != Trans_Okay)
|
if ((err=g_pCorePhrases->GetTranslation(phrase, serverLang, &trans)) != Trans_Okay)
|
||||||
{
|
{
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -817,3 +836,8 @@ TransError Translator::CoreTrans(int client,
|
|||||||
|
|
||||||
return Trans_Okay;
|
return Trans_Okay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *Translator::GetServerLanguageCode() const
|
||||||
|
{
|
||||||
|
return m_ServerLangCode;
|
||||||
|
}
|
||||||
|
@ -99,9 +99,10 @@ class Translator :
|
|||||||
public:
|
public:
|
||||||
Translator();
|
Translator();
|
||||||
~Translator();
|
~Translator();
|
||||||
public: //SMGlobalClass
|
public: // SMGlobalClass
|
||||||
|
CoreConfigErr OnSourceModConfigChanged(const char *option, const char *value);
|
||||||
void OnSourceModAllInitialized();
|
void OnSourceModAllInitialized();
|
||||||
public: //ITextListener_SMC
|
public: // ITextListener_SMC
|
||||||
void ReadSMC_ParseStart();
|
void ReadSMC_ParseStart();
|
||||||
SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes);
|
SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes);
|
||||||
SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes);
|
SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes);
|
||||||
@ -120,6 +121,7 @@ public:
|
|||||||
const char *phrase,
|
const char *phrase,
|
||||||
void **params,
|
void **params,
|
||||||
size_t *outlen=NULL);
|
size_t *outlen=NULL);
|
||||||
|
const char *GetServerLanguageCode() const;
|
||||||
private:
|
private:
|
||||||
bool AddLanguage(const char *langcode, const char *description);
|
bool AddLanguage(const char *langcode, const char *description);
|
||||||
private:
|
private:
|
||||||
@ -129,6 +131,7 @@ private:
|
|||||||
Trie *m_pLCodeLookup;
|
Trie *m_pLCodeLookup;
|
||||||
bool m_InLanguageSection;
|
bool m_InLanguageSection;
|
||||||
String m_CustomError;
|
String m_CustomError;
|
||||||
|
char m_ServerLangCode[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CPhraseFile *g_pCorePhrases;
|
extern CPhraseFile *g_pCorePhrases;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8,00"
|
Version="8.00"
|
||||||
Name="sourcemod_mm"
|
Name="sourcemod_mm"
|
||||||
ProjectGUID="{E39527CD-7CAB-4420-97CC-DA1B93B260BC}"
|
ProjectGUID="{E39527CD-7CAB-4420-97CC-DA1B93B260BC}"
|
||||||
RootNamespace="sourcemod_mm"
|
RootNamespace="sourcemod_mm"
|
||||||
@ -195,6 +195,10 @@
|
|||||||
RelativePath="..\ConVarManager.cpp"
|
RelativePath="..\ConVarManager.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CoreConfig.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\DebugReporter.cpp"
|
RelativePath="..\DebugReporter.cpp"
|
||||||
>
|
>
|
||||||
@ -289,6 +293,10 @@
|
|||||||
RelativePath="..\ConVarManager.h"
|
RelativePath="..\ConVarManager.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\CoreConfig.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\DebugReporter.h"
|
RelativePath="..\DebugReporter.h"
|
||||||
>
|
>
|
||||||
|
@ -27,12 +27,26 @@
|
|||||||
using namespace SourcePawn;
|
using namespace SourcePawn;
|
||||||
using namespace SourceMod;
|
using namespace SourceMod;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lists error codes possible from attempting to set a core configuration option.
|
||||||
|
*/
|
||||||
|
enum CoreConfigErr
|
||||||
|
{
|
||||||
|
CoreConfig_Okay = 0, /**< No error */
|
||||||
|
CoreConfig_NoRuntime = 1, /**< Cannot set config option while SourceMod is running */
|
||||||
|
CoreConfig_InvalidValue = 2, /**< Invalid value specified for config option */
|
||||||
|
CoreConfig_InvalidOption = 3, /**< Invalid config option specified */
|
||||||
|
/* -------------------- */
|
||||||
|
CoreConfig_TOTAL /**< Total number of core config error codes */
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Any class deriving from this will be automatically initiated/shutdown by SourceMod
|
* @brief Any class deriving from this will be automatically initiated/shutdown by SourceMod
|
||||||
*/
|
*/
|
||||||
class SMGlobalClass
|
class SMGlobalClass
|
||||||
{
|
{
|
||||||
friend class SourceModBase;
|
friend class SourceModBase;
|
||||||
|
friend class CoreConfig;
|
||||||
public:
|
public:
|
||||||
SMGlobalClass();
|
SMGlobalClass();
|
||||||
public:
|
public:
|
||||||
@ -58,11 +72,21 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Called after SourceMod is completely shut down
|
* @brief Called after SourceMod is completely shut down
|
||||||
*/
|
*/
|
||||||
virtual void OnSourceModAllShutdown()
|
virtual void OnSourceModAllShutdown()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when a core config option is changed.
|
||||||
|
* @note This is called once BEFORE OnSourceModStartup() when SourceMod is loading
|
||||||
|
* @note It can then be called again when the 'sm config' command is used
|
||||||
|
*/
|
||||||
|
virtual CoreConfigErr OnSourceModConfigChanged(const char *option, const char *value)
|
||||||
|
{
|
||||||
|
return CoreConfig_InvalidOption;
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
SMGlobalClass *m_pGlobalClassNext;
|
SMGlobalClass *m_pGlobalClassNext;
|
||||||
static SMGlobalClass *head;
|
static SMGlobalClass *head;
|
||||||
|
@ -62,7 +62,7 @@ inline bool TryTranslation(CPlugin *pl, const char *key, unsigned int langid, un
|
|||||||
size_t Translate(char *buffer, size_t maxlen, IPluginContext *pCtx, const char *key, cell_t target, const cell_t *params, int *arg, bool *error)
|
size_t Translate(char *buffer, size_t maxlen, IPluginContext *pCtx, const char *key, cell_t target, const cell_t *params, int *arg, bool *error)
|
||||||
{
|
{
|
||||||
unsigned int langid;
|
unsigned int langid;
|
||||||
char *langname = NULL;
|
const char *langname = NULL;
|
||||||
*error = false;
|
*error = false;
|
||||||
Translation pTrans;
|
Translation pTrans;
|
||||||
CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext());
|
CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext());
|
||||||
@ -73,14 +73,14 @@ size_t Translate(char *buffer, size_t maxlen, IPluginContext *pCtx, const char *
|
|||||||
try_serverlang:
|
try_serverlang:
|
||||||
if (target == LANG_SERVER)
|
if (target == LANG_SERVER)
|
||||||
{
|
{
|
||||||
langname = "en"; //:TODO: read serverlang
|
langname = g_Translator.GetServerLanguageCode();
|
||||||
if (!TryServerLanguage(langname ? langname : "en", &langid))
|
if (!TryServerLanguage(langname ? langname : "en", &langid))
|
||||||
{
|
{
|
||||||
pCtx->ThrowNativeError("Translation failure: English language not found");
|
pCtx->ThrowNativeError("Translation failure: English language not found");
|
||||||
goto error_out;
|
goto error_out;
|
||||||
}
|
}
|
||||||
} else if ((target >= 1) && (target <= g_Players.GetMaxClients())) {
|
} else if ((target >= 1) && (target <= g_Players.GetMaxClients())) {
|
||||||
langname = "en"; //:TODO: read player's lang
|
langname = g_Translator.GetServerLanguageCode(); /* :TODO: read player's lang */
|
||||||
if (!langname || !g_Translator.GetLanguageByCode(langname, &langid))
|
if (!langname || !g_Translator.GetLanguageByCode(langname, &langid))
|
||||||
{
|
{
|
||||||
if (langname && !strcmp(langname, "en"))
|
if (langname && !strcmp(langname, "en"))
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <sh_string.h>
|
#include <sh_string.h>
|
||||||
#include "PluginSys.h"
|
#include "PluginSys.h"
|
||||||
#include "ShareSys.h"
|
#include "ShareSys.h"
|
||||||
|
#include "CoreConfig.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include "ExtensionSys.h"
|
#include "ExtensionSys.h"
|
||||||
#include "AdminCache.h"
|
#include "AdminCache.h"
|
||||||
@ -65,13 +66,43 @@ SourceModBase::SourceModBase()
|
|||||||
{
|
{
|
||||||
m_IsMapLoading = false;
|
m_IsMapLoading = false;
|
||||||
m_ExecPluginReload = false;
|
m_ExecPluginReload = false;
|
||||||
|
m_GotBasePath = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CoreConfigErr SourceModBase::OnSourceModConfigChanged(const char *option, const char *value)
|
||||||
|
{
|
||||||
|
if (strcasecmp(option, "BasePath") == 0)
|
||||||
|
{
|
||||||
|
if (!m_GotBasePath)
|
||||||
|
{
|
||||||
|
g_LibSys.PathFormat(m_SMBaseDir, sizeof(m_SMBaseDir), "%s/%s", g_BaseDir.c_str(), value);
|
||||||
|
g_LibSys.PathFormat(m_SMRelDir, sizeof(m_SMRelDir), value);
|
||||||
|
|
||||||
|
m_GotBasePath = true;
|
||||||
|
|
||||||
|
return CoreConfig_Okay;
|
||||||
|
} else {
|
||||||
|
return CoreConfig_NoRuntime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CoreConfig_InvalidOption;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SourceModBase::InitializeSourceMod(char *error, size_t err_max, bool late)
|
bool SourceModBase::InitializeSourceMod(char *error, size_t err_max, bool late)
|
||||||
{
|
{
|
||||||
g_BaseDir.assign(g_SMAPI->GetBaseDir());
|
g_BaseDir.assign(g_SMAPI->GetBaseDir());
|
||||||
g_LibSys.PathFormat(m_SMBaseDir, sizeof(m_SMBaseDir), "%s/addons/sourcemod", g_BaseDir.c_str());
|
|
||||||
g_LibSys.PathFormat(m_SMRelDir, sizeof(m_SMRelDir), "addons/sourcemod");
|
/* Initialize CoreConfig so we can get SourceMod base path properly - this basically parses core.cfg */
|
||||||
|
g_CoreConfig.Initialize();
|
||||||
|
|
||||||
|
/* This shouldn't happen, but can't hurt to be safe */
|
||||||
|
if (!m_GotBasePath || !g_LibSys.PathExists(m_SMBaseDir))
|
||||||
|
{
|
||||||
|
g_LibSys.PathFormat(m_SMBaseDir, sizeof(m_SMBaseDir), "%s/addons/sourcemod", g_BaseDir.c_str());
|
||||||
|
g_LibSys.PathFormat(m_SMRelDir, sizeof(m_SMRelDir), "addons/sourcemod");
|
||||||
|
m_GotBasePath = true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Attempt to load the JIT! */
|
/* Attempt to load the JIT! */
|
||||||
char file[PLATFORM_MAX_PATH];
|
char file[PLATFORM_MAX_PATH];
|
||||||
|
@ -26,7 +26,9 @@ using namespace SourceHook;
|
|||||||
* @brief Implements SourceMod's global overall management, API, and logic
|
* @brief Implements SourceMod's global overall management, API, and logic
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class SourceModBase : public ISourceMod
|
class SourceModBase :
|
||||||
|
public ISourceMod,
|
||||||
|
public SMGlobalClass
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SourceModBase();
|
SourceModBase();
|
||||||
@ -75,7 +77,9 @@ public:
|
|||||||
* @brief Sets whether if SoureMod needs to check player auths.
|
* @brief Sets whether if SoureMod needs to check player auths.
|
||||||
*/
|
*/
|
||||||
void SetAuthChecking(bool set);
|
void SetAuthChecking(bool set);
|
||||||
public: //ISourceMod
|
public: // SMGlobalClass
|
||||||
|
CoreConfigErr OnSourceModConfigChanged(const char *option, const char *value);
|
||||||
|
public: // ISourceMod
|
||||||
const char *GetModPath() const;
|
const char *GetModPath() const;
|
||||||
const char *GetSourceModPath() const;
|
const char *GetSourceModPath() const;
|
||||||
size_t BuildPath(PathType type, char *buffer, size_t maxlength, char *format, ...);
|
size_t BuildPath(PathType type, char *buffer, size_t maxlength, char *format, ...);
|
||||||
@ -90,6 +94,10 @@ private:
|
|||||||
* @brief Loading plugins
|
* @brief Loading plugins
|
||||||
*/
|
*/
|
||||||
void DoGlobalPluginLoads();
|
void DoGlobalPluginLoads();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief GameFrame hook
|
||||||
|
*/
|
||||||
void GameFrame(bool simulating);
|
void GameFrame(bool simulating);
|
||||||
private:
|
private:
|
||||||
CStack<CDataPack *> m_freepacks;
|
CStack<CDataPack *> m_freepacks;
|
||||||
@ -99,6 +107,7 @@ private:
|
|||||||
bool m_ExecPluginReload;
|
bool m_ExecPluginReload;
|
||||||
unsigned int m_target;
|
unsigned int m_target;
|
||||||
bool m_CheckingAuth;
|
bool m_CheckingAuth;
|
||||||
|
bool m_GotBasePath;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern SourceModBase g_SourceMod;
|
extern SourceModBase g_SourceMod;
|
||||||
|
Loading…
Reference in New Issue
Block a user