diff --git a/src/generated/resources/data/anvilcraft/enchantment/harvest.json b/src/generated/resources/data/anvilcraft/enchantment/harvest.json index 87e1bc47a..2def9e88d 100644 --- a/src/generated/resources/data/anvilcraft/enchantment/harvest.json +++ b/src/generated/resources/data/anvilcraft/enchantment/harvest.json @@ -3,6 +3,22 @@ "description": { "translate": "enchantment.anvilcraft.harvest" }, + "effects": { + "anvilcraft:use_on_block": [ + { + "effect": { + "type": "anvilcraft:harvest", + "range": 5 + }, + "requirements": { + "condition": "minecraft:match_tool", + "predicate": { + "items": "#minecraft:hoes" + } + } + } + ] + }, "max_cost": { "base": 15, "per_level_above_first": 10 diff --git a/src/main/java/dev/dubhe/anvilcraft/AnvilCraft.java b/src/main/java/dev/dubhe/anvilcraft/AnvilCraft.java index 96896f0b9..1cdb5c4f3 100644 --- a/src/main/java/dev/dubhe/anvilcraft/AnvilCraft.java +++ b/src/main/java/dev/dubhe/anvilcraft/AnvilCraft.java @@ -7,10 +7,13 @@ import dev.dubhe.anvilcraft.init.ModCommands; import dev.dubhe.anvilcraft.init.ModComponents; import dev.dubhe.anvilcraft.init.ModDispenserBehavior; +import dev.dubhe.anvilcraft.init.ModEnchantmentEffectComponents; +import dev.dubhe.anvilcraft.init.ModEnchantmentEffects; import dev.dubhe.anvilcraft.init.ModEntities; import dev.dubhe.anvilcraft.init.ModEvents; import dev.dubhe.anvilcraft.init.ModItemGroups; import dev.dubhe.anvilcraft.init.ModItems; +import dev.dubhe.anvilcraft.init.ModLootContextParamSets; import dev.dubhe.anvilcraft.init.ModMenuTypes; import dev.dubhe.anvilcraft.init.ModNetworks; import dev.dubhe.anvilcraft.init.ModRecipeTypes; @@ -72,6 +75,10 @@ public AnvilCraft(IEventBus modEventBus, ModContainer container) { ModComponents.register(modEventBus); ModVillagers.register(modEventBus); ModRecipeTypes.register(modEventBus); + + ModLootContextParamSets.registerAll(); + ModEnchantmentEffectComponents.register(modEventBus); + ModEnchantmentEffects.register(modEventBus); // datagen AnvilCraftDatagen.init(); diff --git a/src/main/java/dev/dubhe/anvilcraft/enchantment/FellingEffect.java b/src/main/java/dev/dubhe/anvilcraft/enchantment/FellingEffect.java new file mode 100644 index 000000000..060c89a80 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/enchantment/FellingEffect.java @@ -0,0 +1,33 @@ +package dev.dubhe.anvilcraft.enchantment; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.enchantment.EnchantedItemInUse; +import net.minecraft.world.item.enchantment.effects.EnchantmentEntityEffect; +import net.minecraft.world.phys.Vec3; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public record FellingEffect(int range) implements EnchantmentEntityEffect { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(it -> + it.group( + Codec.INT.optionalFieldOf("range", 3).forGetter(FellingEffect::range) + ).apply(it, FellingEffect::new) + ); + + @Override + public void apply(ServerLevel serverLevel, int i, EnchantedItemInUse enchantedItemInUse, Entity entity, Vec3 vec3) { + System.out.println("FELLING!!!"); + } + + @Override + public MapCodec codec() { + return CODEC; + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/enchantment/HarvestEffect.java b/src/main/java/dev/dubhe/anvilcraft/enchantment/HarvestEffect.java new file mode 100644 index 000000000..1a4b1f8bb --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/enchantment/HarvestEffect.java @@ -0,0 +1,91 @@ +package dev.dubhe.anvilcraft.enchantment; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantedItemInUse; +import net.minecraft.world.item.enchantment.effects.EnchantmentEntityEffect; +import net.minecraft.world.level.block.CropBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.Iterator; +import java.util.List; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public record HarvestEffect(int range) implements EnchantmentEntityEffect { + private static final List ITERATING_OFFSET = new ArrayList<>(); + + static { + for (int dx = -1; dx <= 1; dx++) { + for (int dz = -1; dz <= 1; dz++) { + ITERATING_OFFSET.add(new BlockPos(dx, 0, dz)); + } + } + } + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(it -> + it.group( + Codec.INT.optionalFieldOf("range", 3) + .forGetter(HarvestEffect::range) + ).apply(it, HarvestEffect::new) + ); + + @Override + public void apply(ServerLevel level, int enchantmentLevel, EnchantedItemInUse enchantedItemInUse, Entity owner, Vec3 vec3) { + ItemStack tool = enchantedItemInUse.itemStack(); + BlockPos pos = BlockPos.containing(vec3); + if (!(owner instanceof Player player)) return; + BlockState targetBlockState = level.getBlockState(pos); + boolean hasValidCropBlock = false; + if (targetBlockState.getBlock() instanceof CropBlock cropBlock) { + if (cropBlock.isMaxAge(targetBlockState)) { + hasValidCropBlock = true; + BlockEntity entity = level.getBlockEntity(pos); + cropBlock.playerWillDestroy(level, pos, targetBlockState, player); + cropBlock.playerDestroy(level, player, pos, targetBlockState, entity, tool); + level.setBlockAndUpdate(pos, cropBlock.getStateForAge(0)); + } + } else return; + int max = enchantmentLevel * 2 + 1; + max *= max; + if (hasValidCropBlock) max -= 1; + Deque iteratingPos = new ArrayDeque<>(); + iteratingPos.push(pos); + List vis = new ArrayList<>(); + while (!iteratingPos.isEmpty() && max >= 0) { + BlockPos currentIterating = iteratingPos.pop(); + if (vis.contains(currentIterating)) continue; + vis.add(currentIterating); + max--; + for (BlockPos offset : ITERATING_OFFSET) { + BlockPos currentPos = currentIterating.offset(offset); + iteratingPos.add(currentPos); + } + BlockState state = level.getBlockState(currentIterating); + if (!(state.getBlock() instanceof CropBlock block)) continue; + if (!block.isMaxAge(state)) continue; + BlockState newState = block.getStateForAge(0); + cropBlock.playerWillDestroy(level, pos, targetBlockState, player); + cropBlock.playerDestroy(level, player, pos, targetBlockState, level.getBlockEntity(currentIterating), tool); + level.setBlockAndUpdate(currentIterating, newState); + } + } + + @Override + public MapCodec codec() { + return CODEC; + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModEnchantmentEffectComponents.java b/src/main/java/dev/dubhe/anvilcraft/init/ModEnchantmentEffectComponents.java new file mode 100644 index 000000000..f5495b5b7 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModEnchantmentEffectComponents.java @@ -0,0 +1,38 @@ +package dev.dubhe.anvilcraft.init; + +import dev.dubhe.anvilcraft.AnvilCraft; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.item.enchantment.ConditionalEffect; +import net.minecraft.world.item.enchantment.effects.EnchantmentEntityEffect; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.List; +import java.util.function.UnaryOperator; + +public class ModEnchantmentEffectComponents { + + private static final DeferredRegister> REGISTER = + DeferredRegister.create(Registries.ENCHANTMENT_EFFECT_COMPONENT_TYPE, AnvilCraft.MOD_ID); + + public static final DataComponentType>> USE_ON_BLOCK = register( + "use_on_block", + (it) -> it.persistent( + ConditionalEffect.codec( + EnchantmentEntityEffect.CODEC, + ModLootContextParamSets.USE_ON_ITEM + ).listOf() + ) + ); + + private static DataComponentType register(String name, UnaryOperator> operator) { + DataComponentType dct = operator.apply(DataComponentType.builder()).build(); + REGISTER.register(name, () -> dct); + return dct; + } + + public static void register(IEventBus bus) { + REGISTER.register(bus); + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModEnchantmentEffects.java b/src/main/java/dev/dubhe/anvilcraft/init/ModEnchantmentEffects.java new file mode 100644 index 000000000..22ee0a8be --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModEnchantmentEffects.java @@ -0,0 +1,29 @@ +package dev.dubhe.anvilcraft.init; + +import com.mojang.serialization.MapCodec; +import dev.dubhe.anvilcraft.AnvilCraft; +import dev.dubhe.anvilcraft.enchantment.FellingEffect; +import dev.dubhe.anvilcraft.enchantment.HarvestEffect; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.item.enchantment.effects.EnchantmentEntityEffect; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; + +public class ModEnchantmentEffects { + public static final DeferredRegister> REGISTER = + DeferredRegister.create(Registries.ENCHANTMENT_ENTITY_EFFECT_TYPE, AnvilCraft.MOD_ID); + static { + REGISTER.register( + "harvest", + () -> HarvestEffect.CODEC + ); + REGISTER.register( + "felling", + () -> FellingEffect.CODEC + ); + } + + public static void register(IEventBus eventBus){ + REGISTER.register(eventBus); + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModEnchantments.java b/src/main/java/dev/dubhe/anvilcraft/init/ModEnchantments.java index 56b8d373a..c67a4f8c5 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModEnchantments.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModEnchantments.java @@ -1,12 +1,10 @@ package dev.dubhe.anvilcraft.init; import dev.dubhe.anvilcraft.AnvilCraft; -import dev.dubhe.anvilcraft.util.Lazy; +import dev.dubhe.anvilcraft.enchantment.HarvestEffect; -import net.minecraft.core.Holder; +import net.minecraft.advancements.critereon.ItemPredicate; import net.minecraft.core.HolderGetter; -import net.minecraft.core.Registry; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; @@ -16,6 +14,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.storage.loot.predicates.MatchTool; @SuppressWarnings("unchecked") public class ModEnchantments { @@ -24,24 +23,6 @@ public class ModEnchantments { public static final ResourceKey HARVEST_KEY = key("harvest"); public static final ResourceKey BEHEADING_KEY = key("beheading"); - public static final Lazy> FELLING = new Lazy<>(() -> { - Registry enchantmentRegistry = - (Registry) BuiltInRegistries.REGISTRY.get(Registries.ENCHANTMENT.location()); - return enchantmentRegistry.getHolderOrThrow(FELLING_KEY).getDelegate(); - }); - - public static Lazy> HARVEST = new Lazy<>(() -> { - Registry enchantmentRegistry = - (Registry) BuiltInRegistries.REGISTRY.get(Registries.ENCHANTMENT.location()); - return enchantmentRegistry.getHolderOrThrow(HARVEST_KEY).getDelegate(); - }); - - public static final Lazy> BEHEADING = new Lazy<>(() -> { - Registry enchantmentRegistry = - (Registry) BuiltInRegistries.REGISTRY.get(Registries.ENCHANTMENT.location()); - return enchantmentRegistry.getHolderOrThrow(BEHEADING_KEY).getDelegate(); - }); - public static ResourceKey key(String name) { return ResourceKey.create(Registries.ENCHANTMENT, AnvilCraft.of(name)); } @@ -55,42 +36,62 @@ public static void bootstrap(BootstrapContext context) { HolderGetter itemHolderGetter = context.lookup(Registries.ITEM); HolderGetter blockHolderGetter = context.lookup(Registries.BLOCK); register( - context, - FELLING_KEY, - Enchantment.enchantment(Enchantment.definition( - itemHolderGetter.getOrThrow(ItemTags.AXES), - 5, - 3, - Enchantment.dynamicCost(1, 10), - Enchantment.dynamicCost(15, 10), - 2, - EquipmentSlotGroup.MAINHAND))); + context, + FELLING_KEY, + Enchantment.enchantment( + Enchantment.definition( + itemHolderGetter.getOrThrow(ItemTags.AXES), + 5, + 3, + Enchantment.dynamicCost(1, 10), + Enchantment.dynamicCost(15, 10), + 2, + EquipmentSlotGroup.MAINHAND + ) + ) + ); register( - context, - HARVEST_KEY, - Enchantment.enchantment(Enchantment.definition( - itemHolderGetter.getOrThrow(ItemTags.HOES), - 5, - 3, - Enchantment.dynamicCost(1, 10), - Enchantment.dynamicCost(15, 10), - 2, - EquipmentSlotGroup.MAINHAND))); + context, + HARVEST_KEY, + Enchantment.enchantment( + Enchantment.definition( + itemHolderGetter.getOrThrow(ItemTags.HOES), + 5, + 3, + Enchantment.dynamicCost(1, 10), + Enchantment.dynamicCost(15, 10), + 2, + EquipmentSlotGroup.MAINHAND + ) + ).withEffect( + ModEnchantmentEffectComponents.USE_ON_BLOCK, + new HarvestEffect(5), + MatchTool.toolMatches( + ItemPredicate.Builder.item() + .of(ItemTags.HOES) + ) + + ) + ); register( - context, - BEHEADING_KEY, - Enchantment.enchantment(Enchantment.definition( - itemHolderGetter.getOrThrow(ItemTags.SWORDS), - 5, - 3, - Enchantment.dynamicCost(1, 10), - Enchantment.dynamicCost(15, 10), - 2, - EquipmentSlotGroup.MAINHAND))); + context, + BEHEADING_KEY, + Enchantment.enchantment( + Enchantment.definition( + itemHolderGetter.getOrThrow(ItemTags.SWORDS), + 5, + 3, + Enchantment.dynamicCost(1, 10), + Enchantment.dynamicCost(15, 10), + 2, + EquipmentSlotGroup.MAINHAND + ) + ) + ); } public static void register( - BootstrapContext context, ResourceKey key, Enchantment.Builder builder) { + BootstrapContext context, ResourceKey key, Enchantment.Builder builder) { context.register(key, builder.build(key.location())); } } diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModLootContextParamSets.java b/src/main/java/dev/dubhe/anvilcraft/init/ModLootContextParamSets.java new file mode 100644 index 000000000..d3e7c5a7d --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModLootContextParamSets.java @@ -0,0 +1,30 @@ +package dev.dubhe.anvilcraft.init; + +import dev.dubhe.anvilcraft.AnvilCraft; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; + +import java.util.function.Consumer; + +public class ModLootContextParamSets { + public static final LootContextParamSet USE_ON_ITEM = register( + "use_on_item", + it -> it.required(LootContextParams.THIS_ENTITY) + .required(LootContextParams.ORIGIN) + .required(LootContextParams.BLOCK_STATE) + .required(LootContextParams.TOOL) + ); + + private static LootContextParamSet register(String registryName, Consumer builderConsumer) { + LootContextParamSet.Builder builder = new LootContextParamSet.Builder(); + builderConsumer.accept(builder); + LootContextParamSet paramSet = builder.build(); + LootContextParamSets.REGISTRY.put(AnvilCraft.of(registryName), paramSet); + return paramSet; + } + + public static void registerAll(){ + //intentionally empty + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModVillagers.java b/src/main/java/dev/dubhe/anvilcraft/init/ModVillagers.java index f8b37a52d..9631cc458 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModVillagers.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModVillagers.java @@ -15,30 +15,30 @@ public class ModVillagers { public static final DeferredRegister POI_TYPES = - DeferredRegister.create(Registries.POINT_OF_INTEREST_TYPE, AnvilCraft.MOD_ID); + DeferredRegister.create(Registries.POINT_OF_INTEREST_TYPE, AnvilCraft.MOD_ID); public static final DeferredRegister VILLAGER_PROFESSIONS = - DeferredRegister.create(Registries.VILLAGER_PROFESSION, AnvilCraft.MOD_ID); + DeferredRegister.create(Registries.VILLAGER_PROFESSION, AnvilCraft.MOD_ID); public static final DeferredHolder JEWELER_POI = POI_TYPES.register( - "jeweler_poi", - () -> new PoiType( - ImmutableSet.copyOf(ModBlocks.JEWEL_CRAFTING_TABLE - .get() - .getStateDefinition() - .getPossibleStates()), - 1, - 1)); + "jeweler_poi", + () -> new PoiType( + ImmutableSet.copyOf(ModBlocks.JEWEL_CRAFTING_TABLE + .get() + .getStateDefinition() + .getPossibleStates()), + 1, + 1)); public static final DeferredHolder JEWELER = VILLAGER_PROFESSIONS.register( + "jeweler", + () -> new VillagerProfession( "jeweler", - () -> new VillagerProfession( - "jeweler", - entry -> entry.value() == JEWELER_POI.get(), - entry -> entry.value() == JEWELER_POI.get(), - ImmutableSet.of(), - ImmutableSet.of(), - SoundEvents.VILLAGER_WORK_TOOLSMITH)); + entry -> entry.value() == JEWELER_POI.get(), + entry -> entry.value() == JEWELER_POI.get(), + ImmutableSet.of(), + ImmutableSet.of(), + SoundEvents.VILLAGER_WORK_TOOLSMITH)); public static void register(IEventBus eventBus) { POI_TYPES.register(eventBus); diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/HoeItemMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/HoeItemMixin.java new file mode 100644 index 000000000..3535de0f1 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/HoeItemMixin.java @@ -0,0 +1,28 @@ +package dev.dubhe.anvilcraft.mixin; + +import dev.dubhe.anvilcraft.util.ModEnchantmentHelper; +import dev.dubhe.anvilcraft.util.Util; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.HoeItem; +import net.minecraft.world.item.context.UseOnContext; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(HoeItem.class) +public class HoeItemMixin { + @Inject(method = "useOn", at = @At("HEAD")) + void onUse(UseOnContext context, CallbackInfoReturnable cir) { + if (context.getLevel().isClientSide) return; + ModEnchantmentHelper.onUseOnBlock( + (ServerLevel) context.getLevel(), + context.getItemInHand(), + context.getPlayer(), + Util.convertToSlot(context.getHand()), + context.getClickedPos().getCenter(), + context.getLevel().getBlockState(context.getClickedPos()) + ); + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/util/ModEnchantmentHelper.java b/src/main/java/dev/dubhe/anvilcraft/util/ModEnchantmentHelper.java new file mode 100644 index 000000000..6729f8523 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/util/ModEnchantmentHelper.java @@ -0,0 +1,55 @@ +package dev.dubhe.anvilcraft.util; + +import dev.dubhe.anvilcraft.init.ModEnchantmentEffectComponents; +import dev.dubhe.anvilcraft.init.ModLootContextParamSets; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantedItemInUse; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; + +import java.util.Optional; + +public class ModEnchantmentHelper { + public static void onUseOnBlock( + ServerLevel level, + ItemStack stack, + LivingEntity entity, + EquipmentSlot slot, + Vec3 pos, + BlockState state + ) { + EnchantmentHelper.runIterationOnItem(stack, (holder, enchantmentLevel) -> { + LootParams lootParams = new LootParams.Builder(level) + .withParameter(LootContextParams.THIS_ENTITY, entity) + .withParameter(LootContextParams.ORIGIN, pos) + .withParameter(LootContextParams.BLOCK_STATE, state) + .withParameter(LootContextParams.TOOL, stack) + .create(ModLootContextParamSets.USE_ON_ITEM); + + Enchantment.applyEffects( + holder.value().getEffects( + ModEnchantmentEffectComponents.USE_ON_BLOCK), + new LootContext.Builder(lootParams).create(Optional.empty()), + effect -> effect.apply( + level, + enchantmentLevel, + new EnchantedItemInUse( + stack, + slot, + entity + ), + entity, + pos + ) + ); + }); + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index c7422503d..52f4be864 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -41,3 +41,4 @@ public net.minecraft.world.item.crafting.AbstractCookingRecipe ingredient # ingr public net.minecraft.world.item.crafting.ShapedRecipe result # result public net.minecraft.world.item.crafting.ShapelessRecipe result # result +public net.minecraft.world.level.storage.loot.parameters.LootContextParamSets REGISTRY # REGISTRY \ No newline at end of file diff --git a/src/main/resources/anvilcraft.mixins.json b/src/main/resources/anvilcraft.mixins.json index 154fc478a..b61b8e64f 100644 --- a/src/main/resources/anvilcraft.mixins.json +++ b/src/main/resources/anvilcraft.mixins.json @@ -17,6 +17,7 @@ "EndPortalBlockMixin", "ExplosionMixin", "FlyingHitEntityMixin", + "HoeItemMixin", "IngredientValueAccessor$Item", "IngredientValueAccessor$Tag", "ItemEntityMixin",