Fix line flickering in ancestral spade solver

This commit is contained in:
Linnea Gräf
2024-11-02 12:55:51 +01:00
parent 8b410fbdf2
commit c516c4b947
3 changed files with 89 additions and 90 deletions

View File

@@ -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<Float>()
val particlePositions = mutableListOf<Vec3d>()
var nextGuess: Vec3d? = null
private set
var lastDing = TimeMark.farPast()
private set
private val pitches = mutableListOf<Float>()
val particlePositions = mutableListOf<Vec3d>()
var nextGuess: Vec3d? = null
private set
val ancestralSpadeId = SkyblockId("ANCESTRAL_SPADE")
private var lastTeleportAttempt = TimeMark.farPast()
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
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
@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()
}
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 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
@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()
if (lastDing.passedTime() > 1.seconds) {
particlePositions.clear()
pitches.clear()
}
lastDing = TimeMark.now()
pitches.add(event.pitch)
if (pitches.size > 20) {
pitches.removeFirst()
}
pitches.add(event.pitch)
if (pitches.size > 20) {
pitches.removeFirst()
}
if (particlePositions.size < 3) {
return
}
if (particlePositions.size < 3) {
return
}
val averagePitchDelta =
if (pitches.isEmpty()) return
else pitches
.zipWithNext { a, b -> b - a }
.average()
val averagePitchDelta =
if (pitches.isEmpty()) return
else pitches
.zipWithNext { a, b -> b - a }
.average()
val soundDistanceEstimate = (Math.E / averagePitchDelta) - particlePositions.first().distanceTo(event.position)
val soundDistanceEstimate = (Math.E / averagePitchDelta) - particlePositions.first().distanceTo(event.position)
if (soundDistanceEstimate > 1000) {
return
}
if (soundDistanceEstimate > 1000) {
return
}
val lastParticleDirection = particlePositions
.takeLast(3)
.let { (a, _, b) -> b.subtract(a) }
.normalize()
val lastParticleDirection = particlePositions
.takeLast(3)
.let { (a, _, b) -> b.subtract(a) }
.normalize()
nextGuess = event.position.add(lastParticleDirection.multiply(soundDistanceEstimate))
}
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 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()
}
@Subscribe
fun onSwapWorld(event: WorldReadyEvent) {
nextGuess = null
particlePositions.clear()
pitches.clear()
lastDing = TimeMark.farPast()
}
override val delegateFeature: FirmamentFeature
get() = DianaWaypoints
override val delegateFeature: FirmamentFeature
get() = DianaWaypoints
}

View File

@@ -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())

View File

@@ -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;