Saltar al contenido principal

Modo GM

El Modo GM es la forma de probar tu juego contra tu servidor en vivo.

Cuando el servidor es autoritativo, los trucos que usabas sin conexión dejan de funcionar. No puedes darte un monstruo de nivel 40 editando un archivo de guardado, porque el archivo de guardado ya no es donde vive la verdad: lo es el servidor. Si fijas el nivel localmente, la siguiente sincronización del equipo lo sobrescribe o, peor, no lo hace, y pasas una tarde persiguiendo un error que solo existe en tu máquina.

Esa es toda la razón de que exista. Una herramienta de depuración que escribe en el guardado local mientras el servidor es autoritativo no es una herramienta: es un generador de errores fantasma. Por eso cada acción de GM es una RPC del servidor, resuelta por el servidor, persistida por el servidor y visible para todos los clientes que pregunten.

Para quién es esto

El Modo GM es para la persona que opera el servidor: tú, durante el desarrollo, y quien ejecute tu juego después del lanzamiento. No es una función para jugadores, y no es un menú de trucos que se distribuya activado. Consulta Cerrarlo con llave.

Dos formas de entrar​

Las mismas ocho RPC son accesibles desde dos lugares, porque dos tareas distintas las necesitan.

Panel en el juegoPestaña GM del Hub
DóndeCon el juego en marcha, F9Tools → MCE → OpenMon Hub → GM
ParaProbar mientras juegasOperar sin lanzar el juego
NecesitaUna sesión en línea con la sesión iniciadaSu propio inicio de sesión con correo/contraseña

El panel en el juego (F9)​

El atajo se instala solo: no hay nada que arrastrar a una escena, y eso es deliberado: una herramienta de operador tiene que funcionar en cualquier escena, incluidas las que creas después de comprar el motor, y una escena cableada a mano se olvida en la siguiente.

Corregido el 2026-08-29

No siempre fue así. GmModeHotkey se distribuía como un componente con cero referencias: ningún prefab, ninguna escena, ningún asset lo nombraba, así que nada lo instanciaba nunca y F9 no podía funcionar en ningún juego. Se encontró manejando el juego, no leyendo: al pulsar F9 en una sesión en línea en vivo, con la sesión iniciada como un game master real, no se enviaba ningún gamemaster_status al servidor.

El panel GM abierto sobre el mundo en marcha

Ese es el panel sobre un mundo en línea en vivo, abierto con F9 en una cuenta que el servidor reconoce. La línea de abajo, "10 verbos disponibles", no es una etiqueta que escribiera el cliente: es la propia respuesta del servidor a gamemaster_status, y por eso una cuenta sin el permiso ve que el panel se niega a abrirse en lugar de abrirse vacío.

F9 es el valor por defecto porque queda fuera del rango que usa MCE para jugar: las teclas de movimiento, Z/X y los atajos del menú quedan intactos, de modo que el panel no puede tragarse una entrada que el juego necesitaba. El atajo vive en GmModeHotkey.cs y es un campo Key normal, así que puedes cambiarlo.

El panel solo aparece para una cuenta que el servidor considera game master. Pregunta: no lo da por supuesto. Al abrirse llama a gamemaster_status, y la respuesta es sobre quien llama: no hay forma de preguntar "¿es esa cuenta un GM?", y por eso la RPC no se puede usar para enumerar quién tiene poder en tu servidor.

La pestaña GM del Hub​

La pestaña GM del OpenMon Hub

La pestaña del Hub inicia sesión con un correo y una contraseña, exactamente igual que un jugador, y recibe de vuelta un token de sesión real. Es una decisión deliberada y merece explicación, porque el resto del Hub no funciona así.

Todos los demás paneles del Hub que hablan con el servidor (la siembra, sobre todo) hablan de servidor a servidor con el http_key del runtime de Nakama. Esa clave no tiene ningún usuario asociado. Y los siete verbos de acción requieren ctx.userId, porque cada uno escribe una fila que nombra quién lo hizo.

Podríamos haber agregado variantes de los verbos con http_key. Nos negamos, y el motivo cabe en una frase: la fila de auditoría diría "el http_key lo hizo", y el registro perdería su sujeto, que es lo único que cualquiera pregunta jamás a un registro de administración.

El http_key no es un game master

Son dos credenciales con dos significados. Tener la clave de siembra te permite escribir en el almacenamiento de servidor a servidor. No te convierte en game master, y nunca concede un verbo de GM. No las confundas, y no pongas ninguna de las dos en tu repositorio.

La pestaña también distingue cuatro estados en lugar de reducirlos a un único fallo. "No has iniciado sesión", "iniciaste sesión y no eres un GM", "eres un GM pero este servidor tiene el interruptor de corte activado" y "listo" te envían a cuatro lugares distintos. Un único "no se pudo conectar" te mandaría a revisar las credenciales cuando lo que realmente necesitas es una concesión, o a sembrar un permiso que ya tienes cuando lo que necesitas es hablar con quien administra el servidor.

tip

La pestaña no recuerda tu contraseña entre sesiones del editor. El host, el puerto, la clave del servidor y el correo persisten; la contraseña no.

Los ocho verbos​

Uno hace una pregunta. Siete actúan.

RPCQué hace
gamemaster_status¿Soy game master? ¿Está habilitado el Modo GM aquí? ¿Qué verbos existen?
gamemaster_mint_monsterCrea un monstruo de una especie dada, en el servidor, con un id asignado por el servidor
gamemaster_set_levelCambia el nivel de un monstruo
gamemaster_set_hpFija el HP actual, incluso hasta cero, para llegar a los caminos de debilitamiento
gamemaster_heal_partyRestaura por completo al equipo
gamemaster_force_encounterFuerza el siguiente encuentro salvaje
gamemaster_set_dexMarca una especie como vista o capturada
gamemaster_set_variableEscribe una variable de juego

gamemaster_mint_monster merece una nota. Crea el monstruo en el servidor, y el servidor asigna el id. No hay ningún camino del cliente que pueda acuñar uno: el enlace de subida puede actualizar los siete campos que un jugador cambia al jugar, y eso es todo lo que puede hacer. Si necesitas que exista un monstruo, esta es la única puerta.

Por qué esto supera a repetir el contenido​

gamemaster_set_level existe porque verificar una animación de evolución solía costar 126 batallas. La función que reemplazó no era un atajo para esquivar las pruebas; era la diferencia entre una prueba que se ejecuta y una que no.

Cerrarlo con llave​

Tres cosas independientes deben cumplirse todas antes de que se ejecute un verbo. Con que una falle, se detiene.

1. La tabla de game masters. Una cuenta es GM solo si está en esa tabla. La tabla empieza vacía, y vacía significa nadie: no "todos", no "la primera cuenta", no "quien tenga una clave". Un servidor nuevo no tiene ningún game master.

2. El interruptor de corte. Establecer la variable de entorno MCE_GM_MODE_DISABLED=true desactiva todos los verbos sin tocar la tabla. Úsalo en un nodo de producción: las concesiones quedan exactamente como están y no se puede invocar nada. Al volver a desactivarlo se restaura lo que ya tenías, así que nunca tienes que reconstruir la tabla de memoria durante un incidente.

3. La puerta por verbo. requireGameMasterVerb se ejecuta en cada llamada, incluida gamemaster_status. Una llamada rechazada también se registra.

Dos registros de auditoría, a propósito​

Cada acción de GM escribe dos registros, y existen para dos lectores distintos.

gm_audit es el registro del operador. Es propiedad del sistema, nombra al game master, el verbo y el objetivo, y se escribe en cada llamada, incluidas las que fueron rechazadas. Un rechazo es exactamente el evento para el que sirve un registro de administración.

El segundo registro va bajo la propia cuenta del jugador objetivo, legible por ese jugador. Esta es la mitad que es fácil omitir y la que importa éticamente: un jugador siempre puede enterarse de que alguien con poder tocó sus datos. El estado "fueron tocados y nunca se les dijo" no es algo que este sistema pueda representar: la fila visible para el jugador viaja en la misma escritura de almacenamiento que el propio efecto, así que no hay ninguna ventana en la que uno llegara y el otro no.

Configurarlo​

  1. Pon en marcha el servidor: consulta Configuración.
  2. Crea la cuenta con la que quieres operar (juega una vez o regístrate).
  3. Concédele game master en la tabla game_masters. Un cliente no puede hacerlo: la llamada de servidor a servidor mce_gamemaster_seed recibe { "grant": [userId, ...], "revoke": [userId, ...] } y necesita el http_key del runtime de Nakama, como las demás llamadas de siembra. Es idempotente y nunca revoca una cuenta que no esté listada en revoke.
  4. Abre la pestaña GM del Hub, inicia sesión y confirma que la línea de estado dice que eres un GM.
  5. En el juego, pulsa F9.

Si el panel no aparece, la llamada de estado es lo que hay que leer: te dice cuál de las tres puertas te detuvo.

Antes de lanzar​

  • Establece MCE_GM_MODE_DISABLED=true en cualquier nodo al que puedan llegar los jugadores, salvo que quieras deliberadamente herramientas de GM en vivo en producción.
  • Mantén pequeña y auditada la tabla de game masters. Cada cuenta que contiene puede escribir en los datos de cualquier jugador.
  • Lee gm_audit después de los incidentes. Está escrito para ese momento exacto.