/*
* 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.signals;
import mods.railcraft.api.signals.SignalAspect;
import mods.railcraft.common.plugins.buildcraft.triggers.IAspectProvider;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.misc.MiscTools;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import static net.minecraftforge.common.util.ForgeDirection.DOWN;
import static net.minecraftforge.common.util.ForgeDirection.UP;
public abstract class TileSignalBase extends TileSignalFoundation implements ISignalTile, IAspectProvider {
private static final ForgeDirection[] UP_DOWN_AXES = new ForgeDirection[]{UP, DOWN};
protected static final float BOUNDS = 0.15f;
private ForgeDirection facing = ForgeDirection.NORTH;
private int prevLightValue;
@Override
public 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 ForgeDirection[] getValidRotations() {
return UP_DOWN_AXES;
}
@Override
public void setBlockBoundsBasedOnState(IBlockAccess world, int i, int j, int k) {
getBlockType().setBlockBounds(BOUNDS, 0.35f, BOUNDS, 1 - BOUNDS, 1f, 1 - BOUNDS);
}
@Override
public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int i, int j, int k) {
return AxisAlignedBB.getBoundingBox(i + BOUNDS, j + 0.35f, k + BOUNDS, i + 1 - BOUNDS, j + 1, k + 1 - BOUNDS);
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k) {
return AxisAlignedBB.getBoundingBox(i + BOUNDS, j + 0.35f, k + BOUNDS, i + 1 - BOUNDS, j + 1, k + 1 - BOUNDS);
}
@Override
public boolean canUpdate() {
return true;
}
@Override
public void updateEntity() {
super.updateEntity();
if(Game.isNotHost(worldObj)){
boolean needsUpdate = false;
int lightValue = getLightValue();
if (prevLightValue != lightValue) {
prevLightValue = lightValue;
worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord);
needsUpdate = true;
}
if (needsUpdate) {
markBlockForUpdate();
}
}
}
protected boolean isLit(SignalAspect aspect) {
return aspect != SignalAspect.OFF && !aspect.isBlinkAspect();
}
protected boolean isLit() {
return isLit(getSignalAspect());
}
protected boolean isBlinking() {
return getSignalAspect().isBlinkAspect();
}
@Override
public int getLightValue() {
if (isLit()) {
return 5;
}
if(isBlinking()) {
return 3;
}
return 0;
}
public void setFacing(ForgeDirection facing) {
this.facing = facing;
}
public 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 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());
markBlockForUpdate();
}
public abstract SignalAspect getSignalAspect();
@Override
public SignalAspect getTriggerAspect() {
return getSignalAspect();
}
}