Package com.bergerkiller.bukkit.tc.rails.type

Source Code of com.bergerkiller.bukkit.tc.rails.type.RailTypeVertical

package com.bergerkiller.bukkit.tc.rails.type;

import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.material.Rails;

import com.bergerkiller.bukkit.common.bases.IntVector3;
import com.bergerkiller.bukkit.common.utils.BlockUtil;
import com.bergerkiller.bukkit.common.utils.FaceUtil;
import com.bergerkiller.bukkit.tc.Util;
import com.bergerkiller.bukkit.tc.controller.MinecartMember;
import com.bergerkiller.bukkit.tc.rails.logic.RailLogic;
import com.bergerkiller.bukkit.tc.rails.logic.RailLogicVertical;

public class RailTypeVertical extends RailType {

  @Override
  public boolean isRail(Material type, int data) {
    return Util.ISVERTRAIL.get(type);
  }

  @Override
  public Block findRail(Block pos) {
    if (isRail(pos)) {
      return pos;
    } else if (isRail(pos, BlockFace.DOWN)) {
      return pos.getRelative(BlockFace.DOWN);
    }
    return null;
  }

  @Override
  public IntVector3 findRail(MinecartMember<?> member, World world, IntVector3 pos) {
    IntVector3 next;
    if (isRail(world, pos.x, pos.y, pos.z)) {
      next = pos;
    } else if (member.getRailTracker().getLastRailType() != RailType.VERTICAL && isRail(world, pos.x, pos.y - 1, pos.z)) {
      next = pos.add(BlockFace.DOWN);
    } else {
      return null;
    }
    // Check for movement from sloped to vertical, and adjust the Y-position based on that
    RailLogic lastLogic = member.getRailTracker().getLastLogic();
    if (lastLogic.isSloped()) {
      if (lastLogic.getDirection() == member.getDirection().getOppositeFace()) {
        member.getEntity().loc.setY((double) next.y + 0.95);
      }
    }
    return next;
  }

  @Override
  public Block findMinecartPos(Block trackBlock) {
    return trackBlock;
  }

  @Override
  public boolean onBlockCollision(MinecartMember<?> member, Block railsBlock, Block hitBlock, BlockFace hitFace) {
    if (!super.onBlockCollision(member, railsBlock, hitBlock, hitFace)) {
      return false;
    }
    // Check if the collided block has vertical rails below when hitting it
    if (FaceUtil.isVertical(hitFace) && Util.ISVERTRAIL.get(hitBlock.getRelative(hitFace))) {
      return false;
    }
    return true;
  }

  @Override
  public BlockFace[] getPossibleDirections(Block trackBlock) {
    return new BlockFace[] {BlockFace.UP, BlockFace.DOWN};
  }

  @Override
  public boolean onCollide(MinecartMember<?> with, Block block, BlockFace hitFace) {
    return false;
  }

  @Override
  public BlockFace getDirection(Block railsBlock) {
    return BlockFace.UP;
  }

  @Override
  public BlockFace getSignColumnDirection(Block railsBlock) {
    return Util.getVerticalRailDirection(railsBlock);
  }

  @Override
  public Block getNextPos(Block currentTrack, BlockFace currentDirection) {
    if (currentDirection == BlockFace.UP) {
      Block next = currentTrack.getRelative(BlockFace.UP);
      if (!Util.ISTCRAIL.get(next)) {
        // Check for a possible sloped rail leading up from next
        BlockFace dir = Util.getVerticalRailDirection(currentTrack);
        Block possible = next.getRelative(dir);
        Rails rails = BlockUtil.getRails(possible);
        if (rails != null && rails.isOnSlope() && rails.getDirection() == dir) {
          return possible;
        }
      }
      return next;
    } else {
      return currentTrack.getRelative(BlockFace.DOWN);
    }
  }

  @Override
  public RailLogic getLogic(MinecartMember<?> member, Block railsBlock) {
    return RailLogicVertical.get(Util.getVerticalRailDirection(railsBlock));
  }
}
TOP

Related Classes of com.bergerkiller.bukkit.tc.rails.type.RailTypeVertical

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.