Skip to content
tttsaurus edited this page Sep 29, 2024 · 15 revisions

Firstly

import mods.fluidintetweaker.event.CustomFluidInteractionEvent;

For v1.4.x

For v1.3.x

Introducing CustomFluidInteractionEvent

CustomFluidInteractionEvent will be posted to Forge's EVENT_BUS when a fluid interaction is detected, and the output block will be placed after posting CustomFluidInteractionEvent since the placement is achieved by listening to CustomFluidInteractionEvent.

Available Getters

  • boolean isLiquidAboveAndBelowCase
  • IBlockState liquidBlockStateBeforeInteraction
  • ILiquidDefinition liquidBeforeInteraction
  • String liquidInteractionRecipeKey
  • IWorld world
  • IBlockState blockState
  • IBlock block
  • IBlockPos position
  • int x
  • int y
  • int z
  • boolean canceled

Available Setters

  • boolean canceled

Available Methods

  • void cancel()

Example that prevents all fluid interactions

import mods.fluidintetweaker.event.CustomFluidInteractionEvent;
// since zenutils 1.16.0
import mods.zenutils.EventPriority;

events.register(function(event as CustomFluidInteractionEvent)
{
    event.cancel();

}, EventPriority.highest(), true);
// set the priority to the highest so it really cancels the event

By the way, the listening method below without using zenutils is also available.

events.onCustomFluidInteraction(function(event as CustomFluidInteractionEvent)
{

});

However, it's not capable of canceling the event successfully due to the priority reason.

Example that spawns variant block by chance

In this case, flowing cobalt + water -> 70% stone & 30% cobalt ore.

import mods.fluidintetweaker.FITweaker;
import mods.fluidintetweaker.event.CustomFluidInteractionEvent;

var recipes as [string] = FITweaker.addRecipe(<liquid:cobalt>, false, <liquid:water>, <item:minecraft:stone>.asBlock());
FITweaker.addRecipe(<liquid:cobalt>, true, <liquid:water>, <item:minecraft:obsidian>.asBlock());

events.onCustomFluidInteraction(function(event as CustomFluidInteractionEvent)
{
    var thisRecipe = event.liquidInteractionRecipeKey;

    for recipe in recipes
    {
        if (recipe == thisRecipe)
        {
            // 30% chance to spawn a cobalt ore instead of the stone
            var p = event.world.random.nextFloat(0, 1);
            if (p <= 0.3f)
            {
                event.world.setBlockState(<blockstate:tconstruct:ore>, event.position);
            }
        }
    }
});

Example that spawns end stone in the End

In the Overworld, lava + water -> stone, but end stone instead in the End. (example provided by penteractgaming from CurseForge)

import mods.fluidintetweaker.FITweaker;
import mods.fluidintetweaker.event.CustomFluidInteractionEvent;

var recipes as [string] = FITweaker.addRecipe(<liquid:lava>, false, <liquid:water>, <item:minecraft:stone>.asBlock());

events.onCustomFluidInteraction(function(event as CustomFluidInteractionEvent)
{
    var thisRecipe = event.liquidInteractionRecipeKey;
    
    for recipe in recipes
    {
        if (recipe == thisRecipe)
        {
            val biome_name as string = event.world.getBiome(event.position).name;
            if (biome_name == "The End")
                event.world.setBlockState(<blockstate:minecraft:end_stone>, event.position);
        }
    }
});