1
0
mirror of https://github.com/alliedmodders/metamod-source.git synced 2025-03-22 13:19:40 +01:00

Hammered vsp bridge into core-legacy.

This commit is contained in:
David Anderson 2008-11-15 21:13:38 -06:00
parent 0e05b948fd
commit 0078277720
9 changed files with 24 additions and 107 deletions

View File

@ -210,7 +210,7 @@ void CPluginManager::SetVSPAsLoaded()
continue;
}
(*event).got_vsp = true;
(*event).event->OnVSPListening(&g_VspListener);
(*event).event->OnVSPListening(g_pRealVspCallbacks);
}
}
}
@ -406,8 +406,8 @@ CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source
//if (pl->m_API->GetApiVersion() >= 4)
pl->m_API->AllPluginsLoaded();
}
if (g_VspListener.IsRootLoadMethod()
|| (g_VspListener.IsLoaded() && g_SmmAPI.VSPEnabled()))
if (g_bIsBridgedAsVsp ||
(g_VspListener.IsLoaded() && g_SmmAPI.VSPEnabled()))
{
SourceHook::List<CPluginEventHandler>::iterator event;
for (event = pl->m_Events.begin();
@ -415,11 +415,9 @@ CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source
event++)
{
if (pl->m_API->GetApiVersion() < 10 || (*event).got_vsp)
{
continue;
}
(*event).got_vsp = true;
(*event).event->OnVSPListening(&g_VspListener);
(*event).event->OnVSPListening(g_pRealVspCallbacks);
}
}
} else {

View File

@ -475,7 +475,7 @@ void CSmmAPI::LoadAsVSP()
void CSmmAPI::EnableVSPListener()
{
/* If GameInit already passed and we're not already enabled or loaded, go ahead and LoadAsVSP load */
if (bGameInit && !m_VSP && !g_VspListener.IsLoaded() && !g_VspListener.IsRootLoadMethod())
if (bGameInit && !m_VSP && !g_VspListener.IsLoaded() && !g_bIsBridgedAsVsp)
{
LoadAsVSP();
}

View File

@ -10,7 +10,7 @@ OPT_FLAGS = -O2 -funroll-loops -s -pipe
GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden
DEBUG_FLAGS = -g -ggdb3
CPP = gcc-4.1
BINARY = server_i486.so
BINARY = metamod.1.ep1.so
HL2PUB = $(HL2SDK)/public
HL2LIB = $(HL2SDK)/linux_sdk
@ -22,12 +22,13 @@ OBJECTS = oslink.cpp \
sourcemm.cpp \
CPlugin.cpp \
vsp_listener.cpp \
vsp_bridge.cpp \
sourcehook/sourcehook.cpp
LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc
INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \
-I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I. -Isourcehook
-I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I. -Isourcehook -I../loader
ifeq "$(DEBUG)" "true"
BIN_DIR = Debug

View File

@ -120,7 +120,7 @@ CON_COMMAND(meta, "Metamod:Source Menu")
int args = e->Cmd_Argc();
if (g_VspListener.IsRootLoadMethod() && !g_bLevelChanged)
if (g_bIsBridgedAsVsp && !g_bLevelChanged)
{
CONMSG("WARNING: You must change the map to activate Metamod:Source.\n");
return;
@ -141,7 +141,7 @@ CON_COMMAND(meta, "Metamod:Source Menu")
return;
} else if (strcmp(command, "version") == 0) {
CONMSG("Metamod:Source version %s\n", SOURCEMM_VERSION);
if (g_VspListener.IsRootLoadMethod())
if (g_bIsBridgedAsVsp)
{
CONMSG("Loaded As: Valve Server Plugin\n");
}

View File

@ -1 +0,0 @@
../sourcehook/sourcehook.cpp

View File

@ -68,7 +68,7 @@ const char VSPIFACE_002[] = "ISERVERPLUGINCALLBACKS002";
const char GAMEINFO_PATH[] = "|gameinfo_path|";
IFileSystem *baseFs = NULL;
bool g_bLevelChanged = false;
IServerPluginCallbacks *g_pRealVspCallbacks = &g_VspListener;
void ClearGamedllList();
@ -309,20 +309,13 @@ bool AlternatelyLoadMetamod(CreateInterfaceFn ifaceFactory, CreateInterfaceFn se
bool GameInit_handler()
{
if (bGameInit)
{
RETURN_META_VALUE(MRES_IGNORED, true);
}
if (g_SmmAPI.VSPEnabled() && !g_VspListener.IsRootLoadMethod())
{
if (g_SmmAPI.VSPEnabled() && !g_bIsBridgedAsVsp)
g_SmmAPI.LoadAsVSP();
}
if (g_VspListener.IsRootLoadMethod())
{
if (g_bIsBridgedAsVsp)
DoInitialPluginLoads();
//gaben
}
bGameInit = true;
@ -354,8 +347,9 @@ SMM_API void *CreateInterface(const char *iface, int *ret)
/* We check these separately because we can't reply
* unless our interface version really matches.
*/
if ((strcmp(iface, VSPIFACE_002) == 0)
|| strcmp(iface, VSPIFACE_001) == 0)
if (!g_bIsBridgedAsVsp &&
(strcmp(iface, VSPIFACE_002) == 0 ||
strcmp(iface, VSPIFACE_001) == 0))
{
if (ret)
{
@ -365,7 +359,7 @@ SMM_API void *CreateInterface(const char *iface, int *ret)
}
/* If we're a VSP, bypass this by default */
if (g_VspListener.IsRootLoadMethod())
if (g_bIsBridgedAsVsp)
{
IFACE_MACRO(g_GameDll.factory, GameDLL);
}

View File

@ -90,6 +90,9 @@ struct EngineInfo
bool AlternatelyLoadMetamod(CreateInterfaceFn ifaceFactory, CreateInterfaceFn serverFactory);
extern IServerPluginCallbacks *g_pRealVspCallbacks;
extern bool g_bIsBridgedAsVsp;
/** @brief Global variable for GameDLL info */
extern GameDllInfo g_GameDll;

View File

@ -12,29 +12,14 @@
#include "CPlugin.h"
#include "concommands.h"
SH_DECL_HOOK0_void(ConCommand, Dispatch, SH_NOATTRIB, false);
using namespace SourceMM;
VSPListener g_VspListener;
ConCommand *g_plugin_unload = NULL;
bool g_bIsTryingToUnload;
void InterceptPluginUnloads()
{
g_bIsTryingToUnload = true;
}
void InterceptPluginUnloads_Post()
{
g_bIsTryingToUnload = false;
}
VSPListener::VSPListener()
{
m_Loaded = false;
m_Loadable = false;
m_bIsRootLoadMethod = false;
}
void VSPListener::ClientActive(edict_t *pEntity)
@ -108,25 +93,8 @@ void VSPListener::ServerActivate(edict_t *pEdictList, int edictCount, int client
void VSPListener::Unload()
{
if (g_bIsTryingToUnload)
{
Error("Metamod:Source cannot be unloaded from VSP mode. Use \"meta unload\" to unload specific plugins.\n");
return;
}
if (IsRootLoadMethod())
{
if (g_plugin_unload != NULL)
{
SH_REMOVE_HOOK_STATICFUNC(ConCommand, Dispatch, g_plugin_unload, InterceptPluginUnloads, false);
SH_REMOVE_HOOK_STATICFUNC(ConCommand, Dispatch, g_plugin_unload, InterceptPluginUnloads_Post, true);
g_plugin_unload = NULL;
}
g_SMConVarAccessor.UnloadMetamodCommands();
UnloadMetamod(false);
}
m_Loadable = true;
m_Loaded = false;
m_bIsRootLoadMethod = false;
}
void VSPListener::SetLoadable(bool set)
@ -134,61 +102,16 @@ void VSPListener::SetLoadable(bool set)
m_Loadable = set;
}
bool VSPListener::IsRootLoadMethod()
{
return m_bIsRootLoadMethod;
}
bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory)
{
if (m_Loaded)
{
if (m_Loaded || !m_Loadable)
return false;
}
if (!m_Loadable && !g_GameDll.loaded)
{
/* New loading mechanism, do a bunch o' stuff! */
m_bIsRootLoadMethod = true;
m_Loaded = true;
SetLoadable(false);
if (!AlternatelyLoadMetamod(interfaceFactory, gameServerFactory))
{
return false;
}
ConCommandBase *pBase = g_Engine.icvar->GetCommands();
while (pBase != NULL)
{
if (pBase->IsCommand() && strcmp(pBase->GetName(), "plugin_unload") == 0)
{
g_plugin_unload = (ConCommand *)pBase;
break;
}
pBase = const_cast<ConCommandBase *>(pBase->GetNext());
}
if (g_plugin_unload != NULL)
{
SH_ADD_HOOK_STATICFUNC(ConCommand, Dispatch, g_plugin_unload, InterceptPluginUnloads, false);
SH_ADD_HOOK_STATICFUNC(ConCommand, Dispatch, g_plugin_unload, InterceptPluginUnloads_Post, true);
}
/* Ho ho ho... if we get here, set a new cvar version. */
extern ConVar metamod_version;
char buffer[255];
UTIL_Format(buffer, sizeof(buffer), "%sV", metamod_version.GetString());
metamod_version.SetValue(buffer);
}
m_Loaded = true;
SetLoadable(false);
if (!m_bIsRootLoadMethod)
{
g_PluginMngr.SetVSPAsLoaded();
}
g_PluginMngr.SetVSPAsLoaded();
return true;
}

View File

@ -39,13 +39,12 @@ public:
public:
bool IsLoaded();
void SetLoadable(bool loadable);
bool IsRootLoadMethod();
private:
bool m_Loaded;
bool m_Loadable;
bool m_bIsRootLoadMethod;
};
extern VSPListener g_VspListener;
#endif //_INCLUDE_SOURCEMM_VSPLISTENER_H_