package openblocks.common.tileentity;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.WorldServer;
import net.minecraftforge.common.util.ForgeDirection;
import openmods.api.INeighbourAwareTile;
import openmods.fakeplayer.BreakBlockAction;
import openmods.fakeplayer.FakePlayerPool;
import openmods.include.IncludeInterface;
import openmods.inventory.GenericInventory;
import openmods.inventory.legacy.ItemDistribution;
import openmods.sync.SyncableBoolean;
import openmods.tileentity.SyncedTileEntity;
public class TileEntityBlockBreaker extends SyncedTileEntity implements INeighbourAwareTile {
private static final int EVENT_ACTIVATE = 3;
// DON'T remove this object, even though it seems unused. Without it Builcraft pipes won't connect. -B
@IncludeInterface(IInventory.class)
private final GenericInventory inventory = registerInventoryCallback(new GenericInventory("blockbreaker", true, 1) {
@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack) {
return false;
}
});
private int redstoneAnimTimer;
private SyncableBoolean activated;
public TileEntityBlockBreaker() {
syncMap.addUpdateListener(createRenderUpdateListener());
}
@Override
protected void createSyncedFields() {
activated = new SyncableBoolean(false);
}
@SideOnly(Side.CLIENT)
public boolean isActivated() {
return activated.get();
}
@Override
public void updateEntity() {
super.updateEntity();
if (!worldObj.isRemote && activated.get()) {
if (redstoneAnimTimer <= 0) {
activated.set(false);
sync();
} else redstoneAnimTimer--;
}
}
private void setRedstoneSignal(boolean redstoneSignal) {
if (worldObj.isRemote) return;
if (redstoneSignal) {
redstoneAnimTimer = 5;
activated.set(true);
sync();
triggerBreakBlock();
}
}
private boolean canBreakBlock(Block block, int x, int y, int z) {
return !block.isAir(worldObj, x, y, z) && block != Blocks.bedrock && block.getBlockHardness(worldObj, z, y, z) > -1.0F;
}
private void triggerBreakBlock() {
final ForgeDirection direction = getOrientation().up();
final int x = xCoord + direction.offsetX;
final int y = yCoord + direction.offsetY;
final int z = zCoord + direction.offsetZ;
if (worldObj.blockExists(x, y, z)) {
final Block block = worldObj.getBlock(x, y, z);
if (canBreakBlock(block, x, y, z)) sendBlockEvent(EVENT_ACTIVATE, 0);
}
worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "tile.piston.in", 0.5F, worldObj.rand.nextFloat() * 0.15F + 0.6F);
}
@Override
public boolean receiveClientEvent(int event, int param) {
if (event == EVENT_ACTIVATE) {
breakBlock();
return true;
}
return false;
}
public void breakBlock() {
if (!(worldObj instanceof WorldServer)) return;
final ForgeDirection direction = getOrientation().up();
final int x = xCoord + direction.offsetX;
final int y = yCoord + direction.offsetY;
final int z = zCoord + direction.offsetZ;
if (!worldObj.blockExists(x, y, z)) return;
final Block block = worldObj.getBlock(x, y, z);
if (!canBreakBlock(block, x, y, z)) return;
final List<EntityItem> drops = FakePlayerPool.instance.executeOnPlayer((WorldServer)worldObj, new BreakBlockAction(worldObj, x, y, z));
tryInjectItems(drops, direction.getOpposite());
}
private void tryInjectItems(List<EntityItem> drops, ForgeDirection direction) {
TileEntity targetInventory = getTileInDirection(direction);
if (targetInventory == null) return;
for (EntityItem drop : drops) {
ItemStack stack = drop.getEntityItem();
ItemDistribution.insertItemInto(stack, targetInventory, direction, true);
if (stack.stackSize <= 0) drop.setDead();
}
}
@Override
public void onNeighbourChanged(Block block) {
if (!worldObj.isRemote) {
setRedstoneSignal(worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord));
}
}
@Override
public void writeToNBT(NBTTagCompound tag) {
super.writeToNBT(tag);
inventory.writeToNBT(tag);
}
@Override
public void readFromNBT(NBTTagCompound tag) {
super.readFromNBT(tag);
inventory.readFromNBT(tag);
}
}