Como Configurar Sistema de Resets Customizado no Servidor de MU
Aprenda a configurar um sistema de resets personalizado no seu servidor MU Online com SQL, arquivos .ini e lógica de pontos customizada.
Introdução
O sistema de resets é um dos pilares de qualquer servidor MU Online privado. Ele define o ritmo de progressão, o engajamento a longo prazo e o equilíbrio entre jogadores. Configurá-lo de forma genérica costuma resultar em servidores que ficam vazios em semanas.
Este tutorial cobre a configuração completa de um sistema de resets customizado para servidores rodando Season 6 Episode 3 com SQL Server 2008 ou superior. Os conceitos se aplicam com pequenos ajustes a outras seasons.
Pré-requisitos
- Acesso ao SQL Server Management Studio (SSMS) com permissões de
db_ownerno bancoMuOnline - Acesso ao diretório de instalação do GameServer (ex.:
C:\MuServer\GameServer\) - Servidor parado ou em manutenção durante as alterações no banco
Passo 1 — Entender a estrutura padrão do reset no banco
A tabela principal que controla o reset é Character dentro do banco MuOnline. Os campos mais importantes são:
SELECT Name, cLevel, LevelUpPoint, cLevel_Reset, ResetCount
FROM MuOnline.dbo.Character
WHERE Name = 'NomeDoPersonagem'
cLevel— nível atual do personagem (1 a 400)LevelUpPoint— pontos de atributo disponíveiscLevel_Reset— contador de resets acumuladosResetCount— campo alternativo usado em algumas builds; verifique qual sua versão utiliza
AccountCharacter como ResetCount. Consulte a estrutura com sp_help AccountCharacter antes de prosseguir.Passo 2 — Configurar o GameServerInfo.ini
Abra o arquivo GameServer/Data/GameServerInfo.ini e localize a seção de resets:
[ResetSystem]
; Ativar sistema de resets (0=desativado, 1=ativado)
ResetSystem=1
; Nível mínimo para realizar o reset
ResetMinLevel=400
; Nível após o reset (geralmente 1, alguns servidores usam 150)
ResetLevel=1
; Zen necessário para resetar (0 = gratuito)
ResetZen=0
; Pontos base concedidos por reset
ResetPoint=100
; Resetar os stats (STR/AGI/VIT/ENE/CMD) ao fazer reset?
ResetStats=1
; Acumular resets (1) ou limite máximo (0)
ResetAccumulate=1
; Limite máximo de resets (0 = sem limite)
MaxReset=100
Salve o arquivo após as alterações.
ResetLevel=150 em servidores com EXP muito alta para reduzir o tempo de re-nível e manter os jogadores engajados durante o processo.Passo 3 — Criar a stored procedure de reset customizada
Se o servidor não possui uma stored procedure de reset, ou você quer customizá-la, execute o seguinte no SSMS conectado ao banco 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
-- Buscar dados atuais do personagem
SELECT @CurrentLevel = cLevel, @CurrentReset = cLevel_Reset
FROM dbo.Character
WHERE Name = @CharName
-- Validar nível mínimo
IF @CurrentLevel < @MinLevel
BEGIN
SELECT -1 AS Result, 'Nível insuficiente para reset.' AS Message
RETURN
END
-- Calcular pontos de bônus acumulados (opcional: escala por reset)
SET @BasePoints = @PointsPerReset + (@CurrentReset * 5)
-- Executar o 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 com sucesso.' AS Message
END
GO
Character antes de executar qualquer UPDATE em massa: SELECT * INTO Character_Backup_20260703 FROM dbo.CharacterPasso 4 — Criar tabela de bônus por faixa de resets
Para implementar escalonamento de pontos, crie a tabela 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)
Adapte a procedure para usar essa tabela:
-- Dentro da stored procedure, substitua o cálculo de @BasePoints por:
SELECT @BasePoints = BonusPoints
FROM dbo.ResetBonusTable
WHERE @CurrentReset >= MinReset AND @CurrentReset <= MaxReset
Passo 5 — Configurar cobrança de Wcoin (opcional)
Para cobrar WebCoin (Wcoin) no reset, adicione a validação antes do UPDATE principal:
DECLARE @WCoin INT
SELECT @WCoin = WCoinP
FROM dbo.AccountCharacter
WHERE GameIDC = (SELECT AccountID FROM dbo.Character WHERE Name = @CharName)
IF @WCoin < 500 -- custo em 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)
Passo 6 — Verificar permissões do GameServer no banco
O processo do GameServer acessa o banco com uma conta específica. Garanta que ela tem permissão para executar a procedure:
-- Substitua 'mu_gameserver' pelo login real usado pelo 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
Passo 7 — Testar o reset manualmente
Com o servidor em modo de manutenção, execute uma chamada de teste:
EXEC dbo.sp_ResetCharacter
@CharName = 'TestChar',
@MinLevel = 400,
@ResetLevel = 1,
@PointsPerReset = 100
-- Verificar resultado
SELECT Name, cLevel, LevelUpPoint, cLevel_Reset
FROM dbo.Character
WHERE Name = 'TestChar'
O campo cLevel deve ser 1, cLevel_Reset deve ter incrementado em 1, e LevelUpPoint deve refletir o valor calculado.
Solução de Problemas
Reset não funciona após salvar o .ini
Reinicie o GameServer completamente. Alterações no GameServerInfo.ini não são carregadas em tempo real — o arquivo é lido apenas na inicialização.
Pontos de reset não aparecem no personagem
Verifique se o campo correto é LevelUpPoint ou AddPoint na sua versão. Execute:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Character' AND COLUMN_NAME LIKE '%Point%'
Múltiplos resets simultâneos causando duplicação
Adicione um mecanismo de lock na procedure:
BEGIN TRANSACTION
-- todo o bloco de UPDATE aqui
COMMIT TRANSACTION
INSERT INTO ResetLog (CharName, ResetDate, ResetNumber) VALUES (@CharName, GETDATE(), @CurrentReset + 1). Isso facilita auditorias e suporte aos jogadores.Conclusão
Com esses passos você tem um sistema de resets funcional, escalável e auditável. Ajuste os valores de PointsPerReset, os limites da ResetBonusTable e o custo em Zen/Wcoin de acordo com o equilíbrio desejado para o seu servidor. Teste sempre em ambiente de homologação antes de aplicar em produção.
Perguntas frequentes
Qual é o nível mínimo recomendado para permitir o reset?
Para Season 6, o padrão é nível 400 (Master Level 0). Muitos servidores usam 380 ou 350 dependendo das rates. Defina em GameServer/Data/GameServerInfo.ini no campo ResetMinLevel.
O reset está diminuindo os pontos de status mas não resetando o nível — o que fazer?
Verifique se a stored procedure sp_ResetCharacter existe no banco MuOnline e se o GameServer tem permissão de execução (EXECUTE) nela. Rode GRANT EXECUTE ON sp_ResetCharacter TO [conta_gameserver]; no SQL Server.
Como adicionar bônus de pontos por número de resets?
Use uma tabela auxiliar chamada ResetBonus com as colunas ResetCount e BonusPoints, depois adapte a stored procedure para fazer um SELECT nessa tabela com base no campo cLevel_Reset da tabela Character.
É possível cobrar Zen ou Wcoin no reset?
Sim. Na stored procedure, adicione um UPDATE na tabela AccountCharacter decrementando o campo WCoinP (ou na tabela Character o campo Money) antes de confirmar o reset. Inclua um IF para bloquear caso o saldo seja insuficiente.