Sword Displays の剣立て・壁掛け・ケースに 「剣・斧」以外も置けるようにする 1クラスの MOD。
- 対象: Minecraft 1.20.1 / Forge 47 系。side=BOTH(判定自体はサーバ側で走るが、構成を揃えるため両方に置く)
- 前提:
sworddisplay(Sword Displays 2.1.0 以降)。無ければ読み込まれない - ビルド: Git Bash から
export JAVA_HOME=/path/to/jdk-17 && ./gradlew build --no-daemon(JDK 17) →build/libs/sworddisplay_anything-1.0.0.jar(4KB・ビルド確認済み / 実機は未確認)
Sword Displays が受け付けるのはタグ照合3つだけ:
| 見ているタグ | 実体 |
|---|---|
| MOD 独自 | sworddisplay:swords |
ItemTags.SWORDS |
minecraft:swords |
ItemTags.AXES |
minecraft:axes |
個別に増やすだけなら datapack でタグに足せば済む。 ただしタグにワイルドカードが無いので「何でも置ける」は datapack では書けない。 部の要望は「クリーバーも本も飾りたい=何を飾るかはプレイヤーの気持ち」なので、判定ごと外した。
この MOD を入れるなら datapack
sword_display_extraは不要(入れっぱなしでも二重に効くだけで害はない)。 逆に「MOD は増やしたくない」なら datapack だけ入れて、飾れる範囲を列挙で決める。
SwordDisplayBlock#use(SRG m_6227_)の中の ItemStack.is(TagKey) 3か所を @Redirect で置き換え、
空でないアイテムなら常に true を返す。
- 3か所しかないことは bytecode で確認済み。いずれも「置けるか」の判定にしか使われていない
- 壁掛けとケースも一緒に効く:
SwordWallDisplayBlockとSwordCaseBlockはSwordDisplayBlockを継承しuseを上書きしていない → 1本で全78ブロック - 取り出し(スニーク+空手)には触れない。その分岐は判定より前にあるため
- 表示物は
SwordDisplayTileの NBT キーdisplayed_itemに ただのItemStackとして入る - 描画は
ItemStackをそのまま描くだけ SwordItemへのキャストがどこにも無い(ブロック3種・タイル・描画クラスを逆アセンブルして確認)
→ 任意アイテムでも型では落ちない。 ⚠ ただし 見え方は保証されない(台座の回転・拡大は薄い剣モデル向け)。 ブロック系はめり込む・浮く可能性がある。これは実機で撮って判断する。
method = "use" と書くと、Mixin の注釈プロセッサが
Unable to determine descriptor for @Redirect target method と警告し、
refmap に写像が入らない(配布 jar の SwordDisplayBlock は既に m_6227_ で持っているため)。
そのまま出すと実行時に当たらない。m_6227_ +完全な descriptor で書くと警告が消える。
ItemStack.is の方は refmap に m_204117_ として入る(jar の sworddisplayanything.refmap.json で確認済み)。
- クリーバー・本・ブロックが実際に置けること(現状は「ビルドが通った」までしか言えない)
- 置いたときの見え方(スクショ)
- 起動時に mixin エラーが出ないこと(Docker ブートテスト+クライアント)