1. FluidStack

与 ItemStack 相仿,FluidStack 代表特定数量的特定流体,有时也会持有特定 NBT 数据。和 ItemStack 不一样的地方在于,FluidStack 持有的 Fluid 引用不能是 nullFluidStack 可以是 null,代表空流体。

// null 代表空流体。
FluidStack someFluid = null;

// 1000 mB 的水。
FluidStack anotherFluid = new FluidStack(FluidRegistry.WATER, 1000);

// 会抛出 IllegalArgumentException。
// 使用没有注册的流体也会导致其抛出 IllegalArgumentException。请务必使用注册过的流体,不论注册成功与否。
// FluidStack error = new FluidStack(null, 1000); // ERROR

// 获取流体类型的访问器。
Fluid theType = anotherFluid.getFluid();

// 出于某种原因,流体数量没有访问器,这个字段是公有的。
int size = anotherFluid.amount;

1.1. 不寻常的 equals

FluidStack 覆写了 Object.equalsObject.hashCode 方法,但这两个方法只比较 Fluid 和 NBT 数据,不比较数量。换言之,FluidStack 本身可用作 HashMap 的键,这个键相当于 FluidNBTTagCompound 组成的二元组。
需要比较数量的话,可以使用 FluidStack#isFluidStackIdentical 这个方法。
另外,FluidStack 覆写的 Object.equals 实际上是代理给了 FluidStack.isFluidEqual