public/sample_ext/sdk/smsdk_ext.cpp
author David Anderson <dvander@alliedmods.net>
Sat Jun 30 16:43:11 2007 +0000 (2007-06-30)
changeset 1028 ec73814041b4
parent 1016 a1ce1f870046
child 1090 5c54e353c019
permissions -rw-r--r--
- added IADTFactory for sdktools
- updated sample extension and sdktools sdks
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@934
    43
IPlayerManager *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
dvander@934
    48
#if defined SMEXT_ENABLE_GAMECONF
dvander@934
    49
IGameConfigManager *gameconfs = NULL;	/**< Game config manager */
dvander@934
    50
#endif //SMEXT_ENABLE_DBMANAGER
dvander@963
    51
#if defined SMEXT_ENABLE_MEMUTILS
dvander@963
    52
IMemoryUtils *memutils = NULL;
dvander@1016
    53
#endif //SMEXT_ENABLE_DBMANAGER
dvander@1016
    54
#if defined SMEXT_ENABLE_GAMEHELPERS
dvander@1016
    55
IGameHelpers *gamehelpers = NULL;
dvander@1016
    56
#endif
dvander@1016
    57
#if defined SMEXT_ENABLE_TIMERSYS
dvander@1016
    58
ITimerSystem *timersys = NULL;
dvander@963
    59
#endif
dvander@1028
    60
#if defined SMEXT_ENABLE_ADTFACTORY
dvander@1028
    61
IADTFactory *adtfactory = NULL;
dvander@1028
    62
#endif
ds@757
    63
ds@757
    64
/** Exports the main interface */
ds@757
    65
PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
ds@757
    66
{
ds@757
    67
	return g_pExtensionIface;
ds@757
    68
}
ds@757
    69
ds@757
    70
SDKExtension::SDKExtension()
ds@757
    71
{
ds@757
    72
#if defined SMEXT_CONF_METAMOD
ds@757
    73
	m_SourceMMLoaded = false;
ds@757
    74
	m_WeAreUnloaded = false;
ds@757
    75
	m_WeGotPauseChange = false;
ds@757
    76
#endif
ds@757
    77
}
ds@757
    78
ds@757
    79
bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
ds@757
    80
{
dvander@859
    81
	g_pShareSys = sharesys = sys;
ds@757
    82
	myself = me;
ds@757
    83
ds@757
    84
#if defined SMEXT_CONF_METAMOD
ds@757
    85
	m_WeAreUnloaded = true;
ds@757
    86
ds@757
    87
	if (!m_SourceMMLoaded)
ds@757
    88
	{
ds@757
    89
		if (error)
ds@757
    90
		{
ds@757
    91
			snprintf(error, maxlength, "Metamod attach failed");
ds@757
    92
		}
ds@757
    93
		return false;
ds@757
    94
	}
ds@757
    95
#endif
dvander@859
    96
	SM_GET_IFACE(SOURCEMOD, g_pSM);
dvander@859
    97
	smutils = g_pSM;
dvander@859
    98
#if defined SMEXT_ENABLE_HANDLESYS
ds@757
    99
	SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
dvander@859
   100
	handlesys = g_pHandleSys;
dvander@859
   101
#endif
dvander@859
   102
#if defined SMEXT_ENABLE_FORWARDSYS
ds@757
   103
	SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
dvander@859
   104
	forwards = g_pForwards;
dvander@859
   105
#endif
dvander@859
   106
#if defined SMEXT_ENABLE_PLAYERHELPERS
dvander@859
   107
	SM_GET_IFACE(PLAYERMANAGER, playerhelpers);
dvander@859
   108
#endif
dvander@859
   109
#if defined SMEXT_ENABLE_DBMANAGER
dvander@859
   110
	SM_GET_IFACE(DBI, dbi);
dvander@859
   111
#endif
dvander@934
   112
#if defined SMEXT_ENABLE_GAMECONF
dvander@934
   113
	SM_GET_IFACE(GAMECONFIG, gameconfs);
dvander@934
   114
#endif
dvander@963
   115
#if defined SMEXT_ENABLE_MEMUTILS
dvander@963
   116
	SM_GET_IFACE(MEMORYUTILS, memutils);
dvander@963
   117
#endif
dvander@1016
   118
#if defined SMEXT_ENABLE_GAMEHELPERS
dvander@1016
   119
	SM_GET_IFACE(GAMEHELPERS, gamehelpers);
dvander@1016
   120
#endif
dvander@1016
   121
#if defined SMEXT_ENABLE_TIMERSYS
dvander@1016
   122
	SM_GET_IFACE(TIMERSYS, timersys);
dvander@1016
   123
#endif
dvander@1028
   124
#if defined SMEXT_ENABLE_ADTFACTORY
dvander@1028
   125
	SM_GET_IFACE(ADTFACTORY, adtfactory);
dvander@1028
   126
#endif
ds@757
   127
ds@757
   128
	if (SDK_OnLoad(error, maxlength, late))
ds@757
   129
	{
ds@757
   130
#if defined SMEXT_CONF_METAMOD
ds@757
   131
		m_WeAreUnloaded = true;
ds@757
   132
#endif
ds@757
   133
		return true;
ds@757
   134
	}
ds@757
   135
ds@757
   136
	return false;
ds@757
   137
}
ds@757
   138
ds@757
   139
bool SDKExtension::IsMetamodExtension()
ds@757
   140
{
ds@757
   141
#if defined SMEXT_CONF_METAMOD
ds@757
   142
	return true;
ds@757
   143
#else
ds@757
   144
	return false;
ds@757
   145
#endif
ds@757
   146
}
ds@757
   147
ds@757
   148
void SDKExtension::OnExtensionPauseChange(bool state)
ds@757
   149
{
ds@757
   150
#if defined SMEXT_CONF_METAMOD
ds@757
   151
	m_WeGotPauseChange = true;
ds@757
   152
#endif
ds@757
   153
	SDK_OnPauseChange(state);
ds@757
   154
}
ds@757
   155
ds@757
   156
void SDKExtension::OnExtensionsAllLoaded()
ds@757
   157
{
ds@757
   158
	SDK_OnAllLoaded();
ds@757
   159
}
ds@757
   160
ds@757
   161
void SDKExtension::OnExtensionUnload()
ds@757
   162
{
ds@757
   163
#if defined SMEXT_CONF_METAMOD
ds@757
   164
	m_WeAreUnloaded = true;
ds@757
   165
#endif
ds@757
   166
	SDK_OnUnload();
ds@757
   167
}
ds@757
   168
ds@757
   169
const char *SDKExtension::GetExtensionAuthor()
ds@757
   170
{
ds@757
   171
	return SMEXT_CONF_AUTHOR;
ds@757
   172
}
ds@757
   173
ds@757
   174
const char *SDKExtension::GetExtensionDateString()
ds@757
   175
{
ds@757
   176
	return SMEXT_CONF_DATESTRING;
ds@757
   177
}
ds@757
   178
ds@757
   179
const char *SDKExtension::GetExtensionDescription()
ds@757
   180
{
ds@757
   181
	return SMEXT_CONF_DESCRIPTION;
ds@757
   182
}
ds@757
   183
ds@757
   184
const char *SDKExtension::GetExtensionVerString()
ds@757
   185
{
ds@757
   186
	return SMEXT_CONF_VERSION;
ds@757
   187
}
ds@757
   188
ds@757
   189
const char *SDKExtension::GetExtensionName()
ds@757
   190
{
ds@757
   191
	return SMEXT_CONF_NAME;
ds@757
   192
}
ds@757
   193
ds@757
   194
const char *SDKExtension::GetExtensionTag()
ds@757
   195
{
ds@757
   196
	return SMEXT_CONF_LOGTAG;
ds@757
   197
}
ds@757
   198
ds@757
   199
const char *SDKExtension::GetExtensionURL()
ds@757
   200
{
ds@757
   201
	return SMEXT_CONF_URL;
ds@757
   202
}
ds@757
   203
ds@757
   204
bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
ds@757
   205
{
ds@757
   206
	return true;
ds@757
   207
}
ds@757
   208
ds@757
   209
void SDKExtension::SDK_OnUnload()
ds@757
   210
{
ds@757
   211
}
ds@757
   212
ds@757
   213
void SDKExtension::SDK_OnPauseChange(bool paused)
ds@757
   214
{
ds@757
   215
}
ds@757
   216
ds@757
   217
void SDKExtension::SDK_OnAllLoaded()
ds@757
   218
{
ds@757
   219
}
ds@757
   220
ds@757
   221
#if defined SMEXT_CONF_METAMOD
ds@757
   222
ds@757
   223
PluginId g_PLID = 0;						/**< Metamod plugin ID */
ds@757
   224
ISmmPlugin *g_PLAPI = NULL;					/**< Metamod plugin API */
ds@757
   225
SourceHook::ISourceHook *g_SHPtr = NULL;	/**< SourceHook pointer */
ds@757
   226
ISmmAPI *g_SMAPI = NULL;					/**< SourceMM API pointer */
ds@757
   227
ds@757
   228
IVEngineServer *engine = NULL;				/**< IVEngineServer pointer */
ds@757
   229
IServerGameDLL *gamedll = NULL;				/**< IServerGameDLL pointer */
ds@757
   230
ds@757
   231
/** Exposes the extension to Metamod */
ds@757
   232
SMM_API void *PL_EXPOSURE(const char *name, int *code)
ds@757
   233
{
ds@757
   234
	if (name && !strcmp(name, PLAPI_NAME))
ds@757
   235
	{
ds@757
   236
		if (code)
ds@757
   237
		{
ds@757
   238
			*code = IFACE_OK;
ds@757
   239
		}
ds@757
   240
		return static_cast<void *>(g_pExtensionIface);
ds@757
   241
	}
ds@757
   242
ds@757
   243
	if (code)
ds@757
   244
	{
ds@757
   245
		*code = IFACE_FAILED;
ds@757
   246
	}
ds@757
   247
ds@757
   248
	return NULL;
ds@757
   249
}
ds@757
   250
ds@757
   251
bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
ds@757
   252
{
ds@757
   253
	PLUGIN_SAVEVARS();
ds@757
   254
ds@757
   255
	GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
ds@757
   256
	GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
ds@757
   257
ds@757
   258
	m_SourceMMLoaded = true;
ds@757
   259
ds@757
   260
	return SDK_OnMetamodLoad(ismm, error, maxlen, late);
ds@757
   261
}
ds@757
   262
ds@757
   263
bool SDKExtension::Unload(char *error, size_t maxlen)
ds@757
   264
{
ds@757
   265
	if (!m_WeAreUnloaded)
ds@757
   266
	{
ds@757
   267
		if (error)
ds@757
   268
		{
ds@757
   269
			snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
ds@757
   270
		}
ds@757
   271
		return false;
ds@757
   272
	}
ds@757
   273
ds@757
   274
	return SDK_OnMetamodUnload(error, maxlen);
ds@757
   275
}
ds@757
   276
ds@757
   277
bool SDKExtension::Pause(char *error, size_t maxlen)
ds@757
   278
{
ds@757
   279
	if (!m_WeGotPauseChange)
ds@757
   280
	{
ds@757
   281
		if (error)
ds@757
   282
		{
ds@757
   283
			snprintf(error, maxlen, "This extension must be paused by SourceMod.");
ds@757
   284
		}
ds@757
   285
		return false;
ds@757
   286
	}
ds@757
   287
ds@757
   288
	m_WeGotPauseChange = false;
ds@757
   289
ds@757
   290
	return SDK_OnMetamodPauseChange(true, error, maxlen);
ds@757
   291
}
ds@757
   292
ds@757
   293
bool SDKExtension::Unpause(char *error, size_t maxlen)
ds@757
   294
{
ds@757
   295
	if (!m_WeGotPauseChange)
ds@757
   296
	{
ds@757
   297
		if (error)
ds@757
   298
		{
ds@757
   299
			snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
ds@757
   300
		}
ds@757
   301
		return false;
ds@757
   302
	}
ds@757
   303
ds@757
   304
	m_WeGotPauseChange = false;
ds@757
   305
ds@757
   306
	return SDK_OnMetamodPauseChange(false, error, maxlen);
ds@757
   307
}
ds@757
   308
ds@757
   309
const char *SDKExtension::GetAuthor()
ds@757
   310
{
ds@757
   311
	return GetExtensionAuthor();
ds@757
   312
}
ds@757
   313
ds@757
   314
const char *SDKExtension::GetDate()
ds@757
   315
{
ds@757
   316
	return GetExtensionDateString();
ds@757
   317
}
ds@757
   318
ds@757
   319
const char *SDKExtension::GetDescription()
ds@757
   320
{
ds@757
   321
	return GetExtensionDescription();
ds@757
   322
}
ds@757
   323
ds@757
   324
const char *SDKExtension::GetLicense()
ds@757
   325
{
ds@757
   326
	return SMEXT_CONF_LICENSE;
ds@757
   327
}
ds@757
   328
ds@757
   329
const char *SDKExtension::GetLogTag()
ds@757
   330
{
ds@757
   331
	return GetExtensionTag();
ds@757
   332
}
ds@757
   333
ds@757
   334
const char *SDKExtension::GetName()
ds@757
   335
{
ds@757
   336
	return GetExtensionName();
ds@757
   337
}
ds@757
   338
ds@757
   339
const char *SDKExtension::GetURL()
ds@757
   340
{
ds@757
   341
	return GetExtensionURL();
ds@757
   342
}
ds@757
   343
ds@757
   344
const char *SDKExtension::GetVersion()
ds@757
   345
{
ds@757
   346
	return GetExtensionVerString();
ds@757
   347
}
ds@757
   348
ds@757
   349
bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
ds@757
   350
{
ds@757
   351
	return true;
ds@757
   352
}
ds@757
   353
ds@757
   354
bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
ds@757
   355
{
ds@757
   356
	return true;
ds@757
   357
}
ds@757
   358
ds@757
   359
bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
ds@757
   360
{
ds@757
   361
	return true;
ds@757
   362
}
ds@757
   363
ds@757
   364
#endif
ds@757
   365
ds@757
   366
/* Overload a few things to prevent libstdc++ linking */
ds@757
   367
#if defined __linux__
ds@757
   368
extern "C" void __cxa_pure_virtual(void)
ds@757
   369
{
ds@757
   370
}
ds@757
   371
ds@757
   372
void *operator new(size_t size)
ds@757
   373
{
ds@757
   374
	return malloc(size);
ds@757
   375
}
ds@757
   376
ds@757
   377
void *operator new[](size_t size) 
ds@757
   378
{
ds@757
   379
	return malloc(size);
ds@757
   380
}
ds@757
   381
ds@757
   382
void operator delete(void *ptr) 
ds@757
   383
{
ds@757
   384
	free(ptr);
ds@757
   385
}
ds@757
   386
ds@757
   387
void operator delete[](void * ptr)
ds@757
   388
{
ds@757
   389
	free(ptr);
ds@757
   390
}
ds@757
   391
#endif