Como configurar o sistema de ban/mute/kick no MU Online
Aprenda a montar um sistema completo de ban, mute e kick no seu servidor de MU Online, com comandos de GM, controle por banco de dados, ban por conta/IP/HWID e uma política de moderação que aguenta apelação e auditoria.
Moderar um servidor de MU Online sem um sistema de punições bem estruturado é como dirigir sem freio: cedo ou tarde você bate. Jogadores tóxicos no chat, usuários de bot, exploradores de bugs e reincidentes que criam contas novas a cada banimento vão testar os limites do seu servidor todos os dias.
Moderar um servidor de MU Online sem um sistema de punições bem estruturado é como dirigir sem freio: cedo ou tarde você bate. Jogadores tóxicos no chat, usuários de bot, exploradores de bugs e reincidentes que criam contas novas a cada banimento vão testar os limites do seu servidor todos os dias. A resposta a isso é uma escada de punições clara — kick para o incômodo momentâneo, mute para o abuso de chat e ban para as infrações graves — sustentada por comandos de GM confiáveis, registros no banco de dados e uma política que resista a apelações. Este guia mostra como montar esse sistema completo, do arquivo de configuração ao SQL de auditoria. Os nomes de colunas, comandos e caminhos são exemplos que variam por season/emulador, então confirme cada um no seu build antes de aplicar em produção.
Pré-requisitos
Antes de começar, garanta que você tem:
- Acesso de administrador ao diretório do servidor (ex.:
C:\MuServer\). - SQL Server Management Studio (SSMS) conectado ao banco
MuOnline. - Uma conta de GM com nível de autoridade suficiente para usar comandos administrativos.
- SQL Server Agent habilitado, caso queira automação de bans temporários.
- Backup completo do banco de dados e dos arquivos de configuração.
- Conhecimento do nome exato das tabelas de conta do seu build (
MEMB_INFO,MEMB_STAT,AccountCharacter, etc.).
> Nunca teste comandos de ban em produção com contas reais de jogadores. Crie uma conta de teste e valide todo o fluxo (banir, verificar bloqueio, desbanir) antes de liberar os comandos para a equipe.
Entendendo a escada de punições
Antes de configurar qualquer coisa, é fundamental que sua equipe entenda a diferença entre as três ações e quando aplicar cada uma. A tabela abaixo resume a escada de severidade que a maioria dos servidores adota.
| Ação | O que faz | Reversível | Uso típico | Nível de GM sugerido |
|---|---|---|---|---|
| Kick | Derruba a conexão imediatamente | Sim (jogador reloga) | Jogador AFK em spot, teste de presença, aviso | GM Júnior |
| Mute | Bloqueia o chat por tempo | Sim (expira) | Spam, ofensa leve, flood de comércio | GM Júnior |
| Ban temporário | Bloqueia acesso por X horas/dias | Sim (expira) | Reincidência de chat, uso de macro leve | GM Sênior |
| Ban permanente | Bloqueia acesso indefinidamente | Sim (manual) | Bot, dupe de item, hack, chargeback | Administrador |
| Ban de IP/HWID | Bloqueia origem da conexão | Sim (manual) | Reincidente crônico | Administrador |
A regra de ouro é proporcionalidade: comece pela punição mais leve que resolva o problema e escale apenas diante de reincidência ou gravidade. Um jogador que xingou uma vez merece mute, não ban permanente. Um usuário de bot pego em flagrante merece ban direto.
Passo 1 — Configurar os comandos de GM no servidor
A maioria dos emuladores expõe comandos de chat administrativos que só funcionam para contas com nível de autoridade adequado. Esses comandos ficam habilitados em um arquivo de configuração do GameServer, geralmente em GameServer\Data\ ou no próprio GameServer.ini. Um bloco de exemplo:
[GMCommands]
EnableCommands = 1
KickCommand = /kick ; /kick <nick>
MuteCommand = /mute ; /mute <nick> <minutos>
UnmuteCommand = /unmute ; /unmute <nick>
BanCommand = /ban ; /ban <conta> <horas> <motivo>
BanIPCommand = /banip ; /banip <ip> <horas>
DisconnectCmd = /disc ; /disc <nick>
MinLevelKick = 8 ; nivel minimo de GM para kick
MinLevelMute = 8
MinLevelBan = 16 ; ban restrito a nivel alto
MinLevelBanIP = 32 ; ban de IP so para admin
Os números de nível (MinLevelBan, etc.) referenciam o campo de autoridade da conta — em muitos builds a coluna CtlCode da MEMB_INFO, onde valores como 0 = jogador, 8 = GM comum, 16 = GM sênior e 32 = administrador. Esses valores variam por season/emulador; confira o mapeamento no seu compilado.
Depois de editar, reinicie o GameServer para que ele releia a configuração. Muitos builds não recarregam comandos a quente.
Passo 2 — Preparar a estrutura de auditoria no banco
Um sistema de punição sem registro é um convite a abuso e a discussões intermináveis com jogadores. Crie uma tabela de auditoria que guarde toda ação de moderação:
USE MuOnline;
GO
CREATE TABLE dbo.Moderation_Log (
LogID INT IDENTITY(1,1) PRIMARY KEY,
ActionType VARCHAR(15) NOT NULL, -- KICK, MUTE, BAN, BANIP, UNBAN
TargetAcc VARCHAR(10) NULL,
TargetChar VARCHAR(10) NULL,
TargetIP VARCHAR(45) NULL,
GMName VARCHAR(10) NOT NULL,
Reason VARCHAR(255) NOT NULL,
DurationMin INT NULL, -- duracao em minutos (NULL = permanente)
CreatedAt DATETIME DEFAULT GETDATE(),
ExpireAt DATETIME NULL -- quando o ban/mute expira
);
GO
Essa tabela é a espinha dorsal de todo o sistema. Toda vez que um GM aplicar uma punição, um registro entra aqui — seja pelo comando in-game (se o emulador tiver hook de log) ou pela query manual que você mesmo executa.
Passo 3 — Aplicar um ban de conta via SQL
O ban de conta clássico consiste em marcar a flag de bloqueio da conta. Na maioria dos schemas isso é a coluna bloc_code da MEMB_INFO (0 = liberada, 1 = bloqueada):
USE MuOnline;
GO
-- Banir a conta 'contaSuspeita' por 72 horas
DECLARE @acc VARCHAR(10) = 'contaSuspeita';
DECLARE @gm VARCHAR(10) = 'AdminBruno';
DECLARE @horas INT = 72;
UPDATE MEMB_INFO
SET bloc_code = 1
WHERE memb___id = @acc;
-- Desconectar imediatamente se estiver online
UPDATE MEMB_STAT
SET ConnectStat = 0
WHERE memb___id = @acc;
-- Registrar na auditoria com data de expiracao
INSERT INTO dbo.Moderation_Log
(ActionType, TargetAcc, GMName, Reason, DurationMin, ExpireAt)
VALUES
('BAN', @acc, @gm, 'Uso de bot confirmado por log', @horas * 60,
DATEADD(HOUR, @horas, GETDATE()));
GO
Perceba que o ban não deleta nada: o personagem, os itens e o Zen continuam intactos. Isso é intencional. Punição correta é reversível; deletar conta é destruição de dados e impede qualquer apelação justa.
Passo 4 — Automatizar bans temporários com expiração
Registrar a data de expiração não serve de nada se ninguém remover o bloqueio quando ela chega. Crie uma stored procedure que varre a tabela de auditoria e libera contas cujo ban expirou:
USE MuOnline;
GO
CREATE PROCEDURE dbo.SP_ExpireBans
AS
BEGIN
SET NOCOUNT ON;
-- Desbanir contas cujo ban temporario ja expirou
UPDATE m
SET m.bloc_code = 0
FROM MEMB_INFO m
INNER JOIN dbo.Moderation_Log l
ON m.memb___id = l.TargetAcc
WHERE l.ActionType = 'BAN'
AND l.ExpireAt IS NOT NULL
AND l.ExpireAt <= GETDATE()
AND m.bloc_code = 1;
PRINT 'Bans expirados processados: ' + CAST(GETDATE() AS VARCHAR);
END;
GO
Agende essa procedure no SQL Server Agent para rodar a cada 10 minutos (SSMS → SQL Server Agent → Jobs → New Job → Steps: EXEC dbo.SP_ExpireBans; → Schedules: a cada 10 minutos). Assim, um ban de 72 horas se resolve sozinho, sem intervenção manual.
Passo 5 — Implementar o sistema de mute
O mute normalmente é controlado por uma flag ou uma tabela auxiliar que o GameServer consulta ao processar uma mensagem de chat. Em builds que suportam mute nativo via comando /mute, o próprio emulador cuida disso. Para builds que não suportam, você monta uma tabela e o GameServer (ou um plugin) verifica antes de liberar o chat:
USE MuOnline;
GO
CREATE TABLE dbo.Chat_Mute (
CharName VARCHAR(10) PRIMARY KEY,
MutedUntil DATETIME NOT NULL,
GMName VARCHAR(10) NOT NULL,
Reason VARCHAR(255) NULL
);
GO
-- Silenciar 'JogadorSpammer' por 30 minutos
INSERT INTO dbo.Chat_Mute (CharName, MutedUntil, GMName, Reason)
VALUES ('JogadorSpammer', DATEADD(MINUTE, 30, GETDATE()),
'GMGabriel', 'Flood de comercio no chat global');
GO
Se o seu emulador não lê essa tabela nativamente, o mute precisa ser aplicado via comando in-game em vez de SQL. Isso varia por season/emulador — verifique se o build suporta mute por banco antes de depender dessa abordagem.
Passo 6 — Ban por IP e por HWID
Reincidentes que criam contas novas exigem uma camada além do ban de conta. O ban de IP costuma ser feito por um arquivo de lista no ConnectServer:
# ConnectServer\IPBanList.txt (formato varia por build)
201.10.55.32
189.44.0.0-189.44.255.255
O ban por HWID, quando o emulador oferece, bloqueia o identificador de hardware do cliente, sendo muito mais difícil de burlar do que trocar de IP. Nem todo build tem suporte a HWID — em muitos casos ele depende de um módulo anti-cheat acoplado. Se o seu servidor tiver, registre também o HWID na tabela de auditoria para rastrear reincidentes.
> Ban de IP pega inocentes. Famílias, LAN houses e redes com NAT compartilham o mesmo IP público. Use ban de IP apenas para reincidentes confirmados e prefira faixas estreitas a bloqueios amplos. Um ban de IP largo demais pode tirar dezenas de jogadores legítimos do servidor sem você perceber.
Passo 7 — Fluxo de trabalho da equipe de moderação
Ferramenta sem processo não funciona. Defina um fluxo claro para a equipe:
- Receber a denúncia (ticket, print, log automático).
- Verificar a evidência — nunca puna com base só em acusação.
- Escolher a punição proporcional conforme a escada de severidade.
- Aplicar via comando ou SQL com motivo textual obrigatório.
- Registrar na auditoria (automático ou manual).
- Comunicar ao jogador o motivo e a duração, quando aplicável.
- Guardar a evidência por pelo menos 30 dias para eventual apelação.
Esse processo protege tanto o servidor quanto o jogador. Se este material de fundação ainda não está no ar, vale revisar primeiro o guia de como criar servidor de MU Online antes de montar a camada de moderação.
Passo 8 — Consultas de revisão e desban
Para desbanir uma conta após apelação bem-sucedida:
USE MuOnline;
GO
DECLARE @acc VARCHAR(10) = 'contaInocente';
UPDATE MEMB_INFO SET bloc_code = 0 WHERE memb___id = @acc;
INSERT INTO dbo.Moderation_Log (ActionType, TargetAcc, GMName, Reason)
VALUES ('UNBAN', @acc, 'AdminBruno', 'Apelacao aceita - falso positivo');
GO
E para revisar o que a equipe andou fazendo — essencial contra abuso de poder:
SELECT ActionType, TargetAcc, GMName, Reason, CreatedAt, ExpireAt
FROM dbo.Moderation_Log
WHERE CreatedAt >= DATEADD(DAY, -7, GETDATE())
ORDER BY CreatedAt DESC;
Erros comuns e soluções
| Problema | Causa provável | Solução |
|---|---|---|
| Ban não impede o login | Nome da coluna de bloqueio errado (não é bloc_code) | Confirme com SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='MEMB_INFO' AND COLUMN_NAME LIKE '%bloc%' |
| Jogador banido continua online | Faltou atualizar MEMB_STAT / desconectar | Rode o UPDATE em ConnectStat ou use /disc in-game |
| Ban temporário nunca expira | Job de expiração não configurado ou Agent parado | Verifique o SQL Server Agent em services.msc e o histórico do job |
Comando /ban não funciona para o GM | Nível de autoridade abaixo do MinLevelBan | Ajuste o CtlCode da conta ou o mínimo exigido na config |
| Mute não silencia o chat | Build não lê a tabela Chat_Mute nativamente | Use o comando in-game do emulador ou um plugin com hook de chat |
| Ban de IP tirou vários jogadores | Faixa de IP ampla demais | Restrinja a IPs individuais e revise o IPBanList.txt |
Checklist de lançamento
- Comandos de GM habilitados e testados em conta de teste
- Níveis mínimos (
MinLevelBan, etc.) mapeados aoCtlCodereal - Tabela
Moderation_Logcriada e recebendo registros - Ban de conta testado: bloqueio, desconexão e desban validados
- Procedure
SP_ExpireBansagendada e Agent rodando - Tabela/comando de mute funcionando conforme o build
IPBanList.txtposicionado e lido pelo ConnectServer- Fluxo de moderação documentado para a equipe
- Motivo textual obrigatório definido em toda punição
- Rotina de revisão semanal da auditoria agendada
- Backup do banco feito antes de liberar em produção
Com essa estrutura no lugar, seu servidor deixa de reagir no improviso e passa a moderar com método: cada punição é proporcional, registrada, reversível e auditável. É a diferença entre um servidor que os jogadores respeitam e um que abandonam à primeira injustiça.
Perguntas frequentes
Qual a diferença entre kick, mute e ban?
Kick apenas derruba a conexão do jogador naquele momento, sem impedir que ele volte a logar em seguida. Mute retira do jogador a capacidade de usar o chat (global, normal ou comércio) por um tempo, mantendo-o no jogo. Ban impede o acesso à conta, IP ou máquina por tempo determinado ou permanentemente. Kick é a punição mais leve e reversível; ban é a mais severa.
Devo banir por conta, por IP ou por HWID?
Depende do caso. Ban por conta é o padrão e o mais justo para infrações comuns. Ban por IP atinge reincidentes que criam contas novas, mas pode pegar jogadores inocentes que compartilham o mesmo IP (família, LAN house). Ban por HWID (identificador de hardware) é o mais eficaz contra reincidentes crônicos, mas exige suporte do emulador. A recomendação varia por season/emulador, então combine as três camadas conforme a gravidade.
Como faço um ban temporário em vez de permanente?
Você precisa registrar a data de expiração do ban em uma coluna do banco (ex.: uma tabela auxiliar com AccountID e BanExpire) e criar um job agendado que remove o bloqueio automaticamente quando a data passa. Muitos emuladores modernos já trazem esse campo nativo; em builds antigos você monta a lógica manualmente via SQL Server Agent.
Um jogador banido injustamente pode ser desbanido sem perder itens?
Sim. Desbanir é apenas reverter a flag de bloqueio (geralmente bloc_code de volta a 0) e limpar o registro na tabela de punições. Os personagens, itens e progresso da conta permanecem intactos, pois o ban afeta somente o acesso, não os dados do personagem. Por isso é essencial nunca deletar a conta como forma de punição.
Como evito que GMs abusem do poder de ban?
Registre toda ação de moderação em uma tabela de auditoria com o nome do GM, a data, o alvo e o motivo. Restrinja o comando de ban permanente a administradores de nível alto e deixe kick/mute para GMs de nível menor. Revise o log de auditoria periodicamente e exija um motivo textual obrigatório em cada punição para responsabilizar quem aplicou.