さかな
Format
魚は 1 匹につき 1 つの JSON ファイルとして定義します。
$schema を先頭に書いておくと、対応エディタで補完と検証が効くようになります。$schema キーは読み込み時に無視されます。
{
"$schema": "https://fishing.plugin.morino.party/schema/fish/v1.json",
"id": "sacabambaspis",
"rarity": "mythic",
"displayName": {
"en_US": "<gradient:#7f0000:#ad1457>Sacabambaspis",
"ja_JP": "<gradient:#7f0000:#ad1457>サカバンバスピス"
},
"lore": {
"en_US": [
"Extinct genus of jawless fish that lived in the Ordovician period",
"<gray>Caught by <angler> in <world>"
],
"ja_JP": [
"オルドビス紀に生息していた無顎類の絶滅属の一つ",
"<gray><world> で <angler> が釣り上げた"
]
},
"item": {
"material": "COD",
"customModelData": [100002.0]
},
"size": {
"min": 22.0,
"max": 28.0
},
"weight": 10.0,
"worth": null,
"conditions": {
"weather": [],
"world": []
},
"enabled": true
}ファイルの配置と読み込み
plugins/MoripaFishing/fish/ 配下の .json ファイルが、サブディレクトリも含めてすべて読み込まれます。
ディレクトリ構成は自由で、ファイルが移動されることはありません。上の例のようにレアリティごとに分けるなど、管理しやすいように配置してください。
読み込みは厳密に行います。次のようなファイルは警告をログに出してスキップし、残りのファイルの読み込みを続けます。
- JSON として不正なファイル、未知のキー(タイプミスや古い形式のキー)を含むファイル
- 必須のキーが無い、または値が不正なファイル(
size.min >= size.max、負のweightなど) rarityが登録されていないレアリティを指しているファイルitem.materialがアイテムとして使えない Material のファイルworthの計算式が不正なファイル- 既に読み込んだ魚と
idが重複しているファイル(パス順で先に読み込んだファイルが残ります)
フィールド
| キー | 既定値 | 説明 |
|---|---|---|
id | 必須 | 魚を一意に識別する ID です。 |
rarity | 必須 | 所属するレアリティの ID です。 |
displayName | 必須 | ロケールごとの表示名です。 |
item | 必須 | 釣り上げたときに渡されるアイテムの見た目です。 |
size | 必須 | サイズの範囲です。min は max より小さくしてください。 |
lore | 空 | ロケールごとの説明文です。 |
weight | 1.0 | 同一レアリティ内での重み付け抽選に使う重みです。0 の魚は抽選されません。 |
worth | null | 価値の計算式です。null のときはレアリティ側の式が使われます。 |
conditions | 制限なし | 出現条件です。 |
enabled | true | false にすると抽選対象から外れます。期間限定の魚を一時的に止める用途を想定しています。 |
出現条件
conditions の各配列は、省略するか空にすると「制限なし」として扱われます。
weatherにはSUNNY/CLOUDY/RAINY/THUNDERSTORM/SNOWY/FOGGYを指定できます。ここに含まれる天候のときだけ抽選対象になります。worldには対象とする釣りワールドの ID を並べます。
抽選では、まず条件を満たす魚がいるレアリティだけを候補にしてレアリティを抽選し、その中で条件を満たした魚の weight に従って魚を抽選します。
表示名と説明文
displayName と lore のキーはロケールコードです(例: ja_JP、en_US)。
値には MiniMessage の記法をそのまま書けます。上の例の <gradient:#7f0000:#ad1457> のように、グラデーションや色指定を使って表示を装飾できます。
displayName は翻訳キー moripa_fishing.fish.<id>.name として登録されます。翻訳ファイルに同じキーがある場合は翻訳ファイルが優先されます。
lore は、アイテムの説明文で既定の 3 行(レアリティ・サイズ・釣った人)の後に続けて表示されます。
説明文はプレイヤーのロケール(例: en_US)、その言語のみのロケール(例: en)、config.json の defaultLocale、その言語のみのロケールの順に探します。表示名の翻訳と同じ順序です。
説明文では次のプレースホルダーを使えます。
| プレースホルダー | 内容 |
|---|---|
<rarity> | レアリティの表示名 |
<size> | サイズ(小数点以下 2 桁) |
<angler> | 釣った人の名前 |
<world> | 釣りワールドの表示名 |
<timestamp> | 釣り上げた日時(ISO-8601) |
アイテムの指定
item では次の値を指定できます。
material: Bukkit の Material 名です(例:COD)。customModelData: リソースパックのモデルを切り替えるための float 値の一覧です。skullTexture:materialがPLAYER_HEADのときに使う Base64 のテクスチャ文字列です。
{
"item": {
"material": "PLAYER_HEAD",
"skullTexture": "ewogICJ0aW1lc3RhbXAiIDogMTU4ODI2MTM1Njk5MSwK..."
}
}釣り上げたアイテムには、釣果 (CaughtFish) の JSON が PDC キー moripafishing:caught_fish に保存されます。
サイズと価値
size は単純な一様乱数の範囲ではなく、正規分布として扱われます。
min と max の中央を平均、(max - min) / 6 を標準偏差として抽選し、範囲外の値は min / max に丸められます。
釣れたサイズの累積分布関数の値が、価値の計算式の変数 length_rate に代入されて価値が決まります。
length_rate は 0 から 1 の値で、その魚のなかで大物であるほど 1 に近づきます。
使われる式は魚の worth で、これが null の場合はレアリティ側の worth にフォールバックします。
詳しくは 魚の価値 を参照してください。
実際にどの程度の価値になるかは、次のツールで試せます。
(length_rate ^ 2) * 5 + 5| サイズ | スコア | CDF 累積分布関数 |
|---|---|---|
| 20.00 cm | 5.00 | 0.13 % |
| 24.00 cm | 5.00 | 0.82 % |
| 28.00 cm | 5.01 | 3.59 % |
| 32.00 cm | 5.07 | 11.51 % |
| 36.00 cm | 5.38 | 27.43 % |
| 40.00 cm | 6.25 | 50.00 % |
| 44.00 cm | 7.63 | 72.57 % |
| 48.00 cm | 8.92 | 88.49 % |
| 52.00 cm | 9.65 | 96.41 % |
| 56.00 cm | 9.92 | 99.18 % |
| 60.00 cm | 9.99 | 99.87 % |