added some quick commands to dump te info

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401058
This commit is contained in:
David Anderson 2007-07-07 20:45:48 +00:00
parent 998c9dc574
commit 26f93c4b50
4 changed files with 154 additions and 3 deletions

View File

@ -61,6 +61,8 @@ bool SDKTools::SDK_OnLoad(char *error, size_t maxlength, bool late)
g_CallHandle = handlesys->CreateType("ValveCall", this, 0, NULL, NULL, myself->GetIdentity(), NULL); g_CallHandle = handlesys->CreateType("ValveCall", this, 0, NULL, NULL, myself->GetIdentity(), NULL);
ConCommandBaseMgr::OneTimeInit(this);
return true; return true;
} }
@ -133,3 +135,8 @@ void SDKTools::NotifyInterfaceDrop(SMInterface *pInterface)
g_TEManager.Shutdown(); g_TEManager.Shutdown();
} }
bool SDKTools::RegisterConCommandBase(ConCommandBase *pVar)
{
return g_SMAPI->RegisterConCmdBase(g_PLAPI, pVar);
}

View File

@ -34,16 +34,20 @@
#include <IPlayerHelpers.h> #include <IPlayerHelpers.h>
#include <IGameHelpers.h> #include <IGameHelpers.h>
#include <IEngineSound.h> #include <IEngineSound.h>
#include <convar.h>
/** /**
* @brief Implementation of the SDK Tools extension. * @brief Implementation of the SDK Tools extension.
* Note: Uncomment one of the pre-defined virtual functions in order to use it. * Note: Uncomment one of the pre-defined virtual functions in order to use it.
*/ */
class SDKTools : public SDKExtension, public IHandleTypeDispatch class SDKTools :
public SDKExtension,
public IHandleTypeDispatch,
public IConCommandBaseAccessor
{ {
public: public: //public IHandleTypeDispatch
void OnHandleDestroy(HandleType_t type, void *object); void OnHandleDestroy(HandleType_t type, void *object);
public: public: //public SDKExtension
virtual bool SDK_OnLoad(char *error, size_t maxlength, bool late); virtual bool SDK_OnLoad(char *error, size_t maxlength, bool late);
virtual void SDK_OnUnload(); virtual void SDK_OnUnload();
virtual void SDK_OnAllLoaded(); virtual void SDK_OnAllLoaded();
@ -57,6 +61,8 @@ public:
//virtual bool SDK_OnMetamodUnload(char *error, size_t maxlen); //virtual bool SDK_OnMetamodUnload(char *error, size_t maxlen);
//virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlen); //virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlen);
#endif #endif
public: //IConCommandBaseAccessor
bool RegisterConCommandBase(ConCommandBase *pVar);
}; };
extern IServerGameEnts *gameents; extern IServerGameEnts *gameents;

View File

@ -26,6 +26,42 @@
TempEntityManager g_TEManager; TempEntityManager g_TEManager;
ICallWrapper *g_GetServerClass = NULL; ICallWrapper *g_GetServerClass = NULL;
CON_COMMAND(sm_print_telist, "Prints the temp entity list")
{
if (!g_TEManager.IsAvailable())
{
META_CONPRINT("The tempent portion of SDKTools failed to load.\n");
META_CONPRINT("Check that you have the latest sdktools.games.txt file!\n");
return;
}
g_TEManager.DumpList();
}
CON_COMMAND(sm_dump_teprops, "Dumps tempentity props to a file")
{
if (!g_TEManager.IsAvailable())
{
META_CONPRINT("The tempent portion of SDKTools failed to load.\n");
META_CONPRINT("Check that you have the latest sdktools.games.txt file!\n");
return;
}
int argc = engine->Cmd_Argc();
if (argc < 2)
{
META_CONPRINT("Usage: sm_dump_teprops <file>\n");
return;
}
const char *arg = engine->Cmd_Argv(1);
FILE *fp = NULL;
if (!arg || arg[0] == '\0' || ((fp = fopen(arg, "wt")) == NULL))
{
META_CONPRINTF("Could not open file \"%s\"\n", arg);
return;
}
g_TEManager.DumpProps(fp);
fclose(fp);
}
/************************* /*************************
* * * *
* Temp Entities Wrappers * * Temp Entities Wrappers *
@ -44,6 +80,11 @@ const char *TempEntityInfo::GetName()
return m_Name.c_str(); return m_Name.c_str();
} }
ServerClass *TempEntityInfo::GetServerClass()
{
return m_Sc;
}
bool TempEntityInfo::IsValidProp(const char *name) bool TempEntityInfo::IsValidProp(const char *name)
{ {
return (g_pGameHelpers->FindInSendTable(m_Sc->GetName(), name)) ? true : false; return (g_pGameHelpers->FindInSendTable(m_Sc->GetName(), name)) ? true : false;
@ -263,3 +304,95 @@ TempEntityInfo *TempEntityManager::GetTempEntityInfo(const char *name)
return te; return te;
} }
void TempEntityManager::DumpList()
{
unsigned int index = 0;
META_CONPRINT("Listing temp entities:\n");
void *iter = m_ListHead;
while (iter)
{
const char *realname = *(const char **)((unsigned char *)iter + m_NameOffs);
if (!realname)
{
break;
}
TempEntityInfo *info = GetTempEntityInfo(realname);
if (!info)
{
continue;
}
ServerClass *sc = info->GetServerClass();
META_CONPRINTF("[%02d] %s (%s)\n", index++, realname, sc->GetName());
iter = *(void **)((unsigned char *)iter + m_NextOffs);
}
META_CONPRINTF("%d tempent%s found.\n", index, (index == 1) ? " was" : "s were");
}
const char *SendPropTypeToString(SendPropType type)
{
if (type == DPT_Int)
{
return "int";
} else if (type == DPT_Float) {
return "float";
} else if (type == DPT_Vector) {
return "vector";
} else if (type == DPT_String) {
return "string";
} else if (type == DPT_Array) {
return "array";
} else if (type == DPT_DataTable) {
return "datatable";
} else {
return "unknown";
}
}
void _DumpProps(FILE *fp, SendTable *pTable)
{
SendTable *pOther;
for (int i=0; i<pTable->GetNumProps(); i++)
{
SendProp *prop = pTable->GetProp(i);
if ((pOther = prop->GetDataTable()) != NULL)
{
_DumpProps(fp, pOther);
} else {
fprintf(fp, "\t\t\t\"%s\"\t\t\"%s\"\n",
prop->GetName() ? prop->GetName() : "unknown",
SendPropTypeToString(prop->GetType()));
}
}
}
void TempEntityManager::DumpProps(FILE *fp)
{
unsigned int index = 0;
void *iter = m_ListHead;
fprintf(fp, "\"TempEnts\"\n{\n");
while (iter)
{
const char *realname = *(const char **)((unsigned char *)iter + m_NameOffs);
if (!realname)
{
break;
}
TempEntityInfo *info = GetTempEntityInfo(realname);
if (!info)
{
continue;
}
ServerClass *sc = info->GetServerClass();
fprintf(fp, "\t\"%s\"\n", sc->GetName());
fprintf(fp, "\t{\n");
fprintf(fp, "\t\t\"name\"\t\t\"%s\"\n", realname);
fprintf(fp, "\t\t\"index\"\t\t\"%d\"\n", index++);
fprintf(fp, "\t\t\"SendTable\"\n\t\t{\n");
_DumpProps(fp, sc->m_pTable);
fprintf(fp, "\t\t}\n\t}\n");
iter = *(void **)((unsigned char *)iter + m_NextOffs);
}
fprintf(fp, "}\n");
META_CONPRINTF("%d tempent%s written to file.\n", index, (index == 1) ? " was" : "s were");
}

View File

@ -28,6 +28,7 @@
#include <irecipientfilter.h> #include <irecipientfilter.h>
#include <sh_list.h> #include <sh_list.h>
#include <sh_string.h> #include <sh_string.h>
#include <stdio.h>
using namespace SourceHook; using namespace SourceHook;
@ -37,6 +38,7 @@ public:
TempEntityInfo(const char *name, void *me); TempEntityInfo(const char *name, void *me);
public: public:
const char *GetName(); const char *GetName();
ServerClass *GetServerClass();
bool IsValidProp(const char *name); bool IsValidProp(const char *name);
bool TE_SetEntData(const char *name, int value); bool TE_SetEntData(const char *name, int value);
bool TE_SetEntDataFloat(const char *name, float value); bool TE_SetEntDataFloat(const char *name, float value);
@ -61,6 +63,9 @@ public:
void Shutdown(); void Shutdown();
public: public:
TempEntityInfo *GetTempEntityInfo(const char *name); TempEntityInfo *GetTempEntityInfo(const char *name);
public:
void DumpList();
void DumpProps(FILE *fp);
private: private:
List<TempEntityInfo *> m_TEList; List<TempEntityInfo *> m_TEList;
IBasicTrie *m_TempEntInfo; IBasicTrie *m_TempEntInfo;