package choonster.testmod3.init; import choonster.testmod3.TestMod3; import choonster.testmod3.block.fluid.BlockFluidNoFlow; import choonster.testmod3.block.fluid.BlockFluidPortalDisplacement; import choonster.testmod3.item.block.ItemFluidTank; import choonster.testmod3.tileentity.TileEntityFluidTank; import choonster.testmod3.util.Constants; import net.minecraft.block.Block; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.MaterialLiquid; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.util.ResourceLocation; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fluids.*; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.IForgeRegistry; import java.util.HashSet; import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; @SuppressWarnings("WeakerAccess") public class ModFluids { /** * The fluids registered by this mod. Includes fluids that were already registered by another mod. */ public static final Set<Fluid> FLUIDS = new HashSet<>(); /** * The fluid blocks from this mod only. Doesn't include blocks for fluids that were already registered by another mod. */ public static final Set<IFluidBlock> MOD_FLUID_BLOCKS = new HashSet<>(); public static final Fluid STATIC = createFluid("static", false, fluid -> fluid.setLuminosity(10).setDensity(800).setViscosity(1500), fluid -> new BlockFluidNoFlow(fluid, new MaterialLiquid(MapColor.BROWN))); public static final Fluid STATIC_GAS = createFluid("static_gas", false, fluid -> fluid.setLuminosity(10).setDensity(-800).setViscosity(1500).setGaseous(true), fluid -> new BlockFluidNoFlow(fluid, new MaterialLiquid(MapColor.BROWN))); public static final Fluid NORMAL = createFluid("normal", true, fluid -> fluid.setLuminosity(10).setDensity(1600).setViscosity(100), fluid -> new BlockFluidClassic(fluid, new MaterialLiquid(MapColor.ADOBE))); public static final Fluid NORMAL_GAS = createFluid("normal_gas", true, fluid -> fluid.setLuminosity(10).setDensity(-1600).setViscosity(100).setGaseous(true), fluid -> new BlockFluidClassic(fluid, new MaterialLiquid(MapColor.ADOBE))); public static final Fluid FINITE = createFluid("finite", false, fluid -> fluid.setLuminosity(10).setDensity(800).setViscosity(1500), fluid -> new BlockFluidFinite(fluid, new MaterialLiquid(MapColor.BLACK))); public static final Fluid PORTAL_DISPLACEMENT = createFluid("portal_displacement", true, fluid -> fluid.setLuminosity(10).setDensity(1600).setViscosity(100), fluid -> new BlockFluidPortalDisplacement(fluid, new MaterialLiquid(MapColor.DIAMOND))); /** * Create a {@link Fluid} and its {@link IFluidBlock}, or use the existing ones if a fluid has already been registered with the same name. * * @param name The name of the fluid * @param hasFlowIcon Does the fluid have a flow icon? * @param fluidPropertyApplier A function that sets the properties of the {@link Fluid} * @param blockFactory A function that creates the {@link IFluidBlock} * @return The fluid and block */ private static <T extends Block & IFluidBlock> Fluid createFluid(String name, boolean hasFlowIcon, Consumer<Fluid> fluidPropertyApplier, Function<Fluid, T> blockFactory) { final String texturePrefix = Constants.RESOURCE_PREFIX + "blocks/fluid_"; final ResourceLocation still = new ResourceLocation(texturePrefix + name + "_still"); final ResourceLocation flowing = hasFlowIcon ? new ResourceLocation(texturePrefix + name + "_flow") : still; Fluid fluid = new Fluid(name, still, flowing); final boolean useOwnFluid = FluidRegistry.registerFluid(fluid); if (useOwnFluid) { fluidPropertyApplier.accept(fluid); MOD_FLUID_BLOCKS.add(blockFactory.apply(fluid)); } else { fluid = FluidRegistry.getFluid(name); } FLUIDS.add(fluid); return fluid; } @Mod.EventBusSubscriber public static class RegistrationHandler { /** * Register this mod's fluid {@link Block}s. * * @param event The event */ @SubscribeEvent public static void registerBlocks(RegistryEvent.Register<Block> event) { final IForgeRegistry<Block> registry = event.getRegistry(); for (final IFluidBlock fluidBlock : MOD_FLUID_BLOCKS) { final Block block = (Block) fluidBlock; block.setRegistryName(TestMod3.MODID, "fluid." + fluidBlock.getFluid().getName()); block.setUnlocalizedName(Constants.RESOURCE_PREFIX + fluidBlock.getFluid().getUnlocalizedName()); block.setCreativeTab(TestMod3.creativeTab); registry.register(block); } } /** * Register this mod's fluid {@link ItemBlock}s. * * @param event The event */ @SubscribeEvent public static void registerItems(RegistryEvent.Register<Item> event) { final IForgeRegistry<Item> registry = event.getRegistry(); for (final IFluidBlock fluidBlock : MOD_FLUID_BLOCKS) { final Block block = (Block) fluidBlock; final ItemBlock itemBlock = new ItemBlock(block); itemBlock.setRegistryName(block.getRegistryName()); registry.register(itemBlock); } } } public static void registerFluidContainers() { registerTank(FluidRegistry.WATER); registerTank(FluidRegistry.LAVA); for (final Fluid fluid : FLUIDS) { registerBucket(fluid); registerTank(fluid); } } private static void registerBucket(Fluid fluid) { FluidRegistry.addBucketForFluid(fluid); } private static void registerTank(Fluid fluid) { final FluidStack fluidStack = new FluidStack(fluid, TileEntityFluidTank.CAPACITY); final Item item = Item.getItemFromBlock(ModBlocks.FLUID_TANK); assert item instanceof ItemFluidTank; ((ItemFluidTank) item).addFluid(fluidStack); } }