mirror of
https://github.com/Ellpeck/PrettyPipes.git
synced 2024-11-22 19:58:35 +01:00
fixed some issues, made pipes waterloggable
This commit is contained in:
parent
648d860910
commit
c9c5852b1d
3 changed files with 48 additions and 10 deletions
|
@ -2,7 +2,11 @@ package de.ellpeck.prettypipes.network;
|
||||||
|
|
||||||
import de.ellpeck.prettypipes.Utility;
|
import de.ellpeck.prettypipes.Utility;
|
||||||
import de.ellpeck.prettypipes.pipe.PipeTileEntity;
|
import de.ellpeck.prettypipes.pipe.PipeTileEntity;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ILiquidContainer;
|
||||||
import net.minecraft.entity.item.ItemEntity;
|
import net.minecraft.entity.item.ItemEntity;
|
||||||
|
import net.minecraft.fluid.Fluid;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.nbt.ListNBT;
|
import net.minecraft.nbt.ListNBT;
|
||||||
|
@ -12,6 +16,8 @@ import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.world.IBlockReader;
|
||||||
|
import net.minecraft.world.IWorld;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.util.Constants;
|
import net.minecraftforge.common.util.Constants;
|
||||||
import net.minecraftforge.common.util.INBTSerializable;
|
import net.minecraftforge.common.util.INBTSerializable;
|
||||||
|
@ -26,7 +32,7 @@ import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class PipeItem implements INBTSerializable<CompoundNBT> {
|
public class PipeItem implements INBTSerializable<CompoundNBT>, ILiquidContainer {
|
||||||
|
|
||||||
public ItemStack stack;
|
public ItemStack stack;
|
||||||
public float speed;
|
public float speed;
|
||||||
|
@ -80,13 +86,13 @@ public class PipeItem implements INBTSerializable<CompoundNBT> {
|
||||||
|
|
||||||
float currSpeed = this.speed;
|
float currSpeed = this.speed;
|
||||||
BlockPos myPos = new BlockPos(this.x, this.y, this.z);
|
BlockPos myPos = new BlockPos(this.x, this.y, this.z);
|
||||||
if (!myPos.equals(currPipe.getPos()) && (this.reachedDestination() || !myPos.equals(this.startInventory))) {
|
if (!myPos.equals(currPipe.getPos()) && (currPipe.getPos().equals(this.getDestPipe()) || !myPos.equals(this.startInventory))) {
|
||||||
// we're done with the current pipe, so switch to the next one
|
// we're done with the current pipe, so switch to the next one
|
||||||
currPipe.getItems().remove(this);
|
currPipe.getItems().remove(this);
|
||||||
PipeTileEntity next = this.getNextTile(currPipe, true);
|
PipeTileEntity next = this.getNextTile(currPipe, true);
|
||||||
if (next == null) {
|
if (next == null) {
|
||||||
if (!currPipe.getWorld().isRemote) {
|
if (!currPipe.getWorld().isRemote) {
|
||||||
if (this.reachedDestination()) {
|
if (currPipe.getPos().equals(this.getDestPipe())) {
|
||||||
// ..or store in our destination container if we reached our destination
|
// ..or store in our destination container if we reached our destination
|
||||||
this.stack = this.store(currPipe);
|
this.stack = this.store(currPipe);
|
||||||
if (!this.stack.isEmpty())
|
if (!this.stack.isEmpty())
|
||||||
|
@ -106,7 +112,7 @@ public class PipeItem implements INBTSerializable<CompoundNBT> {
|
||||||
BlockPos nextPos;
|
BlockPos nextPos;
|
||||||
PipeTileEntity next = this.getNextTile(currPipe, false);
|
PipeTileEntity next = this.getNextTile(currPipe, false);
|
||||||
if (next == null) {
|
if (next == null) {
|
||||||
if (this.reachedDestination()) {
|
if (currPipe.getPos().equals(this.getDestPipe())) {
|
||||||
nextPos = this.destInventory;
|
nextPos = this.destInventory;
|
||||||
} else {
|
} else {
|
||||||
currPipe.getItems().remove(this);
|
currPipe.getItems().remove(this);
|
||||||
|
@ -173,10 +179,6 @@ public class PipeItem implements INBTSerializable<CompoundNBT> {
|
||||||
return ItemHandlerHelper.insertItemStacked(handler, this.stack, false);
|
return ItemHandlerHelper.insertItemStacked(handler, this.stack, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean reachedDestination() {
|
|
||||||
return this.currentTile >= this.path.size() - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PipeTileEntity getNextTile(PipeTileEntity currPipe, boolean progress) {
|
private PipeTileEntity getNextTile(PipeTileEntity currPipe, boolean progress) {
|
||||||
if (this.path.size() <= this.currentTile + 1)
|
if (this.path.size() <= this.currentTile + 1)
|
||||||
return null;
|
return null;
|
||||||
|
@ -276,4 +278,14 @@ public class PipeItem implements INBTSerializable<CompoundNBT> {
|
||||||
items.add(new PipeItem(list.getCompound(i)));
|
items.add(new PipeItem(list.getCompound(i)));
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canContainFluid(IBlockReader worldIn, BlockPos pos, BlockState state, Fluid fluidIn) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean receiveFluid(IWorld worldIn, BlockPos pos, BlockState state, IFluidState fluidStateIn) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,14 @@ import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||||
|
import net.minecraft.fluid.Fluids;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
import net.minecraft.item.BlockItemUseContext;
|
import net.minecraft.item.BlockItemUseContext;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.state.EnumProperty;
|
import net.minecraft.state.EnumProperty;
|
||||||
import net.minecraft.state.StateContainer;
|
import net.minecraft.state.StateContainer;
|
||||||
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
|
import net.minecraft.tags.FluidTags;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.ActionResultType;
|
import net.minecraft.util.ActionResultType;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
|
@ -55,7 +59,7 @@ public class PipeBlock extends ContainerBlock {
|
||||||
public PipeBlock() {
|
public PipeBlock() {
|
||||||
super(Block.Properties.create(Material.ROCK).hardnessAndResistance(2).sound(SoundType.STONE).notSolid());
|
super(Block.Properties.create(Material.ROCK).hardnessAndResistance(2).sound(SoundType.STONE).notSolid());
|
||||||
|
|
||||||
BlockState state = this.getDefaultState();
|
BlockState state = this.getDefaultState().with(BlockStateProperties.WATERLOGGED, false);
|
||||||
for (EnumProperty<ConnectionType> prop : DIRECTIONS.values())
|
for (EnumProperty<ConnectionType> prop : DIRECTIONS.values())
|
||||||
state = state.with(prop, ConnectionType.DISCONNECTED);
|
state = state.with(prop, ConnectionType.DISCONNECTED);
|
||||||
this.setDefaultState(state);
|
this.setDefaultState(state);
|
||||||
|
@ -78,6 +82,12 @@ public class PipeBlock extends ContainerBlock {
|
||||||
@Override
|
@Override
|
||||||
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) {
|
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) {
|
||||||
builder.add(DIRECTIONS.values().toArray(new EnumProperty[0]));
|
builder.add(DIRECTIONS.values().toArray(new EnumProperty[0]));
|
||||||
|
builder.add(BlockStateProperties.WATERLOGGED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidState getFluidState(BlockState state) {
|
||||||
|
return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : super.getFluidState(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -95,6 +105,13 @@ public class PipeBlock extends ContainerBlock {
|
||||||
return this.createState(context.getWorld(), context.getPos(), this.getDefaultState());
|
return this.createState(context.getWorld(), context.getPos(), this.getDefaultState());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) {
|
||||||
|
if (stateIn.get(BlockStateProperties.WATERLOGGED))
|
||||||
|
worldIn.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(worldIn));
|
||||||
|
return super.updatePostPlacement(stateIn, facing, facingState, worldIn, currentPos, facingPos);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) {
|
public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) {
|
||||||
onStateChanged(worldIn, pos, state);
|
onStateChanged(worldIn, pos, state);
|
||||||
|
@ -122,6 +139,10 @@ public class PipeBlock extends ContainerBlock {
|
||||||
|
|
||||||
private BlockState createState(World world, BlockPos pos, BlockState curr) {
|
private BlockState createState(World world, BlockPos pos, BlockState curr) {
|
||||||
BlockState state = this.getDefaultState();
|
BlockState state = this.getDefaultState();
|
||||||
|
IFluidState fluid = world.getFluidState(pos);
|
||||||
|
if (fluid.isTagged(FluidTags.WATER) && fluid.getLevel() == 8)
|
||||||
|
state = state.with(BlockStateProperties.WATERLOGGED, true);
|
||||||
|
|
||||||
for (Direction dir : Direction.values()) {
|
for (Direction dir : Direction.values()) {
|
||||||
EnumProperty<ConnectionType> prop = DIRECTIONS.get(dir);
|
EnumProperty<ConnectionType> prop = DIRECTIONS.get(dir);
|
||||||
ConnectionType type = getConnectionType(world, pos, dir, state);
|
ConnectionType type = getConnectionType(world, pos, dir, state);
|
||||||
|
@ -201,7 +222,6 @@ public class PipeBlock extends ContainerBlock {
|
||||||
PipeNetwork network = PipeNetwork.get(worldIn);
|
PipeNetwork network = PipeNetwork.get(worldIn);
|
||||||
network.removeNode(pos);
|
network.removeNode(pos);
|
||||||
network.onPipeChanged(pos, state);
|
network.onPipeChanged(pos, state);
|
||||||
network.getItemsInPipe(pos).clear();
|
|
||||||
super.onReplaced(state, worldIn, pos, newState, isMoving);
|
super.onReplaced(state, worldIn, pos, newState, isMoving);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -196,6 +196,12 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove() {
|
||||||
|
super.remove();
|
||||||
|
this.getItems().clear();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ITextComponent getDisplayName() {
|
public ITextComponent getDisplayName() {
|
||||||
return new TranslationTextComponent("container." + PrettyPipes.ID + ".pipe");
|
return new TranslationTextComponent("container." + PrettyPipes.ID + ".pipe");
|
||||||
|
|
Loading…
Reference in a new issue