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