ForgePatch/src/main/java/net/minecraftforge/fluids/ForgeFlowingFluid.java

263 lines
7.6 KiB
Java

/*
* Minecraft Forge
* Copyright (c) 2016-2019.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.fluids;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.FlowingFluidBlock;
import net.minecraft.fluid.FlowingFluid;
import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.IFluidState;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.state.StateContainer;
import net.minecraft.tags.FluidTags;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader;
import javax.annotation.Nullable;
import java.util.function.Supplier;
public abstract class ForgeFlowingFluid extends FlowingFluid
{
private final Supplier<? extends Fluid> flowing;
private final Supplier<? extends Fluid> still;
@Nullable
private final Supplier<? extends Item> bucket;
@Nullable
private final Supplier<? extends FlowingFluidBlock> block;
private final FluidAttributes.Builder builder;
private final boolean canMultiply;
private final int slopeFindDistance;
private final int levelDecreasePerBlock;
private final float explosionResistance;
//private final BlockRenderLayer renderLayer; // TODO: reimplement
private final int tickRate;
protected ForgeFlowingFluid(Properties properties)
{
this.flowing = properties.flowing;
this.still = properties.still;
this.builder = properties.attributes;
this.canMultiply = properties.canMultiply;
this.bucket = properties.bucket;
this.block = properties.block;
this.slopeFindDistance = properties.slopeFindDistance;
this.levelDecreasePerBlock = properties.levelDecreasePerBlock;
this.explosionResistance = properties.explosionResistance;
//this.renderLayer = properties.renderLayer;
this.tickRate = properties.tickRate;
}
@Override
public Fluid getFlowingFluid()
{
return flowing.get();
}
@Override
public Fluid getStillFluid()
{
return still.get();
}
@Override
protected boolean canSourcesMultiply()
{
return canMultiply;
}
@Override
protected void beforeReplacingBlock(IWorld worldIn, BlockPos pos, BlockState state)
{
TileEntity tileentity = state.getBlock().hasTileEntity() ? worldIn.getTileEntity(pos) : null;
Block.spawnDrops(state, worldIn.getWorld(), pos, tileentity);
}
@Override
protected int getSlopeFindDistance(IWorldReader worldIn)
{
return slopeFindDistance;
}
@Override
protected int getLevelDecreasePerBlock(IWorldReader worldIn)
{
return levelDecreasePerBlock;
}
/*@Override
public BlockRenderLayer getRenderLayer()
{
return renderLayer;
}*/
@Override
public Item getFilledBucket()
{
return bucket != null ? bucket.get() : Items.AIR;
}
@Override
protected boolean canDisplace(IFluidState state, IBlockReader world, BlockPos pos, Fluid fluidIn, Direction direction)
{
// Based on the water implementation, may need to be overriden for mod fluids that shouldn't behave like water.
return direction == Direction.DOWN && !isEquivalentTo(fluidIn);
}
@Override
public int getTickRate(IWorldReader world)
{
return tickRate;
}
@Override
protected float getExplosionResistance()
{
return explosionResistance;
}
@Override
protected BlockState getBlockState(IFluidState state)
{
if (block != null)
return block.get().getDefaultState().with(FlowingFluidBlock.LEVEL, getLevelFromState(state));
return Blocks.AIR.getDefaultState();
}
@Override
public boolean isEquivalentTo(Fluid fluidIn) {
return fluidIn == still.get() || fluidIn == flowing.get();
}
@Override
protected FluidAttributes createAttributes()
{
return builder.build(this);
}
public static class Flowing extends ForgeFlowingFluid
{
public Flowing(Properties properties)
{
super(properties);
setDefaultState(getStateContainer().getBaseState().with(LEVEL_1_8, 7));
}
protected void fillStateContainer(StateContainer.Builder<Fluid, IFluidState> builder) {
super.fillStateContainer(builder);
builder.add(LEVEL_1_8);
}
public int getLevel(IFluidState state) {
return state.get(LEVEL_1_8);
}
public boolean isSource(IFluidState state) {
return false;
}
}
public static class Source extends ForgeFlowingFluid
{
public Source(Properties properties)
{
super(properties);
}
public int getLevel(IFluidState state) {
return 8;
}
public boolean isSource(IFluidState state) {
return true;
}
}
public static class Properties
{
private Supplier<? extends Fluid> still;
private Supplier<? extends Fluid> flowing;
private FluidAttributes.Builder attributes;
private boolean canMultiply;
private Supplier<? extends Item> bucket;
private Supplier<? extends FlowingFluidBlock> block;
private int slopeFindDistance = 4;
private int levelDecreasePerBlock = 1;
private float explosionResistance = 1;
//private BlockRenderLayer renderLayer = BlockRenderLayer.TRANSLUCENT;
private int tickRate = 5;
public Properties(Supplier<? extends Fluid> still, Supplier<? extends Fluid> flowing, FluidAttributes.Builder attributes)
{
this.still = still;
this.flowing = flowing;
this.attributes = attributes;
}
public Properties canMultiply()
{
canMultiply = true;
return this;
}
public Properties bucket(Supplier<? extends Item> bucket)
{
this.bucket = bucket;
return this;
}
public Properties block(Supplier<? extends FlowingFluidBlock> block)
{
this.block = block;
return this;
}
public Properties slopeFindDistance(int slopeFindDistance)
{
this.slopeFindDistance = slopeFindDistance;
return this;
}
public Properties levelDecreasePerBlock(int levelDecreasePerBlock)
{
this.levelDecreasePerBlock = levelDecreasePerBlock;
return this;
}
public Properties explosionResistance(float explosionResistance)
{
this.explosionResistance = explosionResistance;
return this;
}
/*public Properties renderLayer(BlockRenderLayer layer)
{
this.renderLayer = layer;
return this;
}*/
}
}