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