2014-07-07 21:31:10 +02:00
|
|
|
package com.pahimar.ee3.exchange;
|
2014-06-14 21:40:45 +02:00
|
|
|
|
2023-01-03 17:47:36 +01:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Comparator;
|
|
|
|
import java.util.List;
|
|
|
|
|
2014-06-14 21:40:45 +02:00
|
|
|
import com.pahimar.ee3.util.FluidHelper;
|
2016-05-27 22:03:14 +02:00
|
|
|
import com.pahimar.ee3.util.ItemStackUtils;
|
2014-06-14 21:40:45 +02:00
|
|
|
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;
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
public final class WrappedStack implements Comparable<WrappedStack> {
|
2014-09-12 22:11:18 +02:00
|
|
|
private final Object wrappedStack;
|
2014-06-14 21:40:45 +02:00
|
|
|
private int stackSize;
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
public WrappedStack() {
|
2014-06-14 21:40:45 +02:00
|
|
|
stackSize = -1;
|
|
|
|
wrappedStack = null;
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
private WrappedStack(Object object) {
|
|
|
|
if (object instanceof Item) {
|
2014-06-14 21:40:45 +02:00
|
|
|
object = new ItemStack((Item) object);
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof Block) {
|
2014-06-14 21:40:45 +02:00
|
|
|
object = new ItemStack((Block) object);
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof Fluid) {
|
2014-06-14 21:40:45 +02:00
|
|
|
object = new FluidStack((Fluid) object, 1000);
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
if (object instanceof ItemStack) {
|
|
|
|
if (((ItemStack) object).getItem() != null) {
|
2016-05-19 21:54:59 +02:00
|
|
|
stackSize = ((ItemStack) object).stackSize;
|
2016-05-27 22:03:14 +02:00
|
|
|
wrappedStack = ItemStackUtils.clone((ItemStack) object, 1);
|
2023-01-03 17:47:36 +01:00
|
|
|
} else {
|
2014-07-21 15:59:40 +02:00
|
|
|
stackSize = -1;
|
|
|
|
wrappedStack = null;
|
|
|
|
}
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof OreStack) {
|
2016-05-28 20:57:10 +02:00
|
|
|
OreStack oreStack = new OreStack((OreStack) object);
|
2014-06-14 21:40:45 +02:00
|
|
|
stackSize = oreStack.stackSize;
|
|
|
|
oreStack.stackSize = 1;
|
|
|
|
wrappedStack = oreStack;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof ArrayList) {
|
2014-06-14 21:40:45 +02:00
|
|
|
ArrayList<?> objectList = (ArrayList<?>) object;
|
|
|
|
|
2016-05-27 22:03:14 +02:00
|
|
|
OreStack possibleOreStack = OreStack.getOreStackFrom(objectList);
|
2014-06-14 21:40:45 +02:00
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
if (possibleOreStack != null) {
|
2014-06-14 21:40:45 +02:00
|
|
|
stackSize = possibleOreStack.stackSize;
|
|
|
|
possibleOreStack.stackSize = 1;
|
|
|
|
wrappedStack = possibleOreStack;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else {
|
2014-06-14 21:40:45 +02:00
|
|
|
stackSize = -1;
|
|
|
|
wrappedStack = null;
|
|
|
|
}
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof FluidStack) {
|
2014-06-14 21:40:45 +02:00
|
|
|
FluidStack fluidStack = ((FluidStack) object).copy();
|
|
|
|
stackSize = fluidStack.amount;
|
|
|
|
fluidStack.amount = 1;
|
|
|
|
wrappedStack = fluidStack;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof WrappedStack) {
|
2014-06-14 21:40:45 +02:00
|
|
|
WrappedStack wrappedStackObject = (WrappedStack) object;
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
if (wrappedStackObject.getWrappedObject() != null) {
|
2014-06-14 21:40:45 +02:00
|
|
|
this.stackSize = wrappedStackObject.stackSize;
|
|
|
|
this.wrappedStack = wrappedStackObject.wrappedStack;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else {
|
2014-06-14 21:40:45 +02:00
|
|
|
stackSize = -1;
|
|
|
|
wrappedStack = null;
|
|
|
|
}
|
2023-01-03 17:47:36 +01:00
|
|
|
} else {
|
2014-06-14 21:40:45 +02:00
|
|
|
stackSize = -1;
|
|
|
|
wrappedStack = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
private WrappedStack(Object object, int stackSize) {
|
|
|
|
if (object instanceof Item) {
|
2014-06-14 21:40:45 +02:00
|
|
|
object = new ItemStack((Item) object);
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof Block) {
|
2014-06-14 21:40:45 +02:00
|
|
|
object = new ItemStack((Block) object);
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof Fluid) {
|
2014-06-14 21:40:45 +02:00
|
|
|
object = new FluidStack((Fluid) object, 1000);
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
if (object instanceof ItemStack) {
|
2014-06-14 21:40:45 +02:00
|
|
|
this.stackSize = stackSize;
|
2016-05-27 22:03:14 +02:00
|
|
|
wrappedStack = ItemStackUtils.clone((ItemStack) object, 1);
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof OreStack) {
|
2016-05-28 20:57:10 +02:00
|
|
|
OreStack oreStack = new OreStack((OreStack) object);
|
2014-06-14 21:40:45 +02:00
|
|
|
this.stackSize = stackSize;
|
|
|
|
oreStack.stackSize = 1;
|
|
|
|
wrappedStack = oreStack;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof ArrayList) {
|
2016-05-28 20:57:10 +02:00
|
|
|
OreStack possibleOreStack = OreStack.getOreStackFrom((ArrayList<?>) object);
|
2014-06-14 21:40:45 +02:00
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
if (possibleOreStack != null) {
|
2014-06-14 21:40:45 +02:00
|
|
|
this.stackSize = stackSize;
|
|
|
|
possibleOreStack.stackSize = 1;
|
|
|
|
wrappedStack = possibleOreStack;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else {
|
2014-06-14 21:40:45 +02:00
|
|
|
this.stackSize = -1;
|
|
|
|
wrappedStack = null;
|
|
|
|
}
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof FluidStack) {
|
2016-05-28 20:57:10 +02:00
|
|
|
FluidStack fluidStack = ((FluidStack) object).copy();
|
2014-06-14 21:40:45 +02:00
|
|
|
this.stackSize = stackSize;
|
|
|
|
fluidStack.amount = 1;
|
|
|
|
wrappedStack = fluidStack;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof WrappedStack) {
|
2014-06-14 21:40:45 +02:00
|
|
|
WrappedStack wrappedStackObject = (WrappedStack) object;
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
if (wrappedStackObject.getWrappedObject() != null) {
|
2014-06-14 21:40:45 +02:00
|
|
|
this.stackSize = stackSize;
|
|
|
|
this.wrappedStack = wrappedStackObject.wrappedStack;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else {
|
2014-06-14 21:40:45 +02:00
|
|
|
this.stackSize = -1;
|
|
|
|
wrappedStack = null;
|
|
|
|
}
|
2023-01-03 17:47:36 +01:00
|
|
|
} else {
|
2014-06-14 21:40:45 +02:00
|
|
|
this.stackSize = -1;
|
|
|
|
wrappedStack = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
public Object getWrappedObject() {
|
2014-09-12 22:11:18 +02:00
|
|
|
return wrappedStack;
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
public static boolean canBeWrapped(Object object) {
|
|
|
|
if (object instanceof WrappedStack) {
|
2014-06-14 21:40:45 +02:00
|
|
|
return true;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof Item || object instanceof Block) {
|
2014-06-14 21:40:45 +02:00
|
|
|
return true;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof ItemStack) {
|
2016-05-27 14:41:07 +02:00
|
|
|
if (((ItemStack) object).getItem() != null) {
|
2014-07-21 15:59:40 +02:00
|
|
|
return true;
|
|
|
|
}
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof OreStack) {
|
2014-06-14 21:40:45 +02:00
|
|
|
return true;
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof List) {
|
2016-05-27 22:03:14 +02:00
|
|
|
if (OreStack.getOreStackFrom((List<?>) object) != null) {
|
2014-06-14 21:40:45 +02:00
|
|
|
return true;
|
|
|
|
}
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (object instanceof Fluid || object instanceof FluidStack) {
|
2014-06-14 21:40:45 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
public int getStackSize() {
|
2014-06-14 21:40:45 +02:00
|
|
|
return stackSize;
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
public void setStackSize(int stackSize) {
|
2014-06-14 21:40:45 +02:00
|
|
|
this.stackSize = stackSize;
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
public static WrappedStack wrap(Object object) {
|
|
|
|
if (canBeWrapped(object)) {
|
2015-04-19 21:01:35 +02:00
|
|
|
return new WrappedStack(object);
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
public static WrappedStack wrap(Object object, int stackSize) {
|
|
|
|
if (canBeWrapped(object)) {
|
2015-04-19 21:01:35 +02:00
|
|
|
return new WrappedStack(object, stackSize);
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2014-06-14 21:40:45 +02:00
|
|
|
@Override
|
2016-05-27 14:41:07 +02:00
|
|
|
public boolean equals(Object object) {
|
2023-01-03 17:47:36 +01:00
|
|
|
return object instanceof WrappedStack
|
|
|
|
&& (this.compareTo((WrappedStack) object) == 0);
|
2014-07-07 17:22:21 +02:00
|
|
|
}
|
|
|
|
|
2016-05-27 14:41:07 +02:00
|
|
|
/**
|
2014-07-07 17:22:21 +02:00
|
|
|
* Sort order (class-wise) goes ItemStack, OreStack, EnergyStack,
|
|
|
|
* FluidStack, null
|
|
|
|
* @see java.lang.Comparable#compareTo(java.lang.Object)
|
|
|
|
*/
|
|
|
|
@Override
|
2016-05-27 14:41:07 +02:00
|
|
|
public int compareTo(WrappedStack wrappedStack) {
|
2016-05-20 03:10:55 +02:00
|
|
|
return COMPARATOR.compare(this, wrappedStack);
|
2014-06-14 21:40:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return a string representation of the object.
|
|
|
|
*/
|
|
|
|
@Override
|
2016-05-26 18:02:37 +02:00
|
|
|
public String toString() {
|
|
|
|
if (wrappedStack instanceof ItemStack) {
|
2015-04-19 21:01:35 +02:00
|
|
|
ItemStack itemStack = (ItemStack) wrappedStack;
|
2016-05-26 18:02:37 +02:00
|
|
|
String unlocalizedName = null;
|
|
|
|
try {
|
|
|
|
if (itemStack.getItem() != null) {
|
2023-01-03 17:47:36 +01:00
|
|
|
unlocalizedName
|
|
|
|
= Item.itemRegistry.getNameForObject(itemStack.getItem());
|
2016-05-26 18:02:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (unlocalizedName == null) {
|
|
|
|
unlocalizedName = itemStack.getUnlocalizedName();
|
|
|
|
}
|
2023-01-03 17:47:36 +01:00
|
|
|
} catch (ArrayIndexOutOfBoundsException e) {
|
2015-05-08 14:14:49 +02:00
|
|
|
unlocalizedName = "no-name";
|
|
|
|
}
|
|
|
|
|
2016-05-26 18:02:37 +02:00
|
|
|
if (itemStack.hasTagCompound()) {
|
2023-01-03 17:47:36 +01:00
|
|
|
return String.format(
|
|
|
|
"%sxitemStack[%s@%s:%s]",
|
|
|
|
stackSize,
|
|
|
|
unlocalizedName,
|
|
|
|
itemStack.getItemDamage(),
|
|
|
|
itemStack.getTagCompound()
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
return String.format(
|
|
|
|
"%sxitemStack[%s@%s]",
|
|
|
|
stackSize,
|
|
|
|
unlocalizedName,
|
|
|
|
itemStack.getItemDamage()
|
|
|
|
);
|
2015-04-19 21:01:35 +02:00
|
|
|
}
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (wrappedStack instanceof OreStack) {
|
2014-06-14 21:40:45 +02:00
|
|
|
OreStack oreStack = (OreStack) wrappedStack;
|
2016-05-14 04:28:10 +02:00
|
|
|
return String.format("%sxoreStack[%s]", stackSize, oreStack.oreName);
|
2023-01-03 17:47:36 +01:00
|
|
|
} else if (wrappedStack instanceof FluidStack) {
|
2014-06-14 21:40:45 +02:00
|
|
|
FluidStack fluidStack = (FluidStack) wrappedStack;
|
2023-01-03 17:47:36 +01:00
|
|
|
return String.format(
|
|
|
|
"%sxfluidStack[%s]", stackSize, fluidStack.getFluid().getName()
|
|
|
|
);
|
|
|
|
} else {
|
2015-04-19 21:01:35 +02:00
|
|
|
return "null-wrappedstack";
|
2014-06-14 21:40:45 +02:00
|
|
|
}
|
|
|
|
}
|
2014-09-12 22:11:18 +02:00
|
|
|
|
2023-01-03 17:47:36 +01:00
|
|
|
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) {
|
|
|
|
int compareResult = ItemStackUtils.compare(
|
|
|
|
(ItemStack) wrappedStack1.wrappedStack,
|
|
|
|
(ItemStack) wrappedStack2.wrappedStack
|
|
|
|
);
|
|
|
|
|
|
|
|
if (compareResult == 0) {
|
|
|
|
return wrappedStack1.stackSize - wrappedStack2.stackSize;
|
|
|
|
} else {
|
|
|
|
return compareResult;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
} else if (wrappedStack1.wrappedStack instanceof OreStack) {
|
|
|
|
if (wrappedStack2.wrappedStack instanceof ItemStack) {
|
|
|
|
return -1;
|
|
|
|
} else if (wrappedStack2.wrappedStack instanceof OreStack) {
|
|
|
|
int compareResult = OreStack.compare(
|
|
|
|
(OreStack) wrappedStack1.wrappedStack,
|
|
|
|
(OreStack) wrappedStack2.wrappedStack
|
|
|
|
);
|
|
|
|
|
|
|
|
if (compareResult == 0) {
|
|
|
|
return wrappedStack1.stackSize - wrappedStack2.stackSize;
|
|
|
|
} else {
|
|
|
|
return compareResult;
|
|
|
|
}
|
|
|
|
} 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) {
|
|
|
|
int compareResult = FluidHelper.compare(
|
|
|
|
(FluidStack) wrappedStack1.wrappedStack,
|
|
|
|
(FluidStack) wrappedStack2.wrappedStack
|
|
|
|
);
|
|
|
|
|
|
|
|
if (compareResult == 0) {
|
|
|
|
return wrappedStack1.stackSize - wrappedStack2.stackSize;
|
|
|
|
} else {
|
|
|
|
return compareResult;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
} else if (wrappedStack1.wrappedStack == null) {
|
|
|
|
if (wrappedStack2.wrappedStack != null) {
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
};
|
2014-06-14 21:40:45 +02:00
|
|
|
}
|