Global object registry, also, support the new itemblockwithmetadata constructor
This commit is contained in:
parent
304e717aea
commit
0de7554d8b
|
@ -55,6 +55,7 @@ import cpw.mods.fml.common.event.FMLInterModComms;
|
||||||
import cpw.mods.fml.common.event.FMLLoadEvent;
|
import cpw.mods.fml.common.event.FMLLoadEvent;
|
||||||
import cpw.mods.fml.common.functions.ModIdFunction;
|
import cpw.mods.fml.common.functions.ModIdFunction;
|
||||||
import cpw.mods.fml.common.modloader.BaseModProxy;
|
import cpw.mods.fml.common.modloader.BaseModProxy;
|
||||||
|
import cpw.mods.fml.common.registry.GameData;
|
||||||
import cpw.mods.fml.common.toposort.ModSorter;
|
import cpw.mods.fml.common.toposort.ModSorter;
|
||||||
import cpw.mods.fml.common.toposort.ModSortingException;
|
import cpw.mods.fml.common.toposort.ModSortingException;
|
||||||
import cpw.mods.fml.common.toposort.TopologicalSort;
|
import cpw.mods.fml.common.toposort.TopologicalSort;
|
||||||
|
@ -674,6 +675,8 @@ public class Loader
|
||||||
// Mod controller should be in the initialization state here
|
// Mod controller should be in the initialization state here
|
||||||
modController.distributeStateMessage(LoaderState.INITIALIZATION);
|
modController.distributeStateMessage(LoaderState.INITIALIZATION);
|
||||||
modController.transition(LoaderState.POSTINITIALIZATION);
|
modController.transition(LoaderState.POSTINITIALIZATION);
|
||||||
|
// Construct the "mod object table" so mods can refer to it in IMC and postinit
|
||||||
|
GameData.buildModObjectTable();
|
||||||
modController.distributeStateMessage(FMLInterModComms.IMCEvent.class);
|
modController.distributeStateMessage(FMLInterModComms.IMCEvent.class);
|
||||||
modController.distributeStateMessage(LoaderState.POSTINITIALIZATION);
|
modController.distributeStateMessage(LoaderState.POSTINITIALIZATION);
|
||||||
modController.transition(LoaderState.AVAILABLE);
|
modController.transition(LoaderState.AVAILABLE);
|
||||||
|
|
|
@ -22,6 +22,8 @@ import java.util.Set;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockSand;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.nbt.NBTTagList;
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
@ -29,10 +31,15 @@ import net.minecraft.nbt.NBTTagList;
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.base.Throwables;
|
import com.google.common.base.Throwables;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.ImmutableTable;
|
||||||
|
import com.google.common.collect.ImmutableTable.Builder;
|
||||||
import com.google.common.collect.MapDifference;
|
import com.google.common.collect.MapDifference;
|
||||||
|
import com.google.common.collect.Tables;
|
||||||
import com.google.common.collect.MapDifference.ValueDifference;
|
import com.google.common.collect.MapDifference.ValueDifference;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
import com.google.common.collect.Table;
|
||||||
|
import com.google.common.collect.Table.Cell;
|
||||||
|
|
||||||
import cpw.mods.fml.common.FMLLog;
|
import cpw.mods.fml.common.FMLLog;
|
||||||
import cpw.mods.fml.common.Loader;
|
import cpw.mods.fml.common.Loader;
|
||||||
|
@ -46,6 +53,7 @@ public class GameData {
|
||||||
private static MapDifference<Integer, ItemData> difference;
|
private static MapDifference<Integer, ItemData> difference;
|
||||||
private static boolean shouldContinue = true;
|
private static boolean shouldContinue = true;
|
||||||
private static boolean isSaveValid = true;
|
private static boolean isSaveValid = true;
|
||||||
|
private static ImmutableTable<String, String, Integer> modObjectTable;
|
||||||
private static Map<String,String> ignoredMods;
|
private static Map<String,String> ignoredMods;
|
||||||
|
|
||||||
private static boolean isModIgnoredForIdValidation(String modId)
|
private static boolean isModIgnoredForIdValidation(String modId)
|
||||||
|
@ -238,4 +246,50 @@ public class GameData {
|
||||||
ItemData itemData = idMap.get(id);
|
ItemData itemData = idMap.get(id);
|
||||||
itemData.setName(name,modId);
|
itemData.setName(name,modId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void buildModObjectTable()
|
||||||
|
{
|
||||||
|
if (modObjectTable != null)
|
||||||
|
{
|
||||||
|
throw new IllegalStateException("Illegal call to buildModObjectTable!");
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<Integer, Cell<String, String, Integer>> map = Maps.transformValues(idMap, new Function<ItemData,Cell<String,String,Integer>>() {
|
||||||
|
public Cell<String,String,Integer> apply(ItemData data)
|
||||||
|
{
|
||||||
|
return Tables.immutableCell(data.getModId(), data.getItemType(), data.getItemId());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Builder<String, String, Integer> tBuilder = ImmutableTable.builder();
|
||||||
|
for (Cell<String, String, Integer> c : map.values())
|
||||||
|
{
|
||||||
|
tBuilder.put(c);
|
||||||
|
}
|
||||||
|
modObjectTable = tBuilder.build();
|
||||||
|
}
|
||||||
|
static Item findItem(String modId, String name)
|
||||||
|
{
|
||||||
|
if (modObjectTable == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Item.field_77698_e[modObjectTable.get(modId, name)];
|
||||||
|
}
|
||||||
|
|
||||||
|
static Block findBlock(String modId, String name)
|
||||||
|
{
|
||||||
|
if (modObjectTable == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Integer blockId = modObjectTable.get(modId, name);
|
||||||
|
if (blockId >= Block.field_71973_m.length)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return Block.field_71973_m[blockId];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
package cpw.mods.fml.common.registry;
|
package cpw.mods.fml.common.registry;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
@ -211,7 +212,16 @@ public class GameRegistry
|
||||||
assert block != null : "registerBlock: block cannot be null";
|
assert block != null : "registerBlock: block cannot be null";
|
||||||
assert itemclass != null : "registerBlock: itemclass cannot be null";
|
assert itemclass != null : "registerBlock: itemclass cannot be null";
|
||||||
int blockItemId = block.field_71990_ca - 256;
|
int blockItemId = block.field_71990_ca - 256;
|
||||||
Item i = itemclass.getConstructor(int.class).newInstance(blockItemId);
|
Constructor<? extends ItemBlock> itemCtor;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
itemCtor = itemclass.getConstructor(int.class);
|
||||||
|
}
|
||||||
|
catch (NoSuchMethodException e)
|
||||||
|
{
|
||||||
|
itemCtor = itemclass.getConstructor(int.class, Block.class);
|
||||||
|
}
|
||||||
|
Item i = itemCtor.newInstance(blockItemId, block);
|
||||||
GameRegistry.registerItem(i,name, modId);
|
GameRegistry.registerItem(i,name, modId);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
@ -360,4 +370,26 @@ public class GameRegistry
|
||||||
tracker.onPlayerRespawn(player);
|
tracker.onPlayerRespawn(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Look up a mod block in the global "named item list"
|
||||||
|
* @param modId The modid owning the block
|
||||||
|
* @param name The name of the block itself
|
||||||
|
* @return The block or null if not found
|
||||||
|
*/
|
||||||
|
public static net.minecraft.block.Block findBlock(String modId, String name)
|
||||||
|
{
|
||||||
|
return GameData.findBlock(modId, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Look up a mod item in the global "named item list"
|
||||||
|
* @param modId The modid owning the item
|
||||||
|
* @param name The name of the item itself
|
||||||
|
* @return The item or null if not found
|
||||||
|
*/
|
||||||
|
public static net.minecraft.item.Item findItem(String modId, String name)
|
||||||
|
{
|
||||||
|
return GameData.findItem(modId, name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue