From ca13ca5fb4b8351e34adacf161fb0f6384f43a63 Mon Sep 17 00:00:00 2001 From: Butterscotch! Date: Wed, 9 Oct 2024 11:25:53 -0400 Subject: [PATCH] Restrict mounting reset on server by tracker reset status (#1169) Co-authored-by: lucas lelievre --- .../src/main/java/dev/slimevr/status/StatusSystem.kt | 4 ++++ .../slimevr/tracking/processor/skeleton/HumanSkeleton.kt | 7 +++++++ .../tracking/processor/skeleton/TapDetectionManager.java | 9 +++++++++ 3 files changed, 20 insertions(+) diff --git a/server/core/src/main/java/dev/slimevr/status/StatusSystem.kt b/server/core/src/main/java/dev/slimevr/status/StatusSystem.kt index 5a5d0a92f..d7723a450 100644 --- a/server/core/src/main/java/dev/slimevr/status/StatusSystem.kt +++ b/server/core/src/main/java/dev/slimevr/status/StatusSystem.kt @@ -56,6 +56,10 @@ class StatusSystem { it.onStatusRemoved(id) } } + + fun hasStatusType(dataType: Byte): Boolean = statuses.any { + it.value.type == dataType + } } interface StatusListener { diff --git a/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.kt b/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.kt index 3c2c0b5ca..ac8fc42aa 100644 --- a/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.kt +++ b/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.kt @@ -26,6 +26,7 @@ import io.github.axisangles.ktmath.Vector3 import io.github.axisangles.ktmath.Vector3.Companion.NEG_Y import io.github.axisangles.ktmath.Vector3.Companion.NULL import io.github.axisangles.ktmath.Vector3.Companion.POS_Y +import solarxr_protocol.rpc.StatusData import java.lang.IllegalArgumentException import kotlin.properties.Delegates @@ -1102,6 +1103,12 @@ class HumanSkeleton( @VRServerThread fun resetTrackersMounting(resetSourceName: String?) { + val server = humanPoseManager.server + if (server != null && server.statusSystem.hasStatusType(StatusData.StatusTrackerReset)) { + LogManager.info("[HumanSkeleton] Reset: mounting ($resetSourceName) failed, reset required") + return + } + // Resets the mounting orientation of the trackers with the HMD as reference. var referenceRotation = IDENTITY headTracker?.let { diff --git a/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/TapDetectionManager.java b/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/TapDetectionManager.java index 298b8459a..6e32e2693 100644 --- a/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/TapDetectionManager.java +++ b/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/TapDetectionManager.java @@ -1,12 +1,14 @@ package dev.slimevr.tracking.processor.skeleton; +import dev.slimevr.VRServer; import dev.slimevr.config.TapDetectionConfig; import dev.slimevr.reset.ResetHandler; import dev.slimevr.setup.TapSetupHandler; import dev.slimevr.tracking.processor.HumanPoseManager; import dev.slimevr.tracking.trackers.Tracker; import solarxr_protocol.rpc.ResetType; +import solarxr_protocol.rpc.StatusData; import java.util.ArrayList; import java.util.List; @@ -192,6 +194,13 @@ public class TapDetectionManager { } private void checkMountingReset() { + // Don't allow mounting if tracker needs reset + VRServer server = humanPoseManager.getServer(); + if (server != null && server.statusSystem.hasStatusType(StatusData.StatusTrackerReset)) { + mountingResetDetector.resetDetector(); + return; + } + boolean tapped = (mountingResetTaps <= mountingResetDetector.getTaps()); if (tapped && mountingResetAllowPlaySound) {