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

Cómo Configurar el Sistema de Resets Personalizado en el Servidor de MU

Aprende a configurar un sistema de resets personalizado en tu servidor MU Online con SQL, archivos .ini y lógica de puntos bonus escalable.

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

Introducción

El sistema de resets es uno de los pilares de cualquier servidor privado de MU Online. Define el ritmo de progresión, el compromiso a largo plazo y el equilibrio entre jugadores. Configurarlo de forma genérica suele resultar en servidores que se vacían en pocas semanas.

Este tutorial cubre la configuración completa de un sistema de resets personalizado para servidores con Season 6 Episode 3 y SQL Server 2008 o superior. Los conceptos se aplican con pequeños ajustes a otras seasons.


Requisitos Previos

  • Acceso a SQL Server Management Studio (SSMS) con permisos de db_owner en la base de datos MuOnline
  • Acceso al directorio de instalación del GameServer (ej.: C:\MuServer\GameServer\)
  • Servidor detenido o en mantenimiento durante los cambios en la base de datos

Paso 1 — Comprender la Estructura de Reset en la Base de Datos

La tabla principal que controla los resets es Character dentro de la base de datos MuOnline. Los campos más importantes son:

SELECT Name, cLevel, LevelUpPoint, cLevel_Reset, ResetCount
FROM MuOnline.dbo.Character
WHERE Name = 'NombrePersonaje'
  • cLevel — nivel actual del personaje (1 a 400)
  • LevelUpPoint — puntos de estadística disponibles para gastar
  • cLevel_Reset — contador acumulado de resets
  • ResetCount — campo alternativo usado en algunas builds; verifica cuál usa tu versión
Nota: En algunas builds de S6, el campo de reset se encuentra en la tabla AccountCharacter como ResetCount. Inspecciona la estructura con sp_help AccountCharacter antes de continuar.

Paso 2 — Configurar el GameServerInfo.ini

Abre el archivo GameServer/Data/GameServerInfo.ini y localiza la sección de resets:

[ResetSystem]
; Activar el sistema de resets (0=desactivado, 1=activado)
ResetSystem=1

; Nivel mínimo requerido para realizar el reset
ResetMinLevel=400

; Nivel del personaje después del reset (generalmente 1, algunos servidores usan 150)
ResetLevel=1

; Zen requerido para resetear (0 = gratuito)
ResetZen=0

; Puntos de estadística base otorgados por reset
ResetPoint=100

; ¿Resetear los stats (STR/AGI/VIT/ENE/CMD) en cada reset?
ResetStats=1

; Acumular resets (1) o aplicar un límite máximo (0)
ResetAccumulate=1

; Número máximo de resets permitidos (0 = sin límite)
MaxReset=100

Guarda el archivo tras realizar los cambios.

Dica: Usa ResetLevel=150 en servidores con EXP muy alta para reducir el tiempo de re-nivelación y mantener a los jugadores activos durante el proceso.

Paso 3 — Crear el Procedimiento Almacenado de Reset Personalizado

Si el servidor no tiene un procedimiento de reset, o deseas personalizarlo, ejecuta lo siguiente en SSMS conectado a la base de datos MuOnline:

USE MuOnline
GO

IF OBJECT_ID('dbo.sp_ResetCharacter', 'P') IS NOT NULL
    DROP PROCEDURE dbo.sp_ResetCharacter
GO

CREATE PROCEDURE dbo.sp_ResetCharacter
    @CharName NVARCHAR(10),
    @MinLevel INT = 400,
    @ResetLevel INT = 1,
    @PointsPerReset INT = 100
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @CurrentLevel INT
    DECLARE @CurrentReset INT
    DECLARE @BasePoints INT

    -- Obtener datos actuales del personaje
    SELECT @CurrentLevel = cLevel, @CurrentReset = cLevel_Reset
    FROM dbo.Character
    WHERE Name = @CharName

    -- Validar nivel mínimo
    IF @CurrentLevel < @MinLevel
    BEGIN
        SELECT -1 AS Result, 'Nivel insuficiente para el reset.' AS Message
        RETURN
    END

    -- Calcular puntos bonus (opcional: escala por número de resets)
    SET @BasePoints = @PointsPerReset + (@CurrentReset * 5)

    -- Ejecutar el reset
    UPDATE dbo.Character
    SET
        cLevel       = @ResetLevel,
        LevelUpPoint = @BasePoints,
        Strength     = 20,
        Dexterity    = 20,
        Vitality     = 20,
        Energy       = 20,
        Leadership   = 0,
        cLevel_Reset = cLevel_Reset + 1,
        Experience   = 0,
        NextExperience = 100
    WHERE Name = @CharName

    SELECT 1 AS Result, 'Reset realizado con éxito.' AS Message
END
GO
Atenção: Haz un respaldo de la tabla Character antes de cualquier UPDATE masivo: SELECT * INTO Character_Backup_20260703 FROM dbo.Character

Paso 4 — Crear Tabla de Puntos Bonus por Rango de Resets

Para implementar escalado de puntos por nivel de resets, crea la tabla auxiliar:

CREATE TABLE dbo.ResetBonusTable (
    MinReset    INT NOT NULL,
    MaxReset    INT NOT NULL,
    BonusPoints INT NOT NULL,
    CONSTRAINT PK_ResetBonus PRIMARY KEY (MinReset)
)

INSERT INTO dbo.ResetBonusTable VALUES (0,  9,   100)
INSERT INTO dbo.ResetBonusTable VALUES (10, 24,  120)
INSERT INTO dbo.ResetBonusTable VALUES (25, 49,  150)
INSERT INTO dbo.ResetBonusTable VALUES (50, 99,  200)
INSERT INTO dbo.ResetBonusTable VALUES (100, 999, 250)

Adapta el procedimiento para usar esta tabla:

-- Dentro del procedimiento almacenado, reemplaza el cálculo de @BasePoints con:
SELECT @BasePoints = BonusPoints
FROM dbo.ResetBonusTable
WHERE @CurrentReset >= MinReset AND @CurrentReset <= MaxReset

Paso 5 — Configurar Cobro de Wcoin por Reset (Opcional)

Para cobrar WebCoin (Wcoin) en cada reset, agrega la validación antes del bloque de UPDATE principal:

DECLARE @WCoin INT

SELECT @WCoin = WCoinP
FROM dbo.AccountCharacter
WHERE GameIDC = (SELECT AccountID FROM dbo.Character WHERE Name = @CharName)

IF @WCoin < 500  -- costo en Wcoin
BEGIN
    SELECT -2 AS Result, 'Wcoin insuficiente.' AS Message
    RETURN
END

UPDATE dbo.AccountCharacter
SET WCoinP = WCoinP - 500
WHERE GameIDC = (SELECT AccountID FROM dbo.Character WHERE Name = @CharName)

Paso 6 — Verificar Permisos del GameServer en la Base de Datos

El proceso del GameServer se conecta a la base de datos con un login específico. Asegúrate de que tenga los permisos correctos:

-- Reemplaza 'mu_gameserver' con el login real que usa el GameServer
GRANT EXECUTE ON dbo.sp_ResetCharacter TO mu_gameserver
GRANT SELECT ON dbo.ResetBonusTable TO mu_gameserver
GRANT UPDATE ON dbo.AccountCharacter TO mu_gameserver

Paso 7 — Probar el Reset Manualmente

Con el servidor en modo de mantenimiento, ejecuta una llamada de prueba:

EXEC dbo.sp_ResetCharacter
    @CharName      = 'TestChar',
    @MinLevel      = 400,
    @ResetLevel    = 1,
    @PointsPerReset = 100

-- Verificar el resultado
SELECT Name, cLevel, LevelUpPoint, cLevel_Reset
FROM dbo.Character
WHERE Name = 'TestChar'

El campo cLevel debe ser 1, cLevel_Reset debe haber incrementado en 1, y LevelUpPoint debe reflejar el valor calculado.


Solución de Problemas

El reset no funciona después de guardar el .ini

Reinicia el GameServer por completo. Los cambios en GameServerInfo.ini no se cargan en tiempo de ejecución — el archivo solo se lee al iniciar el servidor.

Los puntos de reset no aparecen en el personaje

Verifica si el campo correcto en tu build es LevelUpPoint o AddPoint. Ejecuta:

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Character' AND COLUMN_NAME LIKE '%Point%'

Resets simultáneos provocan duplicación de estadísticas

Agrega control de transacciones al procedimiento:

BEGIN TRANSACTION
-- todos los UPDATE aquí
COMMIT TRANSACTION
Dica: Registra cada reset en una tabla de auditoría: INSERT INTO ResetLog (CharName, ResetDate, ResetNumber) VALUES (@CharName, GETDATE(), @CurrentReset + 1). Esto facilita enormemente el soporte a jugadores y las auditorías del servidor.

Conclusión

Con estos pasos tienes un sistema de resets funcional, escalable y auditable. Ajusta los valores de PointsPerReset, los rangos de la ResetBonusTable y el costo en Zen/Wcoin según el equilibrio deseado para tu servidor. Prueba siempre en un entorno de pruebas antes de aplicar los cambios en producción.

Perguntas frequentes

¿Cuál es el nivel mínimo recomendado para permitir el reset?

Para Season 6, el estándar es el nivel 400 (Master Level 0). Muchos servidores usan 380 o 350 según las rates configuradas. Define esto en GameServer/Data/GameServerInfo.ini en el campo ResetMinLevel.

El reset reduce los puntos de estadística pero no resetea el nivel — ¿qué hago?

Verifica que el procedimiento almacenado sp_ResetCharacter exista en la base de datos MuOnline y que la cuenta del GameServer tenga permiso EXECUTE sobre él. Ejecuta GRANT EXECUTE ON sp_ResetCharacter TO [cuenta_gameserver]; en SQL Server.

¿Cómo agregar puntos bonus que escalen con la cantidad de resets?

Crea una tabla auxiliar llamada ResetBonusTable con las columnas MinReset, MaxReset y BonusPoints, luego adapta el procedimiento almacenado para hacer un SELECT en esa tabla basándote en el campo cLevel_Reset de la tabla Character.

¿Es posible cobrar Zen o Wcoin por cada reset?

Sí. Dentro del procedimiento almacenado, agrega un UPDATE en la tabla AccountCharacter decrementando el campo WCoinP (o el campo Money en la tabla Character para Zen) antes de confirmar el reset. Incluye un IF para cancelar si el saldo es insuficiente.

EQ

Equipo ViciadosMU

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

Sigue leyendo

Artículos relacionados