From 79d86eb0a94a29652901bcd8a93f4e0817296a80 Mon Sep 17 00:00:00 2001 From: Apex <29412632+ApexModder@users.noreply.github.com> Date: Thu, 12 Dec 2024 18:11:36 +0000 Subject: [PATCH] [1.21.4] Encourage more usage of IConditionBuider (#1716) --- .../ReloadableServerResources.java.patch | 2 +- .../neoforge/common/NeoForgeMod.java | 14 +-- ...rueCondition.java => AlwaysCondition.java} | 10 +- .../common/conditions/ConditionContext.java | 19 ++-- .../FeatureFlagsEnabledCondition.java | 2 +- .../common/conditions/ICondition.java | 5 + .../common/conditions/IConditionBuilder.java | 62 ----------- .../conditions/ItemExistsCondition.java | 52 --------- .../common/conditions/NeoForgeConditions.java | 105 ++++++++++++++++++ ...alseCondition.java => NeverCondition.java} | 10 +- .../conditions/RegisteredCondition.java | 34 ++++++ .../common/conditions/TagEmptyCondition.java | 30 ++--- .../common/data/JsonCodecProvider.java | 2 +- .../recipes/building_blocks/conditional.json | 6 +- .../recipes/building_blocks/conditional2.json | 6 +- .../data_gen_test/recipe/conditional.json | 6 +- .../data_gen_test/recipe/conditional2.json | 6 +- .../damage_type/conditional_false.json | 2 +- .../damage_type/conditional_true.json | 2 +- .../recipes/misc/always_disabled_recipe.json | 2 +- .../recipe/always_disabled_recipe.json | 2 +- .../neoforge/debug/ConditionalRecipeTest.java | 4 +- .../debug/data/CustomFeatureFlagsTests.java | 13 +-- .../data/registries/DatapackEntryTests.java | 7 +- .../neoforge/oldtest/DataGeneratorTest.java | 32 +++--- .../conditions/ConditionalCodecTest.java | 20 ++-- 26 files changed, 232 insertions(+), 223 deletions(-) rename src/main/java/net/neoforged/neoforge/common/conditions/{TrueCondition.java => AlwaysCondition.java} (61%) delete mode 100644 src/main/java/net/neoforged/neoforge/common/conditions/IConditionBuilder.java delete mode 100644 src/main/java/net/neoforged/neoforge/common/conditions/ItemExistsCondition.java create mode 100644 src/main/java/net/neoforged/neoforge/common/conditions/NeoForgeConditions.java rename src/main/java/net/neoforged/neoforge/common/conditions/{FalseCondition.java => NeverCondition.java} (65%) create mode 100644 src/main/java/net/neoforged/neoforge/common/conditions/RegisteredCondition.java diff --git a/patches/net/minecraft/server/ReloadableServerResources.java.patch b/patches/net/minecraft/server/ReloadableServerResources.java.patch index fae77e4d24e..e21a3d9448a 100644 --- a/patches/net/minecraft/server/ReloadableServerResources.java.patch +++ b/patches/net/minecraft/server/ReloadableServerResources.java.patch @@ -6,7 +6,7 @@ this.functionLibrary = new ServerFunctionLibrary(p_206859_, this.commands.getDispatcher()); + // Neo: Store registries and create context object + this.registryLookup = p_361583_; -+ this.context = new net.neoforged.neoforge.common.conditions.ConditionContext(this.postponedTags, p_250695_); ++ this.context = new net.neoforged.neoforge.common.conditions.ConditionContext(this.postponedTags, p_362982_.compositeAccess(), p_250695_); } public ServerFunctionLibrary getFunctionLibrary() { diff --git a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java index 168192189a1..0476a2610e7 100644 --- a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java +++ b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java @@ -79,16 +79,16 @@ import net.neoforged.neoforge.common.advancements.critereon.PiglinCurrencyItemPredicate; import net.neoforged.neoforge.common.advancements.critereon.PiglinNeutralArmorEntityPredicate; import net.neoforged.neoforge.common.advancements.critereon.SnowBootsEntityPredicate; +import net.neoforged.neoforge.common.conditions.AlwaysCondition; import net.neoforged.neoforge.common.conditions.AndCondition; -import net.neoforged.neoforge.common.conditions.FalseCondition; import net.neoforged.neoforge.common.conditions.FeatureFlagsEnabledCondition; import net.neoforged.neoforge.common.conditions.ICondition; -import net.neoforged.neoforge.common.conditions.ItemExistsCondition; import net.neoforged.neoforge.common.conditions.ModLoadedCondition; +import net.neoforged.neoforge.common.conditions.NeverCondition; import net.neoforged.neoforge.common.conditions.NotCondition; import net.neoforged.neoforge.common.conditions.OrCondition; +import net.neoforged.neoforge.common.conditions.RegisteredCondition; import net.neoforged.neoforge.common.conditions.TagEmptyCondition; -import net.neoforged.neoforge.common.conditions.TrueCondition; import net.neoforged.neoforge.common.crafting.BlockTagIngredient; import net.neoforged.neoforge.common.crafting.CompoundIngredient; import net.neoforged.neoforge.common.crafting.CustomDisplayIngredient; @@ -357,13 +357,13 @@ public class NeoForgeMod { private static final DeferredRegister> CONDITION_CODECS = DeferredRegister.create(NeoForgeRegistries.Keys.CONDITION_CODECS, NeoForgeVersion.MOD_ID); public static final DeferredHolder, MapCodec> AND_CONDITION = CONDITION_CODECS.register("and", () -> AndCondition.CODEC); - public static final DeferredHolder, MapCodec> FALSE_CONDITION = CONDITION_CODECS.register("false", () -> FalseCondition.CODEC); - public static final DeferredHolder, MapCodec> ITEM_EXISTS_CONDITION = CONDITION_CODECS.register("item_exists", () -> ItemExistsCondition.CODEC); + public static final DeferredHolder, MapCodec> NEVER_CONDITION = CONDITION_CODECS.register("never", () -> NeverCondition.CODEC); + public static final DeferredHolder, MapCodec>> REGISTERED_CONDITION = CONDITION_CODECS.register("registered", () -> RegisteredCondition.CODEC); public static final DeferredHolder, MapCodec> MOD_LOADED_CONDITION = CONDITION_CODECS.register("mod_loaded", () -> ModLoadedCondition.CODEC); public static final DeferredHolder, MapCodec> NOT_CONDITION = CONDITION_CODECS.register("not", () -> NotCondition.CODEC); public static final DeferredHolder, MapCodec> OR_CONDITION = CONDITION_CODECS.register("or", () -> OrCondition.CODEC); - public static final DeferredHolder, MapCodec> TAG_EMPTY_CONDITION = CONDITION_CODECS.register("tag_empty", () -> TagEmptyCondition.CODEC); - public static final DeferredHolder, MapCodec> TRUE_CONDITION = CONDITION_CODECS.register("true", () -> TrueCondition.CODEC); + public static final DeferredHolder, MapCodec>> TAG_EMPTY_CONDITION = CONDITION_CODECS.register("tag_empty", () -> TagEmptyCondition.CODEC); + public static final DeferredHolder, MapCodec> ALWAYS_CONDITION = CONDITION_CODECS.register("always", () -> AlwaysCondition.CODEC); public static final DeferredHolder, MapCodec> FEATURE_FLAGS_ENABLED_CONDITION = CONDITION_CODECS.register("feature_flags_enabled", () -> FeatureFlagsEnabledCondition.CODEC); private static final DeferredRegister> ENTITY_PREDICATE_CODECS = DeferredRegister.create(Registries.ENTITY_SUB_PREDICATE_TYPE, NeoForgeVersion.MOD_ID); diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/TrueCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/AlwaysCondition.java similarity index 61% rename from src/main/java/net/neoforged/neoforge/common/conditions/TrueCondition.java rename to src/main/java/net/neoforged/neoforge/common/conditions/AlwaysCondition.java index 2b93aa46fcc..5837daec19e 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/TrueCondition.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/AlwaysCondition.java @@ -7,12 +7,12 @@ import com.mojang.serialization.MapCodec; -public final class TrueCondition implements ICondition { - public static final TrueCondition INSTANCE = new TrueCondition(); +public final class AlwaysCondition implements ICondition { + public static final AlwaysCondition INSTANCE = new AlwaysCondition(); - public static MapCodec CODEC = MapCodec.unit(INSTANCE).stable(); + public static MapCodec CODEC = MapCodec.unit(INSTANCE).stable(); - private TrueCondition() {} + private AlwaysCondition() {} @Override public boolean test(IContext context) { @@ -26,6 +26,6 @@ public MapCodec codec() { @Override public String toString() { - return "true"; + return "always"; } } diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/ConditionContext.java b/src/main/java/net/neoforged/neoforge/common/conditions/ConditionContext.java index cffc6d01065..e091bd8efbb 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/ConditionContext.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/ConditionContext.java @@ -10,18 +10,19 @@ import java.util.Map; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; import net.minecraft.world.flag.FeatureFlagSet; -import net.minecraft.world.flag.FeatureFlags; -import org.jetbrains.annotations.ApiStatus; public class ConditionContext implements ICondition.IContext { private final Map>, HolderLookup.RegistryLookup> pendingTags; private final FeatureFlagSet enabledFeatures; + private final RegistryAccess registryAccess; - public ConditionContext(List> pendingTags, FeatureFlagSet enabledFeatures) { + public ConditionContext(List> pendingTags, RegistryAccess registryAccess, FeatureFlagSet enabledFeatures) { this.pendingTags = new IdentityHashMap<>(); + this.registryAccess = registryAccess; this.enabledFeatures = enabledFeatures; for (var tags : pendingTags) { @@ -29,13 +30,6 @@ public ConditionContext(List> pendingTags, FeatureFlagSe } } - // Use FeatureFlagSet sensitive constructor - @ApiStatus.ScheduledForRemoval(inVersion = "1.21.4") - @Deprecated(forRemoval = true, since = "1.21.3") - public ConditionContext(List> pendingTags) { - this(pendingTags, FeatureFlags.VANILLA_SET); - } - public void clear() { this.pendingTags.clear(); } @@ -47,6 +41,11 @@ public boolean isTagLoaded(TagKey key) { return lookup != null && lookup.get((TagKey) key).isPresent(); } + @Override + public RegistryAccess registryAccess() { + return registryAccess; + } + @Override public FeatureFlagSet enabledFeatures() { return enabledFeatures; diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/FeatureFlagsEnabledCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/FeatureFlagsEnabledCondition.java index 6eb0aef8ab3..77805c179e4 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/FeatureFlagsEnabledCondition.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/FeatureFlagsEnabledCondition.java @@ -18,7 +18,7 @@ */ public record FeatureFlagsEnabledCondition(FeatureFlagSet flags) implements ICondition { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - FeatureFlags.CODEC.fieldOf("flags").forGetter(condition -> condition.flags)).apply(instance, FeatureFlagsEnabledCondition::new)); + FeatureFlags.CODEC.fieldOf("flags").forGetter(FeatureFlagsEnabledCondition::flags)).apply(instance, FeatureFlagsEnabledCondition::new)); public FeatureFlagsEnabledCondition { if (flags.isEmpty()) { diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/ICondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/ICondition.java index 2c8ca8583d7..3f9ce8004e2 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/ICondition.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/ICondition.java @@ -16,6 +16,7 @@ import java.util.Optional; import java.util.function.Function; import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistryAccess; import net.minecraft.resources.RegistryOps; import net.minecraft.tags.TagKey; import net.minecraft.util.Unit; @@ -95,6 +96,10 @@ public boolean isTagLoaded(TagKey key) { */ boolean isTagLoaded(TagKey key); + default RegistryAccess registryAccess() { + return RegistryAccess.EMPTY; + } + default FeatureFlagSet enabledFeatures() { // returning the vanilla set causes reports false positives for flags outside of vanilla // return FeatureFlags.VANILLA_SET; diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/IConditionBuilder.java b/src/main/java/net/neoforged/neoforge/common/conditions/IConditionBuilder.java deleted file mode 100644 index ef10000e022..00000000000 --- a/src/main/java/net/neoforged/neoforge/common/conditions/IConditionBuilder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.common.conditions; - -import java.util.List; -import net.minecraft.tags.TagKey; -import net.minecraft.world.flag.FeatureFlag; -import net.minecraft.world.flag.FeatureFlagSet; -import net.minecraft.world.item.Item; -import org.apache.commons.lang3.ArrayUtils; - -public interface IConditionBuilder { - default ICondition and(ICondition... values) { - return new AndCondition(List.of(values)); - } - - default ICondition FALSE() { - return FalseCondition.INSTANCE; - } - - default ICondition TRUE() { - return TrueCondition.INSTANCE; - } - - default ICondition not(ICondition value) { - return new NotCondition(value); - } - - default ICondition or(ICondition... values) { - return new OrCondition(List.of(values)); - } - - default ICondition itemExists(String namespace, String path) { - return new ItemExistsCondition(namespace, path); - } - - default ICondition modLoaded(String modid) { - return new ModLoadedCondition(modid); - } - - default ICondition tagEmpty(TagKey tag) { - return new TagEmptyCondition(tag.location()); - } - - default ICondition featureFlagsEnabled(FeatureFlagSet requiredFeatures) { - return new FeatureFlagsEnabledCondition(requiredFeatures); - } - - default ICondition featureFlagsEnabled(FeatureFlag... requiredFlags) { - if (requiredFlags.length == 0) { - throw new IllegalArgumentException("FeatureFlagsEnabledCondition requires at least one feature flag."); - } - if (requiredFlags.length == 1) { - return new FeatureFlagsEnabledCondition(FeatureFlagSet.of(requiredFlags[0])); - } else { - return new FeatureFlagsEnabledCondition(FeatureFlagSet.of(requiredFlags[0], ArrayUtils.remove(requiredFlags, 0))); - } - } -} diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/ItemExistsCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/ItemExistsCondition.java deleted file mode 100644 index 5d25fefb61e..00000000000 --- a/src/main/java/net/neoforged/neoforge/common/conditions/ItemExistsCondition.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.common.conditions; - -import com.mojang.serialization.MapCodec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; - -public class ItemExistsCondition implements ICondition { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - builder -> builder - .group( - ResourceLocation.CODEC.fieldOf("item").forGetter(ItemExistsCondition::getItem)) - .apply(builder, ItemExistsCondition::new)); - - private final ResourceLocation item; - - public ItemExistsCondition(String location) { - this(ResourceLocation.parse(location)); - } - - public ItemExistsCondition(String namespace, String path) { - this(ResourceLocation.fromNamespaceAndPath(namespace, path)); - } - - public ItemExistsCondition(ResourceLocation item) { - this.item = item; - } - - @Override - public boolean test(IContext context) { - return BuiltInRegistries.ITEM.containsKey(item); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - public ResourceLocation getItem() { - return item; - } - - @Override - public String toString() { - return "item_exists(\"" + item + "\")"; - } -} diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/NeoForgeConditions.java b/src/main/java/net/neoforged/neoforge/common/conditions/NeoForgeConditions.java new file mode 100644 index 00000000000..9a1b10aefee --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/common/conditions/NeoForgeConditions.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.common.conditions; + +import java.util.List; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.flag.FeatureFlag; +import net.minecraft.world.flag.FeatureFlagSet; +import org.apache.commons.lang3.ArrayUtils; + +public final class NeoForgeConditions { + public static ICondition and(ICondition... values) { + return new AndCondition(List.of(values)); + } + + public static ICondition never() { + return NeverCondition.INSTANCE; + } + + public static ICondition always() { + return AlwaysCondition.INSTANCE; + } + + public static ICondition not(ICondition value) { + return new NotCondition(value); + } + + public static ICondition or(ICondition... values) { + return new OrCondition(List.of(values)); + } + + public static ICondition registered(ResourceKey registryKey) { + return new RegisteredCondition<>(registryKey); + } + + public static ICondition registered(ResourceKey> registryType, ResourceLocation registryName) { + return registered(ResourceKey.create(registryType, registryName)); + } + + public static ICondition registered(ResourceLocation registryTypeName, ResourceLocation registryName) { + return registered(ResourceKey.createRegistryKey(registryTypeName), registryName); + } + + public static ICondition itemRegistered(ResourceLocation itemName) { + return registered(Registries.ITEM, itemName); + } + + public static ICondition itemRegistered(String namespace, String path) { + return itemRegistered(ResourceLocation.fromNamespaceAndPath(namespace, path)); + } + + public static ICondition itemRegistered(String itemName) { + return itemRegistered(ResourceLocation.parse(itemName)); + } + + public static ICondition modLoaded(String modid) { + return new ModLoadedCondition(modid); + } + + public static ICondition tagEmpty(TagKey tag) { + return new TagEmptyCondition<>(tag); + } + + public static ICondition tagEmpty(ResourceKey> tagType, ResourceLocation tagName) { + return tagEmpty(TagKey.create(tagType, tagName)); + } + + public static ICondition itemTagEmpty(ResourceLocation tagName) { + return tagEmpty(Registries.ITEM, tagName); + } + + public static ICondition itemTagEmpty(String namespace, String tagPath) { + return itemTagEmpty(ResourceLocation.fromNamespaceAndPath(namespace, tagPath)); + } + + public static ICondition itemTagEmpty(String tagName) { + return itemTagEmpty(ResourceLocation.parse(tagName)); + } + + public static ICondition featureFlagsEnabled(FeatureFlagSet requiredFeatures) { + return new FeatureFlagsEnabledCondition(requiredFeatures); + } + + public static ICondition featureFlagsEnabled(FeatureFlag... requiredFlags) { + if (requiredFlags.length == 0) { + throw new IllegalArgumentException("FeatureFlagsEnabledCondition requires at least one feature flag."); + } + if (requiredFlags.length == 1) { + return new FeatureFlagsEnabledCondition(FeatureFlagSet.of(requiredFlags[0])); + } else { + return new FeatureFlagsEnabledCondition(FeatureFlagSet.of(requiredFlags[0], ArrayUtils.remove(requiredFlags, 0))); + } + } + + private NeoForgeConditions() { + // NOOP - Utility class, never to be constructed + } +} diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/FalseCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/NeverCondition.java similarity index 65% rename from src/main/java/net/neoforged/neoforge/common/conditions/FalseCondition.java rename to src/main/java/net/neoforged/neoforge/common/conditions/NeverCondition.java index 6410e2b8aa3..e0332122285 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/FalseCondition.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/NeverCondition.java @@ -7,12 +7,12 @@ import com.mojang.serialization.MapCodec; -public final class FalseCondition implements ICondition { - public static final FalseCondition INSTANCE = new FalseCondition(); +public final class NeverCondition implements ICondition { + public static final NeverCondition INSTANCE = new NeverCondition(); - public static final MapCodec CODEC = MapCodec.unit(INSTANCE).stable(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE).stable(); - private FalseCondition() {} + private NeverCondition() {} @Override public boolean test(IContext condition) { @@ -25,6 +25,6 @@ public MapCodec codec() { } public String toString() { - return "false"; + return "never"; } } diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/RegisteredCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/RegisteredCondition.java new file mode 100644 index 00000000000..6e32d5dac7e --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/common/conditions/RegisteredCondition.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.common.conditions; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; + +public record RegisteredCondition(ResourceKey registryKey) implements ICondition { + public static final MapCodec> CODEC = RecordCodecBuilder.mapCodec(instance -> instance + .group(ResourceLocation.CODEC.optionalFieldOf("registry", Registries.ITEM.location()).forGetter(condition -> condition.registryKey().registry()), + ResourceLocation.CODEC.fieldOf("value").forGetter(condition -> condition.registryKey().location())) + .apply(instance, RegisteredCondition::new)); + + private RegisteredCondition(ResourceLocation registryType, ResourceLocation registryName) { + this(ResourceKey.create(ResourceKey.createRegistryKey(registryType), registryName)); + } + + @Override + public boolean test(IContext context) { + return context.registryAccess().holder(registryKey).map(Holder::isBound).orElse(false); + } + + @Override + public MapCodec codec() { + return CODEC; + } +} diff --git a/src/main/java/net/neoforged/neoforge/common/conditions/TagEmptyCondition.java b/src/main/java/net/neoforged/neoforge/common/conditions/TagEmptyCondition.java index 6da7798cb68..3c46888e500 100644 --- a/src/main/java/net/neoforged/neoforge/common/conditions/TagEmptyCondition.java +++ b/src/main/java/net/neoforged/neoforge/common/conditions/TagEmptyCondition.java @@ -8,27 +8,18 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -public record TagEmptyCondition(TagKey tag) implements ICondition { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - builder -> builder - .group( - ResourceLocation.CODEC.xmap(loc -> TagKey.create(Registries.ITEM, loc), TagKey::location).fieldOf("tag").forGetter(TagEmptyCondition::tag)) - .apply(builder, TagEmptyCondition::new)); +public record TagEmptyCondition(TagKey tag) implements ICondition { + public static final MapCodec> CODEC = RecordCodecBuilder.mapCodec(instance -> instance + .group(ResourceLocation.CODEC.optionalFieldOf("registry", Registries.ITEM.location()).forGetter(condition -> condition.tag().registry().location()), + ResourceLocation.CODEC.fieldOf("tag").forGetter(condition -> condition.tag().location())) + .apply(instance, TagEmptyCondition::new)); - public TagEmptyCondition(String location) { - this(ResourceLocation.parse(location)); - } - - public TagEmptyCondition(String namespace, String path) { - this(ResourceLocation.fromNamespaceAndPath(namespace, path)); - } - - public TagEmptyCondition(ResourceLocation tag) { - this(TagKey.create(Registries.ITEM, tag)); + private TagEmptyCondition(ResourceLocation registryType, ResourceLocation tagName) { + this(TagKey.create(ResourceKey.createRegistryKey(registryType), tagName)); } @Override @@ -40,9 +31,4 @@ public boolean test(ICondition.IContext context) { public MapCodec codec() { return CODEC; } - - @Override - public String toString() { - return "tag_empty(\"" + tag.location() + "\")"; - } } diff --git a/src/main/java/net/neoforged/neoforge/common/data/JsonCodecProvider.java b/src/main/java/net/neoforged/neoforge/common/data/JsonCodecProvider.java index 568fd674d9f..db097c5d3dd 100644 --- a/src/main/java/net/neoforged/neoforge/common/data/JsonCodecProvider.java +++ b/src/main/java/net/neoforged/neoforge/common/data/JsonCodecProvider.java @@ -35,7 +35,7 @@ /** *

Dataprovider for using a Codec to generate jsons. * Path names for jsons are derived from the given registry folder and each entry's namespaced id, in the format:

- * + * *
  * {@code /entryid/registryfolder/entrypath.json }
  * 
diff --git a/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional.json b/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional.json index bd1dc49321d..e898f5f296e 100644 --- a/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional.json +++ b/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional.json @@ -11,11 +11,11 @@ } }, { - "type": "neoforge:item_exists", - "item": "minecraft:dirt" + "type": "neoforge:registered", + "value": "minecraft:dirt" }, { - "type": "neoforge:false" + "type": "neoforge:never" } ] } diff --git a/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional2.json b/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional2.json index 46393dcedd7..f7eafd37f47 100644 --- a/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional2.json +++ b/tests/src/generated/resources/data/data_gen_test/advancement/recipes/building_blocks/conditional2.json @@ -13,11 +13,11 @@ } }, { - "type": "neoforge:item_exists", - "item": "minecraft:dirt" + "type": "neoforge:registered", + "value": "minecraft:dirt" }, { - "type": "neoforge:false" + "type": "neoforge:never" } ] } diff --git a/tests/src/generated/resources/data/data_gen_test/recipe/conditional.json b/tests/src/generated/resources/data/data_gen_test/recipe/conditional.json index ca3003e4dbf..eef01fd11ad 100644 --- a/tests/src/generated/resources/data/data_gen_test/recipe/conditional.json +++ b/tests/src/generated/resources/data/data_gen_test/recipe/conditional.json @@ -11,11 +11,11 @@ } }, { - "type": "neoforge:item_exists", - "item": "minecraft:dirt" + "type": "neoforge:registered", + "value": "minecraft:dirt" }, { - "type": "neoforge:false" + "type": "neoforge:never" } ] } diff --git a/tests/src/generated/resources/data/data_gen_test/recipe/conditional2.json b/tests/src/generated/resources/data/data_gen_test/recipe/conditional2.json index a50fcb08dce..7a07d04ebb2 100644 --- a/tests/src/generated/resources/data/data_gen_test/recipe/conditional2.json +++ b/tests/src/generated/resources/data/data_gen_test/recipe/conditional2.json @@ -13,11 +13,11 @@ } }, { - "type": "neoforge:item_exists", - "item": "minecraft:dirt" + "type": "neoforge:registered", + "value": "minecraft:dirt" }, { - "type": "neoforge:false" + "type": "neoforge:never" } ] } diff --git a/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_false.json b/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_false.json index f898cd2a2b1..8dff30b1303 100644 --- a/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_false.json +++ b/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_false.json @@ -1,7 +1,7 @@ { "neoforge:conditions": [ { - "type": "neoforge:false" + "type": "neoforge:never" } ], "effects": "burning", diff --git a/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_true.json b/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_true.json index 560b347cecb..a58d2290db3 100644 --- a/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_true.json +++ b/tests/src/generated/resources/data/neotests_conditional_datapack_entries/damage_type/conditional_true.json @@ -1,7 +1,7 @@ { "neoforge:conditions": [ { - "type": "neoforge:true" + "type": "neoforge:always" } ], "effects": "burning", diff --git a/tests/src/generated/resources/data/neotests_test_conditional_recipe/advancement/recipes/misc/always_disabled_recipe.json b/tests/src/generated/resources/data/neotests_test_conditional_recipe/advancement/recipes/misc/always_disabled_recipe.json index e13d7504ae4..37ada19d900 100644 --- a/tests/src/generated/resources/data/neotests_test_conditional_recipe/advancement/recipes/misc/always_disabled_recipe.json +++ b/tests/src/generated/resources/data/neotests_test_conditional_recipe/advancement/recipes/misc/always_disabled_recipe.json @@ -1,7 +1,7 @@ { "neoforge:conditions": [ { - "type": "neoforge:false" + "type": "neoforge:never" } ], "parent": "minecraft:recipes/root", diff --git a/tests/src/generated/resources/data/neotests_test_conditional_recipe/recipe/always_disabled_recipe.json b/tests/src/generated/resources/data/neotests_test_conditional_recipe/recipe/always_disabled_recipe.json index 404842c8133..cd22632a3b1 100644 --- a/tests/src/generated/resources/data/neotests_test_conditional_recipe/recipe/always_disabled_recipe.json +++ b/tests/src/generated/resources/data/neotests_test_conditional_recipe/recipe/always_disabled_recipe.json @@ -1,7 +1,7 @@ { "neoforge:conditions": [ { - "type": "neoforge:false" + "type": "neoforge:never" } ], "type": "minecraft:crafting_shapeless", diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/ConditionalRecipeTest.java b/tests/src/main/java/net/neoforged/neoforge/debug/ConditionalRecipeTest.java index fde67adaf81..44d0c64cfdd 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/ConditionalRecipeTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/ConditionalRecipeTest.java @@ -13,7 +13,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; -import net.neoforged.neoforge.common.conditions.FalseCondition; +import net.neoforged.neoforge.common.conditions.NeoForgeConditions; import net.neoforged.neoforge.event.server.ServerStartedEvent; import net.neoforged.testframework.DynamicTest; import net.neoforged.testframework.annotation.ForEachTest; @@ -38,7 +38,7 @@ protected void buildRecipes() { .requires(Items.STONE) .unlockedBy("has_stone", has(Items.STONE)) // false condition to have this recipe always disabled - .save(output.withConditions(FalseCondition.INSTANCE), recipeName); + .save(output.withConditions(NeoForgeConditions.never()), recipeName); } }; } diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/data/CustomFeatureFlagsTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/data/CustomFeatureFlagsTests.java index 090309ffca7..e226e739b11 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/data/CustomFeatureFlagsTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/data/CustomFeatureFlagsTests.java @@ -23,7 +23,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.common.conditions.IConditionBuilder; +import net.neoforged.neoforge.common.conditions.NeoForgeConditions; import net.neoforged.neoforge.event.AddPackFindersEvent; import net.neoforged.neoforge.event.server.ServerStartedEvent; import net.neoforged.neoforge.registries.DeferredItem; @@ -113,21 +113,16 @@ static void testFlagCondition(DynamicTest test, RegistrationHelper reg) { reg.addClientProvider(event -> new RecipeProvider.Runner(event.getGenerator().getPackOutput(), event.getLookupProvider()) { @Override protected RecipeProvider createRecipeProvider(HolderLookup.Provider registries, RecipeOutput output) { - class Provider extends RecipeProvider implements IConditionBuilder { - protected Provider(HolderLookup.Provider p_360573_, RecipeOutput p_360872_) { - super(p_360573_, p_360872_); - } - + return new RecipeProvider(registries, output) { @Override protected void buildRecipes() { // recipe available when above flag is enabled shapeless(RecipeCategory.MISC, Items.DIAMOND) .requires(ItemTags.DIRT) .unlockedBy("has_dirt", has(ItemTags.DIRT)) - .save(output.withConditions(featureFlagsEnabled(flag)), enabledRecipeName); + .save(output.withConditions(NeoForgeConditions.featureFlagsEnabled(flag)), enabledRecipeName); } - } - return new Provider(registries, output); + }; } @Override diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/data/registries/DatapackEntryTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/data/registries/DatapackEntryTests.java index 3d117368723..97474787aca 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/data/registries/DatapackEntryTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/data/registries/DatapackEntryTests.java @@ -13,8 +13,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.damagesource.DamageEffects; import net.minecraft.world.damagesource.DamageType; -import net.neoforged.neoforge.common.conditions.FalseCondition; -import net.neoforged.neoforge.common.conditions.TrueCondition; +import net.neoforged.neoforge.common.conditions.NeoForgeConditions; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.testframework.DynamicTest; import net.neoforged.testframework.annotation.ForEachTest; @@ -46,8 +45,8 @@ static void conditionalDatapackEntries(final DynamicTest test, final Registratio event.getLookupProvider(), builder, conditions -> { - conditions.accept(CONDITIONAL_FALSE_DAMAGE_TYPE, FalseCondition.INSTANCE); - conditions.accept(CONDITIONAL_TRUE_DAMAGE_TYPE, TrueCondition.INSTANCE); + conditions.accept(CONDITIONAL_FALSE_DAMAGE_TYPE, NeoForgeConditions.never()); + conditions.accept(CONDITIONAL_TRUE_DAMAGE_TYPE, NeoForgeConditions.always()); }, Set.of(reg.modId()))); diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java index 43723c7ca55..04c67f57a69 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java @@ -116,8 +116,7 @@ import net.neoforged.neoforge.client.model.generators.ModelFile.UncheckedModelFile; import net.neoforged.neoforge.client.model.generators.MultiPartBlockStateBuilder; import net.neoforged.neoforge.client.model.generators.VariantBlockStateBuilder; -import net.neoforged.neoforge.common.conditions.IConditionBuilder; -import net.neoforged.neoforge.common.conditions.ModLoadedCondition; +import net.neoforged.neoforge.common.conditions.NeoForgeConditions; import net.neoforged.neoforge.common.conditions.WithConditions; import net.neoforged.neoforge.common.crafting.CompoundIngredient; import net.neoforged.neoforge.common.crafting.DifferenceIngredient; @@ -132,6 +131,7 @@ import net.neoforged.neoforge.common.data.SoundDefinition; import net.neoforged.neoforge.common.data.SoundDefinitionsProvider; import net.neoforged.neoforge.data.event.GatherDataEvent; +import net.neoforged.neoforge.internal.versions.neoforge.NeoForgeVersion; import org.apache.commons.lang3.tuple.Triple; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -168,8 +168,8 @@ public static void gatherData(GatherDataEvent.Client event) { new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "neoforge_overlays_test"))))) .add(GeneratingOverlayMetadataSection.TYPE, new GeneratingOverlayMetadataSection(List.of( new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "pack_overlays_test")), - new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "conditional_overlays_enabled"), new ModLoadedCondition("neoforge")), - new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "conditional_overlays_enabled"), new ModLoadedCondition("does_not_exist"))))) + new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "conditional_overlays_enabled"), NeoForgeConditions.modLoaded(NeoForgeVersion.MOD_ID)), + new WithConditions<>(new OverlayMetadataSection.OverlayEntry(new InclusiveRange<>(0, Integer.MAX_VALUE), "conditional_overlays_enabled"), NeoForgeConditions.modLoaded("does_not_exist"))))) .add(PackMetadataSection.TYPE, new PackMetadataSection( Component.literal("NeoForge tests resource pack"), DetectedVersion.BUILT_IN.getPackVersion(PackType.CLIENT_RESOURCES), @@ -198,7 +198,7 @@ public static void levelStem(BootstrapContext context) { context.register(TEST_LEVEL_STEM, levelStem); } - public static class Recipes extends RecipeProvider implements IConditionBuilder { + public static class Recipes extends RecipeProvider { public Recipes(HolderLookup.Provider registries, RecipeOutput output) { super(registries, output); } @@ -219,10 +219,10 @@ protected void buildRecipes() { .unlockedBy("has_dirt", has(Blocks.DIRT)) .save( output.withConditions( - and( - not(modLoaded("minecraft")), - itemExists("minecraft", "dirt"), - FALSE())), + NeoForgeConditions.and( + NeoForgeConditions.not(NeoForgeConditions.modLoaded("minecraft")), + NeoForgeConditions.itemRegistered("minecraft", "dirt"), + NeoForgeConditions.never())), recipeKey("conditional")); this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.DIAMOND_BLOCK, 64) @@ -234,11 +234,11 @@ protected void buildRecipes() { .unlockedBy("has_dirt", has(Blocks.DIRT)) .save( output.withConditions( - not( - and( - not(modLoaded("minecraft")), - itemExists("minecraft", "dirt"), - FALSE()))), + NeoForgeConditions.not( + NeoForgeConditions.and( + NeoForgeConditions.not(NeoForgeConditions.modLoaded("minecraft")), + NeoForgeConditions.itemRegistered("minecraft", "dirt"), + NeoForgeConditions.never()))), recipeKey("conditional2")); this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.NETHERITE_BLOCK, 1) @@ -249,7 +249,7 @@ protected void buildRecipes() { .unlockedBy("has_diamond_block", has(Blocks.DIAMOND_BLOCK)) .save( output.withConditions( - tagEmpty(ItemTags.PLANKS)), + NeoForgeConditions.tagEmpty(ItemTags.PLANKS)), recipeKey("conditional3")); this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.NETHERITE_BLOCK, 9) @@ -260,7 +260,7 @@ protected void buildRecipes() { .unlockedBy("has_diamond_block", has(Blocks.DIAMOND_BLOCK)) .save( output.withConditions( - not(tagEmpty(ItemTags.PLANKS))), + NeoForgeConditions.not(NeoForgeConditions.tagEmpty(ItemTags.PLANKS))), recipeKey("conditional4")); // intersection - should match all non-flammable planks diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/conditions/ConditionalCodecTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/conditions/ConditionalCodecTest.java index e08b925d204..bfc23f2f40c 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/conditions/ConditionalCodecTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/conditions/ConditionalCodecTest.java @@ -20,7 +20,7 @@ import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.common.conditions.ConditionalOps; -import net.neoforged.neoforge.common.conditions.TrueCondition; +import net.neoforged.neoforge.common.conditions.NeoForgeConditions; import net.neoforged.neoforge.common.conditions.WithConditions; import org.slf4j.Logger; @@ -77,7 +77,7 @@ public static void testReadMatchingConditions() { JsonElement json = read(""" { "neoforge:conditions": [ - { "type": "neoforge:true" } + { "type": "neoforge:always" } ], "i": 1, "s": "test" @@ -91,7 +91,7 @@ public static void testReadFailingConditions() { JsonElement json = read(""" { "neoforge:conditions": [ - { "type": "neoforge:false" } + { "type": "neoforge:never" } ], "i": 1, "s": "test" @@ -109,7 +109,7 @@ public static void testReadNested() { JsonElement json = read(""" { "neoforge:conditions": [ - { "type": "neoforge:true" } + { "type": "neoforge:always" } ], "neoforge:value": { "i": 1, @@ -136,12 +136,12 @@ public static void testWriteWithConditions() { { "neoforge:conditions": [ { - "type": "neoforge:true" + "type": "neoforge:always" } ], "i": 1, "s": "test" - }""", write(SimpleRecord.CONDITIONS_CODEC, Optional.of(WithConditions.builder(record).addCondition(TrueCondition.INSTANCE).build()))); + }""", write(SimpleRecord.CONDITIONS_CODEC, Optional.of(WithConditions.builder(record).addCondition(NeoForgeConditions.always()).build()))); } private record SimpleRecord(int i, String s) { @@ -184,7 +184,7 @@ public static void testReadMatchingConditions() { JsonElement json = read(""" { "neoforge:conditions": [ - { "type": "neoforge:true" } + { "type": "neoforge:always" } ], "neoforge:value": 1 } @@ -197,7 +197,7 @@ public static void testReadFailingConditions() { JsonElement json = read(""" { "neoforge:conditions": [ - { "type": "neoforge:false" } + { "type": "neoforge:never" } ], "i": 1, "s": "test" @@ -219,11 +219,11 @@ public static void testWriteWithConditions() { { "neoforge:conditions": [ { - "type": "neoforge:true" + "type": "neoforge:always" } ], "neoforge:value": 1 - }""", write(CONDITIONS_INT, Optional.of(WithConditions.builder(1).addCondition(TrueCondition.INSTANCE).build()))); + }""", write(CONDITIONS_INT, Optional.of(WithConditions.builder(1).addCondition(NeoForgeConditions.always()).build()))); } }