Minecraft 1.21.5 + Fabric 0.16.10で座標・方角・明るさ・バイオーム名・スニーク状態を画面左上に表示するだけのModを作る

マインクラフト Java版のクライアントサイドのみで動作するModの最小構成。

■VSCode (Visual Studio Code)を使う場合 1)JDKをインストール  Eclipse Adoptium (旧AdoptOpenJDK)  https://adoptium.net/temurin/releases/?os=windows&arch=x64&package=jdk   ※21 (LTS: Long Term Support = 長期サポート版)を選ぶ   ※環境変数「JAVA_HOME」は設定しない 2)拡張機能「Extension for Java」をインストール 3)設定(settings.json)に記述を追加してJDKが使えるようにする
    "java.jdt.ls.java.home": "C:\\Users\\[User Name]\\AppData\\Local\\Programs\\Eclipse Adoptium\\jdk-21.0.6.7-hotspot\\",
    "java.configuration.runtimes": [
        {
            "name": "JavaSE-21",
            "path": "C:\\Users\\[User Name]\\AppData\\Local\\Programs\\Eclipse Adoptium\\jdk-21.0.6.7-hotspot\\",
            "default": true
          },
    ],
    "java.import.gradle.java.home": "C:\\Users\\[User Name]\\AppData\\Local\\Programs\\Eclipse Adoptium\\jdk-21.0.6.7-hotspot\\"
4)Fabricのテンプレートをダウンロード  https://fabricmc.net/develop/ の「Online Template Mod Generator」を使い自分専用のプロジェクトファイルを作成する。 5)ダウンロードしたzipファイルを展開しプロジェクトのディレクトリをVSCodeで開く 6)テンプレートの書き換え  下記2つのファイル内のMinecraftとFabricのバージョンを実行対象のものに書き換える。  .\gradle.properties  .\src\main\resources\fabric.mod.json 7)コードを書き加えた後「Gradle」からbuildする  .\libs にjarファイルが生成される。 ■Javaのコード  Mod Name: simpleinfo  Package Name: fuzzypain.minecraft.simpleinfo の場合  ※MinecraftとFabricはバージョンによって実装方法が変わる場合があるので対象バージョン毎にコードの書き方を調べたり実験したりする必要がある。
package fuzzypain.minecraft.simpleinfo;

import java.util.ArrayList;
import java.util.Optional;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.rendering.v1.HudLayerRegistrationCallback;
import net.fabricmc.fabric.api.client.rendering.v1.IdentifiedLayer;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.RenderTickCounter;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.registry.RegistryKey;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.LightType;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;

public class SimpleInfoClient implements ClientModInitializer {
    public static final String MOD_ID = "simpleinfo";

    private static final Identifier SIMPLE_INFO_LAYER =
        Identifier.of(SimpleInfoClient.MOD_ID, "simple-info-layer");
    
    @Override
    public void onInitializeClient() {
        HudLayerRegistrationCallback.EVENT.register(
            layeredDrawer -> layeredDrawer.attachLayerBefore(
                IdentifiedLayer.DEBUG,
                SIMPLE_INFO_LAYER,
                SimpleInfoClient::render));
    }

    private static void render(
        DrawContext context,
        RenderTickCounter tickCounter
    ) {
        MinecraftClient client = MinecraftClient.getInstance();
        if(client.getDebugHud().shouldShowDebugHud() || client.options.hudHidden)
            return;

        PlayerEntity player = client.player;
        if(player == null) return;

        World world = player.getWorld();
        if(world == null) return;


        ArrayList<String> textlines = new ArrayList<>();
        textlines.add(getCoordinateText(client, player));
        textlines.add(getLightLevelText(world, player));
        textlines.add(getBiomeText(world, player));
        textlines.add(player.isSneaking() ? "<< Sneaking >>" : "");

        drawData(context, client, textlines);
    }

    private static String getCoordinateText(
        MinecraftClient client,
        PlayerEntity player
    ) {
        Vec3d player_pos = player.getPos();
        Direction direcion = player.getHorizontalFacing();

        return String.format(
            "XYZ: %.2f / %.2f / %.2f  %s",
            player_pos.x, player_pos.y, player_pos.z,
            direcion);
    }

    private static String getLightLevelText(
        World world,
        PlayerEntity player
    ) {
        BlockPos block_pos = player.getBlockPos();
        int block_light = world.getLightLevel(LightType.BLOCK, block_pos);

        return String.format(
            "Block Light: %d",
            block_light);
    }

    private static String getBiomeText(
        World world,
        PlayerEntity player
    ) {
        Optional<RegistryKey<Biome>> biome =
            world.getBiome(player.getBlockPos()).getKey();
        Identifier biome_id = biome.get().getValue();
        String biome_name = Text.translatable(String.format(
            "biome.%s.%s",
            biome_id.getNamespace(), biome_id.getPath())).getString();

        return String.format(
            "%s %s : %s",
            biome_id.getNamespace(), biome_id.getPath(), biome_name);
    }

    private static void drawData(
        DrawContext context,
        MinecraftClient client,
        ArrayList<String> textlines
    ) {
        TextRenderer textRenderer = client.textRenderer;
        int textHeight = textRenderer.fontHeight;

        int x = 2;
        int y = 2;
        for(int i=0; i<textlines.size(); i++) {
            context.drawText(
                client.textRenderer,
                textlines.get(i),
                x, y + i * (textHeight + 2),
                0xFFFFFFFF,
                true);
        }
    }
}
■Modファイル
simpleinfo-0.1.1-fabric-0.16.10+mc1.21.5.jar

Minecraft マインクラフト Java版 Mod Loader: Fabric

内容
・Minecraft Java版 1.21.4 軽量化 ゲームパッド対応新しくリリースされたMinecraftに移行する方法MinecraftのバージョンはそのままでFabricを最新版に更新する方法


Minecraft Java版 1.21.4 軽量化 ゲームパッド対応

 ※事前にJava版のインストールがされていて   一度はタイトル画面まで起動していること  ※Minecraft LauncherとMinecraftが起動していない状態で作業を始めること ■Mod LoaderとModのインストール 1️⃣fabricmc.net からMod Loader「Fabric」をDLし実行  Fabric https://fabricmc.net/  Fabric Wiki https://wiki.fabricmc.net/ja:start 2️⃣MinecraftとLoaderのバージョンを確認し「Install」ボタンを1回だけ押下 3️⃣成功したらインストーラーを手動で終了 4️⃣Minecraft Launcherから「Java Edition」→「起動構成」→「新規作成」→「編集」を選択  ・「バージョン」で"fabric-loader-[Fabricのバージョン]-[Minecraftのバージョン]"を選択する。  ・「ゲームディレクトリ」に今回のFabric用のディレクトリを作成しパスを入力後に保存する    Fabric用のディレクトリ(起動構成)をMinecraftのディレクトリと別にするのは他の起動構成の設定やModと混在して不具合が発生する事を避けるため。      例 fabric-0.16.10_mc-1.21.4 5️⃣Minecraft Launcherの「プレイ」ボタンの横から4️⃣で作った起動構成を選択して「プレイ」ボタンを押下 6️⃣タイトル画面になったら一旦ゲームを終了 7️⃣4️⃣で作成したパス内の「mods」ディレクトリにFabric用のModファイルを入れる   ※Modが対応しているMinecraftのバージョンを確認すること  基本  Fabric API https://modrinth.com/mod/fabric-api/  Mod Menu https://modrinth.com/mod/modmenu/  軽量化  Lithium https://modrinth.com/mod/lithium/  EntityCulling https://modrinth.com/mod/entityculling/  ImmediatelyFast https://modrinth.com/mod/immediatelyfast/  Sodium https://modrinth.com/mod/sodium/  コントローラー その1  Framework https://www.curseforge.com/minecraft/mc-mods/framework/  Controllable https://www.curseforge.com/minecraft/mc-mods/controllable/    ※更新が遅い  コントローラー その2  YetAnotherConfigLib (YACL) https://modrinth.com/mod/yacl/  Controlify https://modrinth.com/mod/controlify/    ※自動キャリブレーションがある    ※ラジアルメニューがある    ※アナログスティックのデッドゾーンを設定できる    ※Steam Deckなど対応しているコントローラーが多い    ※他と異なり初回起動時にLib関連を3MB程度下記パスにインストールする     ..\controlify-natives\  コントローラー その3  MidnightControls https://modrinth.com/mod/midnightcontrols/    ※ラジアルメニューがある    ※アナログスティックのデッドゾーンを設定できる    ※Steam Deckなど対応しているコントローラーが多い    ※1.10.6 十字キーでのアイテム枠移動の快適さは上記2つに劣る  ※コントローラーMod全般について   ・単純なキー割り当てとは異なりBedrock版と同様にアイテム枠単位でのカーソル移動ができる   ・どのModも一長一短あり   ・アイテムのドロップ(捨てる)はModとゲームパッドの相性なのか設定を弄っても出来ない場合がある(ホットバーのアイテムは1つ単位、1スタック単位それぞれ可能だがインベントリから直接捨てるのは出来ない等)  メモリ消費削減  FerriteCore https://modrinth.com/mod/ferrite-core/  便利機能  Sodium Extra https://modrinth.com/mod/sodium-extra/    ※Sodiumが必要    ※macOSの解像度を下げる、座標を表示する目的程度で使用する    ※OptiFineのように色んな機能を個別に無効化して動作を軽量化できるが、素のマインクラフトとは異なる体験になるので注意    ※設定画面の見切れているタブはカーソルキーとEnterキーで選択できる  Reese's Sodium Options https://modrinth.com/mod/reeses-sodium-options/    ※Sodium Extraの設定画面で見切れているタブをうまく表示する  FPS Reducer https://modrinth.com/mod/fps-reducer/    ※指定時間後の無操作時や非アクティブウィンドウ時にFPSを低下させ描画負荷を下げる ■Bedrock(統合)版のコントローラー割り当て(デフォルト) ゲームプレイ   ジャンプ     :Aボタン   アイテムを落とす :十字キー(下)   攻撃する     :Rトリガー   アイテムの使用  :Lトリガー   クラフト画面を開く:Xボタン  ※インベントリを開くと同義   インベントリを開く:Yボタン   左にアイテムを回す:Lボタン   右にアイテムを回す:Rボタン   視点の切り替え  :十字キー(上)   忍び足      :Bボタン   ダッシュ     :Lスティックボタン   チャットボタン  :十字キー(右)   ブロック選択   :【未設定】 クラフト画面   レシピを選ぶ         :Xボタン   (1つずつ)クラフトする    :Aボタン   (作れるだけ)全てをクラフトする:Yボタン インベントリ内での操作   スタック単位移動     :Yボタン   アイテム等分割      :Xボタン   (選択中の)アイテムを落とす:Yボタン   (選択中の)アイテム1つ配置:Xボタン長押し   (選択中の)アイテム均等配置:Aボタン長押し   アイテムをまとめる    :Aボタンダブル押し ※おすすめ設定  ・F3キーで表示されるデバック情報をRスティックボタンに割り当てる  ・忍び足(スニーク)をトグル式に変える   忍び足(スニーク)中の後ろ向きブロック設置での落下の不安が無くなる。   ただし「下降」操作時は押しっぱなし判定になるので注意

最新リリースのMinecraftに移行する方法

1️⃣新しいバージョン用のFabricのディレクトリを作る   例 fabric-0.16.10_mc-1.21.5 2️⃣Minecraft Launcherの起動構成で1️⃣を指定した新しい起動構成を作る   ※最新リリースのバージョンが表示されない場合はFabricのインストーラーを起動してそのバージョンを選んでみる 3️⃣一旦起動してタイトル画面まで行ったら終了する 4️⃣1️⃣のパスの「saves」ディレクトリに以前のバージョンの「saves」をコピーする   ※「saves」は起動構成「ゲームディレクトリ」で指定したパスの中にある 5️⃣ゲームを起動しサーバーの「編集」から「ワールドを最適化」を選択する   ・「キャッシュデータを消去する」にチェックしておく 6️⃣一旦ゲームを終了 7️⃣1️⃣のパスに新しいバージョンに対応したModをDLして入れる

MinecraftのバージョンはそのままでFabricを最新版に更新する方法

1️⃣Fabricのインストーラーを起動する 2️⃣MinecraftとLoaderのバージョンを確認し「Install」ボタンを1回だけ押下   ・「Create profile」のチェックを外すこと 3️⃣成功したらインストーラーを手動で終了 4️⃣Minecraft Launcherから対象の起動構成の「編集」を選択  ・「バージョン」で"fabric-loader-[Fabricの最新バージョン]-[Minecraftのバージョン]"を選択する。