/*
* 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.tracks;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraftforge.common.util.ForgeDirection;
import mods.railcraft.api.core.IPostConnection;
import mods.railcraft.api.tracks.ITrackBlocksMovement;
import mods.railcraft.api.tracks.ITrackCustomShape;
import mods.railcraft.api.tracks.ITrackPowered;
import mods.railcraft.api.tracks.ITrackReversable;
import mods.railcraft.common.util.misc.MiscTools;
import mods.railcraft.common.util.sounds.SoundHelper;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.world.IBlockAccess;
import static net.minecraftforge.common.util.ForgeDirection.DOWN;
import static net.minecraftforge.common.util.ForgeDirection.UP;
// Referenced classes of package net.minecraft.src:
// TileEntity, NBTTagCompound, World
public class TrackGated extends TrackBaseRailcraft implements ITrackReversable, ITrackPowered, ITrackCustomShape, IPostConnection, ITrackBlocksMovement {
protected boolean powered;
protected boolean open;
protected boolean reversed;
@Override
public EnumTrack getTrackType() {
return EnumTrack.GATED;
}
@Override
public boolean blockActivated(EntityPlayer player) {
if (!super.blockActivated(player))
setOpen(!open);
return true;
}
@Override
public AxisAlignedBB getSelectedBoundingBoxFromPool() {
return AxisAlignedBB.getBoundingBox(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord, tileEntity.xCoord + 1, tileEntity.yCoord + 1, tileEntity.zCoord + 1);
}
@Override
public MovingObjectPosition collisionRayTrace(Vec3 vec3d, Vec3 vec3d1) {
return MiscTools.collisionRayTrace(vec3d, vec3d1, getX(), getY(), getZ());
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool() {
int meta = tileEntity.getBlockMetadata();
if (isGateOpen())
return null;
if (meta == 0)
return AxisAlignedBB.getBoundingBox(tileEntity.xCoord, tileEntity.yCoord, (float) tileEntity.zCoord + 0.375F, tileEntity.xCoord + 1, (float) tileEntity.yCoord + 1.5F, (float) tileEntity.zCoord + 0.625F);
else
return AxisAlignedBB.getBoundingBox((float) tileEntity.xCoord + 0.375F, tileEntity.yCoord, tileEntity.zCoord, (float) tileEntity.xCoord + 0.625F, (float) tileEntity.yCoord + 1.5F, tileEntity.zCoord + 1);
}
@Override
public boolean canMakeSlopes() {
return false;
}
public boolean isOpen() {
return open;
}
public void setOpen(boolean open) {
boolean state = isGateOpen();
this.open = open;
if (state != isGateOpen()) {
playSound();
sendUpdateToClient();
}
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setBoolean("powered", powered);
nbttagcompound.setBoolean("open", open);
nbttagcompound.setBoolean("reversed", reversed);
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
super.readFromNBT(nbttagcompound);
powered = nbttagcompound.getBoolean("powered");
open = nbttagcompound.getBoolean("open");
reversed = nbttagcompound.getBoolean("reversed");
}
@Override
public void writePacketData(DataOutputStream data) throws IOException {
super.writePacketData(data);
data.writeBoolean(powered);
data.writeBoolean(reversed);
data.writeBoolean(open);
}
@Override
public void readPacketData(DataInputStream data) throws IOException {
super.readPacketData(data);
setPowered(data.readBoolean());
setReversed(data.readBoolean());
setOpen(data.readBoolean());
markBlockNeedsUpdate();
}
@Override
public boolean isReversed() {
return reversed;
}
@Override
public void setReversed(boolean reversed) {
this.reversed = reversed;
}
@Override
public boolean isPowered() {
return powered;
}
@Override
public void setPowered(boolean powered) {
boolean state = isGateOpen();
this.powered = powered;
if (state != isGateOpen()) {
playSound();
sendUpdateToClient();
}
}
private void playSound() {
if (Game.isHost(getWorld()))
SoundHelper.playFX(getWorld(), null, 1003, tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord, 0);
}
public boolean isGateOpen() {
return isPowered() || isOpen();
}
@Override
public ConnectStyle connectsToPost(IBlockAccess world, int x, int y, int z, ForgeDirection side) {
switch (side) {
case UP:
case DOWN:
return ConnectStyle.NONE;
default:
return ConnectStyle.TWO_THIN;
}
}
@Override
public boolean blocksMovement() {
return !isGateOpen();
}
}