equivalent-exchange-3/src/main/java/com/pahimar/ee3/util/EnergyValueHelper.java
2016-05-16 00:05:53 -04:00

185 lines
8 KiB
Java

package com.pahimar.ee3.util;
import com.pahimar.ee3.api.exchange.EnergyValue;
import com.pahimar.ee3.api.exchange.IEnergyValueProvider;
import com.pahimar.ee3.exchange.EnergyValueRegistry;
import com.pahimar.ee3.exchange.OreStack;
import com.pahimar.ee3.exchange.WrappedStack;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.oredict.OreDictionary;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
public class EnergyValueHelper {
// FIXME Priority Number 1 here
public static EnergyValue getEnergyValue(Map<WrappedStack, EnergyValue> valueMap, Object object, boolean strict) {
/**
* Priority of checking goes
* 1 - IEnergyValueProvider implementation
* 2 - Exact match
* 3 - If the object is an ItemStack, various checks in the OreDictionary
* THINK ON THIS BECAUSE THIS LOGIC COULD BE FAULTY FOR COMPUTATION PURPOSES
* 1 - Does the parent OreStack have a non-null value
* 2 - Do all sibling members have the same non-null value
* 3 - Does there exist a wildcard value mapping with a value
* 4 - If the object is an OreStack, check all child ItemStacks to see if they have the same (not null) value
*/
if (WrappedStack.canBeWrapped(object)) {
if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IEnergyValueProvider && !strict) {
}
else if (valueMap != null) {
WrappedStack wrappedObject = WrappedStack.wrap(object, 1);
if (valueMap.containsKey(wrappedObject)) {
return valueMap.get(wrappedObject);
}
else if (!strict) {
// Search for wildcard entries first
// Then search for possible OreStack value
// Then search for possible sibling OreStack values
if (object instanceof ItemStack) {
ItemStack unValuedItemStack = ItemStack.copyItemStack((ItemStack) object);
EnergyValue minEnergyValue = null;
for (WrappedStack valuedWrappedStack : valueMap.keySet()) {
if (valuedWrappedStack.getWrappedObject() instanceof ItemStack) {
if (Item.getIdFromItem(((ItemStack) valuedWrappedStack.getWrappedObject()).getItem()) == Item.getIdFromItem(unValuedItemStack.getItem())) {
ItemStack valuedItemStack = (ItemStack) valuedWrappedStack.getWrappedObject();
if (valuedItemStack.getItemDamage() == OreDictionary.WILDCARD_VALUE || unValuedItemStack.getItemDamage() == OreDictionary.WILDCARD_VALUE) {
EnergyValue energyValue = valueMap.get(valuedWrappedStack);
if (energyValue.compareTo(minEnergyValue) < 0) {
minEnergyValue = energyValue;
}
}
}
}
}
}
else if (object instanceof OreStack) {
}
}
}
}
return null;
}
public static EnergyValue computeEnergyValueFromRecipe(Map<WrappedStack, EnergyValue> stackValueMappings, WrappedStack outputStack, List<WrappedStack> inputStacks)
{
float computedValue = 0f;
for (WrappedStack wrappedStack : inputStacks)
{
EnergyValue wrappedStackValue;
int stackSize = -1;
if (wrappedStack.getWrappedObject() instanceof ItemStack)
{
ItemStack itemStack = (ItemStack) wrappedStack.getWrappedObject();
// Check if we are dealing with a potential fluid
if (FluidContainerRegistry.getFluidForFilledItem(itemStack) != null)
{
if (itemStack.getItem().getContainerItem(itemStack) != null)
{
stackSize = FluidContainerRegistry.getFluidForFilledItem(itemStack).amount * wrappedStack.getStackSize();
wrappedStackValue = EnergyValueRegistry.getInstance().getEnergyValueFromMap(stackValueMappings, FluidContainerRegistry.getFluidForFilledItem(itemStack));
}
else
{
wrappedStackValue = EnergyValueRegistry.getInstance().getEnergyValueFromMap(stackValueMappings, wrappedStack);
}
}
else if (itemStack.getItem().getContainerItem(itemStack) != null)
{
ItemStack containerItemStack = itemStack.getItem().getContainerItem(itemStack);
if (EnergyValueRegistry.getInstance().hasEnergyValue(itemStack) && EnergyValueRegistry.getInstance().hasEnergyValue(containerItemStack))
{
float itemStackValue = EnergyValueRegistry.getInstance().getEnergyValueFromMap(stackValueMappings, itemStack).getValue();
float containerStackValue = EnergyValueRegistry.getInstance().getEnergyValueFromMap(stackValueMappings, containerItemStack).getValue();
wrappedStackValue = new EnergyValue(itemStackValue - containerStackValue);
}
else
{
wrappedStackValue = new EnergyValue(0);
}
}
else if (!itemStack.getItem().doesContainerItemLeaveCraftingGrid(itemStack))
{
wrappedStackValue = new EnergyValue(0);
}
else if (OreDictionary.getOreIDs(itemStack).length > 0)
{
wrappedStackValue = EnergyValueRegistry.getInstance().getEnergyValueFromMap(stackValueMappings, wrappedStack, true);
}
else
{
wrappedStackValue = EnergyValueRegistry.getInstance().getEnergyValueFromMap(stackValueMappings, wrappedStack);
}
}
else if (wrappedStack.getWrappedObject() instanceof OreStack)
{
OreStack oreStack = (OreStack) wrappedStack.getWrappedObject();
wrappedStackValue = EnergyValueRegistry.getInstance().getEnergyValueFromMap(stackValueMappings, wrappedStack);
for (ItemStack itemStack : OreDictionary.getOres(oreStack.oreName))
{
if (!itemStack.getItem().doesContainerItemLeaveCraftingGrid(itemStack))
{
wrappedStackValue = new EnergyValue(0);
}
}
}
else
{
wrappedStackValue = EnergyValueRegistry.getInstance().getEnergyValueFromMap(stackValueMappings, wrappedStack);
}
if (wrappedStackValue != null)
{
if (stackSize == -1)
{
stackSize = wrappedStack.getStackSize();
}
computedValue += wrappedStackValue.getValue() * stackSize;
}
else
{
return null;
}
}
return factor(new EnergyValue(computedValue), outputStack.getStackSize());
}
public static EnergyValue factor(EnergyValue energyValue, int factor)
{
return factor(energyValue, (float) factor);
}
public static EnergyValue factor(EnergyValue energyValue, float factor)
{
if ((Float.compare(factor, 0f) != 0) && (energyValue != null))
{
return new EnergyValue(new BigDecimal(energyValue.getValue() * 1f / factor).setScale(3, BigDecimal.ROUND_HALF_EVEN).floatValue());
}
else
{
return null;
}
}
}