Como Configurar um Subserver PvP Dedicado no Servidor de MU
Aprenda a criar e configurar um subserver PvP isolado no MuServer S6, com mapas restritos, regras de kill e recompensas SQL personalizadas.
Um subserver PvP dedicado permite isolar o combate entre jogadores em mapas específicos, aplicar regras próprias de kill, e oferecer recompensas exclusivas sem interferir no fluxo do servidor principal. Este guia cobre a configuração completa para MuServer Season 6 Episode 3, mas os conceitos se aplicam a outras seasons com ajustes de caminho.
Pré-requisitos
Antes de começar, garanta que você tem:
- MuServer S6 EP3 já funcional com GameServer, ConnectServer e DataServer operacionais
- Acesso ao SQL Server Management Studio (SSMS) com permissão DBO no banco
MuOnline - Duas portas TCP liberadas no firewall: uma para o subserver (ex:
55902) e outra para o connect routing (ex:44405) - Uma cópia completa da pasta
GameServer/para servir como base do subserver
Passo 1 — Criar a Segunda Instância do GameServer
O subserver PvP é uma instância separada do GameServer apontando para o mesmo banco de dados SQL, mas com configurações independentes.
1.1 Copie a pasta principal do GameServer e renomeie:
C:\MuServer\GameServer\ ← instância principal (ServerCode 1)
C:\MuServer\GameServer_PvP\ ← nova instância PvP (ServerCode 2)
1.2 Abra GameServer_PvP\GameServer.ini e ajuste os parâmetros obrigatórios:
[GameServerInfo]
ServerCode = 2
ServerName = PvP Arena
ConnectServerIP = 127.0.0.1
ConnectServerPort = 44405
GameServerPort = 55902
MaxUserCount = 500
ServerCode deve ser único em toda a sua infraestrutura. Jamais use o mesmo código que o servidor principal (geralmente 1). Conflito de ServerCode causa dessincronização de personagens e corrupção de posição no mapa.1.3 Ainda em GameServer_PvP\GameServer.ini, configure a string de conexão com o banco:
[DBInfo]
DBServer = 127.0.0.1
DBName = MuOnline
DBUser = sa
DBPassword = suaSenhaAqui
DBPort = 1433
Passo 2 — Definir os Mapas Exclusivos do Subserver PvP
O subserver PvP precisa servir apenas os mapas destinados ao PvP. Mapas não atribuídos a ele devem retornar o cliente ao servidor principal.
2.1 Execute no SSMS para registrar os mapas do subserver PvP:
USE MuOnline;
-- Remove entradas antigas para o ServerCode 2
DELETE FROM T_MapServerInfo WHERE ServerCode = 2;
-- Atribui mapas ao subserver PvP (ServerCode 2)
-- Mapa 2 = Devias (PvP livre), Mapa 33 = Arena, Mapa 52 = PvP customizado
INSERT INTO T_MapServerInfo (MapNumber, ServerCode, MoveServerCode)
VALUES
(2, 2, 1),
(33, 2, 1),
(52, 2, 1);
MoveServerCode indica para qual servidor o jogador é enviado ao sair do mapa PvP. Usar 1 garante retorno ao servidor principal automaticamente.2.2 No arquivo GameServer_PvP\Data\MapServerInfo.txt, repita a mesma configuração para o caso do servidor não usar tabela SQL (releases mais antigos carregam do arquivo):
// MapNumber ServerCode MoveServerCode
2 2 1
33 2 1
52 2 1
Passo 3 — Configurar Regras PvP no Subserver
3.1 Abra GameServer_PvP\Data\Common\GameServerSetting.xml (ou GameServerSetting.ini em releases mais antigos) e configure:
<PvPSetting>
<PkLevel enable="1" />
<PkClear enable="0" />
<HeroKillPenalty enable="0" />
<FreeForAll enable="1" />
<GuildFriendlyFire enable="1" />
<MinLevelToEnter value="200" />
<MaxKillStreak value="0" />
</PvPSetting>
Parâmetros importantes:
FreeForAll = 1— qualquer jogador pode atacar qualquer outro sem restrição de guild ou partyHeroKillPenalty = 0— desativa penalidade de PK (Outlawer) no subserverPkClear = 0— contador de PK não zera ao morrer, serve para rankingMinLevelToEnter = 200— bloqueio de nível mínimo para entrar nos mapas PvP
3.2 Para bloquear itens caindo no chão ao morrer em PvP (comum em servidores PvP puros), edite:
[PvPDrop]
DropOnDeath = 0
DropJewels = 0
DropExcItems = 0
Passo 4 — Configurar o ConnectServer para Rotear o Subserver
O ConnectServer precisa conhecer ambas as instâncias para direcionar clientes corretamente.
4.1 Abra ConnectServer\ConnectServer.ini e adicione a entrada do subserver PvP:
[ServerList]
ServerCount = 2
[Server0]
ServerCode = 1
ServerIP = 127.0.0.1
ServerPort = 55901
ServerName = Principal
[Server1]
ServerCode = 2
ServerIP = 127.0.0.1
ServerPort = 55902
ServerName = PvP Arena
4.2 Reinicie o ConnectServer após salvar. No DataServer, verifique se ServerList inclui o ServerCode 2 para sincronização de personagens entre instâncias.
Passo 5 — Sistema de Kill Count e Ranking PvP via SQL
Um subserver PvP sem ranking perde o apelo competitivo. Configure uma tabela dedicada para pontuação.
5.1 Crie a tabela de estatísticas PvP:
USE MuOnline;
CREATE TABLE PvP_KillStats (
memb_guid INT NOT NULL,
char_name VARCHAR(10) NOT NULL,
pvp_kills INT NOT NULL DEFAULT 0,
pvp_deaths INT NOT NULL DEFAULT 0,
pvp_score INT NOT NULL DEFAULT 0,
pvp_streak INT NOT NULL DEFAULT 0,
last_kill_dt DATETIME NULL,
CONSTRAINT PK_PvP_KillStats PRIMARY KEY (memb_guid)
);
5.2 Crie a stored procedure que registra cada kill PvP:
CREATE PROCEDURE uspRegisterPvPKill
@KillerName VARCHAR(10),
@VictimName VARCHAR(10)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @KillerGUID INT, @VictimGUID INT;
SELECT @KillerGUID = AccountID FROM Character WHERE Name = @KillerName;
SELECT @VictimGUID = AccountID FROM Character WHERE Name = @VictimName;
-- Garante registro existente para o killer
IF NOT EXISTS (SELECT 1 FROM PvP_KillStats WHERE memb_guid = @KillerGUID)
INSERT INTO PvP_KillStats (memb_guid, char_name) VALUES (@KillerGUID, @KillerName);
-- Garante registro existente para a vitima
IF NOT EXISTS (SELECT 1 FROM PvP_KillStats WHERE memb_guid = @VictimGUID)
INSERT INTO PvP_KillStats (memb_guid, char_name) VALUES (@VictimGUID, @VictimName);
-- Atualiza kills do vencedor
UPDATE PvP_KillStats
SET pvp_kills = pvp_kills + 1,
pvp_score = pvp_score + 10,
pvp_streak = pvp_streak + 1,
last_kill_dt = GETDATE()
WHERE memb_guid = @KillerGUID;
-- Atualiza mortes e zera streak da vitima
UPDATE PvP_KillStats
SET pvp_deaths = pvp_deaths + 1,
pvp_streak = 0
WHERE memb_guid = @VictimGUID;
END;
5.3 Consulta para exibir o ranking PvP no site ou painel web:
SELECT TOP 20
char_name AS 'Personagem',
pvp_kills AS 'Kills',
pvp_deaths AS 'Mortes',
pvp_score AS 'Score',
pvp_streak AS 'Streak Atual',
CASE WHEN pvp_deaths = 0 THEN pvp_kills
ELSE pvp_kills / pvp_deaths
END AS 'KD Ratio'
FROM PvP_KillStats
ORDER BY pvp_score DESC;
Passo 6 — Configurar Recompensas por Kill
6.1 Para recompensar o jogador com Zen automaticamente a cada kill, adicione ao corpo da uspRegisterPvPKill:
-- Adicionar dentro da procedure apos atualizar kills:
UPDATE Character
SET Money = Money + 5000000
WHERE Name = @KillerName AND Money <= 2000000000;
6.2 Para dar um item específico como recompensa (ex: Jewel of Bless = Item 14, Index 13):
-- Inserir item na bag do vencedor via stored procedure nativa do MuServer
EXEC WZ_ADD_ITEM @Name = @KillerName, @MapNumber = 0, @ItemType = 14,
@ItemIndex = 13, @ItemLevel = 0, @Durability = 1,
@Option1 = 0, @Option2 = 0, @Option3 = 0;
last_reward_dt DATETIME na PvP_KillStats e valide se passou pelo menos 5 minutos desde o ultimo kill na mesma vitima antes de conceder o premio.Passo 7 — Inicializar e Testar o Subserver
7.1 Crie um arquivo .bat para iniciar o subserver PvP separadamente:
@echo off
cd /d C:\MuServer\GameServer_PvP\
start "" "GameServer.exe"
echo Subserver PvP iniciado na porta 55902
7.2 Sequencia de inicializacao correta:
1. SQL Server → 2. DataServer → 3. ConnectServer → 4. GameServer (principal) → 5. GameServer_PvP
7.3 Verifique no log GameServer_PvP\Log\GameServer.log se aparece:
[INFO] Server Code: 2 initialized successfully
[INFO] Map 2 (Devias) loaded for ServerCode 2
[INFO] Map 33 (Arena) loaded for ServerCode 2
[INFO] GameServer listening on port 55902
ServerCode conflict detected, significa que outro processo ja usa o ServerCode 2. Verifique se nao ha instancias duplicadas em execucao com tasklist | findstr GameServer no Prompt de Comando.Solucao de Problemas Comuns
Jogadores nao conseguem entrar no subserver PvP: Verifique se o firewall libera a porta 55902 tanto para TCP de entrada quanto de saida. No Windows Server, execute:
netsh advfirewall firewall add rule name="MuServer PvP" protocol=TCP dir=in localport=55902 action=allow
Personagem fica desconectado ao fazer warp para o mapa PvP: Confirme que T_MapServerInfo tem o MapNumber correto com ServerCode 2. Use SELECT * FROM T_MapServerInfo WHERE MapNumber IN (2,33,52) para validar.
Kill nao registra na tabela PvP_KillStats: Habilite o log de chamadas de procedure no GameServer e verifique se uspRegisterPvPKill esta sendo chamada. Se o seu release usa eventos customizados, a chamada pode precisar ser adicionada manualmente em Source\GameServer\GameServer.cpp na funcao de tratamento de morte PvP, recompilando o servidor.
PvP_KillStats e manter a tabela enxuta, evitando degradacao de performance nas consultas de ranking.Perguntas frequentes
Preciso de uma VPS separada para rodar o subserver PvP?
Não necessariamente. O subserver PvP pode rodar na mesma máquina como uma segunda instância do GameServer apontando para o mesmo banco de dados. Basta usar portas diferentes (ex: GameServer principal na 55901, subserver PvP na 55902) e ajustar o ConnectServer para rotear os clientes corretamente.
Como impedir que jogadores do subserver PvP façam warp para mapas do servidor principal?
Configure a tabela T_MapServerInfo no banco de dados definindo o ServerCode correto para cada mapa. Os mapas do subserver PvP devem ter um ServerCode exclusivo (ex: 2) que não coincida com o servidor principal (ServerCode 1). Assim o sistema bloqueia o warp entre instâncias.
O kill count do subserver PvP pode ser separado do principal?
Sim. Crie colunas adicionais na tabela MEMB_STAT ou crie uma tabela própria como PvP_KillStats com as colunas memb_guid, pvp_kills, pvp_deaths, pvp_score. A contagem é feita via stored procedure acionada pelo GameServer ao registrar a morte.
Como configurar drop de itens exclusivos para kills PvP?
No arquivo GameServer/Data/Items/PvPRewards.txt (ou equivalente no seu release), mapeie os item codes desejados com taxa de drop. Alternativamente, use a stored procedure uspAddItemToBag para inserir o item no inventário do vencedor via trigger SQL ao registrar o kill.