public static MinecartMember spawn(Location at, int type) {
   MinecartMember mm =
       new MinecartMember(
           WorldUtil.getNative(at.getWorld()), at.getX(), at.getY(), at.getZ(), type);
   mm.yaw = at.getYaw();
   mm.pitch = at.getPitch();
   mm.world.addEntity(mm);
   return mm;
 }
 private static boolean isHeadingTo(MinecartMember mm, ChunkCoordinates to) {
   if (mm == null) {
     return false;
   } else {
     BlockFace dir = mm.getDirection();
     if (dir.getModX() + mm.getBlockX() != to.x) return false;
     if (dir.getModZ() + mm.getBlockZ() != to.z) return false;
     return true;
   }
 }
 public static void cleanUpDeadCarts() {
   Iterator<MinecartMember> iter = replacedCarts.iterator();
   MinecartMember mm;
   while (iter.hasNext()) {
     mm = iter.next();
     if (mm.dead) {
       iter.remove();
       mm.die();
     }
   }
 }
 public static MinecartMember getAt(Location at, MinecartGroup in, double searchRadius) {
   if (at == null) return null;
   searchRadius *= searchRadius;
   MinecartMember result = null;
   for (Entity e : at.getBlock().getChunk().getEntities()) {
     if (e instanceof Minecart) {
       MinecartMember mm = get(e);
       if (mm == null) continue;
       if (in != null && mm.getGroup() != in) continue;
       if (mm.distanceSquared(at) > searchRadius) continue;
       result = mm;
       if (mm.isHeadingTo(at)) return result;
     }
   }
   return result;
 }
 public static EntityMinecart undoReplacement(MinecartMember mm) {
   replacedCarts.remove(mm);
   if (!mm.dead) {
     denyConversion = true;
     mm.died = true;
     EntityMinecart em = new EntityMinecart(mm.world, mm.lastX, mm.lastY, mm.lastZ, mm.type);
     replaceMinecarts(mm, em);
     denyConversion = false;
     return em;
   }
   return null;
 }
  @SuppressWarnings("rawtypes")
  public static MinecartMember getAt(World world, ChunkCoordinates coord, boolean checkmoving) {
    net.minecraft.server.Chunk chunk = WorldUtil.getChunk(world, coord.x >> 4, coord.z >> 4);
    if (chunk != null) {
      MinecartMember mm;
      MinecartMember result = null;
      for (List list : chunk.entitySlices) {
        for (Object e : list) {
          if (e instanceof MinecartMember) {
            mm = (MinecartMember) e;
            if (mm.getBlockX() != coord.x) continue;
            if (mm.getBlockY() != coord.y) continue;
            if (mm.getBlockZ() != coord.z) continue;
            result = mm;
            if (result.isHeadingTo(coord)) return result;
          }
        }
      }
      if (result == null && checkmoving) {
        Block b = world.getWorld().getBlockAt(coord.x, coord.y, coord.z);
        int id = b.getTypeId();

        // get the two connected rails to check
        if (BlockUtil.isRails(id)) {
          BlockFace[] possible = FaceUtil.getFaces(BlockUtil.getRails(b).getDirection());
          MinecartMember mm1 = getAt(Util.getRailsBlock(b.getRelative(possible[0])), false);
          MinecartMember mm2 = getAt(Util.getRailsBlock(b.getRelative(possible[1])), false);
          if (mm1 != null && mm2 != null && mm1.group == mm2.group) {
            Location loc = b.getLocation();
            return mm1.distance(loc) < mm2.distance(loc) ? mm1 : mm2;
          } else if (isHeadingTo(mm1, coord)) {
            return mm1;
          } else if (isHeadingTo(mm2, coord)) {
            return mm2;
          } else {
            return null;
          }
        } else if (Util.isPressurePlate(id)) {
          // check all directions
          MinecartMember mm1 = getAt(Util.getRailsBlock(b.getRelative(BlockFace.NORTH)), false);
          MinecartMember mm2 = getAt(Util.getRailsBlock(b.getRelative(BlockFace.SOUTH)), false);
          MinecartMember mm3 = getAt(Util.getRailsBlock(b.getRelative(BlockFace.EAST)), false);
          MinecartMember mm4 = getAt(Util.getRailsBlock(b.getRelative(BlockFace.WEST)), false);
          if (mm1 != null && mm2 != null && mm1.group == mm2.group) {
            Location loc = b.getLocation();
            return mm1.distance(loc) < mm2.distance(loc) ? mm1 : mm2;
          } else if (mm3 != null && mm4 != null && mm3.group == mm4.group) {
            Location loc = b.getLocation();
            return mm3.distance(loc) < mm4.distance(loc) ? mm3 : mm4;
          } else if (isHeadingTo(mm1, coord)) {
            return mm1;
          } else if (isHeadingTo(mm2, coord)) {
            return mm2;
          } else if (isHeadingTo(mm3, coord)) {
            return mm3;
          } else if (isHeadingTo(mm4, coord)) {
            return mm4;
          } else {
            return null;
          }
        }
      }
      return result;
    }
    return null;
  }