From 889e317e5839d7f4c49c4f2e7e9d5f0e5e8dc76c Mon Sep 17 00:00:00 2001 From: Jason Mitchell Date: Sat, 16 Dec 2017 17:04:00 -0800 Subject: Fix for cables disconnecting on chunk unload & load --- .../gregtech/api/metatileentity/BaseMetaTileEntity.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java') diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index 5e36bb624c..e831510152 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -56,6 +56,7 @@ public class BaseMetaTileEntity extends BaseTileEntity implements IGregTechTileE protected int mAverageEUInputIndex = 0, mAverageEUOutputIndex = 0; protected boolean mReleaseEnergy = false; protected int[] mAverageEUInput = new int[]{0, 0, 0, 0, 0}, mAverageEUOutput = new int[]{0, 0, 0, 0, 0}; + private boolean mEnergyStateReady = false; private boolean[] mActiveEUInputs = new boolean[]{false, false, false, false, false, false}, mActiveEUOutputs = new boolean[]{false, false, false, false, false, false}; private byte[] mSidedRedstone = new byte[]{15, 15, 15, 15, 15, 15}; private int[] mCoverSides = new int[]{0, 0, 0, 0, 0, 0}, mCoverData = new int[]{0, 0, 0, 0, 0, 0}, mTimeStatistics = new int[GregTech_API.TICKS_FOR_LAG_AVERAGING]; @@ -392,6 +393,12 @@ public class BaseMetaTileEntity extends BaseTileEntity implements IGregTechTileE issueBlockUpdate(); } + if (mTickTimer > 20) { + // We're ready to tell about our energy state - Only used server side + mEnergyStateReady = true; + } + + if (mTickTimer > 20 && mMetaTileEntity.isElectric()) { mAcceptedAmperes = 0; @@ -968,6 +975,12 @@ public class BaseMetaTileEntity extends BaseTileEntity implements IGregTechTileE return false; } + @Override + public boolean energyStateReady() { + if (!isServerSide()) return true; + else return mEnergyStateReady; + } + @Override public boolean inputEnergyFrom(byte aSide) { if (aSide == 6) return true; -- cgit From 73ba61d809115bdedacedba994cea8c75f72c4a9 Mon Sep 17 00:00:00 2001 From: Antifluxfield Date: Mon, 18 Dec 2017 10:45:11 +0800 Subject: Alternative work & some other improvement --- .../api/metatileentity/BaseMetaPipeEntity.java | 10 +-- .../api/metatileentity/BaseMetaTileEntity.java | 8 +- .../implementations/GT_MetaPipeEntity_Cable.java | 95 +++++----------------- .../implementations/GT_MetaPipeEntity_Fluid.java | 10 ++- .../implementations/GT_MetaPipeEntity_Item.java | 8 +- 5 files changed, 40 insertions(+), 91 deletions(-) (limited to 'src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java') diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java index 5eedc4dafa..f1f7b8d76b 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java @@ -628,11 +628,6 @@ public class BaseMetaPipeEntity extends BaseTileEntity implements IGregTechTileE return false; } - @Override - public boolean energyStateReady() { - return true; - } - @Override public boolean inputEnergyFrom(byte aSide) { return false; @@ -1329,4 +1324,9 @@ public class BaseMetaPipeEntity extends BaseTileEntity implements IGregTechTileE public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider) { mMetaTileEntity.onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider); } + + @Override + public boolean energyStateReady() { + return true; + } } diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index e831510152..fe92f313a7 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -393,12 +393,6 @@ public class BaseMetaTileEntity extends BaseTileEntity implements IGregTechTileE issueBlockUpdate(); } - if (mTickTimer > 20) { - // We're ready to tell about our energy state - Only used server side - mEnergyStateReady = true; - } - - if (mTickTimer > 20 && mMetaTileEntity.isElectric()) { mAcceptedAmperes = 0; @@ -462,6 +456,8 @@ public class BaseMetaTileEntity extends BaseTileEntity implements IGregTechTileE } } } + // We're ready to tell about our energy state - Only used server side + mEnergyStateReady = true; } if (!hasValidMetaTileEntity()) { 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 47e57670d3..1b720c9503 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,6 +1,5 @@ package gregtech.api.metatileentity.implementations; -import static gregtech.api.enums.GT_Values.D1; import cofh.api.energy.IEnergyReceiver; import gregtech.GT_Mod; import gregtech.api.GregTech_API; @@ -15,10 +14,8 @@ import gregtech.api.interfaces.tileentity.IColoredTileEntity; import gregtech.api.interfaces.tileentity.IEnergyConnected; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.BaseMetaTileEntity; import gregtech.api.metatileentity.MetaPipeEntity; import gregtech.api.objects.GT_RenderedTexture; -import gregtech.api.util.GT_Log; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_Utility; import gregtech.common.GT_Client; @@ -300,11 +297,7 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile if ((mCheckConnections || isConnectedAtSide(tSide) || aBaseMetaTileEntity.getCoverBehaviorAtSide(tSide).alwaysLookConnected(tSide, aBaseMetaTileEntity.getCoverIDAtSide(tSide), aBaseMetaTileEntity.getCoverDataAtSide(tSide), aBaseMetaTileEntity) || (tBaseMetaTileEntity != null && tBaseMetaTileEntity.getCoverBehaviorAtSide(uSide).alwaysLookConnected(uSide, tBaseMetaTileEntity.getCoverIDAtSide(uSide), tBaseMetaTileEntity.getCoverDataAtSide(uSide), tBaseMetaTileEntity))) - && connect(tSide) == 0) - { - if(D1 && isConnectedAtSide(tSide)) { - GT_Log.out.println("Was connected - Now disconnecting. CheckConnections: " + mCheckConnections); - } + && connect(tSide) == 0) { disconnect(tSide); } } @@ -347,77 +340,35 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile byte tSide = GT_Utility.getOppositeSide(aSide); TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntityAtSide(aSide); if (tTileEntity != null) { - boolean sAlwaysLookConnected = getBaseMetaTileEntity().getCoverBehaviorAtSide(aSide).alwaysLookConnected(aSide, getBaseMetaTileEntity() - .getCoverIDAtSide(aSide), getBaseMetaTileEntity().getCoverDataAtSide(aSide), getBaseMetaTileEntity()); - boolean sLetEnergyIn = getBaseMetaTileEntity().getCoverBehaviorAtSide(aSide).letsEnergyIn(aSide, getBaseMetaTileEntity() - .getCoverIDAtSide(aSide), getBaseMetaTileEntity().getCoverDataAtSide(aSide), getBaseMetaTileEntity()); - boolean sLetEnergyOut = getBaseMetaTileEntity().getCoverBehaviorAtSide(aSide).letsEnergyOut(aSide, getBaseMetaTileEntity() - .getCoverIDAtSide(aSide), getBaseMetaTileEntity().getCoverDataAtSide(aSide), getBaseMetaTileEntity()); - - if (sAlwaysLookConnected || sLetEnergyIn || sLetEnergyOut) { + if (getBaseMetaTileEntity().getCoverBehaviorAtSide(aSide).alwaysLookConnected(aSide, getBaseMetaTileEntity().getCoverIDAtSide(aSide), getBaseMetaTileEntity().getCoverDataAtSide(aSide), getBaseMetaTileEntity()) + || getBaseMetaTileEntity().getCoverBehaviorAtSide(aSide).letsEnergyIn(aSide, getBaseMetaTileEntity().getCoverIDAtSide(aSide), getBaseMetaTileEntity().getCoverDataAtSide(aSide), getBaseMetaTileEntity()) + || getBaseMetaTileEntity().getCoverBehaviorAtSide(aSide).letsEnergyOut(aSide, getBaseMetaTileEntity().getCoverIDAtSide(aSide), getBaseMetaTileEntity().getCoverDataAtSide(aSide), getBaseMetaTileEntity())) { if (tTileEntity instanceof IColoredTileEntity) { if (getBaseMetaTileEntity().getColorization() >= 0) { byte tColor = ((IColoredTileEntity) tTileEntity).getColorization(); - if (tColor >= 0 && tColor != getBaseMetaTileEntity().getColorization()) { - if(D1) GT_Log.out.println("returning rConnect because of Color? " + rConnect); + if (tColor >= 0 && tColor != getBaseMetaTileEntity().getColorization()) return rConnect; - } } } - - boolean tEnergyIsConnected = tTileEntity instanceof IEnergyConnected; - if (tEnergyIsConnected && GT_Mod.gregtechproxy.gt6Cable && !((IEnergyConnected )tTileEntity).energyStateReady()) { - // Server side EnergyConnected tile entities aren't ready to report their energy states for about 20 ticks - // the old GT5 style cables would always keep trying to reconnect, but the GT6 style cables only try when - // placed, forced, or when reloaded (once). Return -1 (and don't disconnect) until the tile entity - // is ready to report it's state - rConnect = -1; - } - boolean tEnergyInOrOut = (((IEnergyConnected) tTileEntity).inputEnergyFrom(tSide) || ((IEnergyConnected) tTileEntity).outputsEnergyTo(tSide)); - - boolean tIsTileEntity = tTileEntity instanceof IGregTechTileEntity; - boolean tIsTileEntityCable = tIsTileEntity && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() instanceof IMetaTileEntityCable; - boolean tAlwaysLookConnected = tIsTileEntity && ((IGregTechTileEntity) tTileEntity).getCoverBehaviorAtSide(tSide).alwaysLookConnected(tSide, ((IGregTechTileEntity) tTileEntity) - .getCoverIDAtSide(tSide), ((IGregTechTileEntity) tTileEntity).getCoverDataAtSide(tSide), ((IGregTechTileEntity) tTileEntity)); - boolean tLetEnergyIn = tIsTileEntity && ((IGregTechTileEntity) tTileEntity).getCoverBehaviorAtSide(tSide).letsEnergyIn(tSide, ((IGregTechTileEntity) tTileEntity) - .getCoverIDAtSide(tSide), ((IGregTechTileEntity) tTileEntity).getCoverDataAtSide(tSide), ((IGregTechTileEntity) tTileEntity)); - boolean tLetEnergyOut = tIsTileEntity && ((IGregTechTileEntity) tTileEntity).getCoverBehaviorAtSide(tSide).letsEnergyOut(tSide, ((IGregTechTileEntity) tTileEntity) - .getCoverIDAtSide(tSide), ((IGregTechTileEntity) tTileEntity).getCoverDataAtSide(tSide), ((IGregTechTileEntity) tTileEntity)); - - boolean tIsEnergySink = tTileEntity instanceof IEnergySink; - boolean tSinkAcceptsEnergyFromSide = tIsEnergySink && ((IEnergySink) tTileEntity).acceptsEnergyFrom((TileEntity) getBaseMetaTileEntity(), ForgeDirection.getOrientation(tSide)); - - boolean tIsEnergyReceiver = tTileEntity instanceof IEnergyReceiver; - boolean tEnergyReceiverCanAcceptFromSide = tIsEnergyReceiver && ((IEnergyReceiver) tTileEntity).canConnectEnergy(ForgeDirection.getOrientation(tSide)); - - if ( (tEnergyIsConnected && tEnergyInOrOut) - || (tIsTileEntity && tIsTileEntityCable && (tAlwaysLookConnected || tLetEnergyIn || tLetEnergyOut) ) - || (tIsEnergySink && tSinkAcceptsEnergyFromSide) - || (GregTech_API.mOutputRF && tIsEnergyReceiver && tEnergyReceiverCanAcceptFromSide) - /*|| (tTileEntity instanceof IEnergyEmitter && ((IEnergyEmitter)tTileEntity).emitsEnergyTo((TileEntity)getBaseMetaTileEntity(), ForgeDirection.getOrientation(tSide)))*/) - { + if ((tTileEntity instanceof IEnergyConnected && (((IEnergyConnected) tTileEntity).inputEnergyFrom(tSide) || ((IEnergyConnected) tTileEntity).outputsEnergyTo(tSide))) + || (tTileEntity instanceof IGregTechTileEntity && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() instanceof IMetaTileEntityCable + && (((IGregTechTileEntity) tTileEntity).getCoverBehaviorAtSide(tSide).alwaysLookConnected(tSide, ((IGregTechTileEntity) tTileEntity).getCoverIDAtSide(tSide), ((IGregTechTileEntity) tTileEntity).getCoverDataAtSide(tSide), ((IGregTechTileEntity) tTileEntity)) + || ((IGregTechTileEntity) tTileEntity).getCoverBehaviorAtSide(tSide).letsEnergyIn(tSide, ((IGregTechTileEntity) tTileEntity).getCoverIDAtSide(tSide), ((IGregTechTileEntity) tTileEntity).getCoverDataAtSide(tSide), ((IGregTechTileEntity) tTileEntity)) + || ((IGregTechTileEntity) tTileEntity).getCoverBehaviorAtSide(tSide).letsEnergyOut(tSide, ((IGregTechTileEntity) tTileEntity).getCoverIDAtSide(tSide), ((IGregTechTileEntity) tTileEntity).getCoverDataAtSide(tSide), ((IGregTechTileEntity) tTileEntity)))) + || (tTileEntity instanceof IEnergySink && ((IEnergySink) tTileEntity).acceptsEnergyFrom((TileEntity) getBaseMetaTileEntity(), ForgeDirection.getOrientation(tSide))) + || (GregTech_API.mOutputRF && tTileEntity instanceof IEnergyReceiver && ((IEnergyReceiver) tTileEntity).canConnectEnergy(ForgeDirection.getOrientation(tSide))) + /*|| (tTileEntity instanceof IEnergyEmitter && ((IEnergyEmitter)tTileEntity).emitsEnergyTo((TileEntity)getBaseMetaTileEntity(), ForgeDirection.getOrientation(tSide)))*/) { rConnect = 1; } - - if(D1 && rConnect == 0) { - GT_Log.out.println("Tile Debug: tEnergyConnected:" + tEnergyIsConnected + " tEnergyInOrOut:" +tEnergyInOrOut); - GT_Log.out.println("\t tIsTileEntity:" + tIsTileEntity + " tIsTileEntityCable:" + tIsTileEntityCable + - " AlwaysLookConnected:" + tAlwaysLookConnected + " LetEnergyIn:" + tLetEnergyIn + " LetEnergyOut:" + tLetEnergyOut); - GT_Log.out.println("\t tIsEnergySink:" + tIsEnergySink + " tSinkAcceptsEnergyFromSide:" + tSinkAcceptsEnergyFromSide ); - GT_Log.out.println("\t tIsEnergyReceiver:" + tIsEnergyReceiver + " tEnergyReceiverCanAcceptFromSide:" + tEnergyReceiverCanAcceptFromSide ); - } - } - if(D1 && rConnect == 0) GT_Log.out.println("Self - AlwaysLookConnected:" + sAlwaysLookConnected + " LetEnergyIn:" + sLetEnergyIn + " LetEnergyOut:" + sLetEnergyOut); - - - } else if (getBaseMetaTileEntity().getOffsetX(aSide, 1) >> 4 != getBaseMetaTileEntity().getXCoord() >> 4 - || getBaseMetaTileEntity().getOffsetZ(aSide, 1) >> 4 != getBaseMetaTileEntity().getZCoord() >> 4) - { - // if chunk unloaded - rConnect = -1; - } else if(D1) { - GT_Log.out.println("tile entity NULL"); + } + if (rConnect == 0) { + if (!getBaseMetaTileEntity().getWorld().getChunkProvider().chunkExists(getBaseMetaTileEntity().getOffsetX(aSide, 1) >> 4, getBaseMetaTileEntity().getOffsetZ(aSide, 1) >> 4)) { // if chunk unloaded + rConnect = -1; + } + if (tTileEntity instanceof IEnergyConnected && !((IEnergyConnected) tTileEntity).energyStateReady()) { //Energy state not ready + rConnect = -1; + } } if (rConnect > 0) { super.connect(aSide); @@ -459,10 +410,8 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile @Override public void loadNBTData(NBTTagCompound aNBT) { if (GT_Mod.gregtechproxy.gt6Cable) { - if (!aNBT.hasKey("mConnections")) { - if(D1) GT_Log.out.println("Loading a cable - No connections found, so checking them."); + if (!aNBT.hasKey("mConnections")) mCheckConnections = true; - } mConnections = aNBT.getByte("mConnections"); } } 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 f330aa5eef..e3e9531d97 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 @@ -392,10 +392,12 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { } } } - } else if (getBaseMetaTileEntity().getOffsetX(aSide, 1) >> 4 != getBaseMetaTileEntity().getXCoord() >> 4 - || getBaseMetaTileEntity().getOffsetZ(aSide, 1) >> 4 != getBaseMetaTileEntity().getZCoord() >> 4) { // if chunk unloaded - rConnect = -1; } + if (rConnect == 0) { + if (!getBaseMetaTileEntity().getWorld().getChunkProvider().chunkExists(getBaseMetaTileEntity().getOffsetX(aSide, 1) >> 4, getBaseMetaTileEntity().getOffsetZ(aSide, 1) >> 4)) { // if chunk unloaded + rConnect = -1; + } + } if (rConnect > 0) { if (GT_Mod.gregtechproxy.gt6Pipe && tFluidPipe != null) { if ((mDisableInput & (1 << aSide)) == 0 || (tFluidPipe.mDisableInput & (1 << tSide)) == 0) { @@ -600,7 +602,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { } public boolean isInputDisabledAtSide(int aSide) { - return (mDisableInput & (1 << aSide)) != 0;//... if not zero then it is + return (mDisableInput & (1 << aSide)) != 0; } @Override 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 9ce470859b..f1ac1252df 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 @@ -258,10 +258,12 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE } } } - } else if (getBaseMetaTileEntity().getOffsetX(aSide, 1) >> 4 != getBaseMetaTileEntity().getXCoord() >> 4 - || getBaseMetaTileEntity().getOffsetZ(aSide, 1) >> 4 != getBaseMetaTileEntity().getZCoord() >> 4) { // if chunk unloaded - rConnect = -1; } + if (rConnect == 0) { + if (!getBaseMetaTileEntity().getWorld().getChunkProvider().chunkExists(getBaseMetaTileEntity().getOffsetX(aSide, 1) >> 4, getBaseMetaTileEntity().getOffsetZ(aSide, 1) >> 4)) { // if chunk unloaded + rConnect = -1; + } + } if (rConnect > 0) { super.connect(aSide); } -- cgit