Clean some generic warnings up. Make a generic list handler. Helpful for others I think too.
This commit is contained in:
parent
ff5eb87e27
commit
66ad8ea41a
6 changed files with 84 additions and 73 deletions
|
@ -22,7 +22,6 @@ import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.nbt.NBTBase;
|
import net.minecraft.nbt.NBTBase;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.nbt.NBTTagList;
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
|
|
@ -15,8 +15,6 @@ import org.apache.logging.log4j.Level;
|
||||||
|
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
|
|
||||||
import cpw.mods.fml.client.FMLClientHandler;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copied from http://stackoverflow.com/questions/1399126/java-util-zip-recreating-directory-structure
|
* Copied from http://stackoverflow.com/questions/1399126/java-util-zip-recreating-directory-structure
|
||||||
* because the code looked very tidy and neat. Thanks, McDowell!
|
* because the code looked very tidy and neat. Thanks, McDowell!
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
package cpw.mods.fml.common.functions;
|
||||||
|
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
|
public class GenericIterableFactory {
|
||||||
|
public static <T> Iterable<T> newCastingIterable(Iterable<?> input, Class<T> type)
|
||||||
|
{
|
||||||
|
return Iterables.transform(input, new TypeCastFunction<T>(type));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package cpw.mods.fml.common.functions;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
|
public class TypeCastFunction<T> implements Function<Object, T> {
|
||||||
|
private Class<T> type;
|
||||||
|
public TypeCastFunction(Class<T> type)
|
||||||
|
{
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T apply(Object input)
|
||||||
|
{
|
||||||
|
return type.cast(input);
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,17 +6,17 @@ import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.item.ItemBlock;
|
||||||
import net.minecraft.util.ObjectIntIdentityMap;
|
import net.minecraft.util.ObjectIntIdentityMap;
|
||||||
import net.minecraft.util.RegistryNamespaced;
|
import net.minecraft.util.RegistryNamespaced;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.Iterables;
|
|
||||||
|
|
||||||
import cpw.mods.fml.common.FMLLog;
|
import cpw.mods.fml.common.FMLLog;
|
||||||
import cpw.mods.fml.common.Loader;
|
import cpw.mods.fml.common.functions.GenericIterableFactory;
|
||||||
import cpw.mods.fml.common.ModContainer;
|
|
||||||
|
|
||||||
public class FMLControlledNamespacedRegistry<I> extends RegistryNamespaced {
|
public class FMLControlledNamespacedRegistry<I> extends RegistryNamespaced {
|
||||||
private final Class<I> superType;
|
private final Class<I> superType;
|
||||||
|
@ -38,7 +38,49 @@ public class FMLControlledNamespacedRegistry<I> extends RegistryNamespaced {
|
||||||
this.minId = minIdValue;
|
this.minId = minIdValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
void validateContent(int maxId, String type, BitSet availabilityMap, Set<Integer> blockedIds, FMLControlledNamespacedRegistry<Block> iBlockRegistry)
|
||||||
|
{
|
||||||
|
for (I obj : typeSafeIterable())
|
||||||
|
{
|
||||||
|
int id = getId(obj);
|
||||||
|
String name = getNameForObject(obj);
|
||||||
|
|
||||||
|
// id lookup failed -> obj is not in the obj<->id map
|
||||||
|
if (id < 0) throw new IllegalStateException(String.format("Registry entry for %s %s, name %s, doesn't yield an id.", type, obj, name));
|
||||||
|
// id is too high
|
||||||
|
if (id > maxId) throw new IllegalStateException(String.format("Registry entry for %s %s, name %s uses the too large id %d.", type, obj, name));
|
||||||
|
// name lookup failed -> obj is not in the obj<->name map
|
||||||
|
if (name == null) throw new IllegalStateException(String.format("Registry entry for %s %s, id %d, doesn't yield a name.", type, obj, id));
|
||||||
|
// empty name
|
||||||
|
if (name.isEmpty()) throw new IllegalStateException(String.format("Registry entry for %s %s, id %d, yields an empty name.", type, obj, id));
|
||||||
|
// non-prefixed name
|
||||||
|
if (name.indexOf(':') == -1) throw new IllegalStateException(String.format("Registry entry for %s %s, id %d, has the non-prefixed name %s.", type, obj, id, name));
|
||||||
|
// id -> obj lookup is inconsistent
|
||||||
|
if (getRaw(id) != obj) throw new IllegalStateException(String.format("Registry entry for id %d, name %s, doesn't yield the expected %s %s.", id, name, type, obj));
|
||||||
|
// name -> obj lookup is inconsistent
|
||||||
|
if (getRaw(name) != obj) throw new IllegalStateException(String.format("Registry entry for name %s, id %d, doesn't yield the expected %s %s.", name, id, type, obj));
|
||||||
|
// name -> id lookup is inconsistent
|
||||||
|
if (getId(name) != id) throw new IllegalStateException(String.format("Registry entry for name %s doesn't yield the expected id %d.", name, id));
|
||||||
|
// id isn't marked as unavailable
|
||||||
|
if (!availabilityMap.get(id)) throw new IllegalStateException(String.format("Registry entry for %s %s, id %d, name %s, marked as empty.", type, obj, id, name));
|
||||||
|
// entry is blocked, thus should be empty
|
||||||
|
if (blockedIds.contains(id)) throw new IllegalStateException(String.format("Registry entry for %s %s, id %d, name %s, marked as dangling.", type, obj, id, name));
|
||||||
|
|
||||||
|
if (obj instanceof ItemBlock)
|
||||||
|
{
|
||||||
|
Block block = ((ItemBlock) obj).field_150939_a;
|
||||||
|
|
||||||
|
// verify matching block entry
|
||||||
|
if (iBlockRegistry.getId(block) != id)
|
||||||
|
{
|
||||||
|
throw new IllegalStateException(String.format("Registry entry for ItemBlock %s, id %d, is missing or uses the non-matching id %d.", obj, id, iBlockRegistry.getId(block)));
|
||||||
|
}
|
||||||
|
// verify id range
|
||||||
|
if (id > GameData.MAX_BLOCK_ID) throw new IllegalStateException(String.format("ItemBlock %s uses the id %d outside the block id range", name, id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
void set(FMLControlledNamespacedRegistry<I> registry)
|
void set(FMLControlledNamespacedRegistry<I> registry)
|
||||||
{
|
{
|
||||||
if (this.superType != registry.superType) throw new IllegalArgumentException("incompatible registry");
|
if (this.superType != registry.superType) throw new IllegalArgumentException("incompatible registry");
|
||||||
|
@ -254,12 +296,12 @@ public class FMLControlledNamespacedRegistry<I> extends RegistryNamespaced {
|
||||||
|
|
||||||
public Iterable<I> typeSafeIterable()
|
public Iterable<I> typeSafeIterable()
|
||||||
{
|
{
|
||||||
return Iterables.transform(this, new TypeCastFunction());
|
Iterable<?> self = this;
|
||||||
|
return GenericIterableFactory.newCastingIterable(self, superType);
|
||||||
}
|
}
|
||||||
|
|
||||||
// internal
|
// internal
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void serializeInto(Map<String, Integer> idMapping) // for saving
|
public void serializeInto(Map<String, Integer> idMapping) // for saving
|
||||||
{
|
{
|
||||||
for (I thing : this.typeSafeIterable())
|
for (I thing : this.typeSafeIterable())
|
||||||
|
@ -333,7 +375,6 @@ public class FMLControlledNamespacedRegistry<I> extends RegistryNamespaced {
|
||||||
FMLLog.finer("Registry alias: %s -> %s", from, to);
|
FMLLog.finer("Registry alias: %s -> %s", from, to);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Map<String,Integer> getEntriesNotIn(FMLControlledNamespacedRegistry<I> registry)
|
Map<String,Integer> getEntriesNotIn(FMLControlledNamespacedRegistry<I> registry)
|
||||||
{
|
{
|
||||||
Map<String,Integer> ret = new HashMap<String, Integer>();
|
Map<String,Integer> ret = new HashMap<String, Integer>();
|
||||||
|
@ -346,7 +387,6 @@ public class FMLControlledNamespacedRegistry<I> extends RegistryNamespaced {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
void dump()
|
void dump()
|
||||||
{
|
{
|
||||||
List<Integer> ids = new ArrayList<Integer>();
|
List<Integer> ids = new ArrayList<Integer>();
|
||||||
|
@ -378,13 +418,4 @@ public class FMLControlledNamespacedRegistry<I> extends RegistryNamespaced {
|
||||||
underlyingIntegerMap.func_148746_a(thing, id); // obj <-> id
|
underlyingIntegerMap.func_148746_a(thing, id); // obj <-> id
|
||||||
super.putObject(name, thing); // name <-> obj
|
super.putObject(name, thing); // name <-> obj
|
||||||
}
|
}
|
||||||
|
|
||||||
private class TypeCastFunction implements Function<Object, I>
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public I apply(Object o)
|
|
||||||
{
|
|
||||||
return superType.cast(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@ 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.Arrays;
|
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
@ -43,7 +42,6 @@ import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Table;
|
import com.google.common.collect.Table;
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
|
|
||||||
import cpw.mods.fml.client.FMLClientHandler;
|
|
||||||
import cpw.mods.fml.common.FMLCommonHandler;
|
import cpw.mods.fml.common.FMLCommonHandler;
|
||||||
import cpw.mods.fml.common.FMLLog;
|
import cpw.mods.fml.common.FMLLog;
|
||||||
import cpw.mods.fml.common.Loader;
|
import cpw.mods.fml.common.Loader;
|
||||||
|
@ -56,10 +54,10 @@ import cpw.mods.fml.common.registry.GameRegistry.Type;
|
||||||
import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier;
|
import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier;
|
||||||
|
|
||||||
public class GameData {
|
public class GameData {
|
||||||
private static final int MIN_BLOCK_ID = 0;
|
static final int MIN_BLOCK_ID = 0;
|
||||||
private static final int MAX_BLOCK_ID = 4095;
|
static final int MAX_BLOCK_ID = 4095;
|
||||||
private static final int MIN_ITEM_ID = 4096;
|
static final int MIN_ITEM_ID = 4096;
|
||||||
private static final int MAX_ITEM_ID = 31999;
|
static final int MAX_ITEM_ID = 31999;
|
||||||
|
|
||||||
private static final GameData mainData = new GameData();
|
private static final GameData mainData = new GameData();
|
||||||
|
|
||||||
|
@ -244,6 +242,7 @@ public class GameData {
|
||||||
for (Entry<String, Integer> entry : dataList.entrySet())
|
for (Entry<String, Integer> entry : dataList.entrySet())
|
||||||
{
|
{
|
||||||
String itemName = entry.getKey();
|
String itemName = entry.getKey();
|
||||||
|
@SuppressWarnings("unused")
|
||||||
String realName = itemName.substring(1);
|
String realName = itemName.substring(1);
|
||||||
|
|
||||||
if (itemName.charAt(0) == '\u0001') // is a block
|
if (itemName.charAt(0) == '\u0001') // is a block
|
||||||
|
@ -351,7 +350,7 @@ public class GameData {
|
||||||
{
|
{
|
||||||
String mod = it.next();
|
String mod = it.next();
|
||||||
|
|
||||||
if (mod.equals("minecraft") || Loader.instance().isModLoaded(mod)) it.remove();
|
if (mod.equals("minecraft") || Loader.isModLoaded(mod)) it.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!modsMissing.isEmpty())
|
if (!modsMissing.isEmpty())
|
||||||
|
@ -907,7 +906,6 @@ public class GameData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private void testConsistency() {
|
private void testConsistency() {
|
||||||
// test if there's an entry for every set bit in availabilityMap
|
// test if there's an entry for every set bit in availabilityMap
|
||||||
for (int i = availabilityMap.nextSetBit(0); i >= 0; i = availabilityMap.nextSetBit(i+1))
|
for (int i = availabilityMap.nextSetBit(0); i >= 0; i = availabilityMap.nextSetBit(i+1))
|
||||||
|
@ -922,50 +920,8 @@ public class GameData {
|
||||||
{
|
{
|
||||||
boolean isBlock = pass == 0;
|
boolean isBlock = pass == 0;
|
||||||
String type = isBlock ? "block" : "item";
|
String type = isBlock ? "block" : "item";
|
||||||
FMLControlledNamespacedRegistry registry = isBlock ? iBlockRegistry : iItemRegistry;
|
FMLControlledNamespacedRegistry<?> registry = isBlock ? iBlockRegistry : iItemRegistry;
|
||||||
|
registry.validateContent((isBlock ? MAX_BLOCK_ID : MAX_ITEM_ID), type, availabilityMap, blockedIds, iBlockRegistry);
|
||||||
// test if the registry is consistent
|
|
||||||
// test if there's a bit in availabilityMap set for every entry in the registry
|
|
||||||
// make sure it's not a blocked id
|
|
||||||
for (Object obj : registry)
|
|
||||||
{
|
|
||||||
int id = registry.getId(obj);
|
|
||||||
String name = registry.getNameForObject(obj);
|
|
||||||
|
|
||||||
// id lookup failed -> obj is not in the obj<->id map
|
|
||||||
if (id < 0) throw new IllegalStateException(String.format("Registry entry for %s %s, name %s, doesn't yield an id.", type, obj, name));
|
|
||||||
// id is too high
|
|
||||||
if (id > (isBlock ? MAX_BLOCK_ID : MAX_ITEM_ID)) throw new IllegalStateException(String.format("Registry entry for %s %s, name %s uses the too large id %d.", type, obj, name));
|
|
||||||
// name lookup failed -> obj is not in the obj<->name map
|
|
||||||
if (name == null) throw new IllegalStateException(String.format("Registry entry for %s %s, id %d, doesn't yield a name.", type, obj, id));
|
|
||||||
// empty name
|
|
||||||
if (name.isEmpty()) throw new IllegalStateException(String.format("Registry entry for %s %s, id %d, yields an empty name.", type, obj, id));
|
|
||||||
// non-prefixed name
|
|
||||||
if (name.indexOf(':') == -1) throw new IllegalStateException(String.format("Registry entry for %s %s, id %d, has the non-prefixed name %s.", type, obj, id, name));
|
|
||||||
// id -> obj lookup is inconsistent
|
|
||||||
if (registry.getRaw(id) != obj) throw new IllegalStateException(String.format("Registry entry for id %d, name %s, doesn't yield the expected %s %s.", id, name, type, obj));
|
|
||||||
// name -> obj lookup is inconsistent
|
|
||||||
if (registry.getRaw(name) != obj) throw new IllegalStateException(String.format("Registry entry for name %s, id %d, doesn't yield the expected %s %s.", name, id, type, obj));
|
|
||||||
// name -> id lookup is inconsistent
|
|
||||||
if (registry.getId(name) != id) throw new IllegalStateException(String.format("Registry entry for name %s doesn't yield the expected id %d.", name, id));
|
|
||||||
// id isn't marked as unavailable
|
|
||||||
if (!availabilityMap.get(id)) throw new IllegalStateException(String.format("Registry entry for %s %s, id %d, name %s, marked as empty.", type, obj, id, name));
|
|
||||||
// entry is blocked, thus should be empty
|
|
||||||
if (blockedIds.contains(id)) throw new IllegalStateException(String.format("Registry entry for %s %s, id %d, name %s, marked as dangling.", type, obj, id, name));
|
|
||||||
|
|
||||||
if (obj instanceof ItemBlock)
|
|
||||||
{
|
|
||||||
Block block = ((ItemBlock) obj).field_150939_a;
|
|
||||||
|
|
||||||
// verify matching block entry
|
|
||||||
if (iBlockRegistry.getId(block) != id)
|
|
||||||
{
|
|
||||||
throw new IllegalStateException(String.format("Registry entry for ItemBlock %s, id %d, is missing or uses the non-matching id %d.", obj, id, iBlockRegistry.getId(block)));
|
|
||||||
}
|
|
||||||
// verify id range
|
|
||||||
if (id > MAX_BLOCK_ID) throw new IllegalStateException(String.format("ItemBlock %s uses the id %d outside the block id range", name, id));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FMLLog.fine("Registry consistency check successful");
|
FMLLog.fine("Registry consistency check successful");
|
||||||
|
|
Loading…
Reference in a new issue