mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-01-15 23:56:14 +01:00
water logging and contraptions
This commit is contained in:
parent
dc43f10451
commit
c51e2abf48
9 changed files with 1329 additions and 1174 deletions
|
@ -1,25 +1,5 @@
|
||||||
package com.simibubi.create.content.contraptions.components.structureMovement;
|
package com.simibubi.create.content.contraptions.components.structureMovement;
|
||||||
|
|
||||||
import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole;
|
|
||||||
import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
import java.util.function.BiPredicate;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.tuple.MutablePair;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import com.simibubi.create.AllBlocks;
|
import com.simibubi.create.AllBlocks;
|
||||||
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
||||||
import com.simibubi.create.content.contraptions.components.saw.SawBlock;
|
import com.simibubi.create.content.contraptions.components.saw.SawBlock;
|
||||||
|
@ -42,20 +22,15 @@ import com.simibubi.create.foundation.utility.Iterate;
|
||||||
import com.simibubi.create.foundation.utility.NBTHelper;
|
import com.simibubi.create.foundation.utility.NBTHelper;
|
||||||
import com.simibubi.create.foundation.utility.VecHelper;
|
import com.simibubi.create.foundation.utility.VecHelper;
|
||||||
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
|
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
|
||||||
|
import net.minecraft.block.*;
|
||||||
import net.minecraft.block.AbstractButtonBlock;
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.block.BlockState;
|
|
||||||
import net.minecraft.block.Blocks;
|
|
||||||
import net.minecraft.block.ChestBlock;
|
|
||||||
import net.minecraft.block.DoorBlock;
|
|
||||||
import net.minecraft.block.PressurePlateBlock;
|
|
||||||
import net.minecraft.block.SlimeBlock;
|
|
||||||
import net.minecraft.client.renderer.RenderType;
|
import net.minecraft.client.renderer.RenderType;
|
||||||
import net.minecraft.client.renderer.RenderTypeLookup;
|
import net.minecraft.client.renderer.RenderTypeLookup;
|
||||||
|
import net.minecraft.fluid.Fluids;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.nbt.ListNBT;
|
import net.minecraft.nbt.ListNBT;
|
||||||
import net.minecraft.nbt.NBTUtil;
|
import net.minecraft.nbt.NBTUtil;
|
||||||
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.state.properties.ChestType;
|
import net.minecraft.state.properties.ChestType;
|
||||||
import net.minecraft.state.properties.DoubleBlockHalf;
|
import net.minecraft.state.properties.DoubleBlockHalf;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
@ -72,6 +47,17 @@ import net.minecraft.world.gen.feature.template.Template.BlockInfo;
|
||||||
import net.minecraftforge.common.util.Constants.BlockFlags;
|
import net.minecraftforge.common.util.Constants.BlockFlags;
|
||||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||||
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
|
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
|
||||||
|
import org.apache.commons.lang3.tuple.MutablePair;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.BiPredicate;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole;
|
||||||
|
import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead;
|
||||||
|
|
||||||
public abstract class Contraption {
|
public abstract class Contraption {
|
||||||
|
|
||||||
|
@ -88,9 +74,8 @@ public abstract class Contraption {
|
||||||
protected Set<BlockPos> cachedColliders;
|
protected Set<BlockPos> cachedColliders;
|
||||||
protected Direction cachedColliderDirection;
|
protected Direction cachedColliderDirection;
|
||||||
protected BlockPos anchor;
|
protected BlockPos anchor;
|
||||||
|
|
||||||
List<BlockPos> renderOrder;
|
|
||||||
protected List<SuperGlueEntity> glueToRemove;
|
protected List<SuperGlueEntity> glueToRemove;
|
||||||
|
List<BlockPos> renderOrder;
|
||||||
|
|
||||||
public Contraption() {
|
public Contraption() {
|
||||||
blocks = new HashMap<>();
|
blocks = new HashMap<>();
|
||||||
|
@ -102,6 +87,40 @@ public abstract class Contraption {
|
||||||
glueToRemove = new ArrayList<>();
|
glueToRemove = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static boolean isChassis(BlockState state) {
|
||||||
|
return state.getBlock() instanceof AbstractChassisBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CompoundNBT getTileEntityNBT(World world, BlockPos pos) {
|
||||||
|
TileEntity tileentity = world.getTileEntity(pos);
|
||||||
|
CompoundNBT compoundnbt = null;
|
||||||
|
if (tileentity != null) {
|
||||||
|
compoundnbt = tileentity.write(new CompoundNBT());
|
||||||
|
compoundnbt.remove("x");
|
||||||
|
compoundnbt.remove("y");
|
||||||
|
compoundnbt.remove("z");
|
||||||
|
}
|
||||||
|
return compoundnbt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Contraption fromNBT(World world, CompoundNBT nbt) {
|
||||||
|
String type = nbt.getString("Type");
|
||||||
|
Contraption contraption = AllContraptionTypes.fromType(type);
|
||||||
|
contraption.readNBT(world, nbt);
|
||||||
|
return contraption;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isFrozen() {
|
||||||
|
return AllConfigs.SERVER.control.freezeContraptions.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static MovementBehaviour getMovement(BlockState state) {
|
||||||
|
Block block = state.getBlock();
|
||||||
|
if (!(block instanceof IPortableBlock))
|
||||||
|
return null;
|
||||||
|
return ((IPortableBlock) block).getMovementBehaviour();
|
||||||
|
}
|
||||||
|
|
||||||
public Set<BlockPos> getColliders(World world, Direction movementDirection) {
|
public Set<BlockPos> getColliders(World world, Direction movementDirection) {
|
||||||
if (blocks == null)
|
if (blocks == null)
|
||||||
return null;
|
return null;
|
||||||
|
@ -286,20 +305,13 @@ public abstract class Contraption {
|
||||||
}
|
}
|
||||||
|
|
||||||
add(pos, capture(world, pos));
|
add(pos, capture(world, pos));
|
||||||
if (blocks.size() > AllConfigs.SERVER.kinetics.maxBlocksMoved.get())
|
return blocks.size() <= AllConfigs.SERVER.kinetics.maxBlocksMoved.get();
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isAnchoringBlockAt(BlockPos pos) {
|
protected boolean isAnchoringBlockAt(BlockPos pos) {
|
||||||
return pos.equals(anchor);
|
return pos.equals(anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static boolean isChassis(BlockState state) {
|
|
||||||
return state.getBlock() instanceof AbstractChassisBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean moveChassis(World world, BlockPos pos, Direction movementDirection, List<BlockPos> frontier,
|
private boolean moveChassis(World world, BlockPos pos, Direction movementDirection, List<BlockPos> frontier,
|
||||||
Set<BlockPos> visited) {
|
Set<BlockPos> visited) {
|
||||||
TileEntity te = world.getTileEntity(pos);
|
TileEntity te = world.getTileEntity(pos);
|
||||||
|
@ -341,18 +353,6 @@ public abstract class Contraption {
|
||||||
return Pair.of(new BlockInfo(pos, blockstate, compoundnbt), tileentity);
|
return Pair.of(new BlockInfo(pos, blockstate, compoundnbt), tileentity);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CompoundNBT getTileEntityNBT(World world, BlockPos pos) {
|
|
||||||
TileEntity tileentity = world.getTileEntity(pos);
|
|
||||||
CompoundNBT compoundnbt = null;
|
|
||||||
if (tileentity != null) {
|
|
||||||
compoundnbt = tileentity.write(new CompoundNBT());
|
|
||||||
compoundnbt.remove("x");
|
|
||||||
compoundnbt.remove("y");
|
|
||||||
compoundnbt.remove("z");
|
|
||||||
}
|
|
||||||
return compoundnbt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addGlue(SuperGlueEntity entity) {
|
public void addGlue(SuperGlueEntity entity) {
|
||||||
BlockPos pos = entity.getHangingPosition();
|
BlockPos pos = entity.getHangingPosition();
|
||||||
Direction direction = entity.getFacingDirection();
|
Direction direction = entity.getFacingDirection();
|
||||||
|
@ -377,13 +377,6 @@ public abstract class Contraption {
|
||||||
getActors().add(MutablePair.of(blockInfo, null));
|
getActors().add(MutablePair.of(blockInfo, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Contraption fromNBT(World world, CompoundNBT nbt) {
|
|
||||||
String type = nbt.getString("Type");
|
|
||||||
Contraption contraption = AllContraptionTypes.fromType(type);
|
|
||||||
contraption.readNBT(world, nbt);
|
|
||||||
return contraption;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void readNBT(World world, CompoundNBT nbt) {
|
public void readNBT(World world, CompoundNBT nbt) {
|
||||||
blocks.clear();
|
blocks.clear();
|
||||||
renderOrder.clear();
|
renderOrder.clear();
|
||||||
|
@ -524,10 +517,6 @@ public abstract class Contraption {
|
||||||
return nbt;
|
return nbt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isFrozen() {
|
|
||||||
return AllConfigs.SERVER.control.freezeContraptions.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeBlocksFromWorld(IWorld world, BlockPos offset) {
|
public void removeBlocksFromWorld(IWorld world, BlockPos offset) {
|
||||||
removeBlocksFromWorld(world, offset, (pos, state) -> false);
|
removeBlocksFromWorld(world, offset, (pos, state) -> false);
|
||||||
}
|
}
|
||||||
|
@ -548,8 +537,8 @@ public abstract class Contraption {
|
||||||
.add(offset);
|
.add(offset);
|
||||||
if (customRemoval.test(add, block.state))
|
if (customRemoval.test(add, block.state))
|
||||||
continue;
|
continue;
|
||||||
Block blockIn = world.getBlockState(add)
|
BlockState oldState = world.getBlockState(add);
|
||||||
.getBlock();
|
Block blockIn = oldState.getBlock();
|
||||||
if (block.state.getBlock() != blockIn)
|
if (block.state.getBlock() != blockIn)
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
world.getWorld()
|
world.getWorld()
|
||||||
|
@ -557,6 +546,10 @@ public abstract class Contraption {
|
||||||
int flags = 67;
|
int flags = 67;
|
||||||
if (blockIn instanceof DoorBlock)
|
if (blockIn instanceof DoorBlock)
|
||||||
flags = flags | 32 | 16;
|
flags = flags | 32 | 16;
|
||||||
|
if (blockIn instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED) && oldState.get(BlockStateProperties.WATERLOGGED).booleanValue()) {
|
||||||
|
world.setBlockState(add, Blocks.WATER.getDefaultState(), flags);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
world.setBlockState(add, Blocks.AIR.getDefaultState(), flags);
|
world.setBlockState(add, Blocks.AIR.getDefaultState(), flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -569,7 +562,6 @@ public abstract class Contraption {
|
||||||
public void addBlocksToWorld(World world, BlockPos offset, Vec3d rotation,
|
public void addBlocksToWorld(World world, BlockPos offset, Vec3d rotation,
|
||||||
BiPredicate<BlockPos, BlockState> customPlacement) {
|
BiPredicate<BlockPos, BlockState> customPlacement) {
|
||||||
stop(world);
|
stop(world);
|
||||||
|
|
||||||
StructureTransform transform = new StructureTransform(offset, rotation);
|
StructureTransform transform = new StructureTransform(offset, rotation);
|
||||||
|
|
||||||
for (boolean nonBrittles : Iterate.trueAndFalse) {
|
for (boolean nonBrittles : Iterate.trueAndFalse) {
|
||||||
|
@ -578,6 +570,7 @@ public abstract class Contraption {
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
BlockPos targetPos = transform.apply(block.pos);
|
BlockPos targetPos = transform.apply(block.pos);
|
||||||
|
|
||||||
BlockState state = transform.apply(block.state);
|
BlockState state = transform.apply(block.state);
|
||||||
|
|
||||||
if (customPlacement.test(targetPos, state))
|
if (customPlacement.test(targetPos, state))
|
||||||
|
@ -602,6 +595,10 @@ public abstract class Contraption {
|
||||||
Block.spawnDrops(state, world, targetPos, null);
|
Block.spawnDrops(state, world, targetPos, null);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (state.getBlock() instanceof IWaterLoggable && state.has(BlockStateProperties.WATERLOGGED)) {
|
||||||
|
IFluidState ifluidstate = world.getFluidState(targetPos);
|
||||||
|
state = state.with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER));
|
||||||
|
}
|
||||||
|
|
||||||
world.destroyBlock(targetPos, true);
|
world.destroyBlock(targetPos, true);
|
||||||
world.setBlockState(targetPos, state, 3 | BlockFlags.IS_MOVING);
|
world.setBlockState(targetPos, state, 3 | BlockFlags.IS_MOVING);
|
||||||
|
@ -686,13 +683,6 @@ public abstract class Contraption {
|
||||||
callBack.accept(getMovement(pair.getLeft().state), pair.getRight());
|
callBack.accept(getMovement(pair.getLeft().state), pair.getRight());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static MovementBehaviour getMovement(BlockState state) {
|
|
||||||
Block block = state.getBlock();
|
|
||||||
if (!(block instanceof IPortableBlock))
|
|
||||||
return null;
|
|
||||||
return ((IPortableBlock) block).getMovementBehaviour();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void expandBoundsAroundAxis(Axis axis) {
|
public void expandBoundsAroundAxis(Axis axis) {
|
||||||
AxisAlignedBB bb = bounds;
|
AxisAlignedBB bb = bounds;
|
||||||
double maxXDiff = Math.max(bb.maxX - 1, -bb.minX);
|
double maxXDiff = Math.max(bb.maxX - 1, -bb.minX);
|
||||||
|
|
|
@ -1,16 +1,17 @@
|
||||||
package com.simibubi.create.content.contraptions.components.structureMovement.piston;
|
package com.simibubi.create.content.contraptions.components.structureMovement.piston;
|
||||||
|
|
||||||
import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole;
|
|
||||||
|
|
||||||
import com.simibubi.create.AllBlocks;
|
import com.simibubi.create.AllBlocks;
|
||||||
import com.simibubi.create.AllShapes;
|
import com.simibubi.create.AllShapes;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState;
|
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState;
|
||||||
import com.simibubi.create.foundation.block.ProperDirectionalBlock;
|
import com.simibubi.create.foundation.block.ProperDirectionalBlock;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.IWaterLoggable;
|
||||||
import net.minecraft.block.material.PushReaction;
|
import net.minecraft.block.material.PushReaction;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.fluid.Fluids;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
|
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.Builder;
|
import net.minecraft.state.StateContainer.Builder;
|
||||||
|
@ -22,19 +23,23 @@ import net.minecraft.util.math.RayTraceResult;
|
||||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||||
import net.minecraft.util.math.shapes.VoxelShape;
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
import net.minecraft.world.IBlockReader;
|
import net.minecraft.world.IBlockReader;
|
||||||
|
import net.minecraft.world.IWorld;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public class MechanicalPistonHeadBlock extends ProperDirectionalBlock {
|
import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole;
|
||||||
|
|
||||||
|
public class MechanicalPistonHeadBlock extends ProperDirectionalBlock implements IWaterLoggable {
|
||||||
|
|
||||||
public static final EnumProperty<PistonType> TYPE = BlockStateProperties.PISTON_TYPE;
|
public static final EnumProperty<PistonType> TYPE = BlockStateProperties.PISTON_TYPE;
|
||||||
|
|
||||||
public MechanicalPistonHeadBlock(Properties p_i48415_1_) {
|
public MechanicalPistonHeadBlock(Properties p_i48415_1_) {
|
||||||
super(p_i48415_1_);
|
super(p_i48415_1_);
|
||||||
|
setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||||
builder.add(TYPE);
|
builder.add(TYPE, BlockStateProperties.WATERLOGGED);
|
||||||
super.fillStateContainer(builder);
|
super.fillStateContainer(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,4 +90,24 @@ public class MechanicalPistonHeadBlock extends ProperDirectionalBlock {
|
||||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||||
return AllShapes.MECHANICAL_PISTON_HEAD.get(state.get(FACING));
|
return AllShapes.MECHANICAL_PISTON_HEAD.get(state.get(FACING));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidState getFluidState(BlockState state) {
|
||||||
|
return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState,
|
||||||
|
IWorld world, BlockPos pos, BlockPos neighbourPos) {
|
||||||
|
if (state.get(BlockStateProperties.WATERLOGGED)) {
|
||||||
|
world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||||
|
IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos());
|
||||||
|
return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
package com.simibubi.create.content.contraptions.components.structureMovement.piston;
|
package com.simibubi.create.content.contraptions.components.structureMovement.piston;
|
||||||
|
|
||||||
import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole;
|
|
||||||
import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPiston;
|
|
||||||
import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead;
|
|
||||||
|
|
||||||
import com.simibubi.create.AllShapes;
|
import com.simibubi.create.AllShapes;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState;
|
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*;
|
||||||
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
|
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
|
||||||
import com.simibubi.create.foundation.block.ProperDirectionalBlock;
|
import com.simibubi.create.foundation.block.ProperDirectionalBlock;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.IWaterLoggable;
|
||||||
import net.minecraft.block.material.PushReaction;
|
import net.minecraft.block.material.PushReaction;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.fluid.Fluids;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
import net.minecraft.item.BlockItemUseContext;
|
import net.minecraft.item.BlockItemUseContext;
|
||||||
|
import net.minecraft.state.StateContainer.Builder;
|
||||||
import net.minecraft.state.properties.BlockStateProperties;
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.Direction.Axis;
|
import net.minecraft.util.Direction.Axis;
|
||||||
|
@ -21,13 +21,16 @@ import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||||
import net.minecraft.util.math.shapes.VoxelShape;
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
import net.minecraft.world.IBlockReader;
|
import net.minecraft.world.IBlockReader;
|
||||||
|
import net.minecraft.world.IWorld;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements IWrenchable {
|
import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*;
|
||||||
|
|
||||||
|
public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements IWrenchable, IWaterLoggable {
|
||||||
|
|
||||||
public PistonExtensionPoleBlock(Properties properties) {
|
public PistonExtensionPoleBlock(Properties properties) {
|
||||||
super(properties);
|
super(properties);
|
||||||
setDefaultState(getDefaultState().with(FACING, Direction.UP));
|
setDefaultState(getDefaultState().with(FACING, Direction.UP).with(BlockStateProperties.WATERLOGGED, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -88,8 +91,28 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||||
return getDefaultState().with(FACING, context.getFace()
|
IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos());
|
||||||
.getOpposite());
|
return getDefaultState().with(FACING, context.getFace().getOpposite())
|
||||||
|
.with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidState getFluidState(BlockState state) {
|
||||||
|
return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||||
|
builder.add(BlockStateProperties.WATERLOGGED);
|
||||||
|
super.fillStateContainer(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState,
|
||||||
|
IWorld world, BlockPos pos, BlockPos neighbourPos) {
|
||||||
|
if (state.get(BlockStateProperties.WATERLOGGED)) {
|
||||||
|
world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,13 +5,17 @@ import com.simibubi.create.AllShapes;
|
||||||
import com.simibubi.create.AllTileEntities;
|
import com.simibubi.create.AllTileEntities;
|
||||||
import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock;
|
import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock;
|
||||||
import com.simibubi.create.foundation.block.ITE;
|
import com.simibubi.create.foundation.block.ITE;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.IWaterLoggable;
|
||||||
import net.minecraft.block.material.PushReaction;
|
import net.minecraft.block.material.PushReaction;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.fluid.Fluids;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
|
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.Builder;
|
||||||
import net.minecraft.state.properties.BlockStateProperties;
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.ActionResultType;
|
import net.minecraft.util.ActionResultType;
|
||||||
|
@ -24,6 +28,7 @@ import net.minecraft.util.math.RayTraceResult;
|
||||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||||
import net.minecraft.util.math.shapes.VoxelShape;
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
import net.minecraft.world.IBlockReader;
|
import net.minecraft.world.IBlockReader;
|
||||||
|
import net.minecraft.world.IWorld;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE<PulleyTileEntity> {
|
public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE<PulleyTileEntity> {
|
||||||
|
@ -34,6 +39,15 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE<Pulle
|
||||||
super(properties);
|
super(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void onRopeBroken(World world, BlockPos pulleyPos) {
|
||||||
|
TileEntity te = world.getTileEntity(pulleyPos);
|
||||||
|
if (!(te instanceof PulleyTileEntity))
|
||||||
|
return;
|
||||||
|
PulleyTileEntity pulley = (PulleyTileEntity) te;
|
||||||
|
pulley.offset = 0;
|
||||||
|
pulley.sendData();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||||
return AllTileEntities.ROPE_PULLEY.create();
|
return AllTileEntities.ROPE_PULLEY.create();
|
||||||
|
@ -71,19 +85,16 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE<Pulle
|
||||||
return AllShapes.PULLEY.get(state.get(HORIZONTAL_AXIS));
|
return AllShapes.PULLEY.get(state.get(HORIZONTAL_AXIS));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void onRopeBroken(World world, BlockPos pulleyPos) {
|
@Override
|
||||||
TileEntity te = world.getTileEntity(pulleyPos);
|
public Class<PulleyTileEntity> getTileEntityClass() {
|
||||||
if (!(te instanceof PulleyTileEntity))
|
return PulleyTileEntity.class;
|
||||||
return;
|
|
||||||
PulleyTileEntity pulley = (PulleyTileEntity) te;
|
|
||||||
pulley.offset = 0;
|
|
||||||
pulley.sendData();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class RopeBlockBase extends Block {
|
private static class RopeBlockBase extends Block implements IWaterLoggable {
|
||||||
|
|
||||||
public RopeBlockBase(Properties properties) {
|
public RopeBlockBase(Properties properties) {
|
||||||
super(properties);
|
super(properties);
|
||||||
|
setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -99,7 +110,7 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE<Pulle
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||||
if (!isMoving) {
|
if (!isMoving && (!state.has(BlockStateProperties.WATERLOGGED) || !newState.has(BlockStateProperties.WATERLOGGED) || state.get(BlockStateProperties.WATERLOGGED) == newState.get(BlockStateProperties.WATERLOGGED))) {
|
||||||
onRopeBroken(worldIn, pos.up());
|
onRopeBroken(worldIn, pos.up());
|
||||||
if (!worldIn.isRemote) {
|
if (!worldIn.isRemote) {
|
||||||
BlockState above = worldIn.getBlockState(pos.up());
|
BlockState above = worldIn.getBlockState(pos.up());
|
||||||
|
@ -115,6 +126,33 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE<Pulle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidState getFluidState(BlockState state) {
|
||||||
|
return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||||
|
builder.add(BlockStateProperties.WATERLOGGED);
|
||||||
|
super.fillStateContainer(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState,
|
||||||
|
IWorld world, BlockPos pos, BlockPos neighbourPos) {
|
||||||
|
if (state.get(BlockStateProperties.WATERLOGGED)) {
|
||||||
|
world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||||
|
IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos());
|
||||||
|
return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class MagnetBlock extends RopeBlockBase {
|
public static class MagnetBlock extends RopeBlockBase {
|
||||||
|
@ -140,12 +178,6 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE<Pulle
|
||||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||||
return AllShapes.FOUR_VOXEL_POLE.get(Direction.UP);
|
return AllShapes.FOUR_VOXEL_POLE.get(Direction.UP);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<PulleyTileEntity> getTileEntityClass() {
|
|
||||||
return PulleyTileEntity.class;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,9 +8,13 @@ import com.simibubi.create.content.contraptions.components.structureMovement.pis
|
||||||
import com.simibubi.create.foundation.config.AllConfigs;
|
import com.simibubi.create.foundation.config.AllConfigs;
|
||||||
import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform;
|
import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform;
|
||||||
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform;
|
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.block.IWaterLoggable;
|
||||||
|
import net.minecraft.fluid.Fluids;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.tileentity.TileEntityType;
|
import net.minecraft.tileentity.TileEntityType;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
|
@ -65,6 +69,11 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
|
||||||
|
|
||||||
for (int i = ((int) offset); i > 0; i--) {
|
for (int i = ((int) offset); i > 0; i--) {
|
||||||
BlockPos offset = pos.down(i);
|
BlockPos offset = pos.down(i);
|
||||||
|
BlockState oldState = world.getBlockState(offset);
|
||||||
|
if (oldState.getBlock() instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED) && oldState.get(BlockStateProperties.WATERLOGGED)) {
|
||||||
|
world.setBlockState(offset, Blocks.WATER.getDefaultState(), 66);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
world.setBlockState(offset, Blocks.AIR.getDefaultState(), 66);
|
world.setBlockState(offset, Blocks.AIR.getDefaultState(), 66);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,20 +104,25 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
|
||||||
if (!removed) {
|
if (!removed) {
|
||||||
if (offset > 0) {
|
if (offset > 0) {
|
||||||
BlockPos magnetPos = pos.down((int) offset);
|
BlockPos magnetPos = pos.down((int) offset);
|
||||||
|
IFluidState ifluidstate = world.getFluidState(magnetPos);
|
||||||
world.destroyBlock(magnetPos, world.getBlockState(magnetPos)
|
world.destroyBlock(magnetPos, world.getBlockState(magnetPos)
|
||||||
.getCollisionShape(world, magnetPos)
|
.getCollisionShape(world, magnetPos)
|
||||||
.isEmpty());
|
.isEmpty());
|
||||||
world.setBlockState(magnetPos, AllBlocks.PULLEY_MAGNET.getDefaultState(), 66);
|
world.setBlockState(magnetPos, AllBlocks.PULLEY_MAGNET.getDefaultState().with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)), 66);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean[] waterlog = new boolean[(int) offset];
|
||||||
|
|
||||||
for (int i = 1; i <= ((int) offset) - 1; i++) {
|
for (int i = 1; i <= ((int) offset) - 1; i++) {
|
||||||
BlockPos ropePos = pos.down(i);
|
BlockPos ropePos = pos.down(i);
|
||||||
|
IFluidState ifluidstate = world.getFluidState(ropePos);
|
||||||
|
waterlog[i] = ifluidstate.getFluid() == Fluids.WATER;
|
||||||
world.destroyBlock(ropePos, world.getBlockState(ropePos)
|
world.destroyBlock(ropePos, world.getBlockState(ropePos)
|
||||||
.getCollisionShape(world, ropePos)
|
.getCollisionShape(world, ropePos)
|
||||||
.isEmpty());
|
.isEmpty());
|
||||||
}
|
}
|
||||||
for (int i = 1; i <= ((int) offset) - 1; i++)
|
for (int i = 1; i <= ((int) offset) - 1; i++)
|
||||||
world.setBlockState(pos.down(i), AllBlocks.ROPE.getDefaultState(), 66);
|
world.setBlockState(pos.down(i), AllBlocks.ROPE.getDefaultState().with(BlockStateProperties.WATERLOGGED, waterlog[i]), 66);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (movedContraption != null)
|
if (movedContraption != null)
|
||||||
|
|
|
@ -104,6 +104,7 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable {
|
||||||
@Override
|
@Override
|
||||||
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||||
builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN, BlockStateProperties.WATERLOGGED);
|
builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN, BlockStateProperties.WATERLOGGED);
|
||||||
|
super.fillStateContainer(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -3,8 +3,14 @@ package com.simibubi.create.content.contraptions.fluids;
|
||||||
import com.simibubi.create.AllShapes;
|
import com.simibubi.create.AllShapes;
|
||||||
import com.simibubi.create.AllTileEntities;
|
import com.simibubi.create.AllTileEntities;
|
||||||
import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock;
|
import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.IWaterLoggable;
|
||||||
|
import net.minecraft.fluid.Fluids;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
|
import net.minecraft.item.BlockItemUseContext;
|
||||||
|
import net.minecraft.state.StateContainer.Builder;
|
||||||
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.Direction.Axis;
|
import net.minecraft.util.Direction.Axis;
|
||||||
|
@ -12,12 +18,14 @@ import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||||
import net.minecraft.util.math.shapes.VoxelShape;
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
import net.minecraft.world.IBlockReader;
|
import net.minecraft.world.IBlockReader;
|
||||||
|
import net.minecraft.world.IWorld;
|
||||||
import net.minecraft.world.IWorldReader;
|
import net.minecraft.world.IWorldReader;
|
||||||
|
|
||||||
public class PumpBlock extends DirectionalKineticBlock {
|
public class PumpBlock extends DirectionalKineticBlock implements IWaterLoggable {
|
||||||
|
|
||||||
public PumpBlock(Properties p_i48415_1_) {
|
public PumpBlock(Properties p_i48415_1_) {
|
||||||
super(p_i48415_1_);
|
super(p_i48415_1_);
|
||||||
|
setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -53,4 +61,30 @@ public class PumpBlock extends DirectionalKineticBlock {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidState getFluidState(BlockState state) {
|
||||||
|
return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||||
|
builder.add(BlockStateProperties.WATERLOGGED);
|
||||||
|
super.fillStateContainer(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState,
|
||||||
|
IWorld world, BlockPos pos, BlockPos neighbourPos) {
|
||||||
|
if (state.get(BlockStateProperties.WATERLOGGED)) {
|
||||||
|
world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||||
|
IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos());
|
||||||
|
return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,14 @@ import com.simibubi.create.AllBlocks;
|
||||||
import com.simibubi.create.AllShapes;
|
import com.simibubi.create.AllShapes;
|
||||||
import com.simibubi.create.content.contraptions.base.IRotate;
|
import com.simibubi.create.content.contraptions.base.IRotate;
|
||||||
import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock;
|
import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.fluid.Fluids;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
import net.minecraft.item.BlockItemUseContext;
|
import net.minecraft.item.BlockItemUseContext;
|
||||||
import net.minecraft.item.ItemGroup;
|
import net.minecraft.item.ItemGroup;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.Direction.Axis;
|
import net.minecraft.util.Direction.Axis;
|
||||||
import net.minecraft.util.NonNullList;
|
import net.minecraft.util.NonNullList;
|
||||||
|
@ -24,6 +26,11 @@ public class CogWheelBlock extends ShaftBlock {
|
||||||
|
|
||||||
boolean isLarge;
|
boolean isLarge;
|
||||||
|
|
||||||
|
private CogWheelBlock(boolean large, Properties properties) {
|
||||||
|
super(properties);
|
||||||
|
isLarge = large;
|
||||||
|
}
|
||||||
|
|
||||||
public static CogWheelBlock small(Properties properties) {
|
public static CogWheelBlock small(Properties properties) {
|
||||||
return new CogWheelBlock(false, properties);
|
return new CogWheelBlock(false, properties);
|
||||||
}
|
}
|
||||||
|
@ -32,9 +39,12 @@ public class CogWheelBlock extends ShaftBlock {
|
||||||
return new CogWheelBlock(true, properties);
|
return new CogWheelBlock(true, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
private CogWheelBlock(boolean large, Properties properties) {
|
public static boolean isSmallCog(BlockState state) {
|
||||||
super(properties);
|
return AllBlocks.COGWHEEL.has(state);
|
||||||
isLarge = large;
|
}
|
||||||
|
|
||||||
|
public static boolean isLargeCog(BlockState state) {
|
||||||
|
return AllBlocks.LARGE_COGWHEEL.has(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -66,8 +76,9 @@ public class CogWheelBlock extends ShaftBlock {
|
||||||
|
|
||||||
BlockState stateBelow = world.getBlockState(context.getPos()
|
BlockState stateBelow = world.getBlockState(context.getPos()
|
||||||
.down());
|
.down());
|
||||||
|
IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos());
|
||||||
if (AllBlocks.ROTATION_SPEED_CONTROLLER.has(stateBelow) && isLarge) {
|
if (AllBlocks.ROTATION_SPEED_CONTROLLER.has(stateBelow) && isLarge) {
|
||||||
return this.getDefaultState()
|
return this.getDefaultState().with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER))
|
||||||
.with(AXIS, stateBelow.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X);
|
.with(AXIS, stateBelow.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,10 +87,10 @@ public class CogWheelBlock extends ShaftBlock {
|
||||||
Axis preferredAxis = getPreferredAxis(context);
|
Axis preferredAxis = getPreferredAxis(context);
|
||||||
if (preferredAxis != null)
|
if (preferredAxis != null)
|
||||||
return this.getDefaultState()
|
return this.getDefaultState()
|
||||||
.with(AXIS, preferredAxis);
|
.with(AXIS, preferredAxis).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER));
|
||||||
return this.getDefaultState()
|
return this.getDefaultState()
|
||||||
.with(AXIS, context.getFace()
|
.with(AXIS, context.getFace()
|
||||||
.getAxis());
|
.getAxis()).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER));
|
||||||
}
|
}
|
||||||
|
|
||||||
return getDefaultState().with(AXIS, ((IRotate) block).getRotationAxis(placedAgainst));
|
return getDefaultState().with(AXIS, ((IRotate) block).getRotationAxis(placedAgainst));
|
||||||
|
@ -95,14 +106,6 @@ public class CogWheelBlock extends ShaftBlock {
|
||||||
return isLarge ? 1f : .75f;
|
return isLarge ? 1f : .75f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isSmallCog(BlockState state) {
|
|
||||||
return AllBlocks.COGWHEEL.has(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isLargeCog(BlockState state) {
|
|
||||||
return AllBlocks.LARGE_COGWHEEL.has(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void fillItemGroup(ItemGroup group, NonNullList<ItemStack> items) {
|
public void fillItemGroup(ItemGroup group, NonNullList<ItemStack> items) {
|
||||||
items.add(new ItemStack(this));
|
items.add(new ItemStack(this));
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,18 @@ import com.simibubi.create.AllBlocks;
|
||||||
import com.simibubi.create.AllShapes;
|
import com.simibubi.create.AllShapes;
|
||||||
import com.simibubi.create.AllTileEntities;
|
import com.simibubi.create.AllTileEntities;
|
||||||
import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock;
|
import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockRenderType;
|
import net.minecraft.block.BlockRenderType;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.IWaterLoggable;
|
||||||
import net.minecraft.block.material.PushReaction;
|
import net.minecraft.block.material.PushReaction;
|
||||||
|
import net.minecraft.fluid.Fluids;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
|
import net.minecraft.item.BlockItemUseContext;
|
||||||
import net.minecraft.item.ItemGroup;
|
import net.minecraft.item.ItemGroup;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.state.StateContainer.Builder;
|
||||||
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.Direction.Axis;
|
import net.minecraft.util.Direction.Axis;
|
||||||
|
@ -18,12 +24,18 @@ import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||||
import net.minecraft.util.math.shapes.VoxelShape;
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
import net.minecraft.world.IBlockReader;
|
import net.minecraft.world.IBlockReader;
|
||||||
|
import net.minecraft.world.IWorld;
|
||||||
import net.minecraft.world.IWorldReader;
|
import net.minecraft.world.IWorldReader;
|
||||||
|
|
||||||
public class ShaftBlock extends RotatedPillarKineticBlock {
|
public class ShaftBlock extends RotatedPillarKineticBlock implements IWaterLoggable {
|
||||||
|
|
||||||
public ShaftBlock(Properties properties) {
|
public ShaftBlock(Properties properties) {
|
||||||
super(properties);
|
super(properties);
|
||||||
|
setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isShaft(BlockState state) {
|
||||||
|
return AllBlocks.SHAFT.has(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -61,10 +73,6 @@ public class ShaftBlock extends RotatedPillarKineticBlock {
|
||||||
super.fillItemGroup(group, items);
|
super.fillItemGroup(group, items);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isShaft(BlockState state) {
|
|
||||||
return AllBlocks.SHAFT.has(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
// IRotate:
|
// IRotate:
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -77,4 +85,29 @@ public class ShaftBlock extends RotatedPillarKineticBlock {
|
||||||
return state.get(AXIS);
|
return state.get(AXIS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidState getFluidState(BlockState state) {
|
||||||
|
return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||||
|
builder.add(BlockStateProperties.WATERLOGGED);
|
||||||
|
super.fillStateContainer(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState,
|
||||||
|
IWorld world, BlockPos pos, BlockPos neighbourPos) {
|
||||||
|
if (state.get(BlockStateProperties.WATERLOGGED)) {
|
||||||
|
world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||||
|
IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos());
|
||||||
|
return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue