aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/fishing/FishingAPI.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/fishing/FishingBaitWarnings.kt74
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedCache.kt4
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedSet.kt8
4 files changed, 50 insertions, 38 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingAPI.kt
index f48309bb0..59b14b66b 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingAPI.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingAPI.kt
@@ -106,7 +106,7 @@ object FishingAPI {
fun NEUInternalName.isWaterRod() = this in waterRods
- fun ItemStack.isBait(): Boolean = stackSize == 1 && getItemCategoryOrNull() == ItemCategory.FISHING_BAIT
+ fun ItemStack.isBait(): Boolean = stackSize == 1 && getItemCategoryOrNull() == ItemCategory.BAIT
@SubscribeEvent
fun onItemInHandChange(event: ItemInHandChangeEvent) {
diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingBaitWarnings.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingBaitWarnings.kt
index 8f59a5eed..6773f1341 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingBaitWarnings.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingBaitWarnings.kt
@@ -1,18 +1,21 @@
package at.hannibal2.skyhanni.features.fishing
import at.hannibal2.skyhanni.SkyHanniMod
-import at.hannibal2.skyhanni.events.FishingBobberCastEvent
+import at.hannibal2.skyhanni.api.event.HandleEvent
import at.hannibal2.skyhanni.events.FishingBobberInWaterEvent
import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent
+import at.hannibal2.skyhanni.events.entity.EntityEnterWorldEvent
import at.hannibal2.skyhanni.features.fishing.FishingAPI.isBait
+import at.hannibal2.skyhanni.features.nether.kuudra.KuudraAPI
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.ChatUtils
import at.hannibal2.skyhanni.utils.DelayedRun
-import at.hannibal2.skyhanni.utils.EntityUtils
import at.hannibal2.skyhanni.utils.ItemUtils.name
+import at.hannibal2.skyhanni.utils.LocationUtils.distanceToPlayer
import at.hannibal2.skyhanni.utils.LorenzUtils
-import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators
+import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.SoundUtils
+import at.hannibal2.skyhanni.utils.TimeLimitedSet
import at.hannibal2.skyhanni.utils.getLorenzVec
import net.minecraft.entity.item.EntityItem
import net.minecraft.entity.projectile.EntityFishHook
@@ -25,13 +28,19 @@ object FishingBaitWarnings {
private val config get() = SkyHanniMod.feature.fishing.fishingBaitWarnings
- @SubscribeEvent
- fun onBobberThrow(event: FishingBobberCastEvent) {
+ private data class Bait(
+ private val entity: EntityItem,
+ val name: String = entity.entityItem.name,
+ val location: LorenzVec = entity.getLorenzVec(),
+ ) {
+ fun distanceTo(bobber: EntityFishHook) = location.distance(bobber.getLorenzVec())
}
private var lastBait: String? = null
private var wasUsingBait = true
+ private val baitEntities = TimeLimitedSet<Bait>(750.seconds)
+
@SubscribeEvent
fun onWorldChange(event: LorenzWorldChangeEvent) {
lastBait = null
@@ -40,48 +49,45 @@ object FishingBaitWarnings {
@SubscribeEvent
fun onBobberInWater(event: FishingBobberInWaterEvent) {
+ if (!isEnabled()) return
DelayedRun.runDelayed(500.milliseconds) {
- checkBobber()
+ checkBait()
}
}
- private fun checkBobber() {
+ @HandleEvent(onlyOnSkyblock = true)
+ fun onEntityEnterWorld(event: EntityEnterWorldEvent<EntityItem>) {
+ if (!isEnabled() || !FishingAPI.isFishing()) return
+ if (event.entity.distanceToPlayer() > 10) return
+ DelayedRun.runNextTick {
+ val isBait = event.entity.entityItem.isBait()
+ if (isBait) {
+ baitEntities += Bait(event.entity)
+ }
+ }
+ }
+
+ private fun checkBait() {
val bobber = FishingAPI.bobber ?: return
- val bait = detectBait(bobber)
+ val bait = baitEntities.filter { it.distanceTo(bobber) < 8 }.minByOrNull { it.distanceTo(bobber) }?.name
+ baitEntities.clear()
+
if (bait == null) {
- if (config.noBaitWarning) {
- if (!wasUsingBait) {
- showNoBaitWarning()
- }
+ if (config.noBaitWarning && !wasUsingBait) {
+ showNoBaitWarning()
}
- } else {
- if (config.baitChangeWarning) {
- lastBait?.let {
- if (it != bait) {
- showBaitChangeWarning(it, bait)
- }
+ } else if (config.baitChangeWarning) {
+ lastBait?.let {
+ if (it != bait) {
+ showBaitChangeWarning(it, bait)
}
}
}
+
wasUsingBait = bait != null
lastBait = bait
}
- private fun detectBait(bobber: EntityFishHook): String? {
- for (entity in EntityUtils.getEntitiesNearby<EntityItem>(bobber.getLorenzVec(), 6.0)) {
- val itemStack = entity.entityItem ?: continue
- if (!itemStack.isBait()) continue
- val ticksExisted = entity.ticksExisted
- if (ticksExisted in 6..15) {
- return itemStack.name
- }
-
- val distance = "distance: ${entity.getDistanceToEntity(bobber).addSeparators()}"
- ChatUtils.debug("fishing bait: ticksExisted: $ticksExisted, $distance")
- }
- return null
- }
-
private fun showBaitChangeWarning(before: String, after: String) {
SoundUtils.playClickSound()
LorenzUtils.sendTitle("§eBait changed!", 2.seconds)
@@ -94,5 +100,5 @@ object FishingBaitWarnings {
ChatUtils.chat("You're not using any fishing baits!")
}
- private fun isEnabled() = LorenzUtils.inSkyBlock && FishingAPI.isFishing() && !LorenzUtils.inKuudraFight
+ private fun isEnabled() = LorenzUtils.inSkyBlock && !KuudraAPI.inKuudra()
}
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedCache.kt b/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedCache.kt
index e17389c52..018c858fa 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedCache.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedCache.kt
@@ -4,10 +4,10 @@ import com.google.common.cache.CacheBuilder
import java.util.concurrent.TimeUnit
import kotlin.time.Duration
-class TimeLimitedCache<K: Any, V: Any>(
+class TimeLimitedCache<K : Any, V : Any>(
expireAfterWrite: Duration,
private val removalListener: (K?, V?) -> Unit = { _, _ -> },
-): Iterable<Map.Entry<K, V>> {
+) : Iterable<Map.Entry<K, V>> {
private val cache = CacheBuilder.newBuilder()
.expireAfterWrite(expireAfterWrite.inWholeMilliseconds, TimeUnit.MILLISECONDS)
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedSet.kt b/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedSet.kt
index c0626fccb..4c4a35151 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedSet.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedSet.kt
@@ -5,7 +5,7 @@ import kotlin.time.Duration
class TimeLimitedSet<T : Any>(
expireAfterWrite: Duration,
private val removalListener: (T) -> Unit = {},
-) {
+) : Iterable<T> {
private val cache = TimeLimitedCache<T, Unit>(expireAfterWrite) { key, _ -> key?.let { removalListener(it) } }
@@ -13,12 +13,16 @@ class TimeLimitedSet<T : Any>(
cache[element] = Unit
}
+ operator fun plusAssign(element: T) = add(element)
+
fun addIfAbsent(element: T) {
if (!contains(element)) add(element)
}
fun remove(element: T) = cache.remove(element)
+ operator fun minusAssign(element: T) = remove(element)
+
operator fun contains(element: T): Boolean = cache.containsKey(element)
fun clear() = cache.clear()
@@ -26,4 +30,6 @@ class TimeLimitedSet<T : Any>(
fun toSet(): Set<T> = cache.keys().let { keys ->
if (keys.isEmpty()) emptySet() else keys.toSet()
}
+
+ override fun iterator(): Iterator<T> = toSet().iterator()
}