开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[游戏相关] 帮忙看一下代码(mod制作)

 发表于 2025-6-8 22:46:21|显示全部楼层|阅读模式 IP:辽宁省
92铁粒
我要做一个模组。该模组实现了类似于原神的拾取方式,代码总是有问题,请帮忙看下:
ClientEvents.java


  1. package com.example.InteractReborn;

  2. import net.minecraft.client.Minecraft;
  3. import net.minecraft.resources.ResourceLocation;
  4. import net.minecraft.world.InteractionHand;
  5. import net.minecraft.world.entity.item.ItemEntity;
  6. import net.minecraftforge.client.event.InputEvent;
  7. import net.minecraftforge.event.TickEvent;
  8. import net.minecraftforge.eventbus.api.SubscribeEvent;
  9. import net.minecraftforge.fml.common.Mod;
  10. import org.lwjgl.glfw.GLFW;

  11. import java.util.ArrayList;
  12. import java.util.List;

  13. @Mod.EventBusSubscriber(modid = Main.MODID, value = Mod.EventBusSubscriber.Bus.FORGE)
  14. public class ClientEvents {
  15.     public static List<ItemEntity> nearbyItems = new ArrayList<>();
  16.     public static int selectedIndex = 0;
  17.     public static final ResourceLocation SELECTED_BG = new ResourceLocation(Main.MODID, "textures/gui/true.png");
  18.     public static final ResourceLocation UNSELECTED_BG = new ResourceLocation(Main.MODID, "textures/gui/false.png");

  19.     @SubscribeEvent
  20.     public static void onClientTick(TickEvent.ClientTickEvent event) {
  21.         if (event.phase == TickEvent.Phase.END) {
  22.             Minecraft mc = Minecraft.getInstance();
  23.             if (mc.level != null && mc.player != null && Config.modEnabled) {
  24.                 nearbyItems = mc.level.getEntitiesOfClass(ItemEntity.class,
  25.                         mc.player.getBoundingBox().inflate((float) Config.pickupRange));
  26.             } else if (!nearbyItems.isEmpty()) {
  27.                 nearbyItems.clear();
  28.                 selectedIndex = 0;
  29.             }
  30.         }
  31.     }

  32.     @SubscribeEvent
  33.     public static void onMouseScroll(InputEvent.MouseScrollingEvent event) {
  34.         if (Config.modEnabled && !nearbyItems.isEmpty()) {
  35.             double delta = event.getDeltaY();
  36.             int direction = delta > 0 ? -1 : 1;
  37.             selectedIndex = (selectedIndex + direction + nearbyItems.size()) % nearbyItems.size();
  38.             event.setCanceled(true);
  39.         }
  40.     }

  41.     @SubscribeEvent
  42.     public static void onKeyPress(InputEvent.Key event) {
  43.         if (event.getKey() == GLFW.GLFW_KEY_F && event.getAction() == GLFW.GLFW_PRESS) {
  44.             Minecraft mc = Minecraft.getInstance();
  45.             if (Config.modEnabled && mc.gameMode != null && !nearbyItems.isEmpty()) {
  46.                 ItemEntity selected = nearbyItems.get(selectedIndex);
  47.                 if (selected.isAlive()) {
  48.                     mc.gameMode.interact(mc.player, selected, InteractionHand.MAIN_HAND);
  49.                 }
  50.             }
  51.         }
  52.     }
  53. }
复制代码
Main.java
  1. package com.example.InteractReborn;

  2. import com.mojang.logging.LogUtils;
  3. import net.minecraft.client.Minecraft;
  4. import net.minecraft.client.gui.GuiGraphics;
  5. import net.minecraft.core.registries.Registries;
  6. import net.minecraft.resources.ResourceLocation;
  7. import net.minecraft.world.entity.item.ItemEntity;
  8. import net.minecraft.world.inventory.InventoryMenu;
  9. import net.minecraft.world.item.*;
  10. import net.minecraft.world.level.block.Block;
  11. import net.minecraftforge.api.distmarker.Dist;
  12. import net.minecraftforge.client.event.TextureStitchEvent;
  13. import net.minecraftforge.common.MinecraftForge;
  14. import net.minecraftforge.eventbus.api.IEventBus;
  15. import net.minecraftforge.eventbus.api.SubscribeEvent;
  16. import net.minecraftforge.fml.ModLoadingContext;
  17. import net.minecraftforge.fml.common.Mod;
  18. import net.minecraftforge.fml.config.ModConfig;
  19. import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
  20. import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
  21. import net.minecraftforge.registries.DeferredRegister;
  22. import net.minecraftforge.registries.ForgeRegistries;
  23. import net.minecraftforge.registries.RegistryObject;
  24. import org.slf4j.Logger;

  25. @Mod(Main.MODID)
  26. public class Main {
  27.     public static final String MODID = "interactreborn";
  28.     private static final Logger LOGGER = LogUtils.getLogger();

  29.     // 注册系统
  30.     public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID);
  31.     public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
  32.     public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID);

  33.     // 示例物品
  34.     public static final RegistryObject<Item> EXAMPLE_ITEM = ITEMS.register("example_item",
  35.             () -> new Item(new Item.Properties().food(new FoodProperties.Builder()
  36.                     .alwaysEdible().nutrition(1).saturationMod(2f).build())));

  37.     public Main() {
  38.         IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
  39.         modEventBus.addListener(this::commonSetup);

  40.         BLOCKS.register(modEventBus);
  41.         ITEMS.register(modEventBus);
  42.         CREATIVE_MODE_TABS.register(modEventBus);

  43.         MinecraftForge.EVENT_BUS.register(this);
  44.         ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.SPEC);
  45.     }

  46.     private void commonSetup(final FMLCommonSetupEvent event) {
  47.         LOGGER.info("模组初始化完成");
  48.     }

  49.     @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
  50.     public static class ClientModEvents {
  51.         @SubscribeEvent
  52.         public static void onTextureStitch(TextureStitchEvent.Pre event) {
  53.             if (event.getAtlas().location().equals(InventoryMenu.BLOCK_ATLAS)) {
  54.                 event.addSprite(ClientEvents.SELECTED_BG);
  55.                 event.addSprite(ClientEvents.UNSELECTED_BG);
  56.             }
  57.         }

  58.         @SubscribeEvent
  59.         public static void registerOverlays(RegisterGuiOverlaysEvent event) {
  60.             event.registerAbove(VanillaGuiOverlay.CROSSHAIR.id(), "item_pickup", ITEM_PICKUP_OVERLAY);
  61.         }

  62.         private static final IGuiOverlay ITEM_PICKUP_OVERLAY = (ForgeGui gui, GuiGraphics guiGraphics, float partialTick, int screenWidth, int screenHeight) -> {
  63.             if (!Config.modEnabled) return;

  64.             Minecraft mc = Minecraft.getInstance();
  65.             if (mc.player == null || mc.level == null) return;

  66.             int centerX = screenWidth / 2 + 20;
  67.             int centerY = screenHeight / 2 - 10;

  68.             for (int i = 0; i < ClientEvents.nearbyItems.size(); i++) {
  69.                 ItemEntity entity = ClientEvents.nearbyItems.get(i);
  70.                 if (!entity.isAlive()) continue;

  71.                 ResourceLocation bg = (i == ClientEvents.selectedIndex) ?
  72.                         ClientEvents.SELECTED_BG : ClientEvents.UNSELECTED_BG;

  73.                 // 绘制背景
  74.                 guiGraphics.blit(bg, centerX, centerY + i * 30, 0, 0, 24, 24, 24, 24);

  75.                 // 绘制物品
  76.                 ItemStack stack = entity.getItem();
  77.                 if (!stack.isEmpty()) {
  78.                     guiGraphics.renderItem(stack, centerX + 4, centerY + i * 30 + 4);
  79.                     guiGraphics.renderItemDecorations(mc.font, stack, centerX + 4, centerY + i * 30 + 4);
  80.                 }
  81.             }
  82.         };
  83.     }
  84. }
复制代码
Config.java
  1. package com.example.InteractReborn;

  2. import net.minecraftforge.common.ForgeConfigSpec;
  3. import net.minecraftforge.eventbus.api.SubscribeEvent;
  4. import net.minecraftforge.fml.common.Mod;
  5. import net.minecraftforge.fml.event.config.ModConfigEvent;

  6. @Mod.EventBusSubscriber(modid = Main.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
  7. public class Config {
  8.     private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder();

  9.     public static final ForgeConfigSpec.BooleanValue MOD_ENABLED = BUILDER
  10.             .comment("是否启用交互改进模组")
  11.             .define("modEnabled", true);

  12.     public static final ForgeConfigSpec.DoubleValue PICKUP_RANGE = BUILDER
  13.             .comment("物品拾取检测范围(方块)")
  14.             .defineInRange("pickupRange", 3.0, 1.0, 10.0);

  15.     static final ForgeConfigSpec SPEC = BUILDER.build();

  16.     public static boolean modEnabled;
  17.     public static double pickupRange;

  18.     @SubscribeEvent
  19.     static void onLoad(final ModConfigEvent event) {
  20.         modEnabled = MOD_ENABLED.get();
  21.         pickupRange = PICKUP_RANGE.get();
  22.     }
  23. }
复制代码

ClientEvents.java

2.49 KB, 下载次数: 2

3处无法解决

Config.java

1.08 KB, 下载次数: 0

配置

Main.java

4.35 KB, 下载次数: 1

出错最多的

苦力怕论坛,感谢有您~

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

| 由 木韩网络 提供支持 | GMT+8, 2026-2-3 07:45

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4