O maior portal de MU Online do Brasil — desde 2003
Tutorial Intermediário Servidor

Painel administrativo e sistema de Game Master no MU Online

Configure Game Masters e painel administrativo no servidor de MU Online — como criar GMs, níveis de permissão, comandos disponíveis por nível, painel web para admin e boas práticas de gestão.

EQ Equipe ViciadosMU · Atualizado em 1 jul 2026 · ⏱ 20 min de leitura
Resposta rápida

O sistema de Game Master no MU Online permite que administradores e moderadores gerenciem o servidor em tempo real — usando comandos no chat do jogo ou via painel web conectado ao banco.

O sistema de Game Master no MU Online permite que administradores e moderadores gerenciem o servidor em tempo real — usando comandos no chat do jogo ou via painel web conectado ao banco.

Hierarquia de permissões (ctl_code)

O campo ctl_code na tabela Character define o nível de acesso:

ctl_codeTipoPermissões típicas
0Jogador normalNenhum comando especial
1Game Master/kick, /ban, /move, comandos de moderação
2Senior GMTodos de nível 1 + /item, /zen, /level
3Admin/OperatorTodos os comandos, incluindo configuração
4+Super AdminDistribição-específico
Nota: Os níveis exatos e quais comandos cada um acessa variam por distribuição de GameServer. Consulte o arquivo CommandList.txt ou a documentação da sua distribuição para ver o mapeamento completo.

Criar um Game Master (GM)

Via SQL (método direto)

-- Ver o personagem que vai virar GM (deve estar OFFLINE)
SELECT Name, AccountID, cLevel, CtlCode, ConnectStat
FROM Character
WHERE Name = 'MeuPersonagem';

-- Verificar que está offline (ConnectStat = 0)
-- Se ConnectStat = 1, solicite que o jogador deslogue primeiro

-- Promover a GM nível 1
UPDATE Character
SET CtlCode = 1
WHERE Name = 'MeuPersonagem' AND ConnectStat = 0;

-- Promover a GM nível 3 (Admin)
UPDATE Character
SET CtlCode = 3
WHERE Name = 'MeuPersonagem' AND ConnectStat = 0;

-- Confirmar a alteração
SELECT Name, CtlCode FROM Character WHERE Name = 'MeuPersonagem';

Criar uma conta GM dedicada

-- Criar conta GM dedicada no banco (não use sua conta pessoal)
INSERT INTO MEMB_INFO (
    memb_id, memb_pw, memb_name, sno_u_stat, memb_stat,
    mail_addr, bloc_code, appl_days
) VALUES (
    'gm_suporte',
    UPPER(CONVERT(VARCHAR(32), HashBytes('MD5', 'SenhaForteGM@2026'), 2)),
    'GM Suporte',
    1, 1,
    '[email protected]',
    0, GETDATE()
);
GO

-- Criar personagem GM no banco (personagens são criados no jogo normalmente)
-- Após criar o personagem no jogo, promovê-lo via SQL acima

Comandos de GM no chat do jogo

Comandos de moderação básica

/ban [nome] [motivo]      — banir personagem/conta
/kick [nome]              — desconectar personagem
/move [nome] [mapa] [x] [y] — teleportar personagem
/block [nome]             — bloquear conta temporariamente
/unblock [nome]           — desbloquear conta
/notice [mensagem]        — aviso global para todos online
/post [mensagem]          — mensagem global (como broadcast)
/announce [mensagem]      — anúncio em cor especial

Comandos de administração de jogadores

/item [grupo] [id] [level] [opção]  — dar item ao personagem (target)
/zen [valor]                         — dar zen ao personagem
/level [valor]                       — alterar level do personagem  
/str [valor]                         — alterar pontos de STR
/agi [valor]                         — alterar pontos de AGI
/vit [valor]                         — alterar pontos de VIT
/ene [valor]                         — alterar pontos de ENE
/cmd [valor]                         — alterar pontos de CMD (Dark Lord)
/reset                               — forçar reset do personagem
/addreset [n]                        — adicionar N resets ao personagem

Comandos de teleporte e mapa

/move [mapa] [x] [y]                 — teleportar a si mesmo
/move [nome] [mapa] [x] [y]          — teleportar outro personagem
/warp lorencia                       — ir para Lorencia
/warp devias                         — ir para Devias
/mapcode                             — ver o número do mapa atual
/pos                                 — ver coordenadas atuais

Comandos de eventos

/bc start [nível]                    — iniciar Blood Castle
/ds start [nível]                    — iniciar Devil Square
/cc start                            — iniciar Chaos Castle
/je on/off                           — Jewel of Experience
/goldenveil on/off                   — ativar Golden Veil (drop especial)
/happyhour on/off                    — ativar hora feliz (EXP 2x)

Comandos de informação

/gmstat                              — ver status do servidor
/online                              — ver quantidade de jogadores online
/who [nome]                          — informações sobre personagem
/ip [nome]                           — ver IP do jogador (Admin)
/gmlog                               — ver log recente de ações

Painel web de administração

Um painel PHP permite administrar o servidor sem abrir o SSMS:

admin/index.php — estrutura do painel

<?php
// admin/index.php — painel administrativo básico

session_start();
require_once '../config/db-muserver.php';

// Verificar acesso ao painel admin
if (!isset($_SESSION['admin_logged']) || !$_SESSION['admin_logged']) {
    header('Location: login.php');
    exit;
}

$conn = getMuDB();

// Estatísticas em tempo real
$statsStmt = sqlsrv_query($conn, "
    SELECT
        (SELECT COUNT(*) FROM Character WHERE ConnectStat = 1) AS Online,
        (SELECT COUNT(*) FROM Character) AS TotalPersonagens,
        (SELECT COUNT(*) FROM MEMB_INFO) AS TotalContas,
        (SELECT COUNT(*) FROM MEMB_INFO WHERE bloc_code = 1) AS ContasBanidas
");
$stats = sqlsrv_fetch_array($statsStmt, SQLSRV_FETCH_ASSOC);

// Últimos registros (últimas 24h)
$novosStmt = sqlsrv_query($conn, "
    SELECT COUNT(*) AS NovosHoje
    FROM MEMB_INFO
    WHERE appl_days >= DATEADD(HOUR, -24, GETDATE())
");
$novos = sqlsrv_fetch_array($novosStmt, SQLSRV_FETCH_ASSOC);

// Jogadores online agora
$onlineStmt = sqlsrv_query($conn, "
    SELECT TOP 20 c.Name, c.Class, c.cLevel, c.Resets, c.MapNumber
    FROM Character c
    WHERE c.ConnectStat = 1
    ORDER BY c.cLevel DESC
");

$online = [];
while ($row = sqlsrv_fetch_array($onlineStmt, SQLSRV_FETCH_ASSOC)) {
    $online[] = $row;
}
?>
<!DOCTYPE html>
<html>
<head><title>Painel Admin - Servidor MU</title></head>
<body>
    <h1>Painel Administrativo</h1>
    
    <div class="stats">
        <div>Online: <strong><?= $stats['Online'] ?></strong></div>
        <div>Total Personagens: <strong><?= $stats['TotalPersonagens'] ?></strong></div>
        <div>Total Contas: <strong><?= $stats['TotalContas'] ?></strong></div>
        <div>Contas Banidas: <strong><?= $stats['ContasBanidas'] ?></strong></div>
        <div>Registros hoje: <strong><?= $novos['NovosHoje'] ?></strong></div>
    </div>

    <h2>Online agora</h2>
    <table>
    <tr><th>Nome</th><th>Level</th><th>Resets</th><th>Mapa</th><th>Ação</th></tr>
    <?php foreach ($online as $char): ?>
    <tr>
        <td><?= htmlspecialchars($char['Name']) ?></td>
        <td><?= $char['cLevel'] ?></td>
        <td><?= $char['Resets'] ?></td>
        <td><?= $char['MapNumber'] ?></td>
        <td><a href="ban.php?char=<?= urlencode($char['Name']) ?>">Banir</a></td>
    </tr>
    <?php endforeach; ?>
    </table>
</body>
</html>

admin/ban.php — banir conta

<?php
// admin/ban.php — banir conta de um personagem

session_start();
require_once '../config/db-muserver.php';

if (!$_SESSION['admin_logged']) { header('Location: login.php'); exit; }

$conn = getMuDB();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $charName  = trim($_POST['char'] ?? '');
    $motivo    = trim($_POST['motivo'] ?? 'Banido por GM');
    $tipoBan   = (int)($_POST['tipo'] ?? 1);    // 1=temporário, 2=permanente
    $diasBan   = (int)($_POST['dias'] ?? 7);
    
    if (empty($charName)) {
        $erro = "Nome do personagem é obrigatório";
    } else {
        // Buscar AccountID do personagem
        $accountStmt = sqlsrv_query($conn,
            "SELECT AccountID FROM Character WHERE Name = ?",
            [[$charName, SQLSRV_PARAM_IN]]
        );
        $char = sqlsrv_fetch_array($accountStmt, SQLSRV_FETCH_ASSOC);
        
        if (!$char) {
            $erro = "Personagem '$charName' não encontrado";
        } else {
            $accountID = $char['AccountID'];
            $expiry = $tipoBan == 2 ? '9999-12-31' : 
                      date('Y-m-d', strtotime("+$diasBan days"));
            
            // Aplicar ban
            sqlsrv_query($conn, "
                UPDATE MEMB_INFO
                SET bloc_code = 1,
                    bloc_memo = ?,
                    bloc_sDate = GETDATE(),
                    bloc_eDate = ?
                WHERE memb_id = ?
            ", [
                [$motivo,    SQLSRV_PARAM_IN],
                [$expiry,    SQLSRV_PARAM_IN],
                [$accountID, SQLSRV_PARAM_IN],
            ]);
            
            // Desconectar personagem se estiver online
            sqlsrv_query($conn,
                "UPDATE Character SET ConnectStat = 0 WHERE AccountID = ?",
                [[$accountID, SQLSRV_PARAM_IN]]
            );
            
            // Registrar no log admin
            sqlsrv_query($conn, "
                INSERT INTO GMLog (AdminAccount, Action, Target, Details, LogDate)
                VALUES (?, 'BAN', ?, ?, GETDATE())
            ", [
                [$_SESSION['conta_admin'], SQLSRV_PARAM_IN],
                [$charName,                SQLSRV_PARAM_IN],
                ["$motivo - até $expiry",  SQLSRV_PARAM_IN],
            ]);
            
            $sucesso = "Conta '$accountID' banida até $expiry";
        }
    }
}
?>

Tabela de log de ações dos GMs

-- Criar tabela de log de GMs
CREATE TABLE GMLog (
  LogID        INT IDENTITY(1,1) PRIMARY KEY,
  AdminAccount VARCHAR(10) NOT NULL,
  Action       VARCHAR(50) NOT NULL,   -- BAN, UNBAN, ITEM, KICK, etc.
  Target       VARCHAR(16) NULL,       -- personagem ou conta alvo
  Details      VARCHAR(256) NULL,
  IPAddress    VARCHAR(16) NULL,
  LogDate      DATETIME NOT NULL DEFAULT GETDATE()
);
GO

-- Criar índice para busca rápida
CREATE INDEX IX_GMLog_Admin ON GMLog (AdminAccount);
CREATE INDEX IX_GMLog_Date  ON GMLog (LogDate DESC);
GO

-- Inserir log manualmente (se o GameServer não logar)
INSERT INTO GMLog (AdminAccount, Action, Target, Details)
VALUES ('gm_suporte', 'BAN', 'nomehacker', 'SpeedHack detectado em Atlans');

Monitoramento e alertas

-- Ver ações de todos os GMs nos últimos 7 dias
SELECT AdminAccount, Action, Target, Details, LogDate
FROM GMLog
WHERE LogDate >= DATEADD(DAY, -7, GETDATE())
ORDER BY LogDate DESC;

-- GMs mais ativos
SELECT AdminAccount, COUNT(*) AS Acoes
FROM GMLog
WHERE LogDate >= DATEADD(DAY, -30, GETDATE())
GROUP BY AdminAccount
ORDER BY Acoes DESC;

-- Ver bans ativos (contas banidas que ainda não expiraram)
SELECT m.memb_id, m.bloc_memo, m.bloc_sDate, m.bloc_eDate
FROM MEMB_INFO m
WHERE m.bloc_code = 1
  AND (m.bloc_eDate > GETDATE() OR m.bloc_eDate = '9999-12-31')
ORDER BY m.bloc_sDate DESC;

Boas práticas de gestão de GMs

O que GMs devem e não devem fazer

DEVEM FAZER
[ ] Usar uma conta GM separada da conta pessoal
[ ] Logar todas as ações no Discord do admin
[ ] Nunca abusar de itens/zen para si mesmos
[ ] Avisar o admin antes de fazer bans permanentes
[ ] Documentar o motivo de cada ban

NÃO DEVEM FAZER
[ ] Compartilhar a conta GM com ninguém
[ ] Dar itens/zen para amigos
[ ] Usar comandos para vantagem pessoal no jogo
[ ] Banir jogadores por vingança pessoal
[ ] Fazer alterações no banco sem autorização do admin

Revezamento de GMs

-- Ver quais GMs estão ativos (logaram nos últimos 30 dias)
SELECT DISTINCT g.AdminAccount
FROM GMLog g
WHERE g.LogDate >= DATEADD(DAY, -30, GETDATE())
ORDER BY AdminAccount;

-- Remover GM de um personagem que não está mais no time
UPDATE Character
SET CtlCode = 0
WHERE Name = 'ExGM' AND ConnectStat = 0;

Perguntas frequentes

Como criar um Game Master no servidor de MU?

Altere o campo ctl_code na tabela Character para 1 (GM) ou 3 (Admin). O personagem deve estar offline no momento da alteração.

Qual a diferença entre ctl_code 1, 2 e 3?

ctl_code 1=Game Master (acesso a comandos básicos), ctl_code 2=Senior GM ou acesso expandido, ctl_code 3=Admin/Super Admin (todos os comandos). Os comandos disponíveis por nível variam por distribuição.

GMs aparecem no ranking?

Por padrão sim, mas é comum excluir GMs com ctl_code > 0 do ranking. Configure a query de ranking para usar WHERE ctl_code = 0.

É possível ter um painel web para administrar o servidor?

Sim — um painel PHP que se conecta ao banco SQL Server permite gerenciar contas, aplicar bans, visualizar logs e outras ações sem precisar abrir o SSMS.

EQ

Equipe editorial do ViciadosMU — portal de MU Online no ar desde 2003.

Continue lendo

Artigos relacionados