package mods.ocminecart.interaction.railcraft; import cpw.mods.fml.common.Loader; import mods.ocminecart.common.util.RotationHelper; import mods.railcraft.api.carts.CartTools; import mods.railcraft.api.carts.ILinkageManager; import mods.railcraft.api.core.items.IToolCrowbar; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import java.util.HashMap; import java.util.List; public class RailcraftUtils { public static boolean isUsingChrowbar(EntityPlayer player){ if(!Loader.isModLoaded("Railcraft")) return false; if(player.getCurrentEquippedItem()!=null && (player.inventory .getCurrentItem().getItem() instanceof IToolCrowbar)) return true; return false; } public static HashMap<Integer, EntityMinecart> sortCarts(EntityMinecart middle){ if(!Loader.isModLoaded("Railcraft")) return null; ILinkageManager link = CartTools.linkageManager; Iterable<EntityMinecart> cartlist = link.getCartsInTrain(middle); if(cartlist==null) return null; HashMap<Integer, EntityMinecart> sort = new HashMap<Integer, EntityMinecart>(); int mpos = -1; int count = 0; for(EntityMinecart c: cartlist){ count++; if(c.equals(middle)) mpos=count; if(mpos>=0) sort.put(count-mpos, c); } if(mpos<0) return null; count=0; for(EntityMinecart c: cartlist){ count++; if(count>=mpos) continue; sort.put(count-mpos, c); } return sort; } public static int countCarts(EntityMinecart cart, EntityMinecart first){ if(!Loader.isModLoaded("Railcraft")) return 1; HashMap<Integer, EntityMinecart> map = sortCarts(cart); if(map==null) return 0; if(first==null) return 1; int dir = getCartCountDir(map,first); if(dir==0) return 1; int count = 1; while(map.containsKey(dir*count)){ count++; } return count; } public static int getCartCountDir(HashMap<Integer, EntityMinecart> map, EntityMinecart first){ int dir = 0; if(first==null) dir=0; else if(map.containsKey(1) && map.get(1).equals(first)) dir=1; else if (map.containsKey(-1) && map.get(-1).equals(first)) dir=-1; return dir; } public static EntityMinecart getConnectedCartSide(EntityMinecart cart, boolean front){ if(!Loader.isModLoaded("Railcraft")) return null; ILinkageManager link = CartTools.linkageManager; EntityMinecart cartA = link.getLinkedCartA(cart); EntityMinecart cartB = link.getLinkedCartB(cart); double angleA = (cartA!=null)?RotationHelper.calcAngle(cart.posX,cart.posZ, cartA.posX, cartA.posZ):0; double angleB = (cartB!=null)?RotationHelper.calcAngle(cart.posX,cart.posZ, cartB.posX, cartB.posZ):0; angleA=angleA-cart.rotationYaw; angleB=angleB-cart.rotationYaw; if(!front){ angleA=angleA+180; angleB=angleB+180; } angleA=(angleA+360D)%360D; angleB=(angleB+360D)%360D; if(angleA > 90 && angleA < 270 && cartA!=null) return cartA; else if(angleB > 90 && angleB < 270 && cartB!=null) return cartB; return null; } public static EntityMinecart findLinkableCart(EntityMinecart cart, double dyaw){ if(!Loader.isModLoaded("Railcraft")) return null; World w = cart.worldObj; if(w.isRemote) return null; ILinkageManager linkm = CartTools.linkageManager; List<Entity> entlist = w.loadedEntityList; EntityMinecart link=null; double maxdist=0D; for(Entity e: entlist){ if(e instanceof EntityMinecart){ double dist = e.getDistanceToEntity(cart); if((link==null || dist<maxdist) && !e.equals(cart) && !linkm.areLinked(cart, (EntityMinecart) e) && isCartInField(cart,(EntityMinecart) e, 90, dyaw)){ link = (EntityMinecart) e; maxdist=dist; } } } return link; } public static boolean isCartInField(EntityMinecart c1, EntityMinecart c2,double range, double dyaw){ double rot = RotationHelper.calcAngle(c1.posX, c1.posZ, c2.posX, c2.posZ); double yaw = (c1.rotationYaw+360D)%360D; rot=(rot+360D)%360D; double rot1 = rot; rot=rot-(yaw+dyaw); rot=(rot+360D*2D)%360D; //System.out.println(yaw+" : "+dyaw+" : "+rot1+" : "+rot); if((rot>180D-(range/2D)) && (rot<180D+(range/2D))){ //System.out.println("YES"); return true; } return false; } }