aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java')
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java232
1 files changed, 232 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
new file mode 100644
index 0000000000..0b5afbb043
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
@@ -0,0 +1,232 @@
+package gregtech.api.multitileentity;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap;
+
+import appeng.core.CreativeTab;
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.LoaderState;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.base.MultiTileEntity;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+import it.unimi.dsi.fastutil.shorts.Short2ObjectMap;
+import it.unimi.dsi.fastutil.shorts.Short2ObjectOpenHashMap;
+
+public class MultiTileEntityRegistry {
+
+ private static final HashMap<String, MultiTileEntityRegistry> NAMED_REGISTRIES = new HashMap<>();
+
+ // TODO: NBT sensitive or not? Starting with not for now
+ private static final ItemStackMap<MultiTileEntityRegistry> REGISTRIES = new ItemStackMap<>(false);
+ private static final HashSet<Class<?>> sRegisteredTileEntities = new HashSet<>();
+
+ public HashMap<Short, CreativeTab> creativeTabs = new HashMap<>();
+ public final Short2ObjectMap<MultiTileEntityClassContainer> registry = new Short2ObjectOpenHashMap<>();
+ public List<MultiTileEntityClassContainer> registrations = new ArrayList<>();
+
+ private final String internalName;
+ private final MultiTileEntityBlock block;
+
+ /**
+ * @param internalName the internal Name of the Item
+ */
+ public MultiTileEntityRegistry(String internalName, MultiTileEntityBlock block) {
+ if (!Loader.instance()
+ .isInState(LoaderState.PREINITIALIZATION)) {
+ throw new IllegalStateException(
+ "The MultiTileEntity Registry must be initialized during Preload Phase and not before");
+ }
+ if (!block.isRegistered()) {
+ throw new IllegalStateException("Block not registered");
+ }
+ this.internalName = internalName;
+ this.block = block;
+ GT_FML_LOGGER.info(internalName + " " + Block.getIdFromBlock(block) + " This is the answer");
+ this.block.setRegistry(this);
+ REGISTRIES.put(new ItemStack(Item.getItemById(Block.getIdFromBlock(block)), 1, GT_Values.W), this);
+ NAMED_REGISTRIES.put(internalName, this);
+ }
+
+ public static TileEntity getReferenceTileEntity(int aRegistryID, int aMultiTileEntityID) {
+ final MultiTileEntityRegistry tRegistry = getRegistry(aRegistryID);
+ if (tRegistry == null) return null;
+ final MultiTileEntityClassContainer tClassContainer = tRegistry.getClassContainer(aMultiTileEntityID);
+ if (tClassContainer == null) return null;
+ return tClassContainer.getReferenceTileEntity();
+ }
+
+ public MultiTileEntity getReferenceTileEntity(ItemStack stack) {
+ return getReferenceTileEntity(Items.feather.getDamage(stack));
+ }
+
+ public MultiTileEntity getReferenceTileEntity(int metaId) {
+ final MultiTileEntityClassContainer muteClass = registry.get((short) metaId);
+ if (muteClass == null) return null;
+ return muteClass.getReferenceTileEntity();
+ }
+
+ public static MultiTileEntityRegistry getRegistry(int aRegistryID) {
+ return REGISTRIES.get(new ItemStack(Item.getItemById(aRegistryID), 1, GT_Values.W));
+ }
+
+ public static MultiTileEntityRegistry getRegistry(String aRegistryName) {
+ return NAMED_REGISTRIES.get(aRegistryName);
+ }
+
+ public MultiTileEntityClassContainer create(int aID, Class<? extends MultiTileEntity> aClass) {
+ return new MultiTileEntityClassContainer(this, aID, aClass);
+ }
+
+ /**
+ * Adds a new MultiTileEntity. It is highly recommended to do this in either the PreInit or the Init Phase. PostInit
+ * might not work well.
+ */
+ public ItemStack add(String aLocalised, MultiTileEntityClassContainer aClassContainer) {
+ boolean tFailed = false;
+ if (GT_Utility.isStringInvalid(aLocalised)) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Localisation Missing!");
+ tFailed = true;
+ }
+ if (aClassContainer == null) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container is null!");
+ tFailed = true;
+ } else {
+ if (aClassContainer.getMuteClass() == null) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class inside Class Container is null!");
+ tFailed = true;
+ }
+ if (aClassContainer.getMuteID() == GT_Values.W) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses Wildcard MetaData!");
+ tFailed = true;
+ }
+ if (aClassContainer.getMuteID() < 0) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses negative MetaData!");
+ tFailed = true;
+ }
+ if (registry.containsKey(aClassContainer.getMuteID())) {
+ GT_FML_LOGGER.error(
+ "MULTI-TILE REGISTRY ERROR: Class Container uses occupied MetaData! (" + aClassContainer.getMuteID()
+ + ")");
+ tFailed = true;
+ }
+ }
+ if (tFailed) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR " + aLocalised + " : STACKTRACE START");
+ int i = 0;
+ for (StackTraceElement tElement : new Exception().getStackTrace()) if (i++ < 5 && !tElement.getClassName()
+ .startsWith("sun")) GT_FML_LOGGER.error("\tat " + tElement);
+ else break;
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: STACKTRACE END");
+ return null;
+ }
+
+ GT_LanguageManager
+ .addStringLocalization(internalName + "." + aClassContainer.getMuteID() + ".name", aLocalised);
+ registry.put(aClassContainer.getMuteID(), aClassContainer);
+ mLastRegisteredID = aClassContainer.getMuteID();
+ registrations.add(aClassContainer);
+
+ if (sRegisteredTileEntities.add(
+ aClassContainer.getReferenceTileEntity()
+ .getClass())) {
+ aClassContainer.getReferenceTileEntity()
+ .onRegistrationFirst(this, aClassContainer.getMuteID());
+ }
+
+ return getItem(aClassContainer.getMuteID());
+ }
+
+ public short mLastRegisteredID = GT_Values.W;
+
+ public ItemStack getItem() {
+ return getItem(mLastRegisteredID, 1, null);
+ }
+
+ public ItemStack getItem(int aID) {
+ return getItem(aID, 1, null);
+ }
+
+ public ItemStack getItem(int aID, NBTTagCompound nbt) {
+ return getItem(aID, 1, nbt);
+ }
+
+ public ItemStack getItem(int aID, long aAmount) {
+ return getItem(aID, aAmount, null);
+ }
+
+ public ItemStack getItem(int metaID, long amount, NBTTagCompound nbt) {
+ final ItemStack stack = new ItemStack(block, (int) amount, metaID);
+ if (nbt == null || nbt.hasNoTags()) {
+ nbt = new NBTTagCompound();
+ final TileEntity tileEntity = getNewTileEntity(metaID, nbt);
+ ((IMultiTileEntity) tileEntity).writeItemNBT(nbt);
+ }
+ stack.setTagCompound(nbt);
+ return stack;
+ }
+
+ public String getLocal(int aID) {
+ return StatCollector.translateToLocal(internalName + "." + aID + ".name");
+ }
+
+ public MultiTileEntityClassContainer getClassContainer(int aID) {
+ return registry.get((short) aID);
+ }
+
+ public MultiTileEntityClassContainer getClassContainer(ItemStack stack) {
+ return registry.get((short) Items.feather.getDamage(stack));
+ }
+
+ public TileEntity getNewTileEntity(int aID) {
+ return getNewTileEntity(null, 0, 0, 0, aID);
+ }
+
+ public TileEntity getNewTileEntity(World aWorld, int x, int y, int z, int metaID) {
+ return getNewTileEntity(aWorld, x, y, z, metaID, null);
+ }
+
+ public TileEntity getNewTileEntity(World aWorld, int x, int y, int z, int metaID, NBTTagCompound nbt) {
+ final MultiTileEntityClassContainer container = registry.get((short) metaID);
+ if (container == null) return null;
+ final MultiTileEntity te = (MultiTileEntity) GT_Utility
+ .callConstructor(container.getMuteClass(), -1, null, true);
+ te.setWorldObj(aWorld);
+ te.xCoord = x;
+ te.yCoord = y;
+ te.zCoord = z;
+ nbt = (nbt == null || nbt.hasNoTags()) ? container.getParameters()
+ : GT_Util.fuseNBT(nbt, container.getParameters());
+ te.initFromNBT(nbt, (short) metaID, (short) Block.getIdFromBlock(block));
+ return te;
+ }
+
+ public TileEntity getNewTileEntity(int meta, NBTTagCompound nbt) {
+ return getNewTileEntity(null, 0, 0, 0, meta, nbt);
+ }
+
+ public String getInternalName() {
+ return internalName;
+ }
+
+ public MultiTileEntityBlock getBlock() {
+ return block;
+ }
+}