/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.blocks.machine.beta;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Iterator;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import mods.railcraft.common.blocks.machine.TileMachineItem;
import mods.railcraft.common.plugins.forge.WorldPlugin;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.misc.MiscTools;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.passive.EntityOcelot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import static net.minecraftforge.common.util.ForgeDirection.DOWN;
import static net.minecraftforge.common.util.ForgeDirection.UP;
/**
*
* @author CovertJaguar <http://www.railcraft.info>
*/
public abstract class TileChestRailcraft extends TileMachineItem {
private static final ForgeDirection[] UP_DOWN_AXES = new ForgeDirection[]{UP, DOWN};
private static final int TICK_PER_SYNC = 64;
private ForgeDirection facing = ForgeDirection.EAST;
public float lidAngle;
public float prevLidAngle;
public int numUsingPlayers;
public TileChestRailcraft() {
super(27);
}
public final ForgeDirection getFacing() {
return facing;
}
@Override
public void onBlockPlacedBy(EntityLivingBase entityliving, ItemStack stack) {
super.onBlockPlacedBy(entityliving, stack);
facing = MiscTools.getHorizontalSideClosestToPlayer(worldObj, xCoord, yCoord, zCoord, entityliving);
}
@Override
public final boolean rotateBlock(ForgeDirection axis) {
if (axis == UP || axis == DOWN)
return false;
if (facing == axis)
facing = axis.getOpposite();
else
facing = axis;
markBlockForUpdate();
return true;
}
@Override
public final ForgeDirection[] getValidRotations() {
return UP_DOWN_AXES;
}
@Override
public final boolean openGui(EntityPlayer player) {
if (worldObj.isSideSolid(xCoord, yCoord + 1, zCoord, ForgeDirection.DOWN))
return false;
else if (isCatOnChest())
return false;
if (Game.isHost(worldObj))
player.displayGUIChest((IInventory) this);
return true;
}
private boolean isCatOnChest() {
int x = xCoord;
int y = yCoord;
int z = zCoord;
Iterator it = worldObj.getEntitiesWithinAABB(EntityOcelot.class, AxisAlignedBB.getBoundingBox(x, (y + 1), z, (x + 1), (y + 2), (z + 1))).iterator();
EntityOcelot cat;
do {
if (!it.hasNext())
return false;
EntityOcelot entityocelot = (EntityOcelot) it.next();
cat = (EntityOcelot) entityocelot;
} while (!cat.isSitting());
return true;
}
@Override
public void updateEntity() {
super.updateEntity();
if (clock % TICK_PER_SYNC == 0)
WorldPlugin.addBlockEvent(worldObj, xCoord, yCoord, zCoord, getBlockType(), 1, numUsingPlayers);
this.prevLidAngle = this.lidAngle;
float angleChange = 0.1F;
if (this.numUsingPlayers > 0 && this.lidAngle == 0.0F)
this.worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "random.chestopen", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F);
if (this.numUsingPlayers == 0 && this.lidAngle > 0.0F || this.numUsingPlayers > 0 && this.lidAngle < 1.0F) {
float angle = this.lidAngle;
if (this.numUsingPlayers > 0)
this.lidAngle += angleChange;
else
this.lidAngle -= angleChange;
if (this.lidAngle > 1.0F)
this.lidAngle = 1.0F;
float openAngle = 0.5F;
if (this.lidAngle < openAngle && angle >= openAngle)
this.worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "random.chestclosed", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F);
if (this.lidAngle < 0.0F)
this.lidAngle = 0.0F;
}
}
@Override
public boolean receiveClientEvent(int id, int value) {
if (id == 1) {
this.numUsingPlayers = value;
return true;
}
return super.receiveClientEvent(id, value);
}
@Override
public void openInventory() {
++this.numUsingPlayers;
WorldPlugin.addBlockEvent(worldObj, xCoord, yCoord, zCoord, getBlockType(), 1, numUsingPlayers);
}
@Override
public void closeInventory() {
--this.numUsingPlayers;
WorldPlugin.addBlockEvent(worldObj, xCoord, yCoord, zCoord, getBlockType(), 1, numUsingPlayers);
}
@Override
public void writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
data.setByte("facing", (byte) facing.ordinal());
}
@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
facing = ForgeDirection.getOrientation(data.getByte("facing"));
}
@Override
public void writePacketData(DataOutputStream data) throws IOException {
super.writePacketData(data);
data.writeByte((byte) facing.ordinal());
}
@Override
public void readPacketData(DataInputStream data) throws IOException {
super.readPacketData(data);
facing = ForgeDirection.getOrientation(data.readByte());
}
}