package net.minecraftforge.test; import java.util.List; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.IFluidHandlerItem; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.relauncher.Side; import javax.annotation.Nonnull; import javax.annotation.Nullable; @Mod(modid="fluidhandlertest", name="FluidHandlerTest", version="0.0.0", acceptableRemoteVersions = "*") public class FluidHandlerTest { public static final boolean ENABLE = true; @Mod.EventHandler public void loadComplete(FMLLoadCompleteEvent event) { if (!ENABLE || FMLCommonHandler.instance().getSide() != Side.CLIENT) return; for (ItemStack stack : getAllItems()) { testFluidContainer(stack); } } private static void testFluidContainer(ItemStack stack) { ItemStack originalStack = stack.copy(); ItemStack preDrainStack = stack.copy(); IFluidHandlerItem fluidHandler = FluidUtil.getFluidHandler(preDrainStack); if (fluidHandler != null) { FluidStack drain = fluidHandler.drain(Integer.MAX_VALUE, true); ItemStack drainedStack = fluidHandler.getContainer(); FMLLog.info("Draining " + stackString(stack) + " gives " + fluidString(drain) + " and " + stackString(drainedStack)); if (drain == null && !ItemStack.areItemStacksEqual(originalStack, preDrainStack)) { throw new RuntimeException("ItemStack was altered by its fluid handler when drain did nothing."); } for (Fluid fluid : FluidRegistry.getRegisteredFluids().values()) { ItemStack preFillStack = stack.copy(); fluidHandler = FluidUtil.getFluidHandler(preFillStack); if (fluidHandler != null) { int filled = fluidHandler.fill(new FluidStack(fluid, Integer.MAX_VALUE), true); ItemStack filledStack = fluidHandler.getContainer(); if (filled > 0) { FMLLog.info("Filling " + stackString(stack) + " with " + fluidString(new FluidStack(fluid, filled)) + " gives " + stackString(filledStack)); } else { if (!ItemStack.areItemStacksEqual(originalStack, preFillStack)) { throw new RuntimeException("ItemStack was altered by its fluid handler when fill did nothing."); } if (!ItemStack.areItemStacksEqual(preFillStack, filledStack)) { throw new RuntimeException("ItemStack was altered by its fluid handler when fill did nothing."); } } } } } } private static String fluidString(@Nullable FluidStack stack) { if (stack == null) { return "no fluid"; } else { return stack.amount + "mB " + stack.getLocalizedName(); } } private static String stackString(@Nonnull ItemStack stack) { if (stack.isEmpty()) { return "no item"; } else { String resourceDomain; if (stack.getItem().getRegistryName() == null) { resourceDomain = "unknown"; } else { resourceDomain = stack.getItem().getRegistryName().getResourceDomain(); } return stack.getCount() + " " + stack.getDisplayName() + " (" + resourceDomain + ")"; } } private static List<ItemStack> getAllItems() { NonNullList<ItemStack> list = NonNullList.create(); for (Item item : ForgeRegistries.ITEMS.getValues()) { for (CreativeTabs tab : item.getCreativeTabs()) { item.getSubItems(item, tab, list); } } return list; } }