aboutsummaryrefslogtreecommitdiff
path: root/src/Java/miscutil/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/Java/miscutil/core')
-rw-r--r--src/Java/miscutil/core/gui/ModGUI.java53
-rw-r--r--src/Java/miscutil/core/gui/beta/Gui_ID_Registry.java56
-rw-r--r--src/Java/miscutil/core/gui/beta/Gui_Types.java8
-rw-r--r--src/Java/miscutil/core/gui/beta/MU_GuiId.java32
-rw-r--r--src/Java/miscutil/core/handler/GuiHandler.java55
-rw-r--r--src/Java/miscutil/core/interfaces/IGuiManager.java16
-rw-r--r--src/Java/miscutil/core/interfaces/IGuiManagerMiscUtils.java3
-rw-r--r--src/Java/miscutil/core/multiblock/abstracts/AbstractFakeMultiblockController.java68
-rw-r--r--src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockController.java213
-rw-r--r--src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockLogic.java31
-rw-r--r--src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockSizeLimits.java69
-rw-r--r--src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockTE.java194
-rw-r--r--src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractController.java7
-rw-r--r--src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractControllerInternal.java9
-rw-r--r--src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractMultiblockLogic.java11
-rw-r--r--src/Java/miscutil/core/multiblock/base/BaseFakeMultiblockController.java123
-rw-r--r--src/Java/miscutil/core/multiblock/base/BaseMultiblockLogic.java184
-rw-r--r--src/Java/miscutil/core/multiblock/base/BaseMultiblockTE.java100
-rw-r--r--src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockComponent.java17
-rw-r--r--src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockController.java18
-rw-r--r--src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockControllerInternal.java52
-rw-r--r--src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockLogic.java27
-rw-r--r--src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockSizeLimits.java19
-rw-r--r--src/Java/miscutil/core/multiblock/test/TileAlveary.java66
-rw-r--r--src/Java/miscutil/core/xmod/forestry/core/interfaces/IFilterSlotDelegate.java10
-rw-r--r--src/Java/miscutil/core/xmod/forestry/core/interfaces/IInventoryAdapter.java7
-rw-r--r--src/Java/miscutil/core/xmod/forestry/core/interfaces/INBTTagable.java10
-rw-r--r--src/Java/miscutil/core/xmod/forestry/core/inventory/FakeInventoryAdapter.java120
28 files changed, 1515 insertions, 63 deletions
diff --git a/src/Java/miscutil/core/gui/ModGUI.java b/src/Java/miscutil/core/gui/ModGUI.java
deleted file mode 100644
index 82f6ebf3bf..0000000000
--- a/src/Java/miscutil/core/gui/ModGUI.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package miscutil.core.gui;
-
-import miscutil.MiscUtils;
-import miscutil.core.block.machine.heliumgen.container.ContainerHeliumGenerator;
-import miscutil.core.block.machine.heliumgen.gui.GUIHeliumGenerator;
-import miscutil.core.block.machine.heliumgen.tileentity.TileEntityHeliumGenerator;
-import miscutil.core.handler.GuiHandler;
-import miscutil.core.util.Utils;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.world.World;
-import cpw.mods.fml.common.network.IGuiHandler;
-import cpw.mods.fml.common.network.NetworkRegistry;
-
-public class ModGUI {
-
-
- public static void init(){
-
- Utils.LOG_INFO("Registering GUIs.");
- NetworkRegistry.INSTANCE.registerGuiHandler(MiscUtils.instance, new GuiHandler());
- //Register GuiHandler
- //NetworkRegistry.INSTANCE.registerGuiHandler(MiscUtils.instance, new GuiHandler());
- }
-}
-
-class GUI_HANDLER implements IGuiHandler {
-
- @Override
- public Object getClientGuiElement (int ID, EntityPlayer player, World world, int x, int y, int z){
- if(ID == 0)
- return false;
- else if(ID == 1)
- return false;
- else if(ID == 2)
- return new GUIHeliumGenerator(player.inventory, (TileEntityHeliumGenerator)world.getTileEntity(x, y, z));
- else if(ID == 3)
- return false;
- return null;
- }
-
- @Override
- public Object getServerGuiElement (int ID, EntityPlayer player, World world, int x, int y, int z){
- if(ID == 0)
- return false;
- else if(ID == 1)
- return false;
- else if(ID == 2)
- return new ContainerHeliumGenerator(player.inventory, (TileEntityHeliumGenerator)world.getTileEntity(x, y, z));
- else if(ID == 3)
- return false;
- return null;
- }
-}
diff --git a/src/Java/miscutil/core/gui/beta/Gui_ID_Registry.java b/src/Java/miscutil/core/gui/beta/Gui_ID_Registry.java
new file mode 100644
index 0000000000..11c97e8f9a
--- /dev/null
+++ b/src/Java/miscutil/core/gui/beta/Gui_ID_Registry.java
@@ -0,0 +1,56 @@
+package miscutil.core.gui.beta;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import miscutil.core.interfaces.IGuiManagerMiscUtils;
+
+public class Gui_ID_Registry
+{
+ private static final Map<Class<? extends IGuiManagerMiscUtils>, MU_GuiId> classMap = new HashMap();
+ private static final Map<Integer, MU_GuiId> idMap = new HashMap();
+ private static int nextId = 0;
+
+ static
+ {
+ //registerGuiHandlers(Gui_Types.Tile, Arrays.asList(new Class[] {TileAlveary.class}));
+ //registerGuiHandlers(MU_GuiType.Item, Arrays.asList(new Class[] { ItemBackpack.class, ItemBackpackNaturalist.class, ItemBeealyzer.class, ItemCatalogue.class, ItemFlutterlyzer.class, ItemHabitatLocator.class, ItemImprinter.class, ItemInfuser.class, ItemLetter.class, ItemSolderingIron.class, ItemTreealyzer.class }));
+ //registerGuiHandlers(MU_GuiType.Entity, Arrays.asList(new Class[] { EntityMinecartApiary.class, EntityMinecartBeehouse.class }));
+ }
+
+ private static void registerGuiHandlers(Gui_Types MU_GuiType, List<Class<? extends IGuiManagerMiscUtils>> guiHandlerClasses)
+ {
+ for (Class<? extends IGuiManagerMiscUtils> tileGuiHandlerClass : guiHandlerClasses)
+ {
+ MU_GuiId guiId = new MU_GuiId(nextId++, MU_GuiType, tileGuiHandlerClass);
+ classMap.put(tileGuiHandlerClass, guiId);
+ idMap.put(Integer.valueOf(guiId.getId()), guiId);
+ }
+ }
+
+ public static MU_GuiId getGuiIdForGuiHandler(IGuiManagerMiscUtils guiHandler)
+ {
+ Class<? extends IGuiManagerMiscUtils> guiHandlerClass = guiHandler.getClass();
+ MU_GuiId guiId = (MU_GuiId)classMap.get(guiHandlerClass);
+ if (guiId == null) {
+ for (Map.Entry<Class<? extends IGuiManagerMiscUtils>, MU_GuiId> classGuiIdEntry : classMap.entrySet()) {
+ if (((Class)classGuiIdEntry.getKey()).isAssignableFrom(guiHandlerClass))
+ {
+ guiId = (MU_GuiId)classGuiIdEntry.getValue();
+ break;
+ }
+ }
+ }
+ if (guiId == null) {
+ throw new IllegalStateException("No gui ID for gui handler: " + guiHandler);
+ }
+ return guiId;
+ }
+
+ public static MU_GuiId getGuiId(int id)
+ {
+ return (MU_GuiId)idMap.get(Integer.valueOf(id));
+ }
+
+}
diff --git a/src/Java/miscutil/core/gui/beta/Gui_Types.java b/src/Java/miscutil/core/gui/beta/Gui_Types.java
new file mode 100644
index 0000000000..79e5a21dbd
--- /dev/null
+++ b/src/Java/miscutil/core/gui/beta/Gui_Types.java
@@ -0,0 +1,8 @@
+package miscutil.core.gui.beta;
+
+public enum Gui_Types
+ {
+ Item, Tile, Entity;
+
+ private Gui_Types() {}
+ } \ No newline at end of file
diff --git a/src/Java/miscutil/core/gui/beta/MU_GuiId.java b/src/Java/miscutil/core/gui/beta/MU_GuiId.java
new file mode 100644
index 0000000000..2c97e62039
--- /dev/null
+++ b/src/Java/miscutil/core/gui/beta/MU_GuiId.java
@@ -0,0 +1,32 @@
+package miscutil.core.gui.beta;
+import miscutil.core.interfaces.IGuiManagerMiscUtils;
+
+public class MU_GuiId
+ {
+ private final int id;
+ private final Gui_Types MU_GuiType;
+ private final Class<? extends IGuiManagerMiscUtils> guiHandlerClass;
+
+ MU_GuiId(int id, Gui_Types MU_GuiType, Class<? extends IGuiManagerMiscUtils> guiHandlerClass)
+ {
+ this.id = id;
+ this.MU_GuiType = MU_GuiType;
+ this.guiHandlerClass = guiHandlerClass;
+ }
+
+ public Gui_Types getGuiType()
+ {
+ return this.MU_GuiType;
+ }
+
+ public Class<? extends IGuiManagerMiscUtils> getGuiHandlerClass()
+ {
+ return this.guiHandlerClass;
+ }
+
+ public int getId()
+ {
+ return this.id;
+ }
+ }
+
diff --git a/src/Java/miscutil/core/handler/GuiHandler.java b/src/Java/miscutil/core/handler/GuiHandler.java
index d604f1b147..92cb2a2812 100644
--- a/src/Java/miscutil/core/handler/GuiHandler.java
+++ b/src/Java/miscutil/core/handler/GuiHandler.java
@@ -1,14 +1,19 @@
package miscutil.core.handler;
+import miscutil.MiscUtils;
import miscutil.core.container.Container_Charger;
import miscutil.core.container.Container_NHG;
+import miscutil.core.gui.beta.Gui_ID_Registry;
+import miscutil.core.gui.beta.MU_GuiId;
import miscutil.core.gui.machine.GUI_Charger;
import miscutil.core.gui.machine.GUI_NHG;
+import miscutil.core.interfaces.IGuiManager;
import miscutil.core.tileentities.machines.TileEntityCharger;
import miscutil.core.tileentities.machines.TileEntityNHG;
import miscutil.core.util.Utils;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;
@@ -17,8 +22,6 @@ public class GuiHandler implements IGuiHandler {
private static final int GUI1 = 0; //Nuclear Helium Gen.
private static final int GUI2 = 1; //Energy Charger
-
-
@Override //ContainerModTileEntity
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
@@ -42,16 +45,48 @@ public class GuiHandler implements IGuiHandler {
Utils.LOG_WARNING("getClientGuiElement Called by: "+player+", in world: "+player.dimension+" at x:"+x+", y:"+y+", z:"+z+".");
TileEntity te = world.getTileEntity(x, y, z);
if (te != null){
- if (ID == GUI1){
- Utils.LOG_WARNING("Opening Gui with Id: "+ID+" NHG");
- return new GUI_NHG((TileEntityNHG) te, player);
- }
- else if (ID == GUI2){
- Utils.LOG_WARNING("Opening Gui with Id: "+ID+" Charger");
- return new GUI_Charger((TileEntityCharger) te, player);
- }
+ if (ID == GUI1){
+ Utils.LOG_WARNING("Opening Gui with Id: "+ID+" NHG");
+ return new GUI_NHG((TileEntityNHG) te, player);
+ }
+ else if (ID == GUI2){
+ Utils.LOG_WARNING("Opening Gui with Id: "+ID+" Charger");
+ return new GUI_Charger((TileEntityCharger) te, player);
+ }
}
return null;
}
+
+
+
+ //New Methods
+ public static void openGui(EntityPlayer entityplayer, IGuiManager guiHandler)
+ {
+ openGui(entityplayer, guiHandler, (short)0);
+ }
+
+ public static void openGui(EntityPlayer entityplayer, IGuiManager guiHandler, short data)
+ {
+ int guiData = encodeGuiData(guiHandler, data);
+ ChunkCoordinates coordinates = guiHandler.getCoordinates();
+ entityplayer.openGui(MiscUtils.instance, guiData, entityplayer.worldObj, coordinates.posX, coordinates.posY, coordinates.posZ);
+ }
+
+ private static int encodeGuiData(IGuiManager guiHandler, short data)
+ {
+ MU_GuiId guiId = Gui_ID_Registry.getGuiIdForGuiHandler(guiHandler);
+ return data << 16 | guiId.getId();
+ }
+
+ private static MU_GuiId decodeGuiID(int guiData)
+ {
+ int guiId = guiData & 0xFF;
+ return Gui_ID_Registry.getGuiId(guiId);
+ }
+
+ private static short decodeGuiData(int guiId)
+ {
+ return (short)(guiId >> 16);
+ }
} \ No newline at end of file
diff --git a/src/Java/miscutil/core/interfaces/IGuiManager.java b/src/Java/miscutil/core/interfaces/IGuiManager.java
new file mode 100644
index 0000000000..bca5b90ecf
--- /dev/null
+++ b/src/Java/miscutil/core/interfaces/IGuiManager.java
@@ -0,0 +1,16 @@
+package miscutil.core.interfaces;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+public abstract interface IGuiManager extends IGuiManagerMiscUtils{
+
+ public abstract ChunkCoordinates getCoordinates();
+
+ public abstract World getWorld();
+
+ public abstract Object getGui(EntityPlayer paramEntityPlayer, int paramInt);
+
+ public abstract Object getContainer(EntityPlayer paramEntityPlayer, int paramInt);
+}
diff --git a/src/Java/miscutil/core/interfaces/IGuiManagerMiscUtils.java b/src/Java/miscutil/core/interfaces/IGuiManagerMiscUtils.java
new file mode 100644
index 0000000000..1a5ab4a3a6
--- /dev/null
+++ b/src/Java/miscutil/core/interfaces/IGuiManagerMiscUtils.java
@@ -0,0 +1,3 @@
+package miscutil.core.interfaces;
+
+public abstract interface IGuiManagerMiscUtils {} \ No newline at end of file
diff --git a/src/Java/miscutil/core/multiblock/abstracts/AbstractFakeMultiblockController.java b/src/Java/miscutil/core/multiblock/abstracts/AbstractFakeMultiblockController.java
new file mode 100644
index 0000000000..1fc74a37a7
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/abstracts/AbstractFakeMultiblockController.java
@@ -0,0 +1,68 @@
+package miscutil.core.multiblock.abstracts;
+
+import miscutil.core.multiblock.abstracts.interfaces.IAbstractControllerInternal;
+import miscutil.core.multiblock.base.BaseFakeMultiblockController;
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockController;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.biome.BiomeGenBase;
+
+import com.mojang.authlib.GameProfile;
+
+public class AbstractFakeMultiblockController
+extends BaseFakeMultiblockController
+implements IAbstractControllerInternal
+{
+ public static final AbstractFakeMultiblockController instance = new AbstractFakeMultiblockController();
+
+
+ public int getBlockLightValue()
+ {
+ return 0;
+ }
+
+ public boolean canBlockSeeTheSky()
+ {
+ return false;
+ }
+
+ public GameProfile getOwner()
+ {
+ return null;
+ }
+
+ public ChunkCoordinates getCoordinates()
+ {
+ return null;
+ }
+
+ public BiomeGenBase getBiome()
+ {
+ return null;
+ }
+
+ @Override
+ public void assimilate(
+ IBaseMultiblockController paramIMultiblockControllerInternal) {
+ }
+
+ @Override
+ public void _onAssimilated(
+ IBaseMultiblockController paramIMultiblockControllerInternal) {
+ }
+
+ @Override
+ public void onAssimilated(
+ IBaseMultiblockController paramIMultiblockControllerInternal) {
+ }
+
+ @Override
+ public boolean shouldConsume(
+ IBaseMultiblockController paramIMultiblockControllerInternal) {
+ return false;
+ }
+
+ @Override
+ public int getHealthScaled(int paramInt) {
+ return 0;
+ }
+}
diff --git a/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockController.java b/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockController.java
new file mode 100644
index 0000000000..2ebcea7ce8
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockController.java
@@ -0,0 +1,213 @@
+package miscutil.core.multiblock.abstracts;
+
+import java.util.Collection;
+
+import miscutil.core.multiblock.abstracts.interfaces.IAbstractControllerInternal;
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockController;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import raisintoast.core.common.CoordTriplet;
+import raisintoast.core.multiblock.IMultiblockPart;
+import raisintoast.core.multiblock.MultiblockControllerBase;
+import raisintoast.core.multiblock.rectangular.RectangularMultiblockControllerBase;
+
+
+public class AbstractMultiblockController extends RectangularMultiblockControllerBase implements IAbstractControllerInternal {
+
+ protected AbstractMultiblockController(World world) {
+ super(world);
+ // TODO Auto-generated constructor stub
+ }
+
+ @Override
+ public void decodeDescriptionPacket(NBTTagCompound arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void formatDescriptionPacket(NBTTagCompound arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected int getMaximumXSize() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ protected int getMaximumYSize() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ protected int getMaximumZSize() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ protected int getMinimumNumberOfBlocksForAssembledMachine() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ protected void onAssimilate(MultiblockControllerBase arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void onAssimilated(MultiblockControllerBase arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAttachedPartWithMultiblockData(IMultiblockPart arg0,
+ NBTTagCompound arg1) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void onBlockAdded(IMultiblockPart arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void onBlockRemoved(IMultiblockPart arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void onMachineAssembled() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void onMachineDisassembled() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void onMachinePaused() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void onMachineRestored() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void updateClient() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected boolean updateServer() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void reassemble() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public String getLastValidationError() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Collection<IMultiblockPart> getComponents() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void assimilate(
+ IBaseMultiblockController paramIMultiblockControllerInternal) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void _onAssimilated(
+ IBaseMultiblockController paramIMultiblockControllerInternal) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAssimilated(
+ IBaseMultiblockController paramIMultiblockControllerInternal) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public CoordTriplet getReferenceCoord() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public World getWorld() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean shouldConsume(
+ IBaseMultiblockController paramIMultiblockControllerInternal) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public String getPartsListString() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void auditParts() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public int getHealthScaled(int paramInt) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+}
diff --git a/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockLogic.java b/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockLogic.java
new file mode 100644
index 0000000000..c2c92e83d2
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockLogic.java
@@ -0,0 +1,31 @@
+package miscutil.core.multiblock.abstracts;
+
+import miscutil.core.multiblock.abstracts.interfaces.IAbstractControllerInternal;
+import miscutil.core.multiblock.abstracts.interfaces.IAbstractMultiblockLogic;
+import miscutil.core.multiblock.base.BaseMultiblockLogic;
+import net.minecraft.world.World;
+
+public class AbstractMultiblockLogic extends BaseMultiblockLogic<IAbstractControllerInternal> implements IAbstractMultiblockLogic
+{
+ public AbstractMultiblockLogic()
+ {
+ super(IAbstractControllerInternal.class);
+ }
+
+ @Override
+public IAbstractControllerInternal getController()
+ {
+ if (super.isConnected()) {
+ return (IAbstractControllerInternal)this.controller;
+ }
+ return AbstractFakeMultiblockController.instance;
+ }
+
+ @Override
+public IAbstractControllerInternal createNewController(World world)
+ {
+ return new AbstractMultiblockController(world);
+ }
+
+
+}
diff --git a/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockSizeLimits.java b/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockSizeLimits.java
new file mode 100644
index 0000000000..e7675bb31e
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockSizeLimits.java
@@ -0,0 +1,69 @@
+package miscutil.core.multiblock.abstracts;
+
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockSizeLimits;
+
+public class AbstractMultiblockSizeLimits implements IBaseMultiblockSizeLimits {
+
+ public static final AbstractMultiblockSizeLimits instance = new AbstractMultiblockSizeLimits(3,3,3,3,3,3,27);
+
+ private short min_X;
+ private short min_Y;
+ private short min_Z;
+ private short max_X;
+ private short max_Y;
+ private short max_Z;
+ private short totalBlocks;
+
+ public AbstractMultiblockSizeLimits(int min_x, int min_y, int min_z, int max_x, int max_y, int max_z, int totalSize){
+ this.min_X = (short) min_x;
+ this.min_Y = (short) min_y;
+ this.min_Z = (short) min_z;
+ this.max_X = (short) max_x;
+ this.max_Y = (short) max_y;
+ this.max_Z = (short) max_z;
+ this.totalBlocks = (short) totalSize;
+ }
+
+
+ @Override
+ public int getMinNumberOfBlocksForAssembledMachine()
+ {
+ return totalBlocks;
+ }
+
+ @Override
+ public int getMaxXSize()
+ {
+ return max_X;
+ }
+
+ @Override
+ public int getMaxZSize()
+ {
+ return max_Y;
+ }
+
+ @Override
+ public int getMaxYSize()
+ {
+ return max_Z;
+ }
+
+ @Override
+ public int getMinXSize()
+ {
+ return min_X;
+ }
+
+ @Override
+ public int getMinYSize()
+ {
+ return min_Y;
+ }
+
+ @Override
+ public int getMinZSize()
+ {
+ return min_Z;
+ }
+}
diff --git a/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockTE.java b/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockTE.java
new file mode 100644
index 0000000000..ada934f2b1
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/abstracts/AbstractMultiblockTE.java
@@ -0,0 +1,194 @@
+package miscutil.core.multiblock.abstracts;
+
+
+import miscutil.core.handler.GuiHandler;
+import miscutil.core.multiblock.abstracts.interfaces.IAbstractMultiblockLogic;
+import miscutil.core.multiblock.base.BaseMultiblockTE;
+import miscutil.core.xmod.forestry.core.inventory.FakeInventoryAdapter;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTUtil;
+import net.minecraft.world.World;
+
+import com.mojang.authlib.GameProfile;
+
+public abstract class AbstractMultiblockTE<T extends IAbstractMultiblockLogic>
+extends BaseMultiblockTE<T> implements ISidedInventory {
+
+ private GameProfile owner;
+
+ public AbstractMultiblockTE(T multiblockLogic)
+ {
+ super(multiblockLogic);
+ }
+
+ public void openGui(EntityPlayer player)
+ {
+ GuiHandler.openGui(player, this);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound data)
+ {
+ super.readFromNBT(data);
+ if (data.hasKey("owner")) {
+ this.owner = NBTUtil.func_152459_a(data.getCompoundTag("owner"));
+ }
+ getInternalInventory().readFromNBT(data);
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound data)
+ {
+ super.writeToNBT(data);
+ if (this.owner != null)
+ {
+ NBTTagCompound nbt = new NBTTagCompound();
+ NBTUtil.func_152460_a(nbt, this.owner);
+ data.setTag("owner", nbt);
+ }
+ getInternalInventory().writeToNBT(data);
+ }
+
+ public FakeInventoryAdapter getInternalInventory()
+ {
+ return FakeInventoryAdapter.instance();
+ }
+
+ public boolean allowsAutomation()
+ {
+ return false;
+ }
+
+ @Override
+ public final int getSizeInventory()
+ {
+ return getInternalInventory().getSizeInventory();
+ }
+
+ @Override
+ public final ItemStack getStackInSlot(int slotIndex)
+ {
+ return getInternalInventory().getStackInSlot(slotIndex);
+ }
+
+ @Override
+ public final ItemStack decrStackSize(int slotIndex, int amount)
+ {
+ return getInternalInventory().decrStackSize(slotIndex, amount);
+ }
+
+ @Override
+ public final ItemStack getStackInSlotOnClosing(int slotIndex)
+ {
+ return getInternalInventory().getStackInSlotOnClosing(slotIndex);
+ }
+
+ @Override
+ public final void setInventorySlotContents(int slotIndex, ItemStack itemstack)
+ {
+ getInternalInventory().setInventorySlotContents(slotIndex, itemstack);
+ }
+
+ @Override
+ public final int getInventoryStackLimit()
+ {
+ return getInternalInventory().getInventoryStackLimit();
+ }
+
+ @Override
+ public final void openInventory()
+ {
+ getInternalInventory().openInventory();
+ }
+
+ @Override
+ public final void closeInventory()
+ {
+ getInternalInventory().closeInventory();
+ }
+
+ @Override
+ public final String getInventoryName()
+ {
+ return getInternalInventory().getInventoryName();
+ }
+
+ @Override
+ public final boolean isUseableByPlayer(EntityPlayer player)
+ {
+ return getInternalInventory().isUseableByPlayer(player);
+ }
+
+ @Override
+ public final boolean hasCustomInventoryName()
+ {
+ return getInternalInventory().hasCustomInventoryName();
+ }
+
+ @Override
+ public final boolean isItemValidForSlot(int slotIndex, ItemStack itemStack)
+ {
+ return getInternalInventory().isItemValidForSlot(slotIndex, itemStack);
+ }
+
+ @Override
+ public final int[] getAccessibleSlotsFromSide(int side)
+ {
+ if (allowsAutomation()) {
+ return getAccessibleSlotsFromSide(side);
+ }
+ return FakeInventoryAdapter.SLOTS_NONE;
+ }
+
+ @Override
+ public final boolean canInsertItem(int slotIndex, ItemStack itemStack, int side)
+ {
+ if (allowsAutomation()) {
+ return canInsertItem(slotIndex, itemStack, side);
+ }
+ return false;
+ }
+
+ @Override
+ public final boolean canExtractItem(int slotIndex, ItemStack itemStack, int side)
+ {
+ if (allowsAutomation()) {
+ return getInternalInventory().canExtractItem(slotIndex, itemStack, side);
+ }
+ return false;
+ }
+
+ @Override
+ public final boolean canSlotAccept(int slotIndex, ItemStack itemStack)
+ {
+ return getInternalInventory().canSlotAccept(slotIndex, itemStack);
+ }
+
+ @Override
+ public final boolean isLocked(int slotIndex)
+ {
+ return getInternalInventory().isLocked(slotIndex);
+ }
+
+ @Override
+ public final World getWorld()
+ {
+ return this.worldObj;
+ }
+
+ public final GameProfile getOwner()
+ {
+ return this.owner;
+ }
+
+ public final void setOwner(GameProfile owner)
+ {
+ this.owner = owner;
+ }
+
+
+
+}
diff --git a/src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractController.java b/src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractController.java
new file mode 100644
index 0000000000..2780cc1305
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractController.java
@@ -0,0 +1,7 @@
+package miscutil.core.multiblock.abstracts.interfaces;
+
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockController;
+
+public abstract interface IAbstractController extends IBaseMultiblockController {
+
+}
diff --git a/src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractControllerInternal.java b/src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractControllerInternal.java
new file mode 100644
index 0000000000..3e1638cda8
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractControllerInternal.java
@@ -0,0 +1,9 @@
+package miscutil.core.multiblock.abstracts.interfaces;
+
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockControllerInternal;
+
+public interface IAbstractControllerInternal extends IAbstractController, IBaseMultiblockControllerInternal {
+ //public abstract IInventoryAdapter getInternalInventory();
+
+ public abstract int getHealthScaled(int paramInt);
+ } \ No newline at end of file
diff --git a/src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractMultiblockLogic.java b/src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractMultiblockLogic.java
new file mode 100644
index 0000000000..aacb3c290d
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/abstracts/interfaces/IAbstractMultiblockLogic.java
@@ -0,0 +1,11 @@
+package miscutil.core.multiblock.abstracts.interfaces;
+
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockLogic;
+
+public abstract interface IAbstractMultiblockLogic extends IBaseMultiblockLogic {
+
+@Override
+public abstract IAbstractController getController();
+
+}
+
diff --git a/src/Java/miscutil/core/multiblock/base/BaseFakeMultiblockController.java b/src/Java/miscutil/core/multiblock/base/BaseFakeMultiblockController.java
new file mode 100644
index 0000000000..e4de47267c
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/base/BaseFakeMultiblockController.java
@@ -0,0 +1,123 @@
+package miscutil.core.multiblock.base;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockControllerInternal;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import raisintoast.core.common.CoordTriplet;
+import raisintoast.core.multiblock.IMultiblockPart;
+
+public abstract class BaseFakeMultiblockController
+implements IBaseMultiblockControllerInternal
+{
+ @Override
+ public void attachBlock(IMultiblockPart part) {}
+
+ @Override
+ public void detachBlock(IMultiblockPart part, boolean chunkUnloading) {}
+
+ @Override
+ public void checkIfMachineIsWhole() {}
+
+ public void assimilate(IBaseMultiblockControllerInternal other) {}
+
+ public void _onAssimilated(IBaseMultiblockControllerInternal otherController) {}
+
+ public void onAssimilated(IBaseMultiblockControllerInternal assimilator) {}
+
+ @Override
+ public void updateMultiblockEntity() {}
+
+ @Override
+ public CoordTriplet getReferenceCoord()
+ {
+ return null;
+ }
+
+ @Override
+ public void recalculateMinMaxCoords() {}
+
+ @Override
+ public void formatDescriptionPacket(NBTTagCompound data) {}
+
+ @Override
+ public void decodeDescriptionPacket(NBTTagCompound data) {}
+
+ @Override
+ public World getWorld()
+ {
+ return null;
+ }
+
+ @Override
+ public boolean isEmpty()
+ {
+ return true;
+ }
+
+ public boolean shouldConsume(IBaseMultiblockControllerInternal otherController)
+ {
+ return false;
+ }
+
+ @Override
+ public String getPartsListString()
+ {
+ return "";
+ }
+
+ @Override
+ public void auditParts() {}
+
+ @Override
+ @Nonnull
+ public Set<IMultiblockPart> checkForDisconnections()
+ {
+ return Collections.emptySet();
+ }
+
+ @Override
+ @Nonnull
+ public Set<IMultiblockPart> detachAllBlocks()
+ {
+ return Collections.emptySet();
+ }
+
+ @Override
+ public boolean isAssembled()
+ {
+ return false;
+ }
+
+ @Override
+ public void reassemble() {}
+
+ @Override
+ public String getLastValidationError()
+ {
+ return null;
+ }
+
+ @Override
+ @Nonnull
+ public Collection<IMultiblockPart> getComponents()
+ {
+ return Collections.emptyList();
+ }
+
+ public void readFromNBT(NBTTagCompound nbttagcompound) {
+
+ }
+
+ public void writeToNBT(NBTTagCompound nbttagcompound) {
+
+ }
+
+
+
+}
diff --git a/src/Java/miscutil/core/multiblock/base/BaseMultiblockLogic.java b/src/Java/miscutil/core/multiblock/base/BaseMultiblockLogic.java
new file mode 100644
index 0000000000..1812918109
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/base/BaseMultiblockLogic.java
@@ -0,0 +1,184 @@
+package miscutil.core.multiblock.base;
+
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockComponent;
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockControllerInternal;
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockLogic;
+import miscutil.core.util.Utils;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+import raisintoast.core.multiblock.IMultiblockPart;
+import raisintoast.core.multiblock.MultiblockRegistry;
+
+public abstract class BaseMultiblockLogic<T extends IBaseMultiblockControllerInternal>
+implements IBaseMultiblockLogic
+{
+ private final Class<T> controllerClass;
+ private boolean visited;
+ private boolean saveMultiblockData;
+ private NBTTagCompound cachedMultiblockData;
+ protected T controller;
+
+ protected BaseMultiblockLogic(Class<T> controllerClass)
+ {
+ this.controllerClass = controllerClass;
+ this.controller = null;
+ this.visited = false;
+ this.saveMultiblockData = false;
+ this.cachedMultiblockData = null;
+ }
+
+ public void setController(T controller)
+ {
+ if (controller == null) {
+ this.controller = null;
+ } else if (this.controllerClass.isAssignableFrom(controller.getClass())) {
+ this.controller = (this.controllerClass.cast(controller));
+ }
+ }
+
+ public Class<T> getControllerClass()
+ {
+ return this.controllerClass;
+ }
+
+ @Override
+ public abstract T getController();
+
+ public abstract T createNewController(World paramWorld);
+
+ @Override
+ public void validate(World world, IMultiblockPart part)
+ {
+ MultiblockRegistry.onPartAdded(world, part);
+ }
+
+ @Override
+ public final void invalidate(World world, IMultiblockPart part)
+ {
+ detachSelf(world, part, false);
+ }
+
+ @Override
+ public final void onChunkUnload(World world, IMultiblockPart part)
+ {
+ detachSelf(world, part, true);
+ }
+
+ protected void detachSelf(World world, IMultiblockPart part, boolean chunkUnloading)
+ {
+ if (this.controller != null)
+ {
+ this.controller.detachBlock(part, chunkUnloading);
+
+
+ this.controller = null;
+ }
+ MultiblockRegistry.onPartRemovedFromWorld(world, part);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound data)
+ {
+ if (data.hasKey("multiblockData")) {
+ this.cachedMultiblockData = data.getCompoundTag("multiblockData");
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound data)
+ {
+ if ((isMultiblockSaveDelegate()) && (isConnected()))
+ {
+ NBTTagCompound multiblockData = new NBTTagCompound();
+ ((IBaseMultiblockLogic) this.controller).writeToNBT(multiblockData);
+ data.setTag("multiblockData", multiblockData);
+ }
+ }
+
+ public final void assertDetached(IBaseMultiblockComponent part)
+ {
+ if (this.controller != null)
+ {
+ ChunkCoordinates coords = part.getCoordinates();
+ Utils.LOG_INFO("[assert] Part @ (%d, %d, %d) should be detached already, but detected that it was not. This is not a fatal error, and will be repaired, but is unusual. " + String.valueOf(new Object[] { Integer.valueOf(coords.posX), Integer.valueOf(coords.posY), Integer.valueOf(coords.posZ) }));
+ this.controller = null;
+ }
+ }
+
+ @Override
+ public final boolean isConnected()
+ {
+ return this.controller != null;
+ }
+
+ public final void becomeMultiblockSaveDelegate()
+ {
+ this.saveMultiblockData = true;
+ }
+
+ public final void forfeitMultiblockSaveDelegate()
+ {
+ this.saveMultiblockData = false;
+ }
+
+ public final boolean isMultiblockSaveDelegate()
+ {
+ return this.saveMultiblockData;
+ }
+
+ public final void setUnvisited()
+ {
+ this.visited = false;
+ }
+
+ public final void setVisited()
+ {
+ this.visited = true;
+ }
+
+ public final boolean isVisited()
+ {
+ return this.visited;
+ }
+
+ public final boolean hasMultiblockSaveData()
+ {
+ return this.cachedMultiblockData != null;
+ }
+
+ public final NBTTagCompound getMultiblockSaveData()
+ {
+ return this.cachedMultiblockData;
+ }
+
+ public final void onMultiblockDataAssimilated()
+ {
+ this.cachedMultiblockData = null;
+ }
+
+ @Override
+ public void encodeDescriptionPacket(NBTTagCompound packetData)
+ {
+ if ((isMultiblockSaveDelegate()) && (isConnected()))
+ {
+ NBTTagCompound tag = new NBTTagCompound();
+ this.controller.formatDescriptionPacket(tag);
+ packetData.setTag("multiblockData", tag);
+ }
+ }
+
+ @Override
+ public void decodeDescriptionPacket(NBTTagCompound packetData)
+ {
+ if (packetData.hasKey("multiblockData"))
+ {
+ NBTTagCompound tag = packetData.getCompoundTag("multiblockData");
+ if (isConnected()) {
+ this.controller.decodeDescriptionPacket(tag);
+ } else {
+ this.cachedMultiblockData = tag;
+ }
+ }
+ }
+}
diff --git a/src/Java/miscutil/core/multiblock/base/BaseMultiblockTE.java b/src/Java/miscutil/core/multiblock/base/BaseMultiblockTE.java
new file mode 100644
index 0000000000..e91ebd6143
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/base/BaseMultiblockTE.java
@@ -0,0 +1,100 @@
+package miscutil.core.multiblock.base;
+
+import miscutil.core.interfaces.IGuiManager;
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockController;
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockLogic;
+import miscutil.core.xmod.forestry.core.interfaces.IFilterSlotDelegate;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import raisintoast.core.multiblock.IMultiblockPart;
+
+public abstract class BaseMultiblockTE<T extends IBaseMultiblockLogic> extends IMultiblockPart implements IFilterSlotDelegate, IGuiManager
+{
+ private final T multiblockLogic;
+
+ public BaseMultiblockTE(T multiblockLogic)
+ {
+ this.multiblockLogic = multiblockLogic;
+ }
+
+ @Override
+ public ChunkCoordinates getCoordinates()
+ {
+ return new ChunkCoordinates(this.xCoord, this.yCoord, this.zCoord);
+ }
+
+ public T getMultiblockLogic()
+ {
+ return this.multiblockLogic;
+ }
+
+ public abstract void onMachineAssembled(IBaseMultiblockController paramIMultiblockController, ChunkCoordinates paramChunkCoordinates1, ChunkCoordinates paramChunkCoordinates2);
+
+ @Override
+ public abstract void onMachineBroken();
+
+ @Override
+ public void readFromNBT(NBTTagCompound data)
+ {
+ super.readFromNBT(data);
+ this.multiblockLogic.readFromNBT(data);
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound data)
+ {
+ super.writeToNBT(data);
+ this.multiblockLogic.writeToNBT(data);
+ }
+
+ @Override
+ public boolean canUpdate()
+ {
+ return false;
+ }
+
+ @Override
+ public final void invalidate()
+ {
+ super.invalidate();
+ this.multiblockLogic.invalidate(this.worldObj, this);
+ }
+
+ @Override
+ public final void onChunkUnload()
+ {
+ super.onChunkUnload();
+ this.multiblockLogic.onChunkUnload(this.worldObj, this);
+ }
+
+ @Override
+ public final void validate()
+ {
+ super.validate();
+ this.multiblockLogic.validate(this.worldObj, this);
+ }
+
+ @Override
+ public final Packet getDescriptionPacket()
+ {
+ NBTTagCompound packetData = new NBTTagCompound();
+ this.multiblockLogic.encodeDescriptionPacket(packetData);
+ encodeDescriptionPacket(packetData);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, packetData);
+ }
+
+ @Override
+ public final void onDataPacket(NetworkManager network, S35PacketUpdateTileEntity packet)
+ {
+ NBTTagCompound nbtData = packet.func_148857_g();
+ this.multiblockLogic.decodeDescriptionPacket(nbtData);
+ decodeDescriptionPacket(nbtData);
+ }
+
+ protected void encodeDescriptionPacket(NBTTagCompound packetData) {}
+
+ protected void decodeDescriptionPacket(NBTTagCompound packetData) {}
+}
diff --git a/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockComponent.java b/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockComponent.java
new file mode 100644
index 0000000000..c78012662e
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockComponent.java
@@ -0,0 +1,17 @@
+package miscutil.core.multiblock.base.interfaces;
+
+import net.minecraft.util.ChunkCoordinates;
+
+import com.mojang.authlib.GameProfile;
+
+public interface IBaseMultiblockComponent {
+ public abstract ChunkCoordinates getCoordinates();
+
+ public abstract GameProfile getOwner();
+
+ public abstract IBaseMultiblockLogic getMultiblockLogic();
+
+ public abstract void onMachineAssembled(IBaseMultiblockController paramIMultiblockController, ChunkCoordinates paramChunkCoordinates1, ChunkCoordinates paramChunkCoordinates2);
+
+ public abstract void onMachineBroken();
+ }
diff --git a/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockController.java b/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockController.java
new file mode 100644
index 0000000000..cd52328b03
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockController.java
@@ -0,0 +1,18 @@
+package miscutil.core.multiblock.base.interfaces;
+
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import raisintoast.core.multiblock.IMultiblockPart;
+
+public interface IBaseMultiblockController {
+ public abstract boolean isAssembled();
+
+ public abstract void reassemble();
+
+ public abstract String getLastValidationError();
+
+ @Nonnull
+ public abstract Collection<IMultiblockPart> getComponents();
+ } \ No newline at end of file
diff --git a/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockControllerInternal.java b/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockControllerInternal.java
new file mode 100644
index 0000000000..9ebc9e8127
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockControllerInternal.java
@@ -0,0 +1,52 @@
+package miscutil.core.multiblock.base.interfaces;
+
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import raisintoast.core.common.CoordTriplet;
+import raisintoast.core.multiblock.IMultiblockPart;
+
+public abstract interface IBaseMultiblockControllerInternal
+extends IBaseMultiblockController {
+
+public abstract void attachBlock(IMultiblockPart paramIMultiblockComponent);
+
+public abstract void detachBlock(IMultiblockPart paramIMultiblockComponent, boolean paramBoolean);
+
+public abstract void checkIfMachineIsWhole();
+
+public abstract void assimilate(IBaseMultiblockController paramIMultiblockControllerInternal);
+
+public abstract void _onAssimilated(IBaseMultiblockController paramIMultiblockControllerInternal);
+
+public abstract void onAssimilated(IBaseMultiblockController paramIMultiblockControllerInternal);
+
+public abstract void updateMultiblockEntity();
+
+public abstract CoordTriplet getReferenceCoord();
+
+public abstract void recalculateMinMaxCoords();
+
+public abstract void formatDescriptionPacket(NBTTagCompound paramNBTTagCompound);
+
+public abstract void decodeDescriptionPacket(NBTTagCompound paramNBTTagCompound);
+
+public abstract World getWorld();
+
+public abstract boolean isEmpty();
+
+public abstract boolean shouldConsume(IBaseMultiblockController paramIMultiblockControllerInternal);
+
+public abstract String getPartsListString();
+
+public abstract void auditParts();
+
+@Nonnull
+public abstract Set<IMultiblockPart> checkForDisconnections();
+
+@Nonnull
+public abstract Set<IMultiblockPart> detachAllBlocks();
+}
diff --git a/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockLogic.java b/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockLogic.java
new file mode 100644
index 0000000000..4bc7e5b56f
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockLogic.java
@@ -0,0 +1,27 @@
+package miscutil.core.multiblock.base.interfaces;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import raisintoast.core.multiblock.IMultiblockPart;
+
+public interface IBaseMultiblockLogic {
+
+ public abstract boolean isConnected();
+
+ public abstract IBaseMultiblockController getController();
+
+ public abstract void validate(World paramWorld, IMultiblockPart paramIMultiblockComponent);
+
+ public abstract void invalidate(World paramWorld, IMultiblockPart paramIMultiblockComponent);
+
+ public abstract void onChunkUnload(World paramWorld, IMultiblockPart paramIMultiblockComponent);
+
+ public abstract void encodeDescriptionPacket(NBTTagCompound paramNBTTagCompound);
+
+ public abstract void decodeDescriptionPacket(NBTTagCompound paramNBTTagCompound);
+
+ public abstract void readFromNBT(NBTTagCompound paramNBTTagCompound);
+
+ public abstract void writeToNBT(NBTTagCompound paramNBTTagCompound);
+
+}
diff --git a/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockSizeLimits.java b/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockSizeLimits.java
new file mode 100644
index 0000000000..ca266c2cc9
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/base/interfaces/IBaseMultiblockSizeLimits.java
@@ -0,0 +1,19 @@
+package miscutil.core.multiblock.base.interfaces;
+
+public abstract interface IBaseMultiblockSizeLimits {
+
+ public abstract int getMinNumberOfBlocksForAssembledMachine();
+
+ public abstract int getMaxXSize();
+
+ public abstract int getMaxZSize();
+
+ public abstract int getMaxYSize();
+
+ public abstract int getMinXSize();
+
+ public abstract int getMinYSize();
+
+ public abstract int getMinZSize();
+
+ } \ No newline at end of file
diff --git a/src/Java/miscutil/core/multiblock/test/TileAlveary.java b/src/Java/miscutil/core/multiblock/test/TileAlveary.java
new file mode 100644
index 0000000000..7a39809508
--- /dev/null
+++ b/src/Java/miscutil/core/multiblock/test/TileAlveary.java
@@ -0,0 +1,66 @@
+package miscutil.core.multiblock.test;
+
+import miscutil.core.multiblock.abstracts.AbstractMultiblockLogic;
+import miscutil.core.multiblock.abstracts.AbstractMultiblockTE;
+import miscutil.core.multiblock.base.interfaces.IBaseMultiblockController;
+import net.minecraft.util.ChunkCoordinates;
+import forestry.api.apiculture.IAlvearyComponent;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.core.gui.IHintSource;
+import forestry.core.network.IStreamableGui;
+import forestry.core.tiles.IClimatised;
+import forestry.core.tiles.IRestrictedAccessTile;
+import forestry.core.tiles.ITitled;
+
+public abstract class TileAlveary
+ extends AbstractMultiblockTE<AbstractMultiblockLogic>
+ implements IBeeHousing, IAlvearyComponent, IRestrictedAccessTile, IStreamableGui, ITitled, IClimatised, IHintSource
+{
+
+ public static enum Type
+ {
+ PLAIN, ENTRANCE, SWARMER, FAN, HEATER, HYGRO, STABILIZER, SIEVE;
+
+ public static final Type[] VALUES = values();
+
+ private Type() {}
+ }
+
+ private final String unlocalizedTitle;
+ protected TileAlveary()
+ {
+ this(Type.PLAIN);
+ }
+
+ protected TileAlveary(Type type)
+ {
+ super(new AbstractMultiblockLogic());
+ this.unlocalizedTitle = ("tile.for.alveary." + type.ordinal() + ".name");
+ }
+
+ public int getIcon(int side)
+ {
+ return 0;
+ }
+
+ @Override
+public void onMachineAssembled(IBaseMultiblockController multiblockController, ChunkCoordinates minCoord, ChunkCoordinates maxCoord)
+ {
+ if (this.worldObj.isRemote) {
+ this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
+ }
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, getBlockType());
+ markDirty();
+ }
+
+ @Override
+public void onMachineBroken()
+ {
+ if (this.worldObj.isRemote) {
+ this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
+ }
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, getBlockType());
+ markDirty();
+ }
+
+}
diff --git a/src/Java/miscutil/core/xmod/forestry/core/interfaces/IFilterSlotDelegate.java b/src/Java/miscutil/core/xmod/forestry/core/interfaces/IFilterSlotDelegate.java
new file mode 100644
index 0000000000..d3290d7491
--- /dev/null
+++ b/src/Java/miscutil/core/xmod/forestry/core/interfaces/IFilterSlotDelegate.java
@@ -0,0 +1,10 @@
+package miscutil.core.xmod.forestry.core.interfaces;
+
+import net.minecraft.item.ItemStack;
+
+public abstract interface IFilterSlotDelegate
+{
+ public abstract boolean canSlotAccept(int paramInt, ItemStack paramItemStack);
+
+ public abstract boolean isLocked(int paramInt);
+}
diff --git a/src/Java/miscutil/core/xmod/forestry/core/interfaces/IInventoryAdapter.java b/src/Java/miscutil/core/xmod/forestry/core/interfaces/IInventoryAdapter.java
new file mode 100644
index 0000000000..95a24d90e3
--- /dev/null
+++ b/src/Java/miscutil/core/xmod/forestry/core/interfaces/IInventoryAdapter.java
@@ -0,0 +1,7 @@
+package miscutil.core.xmod.forestry.core.interfaces;
+
+import net.minecraft.inventory.ISidedInventory;
+
+public abstract interface IInventoryAdapter
+ extends ISidedInventory, IFilterSlotDelegate, INBTTagable
+{} \ No newline at end of file
diff --git a/src/Java/miscutil/core/xmod/forestry/core/interfaces/INBTTagable.java b/src/Java/miscutil/core/xmod/forestry/core/interfaces/INBTTagable.java
new file mode 100644
index 0000000000..6053e5f5ba
--- /dev/null
+++ b/src/Java/miscutil/core/xmod/forestry/core/interfaces/INBTTagable.java
@@ -0,0 +1,10 @@
+package miscutil.core.xmod.forestry.core.interfaces;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+public abstract interface INBTTagable
+{
+ public abstract void readFromNBT(NBTTagCompound paramNBTTagCompound);
+
+ public abstract void writeToNBT(NBTTagCompound paramNBTTagCompound);
+}
diff --git a/src/Java/miscutil/core/xmod/forestry/core/inventory/FakeInventoryAdapter.java b/src/Java/miscutil/core/xmod/forestry/core/inventory/FakeInventoryAdapter.java
new file mode 100644
index 0000000000..39d1075dc7
--- /dev/null
+++ b/src/Java/miscutil/core/xmod/forestry/core/inventory/FakeInventoryAdapter.java
@@ -0,0 +1,120 @@
+package miscutil.core.xmod.forestry.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import forestry.core.inventory.IInventoryAdapter;
+
+public class FakeInventoryAdapter implements IInventoryAdapter {
+
+ public static final int[] SLOTS_NONE = new int[0];
+ private static FakeInventoryAdapter instance;
+ public static FakeInventoryAdapter instance(){
+ if (instance == null) {
+ instance = new FakeInventoryAdapter();
+ }
+ return instance;
+ }
+
+ @Override
+ public boolean canSlotAccept(int slotIndex, ItemStack itemStack){
+ return false;
+ }
+
+ @Override
+ public boolean isLocked(int slotIndex)
+ {
+ return false;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(int p_94128_1_)
+ {
+ return SLOTS_NONE;
+ }
+
+ @Override
+ public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_)
+ {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_)
+ {
+ return false;
+ }
+
+ @Override
+ public int getSizeInventory()
+ {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int p_70301_1_)
+ {
+ return null;
+ }
+
+ @Override
+ public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_)
+ {
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(int p_70304_1_)
+ {
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) {}
+
+ @Override
+ public String getInventoryName()
+ {
+ return null;
+ }
+
+ @Override
+ public boolean hasCustomInventoryName()
+ {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit()
+ {
+ return 0;
+ }
+
+ @Override
+ public void markDirty() {}
+
+ @Override
+ public boolean isUseableByPlayer(EntityPlayer p_70300_1_)
+ {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_)
+ {
+ return false;
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound nbttagcompound) {}
+
+ @Override
+ public void writeToNBT(NBTTagCompound nbttagcompound) {}
+
+}