extensions/sdktools/extension.cpp
author Borja Ferrer <faluco@alliedmods.net>
Sat Sep 15 19:38:02 2007 +0000 (2007-09-15)
changeset 1428 1ceceba15864
parent 1330 ab94316bb52b
child 1498 e7eb59f70ff6
permissions -rw-r--r--
added amb852, create entity natives
ds@783
     1
/**
ds@783
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1233
     4
 * SourceMod SDKTools Extension
dvander@1233
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
ds@783
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
dvander@1233
    11
 * 
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
dvander@1233
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1233
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
ds@783
    28
 *
ds@783
    29
 * Version: $Id$
ds@783
    30
 */
ds@783
    31
ds@783
    32
#include "extension.h"
dvander@950
    33
#include "vcallbuilder.h"
dvander@954
    34
#include "vnatives.h"
dvander@1169
    35
#include "vhelpers.h"
ds@1240
    36
#include "vglobals.h"
faluco@1031
    37
#include "tempents.h"
ds@783
    38
ds@783
    39
/**
ds@783
    40
 * @file extension.cpp
ds@995
    41
 * @brief Implements SDK Tools extension code.
ds@783
    42
 */
ds@783
    43
faluco@1262
    44
SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, false, bool, const char *, const char *, const char *, const char *, bool, bool);
faluco@1262
    45
ds@783
    46
SDKTools g_SdkTools;		/**< Global singleton for extension's main interface */
ds@783
    47
IServerGameEnts *gameents = NULL;
faluco@1075
    48
IEngineTrace *enginetrace = NULL;
ds@1114
    49
IEngineSound *engsound = NULL;
ds@1114
    50
INetworkStringTableContainer *netstringtables = NULL;
dvander@1169
    51
IServerPluginHelpers *pluginhelpers = NULL;
ds@783
    52
IBinTools *g_pBinTools = NULL;
dvander@950
    53
IGameConfig *g_pGameConf = NULL;
faluco@1031
    54
IGameHelpers *g_pGameHelpers = NULL;
faluco@1219
    55
IServerGameClients *serverClients = NULL;
ds@1240
    56
IVoiceServer *voiceserver = NULL;
teame06@1239
    57
IPlayerInfoManager *playerinfomngr = NULL;
dvander@950
    58
HandleType_t g_CallHandle = 0;
faluco@1075
    59
HandleType_t g_TraceHandle = 0;
ds@783
    60
ds@783
    61
SMEXT_LINK(&g_SdkTools);
ds@783
    62
dvander@950
    63
extern sp_nativeinfo_t g_CallNatives[];
faluco@1031
    64
extern sp_nativeinfo_t g_TENatives[];
faluco@1075
    65
extern sp_nativeinfo_t g_TRNatives[];
ds@1114
    66
extern sp_nativeinfo_t g_StringTableNatives[];
teame06@1235
    67
extern sp_nativeinfo_t g_VoiceNatives[];
dvander@950
    68
ds@783
    69
bool SDKTools::SDK_OnLoad(char *error, size_t maxlength, bool late)
ds@783
    70
{
dvander@950
    71
	sharesys->AddDependency(myself, "bintools.ext", true, true);
dvander@950
    72
	sharesys->AddNatives(myself, g_CallNatives);
dvander@954
    73
	sharesys->AddNatives(myself, g_Natives);
faluco@1031
    74
	sharesys->AddNatives(myself, g_TENatives);
dvander@1047
    75
	sharesys->AddNatives(myself, g_SoundNatives);
faluco@1075
    76
	sharesys->AddNatives(myself, g_TRNatives);
ds@1114
    77
	sharesys->AddNatives(myself, g_StringTableNatives);
teame06@1235
    78
	sharesys->AddNatives(myself, g_VoiceNatives);
faluco@1031
    79
faluco@1031
    80
	SM_GET_IFACE(GAMEHELPERS, g_pGameHelpers);
ds@783
    81
dvander@950
    82
	if (!gameconfs->LoadGameConfigFile("sdktools.games", &g_pGameConf, error, maxlength))
dvander@950
    83
	{
dvander@950
    84
		return false;
dvander@950
    85
	}
dvander@950
    86
teame06@1235
    87
	playerhelpers->AddClientListener(&g_SdkTools);
dvander@950
    88
	g_CallHandle = handlesys->CreateType("ValveCall", this, 0, NULL, NULL, myself->GetIdentity(), NULL);
faluco@1075
    89
	g_TraceHandle = handlesys->CreateType("TraceRay", this, 0, NULL, NULL, myself->GetIdentity(), NULL);
ds@783
    90
dvander@1052
    91
	ConCommandBaseMgr::OneTimeInit(this);
dvander@1052
    92
faluco@1262
    93
	SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelInit, gamedll, this, &SDKTools::LevelInit, true);
faluco@1262
    94
ds@783
    95
	return true;
ds@783
    96
}
ds@783
    97
dvander@950
    98
void SDKTools::OnHandleDestroy(HandleType_t type, void *object)
dvander@950
    99
{
dvander@950
   100
	if (type == g_CallHandle)
dvander@950
   101
	{
dvander@950
   102
		ValveCall *v = (ValveCall *)object;
dvander@950
   103
		delete v;
faluco@1428
   104
	} else if (type == g_TraceHandle) {
faluco@1075
   105
		trace_t *tr = (trace_t *)object;
faluco@1075
   106
		delete tr;
faluco@1075
   107
	}
dvander@950
   108
}
dvander@950
   109
dvander@950
   110
void SDKTools::SDK_OnUnload()
dvander@950
   111
{
dvander@954
   112
	List<ValveCall *>::iterator iter;
dvander@954
   113
	for (iter = g_RegCalls.begin();
dvander@954
   114
		 iter != g_RegCalls.end();
dvander@954
   115
		 iter++)
dvander@954
   116
	{
dvander@954
   117
		delete (*iter);
dvander@954
   118
	}
dvander@954
   119
	g_RegCalls.clear();
dvander@1169
   120
	ShutdownHelpers();
dvander@954
   121
faluco@1031
   122
	g_TEManager.Shutdown();
faluco@1255
   123
	s_TempEntHooks.Shutdown();
faluco@1031
   124
dvander@950
   125
	gameconfs->CloseGameConfigFile(g_pGameConf);
teame06@1235
   126
	playerhelpers->RemoveClientListener(&g_SdkTools);
faluco@1262
   127
faluco@1262
   128
	SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelInit, gamedll, this, &SDKTools::LevelInit, true);
dvander@950
   129
}
dvander@950
   130
ds@783
   131
bool SDKTools::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlen, bool late)
ds@783
   132
{
dvander@1047
   133
	GET_V_IFACE_ANY(serverFactory, gameents, IServerGameEnts, INTERFACEVERSION_SERVERGAMEENTS);
dvander@1047
   134
	GET_V_IFACE_ANY(engineFactory, engsound, IEngineSound, IENGINESOUND_SERVER_INTERFACE_VERSION);
faluco@1075
   135
	GET_V_IFACE_ANY(engineFactory, enginetrace, IEngineTrace, INTERFACEVERSION_ENGINETRACE_SERVER);
ds@1114
   136
	GET_V_IFACE_ANY(engineFactory, netstringtables, INetworkStringTableContainer, INTERFACENAME_NETWORKSTRINGTABLESERVER);
dvander@1169
   137
	GET_V_IFACE_ANY(engineFactory, pluginhelpers, IServerPluginHelpers, INTERFACEVERSION_ISERVERPLUGINHELPERS);
faluco@1219
   138
	GET_V_IFACE_ANY(serverFactory, serverClients, IServerGameClients, INTERFACEVERSION_SERVERGAMECLIENTS);
teame06@1235
   139
	GET_V_IFACE_ANY(engineFactory, voiceserver, IVoiceServer, INTERFACEVERSION_VOICESERVER);
teame06@1239
   140
	GET_V_IFACE_ANY(serverFactory, playerinfomngr, IPlayerInfoManager, INTERFACEVERSION_PLAYERINFOMANAGER);
ds@783
   141
ds@783
   142
	return true;
ds@783
   143
}
ds@783
   144
ds@783
   145
void SDKTools::SDK_OnAllLoaded()
ds@783
   146
{
ds@783
   147
	SM_GET_LATE_IFACE(BINTOOLS, g_pBinTools);
ds@1065
   148
faluco@1031
   149
	g_TEManager.Initialize();
faluco@1255
   150
	s_TempEntHooks.Initialize();
ds@1240
   151
	InitializeValveGlobals();
ds@783
   152
}
ds@783
   153
ds@783
   154
bool SDKTools::QueryRunning(char *error, size_t maxlength)
ds@783
   155
{
ds@783
   156
	SM_CHECK_IFACE(BINTOOLS, g_pBinTools);
ds@783
   157
ds@783
   158
	return true;
ds@783
   159
}
dvander@1023
   160
dvander@1023
   161
bool SDKTools::QueryInterfaceDrop(SMInterface *pInterface)
dvander@1023
   162
{
dvander@1023
   163
	if (pInterface == g_pBinTools)
dvander@1023
   164
	{
dvander@1023
   165
		return false;
dvander@1023
   166
	}
dvander@1023
   167
dvander@1023
   168
	return IExtensionInterface::QueryInterfaceDrop(pInterface);
dvander@1023
   169
}
dvander@1023
   170
dvander@1023
   171
void SDKTools::NotifyInterfaceDrop(SMInterface *pInterface)
dvander@1023
   172
{
dvander@1023
   173
	List<ValveCall *>::iterator iter;
dvander@1023
   174
	for (iter = g_RegCalls.begin();
dvander@1023
   175
		iter != g_RegCalls.end();
dvander@1023
   176
		iter++)
dvander@1023
   177
	{
dvander@1023
   178
		delete (*iter);
dvander@1023
   179
	}
dvander@1023
   180
	g_RegCalls.clear();
dvander@1169
   181
	ShutdownHelpers();
dvander@1023
   182
faluco@1031
   183
	g_TEManager.Shutdown();
faluco@1255
   184
	s_TempEntHooks.Shutdown();
dvander@1023
   185
}
dvander@1052
   186
dvander@1052
   187
bool SDKTools::RegisterConCommandBase(ConCommandBase *pVar)
dvander@1052
   188
{
dvander@1052
   189
	return g_SMAPI->RegisterConCmdBase(g_PLAPI, pVar);
dvander@1052
   190
}
faluco@1262
   191
faluco@1262
   192
bool SDKTools::LevelInit(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background)
faluco@1262
   193
{
faluco@1262
   194
	const char *name;
faluco@1262
   195
	char key[32];
faluco@1262
   196
	int count, n = 1;
faluco@1262
   197
faluco@1262
   198
	if (!(name=g_pGameConf->GetKeyValue("SlapSoundCount")))
faluco@1262
   199
	{
faluco@1262
   200
		RETURN_META_VALUE(MRES_IGNORED, true);
faluco@1262
   201
	}
faluco@1262
   202
faluco@1262
   203
	count = atoi(name);
faluco@1262
   204
faluco@1262
   205
	while (n <= count)
faluco@1262
   206
	{
faluco@1262
   207
		snprintf(key, sizeof(key), "SlapSound%d", n);
faluco@1262
   208
		if ((name=g_pGameConf->GetKeyValue(key)))
faluco@1262
   209
		{
faluco@1262
   210
			engsound->PrecacheSound(name, true);
faluco@1262
   211
		}
faluco@1262
   212
		n++;
faluco@1262
   213
	}
faluco@1262
   214
faluco@1262
   215
	RETURN_META_VALUE(MRES_IGNORED, true);
faluco@1262
   216
}