diff --git a/common/build.gradle b/common/build.gradle index 784f58193..0167058c0 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -38,6 +38,9 @@ dependencies { // Weather2 1.20.1 modCompileOnly("curse.maven:weather-storms-tornadoes-237746:5244118") + // CC: Tweaked + modCompileOnly("maven.modrinth:cc-tweaked:${cc_tweaked_version}") + //Common create compat, //We just use a version from a platform and hope the classes exist on both versions and mixins apply correctly modCompileOnly("com.simibubi.create:create-fabric-${minecraft_version}:${create_fabric_version}") diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerSound.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinSpeakerSound.java similarity index 81% rename from forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerSound.java rename to common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinSpeakerSound.java index 907ec7493..d86e67782 100644 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinSpeakerSound.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinSpeakerSound.java @@ -1,4 +1,4 @@ -package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; +package org.valkyrienskies.mod.mixin.mod_compat.cc_tweaked; import dan200.computercraft.client.sound.SpeakerSound; import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; @@ -16,8 +16,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.api.ValkyrienSkies; import org.valkyrienskies.mod.client.audio.VelocityTickableSoundInstance; -import org.valkyrienskies.mod.common.VSGameUtilsKt; @Mixin(SpeakerSound.class) public abstract class MixinSpeakerSound extends AbstractSoundInstance implements VelocityTickableSoundInstance { @@ -35,9 +35,9 @@ protected MixinSpeakerSound(ResourceLocation arg, SoundSource arg2, RandomSource ) private void isOnShip(SpeakerPosition position, CallbackInfo ci) { this.speakerPosition = position; - this.ship = VSGameUtilsKt.getShipManagingPos(position.level(), position.position()); + this.ship = ValkyrienSkies.getShipManagingBlock(position.level(), position.position()); if (this.ship != null) { - Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); + Vec3 worldPos = ValkyrienSkies.positionToWorld(speakerPosition.level(), speakerPosition.position()); x = worldPos.x; y = worldPos.y; z = worldPos.z; @@ -50,7 +50,7 @@ private void isOnShip(SpeakerPosition position, CallbackInfo ci) { ) private void updateWorldPos(CallbackInfo ci) { if (this.ship != null) { - Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); + Vec3 worldPos = ValkyrienSkies.positionToWorld(speakerPosition.level(), speakerPosition.position()); x = worldPos.x; y = worldPos.y; z = worldPos.z; diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinTurtleBrain.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinTurtleBrain.java new file mode 100644 index 000000000..80830ffc3 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinTurtleBrain.java @@ -0,0 +1,76 @@ +package org.valkyrienskies.mod.mixin.mod_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.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.joml.Vector3d; +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.ModifyVariable; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.api.ValkyrienSkies; +import org.valkyrienskies.mod.common.config.VSGameConfig; + +@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.getBlockPos(); + final Level world = getLevel(); + + final Ship ship = ValkyrienSkies.getShipManagingBlock(world, oldPos); + if (ship != null) { + // THERE IS A SHIP + + final Vector3d transformedDirection = ship.getShipToWorld().transformDirection( + ValkyrienSkies.toJOMLd(currentOwner.getDirection().getNormal()) + ); + if (!ship.getShipAABB().containsPoint(ValkyrienSkies.toJOML(pos))) { + // POSITION IS OUTSIDE THE SHIP'S AABB + + currentOwner.setDirection( + Direction.getNearest(transformedDirection.x, transformedDirection.y, transformedDirection.z)); + setOwner(currentOwner); + + 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 BlockPos.containing(ValkyrienSkies.positionToWorld(ship, Vec3.atCenterOf(pos))); + } + } else { + // SHIP ISNT SCALED + + return BlockPos.containing(ValkyrienSkies.positionToWorld(ship, Vec3.atCenterOf(pos))); + } + } + } + return pos; + } +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinTurtleMoveCommand.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinTurtleMoveCommand.java new file mode 100644 index 000000000..2b4218fa2 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinTurtleMoveCommand.java @@ -0,0 +1,57 @@ +package org.valkyrienskies.mod.mixin.mod_compat.cc_tweaked; + +import com.google.common.collect.Streams; +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 net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; +import org.joml.Vector3d; +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.callback.CallbackInfoReturnable; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.api.ValkyrienSkies; + +@Pseudo +@Mixin(TurtleMoveCommand.class) +public abstract class MixinTurtleMoveCommand { + @Inject(method = "canEnter", at = @At("RETURN"), remap = false, cancellable = true) + private static void ValkyrienSkies2$canEnter( + TurtlePlayer turtlePlayer, ServerLevel world, BlockPos position, + CallbackInfoReturnable cir) { + if (cir.getReturnValue().isSuccess()) { + final Ship ship = ValkyrienSkies.getShipManagingBlock(world, position); + Vector3d testPosition = ValkyrienSkies.toJOML(position.getCenter()); + + if (ship != null) { + final ChunkPos chunk = world.getChunkAt(position).getPos(); + if (!ship.getChunkClaim().contains(chunk.x, chunk.z)) { + cir.setReturnValue(TurtleCommandResult.failure("Out of ship chunk")); + } + + testPosition = ValkyrienSkies.positionToWorld(ship, testPosition); + } + + final List nearbyShips = + new ArrayList<>(Streams.stream(ValkyrienSkies.positionToNearbyShips(world, + testPosition.x, testPosition.y, testPosition.z, 0.1)).toList()); + + final boolean notInAir = !nearbyShips.isEmpty() && nearbyShips + .stream() + .map(ValkyrienSkies::toMinecraft) + .map(BlockPos::containing) + .map(world::getBlockState) + .anyMatch(state -> !state.isAir()); + + if (notInAir) { + cir.setReturnValue(TurtleCommandResult.failure("Movement obstructed by ship")); + } + } + } +} diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessModemPeripheral.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinWirelessModemPeripheral.java similarity index 81% rename from forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessModemPeripheral.java rename to common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinWirelessModemPeripheral.java index 01226e2e1..e45a6accd 100644 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessModemPeripheral.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinWirelessModemPeripheral.java @@ -1,4 +1,4 @@ -package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; +package org.valkyrienskies.mod.mixin.mod_compat.cc_tweaked; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; @@ -7,7 +7,7 @@ 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; +import org.valkyrienskies.mod.api.ValkyrienSkies; @Pseudo @Mixin(WirelessModemPeripheral.class) @@ -20,6 +20,6 @@ public abstract class MixinWirelessModemPeripheral { ) ) public Vec3 ValkyrienSkies$getPosition(WirelessModemPeripheral instance, Operation original){ - return VSGameUtilsKt.toWorldCoordinates(instance.getLevel(), original.call(instance)); + return ValkyrienSkies.positionToWorld(instance.getLevel(), original.call(instance)); } } diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessNetwork.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinWirelessNetwork.java similarity index 87% rename from forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessNetwork.java rename to common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinWirelessNetwork.java index 01c3d5537..b4ca44916 100644 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinWirelessNetwork.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/MixinWirelessNetwork.java @@ -1,8 +1,8 @@ -package org.valkyrienskies.mod.forge.mixin.compat.cc_tweaked; +package org.valkyrienskies.mod.mixin.mod_compat.cc_tweaked; +import dan200.computercraft.api.network.Packet; 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; @@ -12,7 +12,7 @@ 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; +import org.valkyrienskies.mod.api.ValkyrienSkies; @Pseudo @Mixin(WirelessNetwork.class) @@ -30,7 +30,7 @@ public class MixinWirelessNetwork { ) ) private static double ValkyrienSkies$distanceToSqr(final Vec3 instance, final Vec3 d) { - return VSGameUtilsKt.squaredDistanceBetweenInclShips(shipReceiver.getLevel(), instance.x, instance.y, + return ValkyrienSkies.distanceSquared(shipReceiver.getLevel(), instance.x, instance.y, instance.z, d.x, d.y, d.z); } diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/README.MD b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/README.MD similarity index 100% rename from fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/README.MD rename to common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/cc_tweaked/README.MD diff --git a/common/src/main/resources/valkyrienskies-common.mixins.json b/common/src/main/resources/valkyrienskies-common.mixins.json index 148fe51a7..b8686d87f 100644 --- a/common/src/main/resources/valkyrienskies-common.mixins.json +++ b/common/src/main/resources/valkyrienskies-common.mixins.json @@ -57,6 +57,11 @@ "mod_compat.bluemap.MixinBmMap", "mod_compat.bluemap.MixinHiresModelManager", "mod_compat.bluemap.MixinWorld", + "mod_compat.cc_tweaked.MixinTurtleBrain", + "mod_compat.cc_tweaked.MixinTurtleMoveCommand", + "mod_compat.cc_tweaked.MixinWirelessModemPeripheral", + "mod_compat.cc_tweaked.MixinWirelessNetwork", + "mod_compat.cc_tweaked.MixinSpeakerSound", "mod_compat.create.IMixinDeployerHandler", "mod_compat.create.IMixinDeployerMovementBehaviour", "mod_compat.create.MixinAirCurrent", @@ -152,6 +157,7 @@ "feature.transform_particles.MixinLevelRenderer", "feature.transform_particles.MixinParticle", "feature.vs2_alpha_hud.MixinGui", + "mod_compat.cc_tweaked.MixinSpeakerSound", "mod_compat.create.client.MixinAABBOutline", "mod_compat.create.client.MixinBlockClusterOutline", "mod_compat.create.client.MixinCarriageContraptionInstance", diff --git a/fabric/build.gradle b/fabric/build.gradle index ca1017bcb..6f901f162 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -73,9 +73,6 @@ dependencies { include("com.fasterxml:classmate:1.5.1") implementation("com.fasterxml:classmate:1.5.1") - // CC Restitched - modCompileOnly("maven.modrinth:cc-tweaked:${cc_tweaked_version}") - // EMF compat modCompileOnly("curse.maven:entity-model-features-844662:5696901") modCompileOnly("curse.maven:entity-texture-features-fabric-568563:5697084") diff --git a/fabric/gradle.properties b/fabric/gradle.properties index 9ad47341d..492f12d7c 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -25,9 +25,6 @@ no_indium_version=1.1.0+1.20 #https://modrinth.com/mod/sodium/versions sodium_version = mc1.20.1-0.5.8 -# https://modrinth.com/mod/cc-tweaked/version/Zoo9N9Dv -cc_tweaked_version = 1.113.1-fabric - kotlin_fabric_version = 1.10.10+kotlin.1.9.10 # https://modrinth.com/mod/indium/version/1.0.9+mc1.19.2 diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerSound.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerSound.java deleted file mode 100644 index fe62b1155..000000000 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinSpeakerSound.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.valkyrienskies.mod.fabric.mixin.compat.cc_restitched; - -import dan200.computercraft.client.sound.SpeakerSound; -import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; -import net.minecraft.client.resources.sounds.AbstractSoundInstance; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundSource; -import net.minecraft.util.RandomSource; -import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.NotNull; -import org.joml.Vector3d; -import org.joml.Vector3dc; -import org.spongepowered.asm.mixin.Mixin; -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.CallbackInfo; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.client.audio.VelocityTickableSoundInstance; -import org.valkyrienskies.mod.common.VSGameUtilsKt; - -@Mixin(SpeakerSound.class) -public abstract class MixinSpeakerSound extends AbstractSoundInstance implements VelocityTickableSoundInstance { - @Unique private SpeakerPosition speakerPosition; - @Unique private Ship ship; - - protected MixinSpeakerSound(ResourceLocation arg, SoundSource arg2, RandomSource arg3) { - super(arg, arg2, arg3); - } - - @Inject( - method = "setPosition", - at = @At("RETURN"), - remap = false - ) - private void isOnShip(SpeakerPosition position, CallbackInfo ci) { - this.speakerPosition = position; - this.ship = VSGameUtilsKt.getShipManagingPos(position.level(), position.position()); - if (this.ship != null) { - Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); - x = worldPos.x; - y = worldPos.y; - z = worldPos.z; - } - } - - @Inject( - method = "tick", - at = @At("HEAD") - ) - private void updateWorldPos(CallbackInfo ci) { - if (this.ship != null) { - Vec3 worldPos = VSGameUtilsKt.toWorldCoordinates(speakerPosition.level(), speakerPosition.position()); - x = worldPos.x; - y = worldPos.y; - z = worldPos.z; - } - } - - @NotNull - @Override - public Vector3dc getVelocity() { - return ship != null ? ship.getVelocity() : new Vector3d(); - } -} 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 deleted file mode 100644 index 881fa21f0..000000000 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinTurtleBrain.java +++ /dev/null @@ -1,117 +0,0 @@ -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(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 deleted file mode 100644 index c4d0e3bc9..000000000 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinTurtleMoveCommand.java +++ /dev/null @@ -1,56 +0,0 @@ -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"), 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 deleted file mode 100644 index 5c71ec9bf..000000000 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinWirelessModemPeripheral.java +++ /dev/null @@ -1,25 +0,0 @@ -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 deleted file mode 100644 index e1365b4c6..000000000 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/cc_restitched/MixinWirelessNetwork.java +++ /dev/null @@ -1,44 +0,0 @@ -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.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 0ffafcc15..698264511 100644 --- a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json +++ b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json @@ -3,10 +3,6 @@ "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", @@ -21,7 +17,6 @@ ], "client": [ "client.render.MixinLevelRenderer", - "compat.cc_restitched.MixinSpeakerSound", "compat.create.client.MixinContraptionHandlerClient", "compat.create.client.MixinContraptionRenderInfo", "compat.create.client.MixinCullingBlockEntityIterator", diff --git a/forge/build.gradle b/forge/build.gradle index b51c33772..9a7099bbd 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -80,9 +80,6 @@ dependencies { modImplementation("curse.maven:weather-storms-tornadoes-237746:5244118") modImplementation("curse.maven:coroutil-237749:5096038") - // CC Tweaked - modCompileOnly("maven.modrinth:cc-tweaked:${cc_tweaked_version}") - // EMF compat modCompileOnly("curse.maven:entity-model-features-844662:5696899") modCompileOnly("curse.maven:entity-texture-features-fabric-568563:5697083") diff --git a/forge/gradle.properties b/forge/gradle.properties index d7a683d93..f4ae8d801 100644 --- a/forge/gradle.properties +++ b/forge/gradle.properties @@ -13,7 +13,7 @@ registrate_version = MC1.20-1.3.3 # https://modmaven.dev/teamtwilight/twilightforest/ twilightforest_version = 4.3.2145 -cc_tweaked_version = 1.109.0-forge + #Extra # https://modrinth.com/mod/tis3d/version/MC1.19.2-forge-1.7.4 tis3d_version = MC1.20.1-forge-1.7.5 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 deleted file mode 100644 index 7370c4797..000000000 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinTurtleBrain.java +++ /dev/null @@ -1,117 +0,0 @@ -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 deleted file mode 100644 index 43530fe09..000000000 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/MixinTurtleMoveCommand.java +++ /dev/null @@ -1,57 +0,0 @@ -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/README.MD b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/README.MD deleted file mode 100644 index 86cfc1995..000000000 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/cc_tweaked/README.MD +++ /dev/null @@ -1,15 +0,0 @@ -Minimal ComputerCraft Compatibility Mixins - -- MixinSpeakerSound - - Fixes Speakers on Ships not playing sounds in worldspace but in Shipyard -- MixinTurtleBrain - - Fails Movement if the turtle is in worldspace and the target position is a - ship (returns "ship") - - Fails Movement if the turtle is on ship and the target position is outside - a ship's ActiveChunkSet (returns "out of ship") -- MixinTurtleMoveCommand - - Allows a Turtle to Leave Ships if the target position is outside of ship's - VoxelAABB and ship is not scaled up or down -- MixinWirelessNetwork - - Fixes Modems not being able to communicate from/to ships despite being - within range diff --git a/forge/src/main/resources/valkyrienskies-forge.mixins.json b/forge/src/main/resources/valkyrienskies-forge.mixins.json index 9b4c2593c..7cc6933bd 100644 --- a/forge/src/main/resources/valkyrienskies-forge.mixins.json +++ b/forge/src/main/resources/valkyrienskies-forge.mixins.json @@ -4,10 +4,6 @@ "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", @@ -28,7 +24,6 @@ ], "client": [ "client.render.MixinLevelRenderer", - "compat.cc_tweaked.MixinSpeakerSound", "compat.create.client.MixinContraptionHandlerClient", "compat.create.client.MixinContraptionRenderInfo", "compat.create.client.MixinFlwContraption", diff --git a/gradle.properties b/gradle.properties index 2db59d1b0..b19536aea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,6 +28,9 @@ createbigcannons_version= 0.5.2.a create_utilities_version=0.2.1+1.20.1 energy_version=2.3.0 +# https://modrinth.com/mod/cc-tweaked/version/Zoo9N9Dv +cc_tweaked_version = 1.113.1-fabric + vs_core_version=1.1.0+6dba85260a # Prevent kotlin from autoincluding stdlib as a dependency, which breaks # gradle's composite builds (includeBuild) for some reason. We'll add it manually