1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
package at.hannibal2.skyhanni.features.fishing
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator
import at.hannibal2.skyhanni.data.IslandType
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.events.LorenzTickEvent
import at.hannibal2.skyhanni.utils.EntityUtils
import at.hannibal2.skyhanni.utils.KeyboardManager.isKeyHeld
import at.hannibal2.skyhanni.utils.LocationUtils
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland
import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.RenderUtils.renderString
import at.hannibal2.skyhanni.utils.SimpleTimeMark
import at.hannibal2.skyhanni.utils.SoundUtils
import at.hannibal2.skyhanni.utils.StringUtils
import at.hannibal2.skyhanni.utils.TimeUnit
import at.hannibal2.skyhanni.utils.TimeUtils.format
import net.minecraft.client.Minecraft
import net.minecraft.entity.item.EntityArmorStand
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.seconds
class FishingTimer {
private val config get() = SkyHanniMod.feature.fishing.barnTimer
private val barnLocation = LorenzVec(108, 89, -252)
private var rightLocation = false
private var currentCount = 0
private var startTime = SimpleTimeMark.farPast()
private var inHollows = false
@SubscribeEvent
fun onTick(event: LorenzTickEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!config.enabled) return
if (event.repeatSeconds(3)) {
rightLocation = isRightLocation()
}
if (!rightLocation) return
if (event.isMod(5)) checkMobs()
if (event.isMod(7)) tryPlaySound()
if (config.manualResetTimer.isKeyHeld() && Minecraft.getMinecraft().currentScreen == null) {
startTime = SimpleTimeMark.now()
}
}
private fun tryPlaySound() {
if (currentCount == 0) return
val passedSince = startTime.passedSince()
val barnTimerAlertTime = (config.alertTime * 1_000).milliseconds
if (passedSince in barnTimerAlertTime..(barnTimerAlertTime + 3.seconds)) {
SoundUtils.playBeepSound()
}
}
private fun checkMobs() {
val newCount = countMobs()
if (currentCount == 0 && newCount > 0) {
startTime = SimpleTimeMark.now()
}
currentCount = newCount
if (newCount == 0) {
startTime = SimpleTimeMark.farPast()
}
if (inHollows && newCount >= 60 && config.wormLimitAlert) {
SoundUtils.playBeepSound()
LorenzUtils.sendTitle("§cWORM CAP FULL!!!", 2.seconds)
}
}
private fun countMobs() =
EntityUtils.getEntities<EntityArmorStand>().map { entity -> FishingAPI.seaCreatureCount(entity) }.sum()
private fun isRightLocation(): Boolean {
inHollows = false
if (config.forStranded && LorenzUtils.isStrandedProfile) return true
if (config.crystalHollows && IslandType.CRYSTAL_HOLLOWS.isInIsland()) {
inHollows = true
return true
}
if (config.crimsonIsle && IslandType.CRIMSON_ISLE.isInIsland()) return true
if (config.winterIsland && IslandType.WINTER.isInIsland()) return true
if (!IslandType.THE_FARMING_ISLANDS.isInIsland()) {
return LocationUtils.playerLocation().distance(barnLocation) < 50
}
return false
}
@SubscribeEvent
fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!config.enabled) return
if (!rightLocation) return
if (currentCount == 0) return
if (!FishingAPI.isFishing()) return
val passedSince = startTime.passedSince()
val barnTimerAlertTime = (config.alertTime * 1_000).milliseconds
val color = if (passedSince > barnTimerAlertTime) "§c" else "§e"
val timeFormat = passedSince.format(TimeUnit.MINUTE)
val name = StringUtils.pluralize(currentCount, "sea creature")
val text = "$color$timeFormat §8(§e$currentCount §b$name§8)"
config.pos.renderString(text, posLabel = "BarnTimer")
}
@SubscribeEvent
fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) {
event.move(3, "fishing.barnTimer", "fishing.barnTimer.enabled")
event.move(3, "fishing.barnTimerAlertTime", "fishing.barnTimer.alertTime")
event.move(3, "fishing.barnTimerCrystalHollows", "fishing.barnTimer.crystalHollows")
event.move(3, "fishing.barnTimerForStranded", "fishing.barnTimer.forStranded")
event.move(3, "fishing.wormLimitAlert", "fishing.barnTimer.wormLimitAlert")
event.move(3, "fishing.manualResetTimer", "fishing.barnTimer.manualResetTimer")
event.move(3, "fishing.barnTimerPos", "fishing.barnTimer.pos")
}
}
|