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/BaseTileEntity.java | |
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/BaseTileEntity.java')
-rw-r--r-- | src/main/java/gregtech/api/metatileentity/BaseTileEntity.java | 114 |
1 files changed, 79 insertions, 35 deletions
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(); - } } |