mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-26 15:06:42 +01:00
Underwater Transport
- Mechanical Belts can now be waterlogged
This commit is contained in:
parent
af2c40c27d
commit
c2c37da442
7 changed files with 851 additions and 184 deletions
|
@ -17,7 +17,7 @@ a07a73251d26e8b38bce295838c2fef246f9885d assets/create/blockstates/andesite_scaf
|
|||
aefe4cd5fdb50b2ffe89f43acac4206c5adfad3f assets/create/blockstates/asurine.json
|
||||
bb61f3f336ebe0ff08d84cb6a83e86a823dac7aa assets/create/blockstates/asurine_pillar.json
|
||||
e555e3c2b2d3f01440e48db4ba88f7e00fd99b6f assets/create/blockstates/basin.json
|
||||
f25693a9429f6337149ff24f27900dc4eb82a7c2 assets/create/blockstates/belt.json
|
||||
af4a0f1ad88334ed96b839a9d7f6dca1778b7410 assets/create/blockstates/belt.json
|
||||
cf9045eb16e5299a1d917c4cb536289f49411276 assets/create/blockstates/birch_window.json
|
||||
94a1a91403eb4b035fec48071e7fcae57a8a6abd assets/create/blockstates/birch_window_pane.json
|
||||
95bada2b3bf55536f85e82bc6f9d16501b6e1a95 assets/create/blockstates/black_nixie_tube.json
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -29,6 +29,7 @@ import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement;
|
|||
import com.simibubi.create.content.schematics.ItemRequirement;
|
||||
import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType;
|
||||
import com.simibubi.create.foundation.block.IBE;
|
||||
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
|
||||
import com.simibubi.create.foundation.block.render.MultiPosDestructionHandler;
|
||||
import com.simibubi.create.foundation.block.render.ReducedDestroyEffects;
|
||||
import com.simibubi.create.foundation.blockEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
|
||||
|
@ -68,6 +69,7 @@ import net.minecraft.world.level.block.state.properties.BooleanProperty;
|
|||
import net.minecraft.world.level.block.state.properties.EnumProperty;
|
||||
import net.minecraft.world.level.block.state.properties.Property;
|
||||
import net.minecraft.world.level.levelgen.DebugLevelSource;
|
||||
import net.minecraft.world.level.material.FluidState;
|
||||
import net.minecraft.world.level.material.Fluids;
|
||||
import net.minecraft.world.level.pathfinder.BlockPathTypes;
|
||||
import net.minecraft.world.level.pathfinder.PathComputationType;
|
||||
|
@ -86,7 +88,8 @@ import net.minecraftforge.common.Tags;
|
|||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
public class BeltBlock extends HorizontalKineticBlock implements IBE<BeltBlockEntity>, ISpecialBlockItemRequirement, ITransformableBlock {
|
||||
public class BeltBlock extends HorizontalKineticBlock
|
||||
implements IBE<BeltBlockEntity>, ISpecialBlockItemRequirement, ITransformableBlock, ProperWaterloggedBlock {
|
||||
|
||||
public static final Property<BeltSlope> SLOPE = EnumProperty.create("slope", BeltSlope.class);
|
||||
public static final Property<BeltPart> PART = EnumProperty.create("part", BeltPart.class);
|
||||
|
@ -96,7 +99,8 @@ public class BeltBlock extends HorizontalKineticBlock implements IBE<BeltBlockEn
|
|||
super(properties);
|
||||
registerDefaultState(defaultBlockState().setValue(SLOPE, BeltSlope.HORIZONTAL)
|
||||
.setValue(PART, BeltPart.START)
|
||||
.setValue(CASING, false));
|
||||
.setValue(CASING, false)
|
||||
.setValue(WATERLOGGED, false));
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
|
@ -254,11 +258,9 @@ public class BeltBlock extends HorizontalKineticBlock implements IBE<BeltBlockEn
|
|||
.isSame(Fluids.WATER);
|
||||
boolean isHand = heldItem.isEmpty() && handIn == InteractionHand.MAIN_HAND;
|
||||
|
||||
if (isDye || hasWater) {
|
||||
if (!world.isClientSide)
|
||||
withBlockEntityDo(world, pos, be -> be.applyColor(DyeColor.getColor(heldItem)));
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
if (isDye || hasWater)
|
||||
return onBlockEntityUse(world, pos,
|
||||
be -> be.applyColor(DyeColor.getColor(heldItem)) ? InteractionResult.SUCCESS : InteractionResult.PASS);
|
||||
|
||||
if (isConnector)
|
||||
return BeltSlicer.useConnector(state, world, pos, player, handIn, hit, new Feedback());
|
||||
|
@ -342,7 +344,7 @@ public class BeltBlock extends HorizontalKineticBlock implements IBE<BeltBlockEn
|
|||
|
||||
@Override
|
||||
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) {
|
||||
builder.add(SLOPE, PART, CASING);
|
||||
builder.add(SLOPE, PART, CASING, WATERLOGGED);
|
||||
super.createBlockStateDefinition(builder);
|
||||
}
|
||||
|
||||
|
@ -480,7 +482,8 @@ public class BeltBlock extends HorizontalKineticBlock implements IBE<BeltBlockEn
|
|||
world.removeBlockEntity(currentPos);
|
||||
BlockState shaftState = AllBlocks.SHAFT.getDefaultState()
|
||||
.setValue(BlockStateProperties.AXIS, getRotationAxis(currentState));
|
||||
world.setBlock(currentPos, hasPulley ? shaftState : Blocks.AIR.defaultBlockState(), 3);
|
||||
world.setBlock(currentPos, ProperWaterloggedBlock.withWater(world,
|
||||
hasPulley ? shaftState : Blocks.AIR.defaultBlockState(), currentPos), 3);
|
||||
world.levelEvent(2001, currentPos, Block.getId(currentState));
|
||||
}
|
||||
}
|
||||
|
@ -488,6 +491,7 @@ public class BeltBlock extends HorizontalKineticBlock implements IBE<BeltBlockEn
|
|||
@Override
|
||||
public BlockState updateShape(BlockState state, Direction side, BlockState p_196271_3_, LevelAccessor world,
|
||||
BlockPos pos, BlockPos p_196271_6_) {
|
||||
updateWater(world, state, pos);
|
||||
if (side.getAxis()
|
||||
.isHorizontal())
|
||||
updateTunnelConnections(world, pos.above());
|
||||
|
@ -707,6 +711,11 @@ public class BeltBlock extends HorizontalKineticBlock implements IBE<BeltBlockEn
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidState getFluidState(BlockState pState) {
|
||||
return fluidState(pState);
|
||||
}
|
||||
|
||||
public static class RenderProperties extends ReducedDestroyEffects implements MultiPosDestructionHandler {
|
||||
@Override
|
||||
public Set<BlockPos> getExtraPositions(ClientLevel level, BlockPos pos, BlockState blockState, int progress) {
|
||||
|
|
|
@ -12,7 +12,6 @@ import java.util.Map;
|
|||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
|
||||
import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
|
||||
import com.jozufozu.flywheel.light.LightListener;
|
||||
import com.jozufozu.flywheel.light.LightUpdater;
|
||||
import com.jozufozu.flywheel.util.box.GridAlignedBB;
|
||||
|
@ -280,12 +279,14 @@ public class BeltBlockEntity extends KineticBlockEntity {
|
|||
trackerUpdateTag = new CompoundTag();
|
||||
}
|
||||
|
||||
public void applyColor(DyeColor colorIn) {
|
||||
public boolean applyColor(DyeColor colorIn) {
|
||||
if (colorIn == null) {
|
||||
if (!color.isPresent())
|
||||
return;
|
||||
return false;
|
||||
} else if (color.isPresent() && color.get() == colorIn)
|
||||
return;
|
||||
return false;
|
||||
if (level.isClientSide())
|
||||
return true;
|
||||
|
||||
for (BlockPos blockPos : BeltBlock.getBeltChain(level, getController())) {
|
||||
BeltBlockEntity belt = BeltHelper.getSegmentBE(level, blockPos);
|
||||
|
@ -294,8 +295,9 @@ public class BeltBlockEntity extends KineticBlockEntity {
|
|||
belt.color = Optional.ofNullable(colorIn);
|
||||
belt.setChanged();
|
||||
belt.sendData();
|
||||
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedRenderDispatcher.enqueueUpdate(belt));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public BeltBlockEntity getControllerBE() {
|
||||
|
|
|
@ -13,6 +13,7 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltBlockEntity.Casi
|
|||
import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorItem;
|
||||
import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory;
|
||||
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
|
||||
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
|
||||
import com.simibubi.create.foundation.utility.Components;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
@ -89,9 +90,10 @@ public class BeltSlicer {
|
|||
BlockPos next = part == BeltPart.END ? pos.subtract(beltVector) : pos.offset(beltVector);
|
||||
BlockState replacedState = world.getBlockState(next);
|
||||
BeltBlockEntity segmentBE = BeltHelper.getSegmentBE(world, next);
|
||||
KineticBlockEntity.switchToBlockState(world, next,
|
||||
state.setValue(BeltBlock.CASING, segmentBE != null && segmentBE.casing != CasingType.NONE));
|
||||
world.setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL | Block.UPDATE_MOVE_BY_PISTON);
|
||||
KineticBlockEntity.switchToBlockState(world, next, ProperWaterloggedBlock.withWater(world,
|
||||
state.setValue(BeltBlock.CASING, segmentBE != null && segmentBE.casing != CasingType.NONE), next));
|
||||
world.setBlock(pos, ProperWaterloggedBlock.withWater(world, Blocks.AIR.defaultBlockState(), pos),
|
||||
Block.UPDATE_ALL | Block.UPDATE_MOVE_BY_PISTON);
|
||||
world.removeBlockEntity(pos);
|
||||
world.levelEvent(2001, pos, Block.getId(state));
|
||||
|
||||
|
@ -316,7 +318,9 @@ public class BeltSlicer {
|
|||
|
||||
if (mergedController == null) {
|
||||
// Attach at end
|
||||
world.setBlock(next, state.setValue(BeltBlock.CASING, false), Block.UPDATE_ALL | Block.UPDATE_MOVE_BY_PISTON);
|
||||
world.setBlock(next,
|
||||
ProperWaterloggedBlock.withWater(world, state.setValue(BeltBlock.CASING, false), next),
|
||||
Block.UPDATE_ALL | Block.UPDATE_MOVE_BY_PISTON);
|
||||
BeltBlockEntity segmentBE = BeltHelper.getSegmentBE(world, next);
|
||||
if (segmentBE != null)
|
||||
segmentBE.color = controllerBE.color;
|
||||
|
|
|
@ -14,6 +14,7 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltSlope;
|
|||
import com.simibubi.create.content.contraptions.relays.elementary.AbstractSimpleShaftBlock;
|
||||
import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock;
|
||||
import com.simibubi.create.foundation.advancement.AllAdvancements;
|
||||
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
|
||||
import com.simibubi.create.foundation.config.AllConfigs;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
|
@ -155,9 +156,10 @@ public class BeltConnectorItem extends BlockItem {
|
|||
.isReplaceable())
|
||||
world.destroyBlock(pos, false);
|
||||
|
||||
KineticBlockEntity.switchToBlockState(world, pos, beltBlock.setValue(BeltBlock.SLOPE, slope)
|
||||
KineticBlockEntity.switchToBlockState(world, pos,
|
||||
ProperWaterloggedBlock.withWater(world, beltBlock.setValue(BeltBlock.SLOPE, slope)
|
||||
.setValue(BeltBlock.PART, part)
|
||||
.setValue(BeltBlock.HORIZONTAL_FACING, facing));
|
||||
.setValue(BeltBlock.HORIZONTAL_FACING, facing), pos));
|
||||
}
|
||||
|
||||
if (!failed)
|
||||
|
|
|
@ -38,9 +38,11 @@ public interface ProperWaterloggedBlock extends SimpleWaterloggedBlock {
|
|||
static BlockState withWater(LevelAccessor level, BlockState placementState, BlockPos pos) {
|
||||
if (placementState == null)
|
||||
return null;
|
||||
FluidState ifluidstate = level.getFluidState(pos);
|
||||
if (placementState.isAir())
|
||||
return ifluidstate.getType() == Fluids.WATER ? ifluidstate.createLegacyBlock() : placementState;
|
||||
if (!(placementState.getBlock() instanceof SimpleWaterloggedBlock))
|
||||
return placementState;
|
||||
FluidState ifluidstate = level.getFluidState(pos);
|
||||
return placementState.setValue(BlockStateProperties.WATERLOGGED, ifluidstate.getType() == Fluids.WATER);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue