aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleLine.kt112
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleWaypoint.kt1
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt2
4 files changed, 117 insertions, 0 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
index f814e0bef..cae61fe89 100644
--- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
+++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
@@ -228,6 +228,7 @@ import at.hannibal2.skyhanni.features.garden.inventory.plots.GardenPlotIcon
import at.hannibal2.skyhanni.features.garden.inventory.plots.GardenPlotMenuHighlighting
import at.hannibal2.skyhanni.features.garden.pests.PestAPI
import at.hannibal2.skyhanni.features.garden.pests.PestFinder
+import at.hannibal2.skyhanni.features.garden.pests.PestParticleLine
import at.hannibal2.skyhanni.features.garden.pests.PestParticleWaypoint
import at.hannibal2.skyhanni.features.garden.pests.PestProfitTracker
import at.hannibal2.skyhanni.features.garden.pests.PestSpawn
@@ -863,6 +864,7 @@ class SkyHanniMod {
loadModule(PestFinder())
loadModule(PestParticleWaypoint())
loadModule(StereoHarmonyDisplay())
+ loadModule(PestParticleLine())
loadModule(SprayFeatures())
loadModule(DojoRankDisplay())
loadModule(SprayDisplay())
diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleLine.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleLine.kt
new file mode 100644
index 000000000..a88310e37
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleLine.kt
@@ -0,0 +1,112 @@
+package at.hannibal2.skyhanni.features.garden.pests
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.data.ClickType
+import at.hannibal2.skyhanni.events.ItemClickEvent
+import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent
+import at.hannibal2.skyhanni.events.ReceiveParticleEvent
+import at.hannibal2.skyhanni.features.garden.GardenAPI
+import at.hannibal2.skyhanni.test.GriffinUtils.drawWaypointFilled
+import at.hannibal2.skyhanni.utils.DelayedRun
+import at.hannibal2.skyhanni.utils.LorenzColor
+import at.hannibal2.skyhanni.utils.LorenzUtils.isAnyOf
+import at.hannibal2.skyhanni.utils.LorenzVec
+import at.hannibal2.skyhanni.utils.RenderUtils.draw3DLine_nea
+import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText
+import at.hannibal2.skyhanni.utils.SimpleTimeMark
+import net.minecraft.util.EnumParticleTypes
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import kotlin.time.Duration.Companion.seconds
+
+// TODO remove this workaround once PestParticleWaypoint does work again
+class PestParticleLine {
+ private val config get() = SkyHanniMod.feature.garden.pests.pestWaypoint
+
+ class ParticleLocation(val location: LorenzVec, val spawnTime: SimpleTimeMark)
+
+ private var lastPestTrackerUse = SimpleTimeMark.farPast()
+ private val locations = mutableListOf<MutableList<ParticleLocation>>()
+
+ @SubscribeEvent
+ fun onItemClick(event: ItemClickEvent) {
+ if (!isEnabled()) return
+ if (PestAPI.hasVacuumInHand()) {
+ if (event.clickType == ClickType.LEFT_CLICK) {
+ lastPestTrackerUse = SimpleTimeMark.now()
+ }
+ }
+ }
+
+ @SubscribeEvent
+ fun onReceiveParticle(event: ReceiveParticleEvent) {
+ if (!isEnabled()) return
+ // TODO time in config
+ if (lastPestTrackerUse.passedSince() > 5.seconds) return
+
+ if (event.type.isAnyOf(EnumParticleTypes.ENCHANTMENT_TABLE, EnumParticleTypes.VILLAGER_ANGRY)) {
+ if (config.hideParticles) event.cancel()
+ }
+
+ if (event.type != EnumParticleTypes.VILLAGER_ANGRY) return
+ val location = event.location
+
+ // run in main thread to avoid concurrent errors
+ DelayedRun.runNextTick {
+ getCurrentList(location).add(ParticleLocation(location, SimpleTimeMark.now()))
+ }
+ }
+
+ private fun getCurrentList(location: LorenzVec): MutableList<ParticleLocation> {
+ locations.lastOrNull()?.let {
+ val distance = it.last().location.distance(location)
+ if (distance < 4) {
+ return it
+ }
+ }
+
+ val newList = mutableListOf<ParticleLocation>()
+ locations.add(newList)
+ if (locations.size == 5) {
+ locations.removeAt(0)
+ }
+ return newList
+ }
+
+ @SubscribeEvent
+ fun onRenderWorld(event: LorenzRenderWorldEvent) {
+ if (!isEnabled()) return
+ // TODO time in config
+ if (lastPestTrackerUse.passedSince() > 10.seconds) {
+ locations.clear()
+ return
+ }
+
+ for (list in locations) {
+ draw(event, list)
+ }
+ }
+
+ private fun draw(event: LorenzRenderWorldEvent, list: List<ParticleLocation>) {
+ val color = LorenzColor.YELLOW.toColor()
+ for ((prev, next) in list.asSequence().zipWithNext()) {
+ // TODO time in config
+ if (next.spawnTime.passedSince() > 5.seconds) continue
+ val location = next.location
+ event.draw3DLine_nea(
+ prev.location,
+ location,
+ color,
+ 3,
+ false
+ )
+ val isVeryLast = list == locations.lastOrNull() && next == list.lastOrNull()
+ if (isVeryLast) {
+ val lastLocation = location.add(-0.5, -0.5, -0.5)
+ event.drawWaypointFilled(lastLocation, color, beacon = true)
+ event.drawDynamicText(lastLocation, "§ePest Guess", 1.3)
+ }
+ }
+ }
+
+ fun isEnabled() = GardenAPI.inGarden() && config.enabled
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleWaypoint.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleWaypoint.kt
index 45fc2f50d..968601e92 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleWaypoint.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleWaypoint.kt
@@ -28,6 +28,7 @@ import java.awt.Color
import kotlin.math.absoluteValue
import kotlin.time.Duration.Companion.seconds
+// TODO delete workaround class PestParticleLine when this class works again
class PestParticleWaypoint {
private val config get() = SkyHanniMod.feature.garden.pests.pestWaypoint
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt
index 815bc13aa..664eb86b9 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt
@@ -334,6 +334,8 @@ object LorenzUtils {
inline fun <reified T : Enum<T>> enumJoinToPattern(noinline transform: (T) -> CharSequence = { it.name }) =
enumValues<T>().joinToString("|", transform = transform)
+ inline fun <reified T : Enum<T>> T.isAnyOf(vararg array: T): Boolean = array.contains(this)
+
// TODO move to val by lazy
fun isInDevEnvironment() = ((Launch.blackboard ?: mapOf())["fml.deobfuscatedEnvironment"] as Boolean?) ?: true