/*
* This file is part of Matter Overdrive
* Copyright (c) 2015., Simeon Radivoev, All rights reserved.
*
* Matter Overdrive is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Matter Overdrive is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>.
*/
package matteroverdrive.util;
import matteroverdrive.MatterOverdrive;
import matteroverdrive.api.inventory.IUpgrade;
import matteroverdrive.api.matter.IMatterItem;
import matteroverdrive.api.matter.IMatterPatternStorage;
import matteroverdrive.api.matter.IMatterProvider;
import matteroverdrive.handler.MatterEntry;
import matteroverdrive.init.MatterOverdriveFluids;
import matteroverdrive.items.MatterScanner;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidHandler;
import java.util.List;
public class MatterHelper
{
public static final String MATTER_UNIT = " kM";
public static boolean containsMatter(ItemStack item)
{
return getMatterAmountFromItem(item) > 0;
}
public static int getMatterAmountFromItem(ItemStack item)
{
if(item != null)
{
if (item.getItem() instanceof IMatterItem)
{
return ((IMatterItem) item.getItem()).getMatter(item);
}
else
{
MatterEntry matter = MatterOverdrive.matterRegistry.getEntry(item);
if (matter != null)
return matter.getMatter();
}
}
return 0;
}
public static int getEnergyFromMatter(int multiply,ItemStack itemStack)
{
int matter = getMatterAmountFromItem(itemStack);
return multiply * matter;
}
public static int getTotalEnergyFromMatter(int multiply,ItemStack itemStack,int time)
{
int matter = getMatterAmountFromItem(itemStack);
return multiply * matter * time;
}
public static int Transfer(ForgeDirection toDir,int amount,IMatterProvider from,IFluidHandler to)
{
ForgeDirection oposite = toDir.getOpposite();
int extract = from.extractMatter(toDir,amount,true);
int recived = to.fill(oposite, new FluidStack(MatterOverdriveFluids.matterPlasma,extract), true);
from.extractMatter(toDir,recived,false);
return recived;
}
public static ForgeDirection opposite(ForgeDirection dir)
{
return ForgeDirection.values()[ForgeDirection.OPPOSITES[dir.ordinal()]];
}
private static IRecipe GetRecipeOf(ItemStack item)
{
List recipes = CraftingManager.getInstance().getRecipeList();
for(int i = 0;i < recipes.size();i++)
{
IRecipe recipe = (IRecipe)recipes.get(i);
if (recipe != null && recipe.getRecipeOutput() != null && recipe.getRecipeOutput().getItem() == item.getItem())
{
return recipe;
}
}
return null;
}
public static boolean isMatterScanner(ItemStack item)
{
return item != null && item.getItem() != null && item.getItem() instanceof MatterScanner;
}
public static boolean isMatterPatternStorage(ItemStack item)
{
return item != null && item.getItem() != null && item.getItem() instanceof IMatterPatternStorage;
}
public static boolean isUpgrade(ItemStack itemStack)
{
return itemStack != null && itemStack.getItem() instanceof IUpgrade;
}
public static boolean CanScan(ItemStack stack)
{
if(MatterHelper.getMatterAmountFromItem(stack) <= 0)
return false;
Item item = stack.getItem();
if(item instanceof ItemBlock)
{
Block block = Block.getBlockFromItem(item);
if(block == Blocks.bedrock || block == Blocks.air)
{
return false;
}
}
return true;
}
public static String formatMatter(int matter)
{
return MOStringHelper.formatNumber(matter) + MATTER_UNIT;
}
public static String formatMatter(int matter,int capacity)
{
return MOStringHelper.formatNumber(matter) + " / " + MOStringHelper.formatNumber(capacity) + MATTER_UNIT;
}
public static boolean DropInventory(World world,IInventory inventory,int x,int y,int z)
{
if(inventory != null)
{
for (int i1 = 0; i1 < inventory.getSizeInventory(); ++i1)
{
ItemStack itemstack = inventory.getStackInSlot(i1);
if (itemstack != null)
{
float f = world.rand.nextFloat() * 0.8F + 0.1F;
float f1 = world.rand.nextFloat() * 0.8F + 0.1F;
float f2 = world.rand.nextFloat() * 0.8F + 0.1F;
while (itemstack.stackSize > 0)
{
int j1 = world.rand.nextInt(21) + 10;
if (j1 > itemstack.stackSize)
{
j1 = itemstack.stackSize;
}
itemstack.stackSize -= j1;
EntityItem entityitem = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
if (itemstack.hasTagCompound())
{
entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());
}
float f3 = 0.05F;
entityitem.motionX = (double)((float)world.rand.nextGaussian() * f3);
entityitem.motionY = (double)((float)world.rand.nextGaussian() * f3 + 0.2F);
entityitem.motionZ = (double)((float)world.rand.nextGaussian() * f3);
world.spawnEntityInWorld(entityitem);
}
}
}
return true;
}
return false;
}
public static void DrawMatterInfoTooltip(ItemStack itemStack,int speed,int energyPerTick,List tooltips)
{
int matter = MatterHelper.getMatterAmountFromItem(itemStack);
if(matter > 0)
{
tooltips.add(EnumChatFormatting.ITALIC.toString() + EnumChatFormatting.BLUE.toString() + "Matter: " + MatterHelper.formatMatter(matter));
tooltips.add(EnumChatFormatting.ITALIC.toString() + EnumChatFormatting.DARK_RED + "Power: " + MOEnergyHelper.formatEnergy(speed * matter * energyPerTick));
}
}
}