たくさんの自由帳

自作 MOD の Minecraft 26.1 移行

投稿日 : | 0 日前

文字数(だいたい) : 3428

どうもこんにちわ、これは超会議

超会議

ほんだい

Minecraft 26.1が来てたのに忙しくて全然できなかった、ようやく自作MODを対応させました。
なんか子供ゾンビの頭デカくね?

子供ゾンビ

26.1.126.1.2はバグフィックスです。

前回

差分

たぶん名前がちょっと変わったくらいしかないと思います。

ドキュメント

FabricNeoForgeからドキュメントが公開されています。片っぽのMODローダー向けにしか作ってないとしても、両方読むと足りない箇所が補完されるので良いかも。

今回は MOD テンプレートでサンプルを作ってコピペすることにする

26.1は難読化されない初のバージョンらしい。
ので、build.gradle周りも変更されてると思いすべてテンプレートをコピペして部分的に治すことにした。

Gradle

もしテンプレートからコピペしない場合は手動で追従するかと思うので。
全部微妙に違うせいでホームディレクトリにある~/gradle/wrapper/distsがデカくなりがち

  • Fabric
    • 9.4.1
  • NeoForge
    • 9.2.1
  • Forge
    • 9.3.1

Java 25 が必要

わたしはEclipse Temurinを使ってますが好きなJava 25をインストールしてください。のと、GitHub Actionsとかを使っている場合はJava 25を使うように直す!忘れないで!

エンチャント周り

ConditionalEffect#codecは第二引数にContextKeySetを取らなくなった。よくわからないが、ただ消すだけで期待通り動いているように見える。しらんけど

クリエタブ周り

名前変わってます!!!

net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroupnet.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTab

GUI 周り

BlockEntity

クラス名が変わってますExtendedScreenHandlerFactoryExtendedMenuProvider

class ResetTableEntity(
    pos: BlockPos,
    state: BlockState
) : BlockEntity(ResetTableEntities.RESET_TABLE_BLOCK_ENTITY, pos, state), MenuProvider, ExtendedScreenHandlerFactory<ResetTableScreenHandlerServerClientData>, ImplementedInventory, WorldlyContainer {

class ResetTableEntity(
    pos: BlockPos,
    state: BlockState
) : BlockEntity(ResetTableEntities.RESET_TABLE_BLOCK_ENTITY, pos, state), MenuProvider, ExtendedMenuProvider<ResetTableScreenHandlerServerClientData>, ImplementedInventory, WorldlyContainer

AbstractContainerMenu

clicked関数のシグネチャが変わってます。引数が増えた

override fun clicked(i: Int, j: Int, clickType: ClickType, player: Player)

override fun clicked(slotIndex: Int, buttonNum: Int, containerInput: ContainerInput, player: Player)

ScreenHandlers

ExtendedScreenHandlerTypeExtendedMenuTypeになりました。

/**
 * リセットテーブルブロックのエンティティのスクリーンハンドラー
 */
val RESET_TABLE_SCREEN_HANDLER = ExtendedScreenHandlerType(
    { syncId, inventory, serverClientData -> ResetTableScreenHandler(syncId, inventory, serverClientData) },
    PACKET_CODEC
)
/**
 * リセットテーブルブロックのエンティティのスクリーンハンドラー
 */
val RESET_TABLE_SCREEN_HANDLER = ExtendedMenuType(
    { syncId, inventory, serverClientData -> ResetTableScreenHandler(syncId, inventory, serverClientData) },
    PACKET_CODEC
)

AbstractContainerScreen

AbstractContainerScreenの中のrenderBgrenderLabels関数とかがことごとく消えています。
renderBgextractBackgroundrenderLabelsextractLabelsに名前が変わっています。また、GuiGraphics#drawString相当はGuiGraphicsExtractor#textになります。

override fun renderBg(guiGraphics: GuiGraphics, f: Float, i: Int, j: Int) {
    val x = (width - imageWidth) / 2
    val y = (height - imageHeight) / 2
    guiGraphics.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, x, y, 0f, 0f, imageWidth, imageHeight, 256, 256)
}

/** テキスト描画はここで */
override fun renderLabels(guiGraphics: GuiGraphics, i: Int, j: Int) {
    super.renderLabels(guiGraphics, i, j)
    // アイテムが戻せない場合はなんで戻せないのか理由を
    val verify = resetTableScreenHandler.recipeVerifyResult
    // エラー時は利用できない理由を
    val textColorPair = ResetTableTool.resolveUserDescription(verify) ?: return
    // テキスト描画
    guiGraphics.drawString(
        font,
        textColorPair.first,
        ((RESET_SLOT_POS_X + (SLOT_WIDTH / 2f)) - (font.width(textColorPair.first) / 2)).toInt(), // 真ん中にするため
        60,
        textColorPair.second,
        false
    )
}

だった場合は、↓になる

override fun extractBackground(graphics: GuiGraphicsExtractor, mouseX: Int, mouseY: Int, a: Float) {
    super.extractBackground(graphics, mouseX, mouseY, a)
    val x = (width - imageWidth) / 2
    val y = (height - imageHeight) / 2
    graphics.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, x, y, 0f, 0f, imageWidth, imageHeight, 256, 256)
}

/** テキスト描画はここで */
override fun extractLabels(graphics: GuiGraphicsExtractor, xm: Int, ym: Int) {
    super.extractLabels(graphics, xm, ym)
    // アイテムが戻せない場合はなんで戻せないのか理由を
    val verify = resetTableScreenHandler.recipeVerifyResult
    // エラー時は利用できない理由を
    val textColorPair = ResetTableTool.resolveUserDescription(verify) ?: return
    // テキスト描画
    graphics.text(
        font,
        textColorPair.first,
        ((RESET_SLOT_POS_X + (SLOT_WIDTH / 2f)) - (font.width(textColorPair.first) / 2)).toInt(), // 真ん中にするため
        60,
        textColorPair.second,
        false
    )
}

あとrender関数もオーバーライドしていたが、名前変わってる上にこれは消してもぱっと見動いてそうだったため、もう消すことにした。

サーバー、クライアント間周り

PayloadTypeRegistry.playS2C()の名前も変わってます。PayloadTypeRegistry.clientboundPlay()

// ネットワークの追加(クライアント・サーバー間でやり取りする)
PayloadTypeRegistry.playS2C().register(ResetTableErrorPayload.ID, ResetTableErrorPayload.CODEC)

// ネットワークの追加(クライアント・サーバー間でやり取りする)
PayloadTypeRegistry.clientboundPlay().register(ResetTableErrorPayload.ID, ResetTableErrorPayload.CODEC)

レシピ周り

レシピを探すようなコードを書いた場合、Recipe#assembleの引数が一つになりました。ServerLevel(かつてWorldと呼ばれてたクラス)を渡さなくてよくなったらしい

private fun CraftingRecipe.craftOrNull(): ItemStack? = runCatching {
    assemble(CraftingInput.EMPTY)
}.getOrNull()

Fabric 向け

使っていたクラスの名前が見つからない

私が遭遇した名前変更は↑に書きましたが、それ以外であった場合、ここから前の名前と今の名前の対応表があります。ここから探すことが可能

NeoForge 向け

こっちもMODテンプレートを入れなおしました。gradle.propertiesの値が消えて、直接neoforge.mods.tomlに書き込むようになった模様?

この二つが消えて

# The authors of the mod. This is a simple text string that is used for display purposes in the mod list.
mod_authors=takusan_23
# The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list.
mod_description=CheatMOD

.tomlの方に直書きするようになった?かも

# The authors of the mod, displayed in the mod UI (optional)
authors="takusan_23"

# The description text for the mod (multi line!) (#mandatory)
description='''
CheatMOD
'''

Forge

こっちも同様にテンプレートからコピペしました。こっちはpropertiesからmods.tomlにべた書きするようになったみたいです。
build.gradlemods.tomlで値が分散してしまう...

genIntellijRuns が見つからない!!!

Gradleタブにある、runClientを直で起動できるようになっていたが、これであっているのかが分からない!
Forgeは何も教えてくれないからな~

running_runclient

Level#random が private

getRandom()publicにあるのでそれで。てかなんで今まで動いてた?

おわりに

今回は、Fabricの方がなんだか調子悪く、Minecraft Clientが頻繁にバツマークになってしまった。.ideaとかbuildとかを消して開きなおすと直ったからよし!

おわりに2

Minecraft入れなおしたんだけど、Minecraft Launcherのダウンロード分かんなくて数分探しまわったり、Microsoft Storeに先にMS アカウントでサインインしておけとか、Xboxのダイアログが二回くらい出てきたり、なんかのタイミングでローカルアカウントからMS アカウントに昇格していた。

GitHubがこうならなくてよかった!