メインコンテンツまでスキップ

モンスターギフト(Grant ID)

NPC がプレイヤーにモンスターを渡すとき(研究所の最初のパートナー、ルート上の贈り物、復元された化石など)、シングルプレイヤーのゲームは単にそれをロースターに追加します。オンラインのゲームではそれができません。自分で好きなモンスターを自分に与えられるクライアントは、伝説のモンスターも自分に与えられるクライアントだからです。MCE Online では、ギフトを生成するのはサーバーであり、クライアントはそれを要求するだけです。

Pro および Source ティアで利用できます。

オンラインでのギフトの仕組み​

すべてのギフトの背後にあるノードは GiveMonsters(CommandGraph の Monsters カテゴリ)です。最初のパートナーと「NPC ギフト」は同じノードなので、両方に対して仕組みは 1 つです。

  1. プレイヤーが NPC に話しかけ、グラフが GiveMonsters ノードに到達します。
  2. オンラインでは、ノードはモンスターを追加しません。OnlineCommandBridge.RequestGiveMonsterAsync(grantId, ...) を通じてサーバーに依頼し、サイトを GrantId で指定します。
  3. サーバーは自分のデータ(monster_grant_data)でそのサイトを調べ、サーバー側に記録されている種、レベル、数量のモンスターを生成します。クライアントがリクエストで送ってきた種は無視され、ログに記録されます。
  4. サーバーは、このキャラクターがこのサイトを受け取ったことを記録し(monster_grant_claims、キャラクターとグラント ID がキー)、ギフトはキャラクターごとに 1 回だけ受け取れるようにします。何度でも話しかけられる NPC は、モンスターの量産工場ではありません。
  5. クライアントは生成されたモンスターを受け取り、オフラインの経路と同じダイアログで表示します。

サーバーが付与しなかった場合、ノードはローカルでは何も付与せず(そうすると自己ギフトの穴が再び開くため)、「grant failed」ダイアログを表示します。オフラインでは何も変わりません。

GrantId​

すべてのギフトサイトには、それぞれ固有の GrantId が必要です。これは GiveMonsters ノードに保存される不透明な文字列です(Inspector では非表示で、手で入力するものではありません)。サーバーは空の ID を名前付きで拒否する(grantId is required)ため、ID のないサイトはオンラインではギフトを出しません。つまり、安全側に倒れて失敗します。

ID の性質は次のとおりです。

  • ノードタイプごとではなく、サイトごと。 互いにコピーされた 2 つのノードはノードのオーサリング GUID を共有しますが、与えるものは異なります。刻印される ID は、ノードの GUID に、ノードが存在する場所(アセットの GUID とプロパティパス)の短いハッシュを足したものなので、各サイトは固有になります。
  • 安定。 ハッシュはパスではなくアセットの GUID を使うため、ファイルを移動したり名前を変更したりしても変わりません。
  • 不透明。 ID には #、/、ファイル拡張子が含まれないため、ノードは実行時に常にそれを扱えます。
  • 上書きされない。 刻印は空の ID を埋めるだけです。すでに存在する ID、したがってそれに対するサーバーのシードは、決して変わりません。

刻印とエクスポート(エディター側)​

MonsterGrantSeedExporter(MCE.Online.Editor アセンブリ内)が 2 つの仕事をします。

  1. プロジェクトのプレハブとシーンから GiveMonsters ノードをスキャンします。シーンはまずテキストで絞り込まれ(シーンの YAML にノードのクラスマークが含まれる場合にのみ開かれる)、すべてのシーンを開くわけではありません。
  2. 刻印をオンにすると、不足している GrantId を埋め、シードを書き出します。SeedData/monster-grant-seed.json(各サイトが与えるもの)と SeedData/monster-grant-seed.report.txt(確認されたサイトとスキップされたサイト、その理由)です。

エクスポーターの入口:

入口用途
MonsterGrantSeedExporter.Export(folder)不足している ID を刻印し、その後シードとレポートを書き出す
MonsterGrantSeedExporter.Scan(stampMissingIds, persist)スキャン。必要なら刻印、必要ならディスクへ保存。Scan() だけなら何も読み書きしない
BatchExporters.ExportMonsterGrantsバッチモード:-executeMethod OpenMon.MCE.Online.Editor.BatchExporters.ExportMonsterGrants

シードのサーバーへの送信は、ほかのシードと同様にサーバー間通信です。mce_monster_grant_seed RPC はユーザーセッションを伴う呼び出しをすべて拒否し、ランタイム HTTP キーを必要とします(そのキーが決して Unity 内に入らない理由は種のシーディングを参照)。

選択肢を提示するギフト

GiveMonsters は固定のギフト(またはランダムなもの)を 1 つ渡します。選択肢を提示するノード(化石復元屋のような GiveMonstersBasedOnChosenItem)は choice: true でエクスポートされます。サーバーは、プレイヤーが選んだインデックスから選択肢が必要とするアイテムを導き出すため、クライアントが「安い方を使った」と偽って高価な化石を復元することはできません。

インポートされたゲーム​

カートリッジや Essentials プロジェクトからインポートされたゲームには、ギフトノードがたくさんあります。研究所の 3 匹の最初のパートナー、NPC のポケモン、化石などです。インポーターが刻印を代行します。

NPC のインポーター(HeartGold / SoulSilver、FireRed)が終了すると、GrantsEnLoImportado.Estampar() が、刻印と永続化をオンにしてエクスポーターのスキャンを実行します。オンラインレイヤーがプロジェクトに含まれている場合のみで、含まれていなければ刻印するものはありません。その後、独立した集計で自分の作業を検証します。Assets/ImportedGames 配下のすべてのシーンを読み取り、空の GrantId の数を数えます。シーンがプレハブインスタンスのオーバーライドとして保存しているものも含みます(研究所の最初のパートナーがまさにそれです)。1 つでも残っていれば例外を投げるので、サーバーが拒否するギフトを残したまま、インポートが「成功」で終わることはありません。

[Importador] GrantId de los regalos: estampados=3 yaEstaban=0 quedanSinId=0

(estampados:今回刻印した数、yaEstaban:すでに ID があった数、quedanSinId:まだ空の数。0 でなければなりません。)

その後、ギフトのシード(上記)をエクスポートしてサーバーに送ります。ほかのシード RPC と同様に、mce_monster_grant_seed はユーザーセッションを伴う呼び出しを拒否します。書き込めるのは、ランタイム HTTP キーを使ったサーバー間の呼び出しだけです。

リファレンス​

型場所役割
GiveMonstersOpenMon.MCE.Actors.CommandGraph.Monstersノード。GrantId を持ち、オンライン時はサーバーに依頼する
OnlineCommandBridge.RequestGiveMonsterAsyncMCE.Online.Runtimeリクエスト(grantId、任意の選択インデックス)
MonsterGrantSeedExporterOpenMon.MCE.Online.Editorスキャン、刻印、シードのエクスポート
GrantsEnLoImportadoOpenMon.MCE.EssentialsImporter.Editorインポート後に ID を刻印して検証する
mce_monster_grant_seedNakama RPCサーバー間通信:サイトを保存する