Clean up the core side of the logic bridge.
This commit is contained in:
parent
9e4d396d5e
commit
38e1c2f1f3
@ -52,13 +52,17 @@ using namespace SourceHook;
|
|||||||
* Add 1 to the RHS of this expression to bump the intercom file
|
* Add 1 to the RHS of this expression to bump the intercom file
|
||||||
* This is to prevent mismatching core/logic binaries
|
* This is to prevent mismatching core/logic binaries
|
||||||
*/
|
*/
|
||||||
#define SM_LOGIC_MAGIC (0x0F47C0DE - 45)
|
#define SM_LOGIC_MAGIC (0x0F47C0DE - 46)
|
||||||
|
|
||||||
#if defined SM_LOGIC
|
#if defined SM_LOGIC
|
||||||
class IVEngineServer
|
# define IVEngineClass IVEngineServer
|
||||||
|
# define IFileSystemClass IFileSystem
|
||||||
#else
|
#else
|
||||||
class IVEngineServer_Logic
|
# define IVEngineClass IVEngineServer_Logic
|
||||||
|
# define IFileSystemClass IFileSystem_Logic
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
class IVEngineClass
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual bool IsDedicatedServer() = 0;
|
virtual bool IsDedicatedServer() = 0;
|
||||||
@ -73,11 +77,7 @@ public:
|
|||||||
typedef void * FileHandle_t;
|
typedef void * FileHandle_t;
|
||||||
typedef int FileFindHandle_t;
|
typedef int FileFindHandle_t;
|
||||||
|
|
||||||
#if defined SM_LOGIC
|
class IFileSystemClass
|
||||||
class IFileSystem
|
|
||||||
#else
|
|
||||||
class IFileSystem_Logic
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) = 0;
|
virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) = 0;
|
||||||
@ -123,8 +123,6 @@ namespace SourceMod
|
|||||||
class ICommandArgs;
|
class ICommandArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
class IVEngineServer;
|
|
||||||
class IFileSystem;
|
|
||||||
class ConVar;
|
class ConVar;
|
||||||
class KeyValues;
|
class KeyValues;
|
||||||
class SMGlobalClass;
|
class SMGlobalClass;
|
||||||
@ -280,8 +278,8 @@ class CoreProvider
|
|||||||
public:
|
public:
|
||||||
/* Objects */
|
/* Objects */
|
||||||
ISourceMod *sm;
|
ISourceMod *sm;
|
||||||
IVEngineServer *engine;
|
IVEngineClass *engine;
|
||||||
IFileSystem *filesystem;
|
IFileSystemClass *filesystem;
|
||||||
IPlayerInfo_Logic *playerInfo;
|
IPlayerInfo_Logic *playerInfo;
|
||||||
ITimerSystem *timersys;
|
ITimerSystem *timersys;
|
||||||
IPlayerManager *playerhelpers;
|
IPlayerManager *playerhelpers;
|
||||||
|
@ -74,21 +74,19 @@
|
|||||||
# define MATCHMAKINGDS_EXT "so"
|
# define MATCHMAKINGDS_EXT "so"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static ke::Ref<ke::SharedLib> g_Logic;
|
|
||||||
static LogicInitFunction logic_init_fn;
|
|
||||||
|
|
||||||
IThreader *g_pThreader;
|
|
||||||
ITextParsers *textparsers;
|
|
||||||
sm_logic_t logicore;
|
sm_logic_t logicore;
|
||||||
ITranslator *translator;
|
|
||||||
IScriptManager *scripts;
|
IThreader *g_pThreader = nullptr;
|
||||||
IShareSys *sharesys;
|
ITextParsers *textparsers = nullptr;
|
||||||
IExtensionSys *extsys;
|
ITranslator *translator = nullptr;
|
||||||
IHandleSys *handlesys;
|
IScriptManager *scripts = nullptr;
|
||||||
IForwardManager *forwardsys;
|
IShareSys *sharesys = nullptr;
|
||||||
IAdminSystem *adminsys;
|
IExtensionSys *extsys = nullptr;
|
||||||
ILogger *logger;
|
IHandleSys *handlesys = nullptr;
|
||||||
IRootConsole *rootmenu;
|
IForwardManager *forwardsys = nullptr;
|
||||||
|
IAdminSystem *adminsys = nullptr;
|
||||||
|
ILogger *logger = nullptr;
|
||||||
|
IRootConsole *rootmenu = nullptr;
|
||||||
|
|
||||||
class VEngineServer_Logic : public IVEngineServer_Logic
|
class VEngineServer_Logic : public IVEngineServer_Logic
|
||||||
{
|
{
|
||||||
@ -131,9 +129,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static VEngineServer_Logic logic_engine;
|
|
||||||
|
|
||||||
|
|
||||||
class VFileSystem_Logic : public IFileSystem_Logic
|
class VFileSystem_Logic : public IFileSystem_Logic
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -223,8 +218,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static VFileSystem_Logic logic_filesystem;
|
|
||||||
|
|
||||||
class VPlayerInfo_Logic : public IPlayerInfo_Logic
|
class VPlayerInfo_Logic : public IPlayerInfo_Logic
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -294,8 +287,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static VPlayerInfo_Logic logic_playerinfo;
|
|
||||||
|
|
||||||
static ConVar sm_show_activity("sm_show_activity", "13", FCVAR_SPONLY, "Activity display setting (see sourcemod.cfg)");
|
static ConVar sm_show_activity("sm_show_activity", "13", FCVAR_SPONLY, "Activity display setting (see sourcemod.cfg)");
|
||||||
static ConVar sm_immunity_mode("sm_immunity_mode", "1", FCVAR_SPONLY, "Mode for deciding immunity protection");
|
static ConVar sm_immunity_mode("sm_immunity_mode", "1", FCVAR_SPONLY, "Mode for deciding immunity protection");
|
||||||
static ConVar sm_datetime_format("sm_datetime_format", "%m/%d/%Y - %H:%M:%S", 0, "Default formatting time rules");
|
static ConVar sm_datetime_format("sm_datetime_format", "%m/%d/%Y - %H:%M:%S", 0, "Default formatting time rules");
|
||||||
@ -428,9 +419,9 @@ public:
|
|||||||
CoreProviderImpl()
|
CoreProviderImpl()
|
||||||
{
|
{
|
||||||
this->sm = &g_SourceMod;
|
this->sm = &g_SourceMod;
|
||||||
this->engine = reinterpret_cast<IVEngineServer*>(&logic_engine);
|
this->engine = &engine_wrapper_;
|
||||||
this->filesystem = reinterpret_cast<IFileSystem*>(&logic_filesystem);
|
this->filesystem = &fs_wrapper_;
|
||||||
this->playerInfo = &logic_playerinfo;
|
this->playerInfo = &playerinfo_wrapper_;
|
||||||
this->timersys = &g_Timers;
|
this->timersys = &g_Timers;
|
||||||
this->playerhelpers = &g_Players;
|
this->playerhelpers = &g_Players;
|
||||||
this->gamehelpers = &g_HL2;
|
this->gamehelpers = &g_HL2;
|
||||||
@ -455,6 +446,12 @@ public:
|
|||||||
this->listeners = nullptr;
|
this->listeners = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Local functions.
|
||||||
|
void InitializeBridge();
|
||||||
|
bool LoadBridge(char *error, size_t maxlength);
|
||||||
|
void ShutdownBridge();
|
||||||
|
|
||||||
|
// Provider implementation.
|
||||||
ConVar *FindConVar(const char *name) override;
|
ConVar *FindConVar(const char *name) override;
|
||||||
const char *GetCvarString(ConVar *cvar) override;
|
const char *GetCvarString(ConVar *cvar) override;
|
||||||
bool GetCvarBool(ConVar* cvar) override;
|
bool GetCvarBool(ConVar* cvar) override;
|
||||||
@ -471,6 +468,13 @@ public:
|
|||||||
void ConsolePrintVa(const char *fmt, va_list ap) override;
|
void ConsolePrintVa(const char *fmt, va_list ap) override;
|
||||||
int LoadMMSPlugin(const char *file, bool *ok, char *error, size_t maxlength) override;
|
int LoadMMSPlugin(const char *file, bool *ok, char *error, size_t maxlength) override;
|
||||||
void UnloadMMSPlugin(int id) override;
|
void UnloadMMSPlugin(int id) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
ke::Ref<ke::SharedLib> logic_;
|
||||||
|
LogicInitFunction logic_init_;
|
||||||
|
VEngineServer_Logic engine_wrapper_;
|
||||||
|
VFileSystem_Logic fs_wrapper_;
|
||||||
|
VPlayerInfo_Logic playerinfo_wrapper_;
|
||||||
} sCoreProviderImpl;
|
} sCoreProviderImpl;
|
||||||
|
|
||||||
ConVar *CoreProviderImpl::FindConVar(const char *name)
|
ConVar *CoreProviderImpl::FindConVar(const char *name)
|
||||||
@ -664,35 +668,35 @@ void CoreProviderImpl::UnloadMMSPlugin(int id)
|
|||||||
g_pMMPlugins->Unload(id, true, ignore, sizeof(ignore));
|
g_pMMPlugins->Unload(id, true, ignore, sizeof(ignore));
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitLogicBridge()
|
void CoreProviderImpl::InitializeBridge()
|
||||||
{
|
{
|
||||||
serverGlobals.universalTime = g_pUniversalTime;
|
::serverGlobals.universalTime = g_pUniversalTime;
|
||||||
serverGlobals.frametime = &gpGlobals->frametime;
|
::serverGlobals.frametime = &gpGlobals->frametime;
|
||||||
serverGlobals.interval_per_tick = &gpGlobals->interval_per_tick;
|
::serverGlobals.interval_per_tick = &gpGlobals->interval_per_tick;
|
||||||
|
|
||||||
sCoreProviderImpl.engineFactory = (void *)g_SMAPI->GetEngineFactory(false);
|
this->engineFactory = (void *)g_SMAPI->GetEngineFactory(false);
|
||||||
sCoreProviderImpl.serverFactory = (void *)g_SMAPI->GetServerFactory(false);
|
this->serverFactory = (void *)g_SMAPI->GetServerFactory(false);
|
||||||
sCoreProviderImpl.listeners = SMGlobalClass::head;
|
this->listeners = SMGlobalClass::head;
|
||||||
|
|
||||||
char path[PLATFORM_MAX_PATH];
|
char path[PLATFORM_MAX_PATH];
|
||||||
|
|
||||||
ke::path::Format(path, sizeof(path), "%s/bin/matchmaking_ds%s.%s", g_SMAPI->GetBaseDir(), MATCHMAKINGDS_SUFFIX, MATCHMAKINGDS_EXT);
|
ke::path::Format(path, sizeof(path),
|
||||||
|
"%s/bin/matchmaking_ds%s.%s",
|
||||||
|
g_SMAPI->GetBaseDir(),
|
||||||
|
MATCHMAKINGDS_SUFFIX,
|
||||||
|
MATCHMAKINGDS_EXT);
|
||||||
|
|
||||||
if (ke::Ref<ke::SharedLib> mmlib = ke::SharedLib::Open(path, NULL, 0))
|
if (ke::Ref<ke::SharedLib> mmlib = ke::SharedLib::Open(path, NULL, 0)) {
|
||||||
{
|
this->matchmakingDSFactory =
|
||||||
sCoreProviderImpl.matchmakingDSFactory =
|
|
||||||
mmlib->get<decltype(sCoreProviderImpl.matchmakingDSFactory)>("CreateInterface");
|
mmlib->get<decltype(sCoreProviderImpl.matchmakingDSFactory)>("CreateInterface");
|
||||||
}
|
}
|
||||||
|
|
||||||
logic_init_fn(&sCoreProviderImpl, &logicore);
|
logic_init_(this, &logicore);
|
||||||
|
|
||||||
/* Add SMGlobalClass instances */
|
// Join logic's SMGlobalClass instances.
|
||||||
SMGlobalClass* glob = SMGlobalClass::head;
|
SMGlobalClass* glob = SMGlobalClass::head;
|
||||||
while (glob->m_pGlobalClassNext != NULL)
|
while (glob->m_pGlobalClassNext)
|
||||||
{
|
|
||||||
glob = glob->m_pGlobalClassNext;
|
glob = glob->m_pGlobalClassNext;
|
||||||
}
|
|
||||||
assert(glob->m_pGlobalClassNext == NULL);
|
|
||||||
glob->m_pGlobalClassNext = logicore.head;
|
glob->m_pGlobalClassNext = logicore.head;
|
||||||
|
|
||||||
g_pThreader = logicore.threader;
|
g_pThreader = logicore.threader;
|
||||||
@ -708,7 +712,7 @@ void InitLogicBridge()
|
|||||||
rootmenu = logicore.rootmenu;
|
rootmenu = logicore.rootmenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StartLogicBridge(char *error, size_t maxlength)
|
bool CoreProviderImpl::LoadBridge(char *error, size_t maxlength)
|
||||||
{
|
{
|
||||||
char file[PLATFORM_MAX_PATH];
|
char file[PLATFORM_MAX_PATH];
|
||||||
|
|
||||||
@ -719,37 +723,46 @@ bool StartLogicBridge(char *error, size_t maxlength)
|
|||||||
g_SourceMod.GetSourceModPath());
|
g_SourceMod.GetSourceModPath());
|
||||||
|
|
||||||
char myerror[255];
|
char myerror[255];
|
||||||
g_Logic = ke::SharedLib::Open(file, myerror, sizeof(myerror));
|
logic_ = ke::SharedLib::Open(file, myerror, sizeof(myerror));
|
||||||
if (!g_Logic)
|
if (!logic_) {
|
||||||
{
|
ke::SafeSprintf(error, maxlength, "failed to load %s: %s", file, myerror);
|
||||||
if (error && maxlength)
|
|
||||||
{
|
|
||||||
UTIL_Format(error, maxlength, "failed to load %s: %s", file, myerror);
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
LogicLoadFunction llf = g_Logic->get<decltype(llf)>("logic_load");
|
LogicLoadFunction llf = logic_->get<decltype(llf)>("logic_load");
|
||||||
if (llf == NULL)
|
if (!llf) {
|
||||||
{
|
logic_ = nullptr;
|
||||||
g_Logic = nullptr;
|
ke::SafeSprintf(error, maxlength, "could not find logic_load function");
|
||||||
if (error && maxlength)
|
|
||||||
{
|
|
||||||
UTIL_Format(error, maxlength, "could not find logic_load function");
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
GetITextParsers getitxt = g_Logic->get<decltype(getitxt)>("get_textparsers");
|
GetITextParsers getitxt = logic_->get<decltype(getitxt)>("get_textparsers");
|
||||||
textparsers = getitxt();
|
textparsers = getitxt();
|
||||||
|
|
||||||
logic_init_fn = llf(SM_LOGIC_MAGIC);
|
logic_init_ = llf(SM_LOGIC_MAGIC);
|
||||||
|
if (!logic_init_) {
|
||||||
|
ke::SafeSprintf(error, maxlength, "component version mismatch");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CoreProviderImpl::ShutdownBridge()
|
||||||
|
{
|
||||||
|
logic_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitLogicBridge()
|
||||||
|
{
|
||||||
|
sCoreProviderImpl.InitializeBridge();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StartLogicBridge(char *error, size_t maxlength)
|
||||||
|
{
|
||||||
|
return sCoreProviderImpl.LoadBridge(error, maxlength);
|
||||||
|
}
|
||||||
|
|
||||||
void ShutdownLogicBridge()
|
void ShutdownLogicBridge()
|
||||||
{
|
{
|
||||||
g_Logic = nullptr;
|
sCoreProviderImpl.ShutdownBridge();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user