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