Minecraft Forge 1.20.1战利品修饰器未生效问题求助
现有配置与代码
战利品修饰器文件 (spider_charm_from_spiders.json)
路径:src/main/resources/data/reinvigoration/loot_modifiers/spider_charm_from_spiders.json
{ "type": "reinvigoration:add_item", "conditions": [ { "condition": "minecraft:entity_properties", "predicate": { "type": "minecraft:spider" }, "entity": "this" }, { "condition": "minecraft:killed_by_player" } ], "item": "reinvigoration:spider_charm" }
全局战利品修饰器配置 (global_loot_modifiers.json)
路径:src/main/resources/data/forge/loot_modifiers/global_loot_modifiers.json
{ "replace": false, "entries": [ "reinvigoration:spider_charm_from_spiders" ] }
核心Java类
AddItemModifier.java
package com.soliid.reinvigoration.loot; import com.google.common.base.Suppliers; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraftforge.common.loot.IGlobalLootModifier; import net.minecraftforge.common.loot.LootModifier; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; public class AddItemModifier extends LootModifier { public static final Supplier<Codec<AddItemModifier>> CODEC = Suppliers.memoize(() -> RecordCodecBuilder.create(inst -> codecStart(inst).and(ForgeRegistries.ITEMS.getCodec() .fieldOf("item").forGetter(m -> m.item)).apply(inst, AddItemModifier::new))); private final Item item; protected AddItemModifier(LootItemCondition[] conditionsIn, Item item) { super(conditionsIn); this.item = item; } @Override @NotNull protected ObjectArrayList<ItemStack> doApply(ObjectArrayList<ItemStack> generatedLoot, LootContext context) { generatedLoot.add(new ItemStack(item)); return generatedLoot; } @Override public Codec<? extends IGlobalLootModifier> codec() { return CODEC.get(); } }
ModLootModifiers.java
package com.soliid.reinvigoration.loot; import com.mojang.serialization.Codec; import com.soliid.reinvigoration.Reinvigoration; import net.minecraftforge.common.loot.IGlobalLootModifier; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class ModLootModifiers { public static final DeferredRegister<Codec<? extends IGlobalLootModifier>> LOOT_MODIFIER_SERIALIZERS = DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, Reinvigoration.MODID); public static final RegistryObject<Codec<? extends IGlobalLootModifier>> ADD_ITEM = LOOT_MODIFIER_SERIALIZERS.register("add_item", AddItemModifier.CODEC); public static void register(IEventBus bus) { LOOT_MODIFIER_SERIALIZERS.register(bus); } }
主类注册
ModLootModifiers.register(modEventBus);
问题排查与修复方案
1. 修正包名拼写错误
你的类路径是src/main/java/com/soliid/reinvigoraion/loot,但Java代码中的包名是com.soliid.reinvigoration.loot——reinvigoraion少了一个't',这会导致类无法被正确加载。将文件夹名称改为reinvigoration,与代码包名保持一致。
2. 调整击杀条件逻辑
minecraft:killed_by_player默认仅检测玩家直接击杀,若玩家通过宠物、发射器等间接击杀蜘蛛,条件会不满足。可以修改条件允许间接击杀:
{ "condition": "minecraft:killed_by_player", "direct": false }
也可以暂时移除该条件,先测试基础掉落是否生效,再逐步加回条件排查。
3. 验证物品注册有效性
确认reinvigoration:spider_charm已正确注册,在游戏中执行/give @p reinvigoration:spider_charm命令,若能获取物品则排除物品未注册问题。
4. 查看日志定位错误
启动游戏后,打开run/logs/latest.log,搜索loot、modifier关键词,查找类加载失败、修饰器类型找不到、物品不存在等报错信息,这些日志能直接定位问题根源。
5. 清理缓存并重构项目
在IntelliJ中执行Build > Rebuild Project,删除run文件夹后重新生成游戏环境,避免旧编译缓存导致的异常。
内容的提问来源于stack exchange,提问作者TherrSpoob

