From ab886886e6cdccab6b4fd573dce612242c442138 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Mar 2026 21:59:10 +0000 Subject: [PATCH 1/2] Initial plan From 4d94922448e636999467838032278be4cacf3aab Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Mar 2026 22:07:15 +0000 Subject: [PATCH 2/2] fix: preserve recompute worker job across stop/start cycles in SurfVisualizerAreaImpl Co-authored-by: twisti-dev <76837088+twisti-dev@users.noreply.github.com> Agent-Logs-Url: https://github.com/SLNE-Development/surf-api/sessions/a087fbec-b95d-49bd-aec5-8fb163cb2aff --- .../visualizer/SurfVisualizerAreaImpl.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/surf-api-bukkit/surf-api-bukkit-server/src/main/kotlin/dev/slne/surf/surfapi/bukkit/server/impl/visualizer/visualizer/SurfVisualizerAreaImpl.kt b/surf-api-bukkit/surf-api-bukkit-server/src/main/kotlin/dev/slne/surf/surfapi/bukkit/server/impl/visualizer/visualizer/SurfVisualizerAreaImpl.kt index 27212c44..6d4ca876 100644 --- a/surf-api-bukkit/surf-api-bukkit-server/src/main/kotlin/dev/slne/surf/surfapi/bukkit/server/impl/visualizer/visualizer/SurfVisualizerAreaImpl.kt +++ b/surf-api-bukkit/surf-api-bukkit-server/src/main/kotlin/dev/slne/surf/surfapi/bukkit/server/impl/visualizer/visualizer/SurfVisualizerAreaImpl.kt @@ -39,6 +39,8 @@ class SurfVisualizerAreaImpl( plugin.scope.coroutineContext + SupervisorJob(plugin.scope.coroutineContext[Job]) ) + private val workerJob: Job + override var settings: BlockDisplaySettings = initialSettings ?: BlockDisplaySettings.create { blockData = SurfVisualizer.DEFAULT_BLOCK_TYPE.createBlockData() } @@ -53,7 +55,7 @@ class SurfVisualizerAreaImpl( launchRecompute() } - scope.launch { + workerJob = scope.launch { computationChannel.consumeEach { recompute() } @@ -100,7 +102,7 @@ class SurfVisualizerAreaImpl( } private suspend fun recompute() { - if (delegate.isClosed()) return + if (delegate.isClosed() || !isVisualizing()) return val cornersSnapshot = ObjectLinkedOpenHashSet(corners) val settingsSnapshot = settings.clone() @@ -109,6 +111,7 @@ class SurfVisualizerAreaImpl( if (!delegate.checkNotNullWorld()) return currentCoroutineContext().ensureActive() + if (!isVisualizing()) return val hull = cornersSnapshot.convexHull2D() val edgePoints = ObjectLinkedOpenHashSet() @@ -121,6 +124,7 @@ class SurfVisualizerAreaImpl( } currentCoroutineContext().ensureActive() + if (!isVisualizing()) return val finalEdgePoints: ObjectSet = if (useHighestYBlock) { edgePoints.map { it.toInt() } @@ -132,10 +136,12 @@ class SurfVisualizerAreaImpl( } currentCoroutineContext().ensureActive() + if (!isVisualizing()) return if (placeDelay.isPositive()) { for ((i, point) in finalEdgePoints.withIndex()) { currentCoroutineContext().ensureActive() + if (!isVisualizing()) return delegate.addVisualLocation(point, settingsSnapshot) if (i < finalEdgePoints.size - 1) { delay(placeDelay) @@ -153,7 +159,9 @@ class SurfVisualizerAreaImpl( } override fun stopVisualizing(): Boolean { - scope.coroutineContext[Job]?.children?.forEach { it.cancel() } + scope.coroutineContext[Job]?.children?.forEach { child -> + if (child !== workerJob) child.cancel() + } return delegate.stopVisualizing() }