/*
* 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.core.items.ITrackItem;
import mods.railcraft.api.tracks.ITrackInstance;
import mods.railcraft.api.tracks.TrackSpec;
import mods.railcraft.common.blocks.RailcraftBlocks;
import mods.railcraft.common.blocks.tracks.speedcontroller.SpeedControllerHighSpeed;
import mods.railcraft.common.plugins.forge.WorldPlugin;
import mods.railcraft.common.util.inventory.InvTools;
import net.minecraft.block.Block;
import net.minecraft.block.BlockRailBase;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* @author CovertJaguar <http://www.railcraft.info>
*/
public class TrackTools {
public static final int TRAIN_LOCKDOWN_DELAY = 200;
public static boolean isRailBlockAt(IBlockAccess world, int x, int y, int z) {
return isRailBlock(WorldPlugin.getBlock(world, x, y, z));
}
public static boolean isStraightTrackAt(IBlockAccess world, int x, int y, int z) {
Block block = WorldPlugin.getBlock(world, x, y, z);
if (isRailBlock(block))
return getTrackMetaEnum(world, block, null, x, y, z).isStraightTrack();
return false;
}
public static boolean isRailBlock(Block block) {
return block instanceof BlockRailBase;
}
public static boolean isRailBlock(ItemStack stack) {
Block block = InvTools.getBlockFromStack(stack);
if (block == null)
return false;
return BlockRailBase.func_150051_a(block);
}
public static boolean isRailItem(Item item) {
if (item instanceof ITrackItem)
return true;
if (item instanceof ItemBlock)
return BlockRailBase.func_150051_a(((ItemBlock) item).field_150939_a);
return false;
}
public static int getTrackMeta(IBlockAccess world, EntityMinecart cart, int x, int y, int z) {
return getTrackMeta(world, world.getBlock(x, y, z), cart, x, y, z);
}
public static int getTrackMeta(IBlockAccess world, Block block, EntityMinecart cart, int x, int y, int z) {
return ((BlockRailBase) block).getBasicRailMetadata(world, cart, x, y, z);
}
public static EnumTrackMeta getTrackMetaEnum(IBlockAccess world, EntityMinecart cart, int x, int y, int z) {
return EnumTrackMeta.fromMeta(getTrackMeta(world, cart, x, y, z));
}
public static EnumTrackMeta getTrackMetaEnum(IBlockAccess world, Block block, EntityMinecart cart, int x, int y, int z) {
return EnumTrackMeta.fromMeta(getTrackMeta(world, block, cart, x, y, z));
}
public static ITrackInstance getTrackInstanceAt(IBlockAccess world, int x, int y, int z) {
if (WorldPlugin.getBlock(world, x, y, z) != RailcraftBlocks.getBlockTrack())
return null;
TileEntity tile = WorldPlugin.getBlockTile(world, x, y, z);
if (tile instanceof TileTrack)
return ((TileTrack) tile).getTrackInstance();
return null;
}
@Nullable
public static <T extends ITrackInstance> T getTrackInstance(@Nullable TileEntity tile, @Nonnull Class<T> instanceClass) {
if (tile instanceof TileTrack) {
ITrackInstance trackInstance = ((TileTrack) tile).getTrackInstance();
if (instanceClass.isAssignableFrom(trackInstance.getClass()))
return instanceClass.cast(trackInstance);
}
return null;
}
public static boolean isTrackAt(IBlockAccess world, int x, int y, int z, @Nonnull EnumTrack track, Block block) {
return isTrackSpecAt(world, x, y, z, track.getTrackSpec(), block);
}
public static boolean isTrackAt(IBlockAccess world, int x, int y, int z, @Nonnull EnumTrack track) {
return isTrackSpecAt(world, x, y, z, track.getTrackSpec());
}
public static boolean isTrackSpecAt(IBlockAccess world, int x, int y, int z, @Nonnull TrackSpec trackSpec, Block block) {
if (block != RailcraftBlocks.getBlockTrack())
return false;
TileEntity tile = WorldPlugin.getBlockTile(world, x, y, z);
return isTrackSpec(tile, trackSpec);
}
public static boolean isTrackSpecAt(IBlockAccess world, int x, int y, int z, @Nonnull TrackSpec trackSpec) {
return isTrackSpecAt(world, x, y, z, trackSpec, WorldPlugin.getBlock(world, x, y, z));
}
public static boolean isTrackSpec(TileEntity tile, @Nonnull TrackSpec trackSpec) {
return (tile instanceof TileTrack) && ((TileTrack) tile).getTrackInstance().getTrackSpec() == trackSpec;
}
public static boolean isTrackClassAt(IBlockAccess world, int x, int y, int z, @Nonnull Class<? extends ITrackInstance> trackClass, Block block) {
if (block != RailcraftBlocks.getBlockTrack())
return false;
TileEntity tile = WorldPlugin.getBlockTile(world, x, y, z);
return isTrackClass(tile, trackClass);
}
public static boolean isTrackClassAt(IBlockAccess world, int x, int y, int z, @Nonnull Class<? extends ITrackInstance> trackClass) {
return isTrackClassAt(world, x, y, z, trackClass, WorldPlugin.getBlock(world, x, y, z));
}
public static boolean isTrackClass(TileEntity tile, @Nonnull Class<? extends ITrackInstance> trackClass) {
return (tile instanceof TileTrack) && trackClass.isAssignableFrom(((TileTrack) tile).getTrackInstance().getClass());
}
public static boolean isHighSpeedTrackAt(IBlockAccess world, int x, int y, int z) {
ITrackInstance track = getTrackInstanceAt(world, x, y, z);
if (track instanceof TrackBaseRailcraft)
return ((TrackBaseRailcraft) track).speedController instanceof SpeedControllerHighSpeed;
return false;
}
public static TileTrack placeTrack(TrackSpec track, World world, int x, int y, int z, int meta) {
WorldPlugin.setBlock(world, x, y, z, RailcraftBlocks.getBlockTrack(), meta);
TileTrack tile = TrackFactory.makeTrackTile(track.createInstanceFromSpec());
world.setTileEntity(x, y, z, tile);
return tile;
}
}