blob: d54294296ab3f458b1ffa7648ceaba5711473d31 [file] [log] [blame] [raw]
package appeng.api;
import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import appeng.api.events.GridTileUnloadEvent;
import appeng.api.exceptions.AppEngTileMissingException;
import appeng.api.me.tiles.IGridTileEntity;
public class TileRef<T> extends WorldCoord {
//private int dimension;
private World w;
private Class myType;
boolean wasGrid;
public TileRef( TileEntity gte ) {
super( gte.xCoord, gte.yCoord, gte.zCoord );
TileEntity te = gte;
myType = gte.getClass();
wasGrid = te instanceof IGridTileEntity;
w = te.worldObj;
if ( te.worldObj == null )
throw new RuntimeException("Tile has no world.");
}
@SuppressWarnings("unchecked")
public T getTile() throws AppEngTileMissingException
{
// there might be a possible tick where we have TileRefs for unloaded tiles?
if ( w.getChunkProvider().chunkExists(x >> 4, z >> 4) )
{
TileEntity te = w.getBlockTileEntity( x, y, z );
if ( te != null && myType.isInstance( te ) )
return (T)te;
}
/**
* was this a grid tile? if so inform the grid enum that something has derped.
*/
if ( wasGrid )
{
wasGrid = false; // no need to keep this up..
MinecraftForge.EVENT_BUS.post( new GridTileUnloadEvent( null, w, this ) );
}
throw new AppEngTileMissingException( w, x,y,z);
}
public DimentionalCoord getCoord() {
return new DimentionalCoord( w, x, y, z );
}
@Override
public boolean equals(Object obj) {
// is it the same?
if ( obj instanceof TileEntity )
{
TileEntity te = (TileEntity) obj;
return w == te.worldObj && te.xCoord == x && te.yCoord == y && te.zCoord == z;
}
return super.equals( obj );
}
};