Instalación del servidor
Esta guía lleva un servidor IGK desde cero hasta tener jugadores conectados: base de datos, scripts SQL, DSN de ODBC, IPs, lista de servidores, subservidores, orden de arranque, cómo saber si todo conecta bien y firewall.
Antes de empezar, revisa los requisitos en 01_INTRODUCCION_Y_REQUISITOS.md (Windows de 64 bits, SQL Server, DSN de 64 bits).
Resumen del orden:
- Copiar la carpeta
MuServeral VPS. - Instalar SQL Server.
- Crear o restaurar la base
MuOnline. - Ejecutar los scripts de
MuServer\DataBase\SQL. - Crear el DSN de ODBC de 64 bits.
- Poner usuario y clave de SQL en el JoinServer y el DataServer.
- Configurar las IPs (lista de servidores, MapServerInfo, GameServer, cliente).
- Abrir los puertos en el firewall.
- Arrancar los servidores en orden y comprobar que conectan.
Paso 1: copiar MuServer al VPS
- Copia la carpeta
MuServercompleta a un disco del VPS (por ejemploC:\MuServer). La ruta puede ser cualquiera. - No separes las carpetas: cada GameServer lee los archivos del juego desde la carpeta
Dataque está al lado de su carpeta (MuServer\Data). Si muevesGameServerfuera deMuServer, no encuentra sus archivos.
Paso 2: instalar SQL Server
- Instala SQL Server 2008 o más nuevo (Express sirve). En Windows Server 2008 R2, como máximo SQL Server 2014.
- Si los servidores van a entrar con un usuario de SQL (por ejemplo
sa), durante la instalación elige el modo de autenticación mixto (Windows y SQL Server) y pon una clave segura al usuariosa. - Instala también SQL Server Management Studio (SSMS) para restaurar la base y ejecutar los scripts. También puedes usar HeidiSQL con IGK Connect (ver
11_IGK_HOST_STARTUP_CONNECT.md).
Paso 3: crear o restaurar la base MuOnline
Los servidores trabajan con una base llamada MuOnline (es el nombre que usan los scripts de IGK y el DSN de los archivos que vienen con IGK).
Restaurar desde un respaldo (.bak):
- Abre SSMS y conéctate a tu SQL Server.
- Clic derecho en Databases → Restore Database...
- Elige Device, busca el archivo
.baky acéptalo. - En Destination / Database escribe
MuOnline. - Pulsa OK y espera el mensaje de que terminó.
El respaldo de la base no viene dentro de la carpeta MuServer (por confirmar con soporte cómo se entrega la base inicial).
Si ya tienes una base MuOnline de otro servidor Season 6, puedes usarla, pero ejecuta igual los scripts del paso 4 para que tenga todas las tablas que usan los servidores de IGK.
Empezar de cero antes de abrir: MuServer\DataBase\Query Reset DB EMU - XOA TK DE OPEN.sql borra todas las cuentas, personajes, guilds, rankings y logs. Úsalo solo antes de abrir el servidor y con un backup hecho.
Paso 4: ejecutar los scripts de MuServer\DataBase\SQL
Los scripts de MuServer\DataBase\SQL agregan las tablas, columnas y procedimientos que necesitan los sistemas de IGK (Gremory Case, Item Bank, Season Pass, rankings, League of Masters, bans por IP y HWID, etc.).
Cómo se llaman
Cada archivo se llama UpdateNN - nombre.sql: NN es el número de la actualización y nombre dice qué agrega. Algunos archivos viejos tienen un espacio (Update 2, Update 3) y otros no (Update6, Update9): lo que importa es el número.
En qué orden
Ejecútalos por número, de menor a mayor. Ojo: el Explorador de Windows ordena por texto y muestra Update6 y Update9 después de Update30; no sigas ese orden, sigue el número.
| Número | Scripts |
|---|---|
| 2 | Update 2 - WZ_SetReward.sql, Update 2 - WZ_SetRewardAll.sql |
| 3 | Update 3 - CustomGiftSQL.sql, Update 3 - CustomQuestSQL.sql, Update 3 - CustomTop.sql, Update 3 - Fix Gens Join.sql, Update 3 - Procedure SetCoin.sql, Update 3 - Tables King of Mu.sql, Update 3 - WZ_DeleteCharacter.sql, Update 3 - WZ_SetGuildDelete.sql |
| 4 | Update 4 - Kills and Deads.sql |
| 6 | Update 6 - Custom Ranking.sql, Update6 - Procedure WZ_RankingBloodCastle.sql |
| 7 | Update 7 - Lock.sql |
| 9 | Update9 - Create Table RankingTvT.sql, Update9 - Procedure WZ_RankingTvT.sql |
| 11 | Update11 - Ban columns.sql, Update11 - CustomAttack Table.sql, Update11 - Procedure WZ_DesblocAccount.sql, Update11 - WarehouseGuild Table.sql |
| 13 | Update13 - CustomNpcQuest Table.sql |
| 14 | Update14 - Add Item Start column.sql |
| 16 | Update16 - Add Colum Power.sql, Update16 - InventoryExpansion.sql, Update16 - WZ_CustomRanking.sql |
| 22 | Update22 - Add HolyInventory Column.sql, Update22 - Fixed view Frient List.sql, Update22 - WZ_CreateCharacter.sql |
| 23 | Update23 - Custom Systems.sql (Item Bank, Daily Reward, límite diario de eventos, baúles extra) |
| 24 | Update24 - Gremory Case.sql |
| 25 | Update25 - Custom Ranking.sql (reemplaza el procedimiento de ranking de los Update 6 y 16; ejecútalo después de ellos) |
| 27 | Update27 - Custom Quest Panel.sql |
| 28 | Update28 - Season Pass.sql |
| 29 | Update29 - League of Masters.sql |
| 30 | Update30 - IGK_Ban table and procedures.sql, Update30 - MEMB_STAT HWID.sql |
| 31 | Update31 - WZ_SetCoin charges coins.sql (los cobros en monedas se descuentan; el saldo nunca baja de 0) |
| 32 | Update32 - Lua scripts data.sql (tabla Lua_Data: los datos que guardan los scripts Lua, ver 16_LUA.md) |
Cómo ejecutarlos
- En SSMS: File → Open → File... y elige el script.
- Arriba, en la lista de bases, elige MuOnline (muchos scripts no la eligen solos).
- Pulsa Execute (F5) y revisa la pestaña Messages.
¿Se pueden ejecutar más de una vez?
- Desde Update23 en adelante (23, 24, 25, 27, 28, 29 y 30): sí. Solo crean lo que falta y no borran datos. Si tienes dudas de si ya los ejecutaste, ejecútalos otra vez.
- Los viejos (Update 2 a Update22) crean tablas y columnas sin comprobar si ya existen. Si tu base ya los tiene, SQL Server responde con errores como "There is already an object named ..." o "Column names in each table must be unique": no pasa nada, ese script ya estaba aplicado.
- Cuidado con
Update22 - Add HolyInventory Column.sql: además de crear la columna, pone en cero elHolyInventoryde todos los personajes. No lo vuelvas a ejecutar en una base con jugadores. Update14 - Add Item Start column.sqlmarca a todos los personajes existentes como que ya recibieron los items iniciales.
Scripts propios
Si escribes tus propios scripts, usa números desde Update33 en adelante para no chocar con los de IGK, y hazlos de forma que se puedan ejecutar más de una vez.
Qué pasa si falta un script
Los servidores avisan en su consola. Ejemplos reales:
- Sin
Update28 - Season Pass.sql: el GameServer muestra[SeasonPass] DataServer could not read SeasonPass/SeasonPassMission (run Update28 - Season Pass.sql). - Sin
Update29 - League of Masters.sql: el modo funciona, pero el ranking no se guarda (el log del GameServer lo avisa). - Sin
Update25 - Custom Ranking.sql: las listas del ranking del juego (F4 → Ranking) salen vacías.
Paso 5: crear el DSN de ODBC de 64 bits
El JoinServer y el DataServer se conectan a la base por un DSN de sistema. En los archivos de IGK se llama MuOnline.
- Abre
C:\Windows\System32\odbcad32.exe(el administrador ODBC de 64 bits). No uses el deC:\Windows\SysWOW64\: ese es de 32 bits y los servidores de IGK no ven sus DSN. - Pestaña System DSN (DSN de sistema) → Add...
- Elige un driver de SQL Server instalado (por ejemplo SQL Server, que viene con Windows, u ODBC Driver 17/18 for SQL Server).
- Name:
MuOnline(el mismo nombre que pondrás en los.ini). - Server: el nombre de tu SQL Server. En la misma máquina suele ser
(local)o.\SQLEXPRESSsi instalaste Express. - Autenticación:
- SQL Server (usuario y clave, por ejemplo
sa): pon el usuario y la clave. - Windows: sin usuario ni clave (solo si SQL Server está en la misma máquina y los servidores corren con un usuario de Windows que tiene acceso a la base).
- SQL Server (usuario y clave, por ejemplo
- Change the default database to:
MuOnline. - Termina y pulsa Test Data Source... Tiene que decir que la prueba fue exitosa.
Con ODBC Driver 18 marca también Trust server certificate: ese driver cifra la conexión por defecto y sin certificado falla.
Paso 6: usuario y clave de SQL en el JoinServer y el DataServer
JoinServer\Data\JoinServer.ini
| Clave | Qué es | En los archivos de IGK |
|---|---|---|
JoinServerODBC | Nombre del DSN | MuOnline |
JoinServerUSER | Usuario de SQL Server. Vacío = el DSN usa autenticación de Windows | sa |
JoinServerPASS | Clave de ese usuario | (pon la tuya) |
JoinServerPort | Puerto donde escucha a los GameServer | 55970 |
ConnectServerAddress | IP del ConnectServer (para avisarle que está vivo) | 127.0.0.1 |
ConnectServerPort | Puerto UDP del ConnectServer | 55557 |
CaseSensitive | 1 = distingue mayúsculas y minúsculas en el nombre de cuenta al controlar cuentas conectadas | 0 |
MD5Encryption | 1 = las contraseñas están guardadas en la base como MD5; 0 = como texto normal | 0 |
RegisterSwitch | Registro de cuentas desde la pantalla de login: 0 apagado, 1 encendido | 1 |
RegisterDelay | Segundos mínimos entre dos intentos de registro desde la misma IP | 10 |
RegisterMaxPerIp | Cuentas nuevas por IP en 24 horas (0 = sin límite) | 3 |
WriteAccountLog | 1 = escribe LOG\ACCOUNT_LOG (entradas con IP, salidas y cuentas creadas, sin contraseñas) | 1 |
BanCheckSeconds | Cada cuántos segundos busca bans nuevos (tabla IGK_Ban) para expulsar a los conectados con esa IP o PC. 0 = solo se comprueba al entrar | 10 |
DataServer\Data\DataServer.ini
| Clave | Qué es | En los archivos de IGK |
|---|---|---|
DataServerODBC | Nombre del DSN | MuOnline |
DataServerUSER | Usuario de SQL Server (vacío = autenticación de Windows) | sa |
DataServerPASS | Clave de ese usuario | (pon la tuya) |
DataServerPort | Puerto donde escucha a los GameServer | 55960 |
El usuario y la clave tienen que ser los mismos que funcionan en el DSN. Recuerda que estos .ini viajan con la carpeta MuServer: no compartas la carpeta con tu clave de SQL adentro.
AllowableIpList.txt (JoinServer y DataServer)
JoinServer\Data\AllowableIpList.txt y DataServer\Data\AllowableIpList.txt tienen las IP de los GameServer que se pueden conectar. Formato:
0
"127.0.0.1"
end
Con los GameServer en la misma máquina no hay que tocarlo. Si un GameServer está en otra máquina, agrega su IP entre comillas en una línea nueva, en los dos archivos.
Paso 7: configurar las IPs
Hay dos tipos de IP:
- IP pública del VPS: la que usan los jugadores desde internet. Va en la lista de servidores, en
MapServerInfo.daty en el cliente. - 127.0.0.1: la que usan los servidores para hablar entre ellos cuando están en la misma máquina. Va en los
.iniy enGameServerInfo - Common.dat.
En los archivos que vienen con IGK, ServerList.dat y MapServerInfo.dat traen una IP de red local de ejemplo: cámbiala por la IP pública de tu VPS.
7.1 ConnectServer\Data\ConnectServer.ini
| Clave | Qué es | En los archivos de IGK |
|---|---|---|
ConnectServerPortTCP | Puerto donde se conectan los jugadores (tiene que ser igual al IpAddressPort del cliente) | 44405 |
ConnectServerPortUDP | Puerto UDP donde recibe el estado de los GameServer y del JoinServer | 55557 |
ConnectServerVersion | Versión para el sistema de actualización del launcher | 1 |
MaxIpConnection | Conexiones a la vez desde una misma IP | 5 |
MaxHWIDConnection | Conexiones a la vez desde una misma PC | 5 |
ProxyAddress | Solo si pones un proxy o anti-DDoS delante (ver WebBridge\LEEME.txt). Sin la clave vale 127.0.0.1 (el WebBridge) | (no está) |
7.2 ConnectServer\Data\ServerList.dat (la lista de servidores)
Es la lista que ve el jugador al entrar. En los archivos de IGK:
0
//ServerCode ServerClient ServerName ServerAddress ServerPort ServerType
0 "MuOnline" "SV-01" "IP_PUBLICA" 55901 "SHOW"
19 "MuOnline" "SV-CS" "IP_PUBLICA" 55919 "HIDE"
end
| Columna | Qué es |
|---|---|
| (número suelto antes de la lista) | El grupo de servidores, de 0 a 9. Cada grupo es un "servidor" de la lista y tiene hasta 20 subservidores. |
ServerCode | Número del subservidor dentro del grupo (0 a 19). El código real es grupo × 20 + número: en el grupo 0, el código es el mismo número; en el grupo 1, el subservidor 0 es el código 20. Tiene que ser igual al ServerCode del GameServerInfo - Common.dat de ese GameServer. |
ServerClient | Nombre que ve el jugador en la lista (con ServerDefaultName = 0 en MainInfo\MainInfo.ini [Interface], que es como viene). |
ServerName | Nombre que se ve en la consola del ConnectServer. |
ServerAddress | IP pública a la que se conecta el jugador para ese GameServer. |
ServerPort | Puerto del GameServer (igual a su ServerPort). |
ServerType | "SHOW" = aparece en la lista; "HIDE" = oculto (como el de Castle Siege, al que se llega entrando a sus mapas). |
Un servidor de la lista solo se ve si su GameServer está abierto y conectado, y si el JoinServer está conectado al ConnectServer.
Para ver los cambios de ServerList.dat hay que reiniciar el ConnectServer.
7.3 MuServer\Data\MapServerInfo.dat (qué mapas atiende cada GameServer)
Este archivo lo leen todos los GameServer. En los archivos de IGK:
0
//ServerCode MapServerGroup InitSetVal IpAddress Port
0 0 1 SIP_PUBLICA 55901
19 0 0 SIP_PUBLICA 55919
end
1
//ServerCode NotMoveOption NextMap NextServerCode
0 0 30 19
...
19 1 30 -1
...
end
Sección 0 (un renglón por GameServer):
| Columna | Qué es |
|---|---|
ServerCode | El código del GameServer (igual que en ServerList.dat y en su Common.dat). Cada GameServer tiene que tener su renglón: si falta, el GameServer muestra el error "This GameServerCode (N) doesn't Exist at file" y no arranca bien. |
MapServerGroup | Grupo (igual al grupo de ServerList.dat). Los jugadores solo pasan entre GameServers del mismo grupo. |
InitSetVal | 1 = este GameServer atiende todos los mapas, menos los que la sección 1 manda a otro. 0 = no atiende ninguno, solo los que la sección 1 le asigna. |
IpAddress | IP pública del GameServer, con una letra delante (en los archivos de IGK, S). El servidor ignora el primer carácter: escribe por ejemplo S123.45.67.89. Si borras la letra, la IP queda mal. Es la IP a la que se manda al jugador cuando cambia de GameServer por un mapa. |
Port | Puerto del GameServer. |
Sección 1 (mapas que se atienden en otro GameServer):
| Columna | Qué es |
|---|---|
ServerCode | El GameServer al que se aplica la regla. |
NotMoveOption | 0 = cuando un jugador de este GameServer va al mapa NextMap, pasa al GameServer NextServerCode. 1 = este GameServer atiende el mapa NextMap (va con NextServerCode = -1). |
NextMap | Número de mapa. |
NextServerCode | GameServer de destino (o -1). |
En los archivos de IGK, el GameServer 0 manda los mapas 30, 31, 34, 41, 42 y 79 al GameServer 19 (Castle Siege), y el GameServer 19 atiende solo esos mapas.
7.4 GameServer\Data\GameServerInfo - Common.dat (cada GameServer)
En la parte de arriba del archivo:
| Clave | Qué es | GameServer | GameServerCS |
|---|---|---|---|
ServerName | Nombre del GameServer (sale en la ventana y en mensajes) | SV-01 | SV-CS |
ServerCode | Código (igual que en ServerList.dat y MapServerInfo.dat) | 0 | 19 |
ServerPort | Puerto donde se conectan los jugadores | 55901 | 55919 |
ServerVersion | Versión del cliente que acepta (igual a ClientVersion del cliente) | 1.04.05 | 1.04.05 |
ServerSerial | Serial del cliente que acepta (igual a ClientSerial del cliente) | (el tuyo) | (el tuyo) |
ServerMaxUserNumber | Jugadores a la vez (como máximo 1000) | 1000 | 1000 |
DataServerAddress / DataServerPort | Dónde está el DataServer | 127.0.0.1 / 55960 | 127.0.0.1 / 55960 |
JoinServerAddress / JoinServerPort | Dónde está el JoinServer | 127.0.0.1 / 55970 | 127.0.0.1 / 55970 |
ConnectServerAddress / ConnectServerPort | Dónde está el ConnectServer (puerto UDP) | 127.0.0.1 / 55557 | 127.0.0.1 / 55557 |
En la sección "Customer Settings", CustomerName es la clave de tu licencia (ver 18_LICENCIA.md). LicenseID y CustomerHardwareId ya no se usan.
Los cambios de estas claves (código, puerto, direcciones, versión, serial) se leen al arrancar: reinicia el GameServer después de cambiarlas.
7.5 El cliente (MainInfo\MainConnect.ini)
En la sección [MainInfo]:
IpAddress= la IP pública del VPS (o un dominio que apunte a ella).IpAddressPort= elConnectServerPortTCP(44405 en los archivos de IGK).ClientVersionyClientSerial= iguales aServerVersionyServerSerialde los GameServer.
Después de cambiarlo, genera el cliente con el Encoder (MainInfo\Encoder.exe).
7.6 Probar en tu propia PC o en el mismo VPS
- Para probar en casa, en la red local, usa la IP local de la PC del servidor (por ejemplo
192.168.x.x) enServerList.dat,MapServerInfo.daty el cliente. - Un cliente de PC abierto en el propio VPS tiene que conectarse a la IP pública, no a 127.0.0.1: los servidores reservan 127.0.0.1 para el WebBridge (ver
WebBridge\LEEME.txt).
Lista de servidores y subservidores
Agregar un subservidor (por ejemplo SV-02)
- Copia la carpeta
MuServer\GameServery pégala comoMuServer\GameServer2(tiene que quedar dentro deMuServer, junto aData). - En
GameServer2\Data\GameServerInfo - Common.datcambia:ServerName = SV-02ServerCode = 1ServerPort = 55902
- En
ConnectServer\Data\ServerList.dat, dentro del grupo 0, agrega:1 "MuOnline" "SV-02" "IP_PUBLICA" 55902 "SHOW" - En
MuServer\Data\MapServerInfo.dat:- Sección 0:
1 0 1 SIP_PUBLICA 55902 - Sección 1: copia los renglones del servidor 0 cambiando el código a 1 (para que los mapas de Castle Siege vayan al GameServer 19):
1 0 30 19,1 0 31 19,1 0 34 19,1 0 41 19,1 0 42 19,1 0 79 19
- Sección 0:
- Abre el puerto 55902 en el firewall.
- Si usas el cliente web, revisa que el puerto esté en
ServerPortsdeWebBridge.ini(en los archivos de IGK ya está el rango55901-55919). - Si usas IGK StartUp, agrega el nuevo GameServer a su lista (ver
11_IGK_HOST_STARTUP_CONNECT.md). - Reinicia el ConnectServer (para leer
ServerList.dat) y los GameServer (para leerMapServerInfo.dat).
Cada subservidor puede tener su propia configuración (experiencia, drop, eventos) en sus propios GameServerInfo - *.dat. Los archivos de MuServer\Data son los mismos para todos.
Importante: dos GameServer con el mismo ServerCode no pueden estar abiertos a la vez: el segundo muestra "Could not open GameServer".
Agregar otro servidor (otro grupo de la lista)
Usa otro número de grupo en ServerList.dat (por ejemplo 1, con su end) y en MapServerGroup de MapServerInfo.dat. Los códigos de ese grupo empiezan en 20 (subservidor 0 del grupo 1 = código 20, que va en ServerCode = 20 de su Common.dat).
Paso 8: firewall
Abre en el Firewall de Windows (reglas de entrada, TCP):
- El puerto del ConnectServer: 44405.
- El puerto de cada GameServer: 55901, 55919 y el de cada subservidor.
- El WebBridge (44480 o su
TlsPort) solo si los jugadores web se conectan directo al VPS.
No abras 55557 (UDP del ConnectServer), 55970 (JoinServer), 55960 (DataServer) ni el de SQL Server: son internos.
Ejemplo con la consola de Windows (como administrador):
netsh advfirewall firewall add rule name="MU ConnectServer" dir=in action=allow protocol=TCP localport=44405
netsh advfirewall firewall add rule name="MU GameServer" dir=in action=allow protocol=TCP localport=55901
netsh advfirewall firewall add rule name="MU GameServerCS" dir=in action=allow protocol=TCP localport=55919
IGK StartUp puede abrir y mantener estas reglas solo (OpenServerPorts = 1 en IGKStartUp.ini).
Si tu VPS tiene además un firewall en el panel del proveedor, abre los mismos puertos allí.
Paso 9: orden de arranque
Arranca los servidores en este orden (es el que usa IGK StartUp):
- DataServer
- JoinServer
- ConnectServer
- GameServer (y los subservidores)
- GameServerCS
- WebBridge (solo si usas el cliente web)
Para apagar, al revés: el DataServer al final, para que guarde todo lo que le mandan los GameServer.
Si un GameServer arranca antes que el JoinServer o el DataServer, se queda en STANDBY MODE y se conecta solo cuando ellos estén abiertos.
IGK StartUp hace todo esto solo (arranca en orden, reinicia si se cae, cierra limpio, reinicio diario con aviso). Ver 11_IGK_HOST_STARTUP_CONNECT.md.
Cómo saber si todo conecta bien
Lo que se ve en cada ventana
| Servidor | Bien | Mal |
|---|---|---|
| DataServer | ACTIVE MODE (verde) cuando hay al menos un GameServer conectado | STANDBY MODE: ningún GameServer conectado todavía, o no se conectó a la base (ver mensajes en rojo) |
| JoinServer | ACTIVE MODE cuando hay al menos un GameServer conectado | STANDBY MODE: ningún GameServer conectado, o no se conectó a la base |
| ConnectServer | "ENLACE CON JOINSERVER" en ACTIVE MODE | STANDBY MODE: no le llega el JoinServer. En la consola: [ServerList] JoinServer offline |
| GameServer | "ESTADO DEL SERVIDOR" en ACTIVE MODE (conectado al JoinServer y al DataServer) | STANDBY MODE: le falta el JoinServer o el DataServer |
Al cargar, el GameServer muestra en azul una línea por cada grupo de archivos: [ServerInfo] Common loaded successfully, [ServerInfo] Custom loaded successfully, Event loaded, Item loaded, Monster loaded, Move loaded, Quest loaded, Shop loaded, Skill loaded, Util loaded. Si falta una o sale un cuadro de error, hay un archivo con un error de formato.
Mensajes cuando falla la conexión a la base
El JoinServer y el DataServer dicen por qué falló la conexión a la base, con el mensaje del driver ODBC:
[QueryManager] ODBC 'MuOnline' (64 bits), usuario 'sa': no se pudo conectar
[QueryManager] State (XXXXX), Native (N): <mensaje del driver>
Could not connect to database
Y además, según el caso:
[QueryManager] Sin usuario en el .ini: el DSN tiene que usar autenticacion de Windows, o poner usuario y clave en el .ini[QueryManager] Servidor de 64 bits: el DSN va en C:\Windows\System32\odbcad32.exe (el de SysWOW64 es de 32 bits)
Estados de ODBC más comunes:
| State | Qué significa | Qué hacer |
|---|---|---|
IM002 | No encuentra el DSN ("Data source name not found") | Crea el DSN en el ODBC de 64 bits (System32\odbcad32.exe), como DSN de sistema, con el mismo nombre que JoinServerODBC / DataServerODBC. |
28000 | Usuario o clave incorrectos ("Login failed for user") | Revisa JoinServerUSER/JoinServerPASS y DataServerUSER/DataServerPASS. Si usas sa, SQL Server tiene que estar en modo mixto y sa habilitado. |
08001 | No encuentra el servidor SQL | Revisa el nombre del servidor en el DSN (por ejemplo .\SQLEXPRESS) y que el servicio de SQL Server esté encendido. |
42000 / 4060 | No puede abrir la base | La base no se llama MuOnline o el usuario no tiene permiso sobre ella. |
Otros mensajes útiles
| Mensaje | Dónde | Qué significa |
|---|---|---|
[ServerList] GameServer offline (SV-01) (0) | ConnectServer | Ese GameServer dejó de mandar su estado (cerrado, colgado o con la IP/puerto UDP del ConnectServer mal puestos). |
[ServerList] JoinServer offline | ConnectServer | El JoinServer dejó de mandar su estado. Sin JoinServer la lista sale vacía. |
Could not start GameServer | GameServer | El puerto ServerPort está ocupado (otro programa u otro GameServer lo usa). |
Could not open GameServer | GameServer | Ya hay otro GameServer abierto con el mismo ServerCode. |
| "This GameServerCode (N) doesn't Exist at file" | GameServer | Falta el renglón de ese código en la sección 0 de MapServerInfo.dat. |
[Ban] Cuenta X rechazada: IP/HWID ... baneado. Motivo: ... | JoinServer | Alguien intentó entrar desde una IP o PC baneada. |
Prueba final
- Abre el cliente: tiene que aparecer la lista con tu servidor.
- Elige el servidor, entra con una cuenta y crea un personaje.
- En la consola del GameServer debe aparecer la conexión; el contador "JUGADORES EN LINEA" sube.
Preguntas frecuentes
P: La lista de servidores sale vacía. ¿Qué reviso?
R: Que el JoinServer esté abierto y conectado a la base (el ConnectServer debe decir ACTIVE MODE), que el GameServer esté en ACTIVE MODE, que su ServerCode exista en ServerList.dat con "SHOW", y que ConnectServerAddress/ConnectServerPort de Common.dat y de JoinServer.ini apunten al puerto UDP del ConnectServer (55557).
P: Veo la lista, pero al elegir el servidor no entra o se queda conectando.
R: La IP o el puerto de ese servidor en ServerList.dat están mal, o el puerto del GameServer está cerrado en el firewall. La IP tiene que ser la pública del VPS.
P: El JoinServer dice "Could not connect to database". ¿Qué hago?
R: Mira las líneas [QueryManager] de arriba: dicen el motivo. Lo más común es el DSN creado en el ODBC de 32 bits (debe ser C:\Windows\System32\odbcad32.exe), o usuario y clave de SQL incorrectos en el .ini.
P: Creé el DSN y el "Test Data Source" funciona, pero el servidor dice que no lo encuentra.
R: Lo creaste en el ODBC de 32 bits (SysWOW64) o como DSN de usuario. Créalo en C:\Windows\System32\odbcad32.exe, pestaña System DSN.
P: ¿En qué orden ejecuto los scripts SQL? R: Por número, de menor a mayor (2, 3, 4, 6, 7, 9, 11, 13, 14, 16, 22, 23, 24, 25, 27, 28, 29, 30), no por el orden alfabético del Explorador.
P: ¿Puedo ejecutar un script SQL dos veces?
R: Los de Update23 en adelante sí, sin problema. Los viejos dan error de "ya existe" si ya estaban aplicados, lo que es normal; pero no repitas Update22 - Add HolyInventory Column.sql en una base con jugadores porque vacía el HolyInventory de todos.
P: Cambié la IP en ServerList.dat y no cambia nada.
R: Reinicia el ConnectServer. Y si cambiaste MapServerInfo.dat, reinicia también los GameServer.
P: Los jugadores entran a Lorencia, pero al ir a Crywolf o Castle Siege se desconectan.
R: Esos mapas los atiende el GameServerCS (código 19). Revisa que esté abierto, que su puerto (55919) esté abierto en el firewall y que su IP en MapServerInfo.dat sea la pública, con la letra S delante.
P: ¿Cómo agrego un subservidor?
R: Copia la carpeta GameServer dentro de MuServer, cámbiale ServerName, ServerCode y ServerPort en su Common.dat, y agrégalo en ServerList.dat y MapServerInfo.dat. Los pasos completos están arriba en "Agregar un subservidor".
P: Abrí dos GameServer y el segundo dice "Could not open GameServer".
R: Tienen el mismo ServerCode. Cada GameServer necesita un código y un puerto distintos.
P: ¿Puedo abrir el cliente en el mismo VPS para probar? R: Sí, pero conectándote a la IP pública del VPS, no a 127.0.0.1.
P: ¿En qué orden prendo los servidores? R: DataServer, JoinServer, ConnectServer, GameServer, GameServerCS y WebBridge. Para apagar, al revés. IGK StartUp lo hace solo.
P: ¿Tengo que abrir el puerto de SQL Server?
R: No. Los servidores se conectan a SQL Server dentro de la misma máquina. Para administrar la base desde tu PC usa IGK Connect (ver 11_IGK_HOST_STARTUP_CONNECT.md).