From d7a5d836ede4a458ff7a0a13ae852ec6ecf5ed66 Mon Sep 17 00:00:00 2001 From: TechTastic <74630543+TechTastic@users.noreply.github.com> Date: Sun, 19 Jan 2025 22:42:54 -0600 Subject: [PATCH] Fixed both Turtles ability to leave Ships and re-implemented Turtles ability to collide with Ships and pass through their empty spaces --- .../compat/cc_restitched/MixinTurtleBrain.java | 15 ++++++++++++--- .../cc_restitched/MixinTurtleMoveCommand.java | 18 +++++++++--------- .../compat/cc_tweaked/MixinTurtleBrain.java | 15 ++++++++++++--- .../cc_tweaked/MixinTurtleMoveCommand.java | 17 +++++++++-------- 4 files changed, 42 insertions(+), 23 deletions(-) diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinTurtleBrain.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinTurtleBrain.java index a1ac5a15..2b388027 100644 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinTurtleBrain.java +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinTurtleBrain.java @@ -52,9 +52,18 @@ public abstract class MixinTurtleBrain { Direction.getNearest(transformedDirection.x, transformedDirection.y, transformedDirection.z)); setOwner(currentOwner); - if (ship.getTransform().getShipToWorldScaling().equals(1.000E+0, 1.000E+0, 1.000E+0) && - VSGameConfig.SERVER.getComputerCraft().getCanTurtlesLeaveScaledShips()) { - // SHIP IS SCALED AND TURTLES CAN LEAVE SCALED SHIPS + final boolean isShipScaled = !ship.getTransform().getShipToWorldScaling().equals(1.000E+0, 1.000E+0, 1.000E+0); + + if (isShipScaled) { + // SHIP IS SCALED + + if (VSGameConfig.SERVER.getComputerCraft().getCanTurtlesLeaveScaledShips()) { + // TURTLES CAN LEAVE SCALED SHIPS + + return new BlockPos(ValkyrienSkies.positionToWorld(ship, Vec3.atCenterOf(pos))); + } + } else { + // SHIP ISNT SCALED return new BlockPos(ValkyrienSkies.positionToWorld(ship, Vec3.atCenterOf(pos))); } diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinTurtleMoveCommand.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinTurtleMoveCommand.java index 52135e8a..88132cdd 100644 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinTurtleMoveCommand.java +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinTurtleMoveCommand.java @@ -4,9 +4,7 @@ import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.shared.turtle.core.TurtleMoveCommand; import dan200.computercraft.shared.turtle.core.TurtlePlayer; -import java.util.ArrayList; import java.util.List; -import java.util.stream.Stream; import javax.annotation.Nonnull; import net.minecraft.core.BlockPos; import net.minecraft.world.level.ChunkPos; @@ -15,7 +13,6 @@ import org.joml.Vector3d; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -32,14 +29,17 @@ public abstract class MixinTurtleMoveCommand { if (cir.getReturnValue().isSuccess()) { final Ship ship = ValkyrienSkies.getShipManagingBlock(world, position); if (ship == null) { - final boolean notInAir = Streams - .stream(ValkyrienSkies.positionToNearbyShipsAndWorld(world, position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5, 0.1)) - .map(pos -> ValkyrienSkies.getShipManagingBlock(world, pos)) - .map(s -> ValkyrienSkies.positionToShip(s, new Vector3d(position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5))) - .map(pos -> world.getBlockState(new BlockPos(ValkyrienSkies.toMinecraft(pos)))) + final List nearbyShips = Streams.stream(ValkyrienSkies.positionToNearbyShips(world, + position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5, 0.1)).toList(); + + final boolean inAir = nearbyShips.isEmpty() || nearbyShips + .stream() + .map(ValkyrienSkies::toMinecraft) + .map(BlockPos::new) + .map(world::getBlockState) .anyMatch(BlockState::isAir); - if (notInAir) { + if (!inAir) { cir.setReturnValue(TurtleCommandResult.failure("Movement obstructed by ship")); } } else { diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinTurtleBrain.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinTurtleBrain.java index 67468743..ff5d89c6 100644 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinTurtleBrain.java +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinTurtleBrain.java @@ -53,9 +53,18 @@ public abstract class MixinTurtleBrain { Direction.getNearest(transformedDirection.x, transformedDirection.y, transformedDirection.z)); setOwner(currentOwner); - if (ship.getTransform().getShipToWorldScaling().equals(1.000E+0, 1.000E+0, 1.000E+0) && - VSGameConfig.SERVER.getComputerCraft().getCanTurtlesLeaveScaledShips()) { - // SHIP IS SCALED AND TURTLES CAN LEAVE SCALED SHIPS + final boolean isShipScaled = !ship.getTransform().getShipToWorldScaling().equals(1.000E+0, 1.000E+0, 1.000E+0); + + if (isShipScaled) { + // SHIP IS SCALED + + if (VSGameConfig.SERVER.getComputerCraft().getCanTurtlesLeaveScaledShips()) { + // TURTLES CAN LEAVE SCALED SHIPS + + return new BlockPos(ValkyrienSkies.positionToWorld(ship, Vec3.atCenterOf(pos))); + } + } else { + // SHIP ISNT SCALED return new BlockPos(ValkyrienSkies.positionToWorld(ship, Vec3.atCenterOf(pos))); } diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinTurtleMoveCommand.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinTurtleMoveCommand.java index 4de46e92..2d293103 100644 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinTurtleMoveCommand.java +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinTurtleMoveCommand.java @@ -4,7 +4,6 @@ import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.shared.turtle.core.TurtleMoveCommand; import dan200.computercraft.shared.turtle.core.TurtlePlayer; -import java.util.ArrayList; import java.util.List; import javax.annotation.Nonnull; import net.minecraft.core.BlockPos; @@ -14,7 +13,6 @@ import org.joml.Vector3d; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -31,14 +29,17 @@ public abstract class MixinTurtleMoveCommand { if (cir.getReturnValue().isSuccess()) { final Ship ship = ValkyrienSkies.getShipManagingBlock(world, position); if (ship == null) { - final boolean notInAir = Streams - .stream(ValkyrienSkies.positionToNearbyShipsAndWorld(world, position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5, 0.1)) - .map(pos -> ValkyrienSkies.getShipManagingBlock(world, pos)) - .map(s -> ValkyrienSkies.positionToShip(s, new Vector3d(position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5))) - .map(pos -> world.getBlockState(new BlockPos(ValkyrienSkies.toMinecraft(pos)))) + final List nearbyShips = Streams.stream(ValkyrienSkies.positionToNearbyShips(world, + position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5, 0.1)).toList(); + + final boolean inAir = nearbyShips.isEmpty() || nearbyShips + .stream() + .map(ValkyrienSkies::toMinecraft) + .map(BlockPos::new) + .map(world::getBlockState) .anyMatch(BlockState::isAir); - if (notInAir) { + if (!inAir) { cir.setReturnValue(TurtleCommandResult.failure("Movement obstructed by ship")); } } else {