aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/kotlin/dulkirmod/DulkirMod.kt2
-rw-r--r--src/main/kotlin/dulkirmod/command/ResetSlayerTracker.kt15
-rw-r--r--src/main/kotlin/dulkirmod/config/DulkirConfig.kt18
-rw-r--r--src/main/kotlin/dulkirmod/events/Events.kt4
-rw-r--r--src/main/kotlin/dulkirmod/features/BlazeSlayerFeatures.kt8
-rw-r--r--src/main/kotlin/dulkirmod/features/dungeons/DragonFeatures.kt2
-rw-r--r--src/main/kotlin/dulkirmod/overlays/SlayerTracker.kt26
-rw-r--r--src/main/kotlin/dulkirmod/utils/SlayerTrackerUtil.kt58
8 files changed, 127 insertions, 6 deletions
diff --git a/src/main/kotlin/dulkirmod/DulkirMod.kt b/src/main/kotlin/dulkirmod/DulkirMod.kt
index 8b88830..1637404 100644
--- a/src/main/kotlin/dulkirmod/DulkirMod.kt
+++ b/src/main/kotlin/dulkirmod/DulkirMod.kt
@@ -57,6 +57,7 @@ class DulkirMod {
cch.registerCommand(HurtCamCommand())
cch.registerCommand(FarmingControlSchemeCommand())
cch.registerCommand(DynamicKeyCommand())
+ cch.registerCommand(ResetSlayerTracker())
}
@Mod.EventHandler
@@ -89,6 +90,7 @@ class DulkirMod {
mcBus.register(ReaperDisplay)
mcBus.register(ImpactDisplay)
mcBus.register(EffigyWaypoint)
+ mcBus.register(SlayerTrackerUtil)
keyBinds.forEach(ClientRegistry::registerKeyBinding)
}
diff --git a/src/main/kotlin/dulkirmod/command/ResetSlayerTracker.kt b/src/main/kotlin/dulkirmod/command/ResetSlayerTracker.kt
new file mode 100644
index 0000000..7d1d1fd
--- /dev/null
+++ b/src/main/kotlin/dulkirmod/command/ResetSlayerTracker.kt
@@ -0,0 +1,15 @@
+package dulkirmod.command
+
+import dulkirmod.events.SlayerTypeChangeEvent
+import dulkirmod.utils.TextUtils
+import net.minecraft.command.CommandException
+import net.minecraft.command.ICommandSender
+import net.minecraftforge.common.MinecraftForge
+
+class ResetSlayerTracker : ClientCommandBase("dsr") {
+ @Throws(CommandException::class)
+ override fun processCommand(sender: ICommandSender, args: Array<String>) {
+ MinecraftForge.EVENT_BUS.post(SlayerTypeChangeEvent())
+ TextUtils.info("§6Slayer Tracker session data reset.")
+ }
+} \ No newline at end of file
diff --git a/src/main/kotlin/dulkirmod/config/DulkirConfig.kt b/src/main/kotlin/dulkirmod/config/DulkirConfig.kt
index a4aea6c..bd9bf9d 100644
--- a/src/main/kotlin/dulkirmod/config/DulkirConfig.kt
+++ b/src/main/kotlin/dulkirmod/config/DulkirConfig.kt
@@ -2,12 +2,14 @@ package dulkirmod.config
import cc.polyfrost.oneconfig.config.Config
import cc.polyfrost.oneconfig.config.annotations.*
+import cc.polyfrost.oneconfig.config.annotations.Number
import cc.polyfrost.oneconfig.config.core.OneColor
import cc.polyfrost.oneconfig.config.data.Mod
import cc.polyfrost.oneconfig.config.data.ModType
import dulkirmod.DulkirMod
import dulkirmod.overlays.GardenInfoHud
import dulkirmod.overlays.KeyHud
+import dulkirmod.overlays.SlayerTracker
import dulkirmod.overlays.YawDisplayHud
import dulkirmod.utils.Utils
import net.minecraft.client.audio.SoundCategory
@@ -796,6 +798,22 @@ object DulkirConfig : Config(Mod("DulkirMod", ModType.SKYBLOCK), "dulkirmod-conf
)
var GardenInfoHud: GardenInfoHud = GardenInfoHud()
+ @HUD(
+ name = "Slayer Tracker",
+ category = "HUD",
+ subcategory = "Slayer"
+ )
+ var slayerTracker: SlayerTracker = SlayerTracker()
+
+ @Number(
+ name = "Slayer XP per boss",
+ category = "HUD",
+ subcategory = "Slayer",
+ max = 2000f,
+ min = 5f
+ )
+ var slayerXP = 500
+
@Switch(
name = "Empty Composter Notif",
description = "Will display in HUD instead of giga-alert",
diff --git a/src/main/kotlin/dulkirmod/events/Events.kt b/src/main/kotlin/dulkirmod/events/Events.kt
index 092c07d..0d8c18f 100644
--- a/src/main/kotlin/dulkirmod/events/Events.kt
+++ b/src/main/kotlin/dulkirmod/events/Events.kt
@@ -16,4 +16,6 @@ class EntityRemovedEvent(val entity: Entity) : Event()
*/
data class AlwaysPlaySoundEvent(val sound: ISound, val soundManager: SoundManager) : Event() {
val name = sound.soundLocation.resourcePath
-} \ No newline at end of file
+}
+
+class SlayerTypeChangeEvent : Event() \ No newline at end of file
diff --git a/src/main/kotlin/dulkirmod/features/BlazeSlayerFeatures.kt b/src/main/kotlin/dulkirmod/features/BlazeSlayerFeatures.kt
index 7375b24..8dbad9f 100644
--- a/src/main/kotlin/dulkirmod/features/BlazeSlayerFeatures.kt
+++ b/src/main/kotlin/dulkirmod/features/BlazeSlayerFeatures.kt
@@ -14,10 +14,10 @@ object BlazeSlayerFeatures {
private val minibosses = "(Flare Demon)|(Kindleheart Demon)|(Burningsoul Demon)".toRegex()
private val phaseColors = listOf(
- "CRYSTAL ♨" to Color(15, 247, 236, 200),
- "ASHEN ♨" to Color(40, 40, 40, 200),
- "AURIC ♨" to Color(206, 219, 57, 200),
- "SPIRIT ♨" to Color(255, 255, 255, 200)
+ "CRYSTAL ♨" to Color(15, 247, 236, 255),
+ "ASHEN ♨" to Color(0, 0, 0, 255),
+ "AURIC ♨" to Color(206, 219, 57, 255),
+ "SPIRIT ♨" to Color(255, 255, 255, 255)
)
@SubscribeEvent
diff --git a/src/main/kotlin/dulkirmod/features/dungeons/DragonFeatures.kt b/src/main/kotlin/dulkirmod/features/dungeons/DragonFeatures.kt
index 8709497..0c2b12f 100644
--- a/src/main/kotlin/dulkirmod/features/dungeons/DragonFeatures.kt
+++ b/src/main/kotlin/dulkirmod/features/dungeons/DragonFeatures.kt
@@ -62,7 +62,7 @@ object DragonFeatures {
val particleVec = Vec3(x, y, z)
dragons.forEach {
- if (System.currentTimeMillis() - it.spawnTime < 10000 || !inRangeOf(it.color, particleVec)) return@forEach
+ if (System.currentTimeMillis() - it.spawnTime < 7000 || !inRangeOf(it.color, particleVec)) return@forEach
it.spawnTime = System.currentTimeMillis()
}
}
diff --git a/src/main/kotlin/dulkirmod/overlays/SlayerTracker.kt b/src/main/kotlin/dulkirmod/overlays/SlayerTracker.kt
new file mode 100644
index 0000000..dc1e956
--- /dev/null
+++ b/src/main/kotlin/dulkirmod/overlays/SlayerTracker.kt
@@ -0,0 +1,26 @@
+package dulkirmod.overlays
+
+import cc.polyfrost.oneconfig.hud.TextHud
+import dulkirmod.utils.SlayerTrackerUtil.averageBossesPerHour
+import dulkirmod.utils.SlayerTrackerUtil.averageSpawnKillTime
+import dulkirmod.utils.SlayerTrackerUtil.averageXPPerHour
+import dulkirmod.utils.SlayerTrackerUtil.currentSlayerType
+import dulkirmod.utils.SlayerTrackerUtil.sessionXP
+import java.text.NumberFormat
+
+class SlayerTracker : TextHud(false) {
+ override fun getLines(lines: MutableList<String>?, example: Boolean) {
+ if (currentSlayerType != "" && !example) {
+ val trimmedSlayer = if (currentSlayerType == "Endermen") {
+ "Enderman"
+ } else {
+ currentSlayerType.trimEnd('s')
+ }
+ lines?.add("Slayer: $trimmedSlayer")
+ lines?.add("Session XP: ${NumberFormat.getInstance().format(sessionXP)}")
+ lines?.add("Average Spawn + Kill Time: ${"%.2f".format(averageSpawnKillTime)}s")
+ lines?.add("Average Bosses Per Hour: ${"%.1f".format(averageBossesPerHour)}")
+ lines?.add("Average XP Per Hour: ${NumberFormat.getInstance().format(averageXPPerHour)}")
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/kotlin/dulkirmod/utils/SlayerTrackerUtil.kt b/src/main/kotlin/dulkirmod/utils/SlayerTrackerUtil.kt
new file mode 100644
index 0000000..4dc772e
--- /dev/null
+++ b/src/main/kotlin/dulkirmod/utils/SlayerTrackerUtil.kt
@@ -0,0 +1,58 @@
+package dulkirmod.utils
+
+import dulkirmod.config.DulkirConfig
+import dulkirmod.events.SlayerTypeChangeEvent
+import net.minecraftforge.client.event.ClientChatReceivedEvent
+import net.minecraftforge.common.MinecraftForge
+import net.minecraftforge.fml.common.eventhandler.EventPriority
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+
+object SlayerTrackerUtil {
+ private var sessionStartTime = 0L
+ var sessionXP: Int = 0
+ var averageSpawnKillTime: Float = 0f
+ var averageBossesPerHour: Float = 0f
+ var averageXPPerHour: Int = 0
+ var currentSlayerType: String = ""
+ private var lastKillTime = 0L
+
+ val slayerQuestStartRegex = "» Slay (\\d{1,3}(?:,\\d{3})*) Combat XP worth of (\\w+).".toRegex()
+ @SubscribeEvent
+ fun onSlayerTypeChange(event: SlayerTypeChangeEvent) {
+ // reset relevant tracking features
+ sessionXP = 0
+ averageSpawnKillTime = 0f
+ averageBossesPerHour = 0f
+ averageXPPerHour = 0
+ sessionStartTime = System.currentTimeMillis()
+ lastKillTime = sessionStartTime
+ }
+
+ @SubscribeEvent(receiveCanceled = true, priority = EventPriority.LOW)
+ fun onChat(event: ClientChatReceivedEvent) {
+ if (event.type == 2.toByte()) {
+ return
+ }
+ val unformatted = Utils.stripColorCodes(event.message.unformattedText).trim()
+ if (unformatted matches slayerQuestStartRegex) {
+ val type = slayerQuestStartRegex.find(unformatted)?.groupValues?.get(2)
+ if (type == null) {
+ TextUtils.info("Failed to parse slayer type, please report to dulkir.")
+ return
+ }
+ if (type != currentSlayerType) {
+ MinecraftForge.EVENT_BUS.post(SlayerTypeChangeEvent())
+ currentSlayerType = type
+ return
+ }
+
+ sessionXP += DulkirConfig.slayerXP
+ val totalBosses = sessionXP/DulkirConfig.slayerXP
+
+ averageSpawnKillTime = ((averageSpawnKillTime * (totalBosses - 1) + (System.currentTimeMillis() - lastKillTime) / 1000)) / totalBosses
+ lastKillTime = System.currentTimeMillis()
+ averageBossesPerHour = 3600 / averageSpawnKillTime
+ averageXPPerHour = (averageBossesPerHour * 500).toInt()
+ }
+ }
+} \ No newline at end of file