Fix line flickering in ancestral spade solver
This commit is contained in:
@@ -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
|
||||
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user