diff options
author | Jason Mitchell <mitchej@gmail.com> | 2023-01-20 00:30:50 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-20 09:30:50 +0100 |
commit | 7ed516e30ba224b4b8e3fad9c836c22ca00bfcdb (patch) | |
tree | bea33f6637b929427e9abbe733e19606f8bf9032 | |
parent | 750a4070af4756e3708e2b2555b9874864bf3cfb (diff) | |
download | GT5-Unofficial-7ed516e30ba224b4b8e3fad9c836c22ca00bfcdb.tar.gz GT5-Unofficial-7ed516e30ba224b4b8e3fad9c836c22ca00bfcdb.tar.bz2 GT5-Unofficial-7ed516e30ba224b4b8e3fad9c836c22ca00bfcdb.zip |
MTE Inventory updates (#1496)
* MTE Inventory updates
* Separate Input/Output inventory
* Use a LinkedHashMap to ensure inventory orders are deterministic
* Input/Output work on either Input/Output inventories
* MTE Inventory
* Add GT_Packet_MultiTileEntity
* More dyanmic packet with packetFeatures
* Add IMTE_HasModes for MultiBlockPart
* Help with MTE Inventory (#1613)
* convert inventory to use ItemStackHandler
* Update MUI
* inventories
* move Iteminventory to its own method
Co-authored-by: miozune <miozune@gmail.com>
* Update MUI
* Update MUI
* Add IMultiBlockPart
* Mte fluid inventory (#1639)
* first work on fluid inventory
* make gui work with numbers not dividable by 4
* use math.min
* add outputfluids saving
* actually working
* Update MUI
Co-authored-by: miozune <miozune@gmail.com>
* Ticking Covers!
* Parts now register covers with the controller
* Controllers now tick covers on parts
* Break cover ticking out into `tickCoverAtSide`
Fix some inventory methods on MultiBlockController
* Filter on tickable covers
* Improve GUIs for MTEs (#1650)
* working controller GUI
* locked inventory selection work
* input and output locking of inventories
Co-authored-by: miozune <miozune@gmail.com>
* spotless
* CoverInfo refactor (#1654)
* Add `CoverInfo` and deprecate the old fields to hold cover information
* Disable MTE registration
* Fix NPE - Return EMPTY_INFO for SIDE_UNKNOWN
Temporarily add back old NBT saving in case of a revert so covers aren't lost.
* Actually save the old NBT data, instead of empty
Co-authored-by: BlueWeabo <76872108+BlueWeabo@users.noreply.github.com>
Co-authored-by: miozune <miozune@gmail.com>
63 files changed, 2220 insertions, 1365 deletions
diff --git a/dependencies.gradle b/dependencies.gradle index 187d4c3b31..3a669c63aa 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -9,7 +9,7 @@ dependencies { compile("com.github.GTNewHorizons:NotEnoughItems:2.3.12-GTNH:dev") compile("com.github.GTNewHorizons:CodeChickenLib:1.1.5.4:dev") compile("com.github.GTNewHorizons:GTNHLib:0.0.8:dev") - compile("com.github.GTNewHorizons:ModularUI:1.0.33:dev") + compile("com.github.GTNewHorizons:ModularUI:1.0.45:dev") compile("com.github.GTNewHorizons:waila:1.5.21:dev") compile("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev") diff --git a/repositories.gradle b/repositories.gradle index 21017d1455..8c26061aab 100644 --- a/repositories.gradle +++ b/repositories.gradle @@ -1,6 +1,7 @@ // Add any additional repositories for your dependencies here repositories { + mavenLocal() maven { name = "GTNH" url = "http://jenkins.usrv.eu:8081/nexus/content/groups/public/" diff --git a/src/main/java/gregtech/api/enums/GT_Values.java b/src/main/java/gregtech/api/enums/GT_Values.java index 4911801025..2ee24b8b5a 100644 --- a/src/main/java/gregtech/api/enums/GT_Values.java +++ b/src/main/java/gregtech/api/enums/GT_Values.java @@ -257,8 +257,9 @@ public class GT_Values { /** * NBT String Keys */ - public static class NBT { + public static final class NBT { public static final String COLOR = "gt.color", // Integer + COVERS = "gt.covers", // String CUSTOM_NAME = "name", // String DISPAY = "gt.display", // String FACING = "gt.facing", // Byte @@ -274,14 +275,15 @@ public class GT_Values { // Machines ACTIVE = "gt.active", // Boolean FLUID_OUT = "gt.fluidout", // Output Fluid - INV_OUT = "gt.invout", // ItemStack PARALLEL = "gt.parallel", // Number TANK_CAPACITY = "gt.tankcap", // Number TANK_IN = "gt.tank.in.", // FluidStack TANK_OUT = "gt.tank.out.", // FluidStack TEXTURE = "gt.texture", // String - INV_SIZE = "gt.invsize", // Number - INV_LIST = "gt.invlist", // NBT List + INV_INPUT_SIZE = "gt.invsize.in", // Number + INV_OUTPUT_SIZE = "gt.invsize.out", // Number + INV_INPUT_LIST = "gt.invlist.in", // NBT List + INV_OUTPUT_LIST = "gt.invlist.out", // NBT List // MultiBlock STRUCTURE_OK = "gt.structure.ok", @@ -291,6 +293,8 @@ public class GT_Values { TARGET_X = "gt.target.x", // Number TARGET_Y = "gt.target.y", // Number TARGET_Z = "gt.target.z", // Number + LOCKED_INVENTORY = "gt.locked.inventory", // String + LOCKED_INVENTORY_INDEX = "gt.locked.inventory.index", // Number empty_ = ""; } diff --git a/src/main/java/gregtech/api/graphs/GenerateNodeMap.java b/src/main/java/gregtech/api/graphs/GenerateNodeMap.java index c0ee8b9490..8085421576 100644 --- a/src/main/java/gregtech/api/graphs/GenerateNodeMap.java +++ b/src/main/java/gregtech/api/graphs/GenerateNodeMap.java @@ -1,5 +1,6 @@ package gregtech.api.graphs; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; import static gregtech.api.util.GT_Utility.getOppositeSide; import gregtech.api.graphs.consumers.ConsumerNode; @@ -15,7 +16,7 @@ public abstract class GenerateNodeMap { // clearing the node map to make sure it is gone on reset public static void clearNodeMap(Node aNode, int aReturnNodeValue) { if (aNode.mTileEntity instanceof BaseMetaPipeEntity) { - BaseMetaPipeEntity tPipe = (BaseMetaPipeEntity) aNode.mTileEntity; + final BaseMetaPipeEntity tPipe = (BaseMetaPipeEntity) aNode.mTileEntity; tPipe.setNode(null); tPipe.setNodePath(null); if (aNode.mSelfPath != null) { @@ -23,24 +24,24 @@ public abstract class GenerateNodeMap { aNode.mSelfPath = null; } } - for (int i = 0; i < 6; i++) { - NodePath tPath = aNode.mNodePaths[i]; + for (byte side : ALL_VALID_SIDES) { + final NodePath tPath = aNode.mNodePaths[side]; if (tPath != null) { tPath.clearPath(); - aNode.mNodePaths[i] = null; + aNode.mNodePaths[side] = null; } - Node tNextNode = aNode.mNeighbourNodes[i]; + final Node tNextNode = aNode.mNeighbourNodes[side]; if (tNextNode == null) continue; if (tNextNode.mNodeValue != aReturnNodeValue) clearNodeMap(tNextNode, aNode.mNodeValue); - aNode.mNeighbourNodes[i] = null; + aNode.mNeighbourNodes[side] = null; } } // get how many connections the pipe have private static int getNumberOfConnections(MetaPipeEntity aPipe) { int tCons = 0; - for (int i = 0; i < 6; i++) { - if (aPipe.isConnectedAtSide(i)) tCons++; + for (byte side : ALL_VALID_SIDES) { + if (aPipe.isConnectedAtSide(side)) tCons++; } return tCons; } @@ -53,17 +54,17 @@ public abstract class GenerateNodeMap { int aNextNodeValue, ArrayList<ConsumerNode> tConsumers, HashSet<Node> tNodeMap) { - MetaPipeEntity tMetaPipe = (MetaPipeEntity) aPipe.getMetaTileEntity(); - for (byte i = 0; i < 6; i++) { - if (i == aInvalidSide) { + final MetaPipeEntity tMetaPipe = (MetaPipeEntity) aPipe.getMetaTileEntity(); + for (byte side : ALL_VALID_SIDES) { + if (side == aInvalidSide) { continue; } - TileEntity tNextTileEntity = aPipe.getTileEntityAtSide(i); - if (tNextTileEntity == null || (tMetaPipe != null && !tMetaPipe.isConnectedAtSide(i))) continue; - ArrayList<MetaPipeEntity> tNewPipes = new ArrayList<>(); - Pair nextTileEntity = getNextValidTileEntity(tNextTileEntity, tNewPipes, i, tNodeMap); + final TileEntity tNextTileEntity = aPipe.getTileEntityAtSide(side); + if (tNextTileEntity == null || (tMetaPipe != null && !tMetaPipe.isConnectedAtSide(side))) continue; + final ArrayList<MetaPipeEntity> tNewPipes = new ArrayList<>(); + final Pair nextTileEntity = getNextValidTileEntity(tNextTileEntity, tNewPipes, side, tNodeMap); if (nextTileEntity != null) { - Node tNextNode = generateNode( + final Node tNextNode = generateNode( nextTileEntity.mTileEntity, aPipeNode, aNextNodeValue + 1, @@ -74,10 +75,10 @@ public abstract class GenerateNodeMap { if (tNextNode != null) { aNextNodeValue = tNextNode.mHighestNodeValue; aPipeNode.mHighestNodeValue = tNextNode.mHighestNodeValue; - aPipeNode.mNeighbourNodes[i] = tNextNode; - aPipeNode.mNodePaths[i] = aPipeNode.returnValues.mReturnPath; - aPipeNode.locks[i] = aPipeNode.returnValues.returnLock; - aPipeNode.mNodePaths[i].reloadLocks(); + aPipeNode.mNeighbourNodes[side] = tNextNode; + aPipeNode.mNodePaths[side] = aPipeNode.returnValues.mReturnPath; + aPipeNode.locks[side] = aPipeNode.returnValues.returnLock; + aPipeNode.mNodePaths[side].reloadLocks(); } } } @@ -94,14 +95,14 @@ public abstract class GenerateNodeMap { ArrayList<ConsumerNode> aConsumers, HashSet<Node> aNodeMap) { if (aTileEntity.isInvalid()) return null; - byte tSideOp = getOppositeSide(aSide); - byte tInvalidSide = aPreviousNode == null ? -1 : tSideOp; + final byte tSideOp = getOppositeSide(aSide); + final byte tInvalidSide = aPreviousNode == null ? -1 : tSideOp; Node tThisNode = null; if (isPipe(aTileEntity)) { - BaseMetaPipeEntity tPipe = (BaseMetaPipeEntity) aTileEntity; - MetaPipeEntity tMetaPipe = (MetaPipeEntity) tPipe.getMetaTileEntity(); - int tConnections = getNumberOfConnections(tMetaPipe); - Node tPipeNode; + final BaseMetaPipeEntity tPipe = (BaseMetaPipeEntity) aTileEntity; + final MetaPipeEntity tMetaPipe = (MetaPipeEntity) tPipe.getMetaTileEntity(); + final int tConnections = getNumberOfConnections(tMetaPipe); + final Node tPipeNode; if (tConnections == 1) { tPipeNode = getEmptyNode(aNextNodeValue, tSideOp, aTileEntity, aConsumers); if (tPipeNode == null) return null; @@ -115,7 +116,7 @@ public abstract class GenerateNodeMap { if (tInvalidSide > -1) { tPipeNode.mNeighbourNodes[tInvalidSide] = aPreviousNode; tPipeNode.mNodePaths[tInvalidSide] = getNewPath(aPipes.toArray(new MetaPipeEntity[0])); - Lock lock = new Lock(); + final Lock lock = new Lock(); tPipeNode.mNodePaths[tSideOp].lock = lock; tPipeNode.locks[tInvalidSide] = lock; aPreviousNode.returnValues.mReturnPath = tPipeNode.mNodePaths[tInvalidSide]; @@ -124,10 +125,10 @@ public abstract class GenerateNodeMap { if (tConnections > 1) generateNextNode(tPipe, tPipeNode, tInvalidSide, aNextNodeValue, aConsumers, aNodeMap); } else if (addConsumer(aTileEntity, tSideOp, aNextNodeValue, aConsumers)) { - ConsumerNode tConsumeNode = aConsumers.get(aConsumers.size() - 1); + final ConsumerNode tConsumeNode = aConsumers.get(aConsumers.size() - 1); tConsumeNode.mNeighbourNodes[tSideOp] = aPreviousNode; tConsumeNode.mNodePaths[tSideOp] = getNewPath(aPipes.toArray(new MetaPipeEntity[0])); - Lock lock = new Lock(); + final Lock lock = new Lock(); tConsumeNode.mNodePaths[tSideOp].lock = lock; aPreviousNode.returnValues.mReturnPath = tConsumeNode.mNodePaths[tSideOp]; aPreviousNode.returnValues.returnLock = lock; @@ -140,18 +141,18 @@ public abstract class GenerateNodeMap { protected Pair getNextValidTileEntity( TileEntity aTileEntity, ArrayList<MetaPipeEntity> aPipes, byte aSide, HashSet<Node> aNodeMap) { if (isPipe(aTileEntity)) { - BaseMetaPipeEntity tPipe = (BaseMetaPipeEntity) aTileEntity; - MetaPipeEntity tMetaPipe = (MetaPipeEntity) tPipe.getMetaTileEntity(); - Node tNode = tPipe.getNode(); + final BaseMetaPipeEntity tPipe = (BaseMetaPipeEntity) aTileEntity; + final MetaPipeEntity tMetaPipe = (MetaPipeEntity) tPipe.getMetaTileEntity(); + final Node tNode = tPipe.getNode(); if (tNode != null) { if (aNodeMap.contains(tNode)) return null; } - int tConnections = getNumberOfConnections(tMetaPipe); + final int tConnections = getNumberOfConnections(tMetaPipe); if (tConnections == 2) { - byte tSideOp = getOppositeSide(aSide); - for (byte i = 0; i < 6; i++) { + final byte tSideOp = getOppositeSide(aSide); + for (byte i : ALL_VALID_SIDES) { if (i == tSideOp || !(tMetaPipe.isConnectedAtSide(i))) continue; - TileEntity tNewTileEntity = tPipe.getTileEntityAtSide(i); + final TileEntity tNewTileEntity = tPipe.getTileEntityAtSide(i); if (tNewTileEntity == null) continue; if (isPipe(tNewTileEntity)) { aPipes.add(tMetaPipe); diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java b/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java index 2d776ce71e..d1e699bb40 100644 --- a/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java +++ b/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java @@ -70,9 +70,9 @@ public class GT_UIInfos { side, UIBuilder.of() .container((player, world, x, y, z) -> { - TileEntity te = world.getTileEntity(x, y, z); + final TileEntity te = world.getTileEntity(x, y, z); if (!(te instanceof ICoverable)) return null; - ICoverable gtTileEntity = (ICoverable) te; + final ICoverable gtTileEntity = (ICoverable) te; GT_CoverBehaviorBase<?> cover = gtTileEntity.getCoverBehaviorAtSideNew(side); return createCoverContainer( player, @@ -84,10 +84,10 @@ public class GT_UIInfos { }) .gui((player, world, x, y, z) -> { if (!world.isRemote) return null; - TileEntity te = world.getTileEntity(x, y, z); + final TileEntity te = world.getTileEntity(x, y, z); if (!(te instanceof ICoverable)) return null; - ICoverable gtTileEntity = (ICoverable) te; - GT_CoverBehaviorBase<?> cover = gtTileEntity.getCoverBehaviorAtSideNew(side); + final ICoverable gtTileEntity = (ICoverable) te; + final GT_CoverBehaviorBase<?> cover = gtTileEntity.getCoverBehaviorAtSideNew(side); return createCoverGuiContainer( player, cover::createWindow, @@ -148,11 +148,9 @@ public class GT_UIInfos { Function<UIBuildContext, ModularWindow> windowCreator, Runnable onWidgetUpdate, ContainerConstructor containerCreator) { - UIBuildContext buildContext = new UIBuildContext(player); - ModularWindow window = windowCreator.apply(buildContext); - if (window == null) { - return null; - } + final UIBuildContext buildContext = new UIBuildContext(player); + final ModularWindow window = windowCreator.apply(buildContext); + if (window == null) return null; return containerCreator.of(new ModularUIContext(buildContext, onWidgetUpdate), window); } @@ -161,10 +159,9 @@ public class GT_UIInfos { EntityPlayer player, Function<UIBuildContext, ModularWindow> windowCreator, ContainerConstructor containerConstructor) { - ModularUIContainer container = createTileEntityContainer(player, windowCreator, null, containerConstructor); - if (container == null) { - return null; - } + final ModularUIContainer container = + createTileEntityContainer(player, windowCreator, null, containerConstructor); + if (container == null) return null; return new ModularGui(container); } @@ -175,11 +172,9 @@ public class GT_UIInfos { int coverID, byte side, ICoverable tile) { - GT_CoverUIBuildContext buildContext = new GT_CoverUIBuildContext(player, coverID, side, tile, false); - ModularWindow window = windowCreator.apply(buildContext); - if (window == null) { - return null; - } + final GT_CoverUIBuildContext buildContext = new GT_CoverUIBuildContext(player, coverID, side, tile, false); + final ModularWindow window = windowCreator.apply(buildContext); + if (window == null) return null; return new ModularUIContainer(new ModularUIContext(buildContext, onWidgetUpdate), window); } @@ -190,7 +185,7 @@ public class GT_UIInfos { int coverID, byte side, ICoverable tile) { - ModularUIContainer container = createCoverContainer(player, windowCreator, null, coverID, side, tile); + final ModularUIContainer container = createCoverContainer(player, windowCreator, null, coverID, side, tile); if (container == null) { return null; } diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java index a92ff64df6..3ca1e6d45e 100644 --- a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java +++ b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java @@ -347,4 +347,8 @@ public class GT_UITextures { public static final UITexture PICTURE_SQUARE_LIGHT_GRAY = UITexture.fullImage(MODID, "gui/picture/square_light_gray"); public static final UITexture PICTURE_GAUGE = UITexture.fullImage(MODID, "gui/picture/gauge"); + public static final UITexture PICTURE_ITEM_IN = UITexture.fullImage(MODID, "gui/picture/item_in"); + public static final UITexture PICTURE_ITEM_OUT = UITexture.fullImage(MODID, "gui/picture/item_out"); + public static final UITexture PICTURE_FLUID_IN = UITexture.fullImage(MODID, "gui/picture/fluid_in"); + public static final UITexture PICTURE_FLUID_OUT = UITexture.fullImage(MODID, "gui/picture/fluid_out"); } diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiCoverTabLine.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiCoverTabLine.java index 525618589b..d5e383ed50 100644 --- a/src/main/java/gregtech/api/gui/widgets/GT_GuiCoverTabLine.java +++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiCoverTabLine.java @@ -79,7 +79,7 @@ public class GT_GuiCoverTabLine extends GT_GuiTabLine { */ private void setupTabs() { for (byte tSide = 0; tSide < 6; tSide++) { - ItemStack cover = tile.getCoverItemAtSide(tSide); + final ItemStack cover = tile.getCoverItemAtSide(tSide); if (cover != null) { addCoverToTabs(tSide, cover); } @@ -114,7 +114,7 @@ public class GT_GuiCoverTabLine extends GT_GuiTabLine { * @param cover */ private void addCoverToTabs(byte side, ItemStack cover) { - boolean enabled = this.tile.getCoverBehaviorAtSideNew(side).hasCoverGUI(); + final boolean enabled = this.tile.getCoverBehaviorAtSideNew(side).hasCoverGUI(); this.setTab(side, cover, null, getTooltipForCoverTab(side, cover, enabled)); this.setTabEnabled(side, enabled); } @@ -127,7 +127,7 @@ public class GT_GuiCoverTabLine extends GT_GuiTabLine { * @return This cover tab's tooltip */ private String[] getTooltipForCoverTab(byte side, ItemStack cover, boolean enabled) { - List<String> tooltip = cover.getTooltip(Minecraft.getMinecraft().thePlayer, true); + final List<String> tooltip = cover.getTooltip(Minecraft.getMinecraft().thePlayer, true); tooltip.set( 0, (enabled ? EnumChatFormatting.UNDERLINE : EnumChatFormatting.DARK_GRAY) @@ -158,9 +158,9 @@ public class GT_GuiCoverTabLine extends GT_GuiTabLine { static class CoverTabLineNEIHandler extends INEIGuiAdapter { @Override public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) { - Rectangle neiSlotArea = new Rectangle(x, y, w, h); + final Rectangle neiSlotArea = new Rectangle(x, y, w, h); if (gui instanceof GT_GUIContainerMetaTile_Machine) { - GT_GuiTabLine tabLine = ((GT_GUIContainerMetaTile_Machine) gui).coverTabs; + final GT_GuiTabLine tabLine = ((GT_GUIContainerMetaTile_Machine) gui).coverTabs; if (!tabLine.visible) { return false; } diff --git a/src/main/java/gregtech/api/interfaces/covers/IControlsWorkCover.java b/src/main/java/gregtech/api/interfaces/covers/IControlsWorkCover.java index 7c2361af83..47edc7af93 100644 --- a/src/main/java/gregtech/api/interfaces/covers/IControlsWorkCover.java +++ b/src/main/java/gregtech/api/interfaces/covers/IControlsWorkCover.java @@ -1,5 +1,7 @@ package gregtech.api.interfaces.covers; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IMachineProgress; @@ -15,9 +17,9 @@ public interface IControlsWorkCover { * @return true if the cover is the first (side) one **/ static boolean makeSureOnlyOne(byte aMySide, ICoverable aTileEntity) { - for (byte i = 0; i < 6; i++) { - if (aTileEntity.getCoverBehaviorAtSideNew(i) instanceof IControlsWorkCover && i < aMySide) { - aTileEntity.dropCover(i, i, true); + for (byte tSide : ALL_VALID_SIDES) { + if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover && tSide < aMySide) { + aTileEntity.dropCover(tSide, tSide, true); aTileEntity.markDirty(); return false; } diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityItemPipe.java b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityItemPipe.java index 1b1ce36871..5375ea85ee 100644 --- a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityItemPipe.java +++ b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityItemPipe.java @@ -1,5 +1,7 @@ package gregtech.api.interfaces.metatileentity; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.BaseMetaPipeEntity; import gregtech.api.util.GT_Utility; @@ -56,39 +58,29 @@ public interface IMetaTileEntityItemPipe extends IMetaTileEntity { aStep += aMetaTileEntity.getStepSize(); if (aIgnoreCapacity || aMetaTileEntity.pipeCapacityCheck()) if (aMap.get(aMetaTileEntity) == null || aMap.get(aMetaTileEntity) > aStep) { - IGregTechTileEntity aBaseMetaTileEntity = aMetaTileEntity.getBaseMetaTileEntity(); + final IGregTechTileEntity aBaseMetaTileEntity = aMetaTileEntity.getBaseMetaTileEntity(); aMap.put(aMetaTileEntity, aStep); - for (byte i = 0, j = 0; i < 6; i++) { + byte oppositeSide; + for (byte side : ALL_VALID_SIDES) { if (aMetaTileEntity instanceof IConnectable - && !((IConnectable) aMetaTileEntity).isConnectedAtSide(i)) continue; - j = GT_Utility.getOppositeSide(i); + && !((IConnectable) aMetaTileEntity).isConnectedAtSide(side)) continue; + oppositeSide = GT_Utility.getOppositeSide(side); if (aSuckItems) { - if (aBaseMetaTileEntity - .getCoverBehaviorAtSideNew(i) - .letsItemsIn( - i, - aBaseMetaTileEntity.getCoverIDAtSide(i), - aBaseMetaTileEntity.getComplexCoverDataAtSide(i), - -2, - aBaseMetaTileEntity)) { - IGregTechTileEntity tItemPipe = aBaseMetaTileEntity.getIGregTechTileEntityAtSide(i); + if (aBaseMetaTileEntity.getCoverInfoAtSide(side).letsItemsIn(-2)) { + final IGregTechTileEntity tItemPipe = + aBaseMetaTileEntity.getIGregTechTileEntityAtSide(side); if (aBaseMetaTileEntity.getColorization() >= 0) { - byte tColor = tItemPipe.getColorization(); + final byte tColor = tItemPipe.getColorization(); if (tColor >= 0 && tColor != aBaseMetaTileEntity.getColorization()) { continue; } } if (tItemPipe instanceof BaseMetaPipeEntity) { - IMetaTileEntity tMetaTileEntity = tItemPipe.getMetaTileEntity(); + final IMetaTileEntity tMetaTileEntity = tItemPipe.getMetaTileEntity(); if (tMetaTileEntity instanceof IMetaTileEntityItemPipe && tItemPipe - .getCoverBehaviorAtSideNew(j) - .letsItemsOut( - j, - tItemPipe.getCoverIDAtSide(j), - tItemPipe.getComplexCoverDataAtSide(j), - -2, - tItemPipe)) { + .getCoverInfoAtSide(oppositeSide) + .letsItemsOut(-2)) { scanPipes( (IMetaTileEntityItemPipe) tMetaTileEntity, aMap, @@ -99,33 +91,22 @@ public interface IMetaTileEntityItemPipe extends IMetaTileEntity { } } } else { - if (aBaseMetaTileEntity - .getCoverBehaviorAtSideNew(i) - .letsItemsOut( - i, - aBaseMetaTileEntity.getCoverIDAtSide(i), - aBaseMetaTileEntity.getComplexCoverDataAtSide(i), - -2, - aBaseMetaTileEntity)) { - IGregTechTileEntity tItemPipe = aBaseMetaTileEntity.getIGregTechTileEntityAtSide(i); + if (aBaseMetaTileEntity.getCoverInfoAtSide(side).letsItemsOut(-2)) { + final IGregTechTileEntity tItemPipe = + aBaseMetaTileEntity.getIGregTechTileEntityAtSide(side); if (tItemPipe != null) { if (aBaseMetaTileEntity.getColorization() >= 0) { - byte tColor = tItemPipe.getColorization(); + final byte tColor = tItemPipe.getColorization(); if (tColor >= 0 && tColor != aBaseMetaTileEntity.getColorization()) { continue; } } if (tItemPipe instanceof BaseMetaPipeEntity) { - IMetaTileEntity tMetaTileEntity = tItemPipe.getMetaTileEntity(); + final IMetaTileEntity tMetaTileEntity = tItemPipe.getMetaTileEntity(); if (tMetaTileEntity instanceof IMetaTileEntityItemPipe && tItemPipe - .getCoverBehaviorAtSideNew(j) - .letsItemsIn( - j, - tItemPipe.getCoverIDAtSide(j), - tItemPipe.getComplexCoverDataAtSide(j), - -2, - tItemPipe)) { + .getCoverInfoAtSide(oppositeSide) + .letsItemsIn(-2)) { scanPipes( (IMetaTileEntityItemPipe) tMetaTileEntity, aMap, diff --git a/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java b/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java index 6beb34a305..df131c84c2 100644 --- a/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java +++ b/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java @@ -3,6 +3,7 @@ package gregtech.api.interfaces.tileentity; import gregtech.api.util.GT_CoverBehavior; import gregtech.api.util.GT_CoverBehaviorBase; import gregtech.api.util.ISerializableObject; +import gregtech.common.covers.CoverInfo; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; @@ -32,6 +33,10 @@ public interface ICoverable extends IRedstoneTileEntity, IHasInventory, IBasicEn @Deprecated int getCoverDataAtSide(byte aSide); + default CoverInfo getCoverInfoAtSide(byte aSide) { + return null; + } + default ISerializableObject getComplexCoverDataAtSide(byte aSide) { return new ISerializableObject.LegacyCoverData(getCoverDataAtSide(aSide)); } diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java index 09b62c0657..31a341040e 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java @@ -22,6 +22,7 @@ import gregtech.api.util.GT_Log; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.GT_Utility; +import gregtech.common.covers.CoverInfo; import java.util.*; import net.minecraft.block.Block; import net.minecraft.entity.Entity; @@ -79,7 +80,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity public void addToLock(TileEntity tileEntity, int side) { if (node != null) { - Lock lock = node.locks[side]; + final Lock lock = node.locks[side]; if (lock != null) { lock.addTileEntity(tileEntity); } @@ -90,7 +91,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity public void removeFromLock(TileEntity tileEntity, int side) { if (node != null) { - Lock lock = node.locks[side]; + final Lock lock = node.locks[side]; if (lock != null) { lock.removeTileEntity(tileEntity); } @@ -100,7 +101,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity } public void reloadLocks() { - IMetaTileEntity meta = getMetaTileEntity(); + final IMetaTileEntity meta = getMetaTileEntity(); if (meta instanceof MetaPipeEntity) { ((MetaPipeEntity) meta).reloadLocks(); } @@ -283,12 +284,12 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity (short) yCoord, zCoord, mID, - mCoverSides[0], - mCoverSides[1], - mCoverSides[2], - mCoverSides[3], - mCoverSides[4], - mCoverSides[5], + getCoverInfoAtSide((byte) 0).getCoverID(), + getCoverInfoAtSide((byte) 1).getCoverID(), + getCoverInfoAtSide((byte) 2).getCoverID(), + getCoverInfoAtSide((byte) 3).getCoverID(), + getCoverInfoAtSide((byte) 4).getCoverID(), + getCoverInfoAtSide((byte) 5).getCoverID(), oTextureData = mConnections, oUpdateData = hasValidMetaTileEntity() ? mMetaTileEntity.getUpdateData() : 0, oRedstoneData = (byte) (((mSidedRedstone[0] > 0) ? 1 : 0) @@ -705,16 +706,16 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public ITexture[] getTexture(Block aBlock, byte aSide) { - ITexture rIcon = getCoverTexture(aSide); + final ITexture rIcon = getCoverTexture(aSide); if (rIcon != null) return new ITexture[] {rIcon}; return getTextureUncovered(aSide); } @Override public ITexture[] getTextureCovered(byte aSide) { - ITexture coverTexture = getCoverTexture(aSide); - ITexture[] textureUncovered = getTextureUncovered(aSide); - ITexture[] textureCovered; + final ITexture coverTexture = getCoverTexture(aSide); + final ITexture[] textureUncovered = getTextureUncovered(aSide); + final ITexture[] textureCovered; if (coverTexture != null) { textureCovered = Arrays.copyOf(textureUncovered, textureUncovered.length + 1); textureCovered[textureUncovered.length] = coverTexture; @@ -762,18 +763,11 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public ArrayList<ItemStack> getDrops() { - ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, mID); - NBTTagCompound tNBT = new NBTTagCompound(); - if (mStrongRedstone > 0) tNBT.setByte("mStrongRedstone", mStrongRedstone); - boolean hasCover = false; - for (byte i = 0; i < mCoverSides.length; i++) { - if (mCoverSides[i] != 0) { - if (mCoverData[i] != null) // this really shouldn't be null if a cover is there already, but whatever - tNBT.setTag(COVER_DATA_NBT_KEYS[i], mCoverData[i].saveDataToNBT()); - hasCover = true; - } - } - if (hasCover) tNBT.setIntArray("mCoverSides", mCoverSides); + final ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, mID); + final NBTTagCompound tNBT = new NBTTagCompound(); + + writeCoverNBT(tNBT, true); + if (hasValidMetaTileEntity()) mMetaTileEntity.setItemNBT(tNBT); if (!tNBT.hasNoTags()) rStack.setTagCompound(tNBT); @@ -791,15 +785,15 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity if (isClientSide()) { // Configure Cover, sneak can also be: screwdriver, wrench, side cutter, soldering iron if (aPlayer.isSneaking()) { - byte tSide = + final byte tSide = (getCoverIDAtSide(aSide) == 0) ? GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ) : aSide; - return (getCoverBehaviorAtSideNew(tSide).hasCoverGUI()); + return (getCoverInfoAtSide(tSide).hasCoverGUI()); } else if (getCoverBehaviorAtSideNew(aSide).onCoverRightclickClient(aSide, this, aPlayer, aX, aY, aZ)) { return true; } } if (isServerSide()) { - ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); + final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); if (tCurrentItem != null) { if (getColorization() >= 0 && GT_Utility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) { @@ -808,7 +802,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity setColorization((byte) -1); return true; } - byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); + final byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) { if (mMetaTileEntity.onWrenchRightClick(aSide, tSide, aPlayer, aX, aY, aZ)) { mMetaTileEntity.markDirty(); @@ -823,16 +817,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) { setCoverDataAtSide( tSide, - getCoverBehaviorAtSideNew(tSide) - .onCoverScrewdriverClick( - tSide, - getCoverIDAtSide(tSide), - getComplexCoverDataAtSide(tSide), - this, - aPlayer, - 0.5F, - 0.5F, - 0.5F)); + getCoverInfoAtSide(tSide).onCoverScrewdriverClick(aPlayer, 0.5F, 0.5F, 0.5F)); mMetaTileEntity.onScrewdriverRightClick(tSide, aPlayer, aX, aY, aZ); mMetaTileEntity.markDirty(); GT_Utility.sendSoundToPlayers( @@ -841,17 +826,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity } else { if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { setCoverDataAtSide( - aSide, - getCoverBehaviorAtSideNew(aSide) - .onCoverScrewdriverClick( - aSide, - getCoverIDAtSide(aSide), - getComplexCoverDataAtSide(aSide), - this, - aPlayer, - aX, - aY, - aZ)); + aSide, getCoverInfoAtSide(aSide).onCoverScrewdriverClick(aPlayer, aX, aY, aZ)); mMetaTileEntity.onScrewdriverRightClick(aSide, aPlayer, aX, aY, aZ); mMetaTileEntity.markDirty(); GT_Utility.sendSoundToPlayers( @@ -925,7 +900,9 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity byte coverSide = aSide; if (getCoverIDAtSide(aSide) == 0) coverSide = tSide; - if (getCoverIDAtSide(coverSide) == 0) { + final CoverInfo coverInfo = getCoverInfoAtSide(coverSide); + + if (coverInfo.getCoverID() == 0) { if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) { if (GregTech_API.getCoverBehaviorNew(tCurrentItem) .isCoverPlaceable(coverSide, tCurrentItem, this) @@ -951,34 +928,18 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity } } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config or turn back. aSide = (getCoverIDAtSide(aSide) == 0) ? GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ) : aSide; - return getCoverIDAtSide(aSide) > 0 - && getCoverBehaviorAtSideNew(aSide) - .onCoverShiftRightClick( - aSide, - getCoverIDAtSide(aSide), - getComplexCoverDataAtSide(aSide), - this, - aPlayer); + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + return coverInfo.isValid() && coverInfo.onCoverShiftRightClick(aPlayer); } - if (getCoverBehaviorAtSideNew(aSide) - .onCoverRightClick( - aSide, - getCoverIDAtSide(aSide), - getComplexCoverDataAtSide(aSide), - this, - aPlayer, - aX, - aY, - aZ)) return true; + if (getCoverInfoAtSide(aSide).onCoverRightClick(aPlayer, aX, aY, aZ)) return true; } - if (!getCoverBehaviorAtSideNew(aSide) - .isGUIClickable(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) return false; + if (!getCoverInfoAtSide(aSide).isGUIClickable()) return false; try { if (!aPlayer.isSneaking() && hasValidMetaTileEntity()) { - boolean handled = mMetaTileEntity.onRightclick(this, aPlayer, aSide, aX, aY, aZ); + final boolean handled = mMetaTileEntity.onRightclick(this, aPlayer, aSide, aX, aY, aZ); if (handled) { mMetaTileEntity.markDirty(); } @@ -1034,21 +995,9 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity */ @Override public int[] getAccessibleSlotsFromSide(int aSide) { - if (canAccessData() - && (getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsOut( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - -1, - this) - || getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - -1, - this))) return mMetaTileEntity.getAccessibleSlotsFromSide(aSide); + final CoverInfo coverInfo = getCoverInfoAtSide((byte) aSide); + if (canAccessData() && (coverInfo.letsItemsOut(-1) || coverInfo.letsItemsIn(-1))) + return mMetaTileEntity.getAccessibleSlotsFromSide(aSide); return GT_Values.emptyIntArray; } @@ -1058,13 +1007,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public boolean canInsertItem(int aIndex, ItemStack aStack, int aSide) { return canAccessData() - && getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - aIndex, - this) + && getCoverInfoAtSide((byte) aSide).letsItemsIn(aIndex) && mMetaTileEntity.canInsertItem(aIndex, aStack, aSide); } @@ -1206,30 +1149,18 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity private boolean canMoveFluidOnSide(ForgeDirection aSide, Fluid aFluid, boolean isFill) { if (aSide == ForgeDirection.UNKNOWN) return true; - IFluidHandler tTileEntity = getITankContainerAtSide((byte) aSide.ordinal()); + final IFluidHandler tTileEntity = getITankContainerAtSide((byte) aSide.ordinal()); // Only require a connection if there's something to connect to - Allows fluid cells & buckets to interact with // the pipe if (tTileEntity != null && !mMetaTileEntity.isConnectedAtSide((byte) aSide.ordinal())) return false; if (isFill && mMetaTileEntity.isLiquidInput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidIn( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid, - this)) return true; + && getCoverInfoAtSide((byte) aSide.ordinal()).letsFluidIn(aFluid)) return true; if (!isFill && mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidOut( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid, - this)) return true; + && getCoverInfoAtSide((byte) aSide.ordinal()).letsFluidOut(aFluid)) return true; return false; } @@ -1281,24 +1212,11 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public FluidTankInfo[] getTankInfo(ForgeDirection aSide) { + final CoverInfo coverInfo = getCoverInfoAtSide((byte) aSide.ordinal()); if (canAccessData() && (aSide == ForgeDirection.UNKNOWN - || (mMetaTileEntity.isLiquidInput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidIn( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - null, - this)) - || (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidOut( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - null, - this)) + || (mMetaTileEntity.isLiquidInput((byte) aSide.ordinal()) && coverInfo.letsFluidIn(null)) + || (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) && coverInfo.letsFluidOut(null)) // Doesn't need to be connected to get Tank Info -- otherwise things can't connect )) return mMetaTileEntity.getTankInfo(aSide); return new FluidTankInfo[] {}; @@ -1308,7 +1226,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity public boolean addStackToSlot(int aIndex, ItemStack aStack) { if (GT_Utility.isStackInvalid(aStack)) return true; if (aIndex < 0 || aIndex >= getSizeInventory()) return false; - ItemStack tStack = getStackInSlot(aIndex); + final ItemStack tStack = getStackInSlot(aIndex); if (GT_Utility.isStackInvalid(tStack)) { setInventorySlotContents(aIndex, aStack); return true; diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index 821cfcd8a7..1e8ffa0994 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -1,6 +1,7 @@ package gregtech.api.metatileentity; import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; import static gregtech.api.enums.GT_Values.NW; import static gregtech.api.enums.GT_Values.V; import static gregtech.api.objects.XSTR.XSTR_INSTANCE; @@ -40,6 +41,7 @@ import gregtech.api.net.GT_Packet_TileEntity; import gregtech.api.objects.GT_ItemStack; import gregtech.api.util.*; import gregtech.common.GT_Pollution; +import gregtech.common.covers.CoverInfo; import ic2.api.Direction; import java.lang.reflect.Field; import java.util.*; @@ -215,8 +217,6 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity loadMetaTileNBT(aNBT); } - 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) if (hasValidMetaTileEntity() && mMetaTileEntity.hasSidedRedstoneOutputBehavior()) mSidedRedstone = new byte[] {0, 0, 0, 0, 0, 0}; @@ -400,7 +400,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity } if (mMetaTileEntity.isEnetOutput() || mMetaTileEntity.isEnetInput()) { - for (byte i = 0; i < 6; i++) { + for (byte i : ALL_VALID_SIDES) { boolean temp = isEnergyInputSide(i); if (temp != mActiveEUInputs[i]) { mActiveEUInputs[i] = temp; @@ -656,12 +656,12 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity (short) yCoord, zCoord, mID, - mCoverSides[0], - mCoverSides[1], - mCoverSides[2], - mCoverSides[3], - mCoverSides[4], - mCoverSides[5], + getCoverInfoAtSide((byte) 0).getCoverID(), + getCoverInfoAtSide((byte) 1).getCoverID(), + getCoverInfoAtSide((byte) 2).getCoverID(), + getCoverInfoAtSide((byte) 3).getCoverID(), + getCoverInfoAtSide((byte) 4).getCoverID(), + getCoverInfoAtSide((byte) 5).getCoverID(), oTextureData = (byte) ((mFacing & 7) | (mActive ? 8 : 0) | (mRedstone ? 16 : 0) @@ -1147,7 +1147,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity public void generatePowerNodes() { if (isServerSide() && (isEnetInput() || isEnetOutput())) { final int time = MinecraftServer.getServer().getTickCounter(); - for (byte i = 0; i < 6; i++) { + for (byte i : ALL_VALID_SIDES) { if (outputsEnergyTo(i, false) || inputEnergyFrom(i, false)) { final IGregTechTileEntity TE = getIGregTechTileEntityAtSide(i); if (TE instanceof BaseMetaPipeEntity) { @@ -1252,8 +1252,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity private boolean isEnergyInputSide(byte aSide) { if (aSide >= 0 && aSide < 6) { - if (!getCoverBehaviorAtSideNew(aSide) - .letsEnergyIn(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) return false; + if (!getCoverInfoAtSide(aSide).letsEnergyIn()) return false; if (isInvalid() || mReleaseEnergy) return false; if (canAccessData() && mMetaTileEntity.isElectric() && mMetaTileEntity.isEnetInput()) return mMetaTileEntity.isInputFacing(aSide); @@ -1263,9 +1262,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity private boolean isEnergyOutputSide(byte aSide) { if (aSide >= 0 && aSide < 6) { - if (!getCoverBehaviorAtSideNew(aSide) - .letsEnergyOut(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) - return false; + if (!getCoverInfoAtSide(aSide).letsEnergyOut()) return false; if (isInvalid() || mReleaseEnergy) return mReleaseEnergy; if (canAccessData() && mMetaTileEntity.isElectric() && mMetaTileEntity.isEnetOutput()) return mMetaTileEntity.isOutputFacing(aSide); @@ -1460,10 +1457,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity 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())) { final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); @@ -1622,6 +1618,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity return true; } } + // End item != null } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config if possible. aSide = (getCoverIDAtSide(aSide) == 0) ? GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ) @@ -1647,9 +1644,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity aY, aZ)) return true; - if (!getCoverBehaviorAtSideNew(aSide) - .isGUIClickable(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) - return false; + if (!getCoverInfoAtSide(aSide).isGUIClickable()) return false; if (isUpgradable() && tCurrentItem != null) { if (ItemList.Upgrade_Muffler.isStackEqual(aPlayer.inventory.getCurrentItem())) { @@ -1736,21 +1731,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity */ @Override public int[] getAccessibleSlotsFromSide(int aSide) { - if (canAccessData() - && (getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsOut( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - -1, - this) - || getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - -1, - this))) return mMetaTileEntity.getAccessibleSlotsFromSide(aSide); + final CoverInfo coverInfo = getCoverInfoAtSide((byte) aSide); + if (canAccessData() && (coverInfo.letsItemsOut(-1) || coverInfo.letsItemsIn(-1))) + return mMetaTileEntity.getAccessibleSlotsFromSide(aSide); return GT_Values.emptyIntArray; } @@ -1761,13 +1744,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity public boolean canInsertItem(int aIndex, ItemStack aStack, int aSide) { return canAccessData() && (mRunningThroughTick || !mInputDisabled) - && getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - aIndex, - this) + && getCoverInfoAtSide((byte) aSide).letsItemsIn(aIndex) && mMetaTileEntity.canInsertItem(aIndex, aStack, aSide); } @@ -1998,13 +1975,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity && (mRunningThroughTick || !mInputDisabled) && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidInput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidIn( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid == null ? null : aFluid.getFluid(), - this)))) return mMetaTileEntity.fill(aSide, aFluid, doFill); + && getCoverInfoAtSide((byte) aSide.ordinal()) + .letsFluidIn(aFluid == null ? null : aFluid.getFluid())))) + return mMetaTileEntity.fill(aSide, aFluid, doFill); return 0; } @@ -2015,17 +1988,14 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity && (mRunningThroughTick || !mOutputDisabled) && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) + && getCoverInfoAtSide((byte) aSide.ordinal()) .letsFluidOut( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), mMetaTileEntity.getFluid() == null ? null : mMetaTileEntity .getFluid() - .getFluid(), - this)))) return mMetaTileEntity.drain(aSide, maxDrain, doDrain); + .getFluid())))) + return mMetaTileEntity.drain(aSide, maxDrain, doDrain); return null; } @@ -2036,13 +2006,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity && (mRunningThroughTick || !mOutputDisabled) && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidOut( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid == null ? null : aFluid.getFluid(), - this)))) return mMetaTileEntity.drain(aSide, aFluid, doDrain); + && getCoverInfoAtSide((byte) aSide.ordinal()) + .letsFluidOut(aFluid == null ? null : aFluid.getFluid())))) + return mMetaTileEntity.drain(aSide, aFluid, doDrain); return null; } @@ -2053,13 +2019,8 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity && (mRunningThroughTick || !mInputDisabled) && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidInput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidIn( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid, - this)))) return mMetaTileEntity.canFill(aSide, aFluid); + && getCoverInfoAtSide((byte) aSide.ordinal()).letsFluidIn(aFluid)))) + return mMetaTileEntity.canFill(aSide, aFluid); return false; } @@ -2070,13 +2031,8 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity && (mRunningThroughTick || !mOutputDisabled) && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidOut( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid, - this)))) return mMetaTileEntity.canDrain(aSide, aFluid); + && getCoverInfoAtSide((byte) aSide.ordinal()).letsFluidOut(aFluid)))) + return mMetaTileEntity.canDrain(aSide, aFluid); return false; } @@ -2087,21 +2043,10 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity if (canAccessData() && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidInput(tSide) - && getCoverBehaviorAtSideNew(tSide) - .letsFluidIn( - tSide, - getCoverIDAtSide(tSide), - getComplexCoverDataAtSide(tSide), - null, - this)) + && getCoverInfoAtSide(tSide).letsFluidIn(null)) || (mMetaTileEntity.isLiquidOutput(tSide) - && getCoverBehaviorAtSideNew(tSide) - .letsFluidOut( - tSide, - getCoverIDAtSide(tSide), - getComplexCoverDataAtSide(tSide), - null, - this)))) return mMetaTileEntity.getTankInfo(aSide); + && getCoverInfoAtSide(tSide).letsFluidOut(null)))) + return mMetaTileEntity.getTankInfo(aSide); return new FluidTankInfo[] {}; } diff --git a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java index 2d29c7b70d..cbd39d3d15 100644 --- a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java @@ -21,7 +21,6 @@ import gregtech.GT_Mod; import gregtech.api.GregTech_API; import gregtech.api.enums.GT_Values; import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; import gregtech.api.gui.modularui.GUITextureSet; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.ICoverable; @@ -34,6 +33,7 @@ import gregtech.api.util.GT_CoverBehavior; import gregtech.api.util.GT_CoverBehaviorBase; import gregtech.api.util.ISerializableObject; import gregtech.common.GT_Client; +import gregtech.common.covers.CoverInfo; import gregtech.common.covers.GT_Cover_Fluidfilter; import java.util.ArrayList; import java.util.Arrays; @@ -49,6 +49,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; @@ -61,6 +62,16 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov .mapToInt(Enum::ordinal) .mapToObj(i -> "mCoverData" + i) .toArray(String[]::new); + + // New Cover Information + protected final CoverInfo[] coverInfos = new CoverInfo[] {null, null, null, null, null, null}; + + protected byte[] mSidedRedstone = new byte[] {15, 15, 15, 15, 15, 15}; + protected boolean mRedstone = false; + protected byte mStrongRedstone = 0; + + /* Deprecated Cover Variables */ + @Deprecated protected final GT_CoverBehaviorBase<?>[] mCoverBehaviors = new GT_CoverBehaviorBase<?>[] { GregTech_API.sNoBehavior, GregTech_API.sNoBehavior, @@ -69,26 +80,39 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov GregTech_API.sNoBehavior, GregTech_API.sNoBehavior }; - protected byte[] mSidedRedstone = new byte[] {15, 15, 15, 15, 15, 15}; - protected boolean mRedstone = false; - protected byte mStrongRedstone = 0; + @Deprecated protected int[] mCoverSides = new int[] {0, 0, 0, 0, 0, 0}; + + @Deprecated protected ISerializableObject[] mCoverData = new ISerializableObject[6]; + + @Deprecated protected final boolean[] mCoverNeedUpdate = new boolean[] {false, false, false, false, false, false}; + /* End Deprecated Cover Variables */ + protected short mID = 0; public long mTickTimer = 0; protected void writeCoverNBT(NBTTagCompound aNBT, boolean isDrop) { - boolean hasCover = false; - for (int i = 0; i < mCoverData.length; i++) { - if (mCoverSides[i] != 0 && mCoverData[i] != null) { - aNBT.setTag(COVER_DATA_NBT_KEYS[i], mCoverData[i].saveDataToNBT()); - hasCover = true; - } + final NBTTagList tList = new NBTTagList(); + final int[] coverSides = new int[] {0, 0, 0, 0, 0, 0}; + + for (byte i = 0; i < coverInfos.length; i++) { + final CoverInfo coverInfo = getCoverInfoAtSide(i); + if (!coverInfo.isValid()) continue; + + // Backwards compat, in case of a revert... for now + tList.appendTag(coverInfo.writeToNBT(new NBTTagCompound())); + aNBT.setTag(COVER_DATA_NBT_KEYS[i], coverInfo.getCoverData().saveDataToNBT()); + } + if (tList.tagCount() > 0) { + aNBT.setTag(GT_Values.NBT.COVERS, tList); + // Backwards compat, in case of a revert... for now + aNBT.setIntArray("mCoverSides", coverSides); } + if (mStrongRedstone > 0) aNBT.setByte("mStrongRedstone", mStrongRedstone); - if (hasCover) aNBT.setIntArray("mCoverSides", mCoverSides); if (!isDrop) { aNBT.setByteArray("mRedstoneSided", mSidedRedstone); @@ -97,40 +121,63 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov } protected void readCoverNBT(NBTTagCompound aNBT) { - mCoverSides = aNBT.hasKey("mCoverSides") ? aNBT.getIntArray("mCoverSides") : new int[] {0, 0, 0, 0, 0, 0}; mRedstone = aNBT.getBoolean("mRedstone"); mSidedRedstone = aNBT.hasKey("mRedstoneSided") ? aNBT.getByteArray("mRedstoneSided") : new byte[] {15, 15, 15, 15, 15, 15}; mStrongRedstone = aNBT.getByte("mStrongRedstone"); - for (byte i = 0; i < 6; i++) mCoverBehaviors[i] = GregTech_API.getCoverBehaviorNew(mCoverSides[i]); + if (aNBT.hasKey(GT_Values.NBT.COVERS)) { + readCoverInfoNBT(aNBT); + } else if (aNBT.hasKey("mCoverSides")) { + readLegacyCoverInfoNBT(aNBT); + } + } - // check old form of data - mCoverData = new ISerializableObject[6]; - if (aNBT.hasKey("mCoverData", 11) && aNBT.getIntArray("mCoverData").length == 6) { - final int[] tOldData = aNBT.getIntArray("mCoverData"); - for (int i = 0; i < tOldData.length; i++) { - if (mCoverBehaviors[i] instanceof GT_Cover_Fluidfilter) { + public void readCoverInfoNBT(NBTTagCompound aNBT) { + final NBTTagList tList = aNBT.getTagList(GT_Values.NBT.COVERS, 10); + for (byte i = 0; i < tList.tagCount(); i++) { + final NBTTagCompound tNBT = tList.getCompoundTagAt(i); + final CoverInfo coverInfo = new CoverInfo(this, tNBT); + this.setCoverInfoAtSide(coverInfo.getSide(), coverInfo); + if (coverInfo.isDataNeededOnClient()) issueCoverUpdate(i); + } + } + + public void readLegacyCoverInfoNBT(NBTTagCompound aNBT) { + final int[] coverIDs = + aNBT.hasKey("mCoverSides") ? aNBT.getIntArray("mCoverSides") : new int[] {0, 0, 0, 0, 0, 0}; + final boolean hasOldCoverData = (aNBT.hasKey("mCoverData", 11) && aNBT.getIntArray("mCoverData").length == 6); + final int[] tOldData = hasOldCoverData ? aNBT.getIntArray("mCoverData") : new int[] {}; + + for (byte i : ALL_VALID_SIDES) { + if (coverIDs[i] == 0) continue; + + final CoverInfo coverInfo = new CoverInfo(i, coverIDs[i], this, null); + final GT_CoverBehaviorBase<?> coverBehavior = coverInfo.getCoverBehavior(); + if (coverBehavior == GregTech_API.sNoBehavior) continue; + + ISerializableObject coverData = null; + if (hasOldCoverData) { + if (coverBehavior instanceof GT_Cover_Fluidfilter) { final String filterKey = String.format("fluidFilter%d", i); if (aNBT.hasKey(filterKey)) { - mCoverData[i] = mCoverBehaviors[i].createDataObject( - (tOldData[i] & 7) | (FluidRegistry.getFluidID(aNBT.getString(filterKey)) << 3)); + coverData = coverInfo + .getCoverBehavior() + .createDataObject( + (tOldData[i] & 7) | (FluidRegistry.getFluidID(aNBT.getString(filterKey)) << 3)); } - } else if (mCoverBehaviors[i] != null && mCoverBehaviors[i] != GregTech_API.sNoBehavior) { - mCoverData[i] = mCoverBehaviors[i].createDataObject(tOldData[i]); + } else { + coverData = coverBehavior.createDataObject(tOldData[i]); } - } - } else { - // no old data - for (byte i = 0; i < 6; i++) { - if (mCoverBehaviors[i] == null) continue; + } else { if (aNBT.hasKey(COVER_DATA_NBT_KEYS[i])) - mCoverData[i] = mCoverBehaviors[i].createDataObject(aNBT.getTag(COVER_DATA_NBT_KEYS[i])); - else mCoverData[i] = mCoverBehaviors[i].createDataObject(); - if (mCoverBehaviors[i].isDataNeededOnClient(i, mCoverSides[i], mCoverData[i], this)) - issueCoverUpdate(i); + coverData = coverBehavior.createDataObject(aNBT.getTag(COVER_DATA_NBT_KEYS[i])); } + + if (coverData != null) coverInfo.setCoverData(coverData); + setCoverInfoAtSide(i, coverInfo); + if (coverInfo.isDataNeededOnClient()) issueCoverUpdate(i); } } @@ -138,33 +185,45 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov protected boolean doCoverThings() { for (byte i : ALL_VALID_SIDES) { - if (getCoverIDAtSide(i) != 0) { - final GT_CoverBehaviorBase<?> tCover = getCoverBehaviorAtSideNew(i); - final int tCoverTickRate = tCover.getTickRate(i, getCoverIDAtSide(i), mCoverData[i], this); - if (tCoverTickRate > 0 && mTickTimer % tCoverTickRate == 0) { - final byte tRedstone = - tCover.isRedstoneSensitive(i, getCoverIDAtSide(i), mCoverData[i], this, mTickTimer) - ? getInputRedstoneSignal(i) - : 0; - mCoverData[i] = - tCover.doCoverThings(i, tRedstone, getCoverIDAtSide(i), mCoverData[i], this, mTickTimer); - if (!isStillValid()) return false; - } - } + if (!tickCoverAtSide(i)) return false; } return true; } + public boolean tickCoverAtSide(byte aSide) { + return tickCoverAtSide(aSide, mTickTimer); + } + + /** + * Returns false if the tile is no longer valid after ticking the cover + */ + public boolean tickCoverAtSide(byte aSide, long aTickTimer) { + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (!coverInfo.isValid()) return true; + final int tCoverTickRate = coverInfo.getTickRate(); + if (tCoverTickRate > 0 && aTickTimer % tCoverTickRate == 0) { + final byte tRedstone = coverInfo.isRedstoneSensitive(aTickTimer) ? getInputRedstoneSignal(aSide) : 0; + coverInfo.setCoverData(coverInfo.doCoverThings(aTickTimer, tRedstone)); + return isStillValid(); + } + + return true; + } + public abstract boolean allowCoverOnSide(byte aSide, GT_ItemStack aCoverID); protected void checkDropCover() { - for (byte i : ALL_VALID_SIDES) - if (getCoverIDAtSide(i) != 0) - if (!allowCoverOnSide(i, new GT_ItemStack(getCoverIDAtSide(i)))) dropCover(i, i, true); + for (byte i : ALL_VALID_SIDES) { + final int coverId = getCoverIDAtSide(i); + if (coverId != 0) if (!allowCoverOnSide(i, new GT_ItemStack(coverId))) dropCover(i, i, true); + } } protected void updateCoverBehavior() { - for (byte i : ALL_VALID_SIDES) mCoverBehaviors[i] = GregTech_API.getCoverBehaviorNew(mCoverSides[i]); + for (byte i : ALL_VALID_SIDES) { + final CoverInfo coverInfo = getCoverInfoAtSide(i); + if (coverInfo.isValid()) coverInfo.updateCoverBehavior(); + } } @Override @@ -172,32 +231,20 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov // If we've got a null worldObj we're getting called as a part of readingNBT from a non tickable MultiTileEntity // on chunk load before the world is set // so we'll want to send a cover update. - if (worldObj == null - || (isServerSide() - && getCoverBehaviorAtSideNew(aSide) - .isDataNeededOnClient( - aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this))) - mCoverNeedUpdate[aSide] = true; + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (worldObj == null || (isServerSide() && coverInfo.isDataNeededOnClient())) coverInfo.setNeedsUpdate(true); } public final ITexture getCoverTexture(byte aSide) { - if (getCoverIDAtSide(aSide) == 0) return null; + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (!coverInfo.isValid()) return null; if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) { return Textures.BlockIcons.HIDDEN_TEXTURE[0]; // See through } - GT_CoverBehaviorBase<?> coverBehavior = getCoverBehaviorAtSideNew(aSide); - final ITexture coverTexture; - if (coverBehavior != null) { - if (!(this instanceof BaseMetaPipeEntity)) { - coverTexture = coverBehavior.getSpecialCoverFGTexture( - aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); - } else { - coverTexture = coverBehavior.getSpecialCoverTexture( - aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); - } - } else { - coverTexture = null; - } + final ITexture coverTexture = (!(this instanceof BaseMetaPipeEntity)) + ? coverInfo.getSpecialCoverFGTexture() + : coverInfo.getSpecialCoverTexture(); + return coverTexture != null ? coverTexture : GregTech_API.sCovers.get(new GT_ItemStack(getCoverIDAtSide(aSide))); @@ -206,16 +253,14 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov protected void requestCoverDataIfNeeded() { if (worldObj == null || !worldObj.isRemote) return; for (byte i : ALL_VALID_SIDES) { - if (getCoverBehaviorAtSideNew(i) - .isDataNeededOnClient(i, getCoverIDAtSide(i), getComplexCoverDataAtSide(i), this)) - NW.sendToServer(new GT_Packet_RequestCoverData(i, getCoverIDAtSide(i), this)); + final CoverInfo coverInfo = getCoverInfoAtSide(i); + if (coverInfo.isDataNeededOnClient()) NW.sendToServer(new GT_Packet_RequestCoverData(coverInfo, this)); } } @Override public void setCoverIdAndDataAtSide(byte aSide, int aId, ISerializableObject aData) { - if (setCoverIDAtSideNoUpdate(aSide, aId)) { - setCoverDataAtSide(aSide, aData); + if (setCoverIDAtSideNoUpdate(aSide, aId, aData)) { issueCoverUpdate(aSide); issueBlockUpdate(); } @@ -223,20 +268,19 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override public void setCoverIDAtSide(byte aSide, int aID) { - if (setCoverIDAtSideNoUpdate(aSide, aID)) { - issueCoverUpdate(aSide); - issueBlockUpdate(); - } + setCoverIdAndDataAtSide(aSide, aID, null); } @Override public boolean setCoverIDAtSideNoUpdate(byte aSide, int aID) { - if (aSide >= 0 && aSide < 6 && mCoverSides[aSide] != aID) { - if (aID == 0 && isClientSide()) - mCoverBehaviors[aSide].onDropped(aSide, mCoverSides[aSide], mCoverData[aSide], this); - mCoverSides[aSide] = aID; - mCoverBehaviors[aSide] = GregTech_API.getCoverBehaviorNew(aID); - mCoverData[aSide] = mCoverBehaviors[aSide].createDataObject(); + return setCoverIDAtSideNoUpdate(aSide, aID, null); + } + + public boolean setCoverIDAtSideNoUpdate(byte aSide, int aID, ISerializableObject aData) { + final CoverInfo oldCoverInfo = getCoverInfoAtSide(aSide); + if (aSide >= 0 && aSide < 6 && oldCoverInfo.getCoverID() != aID) { + if (aID == 0 && isClientSide()) oldCoverInfo.onDropped(); + setCoverInfoAtSide(aSide, new CoverInfo(aSide, aID, this, aData)); return true; } return false; @@ -245,23 +289,22 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override @Deprecated public void setCoverDataAtSide(byte aSide, int aData) { - if (aSide >= 0 && aSide < 6 && mCoverData[aSide] instanceof ISerializableObject.LegacyCoverData) - mCoverData[aSide] = new ISerializableObject.LegacyCoverData(aData); + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (coverInfo.isValid() && coverInfo.getCoverData() instanceof ISerializableObject.LegacyCoverData) + coverInfo.setCoverData(new ISerializableObject.LegacyCoverData(aData)); } @Override public void setCoverDataAtSide(byte aSide, ISerializableObject aData) { - if (aSide >= 0 - && aSide < 6 - && getCoverBehaviorAtSideNew(aSide) != null - && getCoverBehaviorAtSideNew(aSide).cast(aData) != null) mCoverData[aSide] = aData; + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (coverInfo.isValid() && coverInfo.getCoverBehavior().cast(aData) != null) coverInfo.setCoverData(aData); } @Override @Deprecated public GT_CoverBehavior getCoverBehaviorAtSide(byte aSide) { - if (aSide >= 0 && aSide < mCoverBehaviors.length && mCoverBehaviors[aSide] instanceof GT_CoverBehavior) - return (GT_CoverBehavior) mCoverBehaviors[aSide]; + final GT_CoverBehaviorBase<?> behavior = getCoverInfoAtSide(aSide).getCoverBehavior(); + if (behavior instanceof GT_CoverBehavior) return (GT_CoverBehavior) behavior; return GregTech_API.sNoBehavior; } @@ -272,14 +315,12 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override public int getCoverIDAtSide(byte aSide) { - if (aSide >= 0 && aSide < 6) return mCoverSides[aSide]; - return 0; + return getCoverInfoAtSide(aSide).getCoverID(); } @Override public ItemStack getCoverItemAtSide(byte aSide) { - return getCoverBehaviorAtSideNew(aSide) - .getDisplayStack(getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide)); + return getCoverInfoAtSide(aSide).getDisplayStack(); } @Override @@ -295,57 +336,71 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override @Deprecated public int getCoverDataAtSide(byte aSide) { - if (aSide >= 0 && aSide < 6 && mCoverData[aSide] instanceof ISerializableObject.LegacyCoverData) - return ((ISerializableObject.LegacyCoverData) mCoverData[aSide]).get(); + final ISerializableObject coverData = getCoverInfoAtSide(aSide).getCoverData(); + if (coverData instanceof ISerializableObject.LegacyCoverData) { + return ((ISerializableObject.LegacyCoverData) coverData).get(); + } return 0; } @Override public ISerializableObject getComplexCoverDataAtSide(byte aSide) { - if (aSide >= 0 && aSide < 6 && getCoverBehaviorAtSideNew(aSide) != null) return mCoverData[aSide]; - return GregTech_API.sNoBehavior.createDataObject(); + return getCoverInfoAtSide(aSide).getCoverData(); } @Override public GT_CoverBehaviorBase<?> getCoverBehaviorAtSideNew(byte aSide) { - if (aSide >= 0 && aSide < 6) return mCoverBehaviors[aSide]; - return GregTech_API.sNoBehavior; + return getCoverInfoAtSide(aSide).getCoverBehavior(); + } + + public void setCoverInfoAtSide(byte aSide, CoverInfo coverInfo) { + if (aSide >= 0 && aSide < 6) coverInfos[aSide] = coverInfo; } @Override - public boolean dropCover(byte aSide, byte aDroppedSide, boolean aForced) { - if (getCoverBehaviorAtSideNew(aSide) - .onCoverRemoval(aSide, getCoverIDAtSide(aSide), mCoverData[aSide], this, aForced) - || aForced) { - final ItemStack tStack = getCoverBehaviorAtSideNew(aSide) - .getDrop(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); - if (tStack != null) { - getCoverBehaviorAtSideNew(aSide) - .onDropped(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); - final EntityItem tEntity = new EntityItem( - worldObj, - getOffsetX(aDroppedSide, 1) + 0.5, - getOffsetY(aDroppedSide, 1) + 0.5, - getOffsetZ(aDroppedSide, 1) + 0.5, - tStack); - tEntity.motionX = 0; - tEntity.motionY = 0; - tEntity.motionZ = 0; - worldObj.spawnEntityInWorld(tEntity); - } + public CoverInfo getCoverInfoAtSide(byte aSide) { + if (aSide >= 0 && aSide < 6) { + if (coverInfos[aSide] == null) coverInfos[aSide] = new CoverInfo(aSide, this); + return coverInfos[aSide]; + } + return CoverInfo.EMPTY_INFO; + } + + public void clearCoverInfoAtSide(byte aSide) { + if (aSide >= 0 && aSide < 6) { setCoverIDAtSide(aSide, 0); - updateOutputRedstoneSignal(aSide); + } + } - return true; + @Override + public boolean dropCover(byte aSide, byte aDroppedSide, boolean aForced) { + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (!coverInfo.isValid()) return false; + if (!coverInfo.onCoverRemoval(aForced) && !aForced) return false; + final ItemStack tStack = coverInfo.getDrop(); + if (tStack != null) { + coverInfo.onDropped(); + final EntityItem tEntity = new EntityItem( + worldObj, + getOffsetX(aDroppedSide, 1) + 0.5, + getOffsetY(aDroppedSide, 1) + 0.5, + getOffsetZ(aDroppedSide, 1) + 0.5, + tStack); + tEntity.motionX = 0; + tEntity.motionY = 0; + tEntity.motionZ = 0; + worldObj.spawnEntityInWorld(tEntity); } - return false; + clearCoverInfoAtSide(aSide); + updateOutputRedstoneSignal(aSide); + + return true; } protected void onBaseTEDestroyed() { - for (byte side = 0; side < 6; ++side) { - GT_CoverBehaviorBase<?> behavior = getCoverBehaviorAtSideNew(side); - if (behavior != GregTech_API.sNoBehavior) - behavior.onBaseTEDestroyed(side, getCoverIDAtSide(side), mCoverData[side], this); + for (byte side : ALL_VALID_SIDES) { + final CoverInfo coverInfo = getCoverInfoAtSide(side); + if (coverInfo.isValid()) coverInfo.onBaseTEDestroyed(); } } @@ -435,49 +490,38 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override public void receiveCoverData(byte aCoverSide, int aCoverID, int aCoverData) { - if ((aCoverSide >= 0 && aCoverSide < 6)) { - GT_CoverBehaviorBase<?> behaviorBase = getCoverBehaviorAtSideNew(aCoverSide); - if (behaviorBase == GregTech_API.sNoBehavior) return; + if (aCoverSide < 0 || aCoverSide >= 6) return; + final CoverInfo oldCoverInfo = getCoverInfoAtSide(aCoverSide); + if (!oldCoverInfo.isValid()) return; - setCoverIDAtSideNoUpdate(aCoverSide, aCoverID); - setCoverDataAtSide(aCoverSide, aCoverData); - } + setCoverIDAtSideNoUpdate(aCoverSide, aCoverID); + setCoverDataAtSide(aCoverSide, aCoverData); } @Override public void receiveCoverData( byte aCoverSide, int aCoverID, ISerializableObject aCoverData, EntityPlayerMP aPlayer) { - if ((aCoverSide >= 0 && aCoverSide < 6)) { - GT_CoverBehaviorBase<?> behaviorBase = getCoverBehaviorAtSideNew(aCoverSide); - if (behaviorBase == GregTech_API.sNoBehavior) return; - - behaviorBase.preDataChanged( - aCoverSide, - getCoverIDAtSide(aCoverSide), - aCoverID, - getComplexCoverDataAtSide(aCoverSide), - aCoverData, - this); - - setCoverIDAtSideNoUpdate(aCoverSide, aCoverID); - setCoverDataAtSide(aCoverSide, aCoverData); - if (isClientSide()) { - behaviorBase.onDataChanged(aCoverSide, aCoverID, aCoverData, this); - } + if (aCoverSide < 0 || aCoverSide >= 6) return; + + final CoverInfo oldCoverInfo = getCoverInfoAtSide(aCoverSide); + + if (!oldCoverInfo.isValid()) return; + oldCoverInfo.preDataChanged(aCoverID, aCoverData); + setCoverIDAtSideNoUpdate(aCoverSide, aCoverID, aCoverData); + + if (isClientSide()) { + getCoverInfoAtSide(aCoverSide).onDataChanged(); } } protected void sendCoverDataIfNeeded() { if (worldObj == null || worldObj.isRemote) return; - final int mCoverNeedUpdateLength = mCoverNeedUpdate.length; - for (byte i = 0; i < mCoverNeedUpdateLength; i++) { - if (mCoverNeedUpdate[i]) { + for (byte i : ALL_VALID_SIDES) { + final CoverInfo coverInfo = getCoverInfoAtSide(i); + if (coverInfo.needsUpdate()) { NW.sendPacketToAllPlayersInRange( - worldObj, - new GT_Packet_SendCoverData(i, getCoverIDAtSide(i), getComplexCoverDataAtSide(i), this), - xCoord, - zCoord); - mCoverNeedUpdate[i] = false; + worldObj, new GT_Packet_SendCoverData(coverInfo, this), xCoord, zCoord); + coverInfo.setNeedsUpdate(false); } } } @@ -488,31 +532,25 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov final NBTTagCompound tag = accessor.getNBTData(); final byte currentFacing = (byte) accessor.getSide().ordinal(); - final int[] coverSides = tag.getIntArray("mCoverSides"); - // Not all data is available on the client, so get it from the NBT packet - if (coverSides != null && coverSides.length == 6) { - for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { - final byte side = (byte) direction.ordinal(); - final int coverId = coverSides[side]; - final GT_CoverBehaviorBase<?> behavior = GregTech_API.getCoverBehaviorNew(coverId); - - if (coverId != 0 && behavior != null && behavior != GregTech_API.sNoBehavior) { - if (tag.hasKey(CoverableTileEntity.COVER_DATA_NBT_KEYS[side])) { - final ISerializableObject dataObject = - behavior.createDataObject(tag.getTag(CoverableTileEntity.COVER_DATA_NBT_KEYS[side])); - final ItemStack coverStack = behavior.getDisplayStack(coverId, dataObject); - if (coverStack != null) - currenttip.add(StatCollector.translateToLocalFormatted( - "GT5U.waila.cover", - currentFacing == side - ? StatCollector.translateToLocal("GT5U.waila.cover.current_facing") - : StatCollector.translateToLocal("GT5U.interface.coverTabs." - + direction.toString().toLowerCase()), - coverStack.getDisplayName())); - final String behaviorDesc = behavior.getDescription(side, coverId, dataObject, null); - if (!Objects.equals(behaviorDesc, E)) currenttip.add(behaviorDesc); - } - } + final NBTTagList tList = tag.getTagList(GT_Values.NBT.COVERS, 10); + for (byte i = 0; i < tList.tagCount(); i++) { + final NBTTagCompound tNBT = tList.getCompoundTagAt(i); + final CoverInfo coverInfo = new CoverInfo(this, tNBT); + if (!coverInfo.isValid() || coverInfo.getCoverBehavior() == GregTech_API.sNoBehavior) continue; + + final ItemStack coverStack = coverInfo.getDisplayStack(); + if (coverStack != null) { + currenttip.add(StatCollector.translateToLocalFormatted( + "GT5U.waila.cover", + currentFacing == coverInfo.getSide() + ? StatCollector.translateToLocal("GT5U.waila.cover.current_facing") + : StatCollector.translateToLocal("GT5U.interface.coverTabs." + + ForgeDirection.getOrientation(coverInfo.getSide()) + .toString() + .toLowerCase()), + coverStack.getDisplayName())); + final String behaviorDesc = coverInfo.getBehaviorDescription(); + if (!Objects.equals(behaviorDesc, E)) currenttip.add(behaviorDesc); } } @@ -527,8 +565,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov // super.getWailaNBTData(player, tile, tag, world, x, y, z); // While we have some cover data on the client (enough to render it); we don't have all the information we want, - // such as - // details on the fluid filter, so send it all here. + // such as details on the fluid filter, so send it all here. writeCoverNBT(tag, false); } @@ -538,6 +575,20 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov * @param aList - List to add the information to */ public static void addInstalledCoversInformation(NBTTagCompound aNBT, List<String> aList) { + final NBTTagList tList = aNBT.getTagList(GT_Values.NBT.COVERS, 10); + for (byte i = 0; i < tList.tagCount(); i++) { + final NBTTagCompound tNBT = tList.getCompoundTagAt(i); + final CoverInfo coverInfo = new CoverInfo(null, tNBT); + if (!coverInfo.isValid() || coverInfo.getCoverBehavior() == GregTech_API.sNoBehavior) continue; + + final ItemStack coverStack = coverInfo.getDisplayStack(); + if (coverStack != null) { + aList.add(String.format( + "Cover on %s side: %s", + getTranslation(FACES[coverInfo.getSide()]), coverStack.getDisplayName())); + } + } + if (aNBT.hasKey("mCoverSides")) { final int[] mCoverSides = aNBT.getIntArray("mCoverSides"); if (mCoverSides != null && mCoverSides.length == 6) { @@ -560,10 +611,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov } protected ModularWindow createCoverWindow(EntityPlayer player, byte side) { - final GT_CoverBehaviorBase<?> coverBehavior = getCoverBehaviorAtSideNew(side); - final GT_CoverUIBuildContext buildContext = - new GT_CoverUIBuildContext(player, getCoverIDAtSide(side), side, this, true); - return coverBehavior.createWindow(buildContext); + return getCoverInfoAtSide(side).createWindow(player); } protected static final int COVER_WINDOW_ID_START = 1; @@ -630,9 +678,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov .setPos( (COVER_TAB_WIDTH - ICON_SIZE) / 2 + (flipHorizontally ? -1 : 1), (COVER_TAB_HEIGHT - ICON_SIZE) / 2)) - .setEnabled(widget -> { - return getCoverItemAtSide(side) != null; - })); + .setEnabled(widget -> getCoverItemAtSide(side) != null)); } } @@ -646,12 +692,13 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov "GT5U.interface.coverTabs.west", "GT5U.interface.coverTabs.east" }; - final ItemStack coverItem = getCoverItemAtSide(side); + final CoverInfo coverInfo = getCoverInfoAtSide(side); + final ItemStack coverItem = coverInfo.getDisplayStack(); if (coverItem == null) return Collections.emptyList(); - boolean coverHasGUI = getCoverBehaviorAtSideNew(side).hasCoverGUI(); + final boolean coverHasGUI = coverInfo.hasCoverGUI(); //noinspection unchecked - List<String> tooltip = coverItem.getTooltip(Minecraft.getMinecraft().thePlayer, true); + final List<String> tooltip = coverItem.getTooltip(Minecraft.getMinecraft().thePlayer, true); for (int i = 0; i < tooltip.size(); i++) { if (i == 0) { tooltip.set( @@ -669,18 +716,12 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov protected void onTabClicked(Widget.ClickData clickData, Widget widget, byte side) { if (isClientSide()) return; - - final GT_CoverBehaviorBase<?> coverBehavior = getCoverBehaviorAtSideNew(side); - if (coverBehavior.useModularUI()) { + final CoverInfo coverInfo = getCoverInfoAtSide(side); + if (coverInfo.useModularUI()) { widget.getContext().openSyncedWindow(side + COVER_WINDOW_ID_START); } else { final GT_Packet_TileEntityCoverGUI packet = new GT_Packet_TileEntityCoverGUI( - getXCoord(), - getYCoord(), - getZCoord(), - side, - getCoverIDAtSide(side), - getComplexCoverDataAtSide(side), + coverInfo, getWorld().provider.dimensionId, widget.getContext().getPlayer().getEntityId(), 0); diff --git a/src/main/java/gregtech/api/metatileentity/GregTechTileClientEvents.java b/src/main/java/gregtech/api/metatileentity/GregTechTileClientEvents.java index c3c22415cb..d8e8017060 100644 --- a/src/main/java/gregtech/api/metatileentity/GregTechTileClientEvents.java +++ b/src/main/java/gregtech/api/metatileentity/GregTechTileClientEvents.java @@ -1,6 +1,6 @@ package gregtech.api.metatileentity; -public class GregTechTileClientEvents { +public final class GregTechTileClientEvents { public static final byte CHANGE_COMMON_DATA = 0; public static final byte CHANGE_CUSTOM_DATA = 1; public static final byte CHANGE_COLOR = 2; diff --git a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java index ff9ac7517d..b433e48b6e 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java @@ -17,6 +17,7 @@ import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.objects.GT_ItemStack; import gregtech.api.util.*; import gregtech.common.GT_Client; +import gregtech.common.covers.CoverInfo; import java.io.File; import java.util.ArrayList; import java.util.List; @@ -581,43 +582,15 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { @Override public int[] getAccessibleSlotsFromSide(int aSide) { - TIntList tList = new TIntArrayList(); - IGregTechTileEntity tTileEntity = getBaseMetaTileEntity(); - boolean tSkip = tTileEntity - .getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - tTileEntity.getCoverIDAtSide((byte) aSide), - tTileEntity.getComplexCoverDataAtSide((byte) aSide), - -2, - tTileEntity) - || tTileEntity - .getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsOut( - (byte) aSide, - tTileEntity.getCoverIDAtSide((byte) aSide), - tTileEntity.getComplexCoverDataAtSide((byte) aSide), - -2, - tTileEntity); - for (int i = 0; i < getSizeInventory(); i++) - if (isValidSlot(i) - && (tSkip - || tTileEntity - .getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsOut( - (byte) aSide, - tTileEntity.getCoverIDAtSide((byte) aSide), - tTileEntity.getComplexCoverDataAtSide((byte) aSide), - i, - tTileEntity) - || tTileEntity - .getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - tTileEntity.getCoverIDAtSide((byte) aSide), - tTileEntity.getComplexCoverDataAtSide((byte) aSide), - i, - tTileEntity))) tList.add(i); + final TIntList tList = new TIntArrayList(); + final IGregTechTileEntity tTileEntity = getBaseMetaTileEntity(); + final CoverInfo tileCoverInfo = tTileEntity.getCoverInfoAtSide((byte) aSide); + final boolean tSkip = tileCoverInfo.letsItemsIn(-2) || tileCoverInfo.letsItemsOut(-2); + for (int i = 0; i < getSizeInventory(); i++) { + if (isValidSlot(i) && (tSkip || tileCoverInfo.letsItemsOut(i) || tileCoverInfo.letsItemsIn(i))) { + tList.add(i); + } + } return tList.toArray(); } @@ -910,7 +883,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { // If both are colored they must be the same color to connect. if (tTileEntity instanceof IColoredTileEntity) { if (getBaseMetaTileEntity().getColorization() >= 0) { - byte tColor = ((IColoredTileEntity) tTileEntity).getColorization(); + final byte tColor = ((IColoredTileEntity) tTileEntity).getColorization(); if (tColor >= 0 && tColor != getBaseMetaTileEntity().getColorization()) return false; } } @@ -926,21 +899,19 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { final IGregTechTileEntity baseMetaTile = getBaseMetaTileEntity(); if (baseMetaTile == null || !baseMetaTile.isServerSide()) return 0; - final GT_CoverBehaviorBase<?> coverBehavior = baseMetaTile.getCoverBehaviorAtSideNew(aSide); - final int coverId = baseMetaTile.getCoverIDAtSide(aSide); - ISerializableObject coverData = baseMetaTile.getComplexCoverDataAtSide(aSide); + final CoverInfo coverInfo = baseMetaTile.getCoverInfoAtSide(aSide); - boolean alwaysLookConnected = coverBehavior.alwaysLookConnected(aSide, coverId, coverData, baseMetaTile); - boolean letsIn = letsIn(coverBehavior, aSide, coverId, coverData, baseMetaTile); - boolean letsOut = letsOut(coverBehavior, aSide, coverId, coverData, baseMetaTile); + final boolean alwaysLookConnected = coverInfo.alwaysLookConnected(); + final boolean letsIn = letsIn(coverInfo); + final boolean letsOut = letsOut(coverInfo); // Careful - tTileEntity might be null, and that's ok -- so handle it - TileEntity tTileEntity = baseMetaTile.getTileEntityAtSide(aSide); + final TileEntity tTileEntity = baseMetaTile.getTileEntityAtSide(aSide); if (!connectableColor(tTileEntity)) return 0; if ((alwaysLookConnected || letsIn || letsOut)) { // Are we trying to connect to a pipe? let's do it! - IMetaTileEntity tPipe = tTileEntity instanceof IGregTechTileEntity + final IMetaTileEntity tPipe = tTileEntity instanceof IGregTechTileEntity ? ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() : null; if (getClass().isInstance(tPipe) @@ -1006,11 +977,19 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { return false; } + public boolean letsIn(CoverInfo coverInfo) { + return false; + } + public boolean letsOut( GT_CoverBehavior coverBehavior, byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { return false; } + public boolean letsOut(CoverInfo coverInfo) { + return false; + } + public boolean letsIn( GT_CoverBehaviorBase<?> coverBehavior, byte aSide, diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index 8f1c3f2e48..de2b118c71 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -32,6 +32,7 @@ import gregtech.api.util.GT_TooltipDataCache; import gregtech.api.util.GT_Util; import gregtech.api.util.GT_Utility; import gregtech.common.GT_Client; +import gregtech.common.covers.CoverInfo; import java.io.File; import java.util.ArrayList; import java.util.List; @@ -871,43 +872,15 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac @Override public int[] getAccessibleSlotsFromSide(int aSide) { - TIntList tList = new TIntArrayList(); - IGregTechTileEntity tTileEntity = getBaseMetaTileEntity(); - boolean tSkip = tTileEntity - .getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - tTileEntity.getCoverIDAtSide((byte) aSide), - tTileEntity.getComplexCoverDataAtSide((byte) aSide), - -2, - tTileEntity) - || tTileEntity - .getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsOut( - (byte) aSide, - tTileEntity.getCoverIDAtSide((byte) aSide), - tTileEntity.getComplexCoverDataAtSide((byte) aSide), - -2, - tTileEntity); - for (int i = 0; i < getSizeInventory(); i++) - if (isValidSlot(i) - && (tSkip - || tTileEntity - .getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsOut( - (byte) aSide, - tTileEntity.getCoverIDAtSide((byte) aSide), - tTileEntity.getComplexCoverDataAtSide((byte) aSide), - i, - tTileEntity) - || tTileEntity - .getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - tTileEntity.getCoverIDAtSide((byte) aSide), - tTileEntity.getComplexCoverDataAtSide((byte) aSide), - i, - tTileEntity))) tList.add(i); + final TIntList tList = new TIntArrayList(); + final IGregTechTileEntity tTileEntity = getBaseMetaTileEntity(); + final CoverInfo tileCoverInfo = tTileEntity.getCoverInfoAtSide((byte) aSide); + final boolean tSkip = tileCoverInfo.letsItemsIn(-2) || tileCoverInfo.letsItemsOut(-2); + for (int i = 0; i < getSizeInventory(); i++) { + if (isValidSlot(i) && (tSkip || tileCoverInfo.letsItemsOut(i) || tileCoverInfo.letsItemsIn(i))) { + tList.add(i); + } + } return tList.toArray(); } diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java index 965e920e82..47915e64cb 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java @@ -1,5 +1,7 @@ package gregtech.api.metatileentity.implementations; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import cofh.api.energy.IEnergyReceiver; import cpw.mods.fml.common.Loader; import gregtech.GT_Mod; @@ -26,6 +28,7 @@ import gregtech.api.objects.GT_Cover_None; import gregtech.api.render.TextureFactory; import gregtech.api.util.*; import gregtech.common.GT_Client; +import gregtech.common.covers.CoverInfo; import gregtech.common.covers.GT_Cover_SolarPanel; import ic2.api.energy.EnergyNet; import ic2.api.energy.tile.IEnergyEmitter; @@ -231,14 +234,8 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile @Override public long injectEnergyUnits(byte aSide, long aVoltage, long aAmperage) { if (!isConnectedAtSide(aSide) && aSide != 6) return 0; - if (!getBaseMetaTileEntity() - .getCoverBehaviorAtSideNew(aSide) - .letsEnergyIn( - aSide, - getBaseMetaTileEntity().getCoverIDAtSide(aSide), - getBaseMetaTileEntity().getComplexCoverDataAtSide(aSide), - getBaseMetaTileEntity())) return 0; - HashSet<TileEntity> nul = null; + if (!getBaseMetaTileEntity().getCoverInfoAtSide(aSide).letsEnergyIn()) return 0; + final HashSet<TileEntity> nul = null; return transferElectricity(aSide, aVoltage, aAmperage, nul); } @@ -252,12 +249,12 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile @Override public long transferElectricity(byte aSide, long aVoltage, long aAmperage, HashSet<TileEntity> aAlreadyPassedSet) { if (!getBaseMetaTileEntity().isServerSide() || !isConnectedAtSide(aSide) && aSide != 6) return 0; - BaseMetaPipeEntity tBase = (BaseMetaPipeEntity) getBaseMetaTileEntity(); + final BaseMetaPipeEntity tBase = (BaseMetaPipeEntity) getBaseMetaTileEntity(); if (!(tBase.getNode() instanceof PowerNode)) return 0; - PowerNode tNode = (PowerNode) tBase.getNode(); + final PowerNode tNode = (PowerNode) tBase.getNode(); if (tNode != null) { int tPlace = 0; - Node[] tToPower = new Node[tNode.mConsumers.size()]; + final Node[] tToPower = new Node[tNode.mConsumers.size()]; if (tNode.mHadVoltage) { for (ConsumerNode consumer : tNode.mConsumers) { if (consumer.needsEnergy()) tToPower[tPlace++] = consumer; @@ -359,6 +356,16 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile } @Override + public boolean letsIn(CoverInfo coverInfo) { + return coverInfo.letsEnergyIn(); + } + + @Override + public boolean letsOut(CoverInfo coverInfo) { + return coverInfo.letsEnergyOut(); + } + + @Override public boolean canConnect(byte aSide, TileEntity tTileEntity) { final IGregTechTileEntity baseMetaTile = getBaseMetaTileEntity(); final GT_CoverBehaviorBase<?> coverBehavior = baseMetaTile.getCoverBehaviorAtSideNew(aSide); @@ -472,8 +479,8 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile @Override public String[] getInfoData() { - BaseMetaPipeEntity base = (BaseMetaPipeEntity) getBaseMetaTileEntity(); - PowerNodePath path = (PowerNodePath) base.getNodePath(); + final BaseMetaPipeEntity base = (BaseMetaPipeEntity) getBaseMetaTileEntity(); + final PowerNodePath path = (PowerNodePath) base.getNodePath(); long amps = 0; long volts = 0; if (path != null) { @@ -562,7 +569,7 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile Entity collider) { super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) { - AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb); } } @@ -593,32 +600,27 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile @Override public void reloadLocks() { - BaseMetaPipeEntity pipe = (BaseMetaPipeEntity) getBaseMetaTileEntity(); + final BaseMetaPipeEntity pipe = (BaseMetaPipeEntity) getBaseMetaTileEntity(); if (pipe.getNode() != null) { - for (byte i = 0; i < 6; i++) { - if (isConnectedAtSide(i)) { - final GT_CoverBehaviorBase<?> coverBehavior = pipe.getCoverBehaviorAtSideNew(i); - if (coverBehavior instanceof GT_Cover_None) continue; - final int coverId = pipe.getCoverIDAtSide(i); - ISerializableObject coverData = pipe.getComplexCoverDataAtSide(i); - if (!letsIn(coverBehavior, i, coverId, coverData, pipe) - || !letsOut(coverBehavior, i, coverId, coverData, pipe)) { - pipe.addToLock(pipe, i); + for (byte tSide : ALL_VALID_SIDES) { + if (isConnectedAtSide(tSide)) { + final CoverInfo coverInfo = pipe.getCoverInfoAtSide(tSide); + if (coverInfo.getCoverBehavior() instanceof GT_Cover_None) continue; + if (!letsIn(coverInfo) || !letsOut(coverInfo)) { + pipe.addToLock(pipe, tSide); } else { - pipe.removeFromLock(pipe, i); + pipe.removeFromLock(pipe, tSide); } } } } else { boolean dontAllow = false; - for (byte i = 0; i < 6; i++) { - if (isConnectedAtSide(i)) { - final GT_CoverBehaviorBase<?> coverBehavior = pipe.getCoverBehaviorAtSideNew(i); - if (coverBehavior instanceof GT_Cover_None) continue; - final int coverId = pipe.getCoverIDAtSide(i); - ISerializableObject coverData = pipe.getComplexCoverDataAtSide(i); - if (!letsIn(coverBehavior, i, coverId, coverData, pipe) - || !letsOut(coverBehavior, i, coverId, coverData, pipe)) { + for (byte tSide : ALL_VALID_SIDES) { + if (isConnectedAtSide(tSide)) { + final CoverInfo coverInfo = pipe.getCoverInfoAtSide(tSide); + if (coverInfo.getCoverBehavior() instanceof GT_Cover_None) continue; + + if (!letsIn(coverInfo) || !letsOut(coverInfo)) { dontAllow = true; } } diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java index d25f92b58b..61d55bfd9b 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java @@ -18,6 +18,7 @@ import gregtech.api.render.TextureFactory; import gregtech.api.util.*; import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder; import gregtech.common.GT_Client; +import gregtech.common.covers.CoverInfo; import gregtech.common.covers.GT_Cover_Drain; import gregtech.common.covers.GT_Cover_FluidRegulator; import java.util.ArrayList; @@ -130,7 +131,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { byte aColorIndex, boolean aConnected, boolean aRedstone) { - float tThickNess = getThickNess(); + final float tThickNess = getThickNess(); if (mDisableInput == 0) return new ITexture[] { aConnected @@ -140,7 +141,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) }; byte tMask = 0; - byte[][] sRestrictionArray = { + final byte[][] sRestrictionArray = { {2, 3, 5, 4}, {2, 3, 4, 5}, {1, 0, 4, 5}, @@ -303,7 +304,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { && aEntity instanceof EntityLivingBase) { for (FluidStack tFluid : mFluids) { if (tFluid != null) { - int tTemperature = tFluid.getFluid().getTemperature(tFluid); + final int tTemperature = tFluid.getFluid().getTemperature(tFluid); if (tTemperature > 320 && !isCoverOnSide( (BaseMetaPipeEntity) getBaseMetaTileEntity(), (EntityLivingBase) aEntity)) { @@ -331,9 +332,9 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { if (!GT_Mod.gregtechproxy.gt6Pipe || mCheckConnections) checkConnections(); - boolean shouldDistribute = (oLastReceivedFrom == mLastReceivedFrom); + final boolean shouldDistribute = (oLastReceivedFrom == mLastReceivedFrom); for (int i = 0, j = aBaseMetaTileEntity.getRandomNumber(mPipeAmount); i < mPipeAmount; i++) { - int index = (i + j) % mPipeAmount; + final int index = (i + j) % mPipeAmount; if (mFluids[index] != null && mFluids[index].amount <= 0) mFluids[index] = null; if (mFluids[index] == null) continue; @@ -354,7 +355,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { final FluidStack tFluid = mFluids[index]; if (tFluid != null && tFluid.amount > 0) { - int tTemperature = tFluid.getFluid().getTemperature(tFluid); + final int tTemperature = tFluid.getFluid().getTemperature(tFluid); if (tTemperature > mHeatResistance) { if (aBaseMetaTileEntity.getRandomNumber(100) == 0) { // Poof @@ -423,8 +424,8 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { if (tFluid == null) return; // Tank, From, Amount to receive - List<MutableTriple<IFluidHandler, ForgeDirection, Integer>> tTanks = new ArrayList<>(); - int amount = tFluid.amount; + final List<MutableTriple<IFluidHandler, ForgeDirection, Integer>> tTanks = new ArrayList<>(); + final int amount = tFluid.amount; for (byte aSide, i = 0, j = (byte) aBaseMetaTileEntity.getRandomNumber(6); i < 6; i++) { // Get a list of tanks accepting fluids, and what side they're on @@ -436,22 +437,8 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { if (isConnectedAtSide(aSide) && tTank != null && (mLastReceivedFrom & (1 << aSide)) == 0 - && getBaseMetaTileEntity() - .getCoverBehaviorAtSideNew(aSide) - .letsFluidOut( - aSide, - getBaseMetaTileEntity().getCoverIDAtSide(aSide), - getBaseMetaTileEntity().getComplexCoverDataAtSide(aSide), - tFluid.getFluid(), - getBaseMetaTileEntity()) - && (gTank == null - || gTank.getCoverBehaviorAtSideNew(tSide) - .letsFluidIn( - tSide, - gTank.getCoverIDAtSide(tSide), - gTank.getComplexCoverDataAtSide(tSide), - tFluid.getFluid(), - gTank))) { + && getBaseMetaTileEntity().getCoverInfoAtSide(aSide).letsFluidOut(tFluid.getFluid()) + && (gTank == null || gTank.getCoverInfoAtSide(tSide).letsFluidIn(tFluid.getFluid()))) { if (tTank.fill(ForgeDirection.getOrientation(tSide), tFluid, false) > 0) { tTanks.add(new MutableTriple<>(tTank, ForgeDirection.getOrientation(tSide), 0)); } @@ -460,8 +447,9 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { } // How much of this fluid is available for distribution? - double tAmount = Math.max(1, Math.min(mCapacity * 10, tFluid.amount)), tNumTanks = tTanks.size(); - FluidStack maxFluid = tFluid.copy(); + final double tAmount = Math.max(1, Math.min(mCapacity * 10, tFluid.amount)); + final double tNumTanks = tTanks.size(); + final FluidStack maxFluid = tFluid.copy(); maxFluid.amount = Integer.MAX_VALUE; double availableCapacity = 0; @@ -473,16 +461,17 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { // Now distribute for (MutableTriple<IFluidHandler, ForgeDirection, Integer> tEntry : tTanks) { + // Distribue fluids based on percentage available space at destination if (availableCapacity > tAmount) - tEntry.right = (int) Math.floor(tEntry.right - * tAmount - / availableCapacity); // Distribue fluids based on percentage available space at destination - if (tEntry.right == 0) - tEntry.right = - (int) Math.min(1, tAmount); // If the percent is not enough to give at least 1L, try to give 1L + tEntry.right = (int) Math.floor(tEntry.right * tAmount / availableCapacity); + + // If the percent is not enough to give at least 1L, try to give 1L + if (tEntry.right == 0) tEntry.right = (int) Math.min(1, tAmount); + if (tEntry.right <= 0) continue; - int tFilledAmount = tEntry.left.fill(tEntry.middle, drainFromIndex(tEntry.right, false, index), false); + final int tFilledAmount = + tEntry.left.fill(tEntry.middle, drainFromIndex(tEntry.right, false, index), false); if (tFilledAmount > 0) tEntry.left.fill(tEntry.middle, drainFromIndex(tFilledAmount, true, index), true); @@ -494,8 +483,8 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { public boolean onWrenchRightClick( byte aSide, byte aWrenchingSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { if (GT_Mod.gregtechproxy.gt6Pipe) { - byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); - byte tMask = (byte) (1 << tSide); + final byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); + final byte tMask = (byte) (1 << tSide); if (aPlayer.isSneaking()) { if (isInputDisabledAtSide(tSide)) { mDisableInput &= ~tMask; @@ -551,6 +540,16 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { } @Override + public boolean letsIn(CoverInfo coverInfo) { + return coverInfo.letsFluidIn(null); + } + + @Override + public boolean letsOut(CoverInfo coverInfo) { + return coverInfo.letsFluidOut(null); + } + + @Override public boolean canConnect(byte aSide, TileEntity tTileEntity) { if (tTileEntity == null) return false; @@ -706,7 +705,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { if (!mFluids[index].isFluidEqual(aFluid)) return 0; - int space = getCapacity() / mPipeAmount - mFluids[index].amount; + final int space = getCapacity() / mPipeAmount - mFluids[index].amount; if (aFluid.amount <= space) { if (doFill) { mFluids[index].amount += aFluid.amount; @@ -745,7 +744,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { mFluids[index].amount -= used; } - FluidStack drained = mFluids[index].copy(); + final FluidStack drained = mFluids[index].copy(); drained.amount = used; if (mFluids[index].amount <= 0) { @@ -808,7 +807,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { } private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - float tSpace = (1f - mThickNess) / 2; + final float tSpace = (1f - mThickNess) / 2; float tSide0 = tSpace; float tSide1 = 1f - tSpace; float tSide2 = tSpace; @@ -841,7 +840,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { tSide1 = tSide3 = tSide5 = 1; } - byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; + final byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; if ((tConn & (1 << ForgeDirection.DOWN.ordinal())) != 0) tSide0 = 0f; if ((tConn & (1 << ForgeDirection.UP.ordinal())) != 0) tSide1 = 1f; if ((tConn & (1 << ForgeDirection.NORTH.ordinal())) != 0) tSide2 = 0f; @@ -864,7 +863,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { Entity collider) { super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) { - AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb); } } diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java index c919187927..5ae9150a58 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java @@ -1,5 +1,6 @@ package gregtech.api.metatileentity.implementations; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; import static gregtech.api.enums.Textures.BlockIcons.PIPE_RESTRICTOR; import gregtech.GT_Mod; @@ -20,6 +21,7 @@ import gregtech.api.util.GT_CoverBehaviorBase; import gregtech.api.util.GT_Utility; import gregtech.api.util.ISerializableObject; import gregtech.common.GT_Client; +import gregtech.common.covers.CoverInfo; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -264,7 +266,7 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE if (oLastReceivedFrom == mLastReceivedFrom) { doTickProfilingInThisTick = false; - ArrayList<IMetaTileEntityItemPipe> tPipeList = new ArrayList<IMetaTileEntityItemPipe>(); + final ArrayList<IMetaTileEntityItemPipe> tPipeList = new ArrayList<>(); for (boolean temp = true; temp && !isInventoryEmpty() && pipeCapacityCheck(); ) { temp = false; @@ -290,7 +292,7 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE public boolean onWrenchRightClick( byte aSide, byte aWrenchingSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { if (GT_Mod.gregtechproxy.gt6Pipe) { - byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); + final byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); if (isConnectedAtSide(tSide)) { disconnect(tSide); GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("215", "Disconnected")); @@ -335,6 +337,16 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE } @Override + public boolean letsIn(CoverInfo coverInfo) { + return coverInfo.letsItemsOut(-1); + } + + @Override + public boolean letsOut(CoverInfo coverInfo) { + return coverInfo.letsItemsOut(-1); + } + + @Override public boolean canConnect(byte aSide, TileEntity tTileEntity) { if (tTileEntity == null) return false; @@ -354,7 +366,7 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE connectable = true; } if (tTileEntity instanceof ISidedInventory) { - int[] tSlots = ((ISidedInventory) tTileEntity).getAccessibleSlotsFromSide(tSide); + final int[] tSlots = ((ISidedInventory) tTileEntity).getAccessibleSlotsFromSide(tSide); if (tSlots == null || tSlots.length <= 0) return false; connectable = true; } @@ -377,8 +389,9 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE @Override public boolean sendItemStack(Object aSender) { if (pipeCapacityCheck()) { - byte tOffset = (byte) getBaseMetaTileEntity().getRandomNumber(6), tSide = 0; - for (byte i = 0; i < 6; i++) { + final byte tOffset = (byte) getBaseMetaTileEntity().getRandomNumber(6); + byte tSide = 0; + for (byte i : ALL_VALID_SIDES) { tSide = (byte) ((i + tOffset) % 6); if (isConnectedAtSide(tSide) && (isInventoryEmpty() || (tSide != mLastReceivedFrom || aSender != getBaseMetaTileEntity()))) { @@ -391,15 +404,8 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE @Override public boolean insertItemStackIntoTileEntity(Object aSender, byte aSide) { - if (getBaseMetaTileEntity() - .getCoverBehaviorAtSideNew(aSide) - .letsItemsOut( - aSide, - getBaseMetaTileEntity().getCoverIDAtSide(aSide), - getBaseMetaTileEntity().getComplexCoverDataAtSide(aSide), - -1, - getBaseMetaTileEntity())) { - TileEntity tInventory = getBaseMetaTileEntity().getTileEntityAtSide(aSide); + if (getBaseMetaTileEntity().getCoverInfoAtSide(aSide).letsItemsOut(-1)) { + final TileEntity tInventory = getBaseMetaTileEntity().getTileEntityAtSide(aSide); if (tInventory != null && !(tInventory instanceof BaseMetaPipeEntity)) { if ((!(tInventory instanceof TileEntityHopper) && !(tInventory instanceof TileEntityDispenser)) || getBaseMetaTileEntity().getMetaIDAtSide(aSide) != GT_Utility.getOppositeSide(aSide)) { @@ -459,23 +465,9 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE @Override public int[] getAccessibleSlotsFromSide(int aSide) { - IGregTechTileEntity tTileEntity = getBaseMetaTileEntity(); - boolean tAllow = tTileEntity - .getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - tTileEntity.getCoverIDAtSide((byte) aSide), - tTileEntity.getComplexCoverDataAtSide((byte) aSide), - -2, - tTileEntity) - || tTileEntity - .getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsOut( - (byte) aSide, - tTileEntity.getCoverIDAtSide((byte) aSide), - tTileEntity.getComplexCoverDataAtSide((byte) aSide), - -2, - tTileEntity); + final IGregTechTileEntity tTileEntity = getBaseMetaTileEntity(); + final CoverInfo coverInfo = tTileEntity.getCoverInfoAtSide((byte) aSide); + final boolean tAllow = coverInfo.letsItemsIn(-2) || coverInfo.letsItemsOut(-2); if (tAllow) { if (cacheSides == null) cacheSides = super.getAccessibleSlotsFromSide(aSide); return cacheSides; @@ -534,7 +526,7 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE } private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { - float tSpace = (1f - mThickNess) / 2; + final float tSpace = (1f - mThickNess) / 2; float tSide0 = tSpace; float tSide1 = 1f - tSpace; float tSide2 = tSpace; @@ -567,7 +559,7 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE tSide1 = tSide3 = tSide5 = 1; } - byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; + final byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; if ((tConn & (1 << ForgeDirection.DOWN.ordinal())) != 0) tSide0 = 0f; if ((tConn & (1 << ForgeDirection.UP.ordinal())) != 0) tSide1 = 1f; if ((tConn & (1 << ForgeDirection.NORTH.ordinal())) != 0) tSide2 = 0f; @@ -590,7 +582,7 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE Entity collider) { super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider); if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) { - AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); + final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb); } } diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java index 5de80c5cb6..632b8cca8b 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java @@ -1,5 +1,6 @@ package gregtech.api.metatileentity.implementations; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; import static gregtech.api.enums.GT_Values.V; import static gregtech.api.enums.GT_Values.debugCleanroom; import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; @@ -527,8 +528,8 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B } return true; } - for (byte i = 0; i < 6; i++) { - if (aBaseMetaTileEntity.getAirAtSide(i)) { + for (byte tSide : ALL_VALID_SIDES) { + if (aBaseMetaTileEntity.getAirAtSide(tSide)) { if (useModularUI()) { GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); } else { diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java index b6ace5a630..fdedbad86a 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java @@ -197,13 +197,7 @@ public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch @Override public void onScrewdriverRightClick(byte aSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (!getBaseMetaTileEntity() - .getCoverBehaviorAtSideNew(aSide) - .isGUIClickable( - aSide, - getBaseMetaTileEntity().getCoverIDAtSide(aSide), - getBaseMetaTileEntity().getComplexCoverDataAtSide(aSide), - getBaseMetaTileEntity())) return; + if (!getBaseMetaTileEntity().getCoverInfoAtSide(aSide).isGUIClickable()) return; if (aPlayer.isSneaking()) { if (disableSort) { disableSort = false; diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java index 11ffa6e802..2809ab3815 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java @@ -230,19 +230,13 @@ public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch impl @Override public void onScrewdriverRightClick(byte aSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (!getBaseMetaTileEntity() - .getCoverBehaviorAtSideNew(aSide) - .isGUIClickable( - aSide, - getBaseMetaTileEntity().getCoverIDAtSide(aSide), - getBaseMetaTileEntity().getComplexCoverDataAtSide(aSide), - getBaseMetaTileEntity())) return; + if (!getBaseMetaTileEntity().getCoverInfoAtSide(aSide).isGUIClickable()) return; if (aPlayer.isSneaking()) { mMode = (byte) ((mMode + 9) % 10); } else { mMode = (byte) ((mMode + 1) % 10); } - String inBrackets; + final String inBrackets; switch (mMode) { case 0: GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("108", "Outputs misc. Fluids, Steam and Items")); @@ -312,15 +306,9 @@ public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch impl } private boolean tryToLockHatch(EntityPlayer aPlayer, byte aSide) { - if (!getBaseMetaTileEntity() - .getCoverBehaviorAtSideNew(aSide) - .isGUIClickable( - aSide, - getBaseMetaTileEntity().getCoverIDAtSide(aSide), - getBaseMetaTileEntity().getComplexCoverDataAtSide(aSide), - getBaseMetaTileEntity())) return false; + if (!getBaseMetaTileEntity().getCoverInfoAtSide(aSide).isGUIClickable()) return false; if (!isFluidLocked()) return false; - ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); + final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); if (tCurrentItem == null) return false; FluidStack tFluid = FluidContainerRegistry.getFluidForFilledItem(tCurrentItem); if (tFluid == null && tCurrentItem.getItem() instanceof IFluidContainerItem) @@ -432,7 +420,7 @@ public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch impl protected void onEmptyingContainerWhenEmpty() { if (this.lockedFluidName == null && this.mFluid != null && isFluidLocked()) { this.setLockedFluidName(this.mFluid.getFluid().getName()); - EntityPlayer player; + final EntityPlayer player; if (playerThatLockedfluid == null || (player = playerThatLockedfluid.get()) == null) return; GT_Utility.sendChatToPlayer( player, @@ -496,7 +484,7 @@ public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch impl .setDefaultColor(COLOR_TEXT_WHITE.get()) .setPos(101, 20)) .widget(TextWidget.dynamicString(() -> { - ItemStack lockedDisplayStack = mInventory[getLockedDisplaySlot()]; + final ItemStack lockedDisplayStack = mInventory[getLockedDisplaySlot()]; return lockedDisplayStack == null ? "None" : lockedDisplayStack.getDisplayName(); }) .setSynced(false) 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 BaseTickableMultiTileEntity { if (aSide == GT_Values.SIDE_UNKNOWN) return true; if (aSide >= 0 && aSide < 6) { if (isInvalid()) return false; - if (!getCoverBehaviorAtSideNew(aSide) - .letsEnergyIn(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) return false; + if (!getCoverInfoAtSide(aSide).letsEnergyIn()) return false; if (isEnetInput()) return isEnergyInputSide(aSide); } return false; @@ -304,9 +342,7 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity { if (aSide == GT_Values.SIDE_UNKNOWN) return true; if (aSide >= 0 && aSide < 6) { if (isInvalid()) return false; - if (!getCoverBehaviorAtSideNew(aSide) - .letsEnergyOut(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) - return false; + if (!getCoverInfoAtSide(aSide).letsEnergyOut()) return false; if (isEnetOutput()) return isEnergyOutputSide(aSide); } return false; @@ -318,9 +354,19 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity { @Override public boolean hasInventoryBeenModified() { + // True if the input inventory has changed return mInventoryChanged; } + public void markOutputInventoryBeenModified() { + mOutputInventoryChanged = true; + } + + public boolean hasOutputInventoryBeenModified() { + // True if the output inventory has changed + return mOutputInventoryChanged; + } + @Override public boolean isItemValidForSlot(int aSlot, ItemStack aStack) { return false; @@ -330,18 +376,4 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity { public int getInventoryStackLimit() { return 64; } - - /** - * The number of item (input) slots available for this machine - */ - public int getItemInputCount() { - return 2; - } - - /** - * The number of item (output) slots available for this machine - */ - public int getItemOutputCount() { - return 2; - } } diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java index bb01f0b4fa..49f2adcd40 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java @@ -1,6 +1,7 @@ package gregtech.api.multitileentity.multiblock.base; import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; import static gregtech.api.enums.GT_Values.NBT; import com.gtnewhorizon.structurelib.StructureLibAPI; @@ -13,12 +14,26 @@ import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.IStructureElement; import com.gtnewhorizon.structurelib.util.Vec3Impl; +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; +import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; +import com.gtnewhorizons.modularui.api.forge.ListItemHandler; +import com.gtnewhorizons.modularui.api.screen.*; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; +import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; +import com.gtnewhorizons.modularui.common.widget.Scrollable; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TabButton; +import com.gtnewhorizons.modularui.common.widget.TabContainer; import cpw.mods.fml.common.network.NetworkRegistry; import gnu.trove.list.TIntList; import gnu.trove.list.array.TIntArrayList; import gregtech.api.enums.GT_Values; import gregtech.api.enums.OrePrefixes; import gregtech.api.enums.TextureSet; +import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.IDescribable; import gregtech.api.interfaces.tileentity.IMachineProgress; import gregtech.api.multitileentity.MultiTileEntityContainer; @@ -26,14 +41,19 @@ import gregtech.api.multitileentity.MultiTileEntityRegistry; import gregtech.api.multitileentity.interfaces.IMultiBlockController; import gregtech.api.multitileentity.interfaces.IMultiBlockFluidHandler; import gregtech.api.multitileentity.interfaces.IMultiBlockInventory; +import gregtech.api.multitileentity.interfaces.IMultiBlockPart; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_AddToolTips; import gregtech.api.multitileentity.machine.MultiTileBasicMachine; import gregtech.api.objects.GT_ItemStack; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; import gregtech.api.util.GT_Utility; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -65,9 +85,8 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex protected BuildState buildState = new BuildState(); - // The 0th slot is the default inventory of the MultiBlock; any other has been added by an Inventory Extender of - // sorts - protected List<ItemStack[]> multiBlockInventory = new ArrayList<>(); + protected Map<String, IItemHandlerModifiable> multiBlockInputInventory = new LinkedHashMap<>(); + protected Map<String, IItemHandlerModifiable> multiBlockOutputInventory = new LinkedHashMap<>(); private int mMaxProgresstime = 0, mProgresstime = 0; private boolean mStructureOkay = false, mStructureChanged = false; @@ -75,6 +94,16 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex private ExtendedFacing mExtendedFacing = ExtendedFacing.DEFAULT; private IAlignmentLimits mLimits = getInitialAlignmentLimits(); + // A list of sides + // Each side has a list of parts that have a cover that need to be ticked + protected List<LinkedList<WeakReference<IMultiBlockPart>>> registeredCoveredParts = Arrays.asList( + new LinkedList<>(), + new LinkedList<>(), + new LinkedList<>(), + new LinkedList<>(), + new LinkedList<>(), + new LinkedList<>()); + /** Registry ID of the required casing */ public abstract short getCasingRegistryID(); /** Meta ID of the required casing */ @@ -125,7 +154,8 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex // Multiblock inventories are a collection of inventories. The first inventory is the default internal // inventory, // and the others are added by inventory extending blocks. - if (mInventory != null) multiBlockInventory.add(mInventory); + if (mInputInventory != null) multiBlockInputInventory.put("controller", mInputInventory); + if (mOutputInventory != null) multiBlockOutputInventory.put("controller", mOutputInventory); mStructureOkay = aNBT.getBoolean(NBT.STRUCTURE_OK); mExtendedFacing = ExtendedFacing.of( @@ -159,12 +189,6 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex protected GT_Multiblock_Tooltip_Builder getTooltip() { return createTooltip(); - // final int tooltipId = getToolTipID(); - // final GT_Multiblock_Tooltip_Builder tt = tooltip.get(tooltipId); - // if (tt == null) { - // return tooltip.computeIfAbsent(tooltipId, k -> createTooltip()); - // } - // return tt; } @Override @@ -277,8 +301,8 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex return super.onWrenchRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ); if (aPlayer.isSneaking()) { // we won't be allowing horizontal flips, as it can be perfectly emulated by rotating twice and flipping - // horizontally - // allowing an extra round of flip make it hard to draw meaningful flip markers in GT_Proxy#drawGrid + // horizontally allowing an extra round of flip make it hard to draw meaningful flip markers in + // GT_Proxy#drawGrid toolSetFlip(getFlip().isHorizontallyFlipped() ? Flip.NONE : Flip.HORIZONTAL); } else { toolSetRotation(null); @@ -287,12 +311,59 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex } @Override + public void registerCoveredPartOnSide(final int aSide, IMultiBlockPart part) { + if (aSide < 0 || aSide >= 6) return; + + final LinkedList<WeakReference<IMultiBlockPart>> registeredCovers = registeredCoveredParts.get(aSide); + // TODO: Make sure that we're not already registered on this side + registeredCovers.add(new WeakReference<>(part)); + } + + @Override + public void unregisterCoveredPartOnSide(final int aSide, IMultiBlockPart aPart) { + if (aSide < 0 || aSide >= 6) return; + + final LinkedList<WeakReference<IMultiBlockPart>> coveredParts = registeredCoveredParts.get(aSide); + final Iterator<WeakReference<IMultiBlockPart>> it = coveredParts.iterator(); + while (it.hasNext()) { + final IMultiBlockPart part = (it.next()).get(); + if (part == null || part == aPart) it.remove(); + } + } + + @Override public void onFirstTick(boolean aIsServerSide) { super.onFirstTick(aIsServerSide); if (aIsServerSide) checkStructure(true); else StructureLibAPI.queryAlignment(this); } + private boolean tickCovers() { + for (byte side : ALL_VALID_SIDES) { + // TODO: Tick controller covers, if any + final LinkedList<WeakReference<IMultiBlockPart>> coveredParts = this.registeredCoveredParts.get(side); + final Iterator<WeakReference<IMultiBlockPart>> it = coveredParts.iterator(); + while (it.hasNext()) { + final IMultiBlockPart part = (it.next()).get(); + if (part == null) { + it.remove(); + continue; + } + if (!part.tickCoverAtSide(side, mTickTimer)) it.remove(); + } + } + + return true; + } + + @Override + public void onTick(long aTimer, boolean isServerSide) { + // Tick all covers! + if (!tickCovers()) { + return; + } + } + @Override public void onPostTick(long aTick, boolean aIsServerSide) { if (aIsServerSide) { @@ -489,7 +560,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex mIcons = new IIcon[6]; Arrays.fill(mIcons, TextureSet.SET_NONE.mTextures[OrePrefixes.block.mTextureIndex].getIcon()); // Arrays.fill(mIcons, getTexture(aCasing); - // for (int i = 0; i < 6; i++) { + // for (byte i : ALL_VALID_SIDES) { // mIcons[i] = aCasing.getIcon(i, aMeta); // } } @@ -598,6 +669,13 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex return rInfo; } + @Override + public IFluidTank[] getFluidTanksForGUI(MultiBlockPart aPart) { + if (aPart.modeSelected(MultiBlockPart.FLUID_IN)) return mTanksInput; + if (aPart.modeSelected(MultiBlockPart.FLUID_OUT)) return mTanksOutput; + return GT_Values.emptyFluidTank; + } + /** * Energy - MultiBlock related Energy behavior */ @@ -699,10 +777,18 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex /** * Item - MultiBlock related Item behaviour. */ + protected boolean registerInventory(String invName, IItemHandlerModifiable inventory) { + if (multiBlockInputInventory.containsKey(invName)) return false; + multiBlockInputInventory.put(invName, inventory); + return true; + } + @Override public boolean hasInventoryBeenModified(MultiBlockPart aPart) { - // TODO: MultiInventory - Figure this out based on locked & the part - return hasInventoryBeenModified(); + if (aPart.modeSelected(MultiBlockPart.ITEM_IN)) return hasInventoryBeenModified(); + else if (aPart.modeSelected(MultiBlockPart.ITEM_OUT)) return hasOutputInventoryBeenModified(); + + return false; } @Override @@ -711,6 +797,20 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex } @Override + public IItemHandlerModifiable getInventoryForGUI(MultiBlockPart aPart) { + final Map<String, IItemHandlerModifiable> multiBlockInventory = getMultiBlockInventory(aPart); + if (multiBlockInventory == null) return null; + + final String lockedInventory = aPart.getLockedInventory(); + if (lockedInventory == null) { + return new ListItemHandler(multiBlockInventory.values()); + } else { + final IItemHandlerModifiable inv = multiBlockInventory.get(lockedInventory); + return inv != null ? inv : null; + } + } + + @Override public boolean addStackToSlot(MultiBlockPart aPart, int aIndex, ItemStack aStack) { return false; } @@ -720,15 +820,25 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex return false; } - protected Pair<ItemStack[], Integer> getInventory(int lockedInventory, int aSlot) { - if (lockedInventory != -1) return new ImmutablePair<>(multiBlockInventory.get(lockedInventory), aSlot); + protected Map<String, IItemHandlerModifiable> getMultiBlockInventory(MultiBlockPart aPart) { + if (aPart.modeSelected(MultiBlockPart.ITEM_IN)) return multiBlockInputInventory; + else if (aPart.modeSelected(MultiBlockPart.ITEM_OUT)) return multiBlockOutputInventory; + return null; + } + + protected Pair<IItemHandlerModifiable, Integer> getInventory(MultiBlockPart aPart, int aSlot) { + final Map<String, IItemHandlerModifiable> multiBlockInventory = getMultiBlockInventory(aPart); + if (multiBlockInventory == null) return null; + + final String invName = aPart.getLockedInventory(); + if (invName != null && !invName.isEmpty()) return new ImmutablePair<>(multiBlockInventory.get(invName), aSlot); int start = 0; - for (ItemStack[] inv : multiBlockInventory) { - if (aSlot > start && aSlot < start + inv.length) { + for (IItemHandlerModifiable inv : multiBlockInventory.values()) { + if (aSlot >= start && aSlot < start + inv.getSlots()) { return new ImmutablePair<>(inv, aSlot - start); } - start += inv.length; + start += inv.getSlots(); } return null; } @@ -736,16 +846,22 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex @Override public int[] getAccessibleSlotsFromSide(MultiBlockPart aPart, byte aSide) { final TIntList tList = new TIntArrayList(); - final int lockedInventory = aPart.getLockedInventory(); + final Map<String, IItemHandlerModifiable> multiBlockInventory = getMultiBlockInventory(aPart); + if (multiBlockInventory == null) return tList.toArray(); + + final String lockedInventory = aPart.getLockedInventory(); + // Item in --> input inv + // Item out --> output inv int start = 0; - if (lockedInventory == -1) { - for (ItemStack[] inv : multiBlockInventory) { - for (int i = start; i < inv.length + start; i++) tList.add(i); - start += inv.length; + if (lockedInventory == null) { + for (IItemHandlerModifiable inv : multiBlockInventory.values()) { + for (int i = start; i < inv.getSlots() + start; i++) tList.add(i); + start += inv.getSlots(); } } else { - final int len = multiBlockInventory.get(lockedInventory).length; + final IItemHandlerModifiable inv = multiBlockInventory.get(lockedInventory); + final int len = inv != null ? inv.getSlots() : 0; for (int i = 0; i < len; i++) tList.add(i); } return tList.toArray(); @@ -753,64 +869,59 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex @Override public boolean canInsertItem(MultiBlockPart aPart, int aSlot, ItemStack aStack, byte aSide) { - final int lockedInventory = aPart.getLockedInventory(), tSlot; - final ItemStack[] inv; - if (lockedInventory == -1) { - final Pair<ItemStack[], Integer> tInv = getInventory(lockedInventory, aSlot); - if (tInv == null) return false; - inv = tInv.getLeft(); - tSlot = tInv.getRight(); - } else { - inv = multiBlockInventory.get(lockedInventory); - tSlot = aSlot; - } - return inv[tSlot] == null + final Pair<IItemHandlerModifiable, Integer> tInv = getInventory(aPart, aSlot); + if (tInv == null) return false; + + final int tSlot = tInv.getRight(); + final IItemHandlerModifiable inv = tInv.getLeft(); + ; + + return inv.getStackInSlot(tSlot) == null || GT_Utility.areStacksEqual( - aStack, inv[tSlot]); // && allowPutStack(getBaseMetaTileEntity(), aIndex, (byte) aSide, aStack) + aStack, + inv.getStackInSlot( + tSlot)); // && allowPutStack(getBaseMetaTileEntity(), aIndex, (byte) aSide, aStack) } @Override public boolean canExtractItem(MultiBlockPart aPart, int aSlot, ItemStack aStack, byte aSide) { - final int lockedInventory = aPart.getLockedInventory(), tSlot; - final ItemStack[] inv; - if (lockedInventory == -1) { - final Pair<ItemStack[], Integer> tInv = getInventory(lockedInventory, aSlot); - if (tInv == null) return false; - inv = tInv.getLeft(); - tSlot = tInv.getRight(); - } else { - inv = multiBlockInventory.get(lockedInventory); - tSlot = aSlot; - } - return inv[tSlot] != null; // && allowPullStack(getBaseMetaTileEntity(), aIndex, (byte) aSide, aStack); + final Pair<IItemHandlerModifiable, Integer> tInv = getInventory(aPart, aSlot); + if (tInv == null) return false; + + final int tSlot = tInv.getRight(); + final IItemHandlerModifiable inv = tInv.getLeft(); + ; + + return inv.getStackInSlot(tSlot) + != null; // && allowPullStack(getBaseMetaTileEntity(), aIndex, (byte) aSide, aStack); } @Override public int getSizeInventory(MultiBlockPart aPart) { - final int lockedInventory = aPart.getLockedInventory(); - if (lockedInventory == -1) { + final Map<String, IItemHandlerModifiable> multiBlockInventory = getMultiBlockInventory(aPart); + if (multiBlockInventory == null) return 0; + + final String lockedInventory = aPart.getLockedInventory(); + if (lockedInventory == null) { int len = 0; - for (ItemStack[] inv : multiBlockInventory) len += inv.length; + for (IItemHandlerModifiable inv : multiBlockInventory.values()) len += inv.getSlots(); return len; } else { - return multiBlockInventory.get(lockedInventory).length; + final IItemHandlerModifiable inv = multiBlockInventory.get(lockedInventory); + return inv != null ? inv.getSlots() : 0; } } @Override public ItemStack getStackInSlot(MultiBlockPart aPart, int aSlot) { - final int lockedInventory = aPart.getLockedInventory(), tSlot; - final ItemStack[] inv; - if (lockedInventory == -1) { - final Pair<ItemStack[], Integer> tInv = getInventory(lockedInventory, aSlot); - if (tInv == null) return null; - inv = tInv.getLeft(); - tSlot = tInv.getRight(); - } else { - inv = multiBlockInventory.get(lockedInventory); - tSlot = aSlot; - } - return inv[tSlot]; + final Pair<IItemHandlerModifiable, Integer> tInv = getInventory(aPart, aSlot); + if (tInv == null) return null; + + final int tSlot = tInv.getRight(); + final IItemHandlerModifiable inv = tInv.getLeft(); + if (inv == null) return null; + + return inv.getStackInSlot(tSlot); } @Override @@ -819,10 +930,10 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex ItemStack rStack = GT_Utility.copyOrNull(tStack); if (tStack != null) { if (tStack.stackSize <= aDecrement) { - setInventorySlotContents(aSlot, null); + setInventorySlotContents(aPart, aSlot, null); } else { rStack = tStack.splitStack(aDecrement); - if (tStack.stackSize == 0) setInventorySlotContents(aSlot, null); + if (tStack.stackSize == 0) setInventorySlotContents(aPart, aSlot, null); } } return rStack; @@ -830,30 +941,52 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex @Override public ItemStack getStackInSlotOnClosing(MultiBlockPart aPart, int aSlot) { - final Pair<ItemStack[], Integer> tInv = getInventory(aPart.getLockedInventory(), aSlot); + final Pair<IItemHandlerModifiable, Integer> tInv = getInventory(aPart, aSlot); if (tInv == null) return null; - final ItemStack[] inv = tInv.getLeft(); + final IItemHandlerModifiable inv = tInv.getLeft(); final int tSlot = tInv.getRight(); - final ItemStack rStack = inv[tSlot]; - inv[tSlot] = null; + final ItemStack rStack = inv.getStackInSlot(tSlot); + inv.setStackInSlot(tSlot, null); return rStack; } @Override public void setInventorySlotContents(MultiBlockPart aPart, int aSlot, ItemStack aStack) { - final Pair<ItemStack[], Integer> tInv = getInventory(aPart.getLockedInventory(), aSlot); + final Pair<IItemHandlerModifiable, Integer> tInv = getInventory(aPart, aSlot); if (tInv == null) return; - final ItemStack[] inv = tInv.getLeft(); + final IItemHandlerModifiable inv = tInv.getLeft(); final int tSlot = tInv.getRight(); - inv[tSlot] = aStack; + inv.setStackInSlot(tSlot, aStack); + } + + @Override + public List<String> getInventoryNames(MultiBlockPart aPart) { + final List<String> inventoryNames = new ArrayList<>(); + inventoryNames.add("all"); + inventoryNames.addAll(getMultiBlockInventory(aPart).keySet()); + return inventoryNames; } @Override public String getInventoryName(MultiBlockPart aPart) { - return getInventoryName(); // TODO: MultiInventory: Include part Name? + final StringBuilder str = new StringBuilder(); + str.append(getInventoryName()); + if (aPart.modeSelected(MultiBlockPart.ITEM_IN)) { + str.append(" Input"); + } else if (aPart.modeSelected(MultiBlockPart.ITEM_OUT)) { + str.append(" Output"); + } else { + str.append(" Unknown"); + } + final String lockedInventory = aPart.getLockedInventory(); + if (lockedInventory != null && !lockedInventory.equals("")) { + str.append(" [Locked: ").append(lockedInventory).append("]"); + } + + return str.toString(); } @Override @@ -868,9 +1001,9 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex @Override public void markDirty(MultiBlockPart aPart) { - // TODO: MultiInventory - Consider the part? markDirty(); - markInventoryBeenModified(); + if (aPart.modeSelected(MultiBlockPart.ITEM_OUT)) markOutputInventoryBeenModified(); + else markInventoryBeenModified(); } @Override @@ -894,4 +1027,165 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex public boolean isItemValidForSlot(MultiBlockPart aPart, int aSlot, ItemStack aStack) { return isItemValidForSlot(aSlot, aStack); } + + /** + * GUI Work - Multiblock GUI related methods + */ + @Override + public boolean useModularUI() { + return true; + } + + @Override + public ModularWindow createWindow(UIBuildContext buildContext) { + System.out.println("MultiBlockController::createWindow"); + return super.createWindow(buildContext); + } + + @Override + public boolean hasGui(byte aSide) { + return true; + } + + @Override + protected void addTitleTextStyle(ModularWindow.Builder builder, String title) { + // leave empty + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget(new DrawableWidget() + .setDrawable(getGUITextureSet().getGregTechLogo()) + .setSize(17, 17) + .setPos(148, 60)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget(new TabContainer() + .setButtonSize(20, 24) + .addTabButton(new TabButton(0) + .setBackground( + false, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f)) + .setBackground( + true, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f)) + .addTooltip(getLocalName()) + .setPos(0, -20)) + .addTabButton(new TabButton(1) + .setBackground( + false, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f)) + .setBackground( + true, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f)) + .setPos(20, -20)) + .addTabButton(new TabButton(2) + .setBackground( + false, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f)) + .setBackground( + true, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f)) + .setPos(40, -20)) + .addTabButton(new TabButton(3) + .setBackground( + false, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f)) + .setBackground( + true, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f)) + .setPos(60, -20)) + .addTabButton(new TabButton(4) + .setBackground( + false, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f)) + .setBackground( + true, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f)) + .setPos(80, -20)) + .addPage(new MultiChildWidget() + .addChild(new DrawableWidget() + .setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) + .setPos(7, 4) + .setSize(160, 75))) + .addPage(new MultiChildWidget().addChild(getItemInventoryInputGUI())) + .addPage(new MultiChildWidget().addChild(getItemInventoryOutputGUI())) + .addPage(new MultiChildWidget().addChild(getFluidInventoryInputGUI())) + .addPage(new MultiChildWidget().addChild(getFluidInventoryOutputGUI()))) + .widget(new ItemDrawable(getStackForm(1)) + .asWidget() + .setSize(16, 16) + .setPos(2, -16)) + .widget(new DrawableWidget() + .setDrawable(GT_UITextures.PICTURE_ITEM_IN) + .setSize(16, 16) + .setPos(22, -16)) + .widget(new DrawableWidget() + .setDrawable(GT_UITextures.PICTURE_ITEM_OUT) + .setSize(16, 16) + .setPos(42, -16)) + .widget(new DrawableWidget() + .setDrawable(GT_UITextures.PICTURE_FLUID_IN) + .setSize(16, 16) + .setPos(62, -16)) + .widget(new DrawableWidget() + .setDrawable(GT_UITextures.PICTURE_FLUID_OUT) + .setSize(16, 16) + .setPos(82, -16)); + } + + protected Widget getItemInventoryInputGUI() { + final IItemHandlerModifiable inv = getInventoriesForInput(); + final Scrollable scrollable = new Scrollable().setVerticalScroll(); + for (int rows = 0; rows * 4 < Math.min(inv.getSlots(), 128); rows++) { + final int columnsToMake = Math.min(Math.min(inv.getSlots(), 128) - rows * 4, 4); + for (int column = 0; column < columnsToMake; column++) { + scrollable.widget(new SlotWidget(inv, rows * 4 + column) + .setPos(column * 18, rows * 18) + .setSize(18, 18)); + } + } + return scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 7); + } + + protected Widget getItemInventoryOutputGUI() { + final IItemHandlerModifiable inv = getInventoriesForOutput(); + final Scrollable scrollable = new Scrollable().setVerticalScroll(); + for (int rows = 0; rows * 4 < Math.min(inv.getSlots(), 128); rows++) { + final int columnsToMake = Math.min(Math.min(inv.getSlots(), 128) - rows * 4, 4); + for (int column = 0; column < columnsToMake; column++) { + scrollable.widget(new SlotWidget(inv, rows * 4 + column) + .setPos(column * 18, rows * 18) + .setSize(18, 18)); + } + } + return scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 7); + } + + protected IItemHandlerModifiable getInventoriesForInput() { + return new ListItemHandler(multiBlockInputInventory.values()); + } + + protected IItemHandlerModifiable getInventoriesForOutput() { + return new ListItemHandler(multiBlockOutputInventory.values()); + } + + protected Widget getFluidInventoryInputGUI() { + final IFluidTank[] tanks = mTanksInput; + final Scrollable scrollable = new Scrollable().setVerticalScroll(); + for (int rows = 0; rows * 4 < tanks.length; rows++) { + final int columnsToMake = Math.min(tanks.length - rows * 4, 4); + for (int column = 0; column < columnsToMake; column++) { + final FluidSlotWidget fluidSlot = new FluidSlotWidget(tanks[rows * 4 + column]); + scrollable.widget(fluidSlot.setPos(column * 18, rows * 18).setSize(18, 18)); + } + } + return scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 7); + } + + protected Widget getFluidInventoryOutputGUI() { + final IFluidTank[] tanks = mTanksOutput; + final Scrollable scrollable = new Scrollable().setVerticalScroll(); + for (int rows = 0; rows * 4 < tanks.length; rows++) { + final int columnsToMake = Math.min(tanks.length - rows * 4, 4); + for (int column = 0; column < columnsToMake; column++) { + final FluidSlotWidget fluidSlot = new FluidSlotWidget(tanks[rows * 4 + column]); + fluidSlot.setInteraction(true, false); + scrollable.widget(fluidSlot.setPos(column * 18, rows * 18).setSize(18, 18)); + } + } + return scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 7); + } } diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java index 628992a931..36fbf35961 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java @@ -15,6 +15,15 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN; import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; import static org.apache.commons.lang3.ObjectUtils.firstNonNull; +import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.DropDownWidget; +import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; +import com.gtnewhorizons.modularui.common.widget.Scrollable; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; import gregtech.api.enums.GT_Values; import gregtech.api.enums.Textures; import gregtech.api.interfaces.IIconContainer; @@ -22,11 +31,12 @@ import gregtech.api.interfaces.ITexture; import gregtech.api.multitileentity.MultiTileEntityRegistry; import gregtech.api.multitileentity.base.BaseNontickableMultiTileEntity; import gregtech.api.multitileentity.interfaces.IMultiBlockController; +import gregtech.api.multitileentity.interfaces.IMultiBlockPart; import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_BreakBlock; +import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_HasModes; import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_CoverBehaviorBase; import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; +import gregtech.common.covers.CoverInfo; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; @@ -44,8 +54,10 @@ 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 class MultiBlockPart extends BaseNontickableMultiTileEntity implements IMTE_BreakBlock { +public class MultiBlockPart extends BaseNontickableMultiTileEntity + implements IMultiBlockPart, IMTE_BreakBlock, IMTE_HasModes { public static final int NOTHING = 0, ENERGY_IN = B[0], ENERGY_OUT = B[1], @@ -63,6 +75,9 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM protected int mAllowedModes = NOTHING; // BITMASK - Modes allowed for this part protected byte mMode = 0; // Mode selected for this part + protected String mLockedInventory = GT_Values.E; + protected int mLockedInventoryIndex = 0; + /** * What Part Tier is this part? All Basic Casings are Tier 1, and will allow: * Energy, Item, Fluid input/output. Some of the more advanced modes can be set to require a higher tier part. @@ -71,14 +86,15 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM return 1; } - public int getLockedInventory() { - return -1; + public String getLockedInventory() { + return mLockedInventory.equals("") ? null : mLockedInventory; } public void setTarget(IMultiBlockController aTarget, int aAllowedModes) { mTarget = aTarget; mTargetPos = (mTarget == null ? null : mTarget.getCoords()); mAllowedModes = aAllowedModes; + if (mTarget != null) registerCovers(mTarget); } @Override @@ -106,6 +122,8 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM final TileEntity te = worldObj.getTileEntity(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ); if (te instanceof IMultiBlockController) { mTarget = (IMultiBlockController) te; + // Register our covers with the controller + registerCovers(mTarget); } else { mTargetPos = null; } @@ -116,6 +134,46 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM } else return mTarget; } + public void registerCovers(IMultiBlockController controller) { + for (byte i : ALL_VALID_SIDES) { + final CoverInfo coverInfo = getCoverInfoAtSide(i); + if (coverInfo.isValid() && coverInfo.getTickRate() > 0) { + controller.registerCoveredPartOnSide(i, this); + } + } + } + + @Override + public void setCoverItemAtSide(byte aSide, ItemStack aCover) { + super.setCoverItemAtSide(aSide, aCover); + // TODO: Filter on tickable covers + final IMultiBlockController tTarget = getTarget(true); + if (tTarget != null) { + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (coverInfo.isValid() && coverInfo.getTickRate() > 0) { + tTarget.registerCoveredPartOnSide(aSide, this); + } + } + } + + public void unregisterCovers(IMultiBlockController controller) { + for (byte i : ALL_VALID_SIDES) { + if (getCoverInfoAtSide(i).isValid()) { + controller.unregisterCoveredPartOnSide(i, this); + } + } + } + + @Override + public boolean dropCover(byte aSide, byte aDroppedSide, boolean aForced) { + final boolean res = super.dropCover(aSide, aDroppedSide, aForced); + final IMultiBlockController tTarget = getTarget(true); + if (tTarget != null) { + tTarget.unregisterCoveredPartOnSide(aSide, this); + } + return res; + } + @Override public void readMultiTileNBT(NBTTagCompound aNBT) { if (aNBT.hasKey(NBT.ALLOWED_MODES)) mAllowedModes = aNBT.getInteger(NBT.ALLOWED_MODES); @@ -124,6 +182,12 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM mTargetPos = new ChunkCoordinates( aNBT.getInteger(NBT.TARGET_X), aNBT.getShort(NBT.TARGET_Y), aNBT.getInteger(NBT.TARGET_Z)); } + if (aNBT.hasKey(NBT.LOCKED_INVENTORY)) { + mLockedInventory = aNBT.getString(NBT.LOCKED_INVENTORY); + } + if (aNBT.hasKey(NBT.LOCKED_INVENTORY_INDEX)) { + mLockedInventoryIndex = aNBT.getInteger(NBT.LOCKED_INVENTORY_INDEX); + } } @Override @@ -136,12 +200,49 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM aNBT.setShort(NBT.TARGET_Y, (short) mTargetPos.posY); aNBT.setInteger(NBT.TARGET_Z, mTargetPos.posZ); } + if (mLockedInventory != null) { + aNBT.setString(NBT.LOCKED_INVENTORY, mLockedInventory); + } + if (mLockedInventoryIndex != 0) { + aNBT.setInteger(NBT.LOCKED_INVENTORY_INDEX, mLockedInventoryIndex); + } + } + + @Override + public void setTargetPos(ChunkCoordinates aTargetPos) { + mTargetPos = aTargetPos; + } + + @Override + public ChunkCoordinates getTargetPos() { + return mTargetPos; + } + + @Override + public void setMode(byte aMode) { + mMode = aMode; + } + + @Override + public byte getMode() { + return mMode; + } + + @Override + public int getAllowedModes() { + return mAllowedModes; + } + + @Override + public void setAllowedModes(int aAllowedModes) { + mAllowedModes = aAllowedModes; } /** * True if `aMode` is one of the allowed modes */ public boolean hasMode(int aMode) { + // This is not sent to the client return (mAllowedModes & aMode) != 0; } @@ -158,7 +259,10 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM @Override public boolean breakBlock() { final IMultiBlockController tTarget = getTarget(false); - if (tTarget != null) tTarget.onStructureChange(); + if (tTarget != null) { + unregisterCovers(tTarget); + tTarget.onStructureChange(); + } return false; } @@ -176,16 +280,6 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM } @Override - public byte getTextureData() { - return mMode; - } - - @Override - public void setTextureData(byte aData) { - mMode = aData; - } - - @Override public void loadTextureNBT(NBTTagCompound aNBT) { // Loading the registry final String textureName = aNBT.getString(NBT.TEXTURE); @@ -365,13 +459,10 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM final IMultiBlockController controller = getTarget(true); if (controller == null) return GT_Values.emptyFluidTankInfo; - final GT_CoverBehaviorBase<?> tCover = getCoverBehaviorAtSideNew(aSide); - final int coverId = getCoverIDAtSide(aSide); - final ISerializableObject complexCoverData = getComplexCoverDataAtSide(aSide); + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); - if ((controller.isLiquidInput(aSide) && tCover.letsFluidIn(aSide, coverId, complexCoverData, null, controller)) - || (controller.isLiquidOutput(aSide) - && tCover.letsFluidOut(aSide, coverId, complexCoverData, null, controller))) + if ((controller.isLiquidInput(aSide) && coverInfo.letsFluidIn(null, controller)) + || (controller.isLiquidOutput(aSide) && coverInfo.letsFluidOut(null, controller))) return controller.getTankInfo(this, aDirection); return GT_Values.emptyFluidTankInfo; @@ -441,7 +532,7 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM @Override public boolean decreaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooLittleEnergy) { - if (!modeSelected(ENERGY_IN)) return false; + if (!modeSelected(ENERGY_OUT)) return false; final IMultiBlockController controller = getTarget(true); return controller != null && hasMode(ENERGY_OUT) @@ -536,14 +627,14 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM @Override public boolean addStackToSlot(int aIndex, ItemStack aStack) { - if (!modeSelected(ITEM_IN)) return false; + if (!modeSelected(ITEM_IN, ITEM_OUT)) return false; final IMultiBlockController controller = getTarget(true); return (controller != null && controller.addStackToSlot(this, aIndex, aStack)); } @Override public boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount) { - if (!modeSelected(ITEM_IN)) return false; + if (!modeSelected(ITEM_IN, ITEM_OUT)) return false; final IMultiBlockController controller = getTarget(true); return (controller != null && controller.addStackToSlot(this, aIndex, aStack, aAmount)); } @@ -558,7 +649,7 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM @Override public boolean canInsertItem(int aSlot, ItemStack aStack, int aSide) { - if (!modeSelected(ITEM_IN) + if (!modeSelected(ITEM_IN, ITEM_OUT) || (mFacing != SIDE_UNKNOWN && (mFacing != aSide || !coverLetsItemsIn((byte) aSide, aSlot)))) return false; final IMultiBlockController controller = getTarget(true); @@ -567,7 +658,7 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM @Override public boolean canExtractItem(int aSlot, ItemStack aStack, int aSide) { - if (!modeSelected(ITEM_OUT) + if (!modeSelected(ITEM_IN, ITEM_OUT) || (mFacing != SIDE_UNKNOWN && (mFacing != aSide || !coverLetsItemsOut((byte) aSide, aSlot)))) return false; final IMultiBlockController controller = getTarget(true); @@ -590,7 +681,7 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM @Override public ItemStack decrStackSize(int aSlot, int aDecrement) { - if (!modeSelected(ITEM_OUT)) return null; + if (!modeSelected(ITEM_IN, ITEM_OUT)) return null; final IMultiBlockController controller = getTarget(true); return controller != null ? controller.decrStackSize(this, aSlot, aDecrement) : null; } @@ -628,4 +719,131 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM // End Inventory + // === Modular UI === + @Override + public boolean useModularUI() { + return true; + } + + @Override + public String getLocalName() { + if (modeSelected(ITEM_IN)) return "Input Inventory"; + if (modeSelected(ITEM_OUT)) return "Output Inventory"; + if (modeSelected(FLUID_IN)) return "Fluid Input Hatch"; + if (modeSelected(FLUID_OUT)) return "Fluid Output Hatch"; + + return "Unknown"; + } + + @Override + public boolean hasGui(byte aSide) { + // UIs only for specific mode(s) + if (modeSelected(ITEM_IN, ITEM_OUT, FLUID_IN, FLUID_OUT)) return true; + + return false; + } + + protected void addItemInventory(Builder builder, UIBuildContext buildContext) { + final IMultiBlockController controller = getTarget(false); + if (controller == null) { + return; + } + final IItemHandlerModifiable inv = controller.getInventoryForGUI(this); + final Scrollable scrollable = new Scrollable().setVerticalScroll(); + for (int rows = 0; rows * 4 < Math.min(inv.getSlots(), 128); rows++) { + int columnsToMake = Math.min(Math.min(inv.getSlots(), 128) - rows * 4, 4); + for (int column = 0; column < columnsToMake; column++) { + scrollable.widget(new SlotWidget(inv, rows * 4 + column) + .setPos(column * 18, rows * 18) + .setSize(18, 18)); + } + } + builder.widget(scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 18)); + DropDownWidget dropDown = new DropDownWidget(); + builder.widget(dropDown.addDropDownItemsSimple( + controller.getInventoryNames(this), + (buttonWidget, index, label, setSelected) -> buttonWidget.setOnClick((clickData, widget) -> { + if (getNameOfInventoryFromIndex(controller, index).equals("all")) { + mLockedInventory = GT_Values.E; + mLockedInventoryIndex = 0; + } else { + mLockedInventory = getNameOfInventoryFromIndex(controller, index); + mLockedInventoryIndex = index; + } + setSelected.run(); + }), + true) + .setSelected(mLockedInventoryIndex) + .setExpandedMaxHeight(60) + .setDirection(DropDownWidget.Direction.DOWN) + .setPos(53, 5) + .setSize(70, 11)); + } + + protected String getNameOfInventoryFromIndex(final IMultiBlockController controller, int index) { + final List<String> invNames = controller.getInventoryNames(this); + if (index > invNames.size()) { + return invNames.get(0); + } + return invNames.get(index); + } + + protected void addFluidInventory(Builder builder, UIBuildContext buildContext) { + final IMultiBlockController controller = getTarget(false); + if (controller == null) { + return; + } + final IFluidTank[] tanks = controller.getFluidTanksForGUI(this); + final Scrollable scrollable = new Scrollable().setVerticalScroll(); + for (int rows = 0; rows * 4 < tanks.length; rows++) { + int columnsToMake = Math.min(tanks.length - rows * 4, 4); + for (int column = 0; column < columnsToMake; column++) { + FluidSlotWidget fluidSlot = new FluidSlotWidget(tanks[rows * 4 + column]); + if (modeSelected(FLUID_OUT)) { + fluidSlot.setInteraction(true, false); + } + scrollable.widget(fluidSlot.setPos(column * 18, rows * 18).setSize(18, 18)); + } + } + builder.widget(scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 7)); + } + + @Override + public void addUIWidgets(Builder builder, UIBuildContext buildContext) { + if (modeSelected(ITEM_IN, ITEM_OUT)) { + addItemInventory(builder, buildContext); + } + if (modeSelected(FLUID_IN, FLUID_OUT)) { + addFluidInventory(builder, buildContext); + } + } + + @Override + public ModularWindow createWindow(UIBuildContext buildContext) { + if (isServerSide()) { + issueClientUpdate(); + } + System.out.println("MultiBlockPart::createWindow"); + return super.createWindow(buildContext); + } + + @Override + protected int getGUIHeight() { + if (modeSelected(ITEM_IN, ITEM_OUT)) { + return super.getGUIHeight() + 11; + } + return super.getGUIHeight(); + } + + @Override + public void addGregTechLogo(Builder builder) { + if (modeSelected(ITEM_IN, ITEM_OUT)) { + builder.widget(new DrawableWidget() + .setDrawable(getGUITextureSet().getGregTechLogo()) + .setSize(17, 17) + .setPos(152, 74)); + } else { + super.addGregTechLogo(builder); + } + } } diff --git a/src/main/java/gregtech/api/net/GT_Packet_Block_Event.java b/src/main/java/gregtech/api/net/GT_Packet_Block_Event.java index dd7657e95d..ebc69cd540 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_Block_Event.java +++ b/src/main/java/gregtech/api/net/GT_Packet_Block_Event.java @@ -44,7 +44,7 @@ public class GT_Packet_Block_Event extends GT_Packet_New { @Override public void process(IBlockAccess aWorld) { if (aWorld != null) { - TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); + final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); if (tTileEntity != null) tTileEntity.receiveClientEvent(mID, mValue); } } diff --git a/src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java b/src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java index 62ff6bd7e9..e2df15cb33 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java +++ b/src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java @@ -3,7 +3,8 @@ package gregtech.api.net; import com.google.common.io.ByteArrayDataInput; import gregtech.api.enums.GT_Values; import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseTileEntity; +import gregtech.api.metatileentity.CoverableTileEntity; import gregtech.common.GT_Proxy; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayerMP; @@ -82,32 +83,36 @@ public class GT_Packet_GtTileEntityGuiRequest extends GT_Packet_New { @Override public void process(IBlockAccess aWorld) { - World world = DimensionManager.getWorld(this.dimId); + final World world = DimensionManager.getWorld(this.dimId); if (world == null) return; - TileEntity tile = world.getTileEntity(this.mX, this.mY, this.mZ); - if (!(tile instanceof IGregTechTileEntity) || ((IGregTechTileEntity) tile).isDead()) return; + final TileEntity tile = world.getTileEntity(this.mX, this.mY, this.mZ); + if (!(tile instanceof BaseTileEntity) || ((BaseTileEntity) tile).isDead()) return; - IGregTechTileEntity gtTile = ((IGregTechTileEntity) tile); - EntityPlayerMP player = (EntityPlayerMP) world.getEntityByID(playerId); + final BaseTileEntity baseTile = ((BaseTileEntity) tile); + final EntityPlayerMP player = (EntityPlayerMP) world.getEntityByID(playerId); + final CoverableTileEntity coverableTile = + (baseTile instanceof CoverableTileEntity) ? (CoverableTileEntity) baseTile : null; // If the requested Gui ID corresponds to a cover, send the cover data to the client so they can open it. - if (GT_Proxy.GUI_ID_COVER_SIDE_BASE <= guiId && guiId < GT_Proxy.GUI_ID_COVER_SIDE_BASE + 6) { - byte coverSide = (byte) (guiId - GT_Proxy.GUI_ID_COVER_SIDE_BASE); - GT_Packet_TileEntityCoverGUI packet = new GT_Packet_TileEntityCoverGUI( + if (GT_Proxy.GUI_ID_COVER_SIDE_BASE <= guiId + && guiId < GT_Proxy.GUI_ID_COVER_SIDE_BASE + 6 + && coverableTile != null) { + final byte coverSide = (byte) (guiId - GT_Proxy.GUI_ID_COVER_SIDE_BASE); + final GT_Packet_TileEntityCoverGUI packet = new GT_Packet_TileEntityCoverGUI( this.mX, this.mY, this.mZ, coverSide, - gtTile.getCoverIDAtSide(coverSide), - gtTile.getComplexCoverDataAtSide(coverSide), + coverableTile.getCoverIDAtSide(coverSide), + coverableTile.getComplexCoverDataAtSide(coverSide), this.dimId, this.playerId, parentGuiId); GT_Values.NW.sendToPlayer(packet, player); } else if (guiId == 0) { - if (gtTile.getMetaTileEntity() != null && gtTile.getMetaTileEntity().useModularUI()) { - GT_UIInfos.openGTTileEntityUI(gtTile, player); + if (baseTile.useModularUI()) { + GT_UIInfos.openGTTileEntityUI(baseTile, player); } else { - gtTile.openGUI(player); + baseTile.openGUI(player); } } } diff --git a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java new file mode 100644 index 0000000000..5263549264 --- /dev/null +++ b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java @@ -0,0 +1,200 @@ +package gregtech.api.net; + +import static gregtech.api.enums.GT_Values.B; + +import com.google.common.io.ByteArrayDataInput; +import gregtech.GT_Mod; +import gregtech.api.metatileentity.GregTechTileClientEvents; +import gregtech.api.multitileentity.MultiTileEntityBlock; +import gregtech.api.multitileentity.interfaces.IMultiBlockPart; +import gregtech.api.multitileentity.interfaces.IMultiTileEntity; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.IBlockAccess; + +public class GT_Packet_MultiTileEntity extends GT_Packet_New { + public static final int COVERS = B[0], REDSTONE = B[1], MODES = B[2], CONTROLLER = B[3]; + + private int features = 0; + + private int mX, mZ; + private int mC0 = 0, mC1 = 0, mC2 = 0, mC3 = 0, mC4 = 0, mC5 = 0; + private short mY, mID, mRID; + private byte mCommonData, mTexturePage, mUpdate, mRedstone, mColor; + private ChunkCoordinates mTargetPos = null; + + // MultiBlockPart + private byte mMode; + private int mAllowedModes; + + public GT_Packet_MultiTileEntity() { + super(true); + } + + // For multi tiles + public GT_Packet_MultiTileEntity( + int aFeatures, int aX, short aY, int aZ, short aRID, short aID, byte aCommonData, byte aColor) { + super(false); + features = aFeatures; + + mX = aX; + mY = aY; + mZ = aZ; + mRID = aRID; + mID = aID; + mCommonData = aCommonData; + mColor = aColor; + } + + public void setCoverData(int aC0, int aC1, int aC2, int aC3, int aC4, int aC5) { + features |= COVERS; + + mC0 = aC0; + mC1 = aC1; + mC2 = aC2; + mC3 = aC3; + mC4 = aC4; + mC5 = aC5; + } + + public void setRedstoneData(byte aRedstoneData) { + features |= REDSTONE; + + mRedstone = aRedstoneData; + } + + public void setModes(byte aMode, int aAllowedModes) { + features |= MODES; + mMode = aMode; + mAllowedModes = aAllowedModes; + } + + public void setTargetPos(int aX, short aY, int aZ) { + features |= CONTROLLER; + mTargetPos = new ChunkCoordinates(aX, aY, aZ); + } + + @Override + public void encode(ByteBuf aOut) { + // Features + aOut.writeInt(features); + + aOut.writeInt(mX); + aOut.writeShort(mY); + aOut.writeInt(mZ); + + aOut.writeShort(mRID); + aOut.writeShort(mID); + aOut.writeByte(mCommonData); + aOut.writeByte(mColor); + + if ((features & COVERS) == COVERS) { + aOut.writeInt(mC0); + aOut.writeInt(mC1); + aOut.writeInt(mC2); + aOut.writeInt(mC3); + aOut.writeInt(mC4); + aOut.writeInt(mC5); + } + if ((features & REDSTONE) == REDSTONE) { + aOut.writeByte(mRedstone); + } + if ((features & MODES) == MODES) { + aOut.writeByte(mMode); + aOut.writeInt(mAllowedModes); + } + if ((features & CONTROLLER) == CONTROLLER) { + aOut.writeInt(mTargetPos.posX); + aOut.writeShort(mTargetPos.posY); + aOut.writeInt(mTargetPos.posZ); + } + + if (false) { + aOut.writeByte(mTexturePage); + aOut.writeByte(mUpdate); + aOut.writeByte(mColor); + } + } + + @Override + public GT_Packet_New decode(ByteArrayDataInput aData) { + final int packetFeatures = aData.readInt(); + + final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity( + packetFeatures, + // Coords + aData.readInt(), + aData.readShort(), + aData.readInt(), + // Registry & ID + aData.readShort(), + aData.readShort(), + // Common Data + aData.readByte(), + aData.readByte()); + if ((packetFeatures & COVERS) == COVERS) { + packet.setCoverData( + aData.readInt(), + aData.readInt(), + aData.readInt(), + aData.readInt(), + aData.readInt(), + aData.readInt()); + } + if ((packetFeatures & REDSTONE) == REDSTONE) { + packet.setRedstoneData(aData.readByte()); + } + if ((packetFeatures & MODES) == MODES) { + packet.setModes(aData.readByte(), aData.readInt()); + } + if ((packetFeatures & CONTROLLER) == CONTROLLER) { + packet.setTargetPos(aData.readInt(), aData.readShort(), aData.readInt()); + } + + return packet; + } + + @Override + public void process(IBlockAccess aWorld) { + if (aWorld == null) return; + final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); + try { + final Block tBlock = aWorld.getBlock(mX, mY, mZ); + if (tBlock instanceof MultiTileEntityBlock) { + final MultiTileEntityBlock mteBlock = (MultiTileEntityBlock) tBlock; + final IMultiTileEntity mte = mteBlock.receiveMultiTileEntityData(aWorld, mX, mY, mZ, mRID, mID); + if (mte == null) return; + mte.receiveClientEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, mCommonData); + mte.receiveClientEvent(GregTechTileClientEvents.CHANGE_COLOR, mColor); + + if ((features & COVERS) == COVERS) { + mteBlock.receiveCoverData(mte, mC0, mC1, mC2, mC3, mC4, mC5); + } + if ((features & REDSTONE) == REDSTONE) { + mte.receiveClientEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, mRedstone); + } + + if ((features & MODES) == MODES && mte instanceof IMultiTileEntity.IMTE_HasModes) { + final IMultiTileEntity.IMTE_HasModes mteModes = (IMultiTileEntity.IMTE_HasModes) mte; + mteModes.setMode(mMode); + mteModes.setAllowedModes(mAllowedModes); + } + + if ((features & CONTROLLER) == CONTROLLER && mte instanceof IMultiBlockPart) { + final IMultiBlockPart mtePart = (IMultiBlockPart) mte; + mtePart.setTargetPos(mTargetPos); + } + } + } catch (Exception e) { + GT_Mod.GT_FML_LOGGER.error( + "Exception setting tile entity data for tile entity {} at ({}, {}, {})", tTileEntity, mX, mY, mZ); + } + } + + @Override + public byte getPacketID() { + return 18; + } +} diff --git a/src/main/java/gregtech/api/net/GT_Packet_New.java b/src/main/java/gregtech/api/net/GT_Packet_New.java index f4e6f2a0e2..f987ebe24b 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_New.java +++ b/src/main/java/gregtech/api/net/GT_Packet_New.java @@ -13,9 +13,9 @@ public abstract class GT_Packet_New extends GT_Packet { @Override @Deprecated public final byte[] encode() { - ByteBuf tOut = Unpooled.buffer(); + final ByteBuf tOut = Unpooled.buffer(); encode(tOut); - byte[] bytes = new byte[tOut.readableBytes()]; + final byte[] bytes = new byte[tOut.readableBytes()]; tOut.readBytes(bytes); return bytes; } diff --git a/src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java b/src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java index 8084a772bb..c330514144 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java +++ b/src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java @@ -3,6 +3,7 @@ package gregtech.api.net; import com.google.common.io.ByteArrayDataInput; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.metatileentity.CoverableTileEntity; +import gregtech.common.covers.CoverInfo; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.INetHandler; @@ -29,6 +30,16 @@ public class GT_Packet_RequestCoverData extends GT_Packet_New { super(true); } + public GT_Packet_RequestCoverData(CoverInfo info, ICoverable tile) { + super(false); + this.mX = tile.getXCoord(); + this.mY = tile.getYCoord(); + this.mZ = tile.getZCoord(); + + this.side = info.getSide(); + this.coverID = info.getCoverID(); + } + public GT_Packet_RequestCoverData(int mX, short mY, int mZ, byte coverSide, int coverID) { super(false); this.mX = mX; @@ -79,9 +90,9 @@ public class GT_Packet_RequestCoverData extends GT_Packet_New { @Override public void process(IBlockAccess aWorld) { - if (mPlayer == null) // impossible, but who knows - return; - World world = DimensionManager.getWorld(mPlayer.dimension); + // impossible, but who knows + if (mPlayer == null) return; + final World world = DimensionManager.getWorld(mPlayer.dimension); if (world != null) { final TileEntity tile = world.getTileEntity(mX, mY, mZ); if (tile instanceof CoverableTileEntity) { diff --git a/src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java b/src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java index ab8b230077..86ecb8b468 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java +++ b/src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java @@ -5,6 +5,7 @@ import gregtech.api.GregTech_API; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.metatileentity.CoverableTileEntity; import gregtech.api.util.ISerializableObject; +import gregtech.common.covers.CoverInfo; import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; @@ -37,6 +38,17 @@ public class GT_Packet_SendCoverData extends GT_Packet_New { this.coverData = coverData; } + public GT_Packet_SendCoverData(CoverInfo info, ICoverable tile) { + super(false); + this.mX = tile.getXCoord(); + this.mY = tile.getYCoord(); + this.mZ = tile.getZCoord(); + + this.side = info.getSide(); + this.coverID = info.getCoverID(); + this.coverData = info.getCoverData(); + } + public GT_Packet_SendCoverData(byte coverSide, int coverID, ISerializableObject coverData, ICoverable tile) { super(false); this.mX = tile.getXCoord(); @@ -66,7 +78,7 @@ public class GT_Packet_SendCoverData extends GT_Packet_New { @Override public GT_Packet_New decode(ByteArrayDataInput aData) { - int coverId; + final int coverId; return new GT_Packet_SendCoverData( aData.readInt(), aData.readShort(), @@ -79,7 +91,7 @@ public class GT_Packet_SendCoverData extends GT_Packet_New { @Override public void process(IBlockAccess aWorld) { if (aWorld != null) { - TileEntity tile = aWorld.getTileEntity(mX, mY, mZ); + final TileEntity tile = aWorld.getTileEntity(mX, mY, mZ); if (tile instanceof CoverableTileEntity && !((CoverableTileEntity) tile).isDead()) { ((CoverableTileEntity) tile).receiveCoverData(side, coverID, coverData, null); } diff --git a/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java index b7aa229530..3f1425272a 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java +++ b/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java @@ -4,7 +4,6 @@ import com.google.common.io.ByteArrayDataInput; import gregtech.GT_Mod; import gregtech.api.metatileentity.BaseMetaPipeEntity; import gregtech.api.metatileentity.BaseMetaTileEntity; -import gregtech.api.multitileentity.MultiTileEntityBlock; import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.tileentity.TileEntity; @@ -173,27 +172,6 @@ public class GT_Packet_TileEntity extends GT_Packet_New { ((BaseMetaPipeEntity) tTileEntity) .receiveMetaTileEntityData( mID, mC0, mC1, mC2, mC3, mC4, mC5, mTexture, mUpdate, mRedstone, mColor); - else if ((tBlock = aWorld.getBlock(mX, mY, mZ)) instanceof MultiTileEntityBlock) { - ((MultiTileEntityBlock) tBlock) - .receiveMultiTileEntityData( - aWorld, - mX, - mY, - mZ, - mRID, - mID, - mC0, - mC1, - mC2, - mC3, - mC4, - mC5, - mTexture, - mTexturePage, - mUpdate, - mRedstone, - mColor); - } } catch (Exception e) { GT_Mod.GT_FML_LOGGER.error( "Exception setting tile entity data for tile entity {} at ({}, {}, {})", tTileEntity, mX, mY, mZ); diff --git a/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java b/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java index 65194a7390..6fbaf81b53 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java +++ b/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java @@ -7,6 +7,7 @@ import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.util.GT_CoverBehaviorBase; import gregtech.api.util.ISerializableObject; +import gregtech.common.covers.CoverInfo; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -72,6 +73,22 @@ public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New { this.parentGuiId = -1; } + public GT_Packet_TileEntityCoverGUI(CoverInfo coverInfo, int dimID, int playerID, int parentGuiId) { + super(false); + final ICoverable tile = coverInfo.getTile(); + this.mX = tile.getXCoord(); + this.mY = tile.getYCoord(); + this.mZ = tile.getZCoord(); + + this.side = coverInfo.getSide(); + this.coverID = coverInfo.getCoverID(); + this.coverData = coverInfo.getCoverData(); + + this.dimID = dimID; + this.playerID = playerID; + this.parentGuiId = parentGuiId; + } + public GT_Packet_TileEntityCoverGUI( int mX, short mY, @@ -182,15 +199,15 @@ public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New { public void process(IBlockAccess aWorld) { if (aWorld instanceof World) { // Using EntityPlayer instead of EntityClientPlayerMP so both client and server can load this - EntityPlayer thePlayer = ((EntityPlayer) ((World) aWorld).getEntityByID(playerID)); - TileEntity tile = aWorld.getTileEntity(mX, mY, mZ); + final EntityPlayer thePlayer = ((EntityPlayer) ((World) aWorld).getEntityByID(playerID)); + final TileEntity tile = aWorld.getTileEntity(mX, mY, mZ); if (tile instanceof IGregTechTileEntity && !((IGregTechTileEntity) tile).isDead()) { - IGregTechTileEntity gtTile = ((IGregTechTileEntity) tile); + final IGregTechTileEntity gtTile = ((IGregTechTileEntity) tile); gtTile.setCoverDataAtSide(side, coverData); // Set it client side to read later. GT_CoverBehaviorBase<?> cover = gtTile.getCoverBehaviorAtSideNew(side); if (cover.hasCoverGUI()) { - GuiScreen gui = (GuiScreen) cover.getClientGUI( + final GuiScreen gui = (GuiScreen) cover.getClientGUI( side, gtTile.getCoverIDAtSide(side), gtTile.getComplexCoverDataAtSide(side), diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java b/src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java index 9ae94d1c80..3a2406dfde 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java @@ -1,5 +1,7 @@ package gregtech.api.threads; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import gregtech.GT_Mod; import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; import gregtech.api.metatileentity.BaseMetaPipeEntity; @@ -50,10 +52,10 @@ public class GT_Runnable_Cable_Update extends GT_Runnable_MachineBlockUpdate { if (tTileEntity instanceof BaseMetaPipeEntity && ((BaseMetaPipeEntity) tTileEntity).getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable) { ChunkCoordinates tCoords; - for (byte i = 0; i < 6; i++) { + for (byte tSide : ALL_VALID_SIDES) { if (((GT_MetaPipeEntity_Cable) ((BaseMetaPipeEntity) tTileEntity).getMetaTileEntity()) - .isConnectedAtSide(i)) { - ForgeDirection offset = ForgeDirection.getOrientation(i); + .isConnectedAtSide(tSide)) { + final ForgeDirection offset = ForgeDirection.getOrientation(tSide); if (visited.add( tCoords = new ChunkCoordinates( aCoords.posX + offset.offsetX, diff --git a/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java b/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java index b7ded54d64..2813df0973 100644 --- a/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java +++ b/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java @@ -1,5 +1,7 @@ package gregtech.api.util; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.GregTech_API; @@ -31,17 +33,17 @@ public abstract class GT_CircuitryBehavior { /** * returns if there is Redstone applied to any of the valid Inputs (OR) */ - public static final boolean getAnyRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { - for (byte i = 0; i < 6; i++) { - if (i != aRedstoneCircuitBlock.getOutputFacing() + public static boolean getAnyRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + for (byte side : ALL_VALID_SIDES) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock - .getCover(i) + .getCover(side) .letsRedstoneGoIn( - i, - aRedstoneCircuitBlock.getCoverID(i), - aRedstoneCircuitBlock.getCoverVariable(i), + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), aRedstoneCircuitBlock.getOwnTileEntity())) { - if (aRedstoneCircuitBlock.getInputRedstone(i) > 0) { + if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) { return true; } } @@ -52,17 +54,17 @@ public abstract class GT_CircuitryBehavior { /** * returns if there is Redstone applied to all the valid Inputs (AND) */ - public static final boolean getAllRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { - for (byte i = 0; i < 6; i++) { - if (i != aRedstoneCircuitBlock.getOutputFacing() + public static boolean getAllRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + for (byte side : ALL_VALID_SIDES) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock - .getCover(i) + .getCover(side) .letsRedstoneGoIn( - i, - aRedstoneCircuitBlock.getCoverID(i), - aRedstoneCircuitBlock.getCoverVariable(i), + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), aRedstoneCircuitBlock.getOwnTileEntity())) { - if (aRedstoneCircuitBlock.getInputRedstone(i) == 0) { + if (aRedstoneCircuitBlock.getInputRedstone(side) == 0) { return false; } } @@ -73,18 +75,18 @@ public abstract class GT_CircuitryBehavior { /** * returns if there is Redstone applied to exactly one of the valid Inputs (XOR) */ - public static final boolean getOneRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + public static boolean getOneRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { int tRedstoneAmount = 0; - for (byte i = 0; i < 6; i++) { - if (i != aRedstoneCircuitBlock.getOutputFacing() + for (byte side : ALL_VALID_SIDES) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock - .getCover(i) + .getCover(side) .letsRedstoneGoIn( - i, - aRedstoneCircuitBlock.getCoverID(i), - aRedstoneCircuitBlock.getCoverVariable(i), + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), aRedstoneCircuitBlock.getOwnTileEntity())) { - if (aRedstoneCircuitBlock.getInputRedstone(i) > 0) { + if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) { tRedstoneAmount++; } } @@ -95,18 +97,18 @@ public abstract class GT_CircuitryBehavior { /** * returns the strongest incoming RS-Power */ - public static final byte getStrongestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + public static byte getStrongestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { byte tRedstoneAmount = 0; - for (byte i = 0; i < 6; i++) { - if (i != aRedstoneCircuitBlock.getOutputFacing() + for (byte side : ALL_VALID_SIDES) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock - .getCover(i) + .getCover(side) .letsRedstoneGoIn( - i, - aRedstoneCircuitBlock.getCoverID(i), - aRedstoneCircuitBlock.getCoverVariable(i), + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), aRedstoneCircuitBlock.getOwnTileEntity())) { - tRedstoneAmount = (byte) Math.max(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(i)); + tRedstoneAmount = (byte) Math.max(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side)); } } return tRedstoneAmount; @@ -119,20 +121,20 @@ public abstract class GT_CircuitryBehavior { /** * returns the weakest incoming non-zero RS-Power */ - public static final byte getWeakestNonZeroRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + public static byte getWeakestNonZeroRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0; byte tRedstoneAmount = 15; - for (byte i = 0; i < 6; i++) { - if (i != aRedstoneCircuitBlock.getOutputFacing() + for (byte side : ALL_VALID_SIDES) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock - .getCover(i) + .getCover(side) .letsRedstoneGoIn( - i, - aRedstoneCircuitBlock.getCoverID(i), - aRedstoneCircuitBlock.getCoverVariable(i), + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), aRedstoneCircuitBlock.getOwnTileEntity())) { - if (aRedstoneCircuitBlock.getInputRedstone(i) > 0) - tRedstoneAmount = (byte) Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(i)); + if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) + tRedstoneAmount = (byte) Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side)); } } return tRedstoneAmount; @@ -141,19 +143,19 @@ public abstract class GT_CircuitryBehavior { /** * returns the weakest incoming RS-Power */ - public static final byte getWeakestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + public static byte getWeakestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0; byte tRedstoneAmount = 15; - for (byte i = 0; i < 6; i++) { - if (i != aRedstoneCircuitBlock.getOutputFacing() + for (byte side : ALL_VALID_SIDES) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock - .getCover(i) + .getCover(side) .letsRedstoneGoIn( - i, - aRedstoneCircuitBlock.getCoverID(i), - aRedstoneCircuitBlock.getCoverVariable(i), + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), aRedstoneCircuitBlock.getOwnTileEntity())) { - tRedstoneAmount = (byte) Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(i)); + tRedstoneAmount = (byte) Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side)); } } return tRedstoneAmount; diff --git a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java index 8991289a78..12505dff31 100644 --- a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java +++ b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java @@ -62,7 +62,7 @@ public abstract class GT_CoverBehaviorBase<T extends ISerializableObject> { return createDataObject(((NBTTagInt) aNBT).func_150287_d()); } - T ret = createDataObject(); + final T ret = createDataObject(); ret.loadDataFromNBT(aNBT); return ret; } diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java index cfa261c321..ee4a92b1a4 100644 --- a/src/main/java/gregtech/api/util/GT_Utility.java +++ b/src/main/java/gregtech/api/util/GT_Utility.java @@ -798,11 +798,11 @@ public class GT_Utility { || aMaxStackTransfer == 0) return 0; // find where to take from - int[] tGrabSlots = new int[aTileEntity1.getSizeInventory()]; + final int[] tGrabSlots = new int[aTileEntity1.getSizeInventory()]; int tGrabSlotsSize = 0; if (aTileEntity1 instanceof ISidedInventory) { for (int i : ((ISidedInventory) aTileEntity1).getAccessibleSlotsFromSide(aGrabFrom)) { - ItemStack s = aTileEntity1.getStackInSlot(i); + final ItemStack s = aTileEntity1.getStackInSlot(i); if (s == null || !isAllowedToTakeFromSlot(aTileEntity1, i, aGrabFrom, s) || s.stackSize < aMinMoveAtOnce @@ -839,15 +839,15 @@ public class GT_Utility { // if target is an inventory, e.g. chest, machine, drawers... if (aTileEntity2 instanceof IInventory) { - IInventory tPutInventory = (IInventory) aTileEntity2; + final IInventory tPutInventory = (IInventory) aTileEntity2; // partially filled slot spare space mapping. // value is the sum of all spare space left not counting completely empty slot - HashMap<ItemId, Integer> tPutItems = new HashMap<>(tPutInventory.getSizeInventory()); + final HashMap<ItemId, Integer> tPutItems = new HashMap<>(tPutInventory.getSizeInventory()); // partially filled slot contents - HashMap<ItemId, List<ItemStack>> tPutItemStacks = new HashMap<>(tPutInventory.getSizeInventory()); + final HashMap<ItemId, List<ItemStack>> tPutItemStacks = new HashMap<>(tPutInventory.getSizeInventory()); // completely empty slots - List<Integer> tPutFreeSlots = new ArrayList<>(tPutInventory.getSizeInventory()); + final List<Integer> tPutFreeSlots = new ArrayList<>(tPutInventory.getSizeInventory()); // find possible target slots int[] accessibleSlots = null; @@ -895,28 +895,28 @@ public class GT_Utility { // go over source stacks one by one int tStacksMoved = 0, tTotalItemsMoved = 0; for (int j = 0; j < tGrabSlotsSize; j++) { - int grabSlot = tGrabSlots[j]; + final int grabSlot = tGrabSlots[j]; int tMovedItems; int tStackSize; do { tMovedItems = 0; - ItemStack tGrabStack = aTileEntity1.getStackInSlot(grabSlot); + final ItemStack tGrabStack = aTileEntity1.getStackInSlot(grabSlot); if (tGrabStack == null) break; tStackSize = tGrabStack.stackSize; - ItemId sID = ItemId.createNoCopy(tGrabStack); + final ItemId sID = ItemId.createNoCopy(tGrabStack); if (tPutItems.containsKey(sID)) { // there is a partially filled slot, try merging - int canPut = Math.min(tPutItems.get(sID), aMaxMoveAtOnce); + final int canPut = Math.min(tPutItems.get(sID), aMaxMoveAtOnce); if (canPut >= aMinMoveAtOnce) { - List<ItemStack> putStack = tPutItemStacks.get(sID); + final List<ItemStack> putStack = tPutItemStacks.get(sID); if (!putStack.isEmpty()) { // can move, do merge int toPut = Math.min(canPut, tStackSize); tMovedItems = toPut; for (int i = 0; i < putStack.size(); i++) { - ItemStack s = putStack.get(i); - int sToPut = Math.min( + final ItemStack s = putStack.get(i); + final int sToPut = Math.min( Math.min( Math.min(toPut, s.getMaxStackSize() - s.stackSize), tPutInventory.getInventoryStackLimit() - s.stackSize), @@ -953,10 +953,10 @@ public class GT_Utility { // still stuff to move & have completely empty slots if (tStackSize > 0 && !tPutFreeSlots.isEmpty()) { for (int i = 0; i < tPutFreeSlots.size(); i++) { - int tPutSlot = tPutFreeSlots.get(i); + final int tPutSlot = tPutFreeSlots.get(i); if (isAllowedToPutIntoSlot(tPutInventory, tPutSlot, aPutTo, tGrabStack, (byte) 64)) { // allowed, now do moving - int tMoved = moveStackFromSlotAToSlotB( + final int tMoved = moveStackFromSlotAToSlotB( aTileEntity1, tPutInventory, grabSlot, @@ -966,15 +966,15 @@ public class GT_Utility { (byte) (aMaxMoveAtOnce - tMovedItems), aMinMoveAtOnce); if (tMoved > 0) { - ItemStack s = tPutInventory.getStackInSlot(tPutSlot); + final ItemStack s = tPutInventory.getStackInSlot(tPutSlot); if (s != null) { // s might be null if tPutInventory is very special, e.g. infinity chest // if s is null, we will not mark this slot as target candidate for anything - int spare = + final int spare = Math.min(s.getMaxStackSize(), tPutInventory.getInventoryStackLimit()) - s.stackSize; if (spare > 0) { - ItemId ssID = ItemId.createNoCopy(s); + final ItemId ssID = ItemId.createNoCopy(s); // add back to spare space count tPutItems.merge(ssID, spare, Integer::sum); // add to partially filled slot list @@ -1007,7 +1007,7 @@ public class GT_Utility { // check if source is a double chest, if yes, try move from the adjacent as well if (aDoCheckChests && aTileEntity1 instanceof TileEntityChest) { - int tAmount = moveFromAdjacentChests( + final int tAmount = moveFromAdjacentChests( (TileEntityChest) aTileEntity1, aTileEntity2, aGrabFrom, @@ -1024,7 +1024,7 @@ public class GT_Utility { // check if target is a double chest, if yes, try move to the adjacent as well if (aDoCheckChests && aTileEntity2 instanceof TileEntityChest) { - int tAmount = moveToAdjacentChests( + final int tAmount = moveToAdjacentChests( aTileEntity1, (TileEntityChest) aTileEntity2, aGrabFrom, @@ -1044,9 +1044,9 @@ public class GT_Utility { // there should be a function to transfer more than 1 stack in a pipe // however I do not see any ways to improve it. too much work for what it is worth int tTotalItemsMoved = 0; - int tGrabInventorySize = tGrabSlots.length; + final int tGrabInventorySize = tGrabSlots.length; for (int i = 0; i < tGrabInventorySize; i++) { - int tMoved = moveStackIntoPipe( + final int tMoved = moveStackIntoPipe( aTileEntity1, aTileEntity2, tGrabSlots, @@ -3380,12 +3380,8 @@ public class GT_Utility { if (tTileEntity instanceof ICoverable) { rEUAmount += 300; final String tString = ((ICoverable) tTileEntity) - .getCoverBehaviorAtSideNew((byte) aSide) - .getDescription( - (byte) aSide, - ((ICoverable) tTileEntity).getCoverIDAtSide((byte) aSide), - ((ICoverable) tTileEntity).getComplexCoverDataAtSide((byte) aSide), - (ICoverable) tTileEntity); + .getCoverInfoAtSide((byte) aSide) + .getBehaviorDescription(); if (tString != null && !tString.equals(E)) tList.add(tString); } } catch (Throwable e) { diff --git a/src/main/java/gregtech/common/GT_Client.java b/src/main/java/gregtech/common/GT_Client.java index 2a93e541b5..0ce1e284ca 100644 --- a/src/main/java/gregtech/common/GT_Client.java +++ b/src/main/java/gregtech/common/GT_Client.java @@ -5,6 +5,7 @@ package gregtech.common; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; import static gregtech.api.enums.GT_Values.calculateMaxPlasmaTurbineEfficiency; import static org.lwjgl.opengl.GL11.GL_LINE_LOOP; @@ -328,16 +329,17 @@ public class GT_Client extends GT_Proxy implements Runnable { byte tConnections = 0; if (tTile instanceof ICoverable) { if (showCoverConnections) { - for (byte i = 0; i < 6; i++) { - if (((ICoverable) tTile).getCoverIDAtSide(i) > 0) tConnections = (byte) (tConnections + (1 << i)); + for (byte tSide : ALL_VALID_SIDES) { + if (((ICoverable) tTile).getCoverIDAtSide(tSide) > 0) + tConnections = (byte) (tConnections + (1 << tSide)); } } else if (tTile instanceof BaseMetaPipeEntity) tConnections = ((BaseMetaPipeEntity) tTile).mConnections; } if (tConnections > 0) { - for (byte i = 0; i < 6; i++) { - if ((tConnections & (1 << i)) != 0) { - switch (GRID_SWITCH_TABLE[aEvent.target.sideHit][i]) { + for (byte tSide : ALL_VALID_SIDES) { + if ((tConnections & (1 << tSide)) != 0) { + switch (GRID_SWITCH_TABLE[aEvent.target.sideHit][tSide]) { case 0: GL11.glVertex3d(+.25D, .0D, +.25D); GL11.glVertex3d(-.25D, .0D, -.25D); @@ -787,8 +789,8 @@ public class GT_Client extends GT_Proxy implements Runnable { || GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sCrowbarList) || GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sScrewdriverList)) { if (((ICoverable) aTileEntity).getCoverIDAtSide((byte) aEvent.target.sideHit) == 0) - for (byte i = 0; i < 6; i++) - if (((ICoverable) aTileEntity).getCoverIDAtSide(i) > 0) { + for (byte tSide : ALL_VALID_SIDES) + if (((ICoverable) aTileEntity).getCoverIDAtSide(tSide) > 0) { drawGrid(aEvent, true, false, true); return; } diff --git a/src/main/java/gregtech/common/GT_Network.java b/src/main/java/gregtech/common/GT_Network.java index 39f50a9e04..4e1a58b4db 100644 --- a/src/main/java/gregtech/common/GT_Network.java +++ b/src/main/java/gregtech/common/GT_Network.java @@ -36,24 +36,26 @@ public class GT_Network extends MessageToMessageCodec<FMLProxyPacket, GT_Packet> public GT_Network() { this( "GregTech", - new GT_Packet_TileEntity(), - new GT_Packet_Sound(), - new GT_Packet_Block_Event(), - new GT_Packet_Ores(), - new GT_Packet_Pollution(), - new MessageSetFlaskCapacity(), - new GT_Packet_TileEntityCover(), - new GT_Packet_TileEntityCoverGUI(), - new MessageUpdateFluidDisplayItem(), - new GT_Packet_ClientPreference(), - new GT_Packet_WirelessRedstoneCover(), - new GT_Packet_TileEntityCoverNew(), - new GT_Packet_SetConfigurationCircuit(), - new GT_Packet_UpdateItem(), - new GT_Packet_SetLockedFluid(), - new GT_Packet_GtTileEntityGuiRequest(), - new GT_Packet_SendCoverData(), - new GT_Packet_RequestCoverData()); + new GT_Packet_TileEntity(), // 0 + new GT_Packet_Sound(), // 1 + new GT_Packet_Block_Event(), // 2 + new GT_Packet_Ores(), // 3 + new GT_Packet_Pollution(), // 4 + new MessageSetFlaskCapacity(), // 5 + new GT_Packet_TileEntityCover(), // 6 + new GT_Packet_TileEntityCoverGUI(), // 7 + new MessageUpdateFluidDisplayItem(), // 8 + new GT_Packet_ClientPreference(), // 9 + new GT_Packet_WirelessRedstoneCover(), // 10 + new GT_Packet_TileEntityCoverNew(), // 11 + new GT_Packet_SetConfigurationCircuit(), // 12 + new GT_Packet_UpdateItem(), // 13 + new GT_Packet_SetLockedFluid(), // 14 + new GT_Packet_GtTileEntityGuiRequest(), // 15 + new GT_Packet_SendCoverData(), // 16 + new GT_Packet_RequestCoverData(), // 17 + new GT_Packet_MultiTileEntity() // 18 + ); } public GT_Network(String channelName, GT_Packet... packetTypes) { @@ -68,7 +70,7 @@ public class GT_Network extends MessageToMessageCodec<FMLProxyPacket, GT_Packet> @Override protected void encode(ChannelHandlerContext aContext, GT_Packet aPacket, List<Object> aOutput) throws Exception { - ByteBuf tBuf = Unpooled.buffer().writeByte(aPacket.getPacketID()); + final ByteBuf tBuf = Unpooled.buffer().writeByte(aPacket.getPacketID()); aPacket.encode(tBuf); aOutput.add(new FMLProxyPacket( tBuf, aContext.channel().attr(NetworkRegistry.FML_CHANNEL).get())); @@ -77,8 +79,9 @@ public class GT_Network extends MessageToMessageCodec<FMLProxyPacket, GT_Packet> @Override protected void decode(ChannelHandlerContext aContext, FMLProxyPacket aPacket, List<Object> aOutput) throws Exception { - ByteArrayDataInput aData = ByteStreams.newDataInput(aPacket.payload().array()); - GT_Packet tPacket = this.mSubChannels[aData.readByte()].decode(aData); + final ByteArrayDataInput aData = + ByteStreams.newDataInput(aPacket.payload().array()); + final GT_Packet tPacket = this.mSubChannels[aData.readByte()].decode(aData); tPacket.setINetHandler(aPacket.handler()); aOutput.add(tPacket); } diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java index 92cfd04655..62bc9f7654 100644 --- a/src/main/java/gregtech/common/GT_Proxy.java +++ b/src/main/java/gregtech/common/GT_Proxy.java @@ -2191,16 +2191,16 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG GT_MetaGenerated_Tool_01.AXE, 1, Materials.Flint, Materials.Wood, null))); } } - boolean tHungerEffect = (this.mHungerEffect) && (aEvent.player.ticksExisted % 2400 == 1200); + final boolean tHungerEffect = (this.mHungerEffect) && (aEvent.player.ticksExisted % 2400 == 1200); if (aEvent.player.ticksExisted % 120 == 0) { int tCount = 64; for (int i = 0; i < 36; i++) { - ItemStack tStack; + final ItemStack tStack; if ((tStack = aEvent.player.inventory.getStackInSlot(i)) != null) { if (!aEvent.player.capabilities.isCreativeMode) { GT_Utility.applyRadioactivity( aEvent.player, GT_Utility.getRadioactivityLevel(tStack), tStack.stackSize); - float tHeat = GT_Utility.getHeatDamageFromItem(tStack); + final float tHeat = GT_Utility.getHeatDamageFromItem(tStack); if (tHeat != 0.0F) { if (tHeat > 0.0F) { GT_Utility.applyHeatDamageFromItem(aEvent.player, tHeat, tStack); @@ -2218,12 +2218,12 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG } } for (int i = 0; i < 4; i++) { - ItemStack tStack; + final ItemStack tStack; if ((tStack = aEvent.player.inventory.armorInventory[i]) != null) { if (!aEvent.player.capabilities.isCreativeMode) { GT_Utility.applyRadioactivity( aEvent.player, GT_Utility.getRadioactivityLevel(tStack), tStack.stackSize); - float tHeat = GT_Utility.getHeatDamageFromItem(tStack); + final float tHeat = GT_Utility.getHeatDamageFromItem(tStack); if (tHeat != 0.0F) { if (tHeat > 0.0F) { GT_Utility.applyHeatDamageFromItem(aEvent.player, tHeat, tStack); @@ -2257,12 +2257,12 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG if (aID >= 1000) { return null; } - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); if ((tTileEntity instanceof IGregTechTileEntity)) { if (GUI_ID_COVER_SIDE_BASE <= aID && aID < GUI_ID_COVER_SIDE_BASE + 6) { return null; } - IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity(); + final IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity(); if (tMetaTileEntity != null && !tMetaTileEntity.useModularUI()) { return tMetaTileEntity.getServerGUI(aID, aPlayer.inventory, (IGregTechTileEntity) tTileEntity); } @@ -2275,12 +2275,12 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG if (aID >= 1000) { return null; } - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); if ((tTileEntity instanceof IGregTechTileEntity)) { - IGregTechTileEntity tile = (IGregTechTileEntity) tTileEntity; + final IGregTechTileEntity tile = (IGregTechTileEntity) tTileEntity; if (GUI_ID_COVER_SIDE_BASE <= aID && aID < GUI_ID_COVER_SIDE_BASE + 6) { - byte side = (byte) (aID - GT_Proxy.GUI_ID_COVER_SIDE_BASE); + final byte side = (byte) (aID - GT_Proxy.GUI_ID_COVER_SIDE_BASE); GT_CoverBehaviorBase<?> cover = tile.getCoverBehaviorAtSideNew(side); if (cover.hasCoverGUI() && !cover.useModularUI()) { @@ -2294,7 +2294,7 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG } return null; } - IMetaTileEntity tMetaTileEntity = tile.getMetaTileEntity(); + final IMetaTileEntity tMetaTileEntity = tile.getMetaTileEntity(); if (tMetaTileEntity != null && !tMetaTileEntity.useModularUI()) { return tMetaTileEntity.getClientGUI(aID, aPlayer.inventory, tile); } @@ -2315,15 +2315,16 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG } int rFuelValue = 0; if ((aFuel.getItem() instanceof GT_MetaGenerated_Item)) { - Short tFuelValue = ((GT_MetaGenerated_Item) aFuel.getItem()).mBurnValues.get((short) aFuel.getItemDamage()); + final Short tFuelValue = + ((GT_MetaGenerated_Item) aFuel.getItem()).mBurnValues.get((short) aFuel.getItemDamage()); if (tFuelValue != null) { rFuelValue = Math.max(rFuelValue, tFuelValue); } } - NBTTagCompound tNBT = aFuel.getTagCompound(); + final NBTTagCompound tNBT = aFuel.getTagCompound(); if (tNBT != null) { // See if we have something defined by NBT - short tValue = tNBT.getShort("GT.ItemFuelValue"); + final short tValue = tNBT.getShort("GT.ItemFuelValue"); rFuelValue = Math.max(rFuelValue, tValue); } else { // If not check the ore dict diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java index d176fd26a3..25db7f32dd 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java @@ -1,6 +1,7 @@ package gregtech.common.blocks; import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; import static gregtech.api.enums.GT_Values.SIDE_UP; import static gregtech.api.objects.XSTR.XSTR_INSTANCE; @@ -23,6 +24,7 @@ import gregtech.api.metatileentity.CoverableTileEntity; import gregtech.api.util.GT_BaseCrop; import gregtech.api.util.GT_Log; import gregtech.api.util.GT_Utility; +import gregtech.common.covers.CoverInfo; import gregtech.common.render.GT_Renderer_Block; import gregtech.common.tileentities.storage.GT_MetaTileEntity_QuantumChest; import java.util.ArrayList; @@ -658,16 +660,13 @@ public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlo 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; } @@ -684,22 +683,17 @@ public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlo 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(); } } } diff --git a/src/main/java/gregtech/common/covers/CoverInfo.java b/src/main/java/gregtech/common/covers/CoverInfo.java new file mode 100644 index 0000000000..58b1afe5ba --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverInfo.java @@ -0,0 +1,235 @@ +package gregtech.common.covers; + +import static gregtech.api.enums.GT_Values.SIDE_UNKNOWN; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import gregtech.api.GregTech_API; +import gregtech.api.gui.modularui.GT_CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.GT_CoverBehaviorBase; +import gregtech.api.util.ISerializableObject; +import java.lang.ref.WeakReference; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fluids.Fluid; + +public final class CoverInfo { + private static final String NBT_SIDE = "s", NBT_ID = "id", NBT_DATA = "d"; + + public static final CoverInfo EMPTY_INFO = new CoverInfo(SIDE_UNKNOWN, null); + private byte coverSide; + private int coverID = 0; + private GT_CoverBehaviorBase<?> coverBehavior = null; + private ISerializableObject coverData = null; + private final WeakReference<ICoverable> coveredTile; + private boolean needsUpdate = false; + + public CoverInfo(byte aSide, ICoverable aTile) { + coverSide = aSide; + coveredTile = new WeakReference<>(aTile); + } + + public CoverInfo(byte aSide, int aID, ICoverable aTile, ISerializableObject aCoverData) { + coverSide = aSide; + coverID = aID; + coverBehavior = GregTech_API.getCoverBehaviorNew(aID); + coverData = aCoverData == null ? coverBehavior.createDataObject() : aCoverData; + coveredTile = new WeakReference<>(aTile); + } + + public CoverInfo(ICoverable aTile, NBTTagCompound aNBT) { + coverSide = aNBT.getByte(NBT_SIDE); + coverID = aNBT.getInteger(NBT_ID); + coverBehavior = GregTech_API.getCoverBehaviorNew(coverID); + coverData = aNBT.hasKey(NBT_DATA) + ? coverBehavior.createDataObject(aNBT.getTag(NBT_DATA)) + : coverBehavior.createDataObject(); + coveredTile = new WeakReference<>(aTile); + } + + public boolean isValid() { + return coverID != 0 && coverSide != SIDE_UNKNOWN; + } + + public NBTTagCompound writeToNBT(NBTTagCompound aNBT) { + aNBT.setByte(NBT_SIDE, coverSide); + aNBT.setInteger(NBT_ID, coverID); + if (coverData != null) aNBT.setTag(NBT_DATA, coverData.saveDataToNBT()); + + return aNBT; + } + + public int getCoverID() { + return coverID; + } + + public boolean needsUpdate() { + return needsUpdate; + } + + public void setNeedsUpdate(boolean aUpdate) { + needsUpdate = aUpdate; + } + + public GT_CoverBehaviorBase<?> getCoverBehavior() { + if (coverBehavior != null) return coverBehavior; + return GregTech_API.sNoBehavior; + } + + public ISerializableObject getCoverData() { + if (coverData != null) return coverData; + return GregTech_API.sNoBehavior.createDataObject(); + } + + public boolean onCoverRemoval(boolean aForced) { + return getCoverBehavior().onCoverRemoval(coverSide, coverID, coverData, coveredTile.get(), aForced); + } + + public ItemStack getDrop() { + return getCoverBehavior().getDrop(coverSide, coverID, coverData, coveredTile.get()); + } + + public ItemStack getDisplayStack() { + return getCoverBehavior().getDisplayStack(coverID, coverData); + } + + public boolean isDataNeededOnClient() { + return getCoverBehavior().isDataNeededOnClient(coverSide, coverID, coverData, coveredTile.get()); + } + + public void onDropped() { + getCoverBehavior().onDropped(coverSide, coverID, coverData, coveredTile.get()); + } + + public void setCoverData(ISerializableObject aData) { + coverData = aData; + } + + public ITexture getSpecialCoverFGTexture() { + return getCoverBehavior().getSpecialCoverFGTexture(coverSide, coverID, coverData, coveredTile.get()); + } + + public ITexture getSpecialCoverTexture() { + return getCoverBehavior().getSpecialCoverTexture(coverSide, coverID, coverData, coveredTile.get()); + } + + public int getTickRate() { + return getCoverBehavior().getTickRate(coverSide, coverID, coverData, coveredTile.get()); + } + + public byte getSide() { + return coverSide; + } + + public ICoverable getTile() { + return coveredTile.get(); + } + + public boolean isRedstoneSensitive(long aTickTimer) { + return getCoverBehavior().isRedstoneSensitive(coverSide, coverID, coverData, coveredTile.get(), aTickTimer); + } + + public ISerializableObject doCoverThings(long aTickTimer, byte aRedstone) { + return getCoverBehavior() + .doCoverThings(coverSide, aRedstone, coverID, coverData, coveredTile.get(), aTickTimer); + } + + public void onBaseTEDestroyed() { + getCoverBehavior().onBaseTEDestroyed(coverSide, coverID, coverData, coveredTile.get()); + } + + public void updateCoverBehavior() { + coverBehavior = GregTech_API.getCoverBehaviorNew(coverID); + } + + public void preDataChanged(int aCoverID, ISerializableObject aCoverData) { + getCoverBehavior().preDataChanged(coverSide, coverID, aCoverID, coverData, aCoverData, coveredTile.get()); + } + + public void onDataChanged() { + getCoverBehavior().onDataChanged(coverSide, coverID, coverData, coveredTile.get()); + } + + public String getBehaviorDescription() { + return getCoverBehavior().getDescription(coverSide, coverID, coverData, null); + } + + public ModularWindow createWindow(EntityPlayer player) { + final GT_CoverUIBuildContext buildContext = + new GT_CoverUIBuildContext(player, coverID, coverSide, coveredTile.get(), true); + return getCoverBehavior().createWindow(buildContext); + } + + public boolean isGUIClickable() { + return getCoverBehavior().isGUIClickable(coverSide, coverID, coverData, coveredTile.get()); + } + + public boolean hasCoverGUI() { + return getCoverBehavior().hasCoverGUI(); + } + + public boolean useModularUI() { + return getCoverBehavior().useModularUI(); + } + + public boolean letsItemsIn(int aSlot) { + return getCoverBehavior().letsItemsIn(coverSide, coverID, coverData, aSlot, coveredTile.get()); + } + + public boolean letsItemsOut(int aSlot) { + return getCoverBehavior().letsItemsOut(coverSide, coverID, coverData, aSlot, coveredTile.get()); + } + + public boolean letsFluidIn(Fluid aFluid) { + return letsFluidIn(aFluid, coveredTile.get()); + } + + public boolean letsFluidOut(Fluid aFluid) { + return letsFluidOut(aFluid, coveredTile.get()); + } + + public boolean letsFluidIn(Fluid aFluid, ICoverable tile) { + return getCoverBehavior().letsFluidIn(coverSide, coverID, coverData, aFluid, tile); + } + + public boolean letsFluidOut(Fluid aFluid, ICoverable tile) { + return getCoverBehavior().letsFluidOut(coverSide, coverID, coverData, aFluid, tile); + } + + public boolean letsEnergyIn() { + return getCoverBehavior().letsEnergyIn(coverSide, coverID, coverData, coveredTile.get()); + } + + public boolean letsEnergyOut() { + return getCoverBehavior().letsEnergyOut(coverSide, coverID, coverData, coveredTile.get()); + } + + public boolean alwaysLookConnected() { + return getCoverBehavior().alwaysLookConnected(coverSide, coverID, coverData, coveredTile.get()); + } + + public boolean onCoverRightClick(EntityPlayer aPlayer, float aX, float aY, float aZ) { + return getCoverBehavior() + .onCoverRightClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer, aX, aY, aZ); + } + + public boolean onCoverShiftRightClick(EntityPlayer aPlayer) { + return getCoverBehavior().onCoverShiftRightClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer); + } + + public ISerializableObject onCoverScrewdriverClick(EntityPlayer aPlayer, float aX, float aY, float aZ) { + return getCoverBehavior() + .onCoverScrewdriverClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer, aX, aY, aZ); + } + + public Block getFacadeBlock() { + return getCoverBehavior().getFacadeBlock(coverSide, coverID, coverData, coveredTile.get()); + } + + public int getFacadeMeta() { + return getCoverBehavior().getFacadeMeta(coverSide, coverID, coverData, coveredTile.get()); + } +} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java index 270a221a08..f45ffbf2e8 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java @@ -1,5 +1,7 @@ package gregtech.common.covers; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.common.widget.TextWidget; import gregtech.api.gui.modularui.GT_CoverUIBuildContext; @@ -168,8 +170,8 @@ public class GT_Cover_ControlsWork extends GT_CoverBehavior implements IControls @Override public boolean isCoverPlaceable(byte aSide, ItemStack aStack, ICoverable aTileEntity) { if (!super.isCoverPlaceable(aSide, aStack, aTileEntity)) return false; - for (byte i = 0; i < 6; i++) { - if (aTileEntity.getCoverBehaviorAtSideNew(i) instanceof IControlsWorkCover) { + for (byte tSide : ALL_VALID_SIDES) { + if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover) { return false; } } diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java b/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java index dc3bcc4f7b..54e9e50d8b 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java @@ -58,11 +58,11 @@ public class GT_Cover_Conveyor extends GT_CoverBehavior { return aCoverVariable; } } - TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(aSide); - Object fromEntity = aCoverVariable % 2 == 0 ? aTileEntity : tTileEntity, - toEntity = aCoverVariable % 2 != 0 ? aTileEntity : tTileEntity; - byte fromSide = aCoverVariable % 2 != 0 ? GT_Utility.getOppositeSide(aSide) : aSide, - toSide = aCoverVariable % 2 == 0 ? GT_Utility.getOppositeSide(aSide) : aSide; + final TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(aSide); + final Object fromEntity = aCoverVariable % 2 == 0 ? aTileEntity : tTileEntity; + final Object toEntity = aCoverVariable % 2 != 0 ? aTileEntity : tTileEntity; + final byte fromSide = aCoverVariable % 2 != 0 ? GT_Utility.getOppositeSide(aSide) : aSide; + final byte toSide = aCoverVariable % 2 == 0 ? GT_Utility.getOppositeSide(aSide) : aSide; moveMultipleItemStacks( fromEntity, diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java b/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java index a2707043ef..7c55a9dce8 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java @@ -1,5 +1,7 @@ package gregtech.common.covers; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import com.google.common.io.ByteArrayDataInput; import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; import com.gtnewhorizons.modularui.api.screen.ModularWindow; @@ -120,6 +122,7 @@ public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_ public void placeCover(byte aSide, ItemStack aCover, ICoverable aTileEntity) { aTileEntity.setCoverIdAndDataAtSide( aSide, GT_Utility.stackToInt(aCover), new FacadeData(GT_Utility.copyAmount(1, aCover), 0)); + if (aTileEntity.isClientSide()) GT_RenderingWorld.getInstance() .register( @@ -193,7 +196,7 @@ public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_ @Override protected void onDroppedImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) { if (aTileEntity.isClientSide()) { - for (byte i = 0; i < 6; i++) { + for (byte i : ALL_VALID_SIDES) { if (i == aSide) continue; // since we do not allow multiple type of facade per block, this check would be enough. if (aTileEntity.getCoverBehaviorAtSideNew(i) instanceof GT_Cover_FacadeBase) return; @@ -231,23 +234,20 @@ public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_ // to render it correctly require changing GT_Block_Machine to render in both pass, which is not really a good // idea... if (!super.isCoverPlaceable(aSide, aStack, aTileEntity)) return false; - Block targetBlock = getTargetBlock(aStack); + final Block targetBlock = getTargetBlock(aStack); if (targetBlock == null) return false; // we allow one single type of facade on the same block for now // otherwise it's not clear which block this block should impersonate // this restriction can be lifted later by specifying a certain facade as dominate one as an extension to this // class - for (byte i = 0; i < 6; i++) { + for (byte i : ALL_VALID_SIDES) { if (i == aSide) continue; - GT_CoverBehaviorBase<?> behavior = aTileEntity.getCoverBehaviorAtSideNew(i); - if (behavior == null) continue; - Block facadeBlock = behavior.getFacadeBlock( - i, aTileEntity.getCoverIDAtSide(i), aTileEntity.getComplexCoverDataAtSide(i), aTileEntity); + final CoverInfo coverInfo = aTileEntity.getCoverInfoAtSide(i); + if (!coverInfo.isValid()) continue; + final Block facadeBlock = coverInfo.getFacadeBlock(); if (facadeBlock == null) continue; if (facadeBlock != targetBlock) return false; - if (behavior.getFacadeMeta( - i, aTileEntity.getCoverIDAtSide(i), aTileEntity.getComplexCoverDataAtSide(i), aTileEntity) - != getTargetMeta(aStack)) return false; + if (coverInfo.getFacadeMeta() != getTargetMeta(aStack)) return false; } return true; } @@ -272,7 +272,7 @@ public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_ @Nonnull @Override public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); + final NBTTagCompound tag = new NBTTagCompound(); if (mStack != null) tag.setTag("mStack", mStack.writeToNBT(new NBTTagCompound())); tag.setByte("mFlags", (byte) mFlags); return tag; @@ -286,7 +286,7 @@ public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_ @Override public void loadDataFromNBT(NBTBase aNBT) { - NBTTagCompound tag = (NBTTagCompound) aNBT; + final NBTTagCompound tag = (NBTTagCompound) aNBT; mStack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("mStack")); mFlags = tag.getByte("mFlags"); } diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java index 92445fa038..984e817665 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java @@ -1,5 +1,7 @@ package gregtech.common.covers; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import gregtech.api.GregTech_API; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.covers.IControlsWorkCover; @@ -53,8 +55,8 @@ public class GT_Cover_RedstoneTransmitterExternal extends GT_Cover_RedstoneWirel @Override public boolean isCoverPlaceable(byte aSide, ItemStack aStack, ICoverable aTileEntity) { if (!super.isCoverPlaceable(aSide, aStack, aTileEntity)) return false; - for (byte i = 0; i < 6; i++) { - if (aTileEntity.getCoverBehaviorAtSideNew(i) instanceof IControlsWorkCover) { + for (byte tSide : ALL_VALID_SIDES) { + if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover) { return false; } } diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java index ed0ca51231..2014138b71 100644 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java +++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java @@ -129,13 +129,7 @@ public class GT_MetaTileEntity_Hatch_OutputBus_ME extends GT_MetaTileEntity_Hatc @Override public void onScrewdriverRightClick(byte aSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (!getBaseMetaTileEntity() - .getCoverBehaviorAtSideNew(aSide) - .isGUIClickable( - aSide, - getBaseMetaTileEntity().getCoverIDAtSide(aSide), - getBaseMetaTileEntity().getComplexCoverDataAtSide(aSide), - getBaseMetaTileEntity())) return; + if (!getBaseMetaTileEntity().getCoverInfoAtSide(aSide).isGUIClickable()) return; infiniteCache = !infiniteCache; GT_Utility.sendChatToPlayer( aPlayer, StatCollector.translateToLocal("GT5U.hatch.infiniteCache." + infiniteCache)); diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java index 940497ede3..bdb1ebbbb4 100644 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java +++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java @@ -151,13 +151,7 @@ public class GT_MetaTileEntity_Hatch_Output_ME extends GT_MetaTileEntity_Hatch_O @Override public void onScrewdriverRightClick(byte aSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { // Don't allow to lock fluid in me fluid hatch - if (!getBaseMetaTileEntity() - .getCoverBehaviorAtSideNew(aSide) - .isGUIClickable( - aSide, - getBaseMetaTileEntity().getCoverIDAtSide(aSide), - getBaseMetaTileEntity().getComplexCoverDataAtSide(aSide), - getBaseMetaTileEntity())) return; + if (!getBaseMetaTileEntity().getCoverInfoAtSide(aSide).isGUIClickable()) return; infiniteCache = !infiniteCache; GT_Utility.sendChatToPlayer( aPlayer, StatCollector.translateToLocal("GT5U.hatch.infiniteCacheFluid." + infiniteCache)); diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java index 557b01fbb0..516d2dda66 100644 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java +++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java @@ -1,5 +1,6 @@ package gregtech.common.tileentities.machines.basic; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; import static gregtech.api.enums.GT_Values.AuthorKuba; import static gregtech.api.enums.GT_Values.V; import static gregtech.api.enums.Textures.BlockIcons.*; @@ -179,8 +180,8 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM openGUI(aBaseMetaTileEntity, aPlayer); return true; } - for (byte i = 0; i < 6; i++) { - if (aBaseMetaTileEntity.getAirAtSide(i)) { + for (byte tSide : ALL_VALID_SIDES) { + if (aBaseMetaTileEntity.getAirAtSide(tSide)) { openGUI(aBaseMetaTileEntity, aPlayer); return true; } @@ -230,38 +231,38 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM updateModifiers(); if (canWork()) { - ItemStack queen = getQueen(); + final ItemStack queen = getQueen(); usedQueen = queen.copy(); if (beeRoot.getType(queen) == EnumBeeType.QUEEN) { - IBee bee = beeRoot.getMember(queen); + final IBee bee = beeRoot.getMember(queen); usedQueenBee = bee; // LIFE CYCLES float mod = this.getLifespanModifier(null, null, 1.f); - IBeekeepingMode mode = beeRoot.getBeekeepingMode(this.getWorld()); - IBeeModifier beemodifier = mode.getBeeModifier(); + final IBeekeepingMode mode = beeRoot.getBeekeepingMode(this.getWorld()); + final IBeeModifier beemodifier = mode.getBeeModifier(); mod *= beemodifier.getLifespanModifier(null, null, 1.f); - int h = bee.getHealth(); + final int h = bee.getHealth(); mod = 1.f / mod; - float cycles = h / mod; + final float cycles = h / mod; // PRODUCTS - HashMap<GT_Utility.ItemId, ItemStack> pollen = new HashMap<>(); + final HashMap<GT_Utility.ItemId, ItemStack> pollen = new HashMap<>(); if (isRetrievingPollen && floweringMod > 0f) { - int icycles = + final int icycles = (int) cycles + (getWorld().rand.nextFloat() < (cycles - (float) ((int) cycles)) ? 1 : 0); for (int z = 0; z < icycles; z++) { - IIndividual p = bee.retrievePollen(this); + final IIndividual p = bee.retrievePollen(this); if (p != null) { - ItemStack s = + final ItemStack s = p.getGenome().getSpeciesRoot().getMemberStack(p, EnumGermlingType.POLLEN.ordinal()); if (s != null) { - GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(s); + final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(s); pollen.computeIfAbsent(id, k -> { - ItemStack ns = s.copy(); + final ItemStack ns = s.copy(); ns.stackSize = 0; return ns; }); @@ -274,19 +275,19 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM retrievedpollen = null; retrievingPollenInThisOperation = isRetrievingPollen; - IBeeGenome genome = bee.getGenome(); - IAlleleBeeSpecies primary = genome.getPrimary(); - IAlleleBeeSpecies secondary = genome.getSecondary(); + final IBeeGenome genome = bee.getGenome(); + final IAlleleBeeSpecies primary = genome.getPrimary(); + final IAlleleBeeSpecies secondary = genome.getSecondary(); - float speed = genome.getSpeed(); - float prodMod = getProductionModifier(null, 1f) * beemodifier.getProductionModifier(null, 1.f); + final float speed = genome.getSpeed(); + final float prodMod = getProductionModifier(null, 1f) * beemodifier.getProductionModifier(null, 1.f); - HashMap<GT_Utility.ItemId, Float> drops = new HashMap<>(); - HashMap<GT_Utility.ItemId, ItemStack> dropstacks = new HashMap<>(); + final HashMap<GT_Utility.ItemId, Float> drops = new HashMap<>(); + final HashMap<GT_Utility.ItemId, ItemStack> dropstacks = new HashMap<>(); for (Map.Entry<ItemStack, Float> entry : primary.getProductChances().entrySet()) { - GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey()); + final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey()); drops.merge( id, Bee.getFinalChance(entry.getValue(), speed, prodMod, 8f) @@ -297,7 +298,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM } for (Map.Entry<ItemStack, Float> entry : secondary.getProductChances().entrySet()) { - GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey()); + final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey()); drops.merge( id, Bee.getFinalChance(entry.getValue() / 2f, speed, prodMod, 8f) @@ -309,7 +310,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM if (primary.isJubilant(genome, this) && secondary.isJubilant(genome, this)) for (Map.Entry<ItemStack, Float> entry : primary.getSpecialtyChances().entrySet()) { - GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey()); + final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey()); drops.merge( id, Bee.getFinalChance(entry.getValue(), speed, prodMod, 8f) @@ -320,30 +321,30 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM } int i = 0; - int imax = mOutputItems.length; + final int imax = mOutputItems.length; - IApiaristTracker breedingTracker = beeRoot.getBreedingTracker(getWorld(), getOwner()); + final IApiaristTracker breedingTracker = beeRoot.getBreedingTracker(getWorld(), getOwner()); if (!bee.canSpawn()) { - ItemStack convert = new ItemStack(PluginApiculture.items.beePrincessGE); - NBTTagCompound nbttagcompound = new NBTTagCompound(); + final ItemStack convert = new ItemStack(PluginApiculture.items.beePrincessGE); + final NBTTagCompound nbttagcompound = new NBTTagCompound(); queen.writeToNBT(nbttagcompound); convert.setTagCompound(nbttagcompound); this.mOutputItems[i++] = convert; } else { - IBee b = bee.spawnPrincess(this); + final IBee b = bee.spawnPrincess(this); if (b != null) { - ItemStack princess = beeRoot.getMemberStack(b, EnumBeeType.PRINCESS.ordinal()); + final ItemStack princess = beeRoot.getMemberStack(b, EnumBeeType.PRINCESS.ordinal()); breedingTracker.registerPrincess(b); this.mOutputItems[i++] = princess; } - IBee[] d = bee.spawnDrones(this); + final IBee[] d = bee.spawnDrones(this); if (d != null && d.length > 0) { - HashMap<GT_Utility.ItemId, ItemStack> drones = new HashMap<>(d.length); + final HashMap<GT_Utility.ItemId, ItemStack> drones = new HashMap<>(d.length); for (IBee dr : d) { - ItemStack drone = beeRoot.getMemberStack(dr, EnumBeeType.DRONE.ordinal()); + final ItemStack drone = beeRoot.getMemberStack(dr, EnumBeeType.DRONE.ordinal()); breedingTracker.registerDrone(dr); - GT_Utility.ItemId drid = GT_Utility.ItemId.createNoCopy(drone); + final GT_Utility.ItemId drid = GT_Utility.ItemId.createNoCopy(drone); if (drones.containsKey(drid)) drones.get(drid).stackSize += drone.stackSize; else { this.mOutputItems[i++] = drone; @@ -353,12 +354,12 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM } } - int imin = i; + final int imin = i; setQueen(null); for (Map.Entry<GT_Utility.ItemId, Float> entry : drops.entrySet()) { - ItemStack s = dropstacks.get(entry.getKey()).copy(); + final ItemStack s = dropstacks.get(entry.getKey()).copy(); s.stackSize = entry.getValue().intValue() + (getWorld().rand.nextFloat() < (entry.getValue() @@ -383,8 +384,8 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM usedBeeLife = cycles * (float) beeCycleLength; this.mMaxProgresstime = (int) usedBeeLife; - int timemaxdivider = this.mMaxProgresstime / 100; - int useddivider = 1 << this.mSpeed; + final int timemaxdivider = this.mMaxProgresstime / 100; + final int useddivider = 1 << this.mSpeed; int actualdivider = useddivider; this.mMaxProgresstime /= Math.min(actualdivider, timemaxdivider); actualdivider /= Math.min(actualdivider, timemaxdivider); @@ -403,17 +404,17 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM this.mMaxProgresstime = 100; this.mProgresstime = 0; - int useddivider = Math.min(100, 1 << this.mSpeed); + final int useddivider = Math.min(100, 1 << this.mSpeed); this.mMaxProgresstime /= useddivider; this.mEUt = (int) ((float) baseEUtUsage * this.energyMod * useddivider); if (useddivider == 2) this.mEUt += 32; else if (useddivider > 2) this.mEUt += (32 * (useddivider << (this.mSpeed - 2))); - IBee princess = beeRoot.getMember(getQueen()); + final IBee princess = beeRoot.getMember(getQueen()); usedQueenBee = princess; - IBee drone = beeRoot.getMember(getDrone()); + final IBee drone = beeRoot.getMember(getDrone()); princess.mate(drone); - NBTTagCompound nbttagcompound = new NBTTagCompound(); + final NBTTagCompound nbttagcompound = new NBTTagCompound(); princess.writeToNBT(nbttagcompound); this.mOutputItems[0] = new ItemStack(PluginApiculture.items.beeQueenGE); this.mOutputItems[0].setTagCompound(nbttagcompound); @@ -446,8 +447,8 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM } private void doEffect() { - IBeeGenome genome = usedQueenBee.getGenome(); - IAlleleBeeEffect effect = genome.getEffect(); + final IBeeGenome genome = usedQueenBee.getGenome(); + final IAlleleBeeEffect effect = genome.getEffect(); if (!(effect instanceof IAlleleBeeAcceleratableEffect)) { effectData[0] = effect.validateStorage(effectData[0]); effect.doEffect(genome, effectData[0], this); @@ -455,7 +456,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM if (!effect.isCombinable()) return; - IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT); + final IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT); if (!secondary.isCombinable()) return; if (!(secondary instanceof IAlleleBeeAcceleratableEffect)) { @@ -465,8 +466,8 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM } private void doAcceleratedEffects() { - IBeeGenome genome = usedQueenBee.getGenome(); - IAlleleBeeEffect effect = genome.getEffect(); + final IBeeGenome genome = usedQueenBee.getGenome(); + final IAlleleBeeEffect effect = genome.getEffect(); try { if (AlleleBeeEffectThrottledField == null) { AlleleBeeEffectThrottledField = AlleleEffectThrottled.class.getDeclaredField("throttle"); @@ -487,7 +488,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM if (!effect.isCombinable()) return; - IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT); + final IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT); if (!secondary.isCombinable()) return; if (secondary instanceof IAlleleBeeAcceleratableEffect) { @@ -521,7 +522,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM if (usedQueen != null) { if (aTick % 2 == 0) { // FX on client, effect on server - IBee bee = beeRoot.getMember(usedQueen); + final IBee bee = beeRoot.getMember(usedQueen); effectData = bee.doFX(effectData, this); } } @@ -540,7 +541,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM || aTick % 600 == 0 || aBaseMetaTileEntity.hasWorkJustBeenEnabled()) && hasEnoughEnergyToCheckRecipe()) { - int check = checkRecipe(); + final int check = checkRecipe(); if (check == FOUND_AND_SUCCESSFULLY_USED_RECIPE) { aBaseMetaTileEntity.setActive(true); } @@ -615,9 +616,9 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM aBaseMetaTileEntity.setActive(false); if (doesAutoOutput() && !isOutputEmpty() && aBaseMetaTileEntity.getFrontFacing() != mMainFacing) { - TileEntity tTileEntity2 = + final TileEntity tTileEntity2 = aBaseMetaTileEntity.getTileEntityAtSide(aBaseMetaTileEntity.getFrontFacing()); - long tStoredEnergy = aBaseMetaTileEntity.getUniversalEnergyStored(); + final long tStoredEnergy = aBaseMetaTileEntity.getUniversalEnergyStored(); int tMaxStacks = (int) (tStoredEnergy / 64L); if (tMaxStacks > mOutputItems.length) tMaxStacks = mOutputItems.length; @@ -670,7 +671,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM if (!GT_ApiaryUpgrade.isUpgrade(aStack)) return false; for (int i = drone + 1; i < drone + 1 + 4; i++) { if (aIndex == i) continue; - ItemStack s = getStackInSlot(i); + final ItemStack s = getStackInSlot(i); if (s == null) continue; if (GT_Utility.areStacksEqual(getStackInSlot(i), aStack)) return false; if (GT_ApiaryUpgrade.isUpgrade(aStack)) { @@ -860,7 +861,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM private int flowerBlockMeta; private boolean checkFlower(IBee bee) { - String flowerType = bee.getGenome().getFlowerProvider().getFlowerType(); + final String flowerType = bee.getGenome().getFlowerProvider().getFlowerType(); if (!this.flowerType.equals(flowerType)) flowercoords = null; if (flowercoords != null) { if (getWorld().getBlock(flowercoords.posX, flowercoords.posY, flowercoords.posZ) != flowerBlock @@ -890,7 +891,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM clearErrors(); if (queen == null) return true; // Reloaded the chunk ? if (beeRoot.isMember(queen, EnumBeeType.PRINCESS.ordinal())) return true; - IBee bee = beeRoot.getMember(queen); + final IBee bee = beeRoot.getMember(queen); for (IErrorState err : bee.getCanWork(this)) setCondition(true, err); setCondition(!checkFlower(bee), EnumErrorCode.NO_FLOWER); return !hasErrors(); @@ -898,13 +899,13 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM private boolean canWork() { clearErrors(); - EnumBeeType beeType = beeRoot.getType(getQueen()); + final EnumBeeType beeType = beeRoot.getType(getQueen()); if (beeType == EnumBeeType.PRINCESS) { setCondition(!beeRoot.isDrone(getDrone()), EnumErrorCode.NO_DRONE); return !hasErrors(); } if (beeType == EnumBeeType.QUEEN) { - IBee bee = beeRoot.getMember(getQueen()); + final IBee bee = beeRoot.getMember(getQueen()); for (IErrorState err : bee.getCanWork(this)) setCondition(true, err); setCondition(!checkFlower(bee), EnumErrorCode.NO_FLOWER); return !hasErrors(); @@ -936,12 +937,12 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM private int maxspeed = 0; public void updateModifiers() { - GT_ApiaryModifier mods = new GT_ApiaryModifier(); + final GT_ApiaryModifier mods = new GT_ApiaryModifier(); for (int i = 2; i < 2 + 4; i++) { - ItemStack s = getInputAt(i); + final ItemStack s = getInputAt(i); if (s == null) continue; if (GT_ApiaryUpgrade.isUpgrade(s)) { - GT_ApiaryUpgrade upgrade = GT_ApiaryUpgrade.getUpgrade(s); + final GT_ApiaryUpgrade upgrade = GT_ApiaryUpgrade.getUpgrade(s); upgrade.applyModifiers(mods, s); } } @@ -1124,25 +1125,26 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM .widget(new DrawableWidget() .setDrawable(GT_UITextures.PICTURE_INFORMATION) .setGTTooltip(() -> { - String energyreq = GT_Utility.formatNumbers( + final String energyreq = GT_Utility.formatNumbers( (int) ((float) GT_MetaTileEntity_IndustrialApiary.baseEUtUsage * getEnergyModifier() * getAcceleration()) + getAdditionalEnergyUsage()); - String Temp = StatCollector.translateToLocal( + final String Temp = StatCollector.translateToLocal( getTemperature().getName()); - String Hum = + final String Hum = StatCollector.translateToLocal(getHumidity().getName()); if (getUsedQueen() != null && BeeManager.beeRoot.isMember(getUsedQueen(), EnumBeeType.QUEEN.ordinal())) { - IBee bee = BeeManager.beeRoot.getMember(getUsedQueen()); + final IBee bee = BeeManager.beeRoot.getMember(getUsedQueen()); if (bee.isAnalyzed()) { - IBeeGenome genome = bee.getGenome(); - IBeeModifier mod = BeeManager.beeRoot + final IBeeGenome genome = bee.getGenome(); + final IBeeModifier mod = BeeManager.beeRoot .getBeekeepingMode(getWorld()) .getBeeModifier(); - float tmod = getTerritoryModifier(null, 1f) * mod.getTerritoryModifier(null, 1f); - int[] t = Arrays.stream(genome.getTerritory()) + final float tmod = + getTerritoryModifier(null, 1f) * mod.getTerritoryModifier(null, 1f); + final int[] t = Arrays.stream(genome.getTerritory()) .map(i -> (int) ((float) i * tmod)) .toArray(); return mTooltipCache.getUncachedTooltipData( @@ -1279,7 +1281,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM } private int getAdditionalEnergyUsage() { - int accelerated = getAcceleration(); + final int accelerated = getAcceleration(); int energyusage = 0; if (accelerated == 2) energyusage = 32; else if (accelerated > 2) energyusage = 32 * accelerated << (mSpeed - 2); @@ -1322,10 +1324,10 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM if (aShifthold == 5) return null; if (aShifthold != 0) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); if (aMouseclick > 1) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - ItemStack s = aPlayer.inventory.getItemStack(); + final ItemStack s = aPlayer.inventory.getItemStack(); if (s == null) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - Slot slot = getSlot(aSlotNumber); - ItemStack slotStack = slot.getStack(); + final Slot slot = getSlot(aSlotNumber); + final ItemStack slotStack = slot.getStack(); if (slotStack != null && !GT_Utility.areStacksEqual(slotStack, s)) return null; // super would replace item if (slotStack == null && !slot.isItemValid(s)) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); @@ -1336,23 +1338,23 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM if (max == 0) return null; if (aMouseclick == 1) max = 1; if (max == s.stackSize) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); - ItemStack newStack = s.splitStack(s.stackSize - max); - ItemStack result = super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); + final ItemStack newStack = s.splitStack(s.stackSize - max); + final ItemStack result = super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer); aPlayer.inventory.setItemStack(newStack); return result; } @Override public ItemStack transferStackInSlot(EntityPlayer aPlayer, int aSlotIndex) { - Slot s = getSlot(aSlotIndex); + final Slot s = getSlot(aSlotIndex); if (s == null) return super.transferStackInSlot(aPlayer, aSlotIndex); if (aSlotIndex >= playerInventorySlot) return super.transferStackInSlot(aPlayer, aSlotIndex); - ItemStack aStack = s.getStack(); + final ItemStack aStack = s.getStack(); if (aStack == null) return super.transferStackInSlot(aPlayer, aSlotIndex); if (!GT_ApiaryUpgrade.isUpgrade(aStack)) return super.transferStackInSlot(aPlayer, aSlotIndex); for (int i = playerInventorySlot + 2; i < playerInventorySlot + 2 + 4; i++) { - Slot iSlot = getSlot(i); - ItemStack iStack = iSlot.getStack(); + final Slot iSlot = getSlot(i); + final ItemStack iStack = iSlot.getStack(); if (iStack == null) { if (!iSlot.isItemValid(aStack)) continue; } else { @@ -1361,7 +1363,7 @@ public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicM int max = GT_ApiaryUpgrade.getUpgrade(aStack).getMaxNumber(); if (iStack == null) { max = Math.min(max, aStack.stackSize); - ItemStack newstack = aStack.splitStack(max); + final ItemStack newstack = aStack.splitStack(max); iSlot.putStack(newstack); } else { max = Math.max(0, max - iStack.stackSize); diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java index 0006c8b7d5..5e6651cdad 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java @@ -1,5 +1,6 @@ package gregtech.common.tileentities.machines.multi; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; import static gregtech.api.enums.GT_Values.debugCleanroom; import static gregtech.api.enums.Textures.BlockIcons.*; @@ -45,6 +46,7 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB return new GT_MetaTileEntity_Cleanroom(mName); } + @Override protected GT_Multiblock_Tooltip_Builder createTooltip() { final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); tt.addMachineType("Cleanroom") @@ -104,7 +106,7 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB int mDoorCount = 0; int mHullCount = 0; int mPlascreteCount = 0; - HashMap<String, Integer> otherBlocks = new HashMap<>(); + final HashMap<String, Integer> otherBlocks = new HashMap<>(); boolean doorState = false; this.mUpdate = 100; @@ -112,8 +114,8 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB GT_Log.out.println("Cleanroom: Checking machine"); } for (int i = 1; i < 8; i++) { - Block tBlock = aBaseMetaTileEntity.getBlockOffset(i, 0, 0); - int tMeta = aBaseMetaTileEntity.getMetaIDOffset(i, 0, 0); + final Block tBlock = aBaseMetaTileEntity.getBlockOffset(i, 0, 0); + final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(i, 0, 0); if (tBlock != GregTech_API.sBlockCasings3 || tMeta != 11) { if (tBlock == GregTech_API.sBlockReinforced || tMeta == 2) { x = i; @@ -127,8 +129,8 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB } } for (int i = 1; i < 8; i++) { - Block tBlock = aBaseMetaTileEntity.getBlockOffset(0, 0, i); - int tMeta = aBaseMetaTileEntity.getMetaIDOffset(0, 0, i); + final Block tBlock = aBaseMetaTileEntity.getBlockOffset(0, 0, i); + final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(0, 0, i); if (tBlock != GregTech_API.sBlockCasings3 || tMeta != 11) { if (tBlock == GregTech_API.sBlockReinforced || tMeta == 2) { z = i; @@ -145,8 +147,8 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB for (int i = -x + 1; i < x; i++) { for (int j = -z + 1; j < z; j++) { if (i == 0 && j == 0) continue; - Block tBlock = aBaseMetaTileEntity.getBlockOffset(j, 0, i); - int tMeta = aBaseMetaTileEntity.getMetaIDOffset(j, 0, i); + final Block tBlock = aBaseMetaTileEntity.getBlockOffset(j, 0, i); + final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(j, 0, i); if (tBlock != GregTech_API.sBlockCasings3 && tMeta != 11) { return false; } @@ -154,8 +156,8 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB } for (int i = -1; i > -16; i--) { - Block tBlock = aBaseMetaTileEntity.getBlockOffset(x, i, z); - int tMeta = aBaseMetaTileEntity.getMetaIDOffset(x, i, z); + final Block tBlock = aBaseMetaTileEntity.getBlockOffset(x, i, z); + final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(x, i, z); if (tBlock != GregTech_API.sBlockReinforced || tMeta != 2) { y = i + 1; break; @@ -193,7 +195,7 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB } else if (tBlock == GregTech_API.sBlockReinforced && tMeta == 2) { mPlascreteCount++; } else { - IGregTechTileEntity tTileEntity = + final IGregTechTileEntity tTileEntity = aBaseMetaTileEntity.getIGregTechTileEntityOffset(dX, dY, dZ); if ((!this.addMaintenanceToMachineList(tTileEntity, 210)) && (!this.addEnergyInputToMachineList(tTileEntity, 210))) { @@ -209,7 +211,7 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB mDoorCount++; } else { if (tTileEntity != null) { - IMetaTileEntity aMetaTileEntity = tTileEntity.getMetaTileEntity(); + final IMetaTileEntity aMetaTileEntity = tTileEntity.getMetaTileEntity(); if (aMetaTileEntity == null) { if (debugCleanroom) { GT_Log.out.println("Cleanroom: Missing block? Not a aMetaTileEntity"); @@ -255,9 +257,9 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB return false; } if (mPlascreteCount < 20) return false; - float ratio = (((float) mPlascreteCount) / 100f); + final float ratio = (((float) mPlascreteCount) / 100f); for (Map.Entry<String, Integer> e : otherBlocks.entrySet()) { - ConfigEntry ce = config.get(e.getKey()); + final ConfigEntry ce = config.get(e.getKey()); if (ce.allowedCount > 0) { // count has priority if (e.getValue() > ce.allowedCount) return false; } else if (e.getValue() > ratio * ce.percentage) return false; @@ -268,9 +270,9 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB if (doorState) { this.mEfficiency = Math.max(0, this.mEfficiency - 200); } - for (byte i = 0; i < 6; i++) { - byte t = (byte) Math.max(1, (byte) (15 / (10000f / this.mEfficiency))); - aBaseMetaTileEntity.setInternalOutputRedstoneSignal(i, t); + for (byte tSide : ALL_VALID_SIDES) { + final byte t = (byte) Math.max(1, (byte) (15 / (10000f / this.mEfficiency))); + aBaseMetaTileEntity.setInternalOutputRedstoneSignal(tSide, t); } this.mHeight = -y; return true; @@ -430,7 +432,7 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB public static void loadConfig(Configuration cfg) { if (!cfg.hasCategory(category)) setDefaultConfigValues(cfg); for (ConfigCategory cc : cfg.getCategory(category).getChildren()) { - String name = cc.get("Name").getString(); + final String name = cc.get("Name").getString(); if (cc.containsKey("Count")) { if (cc.containsKey("Meta")) config.put( diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java b/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java index 4ca61fab5f..f7c6181d19 100644 --- a/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java +++ b/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java @@ -16,22 +16,23 @@ public class GT_Loader_MultiTileEntities implements Runnable { "GregTech", "machine", Material.iron, Block.soundTypeMetal, "wrench", 0, 0, 15, true, true); // Disable for now - // aRegistry.create(1000, MultiBlock_Macerator.class) - // .name("Large Macerator") - // .category("Multiblock Controller") - // .setBlock(aMachine) - // .material(Materials.Iron) - // .texture("metalwall") - // .tankCapacity(128000L) - // .register(); + // aRegistry + // .create(1000, MultiBlock_Macerator.class) + // .name("Large Macerator") + // .category("Multiblock Controller") + // .setBlock(aMachine) + // .material(Materials.Iron) + // .texture("metalwall") + // .tankCapacity(128000L) + // .register(); // - // aRegistry.create(18000, MultiBlockPart.class) - // .name("Test Casing") - // .category("Multiblock Casing") - // .setBlock(aMachine) - // .material(Materials.Cobalt) - // .texture("metalwall") - // .register(); - + // aRegistry + // .create(18000, MultiBlockPart.class) + // .name("Test Casing") + // .category("Multiblock Casing") + // .setBlock(aMachine) + // .material(Materials.Cobalt) + // .texture("metalwall") + // .register(); } } diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/fluid_in.png b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_in.png Binary files differnew file mode 100644 index 0000000000..a78a13db69 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_in.png diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/fluid_out.png b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_out.png Binary files differnew file mode 100644 index 0000000000..60aa2fe90a --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_out.png diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/item_in.png b/src/main/resources/assets/gregtech/textures/gui/picture/item_in.png Binary files differnew file mode 100644 index 0000000000..10dd12f753 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/gui/picture/item_in.png diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/item_out.png b/src/main/resources/assets/gregtech/textures/gui/picture/item_out.png Binary files differnew file mode 100644 index 0000000000..831650cb28 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/gui/picture/item_out.png |