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@2989: #include "TimerSys.h" dvander@2906: #include "logic_bridge.h" dvander@2989: #include "DebugReporter.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@2989: static void generate_error(IPluginContext *ctx, cell_t func_idx, int err, const char *fmt, ...) dvander@2989: { dvander@2989: va_list ap; dvander@2989: dvander@2989: va_start(ap, fmt); dvander@2989: g_DbgReporter.GenerateErrorVA(ctx, func_idx, err, fmt, ap); dvander@2989: va_end(ap); dvander@2989: } dvander@2989: dvander@2726: static const char *get_cvar_string(ConVar* cvar) dvander@2726: { dvander@2726: return cvar->GetString(); dvander@2726: } dvander@2726: dvander@2989: static ServerGlobals serverGlobals; dvander@2989: 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@2989: &g_Timers, 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@2989: UTIL_ReplaceAll, dvander@2989: generate_error, dvander@2989: &serverGlobals dvander@2726: }; dvander@2726: dvander@2726: void InitLogicBridge() dvander@2726: { dvander@2726: sm_logic_t logic; dvander@2726: dvander@2989: serverGlobals.universalTime = g_pUniversalTime; dvander@2989: serverGlobals.frametime = &gpGlobals->frametime; dvander@2989: serverGlobals.interval_per_tick = &gpGlobals->interval_per_tick; dvander@2989: 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: