O maior portal de MU Online do Brasil — desde 2003
Tutorial Avançado Tutoriais

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.

EQ Equipe ViciadosMU · Atualizado em 4 jul 2026 · ⏱ 12 min de leitura

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
Atenção: Nunca conceda acesso de escrita (INSERT, UPDATE, DELETE) ao usuário de banco de dados usado pelo portal de ranking. Use um usuário dedicado com permissão SELECT apenas nas tabelas necessárias. Uma falha de segurança pode comprometer personagens e itens reais do servidor.

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:

ColunaTipoDescrição
NameVARCHARNome do personagem
ClassTINYINTCódigo numérico da classe/job
cLevelSMALLINTNível atual (1–400 no S6 padrão)
ResetsINTQuantidade de resets (se habilitado)
GuildNameVARCHARGuild do personagem
PkCountINTContador de PKs
Strength, Dexterity, Vitality, EnergyINTStats principais
LeadershipINTStat 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)
Nota: O Magic Gladiator (código 48) não possui primeira nem segunda quest de evolução e não pode equipar Wing de Level 1 — diferente das demais classes. O Dark Lord (código 64) é a única classe com o stat Leadership (CMD), que controla a quantidade de unidades convocáveis.

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>
Dica: Adicione um indicador visual de "subiu/desceu de posição" comparando o ranking anterior com o atual. Guarde o array anterior em uma variável e compare os 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.

EQ

Equipe ViciadosMU

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

Continue lendo

Artigos relacionados