Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Terminal Waypoints #2719

Merged
merged 6 commits into from
Oct 13, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import at.hannibal2.skyhanni.features.commands.PartyChatCommands
import at.hannibal2.skyhanni.features.commands.PartyCommands
import at.hannibal2.skyhanni.features.commands.WikiManager
import at.hannibal2.skyhanni.features.dungeon.CroesusChestTracker
import at.hannibal2.skyhanni.features.dungeon.floor7.TerminalInfo
import at.hannibal2.skyhanni.features.event.diana.AllBurrowsList
import at.hannibal2.skyhanni.features.event.diana.BurrowWarpHelper
import at.hannibal2.skyhanni.features.event.diana.DianaProfitTracker
Expand Down Expand Up @@ -501,6 +502,10 @@ object Commands {
"shdebugscoreboard",
"Monitors the scoreboard changes: Prints the raw scoreboard lines in the console after each update, with time since last update.",
) { ScoreboardData.toggleMonitor() }
registerCommand(
"shresetterminal",
"Resets terminal highlights in F7.",
) { TerminalInfo.resetTerminals() }
}

@Suppress("LongMethod")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,12 @@ public class DungeonConfig {
@FeatureToggle
public boolean shadowAssassinJumpNotifier = false;

@Expose
@ConfigOption(name = "Terminal Waypoints", desc = "Displays Waypoints in the F7/M7 Goldor Phase.")
@ConfigEditorBoolean
@FeatureToggle
public boolean terminalWaypoints = false;

@Expose
@ConfigOption(name = "Dungeon Races Guide", desc = "")
@Accordion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ object DungeonBossAPI {
F7_GOLDOR_5,
F7_NECRON,
M7_WITHER_KING,
;

fun isCurrent(): Boolean = bossPhase == this
}

private val patternGroup = RepoPattern.group("dungeon.boss.message")
Expand Down Expand Up @@ -86,7 +89,7 @@ object DungeonBossAPI {
* REGEX-TEST: §bmartimavocado§r§a completed a device! (§r§c3§r§a/8)
* REGEX-TEST: §bmartimavocado§r§a activated a terminal! (§r§c4§r§a/7)
*/
private val goldorTerminalPattern by patternGroup.pattern(
val goldorTerminalPattern by patternGroup.pattern(
"f7.goldor.terminalcomplete",
"§.(?<playerName>\\w+)§r§a (?:activated|completed) a (?<type>lever|terminal|device)! \\(§r§c(?<currentTerminal>\\d)§r§a/(?<total>\\d)\\)",
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package at.hannibal2.skyhanni.features.dungeon.floor7

import at.hannibal2.skyhanni.features.dungeon.DungeonBossAPI
import at.hannibal2.skyhanni.utils.LorenzVec

private typealias BossPhase = DungeonBossAPI.DungeonBossPhase

enum class TerminalInfo(val location: LorenzVec, val phase: BossPhase, val text: String) {
P1_TERMINAL_1(LorenzVec(111, 113, 73), BossPhase.F7_GOLDOR_1, "Terminal"),
P1_TERMINAL_2(LorenzVec(111, 119, 79), BossPhase.F7_GOLDOR_1, "Terminal"),
P1_TERMINAL_3(LorenzVec(89, 112, 92), BossPhase.F7_GOLDOR_1, "Terminal"),
P1_TERMINAL_4(LorenzVec(89, 122, 101), BossPhase.F7_GOLDOR_1, "Terminal"),
P1_LEVER_1(LorenzVec(106, 124, 113), BossPhase.F7_GOLDOR_1, "Lever"),
P1_LEVER_2(LorenzVec(94, 124, 113), BossPhase.F7_GOLDOR_1, "Lever"),
P1_DEVICE(LorenzVec(110, 119, 93), BossPhase.F7_GOLDOR_1, "Device"),

P2_TERMINAL_1(LorenzVec(68, 109, 121), BossPhase.F7_GOLDOR_2, "Terminal"),
P2_TERMINAL_2(LorenzVec(59, 120, 122), BossPhase.F7_GOLDOR_2, "Terminal"),
P2_TERMINAL_3(LorenzVec(47, 109, 121), BossPhase.F7_GOLDOR_2, "Terminal"),
P2_TERMINAL_4(LorenzVec(40, 124, 122), BossPhase.F7_GOLDOR_2, "Terminal"),
P2_TERMINAL_5(LorenzVec(39, 108, 143), BossPhase.F7_GOLDOR_2, "Terminal"),
P2_LEVER_1(LorenzVec(23, 132, 138), BossPhase.F7_GOLDOR_2, "Lever"),
P2_LEVER_2(LorenzVec(27, 124, 127), BossPhase.F7_GOLDOR_2, "Lever"),
P2_DEVICE(LorenzVec(60, 131, 142), BossPhase.F7_GOLDOR_2, "Device"),

P3_TERMINAL_1(LorenzVec(-3, 109, 112), BossPhase.F7_GOLDOR_3, "Terminal"),
P3_TERMINAL_2(LorenzVec(-3, 119, 93), BossPhase.F7_GOLDOR_3, "Terminal"),
P3_TERMINAL_3(LorenzVec(19, 123, 93), BossPhase.F7_GOLDOR_3, "Terminal"),
P3_TERMINAL_4(LorenzVec(-3, 109, 77), BossPhase.F7_GOLDOR_3, "Terminal"),
P3_LEVER_1(LorenzVec(14, 122, 55), BossPhase.F7_GOLDOR_3, "Lever"),
P3_LEVER_2(LorenzVec(2, 122, 55), BossPhase.F7_GOLDOR_3, "Lever"),
P3_DEVICE(LorenzVec(-2, 119, 77), BossPhase.F7_GOLDOR_3, "Device"),

P4_TERMINAL_1(LorenzVec(41, 109, 29), BossPhase.F7_GOLDOR_4, "Terminal"),
P4_TERMINAL_2(LorenzVec(44, 121, 29), BossPhase.F7_GOLDOR_4, "Terminal"),
P4_TERMINAL_3(LorenzVec(67, 109, 29), BossPhase.F7_GOLDOR_4, "Terminal"),
P4_TERMINAL_4(LorenzVec(72, 115, 48), BossPhase.F7_GOLDOR_4, "Terminal"),
P4_LEVER_1(LorenzVec(84, 121, 34), BossPhase.F7_GOLDOR_4, "Lever"),
P4_LEVER_2(LorenzVec(86, 128, 46), BossPhase.F7_GOLDOR_4, "Lever"),
P4_DEVICE(LorenzVec(63, 126, 35), BossPhase.F7_GOLDOR_4, "Device"),
;

var highlight: Boolean = true

companion object {
fun resetTerminals() = entries.forEach { it.highlight = true }

fun getClosestTerminal(input: LorenzVec): TerminalInfo? {
return entries.filter { it.highlight }.minByOrNull { it.location.distance(input) }
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package at.hannibal2.skyhanni.features.dungeon.floor7

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent
import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent
import at.hannibal2.skyhanni.features.dungeon.DungeonAPI
import at.hannibal2.skyhanni.features.dungeon.DungeonBossAPI
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.EntityUtils
import at.hannibal2.skyhanni.utils.LorenzColor
import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher
import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText
import at.hannibal2.skyhanni.utils.RenderUtils.drawWaypointFilled
import at.hannibal2.skyhanni.utils.getLorenzVec
import net.minecraft.entity.player.EntityPlayerMP
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

@SkyHanniModule
object TerminalWaypoints {

private val config get() = SkyHanniMod.feature.dungeon

@SubscribeEvent
fun onRenderWorld(event: LorenzRenderWorldEvent) {
if (!isEnabled()) return

for (term in TerminalInfo.entries) {
if (!term.highlight || !term.phase.isCurrent()) continue
event.drawWaypointFilled(term.location, LorenzColor.GREEN.toColor(), seeThroughBlocks = true)
event.drawDynamicText(term.location, term.text, 1.0)
}
}

@SubscribeEvent
fun onWorldChange(event: LorenzWorldChangeEvent) {
TerminalInfo.resetTerminals()
}

@SubscribeEvent
fun onChat(event: LorenzChatEvent) {
if (!inBoss()) return
DungeonBossAPI.goldorTerminalPattern.matchMatcher(event.message) {
val playerName = group("playerName")
val playerEntity = EntityUtils.getEntities<EntityPlayerMP>().find { it.name == playerName } ?: return
val terminal = TerminalInfo.getClosestTerminal(playerEntity.getLorenzVec())
terminal?.highlight = false
}
}

private fun inBoss() = DungeonAPI.inBossRoom && DungeonAPI.isOneOf("F7", "M7")

private fun isEnabled() = inBoss() && config.terminalWaypoints
}
Loading