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.
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.
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 ativopremium_tier: 0 = sem tier, 1 = Bronze, 2 = Silver, 3 = Goldpremium_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
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
- No SSMS, expanda SQL Server Agent → clique com o botão direito em Jobs → New Job
- Nome:
PremiumExpiration_Job - Em Steps → New Step:
- Step name:
Expire Accounts - Type:
Transact-SQL script (T-SQL) - Database:
MuOnline - Command:
``sql EXEC sp_ExpirePremiumAccounts; ``
- Em Schedules → New Schedule:
- Name:
Hourly - Frequency:
Daily, recurs every1 hour
- Clique em OK para salvar.
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);
/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';
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.