FishManager
FishManagerは、魚データの登録・取得を行うマネージャーです。
アドオンからはMoripaFishingAPI#getFishManager()でインスタンスを取得できます。APIの取得方法はAPI利用ガイドを参照してください。
主なメソッド
| メソッド | 戻り値 | 説明 |
|---|---|---|
getAll() | List<FishData> | 登録されている全ての魚を取得する |
get(id) | FishData? | IDから魚を取得する。未登録の場合はnull |
getByRarity(rarity) | List<FishData> | レアリティで魚を絞り込む |
register(fish) | Unit | 魚を登録する。同じIDの魚は置き換える |
unregister(id) | Boolean | 魚の登録を解除する。登録されていなかった場合はfalse |
取得・登録で扱う型はFishDataです。抽選済みのサイズや価値を含むFishは別の型なので、混同しないよう注意してください。FishDataのスキーマは魚データの形式を参照してください。
register(fish)は登録前に検証を行い、レアリティが未登録・item.materialがアイテムとして使えない・worthの計算式が不正のいずれかの場合はIllegalArgumentExceptionを投げます。
読み込みのライフサイクル
FishManagerは起動時と/mf reloadのたびに、fish/配下のJSONを読み直します。読み直しでは保持している魚データがファイルの内容で丸ごと置き換わります。
register(fish)はメモリ上に追加するだけで、JSONファイルへは保存されません。
そのため、アドオンからプログラム的に登録した魚は/mf reloadやサーバー再起動で失われます。恒久的に追加したい場合はJSONファイルとして配置するか、MoripaFishingReloadedEventを購読して登録し直してください。
FishDrawer
魚の抽選はFishDrawerが担当します。MoripaFishingAPI#getFishDrawer()で取得でき、アドオンから任意のタイミングで抽選を実行できます。
| メソッド | 戻り値 | 説明 |
|---|---|---|
draw(world) | Fish? | 指定した釣りワールドの条件でレアリティ・魚種・サイズ・価値を抽選する。候補が無ければnull |
roll(data) | Fish | 魚種を指定してサイズと価値だけを抽選する。レアリティが未登録ならIllegalArgumentException |
draw(world)は次の手順で魚を決定します。
- 候補の絞り込み —
enabledがtrueでweightが0より大きく、conditions.worldとconditions.weatherを満たす魚だけを候補にする - レアリティ抽選 — 候補の魚がいるレアリティだけを対象に、各レアリティの
weightに基づいて重み付き抽選する - 魚種抽選 — 選ばれたレアリティの候補から
FishData.weightに基づいて重み付き抽選する - サイズと価値の決定 — 平均を
(min + max) / 2、標準偏差を(max - min) / 6とする正規分布からサイズを生成してmin〜maxに丸め、価値の計算式で価値を求める
conditions.worldとconditions.weatherはどちらも空であれば「条件なし」として扱われます。天候が分からない釣りワールド(未定義のワールドなど)では、天候条件付きの魚は候補から外れます。
val fish = api.getFishDrawer().draw(FishingWorldId("default")) ?: return
logger.info("${fish.data.id.value}: ${fish.size}cm, ${fish.worth}")