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.
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
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);
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 partyHeroKillPenalty = 0— desactiva la penalización de PK (Outlawer) en el subservidorPkClear = 0— el contador de PK no se reinicia al morir, permitiendo un ranking persistenteMinLevelToEnter = 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;
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
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.
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.