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: