diff options
Diffstat (limited to 'src/main/java/moe/nea/morbing/BloodFluid.java')
-rw-r--r-- | src/main/java/moe/nea/morbing/BloodFluid.java | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/main/java/moe/nea/morbing/BloodFluid.java b/src/main/java/moe/nea/morbing/BloodFluid.java new file mode 100644 index 0000000..bbda497 --- /dev/null +++ b/src/main/java/moe/nea/morbing/BloodFluid.java @@ -0,0 +1,144 @@ +package moe.nea.morbing; + +import net.minecraft.block.BlockState; +import net.minecraft.fluid.FlowableFluid; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; + +public abstract class BloodFluid extends FlowableFluid { + + @Override + public Item getBucketItem() { + return Items.AIR; + } + + @Override + protected boolean canBeReplacedWith(FluidState state, BlockView world, BlockPos pos, Fluid fluid, Direction direction) { + return true; + } + + @Override + public Vec3d getVelocity(BlockView world, BlockPos pos, FluidState state) { + return new Vec3d(0, 0, 0); + } + + @Override + public Fluid getFlowing() { + return Morbing.FLOWING_BLOOD; + } + + @Override + public Fluid getStill() { + return Morbing.STILL_BLOOD; + } + + @Override + protected boolean isInfinite() { + return false; + } + + @Override + protected void beforeBreakingBlock(WorldAccess world, BlockPos pos, BlockState state) { + } + + @Override + public boolean matchesType(Fluid fluid) { + return fluid == getStill() || fluid == getFlowing(); + } + + @Override + protected int getFlowSpeed(WorldView world) { + return 0; + } + + @Override + protected int getLevelDecreasePerBlock(WorldView world) { + return 8; + } + + @Override + protected FluidState getUpdatedState(WorldView world, BlockPos pos, BlockState state) { + BlockPos abovePos = pos.up(); + BlockState aboveState = world.getBlockState(abovePos); + FluidState aboveFluid = aboveState.getFluidState(); + if (state.getFluidState().getFluid() != this && !aboveFluid.isEmpty() && matchesType(aboveFluid.getFluid())) { + return getFlowing(aboveFluid.getLevel(), true); + } + if (state.getFluidState().getFluid() == getFlowing()) { + BlockPos downPos = pos.down(); + BlockState downState = world.getBlockState(downPos); + if (!matchesType(aboveFluid.getFluid())) { + if (downState.getFluidState().getFluid().matchesType(this)) + return Fluids.EMPTY.getDefaultState(); + return getFlowing(1, false); + } + } + return state.getFluidState(); + } + + @Override + public int getTickRate(WorldView world) { + return 5; + } + + @Override + protected float getBlastResistance() { + return 2; + } + + @Override + protected BlockState toBlockState(FluidState state) { + return ModBlocks.INSTANCE.bloodFluidBlock.getDefaultState().with(Properties.LEVEL_15, getBlockStateLevel(state)); + } + + @Override + public VoxelShape getShape(FluidState state, BlockView world, BlockPos pos) { + return VoxelShapes.cuboid(0, 0, 0, 1, getHeight(state), 1); + } + + public static class Flowing extends BloodFluid { + @Override + protected void appendProperties(StateManager.Builder<Fluid, FluidState> builder) { + super.appendProperties(builder); + builder.add(LEVEL); + } + + @Override + public int getLevel(FluidState state) { + return state.get(LEVEL); + } + + @Override + public boolean isStill(FluidState state) { + return false; + } + } + + public static class Still extends BloodFluid { + + @Override + public boolean isStill(FluidState state) { + return true; + } + + @Override + public int getLevel(FluidState state) { + return 8; + } + } + + +} |