From 0f623c2cca87ee27e9f8438e5e9df45a7a15ab26 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Mon, 1 Apr 2024 13:55:44 +0100 Subject: [PATCH] Move can-place modem logic to one place This should make future changes easier. Closes #1769. --- .../shared/peripheral/modem/ModemShapes.java | 16 ++++++++++++++++ .../peripheral/modem/wired/CableBlock.java | 5 +++-- .../modem/wireless/WirelessModemBlock.java | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemShapes.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemShapes.java index 57c5c5742..f8d623e02 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemShapes.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemShapes.java @@ -4,7 +4,10 @@ package dan200.computercraft.shared.peripheral.modem; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -22,4 +25,17 @@ public static VoxelShape getBounds(Direction facing) { var direction = facing.ordinal(); return direction < BOXES.length ? BOXES[direction] : Shapes.block(); } + + /** + * Determine if a block can support a modem. + * + * @param level The current level. + * @param pos The position of the adjacent block. + * @param side The side the modem will be placed against. + * @return Whether this block can support a modem. + */ + public static boolean canSupport(LevelReader level, BlockPos pos, Direction side) { + // TODO(1.20.4): Check the side is a full-block instead. + return Block.canSupportCenter(level, pos, side); + } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlock.java index bb9a728dc..0d068b58f 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlock.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlock.java @@ -6,6 +6,7 @@ import dan200.computercraft.annotations.ForgeOverride; import dan200.computercraft.shared.ModRegistry; +import dan200.computercraft.shared.peripheral.modem.ModemShapes; import dan200.computercraft.shared.platform.PlatformHelper; import dan200.computercraft.shared.util.WaterloggableHelpers; import dan200.computercraft.shared.util.WorldUtil; @@ -183,7 +184,7 @@ public BlockState updateShape(BlockState state, Direction side, BlockState other // Pop our modem if needed. var dir = state.getValue(MODEM).getFacing(); - if (dir != null && dir.equals(side) && !canSupportCenter(level, otherPos, side.getOpposite())) { + if (dir != null && dir.equals(side) && !ModemShapes.canSupport(level, otherPos, side.getOpposite())) { // If we've no cable, follow normal Minecraft logic and just remove the block. if (!state.getValue(CABLE)) return getFluidState(state).createLegacyBlock(); @@ -212,7 +213,7 @@ public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { var facing = state.getValue(MODEM).getFacing(); if (facing == null) return true; - return canSupportCenter(world, pos.relative(facing), facing.getOpposite()); + return ModemShapes.canSupport(world, pos.relative(facing), facing.getOpposite()); } @Nullable diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlock.java index c2cb274ed..391dbd785 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlock.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlock.java @@ -75,7 +75,7 @@ public BlockState updateShape(BlockState state, Direction side, BlockState other @Deprecated public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { var facing = state.getValue(FACING); - return canSupportCenter(world, pos.relative(facing), facing.getOpposite()); + return ModemShapes.canSupport(world, pos.relative(facing), facing.getOpposite()); } @Nullable