/*
* 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 mods.railcraft.api.tracks.ITrackCustomPlaced;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import mods.railcraft.common.blocks.RailcraftBlocks;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.block.Block;
public class TrackSuspended extends TrackUnsupported implements ITrackCustomPlaced {
@Override
public EnumTrack getTrackType() {
return EnumTrack.SUSPENDED;
}
@Override
public void onBlockPlaced() {
super.onBlockPlaced();
if (!isSupported())
breakRail();
}
@Override
public void onNeighborBlockChange(Block block) {
World world = getWorld();
int i = tileEntity.xCoord;
int j = tileEntity.yCoord;
int k = tileEntity.zCoord;
if (isSupported()) {
Block myBlock = RailcraftBlocks.getBlockTrack();
if (block != myBlock) {
world.notifyBlocksOfNeighborChange(i + 1, j, k, myBlock);
world.notifyBlocksOfNeighborChange(i - 1, j, k, myBlock);
world.notifyBlocksOfNeighborChange(i, j, k + 1, myBlock);
world.notifyBlocksOfNeighborChange(i, j, k - 1, myBlock);
}
} else
breakRail();
}
public void breakRail() {
if (Game.isHost(getWorld()))
getWorld().func_147480_a(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord, true);
}
public boolean isSupportedRail(World world, int i, int j, int k, int meta) {
if (!TrackTools.isRailBlockAt(world, i, j, k))
return false;
if (isSupportedBelow(world, i, j, k))
return true;
if (meta == EnumTrackMeta.NORTH_SOUTH.ordinal()) {
if (isSupportedBelow(world, i, j, k + 1))
return true;
return isSupportedBelow(world, i, j, k - 1);
} else if (meta == EnumTrackMeta.EAST_WEST.ordinal()) {
if (isSupportedBelow(world, i + 1, j, k))
return true;
return isSupportedBelow(world, i - 1, j, k);
}
return false;
}
public boolean isSupportedBelow(World world, int i, int j, int k) {
if (!world.blockExists(i, j, k))
return true;
if (TrackTools.isRailBlockAt(world, i, j, k))
return world.isSideSolid(i, j - 1, k, ForgeDirection.UP);
return false;
}
public boolean isSupported() {
int meta = tileEntity.getBlockMetadata();
return isSupported(getWorld(), tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord, meta);
}
public boolean isSupported(World world, int i, int j, int k, int meta) {
if (isSupportedRail(world, i, j, k, meta))
return true;
if (meta == EnumTrackMeta.NORTH_SOUTH.ordinal())
return isSupportedRail(world, i, j, k + 1, meta) || isSupportedRail(world, i, j, k - 1, meta);
else if (meta == EnumTrackMeta.EAST_WEST.ordinal())
return isSupportedRail(world, i + 1, j, k, meta) || isSupportedRail(world, i - 1, j, k, meta);
return false;
}
@Override
public boolean canPlaceRailAt(World world, int i, int j, int k) {
// if(BlockRail.isRailBlockAt(world, i, j - 1, k)) {
// return false;
// }
// if(BlockRail.isRailBlockAt(world, i, j + 1, k)) {
// return false;
// }
if (isSupported(world, i, j, k, 0) || isSupported(world, i, j, k, 1))
return true;
return world.isSideSolid(i, j - 1, k, ForgeDirection.UP);
}
}