Cómo configurar el sistema de VIP y beneficios en MU Online
Monta un sistema de VIP completo en tu servidor de MU Online — tabla de control, niveles, bonus de EXP y drop, beneficios exclusivos e integración con el sitio.
Un sistema de VIP bien hecho es el pilar de sustento de la mayoría de los servidores privados de MU Online. Recompensa a los jugadores que apoyan el proyecto con bonus recurrentes — más experiencia, más drop, accesos exclusivos — y, al mismo tiempo, te da previsibilidad para costear el VPS, la prote
Un sistema de VIP bien hecho es el pilar de sustento de la mayoría de los servidores privados de MU Online. Recompensa a los jugadores que apoyan el proyecto con bonus recurrentes — más experiencia, más drop, accesos exclusivos — y, al mismo tiempo, te da previsibilidad para costear el VPS, la protección anti-DDoS y el desarrollo. Pero un VIP mal configurado tiene dos efectos secundarios graves: si los bonus son exagerados, rompe el balanceo y aleja a quien no paga; si la expiración no funciona, entregas beneficios eternos por error. Esta guía muestra cómo montar el sistema desde cero, cubriendo base de datos, archivo de configuración, tipos de beneficio y la integración con el sitio.
Los ejemplos usan el schema clásico del MuServer (SQL Server, base de datos MuOnline, tabla MEMB_INFO) y la sección [VIP] del archivo de configuración del GameServer. Los nombres de tabla, columnas y parámetros varían según la season/emulador — trata cada fragmento como un ejemplo a adaptar a tu servidor.
Cómo funciona el sistema de VIP
El ciclo de vida de un VIP pasa por cuatro momentos:
1. Activacion (sitio, donacion o comando de GM)
│
2. Graba/actualiza la fila en la tabla de VIP
con fecha de inicio y expiracion
│
3. Al iniciar sesion, el GameServer lee el estado VIP
y aplica los multiplicadores de EXP/Drop/Zen
│
4. Verificacion periodica: si la fecha expiro,
el estado vuelve a normal y los bonus desaparecen
Fíjate que el servidor no "empuja" el VIP en tiempo real: consulta la tabla al iniciar sesión y en un intervalo definido. Esto significa que casi toda la lógica vive en dos lugares — la tabla de control y el archivo de configuración — y es por ahí que empezamos.
Requisitos previos
Antes de configurar, asegúrate de tener:
- Servidor de MU funcional (GameServer, ConnectServer y base de datos en línea). Si aún no llegaste a ese punto, sigue primero la guía de cómo crear un servidor de MU Online.
- Acceso al SQL Server con permiso para crear tablas y procedures en la base de datos del juego.
- Acceso a los archivos de configuración del GameServer (generalmente en
GameServer/Data/o similar). - Respaldo de la base de datos antes de crear tablas nuevas.
- Sitio del servidor (si vas a automatizar la venta/donación de VIP), con conexión PHP/PDO a la base de datos.
- Plan de niveles definido: cuántos niveles, qué bonus y por cuánto tiempo.
Paso 1 — Crear la tabla de control de VIP
Algunas distribuciones ya traen esta tabla. Si la tuya no la tiene, crea una dedicada — es más limpio que esparcir columnas por la MEMB_INFO:
USE MuOnline;
GO
CREATE TABLE MEMB_VIP (
AccountID VARCHAR(10) NOT NULL, -- login (FK logica a MEMB_INFO)
VipLevel TINYINT NOT NULL DEFAULT 1, -- 1=Bronce, 2=Plata, 3=Oro
StartDate DATETIME NOT NULL DEFAULT GETDATE(),
ExpireDate DATETIME NOT NULL, -- fecha de expiracion
Active TINYINT NOT NULL DEFAULT 1, -- 1=activo, 0=expirado
CONSTRAINT PK_MEMB_VIP PRIMARY KEY (AccountID)
);
GO
-- Indice para que el GameServer recorra expiraciones rapidamente
CREATE INDEX IX_VIP_Expire ON MEMB_VIP (ExpireDate, Active);
GO
Alternativa: columnas en la MEMB_INFO
Las distribuciones que esperan el VIP incorporado a veces leen directo de la cuenta:
ALTER TABLE MEMB_INFO ADD VipLevel TINYINT DEFAULT 0;
ALTER TABLE MEMB_INFO ADD VipExpire DATETIME NULL;
GO
Verifica qué modelo usa tu distribución antes de elegir — el GameServer solo aplica el VIP si lee de la estructura que él espera.
Paso 2 — Activar VIP para una cuenta
Para dar o extender VIP, el estándar es: si ya existe, extiende a partir de la mayor fecha entre "ahora" y la expiración actual (así nadie pierde días al renovar); si no existe, lo crea.
-- Dar/extender VIP nivel 1 por 30 dias para la cuenta 'jogador01'
IF EXISTS (SELECT 1 FROM MEMB_VIP WHERE AccountID = 'jogador01')
UPDATE MEMB_VIP
SET ExpireDate = DATEADD(DAY, 30,
CASE WHEN ExpireDate > GETDATE() THEN ExpireDate ELSE GETDATE() END),
VipLevel = 1,
Active = 1
WHERE AccountID = 'jogador01';
ELSE
INSERT INTO MEMB_VIP (AccountID, VipLevel, StartDate, ExpireDate)
VALUES ('jogador01', 1, GETDATE(), DATEADD(DAY, 30, GETDATE()));
GO
Empaquetar esto en un procedure evita la repetición y facilita la llamada desde el sitio:
CREATE PROCEDURE sp_AtivarVIP
@conta VARCHAR(10),
@nivel TINYINT = 1,
@dias INT = 30
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM MEMB_INFO WHERE memb___id = @conta)
BEGIN RAISERROR('Cuenta inexistente', 16, 1); RETURN; END;
IF EXISTS (SELECT 1 FROM MEMB_VIP WHERE AccountID = @conta)
UPDATE MEMB_VIP
SET ExpireDate = DATEADD(DAY, @dias,
CASE WHEN ExpireDate > GETDATE() THEN ExpireDate ELSE GETDATE() END),
VipLevel = @nivel, Active = 1
WHERE AccountID = @conta;
ELSE
INSERT INTO MEMB_VIP (AccountID, VipLevel, StartDate, ExpireDate)
VALUES (@conta, @nivel, GETDATE(), DATEADD(DAY, @dias, GETDATE()));
END;
GO
-- Uso:
EXEC sp_AtivarVIP 'jogador01', 2, 30; -- VIP Plata por 30 dias
Paso 3 — Configurar los bonus en el archivo del GameServer
Aquí es donde el VIP "cobra efecto". La sección exacta varía según la season/emulador, pero el formato suele parecerse a este:
; ===== SISTEMA VIP =====
[VIP]
Enable = 1 ; enciende el sistema de VIP
; --- Nivel 1 (Bronce) ---
VIP1_ExpRate = 150 ; +50% de EXP (150% del valor base) — el formato varia
VIP1_DropRate = 130 ; +30% de drop
VIP1_ZenRate = 120 ; +20% de zen
; --- Nivel 2 (Plata) ---
VIP2_ExpRate = 200 ; +100% de EXP
VIP2_DropRate = 150
VIP2_ZenRate = 140
; --- Nivel 3 (Oro) ---
VIP3_ExpRate = 300 ; +200% de EXP
VIP3_DropRate = 200
VIP3_ZenRate = 180
CheckInterval = 60 ; segundos entre verificaciones de expiracion
ExpireNotify = 1 ; avisa al jugador cuando el VIP expira
> Atención al formato del multiplicador: algunas distribuciones usan porcentaje (150 = +50%), otras usan factor absoluto (2 = 2x), y otras suman al rate base. Lee el archivo de tu distribución y prueba con un personaje antes de anunciar los números a los jugadores.
Después de editar, reinicia el GameServer para cargar la configuración.
Paso 4 — Elegir los beneficios de cada nivel
Los bonus de EXP y drop son el comienzo, no el fin. La tabla de abajo lista beneficios comunes y cómo suele implementarse cada uno. No todos existen en toda season — confirma el soporte en tu distribución.
| Beneficio | Dónde se configura | Observación |
|---|---|---|
| EXP aumentado | VIPx_ExpRate en el config del GS | Bonus más valorado; no exageres |
| Drop aumentado | VIPx_DropRate en el config del GS | Impacta la economía — ajusta con cuidado |
| Zen extra | VIPx_ZenRate en el config del GS | Efecto inflacionario si es muy alto |
| Acceso a mapa exclusivo | Chequeo de VIP en el mapa (config/GS) | Move de gate + spot mejor |
| Slots extra de personaje | Columna de slots en la MEMB_INFO | Depende de la distribución |
| Comando exclusivo (ej.: /offlevel) | Verificación de nivel VIP en el handler | No toda season lo tiene |
| Baúl/almacén expandido | Config del warehouse por VIP | Requiere soporte de la distribución |
| Nombre coloreado/tag VIP | Prefijo en el nombre | Cosmético, alta percepción de valor |
Una estructura de niveles equilibrada, solo como ejemplo (los valores varían según la season/emulador y según tu público):
| Nivel | Duración | EXP | Drop | Extra |
|---|---|---|---|---|
| Bronce | 30 días | +50% | +30% | Tag VIP |
| Plata | 30 días | +100% | +50% | Tag + acceso a mapa VIP |
| Oro | 30 días | +200% | +100% | Todo + slot extra + comando |
> Los precios y la decisión de monetizar son tuyos. Los servidores privados de MU tienen restricciones de derechos de autor; mantén el proyecto como hobby sin fines de lucro y trata los valores solo como referencia de estructuración.
Paso 5 — Consultar y gestionar VIPs
Tener comandos SQL de mantenimiento a mano evita dolores de cabeza en el día a día.
-- VIPs activos y dias restantes
SELECT AccountID, VipLevel,
DATEDIFF(DAY, GETDATE(), ExpireDate) AS DiasRestantes
FROM MEMB_VIP
WHERE ExpireDate > GETDATE() AND Active = 1
ORDER BY ExpireDate ASC;
GO
-- Marcar expirados (ejecuta como job programado)
UPDATE MEMB_VIP
SET Active = 0
WHERE ExpireDate < GETDATE() AND Active = 1;
GO
-- Remover VIP de una cuenta manualmente
UPDATE MEMB_VIP
SET Active = 0, ExpireDate = GETDATE()
WHERE AccountID = 'jogador01';
GO
Programa el UPDATE de expiración como un SQL Server Agent Job (cada hora, por ejemplo) para mantener la tabla coherente aunque el GameServer no haga la limpieza.
Paso 6 — Integrar con el sitio
El objetivo final es dar VIP sin intervención manual tras una donación confirmada. Del lado del sitio (PHP/PDO), la llamada es simple porque la lógica está en el procedure:
<?php
// dar-vip.php — llamado tras confirmar el pago
function ativarVip(PDO $db, string $conta, int $nivel, int $dias): bool {
$stmt = $db->prepare("EXEC sp_AtivarVIP :conta, :nivel, :dias");
$stmt->bindValue(':conta', $conta);
$stmt->bindValue(':nivel', $nivel, PDO::PARAM_INT);
$stmt->bindValue(':dias', $dias, PDO::PARAM_INT);
return $stmt->execute();
}
// Uso, tras validar la confirmacion de pago del proveedor:
// ativarVip($db, $contaDoUsuario, 2, 30);
Buenas prácticas de integración:
- Valida la confirmación en el servidor, nunca confíes solo en el retorno del navegador del usuario.
- Registra un log de cada activación (cuenta, nivel, días, fecha, referencia del pago) para auditoría y soporte.
- Sé idempotente: si el mismo pago se notifica dos veces, no concedas el beneficio doble (guarda el ID de la transacción ya procesada).
- Muestra en el sitio los días restantes de VIP del jugador, leyendo la
MEMB_VIP— reduce los tickets de soporte.
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| Los bonus de VIP no se aplican | Sección del config equivocada o Enable=0 | Confirma el nombre exacto de la sección y reinicia el GS |
| El VIP nunca expira | Job de expiración ausente y el GS no chequea | Crea el job SQL de UPDATE Active=0 por hora |
| El jugador reclama que perdió días al renovar | La renovación sobrescribió la fecha en vez de extender | Usa el CASE WHEN ExpireDate > GETDATE() para extender |
| VIP concedido doble | Webhook de pago procesado dos veces | Haz la activación idempotente por ID de transacción |
| EXP absurdamente alto | Formato del multiplicador mal interpretado | Prueba con un personaje; confirma si es % o factor |
| El sitio dice "cuenta inexistente" | Diferencia de mayúsculas/espacios en el login | Normaliza el login antes de llamar al procedure |
Lista de verificación de lanzamiento
- Respaldo de la base de datos hecho antes de crear tablas/procedures
- Tabla
MEMB_VIP(o columnas equivalentes) creada e indexada - Procedure
sp_AtivarVIPcreado y probado con una cuenta real - Sección
[VIP]del config completada y GameServer reiniciado - Multiplicadores probados con un personaje (formato % vs factor confirmado)
- Niveles y beneficios documentados para el equipo y para los jugadores
- Job SQL de expiración programado y validado
- Integración con el sitio probada con un pago de prueba
- Activación idempotente confirmada (notificación doble no duplica el VIP)
- Panel del jugador mostrando días restantes de VIP
- Log de activaciones funcionando para auditoría y soporte
Preguntas frecuentes
¿Necesito modificar el ejecutable del GameServer para tener VIP?
En la mayoría de las distribuciones no. El soporte a VIP ya viene incorporado y se activa por el archivo de configuración y por una tabla en la base de datos. Solo distribuciones muy antiguas exigen editar código para tratar niveles.
¿Cuántos niveles de VIP debo crear?
Tres suele ser el equilibrio ideal — algo como Bronce, Plata y Oro. Menos que eso limita la progresión de valor; más que eso confunde al jugador y da trabajo balancear los bonus de cada capa.
¿Cómo sabe el servidor cuándo expiró el VIP?
El GameServer verifica la fecha de expiración de la tabla de VIP en un intervalo configurable y al iniciar sesión. Cuando la fecha pasa, el estado se revierte y los bonus dejan de aplicarse en la sesión siguiente.
¿Puedo dar VIP automáticamente tras una donación en el sitio?
Sí. El flujo estándar es: el sitio recibe la confirmación de pago, llama a un procedure o hace un UPDATE en la tabla de VIP con la nueva fecha de expiración, y el GameServer aplica los bonus en la próxima sesión del jugador.
¿VIP y Cash Shop son lo mismo?
No. El VIP concede bonus recurrentes por tiempo (EXP, drop, accesos) mientras la suscripción está activa. El Cash Shop vende ítems sueltos por moneda virtual. Muchos servidores usan ambos sistemas juntos.