Minecraft 自动疾跑 Mod 代码分析及解决方案 - 无法启动游戏的修复

本文分析了 Minecraft 自动疾跑 Mod 代码中的常见问题,并提供了解决方案,以帮助您修复无法启动游戏的错误。

问题分析:

  1. 缺少必要的注解: 缺少 @Mod 注解来标识这是一个 Mod 类。
  2. 缺少必要的事件注册: 缺少对事件的注册,导致事件无法触发。
  3. 缺少必要的 Mod 配置: 缺少对 Mod 配置的加载和处理逻辑。

解决方案:

  1. 在类定义上添加 @Mod 注解,并指定正确的 modid。
  2. 在构造函数中注册事件总线,使用 MinecraftForge.EVENT_BUS.register(this)。
  3. 在 ClientModEvents 类中的 onClientSetup 方法中添加必要的逻辑。
  4. 在 registerBindings 和 onClientTick 方法中添加 @SubscribeEvent 注解,用于事件的订阅。
  5. 添加对 Mod 配置的加载和处理逻辑。

修改后的代码如下所示:

package com.sen;

import com.mojang.blaze3d.platform.InputConstants;
import com.mojang.logging.LogUtils;
import cpw.mods.util.Lazy;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.core.registries.Registries;
import net.minecraft.world.food.FoodProperties;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.CreativeModeTabs;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.MapColor;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
import net.minecraftforge.client.settings.IKeyConflictContext;
import net.minecraftforge.client.settings.KeyConflictContext;
import net.minecraftforge.client.settings.KeyModifier;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.BuildCreativeModeTabContentsEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.server.ServerStartingEvent;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import org.lwjgl.glfw.GLFW;
import org.slf4j.Logger;

import javax.swing.text.JTextComponent;
import java.awt.event.KeyEvent;
import java.util.function.Consumer;
import java.util.function.Supplier;

// The value here should match an entry in the META-INF/mods.toml file
@Mod(auto_sprint.MODID)
public class auto_sprint {

    // Define mod id in a common place for everything to reference
    public static final String MODID = "auto_sprint";
    // Directly reference a slf4j logger
    private static final Logger LOGGER = LogUtils.getLogger();
    public static final Lazy<KeyMapping> AUTO_SPRINT_MAPPING = Lazy.of(() -> new KeyMapping(
            "key.auto_sprint.as",
            KeyConflictContext.UNIVERSAL,
            KeyModifier.SHIFT, // Default mapping requires shift to be held down
            InputConstants.Type.KEYSYM, // Default mapping is on the keyboard
            GLFW.GLFW_KEY_I, // Default key is G
            "key.auto_sprint.as"
    ));
    public static boolean auto_sprint = false;

    public auto_sprint() {
        IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
        modEventBus.addListener(this::setup);
        MinecraftForge.EVENT_BUS.register(this);
        ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.COMMON_CONFIG);
    }

    private void setup(final FMLCommonSetupEvent event) {
        // Add common setup logic here
    }

    // You can use EventBusSubscriber to automatically register all static methods in the class annotated with @SubscribeEvent
    @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
    public static class ClientModEvents {

        @SubscribeEvent
        public static void onClientSetup(FMLClientSetupEvent event)
        {
            // Add client setup logic here
        }
    }

    @SubscribeEvent
    public void registerBindings(RegisterKeyMappingsEvent event) {
        event.register(AUTO_SPRINT_MAPPING.get());
    }

    @SubscribeEvent
    public void onClientTick(TickEvent.ClientTickEvent event) {
        if (event.phase == TickEvent.Phase.END) { // Only call code once as the tick event is called twice every tick
            while (AUTO_SPRINT_MAPPING.get().consumeClick()) {
                auto_sprint = !auto_sprint;
                Minecraft.getInstance().gui.getChat().addRecentChat("自动疾跑已" + ((auto_sprint) ? "开启!" : "关闭!"));
            }
        }
        if (auto_sprint && Minecraft.getInstance().player != null) {
            Minecraft.getInstance().player.setSprinting(true);
        }
    }
}

请注意,这只是对代码中明显问题的修复,实际上可能还存在其他问题,需要进一步的调试和测试来确定和解决。


原文地址: http://www.cveoy.top/t/topic/qzHw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录