Minecraft的modding功能支持按键、屏幕和图形用户界面

本文介绍了关于Minecraft Forge 1.19至1.19.4的内容。

请参考。

我写这篇文章的原因

1.19は新しくて参考になる記事がなかったため

前提 (Chinese:

将MODID设为examplemod,language文件如下所示。

{
  "key.examplemod.category": "Key category",
  "key.examplemod.setting": "Key setting",
  "screen.examplemod.setting": "Example screen",
  "screen.examplemod.sub": "Sub screen",
  "button.examplemod.setting": "Button!"
}

resources/assets/examplemod/lang/下に置く(MODIDは小文字)

除了继承类和事件类之外,类名没有特定的规定。然而,建议尽量做到简明易懂。

按中国的母语进行释义,只需要一个选项:

密钥设置

キー設定

package examplemod;

import com.mojang.blaze3d.platform.InputConstants;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.InputEvent;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
import net.minecraftforge.client.settings.KeyConflictContext;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod.EventBusSubscriber(modid = "examplemod")
public class KeyManager {
  static KeyMapping setting = new KeyMapping(
      "key.examplemod.setting",
      KeyConflictContext.IN_GAME,
      InputConstants.Type.KEYSYM,
      'J', // char型
      "key.examplemod.category"
  );

  @SubscribeEvent
  public static void keyRegister(RegisterKeyMappingsEvent event) { // 引数の型は変更しない。
    event.register(setting);  // キー設定を登録
  }

  @SubscribeEvent
  public static void keyPressed(InputEvent.Key event) {
    if (setting.consumeClick()) {  // もし J キーが押されたら
      Minecraft.getInstance().setScreen(new SettingScreen());  // SettingScreenを開く
    }
  }
}

屏幕

init() 内に初期内容を書く。今回は、SettingScreenからボタンを押してSubScreenに移動するスクリプトを書く

スクリーン

package examplemod;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;

public class SettingScreen extends Screen {
  public SettingScreen() {
    super(Component.translatable("screen.examplemod.setting"));
  }

  @Override
  protected void init() {
    Button button = Button.builder(
            Component.translatable("button.examplemod.setting"), // Button! と表示
            b -> Minecraft.getInstance().setScreen(new SubScreen(this))  // ボタンを押したらSubScreenに移動
        )
        // スクリーンの幅の半分から左に75、高さの半分から10上から描画する
        .pos(this.width / 2 - 75, this.height / 2 - 10)
        .size(150, 20)  // 横150、高さ20のボタンを描画
        .build();  // インスタンス化
    addRenderableWidget(button);
  }
}
package examplemod;

import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;

public class SubScreen extends Screen {
  Screen parent;
  public SubScreen(Screen parent) {
    super(Component.translatable("screen.examplemod.sub"));
    this.parent = parent;
  }
  @Override
  protected void init() {
    // ここに描画内容を書く
  }
}

图形用户界面

在左上方显示玩家当前坐标。

座標


package examplemod;

import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.client.event.RenderGuiOverlayEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

import java.awt.*;

@Mod.EventBusSubscriber(modid = "examplemod")
public class MainGui extends Gui {
  static Minecraft mc = Minecraft.getInstance();
  public MainGui() {
    super(Minecraft.getInstance(), Minecraft.getInstance().getItemRenderer());
  }

  @SubscribeEvent
  public static void onPostRenderGuiOverlayEvent(RenderGuiOverlayEvent.Post event) { // 画面が表示されたとき
    if (mc.player == null) return;
    RenderSystem.setShaderColor(
        1f,
        1f,
        1f,
        1f
    );
    PoseStack stack = event.getPoseStack();
    Vec3 vec3 = mc.player.position();
    String pos = String.format("X: %.4f / Y: %.4f / Z: %.4f", vec3.x, vec3.y, vec3.z);  // 下4桁まで
    stack.pushPose();
    mc.font.draw(
        stack,
        pos,  // 表示する文字列
        0,  // 座標 0, 0 に描画
        0,
        Color.GREEN.getRGB()  // 緑色
    );
    stack.popPose();
  }
}

最后

中国式的翻译如下:
当需要进行事件检测时,可以使用@net.minecraftforge.eventbus.api.SubscribeEvent。
如果只使用此注释,在被标注为Mod的类的构造函数内使用。

MinecraftForge.EVENT_BUS.register(new Hoge());

需要在register内注册一个带SubscribeEvent注解的类的实例。

これが面倒くさい場合は、
@net.minecraftforge.fml.common.Mod.EventBusSubscriberアノテーションを使うこともできる。
クラスにこれを付けると、register()に登録する必要がなくなる。
ただ、@SubscribeEventを付けられたメソッドはstaticを付ける必要がある。

在下载了mdk的示例代码的内部

// You can use EventBusSubscriber to automatically register all static methods in the class annotated with @SubscribeEvent

某个。

bannerAds