From 359ac3ca2a941d70709168fbbbc0725c861668dd Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 1 Feb 2014 11:05:33 +0000 Subject: [PATCH] Ensure we check both item and block registries when finding valid IDs. Should fix #365 --- .../FMLControlledNamespacedRegistry.java | 7 ++++++- .../cpw/mods/fml/common/registry/GameData.java | 17 +++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/cpw/mods/fml/common/registry/FMLControlledNamespacedRegistry.java b/src/main/java/cpw/mods/fml/common/registry/FMLControlledNamespacedRegistry.java index 1a411a2e8a..b5cc9f16b3 100644 --- a/src/main/java/cpw/mods/fml/common/registry/FMLControlledNamespacedRegistry.java +++ b/src/main/java/cpw/mods/fml/common/registry/FMLControlledNamespacedRegistry.java @@ -107,7 +107,7 @@ public class FMLControlledNamespacedRegistry extends RegistryNamespaced { private Map transactionalNamedIds; private BitSet transactionalAvailabilityMap; private BitSet availabilityMap; - private int maxId; + int maxId; private int minId; private char discriminator; @@ -316,4 +316,9 @@ public class FMLControlledNamespacedRegistry extends RegistryNamespaced { FMLLog.finer("Registry : %s %d %s", name, entry.getValue(), thing); } } + + BitSet slots() + { + return (BitSet) availabilityMap.clone(); + } } diff --git a/src/main/java/cpw/mods/fml/common/registry/GameData.java b/src/main/java/cpw/mods/fml/common/registry/GameData.java index f389f6d84e..51be73e727 100644 --- a/src/main/java/cpw/mods/fml/common/registry/GameData.java +++ b/src/main/java/cpw/mods/fml/common/registry/GameData.java @@ -14,6 +14,7 @@ package cpw.mods.fml.common.registry; import java.io.File; import java.io.IOException; +import java.util.BitSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -157,11 +158,19 @@ public class GameData { { customOwners.put(new UniqueIdentifier(modId, name), mc); } - int blockId = blockRegistry.add(0, name, block); - int itemId = itemRegistry.add(blockId, name, item); - if (itemId != blockId) + BitSet blockAvailability = blockRegistry.slots(); + BitSet itemAvailability = itemRegistry.slots(); + blockAvailability.or(itemAvailability); + int blockId = blockAvailability.nextClearBit(0); + if (blockId >= blockRegistry.maxId) { - throw new RuntimeException(); + throw new RuntimeException(String.format("No more space for block allocations: used %d block ids", blockId -1)); + } + int actualBlockId = blockRegistry.add(blockId, name, block); + int itemId = itemRegistry.add(blockId, name, item); + if (blockId != actualBlockId || itemId != blockId) + { + throw new RuntimeException(String.format("There was a failure to allocate a matching block and item pair for %s: requested %d, got %d and %d", name, blockId, actualBlockId, itemId)); } }