Ensure we check both item and block registries when finding valid IDs. Should fix #365

This commit is contained in:
Christian 2014-02-01 11:05:33 +00:00
parent 498ab360e8
commit be8d33070e
2 changed files with 19 additions and 5 deletions

View file

@ -107,7 +107,7 @@ public class FMLControlledNamespacedRegistry<I> extends RegistryNamespaced {
private Map<String,Integer> transactionalNamedIds; private Map<String,Integer> transactionalNamedIds;
private BitSet transactionalAvailabilityMap; private BitSet transactionalAvailabilityMap;
private BitSet availabilityMap; private BitSet availabilityMap;
private int maxId; int maxId;
private int minId; private int minId;
private char discriminator; private char discriminator;
@ -316,4 +316,9 @@ public class FMLControlledNamespacedRegistry<I> extends RegistryNamespaced {
FMLLog.finer("Registry : %s %d %s", name, entry.getValue(), thing); FMLLog.finer("Registry : %s %d %s", name, entry.getValue(), thing);
} }
} }
BitSet slots()
{
return (BitSet) availabilityMap.clone();
}
} }

View file

@ -14,6 +14,7 @@ package cpw.mods.fml.common.registry;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.BitSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
@ -157,11 +158,19 @@ public class GameData {
{ {
customOwners.put(new UniqueIdentifier(modId, name), mc); customOwners.put(new UniqueIdentifier(modId, name), mc);
} }
int blockId = blockRegistry.add(0, name, block); BitSet blockAvailability = blockRegistry.slots();
int itemId = itemRegistry.add(blockId, name, item); BitSet itemAvailability = itemRegistry.slots();
if (itemId != blockId) 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));
} }
} }