package mods.railcraft.common.carts;
import mods.railcraft.common.blocks.tracks.EnumTrackMeta;
import mods.railcraft.common.gui.EnumGui;
import mods.railcraft.common.gui.GuiHandler;
import mods.railcraft.common.plugins.forge.LocalizationPlugin;
import mods.railcraft.common.util.inventory.InvTools;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.common.IPlantable;
import net.minecraftforge.common.IShearable;
import net.minecraftforge.common.util.ForgeDirection;
public class EntityCartTrackLayer extends CartMaintenancePatternBase {
public static final int SLOT_STOCK = 0;
public static final int SLOT_REPLACE = 0;
public static final int[] SLOTS = InvTools.buildSlotArray(0, 1);
public EntityCartTrackLayer(World world) {
super(world);
}
public EntityCartTrackLayer(World world, double d, double d1, double d2) {
this(world);
setPosition(d, d1 + (double) yOffset, d2);
motionX = 0.0D;
motionY = 0.0D;
motionZ = 0.0D;
prevPosX = d;
prevPosY = d1;
prevPosZ = d2;
}
@Override
public ICartType getCartType() {
return EnumCart.TRACK_LAYER;
}
@Override
protected void func_145821_a(int trackX, int trackY, int trackZ, double maxSpeed, double slopeAdjustment, Block trackBlock, int trackMeta) {
super.func_145821_a(trackX, trackY, trackZ, maxSpeed, slopeAdjustment, trackBlock, trackMeta);
if (Game.isNotHost(worldObj))
return;
stockItems(SLOT_REPLACE, SLOT_STOCK);
updateTravelDirection(trackX, trackY, trackZ, trackMeta);
if (travelDirection != ForgeDirection.UNKNOWN)
placeTrack(trackX, trackY, trackZ);
}
private void placeTrack(int x, int y, int z) {
x = x + travelDirection.offsetX;
z = z + travelDirection.offsetZ;
EnumTrackMeta trackMeta = EnumTrackMeta.NORTH_SOUTH;
if (travelDirection == ForgeDirection.EAST || travelDirection == ForgeDirection.WEST)
trackMeta = EnumTrackMeta.EAST_WEST;
if (!isValidReplacementBlock(x, y, z) && isValidReplacementBlock(x, y + 1, z) && trackMeta.isStraightTrack())
y++;
if (isValidReplacementBlock(x, y, z) && isValidReplacementBlock(x, y - 1, z)) {
y--;
if (travelDirection == ForgeDirection.NORTH)
trackMeta = EnumTrackMeta.SOUTH_SLOPE;
if (travelDirection == ForgeDirection.SOUTH)
trackMeta = EnumTrackMeta.NORTH_SLOPE;
if (travelDirection == ForgeDirection.WEST)
trackMeta = EnumTrackMeta.EAST_SLOPE;
if (travelDirection == ForgeDirection.EAST)
trackMeta = EnumTrackMeta.WEST_SLOPE;
}
if (isValidNewTrackPosition(x, y, z)) {
Block block = worldObj.getBlock(x, y, z);
int metadata = worldObj.getBlockMetadata(x, y, z);
if (placeNewTrack(x, y, z, SLOT_STOCK, trackMeta.ordinal())) {
block.dropBlockAsItem(worldObj, x, y, z, metadata, 0);
}
}
}
private boolean isValidNewTrackPosition(int x, int y, int z) {
return isValidReplacementBlock(x, y, z) && World.doesBlockHaveSolidTopSurface(worldObj, x, y - 1, z);
}
private boolean isValidReplacementBlock(int x, int y, int z) {
Block block = worldObj.getBlock(x, y, z);
return (worldObj.isAirBlock(x, y, z) ||
block instanceof IPlantable ||
block instanceof IShearable ||
EntityTunnelBore.replaceableBlocks.contains(block)) ||
block.isReplaceable(worldObj, x, y, z);
}
@Override
public int[] getAccessibleSlotsFromSide(int p_94128_1_) {
return SLOTS;
}
@Override
public boolean doInteract(EntityPlayer player) {
if (Game.isHost(worldObj))
GuiHandler.openGui(EnumGui.CART_TRACK_LAYER, player, worldObj, this);
return true;
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
ItemStack trackReplace = patternInv.getStackInSlot(SLOT_REPLACE);
return InvTools.isItemEqual(stack, trackReplace);
}
@Override
public String getInventoryName() {
return LocalizationPlugin.translate(EnumCart.TRACK_LAYER.getTag());
}
}