O maior portal de MU Online do Brasil — desde 2003
Tutorial Avançado Tutoriais

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.

EQ Equipe ViciadosMU · Atualizado em 3 jul 2026 · ⏱ 12 min de leitura

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
Atenção: O 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);
Nota: O campo 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 party
  • HeroKillPenalty = 0 — desativa penalidade de PK (Outlawer) no subserver
  • PkClear = 0 — contador de PK não zera ao morrer, serve para ranking
  • MinLevelToEnter = 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;
Dica: Limite recompensas com um cooldown para evitar farm abusivo. Adicione uma coluna 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
Atenção: Se o log mostrar 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.

Nota: Servidores com alto volume de PvP (acima de 200 kills/hora) devem considerar um Job SQL para arquivar registros antigos da 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.

EQ

Equipe ViciadosMU

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

Continue lendo

Artigos relacionados