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.
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_code | Tipo | Permissões típicas |
|---|---|---|
| 0 | Jogador normal | Nenhum comando especial |
| 1 | Game Master | /kick, /ban, /move, comandos de moderação |
| 2 | Senior GM | Todos de nível 1 + /item, /zen, /level |
| 3 | Admin/Operator | Todos os comandos, incluindo configuração |
| 4+ | Super Admin | Distribição-específico |
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.