Regalos de monstruos (Grant IDs)
Cuando un NPC le entrega un monstruo al jugador (el inicial del laboratorio, un regalo en una ruta, un fósil revivido), un juego de un solo jugador simplemente lo agrega al equipo. Un juego en línea no puede hacer eso: un cliente que puede regalarse cualquier monstruo es un cliente que puede regalarse un legendario. En MCE Online el servidor acuña el regalo y el cliente solo lo pide.
Disponible en los niveles Pro y Source.
Cómo funciona un regalo en línea
El nodo detrás de cada regalo es GiveMonsters (CommandGraph, categoría Monsters). El inicial y el "regalo de NPC" son el mismo nodo, así que hay un único mecanismo para ambos.
- El jugador habla con el NPC y el grafo llega al nodo
GiveMonsters. - En línea, el nodo no agrega el monstruo. Se lo pide al servidor mediante
OnlineCommandBridge.RequestGiveMonsterAsync(grantId, ...), nombrando el sitio por suGrantId. - El servidor busca el sitio en sus propios datos (
monster_grant_data) y acuña la especie, el nivel y la cantidad que él tiene registrados. Cualquier especie que un cliente envíe en la petición se ignora y se registra en el log. - El servidor registra que este personaje reclamó este sitio (
monster_grant_claims, con clave de personaje e id de regalo), de modo que un regalo se puede recibir una vez por personaje: un NPC con el que puedes volver a hablar no es una fábrica de monstruos. - El cliente recibe el monstruo acuñado y lo muestra con los mismos diálogos que usa el camino sin conexión.
Si el servidor no lo concede, el nodo no concede nada localmente (hacerlo reabriría el agujero del autorregalo) y muestra un diálogo de "grant failed". Sin conexión, nada cambia.
El GrantId
Cada sitio de regalo necesita su propio GrantId: una cadena opaca guardada en el nodo GiveMonsters (está oculta en el Inspector; no se escribe a mano). El servidor rechaza por su nombre un id vacío (grantId is required), así que un sitio sin id no da ningún regalo en línea: falla cerrado.
Los ids son:
- Por sitio, no por tipo de nodo. Dos nodos copiados uno del otro comparten el GUID de autoría del nodo pero dan cosas distintas; el id estampado es el GUID del nodo más un hash corto de dónde vive el nodo (el GUID del asset y la ruta de la propiedad), de modo que cada sitio es distinto.
- Estables. El hash usa el GUID del asset, no su ruta, así que mover o renombrar el archivo no lo cambia.
- Opacos. Un id no tiene
#,/ni extensión de archivo, de modo que el nodo siempre puede pronunciarlo en tiempo de ejecución. - Nunca se sobrescriben. El estampado solo rellena los ids vacíos. Un id que ya existe, y por tanto la siembra del servidor para él, nunca cambia.
Estampar y exportar (el lado del editor)
MonsterGrantSeedExporter (en el ensamblado MCE.Online.Editor) hace los dos trabajos:
- Escanea los prefabs y las escenas del proyecto en busca de nodos
GiveMonsters. Las escenas se filtran primero por texto (una escena solo se abre cuando su YAML contiene la marca de clase del nodo), de modo que el escaneo no abre todas las escenas. - Con el estampado activado, rellena los
GrantIdque faltan y escribe la siembra:SeedData/monster-grant-seed.json(lo que da cada sitio) ySeedData/monster-grant-seed.report.txt(los sitios vistos y los omitidos, con el motivo).
Los puntos de entrada del exportador:
| Entrada | Uso |
|---|---|
MonsterGrantSeedExporter.Export(folder) | Estampa los ids que faltan y luego escribe la siembra y el informe |
MonsterGrantSeedExporter.Scan(stampMissingIds, persist) | Escanea; opcionalmente estampa, opcionalmente guarda en disco. Scan() solo no lee ni escribe nada |
BatchExporters.ExportMonsterGrants | Modo batch: -executeMethod OpenMon.MCE.Online.Editor.BatchExporters.ExportMonsterGrants |
Enviar la siembra al servidor es de servidor a servidor, como el resto de las siembras: la RPC mce_monster_grant_seed rechaza cualquier llamada que lleve una sesión de usuario y necesita la clave HTTP de tiempo de ejecución (ver Siembra de especies para saber por qué esa clave nunca va dentro de Unity).
GiveMonsters entrega un regalo fijo (o uno aleatorio). El nodo que ofrece una elección (GiveMonstersBasedOnChosenItem, como el que usa el reanimador de fósiles) se exporta con choice: true: el servidor deduce el objeto que cuesta la opción elegida a partir del índice que escogió el jugador, de modo que un cliente no puede revivir el fósil caro afirmando que gastó el barato.
Juegos importados
Un juego importado de un cartucho o de un proyecto de Essentials está lleno de nodos de regalo: los tres iniciales del laboratorio, el Pokémon de un NPC, un fósil. Los importadores hacen el estampado por ti.
Cuando terminan los importadores de NPCs (HeartGold / SoulSilver, FireRed), GrantsEnLoImportado.Estampar() ejecuta el escaneo del exportador con el estampado y la persistencia activados, si la capa en línea forma parte del proyecto; sin ella no hay nada que estampar. Luego comprueba su propio trabajo con un recuento independiente: lee todas las escenas bajo Assets/ImportedGames y cuenta los valores GrantId vacíos, incluidos los que una escena guarda como una sobrescritura de una instancia de prefab (el inicial del laboratorio es exactamente eso). Si queda alguno, lanza una excepción, de modo que una importación nunca termina "con éxito" dejando regalos que el servidor rechazaría:
[Importador] GrantId de los regalos: estampados=3 yaEstaban=0 quedanSinId=0
(estampados: estampados ahora; yaEstaban: ya tenían id; quedanSinId: siguen vacíos, debe ser 0.)
Después, exporta la siembra de regalos (arriba) y envíala al servidor. Como las demás RPC de siembra, mce_monster_grant_seed rechaza cualquier llamada que lleve una sesión de usuario: solo una llamada de servidor a servidor con la clave HTTP de tiempo de ejecución puede escribirla.
Referencia
| Tipo | Dónde | Función |
|---|---|---|
GiveMonsters | OpenMon.MCE.Actors.CommandGraph.Monsters | El nodo; lleva GrantId y le pregunta al servidor cuando hay conexión |
OnlineCommandBridge.RequestGiveMonsterAsync | MCE.Online.Runtime | La petición (grantId, índice de elección opcional) |
MonsterGrantSeedExporter | OpenMon.MCE.Online.Editor | Escanea, estampa y exporta la siembra |
GrantsEnLoImportado | OpenMon.MCE.EssentialsImporter.Editor | Estampa y verifica los ids después de una importación |
mce_monster_grant_seed | RPC de Nakama | De servidor a servidor: guarda los sitios |