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

Cómo configurar un EventServer dedicado en MU Online

Entiende el papel del EventServer en MU Online y aprende a aislarlo del GameServer para correr Blood Castle, Devil Square, Chaos Castle e invasiones sin trabar la jugabilidad principal en horarios pico.

GA Gabriel · Actualizado el 10 ago 2024 · ⏱ 16 min de lectura
Respuesta rápida

En un servidor de MU Online, los eventos temporizados — Blood Castle, Devil Square, Chaos Castle, Crywolf, Kanturu, invasiones de Golden Dragon y afines — son los momentos de mayor concentración de jugadores y, en consecuencia, de mayor carga de procesamiento. Cada entrada de sala necesita spawnear

En un servidor de MU Online, los eventos temporizados — Blood Castle, Devil Square, Chaos Castle, Crywolf, Kanturu, invasiones de Golden Dragon y afines — son los momentos de mayor concentración de jugadores y, en consecuencia, de mayor carga de procesamiento. Cada entrada de sala necesita spawnear monstruos, controlar timers, validar ítems de entrada, calcular ranking y distribuir recompensas, todo esto mientras el resto del servidor sigue corriendo normalmente. Cuando todo ese trabajo ocurre dentro del mismo proceso del GameServer, un pico en horario prime puede generar lag generalizado, caídas de FPS lógico y, en casos extremos, cuelgue del proceso. Ahí es donde entra la idea de un EventServer dedicado: aislar la lógica de eventos en un proceso separado, de forma que los picos de carga de los eventos no contaminen la experiencia del juego normal. Este tutorial explica el papel del EventServer, cómo separarlo del GameServer, cómo configurar la conexión entre ambos y — igualmente importante — cuándo realmente vale la pena adoptar esta arquitectura.

Qué es el EventServer y cuál es su papel

El EventServer es el componente responsable de orquestar la lógica de los eventos con hora marcada y de las instancias de evento. En la práctica, se encarga de tareas como: programar cuándo abre cada evento (por ejemplo, Blood Castle cada 2 horas), controlar las fases internas de cada sala, gestionar el spawn y el comportamiento de los monstruos de evento, validar los ítems de entrada (Invitation, Scroll, Feather, etc.), acompañar el progreso de los jugadores dentro de la instancia y, al final, calcular quién ganó y distribuir las recompensas.

Es fundamental entender que en muchos emuladores populares el EventServer no existe como binario separado — la lógica de eventos vive dentro del propio GameServer, en módulos internos configurados por archivos como BloodCastle.txt, DevilSquare.txt, EventItemBag.txt y similares. En esas distribuciones, "separar el EventServer" significa otra cosa (correr un segundo GameServer solo para eventos, o usar un subserver dedicado). Ya en distribuciones más robustas — algunas líneas de Season 6+ y emuladores comerciales — existe de hecho un proceso EventServer.exe (o nombre equivalente) que puede instanciarse aparte. Esto varía según el emulador, y el primer paso es descubrir en cuál de los dos mundos estás.

Por qué aislar los eventos del GameServer

La motivación central es de desempeño y estabilidad. Cuando 300 jugadores entran simultáneamente a un Devil Square dividido en varias salas, el proceso necesita asignar cientos de monstruos, correr sus rutinas de IA, verificar colisiones y disparar timers — todo en el mismo loop principal que también atiende movimiento, chat, trades y combate del mundo abierto. Un EventServer dedicado le da a ese trabajo su propio proceso (e, idealmente, sus propios núcleos de CPU), reduciendo la interferencia.

Los beneficios prácticos:

AspectoGameServer con eventos integradosEventServer dedicado
Pico de CPU en el eventoAfecta todo el servidorQueda contenido en el proceso de evento
Crash durante el eventoDerriba a todos los jugadoresSolo afecta a quien está en el evento
EscalabilidadLimitada a un procesoPuede escalar en máquina separada
Complejidad de setupBajaAlta
Mantenimiento/reinicioReinicia todoReinicia solo los eventos

El punto sobre el crash aislado es el más subestimado: si la lógica de un evento personalizado tiene un bug de memoria, en un modelo integrado derriba el servidor entero; en un modelo aislado, en el peor caso solo cae el EventServer, y los jugadores en el mundo abierto siguen jugando mientras reinicias solo ese proceso.

Requisitos previos

Antes de empezar, asegúrate de tener:

  • Un servidor de MU Online ya funcional y estable con GameServer, DataServer, JoinServer y ConnectServer corriendo. Si todavía no llegaste a ese punto, empieza por la guía base de cómo crear servidor de MU Online.
  • Acceso administrativo a la máquina (VPS o dedicado), de preferencia Windows Server, con permiso para abrir puertos en el firewall.
  • Conocimiento de qué emulador/distribución usas y si soporta EventServer separado. Consulta la documentación de tu pack.
  • Copia de seguridad completa de la carpeta del servidor y de la base de datos antes de cualquier cambio.
  • Un editor de texto que no corrompa el encoding (Notepad++ o VS Code), pues los archivos .txt/.ini de MU son sensibles a la codificación.
  • SQL Server con la base (MuOnline/MuOnline estándar) accesible vía DSN ODBC 32-bit.

> Nunca hagas esta migración directamente en producción sin probar antes en un entorno de homologación. La conexión entre EventServer y GameServer involucra puertos y ServerCodes que, si están mal, dejan los eventos silenciosamente rotos.

Descubriendo el modelo de tu emulador

Antes de configurar, identifica el escenario. Abre la carpeta raíz del servidor y verifica la presencia de binarios y configs de evento:

MuServer/
├── DataServer/
├── JoinServer/
├── ConnectServer/
├── GameServer/
│   ├── GameServer.exe
│   └── Data/
│       ├── BloodCastle.txt        ← logica integrada
│       ├── DevilSquare.txt
│       └── ChaosCastle.txt
└── EventServer/                   ← existe? (no siempre)
    ├── EventServer.exe
    └── EventServer.ini
  • Si existe una carpeta EventServer/ con binario propio: tu emulador soporta EventServer dedicado de forma nativa. Vas a configurarlo y conectarlo al GameServer.
  • Si los eventos son solo archivos dentro de GameServer/Data/: no hay EventServer separado. La estrategia equivalente es correr un segundo GameServer dedicado a eventos (arquitectura de subserver), lo que cubrimos en la sección de alternativa.

Configurando el EventServer dedicado

Asumiendo un emulador con EventServer.exe propio, los pasos típicos son:

  1. Copia y organiza la carpeta. Garantiza que la carpeta EventServer/ esté en la raíz del servidor, junto a las demás.
  2. Configura la conexión con el DataServer. El EventServer necesita leer y grabar datos (recompensas, estado), así que apunta al mismo DataServer del GameServer. Ejemplo común de EventServer.ini (los nombres de clave varían según el emulador):
[EventServer]
Port=55910                 ; puerto del propio EventServer (interno)
ServerName=EventServer

[DataServer]
DataServerIP=127.0.0.1
DataServerPort=55557       ; mismo DataServer usado por el GameServer

[Link]
GameServerIP=127.0.0.1
GameServerPort=55901       ; GameServer que este EventServer atiende

[Database]
DSN=MuOnline               ; misma base de todos los procesos
  1. Ajusta los archivos de definición de evento. Dependiendo de la distribución, los archivos como BloodCastle.txt, DevilSquare.txt, ChaosCastle.txt, Crywolf.txt pasan a ser leídos por el EventServer en vez del GameServer. Confirma en la documentación qué carpeta Data/ consume.
  2. Define los horarios de los eventos. Aunque la lógica corra en el EventServer, los horarios suelen configurarse en un programador (por ejemplo, EventTimer.txt o Schedule.txt). Un ejemplo genérico:
; Formato comun: Evento  Hora  Minuto  Activo
; (varia por emulador — siempre verifica el encabezado del archivo)
BloodCastle   00 00 1
BloodCastle   02 00 1
DevilSquare   01 00 1
ChaosCastle   03 00 1
Crywolf       20 00 1

Conectando el EventServer al GameServer

Esta es la etapa más delicada. El GameServer necesita saber a dónde encaminar los pedidos de evento, y el EventServer necesita aceptar las conexiones provenientes del(los) GameServer(s). La comunicación se hace por sockets TCP en puertos locales.

  1. En el GameServer, apunta la dirección del EventServer. En muchas distros existe un bloque así en el GameServer.ini:
[EventServer]
EnableExternalEventServer=1   ; usa EventServer separado en vez del integrado
EventServerIP=127.0.0.1
EventServerPort=55910         ; debe coincidir con el puerto del EventServer.ini
  1. Garantiza que el ServerCode coincida. Si tienes multi-server, cada GameServer tiene un ServerCode. El EventServer necesita reconocer esos códigos para dirigir las recompensas al servidor correcto.
  2. Respeta el orden de inicialización. La secuencia correcta evita que un proceso suba antes de su dependencia:
1. DataServer      (acceso a la base)
2. EventServer     (necesita el DataServer en el aire)
3. JoinServer
4. GameServer      (se conecta al EventServer ya activo)
5. ConnectServer
  1. Abre los puertos internos solo localmente. Los puertos de EventServer, DataServer y JoinServer son de comunicación interna y no deben exponerse a internet:
# Puerto del EventServer — uso interno; NO abrir a internet.
# Si GameServer y EventServer estan en maquinas diferentes,
# libera el puerto SOLO para el IP del GameServer:
netsh advfirewall firewall add rule name="MU EventServer" dir=in action=allow protocol=TCP localport=55910 remoteip=127.0.0.1

EventServer en máquina separada (arquitectura distribuida)

Para servidores realmente grandes, el EventServer puede vivir en otra VPS. En ese caso, además de cambiar 127.0.0.1 por los IPs reales, necesitas liberar el puerto del EventServer solo para el IP del GameServer (y viceversa en las respuestas), y garantizar baja latencia entre las máquinas — de preferencia en el mismo datacenter. La latencia alta entre GameServer y EventServer se traduce en retraso en la entrada de salas y en la entrega de recompensas, lo que es una pésima experiencia para el jugador.

Alternativa: GameServer dedicado a eventos

Si tu emulador no tiene EventServer separado, la solución equivalente es correr un segundo GameServer exclusivo para eventos, compartiendo la misma base. Los jugadores son teletransportados a ese "servidor de eventos" al entrar en Blood Castle/Devil Square, y vuelven al servidor principal al salir. Esto exige puertos distintos por GameServer, ServerCodes únicos y configuración en el ConnectServer/ServerList. Es más trabajoso, pero alcanza el mismo objetivo de aislamiento de carga.

Cuándo usarlo (y cuándo no)

Adopta un EventServer dedicado cuando: tu servidor pasa de algunas centenas de jugadores simultáneos; observas picos de CPU claramente correlacionados con horarios de evento; corres eventos personalizados pesados; o ya operas multi-server y quieres centralizar la lógica de eventos. Evita esta complejidad si tu servidor es pequeño o recién lanzado — en esa etapa, el EventServer integrado es más simple de mantener y el cuello de botella real casi siempre está en otro lugar (base, red, o configuración de rates).

Errores comunes y soluciones

SíntomaCausa probableSolución
El evento nunca abre en el horarioEl programador (Schedule/EventTimer) no es leído por el EventServerConfirma qué carpeta Data/ consume el EventServer y el encoding del archivo
El jugador entra pero no recibe recompensaDSN/DataServer divergente entre procesosApunta EventServer y GameServer al mismo DataServer/DSN
"Connection refused" en los logs del GameServerEl EventServer subió después del GameServer o el puerto está malRespeta el orden de boot; verifica EventServerPort en ambos lados
La recompensa va al servidor equivocado (multi-server)El ServerCode no coincideAlinea el ServerCode en GameServer.ini, EventServer y ServerList
El lag persiste aun tras separarEl cuello de botella no era el eventoHaz profiling de CPU; verifica base e índices antes de culpar a los eventos
El EventServer se cuelga soloBug en evento personalizado / fuga de memoriaAísla el evento problemático; reinicia solo el EventServer y revisa el script

Lista de verificación de lanzamiento

  • Copia de seguridad completa del servidor y de la base antes de iniciar
  • Confirmado si el emulador soporta EventServer dedicado o exige GameServer de eventos
  • EventServer.ini apuntando al DataServer y DSN correctos
  • Puerto del EventServer definido y coincidiendo en ambos lados (EventServer y GameServer)
  • GameServer.ini con EventServer externo habilitado e IP:puerto correctos
  • ServerCodes alineados en todos los procesos (si es multi-server)
  • Orden de inicialización configurado (DataServer → EventServer → JoinServer → GameServer → ConnectServer)
  • Puertos internos bloqueados para internet (solo 127.0.0.1 o IP del GameServer)
  • Horarios de todos los eventos probados uno a uno en homologación
  • Recompensas llegando al personaje correcto tras ganar el evento
  • Prueba de crash: derribar el EventServer y confirmar que el mundo abierto sigue online
  • Monitoreo de CPU comparando antes/después de la separación

Con el EventServer aislado y correctamente conectado al GameServer, ganas un servidor más resiliente en horario pico: los eventos pesados dejan de arrastrar la jugabilidad general, y una falla en un evento personalizado ya no significa derribar a todos. Sube el cambio primero en homologación, valida evento por evento, y solo entonces promuévelo a producción.

Preguntas frecuentes

¿Qué es el EventServer en MU Online?

Es un proceso (o módulo) responsable de controlar la lógica de eventos temporizados como Blood Castle, Devil Square, Chaos Castle, Crywolf e invasiones. En muchos emuladores ya viene integrado en el GameServer, pero en distribuciones más robustas puede ser un binario separado que programa entradas, gestiona salas y distribuye recompensas.

¿Realmente necesito separar el EventServer del GameServer?

No es obligatorio para servidores pequeños. Tiene sentido cuando tienes muchos jugadores simultáneos y el procesamiento de eventos causa picos de CPU que impactan la jugabilidad general. Si tu servidor tiene menos de 200 online, el EventServer integrado suele bastar.

¿El EventServer dedicado necesita otra base de datos?

No. Se conecta a la misma base (vía DataServer/DSN) que el GameServer, porque las recompensas, rankings de evento y estado de personaje viven en la base única. Separar la base rompería la consistencia de los datos.

¿Cómo avisa el GameServer al EventServer que un jugador entró al evento?

Por la comunicación interna entre procesos, generalmente sockets TCP en puertos locales definidos en los archivos .ini/.xml. El GameServer envía el pedido de entrada y el EventServer responde con la sala/instancia. Los nombres y puertos varían según el emulador.

¿Un EventServer separado puede servir a varios GameServers?

Sí, en arquitecturas multi-server bien diseñadas un EventServer central puede coordinar eventos de varios GameServers que comparten la misma base. Esto exige que cada GameServer apunte al mismo IP:puerto del EventServer y que los ServerCodes estén correctos.

GA
Editor de guías y builds

Gabriel cubre gameplay, builds de clases, PvP y progresión. Prueba cada estrategia en un servidor antes de publicar.

Sigue leyendo

Artículos relacionados