From a005339fcc3e8c8999ac43eb52ab7ab46f50f83a Mon Sep 17 00:00:00 2001 From: Tribulla Date: Sat, 16 May 2026 18:25:56 +0300 Subject: [PATCH 1/2] add support for VS2.5. --- .../trackwork/wheel/WheelEntity.java | 68 +++++++++++++++---- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/src/main/java/edn/stratodonut/trackwork/wheel/WheelEntity.java b/src/main/java/edn/stratodonut/trackwork/wheel/WheelEntity.java index 4208586..01316f9 100644 --- a/src/main/java/edn/stratodonut/trackwork/wheel/WheelEntity.java +++ b/src/main/java/edn/stratodonut/trackwork/wheel/WheelEntity.java @@ -1,29 +1,30 @@ package edn.stratodonut.trackwork.wheel; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; -import org.apache.logging.log4j.core.jmx.Server; import org.jetbrains.annotations.NotNull; import org.joml.Matrix3d; import org.joml.Quaterniond; +import org.joml.Quaterniondc; import org.joml.Vector3d; import org.joml.Vector3dc; import org.valkyrienskies.core.api.ships.properties.ShipInertiaData; import org.valkyrienskies.core.api.ships.properties.ShipTransform; -import org.valkyrienskies.core.internal.ShipTeleportData; import org.valkyrienskies.core.internal.physics.PhysicsEntityData; import org.valkyrienskies.core.internal.physics.PhysicsEntityServer; import org.valkyrienskies.core.internal.physics.VSSphereCollisionShapeData; -import org.valkyrienskies.core.internal.world.VsiServerShipWorld; import org.valkyrienskies.mod.common.VSGameUtilsKt; import org.valkyrienskies.mod.common.util.DimensionIdProvider; import javax.annotation.Nullable; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import static org.valkyrienskies.mod.common.ValkyrienSkiesMod.getVsCore; public class WheelEntity { + private static volatile Method newShipTeleportDataMethod; + private static volatile Method teleportPhysicsEntityMethod; + public static @Nullable PhysicsEntityServer getInLevel(ServerLevel level, long id) { if (!aliveInLevel(level, id)) { return null; @@ -54,19 +55,56 @@ public static boolean moveTo(ServerLevel level, long id, Vector3dc pos) { PhysicsEntityServer serverData = VSGameUtilsKt.getShipObjectWorld(level) .retrieveLoadedPhysicsEntities().get(id); - ShipTeleportData teleportData = getVsCore().newShipTeleportData( - pos, - new Quaterniond(), - new Vector3d(), - new Vector3d(), - null, - null, - null - ); - VSGameUtilsKt.getShipObjectWorld(level).teleportPhysicsEntity(serverData, teleportData); + Object vsCore = getVsCore(); + Object shipWorld = VSGameUtilsKt.getShipObjectWorld(level); + try { + Method create = newShipTeleportDataMethod; + if (create == null) { + create = vsCore.getClass().getMethod( + "newShipTeleportData", + Vector3dc.class, Quaterniondc.class, Vector3dc.class, Vector3dc.class, + String.class, Double.class, Vector3dc.class + ); + newShipTeleportDataMethod = create; + } + Object teleportData = create.invoke(vsCore, + pos, + new Quaterniond(), + new Vector3d(), + new Vector3d(), + null, + null, + null + ); + + Method teleport = teleportPhysicsEntityMethod; + if (teleport == null) { + teleport = findTeleportPhysicsEntity(shipWorld.getClass()); + teleportPhysicsEntityMethod = teleport; + } + teleport.invoke(shipWorld, serverData, teleportData); + } catch (NoSuchMethodException | IllegalAccessException e) { + throw new RuntimeException("Trackwork: incompatible Valkyrien Skies version, could not teleport wheel physics entity", e); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) throw (RuntimeException) cause; + if (cause instanceof Error) throw (Error) cause; + throw new RuntimeException("Trackwork: failed to teleport wheel physics entity", cause); + } return true; } + private static Method findTeleportPhysicsEntity(Class shipWorldClass) throws NoSuchMethodException { + for (Method m : shipWorldClass.getMethods()) { + if (!"teleportPhysicsEntity".equals(m.getName())) continue; + if (m.getParameterCount() != 2) continue; + if (m.getParameterTypes()[0].isAssignableFrom(PhysicsEntityServer.class)) { + return m; + } + } + throw new NoSuchMethodException("teleportPhysicsEntity(PhysicsEntityServer, ShipTeleportData) not found on " + shipWorldClass.getName()); + } + public static final class DataBuilder { private DataBuilder() { } From 5b6d90a0799ab25eb339edde6f87859f2d00ec04 Mon Sep 17 00:00:00 2001 From: Tribulla Date: Sat, 16 May 2026 19:19:12 +0300 Subject: [PATCH 2/2] fix raycast hitting the host ship --- src/main/java/edn/stratodonut/trackwork/TrackworkUtil.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/edn/stratodonut/trackwork/TrackworkUtil.java b/src/main/java/edn/stratodonut/trackwork/TrackworkUtil.java index 3a6daa5..6f1b16c 100644 --- a/src/main/java/edn/stratodonut/trackwork/TrackworkUtil.java +++ b/src/main/java/edn/stratodonut/trackwork/TrackworkUtil.java @@ -16,6 +16,7 @@ import org.valkyrienskies.core.api.world.PhysLevel; import javax.annotation.Nonnull; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -71,8 +72,11 @@ public record ClipResult(@Nonnull Vector3dc trackTangent, @Nullable Vector3dc su throw new IllegalArgumentException(String.format("Invalid clip order. Must be 0, 1 or 2, received %d", order)); } + long[] ignoredIds = Arrays.copyOf(ignoreWheelIds, ignoreWheelIds.length + 1); + ignoredIds[ignoredIds.length - 1] = ship.getId(); + Optional accumResult = points - .map(p -> physLevel.rayCast(p, normal, clipVector.length(), ignoreWheelIds)) + .map(p -> physLevel.rayCast(p, normal, clipVector.length(), ignoredIds)) .filter(Objects::nonNull) .filter(result -> result.getHitBody().getId() != ship.getId()) .map(result -> new ReducedRayCastResult(result.getDistance(), result.getVelocity()))