extensions/tf2/extension.cpp
author Scott Ehlert <ds@alliedmods.net>
Sun Mar 30 07:00:22 2008 +0000 (2008-03-30)
changeset 1952 b7aa2b626807
child 1963 97a66409edac
permissions -rw-r--r--
Spring Cleaning, Part Ichi (1)
Various minor things done to project files
Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way)
Updated regex project file and makefile
     1 /**
     2  * vim: set ts=4 :
     3  * =============================================================================
     4  * SourceMod Counter-Strike:Source Extension
     5  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
     6  * =============================================================================
     7  *
     8  * This program is free software; you can redistribute it and/or modify it under
     9  * the terms of the GNU General Public License, version 3.0, as published by the
    10  * Free Software Foundation.
    11  * 
    12  * This program is distributed in the hope that it will be useful, but WITHOUT
    13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    14  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
    15  * details.
    16  *
    17  * You should have received a copy of the GNU General Public License along with
    18  * this program.  If not, see <http://www.gnu.org/licenses/>.
    19  *
    20  * As a special exception, AlliedModders LLC gives you permission to link the
    21  * code of this program (as well as its derivative works) to "Half-Life 2," the
    22  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
    23  * by the Valve Corporation.  You must obey the GNU General Public License in
    24  * all respects for all other code used.  Additionally, AlliedModders LLC grants
    25  * this exception to all derivative works.  AlliedModders LLC defines further
    26  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
    27  * or <http://www.sourcemod.net/license.php>.
    28  *
    29  * Version: $Id$
    30  */
    31 
    32 #include "extension.h"
    33 #include "RegNatives.h"
    34 #include "iplayerinfo.h"
    35 
    36 /**
    37  * @file extension.cpp
    38  * @brief Implement extension code here.
    39  */
    40 
    41 
    42 TF2Tools g_TF2Tools;
    43 IGameConfig *g_pGameConf = NULL;
    44 
    45 IBinTools *g_pBinTools = NULL;
    46 
    47 SMEXT_LINK(&g_TF2Tools);
    48 
    49 SendProp *playerSharedOffset;
    50 
    51 extern sp_nativeinfo_t g_TFNatives[];
    52 
    53 bool TF2Tools::SDK_OnLoad(char *error, size_t maxlength, bool late)
    54 {
    55 	sharesys->AddDependency(myself, "bintools.ext", true, true);
    56 
    57 	char conf_error[255];
    58 	if (!gameconfs->LoadGameConfigFile("sm-tf2.games", &g_pGameConf, conf_error, sizeof(conf_error)))
    59 	{
    60 		if (error)
    61 		{
    62 			snprintf(error, maxlength, "Could not read sm-tf2.games.txt: %s", conf_error);
    63 		}
    64 		return false;
    65 	}
    66 
    67 	sharesys->AddNatives(myself, g_TFNatives);
    68 	sharesys->RegisterLibrary(myself, "tf2");
    69 
    70 	playerSharedOffset = gamehelpers->FindInSendTable("CTFPlayer", "DT_TFPlayerShared");
    71 
    72 	playerhelpers->RegisterCommandTargetProcessor(this);
    73 
    74 	return true;
    75 }
    76 
    77 bool TF2Tools::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlen, bool late)
    78 {
    79 	GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
    80 
    81 	return true;
    82 }
    83 
    84 void TF2Tools::SDK_OnUnload()
    85 {
    86 	g_RegNatives.UnregisterAll();
    87 	gameconfs->CloseGameConfigFile(g_pGameConf);
    88 }
    89 
    90 void TF2Tools::SDK_OnAllLoaded()
    91 {
    92 	SM_GET_LATE_IFACE(BINTOOLS, g_pBinTools);
    93 }
    94 
    95 bool TF2Tools::QueryRunning(char *error, size_t maxlength)
    96 {
    97 	SM_CHECK_IFACE(BINTOOLS, g_pBinTools);
    98 
    99 	return true;
   100 }
   101 
   102 bool TF2Tools::QueryInterfaceDrop(SMInterface *pInterface)
   103 {
   104 	if (pInterface == g_pBinTools)
   105 	{
   106 		return false;
   107 	}
   108 
   109 	return IExtensionInterface::QueryInterfaceDrop(pInterface);
   110 }
   111 
   112 void TF2Tools::NotifyInterfaceDrop(SMInterface *pInterface)
   113 {
   114 	g_RegNatives.UnregisterAll();
   115 }
   116 
   117 size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...)
   118 {
   119 	va_list ap;
   120 	va_start(ap, fmt);
   121 	size_t len = vsnprintf(buffer, maxlength, fmt, ap);
   122 	va_end(ap);
   123 
   124 	if (len >= maxlength)
   125 	{
   126 		buffer[maxlength - 1] = '\0';
   127 		return (maxlength - 1);
   128 	}
   129 	else
   130 	{
   131 		return len;
   132 	}
   133 }
   134 
   135 bool TF2Tools::ProcessCommandTarget(cmd_target_info_t *info)
   136 {
   137 	int max_clients;
   138 	IPlayerInfo *pInfo;
   139 	unsigned int team_index = 0;
   140 	IGamePlayer *pPlayer, *pAdmin;
   141 
   142 	if ((info->flags & COMMAND_FILTER_NO_MULTI) == COMMAND_FILTER_NO_MULTI)
   143 	{
   144 		return false;
   145 	}
   146 
   147 	if (info->admin)
   148 	{
   149 		if ((pAdmin = playerhelpers->GetGamePlayer(info->admin)) == NULL)
   150 		{
   151 			return false;
   152 		}
   153 		if (!pAdmin->IsInGame())
   154 		{
   155 			return false;
   156 		}
   157 	}
   158 	else
   159 	{
   160 		pAdmin = NULL;
   161 	}
   162 
   163 	if (strcmp(info->pattern, "@red") == 0 )
   164 	{
   165 		team_index = 2;
   166 	}
   167 	else if (strcmp(info->pattern, "@blue") == 0)
   168 	{
   169 		team_index = 3;
   170 	}
   171 	else
   172 	{
   173 		return false;
   174 	}
   175 
   176 	info->num_targets = 0;
   177 
   178 	max_clients = playerhelpers->GetMaxClients();
   179 	for (int i = 1; 
   180 		 i <= max_clients && (cell_t)info->num_targets < info->max_targets; 
   181 		 i++)
   182 	{
   183 		if ((pPlayer = playerhelpers->GetGamePlayer(i)) == NULL)
   184 		{
   185 			continue;
   186 		}
   187 		if (!pPlayer->IsInGame())
   188 		{
   189 			continue;
   190 		}
   191 		if ((pInfo = pPlayer->GetPlayerInfo()) == NULL)
   192 		{
   193 			continue;
   194 		}
   195 		if (pInfo->GetTeamIndex() != (int)team_index)
   196 		{
   197 			continue;
   198 		}
   199 		if (playerhelpers->FilterCommandTarget(pAdmin, pPlayer, info->flags) 
   200 			!= COMMAND_TARGET_VALID)
   201 		{
   202 			continue;
   203 		}
   204 		info->targets[info->num_targets] = i;
   205 		info->num_targets++;
   206 	}
   207 
   208 	if (info->num_targets == 0)
   209 	{
   210 		info->reason = COMMAND_TARGET_EMPTY_FILTER;
   211 	}
   212 	else
   213 	{
   214 		info->reason = COMMAND_TARGET_VALID;
   215 	}
   216 
   217 	info->target_name_style = COMMAND_TARGETNAME_RAW;
   218 	if (team_index == 2)
   219 	{
   220 		UTIL_Format(info->target_name, info->target_name_maxlength, "Red Team");
   221 	}
   222 	else if (team_index == 3)
   223 	{
   224 		UTIL_Format(info->target_name, info->target_name_maxlength, "Blue Team");
   225 	}
   226 
   227 	return true;
   228 }
   229