From c516c4b94710f60732bd7f2edf48b9a6832fedcb Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Sat, 2 Nov 2024 12:55:51 +0100 Subject: Fix line flickering in ancestral spade solver --- .../kotlin/features/diana/AncestralSpadeSolver.kt | 209 ++++++++++----------- .../kotlin/util/render/RenderInWorldContext.kt | 2 +- .../shaders/core/firmament_rendertype_lines.vsh | 2 +- 3 files changed, 106 insertions(+), 107 deletions(-) (limited to 'src') diff --git a/src/main/kotlin/features/diana/AncestralSpadeSolver.kt b/src/main/kotlin/features/diana/AncestralSpadeSolver.kt index 39ca6d3..ef3ead1 100644 --- a/src/main/kotlin/features/diana/AncestralSpadeSolver.kt +++ b/src/main/kotlin/features/diana/AncestralSpadeSolver.kt @@ -1,4 +1,3 @@ - package moe.nea.firmament.features.diana import kotlin.time.Duration.Companion.seconds @@ -23,109 +22,109 @@ import moe.nea.firmament.util.render.RenderInWorldContext import moe.nea.firmament.util.skyBlockId object AncestralSpadeSolver : SubscriptionOwner { - var lastDing = TimeMark.farPast() - private set - private val pitches = mutableListOf() - val particlePositions = mutableListOf() - var nextGuess: Vec3d? = null - private set - - val ancestralSpadeId = SkyblockId("ANCESTRAL_SPADE") - private var lastTeleportAttempt = TimeMark.farPast() - - fun isEnabled() = - DianaWaypoints.TConfig.ancestralSpadeSolver - && SBData.skyblockLocation == SkyBlockIsland.HUB - && MC.player?.inventory?.containsAny { it.skyBlockId == ancestralSpadeId } == true // TODO: add a reactive property here - - @Subscribe - fun onKeyBind(event: WorldKeyboardEvent) { - if (!isEnabled()) return - if (!event.matches(DianaWaypoints.TConfig.ancestralSpadeTeleport)) return - - if (lastTeleportAttempt.passedTime() < 3.seconds) return - WarpUtil.teleportToNearestWarp(SkyBlockIsland.HUB, nextGuess ?: return) - lastTeleportAttempt = TimeMark.now() - } - - @Subscribe - fun onParticleSpawn(event: ParticleSpawnEvent) { - if (!isEnabled()) return - if (event.particleEffect != ParticleTypes.DRIPPING_LAVA) return - if (event.offset.x != 0.0F || event.offset.y != 0F || event.offset.z != 0F) - return - particlePositions.add(event.position) - if (particlePositions.size > 20) { - particlePositions.removeFirst() - } - } - - @Subscribe - fun onPlaySound(event: SoundReceiveEvent) { - if (!isEnabled()) return - if (!SoundEvents.BLOCK_NOTE_BLOCK_HARP.matchesId(event.sound.value().id)) return - - if (lastDing.passedTime() > 1.seconds) { - particlePositions.clear() - pitches.clear() - } - lastDing = TimeMark.now() - - pitches.add(event.pitch) - if (pitches.size > 20) { - pitches.removeFirst() - } - - if (particlePositions.size < 3) { - return - } - - val averagePitchDelta = - if (pitches.isEmpty()) return - else pitches - .zipWithNext { a, b -> b - a } - .average() - - val soundDistanceEstimate = (Math.E / averagePitchDelta) - particlePositions.first().distanceTo(event.position) - - if (soundDistanceEstimate > 1000) { - return - } - - val lastParticleDirection = particlePositions - .takeLast(3) - .let { (a, _, b) -> b.subtract(a) } - .normalize() - - nextGuess = event.position.add(lastParticleDirection.multiply(soundDistanceEstimate)) - } - - @Subscribe - fun onWorldRender(event: WorldRenderLastEvent) { - if (!isEnabled()) return - RenderInWorldContext.renderInWorld(event) { - nextGuess?.let { - color(1f, 1f, 0f, 0.5f) - tinyBlock(it, 1f) - color(1f, 1f, 0f, 1f) - tracer(it, lineWidth = 3f) - } - if (particlePositions.size > 2 && lastDing.passedTime() < 10.seconds && nextGuess != null) { - color(0f, 1f, 0f, 0.7f) - line(particlePositions) - } - } - } - - @Subscribe - fun onSwapWorld(event: WorldReadyEvent) { - nextGuess = null - particlePositions.clear() - pitches.clear() - lastDing = TimeMark.farPast() - } - - override val delegateFeature: FirmamentFeature - get() = DianaWaypoints + var lastDing = TimeMark.farPast() + private set + private val pitches = mutableListOf() + val particlePositions = mutableListOf() + var nextGuess: Vec3d? = null + private set + + val ancestralSpadeId = SkyblockId("ANCESTRAL_SPADE") + private var lastTeleportAttempt = TimeMark.farPast() + + fun isEnabled() = + DianaWaypoints.TConfig.ancestralSpadeSolver + && SBData.skyblockLocation == SkyBlockIsland.HUB + && MC.player?.inventory?.containsAny { it.skyBlockId == ancestralSpadeId } == true // TODO: add a reactive property here + + @Subscribe + fun onKeyBind(event: WorldKeyboardEvent) { + if (!isEnabled()) return + if (!event.matches(DianaWaypoints.TConfig.ancestralSpadeTeleport)) return + + if (lastTeleportAttempt.passedTime() < 3.seconds) return + WarpUtil.teleportToNearestWarp(SkyBlockIsland.HUB, nextGuess ?: return) + lastTeleportAttempt = TimeMark.now() + } + + @Subscribe + fun onParticleSpawn(event: ParticleSpawnEvent) { + if (!isEnabled()) return + if (event.particleEffect != ParticleTypes.DRIPPING_LAVA) return + if (event.offset.x != 0.0F || event.offset.y != 0F || event.offset.z != 0F) + return + particlePositions.add(event.position) + if (particlePositions.size > 20) { + particlePositions.removeFirst() + } + } + + @Subscribe + fun onPlaySound(event: SoundReceiveEvent) { + if (!isEnabled()) return + if (!SoundEvents.BLOCK_NOTE_BLOCK_HARP.matchesId(event.sound.value().id)) return + + if (lastDing.passedTime() > 1.seconds) { + particlePositions.clear() + pitches.clear() + } + lastDing = TimeMark.now() + + pitches.add(event.pitch) + if (pitches.size > 20) { + pitches.removeFirst() + } + + if (particlePositions.size < 3) { + return + } + + val averagePitchDelta = + if (pitches.isEmpty()) return + else pitches + .zipWithNext { a, b -> b - a } + .average() + + val soundDistanceEstimate = (Math.E / averagePitchDelta) - particlePositions.first().distanceTo(event.position) + + if (soundDistanceEstimate > 1000) { + return + } + + val lastParticleDirection = particlePositions + .takeLast(3) + .let { (a, _, b) -> b.subtract(a) } + .normalize() + + nextGuess = event.position.add(lastParticleDirection.multiply(soundDistanceEstimate)) + } + + @Subscribe + fun onWorldRender(event: WorldRenderLastEvent) { + if (!isEnabled()) return + RenderInWorldContext.renderInWorld(event) { + nextGuess?.let { + color(1f, 1f, 0f, 0.5f) + tinyBlock(it, 1f) + color(1f, 1f, 0f, 1f) + tracer(it, lineWidth = 3f) + } + if (particlePositions.size > 2 && lastDing.passedTime() < 10.seconds && nextGuess != null) { + color(0f, 1f, 0f, 0.7f) + line(particlePositions) + } + } + } + + @Subscribe + fun onSwapWorld(event: WorldReadyEvent) { + nextGuess = null + particlePositions.clear() + pitches.clear() + lastDing = TimeMark.farPast() + } + + override val delegateFeature: FirmamentFeature + get() = DianaWaypoints } diff --git a/src/main/kotlin/util/render/RenderInWorldContext.kt b/src/main/kotlin/util/render/RenderInWorldContext.kt index 75f2fad..b61b9aa 100644 --- a/src/main/kotlin/util/render/RenderInWorldContext.kt +++ b/src/main/kotlin/util/render/RenderInWorldContext.kt @@ -172,7 +172,7 @@ class RenderInWorldContext private constructor( points.zipWithNext().forEach { (a, b) -> val normal = Vector3f(b.x.toFloat(), b.y.toFloat(), b.z.toFloat()) .sub(a.x.toFloat(), a.y.toFloat(), a.z.toFloat()) -// .normalize() + .normalize() val lastNormal0 = lastNormal ?: normal lastNormal = normal buffer.vertex(matrix.positionMatrix, a.x.toFloat(), a.y.toFloat(), a.z.toFloat()) diff --git a/src/main/resources/assets/minecraft/shaders/core/firmament_rendertype_lines.vsh b/src/main/resources/assets/minecraft/shaders/core/firmament_rendertype_lines.vsh index 35892be..b2d0f99 100644 --- a/src/main/resources/assets/minecraft/shaders/core/firmament_rendertype_lines.vsh +++ b/src/main/resources/assets/minecraft/shaders/core/firmament_rendertype_lines.vsh @@ -37,7 +37,7 @@ void main() { gl_Position = vec4(-2.0, -2.0, -2.0, 1.0); return; // I don't care for these people } - if (linePosStartBehind || linePosEndBehind) { + if ((linePosStartBehind || linePosEndBehind) && false) { ndc1.z = 0.0; ndc2.z = 0.0; linePosStart.w = 1.0; -- cgit