TheWildBackport/common/src/main/java/com/cursedcauldron/wildbackport/common/blocks/DrippingFluid.java
2023-08-29 17:39:30 +02:00

52 lines
2.2 KiB
Java

package com.cursedcauldron.wildbackport.common.blocks;
import java.util.Optional;
import com.cursedcauldron.wildbackport.common.registry.WBBlocks;
import com.cursedcauldron.wildbackport.common.tag.WBBlockTags;
import com.cursedcauldron.wildbackport.core.mixin.access.PointedDripstoneBlockAccessor;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.Fluids;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public record DrippingFluid(BlockPos pos, Fluid fluid, BlockState sourceState) {
public static void fillCauldron(
BlockState state, ServerLevel world, BlockPos blockPos, CallbackInfo ci
) {
Optional<DrippingFluid> fluidAbove
= getFluidAboveStalactite(world, blockPos, state);
if (fluidAbove.isPresent()) {
Fluid fluid = fluidAbove.get().fluid;
if (fluidAbove.get().sourceState().is(WBBlockTags.MUD)
&& fluid == Fluids.WATER) {
world.setBlockAndUpdate(
fluidAbove.get().pos, Blocks.CLAY.defaultBlockState()
);
world.levelEvent(1504, blockPos, 0);
ci.cancel();
}
}
}
public static Optional<DrippingFluid> getFluidAboveStalactite(
Level level, BlockPos pos, BlockState state
) {
return !PointedDripstoneBlockAccessor.callIsStalactite(state)
? Optional.empty()
: PointedDripstoneBlockAccessor.callFindRootBlock(level, pos, state, 11)
.map(blockPos -> {
BlockPos position = blockPos.above();
BlockState sourceState = level.getBlockState(position);
Fluid fluid = sourceState.is(WBBlockTags.MUD)
&& !level.dimensionType().ultraWarm()
? Fluids.WATER
: level.getFluidState(position).getType();
return new DrippingFluid(position, fluid, sourceState);
});
}
}