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

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.

EQ Equipo ViciadosMU · Actualizado el 3 jul 2026 · ⏱ 12 min de lectura

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.

Nota: Este tutorial fue probado en MuServer Season 6 Episode 3 con SQL Server 2008 R2, 2012 y 2019. La lógica es equivalente para Season 9 y Season 13 con ajustes menores en los nombres de tablas.

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 activo
  • premium_tier: 0 = sin nivel, 1 = Bronze, 2 = Silver, 3 = Gold
  • premium_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
Dica: Mantén el registro de activaciones en una tabla separada. Es esencial para auditoría y para resolver disputas de jugadores sobre tiempo Premium no acreditado.

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

  1. En SSMS, expande SQL Server Agent → clic derecho en JobsNew Job
  2. Nombre: PremiumExpiration_Job
  3. En StepsNew Step:
  • Step name: Expire Accounts
  • Type: Transact-SQL script (T-SQL)
  • Database: MuOnline
  • Command:

``sql EXEC sp_ExpirePremiumAccounts; ``

  1. En SchedulesNew Schedule:
  • Name: Hourly
  • Frequency: Daily, recurs every 1 hour
  1. Haz clic en OK para guardar.
Atenção: El SQL Server Agent debe estar ejecutándose como servicio. Verifica en Services (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);
Dica: Después de cambiar rates a través de la base de datos, reinicia el GameServer o ejecuta el comando de recarga de configuración desde la consola del servidor (/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';
Atenção: Siempre prueba con una cuenta dedicada para pruebas, nunca con cuentas de jugadores activos. Realiza un backup de la base de datos antes de cualquier ALTER TABLE en producción: ``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.

EQ

Equipo ViciadosMU

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

Sigue leyendo

Artículos relacionados