equivalent-exchange-3/src/main/java/com/pahimar/ee3/exchange/WrappedStack.java
Pahimar f41b0279a6 Added some more NPE protection to the ID based ItemStack comparator
Added back in the small and medium sized Alchemical Chest aludel recipes
Added a recipe to make a chalk block from 4 pieces of chalk
Created an EE test suite to test EE specific energy values
Re-registered several EE items
Removed a duplicate Gson type adapter registration
Changed the ItemStackSerializer to return JsonNull in the event that there is no registered name for the item (the item would never deserialize as it wouldn't have a name to lookup)
Changed the EnergyValueMapSerializer to allow serializing of null energy values (as JsonNull). Used for energy value testing.
2016-05-26 12:02:37 -04:00

396 lines
11 KiB
Java

package com.pahimar.ee3.exchange;
import com.pahimar.ee3.util.FluidHelper;
import com.pahimar.ee3.util.ItemHelper;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class WrappedStack implements Comparable<WrappedStack> {
private final String objectType;
private final Object wrappedStack;
private int stackSize;
public WrappedStack()
{
objectType = null;
stackSize = -1;
wrappedStack = null;
}
private WrappedStack(Object object)
{
if (object instanceof Item)
{
object = new ItemStack((Item) object);
}
else if (object instanceof Block)
{
object = new ItemStack((Block) object);
}
else if (object instanceof Fluid)
{
object = new FluidStack((Fluid) object, 1000);
}
if (object instanceof ItemStack)
{
if (((ItemStack) object).getItem() != null)
{
ItemStack itemStackObject = (ItemStack) object;
objectType = "itemstack";
stackSize = ((ItemStack) object).stackSize;
wrappedStack = ItemHelper.clone((ItemStack) object, 1);
}
else
{
objectType = null;
stackSize = -1;
wrappedStack = null;
}
}
else if (object instanceof OreStack)
{
OreStack oreStack = (OreStack) object;
objectType = "orestack";
stackSize = oreStack.stackSize;
oreStack.stackSize = 1;
wrappedStack = oreStack;
}
else if (object instanceof ArrayList)
{
ArrayList<?> objectList = (ArrayList<?>) object;
OreStack possibleOreStack = OreStack.getOreStackFromList(objectList);
if (possibleOreStack != null)
{
objectType = "orestack";
stackSize = possibleOreStack.stackSize;
possibleOreStack.stackSize = 1;
wrappedStack = possibleOreStack;
}
else
{
objectType = null;
stackSize = -1;
wrappedStack = null;
}
}
else if (object instanceof FluidStack)
{
FluidStack fluidStack = ((FluidStack) object).copy();
objectType = "fluidstack";
stackSize = fluidStack.amount;
fluidStack.amount = 1;
wrappedStack = fluidStack;
}
else if (object instanceof WrappedStack)
{
WrappedStack wrappedStackObject = (WrappedStack) object;
if (wrappedStackObject.getWrappedObject() != null)
{
this.objectType = wrappedStackObject.objectType;
this.stackSize = wrappedStackObject.stackSize;
this.wrappedStack = wrappedStackObject.wrappedStack;
}
else
{
objectType = null;
stackSize = -1;
wrappedStack = null;
}
}
else
{
objectType = null;
stackSize = -1;
wrappedStack = null;
}
}
private WrappedStack(Object object, int stackSize)
{
if (object instanceof Item)
{
object = new ItemStack((Item) object);
}
else if (object instanceof Block)
{
object = new ItemStack((Block) object);
}
else if (object instanceof Fluid)
{
object = new FluidStack((Fluid) object, 1000);
}
if (object instanceof ItemStack)
{
objectType = "itemstack";
this.stackSize = stackSize;
wrappedStack = ItemHelper.clone((ItemStack) object, 1);
}
else if (object instanceof OreStack)
{
OreStack oreStack = (OreStack) object;
objectType = "orestack";
this.stackSize = stackSize;
oreStack.stackSize = 1;
wrappedStack = oreStack;
}
else if (object instanceof ArrayList)
{
ArrayList<?> objectList = (ArrayList<?>) object;
OreStack possibleOreStack = OreStack.getOreStackFromList(objectList);
if (possibleOreStack != null)
{
objectType = "orestack";
this.stackSize = stackSize;
possibleOreStack.stackSize = 1;
wrappedStack = possibleOreStack;
}
else
{
objectType = null;
this.stackSize = -1;
wrappedStack = null;
}
}
else if (object instanceof FluidStack)
{
FluidStack fluidStack = (FluidStack) object;
objectType = "fluidstack";
this.stackSize = stackSize;
fluidStack.amount = 1;
wrappedStack = fluidStack;
}
else if (object instanceof WrappedStack)
{
WrappedStack wrappedStackObject = (WrappedStack) object;
if (wrappedStackObject.getWrappedObject() != null)
{
this.objectType = wrappedStackObject.objectType;
this.stackSize = stackSize;
this.wrappedStack = wrappedStackObject.wrappedStack;
}
else
{
objectType = null;
this.stackSize = -1;
wrappedStack = null;
}
}
else
{
objectType = null;
this.stackSize = -1;
wrappedStack = null;
}
}
public Object getWrappedObject()
{
return wrappedStack;
}
public static boolean canBeWrapped(Object object)
{
if (object instanceof WrappedStack)
{
return true;
}
else if (object instanceof Item || object instanceof Block)
{
return true;
}
else if (object instanceof ItemStack)
{
if (((ItemStack) object).getItem() != null)
{
return true;
}
}
else if (object instanceof OreStack)
{
return true;
}
else if (object instanceof List)
{
if (OreStack.getOreStackFromList((List<?>) object) != null)
{
return true;
}
}
else if (object instanceof Fluid || object instanceof FluidStack)
{
return true;
}
return false;
}
public int getStackSize()
{
return stackSize;
}
public void setStackSize(int stackSize)
{
this.stackSize = stackSize;
}
public static WrappedStack wrap(Object object)
{
if (canBeWrapped(object))
{
return new WrappedStack(object);
}
return null;
}
public static WrappedStack wrap(Object object, int stackSize)
{
if (canBeWrapped(object))
{
return new WrappedStack(object, stackSize);
}
return null;
}
@Override
public boolean equals(Object object)
{
return object instanceof WrappedStack && (this.compareTo((WrappedStack) object) == 0);
}
/*
* Sort order (class-wise) goes ItemStack, OreStack, EnergyStack,
* FluidStack, null
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(WrappedStack wrappedStack)
{
return COMPARATOR.compare(this, wrappedStack);
}
/**
* @return a string representation of the object.
*/
@Override
public String toString() {
if (wrappedStack instanceof ItemStack) {
ItemStack itemStack = (ItemStack) wrappedStack;
String unlocalizedName = null;
try {
if (itemStack.getItem() != null) {
unlocalizedName = Item.itemRegistry.getNameForObject(itemStack.getItem());
}
if (unlocalizedName == null) {
unlocalizedName = itemStack.getUnlocalizedName();
}
}
catch (ArrayIndexOutOfBoundsException e) {
unlocalizedName = "no-name";
}
if (itemStack.hasTagCompound()) {
return String.format("%sxitemStack[%s@%s:%s]", stackSize, unlocalizedName, itemStack.getItemDamage(), itemStack.getTagCompound());
}
else {
return String.format("%sxitemStack[%s@%s]", stackSize, unlocalizedName, itemStack.getItemDamage());
}
}
else if (wrappedStack instanceof OreStack) {
OreStack oreStack = (OreStack) wrappedStack;
return String.format("%sxoreStack[%s]", stackSize, oreStack.oreName);
}
else if (wrappedStack instanceof FluidStack) {
FluidStack fluidStack = (FluidStack) wrappedStack;
return String.format("%sxfluidStack[%s]", stackSize, fluidStack.getFluid().getName());
}
else {
return "null-wrappedstack";
}
}
public static final Comparator<WrappedStack> COMPARATOR = new Comparator<WrappedStack>()
{
@Override
public int compare(WrappedStack wrappedStack1, WrappedStack wrappedStack2)
{
if (wrappedStack1.wrappedStack instanceof ItemStack)
{
if (wrappedStack2.wrappedStack instanceof ItemStack)
{
return ItemHelper.compare((ItemStack) wrappedStack1.wrappedStack, (ItemStack) wrappedStack2.wrappedStack);
}
else
{
return 1;
}
}
else if (wrappedStack1.wrappedStack instanceof OreStack)
{
if (wrappedStack2.wrappedStack instanceof ItemStack)
{
return -1;
}
else if (wrappedStack2.wrappedStack instanceof OreStack)
{
return OreStack.compare((OreStack) wrappedStack1.wrappedStack, (OreStack) wrappedStack2.wrappedStack);
}
else
{
return 1;
}
}
else if (wrappedStack1.wrappedStack instanceof FluidStack)
{
if (wrappedStack2.wrappedStack instanceof ItemStack || wrappedStack2.wrappedStack instanceof OreStack)
{
return -1;
}
else if (wrappedStack2.wrappedStack instanceof FluidStack)
{
return FluidHelper.compare((FluidStack) wrappedStack1.wrappedStack, (FluidStack) wrappedStack2.wrappedStack);
}
else
{
return 1;
}
}
else if (wrappedStack1.wrappedStack == null)
{
if (wrappedStack2.wrappedStack != null)
{
return -1;
}
else
{
return 0;
}
}
return 0;
}
};
}