Como Criar Website de Ranking em Tempo Real para Servidor de MU
Aprenda a construir um portal de ranking dinâmico para servidor MU Online S6, com atualização ao vivo por classe, guild e pontuação.
Por Que um Ranking em Tempo Real Faz Diferença
Em um servidor de MU Online Season 6, a competitividade entre jogadores é o motor da comunidade. Rankings estáticos — atualizados uma vez por dia ou manualmente — perdem o momento: um Blade Master que acaba de superar o rival em nível não vê isso refletido até o dia seguinte, o que esfria o engajamento.
Um ranking em tempo real muda essa dinâmica completamente. O jogador abre o portal durante o grinding em Tarkan ou Icarus e vê sua posição subindo. Guilds monitoram a disputa pelo topo enquanto o Land of Trials ainda está ativo. O site deixa de ser uma vitrine estática e passa a ser parte da experiência de jogo.
Este tutorial cobre a arquitetura completa: leitura segura do banco de dados do servidor, API de backend, frontend com atualização automática e apresentação correta das seis classes do S6.
Arquitetura Geral do Sistema
Antes de escrever uma linha de código, é essencial entender o fluxo de dados:
Banco de Dados MU (MySQL/MSSQL)
↓ leitura somente (SELECT)
API Backend (Node.js / PHP / Python)
↓ JSON endpoint
Frontend (HTML + JS)
↓ polling AJAX ou WebSocket
Tabela de Ranking no Navegador
↓ atualização a cada 30–60 s
Jogador vê posição em tempo real
A separação em camadas garante que o frontend nunca fale diretamente com o banco de dados — toda lógica de negócio fica no backend, que valida, filtra e pagina os dados antes de expô-los.
Estrutura do Banco de Dados MU S6
O MU Online S6 armazena personagens na tabela Character (ou equivalente conforme o emulador). As colunas mais relevantes para o ranking são:
| Coluna | Tipo | Descrição |
|---|---|---|
Name | VARCHAR | Nome do personagem |
Class | TINYINT | Código numérico da classe/job |
cLevel | SMALLINT | Nível atual (1–400 no S6 padrão) |
Resets | INT | Quantidade de resets (se habilitado) |
GuildName | VARCHAR | Guild do personagem |
PkCount | INT | Contador de PKs |
Strength, Dexterity, Vitality, Energy | INT | Stats principais |
Leadership | INT | Stat CMD — exclusivo do Dark Lord/Lord Emperor |
O campo Class segue uma tabela de códigos. No S6, os valores mais comuns são:
0 → Dark Knight
1 → Blade Knight (1ª evolução do DK)
2 → Blade Master (Master Class do DK)
16 → Dark Wizard
17 → Soul Master (1ª evolução do DW)
18 → Grand Master (Master Class do DW)
32 → Elf (Fairy Elf)
33 → Muse Elf (1ª evolução da Elf)
34 → High Elf (Master Class da Elf)
48 → Magic Gladiator → Duel Master (sem 1ª/2ª quest, sem Wing L1)
64 → Dark Lord → Lord Emperor (stat CMD exclusivo)
80 → Summoner
81 → Bloody Summoner (1ª evolução da Summoner)
82 → Dimension Master (Master Class da Summoner)
Criando a API de Ranking
O exemplo abaixo usa Node.js com a biblioteca mysql2, mas a lógica se aplica a PHP (PDO) ou Python (aiomysql) com ajustes mínimos.
// ranking-api.js — endpoint GET /api/ranking/players
const mysql = require('mysql2/promise');
const CLASS_NAMES = {
0: 'Dark Knight', 1: 'Blade Knight', 2: 'Blade Master',
16: 'Dark Wizard', 17: 'Soul Master', 18: 'Grand Master',
32: 'Elf', 33: 'Muse Elf', 34: 'High Elf',
48: 'Magic Gladiator → Duel Master',
64: 'Dark Lord → Lord Emperor',
80: 'Summoner', 81: 'Bloody Summoner', 82: 'Dimension Master',
};
async function getRanking(limit = 100, offset = 0) {
const conn = await mysql.createConnection(process.env.DB_URL_READONLY);
const [rows] = await conn.execute(`
SELECT
Name,
Class,
cLevel AS level,
Resets AS resets,
GuildName AS guild,
Leadership AS cmd_stat
FROM Character
WHERE CtlCode = 0 -- exclui GMs e contas suspensas
ORDER BY Resets DESC, cLevel DESC, Name ASC
LIMIT ? OFFSET ?
`, [limit, offset]);
await conn.end();
return rows.map((row, i) => ({
rank: offset + i + 1,
name: row.Name,
class: CLASS_NAMES[row.Class] ?? `Classe ${row.Class}`,
level: row.level,
resets: row.resets,
guild: row.guild || '—',
cmd_stat: row.cmd_stat ?? null, // null para classes sem CMD
}));
}
A query ordena por Resets DESC, depois Level DESC — o critério mais comum em servidores S6 com sistema de reset. Em servidores sem reset, remova a coluna Resets da ordenação.
Frontend com Atualização Automática
O frontend consome o endpoint e atualiza a tabela sem recarregar a página. O intervalo de 45 segundos é um bom equilíbrio entre frescor dos dados e carga no servidor.
<!-- ranking-table.html (fragmento relevante) -->
<table id="ranking-table">
<thead>
<tr>
<th>#</th><th>Personagem</th><th>Classe</th>
<th>Level</th><th>Resets</th><th>Guild</th>
</tr>
</thead>
<tbody id="ranking-body"></tbody>
</table>
<span id="last-update"></span>
<script>
const INTERVAL_MS = 45_000;
async function fetchRanking() {
const res = await fetch('/api/ranking/players?limit=100');
const data = await res.json();
const tbody = document.getElementById('ranking-body');
tbody.innerHTML = data.map(p => `
<tr class="class-${p.class.toLowerCase().replace(/\s+/g, '-')}">
<td>${p.rank}</td>
<td>${p.name}</td>
<td>${p.class}</td>
<td>${p.level}</td>
<td>${p.resets}</td>
<td>${p.guild}</td>
</tr>
`).join('');
document.getElementById('last-update').textContent =
'Atualizado: ' + new Date().toLocaleTimeString('pt-BR');
}
fetchRanking();
setInterval(fetchRanking, INTERVAL_MS);
</script>
name → rank a cada atualização. Uma seta verde para cima ou vermelha para baixo ao lado do número de posição aumenta muito o engajamento dos jogadores.Rankings Especializados: Guild, PK e Wings
Além do ranking geral por level/reset, vale criar abas para categorias específicas:
Ranking de Guild — agrupe por GuildName e some os resets ou níveis dos membros. Guilds com Dark Lord de alto Leadership (CMD) têm mais slots de convocação, o que é estrategicamente relevante no Crywolf Fortress e no Land of Trials.
Ranking de PK — ordene por PkCount DESC. Exiba o status de PK (Murderer, Outlaw etc.) junto ao nome. Este ranking atrai atenção da comunidade e estimula a dinâmica de caçada entre jogadores.
Ranking de Wing L3 — a Wing de Level 3 é o item de maior prestígio no S6. Para obtê-la é preciso Wing L2 + 3 Loch's Feather + Jewel of Creation. A Loch's Feather só cai de Balgass, o boss final do evento Crywolf, e somente quando o evento Crywolf falha — ou seja, quando os monstros destroem o Altar. Isso torna a Wing L3 extremamente rara. Um ranking dedicado a quem possui Wing L3 é um troféu de prestígio que incentiva a participação no evento.
Cache e Performance
Para servidores com centenas de jogadores online simultâneos, consultar o banco de dados a cada request de ranking não é escalável. Use uma camada de cache simples:
Request do usuário
↓
Cache (Redis ou memória) → válido por 30s → retorna JSON cacheado
↓ (cache expirado)
Consulta ao banco de dados
↓
Atualiza cache → retorna JSON
Mesmo um cache em memória simples (objeto JavaScript ou array PHP) reduz drasticamente a carga. O ranking não precisa ser atualizado a cada milissegundo — 30 a 60 segundos é imperceptível para o jogador e poupa dezenas de queries por minuto.
Considerações Finais
Um portal de ranking bem construído é uma das ferramentas mais eficazes para manter a comunidade engajada em torno do servidor. As seis classes do S6 — com suas particularidades como o CMD do Dark Lord e as restrições do Magic Gladiator — merecem ser apresentadas com cuidado no frontend para que o jogador compreenda os dados que está vendo.
A arquitetura de leitura apenas, com cache e paginação, garante que o portal funcione de forma estável mesmo durante os horários de pico, sem nunca comprometer a integridade do banco de dados do servidor.
Perguntas frequentes
Quais classes aparecem no ranking do MU S6?
As seis classes jogáveis são Dark Knight (→ Blade Knight → Blade Master), Dark Wizard (→ Soul Master → Grand Master), Elf (→ Muse Elf → High Elf), Magic Gladiator (→ Duel Master, sem 1º/2º quest e sem Wing L1), Dark Lord (→ Lord Emperor, possui stat CMD exclusivo) e Summoner (→ Bloody Summoner → Dimension Master). O ranking pode exibir o job atual de cada personagem consultando o campo de classe no banco de dados.
Com que frequência devo atualizar o ranking em tempo real?
Para servidores ativos, um intervalo de 30 a 60 segundos via polling AJAX é suficiente. Se o banco de dados suportar notificações push (ex.: PostgreSQL LISTEN/NOTIFY ou MySQL triggers + WebSocket), é possível entregar atualizações em menos de 5 segundos sem sobrecarregar o servidor.
O ranking de guilds deve mostrar o stat CMD do Dark Lord?
Sim. O stat CMD (Command) é exclusivo do Dark Lord e do Lord Emperor e define quantos Spirit Sorcerer/Battle Master podem ser convocados. É um diferencial estratégico valioso para o ranking de guild, pois indica o poder de suporte do lider.
Posso ranquear pelo nível de Wing?
Sim, mas com cuidado. No S6 a Wing de Level 3 exige Wing L2 + 3x Loch's Feather + Jewel of Creation. A Loch's Feather só é obtida de Balgass quando o evento Crywolf FALHA — o que torna a Wing L3 rara e um ótimo critério de prestígio no ranking.