Clean up the core side of the logic bridge.

This commit is contained in:
David Anderson 2015-08-29 21:46:05 -04:00
parent 9e4d396d5e
commit 38e1c2f1f3
2 changed files with 97 additions and 86 deletions

View File

@ -52,13 +52,17 @@ using namespace SourceHook;
* Add 1 to the RHS of this expression to bump the intercom file
* This is to prevent mismatching core/logic binaries
*/
#define SM_LOGIC_MAGIC (0x0F47C0DE - 45)
#define SM_LOGIC_MAGIC (0x0F47C0DE - 46)
#if defined SM_LOGIC
class IVEngineServer
# define IVEngineClass IVEngineServer
# define IFileSystemClass IFileSystem
#else
class IVEngineServer_Logic
# define IVEngineClass IVEngineServer_Logic
# define IFileSystemClass IFileSystem_Logic
#endif
class IVEngineClass
{
public:
virtual bool IsDedicatedServer() = 0;
@ -73,11 +77,7 @@ public:
typedef void * FileHandle_t;
typedef int FileFindHandle_t;
#if defined SM_LOGIC
class IFileSystem
#else
class IFileSystem_Logic
#endif
class IFileSystemClass
{
public:
virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) = 0;
@ -123,8 +123,6 @@ namespace SourceMod
class ICommandArgs;
}
class IVEngineServer;
class IFileSystem;
class ConVar;
class KeyValues;
class SMGlobalClass;
@ -280,8 +278,8 @@ class CoreProvider
public:
/* Objects */
ISourceMod *sm;
IVEngineServer *engine;
IFileSystem *filesystem;
IVEngineClass *engine;
IFileSystemClass *filesystem;
IPlayerInfo_Logic *playerInfo;
ITimerSystem *timersys;
IPlayerManager *playerhelpers;

View File

@ -46,49 +46,47 @@
#include "ConCmdManager.h"
#include "IDBDriver.h"
#if SOURCE_ENGINE == SE_DOTA
#include "convar_sm_dota.h"
# include "convar_sm_dota.h"
#elif SOURCE_ENGINE >= SE_ALIENSWARM
#include "convar_sm_swarm.h"
# include "convar_sm_swarm.h"
#elif SOURCE_ENGINE >= SE_LEFT4DEAD
#include "convar_sm_l4d.h"
# include "convar_sm_l4d.h"
#elif SOURCE_ENGINE >= SE_ORANGEBOX
#include "convar_sm_ob.h"
# include "convar_sm_ob.h"
#else
#include "convar_sm.h"
# include "convar_sm.h"
#endif
#include <amtl/os/am-shared-library.h>
#include <amtl/os/am-path.h>
#if defined _WIN32
#define MATCHMAKINGDS_SUFFIX ""
#define MATCHMAKINGDS_EXT "dll"
# define MATCHMAKINGDS_SUFFIX ""
# define MATCHMAKINGDS_EXT "dll"
#elif defined __APPLE__
#define MATCHMAKINGDS_SUFFIX ""
#define MATCHMAKINGDS_EXT "dylib"
# define MATCHMAKINGDS_SUFFIX ""
# define MATCHMAKINGDS_EXT "dylib"
#elif defined __linux__
#if SOURCE_ENGINE < SE_LEFT4DEAD2
#define MATCHMAKINGDS_SUFFIX "_i486"
# define MATCHMAKINGDS_SUFFIX "_i486"
#else
#define MATCHMAKINGDS_SUFFIX ""
# define MATCHMAKINGDS_SUFFIX ""
#endif
#define MATCHMAKINGDS_EXT "so"
# define MATCHMAKINGDS_EXT "so"
#endif
static ke::Ref<ke::SharedLib> g_Logic;
static LogicInitFunction logic_init_fn;
IThreader *g_pThreader;
ITextParsers *textparsers;
sm_logic_t logicore;
ITranslator *translator;
IScriptManager *scripts;
IShareSys *sharesys;
IExtensionSys *extsys;
IHandleSys *handlesys;
IForwardManager *forwardsys;
IAdminSystem *adminsys;
ILogger *logger;
IRootConsole *rootmenu;
IThreader *g_pThreader = nullptr;
ITextParsers *textparsers = nullptr;
ITranslator *translator = nullptr;
IScriptManager *scripts = nullptr;
IShareSys *sharesys = nullptr;
IExtensionSys *extsys = nullptr;
IHandleSys *handlesys = nullptr;
IForwardManager *forwardsys = nullptr;
IAdminSystem *adminsys = nullptr;
ILogger *logger = nullptr;
IRootConsole *rootmenu = nullptr;
class VEngineServer_Logic : public IVEngineServer_Logic
{
@ -131,9 +129,6 @@ public:
}
};
static VEngineServer_Logic logic_engine;
class VFileSystem_Logic : public IFileSystem_Logic
{
public:
@ -223,8 +218,6 @@ public:
}
};
static VFileSystem_Logic logic_filesystem;
class VPlayerInfo_Logic : public IPlayerInfo_Logic
{
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_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");
@ -428,9 +419,9 @@ public:
CoreProviderImpl()
{
this->sm = &g_SourceMod;
this->engine = reinterpret_cast<IVEngineServer*>(&logic_engine);
this->filesystem = reinterpret_cast<IFileSystem*>(&logic_filesystem);
this->playerInfo = &logic_playerinfo;
this->engine = &engine_wrapper_;
this->filesystem = &fs_wrapper_;
this->playerInfo = &playerinfo_wrapper_;
this->timersys = &g_Timers;
this->playerhelpers = &g_Players;
this->gamehelpers = &g_HL2;
@ -455,6 +446,12 @@ public:
this->listeners = nullptr;
}
// Local functions.
void InitializeBridge();
bool LoadBridge(char *error, size_t maxlength);
void ShutdownBridge();
// Provider implementation.
ConVar *FindConVar(const char *name) override;
const char *GetCvarString(ConVar *cvar) override;
bool GetCvarBool(ConVar* cvar) override;
@ -471,6 +468,13 @@ public:
void ConsolePrintVa(const char *fmt, va_list ap) override;
int LoadMMSPlugin(const char *file, bool *ok, char *error, size_t maxlength) 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;
ConVar *CoreProviderImpl::FindConVar(const char *name)
@ -664,35 +668,35 @@ void CoreProviderImpl::UnloadMMSPlugin(int id)
g_pMMPlugins->Unload(id, true, ignore, sizeof(ignore));
}
void InitLogicBridge()
void CoreProviderImpl::InitializeBridge()
{
serverGlobals.universalTime = g_pUniversalTime;
serverGlobals.frametime = &gpGlobals->frametime;
serverGlobals.interval_per_tick = &gpGlobals->interval_per_tick;
::serverGlobals.universalTime = g_pUniversalTime;
::serverGlobals.frametime = &gpGlobals->frametime;
::serverGlobals.interval_per_tick = &gpGlobals->interval_per_tick;
sCoreProviderImpl.engineFactory = (void *)g_SMAPI->GetEngineFactory(false);
sCoreProviderImpl.serverFactory = (void *)g_SMAPI->GetServerFactory(false);
sCoreProviderImpl.listeners = SMGlobalClass::head;
this->engineFactory = (void *)g_SMAPI->GetEngineFactory(false);
this->serverFactory = (void *)g_SMAPI->GetServerFactory(false);
this->listeners = SMGlobalClass::head;
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))
{
sCoreProviderImpl.matchmakingDSFactory =
if (ke::Ref<ke::SharedLib> mmlib = ke::SharedLib::Open(path, NULL, 0)) {
this->matchmakingDSFactory =
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;
while (glob->m_pGlobalClassNext != NULL)
{
while (glob->m_pGlobalClassNext)
glob = glob->m_pGlobalClassNext;
}
assert(glob->m_pGlobalClassNext == NULL);
glob->m_pGlobalClassNext = logicore.head;
g_pThreader = logicore.threader;
@ -708,7 +712,7 @@ void InitLogicBridge()
rootmenu = logicore.rootmenu;
}
bool StartLogicBridge(char *error, size_t maxlength)
bool CoreProviderImpl::LoadBridge(char *error, size_t maxlength)
{
char file[PLATFORM_MAX_PATH];
@ -719,37 +723,46 @@ bool StartLogicBridge(char *error, size_t maxlength)
g_SourceMod.GetSourceModPath());
char myerror[255];
g_Logic = ke::SharedLib::Open(file, myerror, sizeof(myerror));
if (!g_Logic)
{
if (error && maxlength)
{
UTIL_Format(error, maxlength, "failed to load %s: %s", file, myerror);
}
logic_ = ke::SharedLib::Open(file, myerror, sizeof(myerror));
if (!logic_) {
ke::SafeSprintf(error, maxlength, "failed to load %s: %s", file, myerror);
return false;
}
LogicLoadFunction llf = g_Logic->get<decltype(llf)>("logic_load");
if (llf == NULL)
{
g_Logic = nullptr;
if (error && maxlength)
{
UTIL_Format(error, maxlength, "could not find logic_load function");
}
LogicLoadFunction llf = logic_->get<decltype(llf)>("logic_load");
if (!llf) {
logic_ = nullptr;
ke::SafeSprintf(error, maxlength, "could not find logic_load function");
return false;
}
GetITextParsers getitxt = g_Logic->get<decltype(getitxt)>("get_textparsers");
GetITextParsers getitxt = logic_->get<decltype(getitxt)>("get_textparsers");
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;
}
void CoreProviderImpl::ShutdownBridge()
{
logic_ = nullptr;
}
void InitLogicBridge()
{
sCoreProviderImpl.InitializeBridge();
}
bool StartLogicBridge(char *error, size_t maxlength)
{
return sCoreProviderImpl.LoadBridge(error, maxlength);
}
void ShutdownLogicBridge()
{
g_Logic = nullptr;
sCoreProviderImpl.ShutdownBridge();
}