dvander@2726: /**
dvander@2726: * vim: set ts=4 sw=4 :
dvander@2726: * =============================================================================
dvander@2726: * SourceMod
dvander@2726: * Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
dvander@2726: * =============================================================================
dvander@2726: *
dvander@2726: * This program is free software; you can redistribute it and/or modify it under
dvander@2726: * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2726: * Free Software Foundation.
dvander@2726: *
dvander@2726: * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2726: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2726: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
dvander@2726: * details.
dvander@2726: *
dvander@2726: * You should have received a copy of the GNU General Public License along with
dvander@2726: * this program. If not, see .
dvander@2726: *
dvander@2726: * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2726: * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2726: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2726: * by the Valve Corporation. You must obey the GNU General Public License in
dvander@2726: * all respects for all other code used. Additionally, AlliedModders LLC grants
dvander@2726: * this exception to all derivative works. AlliedModders LLC defines further
dvander@2726: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2726: * or .
dvander@2726: *
dvander@2726: * Version: $Id$
dvander@2726: */
dvander@2726: #include
dvander@2726: #include
dvander@2726: #include "sourcemod.h"
dvander@2726: #include "sourcemm_api.h"
dvander@2726: #include "sm_globals.h"
dvander@2726: #include "NativeOwner.h"
dvander@2726: #include "sm_autonatives.h"
dvander@2726: #include "logic/intercom.h"
dvander@2726: #include "LibrarySys.h"
dvander@2726: #include "HandleSys.h"
dvander@2726: #include "sm_stringutil.h"
dvander@2726: #include "Logger.h"
dvander@2726: #include "ShareSys.h"
dvander@2728: #include "sm_srvcmds.h"
dvander@2730: #include "ForwardSys.h"
dvander@2906: #include "logic_bridge.h"
dvander@2726:
dvander@2726: static ILibrary *g_pLogic = NULL;
dvander@2726: static LogicInitFunction logic_init_fn;
dvander@2726:
dvander@2726: IThreader *g_pThreader;
dvander@2726: ITextParsers *textparsers;
dvander@2906: SM_FN_CRC32 UTIL_CRC32;
dvander@2726:
dvander@2726: class VEngineServer_Logic : public IVEngineServer_Logic
dvander@2726: {
dvander@2726: public:
dvander@2726: virtual bool IsMapValid(const char *map)
dvander@2726: {
dvander@2726: return engine->IsMapValid(map);
dvander@2726: }
dvander@2726: };
dvander@2726:
dvander@2726: static VEngineServer_Logic logic_engine;
dvander@2726:
dvander@2726: static void add_natives(sp_nativeinfo_t *natives)
dvander@2726: {
dvander@2726: g_pCoreNatives->AddNatives(natives);
dvander@2726: }
dvander@2726:
dvander@2726: static ConVar *find_convar(const char *name)
dvander@2726: {
dvander@2726: return icvar->FindVar(name);
dvander@2726: }
dvander@2726:
dvander@2726: static void log_error(const char *fmt, ...)
dvander@2726: {
dvander@2726: va_list ap;
dvander@2726:
dvander@2726: va_start(ap, fmt);
dvander@2726: g_Logger.LogErrorEx(fmt, ap);
dvander@2726: va_end(ap);
dvander@2726: }
dvander@2726:
dvander@2726: static const char *get_cvar_string(ConVar* cvar)
dvander@2726: {
dvander@2726: return cvar->GetString();
dvander@2726: }
dvander@2726:
dvander@2726: static sm_core_t core_bridge =
dvander@2726: {
dvander@2726: /* Objects */
dvander@2726: &g_HandleSys,
dvander@2726: NULL,
dvander@2726: &g_SourceMod,
dvander@2726: &g_LibSys,
dvander@2726: reinterpret_cast(&logic_engine),
dvander@2726: &g_ShareSys,
dvander@2728: &g_RootMenu,
dvander@2728: &g_PluginSys,
dvander@2730: &g_Forwards,
dvander@2726: /* Functions */
dvander@2726: add_natives,
dvander@2726: find_convar,
dvander@2726: strncopy,
dvander@2726: UTIL_TrimWhitespace,
dvander@2726: log_error,
dvander@2726: get_cvar_string,
dvander@2884: UTIL_Format,
dvander@2884: UTIL_ReplaceAll
dvander@2726: };
dvander@2726:
dvander@2726: void InitLogicBridge()
dvander@2726: {
dvander@2726: sm_logic_t logic;
dvander@2726:
dvander@2726: core_bridge.core_ident = g_pCoreIdent;
dvander@2726: logic_init_fn(&core_bridge, &logic);
dvander@2726:
dvander@2726: /* Add SMGlobalClass instances */
dvander@2726: SMGlobalClass* glob = SMGlobalClass::head;
dvander@2726: while (glob->m_pGlobalClassNext != NULL)
dvander@2726: {
dvander@2726: glob = glob->m_pGlobalClassNext;
dvander@2726: }
dvander@2726: assert(glob->m_pGlobalClassNext == NULL);
dvander@2726: glob->m_pGlobalClassNext = logic.head;
dvander@2726:
dvander@2726: g_pThreader = logic.threader;
dvander@2728: g_pSourcePawn2->SetProfiler(logic.profiler);
dvander@2906: UTIL_CRC32 = logic.CRC32;
dvander@2726: }
dvander@2726:
dvander@2726: bool StartLogicBridge(char *error, size_t maxlength)
dvander@2726: {
dvander@2726: char file[PLATFORM_MAX_PATH];
dvander@2726:
dvander@2726: /* Now it's time to load the logic binary */
dvander@2726: g_SMAPI->PathFormat(file,
dvander@2726: sizeof(file),
dvander@2726: "%s/bin/sourcemod.logic." PLATFORM_LIB_EXT,
dvander@2726: g_SourceMod.GetSourceModPath());
dvander@2726:
dvander@2726: char myerror[255];
dvander@2726: g_pLogic = g_LibSys.OpenLibrary(file, myerror, sizeof(myerror));
dvander@2726:
dvander@2726: if (!g_pLogic)
dvander@2726: {
dvander@2726: if (error && maxlength)
dvander@2726: {
dvander@2726: UTIL_Format(error, maxlength, "failed to load %s: %s", file, myerror);
dvander@2726: }
dvander@2726: return false;
dvander@2726: }
dvander@2726:
dvander@2726: LogicLoadFunction llf = (LogicLoadFunction)g_pLogic->GetSymbolAddress("logic_load");
dvander@2726: if (llf == NULL)
dvander@2726: {
dvander@2726: g_pLogic->CloseLibrary();
dvander@2726: if (error && maxlength)
dvander@2726: {
dvander@2726: UTIL_Format(error, maxlength, "could not find logic_load function");
dvander@2726: }
dvander@2726: return false;
dvander@2726: }
dvander@2726:
dvander@2726: GetITextParsers getitxt = (GetITextParsers)g_pLogic->GetSymbolAddress("get_textparsers");
dvander@2726: textparsers = getitxt();
dvander@2726:
dvander@2726: logic_init_fn = llf(SM_LOGIC_MAGIC);
dvander@2726:
dvander@2726: return true;
dvander@2726: }
dvander@2726:
dvander@2726: void ShutdownLogicBridge()
dvander@2726: {
dvander@2726: g_pLogic->CloseLibrary();
dvander@2726: }
dvander@2726: