aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/multitileentity/interfaces
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/multitileentity/interfaces')
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java19
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java51
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockEnergy.java42
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java32
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java60
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java26
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java293
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java10
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java63
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java10
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java12
11 files changed, 618 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java b/src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java
new file mode 100644
index 0000000000..89d281eb27
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java
@@ -0,0 +1,19 @@
+package gregtech.api.multitileentity.interfaces;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+public interface IItemUpdatable {
+
+ /**
+ * Updates the Data of the ItemStack. Not called every tick but instead called whenever something important happens
+ * to the Stack.
+ */
+ void updateItemStack(ItemStack aStack);
+
+ /**
+ * Updates the Data of the ItemStack. Not called every tick but instead called whenever something important happens
+ * to the Stack.
+ */
+ void updateItemStack(ItemStack aStack, World aWorld, int aX, int aY, int aZ);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
new file mode 100644
index 0000000000..58af918c50
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
@@ -0,0 +1,51 @@
+package gregtech.api.multitileentity.interfaces;
+
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.InventoryType;
+import gregtech.api.gui.GUIHost;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.interfaces.FluidInventoryLogicHost;
+import gregtech.api.logic.interfaces.ItemInventoryLogicHost;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.multitileentity.enums.MultiTileCasingPurpose;
+
+public interface IMultiBlockController
+ extends IMultiTileEntity, FluidInventoryLogicHost, ItemInventoryLogicHost, UpgradableMuTE, PowerLogicHost, GUIHost {
+
+ boolean checkStructure(boolean aForceReset);
+
+ /** Set the structure as having changed, and trigger an update */
+ void onStructureChange();
+
+ @Override
+ ChunkCoordinates getCoords();
+
+ void registerCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart part);
+
+ void unregisterCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart part);
+
+ void registerCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part);
+
+ void unregisterCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part);
+
+ UUID registerItemInventory(int slots, int tier, @Nonnull InventoryType type, boolean isUpgradeInventory);
+
+ ItemInventoryLogic unregisterItemInventory(@Nonnull UUID id, @Nonnull InventoryType type);
+
+ void changeItemInventoryDisplayName(@Nonnull UUID id, @Nullable String displayName, @Nonnull InventoryType type);
+
+ UUID registerFluidInventory(int tanks, long capacity, int tier, @Nonnull InventoryType type,
+ boolean isUpgradeInventory);
+
+ FluidInventoryLogic unregisterFluidInventory(@Nonnull UUID id, @Nonnull InventoryType type);
+
+ void changeFluidInventoryDisplayName(@Nonnull UUID id, @Nullable String displayName, @Nonnull InventoryType type);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockEnergy.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockEnergy.java
new file mode 100644
index 0000000000..d6d8bf5310
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockEnergy.java
@@ -0,0 +1,42 @@
+package gregtech.api.multitileentity.interfaces;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+interface IMultiBlockEnergy {
+
+ boolean isUniversalEnergyStored(MultiBlockPart aPart, long aEnergyAmount);
+
+ long getUniversalEnergyStored(MultiBlockPart aPart);
+
+ long getUniversalEnergyCapacity(MultiBlockPart aPart);
+
+ long getOutputAmperage(MultiBlockPart aPart);
+
+ long getOutputVoltage(MultiBlockPart aPart);
+
+ long getInputAmperage(MultiBlockPart aPart);
+
+ long getInputVoltage(MultiBlockPart aPart);
+
+ boolean decreaseStoredEnergyUnits(MultiBlockPart aPart, long aEnergy, boolean aIgnoreTooLittleEnergy);
+
+ boolean increaseStoredEnergyUnits(MultiBlockPart aPart, long aEnergy, boolean aIgnoreTooMuchEnergy);
+
+ boolean drainEnergyUnits(MultiBlockPart aPart, ForgeDirection side, long aVoltage, long aAmperage);
+
+ long injectEnergyUnits(MultiBlockPart aPart, ForgeDirection side, long aVoltage, long aAmperage);
+
+ long getAverageElectricInput(MultiBlockPart aPart);
+
+ long getAverageElectricOutput(MultiBlockPart aPart);
+
+ long getStoredEU(MultiBlockPart aPart);
+
+ long getEUCapacity(MultiBlockPart aPart);
+
+ boolean inputEnergyFrom(MultiBlockPart aPart, ForgeDirection side);
+
+ boolean outputsEnergyTo(MultiBlockPart aPart, ForgeDirection side);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java
new file mode 100644
index 0000000000..b513f51324
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java
@@ -0,0 +1,32 @@
+package gregtech.api.multitileentity.interfaces;
+
+import java.util.List;
+
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidTank;
+
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+public interface IMultiBlockFluidHandler {
+
+ int fill(MultiBlockPart aPart, ForgeDirection aDirection, FluidStack aFluid, boolean aDoFill);
+
+ FluidStack drain(MultiBlockPart aPart, ForgeDirection aDirection, FluidStack aFluid, boolean aDoDrain);
+
+ FluidStack drain(MultiBlockPart aPart, ForgeDirection aDirection, int aAmountToDrain, boolean aDoDrain);
+
+ boolean canFill(MultiBlockPart aPart, ForgeDirection aDirection, Fluid aFluid);
+
+ boolean canDrain(MultiBlockPart aPart, ForgeDirection aDirection, Fluid aFluid);
+
+ FluidTankInfo[] getTankInfo(MultiBlockPart aPart, ForgeDirection aDirection);
+
+ IFluidTank[] getFluidTanksForGUI(MultiBlockPart aPart);
+
+ List<String> getTankArrayNames(MultiBlockPart aPart);
+
+ List<String> getTankArrayIDs(MultiBlockPart aPart);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java
new file mode 100644
index 0000000000..5dc0fec196
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java
@@ -0,0 +1,60 @@
+package gregtech.api.multitileentity.interfaces;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+public interface IMultiBlockInventory {
+
+ boolean hasInventoryBeenModified(MultiBlockPart aPart);
+
+ boolean isValidSlot(MultiBlockPart aPart, int aIndex);
+
+ boolean addStackToSlot(MultiBlockPart aPart, int aIndex, ItemStack aStack);
+
+ boolean addStackToSlot(MultiBlockPart aPart, int aIndex, ItemStack aStack, int aAmount);
+
+ int[] getAccessibleSlotsFromSide(MultiBlockPart aPart, ForgeDirection side);
+
+ boolean canInsertItem(MultiBlockPart aPart, int aSlot, ItemStack aStack, ForgeDirection side);
+
+ boolean canExtractItem(MultiBlockPart aPart, int aSlot, ItemStack aStack, ForgeDirection side);
+
+ int getSizeInventory(MultiBlockPart aPart);
+
+ ItemStack getStackInSlot(MultiBlockPart aPart, int aSlot);
+
+ ItemStack decrStackSize(MultiBlockPart aPart, int aSlot, int aDecrement);
+
+ ItemStack getStackInSlotOnClosing(MultiBlockPart aPart, int aSlot);
+
+ void setInventorySlotContents(MultiBlockPart aPart, int aSlot, ItemStack aStack);
+
+ String getInventoryName(MultiBlockPart aPart);
+
+ boolean hasCustomInventoryName(MultiBlockPart aPart);
+
+ int getInventoryStackLimit(MultiBlockPart aPart);
+
+ void markDirty(MultiBlockPart aPart);
+
+ boolean isUseableByPlayer(MultiBlockPart aPart, EntityPlayer aPlayer);
+
+ void openInventory(MultiBlockPart aPart);
+
+ void closeInventory(MultiBlockPart aPart);
+
+ boolean isItemValidForSlot(MultiBlockPart aPart, int aSlot, ItemStack aStack);
+
+ IItemHandlerModifiable getInventoryForGUI(MultiBlockPart aPart);
+
+ List<String> getInventoryNames(MultiBlockPart aPart);
+
+ List<String> getInventoryIDs(MultiBlockPart aPart);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java
new file mode 100644
index 0000000000..59d838fdeb
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java
@@ -0,0 +1,26 @@
+package gregtech.api.multitileentity.interfaces;
+
+import java.util.UUID;
+
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.logic.interfaces.FluidInventoryLogicHost;
+import gregtech.api.logic.interfaces.ItemInventoryLogicHost;
+
+public interface IMultiBlockPart extends IMultiTileEntity, ItemInventoryLogicHost, FluidInventoryLogicHost {
+
+ ChunkCoordinates getTargetPos();
+
+ void setTargetPos(ChunkCoordinates aTargetPos);
+
+ void setLockedInventoryIndex(int aIndex);
+
+ int getLockedInventoryIndex();
+
+ UUID getLockedInventory();
+
+ boolean tickCoverAtSide(ForgeDirection side, long aTickTimer);
+
+ boolean shouldTick(long tickTimer);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java
new file mode 100644
index 0000000000..91803690fc
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java
@@ -0,0 +1,293 @@
+package gregtech.api.multitileentity.interfaces;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import net.minecraft.block.Block;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.common.Optional;
+import gregtech.api.enums.Mods;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IDebugableTileEntity;
+import gregtech.api.interfaces.tileentity.ITurnable;
+import gregtech.api.multitileentity.MultiTileEntityBlockInternal;
+import gregtech.api.multitileentity.MultiTileEntityItemInternal;
+import gregtech.api.multitileentity.MultiTileEntityRegistry;
+
+/*
+ * Heavily inspired by GT6
+ */
+public interface IMultiTileEntity extends ICoverable, ITurnable, IDebugableTileEntity {
+
+ /**
+ * Those two IDs HAVE to be saved inside the NBT of the TileEntity itself. They get set by the Registry itself, when
+ * the TileEntity is placed.
+ */
+ short getMultiTileEntityID();
+
+ short getMultiTileEntityRegistryID();
+
+ /**
+ * Called by the Registry with the default NBT Parameters and the two IDs you have to save, when the TileEntity is
+ * created. aNBT may be null, take that into account if you decide to call the regular readFromNBT Function from
+ * here.
+ */
+ void initFromNBT(NBTTagCompound aNBT, short aMTEID, short aMTERegistry);
+
+ /** Writes Item Data to the NBT. */
+ NBTTagCompound writeItemNBT(NBTTagCompound aNBT);
+
+ /** Sets the Item Display Name. Use null to reset it. */
+ void setCustomName(String aName);
+
+ String getCustomName();
+
+ /** return the internal Name of this TileEntity to be registered. */
+ String getTileEntityName();
+
+ /**
+ * Called when a TileEntity of this particular Class is being registered first at any MultiTileEntity Registry. So
+ * basically one call per Class.
+ */
+ void onRegistrationFirst(MultiTileEntityRegistry aRegistry, short aID);
+
+ /** Called after the TileEntity has been placed and set up. */
+ void onTileEntityPlaced();
+
+ /** Checks if the TileEntity is Invalid or Unloaded, should bes required for every TileEntity. */
+ @Override
+ boolean isDead();
+
+ void loadTextures(String folder);
+
+ void copyTextures();
+
+ void issueClientUpdate();
+
+ void sendClientData(EntityPlayerMP aPlayer);
+
+ boolean receiveClientData(int aEventID, int aValue);
+
+ void setShouldRefresh(boolean aShouldRefresh);
+
+ void addCollisionBoxesToList(AxisAlignedBB aAABB, List<AxisAlignedBB> aList, Entity aEntity);
+
+ AxisAlignedBB getCollisionBoundingBoxFromPool();
+
+ AxisAlignedBB getSelectedBoundingBoxFromPool();
+
+ void setBlockBoundsBasedOnState(Block aBlock);
+
+ void onBlockAdded();
+
+ boolean playerOwnsThis(EntityPlayer aPlayer, boolean aCheckPrecicely);
+
+ boolean privateAccess();
+
+ /** @return the amount of Time this TileEntity has been loaded. */
+ @Override
+ long getTimer();
+
+ /** Sets the Owner of the Machine. Returns the set Name. */
+ String setOwnerName(String aName);
+
+ /** gets the Name of the Machines Owner or "Player" if not set. */
+ String getOwnerName();
+
+ /** Gets the UniqueID of the Machines Owner. */
+ UUID getOwnerUuid();
+
+ /** Sets the UniqueID of the Machines Owner. */
+ void setOwnerUuid(UUID uuid);
+
+ /**
+ * Causes a general Texture update. Only used Client Side to mark Blocks dirty.
+ */
+ void issueTextureUpdate();
+
+ /**
+ * Paintable Support
+ */
+ boolean unpaint();
+
+ boolean isPainted();
+
+ boolean paint(int aRGB);
+
+ int getPaint();
+
+ /**
+ * Sets the main facing to {side} and update as appropriately
+ *
+ * @return Whether the facing was changed
+ */
+ boolean setMainFacing(ForgeDirection side);
+
+ boolean isFacingValid(ForgeDirection facing);
+
+ void onFacingChange();
+
+ @Override
+ default void setFrontFacing(ForgeDirection side) {
+ setMainFacing(side);
+ }
+
+ boolean shouldTriggerBlockUpdate();
+
+ void onMachineBlockUpdate();
+
+ boolean allowInteraction(Entity aEntity);
+
+ default void onLeftClick(EntityPlayer aPlayer) {
+ /* do nothing */
+ }
+
+ boolean onBlockActivated(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ);
+
+ boolean onRightClick(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ);
+
+ ArrayList<ItemStack> getDrops(int aFortune, boolean aSilkTouch);
+
+ boolean isSideSolid(ForgeDirection side);
+
+ float getExplosionResistance(Entity aExploder, double aExplosionX, double aExplosionY, double aExplosionZ);
+
+ float getExplosionResistance();
+
+ void onExploded(Explosion aExplosion);
+
+ boolean recolourBlock(ForgeDirection side, byte aColor);
+
+ /** Adds to the Creative Tab. return false to prevent it from being added. */
+ boolean getSubItems(MultiTileEntityBlockInternal aBlock, Item aItem, CreativeTabs aTab, List<ItemStack> aList,
+ short aID);
+
+ ItemStack getPickBlock(MovingObjectPosition aTarget);
+
+ boolean shouldSideBeRendered(ForgeDirection side);
+
+ boolean isSurfaceOpaque(ForgeDirection side);
+
+ boolean onPlaced(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, ForgeDirection side,
+ float aHitX, float aHitY, float aHitZ);
+
+ // ItemStack getPickBlock(MovingObjectPosition aTarget);
+
+ /*
+ * Various Sub Interfaces from GT6
+ */
+
+ interface IMTE_OnNeighborBlockChange extends IMultiTileEntity {
+
+ void onNeighborBlockChange(World aWorld, Block aBlock);
+ }
+
+ interface IMTE_IsProvidingWeakPower extends IMultiTileEntity {
+
+ /** Remember that it passes the opposite Side due to the way vanilla works! */
+ int isProvidingWeakPower(ForgeDirection oppositeSide);
+ }
+
+ interface IMTE_IsProvidingStrongPower extends IMultiTileEntity {
+
+ /** Remember that it passes the opposite Side due to the way vanilla works! */
+ int isProvidingStrongPower(ForgeDirection oppositeSide);
+ }
+
+ interface IMTE_ShouldCheckWeakPower extends IMultiTileEntity {
+
+ boolean shouldCheckWeakPower(ForgeDirection side);
+ }
+
+ interface IMTE_GetWeakChanges extends IMultiTileEntity {
+
+ boolean getWeakChanges();
+ }
+
+ interface IMTE_GetComparatorInputOverride extends IMultiTileEntity {
+
+ int getComparatorInputOverride(ForgeDirection side);
+ }
+
+ interface IMTE_BreakBlock extends IMultiTileEntity {
+
+ /** return true to prevent the TileEntity from being removed. */
+ boolean breakBlock();
+ }
+
+ interface IMTE_HasMultiBlockMachineRelevantData extends IMultiTileEntity {
+
+ /** Return true to mark this Block as a Machine Block for Multiblocks. (Triggers machine update thread) */
+ boolean hasMultiBlockMachineRelevantData();
+ }
+
+ interface IMTE_GetBlockHardness extends IMultiTileEntity {
+
+ float getBlockHardness();
+ }
+
+ interface IMTE_GetFoodValues extends IMultiTileEntity {
+
+ @Optional.Method(modid = Mods.Names.APPLE_CORE)
+ squeek.applecore.api.food.FoodValues getFoodValues(MultiTileEntityItemInternal aItem, ItemStack aStack);
+ }
+
+ interface IMTE_OnlyPlaceableWhenSneaking extends IMultiTileEntity {
+
+ /** Return true to prevent placing this Block without Sneaking. */
+ boolean onlyPlaceableWhenSneaking();
+ }
+
+ interface IMTE_IgnoreEntityCollisionWhenPlacing extends IMultiTileEntity {
+
+ /**
+ * Return true to ignore the Player standing in the way of placing this Block; useful for things like
+ * pipes/wires.
+ */
+ boolean ignoreEntityCollisionWhenPlacing(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY,
+ int aZ, ForgeDirection side, float aHitX, float aHitY, float aHitZ);
+ }
+
+ interface IMTE_CanPlace extends IMultiTileEntity {
+
+ /** Return false if this TileEntity cannot be placed at that Location. */
+ boolean canPlace(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ ForgeDirection side, float aHitX, float aHitY, float aHitZ);
+ }
+
+ interface IMTE_GetMaxStackSize extends IMultiTileEntity {
+
+ /** Gets the Max Stacksize of this Item. */
+ byte getMaxStackSize(ItemStack aStack, byte aDefault);
+ }
+
+ interface IMTE_AddToolTips extends IMultiTileEntity {
+
+ /** Adds ToolTips to the Item. */
+ void addToolTips(List<String> aList, ItemStack aStack, boolean aF3_H);
+ }
+
+ interface IMTE_HasModes extends IMultiTileEntity {
+
+ int getMode();
+
+ void setMode(int mode);
+
+ int getAllowedModes();
+
+ void setAllowedModes(int allowedModes);
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java
new file mode 100644
index 0000000000..babb85d118
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java
@@ -0,0 +1,10 @@
+package gregtech.api.multitileentity.interfaces;
+
+public interface IMultiTileMachine {
+
+ void setBooleans(int booleans);
+
+ int getBooleans();
+
+ void setSound(byte soundEvent, int soundEventValue);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java
new file mode 100644
index 0000000000..2045f28d67
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java
@@ -0,0 +1,63 @@
+package gregtech.api.multitileentity.interfaces;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+
+import gregtech.api.net.GT_Packet_MultiTileEntity;
+
+public interface SyncedMultiTileEntity {
+
+ public static final int DEFAULT_TIMED_PACKET_PERIOD = 20;
+
+ /**
+ * Will send a packet to the client when they open the controller or access a casing.
+ * Should only be sent to one player!
+ */
+ void sendFullPacket(@Nonnull EntityPlayerMP player);
+
+ /**
+ * Should always collect all the data that the controller or casing has and should send
+ * Called by {@link #sendFullPacket()}
+ *
+ * @param packet The packet which will be sent
+ */
+ void getFullPacketData(GT_Packet_MultiTileEntity packet);
+
+ /**
+ * Will send a packet at a certain period of time, defined by {@link #getTimedPacketPeriod()}, to all players around
+ * the controller or casing to send important information.
+ * Redstone state, color, ect. It shouldn't send data about the internals like inventory and processing time
+ */
+ void sendTimedPacket();
+
+ /**
+ * Collects all the data that should be sent out at a certain period of time defined by
+ * {@link #getTimedPacketPeriod()}
+ * Called by {@link #sendTimedPacket()}
+ *
+ * @param packet The packet which will be sent
+ */
+ void getTimedPacketData(GT_Packet_MultiTileEntity packet);
+
+ /**
+ * Defines the period of time at which a timed packet should be sent out. Default 20 ticks
+ */
+ default int getTimedPacketPeriod() {
+ return DEFAULT_TIMED_PACKET_PERIOD;
+ }
+
+ /**
+ * Will send a packet, which should only contain data about how the TileEntity should be rendered.
+ * !!! Warning !!! This is sent every single tick! Do not put a lot of data here!
+ */
+ void sendGraphicPacket();
+
+ /**
+ * Collects all the data that is needed to be send every single tick
+ * Called by {@link #sendGraphicPacket()}
+ *
+ * @param packet The packet which will be sent
+ */
+ void getGraphicPacketData(GT_Packet_MultiTileEntity packet);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java
new file mode 100644
index 0000000000..3b4c3cb6f3
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java
@@ -0,0 +1,10 @@
+package gregtech.api.multitileentity.interfaces;
+
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+
+public interface UpgradableModularMuTE extends UpgradableMuTE {
+
+ void increaseMucCount(UpgradeCasings casingType, int tier);
+
+ void resetMucCount();
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java
new file mode 100644
index 0000000000..c18852c95e
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java
@@ -0,0 +1,12 @@
+package gregtech.api.multitileentity.interfaces;
+
+public interface UpgradableMuTE {
+
+ void setCleanroom(boolean isCleanroom);
+
+ void setWirelessSupport(boolean canUse);
+
+ void setLaserSupport(boolean canUse);
+
+ void setMaxAmperage(long amperage);
+}