public/sample_ext/smsdk_ext.cpp
author David Anderson <dvander@alliedmods.net>
Fri Feb 16 03:47:10 2007 +0000 (2007-02-16)
changeset 501 e209a7296936
parent 376 02c9ad824677
child 676 1ed65fdc194a
permissions -rw-r--r--
removed this potential feature, not useful enough
dvander@372
     1
/**
dvander@375
     2
 * vim: set ts=4 :
dvander@372
     3
 * ===============================================================
dvander@376
     4
 * SourceMod, Copyright (C) 2004-2007 AlliedModders LLC. 
dvander@376
     5
 * All rights reserved.
dvander@372
     6
 * ===============================================================
dvander@372
     7
 *
dvander@372
     8
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be used 
dvander@372
     9
 * or modified under the Terms and Conditions of its License Agreement, which is found 
dvander@372
    10
 * in LICENSE.txt.  The Terms and Conditions for making SourceMod extensions/plugins 
dvander@372
    11
 * may change at any time.  To view the latest information, see:
dvander@372
    12
 *   http://www.sourcemod.net/license.php
dvander@372
    13
 *
dvander@372
    14
 * Version: $Id$
dvander@372
    15
 */
dvander@372
    16
dvander@324
    17
#include <stdio.h>
dvander@354
    18
#include <malloc.h>
dvander@324
    19
#include "smsdk_ext.h"
dvander@324
    20
dvander@372
    21
/**
dvander@372
    22
 * @file smsdk_ext.cpp
dvander@372
    23
 * @brief Contains wrappers for making Extensions easier to write.
dvander@372
    24
 */
dvander@324
    25
dvander@372
    26
IShareSys *g_pShareSys = NULL;			/**< Share system */
dvander@372
    27
IExtension *myself = NULL;				/**< Ourself */
dvander@372
    28
IHandleSys *g_pHandleSys = NULL;		/**< Handle system */
dvander@372
    29
ISourceMod *g_pSM = NULL;				/**< SourceMod helpers */
dvander@372
    30
IForwardManager *g_pForwards = NULL;	/**< Forward system */
dvander@372
    31
dvander@372
    32
/** Exports the main interface */
dvander@324
    33
PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
dvander@324
    34
{
dvander@324
    35
	return g_pExtensionIface;
dvander@324
    36
}
dvander@324
    37
dvander@324
    38
SDKExtension::SDKExtension()
dvander@324
    39
{
dvander@324
    40
#if defined SMEXT_CONF_METAMOD
dvander@324
    41
	m_SourceMMLoaded = false;
dvander@324
    42
	m_WeAreUnloaded = false;
dvander@324
    43
	m_WeGotPauseChange = false;
dvander@324
    44
#endif
dvander@324
    45
}
dvander@324
    46
dvander@324
    47
bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t err_max, bool late)
dvander@324
    48
{
dvander@324
    49
	g_pShareSys = sys;
dvander@324
    50
	myself = me;
dvander@324
    51
dvander@324
    52
#if defined SMEXT_CONF_METAMOD
dvander@324
    53
	m_WeAreUnloaded = true;
dvander@324
    54
dvander@324
    55
	if (!m_SourceMMLoaded)
dvander@324
    56
	{
dvander@324
    57
		if (error)
dvander@324
    58
		{
dvander@324
    59
			snprintf(error, err_max, "Metamod attach failed");
dvander@324
    60
		}
dvander@324
    61
		return false;
dvander@324
    62
	}
dvander@324
    63
#endif
dvander@324
    64
dvander@324
    65
	SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
dvander@324
    66
	SM_GET_IFACE(SOURCEMOD, g_pSM);
dvander@329
    67
	SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
dvander@324
    68
dvander@324
    69
	if (SDK_OnLoad(error, err_max, late))
dvander@324
    70
	{
dvander@324
    71
#if defined SMEXT_CONF_METAMOD
dvander@324
    72
		m_WeAreUnloaded = true;
dvander@324
    73
#endif
dvander@324
    74
		return true;
dvander@324
    75
	}
dvander@324
    76
dvander@324
    77
	return false;
dvander@324
    78
}
dvander@324
    79
dvander@324
    80
bool SDKExtension::IsMetamodExtension()
dvander@324
    81
{
dvander@324
    82
#if defined SMEXT_CONF_METAMOD
dvander@324
    83
	return true;
dvander@324
    84
#else
dvander@324
    85
	return false;
dvander@324
    86
#endif
dvander@324
    87
}
dvander@324
    88
dvander@324
    89
void SDKExtension::OnExtensionPauseChange(bool state)
dvander@324
    90
{
dvander@324
    91
#if defined SMEXT_CONF_METAMOD
dvander@324
    92
	m_WeGotPauseChange = true;
dvander@324
    93
#endif
dvander@324
    94
	SDK_OnPauseChange(state);
dvander@324
    95
}
dvander@324
    96
dvander@324
    97
void SDKExtension::OnExtensionsAllLoaded()
dvander@324
    98
{
dvander@324
    99
	SDK_OnAllLoaded();
dvander@324
   100
}
dvander@324
   101
dvander@324
   102
void SDKExtension::OnExtensionUnload()
dvander@324
   103
{
dvander@324
   104
#if defined SMEXT_CONF_METAMOD
dvander@324
   105
	m_WeAreUnloaded = true;
dvander@324
   106
#endif
dvander@324
   107
	SDK_OnUnload();
dvander@324
   108
}
dvander@324
   109
dvander@324
   110
const char *SDKExtension::GetExtensionAuthor()
dvander@324
   111
{
dvander@324
   112
	return SMEXT_CONF_AUTHOR;
dvander@324
   113
}
dvander@324
   114
dvander@324
   115
const char *SDKExtension::GetExtensionDateString()
dvander@324
   116
{
dvander@324
   117
	return SMEXT_CONF_DATESTRING;
dvander@324
   118
}
dvander@324
   119
dvander@324
   120
const char *SDKExtension::GetExtensionDescription()
dvander@324
   121
{
dvander@324
   122
	return SMEXT_CONF_DESCRIPTION;
dvander@324
   123
}
dvander@324
   124
dvander@324
   125
const char *SDKExtension::GetExtensionVerString()
dvander@324
   126
{
dvander@324
   127
	return SMEXT_CONF_VERSION;
dvander@324
   128
}
dvander@324
   129
dvander@324
   130
const char *SDKExtension::GetExtensionName()
dvander@324
   131
{
dvander@324
   132
	return SMEXT_CONF_NAME;
dvander@324
   133
}
dvander@324
   134
dvander@324
   135
const char *SDKExtension::GetExtensionTag()
dvander@324
   136
{
dvander@324
   137
	return SMEXT_CONF_LOGTAG;
dvander@324
   138
}
dvander@324
   139
dvander@324
   140
const char *SDKExtension::GetExtensionURL()
dvander@324
   141
{
dvander@324
   142
	return SMEXT_CONF_URL;
dvander@324
   143
}
dvander@324
   144
dvander@324
   145
bool SDKExtension::SDK_OnLoad(char *error, size_t err_max, bool late)
dvander@324
   146
{
dvander@324
   147
	return true;
dvander@324
   148
}
dvander@324
   149
dvander@324
   150
void SDKExtension::SDK_OnUnload()
dvander@324
   151
{
dvander@324
   152
}
dvander@324
   153
dvander@324
   154
void SDKExtension::SDK_OnPauseChange(bool paused)
dvander@324
   155
{
dvander@324
   156
}
dvander@324
   157
dvander@324
   158
void SDKExtension::SDK_OnAllLoaded()
dvander@324
   159
{
dvander@324
   160
}
dvander@324
   161
dvander@324
   162
#if defined SMEXT_CONF_METAMOD
dvander@324
   163
dvander@372
   164
PluginId g_PLID = 0;						/**< Metamod plugin ID */
dvander@372
   165
ISmmPlugin *g_PLAPI = NULL;					/**< Metamod plugin API */
dvander@372
   166
SourceHook::ISourceHook *g_SHPtr = NULL;	/**< SourceHook pointer */
dvander@372
   167
ISmmAPI *g_SMAPI = NULL;					/**< SourceMM API pointer */
dvander@324
   168
dvander@372
   169
IVEngineServer *engine = NULL;				/**< IVEngineServer pointer */
dvander@372
   170
IServerGameDLL *gamedll = NULL;				/**< IServerGameDLL pointer */
dvander@324
   171
dvander@372
   172
/** Exposes the extension to Metamod */
dvander@324
   173
SMM_API void *PL_EXPOSURE(const char *name, int *code)
dvander@324
   174
{
dvander@324
   175
	if (name && !strcmp(name, PLAPI_NAME))
dvander@324
   176
	{
dvander@324
   177
		if (code)
dvander@324
   178
		{
dvander@324
   179
			*code = IFACE_OK;
dvander@324
   180
		}
dvander@324
   181
		return static_cast<void *>(g_pExtensionIface);
dvander@324
   182
	}
dvander@324
   183
dvander@324
   184
	if (code)
dvander@324
   185
	{
dvander@324
   186
		*code = IFACE_FAILED;
dvander@324
   187
	}
dvander@324
   188
dvander@324
   189
	return NULL;
dvander@324
   190
}
dvander@324
   191
dvander@324
   192
bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
dvander@324
   193
{
dvander@324
   194
	PLUGIN_SAVEVARS();
dvander@324
   195
dvander@324
   196
	GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
dvander@324
   197
	GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
dvander@324
   198
dvander@324
   199
	m_SourceMMLoaded = true;
dvander@324
   200
dvander@324
   201
	return SDK_OnMetamodLoad(error, maxlen, late);
dvander@324
   202
}
dvander@324
   203
dvander@324
   204
bool SDKExtension::Unload(char *error, size_t maxlen)
dvander@324
   205
{
dvander@324
   206
	if (!m_WeAreUnloaded)
dvander@324
   207
	{
dvander@324
   208
		if (error)
dvander@324
   209
		{
dvander@324
   210
			snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
dvander@324
   211
		}
dvander@324
   212
		return false;
dvander@324
   213
	}
dvander@324
   214
dvander@324
   215
	return SDK_OnMetamodUnload(error, maxlen);
dvander@324
   216
}
dvander@324
   217
dvander@324
   218
bool SDKExtension::Pause(char *error, size_t maxlen)
dvander@324
   219
{
dvander@324
   220
	if (!m_WeGotPauseChange)
dvander@324
   221
	{
dvander@324
   222
		if (error)
dvander@324
   223
		{
dvander@324
   224
			snprintf(error, maxlen, "This extension must be paused by SourceMod.");
dvander@324
   225
		}
dvander@324
   226
		return false;
dvander@324
   227
	}
dvander@324
   228
dvander@324
   229
	m_WeGotPauseChange = false;
dvander@324
   230
dvander@324
   231
	return SDK_OnMetamodPauseChange(true, error, maxlen);
dvander@324
   232
}
dvander@324
   233
dvander@324
   234
bool SDKExtension::Unpause(char *error, size_t maxlen)
dvander@324
   235
{
dvander@324
   236
	if (!m_WeGotPauseChange)
dvander@324
   237
	{
dvander@324
   238
		if (error)
dvander@324
   239
		{
dvander@324
   240
			snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
dvander@324
   241
		}
dvander@324
   242
		return false;
dvander@324
   243
	}
dvander@324
   244
dvander@324
   245
	m_WeGotPauseChange = false;
dvander@324
   246
dvander@324
   247
	return SDK_OnMetamodPauseChange(false, error, maxlen);
dvander@324
   248
}
dvander@324
   249
dvander@324
   250
const char *SDKExtension::GetAuthor()
dvander@324
   251
{
dvander@324
   252
	return GetExtensionAuthor();
dvander@324
   253
}
dvander@324
   254
dvander@324
   255
const char *SDKExtension::GetDate()
dvander@324
   256
{
dvander@324
   257
	return GetExtensionDateString();
dvander@324
   258
}
dvander@324
   259
dvander@324
   260
const char *SDKExtension::GetDescription()
dvander@324
   261
{
dvander@324
   262
	return GetExtensionDescription();
dvander@324
   263
}
dvander@324
   264
dvander@324
   265
const char *SDKExtension::GetLicense()
dvander@324
   266
{
dvander@324
   267
	return SMEXT_CONF_LICENSE;
dvander@324
   268
}
dvander@324
   269
dvander@324
   270
const char *SDKExtension::GetLogTag()
dvander@324
   271
{
dvander@324
   272
	return GetExtensionTag();
dvander@324
   273
}
dvander@324
   274
dvander@324
   275
const char *SDKExtension::GetName()
dvander@324
   276
{
dvander@324
   277
	return GetExtensionName();
dvander@324
   278
}
dvander@324
   279
dvander@324
   280
const char *SDKExtension::GetURL()
dvander@324
   281
{
dvander@324
   282
	return GetExtensionURL();
dvander@324
   283
}
dvander@324
   284
dvander@324
   285
const char *SDKExtension::GetVersion()
dvander@324
   286
{
dvander@324
   287
	return GetExtensionVerString();
dvander@324
   288
}
dvander@324
   289
dvander@324
   290
bool SDKExtension::SDK_OnMetamodLoad(char *error, size_t err_max, bool late)
dvander@324
   291
{
dvander@324
   292
	return true;
dvander@324
   293
}
dvander@324
   294
dvander@324
   295
bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t err_max)
dvander@324
   296
{
dvander@324
   297
	return true;
dvander@324
   298
}
dvander@324
   299
dvander@324
   300
bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t err_max)
dvander@324
   301
{
dvander@324
   302
	return true;
dvander@324
   303
}
dvander@324
   304
dvander@324
   305
#endif
dvander@354
   306
dvander@354
   307
/* Overload a few things to prevent libstdc++ linking */
dvander@354
   308
#if defined __linux__
dvander@354
   309
extern "C" void __cxa_pure_virtual(void)
dvander@354
   310
{
dvander@354
   311
}
dvander@354
   312
dvander@354
   313
void *operator new(size_t size)
dvander@354
   314
{
dvander@354
   315
	return malloc(size);
dvander@354
   316
}
dvander@354
   317
dvander@354
   318
void *operator new[](size_t size) 
dvander@354
   319
{
dvander@354
   320
	return malloc(size);
dvander@354
   321
}
dvander@354
   322
dvander@354
   323
void operator delete(void *ptr) 
dvander@354
   324
{
dvander@354
   325
	free(ptr);
dvander@354
   326
}
dvander@354
   327
dvander@354
   328
void operator delete[](void * ptr)
dvander@354
   329
{
dvander@354
   330
	free(ptr);
dvander@354
   331
}
dvander@354
   332
#endif
dvander@354
   333