村人との取引をめっちゃええ感じにするEasierVillagerTradingとそのForge版

シェアする:
村人との取引をめっちゃええ感じにするEasierVillagerTradingとそのForge版

注意!!

この記事の内容はMinecraft Ver.1.20.1、EasierVillagerTrading oreForged Ver.1.20-0.1.1上で確認した内容になっています。

バージョンが異なると仕様が変更されている場合があります。

今回は村人の交易を破壊的に楽にするmod、EasierVillagerTradingを紹介します。

コイツ単品でと言うよりはInfinite Tradingとのコンボが相性良すぎて、実質必須みたいになってます。

ところがですね…。

Infinite Tradingの方はForge、Fabric、NeoForgeと様々なmodローダに対応していて、バージョンも1.12~1.21と、ほぼ全対応と言ってもいいレベルなんですが、EasierVillagerTradingの作者さんはFabric派なんですよ。

そこでForgeへ移植されたEasierVillagerTrading reForgedっていうのがあって、僕はこれでEasierVillagerTradingを知ったわけです。 ところが対応バージョンは1.18と1.19のみで、最近は1.20系でサーバ立てることが多いので非常に残念に思っていました。

そんなところへ。

reForged版を1.20や1.21へ対応させたEasierVillagerTrading oreForgedというのを見つけたので、これでForgeの方もう1.20系で使えるようなりました。

自分の環境に合うバージョンを入れてください。

EasierVillagerTradingって知ってる?

いや、これ、すげー便利なmodでねー。

機能は超シンプルに「村人との取引の簡略化」でして。

村人との取引の画面↓で、

左の一覧からクリックすると、本来なら右のスロットにエメラルドやアイテムがセットされて「交換する?しない?」みたいな準備状態↓になるじゃないですか。

EasierVillagerTradingが入っているとワンクリックで交換になります。 右側の交換先アイテムのスロットをクリックする必要がないんです。

これだといくらか便利さと引き換えに、本来の挙動と変わってしまうので、

むしろマイナスが大きいじゃないですか。

でも例えばインベントリに大量にスイカ↓があって、それを全部エメラルドにしたい場合。

通常なら一覧をクリックしてスイカをセット、右の取引品スロットからアイテムを取り出す…という行程を何度も繰り返さないといけません。

ところがEasierVillagerTradingの場合、ワンクリックで交換↓できます。

シフトを押しながらクリックするとまとめて大量↓に交換できます。

この「51個」というのは、通常の処理で1個、mod側で50回の交換上限が設けられているので、1+50で51個です。

あとは、クリックする場所が同じ=マウスを動かさなくていいので、一覧のスイカのところをシフト押しながらクリックしていくだけで、あっという間にインベントリをエメラルドまみれ↓にできます。

いやいや!交換上限あるから無理やろ!

というのを解消するのがInfinite Tradingです。 取引上限を撤廃するmodなので、上のような無限コンボが可能になります。

また、Infinite Tradingが入っていると補充という概念がなくなるので、近くに職業ブロックを置いておく必要がなくなるのも地味なメリットです。

両方入れておくと交易の不便さがめっちゃ解消されるので、地味な効果ですが超オススメのmodになります。

プレイだけの人はここまで。

oreForged版について

oreForged版のページを見ると…

ハイハイ、YamadaMeganeとありますね。

そう!移植したのはオレだ!

というわけでここからはmod開発の話です。

よく使うmodなのに自分が今から遊ぶバージョンに対応していないmodってけっこうあると思うんです。 今パッと出てくるのだとprefabとか。

そういうのを自分で移植できるようになりたいなと最初に選んだのがEasierVillagerTradingです。 何故選んだかというと機能がシンプル(おそらく規模が小さい)で、直前の1.19まではあったのに1.20に対応していなかったから。

ここからは移植に際して学んだことを書いていきます。

Fabric版からの移植

まず真っ先に考えたのはreForged版の移植だったのですが、Sourcesタブがなくてソース非公開っぽかったです。

しょうがないのでソースが公開されているFabric版のソースをベースにやってみたのですが、

素人がFabricからForgeへの移植は絶対にやめとけ。

というのもですね、ForgeとFabricでクラスの構造がけっこう違うんです。

最初はimport欄にFabric関係のものがなければそのまま使えるんじゃないかと思ったんですが、同名クラスでも名前空間が違ったり、変数や関数の名前が違ってたり、ほぼそのまま使えないと思った方がいいです。

Fabricを設計した人はなぜこんな仕様にしたんだろ。

ただ、文献はFabricにはWikiがあって、圧倒的に分かりやすい印象でした。

これ以外にも英語で充実した文献があって、今回一番苦戦したMerchantScreenクラスのドキュメントだと、Forge版Fabric版が見つかりました。

これね、Fabric版はその関数がどういう関数かとかの説明があるんですが、Forge版はないんですよ。 引数と戻り値の型だけ。

それで自前実装は無理ちゃうかな…。

ChatGPTくんによると、それらは有志が作ったもんだから、基本はForgeとかのソースを自分で読め!と言われました。

冗談やろ…。

これまで当たり前のようにプレイしてきたmod達が、恐ろしいほどの労力の上に成り立っていたことを知りました。

偉大なる先人達に感謝。

この辺が後発のFabricが、Forgeと対抗できるくらいまで人気になった理由なのかなと思いました。 Forgeでの開発は、動いてる別modのソースを参考にして挙動を推測して、自分で試していくのが一番いいのかなと今は思ってます。

まぁそれでもどうにかやろうと3日くらいトライしたんですが、そりゃもう全く無理でした。

現在は最終的にどういう構造になるか分かっていますが、おそらくFabric版からの移植でトライし続けていたら1カ月かかっても出来ていたかどうか。

Forge版のソースを見つけた

reForged版はソースタブはなかったんですが、ふとした時にIssuesタブをクリックしたんですね。 そしたらGithubに飛んだので、Codeタブを見てみたら1.18ですがForge版のソースが公開されていました。

ありがてぇ…。

さっそくどんどん移植していくと、Fabric版に比べて100倍くらいの速度で進んでいきました。 各処理で何をしていて、何が出来ていないから失敗していくのかとか、デバッグメッセージで確認しながら移植を続けていたんですが、

あれ、これ、元のそのままでも1.20で動くんじゃ…?

と作り直してみると、たった4箇所の修正で1.20でも動いたんです。

すげぇぇぇ!!

というわけで、自分が遊ぶ予定だった1.20.1版は実プレイでの動作確認も含めて完成しました。 無駄は多かったですが、学ぶことも多かったのでヨシ。

1.20.1以外への移植

せっかくなのでreForged版以降の1.20系、1.21系のサブバージョンへも移植してみました。

そこで得られた情報はこんな感じ。

  • コードの変更がなければサブバージョン違いは流用できる(1.20~1.20.4とか)
  • コードの変更がなくてもメジャーバージョンが違うと使えない(1.20.6と1.21とか)
  • サブバージョンの変更でも大きな仕様変更がある場合がある

特に仕様変更の部分がかなり苦戦させられて、1.20.6からバイナリが難読化されなくなったぽいです。 CurseforgeのダウンロードページのCurse Maven Snippetを見ても、1.20.6までは「implementation fg.deobf~」とあるんですが、1.20.6からは難読化されていないバージョン用の「fg.deob」が消えています。

従来は開発環境では難読化されてない版、実プレイでは難読化だったのが、実プレイでも難読化されなくなったようです。

まさかこんなことになっているとは思わないので、1.20.6以降はテスト環境では動いていたのに本チャンで動いてなかったという致命的ミスをしたまま初期リリース版を公開してしまいました。 今は修正版を上げています。

すいませんでした。

他にも1.20.6からNBTタグがコンポーネントなるものに代わったようで、それに伴ってItemStackクラスのisSameItemSameTagsという関数が、isSameItemSameComponentsという名前に代わっていました。 これ、1.18のころはtagMatchesという関数だったので、こんな狭い範囲の調査で2回も名前が変わっています。 ちなみにFabricだとcanCombine。

もしかすると1.20.5から変更されていたかもしれないですが、Forgeは1.20.5がないようなので不明です。

とりあえずですね。

別バージョンへの対応は難しいバージョンもあるものの、思ってたよりけっこう簡単なんだなという印象です。 もっと難しいと思ってました。 まぁ今回は規模が小さいmodでの対応だったからこんな甘っちょろい感想が出てくるんだとは思いますが。

今後もできる限りは最新版への対応を続けていこうと思うので、

皆さまよろしくお願いいたします。

oreForged版のオリジナル要素

基本的にはやらないでおこうと思っています。

他人様の作ったmodの移植ですからね。 機能追加は越権行為だ。 公式が機能追加した際には同じ機能を付けられるよう努力はしたいなと思ってます。

ただ、1個気になってるとこがあって。

1回での交換上限が51回という中途半端な数値になってて、これはデフォの1回に加えてEasierVillagerTrading側がwhileの無限ループ回避のためか、追加の交換上限を50回という設定にしているためです。 ハードコードで50って書いてるから本当にただの無限ループ回避のためで、Infinite Tradingとの併用とかは全く想定してなさそう。

oreForged版は暫定で1スタック=64回にしています。

ワンクリックでインベントリ全体をチェックすることもできるんですが、マルチに導入したら1秒くらい処理がかかっていたのでちょっと検討中。

まだ自前でコンフィグを追加したりしたことないので、それの練習がてらデフォを64として、コンフィグで設定できるようにしようかなと考えてます。

あ、もう1個あったわ。

現状インベントリがパンパンの状態だと、通常の交易だと素材スロットにアイテムを入れて=インベントリが1枠あいて、交易が可能です。

ところがEasierVillagerTradingは素材スロットを使わないので、インベントリがいっぱいだと交易できないんですよね。 ここを改善したいなーとは思うんですが、イメージした感じ、ちょっとめんどくさそう。

公式にない機能だしやらなくていいよね(←言い訳)

[DEV-TOC]

PR お手軽にマルチサーバでプレイしませんか?

処理性能No.1!快適なゲーム環境なら「Xserver for Game」

月額1000円くらいでオンラインにサーバを置いてMinecraftをマルチプレイできます。 統合版、Java版、Forgeに対応。

いやー僕はオンラインサーバって試したことなくて。

プレイ期間は24時間PC起動してたんですけど、電気代考えると1000円ならオンラインに置いた方が快適なのでは…?

過去のサーバデータを見たら1.12未満では500MB未満、1.12~1.18で1.5~2.0GB、1.19で3.0~3.5GBくらいだったので最安プランで問題なさそう。 スペック的にもマイクラは大丈夫みたいです。

僕も興味を持ったのでどういうサーバにするか考えた上でレビューしたいと思います。 マイクラ以外にもARK、テラリア、7 Days to Dieとかもいけるみたい。

シェアする: