From 289e8a0643b79b068e0cbf88133fa3c0bcff4c4c Mon Sep 17 00:00:00 2001 From: Xmarmalade <16839488+Xmarmalade@users.noreply.github.com> Date: Sun, 24 Aug 2025 16:52:25 +0800 Subject: [PATCH 1/6] feat(AwesomeMap): add player head color border and class color mapping --- .../feature/awesomemap/AwesomeMapConfig.kt | 2 + .../config/feature/AwesomeMapConfigImpl.kt | 58 ++++++++++++++++ .../feature/awesomemap/AwesomeMapWidget.kt | 35 +++++++++- .../feature/awesomemap/core/DungeonPlayer.kt | 3 + .../awesomemap/features/dungeon/MapUpdate.kt | 68 ++++++++++++++++++- .../impl/oneconfig/NanoVGAccessor.kt | 11 +++ .../oneconfig/ciallo/NanoVGAccessorImpl.kt | 27 ++++++++ 7 files changed, 201 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/net/skymoe/enchaddons/feature/awesomemap/AwesomeMapConfig.kt b/src/main/kotlin/net/skymoe/enchaddons/feature/awesomemap/AwesomeMapConfig.kt index 4cb2121..98c8b34 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/feature/awesomemap/AwesomeMapConfig.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/feature/awesomemap/AwesomeMapConfig.kt @@ -15,10 +15,12 @@ interface AwesomeMapConfig : FeatureConfig { val playerHeads: Int val mapVanillaMarker: Boolean val mapVanillaMarkerTeammates: Boolean + val mapPlayerHeadColorBorder: Boolean val mapClip: Boolean val textScale: Float val vanillaMarkerScale: Float + val colorBorderSize: Float val playerHeadScale: Float val playerNameScale: Float diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt index 7c60623..2075e17 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt @@ -128,6 +128,14 @@ class AwesomeMapConfigImpl : ) override var mapVanillaMarkerTeammates = false + @Switch( + name = "Head Color Border", + description = "Add color border to plaer heads", + category = "Map", + subcategory = "Tweaks", + ) + override var mapPlayerHeadColorBorder = false + @Switch( name = "Clip Map", description = "Clip map which out of the HUD region.", @@ -176,6 +184,16 @@ class AwesomeMapConfigImpl : ) var playerHeadRadius = 2.0f + @Slider( + name = "Class Color Border Size", + description = "Scale of player heads relative to map size.", + category = "Map", + subcategory = "Size", + min = 0F, + max = 2F, + ) + override var colorBorderSize = 1f + @Slider( name = "Player Name Scale", description = "Scale of player names relative to head size.", @@ -446,6 +464,46 @@ class AwesomeMapConfigImpl : ) var colorCheckMarkFailed = OneColor(255, 255, 255) + @Color( + name = "Archer", + category = "Colors", + subcategory = "Class", + allowAlpha = true, + ) + var colorTextArcher = OneColor(255, 170, 0) + + @Color( + name = "Tank", + category = "Colors", + subcategory = "Class", + allowAlpha = true, + ) + var colorTextTank = OneColor(85, 255, 85) + + @Color( + name = "Berserk", + category = "Colors", + subcategory = "Class", + allowAlpha = true, + ) + var colorTextBerserk = OneColor(255, 85, 85) + + @Color( + name = "Mage", + category = "Colors", + subcategory = "Class", + allowAlpha = true, + ) + var colorTextMage = OneColor(85, 255, 255) + + @Color( + name = "Healer", + category = "Colors", + subcategory = "Class", + allowAlpha = true, + ) + var colorTextHealer = OneColor(255, 85, 255) + @Switch( name = "Show Score", description = "Shows separate score element.", diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt index a7f574a..a3dd6cb 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt @@ -46,6 +46,20 @@ data class AwesomeMapWidget( private val config: AwesomeMapConfigImpl, private val mapAlpha: Double = 1.0, ) : Widget { + + /** + * Maps dungeon class character to their corresponding color from config + */ + private fun getClassColor(dungeonClass: Char): Int { + return when (dungeonClass) { + 'T' -> config.colorTextTank.rgb // Tank + 'A' -> config.colorTextArcher.rgb // Archer + 'B' -> config.colorTextBerserk.rgb // Berserk + 'M' -> config.colorTextMage.rgb // Mage + 'H' -> config.colorTextHealer.rgb // Healer + else -> 0xFF000000.int // Black for unknown/failed detection + } + } override fun draw(context: NanoVGUIContext) { val realScale = mapScale context.run { @@ -446,8 +460,25 @@ data class AwesomeMapWidget( ttr size 0.0, ) } else { -// // Render black border around the player head -// renderRectBorder(-6.0, -6.0, 12.0, 12.0, 1.0, Color(0, 0, 0, 255)) + // Draw colored border based on dungeon class when enabled + if (config.mapPlayerHeadColorBorder && !config.mapVanillaMarkerTeammates) { + // Draw border for teammates (not using vanilla marker) + if (!isLocalPlayer || !config.mapVanillaMarker) { + val borderColor = getClassColor(player.dungeonClass) alphaScale mapAlpha + val borderSize = config.colorBorderSize.double + nvg.drawRoundedRectBorder( + vg, + ttr posX (-6.0 - borderSize / 2), + ttr posY (-6.0 - borderSize / 2), + ttr size (12.0 + borderSize), + ttr size (12.0 + borderSize), + ttr size borderSize, + ttr size config.playerHeadRadius.double, + borderColor, + ) + } + } + if (!config.mapVanillaMarkerTeammates || (player.isPlayer && name == MC.thePlayer.name)) { nvg.drawRoundedPlayerAvatar( vg, diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonPlayer.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonPlayer.kt index 92e85d6..37dda71 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonPlayer.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonPlayer.kt @@ -26,6 +26,9 @@ data class DungeonPlayer( /** Minecraft formatting code for the player's name */ var colorPrefix = 'f' + /** The player's dungeon class (T, A, B, M, H) */ + var dungeonClass: Char = '?' + /** The player's name with formatting code */ val formattedName: String get() = "ยง$colorPrefix$name" diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt index 7a39346..4c0ece8 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt @@ -19,6 +19,19 @@ import net.skymoe.enchaddons.util.math.double object MapUpdate { var roomAdded = false + // Regex pattern to match dungeon tab entries + // Format: [level] name (class level) or (EMPTY) or (DEAD) + private val classPattern = Regex( + "(?:\\[\\d+\\] )?" + // Optional level in brackets + "(\\w+)" + // Player name + ".*?\\(" + // Everything until opening parenthesis + "(?:" + + "(Archer|Berserk|Healer|Mage|Tank) ([ILXV]+)" + // Class and level + "|EMPTY" + // Or EMPTY + "|DEAD" + // Or DEAD + ")\\)" // Closing parenthesis + ) + fun preloadHeads() { val tabEntries = TabList.getDungeonTabList() ?: return for (i in listOf(5, 9, 13, 17, 1)) { @@ -31,26 +44,57 @@ object MapUpdate { val tabEntries = TabList.getDungeonTabList() ?: return Dungeon.dungeonTeammates.clear() var iconNum = 0 + println("[AwesomeMap Debug] Starting player detection...") for (i in listOf(5, 9, 13, 17, 1)) { with(tabEntries[i]) { + val strippedEntry = StringUtils.stripControlCodes(second) + val name = StringUtils .stripControlCodes(second) .trim() .substringAfterLast("] ") .split(" ")[0] + if (name != "") { + var dungeonClass = '?' + + // Look for class info in parentheses + if (strippedEntry.contains("(") && strippedEntry.contains(")")) { + val parenContent = strippedEntry.substringAfterLast("(").substringBefore(")") + + // Check if it's not EMPTY or DEAD + if (parenContent != "EMPTY" && parenContent != "DEAD") { + // Parse class from format like "Mage XL" or "Tank L" + val classInfo = parenContent.split(" ")[0] + + dungeonClass = when (classInfo) { + "Tank" -> 'T' + "Archer" -> 'A' + "Berserk" -> 'B' + "Mage" -> 'M' + "Healer" -> 'H' + else -> { + println("[AwesomeMap Debug] Unknown class: '$classInfo'") + '?' + } + } + } + } + Dungeon.dungeonTeammates[name] = DungeonPlayer(first.locationSkin, TabList.getPlayerUUIDByName(name)).apply { MC.theWorld.getPlayerEntityByName(name)?.let { setData(it) } colorPrefix = second.substringBefore(name, "f").last() this.name = name + this.dungeonClass = dungeonClass icon = "icon-$iconNum" } iconNum++ } } } + } fun updatePlayers(tabEntries: List>) { @@ -64,6 +108,26 @@ object MapUpdate { if (name == "") continue Dungeon.dungeonTeammates[name]?.run { dead = tabText.contains("(DEAD)") + + // Update class info if it was previously unknown + if (dungeonClass == '?' && tabText.contains("(") && tabText.contains(")")) { + val parenContent = tabText.substringAfterLast("(").substringBefore(")") + if (parenContent != "EMPTY" && parenContent != "DEAD") { + val classInfo = parenContent.split(" ")[0] + dungeonClass = when (classInfo) { + "Tank" -> 'T' + "Archer" -> 'A' + "Berserk" -> 'B' + "Mage" -> 'M' + "Healer" -> 'H' + else -> '?' + } + if (dungeonClass != '?') { + println("[AwesomeMap Debug] Updated class for $name: $dungeonClass") + } + } + } + if (dead) { icon = "" } else { @@ -208,7 +272,9 @@ object MapUpdate { if (unique == null || unique.name.startsWith("Unknown")) { unique = connected .firstOrNull { - (Dungeon.Info.dungeonList[it.second * 11 + it.first] as? Room)?.uniqueRoom?.name?.startsWith("Unknown") == false + (Dungeon.Info.dungeonList[it.second * 11 + it.first] as? Room)?.uniqueRoom?.name?.startsWith( + "Unknown" + ) == false }?.let { (Dungeon.Info.dungeonList[it.second * 11 + it.first] as? Room)?.uniqueRoom } ?: unique diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/oneconfig/NanoVGAccessor.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/oneconfig/NanoVGAccessor.kt index 9a1c265..a84f478 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/oneconfig/NanoVGAccessor.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/oneconfig/NanoVGAccessor.kt @@ -258,4 +258,15 @@ interface NanoVGAccessor { vg: Long, angle: Double, ) + + fun drawRoundedRectBorder( + vg: Long, + x: Double, + y: Double, + width: Double, + height: Double, + borderWidth: Double, + radius: Double, + color: Int, + ) } diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/oneconfig/ciallo/NanoVGAccessorImpl.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/oneconfig/ciallo/NanoVGAccessorImpl.kt index 29d07aa..ffa5ca5 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/oneconfig/ciallo/NanoVGAccessorImpl.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/oneconfig/ciallo/NanoVGAccessorImpl.kt @@ -678,4 +678,31 @@ object NanoVGAccessorImpl : NanoVGAccessor { ) { nvgRotate(vg, angle.float) } + + override fun drawRoundedRectBorder( + vg: Long, + x: Double, + y: Double, + width: Double, + height: Double, + borderWidth: Double, + radius: Double, + color: Int, + ) { + withscope { + val nvgColor = NVGColor.calloc().using().fill(color) + nvgBeginPath(vg) + nvgRoundedRect( + vg, + x.float, + y.float, + width.float, + height.float, + radius.float, + ) + nvgStrokeColor(vg, nvgColor) + nvgStrokeWidth(vg, borderWidth.float) + nvgStroke(vg) + } + } } From 27cdcddfd6934f75d034c9c91fb9e2b561926557 Mon Sep 17 00:00:00 2001 From: Xmarmalade <16839488+Xmarmalade@users.noreply.github.com> Date: Sun, 24 Aug 2025 19:13:01 +0800 Subject: [PATCH 2/6] fix(AwesomeMapConfig): correct typo in player heads color border description --- .../enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt index 2075e17..f969217 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt @@ -130,7 +130,7 @@ class AwesomeMapConfigImpl : @Switch( name = "Head Color Border", - description = "Add color border to plaer heads", + description = "Add color border to player heads", category = "Map", subcategory = "Tweaks", ) From 36d9acd1a343e26806301ce84a25e342f1c73f9f Mon Sep 17 00:00:00 2001 From: Xmarmalade <16839488+Xmarmalade@users.noreply.github.com> Date: Sun, 24 Aug 2025 21:39:19 +0800 Subject: [PATCH 3/6] refactor(AwesomeMapConfig): remove colorBorderSize from config override --- .../skymoe/enchaddons/feature/awesomemap/AwesomeMapConfig.kt | 1 - .../enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/kotlin/net/skymoe/enchaddons/feature/awesomemap/AwesomeMapConfig.kt b/src/main/kotlin/net/skymoe/enchaddons/feature/awesomemap/AwesomeMapConfig.kt index 98c8b34..a5a42a1 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/feature/awesomemap/AwesomeMapConfig.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/feature/awesomemap/AwesomeMapConfig.kt @@ -20,7 +20,6 @@ interface AwesomeMapConfig : FeatureConfig { val textScale: Float val vanillaMarkerScale: Float - val colorBorderSize: Float val playerHeadScale: Float val playerNameScale: Float diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt index f969217..5f1baf2 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt @@ -192,7 +192,7 @@ class AwesomeMapConfigImpl : min = 0F, max = 2F, ) - override var colorBorderSize = 1f + var colorBorderSize = 1f @Slider( name = "Player Name Scale", From f3dfe8a6c12bd93285ebf124cf6639e6cc6cd1f2 Mon Sep 17 00:00:00 2001 From: Xmarmalade <16839488+Xmarmalade@users.noreply.github.com> Date: Sun, 24 Aug 2025 22:02:39 +0800 Subject: [PATCH 4/6] feat(AwesomeMap): implement DungeonClass enum and refactor class color mapping --- .../feature/awesomemap/AwesomeMapWidget.kt | 47 +++++++++++----- .../awesomemap/features/dungeon/MapUpdate.kt | 55 ++++++------------- 2 files changed, 50 insertions(+), 52 deletions(-) diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt index a3dd6cb..401fb3a 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt @@ -37,6 +37,22 @@ import net.skymoe.enchaddons.util.renderPos import net.skymoe.enchaddons.util.toStyledSegments import kotlin.math.PI +enum class DungeonClass( + val code: Char, +) { + TANK('T'), + ARCHER('A'), + BERSERK('B'), + MAGE('M'), + HEALER('H'), + UNKNOWN('?'), + ; + + companion object { + fun fromCode(code: Char): DungeonClass = DungeonClass.entries.find { it.code == code } ?: UNKNOWN + } +} + data class AwesomeMapWidget( private val cache: NanoVGImageCache, private val pos: Vec2D, @@ -46,20 +62,21 @@ data class AwesomeMapWidget( private val config: AwesomeMapConfigImpl, private val mapAlpha: Double = 1.0, ) : Widget { - /** - * Maps dungeon class character to their corresponding color from config + * Maps dungeon class to their corresponding color from config */ - private fun getClassColor(dungeonClass: Char): Int { - return when (dungeonClass) { - 'T' -> config.colorTextTank.rgb // Tank - 'A' -> config.colorTextArcher.rgb // Archer - 'B' -> config.colorTextBerserk.rgb // Berserk - 'M' -> config.colorTextMage.rgb // Mage - 'H' -> config.colorTextHealer.rgb // Healer - else -> 0xFF000000.int // Black for unknown/failed detection + private fun getClassColor(dungeonClass: DungeonClass): cc.polyfrost.oneconfig.config.core.OneColor = + when (dungeonClass) { + DungeonClass.TANK -> config.colorTextTank + DungeonClass.ARCHER -> config.colorTextArcher + DungeonClass.BERSERK -> config.colorTextBerserk + DungeonClass.MAGE -> config.colorTextMage + DungeonClass.HEALER -> config.colorTextHealer + DungeonClass.UNKNOWN -> + cc.polyfrost.oneconfig.config.core + .OneColor(0, 0, 0) // Black for unknown } - } + override fun draw(context: NanoVGUIContext) { val realScale = mapScale context.run { @@ -464,8 +481,8 @@ data class AwesomeMapWidget( if (config.mapPlayerHeadColorBorder && !config.mapVanillaMarkerTeammates) { // Draw border for teammates (not using vanilla marker) if (!isLocalPlayer || !config.mapVanillaMarker) { - val borderColor = getClassColor(player.dungeonClass) alphaScale mapAlpha - val borderSize = config.colorBorderSize.double + val borderColor = getClassColor(DungeonClass.fromCode(player.dungeonClass)) + val borderSize = 1.0 // Direct implementation instead of config override nvg.drawRoundedRectBorder( vg, ttr posX (-6.0 - borderSize / 2), @@ -474,11 +491,11 @@ data class AwesomeMapWidget( ttr size (12.0 + borderSize), ttr size borderSize, ttr size config.playerHeadRadius.double, - borderColor, + borderColor.rgb, ) } } - + if (!config.mapVanillaMarkerTeammates || (player.isPlayer && name == MC.thePlayer.name)) { nvg.drawRoundedPlayerAvatar( vg, diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt index 4c0ece8..30bcb21 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt @@ -19,19 +19,6 @@ import net.skymoe.enchaddons.util.math.double object MapUpdate { var roomAdded = false - // Regex pattern to match dungeon tab entries - // Format: [level] name (class level) or (EMPTY) or (DEAD) - private val classPattern = Regex( - "(?:\\[\\d+\\] )?" + // Optional level in brackets - "(\\w+)" + // Player name - ".*?\\(" + // Everything until opening parenthesis - "(?:" + - "(Archer|Berserk|Healer|Mage|Tank) ([ILXV]+)" + // Class and level - "|EMPTY" + // Or EMPTY - "|DEAD" + // Or DEAD - ")\\)" // Closing parenthesis - ) - fun preloadHeads() { val tabEntries = TabList.getDungeonTabList() ?: return for (i in listOf(5, 9, 13, 17, 1)) { @@ -44,7 +31,6 @@ object MapUpdate { val tabEntries = TabList.getDungeonTabList() ?: return Dungeon.dungeonTeammates.clear() var iconNum = 0 - println("[AwesomeMap Debug] Starting player detection...") for (i in listOf(5, 9, 13, 17, 1)) { with(tabEntries[i]) { val strippedEntry = StringUtils.stripControlCodes(second) @@ -68,17 +54,15 @@ object MapUpdate { // Parse class from format like "Mage XL" or "Tank L" val classInfo = parenContent.split(" ")[0] - dungeonClass = when (classInfo) { - "Tank" -> 'T' - "Archer" -> 'A' - "Berserk" -> 'B' - "Mage" -> 'M' - "Healer" -> 'H' - else -> { - println("[AwesomeMap Debug] Unknown class: '$classInfo'") - '?' + dungeonClass = + when (classInfo) { + "Tank" -> 'T' + "Archer" -> 'A' + "Berserk" -> 'B' + "Mage" -> 'M' + "Healer" -> 'H' + else -> '?' } - } } } @@ -94,7 +78,6 @@ object MapUpdate { } } } - } fun updatePlayers(tabEntries: List>) { @@ -114,17 +97,15 @@ object MapUpdate { val parenContent = tabText.substringAfterLast("(").substringBefore(")") if (parenContent != "EMPTY" && parenContent != "DEAD") { val classInfo = parenContent.split(" ")[0] - dungeonClass = when (classInfo) { - "Tank" -> 'T' - "Archer" -> 'A' - "Berserk" -> 'B' - "Mage" -> 'M' - "Healer" -> 'H' - else -> '?' - } - if (dungeonClass != '?') { - println("[AwesomeMap Debug] Updated class for $name: $dungeonClass") - } + dungeonClass = + when (classInfo) { + "Tank" -> 'T' + "Archer" -> 'A' + "Berserk" -> 'B' + "Mage" -> 'M' + "Healer" -> 'H' + else -> '?' + } } } @@ -273,7 +254,7 @@ object MapUpdate { unique = connected .firstOrNull { (Dungeon.Info.dungeonList[it.second * 11 + it.first] as? Room)?.uniqueRoom?.name?.startsWith( - "Unknown" + "Unknown", ) == false }?.let { (Dungeon.Info.dungeonList[it.second * 11 + it.first] as? Room)?.uniqueRoom From 5f2ac60feff1956eeb136d90f8a600643bed8816 Mon Sep 17 00:00:00 2001 From: Xmarmalade <16839488+Xmarmalade@users.noreply.github.com> Date: Sun, 24 Aug 2025 22:21:58 +0800 Subject: [PATCH 5/6] fix(AwesomeMapConfig): rename colorBorderSize to colorBorderWidth and fix not using config --- .../enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt | 6 +++--- .../enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt | 4 +--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt index 5f1baf2..c467b51 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/config/feature/AwesomeMapConfigImpl.kt @@ -185,14 +185,14 @@ class AwesomeMapConfigImpl : var playerHeadRadius = 2.0f @Slider( - name = "Class Color Border Size", - description = "Scale of player heads relative to map size.", + name = "Class Color Border Width", + description = "Width of player heads border.", category = "Map", subcategory = "Size", min = 0F, max = 2F, ) - var colorBorderSize = 1f + var colorBorderWidth = 1f @Slider( name = "Player Name Scale", diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt index 401fb3a..8b31414 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt @@ -1,8 +1,6 @@ package net.skymoe.enchaddons.impl.feature.awesomemap -import net.minecraft.util.ResourceLocation import net.skymoe.enchaddons.impl.config.feature.AwesomeMapConfigImpl -import net.skymoe.enchaddons.impl.feature.awesomemap.awesomeMapPlayerMarker import net.skymoe.enchaddons.impl.feature.awesomemap.core.DungeonPlayer import net.skymoe.enchaddons.impl.feature.awesomemap.core.map.* import net.skymoe.enchaddons.impl.feature.awesomemap.features.dungeon.Dungeon @@ -482,7 +480,7 @@ data class AwesomeMapWidget( // Draw border for teammates (not using vanilla marker) if (!isLocalPlayer || !config.mapVanillaMarker) { val borderColor = getClassColor(DungeonClass.fromCode(player.dungeonClass)) - val borderSize = 1.0 // Direct implementation instead of config override + val borderSize = config.colorBorderWidth.double nvg.drawRoundedRectBorder( vg, ttr posX (-6.0 - borderSize / 2), From a2f7f6c885ad7077adf4d59f11892b16341bc440 Mon Sep 17 00:00:00 2001 From: Xmarmalade <16839488+Xmarmalade@users.noreply.github.com> Date: Wed, 27 Aug 2025 01:12:12 +0800 Subject: [PATCH 6/6] refactor(AwesomeMap): introduce `DungeonClass` enum --- .../feature/awesomemap/AwesomeMapWidget.kt | 19 ++---------- .../feature/awesomemap/core/DungeonClass.kt | 26 +++++++++++++++++ .../feature/awesomemap/core/DungeonPlayer.kt | 5 ++-- .../awesomemap/features/dungeon/MapUpdate.kt | 29 ++++++++++--------- 4 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonClass.kt diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt index 8b31414..ebdb14e 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/AwesomeMapWidget.kt @@ -1,6 +1,7 @@ package net.skymoe.enchaddons.impl.feature.awesomemap import net.skymoe.enchaddons.impl.config.feature.AwesomeMapConfigImpl +import net.skymoe.enchaddons.impl.feature.awesomemap.core.DungeonClass import net.skymoe.enchaddons.impl.feature.awesomemap.core.DungeonPlayer import net.skymoe.enchaddons.impl.feature.awesomemap.core.map.* import net.skymoe.enchaddons.impl.feature.awesomemap.features.dungeon.Dungeon @@ -35,22 +36,6 @@ import net.skymoe.enchaddons.util.renderPos import net.skymoe.enchaddons.util.toStyledSegments import kotlin.math.PI -enum class DungeonClass( - val code: Char, -) { - TANK('T'), - ARCHER('A'), - BERSERK('B'), - MAGE('M'), - HEALER('H'), - UNKNOWN('?'), - ; - - companion object { - fun fromCode(code: Char): DungeonClass = DungeonClass.entries.find { it.code == code } ?: UNKNOWN - } -} - data class AwesomeMapWidget( private val cache: NanoVGImageCache, private val pos: Vec2D, @@ -479,7 +464,7 @@ data class AwesomeMapWidget( if (config.mapPlayerHeadColorBorder && !config.mapVanillaMarkerTeammates) { // Draw border for teammates (not using vanilla marker) if (!isLocalPlayer || !config.mapVanillaMarker) { - val borderColor = getClassColor(DungeonClass.fromCode(player.dungeonClass)) + val borderColor = getClassColor(player.dungeonClass) val borderSize = config.colorBorderWidth.double nvg.drawRoundedRectBorder( vg, diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonClass.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonClass.kt new file mode 100644 index 0000000..99063d7 --- /dev/null +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonClass.kt @@ -0,0 +1,26 @@ +package net.skymoe.enchaddons.impl.feature.awesomemap.core + +enum class DungeonClass( + val code: Char, +) { + TANK('T'), + ARCHER('A'), + BERSERK('B'), + MAGE('M'), + HEALER('H'), + UNKNOWN('?'); + + companion object { + fun fromCode(code: Char): DungeonClass = entries.find { it.code == code } ?: UNKNOWN + fun fromDisplayName(name: String): DungeonClass = + when (name) { + "Tank" -> TANK + "Archer" -> ARCHER + "Berserk" -> BERSERK + "Mage" -> MAGE + "Healer" -> HEALER + else -> UNKNOWN + } + } +} + diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonPlayer.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonPlayer.kt index 37dda71..07c31b6 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonPlayer.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/core/DungeonPlayer.kt @@ -10,6 +10,7 @@ import net.skymoe.enchaddons.feature.awesomemap.AwesomeMap import net.skymoe.enchaddons.impl.feature.awesomemap.core.map.Room import net.skymoe.enchaddons.impl.feature.awesomemap.features.dungeon.Dungeon import net.skymoe.enchaddons.impl.feature.awesomemap.utils.APIUtils +import net.skymoe.enchaddons.impl.feature.awesomemap.core.DungeonClass import net.skymoe.enchaddons.impl.feature.awesomemap.utils.Location import net.skymoe.enchaddons.impl.feature.awesomemap.utils.MapUtils import net.skymoe.enchaddons.impl.feature.awesomemap.utils.Utils @@ -26,8 +27,8 @@ data class DungeonPlayer( /** Minecraft formatting code for the player's name */ var colorPrefix = 'f' - /** The player's dungeon class (T, A, B, M, H) */ - var dungeonClass: Char = '?' +/** The player's dungeon class */ + var dungeonClass: DungeonClass = DungeonClass.UNKNOWN /** The player's name with formatting code */ val formattedName: String diff --git a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt index 30bcb21..ce2a641 100644 --- a/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt +++ b/src/main/kotlin/net/skymoe/enchaddons/impl/feature/awesomemap/features/dungeon/MapUpdate.kt @@ -4,6 +4,7 @@ import net.minecraft.client.network.NetworkPlayerInfo import net.minecraft.init.Blocks import net.minecraft.util.BlockPos import net.minecraft.util.StringUtils +import net.skymoe.enchaddons.impl.feature.awesomemap.core.DungeonClass import net.skymoe.enchaddons.impl.feature.awesomemap.core.DungeonPlayer import net.skymoe.enchaddons.impl.feature.awesomemap.core.map.* import net.skymoe.enchaddons.impl.feature.awesomemap.utils.MapUtils @@ -43,7 +44,7 @@ object MapUpdate { .split(" ")[0] if (name != "") { - var dungeonClass = '?' + var dungeonClass = DungeonClass.UNKNOWN // Look for class info in parentheses if (strippedEntry.contains("(") && strippedEntry.contains(")")) { @@ -56,12 +57,12 @@ object MapUpdate { dungeonClass = when (classInfo) { - "Tank" -> 'T' - "Archer" -> 'A' - "Berserk" -> 'B' - "Mage" -> 'M' - "Healer" -> 'H' - else -> '?' + "Tank" -> DungeonClass.TANK + "Archer" -> DungeonClass.ARCHER + "Berserk" -> DungeonClass.BERSERK + "Mage" -> DungeonClass.MAGE + "Healer" -> DungeonClass.HEALER + else -> DungeonClass.UNKNOWN } } } @@ -93,18 +94,18 @@ object MapUpdate { dead = tabText.contains("(DEAD)") // Update class info if it was previously unknown - if (dungeonClass == '?' && tabText.contains("(") && tabText.contains(")")) { + if (dungeonClass == DungeonClass.UNKNOWN && tabText.contains("(") && tabText.contains(")")) { val parenContent = tabText.substringAfterLast("(").substringBefore(")") if (parenContent != "EMPTY" && parenContent != "DEAD") { val classInfo = parenContent.split(" ")[0] dungeonClass = when (classInfo) { - "Tank" -> 'T' - "Archer" -> 'A' - "Berserk" -> 'B' - "Mage" -> 'M' - "Healer" -> 'H' - else -> '?' + "Tank" -> DungeonClass.TANK + "Archer" -> DungeonClass.ARCHER + "Berserk" -> DungeonClass.BERSERK + "Mage" -> DungeonClass.MAGE + "Healer" -> DungeonClass.HEALER + else -> DungeonClass.UNKNOWN } } }