aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/multitileentity
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/multitileentity')
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java93
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java157
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/BaseNontickableMultiTileEntity.java11
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java4
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java3
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java6
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java11
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java10
-rw-r--r--src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java112
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java452
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java274
11 files changed, 854 insertions, 279 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
index 876fa50f0b..dc9a9fd529 100644
--- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
@@ -1,5 +1,6 @@
package gregtech.api.multitileentity;
+import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES;
import static gregtech.api.enums.GT_Values.OFFX;
import static gregtech.api.enums.GT_Values.OFFY;
import static gregtech.api.enums.GT_Values.OFFZ;
@@ -20,7 +21,6 @@ import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.tileentity.IDebugableTileEntity;
import gregtech.api.metatileentity.BaseTileEntity;
import gregtech.api.metatileentity.CoverableTileEntity;
-import gregtech.api.metatileentity.GregTechTileClientEvents;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_BreakBlock;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_GetBlockHardness;
@@ -35,6 +35,7 @@ import gregtech.api.objects.XSTR;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_Util;
import gregtech.api.util.GT_Utility;
+import gregtech.common.covers.CoverInfo;
import gregtech.common.render.GT_Renderer_Block;
import gregtech.common.render.IRenderedBlock;
import java.util.ArrayList;
@@ -451,16 +452,13 @@ public class MultiTileEntityBlock extends Block
final byte aSide = (byte) side;
final CoverableTileEntity tile = (CoverableTileEntity) tTileEntity;
if (side != -1) {
- final Block facadeBlock = tile.getCoverBehaviorAtSideNew(aSide)
- .getFacadeBlock(
- aSide, tile.getCoverIDAtSide(aSide), tile.getComplexCoverDataAtSide(aSide), tile);
+ final Block facadeBlock = tile.getCoverInfoAtSide(aSide).getFacadeBlock();
if (facadeBlock != null) return facadeBlock;
} else {
// we do not allow more than one type of facade per block, so no need to check every side
// see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable
- for (byte i = 0; i < 6; i++) {
- final Block facadeBlock = tile.getCoverBehaviorAtSideNew(i)
- .getFacadeBlock(i, tile.getCoverIDAtSide(i), tile.getComplexCoverDataAtSide(i), tile);
+ for (byte tSide : ALL_VALID_SIDES) {
+ final Block facadeBlock = tile.getCoverInfoAtSide(tSide).getFacadeBlock();
if (facadeBlock != null) {
return facadeBlock;
}
@@ -477,22 +475,17 @@ public class MultiTileEntityBlock extends Block
final byte aSide = (byte) side;
final CoverableTileEntity tile = (CoverableTileEntity) tTileEntity;
if (side != -1) {
- final Block facadeBlock = tile.getCoverBehaviorAtSideNew(aSide)
- .getFacadeBlock(
- aSide, tile.getCoverIDAtSide(aSide), tile.getComplexCoverDataAtSide(aSide), tile);
- if (facadeBlock != null)
- return tile.getCoverBehaviorAtSideNew(aSide)
- .getFacadeMeta(
- aSide, tile.getCoverIDAtSide(aSide), tile.getComplexCoverDataAtSide(aSide), tile);
+ final CoverInfo coverInfo = tile.getCoverInfoAtSide(aSide);
+ final Block facadeBlock = coverInfo.getFacadeBlock();
+ if (facadeBlock != null) return coverInfo.getFacadeMeta();
} else {
// we do not allow more than one type of facade per block, so no need to check every side
// see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable
- for (byte i = 0; i < 6; i++) {
- final Block facadeBlock = tile.getCoverBehaviorAtSideNew(i)
- .getFacadeBlock(i, tile.getCoverIDAtSide(i), tile.getComplexCoverDataAtSide(i), tile);
+ for (byte tSide : ALL_VALID_SIDES) {
+ final CoverInfo coverInfo = tile.getCoverInfoAtSide(tSide);
+ final Block facadeBlock = coverInfo.getFacadeBlock();
if (facadeBlock != null) {
- return tile.getCoverBehaviorAtSideNew(i)
- .getFacadeMeta(i, tile.getCoverIDAtSide(i), tile.getComplexCoverDataAtSide(i), tile);
+ return coverInfo.getFacadeMeta();
}
}
}
@@ -671,59 +664,47 @@ public class MultiTileEntityBlock extends Block
return aTileEntity instanceof IMultiTileEntity ? ((IMultiTileEntity) aTileEntity).getPickBlock(aTarget) : null;
}
- public final void receiveMultiTileEntityData(
- IBlockAccess aWorld,
- int aX,
- short aY,
- int aZ,
- short aRID,
- short aID,
- int aCover0,
- int aCover1,
- int aCover2,
- int aCover3,
- int aCover4,
- int aCover5,
- byte aTextureData,
- byte aTexturePage,
- byte aUpdateData,
- byte aRedstoneData,
- byte aColorData) {
- if (!(aWorld instanceof World)) return;
- final IMultiTileEntity te;
-
+ public final IMultiTileEntity receiveMultiTileEntityData(
+ IBlockAccess aWorld, int aX, short aY, int aZ, short aRID, short aID) {
+ if (!(aWorld instanceof World)) return null;
TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
if (!(aTileEntity instanceof IMultiTileEntity)
|| ((IMultiTileEntity) aTileEntity).getMultiTileEntityRegistryID() != aRID
|| ((IMultiTileEntity) aTileEntity).getMultiTileEntityID() != aID) {
final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(aRID);
- if (tRegistry == null) return;
+ if (tRegistry == null) return null;
aTileEntity = tRegistry.getNewTileEntity((World) aWorld, aX, aY, aZ, aID);
- if (!(aTileEntity instanceof IMultiTileEntity)) return;
+ if (!(aTileEntity instanceof IMultiTileEntity)) return null;
+
setTileEntity((World) aWorld, aX, aY, aZ, aTileEntity, false);
}
- te = (IMultiTileEntity) aTileEntity;
+ return ((IMultiTileEntity) aTileEntity);
+ }
+ public void receiveCoverData(
+ IMultiTileEntity mte, int aCover0, int aCover1, int aCover2, int aCover3, int aCover4, int aCover5) {
boolean updated;
- updated = te.setCoverIDAtSideNoUpdate((byte) 0, aCover0);
- updated |= te.setCoverIDAtSideNoUpdate((byte) 1, aCover1);
- updated |= te.setCoverIDAtSideNoUpdate((byte) 2, aCover2);
- updated |= te.setCoverIDAtSideNoUpdate((byte) 3, aCover3);
- updated |= te.setCoverIDAtSideNoUpdate((byte) 4, aCover4);
- updated |= te.setCoverIDAtSideNoUpdate((byte) 5, aCover5);
+ updated = mte.setCoverIDAtSideNoUpdate((byte) 0, aCover0);
+ updated |= mte.setCoverIDAtSideNoUpdate((byte) 1, aCover1);
+ updated |= mte.setCoverIDAtSideNoUpdate((byte) 2, aCover2);
+ updated |= mte.setCoverIDAtSideNoUpdate((byte) 3, aCover3);
+ updated |= mte.setCoverIDAtSideNoUpdate((byte) 4, aCover4);
+ updated |= mte.setCoverIDAtSideNoUpdate((byte) 5, aCover5);
if (updated) {
- te.issueBlockUpdate();
+ mte.issueBlockUpdate();
}
-
- te.receiveClientEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, aTextureData);
- te.receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aUpdateData & 0x7F);
- te.receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aTexturePage | 0x80);
- te.receiveClientEvent(GregTechTileClientEvents.CHANGE_COLOR, aColorData);
- te.receiveClientEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, aRedstoneData);
}
+ //
+ // te.receiveClientEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, aTextureData);
+ //
+ // te.receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aUpdateData & 0x7F);
+ // te.receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aTexturePage | 0x80);
+ //
+ // te.receiveClientEvent(GregTechTileClientEvents.CHANGE_COLOR, aColorData);
+ // te.receiveClientEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, aRedstoneData);
@Override
public final TileEntity createTileEntity(World aWorld, int aMeta) {
diff --git a/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java
index 8161680b1e..2ab1f8c7d6 100644
--- a/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java
+++ b/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java
@@ -15,6 +15,7 @@ import gregtech.api.enums.GT_Values;
import gregtech.api.enums.Materials;
import gregtech.api.enums.SoundResource;
import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
import gregtech.api.interfaces.IIconContainer;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.tileentity.IGregtechWailaProvider;
@@ -24,9 +25,10 @@ import gregtech.api.metatileentity.GregTechTileClientEvents;
import gregtech.api.multitileentity.MultiTileEntityBlockInternal;
import gregtech.api.multitileentity.MultiTileEntityClassContainer;
import gregtech.api.multitileentity.MultiTileEntityRegistry;
+import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import gregtech.api.net.GT_Packet_MultiTileEntity;
import gregtech.api.net.GT_Packet_New;
-import gregtech.api.net.GT_Packet_TileEntity;
import gregtech.api.objects.GT_ItemStack;
import gregtech.api.objects.XSTR;
import gregtech.api.render.TextureFactory;
@@ -34,7 +36,6 @@ import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_Util;
import gregtech.api.util.GT_Utility;
-import gregtech.api.util.ISerializableObject;
import gregtech.common.render.GT_MultiTexture;
import gregtech.common.render.IRenderedBlock;
import java.util.ArrayList;
@@ -55,6 +56,7 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.Explosion;
@@ -78,9 +80,10 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
public Materials mMaterial = Materials._NULL;
protected final boolean mIsTicking; // If this TileEntity is ticking at all
- protected boolean mShouldRefresh =
- true; // This Variable checks if this TileEntity should refresh when the Block is being set. That way you
+ // This Variable checks if this TileEntity should refresh when the Block is being set. That way you
// can turn this check off any time you need it.
+ protected boolean mShouldRefresh = true;
+
protected boolean mDoesBlockUpdate = false; // This Variable is for a buffered Block Update.
protected boolean mForceFullSelectionBoxes = false; // This Variable is for forcing the Selection Box to be full.
protected boolean mNeedsUpdate = false;
@@ -192,8 +195,6 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
copyTextures();
}
- if (mCoverData == null || mCoverData.length != 6) mCoverData = new ISerializableObject[6];
- if (mCoverSides.length != 6) mCoverSides = new int[] {0, 0, 0, 0, 0, 0};
if (mSidedRedstone.length != 6) mSidedRedstone = new byte[] {15, 15, 15, 15, 15, 15};
updateCoverBehavior();
@@ -252,7 +253,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
@Override
public boolean useModularUI() {
- return true;
+ return false;
}
@Override
@@ -730,6 +731,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
try {
return allowRightclick(aPlayer) && onRightClick(aPlayer, aSide, aX, aY, aZ);
} catch (Throwable e) {
+ GT_FML_LOGGER.error("onBlockActivated Failed", e);
e.printStackTrace(GT_Log.err);
return true;
}
@@ -747,9 +749,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
return true;
}
- if (!getCoverBehaviorAtSideNew(aSide)
- .isGUIClickable(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this))
- return false;
+ if (!getCoverInfoAtSide(aSide).isGUIClickable()) return false;
}
if (isServerSide()) {
if (!privateAccess() || aPlayer.getDisplayName().equalsIgnoreCase(getOwnerName())) {
@@ -826,14 +826,29 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
aY,
aZ)) return true;
- if (!getCoverBehaviorAtSideNew(aSide)
- .isGUIClickable(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this))
- return false;
+ if (!getCoverInfoAtSide(aSide).isGUIClickable()) return false;
+
+ return openModularUi(aPlayer, aSide);
}
}
return false;
}
+ public boolean hasGui(byte aSide) {
+ return false;
+ }
+
+ boolean openModularUi(EntityPlayer aPlayer, byte aSide) {
+ if (!hasGui(aSide) || !isServerSide()) {
+ System.out.println("No GUI or Not Serverside");
+ return false;
+ }
+
+ GT_UIInfos.openGTTileEntityUI(this, aPlayer);
+ System.out.println("Trying to open a UI");
+ return true;
+ }
+
public boolean onWrenchRightClick(
EntityPlayer aPlayer, ItemStack tCurrentItem, byte wrenchSide, float aX, float aY, float aZ) {
if (setMainFacing(wrenchSide)) {
@@ -955,56 +970,49 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
return mLockUpgrade;
}
- public byte getTextureData() {
- return 0;
- }
-
/**
* @return a Packet containing all Data which has to be synchronised to the Client - Override as needed
*/
public GT_Packet_New getClientDataPacket() {
- return new GT_Packet_TileEntity(
+
+ final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity(
+ 0,
xCoord,
(short) yCoord,
zCoord,
getMultiTileEntityRegistryID(),
getMultiTileEntityID(),
- mCoverSides[0],
- mCoverSides[1],
- mCoverSides[2],
- mCoverSides[3],
- mCoverSides[4],
- mCoverSides[5],
(byte) ((mFacing & 7) | (mRedstone ? 16 : 0)),
- (byte) getTextureData(), /*getTexturePage()*/
- (byte) 0, /*getUpdateData()*/
- (byte) (((mSidedRedstone[0] > 0) ? 1 : 0)
- | ((mSidedRedstone[1] > 0) ? 2 : 0)
- | ((mSidedRedstone[2] > 0) ? 4 : 0)
- | ((mSidedRedstone[3] > 0) ? 8 : 0)
- | ((mSidedRedstone[4] > 0) ? 16 : 0)
- | ((mSidedRedstone[5] > 0) ? 32 : 0)),
mColor);
- }
-
- @Override
- public Packet getDescriptionPacket() {
- issueClientUpdate();
- return null;
- }
- @Override
- public void getWailaBody(
- ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) {
- super.getWailaBody(itemStack, currenttip, accessor, config);
- currenttip.add(String.format(
- "Facing: %s", ForgeDirection.getOrientation(getFrontFacing()).name()));
- }
+ packet.setCoverData(
+ getCoverInfoAtSide((byte) 0).getCoverID(),
+ getCoverInfoAtSide((byte) 1).getCoverID(),
+ getCoverInfoAtSide((byte) 2).getCoverID(),
+ getCoverInfoAtSide((byte) 3).getCoverID(),
+ getCoverInfoAtSide((byte) 4).getCoverID(),
+ getCoverInfoAtSide((byte) 5).getCoverID());
+
+ packet.setRedstoneData((byte) (((mSidedRedstone[0] > 0) ? 1 : 0)
+ | ((mSidedRedstone[1] > 0) ? 2 : 0)
+ | ((mSidedRedstone[2] > 0) ? 4 : 0)
+ | ((mSidedRedstone[3] > 0) ? 8 : 0)
+ | ((mSidedRedstone[4] > 0) ? 16 : 0)
+ | ((mSidedRedstone[5] > 0) ? 32 : 0)));
+
+ if (this instanceof IMTE_HasModes) {
+ final IMTE_HasModes mteModes = (IMTE_HasModes) this;
+ packet.setModes(mteModes.getMode(), mteModes.getAllowedModes());
+ }
+ if (this instanceof IMultiBlockPart) {
+ final IMultiBlockPart mtePart = (IMultiBlockPart) this;
+ if (mtePart.getTargetPos() != null) {
+ final ChunkCoordinates aTarget = mtePart.getTargetPos();
+ packet.setTargetPos(aTarget.posX, (short) aTarget.posY, aTarget.posZ);
+ }
+ }
- @Override
- public void getWailaNBTData(
- EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, int z) {
- super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ return packet;
}
@Override
@@ -1019,10 +1027,6 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
sendCoverDataIfNeeded();
}
- public void setTextureData(byte aValue) {
- /*Do nothing*/
- }
-
@Override
public boolean receiveClientEvent(int aEventID, int aValue) {
super.receiveClientEvent(aEventID, aValue);
@@ -1037,10 +1041,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
// mWorks = ((aValue & 64) != 0);
break;
case GregTechTileClientEvents.CHANGE_CUSTOM_DATA:
- if ((aValue & 0x80) != 0) // Is texture index
- setTextureData((byte) (aValue & 0x7F));
- // else if (mMetaTileEntity instanceof GT_MetaTileEntity_Hatch)//is texture page and hatch
- // ((GT_MetaTileEntity_Hatch) mMetaTileEntity).onTexturePageUpdate((byte) (aValue & 0x7F));
+ // Nothing here, currently
break;
case GregTechTileClientEvents.CHANGE_COLOR:
if (aValue > 16 || aValue < 0) aValue = 0;
@@ -1075,6 +1076,26 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
}
@Override
+ public Packet getDescriptionPacket() {
+ issueClientUpdate();
+ return null;
+ }
+
+ @Override
+ public void getWailaBody(
+ ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ currenttip.add(String.format(
+ "Facing: %s", ForgeDirection.getOrientation(getFrontFacing()).name()));
+ }
+
+ @Override
+ public void getWailaNBTData(
+ EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ }
+
+ @Override
public boolean hasCustomInventoryName() {
return false;
}
@@ -1262,11 +1283,13 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
*/
@Override
public void openInventory() {
+ System.out.println("Open Inventory");
/* Do nothing */
}
@Override
public void closeInventory() {
+ System.out.println("Close Inventory");
/* Do nothing */
}
@@ -1350,33 +1373,27 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
*/
public boolean coverLetsFluidIn(byte aSide, Fluid aFluid) {
- return getCoverBehaviorAtSideNew(aSide)
- .letsFluidIn(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), aFluid, this);
+ return getCoverInfoAtSide(aSide).letsFluidIn(aFluid);
}
public boolean coverLetsFluidOut(byte aSide, Fluid aFluid) {
- return getCoverBehaviorAtSideNew(aSide)
- .letsFluidOut(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), aFluid, this);
+ return getCoverInfoAtSide(aSide).letsFluidOut(aFluid);
}
public boolean coverLetsEnergyIn(byte aSide) {
- return getCoverBehaviorAtSideNew(aSide)
- .letsEnergyIn(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this);
+ return getCoverInfoAtSide(aSide).letsEnergyIn();
}
public boolean coverLetsEnergyOut(byte aSide) {
- return getCoverBehaviorAtSideNew(aSide)
- .letsEnergyOut(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this);
+ return getCoverInfoAtSide(aSide).letsEnergyOut();
}
public boolean coverLetsItemsIn(byte aSide, int aSlot) {
- return getCoverBehaviorAtSideNew(aSide)
- .letsItemsIn(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), aSlot, this);
+ return getCoverInfoAtSide(aSide).letsItemsIn(aSlot);
}
public boolean coverLetsItemsOut(byte aSide, int aSlot) {
- return getCoverBehaviorAtSideNew(aSide)
- .letsItemsOut(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), aSlot, this);
+ return getCoverInfoAtSide(aSide).letsItemsOut(aSlot);
}
@Override
diff --git a/src/main/java/gregtech/api/multitileentity/base/BaseNontickableMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/BaseNontickableMultiTileEntity.java
index bc6f2439ea..9b3deb9d69 100644
--- a/src/main/java/gregtech/api/multitileentity/base/BaseNontickableMultiTileEntity.java
+++ b/src/main/java/gregtech/api/multitileentity/base/BaseNontickableMultiTileEntity.java
@@ -4,6 +4,7 @@ import static gregtech.api.enums.GT_Values.NW;
import gregtech.api.net.GT_Packet_SendCoverData;
import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.CoverInfo;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.Packet;
@@ -37,13 +38,11 @@ public abstract class BaseNontickableMultiTileEntity extends BaseMultiTileEntity
super.issueCoverUpdate(aSide);
} else {
// Otherwise, send the data right away
- NW.sendPacketToAllPlayersInRange(
- worldObj,
- new GT_Packet_SendCoverData(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this),
- xCoord,
- zCoord);
+ final CoverInfo coverInfo = getCoverInfoAtSide(aSide);
+ NW.sendPacketToAllPlayersInRange(worldObj, new GT_Packet_SendCoverData(coverInfo, this), xCoord, zCoord);
+
// Just in case
- mCoverNeedUpdate[aSide] = false;
+ coverInfo.setNeedsUpdate(false);
}
}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
index 74d1252eeb..414ba24948 100644
--- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
@@ -18,4 +18,8 @@ public interface IMultiBlockController
boolean isLiquidInput(byte aSide);
boolean isLiquidOutput(byte aSide);
+
+ void registerCoveredPartOnSide(final int aSide, IMultiBlockPart part);
+
+ void unregisterCoveredPartOnSide(final int aSide, IMultiBlockPart part);
}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java
index e5d2e4f691..528c153e05 100644
--- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java
@@ -5,6 +5,7 @@ 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;
public interface IMultiBlockFluidHandler {
int fill(MultiBlockPart aPart, ForgeDirection aDirection, FluidStack aFluid, boolean aDoFill);
@@ -18,4 +19,6 @@ public interface IMultiBlockFluidHandler {
boolean canDrain(MultiBlockPart aPart, ForgeDirection aDirection, Fluid aFluid);
FluidTankInfo[] getTankInfo(MultiBlockPart aPart, ForgeDirection aDirection);
+
+ IFluidTank[] getFluidTanksForGUI(MultiBlockPart aPart);
}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java
index 7e3777fe90..c50addbe67 100644
--- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java
@@ -1,6 +1,8 @@
package gregtech.api.multitileentity.interfaces;
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
@@ -44,4 +46,8 @@ public interface IMultiBlockInventory {
void closeInventory(MultiBlockPart aPart);
boolean isItemValidForSlot(MultiBlockPart aPart, int aSlot, ItemStack aStack);
+
+ IItemHandlerModifiable getInventoryForGUI(MultiBlockPart aPart);
+
+ List<String> getInventoryNames(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..027b49ca17
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java
@@ -0,0 +1,11 @@
+package gregtech.api.multitileentity.interfaces;
+
+import net.minecraft.util.ChunkCoordinates;
+
+public interface IMultiBlockPart extends IMultiTileEntity {
+ ChunkCoordinates getTargetPos();
+
+ void setTargetPos(ChunkCoordinates aTargetPos);
+
+ boolean tickCoverAtSide(byte aSide, long aTickTimer);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java
index f5278d47b4..8b900ad61c 100644
--- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java
@@ -287,4 +287,14 @@ public interface IMultiTileEntity
/** Adds ToolTips to the Item. */
void addToolTips(List<String> aList, ItemStack aStack, boolean aF3_H);
}
+
+ interface IMTE_HasModes extends IMultiTileEntity {
+ byte getMode();
+
+ void setMode(byte aMode);
+
+ int getAllowedModes();
+
+ void setAllowedModes(int aAllowedModes);
+ }
}
diff --git a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
index 767026b286..17bf44c386 100644
--- a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
+++ b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
@@ -3,6 +3,8 @@ package gregtech.api.multitileentity.machine;
import static com.google.common.primitives.Ints.saturatedCast;
import static gregtech.api.enums.GT_Values.emptyIconContainerArray;
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
import gregtech.api.enums.GT_Values;
import gregtech.api.enums.GT_Values.NBT;
import gregtech.api.enums.Textures;
@@ -32,10 +34,11 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
protected boolean mActive = false;
protected long mStoredEnergy = 0;
protected FluidTankGT[] mTanksInput = GT_Values.emptyFluidTankGT, mTanksOutput = GT_Values.emptyFluidTankGT;
- protected ItemStack[] mOutputItems = GT_Values.emptyItemStackArray;
protected FluidStack[] mOutputFluids = GT_Values.emptyFluidStack;
- protected ItemStack[] mInventory = GT_Values.emptyItemStackArray;
+ protected final IItemHandlerModifiable mInputInventory = new ItemStackHandler(17);
+ protected final IItemHandlerModifiable mOutputInventory = new ItemStackHandler(15);
+ protected boolean mOutputInventoryChanged = false;
@Override
public String getTileEntityName() {
@@ -47,6 +50,43 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
super.writeMultiTileNBT(aNBT);
if (mParallel > 0) aNBT.setInteger(NBT.PARALLEL, mParallel);
if (mActive) aNBT.setBoolean(NBT.ACTIVE, mActive);
+ if (mInputInventory != null && mInputInventory.getSlots() > 0)
+ writeInventory(aNBT, mInputInventory, NBT.INV_INPUT_LIST);
+ if (mOutputInventory != null && mOutputInventory.getSlots() > 0)
+ writeInventory(aNBT, mOutputInventory, NBT.INV_OUTPUT_LIST);
+ for (int i = 0; i < mTanksInput.length; i++) mTanksInput[i].writeToNBT(aNBT, NBT.TANK_IN + i);
+ for (int i = 0; i < mTanksOutput.length; i++) mTanksOutput[i].writeToNBT(aNBT, NBT.TANK_OUT + i);
+ if (mOutputFluids != null && mOutputFluids.length > 0) writeFluids(aNBT, mOutputFluids, NBT.FLUID_OUT);
+ }
+
+ protected void writeFluids(NBTTagCompound aNBT, FluidStack[] fluids, String fluidListTag) {
+ if (fluids != null && fluids.length > 0) {
+ final NBTTagList tList = new NBTTagList();
+ for (final FluidStack tFluid : fluids) {
+ if (tFluid != null) {
+ final NBTTagCompound tag = new NBTTagCompound();
+ tFluid.writeToNBT(tag);
+ tList.appendTag(tag);
+ }
+ }
+ aNBT.setTag(fluidListTag, tList);
+ }
+ }
+
+ protected void writeInventory(NBTTagCompound aNBT, IItemHandlerModifiable inv, String invListTag) {
+ if (inv != null && inv.getSlots() > 0) {
+ final NBTTagList tList = new NBTTagList();
+ for (int tSlot = 0; tSlot < inv.getSlots(); tSlot++) {
+ final ItemStack tStack = inv.getStackInSlot(tSlot);
+ if (tStack != null) {
+ final NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("s", (byte) tSlot);
+ tStack.writeToNBT(tag);
+ tList.appendTag(tag);
+ }
+ }
+ aNBT.setTag(invListTag, tList);
+ }
}
@Override
@@ -55,15 +95,10 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
if (aNBT.hasKey(NBT.PARALLEL)) mParallel = Math.max(1, aNBT.getInteger(NBT.PARALLEL));
if (aNBT.hasKey(NBT.ACTIVE)) mActive = aNBT.getBoolean(NBT.ACTIVE);
- mInventory = getDefaultInventory(aNBT);
- if (mInventory != null) {
- final NBTTagList tList = aNBT.getTagList(NBT.INV_LIST, 10);
- for (int i = 0; i < tList.tagCount(); i++) {
- final NBTTagCompound tNBT = tList.getCompoundTagAt(i);
- final int tSlot = tNBT.getShort("s");
- if (tSlot >= 0 && tSlot < mInventory.length) mInventory[tSlot] = GT_Utility.loadItem(tNBT);
- }
- }
+ /* Inventories */
+ loadInventory(aNBT, NBT.INV_INPUT_SIZE, NBT.INV_INPUT_LIST);
+ loadInventory(aNBT, NBT.INV_OUTPUT_SIZE, NBT.INV_OUTPUT_LIST);
+
/* Tanks */
long tCapacity = 1000;
if (aNBT.hasKey(NBT.TANK_CAPACITY)) tCapacity = saturatedCast(aNBT.getLong(NBT.TANK_CAPACITY));
@@ -71,7 +106,6 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
mTanksInput = new FluidTankGT[getFluidInputCount()];
mTanksOutput = new FluidTankGT[getFluidOutputCount()];
mOutputFluids = new FluidStack[getFluidOutputCount()];
- mOutputItems = new ItemStack[getItemOutputCount()];
// TODO: See if we need the adjustable map here `.setCapacity(mRecipes, mParallel * 2L)` in place of the
// `setCapacityMultiplier`
@@ -83,8 +117,18 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
mTanksOutput[i] = new FluidTankGT().readFromNBT(aNBT, NBT.TANK_OUT + i);
for (int i = 0; i < mOutputFluids.length; i++)
mOutputFluids[i] = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag(NBT.FLUID_OUT + "." + i));
- for (int i = 0; i < mOutputItems.length; i++)
- mOutputItems[i] = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag(NBT.INV_OUT + "." + i));
+ }
+
+ protected void loadInventory(NBTTagCompound aNBT, String sizeTag, String invListTag) {
+ final IItemHandlerModifiable inv = mInputInventory;
+ if (inv != null) {
+ final NBTTagList tList = aNBT.getTagList(invListTag, 10);
+ for (int i = 0; i < tList.tagCount(); i++) {
+ final NBTTagCompound tNBT = tList.getCompoundTagAt(i);
+ final int tSlot = tNBT.getShort("s");
+ if (tSlot >= 0 && tSlot < inv.getSlots()) inv.setStackInSlot(tSlot, GT_Utility.loadItem(tNBT));
+ }
+ }
}
@Override
@@ -148,19 +192,14 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
* The number of fluid (input) slots available for this machine
*/
public int getFluidInputCount() {
- return 2;
+ return 7;
}
/**
* The number of fluid (output) slots available for this machine
*/
public int getFluidOutputCount() {
- return 2;
- }
-
- public ItemStack[] getDefaultInventory(NBTTagCompound aNBT) {
- final int tSize = Math.max(0, aNBT.getShort(NBT.INV_SIZE));
- return tSize > 0 ? new ItemStack[tSize] : GT_Values.emptyItemStackArray;
+ return 3;
}
@Override
@@ -292,8 +331,7 @@ public class MultiTileBasicMachine extends BaseTickableMult