Chat commands without a single hook.

Mako is insane.
Decennium
Joined
Sep 10, 2007
Messages
968
Reaction score
815
Notice: These addresses / structure offsets are for 07 clients. Not too hard to update though.

Also, "auto" is a keyword determined by the compiler.

Code:
#include "Empathy.h"

//easier additions.
typedef void (__cdecl *chatCallback)(const char *, const int, char **const );
typedef void (__thiscall* ZChatCmdManager__AddCommandTypedef) (LPVOID instance, int id, const char* command, chatCallback function, int flag, int minArgs, int maxArgs, bool bRepeat, char* szUsage, char* szHelp); 

ZChatCmdManager__AddCommandTypedef ZChatCmdManager__AddCommand = (ZChatCmdManager__AddCommandTypedef)ZChatCmdManager__AddCommandAddress;
void OnBan(const char* line, const int argc, char *argv[]);
void OnReloadConfig(const char* line, const int argc, char *argv[]);

void CreateCommands()
{
    auto gameInterface = ((DWORD* (__cdecl*)())ZGetGameInterfaceAddress)();
    auto chat = ((gameInterface)+(0x380/sizeof(DWORD)));
    auto cmdManager = (DWORD*)((chat)+(0x4/sizeof(DWORD)));

    ZChatCmdManager__AddCommand(cmdManager, 0, "ban", OnBan, CCF_ADMIN, 1, 2, true, "/ban user hacking", "Ban command!");
    ZChatCmdManager__AddCommand(cmdManager, 0, "admin_reload", OnReloadConfig, CCF_ADMIN, 1, 1, true, "/admin_reload shop.xml", "Config reload command!");
}

void OnReloadConfig(const char* line, const int argc, char *argv[])
{
    if (argc >= 2)
    {
        auto command = MCommand::Create(0xD136);
        auto file = new MCommandParameterString(argv[1]);

        command->AddParameter(file);
        MCommand::Post(command);
    }
}

void OnBan(const char* line, const int argc, char *argv[])
{
    if (argc >= 3)
    {
        auto command = MCommand::Create(0xD149);
        auto player = new MCommandParameterString(argv[1]);
        auto reason = new MCommandParameterString(argv[2]);

        command->AddParameter(player);
        command->AddParameter(reason);
        MCommand::Post(command);
    }
}

07 Offsets:
Code:
static uint32_t ZGetGameInterfaceAddress = 0x004ABCE0;
static uint32_t ZChatCmdManager__AddCommandAddress = 0x0042FB70;

uint23_t can be replaced with DWORD / unsigned int.

Enums:
Code:
enum ZChatCmdFlag 
{
  CCF_NONE,
  CCF_LOBBY,
  CCF_STAGE,
  CCF_GAME = 04,
  CCF_ALL = 0xf,
  CCF_TEST = 0x40,
  CCF_ADMIN = 0x80,
};


If you need help updating / understand this, just post.
 
Back