Cómo Configurar Sistema de Cuenta Premium en el Servidor de MU Online
Aprende a implementar un sistema de cuenta Premium/VIP en tu servidor MU Online con SQL Server, configurando beneficios, duración e integración con el panel web.
Visión General del Sistema
Un sistema de cuenta Premium permite ofrecer beneficios diferenciados a los jugadores — mayor tasa de experiencia, mejores drops, acceso a eventos exclusivos — controlados directamente desde la base de datos SQL Server y leídos por el GameServer en tiempo de ejecución.
Esta guía cubre la implementación completa: estructura de base de datos, configuración del servidor, integración con el panel web y automatización de la expiración.
Paso 1 — Preparar la Estructura en la Base de Datos
Conéctate al SQL Server Management Studio y selecciona la base de datos MuOnline.
1.1 — Agregar columnas a la tabla 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 activopremium_tier: 0 = sin nivel, 1 = Bronze, 2 = Silver, 3 = Goldpremium_expire: fecha/hora de expiración (NULL = sin plazo)
1.2 — Crear tabla de registro de activaciones:
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
Paso 2 — Crear Stored Procedures de Gestión
2.1 — Procedure para activar 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('Cuenta no encontrada: %s', 16, 1, @memb_name);
RETURN;
END
-- Si ya tiene Premium activo, extiende desde la fecha de expiración actual
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 activado con éxito. Expira el: ' + CONVERT(VARCHAR, @expire_date, 120) AS resultado;
END;
GO
2.2 — Procedure para expirar cuentas automáticamente:
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 cuentas_expiradas;
END;
GO
Paso 3 — Configurar SQL Server Agent Job para Expiración Automática
- En SSMS, expande SQL Server Agent → clic derecho en Jobs → New Job
- Nombre:
PremiumExpiration_Job - En Steps → New Step:
- Step name:
Expire Accounts - Type:
Transact-SQL script (T-SQL) - Database:
MuOnline - Command:
``sql EXEC sp_ExpirePremiumAccounts; ``
- En Schedules → New Schedule:
- Name:
Hourly - Frequency:
Daily, recurs every1 hour
- Haz clic en OK para guardar.
services.msc) que SQL Server Agent (MSSQLSERVER) tenga el estado Running y startup type Automatic.Paso 4 — Configurar Beneficios en el GameServer
Los beneficios de experiencia y drop se controlan mediante archivos de configuración y, en algunas versiones, mediante tablas en la base de datos.
4.1 — Archivo principal de rates:
Edita GameServer/Data/Etc/Rates.ini (o GameServer/Data/Config/Rates.cfg según la versión):
[PremiumRates]
; Tier 1 - Bronze
Bronze_ExpRate = 150 ; 1.5x experiencia normal
Bronze_DropRate = 120 ; 1.2x probabilidad 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 — En servidores que leen rates desde la base de datos:
-- Tabla T_PREMIUM_RATES (créala si no existe)
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 en algunos builds).Paso 5 — Integrar con el Panel Web
Si usas un panel PHP (AppServ, XAMPP) o ASP.NET webEngineNET, crea el endpoint de activación.
Ejemplo en PHP con MSSQL (PDO):
<?php
// admin/activate_premium.php
require_once '../includes/db.php'; // conexión PDO con 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 vía POST del formulario 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]);
}
?>
Verificación de estado en el perfil del jugador:
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 = 'NombreDelJugador';
Paso 6 — Verificar y Probar
6.1 — Activar manualmente para pruebas:
EXEC sp_ActivatePremium 'TestAccount', 2, 30, 'Admin';
6.2 — Confirmar en la base de datos:
SELECT memb_name, premium_status, premium_tier, premium_expire
FROM MEMB_INFO
WHERE memb_name = 'TestAccount';
6.3 — Probar expiración forzada:
-- Fuerza la expiración de la cuenta de prueba
UPDATE MEMB_INFO
SET premium_expire = DATEADD(MINUTE, -1, GETDATE())
WHERE memb_name = 'TestAccount';
-- Ejecuta la procedure manualmente
EXEC sp_ExpirePremiumAccounts;
-- Verifica que volvió al estado 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'; ``Solución de Problemas Comunes
El GameServer no aplica los rates Premium aunque la base de datos esté actualizada: Verifica si tu versión de MuServer soporta lectura dinámica de rates. En builds más antiguos (pre-2010), los rates están compilados dentro del ejecutable. En esos casos, usa parches de source o edita los valores directamente en el ejecutable con un editor hexadecimal (consulta el foro de tu versión específica).
La procedure sp_ActivatePremium devuelve error de permisos: El usuario SQL utilizado por el DataServer necesita permisos de EXECUTE en estas procedures:
GRANT EXECUTE ON sp_ActivatePremium TO [muserver_user];
GRANT EXECUTE ON sp_ExpirePremiumAccounts TO [muserver_user];
El jugador conserva el estado Premium después de que expira: El GameServer puede tener caché de sesión activa. Fuerza al jugador a reconectarse o reinicia el GameServer para limpiar el caché de cuentas. Reduce AccountCacheTime en DataServer/Data/DataServerInfo.ini para minimizar este retraso:
[DBConfig]
AccountCacheTime = 60 ; en segundos, el valor por defecto suele ser 300
Perguntas frequentes
¿Qué tabla de la base de datos controla el estado Premium?
La tabla principal es MEMB_INFO en la base de datos MuOnline. Se agregan columnas personalizadas como premium_status (TINYINT) y premium_expire (DATETIME), según la versión de tu MuServer.
¿Cómo lee el GameServer el estado Premium en tiempo real?
El GameServer consulta la tabla de cuenta a través del DataServer en cada inicio de sesión o actualización de sesión. La configuración de caché está en DataServer/Data/DataServerInfo.ini — reduce el valor de AccountCacheTime para actualizaciones más rápidas.
¿Es posible tener múltiples niveles VIP (Bronze, Silver, Gold)?
Sí. Usa una columna INT (ej: premium_tier) con valores 0=Normal, 1=Bronze, 2=Silver, 3=Gold y replica la lógica de beneficios para cada nivel en stored procedures o en el código del servidor.
¿Qué sucede cuando la cuenta Premium expira?
Debes crear un SQL Server Agent Job o una rutina en el panel web que ejecute UPDATE MEMB_INFO SET premium_status=0 WHERE premium_expire < GETDATE() periódicamente, revirtiendo los beneficios de forma automática.