マインクラフト 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が使えるようにする
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はバージョンによって実装方法が変わる場合があるので対象バージョン毎にコードの書き方を調べたり実験したりする必要がある。"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\\"
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