From db4833db321f9a27fc873d65738817c2d1738619 Mon Sep 17 00:00:00 2001 From: Rubydesic Date: Thu, 23 May 2024 00:18:21 -0400 Subject: [PATCH] compat: integrated dynamics --- .../valkyrienskies/mod/common/VSGameUtils.kt | 2 +- .../mod/util/VectorConversionsMC.kt | 4 ++ forge/build.gradle | 5 ++ .../MixinVoxelShapeComponents.java | 57 +++++++++++++++++++ .../valkyrienskies-forge.mixins.json | 1 + settings.gradle | 12 ++-- 6 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/integrateddynamics/MixinVoxelShapeComponents.java diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt index 7deaab3ea..cf8fb104d 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt @@ -304,7 +304,7 @@ fun ClientLevel?.transformRenderAABBToWorld(pos: Position, aabb: AABB): AABB { return aabb } -fun Entity.getShipManaging(): Ship? = this.level().getShipManagingPos(this.position()) +fun Entity?.getShipManaging(): Ship? = this?.let { this.level().getShipManagingPos(this.position()) } // Level fun Level?.getShipManagingPos(chunkX: Int, chunkZ: Int) = diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/util/VectorConversionsMC.kt b/common/src/main/kotlin/org/valkyrienskies/mod/util/VectorConversionsMC.kt index dbb47cbd0..0a9f1eb5a 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/util/VectorConversionsMC.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/util/VectorConversionsMC.kt @@ -101,6 +101,10 @@ fun Matrix4dc.transform(v: Vector4f) = v.also { ) } +fun Matrix4dc.transformPosition(v: Vec3): Vec3 { + return transformPosition(v.toJOML()).toMinecraft() +} + // endregion // region Minecraft diff --git a/forge/build.gradle b/forge/build.gradle index 8b6268115..2330102dc 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -85,6 +85,11 @@ dependencies { // Modular Routers modCompileOnly("curse.maven:mr-250294:4696089") + // Integrated Dynamics + modCompileOnly("curse.maven:integrated-dynamics-236307:5297722") + modCompileOnly("curse.maven:cyclops-core-232758:5262063") + modCompileOnly("curse.maven:common-capabilities-247007:4987207") + // Add Kotlin for Forge (3.12.0) forgeRuntimeLibrary("maven.modrinth:kotlin-for-forge:${kotlin_version}") diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/integrateddynamics/MixinVoxelShapeComponents.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/integrateddynamics/MixinVoxelShapeComponents.java new file mode 100644 index 000000000..eac5d856f --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/integrateddynamics/MixinVoxelShapeComponents.java @@ -0,0 +1,57 @@ +package org.valkyrienskies.mod.forge.mixin.compat.integrateddynamics; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import org.cyclops.integrateddynamics.core.block.BlockRayTraceResultComponent; +import org.cyclops.integrateddynamics.core.block.VoxelShapeComponents; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; + +/** + * This fixes Integrated Dynamics blocks not working on ships. Integrated Dynamics uses a custom raytrace + * for its blocks which are smaller than a full cube in size. This ensures that those raytraces are done in the shipyard. + *

+ * Note: we already have mixins that do this for the vanilla clip method, but ID made its own clip method that does only one block. + * + * @see Issue #218 + */ +@Mixin(VoxelShapeComponents.class) +public class MixinVoxelShapeComponents { + + @WrapOperation( + method = "Lorg/cyclops/integrateddynamics/core/block/VoxelShapeComponents;rayTrace(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/Entity;)Lorg/cyclops/integrateddynamics/core/block/BlockRayTraceResultComponent;", + remap = false, + at = @At( + value = "INVOKE", + target = "Lorg/cyclops/integrateddynamics/core/block/VoxelShapeComponents;clip(Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/core/BlockPos;)Lorg/cyclops/integrateddynamics/core/block/BlockRayTraceResultComponent;", + remap = true + ) + ) + public BlockRayTraceResultComponent preRaytrace(final VoxelShapeComponents instance, final Vec3 startVec, final Vec3 endVec, + final BlockPos entry, final Operation original, final BlockPos pos, @Nullable final Entity entity) { + + // If we're raytracing from an entity (the player), and the player is looking at an Integrated Dynamics block + // in the shipyard, we transform the start and endpoints of the raytrace into the shipyard so that it works + // properly. + if (entity != null) { + final Ship ship = VSGameUtilsKt.getShipManagingPos(entity.getCommandSenderWorld(), pos); + if (ship != null) { + final Vec3 newStart = VectorConversionsMCKt.transformPosition(ship.getWorldToShip(), startVec); + final Vec3 newEnd = VectorConversionsMCKt.transformPosition(ship.getWorldToShip(), endVec); + + return original.call(instance, newStart, newEnd, pos); + } + } + + // otherwise just default to the original behavior + return original.call(instance, startVec, endVec, pos); + } + +} diff --git a/forge/src/main/resources/valkyrienskies-forge.mixins.json b/forge/src/main/resources/valkyrienskies-forge.mixins.json index c7b04283b..33be08ee7 100644 --- a/forge/src/main/resources/valkyrienskies-forge.mixins.json +++ b/forge/src/main/resources/valkyrienskies-forge.mixins.json @@ -8,6 +8,7 @@ "compat.create.MixinControlledContraptionEntity", "compat.create.client.trackOutlines.MixinTrackBlockOutline", "compat.immersivengineering.MixinBlockEntityInventory", + "compat.integrateddynamics.MixinVoxelShapeComponents", "compat.modular_routers.MixinRouterMenu", "compat.tfc.MixinTFCChunkGenerator", "compat.thermalexpansion.MixinTileCoFH", diff --git a/settings.gradle b/settings.gradle index e4f82deee..1de8c2a2a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -43,11 +43,11 @@ include("common") include("fabric") include("forge") -try { - def core = file("../vs-core") - if (core.isDirectory()) { - includeBuild(core) - } -} catch (SecurityException ignore) {} +//try { +// def core = file("../vs-core") +// if (core.isDirectory()) { +// includeBuild(core) +// } +//} catch (SecurityException ignore) {} rootProject.name = "valkyrienskies"