1.1 --- a/extensions/sdktools/vhelpers.cpp Tue Mar 11 23:52:56 2008 +0000
1.2 +++ b/extensions/sdktools/vhelpers.cpp Wed Mar 12 00:43:35 2008 +0000
1.3 @@ -30,6 +30,7 @@
1.4 */
1.5
1.6 #include "extension.h"
1.7 +#include "util.h"
1.8 #include "vhelpers.h"
1.9
1.10 CallHelper s_Teleport;
1.11 @@ -501,3 +502,116 @@
1.12 fclose(fp);
1.13 }
1.14
1.15 +#if defined SUBPLATFORM_SECURECRT
1.16 +void _ignore_invalid_parameter(
1.17 + const wchar_t * expression,
1.18 + const wchar_t * function,
1.19 + const wchar_t * file,
1.20 + unsigned int line,
1.21 + uintptr_t pReserved
1.22 + )
1.23 +{
1.24 + /* Wow we don't care, thanks Microsoft. */
1.25 +}
1.26 +#endif
1.27 +
1.28 +CON_COMMAND(sm_dump_classes, "Dumps the class list as a text file")
1.29 +{
1.30 +#if !defined ORANGEBOX_BUILD
1.31 + CCommand args;
1.32 +#endif
1.33 +
1.34 + if (args.ArgC() < 2)
1.35 + {
1.36 + META_CONPRINT("Usage: sm_dump_classes <file>\n");
1.37 + return;
1.38 + }
1.39 +
1.40 + const char *file = args.Arg(1);
1.41 + if (!file || file[0] == '\0')
1.42 + {
1.43 + META_CONPRINT("Usage: sm_dump_classes <file>\n");
1.44 + return;
1.45 + }
1.46 +
1.47 + ICallWrapper *pWrapper = NULL;
1.48 +
1.49 + if (!pWrapper)
1.50 + {
1.51 + PassInfo retData;
1.52 + retData.flags = PASSFLAG_BYVAL;
1.53 + retData.size = sizeof(void *);
1.54 + retData.type = PassType_Basic;
1.55 +
1.56 + void *addr;
1.57 + if (!g_pGameConf->GetMemSig("EntityFactory", &addr) || addr == NULL)
1.58 + {
1.59 + META_CONPRINT("Failed to locate function\n");
1.60 + return;
1.61 + }
1.62 +
1.63 + pWrapper = g_pBinTools->CreateCall(addr, CallConv_Cdecl, &retData, NULL, 0);
1.64 + }
1.65 +
1.66 +
1.67 + void *returnData = NULL;
1.68 +
1.69 + pWrapper->Execute(NULL, &returnData);
1.70 +
1.71 + pWrapper->Destroy();
1.72 +
1.73 + if (returnData == NULL)
1.74 + {
1.75 + return;
1.76 + }
1.77 +
1.78 + CEntityFactoryDictionary *dict = ( CEntityFactoryDictionary * )returnData;
1.79 +
1.80 + if ( !dict )
1.81 + {
1.82 + return;
1.83 + }
1.84 +
1.85 + char path[PLATFORM_MAX_PATH];
1.86 + g_pSM->BuildPath(Path_Game, path, sizeof(path), "%s", file);
1.87 +
1.88 + FILE *fp = NULL;
1.89 + if ((fp = fopen(path, "wt")) == NULL)
1.90 + {
1.91 + META_CONPRINTF("Could not open file \"%s\"\n", path);
1.92 + return;
1.93 + }
1.94 +
1.95 + char buffer[80];
1.96 + buffer[0] = 0;
1.97 +
1.98 +#if defined SUBPLATFORM_SECURECRT
1.99 + _invalid_parameter_handler handler = _set_invalid_parameter_handler(_ignore_invalid_parameter);
1.100 +#endif
1.101 +
1.102 + time_t t = g_pSM->GetAdjustedTime();
1.103 + size_t written = strftime(buffer, sizeof(buffer), "%d/%m/%Y", localtime(&t));
1.104 +
1.105 +#if defined SUBPLATFORM_SECURECRT
1.106 + _set_invalid_parameter_handler(handler);
1.107 +#endif
1.108 +
1.109 + fprintf(fp, "// Dump of all classes for \"%s\" as at %s\n//\n\n", g_pSM->GetGameFolderName(), buffer);
1.110 +
1.111 + for ( int i = dict->m_Factories.First(); i != dict->m_Factories.InvalidIndex(); i = dict->m_Factories.Next( i ) )
1.112 + {
1.113 + IServerNetworkable *entity = dict->Create(dict->m_Factories.GetElementName(i));
1.114 + ServerClass *sclass = entity->GetServerClass();
1.115 + fprintf(fp,"%s - %s\n",sclass->GetName(), dict->m_Factories.GetElementName(i));
1.116 +
1.117 + typedescription_t *datamap = gamehelpers->FindInDataMap(gamehelpers->GetDataMap(entity->GetBaseEntity()), "m_iEFlags");
1.118 +
1.119 + int *eflags = (int *)((char *)entity->GetBaseEntity() + datamap->fieldOffset[TD_OFFSET_NORMAL]);
1.120 + *eflags |= (1<<0); // EFL_KILLME
1.121 + }
1.122 +
1.123 + fclose(fp);
1.124 +
1.125 +}
1.126 +
1.127 +