Add NEI Fluids Support (#83)

This commit is contained in:
slprime authored and GitHub committed 2026-09-13 02:11:14 +00:00
1 parent 88614bd1f1
commit 7d41385a79
7 files changed
+37 -63

No files matched your search

+1 -1
View File
@@ -1,7 +1,7 @@
dependencies {
api("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-1023-GTNH:dev")
api("com.github.GTNewHorizons:NotEnoughItems:2.8.116-GTNH:dev")
api("com.github.GTNewHorizons:NotEnoughItems:2.8.134-GTNH:dev")
api('com.github.GTNewHorizons:CodeChickenCore:1.4.17:dev')
implementation("com.github.GTNewHorizons:Baubles-Expanded:2.2.21-GTNH:dev")
@@ -12,9 +12,6 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
@@ -35,9 +32,7 @@ import com.github.vfyjxf.nee.network.NEENetworkHandler;
import com.github.vfyjxf.nee.network.packet.PacketSlotStackChange;
import com.github.vfyjxf.nee.network.packet.PacketStackCountChange;
import com.github.vfyjxf.nee.network.packet.PacketValueConfigServer;
import com.github.vfyjxf.nee.processor.GregTech5RecipeProcessor;
import com.github.vfyjxf.nee.utils.ItemUtils;
import com.github.vfyjxf.nee.utils.ModIDs;
import com.glodblock.github.client.gui.GuiLevelMaintainer;
import appeng.api.events.GuiScrollEvent;
@@ -67,7 +62,6 @@ import codechicken.nei.recipe.RecipeInfo;
import codechicken.nei.util.NEIMouseUtils;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import gregtech.api.enums.ItemList;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -349,10 +343,10 @@ public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltip
if (currentStackIndex < 0) return;
final ItemStack nextStack = items.get(Math.floorMod(currentStackIndex - dWheel, items.size())).copy();
final FluidStack nextFluidStack = getFluidStackOrNull(nextStack);
final FluidStack nextFluidStack = ItemUtils.getFluidFromDisplayStack(nextStack);
final ItemStack baseStack = baseIngredients.item;
final FluidStack baseFluidStack = getFluidStackOrNull(baseStack);
final FluidStack baseFluidStack = ItemUtils.getFluidFromDisplayStack(baseStack);
final long baseStackSize = baseFluidStack == null ? baseStack.stackSize : baseFluidStack.amount;
final Int2ObjectMap<IAEStack<?>> craftingSlots = new Int2ObjectOpenHashMap<>();
@@ -363,7 +357,7 @@ public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltip
final ItemStack slotStack = slotAEStack.getItemStackForNEI();
if (slotStack == null) continue;
final FluidStack slotFluidStack = getFluidStackOrNull(slotStack);
final FluidStack slotFluidStack = ItemUtils.getFluidFromDisplayStack(slotStack);
final long slotStackSize = slotFluidStack == null ? slotStack.stackSize : slotFluidStack.amount;
final PositionedStack slotIngredients = NEEPatternTerminalHandler.ingredients
@@ -393,7 +387,7 @@ public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltip
}
}
} else {
FluidStack baseSlotFluidStack = getFluidStackOrNull(baseSlotStack);
FluidStack baseSlotFluidStack = ItemUtils.getFluidFromDisplayStack(baseSlotStack);
final long baseSlotStackSize = baseSlotFluidStack == null ? baseSlotStack.stackSize
: baseSlotFluidStack.amount;
@@ -441,12 +435,4 @@ public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltip
return uniqueItems;
}
@Nullable
private FluidStack getFluidStackOrNull(@Nonnull ItemStack displayStack) {
if (Loader.isModLoaded(ModIDs.GT) && displayStack.getItem() == ItemList.Display_Fluid.getItem()) {
return GregTech5RecipeProcessor.getFluidFromDisplayStack(displayStack);
}
return null;
}
}
@@ -13,6 +13,7 @@ import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.FluidStack;
import com.djgiannuzz.thaumcraftneiplugin.items.ItemAspect;
import com.github.vfyjxf.nee.utils.GuiUtils;
@@ -30,7 +31,6 @@ import appeng.container.implementations.ContainerPatternTerm;
import appeng.helpers.IContainerCraftingPacket;
import appeng.util.item.AEFluidStack;
import appeng.util.item.AEItemStack;
import codechicken.nei.recipe.StackInfo;
import cpw.mods.fml.common.network.ByteBufUtils;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
@@ -206,8 +206,9 @@ public class PacketNEIPatternRecipe implements IMessage {
}
private IAEStack<?> getAEStack(final ItemStack is) {
if (StackInfo.itemStackToNBT(is).hasKey("gtFluidName")) {
return AEFluidStack.create(StackInfo.getFluid(is));
final FluidStack fluidStack = ItemUtils.getFluidFromDisplayStack(is);
if (fluidStack != null) {
return AEFluidStack.create(fluidStack);
} else if (ThaumicEnergistics_isLoaded && isAspect(is)) {
return AEStackTypeRegistry.getType(ESSENTIA_STACK_ID).convertStackFromItem(is);
} else {
@@ -8,6 +8,8 @@ import java.util.Set;
import javax.annotation.Nonnull;
import com.github.vfyjxf.nee.utils.ItemUtils;
import codechicken.nei.PositionedStack;
import codechicken.nei.recipe.IRecipeHandler;
@@ -62,8 +64,8 @@ public class GTPPRecipeProcessor implements IRecipeProcessor {
if (this.getAllOverlayIdentifier().contains(identifier)) {
recipeInputs.addAll(recipe.getIngredientStacks(recipeIndex));
recipeInputs.removeIf(
positionedStack -> GregTech5RecipeProcessor.getFluidFromDisplayStack(positionedStack.items[0])
!= null || positionedStack.item.stackSize == 0);
positionedStack -> ItemUtils.getFluidFromDisplayStack(positionedStack.items[0]) != null
|| positionedStack.item.stackSize == 0);
return recipeInputs;
}
return recipeInputs;
@@ -75,9 +77,8 @@ public class GTPPRecipeProcessor implements IRecipeProcessor {
List<PositionedStack> recipeOutputs = new ArrayList<>();
if (this.getAllOverlayIdentifier().contains(identifier)) {
recipeOutputs.addAll(recipe.getOtherStacks(recipeIndex));
recipeOutputs.removeIf(
positionedStack -> GregTech5RecipeProcessor.getFluidFromDisplayStack(positionedStack.items[0])
!= null);
recipeOutputs
.removeIf(positionedStack -> ItemUtils.getFluidFromDisplayStack(positionedStack.items[0]) != null);
return recipeOutputs;
}
return recipeOutputs;
@@ -8,6 +8,8 @@ import java.util.Set;
import javax.annotation.Nonnull;
import com.github.vfyjxf.nee.utils.ItemUtils;
import codechicken.nei.PositionedStack;
import codechicken.nei.recipe.IRecipeHandler;
@@ -32,8 +34,8 @@ public class GoodGeneratorRecipeProcessor implements IRecipeProcessor {
if (this.getAllOverlayIdentifier().contains(identifier)) {
recipeInputs.addAll(recipe.getIngredientStacks(recipeIndex));
recipeInputs.removeIf(
positionedStack -> GregTech5RecipeProcessor.getFluidFromDisplayStack(positionedStack.items[0])
!= null || positionedStack.item.stackSize == 0);
positionedStack -> ItemUtils.getFluidFromDisplayStack(positionedStack.items[0]) != null
|| positionedStack.item.stackSize == 0);
return recipeInputs;
}
return recipeInputs;
@@ -45,9 +47,8 @@ public class GoodGeneratorRecipeProcessor implements IRecipeProcessor {
List<PositionedStack> recipeOutputs = new ArrayList<>();
if (this.getAllOverlayIdentifier().contains(identifier)) {
recipeOutputs.addAll(recipe.getOtherStacks(recipeIndex));
recipeOutputs.removeIf(
positionedStack -> GregTech5RecipeProcessor.getFluidFromDisplayStack(positionedStack.items[0])
!= null);
recipeOutputs
.removeIf(positionedStack -> ItemUtils.getFluidFromDisplayStack(positionedStack.items[0]) != null);
return recipeOutputs;
}
return recipeOutputs;
@@ -9,16 +9,10 @@ import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import com.github.vfyjxf.nee.config.NEEConfig;
import codechicken.nei.PositionedStack;
import codechicken.nei.recipe.IRecipeHandler;
import gregtech.api.enums.ItemList;
import gregtech.api.recipe.RecipeCategory;
/**
@@ -45,23 +39,6 @@ public class GregTech5RecipeProcessor implements IRecipeProcessor {
this.isNH = isNH;
}
/**
* For resolving NoSuchMethodError Copied from GTNewHorizons/GT5-Unofficial.
*/
public static FluidStack getFluidFromDisplayStack(ItemStack aDisplayStack) {
if (!isStackValid(aDisplayStack) || aDisplayStack.getItem() != ItemList.Display_Fluid.getItem()
|| !aDisplayStack.hasTagCompound()) {
return null;
}
Fluid tFluid = FluidRegistry.getFluid(ItemList.Display_Fluid.getItem().getDamage(aDisplayStack));
return new FluidStack(tFluid, (int) aDisplayStack.getTagCompound().getLong("mFluidDisplayAmount"));
}
public static boolean isStackValid(Object aStack) {
return (aStack instanceof ItemStack) && ((ItemStack) aStack).getItem() != null
&& ((ItemStack) aStack).stackSize >= 0;
}
@Nonnull
@Override
public Set<String> getAllOverlayIdentifier() {
@@ -12,6 +12,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.JsonToNBT;
import net.minecraft.nbt.NBTException;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.FluidStack;
import com.github.vfyjxf.nee.NotEnoughEnergistics;
import com.github.vfyjxf.nee.processor.IRecipeProcessor;
@@ -20,13 +21,12 @@ import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import codechicken.nei.NEIServerUtils;
import codechicken.nei.recipe.StackInfo;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.registry.GameRegistry;
public final class ItemUtils {
private static final String GT_DISPLAY_FLUID_ITEM_ID = "gt.GregTech_FluidDisplay";
public static Gson gson = new Gson();
public static List<StackProcessor> transformItemBlacklist = getTransformItemBlacklist();
public static List<StackProcessor> transformItemPriorityList = getTransformItemPriorityList();
@@ -44,6 +44,15 @@ public final class ItemUtils {
transformItemPriorityList = getTransformItemPriorityList();
}
public static FluidStack getFluidFromDisplayStack(ItemStack aDisplayStack) {
if (aDisplayStack != null && aDisplayStack.getItem() != null && StackInfo.isFluidDisplayItem(aDisplayStack)) {
return StackInfo.getFluid(aDisplayStack);
}
return null;
}
public static List<StackProcessor> getTransformItemBlacklist() {
List<StackProcessor> transformItemBlacklist = new ArrayList<>();
for (String itemJsonString : transformBlacklist) {
@@ -186,12 +195,11 @@ public final class ItemUtils {
}
public static boolean areStacksSameType(ItemStack aStack, ItemStack bStack) {
if (Loader.isModLoaded(ModIDs.GT) && aStack != null && bStack != null) {
Item displayFluidItem = GameRegistry.findItem(ModIDs.GT, GT_DISPLAY_FLUID_ITEM_ID);
if (displayFluidItem != null && aStack.getItem() == displayFluidItem
&& bStack.getItem() == displayFluidItem) {
return displayFluidItem.getDamage(aStack) == displayFluidItem.getDamage(bStack);
}
final FluidStack aFluid = getFluidFromDisplayStack(aStack);
final FluidStack bFluid = getFluidFromDisplayStack(bStack);
if (aFluid != null && bFluid != null) {
return aFluid.isFluidEqual(bFluid);
}
return NEIServerUtils.areStacksSameTypeCraftingWithNBT(aStack, bStack);