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: add guide to dungeon hub races #1471

Merged
merged 10 commits into from
May 1, 2024
2 changes: 2 additions & 0 deletions src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ import at.hannibal2.skyhanni.features.dungeon.DungeonMilestonesDisplay
import at.hannibal2.skyhanni.features.dungeon.DungeonRankTabListColor
import at.hannibal2.skyhanni.features.dungeon.DungeonShadowAssassinNotification
import at.hannibal2.skyhanni.features.dungeon.DungeonTeammateOutlines
import at.hannibal2.skyhanni.features.dungeon.DungeonsRaceGuide
import at.hannibal2.skyhanni.features.dungeon.HighlightDungeonDeathmite
import at.hannibal2.skyhanni.features.dungeon.TerracottaPhase
import at.hannibal2.skyhanni.features.event.UniqueGiftingOpportunitiesFeatures
Expand Down Expand Up @@ -517,6 +518,7 @@ class SkyHanniMod {
loadModule(ItemAddManager())
loadModule(BingoCardReader())
loadModule(DeepCavernsGuide())
loadModule(DungeonsRaceGuide())
loadModule(GardenBestCropTime())
loadModule(ActionBarData)
loadModule(TrackerManager)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,9 @@ public class DungeonConfig {
@ConfigEditorBoolean
@FeatureToggle
public boolean shadowAssassinJumpNotifier = false;

@Expose
@ConfigOption(name = "Dungeon Races Guide", desc = "")
@Accordion
public DungeonsRaceGuideConfig dungeonsRaceGuide = new DungeonsRaceGuideConfig();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package at.hannibal2.skyhanni.config.features.dungeon;

import at.hannibal2.skyhanni.config.FeatureToggle;
import com.google.gson.annotations.Expose;
import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean;
import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorColour;
import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorSlider;
import io.github.notenoughupdates.moulconfig.annotations.ConfigOption;
import io.github.notenoughupdates.moulconfig.observer.Property;

public class DungeonsRaceGuideConfig {

@Expose
@ConfigOption(name = "Enabled", desc = "Shows a guide for each of the Dungeon Hub races. §eOnly for No Return; Nothing at all races.")
@ConfigEditorBoolean
@FeatureToggle
public boolean enabled = true;

@Expose
@ConfigOption(name = "Look Ahead", desc = "Change how many waypoints should be shown in front of you.")
@ConfigEditorSlider(minStep = 1, maxValue = 30, minValue = 1)
public Property<Integer> lookAhead = Property.of(3);

@Expose
@ConfigOption(name = "Rainbow Color", desc = "Show the rainbow color effect instead of a boring monochrome.")
@ConfigEditorBoolean
public Property<Boolean> rainbowColor = Property.of(true);

@Expose
@ConfigOption(name = "Monochrome Color", desc = "Set a boring monochrome color for the guide waypoints.")
@ConfigEditorColour
public Property<String> monochromeColor = Property.of("0:60:0:0:255");
}
catgirlseraid marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package at.hannibal2.skyhanni.data.jsonobjects.repo

import com.google.gson.annotations.Expose

data class NamedParkourJson(
@Expose val data: Map<String, Map<String, ParkourJson>>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package at.hannibal2.skyhanni.features.dungeon

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.data.IslandType
import at.hannibal2.skyhanni.data.jsonobjects.repo.NamedParkourJson
import at.hannibal2.skyhanni.events.ActionBarUpdateEvent
import at.hannibal2.skyhanni.events.ConfigLoadEvent
import at.hannibal2.skyhanni.events.IslandChangeEvent
import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent
import at.hannibal2.skyhanni.events.RepositoryReloadEvent
import at.hannibal2.skyhanni.utils.ColorUtils.toChromaColor
import at.hannibal2.skyhanni.utils.ConditionalUtils
import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland
import at.hannibal2.skyhanni.utils.ParkourHelper
import at.hannibal2.skyhanni.utils.StringUtils.findMatcher
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

class DungeonsRaceGuide {

private val config get() = SkyHanniMod.feature.dungeon.dungeonsRaceGuide
private val raceActivePattern by RepoPattern.pattern(
"dungeon.race.active",
"§.§.(?<race>[\\w ]+) RACE §.[\\d:.]+"
)

private val parkourHelpers: MutableMap<String, ParkourHelper> = mutableMapOf()

private var currentRace: String? = null
//:3

@SubscribeEvent
fun onIslandChange(event: IslandChangeEvent) {
parkourHelpers.forEach { it.value.reset() }
currentRace = null
}

@SubscribeEvent
fun onRepoReload(event: RepositoryReloadEvent) {
val data = event.getConstant<NamedParkourJson>("DungeonHubRaces")
data.data.forEach {
parkourHelpers[it.key] = ParkourHelper(
it.value["nothing:no_return"]?.locations ?: listOf(),
it.value["nothing:no_return"]?.shortCuts ?: listOf(),
platformSize = 1.0,
detectionRange = 3.5,
depth = false,
)
}
updateConfig()
}

@SubscribeEvent
fun onConfigLoad(event: ConfigLoadEvent) {
ConditionalUtils.onToggle(config.rainbowColor, config.monochromeColor, config.lookAhead) {
updateConfig()
}
}

@SubscribeEvent
fun onActionBarUpdate(event: ActionBarUpdateEvent) {
if (!isEnabled()) return
currentRace = null
raceActivePattern.findMatcher(event.actionBar) {
currentRace = group("race").replace(" ", "_").lowercase()
}
if (currentRace == null) {
parkourHelpers.forEach {
it.value.reset()
}
}
}

private fun updateConfig() {
parkourHelpers.forEach {
it.value.rainbowColor = config.rainbowColor.get()
it.value.monochromeColor = config.monochromeColor.get().toChromaColor()
it.value.lookAhead = config.lookAhead.get() + 1
}
}

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

parkourHelpers[currentRace]?.render(event)
CalMWolfs marked this conversation as resolved.
Show resolved Hide resolved
}

fun isEnabled() = IslandType.DUNGEON_HUB.isInIsland() && config.enabled
}
Loading