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

Como Configurar Sistema de Conta Premium no Servidor de MU Online

Aprenda a implementar um sistema de conta Premium/VIP no seu servidor MU Online com SQL Server, configurando benefícios, duração e integração com o painel web.

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

Visão Geral do Sistema

Um sistema de conta Premium permite oferecer benefícios diferenciados a jogadores — maior taxa de experiência, drops melhorados, acesso a eventos exclusivos — controlados diretamente pelo banco de dados SQL Server e lidos pelo GameServer em tempo de execução.

Este guia cobre a implementação completa: estrutura de banco de dados, configuração do servidor, integração com painel web e automação de expiração.

Nota: Este tutorial foi testado em MuServer Season 6 Episode 3 com SQL Server 2008 R2, 2012 e 2019. A lógica é equivalente para Season 9 e Season 13 com ajustes menores nos nomes das tabelas.

Passo 1 — Preparar a Estrutura no Banco de Dados

Conecte ao SQL Server Management Studio e selecione o banco MuOnline.

1.1 — Adicionar colunas à tabela MEMB_INFO:

USE MuOnline;
GO

ALTER TABLE MEMB_INFO
  ADD premium_status  TINYINT      NOT NULL DEFAULT 0,
      premium_tier    TINYINT      NOT NULL DEFAULT 0,
      premium_expire  DATETIME     NULL,
      premium_notes   VARCHAR(100) NULL;
GO
  • premium_status: 0 = Normal, 1 = Premium ativo
  • premium_tier: 0 = sem tier, 1 = Bronze, 2 = Silver, 3 = Gold
  • premium_expire: data/hora de expiração (NULL = sem prazo)

1.2 — Criar tabela de log de ativações:

CREATE TABLE MEMB_PREMIUM_LOG (
  log_id        INT          IDENTITY(1,1) PRIMARY KEY,
  memb_guid     INT          NOT NULL,
  memb_name     VARCHAR(10)  NOT NULL,
  tier          TINYINT      NOT NULL,
  activated_by  VARCHAR(50)  NOT NULL,
  activated_at  DATETIME     NOT NULL DEFAULT GETDATE(),
  expire_at     DATETIME     NULL,
  duration_days INT          NOT NULL
);
GO
Dica: Mantenha o log de ativações separado. Ele é essencial para auditoria e para resolver disputas de jogadores sobre tempo de Premium não creditado.

Passo 2 — Criar Stored Procedures de Gerenciamento

2.1 — Procedure para ativar Premium:

CREATE PROCEDURE sp_ActivatePremium
  @memb_name    VARCHAR(10),
  @tier         TINYINT,
  @duration_days INT,
  @activated_by VARCHAR(50)
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @memb_guid   INT;
  DECLARE @expire_date DATETIME;

  SELECT @memb_guid = memb_guid
  FROM   MEMB_INFO
  WHERE  memb_name = @memb_name;

  IF @memb_guid IS NULL
  BEGIN
    RAISERROR('Conta nao encontrada: %s', 16, 1, @memb_name);
    RETURN;
  END

  -- Se já tem Premium ativo, estende a partir da data atual de expiração
  SET @expire_date = CASE
    WHEN premium_status = 1 AND premium_expire > GETDATE()
      THEN DATEADD(DAY, @duration_days, premium_expire)
    ELSE
      DATEADD(DAY, @duration_days, GETDATE())
  END
  FROM MEMB_INFO WHERE memb_guid = @memb_guid;

  UPDATE MEMB_INFO
  SET    premium_status = 1,
         premium_tier   = @tier,
         premium_expire = @expire_date
  WHERE  memb_guid = @memb_guid;

  INSERT INTO MEMB_PREMIUM_LOG
    (memb_guid, memb_name, tier, activated_by, expire_at, duration_days)
  VALUES
    (@memb_guid, @memb_name, @tier, @activated_by, @expire_date, @duration_days);

  SELECT 'Premium ativado com sucesso. Expira em: ' + CONVERT(VARCHAR, @expire_date, 120) AS resultado;
END;
GO

2.2 — Procedure para expirar contas automaticamente:

CREATE PROCEDURE sp_ExpirePremiumAccounts
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE MEMB_INFO
  SET    premium_status = 0,
         premium_tier   = 0
  WHERE  premium_status = 1
    AND  premium_expire IS NOT NULL
    AND  premium_expire < GETDATE();

  SELECT @@ROWCOUNT AS contas_expiradas;
END;
GO

Passo 3 — Configurar SQL Server Agent Job para Expiração Automática

  1. No SSMS, expanda SQL Server Agent → clique com o botão direito em JobsNew Job
  2. Nome: PremiumExpiration_Job
  3. Em StepsNew Step:
  • Step name: Expire Accounts
  • Type: Transact-SQL script (T-SQL)
  • Database: MuOnline
  • Command:

``sql EXEC sp_ExpirePremiumAccounts; ``

  1. Em SchedulesNew Schedule:
  • Name: Hourly
  • Frequency: Daily, recurs every 1 hour
  1. Clique em OK para salvar.
Atenção: O SQL Server Agent deve estar rodando como serviço. Verifique em Services (services.msc) que SQL Server Agent (MSSQLSERVER) está com status Running e startup type Automatic.

Passo 4 — Configurar Benefícios no GameServer

Os benefícios de experiência e drop são controlados por arquivos de configuração e, em algumas versões, por tabelas no banco.

4.1 — Arquivo principal de rates:

Edite GameServer/Data/Etc/Rates.ini (ou GameServer/Data/Config/Rates.cfg dependendo da versão):

[PremiumRates]
; Tier 1 - Bronze
Bronze_ExpRate     = 150    ; 1.5x experiência normal
Bronze_DropRate    = 120    ; 1.2x chance de drop
Bronze_ZenRate     = 110    ; 1.1x zen

; Tier 2 - Silver
Silver_ExpRate     = 200
Silver_DropRate    = 150
Silver_ZenRate     = 125

; Tier 3 - Gold
Gold_ExpRate       = 300
Gold_DropRate      = 200
Gold_ZenRate       = 150

4.2 — Em servidores que leem rates do banco de dados:

-- Tabela T_PREMIUM_RATES (crie se não existir)
CREATE TABLE T_PREMIUM_RATES (
  tier        TINYINT PRIMARY KEY,
  tier_name   VARCHAR(20),
  exp_rate    SMALLINT,
  drop_rate   SMALLINT,
  zen_rate    SMALLINT
);

INSERT INTO T_PREMIUM_RATES VALUES
  (1, 'Bronze', 150, 120, 110),
  (2, 'Silver', 200, 150, 125),
  (3, 'Gold',   300, 200, 150);
Dica: Após alterar rates via banco, reinicie o GameServer ou execute o comando de reload de configuração via console do servidor (/reloadconfig em alguns builds).

Passo 5 — Integrar com o Painel Web

Se você usa um painel PHP (AppServ, XAMPP) ou ASP.NET webEngineNET, crie o endpoint de ativação.

Exemplo em PHP com MSSQL (PDO):

<?php
// admin/activate_premium.php
require_once '../includes/db.php'; // conexao PDO com SQL Server

function activatePremium($membName, $tier, $durationDays, $activatedBy) {
    global $pdo;

    $stmt = $pdo->prepare("EXEC sp_ActivatePremium ?, ?, ?, ?");
    $stmt->execute([$membName, $tier, $durationDays, $activatedBy]);

    return $stmt->fetchColumn();
}

// Uso via POST do formulário admin:
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['memb_name'])) {
    $result = activatePremium(
        $_POST['memb_name'],
        (int)$_POST['tier'],
        (int)$_POST['duration'],
        $_SESSION['admin_user']
    );
    echo json_encode(['success' => true, 'message' => $result]);
}
?>

Verificação de status no perfil do jogador:

SELECT
  mi.memb_name,
  mi.premium_status,
  pt.tier_name,
  mi.premium_expire,
  DATEDIFF(DAY, GETDATE(), mi.premium_expire) AS dias_restantes
FROM MEMB_INFO mi
LEFT JOIN T_PREMIUM_RATES pt ON pt.tier = mi.premium_tier
WHERE mi.memb_name = 'NomeDoJogador';

Passo 6 — Verificar e Testar

6.1 — Ativar manualmente para teste:

EXEC sp_ActivatePremium 'TestAccount', 2, 30, 'Admin';

6.2 — Confirmar no banco:

SELECT memb_name, premium_status, premium_tier, premium_expire
FROM   MEMB_INFO
WHERE  memb_name = 'TestAccount';

6.3 — Testar expiração forçada:

-- Força expiração da conta de teste
UPDATE MEMB_INFO
SET    premium_expire = DATEADD(MINUTE, -1, GETDATE())
WHERE  memb_name = 'TestAccount';

-- Executa a procedure manualmente
EXEC sp_ExpirePremiumAccounts;

-- Verifica se voltou para status 0
SELECT memb_name, premium_status FROM MEMB_INFO WHERE memb_name = 'TestAccount';
Atenção: Sempre teste em uma conta dedicada para testes, nunca em contas de jogadores ativos. Faça backup do banco antes de qualquer ALTER TABLE em produção: ``sql BACKUP DATABASE MuOnline TO DISK = 'C:\Backups\MuOnline_pre_premium.bak'; ``

Troubleshooting Comum

O GameServer não aplica os rates Premium mesmo com o banco atualizado: Verifique se a versão do seu MuServer suporta leitura dinâmica de rates. Em builds mais antigos (pre-2010), os rates são compilados no executável. Nesses casos, use patches de source ou edite os valores diretamente no executável com um hex editor (consulte o fórum da sua versão específica).

A procedure sp_ActivatePremium retorna erro de permissão: O usuário SQL usado pelo DataServer precisa ter permissão de EXECUTE nessa procedure:

GRANT EXECUTE ON sp_ActivatePremium TO [muserver_user];
GRANT EXECUTE ON sp_ExpirePremiumAccounts TO [muserver_user];

Jogador continua com Premium após expiração: O GameServer pode ter cachê de sessão ativo. Force o jogador a reconectar ou reinicie o GameServer para limpar o cache de contas. Reduza o AccountCacheTime em DataServer/Data/DataServerInfo.ini para minimizar esse delay:

[DBConfig]
AccountCacheTime = 60   ; em segundos, padrão costuma ser 300

Perguntas frequentes

Qual tabela do banco de dados controla o status Premium?

A tabela principal é a MEMB_INFO no banco MuOnline, coluna memb_tier ou uma coluna personalizada como premium_status (INT) e premium_expire (DATETIME), dependendo da versão do seu MuServer.

Como o GameServer lê o status Premium em tempo real?

O GameServer consulta a tabela de conta via DataServer a cada login ou refresh de sessão. Configurações de cache estão em DataServer/Data/DataServerInfo.ini — reduza o valor de CacheTime para atualizações mais rápidas.

É possível ter múltiplos níveis de VIP (Bronze, Silver, Gold)?

Sim. Use uma coluna INT (ex: premium_tier) com valores 0=Normal, 1=Bronze, 2=Silver, 3=Gold e replique a lógica de benefícios para cada faixa nas stored procedures ou no código do servidor.

O que acontece quando a conta Premium expira?

Você deve criar um SQL Agent Job ou rotina no painel web que execute UPDATE MEMB_INFO SET premium_status=0 WHERE premium_expire < GETDATE() periodicamente, revertendo os benefícios automaticamente.

EQ

Equipe ViciadosMU

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

Continue lendo

Artigos relacionados