From 13eda06580927eb37ddddd684149fa410be744e2 Mon Sep 17 00:00:00 2001 From: deirn <deirn@bai.lol> Date: Mon, 17 Jan 2022 19:11:19 +0700 Subject: [PATCH] Fix tags_populated conditions not working (#1957) closes #1954 --- .../v1/DefaultResourceConditions.java | 10 ++--- .../conditions/ResourceConditionsImpl.java | 10 +++-- .../conditions/JsonDataLoaderMixin.java | 12 +++--- ...inglePreparationResourceReloaderMixin.java | 38 +++++++++++++++++++ ...ric-resource-conditions-api-v1.mixins.json | 3 +- .../conditions/ConditionalResourcesTest.java | 6 ++- .../recipes/item_tags_populated.json | 19 ++++++++++ .../tags/items/test_condition.json | 6 +++ .../src/testmod/resources/fabric.mod.json | 2 +- 9 files changed, 86 insertions(+), 20 deletions(-) create mode 100644 fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/SinglePreparationResourceReloaderMixin.java create mode 100644 fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/recipes/item_tags_populated.json create mode 100644 fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/tags/items/test_condition.json diff --git a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/DefaultResourceConditions.java b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/DefaultResourceConditions.java index 63afea2f6..bef3d4386 100644 --- a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/DefaultResourceConditions.java +++ b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/DefaultResourceConditions.java @@ -22,12 +22,10 @@ import com.google.gson.JsonObject; import net.minecraft.block.Block; import net.minecraft.fluid.Fluid; import net.minecraft.item.Item; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.FluidTags; -import net.minecraft.tag.ItemTags; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; +import net.minecraft.util.registry.Registry; import net.fabricmc.fabric.impl.resource.conditions.ResourceConditionsImpl; @@ -129,9 +127,9 @@ public final class DefaultResourceConditions { }); ResourceConditions.register(ALL_MODS_LOADED, object -> ResourceConditionsImpl.modsLoadedMatch(object, true)); ResourceConditions.register(ANY_MOD_LOADED, object -> ResourceConditionsImpl.modsLoadedMatch(object, false)); - ResourceConditions.register(BLOCK_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, BlockTags.getTagGroup())); - ResourceConditions.register(FLUID_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, FluidTags.getTagGroup())); - ResourceConditions.register(ITEM_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, ItemTags.getTagGroup())); + ResourceConditions.register(BLOCK_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, Registry.BLOCK_KEY)); + ResourceConditions.register(FLUID_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, Registry.FLUID_KEY)); + ResourceConditions.register(ITEM_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, Registry.ITEM_KEY)); } private DefaultResourceConditions() { diff --git a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/impl/resource/conditions/ResourceConditionsImpl.java b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/impl/resource/conditions/ResourceConditionsImpl.java index 4ee49128e..0a81fa8a4 100644 --- a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/impl/resource/conditions/ResourceConditionsImpl.java +++ b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/impl/resource/conditions/ResourceConditionsImpl.java @@ -25,10 +25,12 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; +import net.minecraft.tag.ServerTagManagerHolder; import net.minecraft.tag.Tag; -import net.minecraft.tag.TagGroup; import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryKey; import net.fabricmc.fabric.api.resource.conditions.v1.ConditionJsonProvider; import net.fabricmc.loader.api.FabricLoader; @@ -123,15 +125,15 @@ public class ResourceConditionsImpl { return and; } - public static <T> boolean tagsPopulatedMatch(JsonObject object, TagGroup<T> tagGroup) { + public static <T> boolean tagsPopulatedMatch(JsonObject object, RegistryKey<? extends Registry<T>> registryKey) { JsonArray array = JsonHelper.getArray(object, "values"); for (JsonElement element : array) { if (element.isJsonPrimitive()) { Identifier id = new Identifier(element.getAsString()); - Tag<T> tag = tagGroup.getTag(id); + Tag<T> tag = ServerTagManagerHolder.getTagManager().getOrCreateTagGroup(registryKey).getTagOrEmpty(id); - if (tag == null || tag.values().size() == 0) { + if (tag.values().isEmpty()) { return false; } } else { diff --git a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/JsonDataLoaderMixin.java b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/JsonDataLoaderMixin.java index b4e67b62e..49a1caf65 100644 --- a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/JsonDataLoaderMixin.java +++ b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/JsonDataLoaderMixin.java @@ -24,9 +24,6 @@ import com.google.gson.JsonObject; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.resource.JsonDataLoader; import net.minecraft.resource.ResourceManager; @@ -37,16 +34,17 @@ import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditions; import net.fabricmc.fabric.impl.resource.conditions.ResourceConditionsImpl; @Mixin(JsonDataLoader.class) -public class JsonDataLoaderMixin { +public class JsonDataLoaderMixin extends SinglePreparationResourceReloaderMixin { @Shadow @Final private String dataType; - @Inject(at = @At("RETURN"), method = "prepare") - public void applyResourceConditions(ResourceManager resourceManager, Profiler profiler, CallbackInfoReturnable<Map<Identifier, JsonElement>> cir) { + @Override + @SuppressWarnings("unchecked") + protected void fabric_applyResourceConditions(ResourceManager resourceManager, Profiler profiler, Object object) { profiler.push("Fabric resource conditions: %s".formatted(dataType)); - Iterator<Map.Entry<Identifier, JsonElement>> it = cir.getReturnValue().entrySet().iterator(); + Iterator<Map.Entry<Identifier, JsonElement>> it = ((Map<Identifier, JsonElement>) object).entrySet().iterator(); boolean debugLogEnabled = ResourceConditionsImpl.LOGGER.isDebugEnabled(); while (it.hasNext()) { diff --git a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/SinglePreparationResourceReloaderMixin.java b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/SinglePreparationResourceReloaderMixin.java new file mode 100644 index 000000000..de03e19c4 --- /dev/null +++ b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/SinglePreparationResourceReloaderMixin.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.resource.conditions; + +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.CallbackInfo; + +import net.minecraft.resource.ResourceManager; +import net.minecraft.resource.SinglePreparationResourceReloader; +import net.minecraft.util.profiler.Profiler; + +@Mixin(SinglePreparationResourceReloader.class) +public class SinglePreparationResourceReloaderMixin { + // thenAcceptAsync in reload + @Inject(at = @At("HEAD"), method = "method_18790") + private void applyResourceConditions(ResourceManager resourceManager, Profiler profiler, Object object, CallbackInfo ci) { + fabric_applyResourceConditions(resourceManager, profiler, object); + } + + protected void fabric_applyResourceConditions(ResourceManager resourceManager, Profiler profiler, Object object) { + } +} diff --git a/fabric-resource-conditions-api-v1/src/main/resources/fabric-resource-conditions-api-v1.mixins.json b/fabric-resource-conditions-api-v1/src/main/resources/fabric-resource-conditions-api-v1.mixins.json index 7f8e9d7b8..7d98aef51 100644 --- a/fabric-resource-conditions-api-v1/src/main/resources/fabric-resource-conditions-api-v1.mixins.json +++ b/fabric-resource-conditions-api-v1/src/main/resources/fabric-resource-conditions-api-v1.mixins.json @@ -3,6 +3,7 @@ "package": "net.fabricmc.fabric.mixin.resource.conditions", "compatibilityLevel": "JAVA_16", "mixins": [ - "JsonDataLoaderMixin" + "JsonDataLoaderMixin", + "SinglePreparationResourceReloaderMixin" ] } diff --git a/fabric-resource-conditions-api-v1/src/testmod/java/net/fabricmc/fabric/test/resource/conditions/ConditionalResourcesTest.java b/fabric-resource-conditions-api-v1/src/testmod/java/net/fabricmc/fabric/test/resource/conditions/ConditionalResourcesTest.java index 4a7836bb9..b23a0adcc 100644 --- a/fabric-resource-conditions-api-v1/src/testmod/java/net/fabricmc/fabric/test/resource/conditions/ConditionalResourcesTest.java +++ b/fabric-resource-conditions-api-v1/src/testmod/java/net/fabricmc/fabric/test/resource/conditions/ConditionalResourcesTest.java @@ -42,8 +42,12 @@ public class ConditionalResourcesTest { throw new AssertionError("loaded recipe should have been loaded."); } + if (manager.get(id("item_tags_populated")).isEmpty()) { + throw new AssertionError("item_tags_populated recipe should have been loaded."); + } + long loadedRecipes = manager.values().stream().filter(r -> r.getId().getNamespace().equals(MOD_ID)).count(); - if (loadedRecipes != 1) throw new AssertionError("Unexpected loaded recipe count: " + loadedRecipes); + if (loadedRecipes != 2) throw new AssertionError("Unexpected loaded recipe count: " + loadedRecipes); context.complete(); } diff --git a/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/recipes/item_tags_populated.json b/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/recipes/item_tags_populated.json new file mode 100644 index 000000000..dd186a524 --- /dev/null +++ b/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/recipes/item_tags_populated.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "fabric-resource-conditions-api-v1-testmod:test_condition" + } + ], + "result": { + "item": "minecraft:diamond" + }, + "fabric:load_conditions": [ + { + "condition": "fabric:item_tags_populated", + "values": [ + "fabric-resource-conditions-api-v1-testmod:test_condition" + ] + } + ] +} diff --git a/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/tags/items/test_condition.json b/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/tags/items/test_condition.json new file mode 100644 index 000000000..653f3b1fb --- /dev/null +++ b/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/tags/items/test_condition.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "minecraft:dirt" + ] +} diff --git a/fabric-resource-conditions-api-v1/src/testmod/resources/fabric.mod.json b/fabric-resource-conditions-api-v1/src/testmod/resources/fabric.mod.json index 35da07b0c..4945a53ec 100644 --- a/fabric-resource-conditions-api-v1/src/testmod/resources/fabric.mod.json +++ b/fabric-resource-conditions-api-v1/src/testmod/resources/fabric.mod.json @@ -6,7 +6,7 @@ "environment": "*", "license": "Apache-2.0", "depends": { - "fabric-api-lookup-api-v1": "*" + "fabric-resource-conditions-api-v1": "*" }, "entrypoints": { "fabric-gametest": [