dvander@1169: /**
dvander@1169: * vim: set ts=4 :
ds@1330: * =============================================================================
dvander@1233: * SourceMod SDKTools Extension
dvander@1233: * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
ds@1330: * =============================================================================
dvander@1169: *
ds@1330: * This program is free software; you can redistribute it and/or modify it under
ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330: * Free Software Foundation.
dvander@1233: *
ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
ds@1330: * details.
dvander@1233: *
ds@1330: * You should have received a copy of the GNU General Public License along with
ds@1330: * this program. If not, see .
dvander@1233: *
ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in
ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants
ds@1330: * this exception to all derivative works. AlliedModders LLC defines further
ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330: * or .
dvander@1169: *
dvander@1169: * Version: $Id$
dvander@1169: */
dvander@1233:
dvander@1169: #include "extension.h"
pred@1922: #include "util.h"
dvander@1169: #include "vhelpers.h"
dvander@1169:
dvander@1169: CallHelper s_Teleport;
dvander@1169: CallHelper s_GetVelocity;
dvander@1611: CallHelper s_EyeAngles;
dvander@1169:
dvander@1628: class CTraceFilterSimple : public CTraceFilterEntitiesOnly
dvander@1628: {
dvander@1628: public:
dvander@1628: CTraceFilterSimple(const IHandleEntity *passentity): m_pPassEnt(passentity)
dvander@1628: {
dvander@1628: }
dvander@1628: virtual bool ShouldHitEntity(IHandleEntity *pServerEntity, int contentsMask)
dvander@1628: {
dvander@1628: if (pServerEntity == m_pPassEnt)
dvander@1628: {
dvander@1628: return false;
dvander@1628: }
dvander@1628: return true;
dvander@1628: }
dvander@1628: private:
dvander@1628: const IHandleEntity *m_pPassEnt;
dvander@1628: };
dvander@1628:
dvander@1169: bool SetupTeleport()
dvander@1169: {
dvander@1169: if (s_Teleport.setup)
dvander@1169: {
dvander@1169: return s_Teleport.supported;
dvander@1169: }
dvander@1169:
dvander@1169: /* Setup Teleport */
dvander@1169: int offset;
dvander@1169: if (g_pGameConf->GetOffset("Teleport", &offset))
dvander@1169: {
dvander@1169: PassInfo info[3];
dvander@1169: info[0].flags = info[1].flags = info[2].flags = PASSFLAG_BYVAL;
dvander@1169: info[0].size = info[1].size = info[2].size = sizeof(void *);
dvander@1169: info[0].type = info[1].type = info[2].type = PassType_Basic;
dvander@1169:
dvander@1169: s_Teleport.call = g_pBinTools->CreateVCall(offset, 0, 0, NULL, info, 3);
dvander@1169:
dvander@1611: if (s_Teleport.call != NULL)
dvander@1169: {
dvander@1169: s_Teleport.supported = true;
dvander@1169: }
dvander@1169: }
dvander@1169:
dvander@1169: s_Teleport.setup = true;
dvander@1169:
dvander@1169: return s_Teleport.supported;
dvander@1169: }
dvander@1169:
dvander@1169: void Teleport(CBaseEntity *pEntity, Vector *origin, QAngle *ang, Vector *velocity)
dvander@1169: {
dvander@1169: unsigned char params[sizeof(void *) * 4];
dvander@1169: unsigned char *vptr = params;
dvander@1169: *(CBaseEntity **)vptr = pEntity;
dvander@1169: vptr += sizeof(CBaseEntity *);
dvander@1169: *(Vector **)vptr = origin;
dvander@1169: vptr += sizeof(Vector *);
dvander@1169: *(QAngle **)vptr = ang;
dvander@1169: vptr += sizeof(QAngle *);
dvander@1169: *(Vector **)vptr = velocity;
dvander@1169:
dvander@1169: s_Teleport.call->Execute(params, NULL);
dvander@1169: }
dvander@1169:
dvander@1169: bool IsTeleportSupported()
dvander@1169: {
dvander@1169: return SetupTeleport();
dvander@1169: }
dvander@1169:
dvander@1169: bool SetupGetVelocity()
dvander@1169: {
dvander@1169: if (s_GetVelocity.setup)
dvander@1169: {
dvander@1169: return s_GetVelocity.supported;
dvander@1169: }
dvander@1169:
dvander@1169: int offset;
dvander@1169: if (g_pGameConf->GetOffset("GetVelocity", &offset))
dvander@1169: {
dvander@1169: PassInfo info[2];
dvander@1169: info[0].flags = info[1].flags = PASSFLAG_BYVAL;
dvander@1169: info[0].size = info[1].size = sizeof(void *);
dvander@1169: info[0].type = info[1].type = PassType_Basic;
dvander@1169:
dvander@1169: s_GetVelocity.call = g_pBinTools->CreateVCall(offset, 0, 0, NULL, info, 2);
dvander@1169:
dvander@1611: if (s_GetVelocity.call != NULL)
dvander@1169: {
dvander@1169: s_GetVelocity.supported = true;
dvander@1169: }
dvander@1169: }
dvander@1169:
dvander@1169: s_GetVelocity.setup = true;
dvander@1169:
dvander@1169: return s_GetVelocity.supported;
dvander@1169: }
dvander@1169:
dvander@1169: void GetVelocity(CBaseEntity *pEntity, Vector *velocity, AngularImpulse *angvelocity)
dvander@1169: {
dvander@1169: unsigned char params[sizeof(void *) * 3];
dvander@1169: unsigned char *vptr = params;
dvander@1169: *(CBaseEntity **)vptr = pEntity;
dvander@1169: vptr += sizeof(CBaseEntity *);
dvander@1169: *(Vector **)vptr = velocity;
dvander@1169: vptr += sizeof(Vector *);
dvander@1169: *(AngularImpulse **)vptr = angvelocity;
dvander@1169:
dvander@1169: s_GetVelocity.call->Execute(params, NULL);
dvander@1169: }
dvander@1169:
dvander@1169: bool IsGetVelocitySupported()
dvander@1169: {
dvander@1169: return SetupGetVelocity();
dvander@1169: }
dvander@1169:
dvander@1611: bool SetupGetEyeAngles()
dvander@1611: {
dvander@1611: if (s_EyeAngles.setup)
dvander@1611: {
dvander@1611: return s_EyeAngles.supported;
dvander@1611: }
dvander@1611:
dvander@1611: int offset;
dvander@1611: if (g_pGameConf->GetOffset("EyeAngles", &offset))
dvander@1611: {
dvander@1611: PassInfo info[2];
dvander@1611: info[0].flags = info[1].flags = PASSFLAG_BYVAL;
dvander@1611: info[0].size = info[1].size = sizeof(void *);
dvander@1611: info[0].type = info[1].type = PassType_Basic;
dvander@1611:
dvander@1611: s_EyeAngles.call = g_pBinTools->CreateVCall(offset, 0, 0, &info[0], &info[1], 1);
dvander@1611:
dvander@1611: if (s_EyeAngles.call != NULL)
dvander@1611: {
dvander@1611: s_EyeAngles.supported = true;
dvander@1611: }
dvander@1611: }
dvander@1611:
dvander@1611: s_EyeAngles.setup = true;
dvander@1611:
dvander@1611: return s_EyeAngles.supported;
dvander@1611: }
dvander@1611:
dvander@1611: bool GetEyeAngles(CBaseEntity *pEntity, QAngle *pAngles)
dvander@1611: {
dvander@1611: if (!IsEyeAnglesSupported())
dvander@1611: {
dvander@1611: return false;
dvander@1611: }
dvander@1611:
dvander@1611: QAngle *pRetAngle = NULL;
dvander@1611: unsigned char params[sizeof(void *)];
dvander@1611: unsigned char *vptr = params;
dvander@1611:
dvander@1611: *(CBaseEntity **)vptr = pEntity;
dvander@1611: vptr += sizeof(CBaseEntity *);
dvander@1611:
dvander@1611: s_EyeAngles.call->Execute(params, &pRetAngle);
dvander@1611:
dvander@1611: if (pRetAngle == NULL)
dvander@1611: {
dvander@1611: return false;
dvander@1611: }
dvander@1611:
dvander@1611: *pAngles = *pRetAngle;
dvander@1611:
dvander@1611: return true;
dvander@1611: }
dvander@1611:
dvander@1628: int GetClientAimTarget(edict_t *pEdict, bool only_players)
dvander@1628: {
dvander@1628: CBaseEntity *pEntity = pEdict->GetUnknown() ? pEdict->GetUnknown()->GetBaseEntity() : NULL;
dvander@1628:
dvander@1628: if (pEntity == NULL)
dvander@1628: {
dvander@1628: return -1;
dvander@1628: }
dvander@1628:
dvander@1628: Vector eye_position;
dvander@1628: QAngle eye_angles;
dvander@1628:
dvander@1628: /* Get the private information we need */
dvander@1628: serverClients->ClientEarPosition(pEdict, &eye_position);
dvander@1628: if (!GetEyeAngles(pEntity, &eye_angles))
dvander@1628: {
dvander@1628: return -2;
dvander@1628: }
dvander@1628:
dvander@1628: Vector aim_dir;
dvander@1628: AngleVectors(eye_angles, &aim_dir);
dvander@1628: VectorNormalize(aim_dir);
dvander@1628:
dvander@1628: Vector vec_end = eye_position + aim_dir * 8000;
dvander@1628:
dvander@1628: Ray_t ray;
dvander@1628: ray.Init(eye_position, vec_end);
dvander@1628:
dvander@1628: trace_t tr;
dvander@1628: CTraceFilterSimple simple(pEdict->GetIServerEntity());
dvander@1628:
dvander@1628: enginetrace->TraceRay(ray, MASK_SOLID|CONTENTS_DEBRIS|CONTENTS_HITBOX, &simple, &tr);
dvander@1628:
dvander@1628: if (tr.fraction == 1.0f || tr.m_pEnt == NULL)
dvander@1628: {
dvander@1628: return -1;
dvander@1628: }
dvander@1628:
dvander@1628: edict_t *pTarget = gameents->BaseEntityToEdict(tr.m_pEnt);
dvander@1628: if (pTarget == NULL)
dvander@1628: {
dvander@1628: return -1;
dvander@1628: }
dvander@1628:
dvander@1628: int ent_index = engine->IndexOfEdict(pTarget);
dvander@1628:
dvander@1628: IGamePlayer *pTargetPlayer = playerhelpers->GetGamePlayer(ent_index);
dvander@1628: if (pTargetPlayer != NULL && !pTargetPlayer->IsInGame())
dvander@1628: {
dvander@1628: return -1;
dvander@1628: }
dvander@1628: else if (only_players && pTargetPlayer == NULL)
dvander@1628: {
dvander@1628: return -1;
dvander@1628: }
dvander@1628:
dvander@1628: return ent_index;
dvander@1628: }
dvander@1628:
dvander@1611: bool IsEyeAnglesSupported()
dvander@1611: {
dvander@1611: return SetupGetEyeAngles();
dvander@1611: }
dvander@1611:
faluco@1769: bool GetPlayerInfo(int client, player_info_t *info)
faluco@1769: {
faluco@1769: #if defined ORANGEBOX_BUILD
faluco@1769: return engine->GetPlayerInfo(client, info);
faluco@1769: #else
faluco@1773: return (iserver) ? iserver->GetPlayerInfo(client-1, info) : false;
faluco@1769: #endif
faluco@1769: }
faluco@1769:
dvander@1169: void ShutdownHelpers()
dvander@1169: {
dvander@1169: s_Teleport.Shutdown();
dvander@1169: s_GetVelocity.Shutdown();
dvander@1169: }
dvander@1636:
dvander@1636: const char *GetDTTypeName(int type)
dvander@1636: {
dvander@1636: switch (type)
dvander@1636: {
dvander@1636: case DPT_Int:
dvander@1636: {
dvander@1636: return "integer";
dvander@1636: }
dvander@1636: case DPT_Float:
dvander@1636: {
dvander@1636: return "float";
dvander@1636: }
dvander@1636: case DPT_Vector:
dvander@1636: {
dvander@1636: return "vector";
dvander@1636: }
dvander@1636: case DPT_String:
dvander@1636: {
dvander@1636: return "string";
dvander@1636: }
dvander@1636: case DPT_Array:
dvander@1636: {
dvander@1636: return "array";
dvander@1636: }
dvander@1636: case DPT_DataTable:
dvander@1636: {
dvander@1636: return "datatable";
dvander@1636: }
dvander@1636: default:
dvander@1636: {
dvander@1636: return NULL;
dvander@1636: }
dvander@1636: }
dvander@1636:
dvander@1636: return NULL;
dvander@1636: }
dvander@1636:
dvander@1636: void UTIL_DrawSendTable_XML(FILE *fp, SendTable *pTable, int space_count)
dvander@1636: {
dvander@1636: char spaces[255];
dvander@1636:
dvander@1636: for (int i = 0; i < space_count; i++)
dvander@1636: {
dvander@1636: spaces[i] = ' ';
dvander@1636: }
dvander@1636: spaces[space_count] = '\0';
dvander@1636:
dvander@1636: const char *type_name;
dvander@1636: SendTable *pOtherTable;
dvander@1636: SendProp *pProp;
dvander@1636:
dvander@1636: fprintf(fp, " %s\n", spaces, pTable->GetName());
dvander@1636: for (int i = 0; i < pTable->GetNumProps(); i++)
dvander@1636: {
dvander@1636: pProp = pTable->GetProp(i);
dvander@1636:
dvander@1636: fprintf(fp, " %s\n", spaces, pProp->GetName());
dvander@1636:
dvander@1636: if ((type_name = GetDTTypeName(pProp->GetType())) != NULL)
dvander@1636: {
dvander@1636: fprintf(fp, " %s%s\n", spaces, type_name);
dvander@1636: }
dvander@1636: else
dvander@1636: {
dvander@1636: fprintf(fp, " %s%d\n", spaces, pProp->GetType());
dvander@1636: }
dvander@1636:
dvander@1636: fprintf(fp, " %s%d\n", spaces, pProp->GetOffset());
dvander@1636: fprintf(fp, " %s%d\n", spaces, pProp->m_nBits);
dvander@1636:
dvander@1636: if ((pOtherTable = pTable->GetProp(i)->GetDataTable()) != NULL)
dvander@1636: {
dvander@1636: UTIL_DrawSendTable_XML(fp, pOtherTable, space_count + 3);
dvander@1636: }
dvander@1636:
dvander@1636: fprintf(fp, " %s\n", spaces);
dvander@1636: }
dvander@1636: fprintf(fp, " %s\n", spaces);
dvander@1636: }
dvander@1636:
dvander@1636: void UTIL_DrawServerClass_XML(FILE *fp, ServerClass *sc)
dvander@1636: {
dvander@1636: fprintf(fp, "\n", sc->GetName());
dvander@1636: UTIL_DrawSendTable_XML(fp, sc->m_pTable, 0);
dvander@1636: fprintf(fp, "\n");
dvander@1636: }
dvander@1636:
dvander@1636: void UTIL_DrawSendTable(FILE *fp, SendTable *pTable, int level)
dvander@1636: {
dvander@1636: char spaces[255];
dvander@1636: for (int i=0; iGetName());
dvander@1636:
dvander@1636: for (int i=0; iGetNumProps(); i++)
dvander@1636: {
dvander@1636: pProp = pTable->GetProp(i);
dvander@1636: name = pProp->GetName();
dvander@1636: if (pProp->GetDataTable())
dvander@1636: {
dvander@1636: UTIL_DrawSendTable(fp, pProp->GetDataTable(), level + 1);
dvander@1636: }
dvander@1636: else
dvander@1636: {
dvander@1636: type = GetDTTypeName(pProp->GetType());
dvander@1636:
dvander@1636: if (type != NULL)
dvander@1636: {
dvander@1636: fprintf(fp,
dvander@1636: "%s-Member: %s (offset %d) (type %s) (bits %d)\n",
dvander@1636: spaces,
dvander@1636: pProp->GetName(),
dvander@1636: pProp->GetOffset(),
dvander@1636: type,
dvander@1636: pProp->m_nBits);
dvander@1636: }
dvander@1636: else
dvander@1636: {
dvander@1636: fprintf(fp,
dvander@1636: "%s-Member: %s (offset %d) (type %d) (bits %d)\n",
dvander@1636: spaces,
dvander@1636: pProp->GetName(),
dvander@1636: pProp->GetOffset(),
dvander@1636: pProp->GetType(),
dvander@1636: pProp->m_nBits);
dvander@1636: }
dvander@1636: }
dvander@1636: }
dvander@1636: }
dvander@1636:
dvander@1636: CON_COMMAND(sm_dump_netprops_xml, "Dumps the networkable property table as an XML file")
dvander@1636: {
dvander@1636: #if !defined ORANGEBOX_BUILD
dvander@1636: CCommand args;
dvander@1636: #endif
dvander@1636:
dvander@1636: if (args.ArgC() < 2)
dvander@1636: {
dvander@1636: META_CONPRINT("Usage: sm_dump_netprops_xml \n");
dvander@1636: return;
dvander@1636: }
dvander@1636:
dvander@1636: const char *file = args.Arg(1);
dvander@1636: if (!file || file[0] == '\0')
dvander@1636: {
dvander@1636: META_CONPRINT("Usage: sm_dump_netprops_xml \n");
dvander@1636: return;
dvander@1636: }
dvander@1636:
dvander@1636: char path[PLATFORM_MAX_PATH];
dvander@1636: g_pSM->BuildPath(Path_Game, path, sizeof(path), "%s", file);
dvander@1636:
dvander@1636: FILE *fp = NULL;
dvander@1636: if ((fp = fopen(path, "wt")) == NULL)
dvander@1636: {
dvander@1636: META_CONPRINTF("Could not open file \"%s\"\n", path);
dvander@1636: return;
dvander@1636: }
dvander@1636:
dvander@1636: fprintf(fp, "\n\n");
dvander@1636: fprintf(fp, "\n\n", g_pSM->GetGameFolderName());
dvander@1636:
dvander@1636: ServerClass *pBase = gamedll->GetAllServerClasses();
dvander@1636: while (pBase != NULL)
dvander@1636: {
dvander@1636: UTIL_DrawServerClass_XML(fp, pBase);
dvander@1636: pBase = pBase->m_pNext;
dvander@1636: }
dvander@1636:
dvander@1636: fclose(fp);
dvander@1636: }
dvander@1636:
dvander@1636: CON_COMMAND(sm_dump_netprops, "Dumps the networkable property table as a text file")
dvander@1636: {
dvander@1636: #if !defined ORANGEBOX_BUILD
dvander@1636: CCommand args;
dvander@1636: #endif
dvander@1636:
dvander@1636: if (args.ArgC() < 2)
dvander@1636: {
dvander@1636: META_CONPRINT("Usage: sm_dump_netprops \n");
dvander@1636: return;
dvander@1636: }
dvander@1636:
dvander@1636: const char *file = args.Arg(1);
dvander@1636: if (!file || file[0] == '\0')
dvander@1636: {
dvander@1636: META_CONPRINT("Usage: sm_dump_netprops \n");
dvander@1636: return;
dvander@1636: }
dvander@1636:
dvander@1636: char path[PLATFORM_MAX_PATH];
dvander@1636: g_pSM->BuildPath(Path_Game, path, sizeof(path), "%s", file);
dvander@1636:
dvander@1636: FILE *fp = NULL;
dvander@1636: if ((fp = fopen(path, "wt")) == NULL)
dvander@1636: {
dvander@1636: META_CONPRINTF("Could not open file \"%s\"\n", path);
dvander@1636: return;
dvander@1636: }
dvander@1636:
dvander@1636: fprintf(fp, "// Dump of all network properties for \"%s\" follows\n//\n\n", g_pSM->GetGameFolderName());
dvander@1636:
dvander@1636: ServerClass *pBase = gamedll->GetAllServerClasses();
dvander@1636: while (pBase != NULL)
dvander@1636: {
dvander@1640: fprintf(fp, "%s:\n", pBase->GetName());
dvander@1636: UTIL_DrawSendTable(fp, pBase->m_pTable, 1);
dvander@1636: pBase = pBase->m_pNext;
dvander@1636: }
dvander@1636:
dvander@1636: fclose(fp);
dvander@1636: }
dvander@1636:
pred@1922: #if defined SUBPLATFORM_SECURECRT
pred@1922: void _ignore_invalid_parameter(
pred@1922: const wchar_t * expression,
pred@1922: const wchar_t * function,
pred@1922: const wchar_t * file,
pred@1922: unsigned int line,
pred@1922: uintptr_t pReserved
pred@1922: )
pred@1922: {
pred@1922: /* Wow we don't care, thanks Microsoft. */
pred@1922: }
pred@1922: #endif
pred@1922:
pred@1922: CON_COMMAND(sm_dump_classes, "Dumps the class list as a text file")
pred@1922: {
pred@1922: #if !defined ORANGEBOX_BUILD
pred@1922: CCommand args;
pred@1922: #endif
pred@1922:
pred@1922: if (args.ArgC() < 2)
pred@1922: {
pred@1922: META_CONPRINT("Usage: sm_dump_classes \n");
pred@1922: return;
pred@1922: }
pred@1922:
pred@1922: const char *file = args.Arg(1);
pred@1922: if (!file || file[0] == '\0')
pred@1922: {
pred@1922: META_CONPRINT("Usage: sm_dump_classes \n");
pred@1922: return;
pred@1922: }
pred@1922:
pred@1922: ICallWrapper *pWrapper = NULL;
pred@1922:
pred@1922: if (!pWrapper)
pred@1922: {
pred@1922: PassInfo retData;
pred@1922: retData.flags = PASSFLAG_BYVAL;
pred@1922: retData.size = sizeof(void *);
pred@1922: retData.type = PassType_Basic;
pred@1922:
pred@1922: void *addr;
pred@1922: if (!g_pGameConf->GetMemSig("EntityFactory", &addr) || addr == NULL)
pred@1922: {
pred@1922: META_CONPRINT("Failed to locate function\n");
pred@1922: return;
pred@1922: }
pred@1922:
pred@1922: pWrapper = g_pBinTools->CreateCall(addr, CallConv_Cdecl, &retData, NULL, 0);
pred@1922: }
pred@1922:
pred@1922:
pred@1922: void *returnData = NULL;
pred@1922:
pred@1922: pWrapper->Execute(NULL, &returnData);
pred@1922:
pred@1922: pWrapper->Destroy();
pred@1922:
pred@1922: if (returnData == NULL)
pred@1922: {
pred@1922: return;
pred@1922: }
pred@1922:
pred@1922: CEntityFactoryDictionary *dict = ( CEntityFactoryDictionary * )returnData;
pred@1922:
pred@1922: if ( !dict )
pred@1922: {
pred@1922: return;
pred@1922: }
pred@1922:
pred@1922: char path[PLATFORM_MAX_PATH];
pred@1922: g_pSM->BuildPath(Path_Game, path, sizeof(path), "%s", file);
pred@1922:
pred@1922: FILE *fp = NULL;
pred@1922: if ((fp = fopen(path, "wt")) == NULL)
pred@1922: {
pred@1922: META_CONPRINTF("Could not open file \"%s\"\n", path);
pred@1922: return;
pred@1922: }
pred@1922:
pred@1922: char buffer[80];
pred@1922: buffer[0] = 0;
pred@1922:
pred@1922: #if defined SUBPLATFORM_SECURECRT
pred@1922: _invalid_parameter_handler handler = _set_invalid_parameter_handler(_ignore_invalid_parameter);
pred@1922: #endif
pred@1922:
pred@1922: time_t t = g_pSM->GetAdjustedTime();
pred@1922: size_t written = strftime(buffer, sizeof(buffer), "%d/%m/%Y", localtime(&t));
pred@1922:
pred@1922: #if defined SUBPLATFORM_SECURECRT
pred@1922: _set_invalid_parameter_handler(handler);
pred@1922: #endif
pred@1922:
pred@1922: fprintf(fp, "// Dump of all classes for \"%s\" as at %s\n//\n\n", g_pSM->GetGameFolderName(), buffer);
pred@1922:
pred@1922: for ( int i = dict->m_Factories.First(); i != dict->m_Factories.InvalidIndex(); i = dict->m_Factories.Next( i ) )
pred@1922: {
pred@1922: IServerNetworkable *entity = dict->Create(dict->m_Factories.GetElementName(i));
pred@1922: ServerClass *sclass = entity->GetServerClass();
pred@1922: fprintf(fp,"%s - %s\n",sclass->GetName(), dict->m_Factories.GetElementName(i));
pred@1922:
pred@1922: typedescription_t *datamap = gamehelpers->FindInDataMap(gamehelpers->GetDataMap(entity->GetBaseEntity()), "m_iEFlags");
pred@1922:
pred@1922: int *eflags = (int *)((char *)entity->GetBaseEntity() + datamap->fieldOffset[TD_OFFSET_NORMAL]);
pred@1922: *eflags |= (1<<0); // EFL_KILLME
pred@1922: }
pred@1922:
pred@1922: fclose(fp);
pred@1922:
pred@1922: }
pred@1922:
pred@1922: