3 * =============================================================================
4 * SourceMod SDKTools Extension
5 * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
6 * =============================================================================
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.
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
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/>.
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>.
32 #include "extension.h"
33 #include <sh_vector.h>
37 const char *ClassName;
41 SourceHook::CVector<TeamInfo> g_Teams;
43 bool FindTeamEntities(SendTable *pTable, const char *name)
45 int props = pTable->GetNumProps();
48 for (int i=0; i<props; i++)
50 prop = pTable->GetProp(i);
51 if (prop->GetDataTable())
53 if (strcmp(prop->GetDataTable()->GetName(), name) == 0)
57 if (FindTeamEntities(prop->GetDataTable(), name))
67 void SDKTools::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
72 for (int i=0; i<edictCount; i++)
74 edict_t *pEdict = engine->PEntityOfEntIndex(i);
75 if (!pEdict || pEdict->IsFree())
79 if (!pEdict->GetNetworkable())
84 ServerClass *pClass = pEdict->GetNetworkable()->GetServerClass();
85 if (FindTeamEntities(pClass->m_pTable, "DT_Team"))
87 SendProp *pTeamNumProp = g_pGameHelpers->FindInSendTable(pClass->GetName(), "m_iTeamNum");
89 if (pTeamNumProp != NULL)
91 int offset = pTeamNumProp->GetOffset();
92 CBaseEntity *pEnt = pEdict->GetUnknown()->GetBaseEntity();
93 int TeamIndex = *(int *)((unsigned char *)pEnt + offset);
95 if (TeamIndex >= (int)g_Teams.size())
97 g_Teams.resize(TeamIndex+1);
99 g_Teams[TeamIndex].ClassName = pClass->GetName();
100 g_Teams[TeamIndex].pEnt = pEnt;
106 static cell_t GetTeamCount(IPluginContext *pContext, const cell_t *params)
108 return g_Teams.size();
111 static cell_t GetTeamName(IPluginContext *pContext, const cell_t *params)
113 int teamindex = params[1];
114 if (teamindex > (int)g_Teams.size())
116 pContext->ThrowNativeError("Team index %d is invalid", teamindex);
119 static int offset = g_pGameHelpers->FindInSendTable(g_Teams[teamindex].ClassName, "m_szTeamname")->GetOffset();
120 char *name = (char *)((unsigned char *)g_Teams[teamindex].pEnt + offset);
122 pContext->StringToLocalUTF8(params[2], params[3], name, NULL);
127 static cell_t GetTeamScore(IPluginContext *pContext, const cell_t *params)
129 int teamindex = params[1];
130 if (teamindex > (int)g_Teams.size())
132 pContext->ThrowNativeError("Team index %d is invalid", teamindex);
135 static int offset = g_pGameHelpers->FindInSendTable(g_Teams[teamindex].ClassName, "m_iScore")->GetOffset();
137 return *(int *)((unsigned char *)g_Teams[teamindex].pEnt + offset);
140 static cell_t SetTeamScore(IPluginContext *pContext, const cell_t *params)
142 int teamindex = params[1];
143 if (teamindex > (int)g_Teams.size())
145 pContext->ThrowNativeError("Team index %d is invalid", teamindex);
148 static int offset = g_pGameHelpers->FindInSendTable(g_Teams[teamindex].ClassName, "m_iScore")->GetOffset();
149 *(int *)((unsigned char *)g_Teams[teamindex].pEnt + offset) = params[2];
154 static cell_t GetTeamClientCount(IPluginContext *pContext, const cell_t *params)
156 int teamindex = params[1];
157 if (teamindex > (int)g_Teams.size())
159 pContext->ThrowNativeError("Team index %d is invalid", teamindex);
162 SendProp *pProp = g_pGameHelpers->FindInSendTable(g_Teams[teamindex].ClassName, "\"player_array\"");
163 ArrayLengthSendProxyFn fn = pProp->GetArrayLengthProxy();
165 return fn(g_Teams[teamindex].pEnt, 0);
168 sp_nativeinfo_t g_TeamNatives[] =
170 {"GetTeamCount", GetTeamCount},
171 {"GetTeamName", GetTeamName},
172 {"GetTeamScore", GetTeamScore},
173 {"SetTeamScore", SetTeamScore},
174 {"GetTeamClientCount", GetTeamClientCount},