mirror of
https://github.com/GTNewHorizons/JustEnoughCalculation.git
synced 2026-11-12 00:08:00 +00:00
feat: inventory check inspects large fluid containers (#18)
Co-authored-by: Caedis <Caedis@users.noreply.github.com> Co-authored-by: Martin Robertz <dream-master@gmx.net>
This commit is contained in:
5 files changed
+89
-14
No files matched your search
@@ -22,4 +22,8 @@ dependencies {
|
||||
// runtime("curse.maven:cofh-core-69162:2388751")
|
||||
|
||||
testCompile 'org.junit.jupiter:junit-jupiter-api:5.2.0'
|
||||
|
||||
// Required to load in GTNH mods inside the dev environment for testing. Useful for checking item stack label
|
||||
// generation.
|
||||
runtimeOnlyNonPublishable("com.github.GTNewHorizons:GT5-Unofficial:5.09.48.133:dev")
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package me.towdium.jecalculation.data.label;
|
||||
|
||||
import static me.towdium.jecalculation.utils.ItemStackHelper.isGregTechLargeFluidContainer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumMap;
|
||||
import java.util.HashMap;
|
||||
@@ -23,6 +25,7 @@ import net.minecraftforge.fluids.FluidStack;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
import gregtech.api.util.GTUtility;
|
||||
import me.towdium.jecalculation.JustEnoughCalculation;
|
||||
import me.towdium.jecalculation.data.label.labels.LFluidStack;
|
||||
import me.towdium.jecalculation.data.label.labels.LItemStack;
|
||||
@@ -194,7 +197,7 @@ public interface ILabel {
|
||||
* @param nbt NBT to deserialize
|
||||
* @return the recovered label
|
||||
* A typical NBT structure of an {@link ILabel} is as follows:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* {@code
|
||||
* {
|
||||
@@ -258,18 +261,48 @@ public interface ILabel {
|
||||
handlers.put(Priority.FALLBACK, new ArrayList<>());
|
||||
}
|
||||
|
||||
public static ILabel from(@Nullable Object o) {
|
||||
if (o == null) return ILabel.EMPTY;
|
||||
else if (o instanceof ItemStack) return new LItemStack((ItemStack) o);
|
||||
else if (o instanceof FluidStack) return new LFluidStack((FluidStack) o);
|
||||
else if (o instanceof EnchantmentData) {
|
||||
ItemStack itemStack = new ItemStack(Items.enchanted_book);
|
||||
new ItemEnchantedBook().addEnchantment(itemStack, (EnchantmentData) o);
|
||||
return new LItemStack(itemStack);
|
||||
} else {
|
||||
JustEnoughCalculation.logger.warn("Unrecognized ingredient type: " + o.getClass());
|
||||
return LPlaceholder.Converter.from(o);
|
||||
/**
|
||||
* Converts an {@code ItemStack} to its corresponding {@link ILabel} implementation.
|
||||
*
|
||||
* @param item The {@code ItemStack} to convert.
|
||||
* @return A {@link LItemStack} if the passed argument is an item stack, a {@link LFluidStack} if the past
|
||||
* item is a fluid stack or an item stack containing a fluid. If the item is neither, returns an
|
||||
* instance of {@link LPlaceholder}. If the argument is {@code null}, returns an instance of
|
||||
* {@link ILabel.LEmpty}.
|
||||
*/
|
||||
public static ILabel from(@Nullable Object item) {
|
||||
if (item == null) {
|
||||
return ILabel.EMPTY;
|
||||
}
|
||||
|
||||
if (item instanceof ItemStack) {
|
||||
// We require special handling of item stacks that contain fluids. For those, we check if they are any
|
||||
// variant of the large fluid cell. If that is the case, we return a fluid stack instead of an item
|
||||
// stack label. `getFluidForFilledItem` returns `null` if the cell is empty. For those cases, we still
|
||||
// return an item stack label.
|
||||
ItemStack itemStack = (ItemStack) item;
|
||||
if (isGregTechLargeFluidContainer(itemStack)) {
|
||||
FluidStack fluidStack = GTUtility.getFluidForFilledItem(itemStack, true);
|
||||
if (fluidStack != null) {
|
||||
return new LFluidStack(fluidStack);
|
||||
}
|
||||
}
|
||||
|
||||
return new LItemStack((ItemStack) item);
|
||||
}
|
||||
|
||||
if (item instanceof FluidStack) {
|
||||
return new LFluidStack((FluidStack) item);
|
||||
}
|
||||
|
||||
if (item instanceof EnchantmentData) {
|
||||
ItemStack itemStack = new ItemStack(Items.enchanted_book);
|
||||
new ItemEnchantedBook().addEnchantment(itemStack, (EnchantmentData) item);
|
||||
return new LItemStack(itemStack);
|
||||
}
|
||||
|
||||
JustEnoughCalculation.logger.warn("Unrecognized ingredient type: {}", item.getClass());
|
||||
return LPlaceholder.Converter.from(item);
|
||||
}
|
||||
|
||||
public void register(ConverterFunction handler, Priority priority) {
|
||||
|
||||
@@ -20,8 +20,7 @@ import me.towdium.jecalculation.gui.Resource;
|
||||
import me.towdium.jecalculation.utils.Utilities;
|
||||
|
||||
/**
|
||||
* Author: towdium
|
||||
* Date: 17-9-27.
|
||||
* A label that represents some quantity of a fluid.
|
||||
*/
|
||||
@ParametersAreNonnullByDefault
|
||||
public class LFluidStack extends ILabel.Impl {
|
||||
@@ -30,10 +29,24 @@ public class LFluidStack extends ILabel.Impl {
|
||||
public static final String KEY_FLUID = "fluid";
|
||||
public static final String KEY_NBT = "nbt";
|
||||
|
||||
/**
|
||||
* The fluid the label represents.
|
||||
*/
|
||||
Fluid fluid;
|
||||
|
||||
/**
|
||||
* The fluids optional NBT tag.
|
||||
*/
|
||||
NBTTagCompound nbt;
|
||||
|
||||
/**
|
||||
* An instance of {@link FluidStack} that represents the fluid inside inventories.
|
||||
*/
|
||||
FluidStack temp;
|
||||
|
||||
/**
|
||||
* Returns the fluid (item) stack representation.
|
||||
*/
|
||||
@Override
|
||||
public FluidStack getRepresentation() {
|
||||
return temp;
|
||||
|
||||
@@ -222,14 +222,20 @@ public class GuiCraft extends Gui {
|
||||
refreshResult();
|
||||
}
|
||||
|
||||
/*
|
||||
* Gets all items in the player's inventory. Additionally, checks a list of fluid containers to see if the player
|
||||
* carries and fluids for crafting tasks with them.
|
||||
*/
|
||||
List<ILabel> getInventory() {
|
||||
InventoryPlayer inv = Utilities.getPlayer().inventory;
|
||||
ArrayList<ILabel> labels = new ArrayList<>();
|
||||
|
||||
Consumer<ItemStack[]> add = i -> Arrays.stream(i)
|
||||
.filter(j -> !ItemStackHelper.isEmpty(j))
|
||||
.forEach(j -> labels.add(ILabel.Converter.from(j)));
|
||||
add.accept(inv.armorInventory);
|
||||
add.accept(inv.mainInventory);
|
||||
|
||||
return labels;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,26 @@ public class ItemStackHelper {
|
||||
public static final Item EMPTY_ITEM = null;
|
||||
public static final ItemStack EMPTY_ITEM_STACK = new ItemStack((Item) null);
|
||||
|
||||
private static final String GREGTECH_LARGE_FLUID_CELL_ID = "gt.metaitem.01";
|
||||
|
||||
public static boolean isEmpty(ItemStack stack) {
|
||||
return stack == null || stack == EMPTY_ITEM_STACK || stack.getItem() == EMPTY_ITEM;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given ItemStack is a GregTech large fluid container. This method checks for all variants of the
|
||||
* item.
|
||||
*
|
||||
* @param itemStack The ItemStack to check.
|
||||
* @return True if the ItemStack is a GregTech large fluid container, false otherwise.
|
||||
*/
|
||||
public static boolean isGregTechLargeFluidContainer(ItemStack itemStack) {
|
||||
Item item = itemStack.getItem();
|
||||
if (item == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return item.getUnlocalizedName()
|
||||
.equals(GREGTECH_LARGE_FLUID_CELL_ID);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user