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

マイルストーンシステム

マイルストーンシステムの概要と詳しい使い方について説明しています。


概要

マイルストーンは, シナリオの進行状況や, サーバの状態をフラグで管理するためのシステムです。
進行状況に応じてマイルストーンを設定することで, それに応じたシナリオの場合分けを行えます。

マイルストーンは文字列型のフラグであり, 任意の一意な名前を持ちます。

例:

scenarios:
# マイルストーン "villager_killed" を設定
- type: execute
action: milestone
with:
name: "villager_killed"
# マイルストーン "villager_killed" が設定されていることを要求する。
- type: require
action: milestone
with:
name: "villager_killed"

マイルストーンのスコープ

スコープは, 設定されたマイルストーンがどのような範囲で有効かを管理するものです。 すべてのマイルストーンは, シナリオシステムの汚染を避けるため, スコープを持っています。 そのスコープから外れると, その中で設定されたマイルストーンは破棄されます。

通常は自動でスコープが設定されますが, 明示的に指定することもできます。

  • シナリオグローバル(SCENARIO_GLOBAL) スコープ
    プラグインの特定のシナリオファイル内で有効なマイルストーンです。
    シナリオのアンロードやプラグインのアンロード時に破棄されます。

  • トリガ・事前(TRIGGER_BEFORE) スコープ
    トリガの事前シナリオ内で有効なマイルストーンです。
    事前シナリオの終了時に破棄されます。

  • トリガ・事後(TRIGGER_AFTER) スコープ
    トリガの事後シナリオ内で有効なマイルストーンです。
    事後シナリオの終了時に破棄されます。

  • メインシナリオ(MAIN_SCENARIO) スコープ
    メインシナリオ内で有効なマイルストーンです。
    メインシナリオの終了時に破棄されます。

マイルストーンの使い方

マイルストーンへは2つの方法でアクセスできます。

  1. シナリオのアクションから使用する。
    milestone アクションを使用します。
  2. プラグインの Java コードから使用する。
    プラグインの Java コードからマイルストーンを設定するには, MileStoneManager を使用します(ドキュメント未作成)。

アクションによるマイルストーンの設定

マイルストーンを設定するには, milestone アクションを アクション実行(execute) タイプで使用します。

# マイルストーン "villager_killed" を設定
- type: execute
action: milestone
with:
name: "villager_killed"

マイルストーンの活用

マイルストーンは, シナリオの進行状況を管理するという特性上, 様々な活用法が想定されます。以下に, その一例を示します。

マイルストーンによるシナリオの分岐

マイルストーンを使用することで, シナリオの進行状況に応じて追加のアクションを実行したり, 逆に特定のアクションをスキップさせられます。
これを実現するためには, シナリオの条件付き実行機能を使用します。

マイルストーン villager_killed が設定されている場合のみ, 村人をキルするアクションを実行する例を示します。
また, 以下の例ではトリガの事前シナリオ機能を使用しています。

on:
# 手動実行時に発火
- type: manual_dispatch
# 以下, 「事前シナリオ」機能を使用し, 手動実行時のみに実行されるシナリオを設定する。
before:
# マイルストーン "villager_killed" を設定
- type: execute
action: milestone
with:
name: "villager_killed"
# プラグインのロード時に発火
- type: on_load

scenario:
# 手動実行時にのみ村人をキルする。
- type: execute
action: entity_death
with:
target: "@e[type=villager,tag=hoge]"
# マイルストーン "villager_killed" が設定されている場合のみ実行
runif:
type: milestone
with:
name: "villager_killed"
# 村人がキルされていることを確認
- type: require
action: entity_death
with:
target: "@e[type=villager,tag=hoge]"