El mayor portal de MU Online de Brasil — desde 2003
Tutorial Intermedio Admin

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.

BR Bruno · Actualizado el 5 nov 2024 · ⏱ 21 min de lectura
Respuesta rápida

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.

BeneficioDónde se configuraObservación
EXP aumentadoVIPx_ExpRate en el config del GSBonus más valorado; no exageres
Drop aumentadoVIPx_DropRate en el config del GSImpacta la economía — ajusta con cuidado
Zen extraVIPx_ZenRate en el config del GSEfecto inflacionario si es muy alto
Acceso a mapa exclusivoChequeo de VIP en el mapa (config/GS)Move de gate + spot mejor
Slots extra de personajeColumna de slots en la MEMB_INFODepende de la distribución
Comando exclusivo (ej.: /offlevel)Verificación de nivel VIP en el handlerNo toda season lo tiene
Baúl/almacén expandidoConfig del warehouse por VIPRequiere soporte de la distribución
Nombre coloreado/tag VIPPrefijo en el nombreCosmé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):

NivelDuraciónEXPDropExtra
Bronce30 días+50%+30%Tag VIP
Plata30 días+100%+50%Tag + acceso a mapa VIP
Oro30 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:

  1. Valida la confirmación en el servidor, nunca confíes solo en el retorno del navegador del usuario.
  2. Registra un log de cada activación (cuenta, nivel, días, fecha, referencia del pago) para auditoría y soporte.
  3. Sé idempotente: si el mismo pago se notifica dos veces, no concedas el beneficio doble (guarda el ID de la transacción ya procesada).
  4. 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íntomaCausa probableSolución
Los bonus de VIP no se aplicanSección del config equivocada o Enable=0Confirma el nombre exacto de la sección y reinicia el GS
El VIP nunca expiraJob de expiración ausente y el GS no chequeaCrea el job SQL de UPDATE Active=0 por hora
El jugador reclama que perdió días al renovarLa renovación sobrescribió la fecha en vez de extenderUsa el CASE WHEN ExpireDate > GETDATE() para extender
VIP concedido dobleWebhook de pago procesado dos vecesHaz la activación idempotente por ID de transacción
EXP absurdamente altoFormato del multiplicador mal interpretadoPrueba con un personaje; confirma si es % o factor
El sitio dice "cuenta inexistente"Diferencia de mayúsculas/espacios en el loginNormaliza 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_AtivarVIP creado 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.

BR
Editor de eventos, mapas e ítems

Bruno es especialista en eventos, mapas, bosses y economía de ítems de MU Online. Documenta cada detalle basándose en el juego real.

Sigue leyendo

Artículos relacionados