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.
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_owneren la base de datosMuOnline - 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 gastarcLevel_Reset— contador acumulado de resetsResetCount— campo alternativo usado en algunas builds; verifica cuál usa tu versión
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.
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
Character antes de cualquier UPDATE masivo: SELECT * INTO Character_Backup_20260703 FROM dbo.CharacterPaso 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
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.