dvander@2726: /** dvander@4029: * vim: set ts=4 sw=4 tw=99 noet: dvander@2726: * ============================================================================= dvander@2726: * SourceMod dvander@2726: * Copyright (C) 2004-2008 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 dvander@2726: #include dvander@3795: #include dvander@2726: #include "common_logic.h" dvander@2726: #include "TextParsers.h" dvander@2878: #include "Profiler.h" dvander@2906: #include "sm_crc32.h" dvander@2999: #include "MemoryUtils.h" dvander@3002: #include "stringutil.h" ds@3295: #include "ThreadSupport.h" dvander@3004: #include "Translator.h" dvander@3010: #include "GameConfigs.h" dvander@3792: #include "DebugReporter.h" dvander@3872: #include "PluginSys.h" dvander@3872: #include "ShareSys.h" dvander@3872: #include "NativeOwner.h" dvander@3872: #include "HandleSys.h" dvander@3872: #include "ExtensionSys.h" skamonkey@4139: #include "ForwardSys.h" dvander@2726: dvander@2726: sm_core_t smcore; dvander@3872: IHandleSys *handlesys = &g_HandleSys; dvander@2726: IdentityToken_t *g_pCoreIdent; dvander@2726: SMGlobalClass *SMGlobalClass::head = NULL; dvander@2726: ISourceMod *g_pSM; dvander@2726: ILibrarySys *libsys; dvander@2726: ITextParsers *textparser = &g_TextParser; dvander@2726: IVEngineServer *engine; dvander@3872: IShareSys *sharesys = &g_ShareSys; dvander@2728: IRootConsole *rootmenu; dvander@3872: IPluginManager *pluginsys = g_PluginSys.GetOldAPI(); skamonkey@4139: IForwardManager *forwardsys = &g_Forwards; dvander@2989: ITimerSystem *timersys; dvander@2989: ServerGlobals serverGlobals; dvander@2996: IPlayerManager *playerhelpers; dvander@3000: IAdminSystem *adminsys; dvander@3001: IGameHelpers *gamehelpers; dvander@3792: ISourcePawnEngine *g_pSourcePawn; dvander@3792: ISourcePawnEngine2 *g_pSourcePawn2; dvander@3872: CNativeOwner g_CoreNatives; dvander@3872: IScriptManager *scripts = &g_PluginSys; dvander@2726: dvander@3004: static void AddCorePhraseFile(const char *filename) dvander@3004: { asherkin@3498: g_pCorePhrases->AddPhraseFile(filename); dvander@3004: } dvander@3004: dvander@3010: static IGameConfig *GetCoreGameConfig() dvander@3010: { dvander@3010: return g_pGameConf; dvander@3010: } dvander@3010: dvander@3791: // Defined in smn_filesystem.cpp. dvander@3791: extern bool OnLogPrint(const char *msg); dvander@3791: dvander@3792: static void GenerateError(IPluginContext *ctx, cell_t idx, int err, const char *msg, ...) dvander@3792: { dvander@3792: va_list ap; dvander@3792: va_start(ap, msg); dvander@3792: g_DbgReporter.GenerateErrorVA(ctx, idx, err, msg, ap); dvander@3792: va_end(ap); dvander@3792: } dvander@3792: dvander@3872: static void AddNatives(sp_nativeinfo_t *natives) dvander@3872: { dvander@3872: g_CoreNatives.AddNatives(natives); dvander@3872: } dvander@3872: dvander@3872: static void DumpHandles(void (*dumpfn)(const char *fmt, ...)) dvander@3872: { dvander@3872: g_HandleSys.Dump(dumpfn); dvander@3872: } dvander@3872: dvander@2726: static sm_logic_t logic = dvander@2726: { dvander@2726: NULL, dvander@2878: g_pThreader, dvander@2906: sm_profiler, dvander@3004: &g_Translator, dvander@3004: stristr, dvander@3004: CoreTranslate, dvander@3005: AddCorePhraseFile, dvander@3005: UTIL_ReplaceAll, dvander@3010: UTIL_ReplaceEx, dvander@3010: UTIL_DecodeHexString, dvander@3791: GetCoreGameConfig, dvander@3792: OnLogPrint, dvander@3792: &g_DbgReporter, dvander@3872: GenerateError, dvander@3872: AddNatives, dvander@3872: DumpHandles, dvander@3872: &g_PluginSys, dvander@3872: &g_ShareSys, dvander@3872: &g_Extensions, dvander@3872: &g_HandleSys, skamonkey@4139: &g_Forwards, dvander@3872: NULL, dvander@3872: -1.0f dvander@2726: }; dvander@2726: dvander@2726: static void logic_init(const sm_core_t* core, sm_logic_t* _logic) dvander@2726: { dvander@2726: logic.head = SMGlobalClass::head; dvander@2726: dvander@2726: memcpy(&smcore, core, sizeof(sm_core_t)); dvander@2726: memcpy(_logic, &logic, sizeof(sm_logic_t)); dvander@2989: memcpy(&serverGlobals, core->serverGlobals, sizeof(ServerGlobals)); dvander@2726: dvander@2726: libsys = core->libsys; dvander@2726: engine = core->engine; dvander@2726: g_pSM = core->sm; dvander@2728: rootmenu = core->rootmenu; dvander@2989: timersys = core->timersys; dvander@2996: playerhelpers = core->playerhelpers; dvander@3000: adminsys = core->adminsys; dvander@3010: gamehelpers = core->gamehelpers; skamonkey@3800: g_pSourcePawn = *core->spe1; skamonkey@3800: g_pSourcePawn2 = *core->spe2; dvander@4029: SMGlobalClass::head = core->listeners; dvander@3872: dvander@3872: g_ShareSys.Initialize(); dvander@3872: g_pCoreIdent = g_ShareSys.CreateCoreIdentity(); dvander@3872: dvander@3872: _logic->core_ident = g_pCoreIdent; dvander@2726: } dvander@2726: dvander@2726: PLATFORM_EXTERN_C ITextParsers *get_textparsers() dvander@2726: { dvander@2726: return &g_TextParser; dvander@2726: } dvander@2726: dvander@2726: PLATFORM_EXTERN_C LogicInitFunction logic_load(uint32_t magic) dvander@2726: { dvander@2726: if (magic != SM_LOGIC_MAGIC) dvander@2726: { dvander@2726: return NULL; dvander@2726: } dvander@2726: dvander@2726: return logic_init; dvander@2726: } dvander@2726: dvander@2726: void CoreNativesToAdd::OnSourceModAllInitialized() dvander@2726: { dvander@3872: g_CoreNatives.AddNatives(m_NativeList); dvander@2726: } dvander@2726: dvander@2726: /* Overload a few things to prevent libstdc++ linking */ dvander@2726: #if defined __linux__ || defined __APPLE__ dvander@2726: extern "C" void __cxa_pure_virtual(void) dvander@2726: { dvander@2726: } dvander@2726: dvander@2726: void *operator new(size_t size) dvander@2726: { dvander@2726: return malloc(size); dvander@2726: } dvander@2726: dvander@2726: void *operator new[](size_t size) dvander@2726: { dvander@2726: return malloc(size); dvander@2726: } dvander@2726: dvander@2726: void operator delete(void *ptr) dvander@2726: { dvander@2726: free(ptr); dvander@2726: } dvander@2726: dvander@2726: void operator delete[](void * ptr) dvander@2726: { dvander@2726: free(ptr); dvander@2726: } dvander@2726: #endif dvander@2726: