122 lines
No EOL
3.3 KiB
C++
122 lines
No EOL
3.3 KiB
C++
#include <Windows.h>
|
|
#include "sigscan.h"
|
|
#include "tier0/dbg.h"
|
|
#include "tier1.h"
|
|
#include "filesystem.h"
|
|
#include "icvar.h"
|
|
#include "igameevents.h"
|
|
#include "keyvalues.h"
|
|
#include "tier0/memdbgon.h"
|
|
|
|
#define APPFACTORY_SIG "\x8B\x44\x24\x04\x8B\x0D\x00\x00\x00\x00\x50\xE8\x00\x00\x00\x00\x8B\x4C\x24\x08\x85\xC9\x74\x09\x33\xD2\x85\xC0\x0F\x94\xC2\x89\x11\xC3"
|
|
#define APPFACTORY_MASK "xxxxxx????xx????xxxxxxxxxxxxxxxxxx"
|
|
|
|
IGameEventManager* gameeventmanager;
|
|
IFileSystem* filesystem;
|
|
ICvar* cvar;
|
|
ICvar* g_pCVar;
|
|
|
|
const char* g_pCvarFlags[] = {
|
|
"FCVAR_UNREGISTERED", "FCVAR_LAUNCHER",
|
|
"FCVAR_GAMEDLL", "FCVAR_CLIENTDLL",
|
|
"FCVAR_MATERIAL_SYSTEM", "FCVAR_PROTECTED",
|
|
"FCVAR_SPONLY", "FCVAR_ARCHIVE",
|
|
"FCVAR_NOTIFY", "FCVAR_USERINFO",
|
|
"FCVAR_PRINTABLEONLY", "FCVAR_UNLOGGED",
|
|
"FCVAR_NEVER_AS_STRING", "FCVAR_REPLICATED",
|
|
"FCVAR_CHEAT", "FCVAR_STUDIORENDER",
|
|
"FCVAR_DEMO", "FCVAR_DONTRECORD",
|
|
"FCVAR_PLUGIN", "FCVAR_DATACACHE",
|
|
"FCVAR_TOOLSYSTEM", "FCVAR_FILESYSTEM",
|
|
"FCVAR_NOT_CONNECTED", "FCVAR_SOUNDSYSTEM",
|
|
"FCVAR_ARCHIVE_XBOX", "FCVAR_INPUTSYSTEM",
|
|
"FCVAR_NETWORKSYSTEM", "FCVAR_VPHYSICS"
|
|
};
|
|
|
|
extern "C" ICvar* GetCVarIF()
|
|
{
|
|
return cvar;
|
|
}
|
|
|
|
void GetCvarFlags(ConCommandBase* pBase,char* szBuf)
|
|
{
|
|
int flags = pBase->m_nFlags&(~FCVAR_NON_ENGINE);
|
|
for(int i = 0; i < 28; i++)
|
|
{
|
|
if(!((flags>>i)&1)) continue;
|
|
//if(!pBase->IsBitSet(i)) continue;
|
|
if(!i) V_strcpy(szBuf,g_pCvarFlags[i]);
|
|
else sprintf(szBuf,"%s %s",szBuf,g_pCvarFlags[i]);
|
|
}
|
|
}
|
|
|
|
CON_COMMAND(fire_event,"Fire test event")
|
|
{
|
|
KeyValues* pEvent = new KeyValues("eventPlayerSpawnProp");
|
|
pEvent->SetString("props","maps/gm_construct.bsp");
|
|
gameeventmanager->FireEvent(pEvent);
|
|
}
|
|
|
|
class SCvarAccessor : public IConCommandBaseAccessor
|
|
{
|
|
public:
|
|
virtual bool RegisterConCommandBase(ConCommandBase* pCmd)
|
|
{
|
|
Msg("Registering %s\n",pCmd->GetName());
|
|
|
|
pCmd->AddFlags(FCVAR_PLUGIN);
|
|
pCmd->SetNext(NULL);
|
|
cvar->RegisterConCommandBase(pCmd);
|
|
return true;
|
|
}
|
|
};
|
|
static SCvarAccessor s_CvarAccessor;
|
|
|
|
DWORD WINAPI StartThread(LPVOID lpArg)
|
|
{
|
|
CreateInterfaceFn fnAppFactory;
|
|
DECLARE_SIGSCAN(fnAppFactory,"engine.dll",APPFACTORY_SIG,
|
|
APPFACTORY_MASK,0,SigScan::CSigScan::SIG_FUNCTION);
|
|
SigScan::Scan();
|
|
|
|
gameeventmanager = (IGameEventManager*)fnAppFactory(
|
|
INTERFACEVERSION_GAMEEVENTSMANAGER,0);
|
|
filesystem = (IFileSystem*)fnAppFactory(FILESYSTEM_INTERFACE_VERSION,0);
|
|
cvar = (ICvar*)fnAppFactory(VENGINE_CVAR_INTERFACE_VERSION,0);
|
|
if(!gameeventmanager || !filesystem || !cvar)
|
|
{
|
|
Warning("Linking with appfactory failed!\n");
|
|
return 1;
|
|
}
|
|
|
|
char* pFlags = (char*)malloc(1024);
|
|
|
|
ConCommandBase* pNext = cvar->GetCommands();
|
|
FileHandle_t fLog = filesystem->Open("cvardump.txt","wb","MOD");
|
|
while(pNext)
|
|
{
|
|
bool bIsCommand = pNext->IsCommand();
|
|
GetCvarFlags(pNext,pFlags);
|
|
filesystem->FPrintf(fLog,"%s %s %p %s\n",(bIsCommand?"ConCommand":"ConVar"),
|
|
pNext->GetName(),(bIsCommand
|
|
? (void*)((ConCommand*)pNext)->m_fnCommandCallback:
|
|
pNext),pFlags);
|
|
V_memset(pFlags,'\0',1024);
|
|
pNext = (ConCommandBase*)pNext->GetNext();
|
|
}
|
|
|
|
//0x18
|
|
Msg("ConCommand callback %d\n",offsetof(ConCommand,m_fnCommandCallback));
|
|
ConCommandBaseMgr::OneTimeInit(&s_CvarAccessor);
|
|
|
|
free(pFlags);
|
|
filesystem->Close(fLog);
|
|
return 0;
|
|
}
|
|
|
|
BOOL APIENTRY DllMain(HINSTANCE hDll,DWORD fdwReason,LPVOID)
|
|
{
|
|
if(fdwReason==DLL_PROCESS_ATTACH)
|
|
CreateThread(0,0,StartThread,(LPVOID)hDll,0,0);
|
|
return TRUE;
|
|
} |