From d7dda9e960fd838115d93bf31c048460a4bd4129 Mon Sep 17 00:00:00 2001 From: cpw Date: Mon, 10 Oct 2016 13:41:40 -0400 Subject: [PATCH] Fix substitutions being broken after freezing - actually store the original state in registry copies, not the computed state, which is wrong because it only sees the sub, not the original. --- .../FMLControlledNamespacedRegistry.java | 2 ++ .../registry/SubstitutionInjectionTest.java | 30 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraftforge/fml/common/registry/FMLControlledNamespacedRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/FMLControlledNamespacedRegistry.java index c7c1993c33..2bdbc2516e 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/FMLControlledNamespacedRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/FMLControlledNamespacedRegistry.java @@ -195,6 +195,8 @@ public class FMLControlledNamespacedRegistry> e { activateSubstitution(resloc); } + this.substitutionOriginals.clear(); + this.substitutionOriginals.putAll(otherRegistry.substitutionOriginals); } // public api diff --git a/src/test/java/net/minecraftforge/fml/common/registry/SubstitutionInjectionTest.java b/src/test/java/net/minecraftforge/fml/common/registry/SubstitutionInjectionTest.java index 84bc10a4ac..b110aa8237 100644 --- a/src/test/java/net/minecraftforge/fml/common/registry/SubstitutionInjectionTest.java +++ b/src/test/java/net/minecraftforge/fml/common/registry/SubstitutionInjectionTest.java @@ -27,7 +27,11 @@ public class SubstitutionInjectionTest { private ResourceLocation myDirt = new ResourceLocation("minecraft:dirt"); private BlockDirt toSub = new BlockDirt() { - + @Override + public String toString() + { + return "SUB" + super.toString() + "SUB"; + } }; @BeforeClass @@ -103,5 +107,29 @@ public class SubstitutionInjectionTest assertEquals("Got my dirt substitute - registry", toSub, fnd); dirtitem = (ItemBlock)itemRegistry.getValue(myDirt); assertEquals("ItemBlock points at my block", toSub, dirtitem.block); + + // TEST 2 repeat: Does the substitute get injected when told by loading operation? The substitute should be found in the registry + PersistentRegistryManager.injectSnapshot(snapshot, true, true); + ObjectHolderRegistry.INSTANCE.applyObjectHolders(); + fnd = blockRegistry.getValue(myDirt); + currDirt = Blocks.DIRT; + assertEquals("Got my dirt substitute - Blocks", toSub, currDirt); + assertEquals("Got my dirt substitute - Blocks and registry", currDirt, fnd); + assertEquals("Got my dirt substitute - registry", toSub, fnd); + + dirtitem = (ItemBlock)itemRegistry.getValue(myDirt); + assertEquals("ItemBlock points at my block", toSub, dirtitem.block); + + // TEST 3 repeat: Does the substitute get restored when reverting to frozen state? The substitute should be found in the registry again + PersistentRegistryManager.revertToFrozen(); + ObjectHolderRegistry.INSTANCE.applyObjectHolders(); + fnd = blockRegistry.getValue(myDirt); + currDirt = Blocks.DIRT; + assertEquals("Got my dirt substitute - Blocks", toSub, currDirt); + assertEquals("Got my dirt substitute - Blocks and registry", currDirt, fnd); + assertEquals("Got my dirt substitute - registry", toSub, fnd); + dirtitem = (ItemBlock)itemRegistry.getValue(myDirt); + assertEquals("ItemBlock points at my block", toSub, dirtitem.block); + } }