diff options
author | Jason Mitchell <mitchej@gmail.com> | 2022-04-18 11:16:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-18 20:16:31 +0200 |
commit | 44a1027dfa51af1864364c391e67686590ce347f (patch) | |
tree | 5f2fa25724841885d9e0cb721a7806812aca8016 /src/main/java/gregtech/api/metatileentity | |
parent | bb4cec9a73ec6c50199de6c48119ddd85e23b013 (diff) | |
download | GT5-Unofficial-44a1027dfa51af1864364c391e67686590ce347f.tar.gz GT5-Unofficial-44a1027dfa51af1864364c391e67686590ce347f.tar.bz2 GT5-Unofficial-44a1027dfa51af1864364c391e67686590ce347f.zip |
Multitileentity precursor (#963)
* Refactors
* Refactor CoverableTileEntity a bit more, pull out a CommonMetaTileEntity
* Add an IDebugableTileEntity interface instead of checking various subclasses
* Move more redstone related things to CoverableTileEntity
* Add IGTENet
* Final and dead code removal
* Address a few comments, fix a few comments, remove some more dead code, and add some more finals.
* fix bad rebase
Diffstat (limited to 'src/main/java/gregtech/api/metatileentity')
11 files changed, 594 insertions, 586 deletions
diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java index f10066edf8..fc67ec1b55 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java @@ -11,6 +11,7 @@ import java.util.UUID; import gregtech.GT_Mod; import gregtech.api.GregTech_API; +import gregtech.api.enums.GT_Values; import gregtech.api.enums.Textures; import gregtech.api.enums.Textures.BlockIcons; import gregtech.api.graphs.Lock; @@ -19,6 +20,7 @@ import gregtech.api.graphs.paths.NodePath; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IConnectable; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IDebugableTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IPipeRenderedTileEntity; import gregtech.api.net.GT_Packet_TileEntity; @@ -54,14 +56,13 @@ import static gregtech.api.metatileentity.BaseMetaTileEntity.COVER_DATA_NBT_KEYS * <p/> * This is the main TileEntity for EVERYTHING. */ -public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements IGregTechTileEntity, IPipeRenderedTileEntity { +public class BaseMetaPipeEntity extends CommonMetaTileEntity implements IGregTechTileEntity, IPipeRenderedTileEntity, IDebugableTileEntity { public byte mConnections = IConnectable.NO_CONNECTION; protected MetaPipeEntity mMetaTileEntity; - private byte[] mSidedRedstone = new byte[]{0, 0, 0, 0, 0, 0}; private int[] mTimeStatistics = new int[GregTech_API.TICKS_FOR_LAG_AVERAGING]; - private boolean mInventoryChanged = false, mWorkUpdate = false, mWorks = true, mNeedsUpdate = true, mNeedsBlockUpdate = true, mSendClientData = false; + private boolean mWorkUpdate = false, mWorks = true; private final boolean mCheckConnections = false; - private byte mColor = 0, oColor = 0, mStrongRedstone = 0, oStrongRedstone = 0, oRedstoneData = 63, oTextureData = 0, oUpdateData = 0, mLagWarningCount = 0; + private byte mColor = 0, oColor = 0, oStrongRedstone = 0, oRedstoneData = 63, oTextureData = 0, oUpdateData = 0, mLagWarningCount = 0; private int oX = 0, oY = 0, oZ = 0, mTimeStatisticsIndex = 0; protected Node node; protected NodePath nodePath; @@ -119,20 +120,16 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I try { super.writeToNBT(aNBT); } catch (Throwable e) { - GT_Log.err.println("Encountered CRITICAL ERROR while saving MetaTileEntity, the Chunk whould've been corrupted by now, but I prevented that. Please report immediately to GregTech Intergalactical!!!"); - e.printStackTrace(GT_Log.err); + GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity", e); } try { aNBT.setInteger("mID", mID); - saveCoverNBT(aNBT); - aNBT.setByteArray("mRedstoneSided", mSidedRedstone); + writeCoverNBT(aNBT, false); aNBT.setByte("mConnections", mConnections); aNBT.setByte("mColor", mColor); - aNBT.setByte("mStrongRedstone", mStrongRedstone); aNBT.setBoolean("mWorks", !mWorks); } catch (Throwable e) { - GT_Log.err.println("Encountered CRITICAL ERROR while saving MetaTileEntity, the Chunk would've been corrupted by now, but I prevented that. Please report immediately to GregTech Intergalactical!!!"); - e.printStackTrace(GT_Log.err); + GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity", e); } saveMetaTileNBT(aNBT); } @@ -152,15 +149,13 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I } else { if (aID <= 0) mID = (short) aNBT.getInteger("mID"); else mID = aID; - mSidedRedstone = aNBT.getByteArray("mRedstoneSided"); mConnections = aNBT.getByte("mConnections"); mColor = aNBT.getByte("mColor"); - mStrongRedstone = aNBT.getByte("mStrongRedstone"); mWorks = !aNBT.getBoolean("mWorks"); if (mSidedRedstone.length != 6) mSidedRedstone = new byte[]{0, 0, 0, 0, 0, 0}; - loadCoverNBT(aNBT); + readCoverNBT(aNBT); loadMetaTileNBT(aNBT); } } @@ -206,7 +201,7 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I if (!doCoverThings()) return; - byte oldConnections = mConnections; + final byte oldConnections = mConnections; // Mask-out connection direction bits to keep only Foam related connections mConnections = (byte) (mMetaTileEntity.mConnections | (mConnections & ~IConnectable.CONNECTED_ALL)); // If foam not hardened, tries roll chance to harden @@ -266,7 +261,7 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I tTime = System.nanoTime() - tTime; if (mTimeStatistics.length > 0) mTimeStatistics[mTimeStatisticsIndex = (mTimeStatisticsIndex + 1) % mTimeStatistics.length] = (int) tTime; - if (tTime > 0 && tTime > (GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING*1000000) && mTickTimer > 1000 && getMetaTileEntity().doTickProfilingMessageDuringThisTick() && mLagWarningCount++ < 10) + if (tTime > 0 && tTime > (GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING* 1000000L) && mTickTimer > 1000 && getMetaTileEntity().doTickProfilingMessageDuringThisTick() && mLagWarningCount++ < 10) GT_FML_LOGGER.warn("WARNING: Possible Lag Source at ["+xCoord+","+yCoord+","+zCoord+"] in Dimension "+worldObj.provider.dimensionId+" with "+tTime+" ns caused by an instance of "+getMetaTileEntity().getClass()); } @@ -289,12 +284,6 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I sendCoverDataIfNeeded(); } - @Override - public Packet getDescriptionPacket() { - issueClientUpdate(); - return null; - } - public final void receiveMetaTileEntityData(short aID, int aCover0, int aCover1, int aCover2, int aCover3, int aCover4, int aCover5, byte aTextureData, byte aUpdateData, byte aRedstoneData, byte aColorData) { issueTextureUpdate(); if (aID > 0 && mID != aID) { @@ -309,10 +298,10 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I setCoverIDAtSide((byte) 4, aCover4); setCoverIDAtSide((byte) 5, aCover5); - receiveClientEvent(MetaTileClientEvents.CHANGE_COMMON_DATA, aTextureData); - receiveClientEvent(MetaTileClientEvents.CHANGE_CUSTOM_DATA, aUpdateData); - receiveClientEvent(MetaTileClientEvents.CHANGE_COLOR, aColorData); - receiveClientEvent(MetaTileClientEvents.CHANGE_REDSTONE_OUTPUT, aRedstoneData); + receiveClientEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, aTextureData); + receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aUpdateData); + receiveClientEvent(GregTechTileClientEvents.CHANGE_COLOR, aColorData); + receiveClientEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, aRedstoneData); } @Override @@ -323,25 +312,24 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I try { mMetaTileEntity.receiveClientEvent((byte) aEventID, (byte) aValue); } catch (Throwable e) { - GT_Log.err.println("Encountered Exception while receiving Data from the Server, the Client should've been crashed by now, but I prevented that. Please report immediately to GregTech Intergalactical!!!"); - e.printStackTrace(GT_Log.err); + GT_FML_LOGGER.error("Encountered Exception while receiving Data from the Server", e); } } if (isClientSide()) { issueTextureUpdate(); switch (aEventID) { - case MetaTileClientEvents.CHANGE_COMMON_DATA: + case GregTechTileClientEvents.CHANGE_COMMON_DATA: mConnections = (byte) aValue; break; - case MetaTileClientEvents.CHANGE_CUSTOM_DATA: + case GregTechTileClientEvents.CHANGE_CUSTOM_DATA: if (hasValidMetaTileEntity()) mMetaTileEntity.onValueUpdate((byte) aValue); break; - case MetaTileClientEvents.CHANGE_COLOR: + case GregTechTileClientEvents.CHANGE_COLOR: if (aValue > 16 || aValue < 0) aValue = 0; mColor = (byte) aValue; break; - case MetaTileClientEvents.CHANGE_REDSTONE_OUTPUT: + case GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT: mSidedRedstone[0] = (byte) ((aValue & 1) == 1 ? 15 : 0); mSidedRedstone[1] = (byte) ((aValue & 2) == 2 ? 15 : 0); mSidedRedstone[2] = (byte) ((aValue & 4) == 4 ? 15 : 0); @@ -349,15 +337,15 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I mSidedRedstone[4] = (byte) ((aValue & 16) == 16 ? 15 : 0); mSidedRedstone[5] = (byte) ((aValue & 32) == 32 ? 15 : 0); break; - case MetaTileClientEvents.DO_SOUND: + case GregTechTileClientEvents.DO_SOUND: if (hasValidMetaTileEntity() && mTickTimer > 20) mMetaTileEntity.doSound((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); break; - case MetaTileClientEvents.START_SOUND_LOOP: + case GregTechTileClientEvents.START_SOUND_LOOP: if (hasValidMetaTileEntity() && mTickTimer > 20) mMetaTileEntity.startSoundLoop((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); break; - case MetaTileClientEvents.STOP_SOUND_LOOP: + case GregTechTileClientEvents.STOP_SOUND_LOOP: if (hasValidMetaTileEntity() && mTickTimer > 20) mMetaTileEntity.stopSoundLoop((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); break; @@ -366,8 +354,9 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I return true; } + @Override public ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aLogLevel) { - ArrayList<String> tList = new ArrayList<String>(); + final ArrayList<String> tList = new ArrayList<>(); if (aLogLevel > 2) { tList.add("Meta-ID: " + EnumChatFormatting.BLUE+ mID +EnumChatFormatting.RESET + (hasValidMetaTileEntity() ? EnumChatFormatting.GREEN+" valid"+EnumChatFormatting.RESET : EnumChatFormatting.RED+" invalid"+EnumChatFormatting.RESET) + (mMetaTileEntity == null ? EnumChatFormatting.RED+" MetaTileEntity == null!"+EnumChatFormatting.RESET : " ")); } @@ -395,52 +384,11 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I } @Override - public void issueTextureUpdate() { - mNeedsUpdate = true; - } - - @Override - public void issueBlockUpdate() { - mNeedsBlockUpdate = true; - } - - @Override - public void issueClientUpdate() { - mSendClientData = true; - } - - @Override - public void issueCoverUpdate(byte aSide) { - super.issueCoverUpdate(aSide); - issueClientUpdate(); - } - - @Override - public byte getStrongestRedstone() { - return (byte) Math.max(getInternalInputRedstoneSignal((byte) 0), Math.max(getInternalInputRedstoneSignal((byte) 1), Math.max(getInternalInputRedstoneSignal((byte) 2), Math.max(getInternalInputRedstoneSignal((byte) 3), Math.max(getInternalInputRedstoneSignal((byte) 4), getInternalInputRedstoneSignal((byte) 5)))))); - } - - @Override - public boolean getRedstone() { - return getRedstone((byte) 0) || getRedstone((byte) 1) || getRedstone((byte) 2) || getRedstone((byte) 3) || getRedstone((byte) 4) || getRedstone((byte) 5); - } - - @Override - public boolean getRedstone(byte aSide) { - return getInternalInputRedstoneSignal(aSide) > 0; - } - - @Override public boolean isGivingInformation() { if (canAccessData()) return mMetaTileEntity.isGivingInformation(); return false; } - @Override - public boolean isValidFacing(byte aSide) { - if (canAccessData()) return mMetaTileEntity.isFacingValid(aSide); - return false; - } @Override public byte getBackFacing() { @@ -676,23 +624,6 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I } @Override - public boolean increaseStoredSteam(long aEnergy, boolean aIgnoreTooMuchEnergy) { - return false; - } - - @Override - public String[] getDescription() { - if (canAccessData()) return mMetaTileEntity.getDescription(); - return new String[0]; - } - - @Override - public boolean isValidSlot(int aIndex) { - if (canAccessData()) return mMetaTileEntity.isValidSlot(aIndex); - return false; - } - - @Override public long getUniversalEnergyStored() { return Math.max(getStoredEU(), getStoredSteam()); } @@ -712,15 +643,6 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I return 0; } - @Override - public long getStoredSteam() { - return 0; - } - - @Override - public long getSteamCapacity() { - return 0; - } @Override public ITexture[] getTexture(Block aBlock, byte aSide) { @@ -764,9 +686,6 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I return mMetaTileEntity != null && mMetaTileEntity.getBaseMetaTileEntity() == this; } - protected boolean canAccessData() { - return hasValidMetaTileEntity() && !isDead; - } @Override public void doExplosion(long aAmount) { @@ -935,8 +854,7 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I return handled; } } catch (Throwable e) { - GT_Log.err.println("Encountered Exception while rightclicking TileEntity, the Game should've crashed now, but I prevented that. Please report immediately to GregTech Intergalactical!!!"); - e.printStackTrace(GT_Log.err); + GT_FML_LOGGER.error("Encountered Exception while right clicking TileEntity", e); } return false; @@ -947,8 +865,7 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I try { if (aPlayer != null && hasValidMetaTileEntity()) mMetaTileEntity.onLeftclick(this, aPlayer); } catch (Throwable e) { - GT_Log.err.println("Encountered Exception while leftclicking TileEntity, the Game should've crashed now, but I prevented that. Please report immediately to GregTech Intergalactical!!!"); - e.printStackTrace(GT_Log.err); + GT_FML_LOGGER.error("Encountered Exception while left clicking TileEntity", e); } } @@ -988,7 +905,7 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I 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); - return new int[0]; + return GT_Values.emptyIntArray; } /** @@ -1013,36 +930,6 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I } @Override - public byte getInternalInputRedstoneSignal(byte aSide) { - return (byte) (getCoverBehaviorAtSideNew(aSide).getRedstoneInput(aSide, getInputRedstoneSignal(aSide), getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this) & 15); - } - - @Override - public byte getInputRedstoneSignal(byte aSide) { - return (byte) (worldObj.getIndirectPowerLevelTo(getOffsetX(aSide, 1), getOffsetY(aSide, 1), getOffsetZ(aSide, 1), aSide) & 15); - } - - @Override - public byte getOutputRedstoneSignal(byte aSide) { - return (byte) (getCoverBehaviorAtSideNew(aSide).manipulatesSidedRedstoneOutput(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this) || (getCoverBehaviorAtSideNew(aSide).letsRedstoneGoOut(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) ? mSidedRedstone[aSide] & 15 : 0); - } - - @Override - public void setInternalOutputRedstoneSignal(byte aSide, byte aStrength) { - if (!getCoverBehaviorAtSideNew(aSide).manipulatesSidedRedstoneOutput(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) - setOutputRedstoneSignal(aSide, aStrength); - } - - @Override - public void setOutputRedstoneSignal(byte aSide, byte aStrength) { - aStrength = (byte) Math.min(Math.max(0, aStrength), 15); - if (aSide >= 0 && aSide < 6 && mSidedRedstone[aSide] != aStrength) { - mSidedRedstone[aSide] = aStrength; - issueBlockUpdate(); - } - } - - @Override public boolean isSteamEngineUpgradable() { return isUpgradable() && !hasSteamEngineUpgrade() && getSteamCapacity() > 0; } @@ -1062,13 +949,8 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I } @Override - public boolean hasInventoryBeenModified() { - return mInventoryChanged; - } - - @Override public void setGenericRedstoneOutput(boolean aOnOff) { - // + // Do nothing } @Override @@ -1132,17 +1014,6 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I } @Override - public byte getStrongOutputRedstoneSignal(byte aSide) { - return aSide >= 0 && aSide < 6 && (mStrongRedstone & (1 << aSide)) != 0 ? (byte) (mSidedRedstone[aSide] & 15) : 0; - } - - @Override - public void setStrongOutputRedstoneSignal(byte aSide, byte aStrength) { - mStrongRedstone |= (1 << aSide); - setOutputRedstoneSignal(aSide, aStrength); - } - - @Override public ItemStack decrStackSize(int aIndex, int aAmount) { if (canAccessData()) { mInventoryChanged = true; @@ -1244,11 +1115,6 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I } @Override - public boolean isInvalidTileEntity() { - return isInvalid(); - } - - @Override public boolean addStackToSlot(int aIndex, ItemStack aStack) { if (GT_Utility.isStackInvalid(aStack)) return true; if (aIndex < 0 || aIndex >= getSizeInventory()) return false; @@ -1333,12 +1199,6 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I return mConnections; } - @Override - public void markDirty() { - super.markDirty(); - mInventoryChanged = true; - } - public void onNeighborBlockChange(int aX, int aY, int aZ) { if (canAccessData()) { final IMetaTileEntity meta = getMetaTileEntity(); diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index 78d73d6a51..5d62a112aa 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -15,8 +15,10 @@ import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; import com.gtnewhorizon.structurelib.alignment.constructable.IConstructableProvider; import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; import cpw.mods.fml.common.Optional; +import cpw.mods.fml.relauncher.ReflectionHelper; import gregtech.GT_Mod; import gregtech.api.GregTech_API; +import gregtech.api.enums.GT_Values; import gregtech.api.enums.ItemList; import gregtech.api.enums.Textures; import gregtech.api.graphs.GenerateNodeMap; @@ -24,17 +26,16 @@ import gregtech.api.graphs.GenerateNodeMapPower; import gregtech.api.graphs.Node; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IDebugableTileEntity; import gregtech.api.interfaces.tileentity.IEnergyConnected; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IGregtechWailaProvider; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Transformer; import gregtech.api.net.GT_Packet_TileEntity; import gregtech.api.objects.GT_ItemStack; import gregtech.api.util.*; import gregtech.common.GT_Pollution; -import gregtech.crossmod.GregtechWailaDataProvider; import ic2.api.Direction; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -47,7 +48,6 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.Packet; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -63,6 +63,7 @@ import javax.annotation.Nullable; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.UUID; @@ -79,7 +80,7 @@ import static gregtech.api.objects.XSTR.XSTR_INSTANCE; @Optional.InterfaceList(value = { @Optional.Interface(iface = "appeng.api.networking.security.IActionHost", modid = "appliedenergistics2", striprefs = true), @Optional.Interface(iface = "appeng.me.helpers.IGridProxyable", modid = "appliedenergistics2", striprefs = true)}) -public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements IGregTechTileEntity, IActionHost, IGridProxyable, IAlignmentProvider, IConstructableProvider, IGregtechWailaProvider { +public class BaseMetaTileEntity extends CommonMetaTileEntity implements IGregTechTileEntity, IActionHost, IGridProxyable, IAlignmentProvider, IConstructableProvider, IDebugableTileEntity, IGregtechWailaProvider { protected MetaTileEntity mMetaTileEntity; protected long mStoredEnergy = 0, mStoredSteam = 0; protected int mAverageEUInputIndex = 0, mAverageEUOutputIndex = 0; @@ -87,12 +88,11 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I protected long[] mAverageEUInput = new long[]{0, 0, 0, 0, 0}, mAverageEUOutput = new long[]{0, 0, 0, 0, 0}; private final boolean[] mActiveEUInputs = new boolean[]{false, false, false, false, false, false}; private final boolean[] mActiveEUOutputs = new boolean[]{false, false, false, false, false, false}; - private byte[] mSidedRedstone = new byte[]{15, 15, 15, 15, 15, 15}; private final int[] mTimeStatistics = new int[GregTech_API.TICKS_FOR_LAG_AVERAGING]; private boolean mHasEnoughEnergy = true, mRunningThroughTick = false, mInputDisabled = false, mOutputDisabled = false, mMuffler = false, mLockUpgrade = false; - private boolean mActive = false, mRedstone = false, mWorkUpdate = false, mSteamConverter = false, mInventoryChanged = false, mWorks = true, mNeedsUpdate = true; - private boolean mNeedsBlockUpdate = true, mSendClientData = false, oRedstone = false; - private byte mColor = 0, oColor = 0, oStrongRedstone = 0, mStrongRedstone = 0, oRedstoneData = 63, oTextureData = 0, oUpdateData = 0, oTexturePage=0; + private boolean mActive = false, mWorkUpdate = false, mSteamConverter = false, mWorks = true; + private boolean oRedstone = false; + private byte mColor = 0, oColor = 0, oStrongRedstone = 0, oRedstoneData = 63, oTextureData = 0, oUpdateData = 0, oTexturePage=0; private byte oLightValueClient = -1, oLightValue = -1, mLightValue = 0, mOtherUpgrades = 0, mFacing = 0, oFacing = 0, mWorkData = 0; private int mDisplayErrorCode = 0, oX = 0, oY = 0, oZ = 0, mTimeStatisticsIndex = 0, mLagWarningCount = 0; private long oOutput = 0, mAcceptedAmperes = Long.MAX_VALUE; @@ -105,25 +105,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I public boolean mWasShutdown = false; - private static final Field ENTITY_ITEM_HEALTH_FIELD; - static - { - Field f = null; - - try { - f = EntityItem.class.getDeclaredField("field_70291_e"); - f.setAccessible(true); - } catch (Exception e1) { - try { - f = EntityItem.class.getDeclaredField("health"); - f.setAccessible(true); - } catch (Exception e2) { - e1.printStackTrace(); - e2.printStackTrace(); - } - } - ENTITY_ITEM_HEALTH_FIELD = f; - } + private static final Field ENTITY_ITEM_HEALTH_FIELD = ReflectionHelper.findField(EntityItem.class, "health", "field_70291_e"); public BaseMetaTileEntity() { } @@ -133,20 +115,17 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I try { super.writeToNBT(aNBT); } catch (Throwable e) { - GT_Log.err.println("Encountered CRITICAL ERROR while saving MetaTileEntity."); - e.printStackTrace(GT_Log.err); + GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity.", e); } try { aNBT.setInteger("mID", mID); aNBT.setLong("mStoredSteam", mStoredSteam); aNBT.setLong("mStoredEnergy", mStoredEnergy); - saveCoverNBT(aNBT); - aNBT.setByteArray("mRedstoneSided", mSidedRedstone); + writeCoverNBT(aNBT, false); aNBT.setByte("mColor", mColor); aNBT.setByte("mLightValue", mLightValue); aNBT.setByte("mOtherUpgrades", mOtherUpgrades); aNBT.setByte("mWorkData", mWorkData); - aNBT.setByte("mStrongRedstone", mStrongRedstone); aNBT.setShort("mFacing", mFacing); aNBT.setString("mOwnerName", mOwnerName); aNBT.setString("mOwnerUuid", mOwnerUuid == null ? "" : mOwnerUuid.toString()); @@ -154,15 +133,13 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I aNBT.setBoolean("mMuffler", mMuffler); aNBT.setBoolean("mSteamConverter", mSteamConverter); aNBT.setBoolean("mActive", mActive); - aNBT.setBoolean("mRedstone", mRedstone); aNBT.setBoolean("mWorks", !mWorks); aNBT.setBoolean("mInputDisabled", mInputDisabled); aNBT.setBoolean("mOutputDisabled", mOutputDisabled); aNBT.setTag("GT.CraftingComponents", mRecipeStuff); aNBT.setInteger("nbtVersion", GT_Mod.TOTAL_VERSION); } catch (Throwable e) { - GT_Log.err.println("Encountered CRITICAL ERROR while saving MetaTileEntity."); - e.printStackTrace(GT_Log.err); + GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity.", e); } saveMetaTileNBT(aNBT); } @@ -188,7 +165,6 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I mColor = aNBT.getByte("mColor"); mLightValue = aNBT.getByte("mLightValue"); mWorkData = aNBT.getByte("mWorkData"); - mStrongRedstone = aNBT.getByte("mStrongRedstone"); mFacing = oFacing = (byte) aNBT.getShort("mFacing"); mOwnerName = aNBT.getString("mOwnerName"); try { @@ -200,23 +176,14 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I mMuffler = aNBT.getBoolean("mMuffler"); mSteamConverter = aNBT.getBoolean("mSteamConverter"); mActive = aNBT.getBoolean("mActive"); - mRedstone = aNBT.getBoolean("mRedstone"); mWorks = !aNBT.getBoolean("mWorks"); mInputDisabled = aNBT.getBoolean("mInputDisabled"); mOutputDisabled = aNBT.getBoolean("mOutputDisabled"); mOtherUpgrades = (byte) (aNBT.getByte("mOtherUpgrades") + aNBT.getByte("mBatteries") + aNBT.getByte("mLiBatteries")); - mSidedRedstone = aNBT.getByteArray("mRedstoneSided"); - mRecipeStuff = aNBT.getCompoundTag("GT.CraftingComponents"); - int nbtVersion = aNBT.getInteger("nbtVersion"); - - if (mSidedRedstone.length != 6) { - if (hasValidMetaTileEntity() && mMetaTileEntity.hasSidedRedstoneOutputBehavior()) { - mSidedRedstone = new byte[]{0, 0, 0, 0, 0, 0}; - } - else mSidedRedstone = new byte[]{15, 15, 15, 15, 15, 15}; - } - loadCoverNBT(aNBT); + mRecipeStuff = aNBT.getCompoundTag("GT.CraftingComponents"); + final int nbtVersion = aNBT.getInteger("nbtVersion"); + readCoverNBT(aNBT); loadMetaTileNBT(aNBT); } @@ -263,8 +230,8 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I mRunningThroughTick = true; long tTime = System.nanoTime(); - boolean aSideServer = isServerSide(); - boolean aSideClient = isClientSide(); + final boolean aSideServer = isServerSide(); + final boolean aSideClient = isClientSide(); try { if (hasValidMetaTileEntity()) { @@ -373,17 +340,17 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I if (mMetaTileEntity.isEnetOutput() && oOutput > 0) { - long tOutputVoltage = Math.max(oOutput, oOutput + (1L << Math.max(0, GT_Utility.getTier(oOutput) - 1))), - tUsableAmperage = Math.min(getOutputAmperage(), (getStoredEU() - mMetaTileEntity.getMinimumStoredEU()) / tOutputVoltage); + final long tOutputVoltage = Math.max(oOutput, oOutput + (1L << Math.max(0, GT_Utility.getTier(oOutput) - 1))); + final long tUsableAmperage = Math.min(getOutputAmperage(), (getStoredEU() - mMetaTileEntity.getMinimumStoredEU()) / tOutputVoltage); if (tUsableAmperage > 0) { - long tEU = tOutputVoltage * Util.emitEnergyToNetwork(oOutput, tUsableAmperage, this); + final long tEU = tOutputVoltage * Util.emitEnergyToNetwork(oOutput, tUsableAmperage, this); mAverageEUOutput[mAverageEUOutputIndex] += tEU; decreaseStoredEU(tEU, true); } } if (getEUCapacity() > 0) { if (GregTech_API.sMachineFireExplosions && getRandomNumber(1000) == 0) { - Block tBlock = getBlockAtSide((byte) getRandomNumber(6)); + final Block tBlock = getBlockAtSide((byte) getRandomNumber(6)); if (tBlock instanceof BlockFire) doEnergyExplosion(); } @@ -393,10 +360,10 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } if (getRandomNumber(1000) == 0) { - int precipitationHeightAtSide2 = worldObj.getPrecipitationHeight(xCoord, zCoord - 1); - int precipitationHeightAtSide3 = worldObj.getPrecipitationHeight(xCoord, zCoord + 1); - int precipitationHeightAtSide4 = worldObj.getPrecipitationHeight(xCoord - 1, zCoord); - int precipitationHeightAtSide5 = worldObj.getPrecipitationHeight(xCoord + 1, zCoord); + final int precipitationHeightAtSide2 = worldObj.getPrecipitationHeight(xCoord, zCoord - 1); + final int precipitationHeightAtSide3 = worldObj.getPrecipitationHeight(xCoord, zCoord + 1); + final int precipitationHeightAtSide4 = worldObj.getPrecipitationHeight(xCoord - 1, zCoord); + final int precipitationHeightAtSide5 = worldObj.getPrecipitationHeight(xCoord + 1, zCoord); if ((getCoverIDAtSide((byte) 1) == 0 && worldObj.getPrecipitationHeight(xCoord, zCoord) - 2 < yCoord) || (getCoverIDAtSide((byte) 2) == 0 && precipitationHeightAtSide2 - 1 < yCoord && precipitationHeightAtSide2 > -1) @@ -406,7 +373,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I if (GregTech_API.sMachineRainExplosions && worldObj.isRaining() && getBiome().rainfall > 0) { if (getRandomNumber(10) == 0) { try { - GT_Mod.instance.achievements.issueAchievement(this.getWorldObj().getPlayerEntityByName(mOwnerName), "badweather"); + GT_Mod.achievements.issueAchievement(this.getWorldObj().getPlayerEntityByName(mOwnerName), "badweather"); } catch (Exception ignored) {} GT_Log.exp.println("Machine at: " + this.getXCoord() + " | " + this.getYCoord() + " | " + this.getZCoord() + " DIMID: " + this.worldObj.provider.dimensionId + " explosion due to rain!"); doEnergyExplosion(); @@ -422,7 +389,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I if (GregTech_API.sMachineThunderExplosions && worldObj.isThundering() && getBiome().rainfall > 0 && getRandomNumber( 3) == 0) { try { - GT_Mod.instance.achievements.issueAchievement(this.getWorldObj().getPlayerEntityByName(mOwnerName), "badweather"); + GT_Mod.achievements.issueAchievement(this.getWorldObj().getPlayerEntityByName(mOwnerName), "badweather"); } catch (Exception ignored) {} GT_Log.exp.println("Machine at: " + this.getXCoord() + " | " + this.getYCoord() + " | " + this.getZCoord() + " DIMID: " + this.worldObj.provider.dimensionId + " explosion due to Thunderstorm!"); doEnergyExplosion(); @@ -492,20 +459,20 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I if (mTickTimer > 10) { byte tData = (byte) ((mFacing & 7) | (mActive ? 8 : 0) | (mRedstone ? 16 : 0) | (mLockUpgrade ? 32 : 0) | (mWorks ? 64 : 0)); if (tData != oTextureData) - sendBlockEvent(MetaTileClientEvents.CHANGE_COMMON_DATA, oTextureData = tData); + sendBlockEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, oTextureData = tData); tData = mMetaTileEntity.getUpdateData(); if (tData != oUpdateData) - sendBlockEvent(MetaTileClientEvents.CHANGE_CUSTOM_DATA, oUpdateData = tData); + sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, oUpdateData = tData); if (mMetaTileEntity instanceof GT_MetaTileEntity_Hatch) { tData = ((GT_MetaTileEntity_Hatch) mMetaTileEntity).getTexturePage(); if (tData != oTexturePage) - sendBlockEvent(MetaTileClientEvents.CHANGE_CUSTOM_DATA, (byte) ((oTexturePage = tData) | 0x80));//set last bit as a flag for page + sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, (byte) ((oTexturePage = tData) | 0x80));//set last bit as a flag for page } - if (mColor != oColor) sendBlockEvent(MetaTileClientEvents.CHANGE_COLOR, oColor = mColor); + if (mColor != oColor) sendBlockEvent(GregTechTileClientEvents.CHANGE_COLOR, oColor = mColor); tData = (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 (tData != oRedstoneData) - sendBlockEvent(MetaTileClientEvents.CHANGE_REDSTONE_OUTPUT, oRedstoneData = tData); + sendBlockEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, oRedstoneData = tData); if (mLightValue != oLightValue) { worldObj.setLightValue(EnumSkyBlock.Block, xCoord, yCoord, zCoord, mLightValue); worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord); @@ -516,7 +483,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord + 1); worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord - 1); issueTextureUpdate(); - sendBlockEvent(MetaTileClientEvents.CHANGE_LIGHT, oLightValue = mLightValue); + sendBlockEvent(GregTechTileClientEvents.CHANGE_LIGHT, oLightValue = mLightValue); } } @@ -535,7 +502,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I tTime = System.nanoTime() - tTime; if (mTimeStatistics.length > 0) mTimeStatistics[mTimeStatisticsIndex = (mTimeStatisticsIndex + 1) % mTimeStatistics.length] = (int) tTime; - if (tTime > 0 && tTime > (GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING*1000000) && mTickTimer > 1000 && getMetaTileEntity().doTickProfilingMessageDuringThisTick() && mLagWarningCount++ < 10) + if (tTime > 0 && tTime > (GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING* 1000000L) && mTickTimer > 1000 && getMetaTileEntity().doTickProfilingMessageDuringThisTick() && mLagWarningCount++ < 10) GT_FML_LOGGER.warn("WARNING: Possible Lag Source at [" + xCoord + ", " + yCoord + ", " + zCoord + "] in Dimension " + worldObj.provider.dimensionId + " with " + tTime + "ns caused by an instance of " + getMetaTileEntity().getClass()); } @@ -576,12 +543,6 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I sendCoverDataIfNeeded(); } - @Override - public Packet getDescriptionPacket() { - issueClientUpdate(); - return null; - } - public final void receiveMetaTileEntityData(short aID, int aCover0, int aCover1, int aCover2, int aCover3, int aCover4, int aCover5, byte aTextureData, byte aTexturePage, byte aUpdateData, byte aRedstoneData, byte aColorData) { issueTextureUpdate(); if (mID != aID && aID > 0) { @@ -596,11 +557,11 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I setCoverIDAtSide((byte) 4, aCover4); setCoverIDAtSide((byte) 5, aCover5); - receiveClientEvent(MetaTileClientEvents.CHANGE_COMMON_DATA, aTextureData); - receiveClientEvent(MetaTileClientEvents.CHANGE_CUSTOM_DATA, aUpdateData & 0x7F); - receiveClientEvent(MetaTileClientEvents.CHANGE_CUSTOM_DATA, aTexturePage | 0x80); - receiveClientEvent(MetaTileClientEvents.CHANGE_COLOR, aColorData); - receiveClientEvent(MetaTileClientEvents.CHANGE_REDSTONE_OUTPUT, aRedstoneData); + receiveClientEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, aTextureData); + receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aUpdateData & 0x7F); + receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aTexturePage | 0x80); + receiveClientEvent(GregTechTileClientEvents.CHANGE_COLOR, aColorData); + receiveClientEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, aRedstoneData); } @Deprecated @@ -625,14 +586,14 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I if (isClientSide()) { issueTextureUpdate(); switch (aEventID) { - case MetaTileClientEvents.CHANGE_COMMON_DATA: + case GregTechTileClientEvents.CHANGE_COMMON_DATA: mFacing = (byte) (aValue & 7); mActive = ((aValue & 8) != 0); mRedstone = ((aValue & 16) != 0); //mLockUpgrade = ((aValue&32) != 0); mWorks = ((aValue & 64) != 0); break; - case MetaTileClientEvents.CHANGE_CUSTOM_DATA: + case GregTechTileClientEvents.CHANGE_CUSTOM_DATA: if (hasValidMetaTileEntity()) { if ((aValue & 0x80) == 0) //Is texture index mMetaTileEntity.onValueUpdate((byte) (aValue & 0x7F)); @@ -640,11 +601,11 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I ((GT_MetaTileEntity_Hatch) mMetaTileEntity).onTexturePageUpdate((byte) (aValue & 0x7F)); } break; - case MetaTileClientEvents.CHANGE_COLOR: + case GregTechTileClientEvents.CHANGE_COLOR: if (aValue > 16 || aValue < 0) aValue = 0; mColor = (byte) aValue; break; - case MetaTileClientEvents.CHANGE_REDSTONE_OUTPUT: + case GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT: mSidedRedstone[0] = (byte) ((aValue & 1) == 1 ? 15 : 0); mSidedRedstone[1] = (byte) ((aValue & 2) == 2 ? 15 : 0); mSidedRedstone[2] = (byte) ((aValue & 4) == 4 ? 15 : 0); @@ -652,19 +613,19 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I mSidedRedstone[4] = (byte) ((aValue & 16) == 16 ? 15 : 0); mSidedRedstone[5] = (byte) ((aValue & 32) == 32 ? 15 : 0); break; - case MetaTileClientEvents.DO_SOUND: + case GregTechTileClientEvents.DO_SOUND: if (hasValidMetaTileEntity() && mTickTimer > 20) mMetaTileEntity.doSound((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); break; - case MetaTileClientEvents.START_SOUND_LOOP: + case GregTechTileClientEvents.START_SOUND_LOOP: if (hasValidMetaTileEntity() && mTickTimer > 20) mMetaTileEntity.startSoundLoop((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); break; - case MetaTileClientEvents.STOP_SOUND_LOOP: + case GregTechTileClientEvents.STOP_SOUND_LOOP: if (hasValidMetaTileEntity() && mTickTimer > 20) mMetaTileEntity.stopSoundLoop((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); break; - case MetaTileClientEvents.CHANGE_LIGHT: + case GregTechTileClientEvents.CHANGE_LIGHT: mLightValue = (byte) aValue; break; } @@ -672,8 +633,9 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I return true; } + @Override public ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aLogLevel) { - ArrayList<String> tList = new ArrayList<String>(); + final ArrayList<String> tList = new ArrayList<>(); if (aLogLevel > 2) { tList.add("Meta-ID: " +EnumChatFormatting.BLUE+ mID +EnumChatFormatting.RESET + (canAccessData() ? EnumChatFormatting.GREEN+" valid"+EnumChatFormatting.RESET : EnumChatFormatting.RED+" invalid"+EnumChatFormatting.RESET) + (mMetaTileEntity == null ? EnumChatFormatting.RED+" MetaTileEntity == null!"+EnumChatFormatting.RESET : " ")); } @@ -712,54 +674,12 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } @Override - public void issueTextureUpdate() { - mNeedsUpdate = true; - } - - @Override - public void issueBlockUpdate() { - mNeedsBlockUpdate = true; - } - - @Override - public void issueClientUpdate() { - mSendClientData = true; - } - - @Override - public void issueCoverUpdate(byte aSide) { - super.issueCoverUpdate(aSide); - issueClientUpdate(); - } - - @Override - public byte getStrongestRedstone() { - return (byte) Math.max(getInternalInputRedstoneSignal((byte) 0), Math.max(getInternalInputRedstoneSignal((byte) 1), Math.max(getInternalInputRedstoneSignal((byte) 2), Math.max(getInternalInputRedstoneSignal((byte) 3), Math.max(getInternalInputRedstoneSignal((byte) 4), getInternalInputRedstoneSignal((byte) 5)))))); - } - - @Override - public boolean getRedstone() { - return getRedstone((byte) 0) || getRedstone((byte) 1) || getRedstone((byte) 2) || getRedstone((byte) 3) || getRedstone((byte) 4) || getRedstone((byte) 5); - } - - @Override - public boolean getRedstone(byte aSide) { - return getInternalInputRedstoneSignal(aSide) > 0; - } - - @Override public boolean isGivingInformation() { if (canAccessData()) return mMetaTileEntity.isGivingInformation(); return false; } @Override - public boolean isValidFacing(byte aSide) { - if (canAccessData()) return mMetaTileEntity.isFacingValid(aSide); - return false; - } - - @Override public byte getBackFacing() { return GT_Utility.getOppositeSide(mFacing); } @@ -834,7 +754,9 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I @Override public boolean isUseableByPlayer(EntityPlayer aPlayer) { - return canAccessData() && playerOwnsThis(aPlayer, false) && mTickTimer > 40 && getTileEntityOffset(0, 0, 0) == this && aPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64 && mMetaTileEntity.isAccessAllowed(aPlayer); + return canAccessData() && playerOwnsThis(aPlayer, false) && mTickTimer > 40 && + getTileEntityOffset(0, 0, 0) == this && + aPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64 && mMetaTileEntity.isAccessAllowed(aPlayer); } @Override @@ -870,7 +792,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I @Override public ItemStack getStackInSlotOnClosing(int slot) { - ItemStack stack = getStackInSlot(slot); + final ItemStack stack = getStackInSlot(slot); if (stack != null) setInventorySlotContents(slot, null); return stack; } @@ -904,7 +826,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I @Override public boolean increaseProgress(int aProgressAmountInTicks) { - return canAccessData() ? mMetaTileEntity.increaseProgress(aProgressAmountInTicks) != aProgressAmountInTicks : false; + return canAccessData() && mMetaTileEntity.increaseProgress(aProgressAmountInTicks) != aProgressAmountInTicks; } @Override @@ -1009,14 +931,24 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I return isEnergyOutputSide(aSide); } + @Override + public boolean isEnetOutput() { + return mMetaTileEntity != null && mMetaTileEntity.isEnetOutput(); + } + + @Override + public boolean isEnetInput() { + return mMetaTileEntity != null && mMetaTileEntity.isEnetInput(); + } + public void generatePowerNodes() { - if (isServerSide() && mMetaTileEntity != null && (mMetaTileEntity.isEnetInput() || mMetaTileEntity.isEnetOutput())) { - int time = MinecraftServer.getServer().getTickCounter(); + if (isServerSide() && (isEnetInput() || isEnetOutput())) { + final int time = MinecraftServer.getServer().getTickCounter(); for (byte i = 0;i<6;i++) { if (outputsEnergyTo(i,false) || inputEnergyFrom(i,false)) { - IGregTechTileEntity TE = getIGregTechTileEntityAtSide(i); + final IGregTechTileEntity TE = getIGregTechTileEntityAtSide(i); if (TE instanceof BaseMetaPipeEntity) { - Node node = ((BaseMetaPipeEntity) TE).getNode(); + final Node node = ((BaseMetaPipeEntity) TE).getNode(); if (node == null) { new GenerateNodeMapPower((BaseMetaPipeEntity) TE); } else if (node.mCreationTime != time) { @@ -1065,18 +997,6 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } @Override - public String[] getDescription() { - if (canAccessData()) return mMetaTileEntity.getDescription(); - return new String[0]; - } - - @Override - public boolean isValidSlot(int aIndex) { - if (canAccessData()) return mMetaTileEntity.isValidSlot(aIndex); - return false; - } - - @Override public long getUniversalEnergyStored() { return Math.max(getStoredEU(), getStoredSteam()); } @@ -1112,11 +1032,11 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I @Override public ITexture[] getTexture(Block aBlock, byte aSide) { - ITexture coverTexture = getCoverTexture(aSide); - ITexture[] textureUncovered = hasValidMetaTileEntity() ? - mMetaTileEntity.getTexture(this, aSide, mFacing, (byte) (mColor - 1), mActive, getOutputRedstoneSignal(aSide) > 0) : - Textures.BlockIcons.ERROR_RENDERING; - ITexture[] textureCovered; + final ITexture coverTexture = getCoverTexture(aSide); + final ITexture[] textureUncovered = hasValidMetaTileEntity() ? + mMetaTileEntity.getTexture(this, aSide, mFacing, (byte) (mColor - 1), mActive, getOutputRedstoneSignal(aSide) > 0) : + Textures.BlockIcons.ERROR_RENDERING; + final ITexture[] textureCovered; if (coverTexture != null) { textureCovered = Arrays.copyOf(textureUncovered, textureUncovered.length + 1); textureCovered[textureUncovered.length] = coverTexture; @@ -1153,6 +1073,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I return mMetaTileEntity != null && mMetaTileEntity.getBaseMetaTileEntity() == this; } + @Override protected boolean canAccessData() { return !isDead && hasValidMetaTileEntity(); } @@ -1232,14 +1153,14 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I try { mReleaseEnergy = true; IEnergyConnected.Util.emitEnergyToNetwork(V[5], Math.max(1, getStoredEU() / V[5]), this); - } catch (Exception e) {/* Fun Fact: all these "do nothing" Comments you see in my Code, are just there to let Eclipse shut up about the intended empty Brackets, but I need eclipse to yell at me in some of the regular Cases where I forget to add Code */} + } catch (Exception ignored) {} } mReleaseEnergy = false; // Normal Explosion Code mMetaTileEntity.onExplosion(); if(GT_Mod.gregtechproxy.mExplosionItemDrop){ for (int i = 0; i < this.getSizeInventory(); i++) { - ItemStack tItem = this.getStackInSlot(i); + final ItemStack tItem = this.getStackInSlot(i); if ((tItem != null) && (tItem.stackSize > 0) && (this.isValidSlot(i))) { dropItems(tItem); this.setInventorySlotContents(i, null); } @@ -1260,7 +1181,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I public void dropItems(ItemStack tItem){ if(tItem==null)return; - EntityItem tItemEntity = new EntityItem(this.worldObj, this.xCoord + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, this.yCoord + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, this.zCoord + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, new ItemStack(tItem.getItem(), tItem.stackSize, tItem.getItemDamage())); + final EntityItem tItemEntity = new EntityItem(this.worldObj, this.xCoord + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, this.yCoord + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, this.zCoord + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F, new ItemStack(tItem.getItem(), tItem.stackSize, tItem.getItemDamage())); if (tItem.hasTagCompound()) { tItemEntity.getEntityItem().setTagCompound((NBTTagCompound) tItem.getTagCompound().copy()); } @@ -1279,28 +1200,20 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I @Override public ArrayList<ItemStack> getDrops() { - ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, mID); - NBTTagCompound tNBT = new NBTTagCompound(); + final ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, mID); + final NBTTagCompound tNBT = new NBTTagCompound(); if (mRecipeStuff != null && !mRecipeStuff.hasNoTags()) tNBT.setTag("GT.CraftingComponents", mRecipeStuff); if (mMuffler) tNBT.setBoolean("mMuffler", mMuffler); if (mLockUpgrade) tNBT.setBoolean("mLockUpgrade", mLockUpgrade); if (mSteamConverter) tNBT.setBoolean("mSteamConverter", mSteamConverter); if (mColor > 0) tNBT.setByte("mColor", mColor); if (mOtherUpgrades > 0) tNBT.setByte("mOtherUpgrades", mOtherUpgrades); - 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); + + writeCoverNBT(tNBT, true); + if (hasValidMetaTileEntity()) mMetaTileEntity.setItemNBT(tNBT); if (!tNBT.hasNoTags()) rStack.setTagCompound(tNBT); - return new ArrayList<ItemStack>(Arrays.asList(rStack)); + return new ArrayList<>(Collections.singletonList(rStack)); } public int getUpgradeCount() { @@ -1312,7 +1225,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I if (isClientSide()) { //Configure Cover, sneak can also be: screwdriver, wrench, side cutter, soldering iron if (aPlayer.isSneaking()) { - byte tSide = (getCoverIDAtSide(aSide) == 0) ? GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ) : aSide; + final byte tSide = (getCoverIDAtSide(aSide) == 0) ? GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ) : aSide; return (getCoverBehaviorAtSideNew(tSide).hasCoverGUI()); } else if (getCoverBehaviorAtSideNew(aSide).onCoverRightclickClient(aSide, this, aPlayer, aX, aY, aZ)) { return true; @@ -1323,7 +1236,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } if (isServerSide()) { if (!privateAccess() || aPlayer.getDisplayName().equalsIgnoreCase(getOwnerName())) { - 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)) { tCurrentItem.func_150996_a(Items.bucket); @@ -1378,7 +1291,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) { - byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); + final byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); if (mMetaTileEntity.onSolderingToolRightClick(aSide, tSide, aPlayer, aX, aY, aZ)) { //logic handled internally GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(103), 1.0F, -1, xCoord, yCoord, zCoord); @@ -1394,7 +1307,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList)) { - byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); + final byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); if (mMetaTileEntity.onWireCutterRightClick(aSide, tSide, aPlayer, aX, aY, aZ)) { //logic handled internally GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(100), 1.0F, -1, xCoord, yCoord, zCoord); @@ -1520,7 +1433,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I 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); - return new int[0]; + return GT_Values.emptyIntArray; } /** @@ -1545,39 +1458,11 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } @Override - public byte getInternalInputRedstoneSignal(byte aSide) { - return (byte) (getCoverBehaviorAtSideNew(aSide).getRedstoneInput(aSide, getInputRedstoneSignal(aSide), getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this) & 15); - } - - @Override - public byte getInputRedstoneSignal(byte aSide) { - return (byte) (worldObj.getIndirectPowerLevelTo(getOffsetX(aSide, 1), getOffsetY(aSide, 1), getOffsetZ(aSide, 1), aSide) & 15); - } - - @Override - public byte getOutputRedstoneSignal(byte aSide) { - return getCoverBehaviorAtSideNew(aSide).manipulatesSidedRedstoneOutput(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this) ? mSidedRedstone[aSide] : getGeneralRS(aSide); - } - public byte getGeneralRS(byte aSide){ - if(mMetaTileEntity==null)return 0; + if(mMetaTileEntity==null) return 0; return mMetaTileEntity.allowGeneralRedstoneOutput() ? mSidedRedstone[aSide] : 0; } - @Override - public void setInternalOutputRedstoneSignal(byte aSide, byte aStrength) { - if (!getCoverBehaviorAtSideNew(aSide).manipulatesSidedRedstoneOutput(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) - setOutputRedstoneSignal(aSide, aStrength); - } - - @Override - public void setOutputRedstoneSignal(byte aSide, byte aStrength) { - aStrength = (byte) Math.min(Math.max(0, aStrength), 15); - if (aSide >= 0 && aSide < 6 && mSidedRedstone[aSide] != aStrength) { - mSidedRedstone[aSide] = aStrength; - issueBlockUpdate(); - } - } @Override public boolean isSteamEngineUpgradable() { @@ -1617,21 +1502,11 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } @Override - public boolean hasInventoryBeenModified() { - return mInventoryChanged; - } - - @Override public void markInventoryBeenModified() { mInventoryChanged = true; } @Override - public void setGenericRedstoneOutput(boolean aOnOff) { - mRedstone = aOnOff; - } - - @Override public int getErrorDisplayID() { return mDisplayErrorCode; } @@ -1715,16 +1590,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I return canAccessData() ? mMetaTileEntity.getComparatorValue(aSide) : 0; } - @Override - public byte getStrongOutputRedstoneSignal(byte aSide) { - return aSide >= 0 && aSide < 6 && (mStrongRedstone & (1 << aSide)) != 0 ? (byte) (mSidedRedstone[aSide] & 15) : 0; - } - @Override - public void setStrongOutputRedstoneSignal(byte aSide, byte aStrength) { - mStrongRedstone |= (1 << aSide); - setOutputRedstoneSignal(aSide, aStrength); - } @Override public ItemStack decrStackSize(int aIndex, int aAmount) { @@ -1857,13 +1723,14 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I @Override public FluidTankInfo[] getTankInfo(ForgeDirection aSide) { + final byte tSide = (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(tSide) && getCoverBehaviorAtSideNew(tSide).letsFluidIn(tSide, getCoverIDAtSide(tSide), getComplexCoverDataAtSide(tSide), null, this)) || + (mMetaTileEntity.isLiquidOutput(tSide) && getCoverBehaviorAtSideNew(tSide).letsFluidOut(tSide, getCoverIDAtSide(tSide), getComplexCoverDataAtSide(tSide), null, this) ) ) ) @@ -1969,15 +1836,10 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } @Override - public boolean isInvalidTileEntity() { - return isInvalid(); - } - - @Override 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; @@ -2030,12 +1892,6 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } @Override - public void markDirty() { - super.markDirty(); - mInventoryChanged = true; - } - - @Override public int getLightOpacity() { return mMetaTileEntity == null ? getLightValue() > 0 ? 0 : 255 : mMetaTileEntity.getLightOpacity(); } @@ -2064,9 +1920,12 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I * @return The corrected Inventory index */ private int migrateInventoryIndex(int slotIndex, int nbtVersion){ - int oldInputSize, newInputSize, oldOutputSize, newOutputSize; - int chemistryUpdateVersion = GT_Mod.calculateTotalGTVersion(509, 31); - int configCircuitAdditionVersion = GT_Mod.calculateTotalGTVersion(509, 40); + final int oldInputSize; + final int newInputSize; + final int oldOutputSize; + final int newOutputSize; + final int chemistryUpdateVersion = GT_Mod.calculateTotalGTVersion(509, 31); + final int configCircuitAdditionVersion = GT_Mod.calculateTotalGTVersion(509, 40); // 4 is old GT_MetaTileEntity_BasicMachine.OTHER_SLOT_COUNT if (nbtVersion < configCircuitAdditionVersion && getMetaTileEntity() instanceof GT_MetaTileEntity_BasicMachine && slotIndex >= 4) slotIndex += 1; @@ -2122,12 +1981,13 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I } return slotIndex + indexShift; } + @Override @Optional.Method(modid = "appliedenergistics2") public IGridNode getGridNode(ForgeDirection forgeDirection) { if (mFacing != forgeDirection.ordinal()) return null; - AENetworkProxy gp = getProxy(); + final AENetworkProxy gp = getProxy(); return gp != null ? gp.getNode() : null; } @@ -2144,7 +2004,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I @Override @Optional.Method(modid = "appliedenergistics2") public IGridNode getActionableNode() { - AENetworkProxy gp = getProxy(); + final AENetworkProxy gp = getProxy(); return gp != null ? gp.getNode() : null; } @@ -2169,7 +2029,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I @Optional.Method(modid = "appliedenergistics2") public void readFromNBT_AENetwork( final NBTTagCompound data ) { - AENetworkProxy gp = getProxy(); + final AENetworkProxy gp = getProxy(); if (gp != null) getProxy().readFromNBT( data ); } @@ -2178,21 +2038,21 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I @Optional.Method(modid = "appliedenergistics2") public void writeToNBT_AENetwork( final NBTTagCompound data ) { - AENetworkProxy gp = getProxy(); + final AENetworkProxy gp = getProxy(); if (gp != null) gp.writeToNBT( data ); } @Optional.Method(modid = "appliedenergistics2") void onChunkUnloadAE() { - AENetworkProxy gp = getProxy(); + final AENetworkProxy gp = getProxy(); if (gp != null) gp.onChunkUnload(); } @Optional.Method(modid = "appliedenergistics2") void invalidateAE() { - AENetworkProxy gp = getProxy(); + final AENetworkProxy gp = getProxy(); if (gp != null) gp.invalidate(); } diff --git a/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java index a23956f6e3..8e6206f612 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java @@ -1,19 +1,23 @@ package gregtech.api.metatileentity; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGTEnet; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords; +import gregtech.api.interfaces.tileentity.IIC2Enet; import gregtech.api.net.GT_Packet_Block_Event; import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_Utility; import ic2.api.energy.event.EnergyTileLoadEvent; import ic2.api.energy.event.EnergyTileUnloadEvent; import net.minecraft.block.Block; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.Chunk; @@ -21,17 +25,24 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.IFluidHandler; +import java.util.Arrays; import java.util.concurrent.ThreadLocalRandom; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; +import static gregtech.api.enums.GT_Values.COMPASS_DIRECTIONS; import static gregtech.api.enums.GT_Values.GT; import static gregtech.api.enums.GT_Values.NW; +import static gregtech.api.enums.GT_Values.SIDE_DOWN; +import static gregtech.api.enums.GT_Values.SIDE_UP; /** * The Functions my old TileEntities and my BaseMetaTileEntities have in common. * <p/> * Basically everything a TileEntity should have. */ -public abstract class BaseTileEntity extends TileEntity implements IHasWorldObjectAndCoords { +public abstract class BaseTileEntity extends TileEntity implements IHasWorldObjectAndCoords, IIC2Enet, IGTEnet { + protected boolean mInventoryChanged = false; + /** * Buffers adjacent TileEntities for faster access * <p/> @@ -49,7 +60,21 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje */ public boolean isDead = false; - private final void clearNullMarkersFromTileEntityBuffer() { + private final ChunkCoordinates mReturnedCoordinates = new ChunkCoordinates(); + + public static byte getSideForPlayerPlacing(Entity aPlayer, byte aDefaultFacing, boolean[] aAllowedFacings) { + if(aPlayer != null) { + if (aPlayer.rotationPitch >= 65 && aAllowedFacings[SIDE_UP]) return SIDE_UP; + if (aPlayer.rotationPitch <= -65 && aAllowedFacings[SIDE_DOWN]) return SIDE_DOWN; + final byte rFacing = COMPASS_DIRECTIONS[MathHelper.floor_double(0.5D + 4.0F * aPlayer.rotationYaw / 360.0F) & 0x3]; + if (aAllowedFacings[rFacing]) return rFacing; + } + for (final byte tSide : ALL_VALID_SIDES) if (aAllowedFacings[tSide]) return tSide; + return aDefaultFacing; + } + + + private void clearNullMarkersFromTileEntityBuffer() { for (int i = 0; i < mBufferedTileEntities.length; i++) if (mBufferedTileEntities[i] == this) mBufferedTileEntities[i] = null; } @@ -58,7 +83,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje * Called automatically when the Coordinates of this TileEntity have been changed */ protected final void clearTileEntityBuffer() { - for (int i = 0; i < mBufferedTileEntities.length; i++) mBufferedTileEntities[i] = null; + Arrays.fill(mBufferedTileEntities, null); } @Override @@ -82,6 +107,14 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje } @Override + public ChunkCoordinates getCoords() { + mReturnedCoordinates.posX = xCoord; + mReturnedCoordinates.posY = yCoord; + mReturnedCoordinates.posZ = zCoord; + return mReturnedCoordinates; + } + + @Override public final int getOffsetX(byte aSide, int aMultiplier) { return xCoord + ForgeDirection.getOrientation(aSide).offsetX * aMultiplier; } @@ -119,7 +152,12 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje } @Override - public final int getRandomNumber(int aRange) { + public boolean isInvalidTileEntity() { + return isInvalid(); + } + + @Override + public int getRandomNumber(int aRange) { return ThreadLocalRandom.current().nextInt(aRange); } @@ -236,84 +274,84 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje @Override public final IInventory getIInventory(int aX, int aY, int aZ) { - TileEntity tTileEntity = getTileEntity(aX, aY, aZ); + final TileEntity tTileEntity = getTileEntity(aX, aY, aZ); if (tTileEntity instanceof IInventory) return (IInventory) tTileEntity; return null; } @Override public final IInventory getIInventoryOffset(int aX, int aY, int aZ) { - TileEntity tTileEntity = getTileEntityOffset(aX, aY, aZ); + final TileEntity tTileEntity = getTileEntityOffset(aX, aY, aZ); if (tTileEntity instanceof IInventory) return (IInventory) tTileEntity; return null; } @Override public final IInventory getIInventoryAtSide(byte aSide) { - TileEntity tTileEntity = getTileEntityAtSide(aSide); + final TileEntity tTileEntity = getTileEntityAtSide(aSide); if (tTileEntity instanceof IInventory) return (IInventory) tTileEntity; return null; } @Override public final IInventory getIInventoryAtSideAndDistance(byte aSide, int aDistance) { - TileEntity tTileEntity = getTileEntityAtSideAndDistance(aSide, aDistance); + final TileEntity tTileEntity = getTileEntityAtSideAndDistance(aSide, aDistance); if (tTileEntity instanceof IInventory) return (IInventory) tTileEntity; return null; } @Override public final IFluidHandler getITankContainer(int aX, int aY, int aZ) { - TileEntity tTileEntity = getTileEntity(aX, aY, aZ); + final TileEntity tTileEntity = getTileEntity(aX, aY, aZ); if (tTileEntity instanceof IFluidHandler) return (IFluidHandler) tTileEntity; return null; } @Override public final IFluidHandler getITankContainerOffset(int aX, int aY, int aZ) { - TileEntity tTileEntity = getTileEntityOffset(aX, aY, aZ); + final TileEntity tTileEntity = getTileEntityOffset(aX, aY, aZ); if (tTileEntity instanceof IFluidHandler) return (IFluidHandler) tTileEntity; return null; } @Override public final IFluidHandler getITankContainerAtSide(byte aSide) { - TileEntity tTileEntity = getTileEntityAtSide(aSide); + final TileEntity tTileEntity = getTileEntityAtSide(aSide); if (tTileEntity instanceof IFluidHandler) return (IFluidHandler) tTileEntity; return null; } @Override public final IFluidHandler getITankContainerAtSideAndDistance(byte aSide, int aDistance) { - TileEntity tTileEntity = getTileEntityAtSideAndDistance(aSide, aDistance); + final TileEntity tTileEntity = getTileEntityAtSideAndDistance(aSide, aDistance); if (tTileEntity instanceof IFluidHandler) return (IFluidHandler) tTileEntity; return null; } @Override public final IGregTechTileEntity getIGregTechTileEntity(int aX, int aY, int aZ) { - TileEntity tTileEntity = getTileEntity(aX, aY, aZ); + final TileEntity tTileEntity = getTileEntity(aX, aY, aZ); if (tTileEntity instanceof IGregTechTileEntity) return (IGregTechTileEntity) tTileEntity; return null; } @Override public final IGregTechTileEntity getIGregTechTileEntityOffset(int aX, int aY, int aZ) { - TileEntity tTileEntity = getTileEntityOffset(aX, aY, aZ); + final TileEntity tTileEntity = getTileEntityOffset(aX, aY, aZ); if (tTileEntity instanceof IGregTechTileEntity) return (IGregTechTileEntity) tTileEntity; return null; } @Override public final IGregTechTileEntity getIGregTechTileEntityAtSide(byte aSide) { - TileEntity tTileEntity = getTileEntityAtSide(aSide); + final TileEntity tTileEntity = getTileEntityAtSide(aSide); if (tTileEntity instanceof IGregTechTileEntity) return (IGregTechTileEntity) tTileEntity; return null; } @Override public final IGregTechTileEntity getIGregTechTileEntityAtSideAndDistance(byte aSide, int aDistance) { - TileEntity tTileEntity = getTileEntityAtSideAndDistance(aSide, aDistance); + final TileEntity tTileEntity = getTileEntityAtSideAndDistance(aSide, aDistance); if (tTileEntity instanceof IGregTechTileEntity) return (IGregTechTileEntity) tTileEntity; return null; } @@ -324,6 +362,12 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje return worldObj.getBlock(aX, aY, aZ); } + public Block getBlock(ChunkCoordinates aCoords) { + if (worldObj == null) return Blocks.air; + if (ignoreUnloadedChunks && crossedChunkBorder(aCoords) && !worldObj.blockExists(aCoords.posX, aCoords.posY, aCoords.posZ)) return Blocks.air; + return worldObj.getBlock(aCoords.posX, aCoords.posY, aCoords.posZ); + } + @Override public final byte getMetaID(int aX, int aY, int aZ) { if (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ)) return 0; @@ -355,7 +399,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje } @Override - public final TileEntity getTileEntity(int aX, int aY, int aZ) { + public TileEntity getTileEntity(int aX, int aY, int aZ) { if (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ)) return null; return worldObj.getTileEntity(aX, aY, aZ); } @@ -363,7 +407,9 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje @Override public final TileEntity getTileEntityAtSide(byte aSide) { if (aSide < 0 || aSide >= 6 || mBufferedTileEntities[aSide] == this) return null; - int tX = getOffsetX(aSide, 1), tY = getOffsetY(aSide, 1), tZ = getOffsetZ(aSide, 1); + final int tX = getOffsetX(aSide, 1); + final int tY = getOffsetY(aSide, 1); + final int tZ = getOffsetZ(aSide, 1); if (crossedChunkBorder(tX, tZ)) { mBufferedTileEntities[aSide] = null; if (ignoreUnloadedChunks && !worldObj.blockExists(tX, tY, tZ)) return null; @@ -389,7 +435,6 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje @Override public void writeToNBT(NBTTagCompound aNBT) { super.writeToNBT(aNBT); - //isDead = true; } @Override @@ -429,19 +474,19 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje } public void updateNeighbours(int mStrongRedstone, int oStrongRedstone) { - Block thisBlock = getBlockOffset(0, 0, 0); - for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - int x1 = xCoord + dir.offsetX, y1 = yCoord + dir.offsetY, z1 = zCoord + dir.offsetZ; + final Block thisBlock = getBlockOffset(0, 0, 0); + for (final ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + final int x1 = xCoord + dir.offsetX, y1 = yCoord + dir.offsetY, z1 = zCoord + dir.offsetZ; if (worldObj.blockExists(x1, y1, z1)) { worldObj.notifyBlockOfNeighborChange(x1, y1, z1, thisBlock); - //update if it was / is strong powered. + // update if it was / is strong powered. if (((((mStrongRedstone | oStrongRedstone) >>> dir.ordinal()) & 1) != 0 ) && getBlock(x1, y1, z1).isNormalCube()) { - int skipUpdateSide = dir.getOpposite().ordinal(); //Don't update this block. Still updates diagonal blocks twice if conditions meet. + final int skipUpdateSide = dir.getOpposite().ordinal(); //Don't update this block. Still updates diagonal blocks twice if conditions meet. - for (ForgeDirection dir2 : ForgeDirection.VALID_DIRECTIONS) { - int x2 = x1 + dir2.offsetX, y2 = y1 + dir2.offsetY, z2 = z1 + dir2.offsetZ; + for (final ForgeDirection dir2 : ForgeDirection.VALID_DIRECTIONS) { + final int x2 = x1 + dir2.offsetX, y2 = y1 + dir2.offsetY, z2 = z1 + dir2.offsetZ; if (dir2.ordinal() != skipUpdateSide && worldObj.blockExists(x2, y2, z2)) worldObj.notifyBlockOfNeighborChange(x2, y2, z2, thisBlock); } @@ -455,10 +500,14 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje NW.sendPacketToAllPlayersInRange(worldObj, new GT_Packet_Block_Event(xCoord, (short) yCoord, zCoord, aID, aValue), xCoord, zCoord); } - private boolean crossedChunkBorder(int aX, int aZ) { + protected boolean crossedChunkBorder(int aX, int aZ) { return aX >> 4 != xCoord >> 4 || aZ >> 4 != zCoord >> 4; } + public final boolean crossedChunkBorder(ChunkCoordinates aCoords) { + return aCoords.posX >> 4 != xCoord >> 4 || aCoords.posZ >> 4 != zCoord >> 4; + } + public final void setOnFire() { GT_Utility.setCoordsOnFire(worldObj, xCoord, yCoord, zCoord, false); } @@ -470,7 +519,7 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje @Override public void markDirty() { // Avoid sending neighbor updates, just mark the chunk as dirty to make sure it gets saved - Chunk chunk = worldObj.getChunkFromBlockCoords(xCoord, zCoord); + final Chunk chunk = worldObj.getChunkFromBlockCoords(xCoord, zCoord); if(chunk != null) { chunk.setChunkModified(); } @@ -487,14 +536,13 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje protected TileIC2EnergySink ic2EnergySink = null; protected boolean joinedIc2Enet = false; - public IMetaTileEntity getMetaTileEntity() { return null; } - protected void createIc2Sink() { if(ic2EnergySink == null && isServerSide() && shouldJoinIc2Enet()) { ic2EnergySink = new TileIC2EnergySink((IGregTechTileEntity)this); } } + @Override public void doEnetUpdate() { leaveEnet(); joinEnet(); @@ -518,8 +566,4 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje } } - public boolean shouldJoinIc2Enet() { - final IMetaTileEntity meta = getMetaTileEntity(); - return meta != null && meta.shouldJoinIc2Enet(); - } } diff --git a/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java new file mode 100644 index 0000000000..766110d227 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java @@ -0,0 +1,162 @@ +package gregtech.api.metatileentity; + +import gregtech.GT_Mod; +import gregtech.api.GregTech_API; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.objects.GT_ItemStack; +import gregtech.api.util.GT_Log; +import gregtech.api.util.GT_Utility; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.Packet; + +import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.api.enums.GT_Values.ALL_SIDES; + +public abstract class CommonMetaTileEntity extends CoverableTileEntity implements IGregTechTileEntity { + protected boolean mNeedsBlockUpdate = true, mNeedsUpdate = true, mSendClientData = false, mInventoryChanged = false; + + protected boolean createNewMetatileEntity(short aID) { + if (aID <= 0 || aID >= GregTech_API.METATILEENTITIES.length || GregTech_API.METATILEENTITIES[aID] == null) { + GT_Log.err.println("MetaID " + aID + " not loadable => locking TileEntity!"); + } else { + if (hasValidMetaTileEntity()) getMetaTileEntity().setBaseMetaTileEntity(null); + GregTech_API.METATILEENTITIES[aID].newMetaEntity(this).setBaseMetaTileEntity(this); + mTickTimer = 0; + mID = aID; + return true; + } + return false; + } + protected void saveMetaTileNBT(NBTTagCompound aNBT) { + try { + if (hasValidMetaTileEntity()) { + final NBTTagList tItemList = new NBTTagList(); + for (int i = 0; i < getMetaTileEntity().getRealInventory().length; i++) { + final ItemStack tStack = getMetaTileEntity().getRealInventory()[i]; + if (tStack != null) { + final NBTTagCompound tTag = new NBTTagCompound(); + tTag.setInteger("IntSlot", i); + tStack.writeToNBT(tTag); + tItemList.appendTag(tTag); + } + } + aNBT.setTag("Inventory", tItemList); + + try { + getMetaTileEntity().saveNBTData(aNBT); + } catch (Throwable e) { + GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity."); + GT_Mod.logStackTrace(e); + } + } + } catch (Throwable e) { + GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity."); + GT_Mod.logStackTrace(e); + } + } + + protected void loadMetaTileNBT(NBTTagCompound aNBT) { + if (mID != 0 && createNewMetatileEntity(mID)) { + final NBTTagList tItemList = aNBT.getTagList("Inventory", 10); + for (int i = 0; i < tItemList.tagCount(); i++) { + final NBTTagCompound tTag = tItemList.getCompoundTagAt(i); + final int tSlot = tTag.getInteger("IntSlot"); + if (tSlot >= 0 && tSlot < getMetaTileEntity().getRealInventory().length) { + getMetaTileEntity().getRealInventory()[tSlot] = GT_Utility.loadItem(tTag); + } + } + + try { + getMetaTileEntity().loadNBTData(aNBT); + } catch (Throwable e) { + GT_FML_LOGGER.error("Encountered Exception while loading MetaTileEntity."); + GT_Mod.logStackTrace(e); + } + } + } + + @Override + public void markDirty() { + super.markDirty(); + mInventoryChanged = true; + } + + @Override + public boolean hasInventoryBeenModified() { + return mInventoryChanged; + } + + @Override + public boolean isValidSlot(int aIndex) { + if (canAccessData()) return getMetaTileEntity().isValidSlot(aIndex); + return false; + } + + @Override + public Packet getDescriptionPacket() { + issueClientUpdate(); + return null; + } + + @Override + public void issueTextureUpdate() { + mNeedsUpdate = true; + } + + @Override + public void issueClientUpdate() { + mSendClientData = true; + } + + @Override + public void issueBlockUpdate() { + mNeedsBlockUpdate = true; + } + + @Override + public boolean isValidFacing(byte aSide) { + if (canAccessData()) return getMetaTileEntity().isFacingValid(aSide); + return false; + } + + protected boolean canAccessData() { + return !isDead && hasValidMetaTileEntity(); + } + + protected abstract boolean hasValidMetaTileEntity(); + + @Override + public String[] getDescription() { + if (canAccessData()) return getMetaTileEntity().getDescription(); + return new String[0]; + } + + @Override + public boolean isStillValid() { + return hasValidMetaTileEntity(); + } + + @Override + public boolean allowCoverOnSide(byte aSide, GT_ItemStack aCoverID) { + return hasValidMetaTileEntity() && getMetaTileEntity().allowCoverOnSide(aSide, aCoverID); + } + + @Override + public void issueCoverUpdate(byte aSide) { + super.issueCoverUpdate(aSide); + issueClientUpdate(); + } + + /* + * IC2 Energy Compat + */ + @Override + public boolean shouldJoinIc2Enet() { + final IMetaTileEntity meta = getMetaTileEntity(); + return meta != null && meta.shouldJoinIc2Enet(); + } + +} diff --git a/src/main/java/gregtech/api/metatileentity/CoverableGregTechTileEntity.java b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java index b6249542a3..fdac12c621 100644 --- a/src/main/java/gregtech/api/metatileentity/CoverableGregTechTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java @@ -2,16 +2,15 @@ package gregtech.api.metatileentity; import gregtech.GT_Mod; import gregtech.api.GregTech_API; -import gregtech.api.enums.Textures; import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.tileentity.IGregtechWailaProvider; import gregtech.api.net.GT_Packet_RequestCoverData; import gregtech.api.net.GT_Packet_SendCoverData; import gregtech.api.objects.GT_ItemStack; import gregtech.api.util.GT_CoverBehavior; import gregtech.api.util.GT_CoverBehaviorBase; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_Utility; import gregtech.api.util.ISerializableObject; import gregtech.common.GT_Client; import gregtech.common.covers.GT_Cover_Fluidfilter; @@ -21,21 +20,28 @@ import net.minecraft.entity.item.EntityItem; 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.world.World; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidRegistry; import java.util.Arrays; +import java.util.Objects; +import java.util.stream.IntStream; import java.util.List; -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.E; import static gregtech.api.enums.GT_Values.NW; +import static gregtech.api.util.GT_LanguageManager.FACES; +import static gregtech.api.util.GT_LanguageManager.getTranslation; -public abstract class CoverableGregTechTileEntity extends BaseTileEntity implements IGregTechTileEntity { +public abstract class CoverableTileEntity extends BaseTileEntity implements ICoverable, IGregtechWailaProvider { public static final String[] COVER_DATA_NBT_KEYS = Arrays.stream(ForgeDirection.VALID_DIRECTIONS).mapToInt(Enum::ordinal).mapToObj(i -> "mCoverData" + i).toArray(String[]::new); protected final GT_CoverBehaviorBase<?>[] mCoverBehaviors = new GT_CoverBehaviorBase<?>[]{GregTech_API.sNoBehavior, GregTech_API.sNoBehavior, GregTech_API.sNoBehavior, GregTech_API.sNoBehavior, 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; protected int[] mCoverSides = new int[]{0, 0, 0, 0, 0, 0}; protected ISerializableObject[] mCoverData = new ISerializableObject[6]; @@ -43,72 +49,37 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme protected short mID = 0; public long mTickTimer = 0; - protected void saveCoverNBT(NBTTagCompound aNBT) { + 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) + if (mCoverSides[i] != 0 && mCoverData[i] != null) { aNBT.setTag(COVER_DATA_NBT_KEYS[i], mCoverData[i].saveDataToNBT()); + hasCover = true; + } } - aNBT.setIntArray("mCoverSides", mCoverSides); - - } - - protected void saveMetaTileNBT(NBTTagCompound aNBT) { - try { - if (hasValidMetaTileEntity()) { - NBTTagList tItemList = new NBTTagList(); - for (int i = 0; i < getMetaTileEntity().getRealInventory().length; i++) { - ItemStack tStack = getMetaTileEntity().getRealInventory()[i]; - if (tStack != null) { - NBTTagCompound tTag = new NBTTagCompound(); - tTag.setInteger("IntSlot", i); - tStack.writeToNBT(tTag); - tItemList.appendTag(tTag); - } - } - aNBT.setTag("Inventory", tItemList); + if (mStrongRedstone > 0) aNBT.setByte("mStrongRedstone", mStrongRedstone); + if (hasCover) aNBT.setIntArray("mCoverSides", mCoverSides); - try { - getMetaTileEntity().saveNBTData(aNBT); - } catch (Throwable e) { - GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity."); - GT_Mod.logStackTrace(e); - } - } - } catch (Throwable e) { - GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity."); - GT_Mod.logStackTrace(e); + if(!isDrop) { + aNBT.setByteArray("mRedstoneSided", mSidedRedstone); + aNBT.setBoolean("mRedstone", mRedstone); } + } - protected void loadMetaTileNBT(NBTTagCompound aNBT) { - if (mID != 0 && createNewMetatileEntity(mID)) { - NBTTagList tItemList = aNBT.getTagList("Inventory", 10); - for (int i = 0; i < tItemList.tagCount(); i++) { - NBTTagCompound tTag = tItemList.getCompoundTagAt(i); - int tSlot = tTag.getInteger("IntSlot"); - if (tSlot >= 0 && tSlot < getMetaTileEntity().getRealInventory().length) { - getMetaTileEntity().getRealInventory()[tSlot] = GT_Utility.loadItem(tTag); - } - } - try { - getMetaTileEntity().loadNBTData(aNBT); - } catch (Throwable e) { - GT_FML_LOGGER.error("Encountered Exception while loading MetaTileEntity."); - GT_Mod.logStackTrace(e); - } - } - } + 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"); - protected void loadCoverNBT(NBTTagCompound aNBT) { - mCoverSides = aNBT.getIntArray("mCoverSides"); - if (mCoverSides.length != 6) mCoverSides = new int[]{0, 0, 0, 0, 0, 0}; for (byte i = 0; i < 6; i++) mCoverBehaviors[i] = GregTech_API.getCoverBehaviorNew(mCoverSides[i]); // check old form of data mCoverData = new ISerializableObject[6]; if (aNBT.hasKey("mCoverData", 11) && aNBT.getIntArray("mCoverData").length == 6) { - int[] tOldData = aNBT.getIntArray("mCoverData"); + final int[] tOldData = aNBT.getIntArray("mCoverData"); for (int i = 0; i < tOldData.length; i++) { if(mCoverBehaviors[i] instanceof GT_Cover_Fluidfilter) { final String filterKey = String.format("fluidFilter%d", i); @@ -122,8 +93,7 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme } else { // no old data for (byte i = 0; i<6; i++) { - if (mCoverBehaviors[i] == null) - continue; + if (mCoverBehaviors[i] == null) continue; if (aNBT.hasKey(COVER_DATA_NBT_KEYS[i])) mCoverData[i] = mCoverBehaviors[i].createDataObject(aNBT.getTag(COVER_DATA_NBT_KEYS[i])); else @@ -132,84 +102,108 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme issueCoverUpdate(i); } } + } + public abstract boolean isStillValid(); protected boolean doCoverThings() { - for (byte i = 0; i < 6; i++) + for (byte i : ALL_VALID_SIDES) { if (getCoverIDAtSide(i) != 0) { - GT_CoverBehaviorBase<?> tCover = getCoverBehaviorAtSideNew(i); - int tCoverTickRate = tCover.getTickRate(i, getCoverIDAtSide(i), mCoverData[i], this); + final GT_CoverBehaviorBase<?> tCover = getCoverBehaviorAtSideNew(i); + final int tCoverTickRate = tCover.getTickRate(i, getCoverIDAtSide(i), mCoverData[i], this); if (tCoverTickRate > 0 && mTickTimer % tCoverTickRate == 0) { - byte tRedstone = tCover.isRedstoneSensitive(i, getCoverIDAtSide(i), mCoverData[i], this, mTickTimer) ? getInputRedstoneSignal(i) : 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 (!hasValidMetaTileEntity()) return false; + if (!isStillValid()) return false; } } + } return true; } + public abstract boolean allowCoverOnSide(byte aSide, GT_ItemStack aCoverID); + protected void checkDropCover() { - for (byte i = 0; i < 6; i++) + for (byte i : ALL_VALID_SIDES) if (getCoverIDAtSide(i) != 0) - if (!getMetaTileEntity().allowCoverOnSide(i, new GT_ItemStack(getCoverIDAtSide(i)))) + if (!allowCoverOnSide(i, new GT_ItemStack(getCoverIDAtSide(i)))) dropCover(i, i, true); } protected void updateCoverBehavior() { - for (byte i = 0; i < 6; i++) + for (byte i : ALL_VALID_SIDES) mCoverBehaviors[i] = GregTech_API.getCoverBehaviorNew(mCoverSides[i]); } @Override public void issueCoverUpdate(byte aSide) { - if ((getWorld() == null || isServerSide()) && getCoverBehaviorAtSideNew(aSide).isDataNeededOnClient(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) + // 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; } - public ITexture getCoverTexture(byte aSide) { + public final ITexture getCoverTexture(byte aSide) { if (getCoverIDAtSide(aSide) == 0) return null; if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) { return Textures.BlockIcons.HIDDEN_TEXTURE[0]; // See through } - ITexture coverTexture = getCoverBehaviorAtSideNew(aSide).getSpecialCoverTexture(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); + final ITexture coverTexture = getCoverBehaviorAtSideNew(aSide).getSpecialCoverTexture(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); return coverTexture != null ? coverTexture : GregTech_API.sCovers.get(new GT_ItemStack(getCoverIDAtSide(aSide))); } protected void requestCoverDataIfNeeded() { - for (byte i = 0; i < 6; i++) { + 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)); } } - protected abstract boolean hasValidMetaTileEntity(); - - protected boolean createNewMetatileEntity(short aID) { - if (aID <= 0 || aID >= GregTech_API.METATILEENTITIES.length || GregTech_API.METATILEENTITIES[aID] == null) { - GT_Log.err.println("MetaID " + aID + " not loadable => locking TileEntity!"); - } else { - if (hasValidMetaTileEntity()) getMetaTileEntity().setBaseMetaTileEntity(null); - GregTech_API.METATILEENTITIES[aID].newMetaEntity(this).setBaseMetaTileEntity(this); - mTickTimer = 0; - mID = aID; - return true; + @Override + public void setCoverIdAndDataAtSide(byte aSide, int aId, ISerializableObject aData) { + if(setCoverIDAtSideNoUpdate(aSide, aId)) { + setCoverDataAtSide(aSide, aData); + issueCoverUpdate(aSide); + issueBlockUpdate(); } - return false; } @Override public void setCoverIDAtSide(byte aSide, int aID) { + if (setCoverIDAtSideNoUpdate(aSide, aID)) { + issueCoverUpdate(aSide); + issueBlockUpdate(); + } + } + + @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(); - issueCoverUpdate(aSide); - issueBlockUpdate(); + return true; } + return false; + } + + @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); + } + + @Override + public void setCoverDataAtSide(byte aSide, ISerializableObject aData) { + if (aSide >= 0 && aSide < 6 && getCoverBehaviorAtSideNew(aSide) != null && getCoverBehaviorAtSideNew(aSide).cast(aData) != null) + mCoverData[aSide] = aData; } + @Override @Deprecated public GT_CoverBehavior getCoverBehaviorAtSide(byte aSide) { @@ -253,19 +247,6 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme } @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); - } - - @Override - public void setCoverDataAtSide(byte aSide, ISerializableObject aData) { - if (aSide >= 0 && aSide < 6 && getCoverBehaviorAtSideNew(aSide) != null && getCoverBehaviorAtSideNew(aSide).cast(aData) != null) - mCoverData[aSide] = aData; - } - - @Override public ISerializableObject getComplexCoverDataAtSide(byte aSide) { if (aSide >= 0 && aSide < 6 && getCoverBehaviorAtSideNew(aSide) != null) return mCoverData[aSide]; @@ -282,10 +263,10 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme @Override public boolean dropCover(byte aSide, byte aDroppedSide, boolean aForced) { if (getCoverBehaviorAtSideNew(aSide).onCoverRemoval(aSide, getCoverIDAtSide(aSide), mCoverData[aSide], this, aForced) || aForced) { - ItemStack tStack = getCoverBehaviorAtSideNew(aSide).getDrop(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); + final ItemStack tStack = getCoverBehaviorAtSideNew(aSide).getDrop(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); if (tStack != null) { getCoverBehaviorAtSideNew(aSide).onDropped(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); - EntityItem tEntity = new EntityItem(worldObj, getOffsetX(aDroppedSide, 1) + 0.5, getOffsetY(aDroppedSide, 1) + 0.5, getOffsetZ(aDroppedSide, 1) + 0.5, tStack); + 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; @@ -298,34 +279,99 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme } return false; } - + + @Override + public void setOutputRedstoneSignal(byte aSide, byte aStrength) { + aStrength = (byte) Math.min(Math.max(0, aStrength), 15); + if (aSide >= 0 && aSide < 6 && mSidedRedstone[aSide] != aStrength) { + mSidedRedstone[aSide] = aStrength; + issueBlockUpdate(); + } + } + + @Override + public void setStrongOutputRedstoneSignal(byte aSide, byte aStrength) { + mStrongRedstone |= (1 << aSide); + setOutputRedstoneSignal(aSide, aStrength); + } + + + @Override + public void setInternalOutputRedstoneSignal(byte aSide, byte aStrength) { + if (!getCoverBehaviorAtSideNew(aSide).manipulatesSidedRedstoneOutput(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) + setOutputRedstoneSignal(aSide, aStrength); + } + + @Override + public boolean getRedstone() { + return IntStream.range(1, 6).anyMatch(i -> getRedstone((byte) i)); + } + + @Override + public boolean getRedstone(byte aSide) { + return getInternalInputRedstoneSignal(aSide) > 0; + } + + @Override + public byte getStrongestRedstone() { + return (byte) IntStream.range(1, 6).map(i -> getInternalInputRedstoneSignal((byte) i)).max().orElse(0); + } + + @Override + public byte getStrongOutputRedstoneSignal(byte aSide) { + return aSide >= 0 && aSide < 6 && (mStrongRedstone & (1 << aSide)) != 0 ? (byte) (mSidedRedstone[aSide] & 15) : 0; + } + + @Override + public void setGenericRedstoneOutput(boolean aOnOff) { + mRedstone = aOnOff; + } + + @Override + public byte getInternalInputRedstoneSignal(byte aSide) { + return (byte) (getCoverBehaviorAtSideNew(aSide).getRedstoneInput(aSide, getInputRedstoneSignal(aSide), getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this) & 15); + } + + @Override + public byte getInputRedstoneSignal(byte aSide) { + return (byte) (worldObj.getIndirectPowerLevelTo(getOffsetX(aSide, 1), getOffsetY(aSide, 1), getOffsetZ(aSide, 1), aSide) & 15); + } + + @Override + public byte getOutputRedstoneSignal(byte aSide) { + return getCoverBehaviorAtSideNew(aSide).manipulatesSidedRedstoneOutput(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this) ? mSidedRedstone[aSide] : getGeneralRS(aSide); + } + protected void updateOutputRedstoneSignal(byte aSide) { setOutputRedstoneSignal(aSide, (byte) 0); } @Override - public void receiveCoverData(byte coverSide, int coverID, int coverData) { - if ((coverSide >= 0 && coverSide < 6) && (mCoverSides[coverSide] == coverID)) - setCoverDataAtSide(coverSide, coverData); + public void receiveCoverData(byte aCoverSide, int aCoverID, int aCoverData) { + if ((aCoverSide >= 0 && aCoverSide < 6)) + setCoverIDAtSideNoUpdate(aCoverSide, aCoverID); + setCoverDataAtSide(aCoverSide, aCoverData); } @Override public void receiveCoverData(byte aCoverSide, int aCoverID, ISerializableObject aCoverData, EntityPlayerMP aPlayer) { - if ((aCoverSide >= 0 && aCoverSide < 6) && (mCoverSides[aCoverSide] == aCoverID)) { + if ((aCoverSide >= 0 && aCoverSide < 6)) { + setCoverIDAtSideNoUpdate(aCoverSide, aCoverID); setCoverDataAtSide(aCoverSide, aCoverData); - if (isClientSide()) + if (isClientSide()) { getCoverBehaviorAtSideNew(aCoverSide).onDataChanged(aCoverSide, aCoverID, aCoverData, this); + } } } protected void sendCoverDataIfNeeded() { - int mCoverNeedUpdateLength = mCoverNeedUpdate.length; + if(worldObj == null || worldObj.isRemote) return; + final int mCoverNeedUpdateLength = mCoverNeedUpdate.length; for (byte i = 0; i < mCoverNeedUpdateLength; i++) { if (mCoverNeedUpdate[i]) { NW.sendPacketToAllPlayersInRange( worldObj, - new GT_Packet_SendCoverData( - i, getCoverIDAtSide(i), getComplexCoverDataAtSide(i), this), + new GT_Packet_SendCoverData(i, getCoverIDAtSide(i), getComplexCoverDataAtSide(i), this), xCoord, zCoord ); mCoverNeedUpdate[i] = false; @@ -336,13 +382,24 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme @Override public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { final NBTTagCompound tag = accessor.getNBTData(); - final int side = (byte)accessor.getSide().ordinal(); - final String filterKey = "filterInfo" + side; - - if (tag.hasKey(filterKey)) { - currenttip.add(tag.getString(filterKey)); + final byte side = (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 && coverSides[side] != 0) { + final int coverId = coverSides[side]; + final GT_CoverBehaviorBase<?> behavior = GregTech_API.getCoverBehaviorNew(coverId); + if (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(String.format("Cover: %s", coverStack.getDisplayName())); + final String behaviorDesc = behavior.getDescription(side, coverId, dataObject, null); + if (!Objects.equals(behaviorDesc, E)) currenttip.add(behaviorDesc); + } + } } - + // No super implementation // super.getWailaBody(itemStack, currenttip, accessor, config); } @@ -351,11 +408,34 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, int z) { // No super implementation // super.getWailaNBTData(player, tile, tag, world, x, y, z); - for(byte side=0 ; side < 6 ; side++) { - if(getCoverBehaviorAtSideNew(side) instanceof GT_Cover_Fluidfilter) { - tag.setString("filterInfo" + side, getCoverBehaviorAtSideNew(side).getDescription(side, getCoverIDAtSide(side), getComplexCoverDataAtSide(side), this)); + + // 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. + writeCoverNBT(tag, false); + } + + /** + * Add installed cover information, generally called from ItemBlock + * @param aNBT - NBTTagCompound from the stack + * @param aList - List to add the information to + */ + public static void addInstalledCoversInformation(NBTTagCompound aNBT, List<String> aList) { + if (aNBT.hasKey("mCoverSides")){ + final int[] mCoverSides = aNBT.getIntArray("mCoverSides"); + if (mCoverSides != null && mCoverSides.length == 6) { + for (byte tSide : ALL_VALID_SIDES) { + final int coverId = mCoverSides[tSide]; + if (coverId == 0) continue; + final GT_CoverBehaviorBase<?> behavior = GregTech_API.getCoverBehaviorNew(coverId); + if (behavior == null || behavior == GregTech_API.sNoBehavior) continue; + if (!aNBT.hasKey(CoverableTileEntity.COVER_DATA_NBT_KEYS[tSide])) continue; + final ISerializableObject dataObject = behavior.createDataObject(aNBT.getTag(CoverableTileEntity.COVER_DATA_NBT_KEYS[tSide])); + final ItemStack coverStack = behavior.getDisplayStack(coverId, dataObject); + if (coverStack != null) { + aList.add(String.format("Cover on %s side: %s", getTranslation(FACES[tSide]), coverStack.getDisplayName())); + } + } } } } - } diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileClientEvents.java b/src/main/java/gregtech/api/metatileentity/GregTechTileClientEvents.java index 6b70783470..c3c22415cb 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileClientEvents.java +++ b/src/main/java/gregtech/api/metatileentity/GregTechTileClientEvents.java @@ -1,6 +1,6 @@ package gregtech.api.metatileentity; -public class MetaTileClientEvents { +public 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 c8727131c8..9d07b1f9ba 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java @@ -304,19 +304,19 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { @Override public final void sendSound(byte aIndex) { if (!getBaseMetaTileEntity().hasMufflerUpgrade()) - getBaseMetaTileEntity().sendBlockEvent(MetaTileClientEvents.DO_SOUND, aIndex); + getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.DO_SOUND, aIndex); } @Override public final void sendLoopStart(byte aIndex) { if (!getBaseMetaTileEntity().hasMufflerUpgrade()) - getBaseMetaTileEntity().sendBlockEvent(MetaTileClientEvents.START_SOUND_LOOP, aIndex); + getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.START_SOUND_LOOP, aIndex); } @Override public final void sendLoopEnd(byte aIndex) { if (!getBaseMetaTileEntity().hasMufflerUpgrade()) - getBaseMetaTileEntity().sendBlockEvent(MetaTileClientEvents.STOP_SOUND_LOOP, aIndex); + getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.STOP_SOUND_LOOP, aIndex); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index a065dcd50f..b70d616a58 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -279,20 +279,20 @@ public abstract class MetaTileEntity implements IMetaTileEntity { @Override public final void sendSound(byte aIndex) { if (!getBaseMetaTileEntity().hasMufflerUpgrade()) - getBaseMetaTileEntity().sendBlockEvent(MetaTileClientEvents.DO_SOUND, aIndex); + getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.DO_SOUND, aIndex); } @Override public final void sendLoopStart(byte aIndex) { if (!getBaseMetaTileEntity().hasMufflerUpgrade()) - getBaseMetaTileEntity().sendBlockEvent(MetaTileClientEvents.START_SOUND_LOOP, aIndex); + getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.START_SOUND_LOOP, aIndex); mSoundRequests++; } @Override public final void sendLoopEnd(byte aIndex) { if (!getBaseMetaTileEntity().hasMufflerUpgrade()) - getBaseMetaTileEntity().sendBlockEvent(MetaTileClientEvents.STOP_SOUND_LOOP, aIndex); + getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.STOP_SOUND_LOOP, aIndex); } /** 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 bf87c03d79..12485806b3 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 @@ -452,7 +452,7 @@ public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity { final IFluidHandler fTileEntity = (tTileEntity instanceof IFluidHandler) ? (IFluidHandler) tTileEntity : null; if (fTileEntity != null) { - FluidTankInfo[] tInfo = fTileEntity.getTankInfo(ForgeDirection.getOrientation(tSide)); + final FluidTankInfo[] tInfo = fTileEntity.getTankInfo(ForgeDirection.getOrientation(tSide)); if (tInfo != null) { return tInfo.length > 0 || (GregTech_API.mTranslocator && isTranslocator(tTileEntity)) 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 db4f5b7603..218e064f71 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 @@ -2,6 +2,7 @@ package gregtech.api.metatileentity.implementations; import gregtech.GT_Mod; import gregtech.api.enums.Dyes; +import gregtech.api.enums.GT_Values; import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; import gregtech.api.interfaces.ITexture; @@ -338,7 +339,7 @@ public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileE cacheSides = super.getAccessibleSlotsFromSide(aSide); return cacheSides; } else { - return new int[0]; + return GT_Values.emptyIntArray; } } diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java index 8a7c1c0e49..e5a48f706d 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java @@ -10,6 +10,7 @@ import com.gtnewhorizon.structurelib.alignment.enumerable.Flip; import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import cpw.mods.fml.common.network.NetworkRegistry; +import gregtech.api.interfaces.ISecondaryDescribable; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; import net.minecraft.entity.player.EntityPlayer; @@ -17,6 +18,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; + /** * Enhanced multiblock base class, featuring following improvement over {@link GT_MetaTileEntity_MultiBlockBase} * <p> @@ -48,14 +50,13 @@ public abstract class GT_MetaTileEntity_EnhancedMultiBlockBase<T extends GT_Meta if(mMachine) stopMachine(); mExtendedFacing = newExtendedFacing; - IGregTechTileEntity base = getBaseMetaTileEntity(); + final IGregTechTileEntity base = getBaseMetaTileEntity(); mMachine = false; mUpdated = false; mUpdate = 100; if (getBaseMetaTileEntity().isServerSide()) { StructureLibAPI.sendAlignment((IAlignmentProvider) base, - new NetworkRegistry.TargetPoint(base.getWorld().provider.dimensionId, - base.getXCoord(), base.getYCoord(), base.getZCoord(), 512)); + new NetworkRegistry.TargetPoint(base.getWorld().provider.dimensionId, base.getXCoord(), base.getYCoord(), base.getZCoord(), 512)); } else { base.issueTextureUpdate(); } @@ -145,12 +146,12 @@ public abstract class GT_MetaTileEntity_EnhancedMultiBlockBase<T extends GT_Meta * All these offsets can be negative. */ protected final boolean checkPiece(String piece, int horizontalOffset, int verticalOffset, int depthOffset) { - IGregTechTileEntity tTile = getBaseMetaTileEntity(); + final IGregTechTileEntity tTile = getBaseMetaTileEntity(); return getCastedStructureDefinition().check(this, piece, tTile.getWorld(), getExtendedFacing(), tTile.getXCoord(), tTile.getYCoord(), tTile.getZCoord(), horizontalOffset, verticalOffset, depthOffset, !mMachine); } protected final boolean buildPiece(String piece, ItemStack trigger, boolean hintOnly, int horizontalOffset, int verticalOffset, int depthOffset) { - IGregTechTileEntity tTile = getBaseMetaTileEntity(); + final IGregTechTileEntity tTile = getBaseMetaTileEntity(); return getCastedStructureDefinition().buildOrHints(this, trigger, piece, tTile.getWorld(), getExtendedFacing(), tTile.getXCoord(), tTile.getYCoord(), tTile.getZCoord(), horizontalOffset, verticalOffset, depthOffset, hintOnly); } |