package com.austinv11.peripheralsplusplus.utils; import com.austinv11.collectiveframework.minecraft.utils.NBTHelper; import cpw.mods.fml.common.registry.GameRegistry; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.TurtleSide; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.Facing; import net.minecraft.util.Vec3; import net.minecraftforge.common.IShearable; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; public class TurtleUtil { public static List<ItemStack> harvestBlock(ITurtleAccess turtle, FakeTurtlePlayer player, int dir, ItemStack itemToUse) { int x = turtle.getPosition().posX+Facing.offsetsXForSide[dir]; int y = turtle.getPosition().posY+Facing.offsetsYForSide[dir]; int z = turtle.getPosition().posZ+Facing.offsetsZForSide[dir]; if (!turtle.getWorld().isAirBlock(x,y,z)) { Block block = turtle.getWorld().getBlock(x,y,z); player.setCurrentItemOrArmor(0, itemToUse); if (block.getBlockHardness(turtle.getWorld(), x,y,z) >= 0 && block.canHarvestBlock(player, block.getDamageValue(turtle.getWorld(),x,y,z))) { List<ItemStack> items = block.getDrops(turtle.getWorld(),x,y,z, block.getDamageValue(turtle.getWorld(),x,y,z), 0); turtle.getWorld().setBlockToAir(x,y,z); return items; } } return null; } public static List<Entity> getEntitiesNearTurtle(ITurtleAccess turtle, FakeTurtlePlayer player, int dir) { int x = turtle.getPosition().posX+Facing.offsetsXForSide[dir]; int y = turtle.getPosition().posY+Facing.offsetsYForSide[dir]; int z = turtle.getPosition().posZ+Facing.offsetsZForSide[dir]; AxisAlignedBB box = AxisAlignedBB.getBoundingBox(x, y, z, x+1.0D, y+1.0D, z+1.0D); return turtle.getWorld().getEntitiesWithinAABBExcludingEntity(player, box); } public static Entity getClosestShearableEntity(List<Entity> list, Entity ent) { Vec3 from = Vec3.createVectorHelper(ent.posX, ent.posY, ent.posZ); Entity returnVal = null; double lastDistance = Double.MAX_VALUE; for (Entity entity : list) if (entity instanceof IShearable) { Vec3 to = Vec3.createVectorHelper(entity.posX, entity.posY, entity.posZ); if (to.distanceTo(from) < lastDistance) returnVal = entity; } return returnVal; } public static Entity getClosestEntity(List<Entity> list, Entity ent) { Vec3 from = Vec3.createVectorHelper(ent.posX, ent.posY, ent.posZ); Entity returnVal = null; double lastDistance = Double.MAX_VALUE; for (Entity entity : list) { Vec3 to = Vec3.createVectorHelper(entity.posX, entity.posY, entity.posZ); if (to.distanceTo(from) < lastDistance) returnVal = entity; } return returnVal; } public static void addItemListToInv(List<ItemStack> items, ITurtleAccess turtle) { for (ItemStack item : items) { addToInv(turtle, item); } } public static ArrayList<ItemStack> entityItemsToItemStack(ArrayList<EntityItem> entities) { ArrayList<ItemStack> stacks = new ArrayList<ItemStack>(); for (EntityItem e : entities) { stacks.add(e.getEntityItem()); } return stacks; } public static void addToInv(ITurtleAccess turtle, ItemStack stack) { boolean drop = true; IInventory inv = turtle.getInventory(); ChunkCoordinates coords = turtle.getPosition(); for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack currentStack = inv.getStackInSlot(i); if (currentStack == null) { inv.setInventorySlotContents(i, stack); drop = false; break; } if (currentStack.isStackable() && currentStack.isItemEqual(stack)) { int space = currentStack.getMaxStackSize() - currentStack.stackSize; if (stack.stackSize > space) { currentStack.stackSize = currentStack.getMaxStackSize(); stack.stackSize -= space; drop = true; } else { currentStack.stackSize += stack.stackSize; stack.stackSize = 0; drop = false; break; } } } if (drop) { int dir = turtle.getDirection(); turtle.getWorld().spawnEntityInWorld(new EntityItem(turtle.getWorld(), coords.posX+Facing.offsetsXForSide[dir], coords.posY+Facing.offsetsYForSide[dir]+1, coords.posZ+Facing.offsetsZForSide[dir], stack.copy())); } } public static ItemStack getTurtle(boolean isAdvanced, ITurtleUpgrade upgradeLeft, ITurtleUpgrade upgradeRight) { if (upgradeLeft == null && upgradeRight == null) { return new ItemStack(GameRegistry.findBlock("ComputerCraft", isAdvanced ? "CC-TurtleAdvanced" : "CC-Turtle")); } else { ItemStack turtle = new ItemStack(GameRegistry.findBlock("ComputerCraft", isAdvanced ? "CC-TurtleAdvanced" : "CC-TurtleExpanded")); if (upgradeLeft != null) NBTHelper.setShort(turtle, "leftUpgrade", (short)upgradeLeft.getUpgradeID()); if (upgradeRight != null) NBTHelper.setShort(turtle, "rightUpgrade", (short)upgradeRight.getUpgradeID()); return turtle; } } public static ItemStack getTurtle(boolean isAdvanced, ITurtleUpgrade upgrade) { return getTurtle(isAdvanced, upgrade, null); } public static ItemStack getTurtle(boolean isAdvanced) { return getTurtle(isAdvanced, null); } public static <T> T getPeripheral(ITurtleAccess turtle, Class<T> clazz) { for (TurtleSide side : EnumSet.allOf(TurtleSide.class)) { IPeripheral peripheral = turtle.getPeripheral(side); if (peripheral != null && clazz.isAssignableFrom(peripheral.getClass())) return (T)peripheral; } return null; } public static TurtleSide getPeripheralSide(ITurtleAccess turtle, Class clazz) { for (TurtleSide side : EnumSet.allOf(TurtleSide.class)) { IPeripheral peripheral = turtle.getPeripheral(side); if (peripheral != null && clazz.isAssignableFrom(peripheral.getClass())) return side; } return null; } }