mcommand compile error

Results 1 to 8 of 8
  1. #1
    Member gunzhelp is offline
    MemberRank
    Jan 2011 Join Date
    90Posts

    mcommand compile error

    I compli mcommand.dll with file:

    MCommand.h
    MCommandParameters.h
    Addresses.h
    Enum.h

    Empathy.h :
    auto command = MCommand::Create(0xD136);
    auto file = new MCommandParameterString(argv[1]);

    command->AddParameter(file);
    MCommand::Post(command);
    MUID.h :
    if (pCommand->m_pCommandDesc->m_nCommandId == 0x515)
    {
    MUID uidPlayer;
    char szStage[256];
    bool isPrivate;
    char szPassword[64];

    pCommand->GetParameter(&uidPlayer, 0, MPT_MUID, -1);

    if (uidPlayer.uidHigh != pCommand->m_uidSender.uidHigh)
    {
    instance->DisconnectObject(&uidPlayer);
    return false;
    }

    if (!pCommand->GetParameter(szStage, 1, MPT_STRING, 256) ||
    !pCommand->GetParameter(&isPrivate, 2, MPT_BOOL, -1) ||
    !pCommand->GetParameter(szPassword, 3, MPT_STRING, 64))
    {
    return false;
    }

    instance->OnStageCreate(&uidPlayer, szStage, isPrivate, szPassword);
    return true;
    }
    and error:

    1>------ Build started: Project: gunz_test, Configuration: Debug Win32 ------
    1>LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12
    1>C:\Users\test\Documents\Visual Studio 2010\Projects\gunz_test\Debug\gunz_test.dll : fatal error LNK1120: 1 unresolved externals
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

    please help me, thanks.

    source (http://forum.ragezone.com/f245/using...d-07-a-694379/)
    Last edited by gunzhelp; 09-02-11 at 05:28 PM.


  2. #2
    Wait wut PenguinGuy is offline
    MemberRank
    Apr 2010 Join Date
    United StatesLocation
    765Posts

    Re: mcommand compli error

    The compile error is because you didn't delete DllMain.cpp from your project. However, even if you make it compile, it won't work at all due to OnStageCreate and DisconnectObject isn't defined.

  3. #3
    Member gunzhelp is offline
    MemberRank
    Jan 2011 Join Date
    90Posts

    Re: mcommand compli error

    Quote Originally Posted by Your Master View Post
    The compile error is because you didn't delete DllMain.cpp from your project. However, even if you make it compile, it won't work at all due to OnStageCreate and DisconnectObject isn't defined.
    Thank you verry much. My project don't have DllMain.cpp.

    I want compli this dll to capture all command type of GM/Admin in game. Can you help me this dll :( ?

  4. #4
    Wait wut PenguinGuy is offline
    MemberRank
    Apr 2010 Join Date
    United StatesLocation
    765Posts

    Re: mcommand compli error

    Quote Originally Posted by gunzhelp View Post
    Thank you verry much. My project don't have DllMain.cpp.

    I want compli this dll to capture all command type of GM/Admin in game. Can you help me this dll :( ?
    You wish to capture all the Admin / Game Master commands?
    Such as, in example, I use /admin_wall, you want it to log it to a file, correct?

  5. #5
    Member gunzhelp is offline
    MemberRank
    Jan 2011 Join Date
    90Posts

    Re: mcommand compli error

    Yes, it correct. I want it.

  6. #6
    Member gunzhelp is offline
    MemberRank
    Jan 2011 Join Date
    90Posts

    Re: mcommand compli error

    Quote Originally Posted by Your Master View Post
    You wish to capture all the Admin / Game Master commands?
    Such as, in example, I use /admin_wall, you want it to log it to a file, correct?
    Please help me :(

  7. #7
    Wait wut PenguinGuy is offline
    MemberRank
    Apr 2010 Join Date
    United StatesLocation
    765Posts

    Re: mcommand compile error

    OK, I will give you an example.

    MCommand.cpp
    Code:
    #include <windows.h>
    #include <stdio.h>
    #include <fstream>
    #include "MCommand.h"
    #include "detours.h"
    #include "CDetour.h"
    
    #pragma comment( lib, "CDetour" )
    
    std::ofstream File;
    
    CDetour MMatchServerOnCommand;
    bool __stdcall MMatchServerOnCommandHook( MCommand* pCmd )
    {
    	switch( pCmd->m_pCommandDesc->m_nCommandId )
    	{
    		//! You will need to replace the "0x00" with the Packet ID's of each function
    		//! you wish to log. I remembered 1 Packet ID, which is /admin_wall, which is below
    		//! these comments.
    		case 0x1F5:
    		{
    			char szbuffer[1024];
    			sprintf_s( szBuffer, "[%d] : Announcement", pCmd->m_uidSender.uidHigh );
    			File << szBuffer;
    
    			break;
    		}
    
    		case 0x00:
    		{
    
    			break;
    		}
    
    		case 0x00:
    		{
    
    			break;
    		}
    
    		default:
    			break;
    	}
    
    	MMatchServerOnCommand.Org( pCmd );
    	return false;
    }
    
    bool Setup( )
    {
    	File.open( "CommandsLog.txt", std::ios::out | std::ios::ate );
    	if( File == NULL )
    	{
    		MessageBox( NULL, "Failed to open CommandsLog.txt", "Error", MB_OK | MB_ICONEXCLAMATION );
    		return false;
    	}
    
    	//! To log to the file, you do this
    	//- char szBuffer[1024];
    	//- sprintf_s( szBuffer, "%d %d", Stuff, Stuff2 );
    	//- File << szBuffer;
    	//
    	//! And it will log to it.
    
    	return true;
    }
    
    bool __stdcall DllMain( HInstance hInstance, DWORD dwReason, LPVOID lpReserved )
    {
    	if( dwReason == DLL_PROCESS_ATTACH )
    	{
    		Setup( );
    
    		MMatchServerOnCommand.Detour( (PBYTE)MMatchServer__OnCommandAddress, (PBYTE)MMatchServerOnCommandHook );
    		MMatchServerOnCommand.Apply( );
    	}
    
    	if( dwReason == DLL_PROCESS_ATTACH )
    	{
    		File.close( );
    		MMatchServerOnCommand.Remove( );
    	}
    
    
    	return true;
    }
    MCommand.h
    Code:
    #include <vector>
    #include <list>
    
    //! FIND THIS ADDRESSES
    const unsigned long MMatchServer__OnCommandAddress = 0x00;
    const unsigned long MAddSharedCommandTableAddress = 0x00;
    const unsigned long ZNewCMDAddress = 0x00;
    const unsigned long MCommand__AddParameterAddress = 0x00;
    const unsigned long MCommand__GetParameterAddress = 0x00;
    const unsigned long MCommand__GetParameterAddress2 = 0x00;
    const unsigned long MCommandDesc__MCommandDescAddress = 0x00;
    const unsigned long MCommandParameterDesc__MCommandParameterDescAddress = 0x00;
    const unsigned long MCommandManager__AddCommandDescAddress = 0x00;
    const unsigned long MCommandDesc__AddParameterDescAddress = 0x00;
    const unsigned long MCommandParameterInt__MCommandParameterIntAddress = 0x00;
    const unsigned long MCommandParameterUInt__MCommandParameterUIntAddress = 0x00;
    const unsigned long MCommandParameterString__MCommandParameterStringAddress = 0x00;
    const unsigned long MCommandParameterFloat__MCommandParameterFloatAddress = 0x00;
    const unsigned long MCommandParameterMUID__MCommandParameterMUIDAddress = 0x00;
    const unsigned long MCommandParameterBlob__MCommandParameterBlobAddress = 0x00;
    
    enum MCommandParameterType
    {
        MPT_INT,
        MPT_UINT,
        MPT_FLOAT,
        MPT_BOOL,
        MPT_STRING,
        MPT_VECTOR,
        MPT_POS,
        MPT_DIR,
        MPT_COLOR,
        MPT_MUID,
        MPT_BLOB,
        MPT_CHAR,
        MPT_UCHAR,
        MPT_SHORT,
        MPT_USHORT,
        MPT_INT64,
        MPT_UINT64,
        MPT_SVECTOR
    };
    
    struct MUID
    {
    	unsigned long uidLow;
    	unsigned long uidHigh;
    };
    
    struct MCommandParameterDesc;
    struct MCommandParameterInt;
    struct MCommandParameterUInt;
    struct MCommandParameterString;
    struct MCommandParameterFloat;
    struct MCommandParameterMUID;
    struct MCommandParameterBlob;
    
    typedef MCommandParameterDesc* (__thiscall* MCommandParameterDescTypedef)(MCommandParameterDesc*, unsigned long, const char*);
    typedef MCommandParameterInt* (__thiscall* MCommandParameterIntTypedef) (MCommandParameterInt*, int);
    typedef MCommandParameterUInt* (__thiscall* MCommandParameterUIntTypedef) (MCommandParameterUInt*, unsigned long);
    typedef MCommandParameterString* (__thiscall* MCommandParameterStringTypedef) (MCommandParameterString*, char*);
    typedef MCommandParameterFloat* (__thiscall* MCommandParameterFloatTypedef) (MCommandParameterFloat*, float);
    typedef MCommandParameterMUID* (__thiscall* MCommandParameterMUIDTypedef) (MCommandParameterMUID*, MUID*);
    typedef MCommandParameterBlob* (__thiscall* MCommandParameterBlobTypedef) (MCommandParameterBlob*, LPVOID, int);
    
    MCommandParameterDescTypedef MCommandParameterDescConstructor = reinterpret_cast<MCommandParameterDescTypedef>(MCommandParameterDesc__MCommandParameterDescAddress);
    MCommandParameterIntTypedef MCommandParameterIntConstructor = reinterpret_cast<MCommandParameterIntTypedef>(MCommandParameterInt__MCommandParameterIntAddress);
    MCommandParameterUIntTypedef MCommandParameterUIntConstructor = reinterpret_cast<MCommandParameterUIntTypedef>(MCommandParameterUInt__MCommandParameterUIntAddress);
    MCommandParameterStringTypedef MCommandParameterStringConstructor = reinterpret_cast<MCommandParameterStringTypedef>(MCommandParameterString__MCommandParameterStringAddress);
    MCommandParameterFloatTypedef MCommandParameterFloatConstructor = reinterpret_cast<MCommandParameterFloatTypedef>(MCommandParameterFloat__MCommandParameterFloatAddress);
    MCommandParameterMUIDTypedef MCommandParameterMUIDConstructor = reinterpret_cast<MCommandParameterMUIDTypedef>(MCommandParameterMUID__MCommandParameterMUIDAddress);
    MCommandParameterBlobTypedef MCommandParameterBlobConstructor = reinterpret_cast<MCommandParameterBlobTypedef>(MCommandParameterBlob__MCommandParameterBlobAddress);
    
    struct MCommandParameterDesc
    {
        LPVOID m_pPolymoprhism;
        unsigned long m_nParamType;
        char m_szDescription[64];
        std::vector<LPVOID> m_pParameterConditions;
    
        MCommandParameterDesc(unsigned long type, const char* desc)
        {
            MCommandParameterDescConstructor(this, type, desc);
        }
    };
    
    struct MCommandParameter
    {
        LPVOID m_pPolymoprhism;
        unsigned long m_nParamType;
    };
    
    struct MCommandParameterInt : public MCommandParameter
    {
        int m_Value;
    
        MCommandParameterInt(int value)
        {
            MCommandParameterIntConstructor (this, value);
        }
    };
    
    struct MCommandParameterUInt : public MCommandParameter
    {
        unsigned long m_Value;
    
        MCommandParameterUInt(unsigned long value)
        {
            MCommandParameterUIntConstructor (this, value);
        }
    };
    
    struct MCommandParameterString : public MCommandParameter
    {
        char* m_Value;
    
        MCommandParameterString(char* value)
        {
            MCommandParameterStringConstructor (this, value);
        }
    };
    
    struct MCommandParameterMUID : public MCommandParameter
    {
        MUID m_Value;
    
        MCommandParameterMUID(MUID* value)
        {
            MCommandParameterMUIDConstructor (this, value);
        }
    };
    
    struct MCommandParameterBlob : public MCommandParameter
    {
        char* m_Value;
        int m_nSize;
    
        static void MakeBlobHeader(char* data, int elementCount, int elementSize)
        {    
            int total = (elementCount * elementSize) + 8;
    
            data = new char[total+4];
            memcpy(data, &total, 4);
            memcpy(data+4, &elementSize, 4);
            memcpy(data+8, &elementCount, 4);
        }
    
        static char* MMakeBlobArray(int nOneBlobSize, int nBlobCount)
        {
            char *result;
            
            result = new char[(nBlobCount * nOneBlobSize + 8)];
            *((DWORD *)result + 1) = nBlobCount;
            *(DWORD *)result = nOneBlobSize;
            return result;
        }
    
    
        static char *MGetBlobArrayElement(char *pBlob, unsigned long i)
        {
            char *result;
          
            if (i < 0 || i >= *((DWORD *)pBlob + 1))
              result = 0;
            else
              result = pBlob + (i * *(DWORD *)pBlob + 8);
          
            return result;
        }
    
    
        MCommandParameterBlob(LPVOID value, int size)
        {
            MCommandParameterBlobConstructor (this, value, size);
        }
    };
    
    struct MCommandDesc;
    
    typedef MCommandDesc* (__thiscall* MCommandDescTypedef)(MCommandDesc*, unsigned long, const char*, const char*, int);
    MCommandDescTypedef MCommandDescConstructor = reinterpret_cast<MCommandDescTypedef>(MCommandDesc__MCommandDescAddress);
    
    
    struct MCommandManager
    {
        void AddCommandDesc(MCommandDesc* command)
        {
            ((void (__thiscall*)(LPVOID, MCommandDesc*))MCommandManager__AddCommandDescAddress) (this, command);
        }
    };
    
    
    struct MCommandDesc
    {
        LPVOID m_pPolymoprhism;
        unsigned long m_nCommandId;
        char m_szName[256];
        char m_szDescription[256];
        unsigned long m_nFlag;
        std::vector<MCommandParameterDesc*> m_pParameterDescs;
    
        MCommandDesc(unsigned long commandId, const char* name, const char* description, unsigned long flag)
        {
            MCommandDescConstructor (this, commandId, name, description, flag);
        }
    
        void AddParamDesc(MCommandParameterDesc* param)
        {
            ((void (__thiscall*)(LPVOID, MCommandParameterDesc*))MCommandDesc__AddParameterDescAddress) (this, param);
        }
    };
    
    struct MCommand
    {
        LPVOID CMemPool;
        MCommand* m_pNextCommand;
        MUID m_uidSender;
        MUID m_uidReceiver;
        MCommandDesc* m_pCommandDesc;
        std::vector<MCommandParameter*> m_pCommandParams;
        BYTE m_nSerialNumber;
    
        bool AddParameter(MCommandParameter* param)
        {
            return ((bool (__thiscall *)(LPVOID,MCommandParameter*))MCommand__AddParameterAddress) (this, param);
        }
    
        bool GetParameter(void *pValue, int i, MCommandParameterType type, int bufferSize)
        {
            return ((bool (__thiscall *)(LPVOID,LPVOID,int,MCommandParameterType,int))MCommand__GetParameterAddress) (this, pValue, i, type, bufferSize);
        }
    
        MCommandParameter* GetParameter(unsigned long i)
        {
            return ((MCommandParameter* (__thiscall*)(LPVOID, unsigned long))MCommand__GetParameterAddress2)(this, i);
        }
        static MCommand* Create(unsigned long packetId)
        {
            return ((MCommand* (__cdecl*)(unsigned long))ZNewCMDAddress)(packetId);
        }
    };
    
    struct MPacketHeader
    {
        unsigned long nMsg;
        unsigned long nSize;
        unsigned long nCheckSum;
    };
    
    struct MPacketCrypterKey
    {
        char szKey[32];
    };
    
    struct MPacketCrypter
    {
        LPVOID m_pPolymoprhism;
        MPacketCrypterKey m_Key;
    };
    
    struct MCommandBuilder
    {
        LPVOID m_pPolymoprhism;
        MUID m_uidSender;
        MUID m_uidReceiver;
        MCommandManager* m_pCommandManager;
        char m_Buffer[0x4000];
        unsigned long m_nBufferNext;
        std::list<MCommand*> m_CommandList;
        std::list<MPacketHeader*> m_NetCmdList;
        MPacketCrypter* m_pPacketCrypter;
    };
    You will need to find the addresses for MatchServer, as well as finish off the MMatchServerOnCommandHook function, which I nicely placed some comments to help you.
    Oh, you will also need CDetour's library as well as Microsoft's Detours 1.5.

    Now, I didn't make it log the characters name nor the time. I'm in a bit too much of pain to continue coding at this time, the rest is up to you.
    Last edited by PenguinGuy; 20-02-11 at 01:44 AM.

  8. #8
    Member gunzhelp is offline
    MemberRank
    Jan 2011 Join Date
    90Posts

    Re: mcommand compile error

    Code:
    #define USE_LOG 1
    
    #ifndef fopen
    #include <stdio.h>
    #endif
    
    #ifdef USE_LOG
    #define Put(Text) fputs(Text "\n", File);
    #define Log( Name , Offset )fprintf( File , Name "\t:\t%.8X\n" , Offset );
    #define End(File) fclose(File);
    #endif
    
    #ifndef CODE_BEGIN
    #define CODE_BEGIN 0x00410000
    #define CODE_END 0x005C5000
    #define CODE_SIZE CODE_END - CODE_BEGIN
    #endif
    
    #ifndef uint32_t
    #include <stdint.h>
    #endif
    
    #ifndef WILDCARD
    #define WILDCARD 0xEE
    #define NULL_BYTE 0xCD
    #endif
    
    
    __forceinline bool __fastcall CompareByteArray(unsigned char* pSrc, unsigned char* pData, uint32_t nSize)
    {
    	if (!pSrc && !pData)
    		return true;
    
    	if (!pSrc || !pData)
    		return false;
    
    	for (uint32_t i = 0; i < nSize; ++i)
    		if (pSrc[i] != pData[i])
    			if(pData[i] != NULL_BYTE && pSrc[i] != 0)
    				if (pData[i] != WILDCARD)
    					return false;
    
    	return true;
    }
    
    
    
    uint32_t Scanner(char* pSignature)
    {
    	for (uint32_t i = 0; i < CODE_SIZE; ++i)
    		if (CompareByteArray ((unsigned char*)(CODE_BEGIN + i), (unsigned char*)pSignature, strlen(pSignature)))
    			return CODE_BEGIN + i;
    
    	return 0;
    }
    
    uint32_t ZGetGameClientAddress = Scanner("\xE9\xEE\xEE\xEE\xEE\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xE9\xEE\xEE\xEE\xEE\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xE9\xEE\xEE\xEE\xEE\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xE9\xEE\xEE\xEE\xEE\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xA1\xEE\xEE\xEE\xEE");
    uint32_t MCommand__AddParameterAddress = Scanner("\x8B\x41\x20\x85\xC0\x53\x8D\x59\x1C\x56\x75\x04\x33\xF6\xEB\x08\x8B\x73\x08\x2B\xF0\xC1\xFE\x02\x8B\x51\x18\x57\x8B\xBA\x10\x02\xCD\xCD");
    uint32_t MCommand__GetParameterAddress = Scanner("\x55\x8B\x6C\x24\x08\x85\xED\x75\x06\x32\xC0\x5D\xC2\x10\xCD\x56\x8B\x74\x24\x10\x85\xF6\x7C\x23\x8B\x51\x20\x85\xD2\x75\x04\x33\xC0\xEB\x08\x8B\x41\x24\x2B\xC2\xC1\xF8\x02\x3B\xF0");
    uint32_t MCommand__GetParameter2Address = Scanner("\x56\x8B\x74\x24\x08\x85\xF6\x7C\x23\x8B\x51\x20\x85\xD2\x75\x04\x33\xC0\xEB\x08\x8B\x41\x24\x2B\xC2\xC1\xF8\x02\x3B\xF0");
    uint32_t MCommandDesc__MCommandDescAddress = Scanner("\x8B\xC1\x8B\x4C\x24\x04\xC7\xCD\xEE\xEE\xEE\xEE\x56\xC7\x80\x10\x02\xCD\xCD\xCD\xCD\xCD\xCD\xC7\x80\x14\x02\xCD\xCD\xCD\xCD\xCD\xCD\xC7\x80\x18\x02\xCD\xCD\xCD\xCD\xCD\xCD\x89\x48\x04\x8B\x4C\x24\x0C\x8D\x70\x08\x2B\xF1\x8A\x11\x88\x14\x0E\x41\x84\xD2\x75\xF6\x8B\x4C\x24\x10\x8D\xB0\x08\x01\xCD\xCD");
    uint32_t MCommandParameterDesc__MCommandParameterDescAddress = Scanner("\x8B\xC1\x8B\x4C\x24\x04\xC7\xCD\xEE\xEE\xEE\xEE\x56\xC7\x40\x4C\xCD\xCD\xCD\xCD\xC7\x40\x50\xCD\xCD\xCD\xCD\xC7\x40\x54\xCD\xCD\xCD\xCD\x89\x48\x04\x8B\x4C\x24\x0C\x8D\x70\x08\x2B\xF1");
    uint32_t MCommandManager__AddCommandDescAddress = Scanner("\x83\xEC\x10\x8B\x44\x24\x14\x8B\x50\x04\x89\x44\x24\x04\x8D\x04\x24\x89\x14\x24\x50\x8D\x54\x24\x0C\x52\x83\xC1\x04");
    uint32_t MCommandDesc__AddParameterDescAddress = Scanner("\x81\xC1\x0C\x02\xCD\xCD\x56\x8B\x71\x04\x85\xF6\x75\x04\x33\xD2\xEB\x08\x8B\x51\x08\x2B\xD6\xC1\xFA\x02\x85\xF6\x74\x1F\x8B\x41\x0C\x2B\xC6\xC1\xF8\x02");
    uint32_t MCommandParameterInt__MCommandParameterIntAddress = Scanner("\x8B\xC1\x8B\x4C\x24\x04\xC7\x40\x04\xCD\xCD\xCD\xCD\xC7\xCD\xEE\xEE\xEE\xEE\x89\x48\x0C\xC2\x04\xCD");
    uint32_t McommandParameterUInt__MCommandParameterUIntAddress = Scanner("\x8B\xC1\x8B\x4C\x24\x04\xC7\x40\x04\x01\xCD\xCD\xCD\xC7\xCD\xEE\xEE\xEE\xEE\x89\x48\x0C\xC2\x04\xCD");
    uint32_t MCommandParameterString__MCommandParameterStringAddress = Scanner("\x6A\xFF\x68\xEE\xEE\xEE\xEE\x64\xA1\xCD\xCD\xCD\xCD\x50\x64\x89\x25\xCD\xCD\xCD\xCD\x51\x56\x8B\xF1\x57\x89\x74\x24\x08\xC7\x46\x04\x04\xCD\xCD\xCD\x8B\x7C\x24\x1C");
    uint32_t MCommandParameterFloat__MCommandParameterFloatAddress = Scanner("\x8B\xC1\x8B\x4C\x24\x04\xC7\x40\x04\x02\xCD\xCD\xCD\xC7\xCD\xEE\xEE\xEE\xEE\x89\x48\x0C\xC2\x04\xCD");
    uint32_t MCommandParameterMUID__MCommandParameterMUIDAddress = Scanner("\x8B\xC1\xC7\x40\x04\x09\xCD\xCD\xCD\xC7\xCD\xEE\xEE\xEE\xEE\x33\xC9\x89\x48\x10\x89\x48\x0C\x8B\x4C\x24\x04\x8B\x11\x89\x50\x0C\x8B\x49\x04\x89\x48\x10\xC2\x04\xCD");
    uint32_t MCommandParameterBlob__MCommandParameterBlobAddress = Scanner("\x6A\xFF\x68\xEE\xEE\xEE\xEE\x64\xA1\xCD\xCD\xCD\xCD\x50\x64\x89\x25\xCD\xCD\xCD\xCD\x51\x53\x8B\xD9\x55\x89\x5C\x24\x08\xC7\x43\x04\x0A\xCD\xCD\xCD\x8B\x6C\x24\x20\x33\xC0\x81\xFD\xCD\xCD\x10\xCD");
    
    void LogOffests()
    {
    	FILE *File = fopen("Offset Log.log", "w");
    	Put("\nFunction Offsets");
    	Put("----------------\n");
    	Log("ZGetGameClient\t\t\t\t", ZGetGameClientAddress);
    	Log("MCommand::AddParameter\t\t\t", MCommand__AddParameterAddress);
    	Log("MCommand::GetParameter\t\t\t", MCommand__GetParameterAddress);
    	Log("MCommand::GetParameter2\t\t\t", MCommand__GetParameter2Address);
    	Log("MCommandDesc::MCommandDesc\t\t", MCommandDesc__MCommandDescAddress);
    	Log("MCommandParameterDesc::MCommandParameterDesc", MCommandParameterDesc__MCommandParameterDescAddress);
    	Log("MCommandManager::AddCommandDesc\t\t", MCommandManager__AddCommandDescAddress);
    	Log("MCommandDesc::AddParameterDesc\t\t", MCommandDesc__AddParameterDescAddress);
    	Log("MCommandParameterInt::MCommandParameterInt", MCommandParameterInt__MCommandParameterIntAddress);
    	Log("McommandParameterUInt::MCommandParameterUInt", McommandParameterUInt__MCommandParameterUIntAddress);
    	Log("MCommandParameterString::MCommandParameterStrin", MCommandParameterString__MCommandParameterStringAddress);
    	Log("MCommandParameterFloat::MCommandParameterFloat", MCommandParameterFloat__MCommandParameterFloatAddress);
    	Log("MCommandParameterMUID::MCommandParameterMUID", MCommandParameterMUID__MCommandParameterMUIDAddress);
    	Log("MCommandParameterBlob::MCommandParameterBlob", MCommandParameterBlob__MCommandParameterBlobAddress);
    	End(File);
    }



Advertisement