Skip to content

Commit

Permalink
Added support for Create utilities VoidValueBox position and fixed Mi…
Browse files Browse the repository at this point in the history
…xinTrackBlockOutline
  • Loading branch information
mrsterner committed Feb 20, 2024
1 parent 9ed2dde commit 521f87a
Show file tree
Hide file tree
Showing 10 changed files with 199 additions and 4 deletions.
3 changes: 3 additions & 0 deletions common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ dependencies {
modCompileOnly("com.jozufozu.flywheel:flywheel-fabric-${minecraft_version}:${flywheel_version_fabric}")

modCompileOnly("maven.modrinth:create-big-cannons:${createbigcannons_version}")

modImplementation("maven.modrinth:create-utilities:${create_utilities_version}")
modImplementation("teamreborn:energy:${energy_version}")
}

architectury {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package org.valkyrienskies.mod.mixin.mod_compat.create_utilities;

import me.duquee.createutilities.blocks.voidtypes.VoidLinkBehaviour;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.valkyrienskies.core.api.ships.Ship;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.common.util.VectorConversionsMCKt;

@Mixin(VoidLinkBehaviour.class)
public class MixinVoidLinkBehaviour {




@Redirect(
method = "testHit",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/phys/Vec3;subtract(Lnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3;"
)
)
public Vec3 redirectSubtract(Vec3 instance, Vec3 vec) {
Level level = ((VoidLinkBehaviour) (Object) this).getWorld();

Vec3 pos1 = instance;
Vec3 pos2 = vec;

if (level != null) {
Ship ship1 = VSGameUtilsKt.getShipManagingPos(level, pos1.x, pos1.y, pos1.z);
Ship ship2 = VSGameUtilsKt.getShipManagingPos(level, pos2.x, pos2.y, pos2.z);
if (ship1 != null && ship2 == null) {
pos2 = VectorConversionsMCKt.toMinecraft(
ship1.getWorldToShip().transformPosition(VectorConversionsMCKt.toJOML(pos2))
);
} else if (ship1 == null && ship2 != null) {
pos1 = VectorConversionsMCKt.toMinecraft(
ship2.getWorldToShip().transformPosition(VectorConversionsMCKt.toJOML(pos1))
);
}
}
return pos1.subtract(pos2);
}

}
4 changes: 2 additions & 2 deletions common/src/main/resources/valkyrienskies-common.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
"mod_compat.create.packets.MixinTrainRelocationPacket",
"mod_compat.create.pr.MixinSeatBlock",
"mod_compat.create_big_cannons.MixinPitchOrientedContraptionEntity",
"mod_compat.create_utilities.MixinVoidLinkBehaviour",
"mod_compat.reachentityattributes.MixinReachEntityAttributes",
"server.MixinMinecraftServer",
"server.MixinPlayerList",
Expand Down Expand Up @@ -158,9 +159,8 @@
"mod_compat.create.client.MixinSoundScapes",
"mod_compat.create.client.MixinTileEntityRenderHelper",
"mod_compat.create.client.MixinTrainRelocator",
"mod_compat.create.client.trackOutlines.MixinBigOutlines",
"mod_compat.create.client.trackOutlines.MixinTrackBlockOutline",
"mod_compat.create.client.MixinValueBox",
"mod_compat.create.client.trackOutlines.MixinBigOutlines",
"mod_compat.flywheel.InstancingEngineAccessor",
"mod_compat.flywheel.MixinBlockEntityInstanceManager",
"mod_compat.flywheel.MixinInstanceManager",
Expand Down
4 changes: 4 additions & 0 deletions fabric/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ dependencies {
include(modImplementation("net.fabricmc:fabric-language-kotlin:${kotlin_fabric_version}"))
include(modImplementation("me.shedaniel.cloth:cloth-config-fabric:${cloth_config_version}"))

modImplementation("maven.modrinth:create-utilities:${create_utilities_version}")
modImplementation("maven.modrinth:sodium:${sodium_version}")
// Disable indium until we update sodium to newer versions
// modRuntimeOnly("maven.modrinth:indium:${indium_version}")
Expand All @@ -48,6 +49,9 @@ dependencies {
// Depend on the fabric API
modImplementation("net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}")

modImplementation("teamreborn:energy:${energy_version}") {
transitive = false
}

implementation("org.valkyrienskies.core:impl:${rootProject.vs_core_version}") {
exclude module: "netty-buffer"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.valkyrienskies.mod.mixin.mod_compat.create.client.trackOutlines;
package org.valkyrienskies.mod.fabric.mixin.compat.create.client.trackOutlines;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"compat.create.MixinBlockBreakingKineticTileEntity",
"compat.create.MixinBlocks",
"compat.create.MixinControlledContraptionEntity",
"compat.create.client.trackOutlines.MixinTrackBlockOutline",
"compat.sodium.MixinRenderSectionManager",
"feature.explosions.ClipContextMixin",
"server.network.MixinServerGamePacketListenerImpl",
Expand Down
4 changes: 4 additions & 0 deletions forge/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ dependencies {
// CC Tweaked
modCompileOnly("maven.modrinth:cc-tweaked:${cc_tweaked_version}")

modImplementation("maven.modrinth:create-utilities:${create_utilities_version}")
modImplementation("teamreborn:energy:${energy_version}") {
transitive = false
}
// TIS-3d
modCompileOnly("maven.modrinth:tis3d:${tis3d_version}")

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package org.valkyrienskies.mod.forge.mixin.compat.create.client.trackOutlines;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.simibubi.create.content.trains.track.TrackBlockOutline;
import com.simibubi.create.content.trains.track.TrackBlockOutline.BezierPointSelection;
import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.client.event.RenderHighlightEvent.Block;
import org.joml.Quaterniond;
import org.joml.Vector3d;
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.ModifyArg;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import org.valkyrienskies.core.api.ships.Ship;
import org.valkyrienskies.core.impl.game.ships.ShipObjectClient;
import org.valkyrienskies.mod.common.VSClientGameUtils;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.common.util.VectorConversionsMCKt;

@Mixin(value = TrackBlockOutline.class, remap = false)
public class MixinTrackBlockOutline {
@Unique
private static Vec3 valkyrienskies$cameraVec3;
@Unique
private static Vec3 valkyrienskies$vec;
@Unique
private static Vec3 valkyrienskies$angles;

@Inject(method = "drawCurveSelection(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;Lnet/minecraft/world/phys/Vec3;)V",
at = @At(value = "INVOKE",
target = "Lcom/simibubi/create/content/trains/track/TrackBlockOutline$BezierPointSelection;angles()Lnet/minecraft/world/phys/Vec3;"),
locals = LocalCapture.CAPTURE_FAILHARD)
private static void harvestDrawCurveSelection(final PoseStack ms, final MultiBufferSource buffer, final Vec3 camera,
final CallbackInfo ci, final Minecraft mc,
final BezierPointSelection result, final VertexConsumer vb, final Vec3 vec) {

valkyrienskies$cameraVec3 = camera;
valkyrienskies$vec = result.vec();
valkyrienskies$angles = result.angles();
}

@ModifyArg(method = "drawCurveSelection(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;Lnet/minecraft/world/phys/Vec3;)V",
at = @At(value = "INVOKE",
target = "Lcom/simibubi/create/content/trains/track/TrackBlockOutline;renderShape(Lnet/minecraft/world/phys/shapes/VoxelShape;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;Ljava/lang/Boolean;)V"),
index = 1)
private static PoseStack redirectTransformStackTranslate(final PoseStack ms) {

final Level level = Minecraft.getInstance().level;
if (level != null && valkyrienskies$vec != null) {
final ShipObjectClient ship;
if ((ship = (ShipObjectClient) VSGameUtilsKt.getShipManagingPos(level, valkyrienskies$vec)) != null) {
final Quaterniond rotation = new Quaterniond().identity();
final Quaterniond yawQuat = new Quaterniond().rotateY(valkyrienskies$angles.y);
final Quaterniond pitchQuat = new Quaterniond().rotateX(valkyrienskies$angles.x);

yawQuat.mul(pitchQuat, rotation);
ship.getRenderTransform().getShipToWorldRotation().mul(rotation, rotation);

final Vector3d worldVec = ship.getRenderTransform().getShipToWorld()
.transformPosition(
new Vector3d(valkyrienskies$vec.x, valkyrienskies$vec.y + .125, valkyrienskies$vec.z),
new Vector3d());

ms.popPose();
ms.pushPose();
ms.translate(worldVec.x - valkyrienskies$cameraVec3.x,
worldVec.y - valkyrienskies$cameraVec3.y,
worldVec.z - valkyrienskies$cameraVec3.z);
ms.mulPose(VectorConversionsMCKt.toFloat(rotation));
ms.translate(-.5, -.125f, -.5);
}
}
return ms;
}

@Unique
private static Camera valkyrienskies$info;
@Unique
private static BlockHitResult valkyrienskies$hitResult;

@ModifyArg(method = "drawCustomBlockSelection", at = @At(value = "INVOKE",
target = "Lnet/minecraft/world/level/border/WorldBorder;isWithinBounds(Lnet/minecraft/core/BlockPos;)Z"))
private static BlockPos modIsWithinBounds(final BlockPos blockPos) {
final Level level = Minecraft.getInstance().level;
if (level != null) {
final Ship ship;
if ((ship = VSGameUtilsKt.getShipManagingPos(level, blockPos)) != null) {
return BlockPos.containing(VectorConversionsMCKt.toMinecraft(ship.getShipToWorld()
.transformPosition(VectorConversionsMCKt.toJOMLD(blockPos))));
}
}
return blockPos;
}

@Inject(method = "drawCustomBlockSelection",
at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V"))
private static void harvest(Block event, CallbackInfo ci) {
valkyrienskies$info = event.getCamera();
valkyrienskies$hitResult = (BlockHitResult) event.getTarget();
}

@Redirect(method = "drawCustomBlockSelection",
at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V"))
private static void redirectTranslate(final PoseStack instance, final double d, final double e, final double f) {
final Level level = Minecraft.getInstance().level;
if (level != null) {
final ShipObjectClient ship;
if ((ship = (ShipObjectClient) VSGameUtilsKt.getShipManagingPos(level,
valkyrienskies$hitResult.getBlockPos())) != null) {
final Vec3 camPos = valkyrienskies$info.getPosition();
VSClientGameUtils.transformRenderWithShip(ship.getRenderTransform(), instance,
valkyrienskies$hitResult.getBlockPos(),
camPos.x, camPos.y, camPos.z);
} else {
instance.translate(d, e, f);
}
} else {
instance.translate(d, e, f);
}
}
}
3 changes: 2 additions & 1 deletion forge/src/main/resources/valkyrienskies-forge.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
"compat.create.MixinBlockBreakingKineticTileEntity",
"compat.create.MixinBlocks",
"compat.create.MixinControlledContraptionEntity",
"compat.create.client.trackOutlines.MixinTrackBlockOutline",
"compat.immersivengineering.MixinBlockEntityInventory",
"compat.modular_routers.MixinRouterMenu",
"compat.tfc.MixinTFCChunkGenerator",
"compat.thermalexpansion.MixinTileCoFH",
"compat.tis3d.MixinInfraredPacketEntity",
"compat.modular_routers.MixinRouterMenu",
"feature.forge_interact.MixinIForgePlayer",
"feature.water_in_ships_entity.MixinEntity",
"world.level.block.FireMixin"
Expand Down
2 changes: 2 additions & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ flywheel_version_fabric=0.6.9-6

# https://modrinth.com/mod/create-big-cannons/versions
createbigcannons_version= 0.5.2.a
create_utilities_version=0.2.0+1.20.1
energy_version=2.3.0

vs_core_version=1.1.0+b19b27c4a4
# Prevent kotlin from autoincluding stdlib as a dependency, which breaks
Expand Down

0 comments on commit 521f87a

Please sign in to comment.