diff --git a/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/BlockStateCondition.java b/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/BlockStateCondition.java index 5097925..41230d5 100644 --- a/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/BlockStateCondition.java +++ b/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/BlockStateCondition.java @@ -38,10 +38,9 @@ */ public record BlockStateCondition(HolderSet block) implements LootItemCondition { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group( - RegistryCodecs.homogeneousList(Registries.BLOCK).fieldOf("block").forGetter(o -> o.block) - ).apply(instance, BlockStateCondition::new)); + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + RegistryCodecs.homogeneousList(Registries.BLOCK).fieldOf("block").forGetter(o -> o.block) + ).apply(instance, BlockStateCondition::new)); public static final LootItemConditionType TYPE = new LootItemConditionType(CODEC); diff --git a/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/EnchantmentLevelCondition.java b/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/EnchantmentLevelCondition.java new file mode 100644 index 0000000..68c8d93 --- /dev/null +++ b/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/EnchantmentLevelCondition.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2025 AUIOC.ORG + * + * This file is part of ArnicaLib, a mod made for Minecraft. + * + * ArnicaLib is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +package org.auioc.mcmod.arnicalib.game.loot.predicate; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.advancements.critereon.MinMaxBounds; +import net.minecraft.util.context.ContextKey; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; + +import java.util.Set; + +/** + * @since 7.0.1 + */ +public record EnchantmentLevelCondition(MinMaxBounds.Ints level) implements LootItemCondition { + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + MinMaxBounds.Ints.CODEC.optionalFieldOf("level", MinMaxBounds.Ints.ANY).forGetter(o -> o.level) + ).apply(instance, EnchantmentLevelCondition::new)); + + public static final LootItemConditionType TYPE = new LootItemConditionType(CODEC); + + @Override + public LootItemConditionType getType() { return TYPE; } + + @Override + public Set> getReferencedContextParams() { + return Set.of(LootContextParams.ENCHANTMENT_LEVEL); + } + + @Override + public boolean test(LootContext context) { + var lvl = context.getParameter(LootContextParams.ENCHANTMENT_LEVEL); + return level.matches(lvl); + } + + // ============================================================================================================== // + + public static LootItemCondition.Builder of(MinMaxBounds.Ints level) { + return () -> new EnchantmentLevelCondition(level); + } + +} diff --git a/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/EntityAttributeCondition.java b/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/EntityAttributeCondition.java index 30c0fc6..6769ecd 100644 --- a/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/EntityAttributeCondition.java +++ b/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/EntityAttributeCondition.java @@ -49,13 +49,12 @@ public record EntityAttributeCondition( LootContext.EntityTarget entityTarget ) implements LootItemCondition { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group( - Attribute.CODEC.fieldOf("attribute").forGetter(o -> o.attribute), - EnumCodec.byString(ValueType.class, e -> e.name).fieldOf("type").forGetter(o -> o.valueType), - MinMaxBounds.Doubles.CODEC.fieldOf("value").forGetter(o -> o.value), - LootContext.EntityTarget.CODEC.fieldOf("entity").forGetter(o -> o.entityTarget) - ).apply(instance, EntityAttributeCondition::new)); + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Attribute.CODEC.fieldOf("attribute").forGetter(o -> o.attribute), + EnumCodec.byString(ValueType.class, e -> e.name).fieldOf("type").forGetter(o -> o.valueType), + MinMaxBounds.Doubles.CODEC.fieldOf("value").forGetter(o -> o.value), + LootContext.EntityTarget.CODEC.fieldOf("entity").forGetter(o -> o.entityTarget) + ).apply(instance, EntityAttributeCondition::new)); public static final LootItemConditionType TYPE = new LootItemConditionType(CODEC); diff --git a/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/ExtraLocationCheck.java b/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/ExtraLocationCheck.java index d3ee20f..3c5a5b0 100644 --- a/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/ExtraLocationCheck.java +++ b/src/main/java/org/auioc/mcmod/arnicalib/game/loot/predicate/ExtraLocationCheck.java @@ -39,11 +39,10 @@ */ public record ExtraLocationCheck(Optional location, Optional biome) implements LootItemCondition { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group( - LocationCheck.CODEC.codec().optionalFieldOf("location").forGetter(o -> o.location), - BiomePredicate.CODEC.optionalFieldOf("biome").forGetter(o -> o.biome) - ).apply(instance, ExtraLocationCheck::new)); + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + LocationCheck.CODEC.codec().optionalFieldOf("location").forGetter(o -> o.location), + BiomePredicate.CODEC.optionalFieldOf("biome").forGetter(o -> o.biome) + ).apply(instance, ExtraLocationCheck::new)); public static final LootItemConditionType TYPE = new LootItemConditionType(CODEC); diff --git a/src/main/java/org/auioc/mcmod/arnicalib/mod/registry/AHLootItemConditions.java b/src/main/java/org/auioc/mcmod/arnicalib/mod/registry/AHLootItemConditions.java index 516df1d..ac2c254 100644 --- a/src/main/java/org/auioc/mcmod/arnicalib/mod/registry/AHLootItemConditions.java +++ b/src/main/java/org/auioc/mcmod/arnicalib/mod/registry/AHLootItemConditions.java @@ -25,6 +25,7 @@ import net.neoforged.neoforge.registries.DeferredRegister; import org.auioc.mcmod.arnicalib.ArnicaLib; import org.auioc.mcmod.arnicalib.game.loot.predicate.BlockStateCondition; +import org.auioc.mcmod.arnicalib.game.loot.predicate.EnchantmentLevelCondition; import org.auioc.mcmod.arnicalib.game.loot.predicate.EntityAttributeCondition; import org.auioc.mcmod.arnicalib.game.loot.predicate.ExtraLocationCheck; @@ -35,5 +36,6 @@ public class AHLootItemConditions { public static final DeferredHolder ENTITY_ATTRIBUTE = TYPES.register("entity_attribute", () -> EntityAttributeCondition.TYPE); public static final DeferredHolder BLOCK_STATE = TYPES.register("block_state", () -> BlockStateCondition.TYPE); public static final DeferredHolder LOCATION_CHECK = TYPES.register("location_check", () -> ExtraLocationCheck.TYPE); + public static final DeferredHolder ENCHANTMENT_LEVEL = TYPES.register("enchantment_level", () -> EnchantmentLevelCondition.TYPE); }