diff --git a/patches/minecraft/net/minecraft/server/ReloadableServerResources.java.patch b/patches/minecraft/net/minecraft/server/ReloadableServerResources.java.patch index 5385db346e..e4c0cf1d5b 100644 --- a/patches/minecraft/net/minecraft/server/ReloadableServerResources.java.patch +++ b/patches/minecraft/net/minecraft/server/ReloadableServerResources.java.patch @@ -27,7 +27,7 @@ p_358539_.layers(), p_358539_.lookupWithUpdatedTags(), p_250212_, p_249301_, p_366334_, p_251126_ ); + var listeners = new java.util.ArrayList<>(reloadableserverresources.listeners()); -+ listeners.addAll(net.minecraftforge.event.ForgeEventFactory.onResourceReload(reloadableserverresources, p_330376_.compositeAccess())); ++ listeners.addAll(net.minecraftforge.event.ForgeEventFactory.onResourceReload(reloadableserverresources, p_358539_.lookupWithUpdatedTags(), p_330376_.compositeAccess())); return SimpleReloadInstance.create( - p_248588_, reloadableserverresources.listeners(), p_249136_, p_249601_, DATA_RELOAD_INITIAL_TASK, LOGGER.isDebugEnabled() + p_248588_, listeners, p_249136_, p_249601_, DATA_RELOAD_INITIAL_TASK, LOGGER.isDebugEnabled() diff --git a/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java b/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java index b0b75292d5..d1f61cf717 100644 --- a/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java +++ b/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java @@ -94,7 +94,7 @@ public class ForgeInternalHandler { @SubscribeEvent public void onResourceReload(AddReloadListenerEvent event) { - INSTANCE = new LootModifierManager(event.getRegistryAccess()); + INSTANCE = new LootModifierManager(event.getRegistries()); event.addListener(INSTANCE); } diff --git a/src/main/java/net/minecraftforge/event/AddReloadListenerEvent.java b/src/main/java/net/minecraftforge/event/AddReloadListenerEvent.java index db4a53195d..bc78f32a1a 100644 --- a/src/main/java/net/minecraftforge/event/AddReloadListenerEvent.java +++ b/src/main/java/net/minecraftforge/event/AddReloadListenerEvent.java @@ -6,7 +6,10 @@ package net.minecraftforge.event; import com.google.common.collect.ImmutableList; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.LayeredRegistryAccess; import net.minecraft.core.RegistryAccess; +import net.minecraft.server.RegistryLayer; import net.minecraft.server.ReloadableServerResources; import net.minecraft.server.packs.resources.PreparableReloadListener; import net.minecraft.server.packs.resources.ResourceManager; @@ -29,10 +32,31 @@ import java.util.concurrent.Executor; public class AddReloadListenerEvent extends Event { private final List listeners = new ArrayList<>(); private final ReloadableServerResources serverResources; + + private final HolderLookup.Provider registries; + @Deprecated(forRemoval = true, since = "1.21.4") private final RegistryAccess registryAccess; - public AddReloadListenerEvent(ReloadableServerResources serverResources, RegistryAccess registryAccess) { + /** @deprecated Does not provide additional context. Use {@link #AddReloadListenerEvent(ReloadableServerResources, HolderLookup.Provider, RegistryAccess)} instead. */ + @Deprecated(forRemoval = true, since = "1.21.4") + public AddReloadListenerEvent( + ReloadableServerResources serverResources, + RegistryAccess registryAccess + ) { + this( + serverResources, + registryAccess, + registryAccess + ); + } + + public AddReloadListenerEvent( + ReloadableServerResources serverResources, + HolderLookup.Provider registries, + @Deprecated(forRemoval = true, since = "1.21.4") RegistryAccess registryAccess + ) { this.serverResources = serverResources; + this.registries = registries; this.registryAccess = registryAccess; } @@ -62,21 +86,27 @@ public class AddReloadListenerEvent extends Event { return serverResources.getConditionContext(); } + /** + * @return A holder lookup provider containing the registries with updated tags. + * + * @see net.minecraft.server.ReloadableServerRegistries.LoadResult#lookupWithUpdatedTags() + */ + public HolderLookup.Provider getRegistries() { + return registries; + } + /** * Provides access to the loaded registries associated with these server resources. * All built-in and dynamic registries are loaded and frozen by this point. * @return The RegistryAccess context for the currently active reload. + * @deprecated Does not contain updated tags. Use {@link #getRegistries()} instead. */ + @Deprecated(forRemoval = true, since = "1.21.4") public RegistryAccess getRegistryAccess() { return registryAccess; } - private static class WrappedStateAwareListener implements PreparableReloadListener { - private final PreparableReloadListener wrapped; - - private WrappedStateAwareListener(final PreparableReloadListener wrapped) { - this.wrapped = wrapped; - } + private record WrappedStateAwareListener(PreparableReloadListener wrapped) implements PreparableReloadListener { @Override public CompletableFuture reload(final PreparationBarrier stage, final ResourceManager resourceManager, final Executor backgroundExecutor, final Executor gameExecutor) { @@ -85,5 +115,10 @@ public class AddReloadListenerEvent extends Event { else return CompletableFuture.completedFuture(null); } + + @Override + public String getName() { + return wrapped.getName(); + } } } diff --git a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java index 3d51a53c6f..493e076a29 100644 --- a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java +++ b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java @@ -14,7 +14,10 @@ import java.util.Optional; import java.util.function.BooleanSupplier; import java.util.function.Consumer; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.LayeredRegistryAccess; import net.minecraft.core.component.DataComponentMap; +import net.minecraft.server.RegistryLayer; import net.minecraft.world.entity.*; import net.minecraft.world.item.Item; import net.minecraft.world.level.chunk.storage.SerializableChunkData; @@ -712,10 +715,15 @@ public final class ForgeEventFactory { return fire(new SleepFinishedTimeEvent(level, newTime, minTime)).getNewTime(); } + @Deprecated(forRemoval = true, since = "1.21.4") public static List onResourceReload(ReloadableServerResources serverResources, RegistryAccess registryAccess) { return fire(new AddReloadListenerEvent(serverResources, registryAccess)).getListeners(); } + public static List onResourceReload(ReloadableServerResources serverResources, HolderLookup.Provider lookupProvider, @Deprecated(forRemoval = true, since = "1.21.4") RegistryAccess registryAccess) { + return fire(new AddReloadListenerEvent(serverResources, lookupProvider, registryAccess)).getListeners(); + } + public static void onCommandRegister(CommandDispatcher dispatcher, Commands.CommandSelection environment, CommandBuildContext context) { post(new RegisterCommandsEvent(dispatcher, environment, context)); } diff --git a/src/test/generated/global_loot_test/data/global_loot_test/loot_modifiers/wheat_harvest.json b/src/test/generated/global_loot_test/data/global_loot_test/loot_modifiers/wheat_harvest.json index 90e8896d15..87b8ed0091 100644 --- a/src/test/generated/global_loot_test/data/global_loot_test/loot_modifiers/wheat_harvest.json +++ b/src/test/generated/global_loot_test/data/global_loot_test/loot_modifiers/wheat_harvest.json @@ -4,7 +4,7 @@ { "condition": "minecraft:match_tool", "predicate": { - "items": "minecraft:shears" + "items": "#c:tools/shear" } }, { diff --git a/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java b/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java index 96de0e9bb9..ff5c4968ca 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java @@ -54,6 +54,7 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.level.storage.loot.predicates.MatchTool; +import net.minecraftforge.common.Tags; import net.minecraftforge.common.crafting.conditions.IConditionBuilder; import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; import net.minecraftforge.common.data.GlobalLootModifierProvider; @@ -231,7 +232,8 @@ public class GlobalLootModifiersTest extends BaseTestMod { // This has no game test because it relies on random number generation and I can't be bothered to try and force that right now. add("wheat_harvest", new WheatSeedsConverterModifier( new LootItemCondition[] { - MatchTool.toolMatches(ItemPredicate.Builder.item().of(items, Items.SHEARS)).build(), + // the #c:tools_shear tag is used here to test parsing of tags in LootModiferManager + MatchTool.toolMatches(ItemPredicate.Builder.item().of(items, Tags.Items.TOOLS_SHEAR)).build(), LootItemBlockStatePropertyCondition.hasBlockStateProperties(Blocks.WHEAT).build() }, 3, Items.WHEAT_SEEDS, Items.WHEAT)