aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java
diff options
context:
space:
mode:
authorJason Mitchell <mitchej@gmail.com>2022-04-18 11:16:31 -0700
committerGitHub <noreply@github.com>2022-04-18 20:16:31 +0200
commit44a1027dfa51af1864364c391e67686590ce347f (patch)
tree5f2fa25724841885d9e0cb721a7806812aca8016 /src/main/java/gregtech/api/metatileentity/BaseTileEntity.java
parentbb4cec9a73ec6c50199de6c48119ddd85e23b013 (diff)
downloadGT5-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.java114
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();
- }
}