How to Configure Custom Reset System on MU Server
Learn how to configure a custom reset system on your MU Online server with SQL, .ini files, and scalable point bonus logic.
Introduction
The reset system is one of the cornerstones of any private MU Online server. It defines the progression pace, long-term engagement, and the balance between players. Configuring it generically often results in servers that empty out within weeks.
This tutorial covers the complete configuration of a custom reset system for servers running Season 6 Episode 3 with SQL Server 2008 or later. The concepts apply with minor adjustments to other seasons.
Prerequisites
- Access to SQL Server Management Studio (SSMS) with
db_ownerpermissions on theMuOnlinedatabase - Access to the GameServer installation directory (e.g.,
C:\MuServer\GameServer\) - Server stopped or in maintenance mode during database changes
Step 1 — Understand the Default Reset Structure in the Database
The main table that controls resets is Character inside the MuOnline database. The most important fields are:
SELECT Name, cLevel, LevelUpPoint, cLevel_Reset, ResetCount
FROM MuOnline.dbo.Character
WHERE Name = 'CharacterName'
cLevel— current character level (1 to 400)LevelUpPoint— available stat points to spendcLevel_Reset— accumulated reset counterResetCount— alternative field used in some builds; verify which one your version uses
AccountCharacter table as ResetCount. Inspect the structure with sp_help AccountCharacter before proceeding.Step 2 — Configure GameServerInfo.ini
Open GameServer/Data/GameServerInfo.ini and locate the resets section:
[ResetSystem]
; Enable the reset system (0=disabled, 1=enabled)
ResetSystem=1
; Minimum level required to perform a reset
ResetMinLevel=400
; Level after reset (usually 1, some servers use 150)
ResetLevel=1
; Zen required to reset (0 = free)
ResetZen=0
; Base stat points granted per reset
ResetPoint=100
; Reset stats (STR/AGI/VIT/ENE/CMD) on each reset?
ResetStats=1
; Accumulate resets (1) or enforce a maximum (0)
ResetAccumulate=1
; Maximum number of resets allowed (0 = no limit)
MaxReset=100
Save the file after making changes.
ResetLevel=150 on servers with very high EXP rates to reduce the re-leveling time and keep players engaged during the process.Step 3 — Create a Custom Reset Stored Procedure
If the server does not already have a reset stored procedure, or you want to customize the existing one, run the following in SSMS connected to the MuOnline database:
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
-- Fetch current character data
SELECT @CurrentLevel = cLevel, @CurrentReset = cLevel_Reset
FROM dbo.Character
WHERE Name = @CharName
-- Validate minimum level
IF @CurrentLevel < @MinLevel
BEGIN
SELECT -1 AS Result, 'Insufficient level for reset.' AS Message
RETURN
END
-- Calculate bonus points (optional: scale by reset count)
SET @BasePoints = @PointsPerReset + (@CurrentReset * 5)
-- Perform the 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 completed successfully.' AS Message
END
GO
Character table before running any mass UPDATE: SELECT * INTO Character_Backup_20260703 FROM dbo.CharacterStep 4 — Create a Bonus Points Table Scaled by Reset Count
To implement tiered scaling of bonus points, create the following auxiliary table:
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)
Then update the procedure to use this table:
-- Inside the stored procedure, replace the @BasePoints calculation with:
SELECT @BasePoints = BonusPoints
FROM dbo.ResetBonusTable
WHERE @CurrentReset >= MinReset AND @CurrentReset <= MaxReset
Step 5 — Configure Wcoin Cost for Resets (Optional)
To charge WebCoin (Wcoin) for each reset, add a balance check before the main UPDATE block:
DECLARE @WCoin INT
SELECT @WCoin = WCoinP
FROM dbo.AccountCharacter
WHERE GameIDC = (SELECT AccountID FROM dbo.Character WHERE Name = @CharName)
IF @WCoin < 500 -- cost in Wcoin
BEGIN
SELECT -2 AS Result, 'Insufficient Wcoin.' AS Message
RETURN
END
UPDATE dbo.AccountCharacter
SET WCoinP = WCoinP - 500
WHERE GameIDC = (SELECT AccountID FROM dbo.Character WHERE Name = @CharName)
Step 6 — Verify GameServer Database Permissions
The GameServer process connects to the database using a specific SQL login. Ensure it has the correct permissions:
-- Replace 'mu_gameserver' with the actual login used by the 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
Step 7 — Test the Reset Manually
With the server in maintenance mode, run a test call:
EXEC dbo.sp_ResetCharacter
@CharName = 'TestChar',
@MinLevel = 400,
@ResetLevel = 1,
@PointsPerReset = 100
-- Verify the result
SELECT Name, cLevel, LevelUpPoint, cLevel_Reset
FROM dbo.Character
WHERE Name = 'TestChar'
The cLevel field should be 1, cLevel_Reset should have incremented by 1, and LevelUpPoint should reflect the calculated value.
Troubleshooting
Reset does not work after saving the .ini file
Restart the GameServer completely. Changes to GameServerInfo.ini are not loaded at runtime — the file is only read during startup.
Reset points do not appear on the character
Check whether the correct field in your build is LevelUpPoint or AddPoint. Run the following query:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Character' AND COLUMN_NAME LIKE '%Point%'
Simultaneous resets causing stat duplication
Add transaction control to the procedure:
BEGIN TRANSACTION
-- all UPDATE statements here
COMMIT TRANSACTION
INSERT INTO ResetLog (CharName, ResetDate, ResetNumber) VALUES (@CharName, GETDATE(), @CurrentReset + 1). This makes player support and audits significantly easier.Conclusion
With these steps you have a functional, scalable, and auditable reset system. Adjust the PointsPerReset values, the ResetBonusTable tiers, and the Zen/Wcoin cost to match the desired balance for your server. Always test in a staging environment before applying changes to production.
Perguntas frequentes
What is the recommended minimum level to allow a reset?
For Season 6, the standard is level 400 (Master Level 0). Many servers use 380 or 350 depending on their rates. Set this in GameServer/Data/GameServerInfo.ini under the ResetMinLevel field.
The reset is reducing stat points but not resetting the level — what should I do?
Check that the stored procedure sp_ResetCharacter exists in the MuOnline database and that the GameServer account has EXECUTE permission on it. Run GRANT EXECUTE ON sp_ResetCharacter TO [gameserver_account]; in SQL Server Management Studio.
How do I add bonus points that scale with reset count?
Create an auxiliary table called ResetBonusTable with columns MinReset, MaxReset, and BonusPoints, then update the stored procedure to SELECT from that table based on the cLevel_Reset field in the Character table.
Is it possible to charge Zen or Wcoin for each reset?
Yes. Inside the stored procedure, add an UPDATE on the AccountCharacter table to decrement the WCoinP field (or the Money field in the Character table for Zen) before confirming the reset. Include an IF check to abort if the balance is insufficient.