BloodMagic/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java
Nicholas Ignoffo 2fecb427fd Merge apibutnotreally with the main packages
Do not consider anything outside of the true API safe to use. And even then,
I'm changing things. Just wait. Please I beg you.
2018-02-15 18:49:07 -08:00

139 lines
4.7 KiB
Java

package WayofTime.bloodmagic.compress;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
public class AdvancedCompressionHandler extends CompressionHandler {
@Override
public ItemStack compressInventory(ItemStack[] inv, World world) {
return test(inv, true, world);
}
public ItemStack test(ItemStack[] inv, boolean doDrain, World world) {
for (ItemStack invStack : inv) {
if (invStack.isEmpty()) {
continue;
}
for (int i = 2; i <= 3; i++) {
ItemStack stack = getRecipe(invStack, world, i);
if (!stack.isEmpty()) {
int threshold = CompressionRegistry.getItemThreshold(invStack);
int needed = i * i;
int neededLeft = iterateThroughInventory(invStack, threshold + invStack.getMaxStackSize() - needed, inv, needed, false);
if (neededLeft <= 0) {
iterateThroughInventory(invStack, 0, inv, needed, true);
return stack;
}
}
}
}
return ItemStack.EMPTY;
}
public int iterateThroughInventory(ItemStack required, int kept, ItemStack[] inv, int needed, boolean doDrain) {
int i = -1;
for (ItemStack invStack : inv) {
i++;
if (invStack.isEmpty()) {
continue;
}
if (invStack.isItemEqual(required) && (invStack.getTagCompound() == null ? required.getTagCompound() == null : invStack.getTagCompound().equals(required.getTagCompound()))) {
int stackSize = invStack.getCount();
int used = 0;
if (kept > 0) {
int remainingFromStack = Math.max(stackSize - kept, 0);
used += stackSize - remainingFromStack;
}
kept -= used;
if (kept <= 0 && needed > 0) {
int remainingFromStack = Math.max(stackSize - used - needed, 0);
if (doDrain) {
invStack.setCount(remainingFromStack + used);
if (invStack.isEmpty()) {
inv[i] = ItemStack.EMPTY;
}
}
needed -= (stackSize - used - remainingFromStack);
}
if (needed <= 0) {
return 0;
}
}
}
return needed;
}
public static boolean isResultStackReversible(ItemStack stack, int gridSize, World world) {
if (stack.isEmpty()) {
return false;
}
InventoryCrafting inventory = new InventoryCrafting(new Container() {
public boolean canInteractWith(EntityPlayer player) {
return false;
}
}, 2, 2);
inventory.setInventorySlotContents(0, stack);
ItemStack returnStack = StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world);
if (returnStack.isEmpty()) {
return false;
}
ItemStack compressedStack = ItemStack.EMPTY;
switch (gridSize) {
case 2:
compressedStack = get22Recipe(returnStack, world);
break;
case 3:
compressedStack = get33Recipe(returnStack, world);
break;
}
return !compressedStack.isEmpty() && CompressionRegistry.areItemStacksEqual(stack, compressedStack);
}
public static ItemStack getRecipe(ItemStack stack, World world, int gridSize) {
InventoryCrafting inventory = new InventoryCrafting(new Container() {
public boolean canInteractWith(EntityPlayer player) {
return false;
}
}, gridSize, gridSize);
for (int i = 0; i < inventory.getSizeInventory(); i++) {
inventory.setInventorySlotContents(i, stack);
}
return StorageBlockCraftingManager.getInstance().findMatchingRecipe(inventory, world);
}
public static boolean has22Recipe(ItemStack stack, World world) {
return !get22Recipe(stack, world).isEmpty();
}
public static ItemStack get22Recipe(ItemStack stack, World world) {
return getRecipe(stack, world, 2);
}
public static boolean has33Recipe(ItemStack stack, World world) {
return !get33Recipe(stack, world).isEmpty();
}
public static ItemStack get33Recipe(ItemStack stack, World world) {
return getRecipe(stack, world, 3);
}
}