package redstonedistortion.utils;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.IPipeTile;
import net.minecraft.util.StatCollector;
import redstonedistortion.utils.enums.EnumPriority;
import redstonedistortion.utils.helpers.Location;
import redstonedistortion.utils.helpers.SideConfiguration;
/**
* Copyright (c) 2014, AEnterprise
* http://buildcraftadditions.wordpress.com/
* Buildcraft Additions is distributed under the terms of GNU GPL v3.0
* Please check the contents of the license located in
* http://buildcraftadditions.wordpress.com/wiki/licensing-stuff/
*/
public class ModUtils
{
public static ForgeDirection get2dOrientation(EntityLivingBase entityliving) {
ForgeDirection[] orientationTable = {ForgeDirection.SOUTH,
ForgeDirection.WEST, ForgeDirection.NORTH, ForgeDirection.EAST};
int orientationIndex = MathHelper.floor_double((entityliving.rotationYaw + 45.0) / 90.0) & 3;
return orientationTable[orientationIndex];
}
public static ForgeDirection get3dOrientation(EntityLivingBase entity) {
if (entity.rotationPitch < -45.5F)
return ForgeDirection.UP;
else if (entity.rotationPitch > 45.5F)
return ForgeDirection.DOWN;
return get2dOrientation(entity);
}
public static int[] createSlotArray(int first, int count) {
int[] slots = new int[count];
for (int k = first; k < first + count; k++) {
slots[k - first] = k;
}
return slots;
}
public static void dropItemstack(World world, int x, int y, int z, ItemStack stack) {
float f1 = 0.7F;
double d = (world.rand.nextFloat() * f1) + (1.0F - f1) * 0.5D;
double d1 = (world.rand.nextFloat() * f1) + (1.0F - f1) * 0.5D;
double d2 = (world.rand.nextFloat() * f1) + (1.0F - f1) * 0.5D;
EntityItem itemToDrop = new EntityItem(world, x + d, y + d1, z + d2, stack);
itemToDrop.delayBeforeCanPickup = 10;
if (!world.isRemote)
world.spawnEntityInWorld(itemToDrop);
}
public static String localize(String msg) {
return ("" + StatCollector.translateToLocal(msg)).trim();
}
public static ItemStack outputStack(Location from, ItemStack output, SideConfiguration configuration) {
for (EnumPriority priority : EnumPriority.values()) {
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
Location location = from.copy();
if (configuration.getPriority(direction) != priority)
continue;
if (!configuration.canSend(direction))
continue;
location.move(direction);
TileEntity entity = location.getTileEntity();
if (entity instanceof IPipeTile) {
IPipeTile pipe = (IPipeTile) entity;
if (output != null && pipe.isPipeConnected(direction.getOpposite()) && pipe.getPipeType() == IPipeTile.PipeType.ITEM) {
int leftOver = pipe.injectItem(output.copy(), true, direction.getOpposite(), null);
output.stackSize -= leftOver;
if (output.stackSize == 0)
output = null;
}
}
}
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
Location location = from.copy();
if (configuration.getPriority(direction) != priority)
continue;
if (!configuration.canSend(direction))
continue;
location.move(direction);
TileEntity entity = location.getTileEntity();
if (entity != null && entity instanceof IInventory) {
IInventory outputInventory = (IInventory) entity;
for (int slot = 0; slot < outputInventory.getSizeInventory(); slot++) {
int stackLimit = outputInventory.getInventoryStackLimit();
ItemStack testStack = outputInventory.getStackInSlot(slot);
if (output != null &&
(testStack == null || (testStack.stackSize + output.stackSize <= testStack.getMaxStackSize() && testStack.getItem() == output.getItem() && testStack.getItemDamage() == output.getItemDamage()))) {
ItemStack stack = outputInventory.getStackInSlot(slot);
int toMove;
if (stack == null) {
toMove = stackLimit - 1;
stack = output.copy();
stack.stackSize = 0;
} else {
toMove = stackLimit - stack.stackSize;
}
if (toMove > output.stackSize)
toMove = output.stackSize;
stack.stackSize += toMove;
output.stackSize -= toMove;
outputInventory.setInventorySlotContents(slot, stack);
outputInventory.markDirty();
if (output.stackSize == 0)
output = null;
}
}
}
}
}
return output;
}
}