El mayor portal de MU Online de Brasil — desde 2003
Tutorial Avanzado Tutoriais

Cómo Configurar un Subservidor PvP Dedicado en el Servidor de MU

Aprende a crear y configurar un subservidor PvP aislado en MuServer S6, con mapas restringidos, reglas de kill y recompensas SQL personalizadas.

EQ Equipo ViciadosMU · Actualizado el 3 jul 2026 · ⏱ 12 min de lectura

Un subservidor PvP dedicado permite aislar el combate entre jugadores en mapas específicos, aplicar reglas propias de kill y ofrecer recompensas exclusivas sin interferir en el flujo del servidor principal. Esta guía cubre la configuración completa para MuServer Season 6 Episode 3, pero los conceptos se aplican a otras seasons con ajustes de ruta.

Requisitos Previos

Antes de comenzar, asegúrate de tener:

  • MuServer S6 EP3 funcionando correctamente con GameServer, ConnectServer y DataServer operativos
  • Acceso a SQL Server Management Studio (SSMS) con permisos DBO en la base de datos MuOnline
  • Dos puertos TCP disponibles en el firewall: uno para el subservidor (ej: 55902) y otro para el enrutamiento del ConnectServer (ej: 44405)
  • Una copia completa de la carpeta GameServer/ para usar como base del subservidor

Paso 1 — Crear la Segunda Instancia del GameServer

El subservidor PvP es una instancia separada del GameServer que apunta a la misma base de datos SQL, pero con configuración independiente.

1.1 Copia la carpeta principal del GameServer y renómbrala:

C:\MuServer\GameServer\        ← instancia principal (ServerCode 1)
C:\MuServer\GameServer_PvP\    ← nueva instancia PvP (ServerCode 2)

1.2 Abre GameServer_PvP\GameServer.ini y ajusta los parámetros obligatorios:

[GameServerInfo]
ServerCode        = 2
ServerName        = PvP Arena
ConnectServerIP   = 127.0.0.1
ConnectServerPort = 44405
GameServerPort    = 55902
MaxUserCount      = 500
Atenção: El ServerCode debe ser único en toda tu infraestructura. Nunca uses el mismo código que el servidor principal (generalmente 1). Un conflicto de ServerCode provoca desincronización de personajes y corrupción de posición en el mapa.

1.3 Aún en GameServer_PvP\GameServer.ini, configura la cadena de conexión a la base de datos:

[DBInfo]
DBServer   = 127.0.0.1
DBName     = MuOnline
DBUser     = sa
DBPassword = tuContraseñaAqui
DBPort     = 1433

Paso 2 — Definir los Mapas Exclusivos del Subservidor PvP

El subservidor PvP solo debe servir los mapas destinados al combate PvP. Los mapas no asignados a él deben redirigir al cliente de vuelta al servidor principal.

2.1 Ejecuta lo siguiente en SSMS para registrar los mapas del subservidor PvP:

USE MuOnline;

-- Elimina entradas antiguas para el ServerCode 2
DELETE FROM T_MapServerInfo WHERE ServerCode = 2;

-- Asigna mapas al subservidor PvP (ServerCode 2)
-- Mapa 2 = Devias (PvP libre), Mapa 33 = Arena, Mapa 52 = mapa PvP personalizado
INSERT INTO T_MapServerInfo (MapNumber, ServerCode, MoveServerCode)
VALUES
  (2,  2, 1),
  (33, 2, 1),
  (52, 2, 1);
Nota: El campo MoveServerCode indica a qué servidor se enviará el jugador al salir del mapa PvP. Usar 1 garantiza el retorno automático al servidor principal.

2.2 En GameServer_PvP\Data\MapServerInfo.txt, replica la misma configuración para releases que cargan desde archivo en lugar de la tabla SQL:

// MapNumber  ServerCode  MoveServerCode
2             2           1
33            2           1
52            2           1

Paso 3 — Configurar las Reglas PvP en el Subservidor

3.1 Abre GameServer_PvP\Data\Common\GameServerSetting.xml (o GameServerSetting.ini en releases más antiguos) y configura:

<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 — cualquier jugador puede atacar a cualquier otro sin restricciones de guild o party
  • HeroKillPenalty = 0 — desactiva la penalización de PK (Outlawer) en el subservidor
  • PkClear = 0 — el contador de PK no se reinicia al morir, permitiendo un ranking persistente
  • MinLevelToEnter = 200 — nivel mínimo requerido para entrar a los mapas PvP

3.2 Para evitar que los ítems caigan al suelo al morir en PvP (estándar en servidores PvP puros), edita:

[PvPDrop]
DropOnDeath  = 0
DropJewels   = 0
DropExcItems = 0

Paso 4 — Configurar el ConnectServer para Enrutar el Subservidor

El ConnectServer debe conocer ambas instancias para dirigir los clientes al lugar correcto.

4.1 Abre ConnectServer\ConnectServer.ini y añade la entrada del subservidor 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 Reinicia el ConnectServer después de guardar. En el DataServer, verifica que ServerList incluya el ServerCode 2 para que los personajes se sincronicen correctamente entre ambas instancias.

Paso 5 — Sistema de Kill Count y Ranking PvP mediante SQL

Un subservidor PvP sin ranking competitivo pierde gran parte de su atractivo. Configura una tabla dedicada para la puntuación.

5.1 Crea la tabla de estadí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 Crea la 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;

    -- Asegurar registro existente para el asesino
    IF NOT EXISTS (SELECT 1 FROM PvP_KillStats WHERE memb_guid = @KillerGUID)
        INSERT INTO PvP_KillStats (memb_guid, char_name) VALUES (@KillerGUID, @KillerName);

    -- Asegurar registro existente para la victima
    IF NOT EXISTS (SELECT 1 FROM PvP_KillStats WHERE memb_guid = @VictimGUID)
        INSERT INTO PvP_KillStats (memb_guid, char_name) VALUES (@VictimGUID, @VictimName);

    -- Actualizar estadisticas del ganador
    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;

    -- Actualizar muertes de la victima y reiniciar streak
    UPDATE PvP_KillStats
    SET pvp_deaths = pvp_deaths + 1,
        pvp_streak = 0
    WHERE memb_guid = @VictimGUID;
END;

5.3 Consulta para mostrar el ranking PvP en tu sitio web o panel administrativo:

SELECT TOP 20
    char_name      AS 'Personaje',
    pvp_kills      AS 'Kills',
    pvp_deaths     AS 'Muertes',
    pvp_score      AS 'Puntuacion',
    pvp_streak     AS 'Racha Actual',
    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;

Paso 6 — Configurar Recompensas por Kill

6.1 Para recompensar automáticamente al jugador con Zen en cada kill, añade al cuerpo de uspRegisterPvPKill:

-- Agregar dentro de la procedure despues de actualizar kills:
UPDATE Character
SET Money = Money + 5000000
WHERE Name = @KillerName AND Money <= 2000000000;

6.2 Para otorgar un ítem específico como recompensa (ej: Jewel of Bless = Item 14, Index 13):

-- Insertar ítem en la bolsa del ganador usando la stored procedure nativa de MuServer
EXEC WZ_ADD_ITEM @Name = @KillerName, @MapNumber = 0, @ItemType = 14,
                 @ItemIndex = 13, @ItemLevel = 0, @Durability = 1,
                 @Option1 = 0, @Option2 = 0, @Option3 = 0;
Dica: Agrega un cooldown a las recompensas para evitar el farm abusivo. Añade una columna last_reward_dt DATETIME a PvP_KillStats y valida que hayan pasado al menos 5 minutos desde el último kill contra la misma víctima antes de otorgar el premio.

Paso 7 — Iniciar y Probar el Subservidor

7.1 Crea un archivo .bat para iniciar el subservidor PvP de forma independiente:

@echo off
cd /d C:\MuServer\GameServer_PvP\
start "" "GameServer.exe"
echo Subservidor PvP iniciado en el puerto 55902

7.2 Secuencia de inicio correcta:

1. SQL Server → 2. DataServer → 3. ConnectServer → 4. GameServer (principal) → 5. GameServer_PvP

7.3 Verifica en GameServer_PvP\Log\GameServer.log que aparezca:

[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: Si el log muestra ServerCode conflict detected, otro proceso ya está usando el ServerCode 2. Verifica que no haya instancias duplicadas en ejecución con tasklist | findstr GameServer en el Símbolo del sistema.

Solución de Problemas Comunes

Los jugadores no pueden conectarse al subservidor PvP: Verifica que el firewall permita el puerto 55902 tanto para TCP entrante como saliente. En Windows Server, ejecuta:

netsh advfirewall firewall add rule name="MuServer PvP" protocol=TCP dir=in localport=55902 action=allow

El personaje se desconecta al hacer warp al mapa PvP: Confirma que T_MapServerInfo contiene el MapNumber correcto con ServerCode 2. Usa SELECT * FROM T_MapServerInfo WHERE MapNumber IN (2,33,52) para validar las entradas.

El kill no se registra en PvP_KillStats: Habilita el log de llamadas de procedures en el GameServer y verifica que uspRegisterPvPKill esté siendo llamada. Si tu release usa hooks de eventos personalizados, es posible que la llamada deba agregarse manualmente en Source\GameServer\GameServer.cpp dentro de la función manejadora de muerte PvP, lo que requiere recompilar el servidor.

Nota: Los servidores con alto volumen de PvP (más de 200 kills por hora) deben considerar un SQL Agent Job para archivar registros antiguos de PvP_KillStats y mantener la tabla liviana, evitando degradación del rendimiento en las consultas de ranking con el tiempo.

Perguntas frequentes

¿Necesito una VPS separada para ejecutar el subservidor PvP?

No es necesario. El subservidor PvP puede correr en la misma máquina como una segunda instancia del GameServer apuntando a la misma base de datos SQL. Basta con usar puertos diferentes (ej: GameServer principal en 55901, subservidor PvP en 55902) y configurar el ConnectServer para enrutar los clientes correctamente.

¿Cómo evito que los jugadores del subservidor PvP hagan warp a mapas del servidor principal?

Configura la tabla T_MapServerInfo en la base de datos definiendo el ServerCode correcto para cada mapa. Los mapas del subservidor PvP deben tener un ServerCode único (ej: 2) que no coincida con el servidor principal (ServerCode 1). Así el sistema bloquea el warp entre instancias.

¿El kill count del subservidor PvP puede ser independiente del principal?

Sí. Crea columnas adicionales en la tabla MEMB_STAT o crea una tabla propia como PvP_KillStats con las columnas memb_guid, pvp_kills, pvp_deaths, pvp_score. El conteo se gestiona mediante una stored procedure ejecutada por el GameServer al registrar cada muerte.

¿Cómo configurar drops de ítems exclusivos para kills PvP?

En el archivo GameServer/Data/Items/PvPRewards.txt (o el equivalente en tu release), mapea los item codes deseados con su tasa de drop. Alternativamente, usa la stored procedure uspAddItemToBag para insertar el ítem directamente en el inventario del ganador mediante un trigger SQL al registrar el kill.

EQ

Equipo ViciadosMU

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

Sigue leyendo

Artículos relacionados