pred@1963: /** pred@1963: * vim: set ts=4 : pred@1963: * ============================================================================= pred@1963: * SourceMod Team Fortress 2 Extension pred@1963: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. pred@1963: * ============================================================================= pred@1963: * pred@1963: * This program is free software; you can redistribute it and/or modify it under pred@1963: * the terms of the GNU General Public License, version 3.0, as published by the pred@1963: * Free Software Foundation. pred@1963: * pred@1963: * This program is distributed in the hope that it will be useful, but WITHOUT pred@1963: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS pred@1963: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more pred@1963: * details. pred@1963: * pred@1963: * You should have received a copy of the GNU General Public License along with pred@1963: * this program. If not, see . pred@1963: * pred@1963: * As a special exception, AlliedModders LLC gives you permission to link the pred@1963: * code of this program (as well as its derivative works) to "Half-Life 2," the pred@1963: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software pred@1963: * by the Valve Corporation. You must obey the GNU General Public License in pred@1963: * all respects for all other code used. Additionally, AlliedModders LLC grants pred@1963: * this exception to all derivative works. AlliedModders LLC defines further pred@1963: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), pred@1963: * or . pred@1963: * ds@1987: * Version: $Id$ pred@1963: */ pred@1963: pred@1963: #include "extension.h" pred@1963: #include "util.h" pred@1963: pred@1963: size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...) pred@1963: { pred@1963: va_list ap; pred@1963: va_start(ap, fmt); pred@1963: size_t len = vsnprintf(buffer, maxlength, fmt, ap); pred@1963: va_end(ap); pred@1963: pred@1963: if (len >= maxlength) pred@1963: { pred@1963: buffer[maxlength - 1] = '\0'; pred@1963: return (maxlength - 1); pred@1963: } pred@1963: else pred@1963: { pred@1963: return len; pred@1963: } pred@1963: } pred@1963: pred@1963: bool UTIL_FindDataTable(SendTable *pTable, pred@1963: const char *name, pred@1963: sm_sendprop_info_t *info, pred@1963: unsigned int offset) pred@1963: { pred@1963: const char *pname; pred@1963: int props = pTable->GetNumProps(); pred@1963: SendProp *prop; pred@1963: SendTable *table; pred@1963: pred@1963: for (int i=0; iGetProp(i); pred@1963: pred@1963: if ((table = prop->GetDataTable()) != NULL) pred@1963: { pred@1963: pname = table->GetName(); pred@1963: if (pname && strcmp(name, pname) == 0) pred@1963: { pred@1963: info->prop = prop; pred@1963: info->actual_offset = offset + info->prop->GetOffset(); pred@1963: return true; pred@1963: } pred@1963: pred@1963: if (UTIL_FindDataTable(table, pred@1963: name, pred@1963: info, pred@1963: offset + prop->GetOffset()) pred@1963: ) pred@1963: { pred@1963: return true; pred@1963: } pred@1963: } pred@1963: } pred@1963: pred@1963: return false; pred@1963: } pred@1963: pred@1963: ServerClass *UTIL_FindServerClass(const char *classname) pred@1963: { pred@1963: ServerClass *sc = gamedll->GetAllServerClasses(); pred@1963: while (sc) pred@1963: { pred@1963: if (strcmp(classname, sc->GetName()) == 0) pred@1963: { pred@1963: return sc; pred@1963: } pred@1963: sc = sc->m_pNext; pred@1963: } pred@1963: pred@1963: return NULL; pred@1963: } pred@1963: pred@1963: CBaseEntity *UTIL_GetCBaseEntity(int num, bool onlyPlayers) pred@1963: { pred@1963: edict_t *pEdict = engine->PEntityOfEntIndex(num); pred@1963: if (!pEdict || pEdict->IsFree()) pred@1963: { pred@1963: return NULL; pred@1963: } pred@1963: pred@2001: if (num > 0 && num <= playerhelpers->GetMaxClients()) pred@1963: { pred@1963: IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(pEdict); pred@1963: if (!pPlayer || !pPlayer->IsConnected()) pred@1963: { pred@1963: return NULL; pred@1963: } pred@1963: } pred@1963: else if (onlyPlayers) pred@1963: { pred@1963: return NULL; pred@1963: } pred@1963: pred@1963: IServerUnknown *pUnk; pred@1963: if ((pUnk=pEdict->GetUnknown()) == NULL) pred@1963: { pred@1963: return NULL; pred@1963: } pred@1963: pred@1963: return pUnk->GetBaseEntity(); pred@1963: }