UID1995775性别保密经验 EP铁粒 粒回帖0主题精华在线时间 小时注册时间2025-1-14最后登录1970-1-1
| 92铁粒 我要做一个模组。该模组实现了类似于原神的拾取方式,代码总是有问题,请帮忙看下:
ClientEvents.java
- package com.example.InteractReborn;
- import net.minecraft.client.Minecraft;
- import net.minecraft.resources.ResourceLocation;
- import net.minecraft.world.InteractionHand;
- import net.minecraft.world.entity.item.ItemEntity;
- import net.minecraftforge.client.event.InputEvent;
- import net.minecraftforge.event.TickEvent;
- import net.minecraftforge.eventbus.api.SubscribeEvent;
- import net.minecraftforge.fml.common.Mod;
- import org.lwjgl.glfw.GLFW;
- import java.util.ArrayList;
- import java.util.List;
- @Mod.EventBusSubscriber(modid = Main.MODID, value = Mod.EventBusSubscriber.Bus.FORGE)
- public class ClientEvents {
- public static List<ItemEntity> nearbyItems = new ArrayList<>();
- public static int selectedIndex = 0;
- public static final ResourceLocation SELECTED_BG = new ResourceLocation(Main.MODID, "textures/gui/true.png");
- public static final ResourceLocation UNSELECTED_BG = new ResourceLocation(Main.MODID, "textures/gui/false.png");
- @SubscribeEvent
- public static void onClientTick(TickEvent.ClientTickEvent event) {
- if (event.phase == TickEvent.Phase.END) {
- Minecraft mc = Minecraft.getInstance();
- if (mc.level != null && mc.player != null && Config.modEnabled) {
- nearbyItems = mc.level.getEntitiesOfClass(ItemEntity.class,
- mc.player.getBoundingBox().inflate((float) Config.pickupRange));
- } else if (!nearbyItems.isEmpty()) {
- nearbyItems.clear();
- selectedIndex = 0;
- }
- }
- }
- @SubscribeEvent
- public static void onMouseScroll(InputEvent.MouseScrollingEvent event) {
- if (Config.modEnabled && !nearbyItems.isEmpty()) {
- double delta = event.getDeltaY();
- int direction = delta > 0 ? -1 : 1;
- selectedIndex = (selectedIndex + direction + nearbyItems.size()) % nearbyItems.size();
- event.setCanceled(true);
- }
- }
- @SubscribeEvent
- public static void onKeyPress(InputEvent.Key event) {
- if (event.getKey() == GLFW.GLFW_KEY_F && event.getAction() == GLFW.GLFW_PRESS) {
- Minecraft mc = Minecraft.getInstance();
- if (Config.modEnabled && mc.gameMode != null && !nearbyItems.isEmpty()) {
- ItemEntity selected = nearbyItems.get(selectedIndex);
- if (selected.isAlive()) {
- mc.gameMode.interact(mc.player, selected, InteractionHand.MAIN_HAND);
- }
- }
- }
- }
- }
复制代码 Main.java
- package com.example.InteractReborn;
- import com.mojang.logging.LogUtils;
- import net.minecraft.client.Minecraft;
- import net.minecraft.client.gui.GuiGraphics;
- import net.minecraft.core.registries.Registries;
- import net.minecraft.resources.ResourceLocation;
- import net.minecraft.world.entity.item.ItemEntity;
- import net.minecraft.world.inventory.InventoryMenu;
- import net.minecraft.world.item.*;
- import net.minecraft.world.level.block.Block;
- import net.minecraftforge.api.distmarker.Dist;
- import net.minecraftforge.client.event.TextureStitchEvent;
- import net.minecraftforge.common.MinecraftForge;
- 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.FMLCommonSetupEvent;
- import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
- import net.minecraftforge.registries.DeferredRegister;
- import net.minecraftforge.registries.ForgeRegistries;
- import net.minecraftforge.registries.RegistryObject;
- import org.slf4j.Logger;
- @Mod(Main.MODID)
- public class Main {
- public static final String MODID = "interactreborn";
- private static final Logger LOGGER = LogUtils.getLogger();
- // 注册系统
- public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID);
- public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
- public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID);
- // 示例物品
- public static final RegistryObject<Item> EXAMPLE_ITEM = ITEMS.register("example_item",
- () -> new Item(new Item.Properties().food(new FoodProperties.Builder()
- .alwaysEdible().nutrition(1).saturationMod(2f).build())));
- public Main() {
- IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
- modEventBus.addListener(this::commonSetup);
- BLOCKS.register(modEventBus);
- ITEMS.register(modEventBus);
- CREATIVE_MODE_TABS.register(modEventBus);
- MinecraftForge.EVENT_BUS.register(this);
- ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.SPEC);
- }
- private void commonSetup(final FMLCommonSetupEvent event) {
- LOGGER.info("模组初始化完成");
- }
- @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
- public static class ClientModEvents {
- @SubscribeEvent
- public static void onTextureStitch(TextureStitchEvent.Pre event) {
- if (event.getAtlas().location().equals(InventoryMenu.BLOCK_ATLAS)) {
- event.addSprite(ClientEvents.SELECTED_BG);
- event.addSprite(ClientEvents.UNSELECTED_BG);
- }
- }
- @SubscribeEvent
- public static void registerOverlays(RegisterGuiOverlaysEvent event) {
- event.registerAbove(VanillaGuiOverlay.CROSSHAIR.id(), "item_pickup", ITEM_PICKUP_OVERLAY);
- }
- private static final IGuiOverlay ITEM_PICKUP_OVERLAY = (ForgeGui gui, GuiGraphics guiGraphics, float partialTick, int screenWidth, int screenHeight) -> {
- if (!Config.modEnabled) return;
- Minecraft mc = Minecraft.getInstance();
- if (mc.player == null || mc.level == null) return;
- int centerX = screenWidth / 2 + 20;
- int centerY = screenHeight / 2 - 10;
- for (int i = 0; i < ClientEvents.nearbyItems.size(); i++) {
- ItemEntity entity = ClientEvents.nearbyItems.get(i);
- if (!entity.isAlive()) continue;
- ResourceLocation bg = (i == ClientEvents.selectedIndex) ?
- ClientEvents.SELECTED_BG : ClientEvents.UNSELECTED_BG;
- // 绘制背景
- guiGraphics.blit(bg, centerX, centerY + i * 30, 0, 0, 24, 24, 24, 24);
- // 绘制物品
- ItemStack stack = entity.getItem();
- if (!stack.isEmpty()) {
- guiGraphics.renderItem(stack, centerX + 4, centerY + i * 30 + 4);
- guiGraphics.renderItemDecorations(mc.font, stack, centerX + 4, centerY + i * 30 + 4);
- }
- }
- };
- }
- }
复制代码 Config.java
- package com.example.InteractReborn;
- import net.minecraftforge.common.ForgeConfigSpec;
- import net.minecraftforge.eventbus.api.SubscribeEvent;
- import net.minecraftforge.fml.common.Mod;
- import net.minecraftforge.fml.event.config.ModConfigEvent;
- @Mod.EventBusSubscriber(modid = Main.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
- public class Config {
- private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder();
- public static final ForgeConfigSpec.BooleanValue MOD_ENABLED = BUILDER
- .comment("是否启用交互改进模组")
- .define("modEnabled", true);
- public static final ForgeConfigSpec.DoubleValue PICKUP_RANGE = BUILDER
- .comment("物品拾取检测范围(方块)")
- .defineInRange("pickupRange", 3.0, 1.0, 10.0);
- static final ForgeConfigSpec SPEC = BUILDER.build();
- public static boolean modEnabled;
- public static double pickupRange;
- @SubscribeEvent
- static void onLoad(final ModConfigEvent event) {
- modEnabled = MOD_ENABLED.get();
- pickupRange = PICKUP_RANGE.get();
- }
- }
复制代码
|
|