1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/extensions/batsupport/smsdk_ext.cpp Tue Feb 27 08:21:01 2007 +0000
1.3 @@ -0,0 +1,333 @@
1.4 +/**
1.5 + * vim: set ts=4 :
1.6 + * ===============================================================
1.7 + * SourceMod, Copyright (C) 2004-2007 AlliedModders LLC.
1.8 + * All rights reserved.
1.9 + * ===============================================================
1.10 + *
1.11 + * This file is part of the SourceMod/SourcePawn SDK. This file may only be used
1.12 + * or modified under the Terms and Conditions of its License Agreement, which is found
1.13 + * in LICENSE.txt. The Terms and Conditions for making SourceMod extensions/plugins
1.14 + * may change at any time. To view the latest information, see:
1.15 + * http://www.sourcemod.net/license.php
1.16 + *
1.17 + * Version: $Id$
1.18 + */
1.19 +
1.20 +#include <stdio.h>
1.21 +#include <malloc.h>
1.22 +#include "smsdk_ext.h"
1.23 +
1.24 +/**
1.25 + * @file smsdk_ext.cpp
1.26 + * @brief Contains wrappers for making Extensions easier to write.
1.27 + */
1.28 +
1.29 +IShareSys *g_pShareSys = NULL; /**< Share system */
1.30 +IExtension *myself = NULL; /**< Ourself */
1.31 +IHandleSys *g_pHandleSys = NULL; /**< Handle system */
1.32 +ISourceMod *g_pSM = NULL; /**< SourceMod helpers */
1.33 +IForwardManager *g_pForwards = NULL; /**< Forward system */
1.34 +
1.35 +/** Exports the main interface */
1.36 +PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
1.37 +{
1.38 + return g_pExtensionIface;
1.39 +}
1.40 +
1.41 +SDKExtension::SDKExtension()
1.42 +{
1.43 +#if defined SMEXT_CONF_METAMOD
1.44 + m_SourceMMLoaded = false;
1.45 + m_WeAreUnloaded = false;
1.46 + m_WeGotPauseChange = false;
1.47 +#endif
1.48 +}
1.49 +
1.50 +bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t err_max, bool late)
1.51 +{
1.52 + g_pShareSys = sys;
1.53 + myself = me;
1.54 +
1.55 +#if defined SMEXT_CONF_METAMOD
1.56 + m_WeAreUnloaded = true;
1.57 +
1.58 + if (!m_SourceMMLoaded)
1.59 + {
1.60 + if (error)
1.61 + {
1.62 + snprintf(error, err_max, "Metamod attach failed");
1.63 + }
1.64 + return false;
1.65 + }
1.66 +#endif
1.67 +
1.68 + SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
1.69 + SM_GET_IFACE(SOURCEMOD, g_pSM);
1.70 + SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
1.71 +
1.72 + if (SDK_OnLoad(error, err_max, late))
1.73 + {
1.74 +#if defined SMEXT_CONF_METAMOD
1.75 + m_WeAreUnloaded = true;
1.76 +#endif
1.77 + return true;
1.78 + }
1.79 +
1.80 + return false;
1.81 +}
1.82 +
1.83 +bool SDKExtension::IsMetamodExtension()
1.84 +{
1.85 +#if defined SMEXT_CONF_METAMOD
1.86 + return true;
1.87 +#else
1.88 + return false;
1.89 +#endif
1.90 +}
1.91 +
1.92 +void SDKExtension::OnExtensionPauseChange(bool state)
1.93 +{
1.94 +#if defined SMEXT_CONF_METAMOD
1.95 + m_WeGotPauseChange = true;
1.96 +#endif
1.97 + SDK_OnPauseChange(state);
1.98 +}
1.99 +
1.100 +void SDKExtension::OnExtensionsAllLoaded()
1.101 +{
1.102 + SDK_OnAllLoaded();
1.103 +}
1.104 +
1.105 +void SDKExtension::OnExtensionUnload()
1.106 +{
1.107 +#if defined SMEXT_CONF_METAMOD
1.108 + m_WeAreUnloaded = true;
1.109 +#endif
1.110 + SDK_OnUnload();
1.111 +}
1.112 +
1.113 +const char *SDKExtension::GetExtensionAuthor()
1.114 +{
1.115 + return SMEXT_CONF_AUTHOR;
1.116 +}
1.117 +
1.118 +const char *SDKExtension::GetExtensionDateString()
1.119 +{
1.120 + return SMEXT_CONF_DATESTRING;
1.121 +}
1.122 +
1.123 +const char *SDKExtension::GetExtensionDescription()
1.124 +{
1.125 + return SMEXT_CONF_DESCRIPTION;
1.126 +}
1.127 +
1.128 +const char *SDKExtension::GetExtensionVerString()
1.129 +{
1.130 + return SMEXT_CONF_VERSION;
1.131 +}
1.132 +
1.133 +const char *SDKExtension::GetExtensionName()
1.134 +{
1.135 + return SMEXT_CONF_NAME;
1.136 +}
1.137 +
1.138 +const char *SDKExtension::GetExtensionTag()
1.139 +{
1.140 + return SMEXT_CONF_LOGTAG;
1.141 +}
1.142 +
1.143 +const char *SDKExtension::GetExtensionURL()
1.144 +{
1.145 + return SMEXT_CONF_URL;
1.146 +}
1.147 +
1.148 +bool SDKExtension::SDK_OnLoad(char *error, size_t err_max, bool late)
1.149 +{
1.150 + return true;
1.151 +}
1.152 +
1.153 +void SDKExtension::SDK_OnUnload()
1.154 +{
1.155 +}
1.156 +
1.157 +void SDKExtension::SDK_OnPauseChange(bool paused)
1.158 +{
1.159 +}
1.160 +
1.161 +void SDKExtension::SDK_OnAllLoaded()
1.162 +{
1.163 +}
1.164 +
1.165 +#if defined SMEXT_CONF_METAMOD
1.166 +
1.167 +PluginId g_PLID = 0; /**< Metamod plugin ID */
1.168 +ISmmPlugin *g_PLAPI = NULL; /**< Metamod plugin API */
1.169 +SourceHook::ISourceHook *g_SHPtr = NULL; /**< SourceHook pointer */
1.170 +ISmmAPI *g_SMAPI = NULL; /**< SourceMM API pointer */
1.171 +
1.172 +IVEngineServer *engine = NULL; /**< IVEngineServer pointer */
1.173 +IServerGameDLL *gamedll = NULL; /**< IServerGameDLL pointer */
1.174 +
1.175 +/** Exposes the extension to Metamod */
1.176 +SMM_API void *PL_EXPOSURE(const char *name, int *code)
1.177 +{
1.178 + if (name && !strcmp(name, PLAPI_NAME))
1.179 + {
1.180 + if (code)
1.181 + {
1.182 + *code = IFACE_OK;
1.183 + }
1.184 + return static_cast<void *>(g_pExtensionIface);
1.185 + }
1.186 +
1.187 + if (code)
1.188 + {
1.189 + *code = IFACE_FAILED;
1.190 + }
1.191 +
1.192 + return NULL;
1.193 +}
1.194 +
1.195 +bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
1.196 +{
1.197 + PLUGIN_SAVEVARS();
1.198 +
1.199 + GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
1.200 + GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
1.201 +
1.202 + m_SourceMMLoaded = true;
1.203 +
1.204 + return SDK_OnMetamodLoad(error, maxlen, late);
1.205 +}
1.206 +
1.207 +bool SDKExtension::Unload(char *error, size_t maxlen)
1.208 +{
1.209 + if (!m_WeAreUnloaded)
1.210 + {
1.211 + if (error)
1.212 + {
1.213 + snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
1.214 + }
1.215 + return false;
1.216 + }
1.217 +
1.218 + return SDK_OnMetamodUnload(error, maxlen);
1.219 +}
1.220 +
1.221 +bool SDKExtension::Pause(char *error, size_t maxlen)
1.222 +{
1.223 + if (!m_WeGotPauseChange)
1.224 + {
1.225 + if (error)
1.226 + {
1.227 + snprintf(error, maxlen, "This extension must be paused by SourceMod.");
1.228 + }
1.229 + return false;
1.230 + }
1.231 +
1.232 + m_WeGotPauseChange = false;
1.233 +
1.234 + return SDK_OnMetamodPauseChange(true, error, maxlen);
1.235 +}
1.236 +
1.237 +bool SDKExtension::Unpause(char *error, size_t maxlen)
1.238 +{
1.239 + if (!m_WeGotPauseChange)
1.240 + {
1.241 + if (error)
1.242 + {
1.243 + snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
1.244 + }
1.245 + return false;
1.246 + }
1.247 +
1.248 + m_WeGotPauseChange = false;
1.249 +
1.250 + return SDK_OnMetamodPauseChange(false, error, maxlen);
1.251 +}
1.252 +
1.253 +const char *SDKExtension::GetAuthor()
1.254 +{
1.255 + return GetExtensionAuthor();
1.256 +}
1.257 +
1.258 +const char *SDKExtension::GetDate()
1.259 +{
1.260 + return GetExtensionDateString();
1.261 +}
1.262 +
1.263 +const char *SDKExtension::GetDescription()
1.264 +{
1.265 + return GetExtensionDescription();
1.266 +}
1.267 +
1.268 +const char *SDKExtension::GetLicense()
1.269 +{
1.270 + return SMEXT_CONF_LICENSE;
1.271 +}
1.272 +
1.273 +const char *SDKExtension::GetLogTag()
1.274 +{
1.275 + return GetExtensionTag();
1.276 +}
1.277 +
1.278 +const char *SDKExtension::GetName()
1.279 +{
1.280 + return GetExtensionName();
1.281 +}
1.282 +
1.283 +const char *SDKExtension::GetURL()
1.284 +{
1.285 + return GetExtensionURL();
1.286 +}
1.287 +
1.288 +const char *SDKExtension::GetVersion()
1.289 +{
1.290 + return GetExtensionVerString();
1.291 +}
1.292 +
1.293 +bool SDKExtension::SDK_OnMetamodLoad(char *error, size_t err_max, bool late)
1.294 +{
1.295 + return true;
1.296 +}
1.297 +
1.298 +bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t err_max)
1.299 +{
1.300 + return true;
1.301 +}
1.302 +
1.303 +bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t err_max)
1.304 +{
1.305 + return true;
1.306 +}
1.307 +
1.308 +#endif
1.309 +
1.310 +/* Overload a few things to prevent libstdc++ linking */
1.311 +#if defined __linux__
1.312 +extern "C" void __cxa_pure_virtual(void)
1.313 +{
1.314 +}
1.315 +
1.316 +void *operator new(size_t size)
1.317 +{
1.318 + return malloc(size);
1.319 +}
1.320 +
1.321 +void *operator new[](size_t size)
1.322 +{
1.323 + return malloc(size);
1.324 +}
1.325 +
1.326 +void operator delete(void *ptr)
1.327 +{
1.328 + free(ptr);
1.329 +}
1.330 +
1.331 +void operator delete[](void * ptr)
1.332 +{
1.333 + free(ptr);
1.334 +}
1.335 +#endif
1.336 +