diff --git a/common/src/main/java/nx/pingwheel/common/core/PingController.java b/common/src/main/java/nx/pingwheel/common/core/PingController.java index 845935b..02e216c 100644 --- a/common/src/main/java/nx/pingwheel/common/core/PingController.java +++ b/common/src/main/java/nx/pingwheel/common/core/PingController.java @@ -64,6 +64,13 @@ private static void performPingAction(float tickDelta) { cameraEntity.isCrouching()); if (hitResult == null || hitResult.getType() == HitResult.Type.MISS) { + if (ModContext.HasVoxy) { + var voxyHitResult = Raycast.traceVoxy(cameraDirection, tickDelta, CLIENT_CONFIG.getPingDistance()); + if (voxyHitResult != null && voxyHitResult.getType() != HitResult.Type.MISS) { + IPlatformNetworkService.INSTANCE.sendToServer(new PingLocationC2SPacket(CLIENT_CONFIG.getChannel(), voxyHitResult.getLocation(), null, pingSequence, GameContext.getDimension())); + return; + } + } if (ModContext.HasDistantHorizons) { Raycast.traceDistantAsync(cameraDirection, tickDelta, (distantHitResult) -> { IPlatformNetworkService.INSTANCE.sendToServer(new PingLocationC2SPacket(CLIENT_CONFIG.getChannel(), distantHitResult.getLocation(), null, pingSequence, GameContext.getDimension())); diff --git a/common/src/main/java/nx/pingwheel/common/integration/ModContext.java b/common/src/main/java/nx/pingwheel/common/integration/ModContext.java index b1b23c6..052dae8 100644 --- a/common/src/main/java/nx/pingwheel/common/integration/ModContext.java +++ b/common/src/main/java/nx/pingwheel/common/integration/ModContext.java @@ -9,11 +9,13 @@ public class ModContext { private ModContext() {} public static boolean HasDistantHorizons = false; + public static boolean HasVoxy = false; public static boolean HasVoiceChat = false; public static boolean HasFTBTeams = false; public static void indexMods() { HasDistantHorizons = IPlatformContextService.INSTANCE.isModLoaded("distanthorizons"); + HasVoxy = IPlatformContextService.INSTANCE.isModLoaded("voxy"); HasVoiceChat = IPlatformContextService.INSTANCE.isModLoaded("voicechat"); HasFTBTeams = IPlatformContextService.INSTANCE.isModLoaded("ftbteams"); diff --git a/common/src/main/java/nx/pingwheel/common/math/Raycast.java b/common/src/main/java/nx/pingwheel/common/math/Raycast.java index bdf01db..28e019b 100644 --- a/common/src/main/java/nx/pingwheel/common/math/Raycast.java +++ b/common/src/main/java/nx/pingwheel/common/math/Raycast.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.ClipContext; import net.minecraft.world.phys.*; +import java.lang.reflect.Method; import java.time.Duration; import java.time.Instant; import java.util.Optional; @@ -69,6 +70,43 @@ public static void traceDistantAsync(Vec3 direction, float tickDelta, Consumer Optional.ofNullable(result).ifPresent(callback)); } + public static BlockHitResult traceVoxy(Vec3 direction, float tickDelta, double maxDistance) { + try { + var cameraEntity = Game.getCameraEntity(); + + if (cameraEntity == null || cameraEntity.level() == null) { + return null; + } + + var rayStartVec = cameraEntity.getEyePosition(tickDelta); + + var apiClass = Class.forName("me.cortex.voxy.client.api.VoxyRaycastAPI"); + var raycastMethod = apiClass.getMethod("raycast", + net.minecraft.world.level.Level.class, + Vec3.class, + Vec3.class, + double.class); + var result = raycastMethod.invoke(null, + cameraEntity.level(), + rayStartVec, + direction, + maxDistance); + + if (result == null) { + return null; + } + + var resultClass = result.getClass(); + var pos = (BlockPos) resultClass.getMethod("blockPos").invoke(result); + var hitLoc = (Vec3) resultClass.getMethod("hitLocation").invoke(result); + var face = (Direction) resultClass.getMethod("face").invoke(result); + + return new BlockHitResult(hitLoc, face, pos, true); + } catch (Exception e) { + return null; + } + } + public static HitResult traceDirectional(Vec3 direction, float tickDelta, double maxDistance,