diff options
Diffstat (limited to 'src/main/java/gregtech/api/metatileentity')
5 files changed, 89 insertions, 59 deletions
diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java index bd060d9ae8..e0125ae50a 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java @@ -8,10 +8,8 @@ import java.util.Arrays; import java.util.List; import java.util.UUID; -import gregtech.GT_Mod; import gregtech.api.GregTech_API; import gregtech.api.enums.Textures; -import gregtech.api.enums.Textures.BlockIcons; import gregtech.api.graphs.Node; import gregtech.api.graphs.paths.NodePath; import gregtech.api.interfaces.ITexture; @@ -25,12 +23,9 @@ import gregtech.api.util.GT_Log; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.GT_Utility; -import gregtech.api.util.ISerializableObject; -import gregtech.common.GT_Client; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -147,6 +142,9 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I oZ = zCoord; if (isServerSide()) checkDropCover(); + else { + requestCoverDataIfNeeded(); + } worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this); mMetaTileEntity.onFirstTick(this); if (!hasValidMetaTileEntity()) return; @@ -247,6 +245,7 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I ); mSendClientData = false; } + sendCoverDataIfNeeded(); } @Override @@ -371,22 +370,11 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I @Override public void issueCoverUpdate(byte aSide) { + super.issueCoverUpdate(aSide); issueClientUpdate(); } @Override - public void receiveCoverData(byte coverSide, int coverID, int coverData) { - if ((coverSide >= 0 && coverSide < 6) && (mCoverSides[coverSide] == coverID)) - setCoverDataAtSide(coverSide, coverData); - } - - @Override - public void receiveCoverData(byte aCoverSide, int aCoverID, ISerializableObject aCoverData, EntityPlayerMP aPlayer) { - if ((aCoverSide >= 0 && aCoverSide < 6) && (mCoverSides[aCoverSide] == aCoverID)) - setCoverDataAtSide(aCoverSide, aCoverData); - } - - @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)))))); } @@ -401,14 +389,6 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I return getInternalInputRedstoneSignal(aSide) > 0; } - public ITexture getCoverTexture(byte aSide) { - if (getCoverIDAtSide(aSide) == 0) return null; - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) { - return BlockIcons.HIDDEN_TEXTURE[0]; // See through - } - return GregTech_API.sCovers.get(new GT_ItemStack(getCoverIDAtSide(aSide))); - } - @Override public boolean isGivingInformation() { if (canAccessData()) return mMetaTileEntity.isGivingInformation(); @@ -860,8 +840,8 @@ public class BaseMetaPipeEntity extends CoverableGregTechTileEntity implements I if (getCoverIDAtSide(aSide) == 0) coverSide = tSide; if (getCoverIDAtSide(coverSide) == 0) { - if (GregTech_API.sCovers.containsKey(new GT_ItemStack(tCurrentItem))) { - if (GregTech_API.getCoverBehaviorNew(tCurrentItem).isCoverPlaceable(coverSide, new GT_ItemStack(tCurrentItem), this) && + if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) { + if (GregTech_API.getCoverBehaviorNew(tCurrentItem).isCoverPlaceable(coverSide, tCurrentItem, this) && mMetaTileEntity.allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) { setCoverItemAtSide(coverSide, tCurrentItem); diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index ddcb9b99cd..5786edc8ce 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -19,7 +19,6 @@ import gregtech.GT_Mod; import gregtech.api.GregTech_API; import gregtech.api.enums.ItemList; import gregtech.api.enums.Textures; -import gregtech.api.enums.Textures.BlockIcons; import gregtech.api.graphs.GenerateNodeMap; import gregtech.api.graphs.GenerateNodeMapPower; import gregtech.api.graphs.Node; @@ -32,7 +31,6 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; import gregtech.api.net.GT_Packet_TileEntity; import gregtech.api.objects.GT_ItemStack; import gregtech.api.util.*; -import gregtech.common.GT_Client; import gregtech.common.GT_Pollution; import ic2.api.Direction; import net.minecraft.block.Block; @@ -40,7 +38,6 @@ import net.minecraft.block.BlockFire; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -271,6 +268,8 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I oZ = zCoord; if (aSideServer) { checkDropCover(); + } else { + requestCoverDataIfNeeded(); } worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this); mMetaTileEntity.onFirstTick(this); @@ -552,6 +551,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I ); mSendClientData = false; } + sendCoverDataIfNeeded(); } @Override @@ -706,22 +706,11 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I @Override public void issueCoverUpdate(byte aSide) { + super.issueCoverUpdate(aSide); issueClientUpdate(); } @Override - public void receiveCoverData(byte coverSide, int coverID, int coverData) { - if ((coverSide >= 0 && coverSide < 6) && (mCoverSides[coverSide] == coverID)) - setCoverDataAtSide(coverSide, coverData); - } - - @Override - public void receiveCoverData(byte aCoverSide, int aCoverID, ISerializableObject aCoverData, EntityPlayerMP aPlayer) { - if ((aCoverSide >= 0 && aCoverSide < 6) && (mCoverSides[aCoverSide] == aCoverID)) - setCoverDataAtSide(aCoverSide, aCoverData); - } - - @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)))))); } @@ -736,14 +725,6 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I return getInternalInputRedstoneSignal(aSide) > 0; } - public ITexture getCoverTexture(byte aSide) { - if (getCoverIDAtSide(aSide) == 0) return null; - if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) { - return BlockIcons.HIDDEN_TEXTURE[0]; // See through - } - return GregTech_API.sCovers.get(new GT_ItemStack(getCoverIDAtSide(aSide))); - } - @Override public boolean isGivingInformation() { if (canAccessData()) return mMetaTileEntity.isGivingInformation(); @@ -1403,8 +1384,8 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I if (getCoverIDAtSide(aSide) == 0) coverSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); if (getCoverIDAtSide(coverSide) == 0) { - if (GregTech_API.sCovers.containsKey(new GT_ItemStack(tCurrentItem))) { - if (GregTech_API.getCoverBehaviorNew(tCurrentItem).isCoverPlaceable(coverSide, new GT_ItemStack(tCurrentItem), this) && + if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) { + if (GregTech_API.getCoverBehaviorNew(tCurrentItem).isCoverPlaceable(coverSide, tCurrentItem, this) && mMetaTileEntity.allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) { setCoverItemAtSide(coverSide, tCurrentItem); diff --git a/src/main/java/gregtech/api/metatileentity/CoverableGregTechTileEntity.java b/src/main/java/gregtech/api/metatileentity/CoverableGregTechTileEntity.java index 0460f93f78..13bb70dbda 100644 --- a/src/main/java/gregtech/api/metatileentity/CoverableGregTechTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/CoverableGregTechTileEntity.java @@ -2,15 +2,21 @@ 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.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; 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; @@ -20,13 +26,15 @@ import net.minecraftforge.fluids.FluidRegistry; import java.util.Arrays; import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.api.enums.GT_Values.NW; public abstract class CoverableGregTechTileEntity extends BaseTileEntity implements IGregTechTileEntity { - static final String[] COVER_DATA_NBT_KEYS = Arrays.stream(ForgeDirection.VALID_DIRECTIONS).mapToInt(Enum::ordinal).mapToObj(i -> "mCoverData" + i).toArray(String[]::new); + 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 int[] mCoverSides = new int[]{0, 0, 0, 0, 0, 0}; protected ISerializableObject[] mCoverData = new ISerializableObject[6]; + protected final boolean[] mCoverNeedUpdate = new boolean[]{false, false, false, false, false, false}; protected short mID = 0; public long mTickTimer = 0; @@ -115,6 +123,8 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme mCoverData[i] = mCoverBehaviors[i].createDataObject(aNBT.getTag(COVER_DATA_NBT_KEYS[i])); else mCoverData[i] = mCoverBehaviors[i].createDataObject(); + if (mCoverBehaviors[i].isDataNeededOnClient(i, mCoverSides[i], mCoverData[i], this)) + issueCoverUpdate(i); } } } @@ -145,7 +155,29 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme mCoverBehaviors[i] = GregTech_API.getCoverBehaviorNew(mCoverSides[i]); } - protected abstract boolean hasValidMetaTileEntity(); + @Override + public void issueCoverUpdate(byte aSide) { + if (isServerSide() && getCoverBehaviorAtSideNew(aSide).isDataNeededOnClient(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) + mCoverNeedUpdate[aSide] = true; + } + + public 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); + return coverTexture != null ? coverTexture : GregTech_API.sCovers.get(new GT_ItemStack(getCoverIDAtSide(aSide))); + } + + protected void requestCoverDataIfNeeded() { + for (byte i = 0; i < 6; i++) { + 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) { @@ -162,7 +194,9 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme @Override public void setCoverIDAtSide(byte aSide, int aID) { - if (aSide >= 0 && aSide < 6) { + 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(); @@ -192,7 +226,7 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme @Override public ItemStack getCoverItemAtSide(byte aSide) { - return GT_Utility.intToStack(getCoverIDAtSide(aSide)); + return getCoverBehaviorAtSideNew(aSide).getDisplayStack(getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide)); } @Override @@ -245,7 +279,7 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme if (getCoverBehaviorAtSideNew(aSide).onCoverRemoval(aSide, getCoverIDAtSide(aSide), mCoverData[aSide], this, aForced) || aForced) { ItemStack tStack = getCoverBehaviorAtSideNew(aSide).getDrop(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); if (tStack != null) { - tStack.setTagCompound(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); tEntity.motionX = 0; tEntity.motionY = 0; @@ -264,4 +298,33 @@ public abstract class CoverableGregTechTileEntity extends BaseTileEntity impleme 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); + } + + @Override + public void receiveCoverData(byte aCoverSide, int aCoverID, ISerializableObject aCoverData, EntityPlayerMP aPlayer) { + if ((aCoverSide >= 0 && aCoverSide < 6) && (mCoverSides[aCoverSide] == aCoverID)) { + setCoverDataAtSide(aCoverSide, aCoverData); + if (isClientSide()) + getCoverBehaviorAtSideNew(aCoverSide).onDataChanged(aCoverSide, aCoverID, aCoverData, this); + } + } + + protected void sendCoverDataIfNeeded() { + 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), + xCoord, zCoord + ); + mCoverNeedUpdate[i] = false; + } + } + } } 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 8f54112885..a2de864f41 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 @@ -55,6 +55,7 @@ public abstract class GT_MetaTileEntity_EnhancedMultiBlockBase<T extends GT_Meta mExtendedFacing = newExtendedFacing; IGregTechTileEntity base = getBaseMetaTileEntity(); mMachine = false; + mUpdated = false; mUpdate = 100; if (getBaseMetaTileEntity().isServerSide()) { StructureLibAPI.sendAlignment((IAlignmentProvider) base, diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java index 8fa9819e6a..5564ff6b88 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java @@ -39,7 +39,8 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity { public boolean mMachine = false, mWrench = false, mScrewdriver = false, mSoftHammer = false, mHardHammer = false, mSolderingTool = false, mCrowbar = false, mRunningOnLoad = false; public boolean mStructureChanged = false; public int mPollution = 0, mProgresstime = 0, mMaxProgresstime = 0, mEUt = 0, mEfficiencyIncrease = 0, mStartUpCheck = 100, mRuntime = 0, mEfficiency = 0; - public volatile int mUpdate = 0; //TODO: Replace with AtomicInteger + public volatile boolean mUpdated = false; + public int mUpdate = 0; public ItemStack[] mOutputItems = null; public FluidStack[] mOutputFluids = null; public String mNEI; @@ -243,7 +244,7 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity { @Override public void onMachineBlockUpdate() { - mUpdate = 50; + mUpdated = true; } /** @@ -280,6 +281,10 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity { public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { if (aBaseMetaTileEntity.isServerSide()) { if (mEfficiency < 0) mEfficiency = 0; + if (mUpdated) { + mUpdate = 50; + mUpdated = false; + } if (--mUpdate == 0 || --mStartUpCheck == 0) { checkStructure(true, aBaseMetaTileEntity); } |