From 531403ee1e80410d74bf7ec406be53caf6c7246b Mon Sep 17 00:00:00 2001 From: xiewuzhiying Date: Mon, 30 Sep 2024 00:17:34 +0800 Subject: [PATCH] Re-add Computer Craft compatibility --- .../cc_restitched/MixinSpeakerPosition.java | 49 ---- .../cc_restitched/MixinTurtleBrain.java | 228 ++++++++--------- .../cc_restitched/MixinTurtleMoveCommand.java | 109 ++++---- .../MixinWirelessModemPeripheral.java | 25 ++ .../cc_restitched/MixinWirelessNetwork.java | 85 ++++--- .../valkyrienskies-fabric.mixins.json | 7 +- .../cc_tweaked/MixinSpeakerPosition.java | 47 ---- .../compat/cc_tweaked/MixinTurtleBrain.java | 233 +++++++++--------- .../cc_tweaked/MixinTurtleMoveCommand.java | 115 +++++---- .../MixinWirelessModemPeripheral.java | 25 ++ .../cc_tweaked/MixinWirelessNetwork.java | 85 ++++--- .../valkyrienskies-forge.mixins.json | 4 + 12 files changed, 487 insertions(+), 525 deletions(-) delete mode 100644 fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java create mode 100644 fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinWirelessModemPeripheral.java delete mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java create mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessModemPeripheral.java diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java deleted file mode 100644 index 046ea6751..000000000 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerPosition.java +++ /dev/null @@ -1,49 +0,0 @@ -//package org.valkyrienskies.mod.fabric.mixin.compat.cc_restitched; -// -// -//import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; -//import net.minecraft.world.level.Level; -//import net.minecraft.world.phys.Vec3; -//import org.spongepowered.asm.mixin.Mixin; -//import org.spongepowered.asm.mixin.Pseudo; -//import org.spongepowered.asm.mixin.Shadow; -//import org.spongepowered.asm.mixin.injection.At; -//import org.spongepowered.asm.mixin.injection.Inject; -//import org.spongepowered.asm.mixin.injection.Redirect; -//import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//import org.valkyrienskies.core.api.ships.LoadedShip; -//import org.valkyrienskies.core.api.ships.Ship; -//import org.valkyrienskies.mod.common.VSGameUtilsKt; -// -//@Pseudo -//@Mixin(SpeakerPosition.class) -//public abstract class MixinSpeakerPosition { -// @Shadow -// public abstract Level level(); -// -// @Inject(method = "position", at = @At("RETURN"), remap = false, cancellable = true) -// public void ValkyrienSkies2$position(final CallbackInfoReturnable cir) { -// final Vec3 pos = cir.getReturnValue(); -// final LoadedShip ship = VSGameUtilsKt.getShipObjectManagingPos(level(), pos.x, pos.y, pos.z); -// if (ship != null) { -// cir.setReturnValue(VSGameUtilsKt.toWorldCoordinates(level(), pos)); -// } -// } -// -// @Redirect( -// method = "withinDistance", -// at = @At( -// value = "INVOKE", -// target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D" -// ) -// ) -// public double ValkyrienSkies$distanceToSqr(final Vec3 instance, final Vec3 d) { -// final Ship ship = VSGameUtilsKt.getShipManagingPos(level(), instance); -// if (ship != null) { -// return VSGameUtilsKt.squaredDistanceBetweenInclShips(level(), instance.x, instance.y, instance.z, d.x, d.y, -// d.z); -// } -// -// return instance.distanceToSqr(d); -// } -//} 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 d345e3103..881fa21f0 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 @@ -1,115 +1,117 @@ package org.valkyrienskies.mod.fabric.mixin.compat.cc_restitched; -//import dan200.computercraft.shared.turtle.blocks.TurtleBlockEntity; -//import dan200.computercraft.shared.turtle.core.TurtleBrain; -//import net.minecraft.core.BlockPos; -//import net.minecraft.core.Direction; -//import net.minecraft.core.Vec3i; -//import net.minecraft.world.level.Level; -//import net.minecraft.world.phys.AABB; -//import net.minecraft.world.phys.Vec3; -//import org.joml.Matrix4dc; -//import org.joml.Vector3d; -//import org.joml.Vector3dc; -//import org.joml.primitives.AABBic; -//import org.spongepowered.asm.mixin.Mixin; -//import org.spongepowered.asm.mixin.Pseudo; -//import org.spongepowered.asm.mixin.Shadow; -//import org.spongepowered.asm.mixin.Unique; -//import org.spongepowered.asm.mixin.injection.At; -//import org.spongepowered.asm.mixin.injection.ModifyVariable; -//import org.valkyrienskies.core.api.ships.Ship; -//import org.valkyrienskies.mod.common.VSGameUtilsKt; -//import org.valkyrienskies.mod.common.config.VSGameConfig; -//import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; -// -//@Pseudo -//@Mixin(TurtleBrain.class) -//public abstract class MixinTurtleBrain { -// @Shadow -// public abstract TurtleBlockEntity getOwner(); -// -// @Shadow -// public abstract void setOwner(TurtleBlockEntity owner); -// -// @Shadow -// public abstract Level getLevel(); -// -// @ModifyVariable( -// method = "Ldan200/computercraft/shared/turtle/core/TurtleBrain;teleportTo(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Z", -// at = @At(value = "HEAD"), -// index = 2 -// ) -// private BlockPos ValkyrienSkies2$teleportToBlockPos(final BlockPos pos) { -// final TurtleBlockEntity currentOwner = getOwner(); -// final BlockPos oldPos = currentOwner.getBlockPos(); -// final Level world = getLevel(); -// -// final Ship ship = VSGameUtilsKt.getShipManagingPos(world, oldPos); -// if (ship != null) { -// // THERE IS A SHIP -// final Direction d = getNewDirection(ship, currentOwner.getDirection()); -// if (!doesShipContainPoint(ship, pos)) { -// // POSITION IS OUTSIDE THE SHIP'S AABB -// -// currentOwner.setDirection(d); -// setOwner(currentOwner); -// -// if (!isShipScaled(ship)) { -// // SHIP IS NOT SCALED -// -// return getWorldPosFromShipPos(ship, pos); -// } else if (turtlesLeaveScaledShips()) { -// // SHIP IS SCALED AND TURTLES CAN LEAVE SCALED SHIPS -// -// return getWorldPosFromShipPos(ship, pos); -// } -// } -// } -// return pos; -// } -// -// // CUSTOM METHODS -// -// @Unique -// private static Direction getNewDirection(final Ship ship, final Direction direction) { -// final Matrix4dc matrix = ship.getShipToWorld(); -// final Vec3i turtleDirectionVector = direction.getNormal(); -// final Vector3d directionVec = -// matrix.transformDirection(turtleDirectionVector.getX(), turtleDirectionVector.getY(), -// turtleDirectionVector.getZ(), new Vector3d()); -// final Direction dir = Direction.getNearest(directionVec.x, directionVec.y, directionVec.z); -// -// return dir; -// } -// -// @Unique -// private static boolean turtlesLeaveScaledShips() { -// return VSGameConfig.SERVER.getComputerCraft().getCanTurtlesLeaveScaledShips(); -// } -// -// @Unique -// private static boolean isShipScaled(final Ship ship) { -// final Vector3dc scale = ship.getTransform().getShipToWorldScaling(); -// final Vector3dc normalScale = new Vector3d(1.000E+0, 1.000E+0, 1.000E+0); -// return !scale.equals(normalScale); -// } -// -// @Unique -// private static boolean doesShipContainPoint(final Ship ship, final BlockPos pos) { -// final AABBic shipAABB = ship.getShipAABB(); -// -// final AABB t = new AABB(shipAABB.maxX(), shipAABB.maxY(), shipAABB.maxZ(), shipAABB.minX(), shipAABB.minY(), -// shipAABB.minZ()); -// return t.intersects(new AABB(pos)); -// } -// -// @Unique -// private static BlockPos getWorldPosFromShipPos(final Ship ship, final BlockPos pos) { -// final Vec3 tPos = VectorConversionsMCKt.toMinecraft( -// VSGameUtilsKt.toWorldCoordinates(ship, pos.getX() + 0.5, pos.getY() + 0.5, -// pos.getZ() + 0.5)); -// final BlockPos newPos = BlockPos.containing(tPos.x, tPos.y, tPos.z); -// return newPos; -// } -//} +import dan200.computercraft.shared.turtle.blocks.TurtleBlockEntity; +import dan200.computercraft.shared.turtle.core.TurtleBrain; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.joml.Matrix4dc; +import org.joml.Vector3d; +import org.joml.Vector3dc; +import org.joml.primitives.AABBic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.config.VSGameConfig; +import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; + +@Pseudo +@Mixin(TurtleBrain.class) +public abstract class MixinTurtleBrain { + @Shadow(remap = false) + public abstract TurtleBlockEntity getOwner(); + + @Shadow(remap = false) + public abstract void setOwner(TurtleBlockEntity owner); + + @Shadow + public abstract Level getLevel(); + + @ModifyVariable( + method = "teleportTo(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Z", + at = @At(value = "HEAD"), + index = 2, + argsOnly = true, + remap = false + ) + private BlockPos ValkyrienSkies2$teleportToBlockPos(final BlockPos pos) { + final TurtleBlockEntity currentOwner = getOwner(); + final BlockPos oldPos = currentOwner.getAccess().getPosition(); + final Level world = getLevel(); + + final Ship ship = VSGameUtilsKt.getShipManagingPos(world, oldPos); + if (ship != null) { + // THERE IS A SHIP + final Direction d = getNewDirection(ship, currentOwner.getDirection()); + if (!doesShipContainPoint(ship, pos)) { + // POSITION IS OUTSIDE THE SHIP'S AABB + + currentOwner.setDirection(d); + setOwner(currentOwner); + + if (!isShipScaled(ship)) { + // SHIP IS NOT SCALED + + return getWorldPosFromShipPos(ship, pos); + } else if (turtlesLeaveScaledShips()) { + // SHIP IS SCALED AND TURTLES CAN LEAVE SCALED SHIPS + + return getWorldPosFromShipPos(ship, pos); + } + } + } + return pos; + } + + // CUSTOM METHODS + + @Unique + private static Direction getNewDirection(final Ship ship, final Direction direction) { + final Matrix4dc matrix = ship.getShipToWorld(); + final Vec3i turtleDirectionVector = direction.getNormal(); + final Vector3d directionVec = + matrix.transformDirection(turtleDirectionVector.getX(), turtleDirectionVector.getY(), + turtleDirectionVector.getZ(), new Vector3d()); + final Direction dir = Direction.getNearest(directionVec.x, directionVec.y, directionVec.z); + + return dir; + } + + @Unique + private static boolean turtlesLeaveScaledShips() { + return VSGameConfig.SERVER.getComputerCraft().getCanTurtlesLeaveScaledShips(); + } + + @Unique + private static boolean isShipScaled(final Ship ship) { + final Vector3dc scale = ship.getTransform().getShipToWorldScaling(); + final Vector3dc normalScale = new Vector3d(1.000E+0, 1.000E+0, 1.000E+0); + return !scale.equals(normalScale); + } + + @Unique + private static boolean doesShipContainPoint(final Ship ship, final BlockPos pos) { + final AABBic shipAABB = ship.getShipAABB(); + + final AABB t = new AABB(shipAABB.maxX(), shipAABB.maxY(), shipAABB.maxZ(), shipAABB.minX(), shipAABB.minY(), + shipAABB.minZ()); + return t.intersects(new AABB(pos)); + } + + @Unique + private static BlockPos getWorldPosFromShipPos(final Ship ship, final BlockPos pos) { + final Vec3 tPos = VectorConversionsMCKt.toMinecraft( + VSGameUtilsKt.toWorldCoordinates(ship, pos.getX() + 0.5, pos.getY() + 0.5, + pos.getZ() + 0.5)); + final BlockPos newPos = BlockPos.containing(tPos); + return newPos; + } +} 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 45da38805..c4d0e3bc9 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 @@ -1,59 +1,56 @@ package org.valkyrienskies.mod.fabric.mixin.compat.cc_restitched; -// -//import dan200.computercraft.api.turtle.TurtleCommandResult; -//import dan200.computercraft.shared.turtle.core.TurtleMoveCommand; -//import dan200.computercraft.shared.turtle.core.TurtlePlayer; -//import java.util.List; -//import net.minecraft.core.BlockPos; -//import net.minecraft.server.level.ServerLevel; -//import net.minecraft.world.level.ChunkPos; -//import net.minecraft.world.level.Level; -//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; -//import org.valkyrienskies.core.api.ships.Ship; -//import org.valkyrienskies.mod.common.VSGameUtilsKt; -// -//@Pseudo -//@Mixin(TurtleMoveCommand.class) -//public abstract class MixinTurtleMoveCommand { -// @Inject(method = "canEnter", at = @At("RETURN"), cancellable = true) -// private static void ValkyrienSkies2$canEnter( -// TurtlePlayer turtlePlayer, ServerLevel world, BlockPos position, -// CallbackInfoReturnable cir) { -// if (cir.getReturnValue().isSuccess()) { -// final Ship ship = VSGameUtilsKt.getShipManagingPos(world, position); -// if (ship == null) { -// final Ship iShip = VSGameUtilsKt.getShipManagingPos(world, getShipPosFromWorldPos(world, position)); -// if (iShip != null) { -// cir.setReturnValue(TurtleCommandResult.failure("ship")); -// } -// } else { -// final ChunkPos chunk = world.getChunkAt(position).getPos(); -// if (!ship.getChunkClaim().contains(chunk.x, chunk.z)) { -// cir.setReturnValue(TurtleCommandResult.failure("out of ship")); -// } -// } -// } -// } -// -// //CUSTOM METHODS -// @Unique -// private static Vector3d getShipPosFromWorldPos(final Level world, final BlockPos position) { -// final List detectedShips = -// VSGameUtilsKt.transformToNearbyShipsAndWorld(world, position.getX() + 0.5, position.getY() + 0.5, -// position.getZ() + 0.5, 0.1); -// for (final Vector3d vec : detectedShips) { -// if (vec != null) { -// return vec; -// } -// } -// return new Vector3d(position.getX(), position.getY(), position.getZ()); -// } -//} +import dan200.computercraft.api.turtle.TurtleCommandResult; +import dan200.computercraft.shared.turtle.core.TurtleMoveCommand; +import dan200.computercraft.shared.turtle.core.TurtlePlayer; +import java.util.List; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +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; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +@Pseudo +@Mixin(TurtleMoveCommand.class) +public abstract class MixinTurtleMoveCommand { + @Inject(method = "canEnter", at = @At("RETURN"), remap = false, cancellable = true) + private static void ValkyrienSkies2$canEnter( + final TurtlePlayer turtlePlayer, final ServerLevel world, final BlockPos position, final CallbackInfoReturnable cir) { + if (cir.getReturnValue().isSuccess()) { + final Ship ship = VSGameUtilsKt.getShipManagingPos(world, position); + if (ship == null) { + final Ship iShip = VSGameUtilsKt.getShipManagingPos(world, getShipPosFromWorldPos(world, position)); + if (iShip != null) { + cir.setReturnValue(TurtleCommandResult.failure("ship")); + } + } else { + final ChunkPos chunk = world.getChunkAt(position).getPos(); + if (!ship.getChunkClaim().contains(chunk.x, chunk.z)) { + cir.setReturnValue(TurtleCommandResult.failure("out of ship")); + } + } + } + } + + //CUSTOM METHODS + @Unique + private static Vector3d getShipPosFromWorldPos(final Level world, final BlockPos position) { + final List detectedShips = + VSGameUtilsKt.transformToNearbyShipsAndWorld(world, position.getX() + 0.5, position.getY() + 0.5, + position.getZ() + 0.5, 0.1); + for (final Vector3d vec : detectedShips) { + if (vec != null) { + return vec; + } + } + return new Vector3d(position.getX(), position.getY(), position.getZ()); + } +} diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinWirelessModemPeripheral.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinWirelessModemPeripheral.java new file mode 100644 index 000000000..5c71ec9bf --- /dev/null +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinWirelessModemPeripheral.java @@ -0,0 +1,25 @@ +package org.valkyrienskies.mod.fabric.mixin.compat.cc_restitched; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +@Pseudo +@Mixin(WirelessModemPeripheral.class) +public abstract class MixinWirelessModemPeripheral { + @WrapOperation( + method = "getRange", + at = @At( + value = "INVOKE", + target = "Ldan200/computercraft/shared/peripheral/modem/wireless/WirelessModemPeripheral;getPosition()Lnet/minecraft/world/phys/Vec3;" + ) + ) + public Vec3 ValkyrienSkies$getPosition(WirelessModemPeripheral instance, Operation original){ + return VSGameUtilsKt.toWorldCoordinates(instance.getLevel(), original.call(instance)); + } +} diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinWirelessNetwork.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinWirelessNetwork.java index e6082e180..e1365b4c6 100644 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinWirelessNetwork.java +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinWirelessNetwork.java @@ -1,45 +1,44 @@ package org.valkyrienskies.mod.fabric.mixin.compat.cc_restitched; -//import dan200.computercraft.api.network.Packet; -//import dan200.computercraft.api.network.PacketReceiver; -//import dan200.computercraft.api.network.PacketSender; -//import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; -//import net.minecraft.world.phys.Vec3; -//import org.spongepowered.asm.mixin.Mixin; -//import org.spongepowered.asm.mixin.Pseudo; -//import org.spongepowered.asm.mixin.injection.At; -//import org.spongepowered.asm.mixin.injection.Inject; -//import org.spongepowered.asm.mixin.injection.ModifyVariable; -//import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//import org.valkyrienskies.mod.common.VSGameUtilsKt; -// -//@Pseudo -//@Mixin(WirelessNetwork.class) -//public class MixinWirelessNetwork { -// private static PacketReceiver shipReceiver; -// private static PacketSender shipSender; -// -// @ModifyVariable(method = "tryTransmit", -// at = @At(value = "STORE"), -// name = "distanceSq", -// remap = false -// ) -// private static double ValkyrienSkies2$distanceSq(final double original) { -// final Vec3 posOnShip = shipReceiver.getPosition(); -// final Vec3 posInWorld = shipSender.getPosition(); -// -// final double distance = -// VSGameUtilsKt.squaredDistanceBetweenInclShips(shipReceiver.getLevel(), -// posOnShip.x, posOnShip.y, posOnShip.z, -// posInWorld.x, posInWorld.y, posInWorld.z); -// -// return distance; -// } -// -// @Inject(at = @At("HEAD"), method = "tryTransmit", remap = false) -// private static void ValkyrienSkies2$tryTransmit(PacketReceiver receiver, Packet packet, double range, -// boolean interdimensional, CallbackInfo ci) { -// shipReceiver = receiver; -// shipSender = packet.sender(); -// } -//} +import dan200.computercraft.api.network.Packet; +import dan200.computercraft.api.network.PacketReceiver; +import dan200.computercraft.api.network.PacketSender; +import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; +import net.minecraft.world.phys.Vec3; +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +@Pseudo +@Mixin(WirelessNetwork.class) +public class MixinWirelessNetwork { + @Unique + private static PacketReceiver shipReceiver; + @Unique + private static PacketSender shipSender; + + @Redirect( + method = "tryTransmit", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D" + ) + ) + private static double ValkyrienSkies$distanceToSqr(final Vec3 instance, final Vec3 d) { + return VSGameUtilsKt.squaredDistanceBetweenInclShips(shipReceiver.getLevel(), instance.x, instance.y, + instance.z, d.x, d.y, d.z); + } + + @Inject(at = @At("HEAD"), method = "tryTransmit", remap = false) + private static void ValkyrienSkies2$tryTransmit(final PacketReceiver receiver, final Packet packet, + final double range, + final boolean interdimensional, final CallbackInfo ci) { + shipReceiver = receiver; + shipSender = packet.sender(); + } +} diff --git a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json index a94f08387..0ffafcc15 100644 --- a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json +++ b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json @@ -3,6 +3,10 @@ "package": "org.valkyrienskies.mod.fabric.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "compat.cc_restitched.MixinTurtleBrain", + "compat.cc_restitched.MixinTurtleMoveCommand", + "compat.cc_restitched.MixinWirelessModemPeripheral", + "compat.cc_restitched.MixinWirelessNetwork", "compat.create.MixinBlockBreakingKineticTileEntity", "compat.create.MixinBlocks", "compat.create.MixinChuteBlockEntity", @@ -10,9 +14,8 @@ "compat.create.client.MixinTrackBlockOutline", "compat.sodium.MixinRenderSectionManager", "feature.explosions.ClipContextMixin", - "server.network.MixinServerGamePacketListenerImpl", "feature.shipyard_entities.MixinPersistentEntitySectionManager", - "world.level.block.FireMixin", + "server.network.MixinServerGamePacketListenerImpl", "server.network.MixinServerPlayerGameMode", "world.level.block.FireMixin" ], diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java deleted file mode 100644 index 7b50b3865..000000000 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerPosition.java +++ /dev/null @@ -1,47 +0,0 @@ -//package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; -// -//import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; -//import net.minecraft.world.level.Level; -//import net.minecraft.world.phys.Vec3; -//import org.spongepowered.asm.mixin.Mixin; -//import org.spongepowered.asm.mixin.Pseudo; -//import org.spongepowered.asm.mixin.Shadow; -//import org.spongepowered.asm.mixin.injection.At; -//import org.spongepowered.asm.mixin.injection.Inject; -//import org.spongepowered.asm.mixin.injection.Redirect; -//import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//import org.valkyrienskies.core.api.ships.Ship; -//import org.valkyrienskies.mod.common.VSGameUtilsKt; -// -//@Pseudo -//@Mixin(SpeakerPosition.class) -//public abstract class MixinSpeakerPosition { -// @Shadow -// public abstract Level level(); -// -// @Inject(method = "position", at = @At("RETURN"), remap = false, cancellable = true) -// public void ValkyrienSkies2$position(final CallbackInfoReturnable cir) { -// final Vec3 pos = cir.getReturnValue(); -// final Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level(), pos.x, pos.y, pos.z); -// if (ship != null) { -// cir.setReturnValue(VSGameUtilsKt.toWorldCoordinates(level(), pos)); -// } -// } -// -// @Redirect( -// method = "withinDistance", -// at = @At( -// value = "INVOKE", -// target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D" -// ) -// ) -// public double ValkyrienSkies$distanceToSqr(final Vec3 instance, final Vec3 d) { -// final Ship ship = VSGameUtilsKt.getShipManagingPos(level(), instance); -// if (ship != null) { -// return VSGameUtilsKt.squaredDistanceBetweenInclShips(level(), instance.x, instance.y, instance.z, d.x, d.y, -// d.z); -// } -// -// return instance.distanceToSqr(d); -// } -//} 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 b0b4da969..7370c4797 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 @@ -1,116 +1,117 @@ -//package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; -// -//import dan200.computercraft.shared.turtle.blocks.TurtleBlockEntity; -//import dan200.computercraft.shared.turtle.core.TurtleBrain; -//import net.minecraft.core.BlockPos; -//import net.minecraft.core.Direction; -//import net.minecraft.core.Vec3i; -//import net.minecraft.world.level.Level; -//import net.minecraft.world.phys.AABB; -//import net.minecraft.world.phys.Vec3; -//import org.joml.Matrix4dc; -//import org.joml.Vector3d; -//import org.joml.Vector3dc; -//import org.joml.primitives.AABBic; -//import org.spongepowered.asm.mixin.Mixin; -//import org.spongepowered.asm.mixin.Pseudo; -//import org.spongepowered.asm.mixin.Shadow; -//import org.spongepowered.asm.mixin.Unique; -//import org.spongepowered.asm.mixin.injection.At; -//import org.spongepowered.asm.mixin.injection.ModifyVariable; -//import org.valkyrienskies.core.api.ships.Ship; -//import org.valkyrienskies.mod.common.VSGameUtilsKt; -//import org.valkyrienskies.mod.common.config.VSGameConfig; -//import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; -// -//@Pseudo -//@Mixin(TurtleBrain.class) -//public abstract class MixinTurtleBrain { -// @Shadow -// public abstract TurtleBlockEntity getOwner(); -// -// @Shadow -// public abstract void setOwner(TurtleBlockEntity owner); -// -// @Shadow -// public abstract Level getLevel(); -// -// @ModifyVariable( -// method = "Ldan200/computercraft/shared/turtle/core/TurtleBrain;teleportTo(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Z", -// at = @At(value = "HEAD"), -// index = 2, -// remap = false -// ) -// private BlockPos ValkyrienSkies2$teleportToBlockPos(final BlockPos pos) { -// final TurtleBlockEntity currentOwner = getOwner(); -// final BlockPos oldPos = currentOwner.getAccess().getPosition(); -// final Level world = getLevel(); -// -// final Ship ship = VSGameUtilsKt.getShipManagingPos(world, oldPos); -// if (ship != null) { -// // THERE IS A SHIP -// final Direction d = getNewDirection(ship, currentOwner.getDirection()); -// if (!doesShipContainPoint(ship, pos)) { -// // POSITION IS OUTSIDE THE SHIP'S AABB -// -// currentOwner.setDirection(d); -// setOwner(currentOwner); -// -// if (!isShipScaled(ship)) { -// // SHIP IS NOT SCALED -// -// return getWorldPosFromShipPos(ship, pos); -// } else if (turtlesLeaveScaledShips()) { -// // SHIP IS SCALED AND TURTLES CAN LEAVE SCALED SHIPS -// -// return getWorldPosFromShipPos(ship, pos); -// } -// } -// } -// return pos; -// } -// -// // CUSTOM METHODS -// -// @Unique -// private static Direction getNewDirection(final Ship ship, final Direction direction) { -// final Matrix4dc matrix = ship.getShipToWorld(); -// final Vec3i turtleDirectionVector = direction.getNormal(); -// final Vector3d directionVec = -// matrix.transformDirection(turtleDirectionVector.getX(), turtleDirectionVector.getY(), -// turtleDirectionVector.getZ(), new Vector3d()); -// final Direction dir = Direction.getNearest(directionVec.x, directionVec.y, directionVec.z); -// -// return dir; -// } -// -// @Unique -// private static boolean turtlesLeaveScaledShips() { -// return VSGameConfig.SERVER.getComputerCraft().getCanTurtlesLeaveScaledShips(); -// } -// -// @Unique -// private static boolean isShipScaled(final Ship ship) { -// final Vector3dc scale = ship.getTransform().getShipToWorldScaling(); -// final Vector3dc normalScale = new Vector3d(1.000E+0, 1.000E+0, 1.000E+0); -// return !scale.equals(normalScale); -// } -// -// @Unique -// private static boolean doesShipContainPoint(final Ship ship, final BlockPos pos) { -// final AABBic shipAABB = ship.getShipAABB(); -// -// final AABB t = new AABB(shipAABB.maxX(), shipAABB.maxY(), shipAABB.maxZ(), shipAABB.minX(), shipAABB.minY(), -// shipAABB.minZ()); -// return t.intersects(new AABB(pos)); -// } -// -// @Unique -// private static BlockPos getWorldPosFromShipPos(final Ship ship, final BlockPos pos) { -// final Vec3 tPos = VectorConversionsMCKt.toMinecraft( -// VSGameUtilsKt.toWorldCoordinates(ship, pos.getX() + 0.5, pos.getY() + 0.5, -// pos.getZ() + 0.5)); -// final BlockPos newPos = BlockPos.containing(tPos.x, tPos.y, tPos.z); -// return newPos; -// } -//} +package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; + +import dan200.computercraft.shared.turtle.blocks.TurtleBlockEntity; +import dan200.computercraft.shared.turtle.core.TurtleBrain; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.joml.Matrix4dc; +import org.joml.Vector3d; +import org.joml.Vector3dc; +import org.joml.primitives.AABBic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.config.VSGameConfig; +import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; + +@Pseudo +@Mixin(TurtleBrain.class) +public abstract class MixinTurtleBrain { + @Shadow(remap = false) + public abstract TurtleBlockEntity getOwner(); + + @Shadow(remap = false) + public abstract void setOwner(TurtleBlockEntity owner); + + @Shadow + public abstract Level getLevel(); + + @ModifyVariable( + method = "teleportTo(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Z", + at = @At(value = "HEAD"), + index = 2, + argsOnly = true, + remap = false + ) + private BlockPos ValkyrienSkies2$teleportToBlockPos(final BlockPos pos) { + final TurtleBlockEntity currentOwner = getOwner(); + final BlockPos oldPos = currentOwner.getAccess().getPosition(); + final Level world = getLevel(); + + final Ship ship = VSGameUtilsKt.getShipManagingPos(world, oldPos); + if (ship != null) { + // THERE IS A SHIP + final Direction d = getNewDirection(ship, currentOwner.getDirection()); + if (!doesShipContainPoint(ship, pos)) { + // POSITION IS OUTSIDE THE SHIP'S AABB + + currentOwner.setDirection(d); + setOwner(currentOwner); + + if (!isShipScaled(ship)) { + // SHIP IS NOT SCALED + + return getWorldPosFromShipPos(ship, pos); + } else if (turtlesLeaveScaledShips()) { + // SHIP IS SCALED AND TURTLES CAN LEAVE SCALED SHIPS + + return getWorldPosFromShipPos(ship, pos); + } + } + } + return pos; + } + + // CUSTOM METHODS + + @Unique + private static Direction getNewDirection(final Ship ship, final Direction direction) { + final Matrix4dc matrix = ship.getShipToWorld(); + final Vec3i turtleDirectionVector = direction.getNormal(); + final Vector3d directionVec = + matrix.transformDirection(turtleDirectionVector.getX(), turtleDirectionVector.getY(), + turtleDirectionVector.getZ(), new Vector3d()); + final Direction dir = Direction.getNearest(directionVec.x, directionVec.y, directionVec.z); + + return dir; + } + + @Unique + private static boolean turtlesLeaveScaledShips() { + return VSGameConfig.SERVER.getComputerCraft().getCanTurtlesLeaveScaledShips(); + } + + @Unique + private static boolean isShipScaled(final Ship ship) { + final Vector3dc scale = ship.getTransform().getShipToWorldScaling(); + final Vector3dc normalScale = new Vector3d(1.000E+0, 1.000E+0, 1.000E+0); + return !scale.equals(normalScale); + } + + @Unique + private static boolean doesShipContainPoint(final Ship ship, final BlockPos pos) { + final AABBic shipAABB = ship.getShipAABB(); + + final AABB t = new AABB(shipAABB.maxX(), shipAABB.maxY(), shipAABB.maxZ(), shipAABB.minX(), shipAABB.minY(), + shipAABB.minZ()); + return t.intersects(new AABB(pos)); + } + + @Unique + private static BlockPos getWorldPosFromShipPos(final Ship ship, final BlockPos pos) { + final Vec3 tPos = VectorConversionsMCKt.toMinecraft( + VSGameUtilsKt.toWorldCoordinates(ship, pos.getX() + 0.5, pos.getY() + 0.5, + pos.getZ() + 0.5)); + final BlockPos newPos = BlockPos.containing(tPos); + return newPos; + } +} 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 422a245f4..43530fe09 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 @@ -1,58 +1,57 @@ -//package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; -// -//import dan200.computercraft.api.turtle.TurtleCommandResult; -//import dan200.computercraft.shared.turtle.core.TurtleMoveCommand; -//import dan200.computercraft.shared.turtle.core.TurtlePlayer; -//import java.util.List; -//import javax.annotation.Nonnull; -//import net.minecraft.core.BlockPos; -//import net.minecraft.world.level.ChunkPos; -//import net.minecraft.world.level.Level; -//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; -//import org.valkyrienskies.core.api.ships.Ship; -//import org.valkyrienskies.mod.common.VSGameUtilsKt; -// -//@Pseudo -//@Mixin(TurtleMoveCommand.class) -//public abstract class MixinTurtleMoveCommand { -// @Inject(method = "canEnter", at = @At("RETURN"), remap = false, cancellable = true) -// private static void ValkyrienSkies2$canEnter( -// final TurtlePlayer turtlePlayer, final Level world, @Nonnull final BlockPos position, -// final CallbackInfoReturnable cir) { -// if (cir.getReturnValue().isSuccess()) { -// final Ship ship = VSGameUtilsKt.getShipManagingPos(world, position); -// if (ship == null) { -// final Ship iShip = VSGameUtilsKt.getShipManagingPos(world, getShipPosFromWorldPos(world, position)); -// if (iShip != null) { -// cir.setReturnValue(TurtleCommandResult.failure("ship")); -// } -// } else { -// final ChunkPos chunk = world.getChunkAt(position).getPos(); -// if (!ship.getChunkClaim().contains(chunk.x, chunk.z)) { -// cir.setReturnValue(TurtleCommandResult.failure("out of ship")); -// } -// } -// } -// } -// -// //CUSTOM METHODS -// @Unique -// private static Vector3d getShipPosFromWorldPos(final Level world, final BlockPos position) { -// final List detectedShips = -// VSGameUtilsKt.transformToNearbyShipsAndWorld(world, position.getX() + 0.5, position.getY() + 0.5, -// position.getZ() + 0.5, 0.1); -// for (final Vector3d vec : detectedShips) { -// if (vec != null) { -// return vec; -// } -// } -// return new Vector3d(position.getX(), position.getY(), position.getZ()); -// } -//} -// +package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; + +import dan200.computercraft.api.turtle.TurtleCommandResult; +import dan200.computercraft.shared.turtle.core.TurtleMoveCommand; +import dan200.computercraft.shared.turtle.core.TurtlePlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +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; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +import java.util.List; + +@Pseudo +@Mixin(TurtleMoveCommand.class) +public abstract class MixinTurtleMoveCommand { + @Inject(method = "canEnter", at = @At("RETURN"), remap = false, cancellable = true) + private static void ValkyrienSkies2$canEnter( + final TurtlePlayer turtlePlayer, final ServerLevel world, final BlockPos position, final CallbackInfoReturnable cir) { + if (cir.getReturnValue().isSuccess()) { + final Ship ship = VSGameUtilsKt.getShipManagingPos(world, position); + if (ship == null) { + final Ship iShip = VSGameUtilsKt.getShipManagingPos(world, getShipPosFromWorldPos(world, position)); + if (iShip != null) { + cir.setReturnValue(TurtleCommandResult.failure("ship")); + } + } else { + final ChunkPos chunk = world.getChunkAt(position).getPos(); + if (!ship.getChunkClaim().contains(chunk.x, chunk.z)) { + cir.setReturnValue(TurtleCommandResult.failure("out of ship")); + } + } + } + } + + //CUSTOM METHODS + @Unique + private static Vector3d getShipPosFromWorldPos(final Level world, final BlockPos position) { + final List detectedShips = + VSGameUtilsKt.transformToNearbyShipsAndWorld(world, position.getX() + 0.5, position.getY() + 0.5, + position.getZ() + 0.5, 0.1); + for (final Vector3d vec : detectedShips) { + if (vec != null) { + return vec; + } + } + return new Vector3d(position.getX(), position.getY(), position.getZ()); + } +} diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessModemPeripheral.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessModemPeripheral.java new file mode 100644 index 000000000..01226e2e1 --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessModemPeripheral.java @@ -0,0 +1,25 @@ +package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +@Pseudo +@Mixin(WirelessModemPeripheral.class) +public abstract class MixinWirelessModemPeripheral { + @WrapOperation( + method = "getRange", + at = @At( + value = "INVOKE", + target = "Ldan200/computercraft/shared/peripheral/modem/wireless/WirelessModemPeripheral;getPosition()Lnet/minecraft/world/phys/Vec3;" + ) + ) + public Vec3 ValkyrienSkies$getPosition(WirelessModemPeripheral instance, Operation original){ + return VSGameUtilsKt.toWorldCoordinates(instance.getLevel(), original.call(instance)); + } +} diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessNetwork.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessNetwork.java index 1dbb0e7c1..01c3d5537 100644 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessNetwork.java +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessNetwork.java @@ -1,41 +1,44 @@ -//package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; -// -//import dan200.computercraft.api.network.Packet; -//import dan200.computercraft.api.network.PacketReceiver; -//import dan200.computercraft.api.network.PacketSender; -//import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; -//import net.minecraft.world.phys.Vec3; -//import org.spongepowered.asm.mixin.Mixin; -//import org.spongepowered.asm.mixin.Pseudo; -//import org.spongepowered.asm.mixin.injection.At; -//import org.spongepowered.asm.mixin.injection.Inject; -//import org.spongepowered.asm.mixin.injection.Redirect; -//import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//import org.valkyrienskies.mod.common.VSGameUtilsKt; -// -//@Pseudo -//@Mixin(WirelessNetwork.class) -//public class MixinWirelessNetwork { -// private static PacketReceiver shipReceiver; -// private static PacketSender shipSender; -// -// @Redirect( -// method = "tryTransmit", -// at = @At( -// value = "INVOKE", -// target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D" -// ) -// ) -// private static double ValkyrienSkies$distanceToSqr(final Vec3 instance, final Vec3 d) { -// return VSGameUtilsKt.squaredDistanceBetweenInclShips(shipReceiver.getLevel(), instance.x, instance.y, -// instance.z, d.x, d.y, d.z); -// } -// -// @Inject(at = @At("HEAD"), method = "tryTransmit", remap = false) -// private static void ValkyrienSkies2$tryTransmit(final PacketReceiver receiver, final Packet packet, -// final double range, -// final boolean interdimensional, final CallbackInfo ci) { -// shipReceiver = receiver; -// shipSender = packet.sender(); -// } -//} +package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; + +import dan200.computercraft.api.network.PacketReceiver; +import dan200.computercraft.api.network.PacketSender; +import dan200.computercraft.api.network.Packet; +import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; +import net.minecraft.world.phys.Vec3; +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +@Pseudo +@Mixin(WirelessNetwork.class) +public class MixinWirelessNetwork { + @Unique + private static PacketReceiver shipReceiver; + @Unique + private static PacketSender shipSender; + + @Redirect( + method = "tryTransmit", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D" + ) + ) + private static double ValkyrienSkies$distanceToSqr(final Vec3 instance, final Vec3 d) { + return VSGameUtilsKt.squaredDistanceBetweenInclShips(shipReceiver.getLevel(), instance.x, instance.y, + instance.z, d.x, d.y, d.z); + } + + @Inject(at = @At("HEAD"), method = "tryTransmit", remap = false) + private static void ValkyrienSkies2$tryTransmit(final PacketReceiver receiver, final Packet packet, + final double range, + final boolean interdimensional, final CallbackInfo ci) { + shipReceiver = receiver; + shipSender = packet.sender(); + } +} diff --git a/forge/src/main/resources/valkyrienskies-forge.mixins.json b/forge/src/main/resources/valkyrienskies-forge.mixins.json index 129b12639..9b4c2593c 100644 --- a/forge/src/main/resources/valkyrienskies-forge.mixins.json +++ b/forge/src/main/resources/valkyrienskies-forge.mixins.json @@ -4,6 +4,10 @@ "compatibilityLevel": "JAVA_17", "plugin": "org.valkyrienskies.mod.forge.mixin.ValkyrienSkiesForgeMixinPlugin", "mixins": [ + "compat.cc_tweaked.MixinTurtleBrain", + "compat.cc_tweaked.MixinTurtleMoveCommand", + "compat.cc_tweaked.MixinWirelessModemPeripheral", + "compat.cc_tweaked.MixinWirelessNetwork", "compat.create.MixinBlockBreakingKineticTileEntity", "compat.create.MixinBlocks", "compat.create.MixinChuteBlockEntity",