Added sm_dump_classes command
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401928
This commit is contained in:
parent
b1da7e1cf8
commit
352b131c35
102
extensions/sdktools/util.h
Normal file
102
extensions/sdktools/util.h
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
/**
|
||||||
|
* vim: set ts=4 :
|
||||||
|
* =============================================================================
|
||||||
|
* SourceMod SDKTools Extension
|
||||||
|
* Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
|
||||||
|
* =============================================================================
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License, version 3.0, as published by the
|
||||||
|
* Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* As a special exception, AlliedModders LLC gives you permission to link the
|
||||||
|
* code of this program (as well as its derivative works) to "Half-Life 2," the
|
||||||
|
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
|
||||||
|
* by the Valve Corporation. You must obey the GNU General Public License in
|
||||||
|
* all respects for all other code used. Additionally, AlliedModders LLC grants
|
||||||
|
* this exception to all derivative works. AlliedModders LLC defines further
|
||||||
|
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
|
||||||
|
* or <http://www.sourcemod.net/license.php>.
|
||||||
|
*
|
||||||
|
* Version: $Id: vcallbuilder.h 1566 2007-10-14 22:12:46Z faluco $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_SOURCEMOD_UTIL_H_
|
||||||
|
#define _INCLUDE_SOURCEMOD_UTIL_H_
|
||||||
|
|
||||||
|
#include "utldict.h"
|
||||||
|
|
||||||
|
abstract_class IEntityFactory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual IServerNetworkable *Create( const char *pClassName ) = 0;
|
||||||
|
virtual void Destroy( IServerNetworkable *pNetworkable ) = 0;
|
||||||
|
virtual size_t GetEntitySize() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
class CEntityFactory : public IEntityFactory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CEntityFactory( const char *pClassName )
|
||||||
|
{
|
||||||
|
EntityFactoryDictionary()->InstallFactory( this, pClassName );
|
||||||
|
}
|
||||||
|
|
||||||
|
IServerNetworkable *Create( const char *pClassName )
|
||||||
|
{
|
||||||
|
T* pEnt = _CreateEntityTemplate((T*)NULL, pClassName);
|
||||||
|
return pEnt->NetworkProp();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Destroy( IServerNetworkable *pNetworkable )
|
||||||
|
{
|
||||||
|
if ( pNetworkable )
|
||||||
|
{
|
||||||
|
pNetworkable->Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual size_t GetEntitySize()
|
||||||
|
{
|
||||||
|
return sizeof(T);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract_class IEntityFactoryDictionary
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void InstallFactory( IEntityFactory *pFactory, const char *pClassName ) = 0;
|
||||||
|
virtual IServerNetworkable *Create( const char *pClassName ) = 0;
|
||||||
|
virtual void Destroy( const char *pClassName, IServerNetworkable *pNetworkable ) = 0;
|
||||||
|
virtual IEntityFactory *FindFactory( const char *pClassName ) = 0;
|
||||||
|
virtual const char *GetCannonicalName( const char *pClassName ) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class CEntityFactoryDictionary : public IEntityFactoryDictionary
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CEntityFactoryDictionary();
|
||||||
|
|
||||||
|
virtual void InstallFactory( IEntityFactory *pFactory, const char *pClassName );
|
||||||
|
virtual IServerNetworkable *Create( const char *pClassName );
|
||||||
|
virtual void Destroy( const char *pClassName, IServerNetworkable *pNetworkable );
|
||||||
|
virtual const char *GetCannonicalName( const char *pClassName );
|
||||||
|
void ReportEntitySizes();
|
||||||
|
|
||||||
|
private:
|
||||||
|
IEntityFactory *FindFactory( const char *pClassName );
|
||||||
|
public:
|
||||||
|
CUtlDict< IEntityFactory *, unsigned short > m_Factories;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_SOURCEMOD_UTIL_H_
|
@ -30,6 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "extension.h"
|
#include "extension.h"
|
||||||
|
#include "util.h"
|
||||||
#include "vhelpers.h"
|
#include "vhelpers.h"
|
||||||
|
|
||||||
CallHelper s_Teleport;
|
CallHelper s_Teleport;
|
||||||
@ -501,3 +502,116 @@ CON_COMMAND(sm_dump_netprops, "Dumps the networkable property table as a text fi
|
|||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined SUBPLATFORM_SECURECRT
|
||||||
|
void _ignore_invalid_parameter(
|
||||||
|
const wchar_t * expression,
|
||||||
|
const wchar_t * function,
|
||||||
|
const wchar_t * file,
|
||||||
|
unsigned int line,
|
||||||
|
uintptr_t pReserved
|
||||||
|
)
|
||||||
|
{
|
||||||
|
/* Wow we don't care, thanks Microsoft. */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CON_COMMAND(sm_dump_classes, "Dumps the class list as a text file")
|
||||||
|
{
|
||||||
|
#if !defined ORANGEBOX_BUILD
|
||||||
|
CCommand args;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (args.ArgC() < 2)
|
||||||
|
{
|
||||||
|
META_CONPRINT("Usage: sm_dump_classes <file>\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *file = args.Arg(1);
|
||||||
|
if (!file || file[0] == '\0')
|
||||||
|
{
|
||||||
|
META_CONPRINT("Usage: sm_dump_classes <file>\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ICallWrapper *pWrapper = NULL;
|
||||||
|
|
||||||
|
if (!pWrapper)
|
||||||
|
{
|
||||||
|
PassInfo retData;
|
||||||
|
retData.flags = PASSFLAG_BYVAL;
|
||||||
|
retData.size = sizeof(void *);
|
||||||
|
retData.type = PassType_Basic;
|
||||||
|
|
||||||
|
void *addr;
|
||||||
|
if (!g_pGameConf->GetMemSig("EntityFactory", &addr) || addr == NULL)
|
||||||
|
{
|
||||||
|
META_CONPRINT("Failed to locate function\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pWrapper = g_pBinTools->CreateCall(addr, CallConv_Cdecl, &retData, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void *returnData = NULL;
|
||||||
|
|
||||||
|
pWrapper->Execute(NULL, &returnData);
|
||||||
|
|
||||||
|
pWrapper->Destroy();
|
||||||
|
|
||||||
|
if (returnData == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CEntityFactoryDictionary *dict = ( CEntityFactoryDictionary * )returnData;
|
||||||
|
|
||||||
|
if ( !dict )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char path[PLATFORM_MAX_PATH];
|
||||||
|
g_pSM->BuildPath(Path_Game, path, sizeof(path), "%s", file);
|
||||||
|
|
||||||
|
FILE *fp = NULL;
|
||||||
|
if ((fp = fopen(path, "wt")) == NULL)
|
||||||
|
{
|
||||||
|
META_CONPRINTF("Could not open file \"%s\"\n", path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char buffer[80];
|
||||||
|
buffer[0] = 0;
|
||||||
|
|
||||||
|
#if defined SUBPLATFORM_SECURECRT
|
||||||
|
_invalid_parameter_handler handler = _set_invalid_parameter_handler(_ignore_invalid_parameter);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
time_t t = g_pSM->GetAdjustedTime();
|
||||||
|
size_t written = strftime(buffer, sizeof(buffer), "%d/%m/%Y", localtime(&t));
|
||||||
|
|
||||||
|
#if defined SUBPLATFORM_SECURECRT
|
||||||
|
_set_invalid_parameter_handler(handler);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fprintf(fp, "// Dump of all classes for \"%s\" as at %s\n//\n\n", g_pSM->GetGameFolderName(), buffer);
|
||||||
|
|
||||||
|
for ( int i = dict->m_Factories.First(); i != dict->m_Factories.InvalidIndex(); i = dict->m_Factories.Next( i ) )
|
||||||
|
{
|
||||||
|
IServerNetworkable *entity = dict->Create(dict->m_Factories.GetElementName(i));
|
||||||
|
ServerClass *sclass = entity->GetServerClass();
|
||||||
|
fprintf(fp,"%s - %s\n",sclass->GetName(), dict->m_Factories.GetElementName(i));
|
||||||
|
|
||||||
|
typedescription_t *datamap = gamehelpers->FindInDataMap(gamehelpers->GetDataMap(entity->GetBaseEntity()), "m_iEFlags");
|
||||||
|
|
||||||
|
int *eflags = (int *)((char *)entity->GetBaseEntity() + datamap->fieldOffset[TD_OFFSET_NORMAL]);
|
||||||
|
*eflags |= (1<<0); // EFL_KILLME
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -278,4 +278,17 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* EntityFactoryDictionary function */
|
||||||
|
"#default"
|
||||||
|
{
|
||||||
|
"Signatures"
|
||||||
|
{
|
||||||
|
"EntityFactory"
|
||||||
|
{
|
||||||
|
"library" "server"
|
||||||
|
"windows" "\xB8\x01\x00\x00\x00\x84\x2A\x2A\x2A\x2A\x2A\x75\x1D\x09\x2A\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x04\xB8\x2A\x2A\x2A\x2A\xC3"
|
||||||
|
"linux" "@_Z23EntityFactoryDictionaryv"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1679,5 +1679,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* EntityFactoryDictionary function */
|
||||||
|
"#default"
|
||||||
|
{
|
||||||
|
"Signatures"
|
||||||
|
{
|
||||||
|
"EntityFactory"
|
||||||
|
{
|
||||||
|
"library" "server"
|
||||||
|
"windows" "\xB8\x01\x00\x00\x00\x84\x2A\x2A\x2A\x2A\x2A\x75\x1D\x09\x2A\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x04\xB8\x2A\x2A\x2A\x2A\xC3"
|
||||||
|
"linux" "@_Z23EntityFactoryDictionaryv"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user