From 663f454319c31d952d249d9a526620e5a53f70a1 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 17 Oct 2023 22:10:20 +0200 Subject: [PATCH 001/225] Added the ground structure --- .../java/at/hannibal2/skyhanni/SkyHanniMod.kt | 2 + .../skyhanni/config/features/MiscConfig.java | 52 ++++++++++++ .../features/misc/CustomScoreboard.kt | 84 +++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 897b3dc0fda8..bba08b175bfd 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -203,6 +203,7 @@ import at.hannibal2.skyhanni.features.misc.SuperpairsClicksAlert import at.hannibal2.skyhanni.features.misc.ThunderSparksHighlight import at.hannibal2.skyhanni.features.misc.TimeFeatures import at.hannibal2.skyhanni.features.misc.TpsCounter +import at.hannibal2.skyhanni.features.misc.CustomScoreboard import at.hannibal2.skyhanni.features.misc.compacttablist.AdvancedPlayerList import at.hannibal2.skyhanni.features.misc.compacttablist.TabListReader import at.hannibal2.skyhanni.features.misc.compacttablist.TabListRenderer @@ -609,6 +610,7 @@ class SkyHanniMod { loadModule(PartyMemberOutlines()) loadModule(ShiftClickEquipment()) loadModule(LockMouseLook) + loadModule(CustomScoreboard()) init() diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 23dcd5429faf..50c2ba3f44f1 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -780,4 +780,56 @@ public static class KickDurationConfig { @Expose public Position inventoryLoadPos = new Position(394, 124, false, true); + + @Expose + @ConfigOption(name = "Custom Scoreboard", desc = "") + @Accordion + public MiscConfig.CustomScoreboard customScoreboard = new MiscConfig.CustomScoreboard(); + + public static class CustomScoreboard { + + @Expose + @ConfigOption( + name = "Enabled", + desc = "Show a custom scoreboard instead of the default one." //TODO: MAKE COOLER + ) + @ConfigEditorBoolean + @FeatureToggle + public boolean enabled = false; + + @Expose + @ConfigOption( + name = "Text Format", + desc = "Drag text to change the appearance of the overlay." + ) + @ConfigEditorDraggableList( + exampleText = { + "§6§lSKYBLOCK", + "§7Profile", + "§ePurse", + "§eBank", + "§bBits", + "§cCopper", + "§aGems", + "§7Location", + "§7Ingame Time", + "§7Current Server", + "§2Mithril §r/ §dGemstone §7Powder", + "§cSlayer", + "§7Next Event", + "§7Current Event", + "§3Soulflow", + "§cHeat", + "§9Party:\n- hannibal2\n- Moulberry\n- Vahvl\n- J10a1n15", + "§7Pet", + "§7Quiver (approximation)", + "§7Maxwell Power" + } + ) + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19)); + + + @Expose + public Position position = new Position(10, 80, false, true); + } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt new file mode 100644 index 000000000000..e8d79ec6bf95 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -0,0 +1,84 @@ +// https://discord.com/channels/997079228510117908/1162844830360146080 + + +package at.hannibal2.skyhanni.features.misc + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.HypixelData +import at.hannibal2.skyhanni.data.PartyAPI +import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList +import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems +import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent + +class CustomScoreboard { + private val config get() = SkyHanniMod.feature.misc.customScoreboard + private var display = emptyList>() + @SubscribeEvent + fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { + if (!config.enabled) return + if (!LorenzUtils.inSkyBlock) return + config.position.renderStringsAndItems(display, posLabel = "Custom Scoreboard") + } + + @SubscribeEvent + fun onTick(event: TickEvent) { + update() + } + + private fun formatDisplay(map: List>): List> { + val newList = mutableListOf>() + for (index in config.textFormat) { + newList.add(map[index]) + } + return newList + } + + private fun update() { + display = formatDisplay(drawScoreboard()) + } + + private fun drawScoreboard() = buildList> { + addAsSingletonList("§6§lSKYBLOCK") + addAsSingletonList("${getProfileTypeAsSymbol()} ${HypixelData.profileName.firstLetterUppercase()}") + addAsSingletonList("§ePurse") + addAsSingletonList("§eBank") + addAsSingletonList("§bBits") + addAsSingletonList("§cCopper") + addAsSingletonList("§aGems") + addAsSingletonList("§7Location") + addAsSingletonList("§7Ingame Time") + addAsSingletonList("§7Current Server") + addAsSingletonList("§2Mithril §r/§2Gemstone §7Powder") + addAsSingletonList("§cSlayer") + addAsSingletonList("§7Next Event") + addAsSingletonList("§7Current Event") + addAsSingletonList("§2Soulflow") + addAsSingletonList("§cHeat") + + addAsSingletonList("§9Party") + for (member in PartyAPI.partyMembers){ + addAsSingletonList(" §7- §7$member") + } + + addAsSingletonList("§7Pet") + addAsSingletonList("§7Quiver (approximation)") + addAsSingletonList("§7Maxwell Power") + } + + private fun getProfileTypeAsSymbol() : String{ + if (HypixelData.ironman){ + return "§7♲" + } + if (HypixelData.stranded){ + return "§a☀" + } + if (HypixelData.bingo){ + return "§cⒷ" //TODO GET FUNNY BINGO SYMBOL, ALSO COLORS LOL + } + return "§e" + } +} \ No newline at end of file From 4b7f52a0b5032db9f6f71b6cc3b44b1c873e7bff Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:03:08 +0200 Subject: [PATCH 002/225] New way of drawing scoreboard --- .../skyhanni/config/features/MiscConfig.java | 3 +- .../features/misc/CustomScoreboard.kt | 85 ++++++++++++------- 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 50c2ba3f44f1..2f678b5cb53e 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -813,6 +813,7 @@ public static class CustomScoreboard { "§aGems", "§7Location", "§7Ingame Time", + "§7IRL Time", "§7Current Server", "§2Mithril §r/ §dGemstone §7Powder", "§cSlayer", @@ -826,7 +827,7 @@ public static class CustomScoreboard { "§7Maxwell Power" } ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19)); + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20)); @Expose diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index e8d79ec6bf95..01058674cea8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -1,4 +1,7 @@ -// https://discord.com/channels/997079228510117908/1162844830360146080 +// +// Requested by alpaka8123 (https://discord.com/channels/997079228510117908/1162844830360146080) +// Done by J10a1n15, with lots of help from hanni, and snippets from item tracker features <3 +// package at.hannibal2.skyhanni.features.misc @@ -7,12 +10,15 @@ import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.features.garden.farming.GardenCropMilestoneDisplay import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent +import java.util.* +import kotlin.collections.HashMap class CustomScoreboard { private val config get() = SkyHanniMod.feature.misc.customScoreboard @@ -26,58 +32,71 @@ class CustomScoreboard { @SubscribeEvent fun onTick(event: TickEvent) { - update() + display = drawScoreboard() } - private fun formatDisplay(map: List>): List> { + private fun formatDisplay(lineMap: HashMap>): MutableList> { val newList = mutableListOf>() for (index in config.textFormat) { - newList.add(map[index]) + lineMap[index]?.let { + newList.add(it) + } } - return newList - } - private fun update() { - display = formatDisplay(drawScoreboard()) + return newList } private fun drawScoreboard() = buildList> { - addAsSingletonList("§6§lSKYBLOCK") - addAsSingletonList("${getProfileTypeAsSymbol()} ${HypixelData.profileName.firstLetterUppercase()}") - addAsSingletonList("§ePurse") - addAsSingletonList("§eBank") - addAsSingletonList("§bBits") - addAsSingletonList("§cCopper") - addAsSingletonList("§aGems") - addAsSingletonList("§7Location") - addAsSingletonList("§7Ingame Time") - addAsSingletonList("§7Current Server") - addAsSingletonList("§2Mithril §r/§2Gemstone §7Powder") - addAsSingletonList("§cSlayer") - addAsSingletonList("§7Next Event") - addAsSingletonList("§7Current Event") - addAsSingletonList("§2Soulflow") - addAsSingletonList("§cHeat") - - addAsSingletonList("§9Party") + val lineMap = HashMap>() + lineMap[0] = Collections.singletonList("§6§lSKYBLOCK") + lineMap[1] = Collections.singletonList("${getProfileTypeAsSymbol()}${HypixelData.profileName.firstLetterUppercase()}") + lineMap[2] = Collections.singletonList("§ePurse") + lineMap[3] = Collections.singletonList("§eBank") + lineMap[4] = Collections.singletonList("§bBits") + lineMap[5] = Collections.singletonList("§cCopper") + lineMap[6] = Collections.singletonList("§aGems") + lineMap[7] = Collections.singletonList("§7Location") + lineMap[8] = Collections.singletonList("§7Ingame Time") + lineMap[9] = Collections.singletonList("§7IRL Time") + lineMap[10] = Collections.singletonList("§7Current Server") + lineMap[11] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //could be multiline, need to decide + + val slayerList = mutableListOf() + slayerList.add("§7Slayer") //get slayer stuff + lineMap[12] = slayerList + + lineMap[13] = Collections.singletonList("§7Next Event") + + val eventList = mutableListOf() + eventList.add("§cCurrent Event") //get event stuff + lineMap[14] = eventList + + lineMap[15] = Collections.singletonList("§7Soulflow") + lineMap[16] = Collections.singletonList("§cHeat") + + val partyList = mutableListOf() + partyList.add("§9Party") for (member in PartyAPI.partyMembers){ - addAsSingletonList(" §7- §7$member") + partyList.add(" §7- §7$member") //TODO: add max member amount, default 4 ig (since the player doenst count to the list) } + lineMap[17] = partyList + + lineMap[18] = Collections.singletonList("§7Pet") + lineMap[19] = Collections.singletonList("§7Quiver") + lineMap[20] = Collections.singletonList("§7Maxwell Power") - addAsSingletonList("§7Pet") - addAsSingletonList("§7Quiver (approximation)") - addAsSingletonList("§7Maxwell Power") + return formatDisplay(lineMap) } private fun getProfileTypeAsSymbol() : String{ if (HypixelData.ironman){ - return "§7♲" + return "§7♲ " } if (HypixelData.stranded){ - return "§a☀" + return "§a☀ " } if (HypixelData.bingo){ - return "§cⒷ" //TODO GET FUNNY BINGO SYMBOL, ALSO COLORS LOL + return "§cⒷ " //TODO COLORS LOL, maybe bingoAPI? idk } return "§e" } From 622b5d3e6829a0db7628269ee14517b29641eaa9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:25:11 +0200 Subject: [PATCH 003/225] Added max party list --- .../skyhanni/config/features/MiscConfig.java | 8 ++++++++ .../skyhanni/features/misc/CustomScoreboard.kt | 18 +++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 2f678b5cb53e..49efd7357a66 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -829,6 +829,14 @@ public static class CustomScoreboard { ) public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20)); + @Expose + @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") + @ConfigEditorSlider( + minValue = 1, + maxValue = 25, // why do I even set it so high + minStep = 1 + ) + public Property maxPartyList = Property.of(4); @Expose public Position position = new Position(10, 80, false, true); diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 01058674cea8..8187f7308876 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -19,6 +19,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent import java.util.* import kotlin.collections.HashMap +import kotlin.time.Duration.Companion.seconds class CustomScoreboard { private val config get() = SkyHanniMod.feature.misc.customScoreboard @@ -39,6 +40,18 @@ class CustomScoreboard { val newList = mutableListOf>() for (index in config.textFormat) { lineMap[index]?.let { + + //Multiline for Party Members (breaks nothing) + if (it[0] == "§9Party"){ + newList.add(listOf(it[0])) + for (item in it){ + if (item != it[0]){ + newList.add(listOf(item)) + } + } + continue + } + newList.add(it) } } @@ -75,9 +88,12 @@ class CustomScoreboard { lineMap[16] = Collections.singletonList("§cHeat") val partyList = mutableListOf() + var partyCount = 0 partyList.add("§9Party") for (member in PartyAPI.partyMembers){ - partyList.add(" §7- §7$member") //TODO: add max member amount, default 4 ig (since the player doenst count to the list) + if (partyCount == config.maxPartyList.get()) break + partyList.add(" §7- §7$member") + partyCount++ } lineMap[17] = partyList From 47a89970a78b38fa4d4f5d798b011b0f540f9ba9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:25:45 +0200 Subject: [PATCH 004/225] Removed useless imports --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 8187f7308876..bff42fca19c2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -10,16 +10,13 @@ import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.events.GuiRenderEvent -import at.hannibal2.skyhanni.features.garden.farming.GardenCropMilestoneDisplay import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent import java.util.* import kotlin.collections.HashMap -import kotlin.time.Duration.Companion.seconds class CustomScoreboard { private val config get() = SkyHanniMod.feature.misc.customScoreboard From 57dfa4e35242d730ce9018899083ac9ec88d8a7a Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 19 Oct 2023 15:38:27 +0200 Subject: [PATCH 005/225] Added more elements --- .../skyhanni/config/features/MiscConfig.java | 10 +++++--- .../features/misc/CustomScoreboard.kt | 23 +++++++++++++------ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 49efd7357a66..fa6b46bcc2cc 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -819,15 +819,19 @@ public static class CustomScoreboard { "§cSlayer", "§7Next Event", "§7Current Event", - "§3Soulflow", "§cHeat", "§9Party:\n- hannibal2\n- Moulberry\n- Vahvl\n- J10a1n15", "§7Pet", "§7Quiver (approximation)", - "§7Maxwell Power" + "§7Maxwell Power", + "§ewww.hypixel.net", + " ", + " ", + " ", + " " } ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20)); + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24)); @Expose @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index bff42fca19c2..79dabc629861 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -49,6 +49,11 @@ class CustomScoreboard { continue } + if(it[0] == ""){ + newList.add(listOf("")) + continue + } + newList.add(it) } } @@ -81,8 +86,7 @@ class CustomScoreboard { eventList.add("§cCurrent Event") //get event stuff lineMap[14] = eventList - lineMap[15] = Collections.singletonList("§7Soulflow") - lineMap[16] = Collections.singletonList("§cHeat") + lineMap[15] = Collections.singletonList("§cHeat") val partyList = mutableListOf() var partyCount = 0 @@ -92,11 +96,16 @@ class CustomScoreboard { partyList.add(" §7- §7$member") partyCount++ } - lineMap[17] = partyList - - lineMap[18] = Collections.singletonList("§7Pet") - lineMap[19] = Collections.singletonList("§7Quiver") - lineMap[20] = Collections.singletonList("§7Maxwell Power") + lineMap[16] = partyList + + lineMap[17] = Collections.singletonList("§7Pet") + lineMap[18] = Collections.singletonList("§7Quiver") + lineMap[19] = Collections.singletonList("§7Maxwell Power") + lineMap[20] = Collections.singletonList("§ewww.hypixel.net") + lineMap[21] = Collections.singletonList("") + lineMap[22] = Collections.singletonList("") + lineMap[23] = Collections.singletonList("") + lineMap[24] = Collections.singletonList("") return formatDisplay(lineMap) } From 3a4e4851fd844db1bd27aaa81cb69b0c532834d7 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 19 Oct 2023 16:54:45 +0200 Subject: [PATCH 006/225] Fixed issues with new elements --- .../skyhanni/config/features/MiscConfig.java | 9 ++--- .../features/misc/CustomScoreboard.kt | 37 +++++++++---------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index fa6b46bcc2cc..6035c3ab84b5 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -811,27 +811,26 @@ public static class CustomScoreboard { "§bBits", "§cCopper", "§aGems", + "", "§7Location", "§7Ingame Time", "§7IRL Time", "§7Current Server", "§2Mithril §r/ §dGemstone §7Powder", + "", "§cSlayer", "§7Next Event", "§7Current Event", + "", "§cHeat", "§9Party:\n- hannibal2\n- Moulberry\n- Vahvl\n- J10a1n15", "§7Pet", "§7Quiver (approximation)", "§7Maxwell Power", "§ewww.hypixel.net", - " ", - " ", - " ", - " " } ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24)); + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)); @Expose @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 79dabc629861..2adce5d31a4a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -70,23 +70,26 @@ class CustomScoreboard { lineMap[4] = Collections.singletonList("§bBits") lineMap[5] = Collections.singletonList("§cCopper") lineMap[6] = Collections.singletonList("§aGems") - lineMap[7] = Collections.singletonList("§7Location") - lineMap[8] = Collections.singletonList("§7Ingame Time") - lineMap[9] = Collections.singletonList("§7IRL Time") - lineMap[10] = Collections.singletonList("§7Current Server") - lineMap[11] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //could be multiline, need to decide + lineMap[7] = Collections.singletonList("") + lineMap[8] = Collections.singletonList("§7Location") + lineMap[9] = Collections.singletonList("§7Ingame Time") + lineMap[10] = Collections.singletonList("§7IRL Time") + lineMap[11] = Collections.singletonList("§7Current Server") + lineMap[12] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //could be multiline, need to decide + lineMap[13] = Collections.singletonList("") val slayerList = mutableListOf() slayerList.add("§7Slayer") //get slayer stuff - lineMap[12] = slayerList + lineMap[14] = slayerList - lineMap[13] = Collections.singletonList("§7Next Event") + lineMap[15] = Collections.singletonList("§7Next Event") val eventList = mutableListOf() eventList.add("§cCurrent Event") //get event stuff - lineMap[14] = eventList + lineMap[16] = eventList + lineMap[17] = Collections.singletonList("") - lineMap[15] = Collections.singletonList("§cHeat") + lineMap[18] = Collections.singletonList("§cHeat") val partyList = mutableListOf() var partyCount = 0 @@ -96,16 +99,12 @@ class CustomScoreboard { partyList.add(" §7- §7$member") partyCount++ } - lineMap[16] = partyList - - lineMap[17] = Collections.singletonList("§7Pet") - lineMap[18] = Collections.singletonList("§7Quiver") - lineMap[19] = Collections.singletonList("§7Maxwell Power") - lineMap[20] = Collections.singletonList("§ewww.hypixel.net") - lineMap[21] = Collections.singletonList("") - lineMap[22] = Collections.singletonList("") - lineMap[23] = Collections.singletonList("") - lineMap[24] = Collections.singletonList("") + lineMap[19] = partyList + + lineMap[20] = Collections.singletonList("§7Pet") + lineMap[21] = Collections.singletonList("§7Quiver") + lineMap[22] = Collections.singletonList("§7Maxwell Power") + lineMap[23] = Collections.singletonList("§ewww.hypixel.net") return formatDisplay(lineMap) } From d24d833111cb3b2db2e830fe64ed63ced2a4e4e9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 19 Oct 2023 18:10:00 +0200 Subject: [PATCH 007/225] Made PurseAPI public --- src/main/java/at/hannibal2/skyhanni/data/PurseAPI.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/data/PurseAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/PurseAPI.kt index d41e5ad7af0e..76d1f6fbb16c 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/PurseAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/PurseAPI.kt @@ -11,9 +11,12 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class PurseAPI { private val pattern = "(Piggy|Purse): §6(?[\\d,]*).*".toPattern() - private var currentPurse = 0.0 private var inventoryCloseTime = 0L + companion object { + var currentPurse = 0.0 + } + @SubscribeEvent fun onInventoryClose(event: InventoryCloseEvent) { inventoryCloseTime = System.currentTimeMillis() From 18f6a897a3f503f441d9c3bbbb9f270bcf849ddf Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 19 Oct 2023 20:11:19 +0200 Subject: [PATCH 008/225] added purse, bank, bits, copper & gems --- .../features/misc/CustomScoreboard.kt | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 2adce5d31a4a..59b11512b6e0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -9,18 +9,27 @@ package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.PartyAPI +import at.hannibal2.skyhanni.data.PurseAPI +import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.TabListData import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent import java.util.* -import kotlin.collections.HashMap class CustomScoreboard { private val config get() = SkyHanniMod.feature.misc.customScoreboard private var display = emptyList>() + private var purse = "0" + private var bank = "0" + private var bits = "0" + private var copper = "0" + private var gems = "0" + @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!config.enabled) return @@ -31,6 +40,18 @@ class CustomScoreboard { @SubscribeEvent fun onTick(event: TickEvent) { display = drawScoreboard() + + for (line in TabListData.getTabList()){ + if (line.startsWith(" Gems: §r§a")){ + gems = line.removePrefix(" Gems: §r§a") + } + if (line.startsWith(" Bank: §r§6")){ + bank = line.removePrefix(" Bank: §r§6") + } + } + bits = getBits() + purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) + copper = getCopper() } private fun formatDisplay(lineMap: HashMap>): MutableList> { @@ -65,11 +86,11 @@ class CustomScoreboard { val lineMap = HashMap>() lineMap[0] = Collections.singletonList("§6§lSKYBLOCK") lineMap[1] = Collections.singletonList("${getProfileTypeAsSymbol()}${HypixelData.profileName.firstLetterUppercase()}") - lineMap[2] = Collections.singletonList("§ePurse") - lineMap[3] = Collections.singletonList("§eBank") - lineMap[4] = Collections.singletonList("§bBits") - lineMap[5] = Collections.singletonList("§cCopper") - lineMap[6] = Collections.singletonList("§aGems") + lineMap[2] = Collections.singletonList("Purse: §6$purse") + lineMap[3] = Collections.singletonList("Bank: §6$bank") + lineMap[4] = Collections.singletonList("Bits: §b$bits") + lineMap[5] = Collections.singletonList("Copper: §c$copper") + lineMap[6] = Collections.singletonList("Gems: §a$gems") lineMap[7] = Collections.singletonList("") lineMap[8] = Collections.singletonList("§7Location") lineMap[9] = Collections.singletonList("§7Ingame Time") @@ -109,6 +130,24 @@ class CustomScoreboard { return formatDisplay(lineMap) } + private fun getBits() : String { + val bitsRegex = Regex("""Bits: ([\d|,]+)[\d|.]*""") + val scoreboard = ScoreboardData.sidebarLinesFormatted + val bits = scoreboard.firstOrNull { bitsRegex.matches(it.removeColor()) }?.let { + bitsRegex.find(it.removeColor())?.groupValues?.get(1) + } + return bits ?: "0" + } + + private fun getCopper() : String { + val copperRegex = Regex("""Copper: ([\d|,]+)[\d|.]*""") + val scoreboard = ScoreboardData.sidebarLinesFormatted + val copper = scoreboard.firstOrNull { copperRegex.matches(it.removeColor()) }?.let { + copperRegex.find(it.removeColor())?.groupValues?.get(1) + } + return copper ?: "0" + } + private fun getProfileTypeAsSymbol() : String{ if (HypixelData.ironman){ return "§7♲ " From 9dd5237bec50c17533f00f63f76e28f69fb7d2d1 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 19 Oct 2023 20:58:23 +0200 Subject: [PATCH 009/225] Added option to hide lines with no info --- .../skyhanni/config/features/MiscConfig.java | 6 +++++ .../features/misc/CustomScoreboard.kt | 23 ++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 6035c3ab84b5..0c474b063f07 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -841,6 +841,12 @@ public static class CustomScoreboard { ) public Property maxPartyList = Property.of(4); + @Expose + @ConfigOption(name = "Hide lines with no info", desc = "Hide lines that have no info to display, like hiding the party when not being in one.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideEmptyLines = true; + @Expose public Position position = new Position(10, 80, false, true); } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 59b11512b6e0..a985f1776e27 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -39,8 +39,10 @@ class CustomScoreboard { @SubscribeEvent fun onTick(event: TickEvent) { + // Draws the custom scoreboard display = drawScoreboard() + // Gets some values for the scoreboard for (line in TabListData.getTabList()){ if (line.startsWith(" Gems: §r§a")){ gems = line.removePrefix(" Gems: §r§a") @@ -59,7 +61,7 @@ class CustomScoreboard { for (index in config.textFormat) { lineMap[index]?.let { - //Multiline for Party Members (breaks nothing) + // Multiline for Party Members if (it[0] == "§9Party"){ newList.add(listOf(it[0])) for (item in it){ @@ -70,11 +72,17 @@ class CustomScoreboard { continue } + // Adds empty lines if(it[0] == ""){ newList.add(listOf("")) continue } + // Does not display this line + if(it[0] == ""){ + continue + } + newList.add(it) } } @@ -127,6 +135,19 @@ class CustomScoreboard { lineMap[22] = Collections.singletonList("§7Maxwell Power") lineMap[23] = Collections.singletonList("§ewww.hypixel.net") + // Hide empty lines + if (config.hideEmptyLines){ + lineMap[2] = Collections.singletonList(if(purse == "0") "" else "Purse: §6$purse") + lineMap[3] = Collections.singletonList(if(bank == "0") "" else "Bank: §6$bank") + lineMap[4] = Collections.singletonList(if(bits == "0") "" else "Bits: §b$bits") + lineMap[5] = Collections.singletonList(if(copper == "0") "" else "Copper: §c$copper") + lineMap[6] = Collections.singletonList(if(gems == "0") "" else "Gems: §a$gems") + + if (partyList.size == 1){ + lineMap[19] = Collections.singletonList("") + } + } + return formatDisplay(lineMap) } From 4be6f5c3342ba4e034379e71e5a44ce873f7d8a9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 19 Oct 2023 21:06:36 +0200 Subject: [PATCH 010/225] Fixed white screen issue with max party list count (hopefully) --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index a985f1776e27..a2f4c5bb6fdf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -124,7 +124,7 @@ class CustomScoreboard { var partyCount = 0 partyList.add("§9Party") for (member in PartyAPI.partyMembers){ - if (partyCount == config.maxPartyList.get()) break + if (partyCount >= config.maxPartyList.get()) break partyList.add(" §7- §7$member") partyCount++ } From d669b64b4919acabcee87257c2ab04c094340167 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 19 Oct 2023 22:26:13 +0200 Subject: [PATCH 011/225] Added ingame time --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 6 ++++-- src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index a2f4c5bb6fdf..70e5360cd747 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -17,6 +17,8 @@ import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.TabListData +import at.hannibal2.skyhanni.utils.TimeUtils.formatted +import io.github.moulberry.notenoughupdates.util.SkyBlockTime import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent import java.util.* @@ -100,8 +102,8 @@ class CustomScoreboard { lineMap[5] = Collections.singletonList("Copper: §c$copper") lineMap[6] = Collections.singletonList("Gems: §a$gems") lineMap[7] = Collections.singletonList("") - lineMap[8] = Collections.singletonList("§7Location") - lineMap[9] = Collections.singletonList("§7Ingame Time") + lineMap[8] = Collections.singletonList("§7⏣ ") + lineMap[9] = Collections.singletonList(SkyBlockTime.now().formatted(false)) lineMap[10] = Collections.singletonList("§7IRL Time") lineMap[11] = Collections.singletonList("§7Current Server") lineMap[12] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //could be multiline, need to decide diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt index 33a9bbe83aa7..92859717cdb8 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt @@ -119,7 +119,7 @@ object TimeUtils { }.toLong() } - fun SkyBlockTime.formatted(): String { + fun SkyBlockTime.formatted(hoursAndMinutes : Boolean = true): String { val hour = if (this.hour > 12) this.hour - 12 else this.hour val timeOfDay = if (this.hour > 11) "pm" else "am" // hooray for 12-hour clocks var minute = this.minute.toString() @@ -131,6 +131,9 @@ object TimeUtils { val day = this.day val daySuffix = SkyBlockTime.daySuffix(day) val year = this.year + + if (!hoursAndMinutes) return "$month $day$daySuffix, Year $year" // Early Winter 1st Year 300 + return "$month $day$daySuffix, Year $year $hour:${minute}$timeOfDay" // Early Winter 1st Year 300, 12:03pm } } From ad0739bcae81d73cc306d0922a5023623076aba0 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 19 Oct 2023 23:17:33 +0200 Subject: [PATCH 012/225] Added Skyblock location --- .../skyhanni/features/misc/CustomScoreboard.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 70e5360cd747..1c9ab7361f77 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -31,6 +31,7 @@ class CustomScoreboard { private var bits = "0" private var copper = "0" private var gems = "0" + private var location = "None" @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { @@ -53,6 +54,13 @@ class CustomScoreboard { bank = line.removePrefix(" Bank: §r§6") } } + + //todo add copper etc to this + for (line in ScoreboardData.sidebarLinesFormatted){ + if (line.startsWith(" §7⏣ ")){ + location = line.removePrefix(" §7⏣ ") + } + } bits = getBits() purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) copper = getCopper() @@ -102,7 +110,7 @@ class CustomScoreboard { lineMap[5] = Collections.singletonList("Copper: §c$copper") lineMap[6] = Collections.singletonList("Gems: §a$gems") lineMap[7] = Collections.singletonList("") - lineMap[8] = Collections.singletonList("§7⏣ ") + lineMap[8] = Collections.singletonList("§7⏣$location") lineMap[9] = Collections.singletonList(SkyBlockTime.now().formatted(false)) lineMap[10] = Collections.singletonList("§7IRL Time") lineMap[11] = Collections.singletonList("§7Current Server") From 456a6eb9357de31cbdc7a379553e16b03cb3075f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 19 Oct 2023 23:18:36 +0200 Subject: [PATCH 013/225] Made comments a lot better --- .../hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 1c9ab7361f77..6a1dc5c051a7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -114,17 +114,17 @@ class CustomScoreboard { lineMap[9] = Collections.singletonList(SkyBlockTime.now().formatted(false)) lineMap[10] = Collections.singletonList("§7IRL Time") lineMap[11] = Collections.singletonList("§7Current Server") - lineMap[12] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //could be multiline, need to decide + lineMap[12] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //todo: could be multiline, need to decide lineMap[13] = Collections.singletonList("") val slayerList = mutableListOf() - slayerList.add("§7Slayer") //get slayer stuff + slayerList.add("§7Slayer") //todo: get slayer stuff lineMap[14] = slayerList lineMap[15] = Collections.singletonList("§7Next Event") val eventList = mutableListOf() - eventList.add("§cCurrent Event") //get event stuff + eventList.add("§cCurrent Event") //todo: get event stuff lineMap[16] = eventList lineMap[17] = Collections.singletonList("") @@ -187,7 +187,7 @@ class CustomScoreboard { return "§a☀ " } if (HypixelData.bingo){ - return "§cⒷ " //TODO COLORS LOL, maybe bingoAPI? idk + return "§cⒷ " //TODO COLORS, maybe bingoAPI? idk } return "§e" } From a1e3a0a8613132dcc7f79132ccea33b907d9823e Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:34:32 +0200 Subject: [PATCH 014/225] Added rift to location & changed some formatting --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 6a1dc5c051a7..0b90ed779277 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -57,8 +57,8 @@ class CustomScoreboard { //todo add copper etc to this for (line in ScoreboardData.sidebarLinesFormatted){ - if (line.startsWith(" §7⏣ ")){ - location = line.removePrefix(" §7⏣ ") + if (line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ")){ + location = line } } bits = getBits() @@ -110,7 +110,7 @@ class CustomScoreboard { lineMap[5] = Collections.singletonList("Copper: §c$copper") lineMap[6] = Collections.singletonList("Gems: §a$gems") lineMap[7] = Collections.singletonList("") - lineMap[8] = Collections.singletonList("§7⏣$location") + lineMap[8] = Collections.singletonList(location) lineMap[9] = Collections.singletonList(SkyBlockTime.now().formatted(false)) lineMap[10] = Collections.singletonList("§7IRL Time") lineMap[11] = Collections.singletonList("§7Current Server") From 9a1c40c6b54bbe670b644b264ebf0540adc48b3a Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:10:27 +0200 Subject: [PATCH 015/225] Added motes (which auto hides purse, bank, bits & copper) --- .../skyhanni/features/misc/CustomScoreboard.kt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 0b90ed779277..af064b6df66b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -7,12 +7,10 @@ package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.HypixelData -import at.hannibal2.skyhanni.data.PartyAPI -import at.hannibal2.skyhanni.data.PurseAPI -import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.data.* import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.StringUtils.removeColor @@ -27,6 +25,7 @@ class CustomScoreboard { private val config get() = SkyHanniMod.feature.misc.customScoreboard private var display = emptyList>() private var purse = "0" + private var motes = "0" private var bank = "0" private var bits = "0" private var copper = "0" @@ -53,6 +52,9 @@ class CustomScoreboard { if (line.startsWith(" Bank: §r§6")){ bank = line.removePrefix(" Bank: §r§6") } + if (line.startsWith("Motes: §d")){ + motes = line.removePrefix("Motes: §d") + } } //todo add copper etc to this @@ -158,6 +160,14 @@ class CustomScoreboard { } } + // Rift + if(IslandType.THE_RIFT.isInIsland()){ + lineMap[2] = Collections.singletonList("Motes: §d$motes") + lineMap[3] = Collections.singletonList("") + lineMap[4] = Collections.singletonList("") + lineMap[5] = Collections.singletonList("") + } + return formatDisplay(lineMap) } From a283bdd4c66088cc14bb2e483ca3ee691b323683 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 21 Oct 2023 14:05:01 +0200 Subject: [PATCH 016/225] Added real time --- .../at/hannibal2/skyhanni/config/features/MiscConfig.java | 8 +++++++- .../hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 0c474b063f07..30b7671d5772 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -814,7 +814,7 @@ public static class CustomScoreboard { "", "§7Location", "§7Ingame Time", - "§7IRL Time", + "§Real Time", "§7Current Server", "§2Mithril §r/ §dGemstone §7Powder", "", @@ -847,6 +847,12 @@ public static class CustomScoreboard { @FeatureToggle public boolean hideEmptyLines = true; + @Expose + @ConfigOption(name = "24h format", desc = "Use 24h format for the IRL time.") + @ConfigEditorBoolean + @FeatureToggle + public boolean use24hFormat = false; + @Expose public Position position = new Position(10, 80, false, true); } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index af064b6df66b..aa0b7ac7b027 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -19,11 +19,14 @@ import at.hannibal2.skyhanni.utils.TimeUtils.formatted import io.github.moulberry.notenoughupdates.util.SkyBlockTime import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent +import java.text.SimpleDateFormat import java.util.* class CustomScoreboard { private val config get() = SkyHanniMod.feature.misc.customScoreboard private var display = emptyList>() + private val timeFormat24h = SimpleDateFormat("HH:mm:ss") + private val timeFormat12h = SimpleDateFormat("hh:mm:ss a") private var purse = "0" private var motes = "0" private var bank = "0" @@ -114,7 +117,7 @@ class CustomScoreboard { lineMap[7] = Collections.singletonList("") lineMap[8] = Collections.singletonList(location) lineMap[9] = Collections.singletonList(SkyBlockTime.now().formatted(false)) - lineMap[10] = Collections.singletonList("§7IRL Time") + lineMap[10] = Collections.singletonList((if (config.use24hFormat) timeFormat24h else timeFormat12h).format(System.currentTimeMillis())) lineMap[11] = Collections.singletonList("§7Current Server") lineMap[12] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //todo: could be multiline, need to decide lineMap[13] = Collections.singletonList("") From 125d34a71b0bb1864dd1ef114073ff273049fe3e Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 21 Oct 2023 15:56:06 +0200 Subject: [PATCH 017/225] Added lobby code --- .../skyhanni/features/misc/CustomScoreboard.kt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index aa0b7ac7b027..e896aae24a65 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -34,6 +34,7 @@ class CustomScoreboard { private var copper = "0" private var gems = "0" private var location = "None" + private var lobbyCode = "None" @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { @@ -65,6 +66,9 @@ class CustomScoreboard { if (line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ")){ location = line } + if (extractLobbyCode(line) is String ){ + lobbyCode = extractLobbyCode(line)!! + } } bits = getBits() purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) @@ -118,7 +122,7 @@ class CustomScoreboard { lineMap[8] = Collections.singletonList(location) lineMap[9] = Collections.singletonList(SkyBlockTime.now().formatted(false)) lineMap[10] = Collections.singletonList((if (config.use24hFormat) timeFormat24h else timeFormat12h).format(System.currentTimeMillis())) - lineMap[11] = Collections.singletonList("§7Current Server") + lineMap[11] = Collections.singletonList("§8$lobbyCode") lineMap[12] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //todo: could be multiline, need to decide lineMap[13] = Collections.singletonList("") @@ -157,6 +161,8 @@ class CustomScoreboard { lineMap[4] = Collections.singletonList(if(bits == "0") "" else "Bits: §b$bits") lineMap[5] = Collections.singletonList(if(copper == "0") "" else "Copper: §c$copper") lineMap[6] = Collections.singletonList(if(gems == "0") "" else "Gems: §a$gems") + lineMap[8] = Collections.singletonList(if(location == "None") "" else location) + lineMap[11] = Collections.singletonList(if(lobbyCode == "None") "" else "§8$lobbyCode") if (partyList.size == 1){ lineMap[19] = Collections.singletonList("") @@ -174,6 +180,12 @@ class CustomScoreboard { return formatDisplay(lineMap) } + private fun extractLobbyCode(input: String): String? { + val regex = Regex("§(\\d{3}/\\d{2}/\\d{2}) §([A-Za-z0-9]+)$") + val matchResult = regex.find(input) + return matchResult?.groupValues?.lastOrNull() + } + private fun getBits() : String { val bitsRegex = Regex("""Bits: ([\d|,]+)[\d|.]*""") val scoreboard = ScoreboardData.sidebarLinesFormatted From 130fdb49b23088e11b52f22f02792a56de01481c Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 21 Oct 2023 16:04:34 +0200 Subject: [PATCH 018/225] Fixed issue with lobby code extraction --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index e896aae24a65..16fcf8e9b3fe 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -67,7 +67,7 @@ class CustomScoreboard { location = line } if (extractLobbyCode(line) is String ){ - lobbyCode = extractLobbyCode(line)!! + lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of colorcode) } } bits = getBits() From 016993931d0849da0d7204e86ac385d3123442d3 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 21 Oct 2023 20:40:38 +0200 Subject: [PATCH 019/225] Fixed motes detection --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 16fcf8e9b3fe..5f28f6cca249 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -56,9 +56,6 @@ class CustomScoreboard { if (line.startsWith(" Bank: §r§6")){ bank = line.removePrefix(" Bank: §r§6") } - if (line.startsWith("Motes: §d")){ - motes = line.removePrefix("Motes: §d") - } } //todo add copper etc to this @@ -66,6 +63,9 @@ class CustomScoreboard { if (line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ")){ location = line } + if (line.startsWith("Motes: §d")){ + motes = line.removePrefix("Motes: §d") + } if (extractLobbyCode(line) is String ){ lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of colorcode) } From dee45098329ee1ed74c924e97a17f128e168cb3e Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 21 Oct 2023 21:47:52 +0200 Subject: [PATCH 020/225] Added Heat --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 5f28f6cca249..c2f7bcd2eb0a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -35,6 +35,7 @@ class CustomScoreboard { private var gems = "0" private var location = "None" private var lobbyCode = "None" + private var heat = "0" @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { @@ -69,6 +70,9 @@ class CustomScoreboard { if (extractLobbyCode(line) is String ){ lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of colorcode) } + if (line.startsWith("Heat: §c♨")){ + heat = line.removePrefix("Heat: §c♨") + } } bits = getBits() purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) @@ -137,7 +141,7 @@ class CustomScoreboard { lineMap[16] = eventList lineMap[17] = Collections.singletonList("") - lineMap[18] = Collections.singletonList("§cHeat") + lineMap[18] = Collections.singletonList("Heat: §c$heat") val partyList = mutableListOf() var partyCount = 0 From 5226e5abb2f761e9d1aa3f29dfa2132502a9191f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 21 Oct 2023 21:50:01 +0200 Subject: [PATCH 021/225] Added current mayor option --- .../skyhanni/config/features/MiscConfig.java | 3 ++- .../skyhanni/features/misc/CustomScoreboard.kt | 15 ++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 30b7671d5772..88cf607b06d0 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -821,6 +821,7 @@ public static class CustomScoreboard { "§cSlayer", "§7Next Event", "§7Current Event", + "§7Current Mayor", "", "§cHeat", "§9Party:\n- hannibal2\n- Moulberry\n- Vahvl\n- J10a1n15", @@ -830,7 +831,7 @@ public static class CustomScoreboard { "§ewww.hypixel.net", } ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)); + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24)); @Expose @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index c2f7bcd2eb0a..ff56d30eba92 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -139,9 +139,10 @@ class CustomScoreboard { val eventList = mutableListOf() eventList.add("§cCurrent Event") //todo: get event stuff lineMap[16] = eventList - lineMap[17] = Collections.singletonList("") - lineMap[18] = Collections.singletonList("Heat: §c$heat") + lineMap[17] = Collections.singletonList("§7Current Mayor") + lineMap[18] = Collections.singletonList("") + lineMap[19] = Collections.singletonList("Heat: §c$heat") val partyList = mutableListOf() var partyCount = 0 @@ -151,12 +152,12 @@ class CustomScoreboard { partyList.add(" §7- §7$member") partyCount++ } - lineMap[19] = partyList + lineMap[20] = partyList - lineMap[20] = Collections.singletonList("§7Pet") - lineMap[21] = Collections.singletonList("§7Quiver") - lineMap[22] = Collections.singletonList("§7Maxwell Power") - lineMap[23] = Collections.singletonList("§ewww.hypixel.net") + lineMap[21] = Collections.singletonList("§7Pet") + lineMap[22] = Collections.singletonList("§7Quiver") + lineMap[23] = Collections.singletonList("§7Maxwell Power") + lineMap[24] = Collections.singletonList("§ewww.hypixel.net") // Hide empty lines if (config.hideEmptyLines){ From c58ff465e005ec0d2002879eefab317940bdf562 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 21 Oct 2023 22:02:32 +0200 Subject: [PATCH 022/225] Added Pets, fixed heat --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index ff56d30eba92..e39f45406f27 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -142,7 +142,7 @@ class CustomScoreboard { lineMap[17] = Collections.singletonList("§7Current Mayor") lineMap[18] = Collections.singletonList("") - lineMap[19] = Collections.singletonList("Heat: §c$heat") + lineMap[19] = Collections.singletonList("Heat: §c♨$heat") val partyList = mutableListOf() var partyCount = 0 @@ -154,7 +154,7 @@ class CustomScoreboard { } lineMap[20] = partyList - lineMap[21] = Collections.singletonList("§7Pet") + lineMap[21] = Collections.singletonList(ProfileStorageData.profileSpecific?.currentPet ?: "") lineMap[22] = Collections.singletonList("§7Quiver") lineMap[23] = Collections.singletonList("§7Maxwell Power") lineMap[24] = Collections.singletonList("§ewww.hypixel.net") @@ -170,7 +170,7 @@ class CustomScoreboard { lineMap[11] = Collections.singletonList(if(lobbyCode == "None") "" else "§8$lobbyCode") if (partyList.size == 1){ - lineMap[19] = Collections.singletonList("") + lineMap[20] = Collections.singletonList("") } } From af2f0a4b681a1d2f959a026115cf86eb53a75375 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 21 Oct 2023 22:28:55 +0200 Subject: [PATCH 023/225] =?UTF-8?q?Added=20mayor=20stuff=20&=20=20fixed=20?= =?UTF-8?q?some=20stuff=F0=9F=94=A5=F0=9F=94=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skyhanni/config/features/MiscConfig.java | 6 +++++ .../hannibal2/skyhanni/data/MayorElection.kt | 2 +- .../features/misc/CustomScoreboard.kt | 24 ++++++++++++++----- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 88cf607b06d0..14a086bbe8d9 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -854,6 +854,12 @@ public static class CustomScoreboard { @FeatureToggle public boolean use24hFormat = false; + @Expose + @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") + @ConfigEditorBoolean + @FeatureToggle + public boolean showMayorPerks = true; + @Expose public Position position = new Position(10, 80, false, true); } diff --git a/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt b/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt index 2508391d985b..b9b2f7dc3b58 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt @@ -19,7 +19,7 @@ class MayorElection { companion object { var rawMayorData: MayorJson? = null var candidates = mapOf() - var currentCandidate: MayorJson.Candidate? = null + var currentCandidate: MayorJson.Candidate? = null //todo: should it not be called currentMayor? fun isPerkActive(mayor: String, perk: String) = currentCandidate?.let { currentCandidate -> currentCandidate.name == mayor && currentCandidate.perks.any { it.name == perk } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index e39f45406f27..5e3714d0219d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -68,7 +68,7 @@ class CustomScoreboard { motes = line.removePrefix("Motes: §d") } if (extractLobbyCode(line) is String ){ - lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of colorcode) + lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of color code) } if (line.startsWith("Heat: §c♨")){ heat = line.removePrefix("Heat: §c♨") @@ -86,11 +86,16 @@ class CustomScoreboard { // Multiline for Party Members if (it[0] == "§9Party"){ - newList.add(listOf(it[0])) for (item in it){ - if (item != it[0]){ - newList.add(listOf(item)) - } + newList.add(listOf(item)) + } + continue + } + + // Multiline for Mayor + if (it[0] == MayorElection.currentCandidate?.name){ + for (item in it){ + newList.add(listOf(item)) } continue } @@ -140,7 +145,13 @@ class CustomScoreboard { eventList.add("§cCurrent Event") //todo: get event stuff lineMap[16] = eventList - lineMap[17] = Collections.singletonList("§7Current Mayor") + val mayorList = mutableListOf() + mayorList.add(MayorElection.currentCandidate?.name ?: "") + for (perk in MayorElection.currentCandidate?.perks ?: emptyList()){ + mayorList.add(" §7- §e${perk.name}") + } + lineMap[17] = mayorList + lineMap[18] = Collections.singletonList("") lineMap[19] = Collections.singletonList("Heat: §c♨$heat") @@ -168,6 +179,7 @@ class CustomScoreboard { lineMap[6] = Collections.singletonList(if(gems == "0") "" else "Gems: §a$gems") lineMap[8] = Collections.singletonList(if(location == "None") "" else location) lineMap[11] = Collections.singletonList(if(lobbyCode == "None") "" else "§8$lobbyCode") + lineMap[19] = Collections.singletonList(if(heat == "0") "" else "Heat: §c♨$heat") if (partyList.size == 1){ lineMap[20] = Collections.singletonList("") From 1c066bdb58a5986dc7b420a79e85d05594da97a1 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 22 Oct 2023 10:59:59 +0200 Subject: [PATCH 024/225] Added an option to hide irrelevant lines --- .../skyhanni/config/features/MiscConfig.java | 7 ++++ .../features/misc/CustomScoreboard.kt | 42 +++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 14a086bbe8d9..2a394e4049db 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -848,6 +848,13 @@ public static class CustomScoreboard { @FeatureToggle public boolean hideEmptyLines = true; + @Expose + @ConfigOption(name = "Hide Info not relevant to location", desc = "Hide lines that are not relevant to the current location, like hiding copper while not in garden") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideIrrelevantLines = true; + + @Expose @ConfigOption(name = "24h format", desc = "Use 24h format for the IRL time.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 5e3714d0219d..fb526dd0bef7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -2,7 +2,8 @@ // Requested by alpaka8123 (https://discord.com/channels/997079228510117908/1162844830360146080) // Done by J10a1n15, with lots of help from hanni, and snippets from item tracker features <3 // - +// I'm also like really sorry for anyone who has to look at this code, it looks kinda bad +// package at.hannibal2.skyhanni.features.misc @@ -189,9 +190,42 @@ class CustomScoreboard { // Rift if(IslandType.THE_RIFT.isInIsland()){ lineMap[2] = Collections.singletonList("Motes: §d$motes") - lineMap[3] = Collections.singletonList("") - lineMap[4] = Collections.singletonList("") - lineMap[5] = Collections.singletonList("") + } + + // Hide irrelevant lines + if (config.hideIrrelevantLines){ + if (!IslandType.GARDEN.isInIsland()){ + lineMap[5] = Collections.singletonList("") // Copper + } + if (IslandType.THE_RIFT.isInIsland()){ + lineMap[3] = Collections.singletonList("") // Bank + lineMap[4] = Collections.singletonList("") // Bits + lineMap[6] = Collections.singletonList("") // Gems + lineMap[17] = Collections.singletonList("") // Mayor + } + if (!IslandType.DWARVEN_MINES.isInIsland() + && !IslandType.CRYSTAL_HOLLOWS.isInIsland() + ){ + lineMap[12] = Collections.singletonList("") // Powder + } + if (!IslandType.CRYSTAL_HOLLOWS.isInIsland()){ + lineMap[19] = Collections.singletonList("") // Heat + } + if (!IslandType.DUNGEON_HUB.isInIsland() + && !IslandType.CATACOMBS.isInIsland() + && !IslandType.KUUDRA_ARENA.isInIsland() + && !IslandType.CRIMSON_ISLE.isInIsland() + ){ + lineMap[20] = Collections.singletonList("") // Party + } + if (!IslandType.HUB.isInIsland() + && !IslandType.SPIDER_DEN.isInIsland() + && !IslandType.THE_PARK.isInIsland() + && !IslandType.THE_END.isInIsland() + && !IslandType.CRIMSON_ISLE.isInIsland() + ){ + lineMap[14] = Collections.singletonList("") // Slayer + } } return formatDisplay(lineMap) From 19a1156e7e122314a84030421c9d8f692ef81120 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 22 Oct 2023 14:01:17 +0200 Subject: [PATCH 025/225] Hotfix for isInIsland not working for catacombs --- .../hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index fb526dd0bef7..1ec39dd18681 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -28,6 +28,7 @@ class CustomScoreboard { private var display = emptyList>() private val timeFormat24h = SimpleDateFormat("HH:mm:ss") private val timeFormat12h = SimpleDateFormat("hh:mm:ss a") + private var inDungeon = false // Hotfix bc isInIsland doesnt seem to work private var purse = "0" private var motes = "0" private var bank = "0" @@ -74,6 +75,11 @@ class CustomScoreboard { if (line.startsWith("Heat: §c♨")){ heat = line.removePrefix("Heat: §c♨") } + if (line.contains("catacombs", true)){ + inDungeon = true + } else { + inDungeon = false + } } bits = getBits() purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) @@ -215,6 +221,7 @@ class CustomScoreboard { && !IslandType.CATACOMBS.isInIsland() && !IslandType.KUUDRA_ARENA.isInIsland() && !IslandType.CRIMSON_ISLE.isInIsland() + || inDungeon // Hotfix bc isInIsland doesnt seem to work ){ lineMap[20] = Collections.singletonList("") // Party } From e4be3d63ed961f640dd93b12e3e03115214d533f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 22 Oct 2023 14:38:06 +0200 Subject: [PATCH 026/225] Fixed dungeon detection not working (ty hanni) --- .../hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 7 ------- src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 1ec39dd18681..fb526dd0bef7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -28,7 +28,6 @@ class CustomScoreboard { private var display = emptyList>() private val timeFormat24h = SimpleDateFormat("HH:mm:ss") private val timeFormat12h = SimpleDateFormat("hh:mm:ss a") - private var inDungeon = false // Hotfix bc isInIsland doesnt seem to work private var purse = "0" private var motes = "0" private var bank = "0" @@ -75,11 +74,6 @@ class CustomScoreboard { if (line.startsWith("Heat: §c♨")){ heat = line.removePrefix("Heat: §c♨") } - if (line.contains("catacombs", true)){ - inDungeon = true - } else { - inDungeon = false - } } bits = getBits() purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) @@ -221,7 +215,6 @@ class CustomScoreboard { && !IslandType.CATACOMBS.isInIsland() && !IslandType.KUUDRA_ARENA.isInIsland() && !IslandType.CRIMSON_ISLE.isInIsland() - || inDungeon // Hotfix bc isInIsland doesnt seem to work ){ lineMap[20] = Collections.singletonList("") // Party } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt index d53dd4d1bd79..28afe3b4e2e3 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt @@ -430,7 +430,7 @@ object LorenzUtils { && tileSign.signText[3].unformattedText.removeColor() == "speed cap!") } - fun inIsland(island: IslandType) = inSkyBlock && skyBlockIsland == island + fun inIsland(island: IslandType) = inSkyBlock && (skyBlockIsland == island || island == IslandType.CATACOMBS && inDungeons) fun IslandType.isInIsland() = inIsland(this) From 7b68c609d0b8828db67b32f21316ebed0059b27f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 22 Oct 2023 22:13:31 +0200 Subject: [PATCH 027/225] Added indexes instead of plain numbers --- .../java/at/hannibal2/skyhanni/SkyHanniMod.kt | 1 + .../features/misc/CustomScoreboard.kt | 109 +++++++++++------- 2 files changed, 68 insertions(+), 42 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 36762452f438..933fddca1182 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -609,6 +609,7 @@ class SkyHanniMod { loadModule(ShiftClickEquipment()) loadModule(LockMouseLook) loadModule(DungeonFinderFeatures()) + loadModule(CustomScoreboard()) init() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index fb526dd0bef7..18689d599ecb 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -38,6 +38,31 @@ class CustomScoreboard { private var lobbyCode = "None" private var heat = "0" + // Indexes for the scoreboard + private var skyblockIndex = 0 + private var profileIndex = 1 + private var purseIndex = 2 + private var bankIndex = 3 + private var bitsIndex = 4 + private var copperIndex = 5 + private var gemsIndex = 6 + private var locationIndex = 8 + private var skyblockTimeIndex = 9 + private var irlTimeIndex = 10 + private var lobbyCodeIndex = 11 + private var powderIndex = 12 + private var slayerIndex = 14 + private var nextEventIndex = 15 + private var currentEventIndex = 16 + private var mayorIndex = 17 + private var heatIndex = 19 + private var partyIndex = 20 + private var petIndex = 21 + private var quiverIndex = 22 + private var maxwellIndex = 23 + private var websiteIndex = 24 + + @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!config.enabled) return @@ -121,40 +146,40 @@ class CustomScoreboard { private fun drawScoreboard() = buildList> { val lineMap = HashMap>() - lineMap[0] = Collections.singletonList("§6§lSKYBLOCK") - lineMap[1] = Collections.singletonList("${getProfileTypeAsSymbol()}${HypixelData.profileName.firstLetterUppercase()}") - lineMap[2] = Collections.singletonList("Purse: §6$purse") - lineMap[3] = Collections.singletonList("Bank: §6$bank") - lineMap[4] = Collections.singletonList("Bits: §b$bits") - lineMap[5] = Collections.singletonList("Copper: §c$copper") - lineMap[6] = Collections.singletonList("Gems: §a$gems") + lineMap[skyblockIndex] = Collections.singletonList("§6§lSKYBLOCK") + lineMap[profileIndex] = Collections.singletonList("${getProfileTypeAsSymbol()}${HypixelData.profileName.firstLetterUppercase()}") + lineMap[purseIndex] = Collections.singletonList("Purse: §6$purse") + lineMap[bankIndex] = Collections.singletonList("Bank: §6$bank") + lineMap[bitsIndex] = Collections.singletonList("Bits: §b$bits") + lineMap[copperIndex] = Collections.singletonList("Copper: §c$copper") + lineMap[gemsIndex] = Collections.singletonList("Gems: §a$gems") lineMap[7] = Collections.singletonList("") - lineMap[8] = Collections.singletonList(location) - lineMap[9] = Collections.singletonList(SkyBlockTime.now().formatted(false)) - lineMap[10] = Collections.singletonList((if (config.use24hFormat) timeFormat24h else timeFormat12h).format(System.currentTimeMillis())) - lineMap[11] = Collections.singletonList("§8$lobbyCode") - lineMap[12] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //todo: could be multiline, need to decide + lineMap[locationIndex] = Collections.singletonList(location) + lineMap[skyblockTimeIndex] = Collections.singletonList(SkyBlockTime.now().formatted(false)) + lineMap[irlTimeIndex] = Collections.singletonList((if (config.use24hFormat) timeFormat24h else timeFormat12h).format(System.currentTimeMillis())) + lineMap[lobbyCodeIndex] = Collections.singletonList("§8$lobbyCode") + lineMap[powderIndex] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //todo: could be multiline, need to decide lineMap[13] = Collections.singletonList("") val slayerList = mutableListOf() slayerList.add("§7Slayer") //todo: get slayer stuff - lineMap[14] = slayerList + lineMap[slayerIndex] = slayerList - lineMap[15] = Collections.singletonList("§7Next Event") + lineMap[nextEventIndex] = Collections.singletonList("§7Next Event") val eventList = mutableListOf() eventList.add("§cCurrent Event") //todo: get event stuff - lineMap[16] = eventList + lineMap[currentEventIndex] = eventList val mayorList = mutableListOf() mayorList.add(MayorElection.currentCandidate?.name ?: "") for (perk in MayorElection.currentCandidate?.perks ?: emptyList()){ mayorList.add(" §7- §e${perk.name}") } - lineMap[17] = mayorList + lineMap[mayorIndex] = mayorList lineMap[18] = Collections.singletonList("") - lineMap[19] = Collections.singletonList("Heat: §c♨$heat") + lineMap[heatIndex] = Collections.singletonList("Heat: §c♨$heat") val partyList = mutableListOf() var partyCount = 0 @@ -164,59 +189,59 @@ class CustomScoreboard { partyList.add(" §7- §7$member") partyCount++ } - lineMap[20] = partyList + lineMap[partyIndex] = partyList - lineMap[21] = Collections.singletonList(ProfileStorageData.profileSpecific?.currentPet ?: "") - lineMap[22] = Collections.singletonList("§7Quiver") - lineMap[23] = Collections.singletonList("§7Maxwell Power") - lineMap[24] = Collections.singletonList("§ewww.hypixel.net") + lineMap[petIndex] = Collections.singletonList(ProfileStorageData.profileSpecific?.currentPet ?: "") + lineMap[quiverIndex] = Collections.singletonList("§7Quiver") + lineMap[maxwellIndex] = Collections.singletonList("§7Maxwell Power") + lineMap[websiteIndex] = Collections.singletonList("§ewww.hypixel.net") // Hide empty lines if (config.hideEmptyLines){ - lineMap[2] = Collections.singletonList(if(purse == "0") "" else "Purse: §6$purse") - lineMap[3] = Collections.singletonList(if(bank == "0") "" else "Bank: §6$bank") - lineMap[4] = Collections.singletonList(if(bits == "0") "" else "Bits: §b$bits") - lineMap[5] = Collections.singletonList(if(copper == "0") "" else "Copper: §c$copper") - lineMap[6] = Collections.singletonList(if(gems == "0") "" else "Gems: §a$gems") - lineMap[8] = Collections.singletonList(if(location == "None") "" else location) - lineMap[11] = Collections.singletonList(if(lobbyCode == "None") "" else "§8$lobbyCode") - lineMap[19] = Collections.singletonList(if(heat == "0") "" else "Heat: §c♨$heat") + lineMap[purseIndex] = Collections.singletonList(if(purse == "0") "" else "Purse: §6$purse") + lineMap[bankIndex] = Collections.singletonList(if(bank == "0") "" else "Bank: §6$bank") + lineMap[bitsIndex] = Collections.singletonList(if(bits == "0") "" else "Bits: §b$bits") + lineMap[copperIndex] = Collections.singletonList(if(copper == "0") "" else "Copper: §c$copper") + lineMap[gemsIndex] = Collections.singletonList(if(gems == "0") "" else "Gems: §a$gems") + lineMap[locationIndex] = Collections.singletonList(if(location == "None") "" else location) + lineMap[lobbyCodeIndex] = Collections.singletonList(if(lobbyCode == "None") "" else "§8$lobbyCode") + lineMap[heatIndex] = Collections.singletonList(if(heat == "0") "" else "Heat: §c♨$heat") if (partyList.size == 1){ - lineMap[20] = Collections.singletonList("") + lineMap[partyIndex] = Collections.singletonList("") } } // Rift if(IslandType.THE_RIFT.isInIsland()){ - lineMap[2] = Collections.singletonList("Motes: §d$motes") + lineMap[purseIndex] = Collections.singletonList("Motes: §d$motes") } // Hide irrelevant lines if (config.hideIrrelevantLines){ if (!IslandType.GARDEN.isInIsland()){ - lineMap[5] = Collections.singletonList("") // Copper + lineMap[copperIndex] = Collections.singletonList("") } if (IslandType.THE_RIFT.isInIsland()){ - lineMap[3] = Collections.singletonList("") // Bank - lineMap[4] = Collections.singletonList("") // Bits - lineMap[6] = Collections.singletonList("") // Gems - lineMap[17] = Collections.singletonList("") // Mayor + lineMap[bankIndex] = Collections.singletonList("") + lineMap[bitsIndex] = Collections.singletonList("") + lineMap[gemsIndex] = Collections.singletonList("") + lineMap[mayorIndex] = Collections.singletonList("") } if (!IslandType.DWARVEN_MINES.isInIsland() && !IslandType.CRYSTAL_HOLLOWS.isInIsland() ){ - lineMap[12] = Collections.singletonList("") // Powder + lineMap[powderIndex] = Collections.singletonList("") } if (!IslandType.CRYSTAL_HOLLOWS.isInIsland()){ - lineMap[19] = Collections.singletonList("") // Heat + lineMap[heatIndex] = Collections.singletonList("") } if (!IslandType.DUNGEON_HUB.isInIsland() && !IslandType.CATACOMBS.isInIsland() && !IslandType.KUUDRA_ARENA.isInIsland() && !IslandType.CRIMSON_ISLE.isInIsland() ){ - lineMap[20] = Collections.singletonList("") // Party + lineMap[partyIndex] = Collections.singletonList("") } if (!IslandType.HUB.isInIsland() && !IslandType.SPIDER_DEN.isInIsland() @@ -224,7 +249,7 @@ class CustomScoreboard { && !IslandType.THE_END.isInIsland() && !IslandType.CRIMSON_ISLE.isInIsland() ){ - lineMap[14] = Collections.singletonList("") // Slayer + lineMap[slayerIndex] = Collections.singletonList("") } } @@ -267,4 +292,4 @@ class CustomScoreboard { } return "§e" } -} \ No newline at end of file +} From 69e9937e4d43efaeec9d16aeed9a312be69ea518 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 22 Oct 2023 22:15:08 +0200 Subject: [PATCH 028/225] Changes the way of getting copper & bits --- .../features/misc/CustomScoreboard.kt | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 18689d599ecb..bbad315ccc8d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -85,7 +85,6 @@ class CustomScoreboard { } } - //todo add copper etc to this for (line in ScoreboardData.sidebarLinesFormatted){ if (line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ")){ location = line @@ -99,10 +98,14 @@ class CustomScoreboard { if (line.startsWith("Heat: §c♨")){ heat = line.removePrefix("Heat: §c♨") } + if (line.startsWith("Bits: §b")){ + bits = line.removePrefix("Bits: §b") + } + if (line.startsWith("Copper: §c")){ + copper = line.removePrefix("Copper: §c") + } } - bits = getBits() purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) - copper = getCopper() } private fun formatDisplay(lineMap: HashMap>): MutableList> { @@ -262,24 +265,6 @@ class CustomScoreboard { return matchResult?.groupValues?.lastOrNull() } - private fun getBits() : String { - val bitsRegex = Regex("""Bits: ([\d|,]+)[\d|.]*""") - val scoreboard = ScoreboardData.sidebarLinesFormatted - val bits = scoreboard.firstOrNull { bitsRegex.matches(it.removeColor()) }?.let { - bitsRegex.find(it.removeColor())?.groupValues?.get(1) - } - return bits ?: "0" - } - - private fun getCopper() : String { - val copperRegex = Regex("""Copper: ([\d|,]+)[\d|.]*""") - val scoreboard = ScoreboardData.sidebarLinesFormatted - val copper = scoreboard.firstOrNull { copperRegex.matches(it.removeColor()) }?.let { - copperRegex.find(it.removeColor())?.groupValues?.get(1) - } - return copper ?: "0" - } - private fun getProfileTypeAsSymbol() : String{ if (HypixelData.ironman){ return "§7♲ " From 9ed44f3a69f663d6499bbb88713f8062dea5317e Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 22 Oct 2023 23:20:35 +0200 Subject: [PATCH 029/225] Changed some code structure (small change) --- .../features/misc/CustomScoreboard.kt | 32 +++++++------------ 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index bbad315ccc8d..865bb40484f7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -113,17 +113,11 @@ class CustomScoreboard { for (index in config.textFormat) { lineMap[index]?.let { - // Multiline for Party Members - if (it[0] == "§9Party"){ - for (item in it){ - newList.add(listOf(item)) - } - continue - } - - // Multiline for Mayor - if (it[0] == MayorElection.currentCandidate?.name){ - for (item in it){ + // Multiline support + if (it[0] == "§9Party" + || it[0] == MayorElection.currentCandidate?.name + ) { + for (item in it) { newList.add(listOf(item)) } continue @@ -265,16 +259,12 @@ class CustomScoreboard { return matchResult?.groupValues?.lastOrNull() } - private fun getProfileTypeAsSymbol() : String{ - if (HypixelData.ironman){ - return "§7♲ " - } - if (HypixelData.stranded){ - return "§a☀ " - } - if (HypixelData.bingo){ - return "§cⒷ " //TODO COLORS, maybe bingoAPI? idk + private fun getProfileTypeAsSymbol(): String { + return when { + HypixelData.ironman -> "§7♲ " // Ironman + HypixelData.stranded -> "§a☀ " // Stranded + HypixelData.bingo -> "§cⒷ " // Bingo - TODO: Consider using colors from BingoAPI + else -> "§e" // Default case } - return "§e" } } From 8f2604b235e3c31a3cea740029b8ca904a84b442 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 24 Oct 2023 20:16:48 +0200 Subject: [PATCH 030/225] Added todolist --- .../skyhanni/features/misc/CustomScoreboard.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 865bb40484f7..77597376a4e4 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -5,6 +5,23 @@ // I'm also like really sorry for anyone who has to look at this code, it looks kinda bad // +// +// TODO LIST +// V1 RELEASE +// - Add dungeon secrets +// - combine date and lobby +// - toggle between " " and " " +// - Hide default scoreboard +// - only show quiver when holding a bow (detect with 9th slot) +// - mayor color (from neu) +// +// V2 RELEASE +// - Soulflow API +// - Bank API +// - Custom Scoreboard Background +// - icons +// + package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod From f36c0913f432bb279538c7bd9144f92ab7f0c854 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 25 Oct 2023 19:56:07 +0200 Subject: [PATCH 031/225] Added sblevel, Removed Pet --- .../at/hannibal2/skyhanni/config/features/MiscConfig.java | 2 +- .../hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 3dd69cfe15d4..b347170fdeed 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -826,7 +826,7 @@ public static class CustomScoreboard { "", "§cHeat", "§9Party:\n- hannibal2\n- Moulberry\n- Vahvl\n- J10a1n15", - "§7Pet", + "§7Skyblock Level", "§7Quiver (approximation)", "§7Maxwell Power", "§ewww.hypixel.net", diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 77597376a4e4..4f1d746d9d1a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -8,12 +8,12 @@ // // TODO LIST // V1 RELEASE -// - Add dungeon secrets // - combine date and lobby // - toggle between " " and " " // - Hide default scoreboard // - only show quiver when holding a bow (detect with 9th slot) // - mayor color (from neu) +// - beacon power // // V2 RELEASE // - Soulflow API @@ -31,7 +31,6 @@ import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase -import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.TabListData import at.hannibal2.skyhanni.utils.TimeUtils.formatted import io.github.moulberry.notenoughupdates.util.SkyBlockTime @@ -74,7 +73,7 @@ class CustomScoreboard { private var mayorIndex = 17 private var heatIndex = 19 private var partyIndex = 20 - private var petIndex = 21 + private var sblevelIndex = 21 private var quiverIndex = 22 private var maxwellIndex = 23 private var websiteIndex = 24 @@ -205,7 +204,7 @@ class CustomScoreboard { } lineMap[partyIndex] = partyList - lineMap[petIndex] = Collections.singletonList(ProfileStorageData.profileSpecific?.currentPet ?: "") + lineMap[sblevelIndex] = Collections.singletonList("§7Skyblock Level") lineMap[quiverIndex] = Collections.singletonList("§7Quiver") lineMap[maxwellIndex] = Collections.singletonList("§7Maxwell Power") lineMap[websiteIndex] = Collections.singletonList("§ewww.hypixel.net") From aafa6560e697fdeacbf452bea820f59ef281f0ba Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:09:17 +0200 Subject: [PATCH 032/225] Added copy actionbar command --- .../skyhanni/config/commands/Commands.kt | 5 +++++ .../skyhanni/data/ActionBarStatsData.kt | 3 +++ .../skyhanni/test/command/CopyActionBar.kt | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt index 3566d7c36ff2..038548356992 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -35,6 +35,7 @@ import at.hannibal2.skyhanni.test.PacketTest import at.hannibal2.skyhanni.test.SkyHanniConfigSearchResetCommand import at.hannibal2.skyhanni.test.SkyHanniDebugsAndTests import at.hannibal2.skyhanni.test.TestBingo +import at.hannibal2.skyhanni.test.command.CopyActionBar import at.hannibal2.skyhanni.test.command.CopyItemCommand import at.hannibal2.skyhanni.test.command.CopyNearbyEntitiesCommand import at.hannibal2.skyhanni.test.command.CopyNearbyParticlesCommand @@ -284,6 +285,10 @@ object Commands { "shplaysound", "Play the specified sound effect at the given pitch and volume." ) { SoundUtils.command(it) } + registerCommand( + "shcopyactionbar", + "Copies the actionbar to the clipboard" + ) { CopyActionBar.command(it) } } private fun internalCommands() { diff --git a/src/main/java/at/hannibal2/skyhanni/data/ActionBarStatsData.kt b/src/main/java/at/hannibal2/skyhanni/data/ActionBarStatsData.kt index 873119171ddb..1c9cbb720b44 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/ActionBarStatsData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/ActionBarStatsData.kt @@ -14,11 +14,14 @@ object ActionBarStatsData { ) var groups = mutableMapOf("health" to "", "riftTime" to "", "defense" to "", "mana" to "") + var actionBar = "" @SubscribeEvent fun onActionBar(event: LorenzActionBarEvent) { if (!LorenzUtils.inSkyBlock) return + actionBar = event.message + for ((groupName, pattern) in patterns) { pattern.matchMatcher(event.message) { groups[groupName] = group(groupName) diff --git a/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt b/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt new file mode 100644 index 000000000000..8e94684af699 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt @@ -0,0 +1,18 @@ +package at.hannibal2.skyhanni.test.command + +import at.hannibal2.skyhanni.data.ActionBarStatsData +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.transformIf +import at.hannibal2.skyhanni.utils.OSUtils +import at.hannibal2.skyhanni.utils.StringUtils.removeColor + +object CopyActionBar { + fun command(args: Array) { + val noColor = args.size == 1 && args[0] == "true" + var string = "" + string = ActionBarStatsData.actionBar.transformIf({noColor}) { removeColor() } + + OSUtils.copyToClipboard(string) + LorenzUtils.chat("§e[SkyHanni] actionbar copied into your clipboard!") + } +} From d6ab98bc2ece4d923d9e5162ea87cb312de34f5c Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:16:26 +0200 Subject: [PATCH 033/225] Changed some elements --- .../skyhanni/config/features/MiscConfig.java | 5 +-- .../features/misc/CustomScoreboard.kt | 38 ++++++++----------- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index b347170fdeed..1dfbb2056770 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -815,24 +815,21 @@ public static class CustomScoreboard { "", "§7Location", "§7Ingame Time", - "§Real Time", "§7Current Server", "§2Mithril §r/ §dGemstone §7Powder", "", "§cSlayer", - "§7Next Event", "§7Current Event", "§7Current Mayor", "", "§cHeat", "§9Party:\n- hannibal2\n- Moulberry\n- Vahvl\n- J10a1n15", "§7Skyblock Level", - "§7Quiver (approximation)", "§7Maxwell Power", "§ewww.hypixel.net", } ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24)); + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21)); @Expose @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 4f1d746d9d1a..8ab6facf2fbe 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -8,18 +8,18 @@ // // TODO LIST // V1 RELEASE -// - combine date and lobby +// - enums prob (why) // - toggle between " " and " " // - Hide default scoreboard -// - only show quiver when holding a bow (detect with 9th slot) // - mayor color (from neu) -// - beacon power // // V2 RELEASE // - Soulflow API // - Bank API // - Custom Scoreboard Background +// - quiver // - icons +// - beacon power // package at.hannibal2.skyhanni.features.misc @@ -42,8 +42,6 @@ import java.util.* class CustomScoreboard { private val config get() = SkyHanniMod.feature.misc.customScoreboard private var display = emptyList>() - private val timeFormat24h = SimpleDateFormat("HH:mm:ss") - private val timeFormat12h = SimpleDateFormat("hh:mm:ss a") private var purse = "0" private var motes = "0" private var bank = "0" @@ -62,21 +60,21 @@ class CustomScoreboard { private var bitsIndex = 4 private var copperIndex = 5 private var gemsIndex = 6 + private var locationIndex = 8 private var skyblockTimeIndex = 9 - private var irlTimeIndex = 10 - private var lobbyCodeIndex = 11 - private var powderIndex = 12 - private var slayerIndex = 14 - private var nextEventIndex = 15 - private var currentEventIndex = 16 - private var mayorIndex = 17 - private var heatIndex = 19 - private var partyIndex = 20 - private var sblevelIndex = 21 - private var quiverIndex = 22 - private var maxwellIndex = 23 - private var websiteIndex = 24 + private var lobbyCodeIndex = 10 + private var powderIndex = 11 + + private var slayerIndex = 13 + private var currentEventIndex = 14 + private var mayorIndex = 15 + + private var heatIndex = 17 + private var partyIndex = 18 + private var sblevelIndex = 19 + private var maxwellIndex = 20 + private var websiteIndex = 21 @SubscribeEvent @@ -169,7 +167,6 @@ class CustomScoreboard { lineMap[7] = Collections.singletonList("") lineMap[locationIndex] = Collections.singletonList(location) lineMap[skyblockTimeIndex] = Collections.singletonList(SkyBlockTime.now().formatted(false)) - lineMap[irlTimeIndex] = Collections.singletonList((if (config.use24hFormat) timeFormat24h else timeFormat12h).format(System.currentTimeMillis())) lineMap[lobbyCodeIndex] = Collections.singletonList("§8$lobbyCode") lineMap[powderIndex] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //todo: could be multiline, need to decide lineMap[13] = Collections.singletonList("") @@ -178,8 +175,6 @@ class CustomScoreboard { slayerList.add("§7Slayer") //todo: get slayer stuff lineMap[slayerIndex] = slayerList - lineMap[nextEventIndex] = Collections.singletonList("§7Next Event") - val eventList = mutableListOf() eventList.add("§cCurrent Event") //todo: get event stuff lineMap[currentEventIndex] = eventList @@ -205,7 +200,6 @@ class CustomScoreboard { lineMap[partyIndex] = partyList lineMap[sblevelIndex] = Collections.singletonList("§7Skyblock Level") - lineMap[quiverIndex] = Collections.singletonList("§7Quiver") lineMap[maxwellIndex] = Collections.singletonList("§7Maxwell Power") lineMap[websiteIndex] = Collections.singletonList("§ewww.hypixel.net") From b9741079562cdf7bda6fa568bc832a595213a5b9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 26 Oct 2023 18:34:12 +0200 Subject: [PATCH 034/225] Added skyblocklevelAPI --- .../java/at/hannibal2/skyhanni/SkyHanniMod.kt | 2 + .../skyhanni/data/SkyblockLevelAPI.kt | 37 +++++++++++++++++++ .../features/misc/CustomScoreboard.kt | 16 +++++++- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 933fddca1182..b8551e2c7538 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -33,6 +33,7 @@ import at.hannibal2.skyhanni.data.RenderData import at.hannibal2.skyhanni.data.SackAPI import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SkillExperience +import at.hannibal2.skyhanni.data.SkyblockLevelAPI import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.data.TitleData import at.hannibal2.skyhanni.data.TitleManager @@ -380,6 +381,7 @@ class SkyHanniMod { loadModule(RiftAPI) loadModule(SackAPI) loadModule(BingoAPI) + loadModule(SkyblockLevelAPI) // features loadModule(BazaarOrderHelper()) diff --git a/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt new file mode 100644 index 000000000000..74cb8b01cdf1 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt @@ -0,0 +1,37 @@ +package at.hannibal2.skyhanni.data + +import at.hannibal2.skyhanni.events.LorenzActionBarEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class SkyblockLevelAPI { + companion object { + var currentLvl: Int = 0 + var xpSource = "" + var currentProgress = 0.0 + } + + @SubscribeEvent + fun onActionBarUpdate (event: LorenzActionBarEvent){ + val info = extractInfo(event.message) + + if (info.isNotEmpty()) { + currentLvl = info[0].toInt() + xpSource = info[1] + currentProgress = info[2].toDouble() + } + } + + private fun extractInfo(inputString: String): List { + val regexPattern = """§b\+(\d+) SkyBlock XP §7\(([^§]+)§7\)§b \((\d+)/100\)""" + val regex = Regex(regexPattern) + + val matchResult = regex.find(inputString) + + return if (matchResult != null) { + val (xpValue, source, progress) = matchResult.destructured + listOf(xpValue, source, progress) + } else { + emptyList() + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 8ab6facf2fbe..514b28992324 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -180,7 +180,7 @@ class CustomScoreboard { lineMap[currentEventIndex] = eventList val mayorList = mutableListOf() - mayorList.add(MayorElection.currentCandidate?.name ?: "") + mayorList.add(MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "") for (perk in MayorElection.currentCandidate?.perks ?: emptyList()){ mayorList.add(" §7- §e${perk.name}") } @@ -263,6 +263,20 @@ class CustomScoreboard { return formatDisplay(lineMap) } + private fun translateMayorNameToColor(input: String) : String { + return when (input) { + "Aatrox" -> "§3$input" + "Cole" -> "§e$input" + "Diana" -> "§2$input" + "Diaz" -> "§6$input" + "Finnegan" -> "§c$input" + "Foxy" -> "§d$input" + "Marina" -> "§b$input" + "Paul" -> "§c$input" + else -> "§7$input" + } + } + private fun extractLobbyCode(input: String): String? { val regex = Regex("§(\\d{3}/\\d{2}/\\d{2}) §([A-Za-z0-9]+)$") val matchResult = regex.find(input) From 8ac6938a7c8e5ac44320bc8533cf108da563b803 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 26 Oct 2023 18:48:55 +0200 Subject: [PATCH 035/225] Added sblevel to scoreboard --- .../skyhanni/config/features/MiscConfig.java | 9 +++--- .../skyhanni/data/SkyblockLevelAPI.kt | 30 ++++++++++++++++--- .../features/misc/CustomScoreboard.kt | 14 +++++++-- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 1dfbb2056770..322912f24749 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -852,18 +852,17 @@ public static class CustomScoreboard { @FeatureToggle public boolean hideIrrelevantLines = true; - @Expose - @ConfigOption(name = "24h format", desc = "Use 24h format for the IRL time.") + @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") @ConfigEditorBoolean @FeatureToggle - public boolean use24hFormat = false; + public boolean showMayorPerks = true; @Expose - @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") + @ConfigOption(name = "Show SkyBlock Level Progress", desc = "Show the progress to the next SkyBlock level.") @ConfigEditorBoolean @FeatureToggle - public boolean showMayorPerks = true; + public boolean showSblvlProgess = false; @Expose public Position position = new Position(10, 80, false, true); diff --git a/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt index 74cb8b01cdf1..fe2135561b05 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt @@ -1,13 +1,17 @@ package at.hannibal2.skyhanni.data import at.hannibal2.skyhanni.events.LorenzActionBarEvent +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.TabListData import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent class SkyblockLevelAPI { companion object { - var currentLvl: Int = 0 + var currentLevel: Int = 0 var xpSource = "" - var currentProgress = 0.0 + var currentProgress = "" } @SubscribeEvent @@ -15,9 +19,27 @@ class SkyblockLevelAPI { val info = extractInfo(event.message) if (info.isNotEmpty()) { - currentLvl = info[0].toInt() + currentLevel = info[0].toInt() xpSource = info[1] - currentProgress = info[2].toDouble() + currentProgress = info[2] + } + } + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent){ + if (currentLevel == 0) return + + if (event.phase == TickEvent.Phase.END) { + val player = LorenzUtils.getPlayerName() + val tabData = TabListData.getTabList() + val levelRegex = Regex("""\[(\d{1,3})] $player""") + for (line in tabData) { + if (line.contains(player)) { + val colorlessLine = line.removeColor() + currentLevel = levelRegex.find(colorlessLine)!!.groupValues[1].toInt() + break + } + } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 514b28992324..9204d01c0ee2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -181,8 +181,10 @@ class CustomScoreboard { val mayorList = mutableListOf() mayorList.add(MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "") - for (perk in MayorElection.currentCandidate?.perks ?: emptyList()){ - mayorList.add(" §7- §e${perk.name}") + if (config.showMayorPerks) { + for (perk in MayorElection.currentCandidate?.perks ?: emptyList()) { + mayorList.add(" §7- §e${perk.name}") + } } lineMap[mayorIndex] = mayorList @@ -199,7 +201,13 @@ class CustomScoreboard { } lineMap[partyIndex] = partyList - lineMap[sblevelIndex] = Collections.singletonList("§7Skyblock Level") + val sblevelList = mutableListOf() + sblevelList.add("Level: " + SkyblockLevelAPI.currentLevel) + if (config.showSblvlProgess){ + sblevelList.add("§7Progress: §e${SkyblockLevelAPI.currentProgress}") + } + lineMap[sblevelIndex] = sblevelList + lineMap[maxwellIndex] = Collections.singletonList("§7Maxwell Power") lineMap[websiteIndex] = Collections.singletonList("§ewww.hypixel.net") From 65be9389d93b50c1211558b7b7123daa84c3be93 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 26 Oct 2023 18:51:23 +0200 Subject: [PATCH 036/225] removed import --- .../java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 9204d01c0ee2..eaa104f6d600 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -36,7 +36,6 @@ import at.hannibal2.skyhanni.utils.TimeUtils.formatted import io.github.moulberry.notenoughupdates.util.SkyBlockTime import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent -import java.text.SimpleDateFormat import java.util.* class CustomScoreboard { From b3b06fad317854c17021eae09423e096d84299cb Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 26 Oct 2023 19:15:47 +0200 Subject: [PATCH 037/225] fixed some issues, sb level not working --- src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt | 2 +- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt index fe2135561b05..cd623ee68540 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt @@ -18,7 +18,7 @@ class SkyblockLevelAPI { fun onActionBarUpdate (event: LorenzActionBarEvent){ val info = extractInfo(event.message) - if (info.isNotEmpty()) { + if (info.isNotEmpty() && info[0].isNotEmpty() && info[1].isNotEmpty() && info[2].isNotEmpty()) { currentLevel = info[0].toInt() xpSource = info[1] currentProgress = info[2] diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index eaa104f6d600..855a81d0052b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -128,7 +128,7 @@ class CustomScoreboard { // Multiline support if (it[0] == "§9Party" - || it[0] == MayorElection.currentCandidate?.name + || it[0] == translateMayorNameToColor(MayorElection.currentCandidate?.name ?: "") ) { for (item in it) { newList.add(listOf(item)) From 0903b6ce49115f3681e812791e4fdfeada391680 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 26 Oct 2023 19:25:21 +0200 Subject: [PATCH 038/225] Added empty line indexes --- .../skyhanni/features/misc/CustomScoreboard.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 855a81d0052b..096510552d7e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -59,16 +59,16 @@ class CustomScoreboard { private var bitsIndex = 4 private var copperIndex = 5 private var gemsIndex = 6 - + private var EMPTY_LINE = 7 private var locationIndex = 8 private var skyblockTimeIndex = 9 private var lobbyCodeIndex = 10 private var powderIndex = 11 - + private var EMPTY_LINE2 = 12 private var slayerIndex = 13 private var currentEventIndex = 14 private var mayorIndex = 15 - + private var EMPTY_LINE3 = 16 private var heatIndex = 17 private var partyIndex = 18 private var sblevelIndex = 19 @@ -163,12 +163,12 @@ class CustomScoreboard { lineMap[bitsIndex] = Collections.singletonList("Bits: §b$bits") lineMap[copperIndex] = Collections.singletonList("Copper: §c$copper") lineMap[gemsIndex] = Collections.singletonList("Gems: §a$gems") - lineMap[7] = Collections.singletonList("") + lineMap[EMPTY_LINE] = Collections.singletonList("") lineMap[locationIndex] = Collections.singletonList(location) lineMap[skyblockTimeIndex] = Collections.singletonList(SkyBlockTime.now().formatted(false)) lineMap[lobbyCodeIndex] = Collections.singletonList("§8$lobbyCode") lineMap[powderIndex] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //todo: could be multiline, need to decide - lineMap[13] = Collections.singletonList("") + lineMap[EMPTY_LINE2] = Collections.singletonList("") val slayerList = mutableListOf() slayerList.add("§7Slayer") //todo: get slayer stuff @@ -187,7 +187,7 @@ class CustomScoreboard { } lineMap[mayorIndex] = mayorList - lineMap[18] = Collections.singletonList("") + lineMap[EMPTY_LINE3] = Collections.singletonList("") lineMap[heatIndex] = Collections.singletonList("Heat: §c♨$heat") val partyList = mutableListOf() From 95af71b3cd682519de6155c8c5a17edfc5ee2a97 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 26 Oct 2023 19:28:35 +0200 Subject: [PATCH 039/225] fixed sb lvl multiline --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 096510552d7e..03c183f57ee9 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -128,7 +128,8 @@ class CustomScoreboard { // Multiline support if (it[0] == "§9Party" - || it[0] == translateMayorNameToColor(MayorElection.currentCandidate?.name ?: "") + || it[0].toString().contains(MayorElection.currentCandidate?.name ?: "") + || it[0].toString().contains("Level:") ) { for (item in it) { newList.add(listOf(item)) From c57c955555eb3abef1f5e176715a5709586a0e74 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 26 Oct 2023 19:50:56 +0200 Subject: [PATCH 040/225] Removed sb level for a future update --- .../skyhanni/config/features/MiscConfig.java | 9 +-- .../skyhanni/data/SkyblockLevelAPI.kt | 59 ------------------- .../features/misc/CustomScoreboard.kt | 14 +---- 3 files changed, 4 insertions(+), 78 deletions(-) delete mode 100644 src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 322912f24749..6a1a50ff3f94 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -824,12 +824,11 @@ public static class CustomScoreboard { "", "§cHeat", "§9Party:\n- hannibal2\n- Moulberry\n- Vahvl\n- J10a1n15", - "§7Skyblock Level", "§7Maxwell Power", "§ewww.hypixel.net", } ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21)); + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20)); @Expose @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") @@ -858,12 +857,6 @@ public static class CustomScoreboard { @FeatureToggle public boolean showMayorPerks = true; - @Expose - @ConfigOption(name = "Show SkyBlock Level Progress", desc = "Show the progress to the next SkyBlock level.") - @ConfigEditorBoolean - @FeatureToggle - public boolean showSblvlProgess = false; - @Expose public Position position = new Position(10, 80, false, true); } diff --git a/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt deleted file mode 100644 index cd623ee68540..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/data/SkyblockLevelAPI.kt +++ /dev/null @@ -1,59 +0,0 @@ -package at.hannibal2.skyhanni.data - -import at.hannibal2.skyhanni.events.LorenzActionBarEvent -import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.StringUtils.removeColor -import at.hannibal2.skyhanni.utils.TabListData -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import net.minecraftforge.fml.common.gameevent.TickEvent - -class SkyblockLevelAPI { - companion object { - var currentLevel: Int = 0 - var xpSource = "" - var currentProgress = "" - } - - @SubscribeEvent - fun onActionBarUpdate (event: LorenzActionBarEvent){ - val info = extractInfo(event.message) - - if (info.isNotEmpty() && info[0].isNotEmpty() && info[1].isNotEmpty() && info[2].isNotEmpty()) { - currentLevel = info[0].toInt() - xpSource = info[1] - currentProgress = info[2] - } - } - - @SubscribeEvent - fun onTick(event: TickEvent.ClientTickEvent){ - if (currentLevel == 0) return - - if (event.phase == TickEvent.Phase.END) { - val player = LorenzUtils.getPlayerName() - val tabData = TabListData.getTabList() - val levelRegex = Regex("""\[(\d{1,3})] $player""") - for (line in tabData) { - if (line.contains(player)) { - val colorlessLine = line.removeColor() - currentLevel = levelRegex.find(colorlessLine)!!.groupValues[1].toInt() - break - } - } - } - } - - private fun extractInfo(inputString: String): List { - val regexPattern = """§b\+(\d+) SkyBlock XP §7\(([^§]+)§7\)§b \((\d+)/100\)""" - val regex = Regex(regexPattern) - - val matchResult = regex.find(inputString) - - return if (matchResult != null) { - val (xpValue, source, progress) = matchResult.destructured - listOf(xpValue, source, progress) - } else { - emptyList() - } - } -} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 03c183f57ee9..fa25e1a010af 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -20,6 +20,7 @@ // - quiver // - icons // - beacon power +// - skyblock level // package at.hannibal2.skyhanni.features.misc @@ -71,9 +72,8 @@ class CustomScoreboard { private var EMPTY_LINE3 = 16 private var heatIndex = 17 private var partyIndex = 18 - private var sblevelIndex = 19 - private var maxwellIndex = 20 - private var websiteIndex = 21 + private var maxwellIndex = 19 + private var websiteIndex = 20 @SubscribeEvent @@ -129,7 +129,6 @@ class CustomScoreboard { // Multiline support if (it[0] == "§9Party" || it[0].toString().contains(MayorElection.currentCandidate?.name ?: "") - || it[0].toString().contains("Level:") ) { for (item in it) { newList.add(listOf(item)) @@ -201,13 +200,6 @@ class CustomScoreboard { } lineMap[partyIndex] = partyList - val sblevelList = mutableListOf() - sblevelList.add("Level: " + SkyblockLevelAPI.currentLevel) - if (config.showSblvlProgess){ - sblevelList.add("§7Progress: §e${SkyblockLevelAPI.currentProgress}") - } - lineMap[sblevelIndex] = sblevelList - lineMap[maxwellIndex] = Collections.singletonList("§7Maxwell Power") lineMap[websiteIndex] = Collections.singletonList("§ewww.hypixel.net") From d08cc8aca4eddaa6086b1d6128db9bb639e3d9fa Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:18:09 +0200 Subject: [PATCH 041/225] Added powder! --- .../java/at/hannibal2/skyhanni/SkyHanniMod.kt | 2 -- .../skyhanni/config/features/MiscConfig.java | 2 +- .../features/misc/CustomScoreboard.kt | 33 +++++++++++++++---- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index d6ce96cdf07b..b2ddafa5fedc 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -33,7 +33,6 @@ import at.hannibal2.skyhanni.data.RenderData import at.hannibal2.skyhanni.data.SackAPI import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SkillExperience -import at.hannibal2.skyhanni.data.SkyblockLevelAPI import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.data.TitleData import at.hannibal2.skyhanni.data.TitleManager @@ -382,7 +381,6 @@ class SkyHanniMod { loadModule(RiftAPI) loadModule(SackAPI) loadModule(BingoAPI) - loadModule(SkyblockLevelAPI) // features loadModule(BazaarOrderHelper()) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 5e1a7cb8b7ba..8d4e8e5d5efa 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -816,7 +816,7 @@ public static class CustomScoreboard { "§7Location", "§7Ingame Time", "§7Current Server", - "§2Mithril §r/ §dGemstone §7Powder", + "§7Powder\n §fMithril: §254,646\n §fGemstone: §d51,234", "", "§cSlayer", "§7Current Event", diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index fa25e1a010af..1f8ea2024c17 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -11,7 +11,7 @@ // - enums prob (why) // - toggle between " " and " " // - Hide default scoreboard -// - mayor color (from neu) +// - the things that arent done yet // // V2 RELEASE // - Soulflow API @@ -21,12 +21,18 @@ // - icons // - beacon power // - skyblock level +// - commissions // package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.* +import at.hannibal2.skyhanni.data.HypixelData +import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.data.PurseAPI +import at.hannibal2.skyhanni.data.MayorElection +import at.hannibal2.skyhanni.data.PartyAPI +import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland @@ -51,6 +57,8 @@ class CustomScoreboard { private var location = "None" private var lobbyCode = "None" private var heat = "0" + private var mithrilPowder = "0" + private var gemstonePowder = "0" // Indexes for the scoreboard private var skyblockIndex = 0 @@ -96,6 +104,12 @@ class CustomScoreboard { if (line.startsWith(" Bank: §r§6")){ bank = line.removePrefix(" Bank: §r§6") } + if (line.startsWith(" §r§fMithril Powder: §r§2")){ + mithrilPowder = line.removePrefix(" §r§fMithril Powder: §r§2") + } + if (line.startsWith(" §r§fGemstone Powder: §r§d")){ + gemstonePowder = line.removePrefix(" §r§fGemstone Powder: §r§d") + } } for (line in ScoreboardData.sidebarLinesFormatted){ @@ -108,8 +122,8 @@ class CustomScoreboard { if (extractLobbyCode(line) is String ){ lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of color code) } - if (line.startsWith("Heat: §c♨")){ - heat = line.removePrefix("Heat: §c♨") + if (line.startsWith("Heat: ")){ + heat = line.removePrefix("Heat: ") } if (line.startsWith("Bits: §b")){ bits = line.removePrefix("Bits: §b") @@ -129,6 +143,7 @@ class CustomScoreboard { // Multiline support if (it[0] == "§9Party" || it[0].toString().contains(MayorElection.currentCandidate?.name ?: "") + || it[0] == "§fPowder" ) { for (item in it) { newList.add(listOf(item)) @@ -167,7 +182,13 @@ class CustomScoreboard { lineMap[locationIndex] = Collections.singletonList(location) lineMap[skyblockTimeIndex] = Collections.singletonList(SkyBlockTime.now().formatted(false)) lineMap[lobbyCodeIndex] = Collections.singletonList("§8$lobbyCode") - lineMap[powderIndex] = Collections.singletonList("§2Mithril §r/§2Gemstone §7Powder") //todo: could be multiline, need to decide + + val powderList = mutableListOf() + powderList.add("§fPowder") + powderList.add(" §7- §fMithril: §2$mithrilPowder") + powderList.add(" §7- §fGemstone: §d$gemstonePowder") + lineMap[powderIndex] = powderList + lineMap[EMPTY_LINE2] = Collections.singletonList("") val slayerList = mutableListOf() @@ -188,7 +209,7 @@ class CustomScoreboard { lineMap[mayorIndex] = mayorList lineMap[EMPTY_LINE3] = Collections.singletonList("") - lineMap[heatIndex] = Collections.singletonList("Heat: §c♨$heat") + lineMap[heatIndex] = Collections.singletonList(if(heat == "0") "Heat: §c♨ 0" else "Heat: $heat") val partyList = mutableListOf() var partyCount = 0 From 93b81382f947c9dbb3d02ce66ba9747d2c91cc1a Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:21:26 +0200 Subject: [PATCH 042/225] Changed Powder text color --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 1f8ea2024c17..1a144432d256 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -143,7 +143,7 @@ class CustomScoreboard { // Multiline support if (it[0] == "§9Party" || it[0].toString().contains(MayorElection.currentCandidate?.name ?: "") - || it[0] == "§fPowder" + || it[0].toString().contains("Powder") ) { for (item in it) { newList.add(listOf(item)) @@ -184,7 +184,7 @@ class CustomScoreboard { lineMap[lobbyCodeIndex] = Collections.singletonList("§8$lobbyCode") val powderList = mutableListOf() - powderList.add("§fPowder") + powderList.add("§9§lPowder") powderList.add(" §7- §fMithril: §2$mithrilPowder") powderList.add(" §7- §fGemstone: §d$gemstonePowder") lineMap[powderIndex] = powderList From 53ccab6c161054c67ed1813b64aefa63eb231dd7 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:30:25 +0200 Subject: [PATCH 043/225] Moved scoreboard config loc up --- .../skyhanni/config/features/MiscConfig.java | 158 +++++++++--------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 8d4e8e5d5efa..6a617bcca840 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -665,6 +665,85 @@ public static class KickDurationConfig { public Position position = new Position(400, 200, 1.3f); } + @Expose + @ConfigOption(name = "Custom Scoreboard", desc = "") + @Accordion + public MiscConfig.CustomScoreboard customScoreboard = new MiscConfig.CustomScoreboard(); + + public static class CustomScoreboard { + + @Expose + @ConfigOption( + name = "Enabled", + desc = "Show a custom scoreboard instead of the default one." //TODO: MAKE COOLER + ) + @ConfigEditorBoolean + @FeatureToggle + public boolean enabled = false; + + @Expose + @ConfigOption( + name = "Text Format", + desc = "Drag text to change the appearance of the overlay." + ) + @ConfigEditorDraggableList( + exampleText = { + "§6§lSKYBLOCK", + "§7Profile", + "§ePurse", + "§eBank", + "§bBits", + "§cCopper", + "§aGems", + "", + "§7Location", + "§7Ingame Time", + "§7Current Server", + "§7Powder\n §fMithril: §254,646\n §fGemstone: §d51,234", + "", + "§cSlayer", + "§7Current Event", + "§7Current Mayor", + "", + "§cHeat", + "§9Party:\n- hannibal2\n- Moulberry\n- Vahvl\n- J10a1n15", + "§7Maxwell Power", + "§ewww.hypixel.net", + } + ) + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20)); + + @Expose + @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") + @ConfigEditorSlider( + minValue = 1, + maxValue = 25, // why do I even set it so high + minStep = 1 + ) + public Property maxPartyList = Property.of(4); + + @Expose + @ConfigOption(name = "Hide lines with no info", desc = "Hide lines that have no info to display, like hiding the party when not being in one.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideEmptyLines = true; + + @Expose + @ConfigOption(name = "Hide Info not relevant to location", desc = "Hide lines that are not relevant to the current location, like hiding copper while not in garden") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideIrrelevantLines = true; + + @Expose + @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") + @ConfigEditorBoolean + @FeatureToggle + public boolean showMayorPerks = true; + + @Expose + public Position position = new Position(10, 80, false, true); + } + @Expose @ConfigOption(name = "Exp Bottles", desc = "Hides all the experience orbs lying on the ground.") @ConfigEditorBoolean @@ -781,83 +860,4 @@ public static class KickDurationConfig { @Expose public Position inventoryLoadPos = new Position(394, 124, false, true); - - @Expose - @ConfigOption(name = "Custom Scoreboard", desc = "") - @Accordion - public MiscConfig.CustomScoreboard customScoreboard = new MiscConfig.CustomScoreboard(); - - public static class CustomScoreboard { - - @Expose - @ConfigOption( - name = "Enabled", - desc = "Show a custom scoreboard instead of the default one." //TODO: MAKE COOLER - ) - @ConfigEditorBoolean - @FeatureToggle - public boolean enabled = false; - - @Expose - @ConfigOption( - name = "Text Format", - desc = "Drag text to change the appearance of the overlay." - ) - @ConfigEditorDraggableList( - exampleText = { - "§6§lSKYBLOCK", - "§7Profile", - "§ePurse", - "§eBank", - "§bBits", - "§cCopper", - "§aGems", - "", - "§7Location", - "§7Ingame Time", - "§7Current Server", - "§7Powder\n §fMithril: §254,646\n §fGemstone: §d51,234", - "", - "§cSlayer", - "§7Current Event", - "§7Current Mayor", - "", - "§cHeat", - "§9Party:\n- hannibal2\n- Moulberry\n- Vahvl\n- J10a1n15", - "§7Maxwell Power", - "§ewww.hypixel.net", - } - ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20)); - - @Expose - @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") - @ConfigEditorSlider( - minValue = 1, - maxValue = 25, // why do I even set it so high - minStep = 1 - ) - public Property maxPartyList = Property.of(4); - - @Expose - @ConfigOption(name = "Hide lines with no info", desc = "Hide lines that have no info to display, like hiding the party when not being in one.") - @ConfigEditorBoolean - @FeatureToggle - public boolean hideEmptyLines = true; - - @Expose - @ConfigOption(name = "Hide Info not relevant to location", desc = "Hide lines that are not relevant to the current location, like hiding copper while not in garden") - @ConfigEditorBoolean - @FeatureToggle - public boolean hideIrrelevantLines = true; - - @Expose - @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") - @ConfigEditorBoolean - @FeatureToggle - public boolean showMayorPerks = true; - - @Expose - public Position position = new Position(10, 80, false, true); - } } From 63b20f24a17fc1686692b4d0713d21ce41b5a238 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 30 Oct 2023 00:11:15 +0100 Subject: [PATCH 044/225] Tried smth with enums, doesnt update --- .../skyhanni/config/features/MiscConfig.java | 10 +- .../features/misc/CustomScoreboard.kt | 436 +++++++++++------- 2 files changed, 269 insertions(+), 177 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 6a617bcca840..1b0d27a9a950 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -691,6 +691,7 @@ public static class CustomScoreboard { "§6§lSKYBLOCK", "§7Profile", "§ePurse", + "§dMotes", "§eBank", "§bBits", "§cCopper", @@ -711,7 +712,7 @@ public static class CustomScoreboard { "§ewww.hypixel.net", } ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20)); + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21)); @Expose @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") @@ -734,6 +735,13 @@ public static class CustomScoreboard { @FeatureToggle public boolean hideIrrelevantLines = true; + @Expose + @ConfigOption(name = "Display Numbers First", desc = "Determines whether the number or line name displays first. " + + "§eNote: Will not update the preview above!") + @ConfigEditorBoolean + @FeatureToggle + public boolean displayNumbersFirst = false; + @Expose @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 1a144432d256..5ae024fff4e0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -35,7 +35,6 @@ import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.TabListData @@ -45,45 +44,219 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent import java.util.* -class CustomScoreboard { - private val config get() = SkyHanniMod.feature.misc.customScoreboard - private var display = emptyList>() - private var purse = "0" - private var motes = "0" - private var bank = "0" - private var bits = "0" - private var copper = "0" - private var gems = "0" - private var location = "None" - private var lobbyCode = "None" - private var heat = "0" - private var mithrilPowder = "0" - private var gemstonePowder = "0" - - // Indexes for the scoreboard - private var skyblockIndex = 0 - private var profileIndex = 1 - private var purseIndex = 2 - private var bankIndex = 3 - private var bitsIndex = 4 - private var copperIndex = 5 - private var gemsIndex = 6 - private var EMPTY_LINE = 7 - private var locationIndex = 8 - private var skyblockTimeIndex = 9 - private var lobbyCodeIndex = 10 - private var powderIndex = 11 - private var EMPTY_LINE2 = 12 - private var slayerIndex = 13 - private var currentEventIndex = 14 - private var mayorIndex = 15 - private var EMPTY_LINE3 = 16 - private var heatIndex = 17 - private var partyIndex = 18 - private var maxwellIndex = 19 - private var websiteIndex = 20 - +private val config get() = SkyHanniMod.feature.misc.customScoreboard +private var display = emptyList>() +private var partyCount = 0 + +// Stats / Numbers +private var purse = "0" +private var motes = "0" +private var bank = "0" +private var bits = "0" +private var copper = "0" +private var gems = "0" +private var location = "None" +private var lobbyCode = "None" +private var heat = "0" +private var mithrilPowder = "0" +private var gemstonePowder = "0" + + +enum class CustomScoreboardElements ( + // displayLine: The line that is displayed on the scoreboard + val displayLine: List, + + // alternativeLine: The line that is displayed on the scoreboard when "displayNumbersFirst" is enabled + val alternativeLine: List, + + // islands: The islands that this line is displayed on + val islands: List, + + // visibilityOption: The option that is used to hide this line - use 0 to only display on the listed islands, 1 to hide on the listed islands + val visibilityOption : Int, + + // index: The index of the line + val index: Int, + + // data: The data that is used for this line + val data: String = "" +){ + SKYBLOCK( + listOf("§6§lSKYBLOCK"), + listOf(), + listOf(), + 0, + 0 + ), + PROFILE( + listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()), + listOf(), + listOf(), + 0, + 1 + ), + PURSE( + listOf("Purse: §6$purse"), + listOf("§6$purse Purse"), + listOf(IslandType.THE_RIFT), + 1, + 2, + purse + ), + MOTES( + listOf("Motes: §d$motes"), + listOf("§d$motes Motes"), + listOf(IslandType.THE_RIFT), + 0, + 3, + motes + ), + BANK( + listOf("Bank: §6$bank"), + listOf("§6$bank Bank"), + listOf(IslandType.THE_RIFT), + 1, + 4, + bank + ), + BITS( + listOf("Bits: §b$bits"), + listOf("§b$bits Bits"), + listOf(IslandType.THE_RIFT), + 1, + 5, + bits + ), + COPPER( + listOf("Copper: §c$copper"), + listOf("§c$copper Copper"), + listOf(IslandType.GARDEN), + 0, + 6, + copper + ), + GEMS( + listOf("Gems: §a$gems"), + listOf("§a$gems Gems"), + listOf(IslandType.THE_RIFT), + 1, + 7, + gems + ), + EMPTY_LINE( + listOf(""), + listOf(), + listOf(), + 0, + 8 + ), + LOCATION( + listOf(location), + listOf(), + listOf(), + 0, + 9 + ), + SKYBLOCK_TIME( + listOf(SkyBlockTime.now().formatted(false)), + listOf(), + listOf(), + 0, + 10 + ), + LOBBY_CODE( + listOf("§8$lobbyCode"), + listOf(), + listOf(), + 0, + 11 + ), + POWDER( + listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder"), + listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone"), + listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES), + 0, + 12 + ), + EMPTY_LINE2( + listOf(""), + listOf(), + listOf(), + 0, + 13 + ), + SLAYER( + listOf("§7Slayer"), + listOf(""), + listOf(IslandType.HUB, IslandType.SPIDER_DEN, IslandType.THE_PARK, IslandType.THE_END, IslandType.CRIMSON_ISLE), + 0, + 14 + ), + CURRENT_EVENT( + listOf("§cCurrent Event"), + listOf(""), + listOf(), + 0, + 15 + ), + MAYOR( + listOf( + MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "" + ) + (if (config.showMayorPerks) { + MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" } ?: emptyList() + } else { + emptyList() + }), + listOf(), + listOf(IslandType.THE_RIFT), + 1, + 16 + ), + EMPTY_LINE3( + listOf(""), + listOf(), + listOf(), + 0, + 17 + ), + HEAT( + listOf(if(heat == "0") "Heat: §c♨ 0" else "Heat: $heat"), + listOf(if(heat == "0") "§c♨ 0 Heat" else "$heat Heat"), + listOf(IslandType.CRYSTAL_HOLLOWS), + 0, + 18, + heat + ), + PARTY( + listOf( + "§9Party", + *PartyAPI.partyMembers.takeWhile { partyCount < config.maxPartyList.get() } + .map { " §7- §7$it" } + .toTypedArray() + ), + listOf(), + listOf(IslandType.CATACOMBS, IslandType.DUNGEON_HUB, IslandType.KUUDRA_ARENA, IslandType.CRIMSON_ISLE), + 0, + 19, + partyCount.toString() + ), + MAXWELL( + listOf("§7Maxwell Power"), + listOf(), + listOf(IslandType.THE_RIFT), + 1, + 20 + ), + WEBSITE( + listOf("§ewww.hypixel.net"), + listOf(), + listOf(), + 0, + 21 + ); +} +class CustomScoreboard { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!config.enabled) return @@ -96,6 +269,9 @@ class CustomScoreboard { // Draws the custom scoreboard display = drawScoreboard() + // Resets Party count + partyCount = 0 + // Gets some values for the scoreboard for (line in TabListData.getTabList()){ if (line.startsWith(" Gems: §r§a")){ @@ -135,6 +311,25 @@ class CustomScoreboard { purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) } + private fun drawScoreboard() = buildList> { + val lineMap = HashMap>() + for (element in CustomScoreboardElements.entries) { + if (element.data == "0" && config.hideEmptyLines){ // Hide empty lines + lineMap[element.index] = listOf("") + continue + } + + lineMap[element.index] = formatLine(element) + } + + return formatDisplay(lineMap) + } + + private fun formatLine(element: CustomScoreboardElements) : List{ + if (element.alternativeLine.isEmpty()) return element.displayLine + return if (config.displayNumbersFirst) element.alternativeLine else element.displayLine + } + private fun formatDisplay(lineMap: HashMap>): MutableList> { val newList = mutableListOf>() for (index in config.textFormat) { @@ -169,147 +364,36 @@ class CustomScoreboard { return newList } - private fun drawScoreboard() = buildList> { - val lineMap = HashMap>() - lineMap[skyblockIndex] = Collections.singletonList("§6§lSKYBLOCK") - lineMap[profileIndex] = Collections.singletonList("${getProfileTypeAsSymbol()}${HypixelData.profileName.firstLetterUppercase()}") - lineMap[purseIndex] = Collections.singletonList("Purse: §6$purse") - lineMap[bankIndex] = Collections.singletonList("Bank: §6$bank") - lineMap[bitsIndex] = Collections.singletonList("Bits: §b$bits") - lineMap[copperIndex] = Collections.singletonList("Copper: §c$copper") - lineMap[gemsIndex] = Collections.singletonList("Gems: §a$gems") - lineMap[EMPTY_LINE] = Collections.singletonList("") - lineMap[locationIndex] = Collections.singletonList(location) - lineMap[skyblockTimeIndex] = Collections.singletonList(SkyBlockTime.now().formatted(false)) - lineMap[lobbyCodeIndex] = Collections.singletonList("§8$lobbyCode") - - val powderList = mutableListOf() - powderList.add("§9§lPowder") - powderList.add(" §7- §fMithril: §2$mithrilPowder") - powderList.add(" §7- §fGemstone: §d$gemstonePowder") - lineMap[powderIndex] = powderList - - lineMap[EMPTY_LINE2] = Collections.singletonList("") - - val slayerList = mutableListOf() - slayerList.add("§7Slayer") //todo: get slayer stuff - lineMap[slayerIndex] = slayerList - - val eventList = mutableListOf() - eventList.add("§cCurrent Event") //todo: get event stuff - lineMap[currentEventIndex] = eventList - - val mayorList = mutableListOf() - mayorList.add(MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "") - if (config.showMayorPerks) { - for (perk in MayorElection.currentCandidate?.perks ?: emptyList()) { - mayorList.add(" §7- §e${perk.name}") - } - } - lineMap[mayorIndex] = mayorList - - lineMap[EMPTY_LINE3] = Collections.singletonList("") - lineMap[heatIndex] = Collections.singletonList(if(heat == "0") "Heat: §c♨ 0" else "Heat: $heat") - - val partyList = mutableListOf() - var partyCount = 0 - partyList.add("§9Party") - for (member in PartyAPI.partyMembers){ - if (partyCount >= config.maxPartyList.get()) break - partyList.add(" §7- §7$member") - partyCount++ - } - lineMap[partyIndex] = partyList - - lineMap[maxwellIndex] = Collections.singletonList("§7Maxwell Power") - lineMap[websiteIndex] = Collections.singletonList("§ewww.hypixel.net") - - // Hide empty lines - if (config.hideEmptyLines){ - lineMap[purseIndex] = Collections.singletonList(if(purse == "0") "" else "Purse: §6$purse") - lineMap[bankIndex] = Collections.singletonList(if(bank == "0") "" else "Bank: §6$bank") - lineMap[bitsIndex] = Collections.singletonList(if(bits == "0") "" else "Bits: §b$bits") - lineMap[copperIndex] = Collections.singletonList(if(copper == "0") "" else "Copper: §c$copper") - lineMap[gemsIndex] = Collections.singletonList(if(gems == "0") "" else "Gems: §a$gems") - lineMap[locationIndex] = Collections.singletonList(if(location == "None") "" else location) - lineMap[lobbyCodeIndex] = Collections.singletonList(if(lobbyCode == "None") "" else "§8$lobbyCode") - lineMap[heatIndex] = Collections.singletonList(if(heat == "0") "" else "Heat: §c♨$heat") - - if (partyList.size == 1){ - lineMap[partyIndex] = Collections.singletonList("") - } - } - - // Rift - if(IslandType.THE_RIFT.isInIsland()){ - lineMap[purseIndex] = Collections.singletonList("Motes: §d$motes") - } - - // Hide irrelevant lines - if (config.hideIrrelevantLines){ - if (!IslandType.GARDEN.isInIsland()){ - lineMap[copperIndex] = Collections.singletonList("") - } - if (IslandType.THE_RIFT.isInIsland()){ - lineMap[bankIndex] = Collections.singletonList("") - lineMap[bitsIndex] = Collections.singletonList("") - lineMap[gemsIndex] = Collections.singletonList("") - lineMap[mayorIndex] = Collections.singletonList("") - } - if (!IslandType.DWARVEN_MINES.isInIsland() - && !IslandType.CRYSTAL_HOLLOWS.isInIsland() - ){ - lineMap[powderIndex] = Collections.singletonList("") - } - if (!IslandType.CRYSTAL_HOLLOWS.isInIsland()){ - lineMap[heatIndex] = Collections.singletonList("") - } - if (!IslandType.DUNGEON_HUB.isInIsland() - && !IslandType.CATACOMBS.isInIsland() - && !IslandType.KUUDRA_ARENA.isInIsland() - && !IslandType.CRIMSON_ISLE.isInIsland() - ){ - lineMap[partyIndex] = Collections.singletonList("") - } - if (!IslandType.HUB.isInIsland() - && !IslandType.SPIDER_DEN.isInIsland() - && !IslandType.THE_PARK.isInIsland() - && !IslandType.THE_END.isInIsland() - && !IslandType.CRIMSON_ISLE.isInIsland() - ){ - lineMap[slayerIndex] = Collections.singletonList("") - } - } - - return formatDisplay(lineMap) + private fun isEnabled() : Boolean{ + return config.enabled && LorenzUtils.inSkyBlock } +} - private fun translateMayorNameToColor(input: String) : String { - return when (input) { - "Aatrox" -> "§3$input" - "Cole" -> "§e$input" - "Diana" -> "§2$input" - "Diaz" -> "§6$input" - "Finnegan" -> "§c$input" - "Foxy" -> "§d$input" - "Marina" -> "§b$input" - "Paul" -> "§c$input" - else -> "§7$input" - } +private fun translateMayorNameToColor(input: String) : String { + return when (input) { + "Aatrox" -> "§3$input" + "Cole" -> "§e$input" + "Diana" -> "§2$input" + "Diaz" -> "§6$input" + "Finnegan" -> "§c$input" + "Foxy" -> "§d$input" + "Marina" -> "§b$input" + "Paul" -> "§c$input" + else -> "§7$input" } +} - private fun extractLobbyCode(input: String): String? { - val regex = Regex("§(\\d{3}/\\d{2}/\\d{2}) §([A-Za-z0-9]+)$") - val matchResult = regex.find(input) - return matchResult?.groupValues?.lastOrNull() - } +private fun extractLobbyCode(input: String): String? { + val regex = Regex("§(\\d{3}/\\d{2}/\\d{2}) §([A-Za-z0-9]+)$") + val matchResult = regex.find(input) + return matchResult?.groupValues?.lastOrNull() +} - private fun getProfileTypeAsSymbol(): String { - return when { - HypixelData.ironman -> "§7♲ " // Ironman - HypixelData.stranded -> "§a☀ " // Stranded - HypixelData.bingo -> "§cⒷ " // Bingo - TODO: Consider using colors from BingoAPI - else -> "§e" // Default case - } +private fun getProfileTypeAsSymbol(): String { + return when { + HypixelData.ironman -> "§7♲ " // Ironman + HypixelData.stranded -> "§a☀ " // Stranded + HypixelData.bingo -> "§cⒷ " // Bingo - TODO: Consider using colors from BingoAPI + else -> "§e" // Default case } } From 9797015225856339eb98b16516c633cff246bcc1 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:53:06 +0100 Subject: [PATCH 045/225] fixed cmd --- src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt index 616b76d625e0..197fbc482a59 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -290,6 +290,7 @@ object Commands { "shconfigmanagerreset", "Reloads the config manager and rendering processors of MoulConfig. This §cWILL RESET §7your config, but also updating the java config files (names, description, orderings and stuff)." ) { SkyHanniDebugsAndTests.configManagerResetCommand(it) } + registerCommand( "shcopyactionbar", "Copies the actionbar to the clipboard" ) { CopyActionBar.command(it) } From 617a6e2f2fa9f289ad1a3ed4d3df6390a3de7b9b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 16:32:18 +0100 Subject: [PATCH 046/225] Works really good now! --- .../features/misc/CustomScoreboard.kt | 229 ++++++++++-------- 1 file changed, 134 insertions(+), 95 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 5ae024fff4e0..f2be56a30802 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -8,8 +8,6 @@ // // TODO LIST // V1 RELEASE -// - enums prob (why) -// - toggle between " " and " " // - Hide default scoreboard // - the things that arent done yet // @@ -43,6 +41,7 @@ import io.github.moulberry.notenoughupdates.util.SkyBlockTime import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent import java.util.* +import java.util.function.Supplier private val config get() = SkyHanniMod.feature.misc.customScoreboard private var display = emptyList>() @@ -64,10 +63,7 @@ private var gemstonePowder = "0" enum class CustomScoreboardElements ( // displayLine: The line that is displayed on the scoreboard - val displayLine: List, - - // alternativeLine: The line that is displayed on the scoreboard when "displayNumbersFirst" is enabled - val alternativeLine: List, + val displayLine: Supplier>?, // islands: The islands that this line is displayed on val islands: List, @@ -76,191 +72,243 @@ enum class CustomScoreboardElements ( val visibilityOption : Int, // index: The index of the line - val index: Int, - - // data: The data that is used for this line - val data: String = "" + val index: Int ){ SKYBLOCK( - listOf("§6§lSKYBLOCK"), - listOf(), + { listOf("§bSkyBlock") }, listOf(), 0, 0 ), PROFILE( - listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()), - listOf(), + { + when (config.displayNumbersFirst){ + true -> listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) + false -> listOf(HypixelData.profileName.firstLetterUppercase() + getProfileTypeAsSymbol()) + } + }, listOf(), 0, 1 ), PURSE( - listOf("Purse: §6$purse"), - listOf("§6$purse Purse"), + { + when (purse){ + "0" -> listOf("") + else -> + when (config.displayNumbersFirst){ + true -> listOf("§6$purse Purse") + false -> listOf("Purse: §6$purse") + } + } + + }, listOf(IslandType.THE_RIFT), 1, - 2, - purse + 2 ), MOTES( - listOf("Motes: §d$motes"), - listOf("§d$motes Motes"), + { + when (motes){ + "0" -> listOf("") + else -> + when (config.displayNumbersFirst){ + true -> listOf("§d$motes Motes") + false -> listOf("Motes: §d$motes") + } + } + }, listOf(IslandType.THE_RIFT), 0, - 3, - motes + 3 ), BANK( - listOf("Bank: §6$bank"), - listOf("§6$bank Bank"), + { + when (bank){ + "0" -> listOf("") + else -> + when (config.displayNumbersFirst){ + true -> listOf("§6$bank Bank") + false -> listOf("Bank: §6$bank") + } + } + }, listOf(IslandType.THE_RIFT), 1, - 4, - bank + 4 ), BITS( - listOf("Bits: §b$bits"), - listOf("§b$bits Bits"), + { + when(bits) { + "0" -> listOf("") + else -> + when (config.displayNumbersFirst) { + true -> listOf("§b$bits Bits") + false -> listOf("Bits: §b$bits") + } + } + }, listOf(IslandType.THE_RIFT), 1, - 5, - bits + 5 ), COPPER( - listOf("Copper: §c$copper"), - listOf("§c$copper Copper"), + { + when(copper) { + "0" -> listOf("") + else -> + when (config.displayNumbersFirst) { + true -> listOf("§c$copper Copper") + false -> listOf("Copper: §c$copper") + } + } + }, listOf(IslandType.GARDEN), 0, - 6, - copper + 6 ), GEMS( - listOf("Gems: §a$gems"), - listOf("§a$gems Gems"), + { + when (gems) { + "0" -> listOf("") + else -> + when (config.displayNumbersFirst) { + true -> listOf("§a$gems Gems") + false -> listOf("Gems: §a$gems") + } + } + }, listOf(IslandType.THE_RIFT), 1, - 7, - gems + 7 ), EMPTY_LINE( - listOf(""), - listOf(), + { listOf("") }, listOf(), 0, 8 ), LOCATION( - listOf(location), - listOf(), + { listOf(location) }, listOf(), 0, 9 ), SKYBLOCK_TIME( - listOf(SkyBlockTime.now().formatted(false)), - listOf(), + { listOf(SkyBlockTime.now().formatted(false)) }, listOf(), 0, 10 ), LOBBY_CODE( - listOf("§8$lobbyCode"), - listOf(), + { listOf("§8$lobbyCode") }, listOf(), 0, 11 ), POWDER( - listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder"), - listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone"), + { + when (config.displayNumbersFirst){ + true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") + false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") + } + }, listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES), 0, 12 ), EMPTY_LINE2( - listOf(""), - listOf(), + { listOf("") }, listOf(), 0, 13 ), SLAYER( - listOf("§7Slayer"), - listOf(""), + { listOf("§7Slayer") }, listOf(IslandType.HUB, IslandType.SPIDER_DEN, IslandType.THE_PARK, IslandType.THE_END, IslandType.CRIMSON_ISLE), 0, 14 ), CURRENT_EVENT( - listOf("§cCurrent Event"), - listOf(""), + { listOf("§cCurrent Event") }, listOf(), 0, 15 ), MAYOR( - listOf( - MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "" - ) + (if (config.showMayorPerks) { - MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" } ?: emptyList() - } else { - emptyList() - }), - listOf(), + { + listOf( + MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "" + ) + (if (config.showMayorPerks) { + MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" } ?: emptyList() + } else { + emptyList() + }) + }, listOf(IslandType.THE_RIFT), 1, 16 ), EMPTY_LINE3( - listOf(""), - listOf(), + { listOf("") }, listOf(), 0, 17 ), HEAT( - listOf(if(heat == "0") "Heat: §c♨ 0" else "Heat: $heat"), - listOf(if(heat == "0") "§c♨ 0 Heat" else "$heat Heat"), + { + when (heat) { + "0" -> listOf("") + else -> + when (config.displayNumbersFirst) { + true -> listOf(if(heat == "0") "§c♨ 0 Heat" else "§c♨ $heat Heat") + false -> listOf(if(heat == "0") "Heat: §c♨ 0" else "Heat: $heat") + } + } + }, listOf(IslandType.CRYSTAL_HOLLOWS), 0, - 18, - heat + 18 ), PARTY( - listOf( - "§9Party", - *PartyAPI.partyMembers.takeWhile { partyCount < config.maxPartyList.get() } - .map { " §7- §7$it" } - .toTypedArray() - ), - listOf(), + { + listOf( + "§9Party", + *PartyAPI.partyMembers + .takeWhile { partyCount < config.maxPartyList.get() } + .map { it -> + partyCount++ + " §7- §7$it" + } + .toTypedArray() + ) + }, listOf(IslandType.CATACOMBS, IslandType.DUNGEON_HUB, IslandType.KUUDRA_ARENA, IslandType.CRIMSON_ISLE), 0, - 19, - partyCount.toString() + 19 ), MAXWELL( - listOf("§7Maxwell Power"), - listOf(), + { listOf("§7Maxwell Power") }, listOf(IslandType.THE_RIFT), 1, 20 ), WEBSITE( - listOf("§ewww.hypixel.net"), - listOf(), + { listOf("§ewww.hypixel.net") }, listOf(), 0, 21 ); + + fun getLine(): List { + return displayLine?.get() ?: emptyList() + } } class CustomScoreboard { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { - if (!config.enabled) return - if (!LorenzUtils.inSkyBlock) return + if (!isEnabled()) return config.position.renderStringsAndItems(display, posLabel = "Custom Scoreboard") } @@ -272,7 +320,7 @@ class CustomScoreboard { // Resets Party count partyCount = 0 - // Gets some values for the scoreboard + // Gets some values for the tablist for (line in TabListData.getTabList()){ if (line.startsWith(" Gems: §r§a")){ gems = line.removePrefix(" Gems: §r§a") @@ -288,6 +336,7 @@ class CustomScoreboard { } } + // Gets some values for the scoreboard for (line in ScoreboardData.sidebarLinesFormatted){ if (line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ")){ location = line @@ -314,22 +363,12 @@ class CustomScoreboard { private fun drawScoreboard() = buildList> { val lineMap = HashMap>() for (element in CustomScoreboardElements.entries) { - if (element.data == "0" && config.hideEmptyLines){ // Hide empty lines - lineMap[element.index] = listOf("") - continue - } - - lineMap[element.index] = formatLine(element) + lineMap[element.index] = element.getLine() } return formatDisplay(lineMap) } - private fun formatLine(element: CustomScoreboardElements) : List{ - if (element.alternativeLine.isEmpty()) return element.displayLine - return if (config.displayNumbersFirst) element.alternativeLine else element.displayLine - } - private fun formatDisplay(lineMap: HashMap>): MutableList> { val newList = mutableListOf>() for (index in config.textFormat) { From 728faec76940f7b396621a966c51c02694af0505 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 17:38:15 +0100 Subject: [PATCH 047/225] Added custom footer & title, fixed one missing thing --- .../skyhanni/config/features/MiscConfig.java | 10 +++ .../features/misc/CustomScoreboard.kt | 89 +++++++------------ 2 files changed, 41 insertions(+), 58 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 5e383fb6d7b1..9c57c2dcc5b6 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -791,6 +791,16 @@ public static class CustomScoreboard { @FeatureToggle public boolean showMayorPerks = true; + @Expose + @ConfigOption(name = "Custom Title", desc = "What should be displayed as the title of the scoreboard.\nUse & for colors") + @ConfigEditorText + public Property customTitle = Property.of("&6&lSKYBLOCK"); + + @Expose + @ConfigOption(name = "Custom Footer", desc = "What should be displayed as the footer of the scoreboard.\nUse & for colors") + @ConfigEditorText + public Property customFooter = Property.of("&ewww.hypixel.net"); + @Expose public Position position = new Position(10, 80, false, true); } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index f2be56a30802..b2558b76236c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -75,33 +75,24 @@ enum class CustomScoreboardElements ( val index: Int ){ SKYBLOCK( - { listOf("§bSkyBlock") }, + { listOf(config.customTitle.get().toString().replace("&", "§")) }, listOf(), 0, 0 ), PROFILE( - { - when (config.displayNumbersFirst){ - true -> listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) - false -> listOf(HypixelData.profileName.firstLetterUppercase() + getProfileTypeAsSymbol()) - } - }, + { listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) }, listOf(), 0, 1 ), PURSE( { - when (purse){ - "0" -> listOf("") - else -> - when (config.displayNumbersFirst){ - true -> listOf("§6$purse Purse") - false -> listOf("Purse: §6$purse") - } + when { + config.hideEmptyLines && purse == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§6$purse Purse") + else -> listOf("Purse: §6$purse") } - }, listOf(IslandType.THE_RIFT), 1, @@ -109,13 +100,10 @@ enum class CustomScoreboardElements ( ), MOTES( { - when (motes){ - "0" -> listOf("") - else -> - when (config.displayNumbersFirst){ - true -> listOf("§d$motes Motes") - false -> listOf("Motes: §d$motes") - } + when { + motes == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§d$motes Motes") + else -> listOf("Motes: §d$motes") } }, listOf(IslandType.THE_RIFT), @@ -124,13 +112,10 @@ enum class CustomScoreboardElements ( ), BANK( { - when (bank){ - "0" -> listOf("") - else -> - when (config.displayNumbersFirst){ - true -> listOf("§6$bank Bank") - false -> listOf("Bank: §6$bank") - } + when { + bank == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§6$bank Bank") + else -> listOf("Bank: §6$bank") } }, listOf(IslandType.THE_RIFT), @@ -139,13 +124,10 @@ enum class CustomScoreboardElements ( ), BITS( { - when(bits) { - "0" -> listOf("") - else -> - when (config.displayNumbersFirst) { - true -> listOf("§b$bits Bits") - false -> listOf("Bits: §b$bits") - } + when { + bits == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§b$bits Bits") + else -> listOf("Bits: §b$bits") } }, listOf(IslandType.THE_RIFT), @@ -154,13 +136,10 @@ enum class CustomScoreboardElements ( ), COPPER( { - when(copper) { - "0" -> listOf("") - else -> - when (config.displayNumbersFirst) { - true -> listOf("§c$copper Copper") - false -> listOf("Copper: §c$copper") - } + when { + copper == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§c$copper Copper") + else -> listOf("Copper: §c$copper") } }, listOf(IslandType.GARDEN), @@ -169,13 +148,10 @@ enum class CustomScoreboardElements ( ), GEMS( { - when (gems) { - "0" -> listOf("") - else -> - when (config.displayNumbersFirst) { - true -> listOf("§a$gems Gems") - false -> listOf("Gems: §a$gems") - } + when { + gems == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§a$gems Gems") + else -> listOf("Gems: §a$gems") } }, listOf(IslandType.THE_RIFT), @@ -257,13 +233,10 @@ enum class CustomScoreboardElements ( ), HEAT( { - when (heat) { - "0" -> listOf("") - else -> - when (config.displayNumbersFirst) { - true -> listOf(if(heat == "0") "§c♨ 0 Heat" else "§c♨ $heat Heat") - false -> listOf(if(heat == "0") "Heat: §c♨ 0" else "Heat: $heat") - } + when { + heat == "0" -> listOf("") + config.displayNumbersFirst -> listOf(if (heat == "0") "§c♨ 0 Heat" else "§c♨ $heat Heat") + else -> listOf(if (heat == "0") "Heat: §c♨ 0" else "Heat: $heat") } }, listOf(IslandType.CRYSTAL_HOLLOWS), @@ -294,7 +267,7 @@ enum class CustomScoreboardElements ( 20 ), WEBSITE( - { listOf("§ewww.hypixel.net") }, + { listOf(config.customFooter.get().toString().replace("&", "§")) }, listOf(), 0, 21 From f38f616af50d30f6bb32091aa671a98a6abbb425 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 17:38:59 +0100 Subject: [PATCH 048/225] "redundant lambda arrow" --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index b2558b76236c..326e505cce3e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -249,7 +249,7 @@ enum class CustomScoreboardElements ( "§9Party", *PartyAPI.partyMembers .takeWhile { partyCount < config.maxPartyList.get() } - .map { it -> + .map { partyCount++ " §7- §7$it" } From e90040708b5dae187df40507b3121a83d1e5ac52 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 17:40:36 +0100 Subject: [PATCH 049/225] "smth smth could be private" --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 326e505cce3e..a3251bc0001e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -63,13 +63,13 @@ private var gemstonePowder = "0" enum class CustomScoreboardElements ( // displayLine: The line that is displayed on the scoreboard - val displayLine: Supplier>?, + private val displayLine: Supplier>?, // islands: The islands that this line is displayed on - val islands: List, + private val islands: List, // visibilityOption: The option that is used to hide this line - use 0 to only display on the listed islands, 1 to hide on the listed islands - val visibilityOption : Int, + private val visibilityOption : Int, // index: The index of the line val index: Int From 9cae4b4103cae4a901d7a0499265dd8b9795b6cc Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 18:02:14 +0100 Subject: [PATCH 050/225] Added visibilty thingy --- .../skyhanni/features/misc/CustomScoreboard.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index a3251bc0001e..aef4bb2e436a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -276,6 +276,16 @@ enum class CustomScoreboardElements ( fun getLine(): List { return displayLine?.get() ?: emptyList() } + + fun isVisible(): Boolean { + if (!config.hideIrrelevantLines) return true + if (islands.isEmpty()) return true + return when (visibilityOption) { + 0 -> islands.contains(HypixelData.skyBlockIsland) + 1 -> !islands.contains(HypixelData.skyBlockIsland) + else -> true + } + } } class CustomScoreboard { @@ -336,7 +346,7 @@ class CustomScoreboard { private fun drawScoreboard() = buildList> { val lineMap = HashMap>() for (element in CustomScoreboardElements.entries) { - lineMap[element.index] = element.getLine() + lineMap[element.index] = if (element.isVisible()) element.getLine() else listOf("") } return formatDisplay(lineMap) From 7529950362cf984032745005d31b7325bfd833d6 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 18:23:24 +0100 Subject: [PATCH 051/225] Changed the look of the draggable list elements --- .../skyhanni/config/features/MiscConfig.java | 28 +++++++++---------- .../features/misc/CustomScoreboard.kt | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 9c57c2dcc5b6..a8c506ce16ac 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -732,25 +732,25 @@ public static class CustomScoreboard { @ConfigEditorDraggableList( exampleText = { "§6§lSKYBLOCK", - "§7Profile", - "§ePurse", - "§dMotes", - "§eBank", - "§bBits", - "§cCopper", - "§aGems", + "§7♲ Blueberry", + "Purse: §652,763,737", + "Motes: §d64,647", + "Bank: §6249M", + "Bits: §b59,264", + "Copper: §c23,495", + "Gems: §a57,873", "", - "§7Location", - "§7Ingame Time", - "§7Current Server", - "§7Powder\n §fMithril: §254,646\n §fGemstone: §d51,234", + "§7⏣ §bVillage", + "Late Summer 11th, Year 311", + "§8m77CK", + "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234", "", "§cSlayer", "§7Current Event", - "§7Current Mayor", + "§2Diana:\n§7- §eLucky!\n§7- §eMythological Ritual\n§7- §ePet XP Buff", "", - "§cHeat", - "§9Party:\n- hannibal2\n- Moulberry\n- Vahvl\n- J10a1n15", + "Heat: §c♨ 0", + "§9§lParty:\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n- J10a1n15", "§7Maxwell Power", "§ewww.hypixel.net", } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index aef4bb2e436a..3392e791803b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -246,7 +246,7 @@ enum class CustomScoreboardElements ( PARTY( { listOf( - "§9Party", + "§9§lParty", *PartyAPI.partyMembers .takeWhile { partyCount < config.maxPartyList.get() } .map { From eab44415d917522bf1f22066cb4a115301491c67 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 18:23:53 +0100 Subject: [PATCH 052/225] oh forgot that --- .../java/at/hannibal2/skyhanni/config/features/MiscConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index a8c506ce16ac..53fe599c1646 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -750,7 +750,7 @@ public static class CustomScoreboard { "§2Diana:\n§7- §eLucky!\n§7- §eMythological Ritual\n§7- §ePet XP Buff", "", "Heat: §c♨ 0", - "§9§lParty:\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n- J10a1n15", + "§9§lParty:\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n §7- §f J10a1n15", "§7Maxwell Power", "§ewww.hypixel.net", } From 29025118a3464ee9b29dc3b37e491823d6189401 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 19:59:43 +0100 Subject: [PATCH 053/225] fixed hide empty lines not hiding empty party list --- .../skyhanni/config/features/MiscConfig.java | 2 +- .../skyhanni/features/misc/CustomScoreboard.kt | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 53fe599c1646..8b1ad26fdbc0 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -750,7 +750,7 @@ public static class CustomScoreboard { "§2Diana:\n§7- §eLucky!\n§7- §eMythological Ritual\n§7- §ePet XP Buff", "", "Heat: §c♨ 0", - "§9§lParty:\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n §7- §f J10a1n15", + "§9§lParty (4):\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n §7- §f J10a1n15", "§7Maxwell Power", "§ewww.hypixel.net", } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 3392e791803b..0dd3e7fd363d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -245,16 +245,21 @@ enum class CustomScoreboardElements ( ), PARTY( { - listOf( - "§9§lParty", - *PartyAPI.partyMembers + val partyTitle : List = if (PartyAPI.partyMembers.isEmpty() && config.hideEmptyLines) { + listOf("") + } else { + val title = if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" + val partyList = PartyAPI.partyMembers .takeWhile { partyCount < config.maxPartyList.get() } .map { partyCount++ " §7- §7$it" } .toTypedArray() - ) + listOf(title, *partyList) + } + + partyTitle }, listOf(IslandType.CATACOMBS, IslandType.DUNGEON_HUB, IslandType.KUUDRA_ARENA, IslandType.CRIMSON_ISLE), 0, From aa0142c6d70bb153ed43b50ff787d27acdafb39d Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 22:11:05 +0100 Subject: [PATCH 054/225] added hide vanilla scoreboard --- .../skyhanni/config/features/MiscConfig.java | 6 ++++++ .../features/misc/CustomScoreboard.kt | 20 ++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 8b1ad26fdbc0..3a9b05e07503 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -757,6 +757,12 @@ public static class CustomScoreboard { ) public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21)); + @Expose + @ConfigOption(name = "Hide Vanilla Scoreboard", desc = "Hide the vanilla scoreboard.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideVanillaScoreboard = false; + @Expose @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") @ConfigEditorSlider( diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 0dd3e7fd363d..b3613443c9cd 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -26,11 +26,11 @@ package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.data.HypixelData -import at.hannibal2.skyhanni.data.ScoreboardData -import at.hannibal2.skyhanni.data.PurseAPI +import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.MayorElection import at.hannibal2.skyhanni.data.PartyAPI -import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.data.PurseAPI +import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems @@ -38,9 +38,10 @@ import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.TabListData import at.hannibal2.skyhanni.utils.TimeUtils.formatted import io.github.moulberry.notenoughupdates.util.SkyBlockTime +import net.minecraftforge.client.GuiIngameForge +import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent -import java.util.* import java.util.function.Supplier private val config get() = SkyHanniMod.feature.misc.customScoreboard @@ -200,7 +201,9 @@ enum class CustomScoreboardElements ( 13 ), SLAYER( - { listOf("§7Slayer") }, + { + listOf("§7Slayer") + }, listOf(IslandType.HUB, IslandType.SPIDER_DEN, IslandType.THE_PARK, IslandType.THE_END, IslandType.CRIMSON_ISLE), 0, 14 @@ -391,6 +394,13 @@ class CustomScoreboard { return newList } + @SubscribeEvent + fun onRenderScoreboard(event: RenderGameOverlayEvent.Post){ + if (event.type == RenderGameOverlayEvent.ElementType.HELMET && config.hideVanillaScoreboard && LorenzUtils.inSkyBlock){ + GuiIngameForge.renderObjective = false + } + } + private fun isEnabled() : Boolean{ return config.enabled && LorenzUtils.inSkyBlock } From 7fbc73db6f2688dccefa634c952acdf306d6c854 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 23:07:07 +0100 Subject: [PATCH 055/225] added slayer, fixed hide van sb bug --- .../skyhanni/config/features/MiscConfig.java | 4 ++-- .../at/hannibal2/skyhanni/data/SlayerAPI.kt | 4 ++-- .../skyhanni/features/misc/CustomScoreboard.kt | 17 ++++++++++++----- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 3a9b05e07503..2516e59a22df 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -745,9 +745,9 @@ public static class CustomScoreboard { "§8m77CK", "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234", "", - "§cSlayer", + "§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills", "§7Current Event", - "§2Diana:\n§7- §eLucky!\n§7- §eMythological Ritual\n§7- §ePet XP Buff", + "§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff", "", "Heat: §c♨ 0", "§9§lParty (4):\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n §7- §f J10a1n15", diff --git a/src/main/java/at/hannibal2/skyhanni/data/SlayerAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/SlayerAPI.kt index f3c23700daa7..bf25d1bd9302 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/SlayerAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/SlayerAPI.kt @@ -32,7 +32,7 @@ object SlayerAPI { var latestSlayerCategory = "" private var latestProgressChangeTime = 0L var latestWrongAreaWarning = 0L - private var latestSlayerProgress = "" + var latestSlayerProgress = "" fun hasActiveSlayerQuest() = latestSlayerCategory != "" @@ -178,4 +178,4 @@ object SlayerAPI { else -> null } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index b3613443c9cd..0c8403708a6e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -31,6 +31,7 @@ import at.hannibal2.skyhanni.data.MayorElection import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.data.PurseAPI import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems @@ -202,7 +203,13 @@ enum class CustomScoreboardElements ( ), SLAYER( { - listOf("§7Slayer") + listOf( + (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") + ) + ( + " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" + ) + ( + " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" + ) }, listOf(IslandType.HUB, IslandType.SPIDER_DEN, IslandType.THE_PARK, IslandType.THE_END, IslandType.CRIMSON_ISLE), 0, @@ -366,10 +373,7 @@ class CustomScoreboard { lineMap[index]?.let { // Multiline support - if (it[0] == "§9Party" - || it[0].toString().contains(MayorElection.currentCandidate?.name ?: "") - || it[0].toString().contains("Powder") - ) { + if (it.size > 1) { for (item in it) { newList.add(listOf(item)) } @@ -394,10 +398,13 @@ class CustomScoreboard { return newList } + // Thank you Apec for showing that the ElementType of the stupid scoreboard is FUCKING HELMET WTF @SubscribeEvent fun onRenderScoreboard(event: RenderGameOverlayEvent.Post){ if (event.type == RenderGameOverlayEvent.ElementType.HELMET && config.hideVanillaScoreboard && LorenzUtils.inSkyBlock){ GuiIngameForge.renderObjective = false + } else if (event.type == RenderGameOverlayEvent.ElementType.HELMET && !config.hideVanillaScoreboard && LorenzUtils.inSkyBlock){ + GuiIngameForge.renderObjective = true } } From 3e80b90ae52a4edbbc8f727bc92025e59b773090 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 1 Nov 2023 23:41:40 +0100 Subject: [PATCH 056/225] Changed the priority of hidding or multilining --- .../skyhanni/features/misc/CustomScoreboard.kt | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 0c8403708a6e..de0753501bc6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -371,15 +371,6 @@ class CustomScoreboard { val newList = mutableListOf>() for (index in config.textFormat) { lineMap[index]?.let { - - // Multiline support - if (it.size > 1) { - for (item in it) { - newList.add(listOf(item)) - } - continue - } - // Adds empty lines if(it[0] == ""){ newList.add(listOf("")) @@ -391,6 +382,14 @@ class CustomScoreboard { continue } + // Multiline support + if (it.size > 1) { + for (item in it) { + newList.add(listOf(item)) + } + continue + } + newList.add(it) } } From 3414864a5c391b784f284ac18138efe80811dd90 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 2 Nov 2023 19:33:52 +0100 Subject: [PATCH 057/225] added cool bingo rank color --- .../skyhanni/features/misc/CustomScoreboard.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index de0753501bc6..f9fe85a03bde 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -16,15 +16,16 @@ // - Bank API // - Custom Scoreboard Background // - quiver -// - icons // - beacon power // - skyblock level // - commissions +// - island date // package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.BingoAPI import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.MayorElection @@ -33,6 +34,7 @@ import at.hannibal2.skyhanni.data.PurseAPI import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.features.misc.compacttablist.AdvancedPlayerList import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase @@ -434,9 +436,9 @@ private fun extractLobbyCode(input: String): String? { private fun getProfileTypeAsSymbol(): String { return when { - HypixelData.ironman -> "§7♲ " // Ironman + HypixelData.ironman -> "§7♲ " // Ironman HypixelData.stranded -> "§a☀ " // Stranded - HypixelData.bingo -> "§cⒷ " // Bingo - TODO: Consider using colors from BingoAPI - else -> "§e" // Default case + HypixelData.bingo -> ScoreboardData.sidebarLines.firstOrNull { it.contains("Bingo") }?.substring(0, 3) + "Ⓑ " // Bingo - gets the first 3 chars of " §9Ⓑ §9Bingo" (you are unable to get the Ⓑ for some reason) + else -> "§e " // Default case } } From 311ffb8cfce4568564d5c4b5ec867e99c24a393b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 2 Nov 2023 19:34:25 +0100 Subject: [PATCH 058/225] removed that space --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index f9fe85a03bde..ed18ad5c0647 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -439,6 +439,6 @@ private fun getProfileTypeAsSymbol(): String { HypixelData.ironman -> "§7♲ " // Ironman HypixelData.stranded -> "§a☀ " // Stranded HypixelData.bingo -> ScoreboardData.sidebarLines.firstOrNull { it.contains("Bingo") }?.substring(0, 3) + "Ⓑ " // Bingo - gets the first 3 chars of " §9Ⓑ §9Bingo" (you are unable to get the Ⓑ for some reason) - else -> "§e " // Default case + else -> "§e" // Default case } } From 12aca2fe3613c3c43f29587b993d1f531fa0738c Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 3 Nov 2023 00:26:02 +0100 Subject: [PATCH 059/225] ADDED MAXWELLAPI WOOO I AM PROUD OF MYSELF --- .../java/at/hannibal2/skyhanni/SkyHanniMod.kt | 2 + .../at/hannibal2/skyhanni/config/Storage.java | 6 +- .../at/hannibal2/skyhanni/data/MaxwellAPI.kt | 91 +++++++++++++++++++ .../features/misc/CustomScoreboard.kt | 13 ++- 4 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/data/MaxwellAPI.kt diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index d6dd188e69c6..2fc943d2c6fd 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -22,6 +22,7 @@ import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.ItemClickData import at.hannibal2.skyhanni.data.ItemRenderBackground import at.hannibal2.skyhanni.data.ItemTipHelper +import at.hannibal2.skyhanni.data.MaxwellAPI import at.hannibal2.skyhanni.data.MayorElection import at.hannibal2.skyhanni.data.MinecraftData import at.hannibal2.skyhanni.data.OtherInventoryData @@ -384,6 +385,7 @@ class SkyHanniMod { loadModule(RiftAPI) loadModule(SackAPI) loadModule(BingoAPI) + loadModule(MaxwellAPI) // features loadModule(BazaarOrderHelper()) diff --git a/src/main/java/at/hannibal2/skyhanni/config/Storage.java b/src/main/java/at/hannibal2/skyhanni/config/Storage.java index 21ed83b00a4b..e5960b3ee786 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/Storage.java +++ b/src/main/java/at/hannibal2/skyhanni/config/Storage.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config; +import at.hannibal2.skyhanni.data.Powers; import at.hannibal2.skyhanni.data.model.ComposterUpgrade; import at.hannibal2.skyhanni.features.dungeon.DungeonAPI; import at.hannibal2.skyhanni.features.fishing.trophy.TrophyRarity; @@ -72,6 +73,9 @@ public static class ProfileSpecific { @Expose public String currentPet = ""; + @Expose + public Powers currentPower = null; + @Expose public Map minions = new HashMap<>(); @@ -457,4 +461,4 @@ public static class DungeonStorage { public Map bosses = new HashMap<>(); } } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/data/MaxwellAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/MaxwellAPI.kt new file mode 100644 index 000000000000..59319f02858a --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/data/MaxwellAPI.kt @@ -0,0 +1,91 @@ +package at.hannibal2.skyhanni.data + +import at.hannibal2.skyhanni.events.ConfigLoadEvent +import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.events.ProfileJoinEvent +import at.hannibal2.skyhanni.utils.InventoryUtils +import at.hannibal2.skyhanni.utils.ItemUtils.getLore +import at.hannibal2.skyhanni.utils.LorenzUtils +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import java.util.regex.Pattern + + +// TODO USE SH-REPO +enum class Powers (val power: String, val pattern: Pattern) { + // Standard + FORTUITOUS("Fortuitous", "§r§eYou(?:r selected power was set to)? §r§aFortuitous§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + PRETTY("Pretty", "§r§eYou(?:r selected power was set to)? §r§aPretty§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + PROTECTED("Protected", "§r§eYou(?:r selected power was set to)? §r§aProtected§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + SIMPLE("Simple", "§r§eYou(?:r selected power was set to)? §r§aSimple§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + WARRIOR("Warrior", "§r§eYou(?:r selected power was set to)? §r§aWarrior§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + COMMANDO("Commando", "§r§eYou(?:r selected power was set to)? §r§aCommando§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + DISCIPLINED("Disciplined", "§r§eYou(?:r selected power was set to)? §r§aDisciplined§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + INSPIRED("Inspired", "§r§eYou(?:r selected power was set to)? §r§aInspired§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + OMINOUS("Ominous", "§r§eYou(?:r selected power was set to)? §r§aOminous§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + PREPARED("Prepared", "§r§eYou(?:r selected power was set to)? §r§aPrepared§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + + // Unlockable + SILKY("Silky", "§r§eYou(?:r selected power was set to)? §r§aSilky§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + SWEET("Sweet", "§r§eYou(?:r selected power was set to)? §r§aSweet§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + BLOODY("Bloody", "§r§eYou(?:r selected power was set to)? §r§aBloody§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + ITCHY("Itchy", "§r§eYou(?:r selected power was set to)? §r§aItchy§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + SIGHTED("Sighted", "§r§eYou(?:r selected power was set to)? §r§aSighted§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + ADEPT("Adept", "§r§eYou(?:r selected power was set to)? §r§aAdept§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + MYTHICAL("Mythical", "§r§eYou(?:r selected power was set to)? §r§aMythical§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + FORCEFUL("Forceful", "§r§eYou(?:r selected power was set to)? §r§aForceful§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + SHADED("Shaded", "§r§eYou(?:r selected power was set to)? §r§aShaded§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + STRONG("Strong", "§r§eYou(?:r selected power was set to)? §r§aStrong§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + DEMONIC("Demonic", "§r§eYou(?:r selected power was set to)? §r§aDemonic§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + PLEASANT("Pleasant", "§r§eYou(?:r selected power was set to)? §r§aPleasant§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + HURTFUL("Hurtful", "§r§eYou(?:r selected power was set to)? §r§aHurtful§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + BIZARRE("Bizarre", "§r§eYou(?:r selected power was set to)? §r§aBizarre§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + HEALTHY("Healthy", "§r§eYou(?:r selected power was set to)? §r§aHealthy§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + SLENDER("Slender", "§r§eYou(?:r selected power was set to)? §r§aSlender§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + SCORCHING("Scorching", "§r§eYou(?:r selected power was set to)? §r§aScorching§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + CRUMBLY("Crumbly", "§r§eYou(?:r selected power was set to)? §r§aCrumbly§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + BUBBA("Bubba", "§r§eYou(?:r selected power was set to)? §r§aBubba§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ), + SANGUISUGE("Sanguisuge", "§r§eYou(?:r selected power was set to)? §r§aSanguisuge§r§e(?:!§r| power for your §r§aAccessory Bag§r§e!§r)".toPattern() ); +} +object MaxwellAPI { + var currentPower : Powers? = null + + @SubscribeEvent + fun onConfigLoad(event: ConfigLoadEvent) { + val config = ProfileStorageData.profileSpecific ?: return + currentPower = config.currentPower ?: return + } + + @SubscribeEvent + fun onChat(event: LorenzChatEvent) { + for (power in Powers.entries) { + if (power.pattern.matcher(event.message).matches()) { + currentPower = power + savePower(power) + } + } + } + + @SubscribeEvent + fun onInventoryFullyLoaded(event: InventoryFullyOpenedEvent) { + if (!LorenzUtils.inSkyBlock) return + if (!InventoryUtils.openInventoryName().contains("Accessory Bag Thaumaturgy")) return + + val stacks = event.inventoryItems + val selectedPower = stacks.values.find { it.getLore().isNotEmpty() && it.getLore().last() == "§aPower is selected!" } ?: return + + currentPower = Powers.entries.find { selectedPower.displayName.contains(it.power) } + savePower(currentPower!!) + } + + @SubscribeEvent + fun onProfileJoin(event: ProfileJoinEvent) { + val config = ProfileStorageData.profileSpecific ?: return + currentPower = config.currentPower ?: return + } + + private fun savePower(power: Powers) { + val config = ProfileStorageData.profileSpecific ?: return + config.currentPower = power + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index ed18ad5c0647..6cb1c0106887 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -28,6 +28,7 @@ import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.data.BingoAPI import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.data.MaxwellAPI import at.hannibal2.skyhanni.data.MayorElection import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.data.PurseAPI @@ -278,7 +279,17 @@ enum class CustomScoreboardElements ( 19 ), MAXWELL( - { listOf("§7Maxwell Power") }, + { + when (MaxwellAPI.currentPower == null) { + true -> listOf("§c§lPlease visit Maxwell!") + false -> + when (config.displayNumbersFirst) + { + true -> listOf("§e${MaxwellAPI.currentPower?.power} Power") + false -> listOf("Power: §e${MaxwellAPI.currentPower?.power}") + } + } + }, listOf(IslandType.THE_RIFT), 1, 20 From 88bce51c41e93f58208ad852a2adb9b6e26ec298 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 3 Nov 2023 00:32:20 +0100 Subject: [PATCH 060/225] updated bit of todolist --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 6cb1c0106887..f98b2b639341 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -8,8 +8,7 @@ // // TODO LIST // V1 RELEASE -// - Hide default scoreboard -// - the things that arent done yet +// - the things that arent done yet (EVENTS SOON) // // V2 RELEASE // - Soulflow API @@ -18,8 +17,6 @@ // - quiver // - beacon power // - skyblock level -// - commissions -// - island date // package at.hannibal2.skyhanni.features.misc From ee8bb795238a59148f499a97eb34ae3a8b1ff5a5 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 8 Nov 2023 19:46:43 +0100 Subject: [PATCH 061/225] Added missing rift slayer loc --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index f98b2b639341..18bbb98e10b8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -211,7 +211,7 @@ enum class CustomScoreboardElements ( " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" ) }, - listOf(IslandType.HUB, IslandType.SPIDER_DEN, IslandType.THE_PARK, IslandType.THE_END, IslandType.CRIMSON_ISLE), + listOf(IslandType.HUB, IslandType.SPIDER_DEN, IslandType.THE_PARK, IslandType.THE_END, IslandType.CRIMSON_ISLE, IslandType.THE_RIFT), 0, 14 ), From 93479d38fc83afb0a9cf3e679ad2f19b10c59255 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 8 Nov 2023 22:41:50 +0100 Subject: [PATCH 062/225] Now using lorenzTickEvent, removed old imports --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 18bbb98e10b8..bdfbc016e38e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -22,7 +22,6 @@ package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.BingoAPI import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.MaxwellAPI @@ -32,7 +31,7 @@ import at.hannibal2.skyhanni.data.PurseAPI import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.events.GuiRenderEvent -import at.hannibal2.skyhanni.features.misc.compacttablist.AdvancedPlayerList +import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase @@ -42,7 +41,6 @@ import io.github.moulberry.notenoughupdates.util.SkyBlockTime import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import net.minecraftforge.fml.common.gameevent.TickEvent import java.util.function.Supplier private val config get() = SkyHanniMod.feature.misc.customScoreboard @@ -321,7 +319,7 @@ class CustomScoreboard { } @SubscribeEvent - fun onTick(event: TickEvent) { + fun onTick(event: LorenzTickEvent) { // Draws the custom scoreboard display = drawScoreboard() From 498b9cd4d56d615ff8211922491f2e87312202c5 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 8 Nov 2023 22:56:14 +0100 Subject: [PATCH 063/225] Fixed yellow maxwell power name --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index bdfbc016e38e..45d80d838945 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -281,7 +281,7 @@ enum class CustomScoreboardElements ( when (config.displayNumbersFirst) { true -> listOf("§e${MaxwellAPI.currentPower?.power} Power") - false -> listOf("Power: §e${MaxwellAPI.currentPower?.power}") + false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") } } }, From b84082feed48c1aecf9ea380c4194b9f0557182a Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 8 Nov 2023 22:56:29 +0100 Subject: [PATCH 064/225] Fixed yellow maxwell power name v2 --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 45d80d838945..dbc2a1d210cf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -280,7 +280,7 @@ enum class CustomScoreboardElements ( false -> when (config.displayNumbersFirst) { - true -> listOf("§e${MaxwellAPI.currentPower?.power} Power") + true -> listOf("${MaxwellAPI.currentPower?.power} Power") false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") } } From 2847b01542f63737d44bc1714aabf40da78d5620 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 9 Nov 2023 20:53:24 +0100 Subject: [PATCH 065/225] Added an option to hide consecutive empty lines --- .../at/hannibal2/skyhanni/config/features/MiscConfig.java | 6 ++++++ .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index b83481efa96f..313642765f6c 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -801,6 +801,12 @@ public static class CustomScoreboard { @FeatureToggle public boolean showMayorPerks = true; + @Expose + @ConfigOption(name = "Hide consecutive empty lines", desc = "Hide lines that are empty and have an empty line above them.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideConsecutiveEmptyLines = true; + @Expose @ConfigOption(name = "Custom Title", desc = "What should be displayed as the title of the scoreboard.\nUse & for colors") @ConfigEditorText diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index dbc2a1d210cf..7574333e1305 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -379,6 +379,11 @@ class CustomScoreboard { val newList = mutableListOf>() for (index in config.textFormat) { lineMap[index]?.let { + // Hide consecutive empty lines + if (config.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull()?.get(0) == "") { + continue + } + // Adds empty lines if(it[0] == ""){ newList.add(listOf("")) From 228687f28249a3440ecb5583b5c8aac0889b4261 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 9 Nov 2023 21:12:23 +0100 Subject: [PATCH 066/225] Fixed power not having a good config value thingy --- .../java/at/hannibal2/skyhanni/config/features/MiscConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index 313642765f6c..a94a676a6350 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -755,7 +755,7 @@ public static class CustomScoreboard { "", "Heat: §c♨ 0", "§9§lParty (4):\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n §7- §f J10a1n15", - "§7Maxwell Power", + "Power: Sighted", "§ewww.hypixel.net", } ) From a98244084b6f11a9d01dfce0e2fd729656b787ad Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 11 Nov 2023 00:24:59 +0100 Subject: [PATCH 067/225] Fixed special mayors not getting colored --- .../at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 7574333e1305..ec26aad69bda 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -435,6 +435,10 @@ private fun translateMayorNameToColor(input: String) : String { "Foxy" -> "§d$input" "Marina" -> "§b$input" "Paul" -> "§c$input" + "Scorpius" -> "§d$input" + "Jerry" -> "§d$input" + "Derpy" -> "§d$input" + "Dante" -> "§d$input" else -> "§7$input" } } From 4841e5d7a54fdf6615c54544aff26dc56f429bb5 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 11 Nov 2023 14:21:21 +0100 Subject: [PATCH 068/225] Vanilla sb only hidden in sb now --- .../features/misc/CustomScoreboard.kt | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index ec26aad69bda..88e09a9b080b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -314,7 +314,7 @@ enum class CustomScoreboardElements ( class CustomScoreboard { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { - if (!isEnabled()) return + if (!isCustomScoreboardEnabled()) return config.position.renderStringsAndItems(display, posLabel = "Custom Scoreboard") } @@ -413,20 +413,23 @@ class CustomScoreboard { // Thank you Apec for showing that the ElementType of the stupid scoreboard is FUCKING HELMET WTF @SubscribeEvent fun onRenderScoreboard(event: RenderGameOverlayEvent.Post){ - if (event.type == RenderGameOverlayEvent.ElementType.HELMET && config.hideVanillaScoreboard && LorenzUtils.inSkyBlock){ - GuiIngameForge.renderObjective = false - } else if (event.type == RenderGameOverlayEvent.ElementType.HELMET && !config.hideVanillaScoreboard && LorenzUtils.inSkyBlock){ - GuiIngameForge.renderObjective = true + if (event.type == RenderGameOverlayEvent.ElementType.HELMET) { + GuiIngameForge.renderObjective = !isHideVanillaScoreboardEnabled() } } - private fun isEnabled() : Boolean{ + private fun isCustomScoreboardEnabled() : Boolean { return config.enabled && LorenzUtils.inSkyBlock } + + private fun isHideVanillaScoreboardEnabled() : Boolean { + return config.hideVanillaScoreboard && LorenzUtils.inSkyBlock + } } private fun translateMayorNameToColor(input: String) : String { return when (input) { + // Normal Mayors "Aatrox" -> "§3$input" "Cole" -> "§e$input" "Diana" -> "§2$input" @@ -435,11 +438,13 @@ private fun translateMayorNameToColor(input: String) : String { "Foxy" -> "§d$input" "Marina" -> "§b$input" "Paul" -> "§c$input" + + // Special Mayors "Scorpius" -> "§d$input" "Jerry" -> "§d$input" "Derpy" -> "§d$input" "Dante" -> "§d$input" - else -> "§7$input" + else -> "§cUnknown Mayor: §7$input" } } @@ -451,9 +456,9 @@ private fun extractLobbyCode(input: String): String? { private fun getProfileTypeAsSymbol(): String { return when { - HypixelData.ironman -> "§7♲ " // Ironman - HypixelData.stranded -> "§a☀ " // Stranded - HypixelData.bingo -> ScoreboardData.sidebarLines.firstOrNull { it.contains("Bingo") }?.substring(0, 3) + "Ⓑ " // Bingo - gets the first 3 chars of " §9Ⓑ §9Bingo" (you are unable to get the Ⓑ for some reason) - else -> "§e" // Default case + HypixelData.ironman -> "§7♲ " // Ironman + HypixelData.stranded -> "§a☀ " // Stranded + HypixelData.bingo -> ScoreboardData.sidebarLines.firstOrNull { it.contains("Bingo") }?.substring(0, 3) + "Ⓑ " // Bingo - gets the first 3 chars of " §9Ⓑ §9Bingo" (you are unable to get the Ⓑ for some reason) + else -> "§e" // Default case } } From e1a26368f8df21604cceec2b9890f0092c3881d4 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 11 Nov 2023 15:04:25 +0100 Subject: [PATCH 069/225] fix typo --- src/main/java/at/hannibal2/skyhanni/utils/TabListData.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TabListData.kt b/src/main/java/at/hannibal2/skyhanni/utils/TabListData.kt index 67ea197d2bef..b2c3d1699a15 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/TabListData.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/TabListData.kt @@ -42,7 +42,7 @@ class TabListData { fun copyCommand(args: Array) { if (debugCache != null) { - LorenzUtils.clickableChat("§c[SkyHanni] Tab list debug is enambed!", "shdebugtablist") + LorenzUtils.clickableChat("§c[SkyHanni] Tab list debug is enabled!", "shdebugtablist") return } From 96ed8915c525b0a456b7d4b3e3efc6b24416aa09 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 12 Nov 2023 20:46:51 +0100 Subject: [PATCH 070/225] events (not working yet) --- .../features/misc/CustomScoreboard.kt | 187 +++++++++++++++++- 1 file changed, 177 insertions(+), 10 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 88e09a9b080b..60daf59f117b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -32,12 +32,16 @@ import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.LorenzTickEvent +import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase +import at.hannibal2.skyhanni.utils.StringUtils.matches import at.hannibal2.skyhanni.utils.TabListData import at.hannibal2.skyhanni.utils.TimeUtils.formatted import io.github.moulberry.notenoughupdates.util.SkyBlockTime +import net.minecraft.client.Minecraft import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -75,13 +79,17 @@ enum class CustomScoreboardElements ( val index: Int ){ SKYBLOCK( - { listOf(config.customTitle.get().toString().replace("&", "§")) }, + { + listOf(config.customTitle.get().toString().replace("&", "§")) + }, listOf(), 0, 0 ), PROFILE( - { listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) }, + { + listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) + }, listOf(), 0, 1 @@ -159,25 +167,33 @@ enum class CustomScoreboardElements ( 7 ), EMPTY_LINE( - { listOf("") }, + { + listOf("") + }, listOf(), 0, 8 ), LOCATION( - { listOf(location) }, + { + listOf(location) + }, listOf(), 0, 9 ), SKYBLOCK_TIME( - { listOf(SkyBlockTime.now().formatted(false)) }, + { + listOf(SkyBlockTime.now().formatted(false)) + }, listOf(), 0, 10 ), LOBBY_CODE( - { listOf("§8$lobbyCode") }, + { + listOf("§8$lobbyCode") + }, listOf(), 0, 11 @@ -194,7 +210,9 @@ enum class CustomScoreboardElements ( 12 ), EMPTY_LINE2( - { listOf("") }, + { + listOf("") + }, listOf(), 0, 13 @@ -214,7 +232,9 @@ enum class CustomScoreboardElements ( 14 ), CURRENT_EVENT( - { listOf("§cCurrent Event") }, + { + Events.getFirstEvent().getLine() + }, listOf(), 0, 15 @@ -234,7 +254,9 @@ enum class CustomScoreboardElements ( 16 ), EMPTY_LINE3( - { listOf("") }, + { + listOf("") + }, listOf(), 0, 17 @@ -290,7 +312,9 @@ enum class CustomScoreboardElements ( 20 ), WEBSITE( - { listOf(config.customFooter.get().toString().replace("&", "§")) }, + { + listOf(config.customFooter.get().toString().replace("&", "§")) + }, listOf(), 0, 21 @@ -311,6 +335,143 @@ enum class CustomScoreboardElements ( } } +private enum class Events(private val displayLine: Supplier>, private val showWhen: () -> Boolean){ + NONE( + { + when { + config.hideEmptyLines -> listOf("") + else -> listOf("§cNo Event") + } + }, + { + false + } + ), + DUNGEONS( + { + listOf("§cDungeons Event") + }, + { + HypixelData.skyBlockIsland == IslandType.CATACOMBS + } + ), + KUUDRA( + { + listOf("§cKuudra Event") + }, + { + HypixelData.skyBlockIsland == IslandType.KUUDRA_ARENA + } + ), + JACOB( + { + listOf("§cJacob Event") + }, + { + false + } + ), + WINTER( + { + listOf("§bWinter Event") + }, + { + false + } + ), + SPOOKY( + { + listOf(ScoreboardData.sidebarLines.first { it.startsWith("§6Spooky Festival§f") }) + // Time + (getFooter().split("\n").first { it.startsWith("§r§r§7Your Candy:") }) // Candy + }, + { + ScoreboardData.sidebarLines.any { it.startsWith("§6Spooky Festival§f") } + } + ), + MARINA( + { + listOf("§bFishing Festival: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival")?.removePrefix(" Ends In: ")) + }, + { + TabListData.getTabList().any { it.startsWith("§e§lEvent: §r§bFishing Festival") } + } + ), + NEW_YEAR( + { + listOf(ScoreboardData.sidebarLines.first { it.startsWith("§dNew Year Event!§f") }) + }, + { + ScoreboardData.sidebarLines.any { it.startsWith("§dNew Year Event!§f") } + } + ), + ORINGO( + { + listOf("§6Oringo Event") + }, + { + false + } + ), + MINING_EVENTS( + { + val list = mutableListOf() + + // Mining Fiesta + if (TabListData.getTabList().any { it.startsWith("§6Mining Festival§f") }) { + list += "§6Mining Fiesta: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta")?.removePrefix(" Ends In: ") + } + + // Wind + if (ScoreboardData.sidebarLines.first { it == "§9Wind Compass" }.isNotEmpty()){ + list += "§9Wind Compass" + list += ScoreboardData.sidebarLines.nextAfter("§9Wind Compass") ?: "§7No Wind Compass for some reason" + } + + // Better Together + if (ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:") }.isNotEmpty()){ + list += "§9Better Together" + list += ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:")} + } + + list + }, + { + HypixelData.skyBlockIsland == IslandType.DWARVEN_MINES || HypixelData.skyBlockIsland == IslandType.CRYSTAL_HOLLOWS + } + ), + DAMAGE( + { + listOf(ScoreboardData.sidebarLines.first { "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) }) + + (ScoreboardData.sidebarLines.firstOrNull { "Your Damage: §c\\d{1,3}(,\\d{3})*(\\.\\d+)?".toPattern().matches(it) } ?: "") + }, + { + ScoreboardData.sidebarLines.any { "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) } + } + ), + ESSENCE( + { + listOf(ScoreboardData.sidebarLines.first { it.startsWith("Essence: ") }) + }, + { + ScoreboardData.sidebarLines.any { it.startsWith("Essence: ") } + } + ); + + fun getLine(): List { + return displayLine.get() + } + + companion object { + fun getFirstEvent(): Events { + return getAllEventsToDisplay().firstOrNull() ?: NONE + } + + fun getAllEventsToDisplay(): List { + return entries.filter { it.showWhen.invoke() } + } + } +} + class CustomScoreboard { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { @@ -462,3 +623,9 @@ private fun getProfileTypeAsSymbol(): String { else -> "§e" // Default case } } + +private fun getFooter() : String{ + val tabList = Minecraft.getMinecraft().ingameGUI.tabList as AccessorGuiPlayerTabOverlay + if (tabList.footer_skyhanni == null) return "" + return tabList.footer_skyhanni.formattedText +} From 05a1da5c3a94a1519ddcbe1fd6a1205d196a77d8 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 12 Nov 2023 20:55:04 +0100 Subject: [PATCH 071/225] moved funni feature to gui config --- .../skyhanni/config/features/GUIConfig.java | 114 ++++++++++++++++++ .../skyhanni/config/features/MiscConfig.java | 108 ----------------- .../features/misc/CustomScoreboard.kt | 2 +- 3 files changed, 115 insertions(+), 109 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/GUIConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/GUIConfig.java index 992ef03d9d03..7cde5301f171 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/GUIConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/GUIConfig.java @@ -8,6 +8,7 @@ import io.github.moulberry.moulconfig.annotations.Accordion; import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; import io.github.moulberry.moulconfig.annotations.ConfigEditorButton; +import io.github.moulberry.moulconfig.annotations.ConfigEditorDraggableList; import io.github.moulberry.moulconfig.annotations.ConfigEditorKeybind; import io.github.moulberry.moulconfig.annotations.ConfigEditorSlider; import io.github.moulberry.moulconfig.annotations.ConfigEditorText; @@ -15,6 +16,10 @@ import io.github.moulberry.moulconfig.observer.Property; import org.lwjgl.input.Keyboard; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class GUIConfig { @ConfigOption(name = "Edit GUI Locations", desc = "Change the position of SkyHanni's overlays.") @@ -80,6 +85,115 @@ public static class TextBoxConfig { public Position position = new Position(10, 80, false, true); } + @Expose + @ConfigOption(name = "Custom Scoreboard", desc = "") + @Accordion + public GUIConfig.CustomScoreboard customScoreboard = new GUIConfig.CustomScoreboard(); + + public static class CustomScoreboard { + + @Expose + @ConfigOption( + name = "Enabled", + desc = "Show a custom scoreboard instead of the default one." //TODO: MAKE COOLER + ) + @ConfigEditorBoolean + @FeatureToggle + public boolean enabled = false; + + @Expose + @ConfigOption( + name = "Text Format", + desc = "Drag text to change the appearance of the overlay." + ) + @ConfigEditorDraggableList( + exampleText = { + "§6§lSKYBLOCK", + "§7♲ Blueberry", + "Purse: §652,763,737", + "Motes: §d64,647", + "Bank: §6249M", + "Bits: §b59,264", + "Copper: §c23,495", + "Gems: §a57,873", + "", + "§7⏣ §bVillage", + "Late Summer 11th, Year 311", + "§8m77CK", + "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234", + "", + "§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills", + "§7Current Event", + "§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff", + "", + "Heat: §c♨ 0", + "§9§lParty (4):\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n §7- §f J10a1n15", + "Power: Sighted", + "§ewww.hypixel.net", + } + ) + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21)); + + @Expose + @ConfigOption(name = "Hide Vanilla Scoreboard", desc = "Hide the vanilla scoreboard.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideVanillaScoreboard = false; + + @Expose + @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") + @ConfigEditorSlider( + minValue = 1, + maxValue = 25, // why do I even set it so high + minStep = 1 + ) + public Property maxPartyList = Property.of(4); + + @Expose + @ConfigOption(name = "Hide lines with no info", desc = "Hide lines that have no info to display, like hiding the party when not being in one.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideEmptyLines = true; + + @Expose + @ConfigOption(name = "Hide Info not relevant to location", desc = "Hide lines that are not relevant to the current location, like hiding copper while not in garden") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideIrrelevantLines = true; + + @Expose + @ConfigOption(name = "Display Numbers First", desc = "Determines whether the number or line name displays first. " + + "§eNote: Will not update the preview above!") + @ConfigEditorBoolean + @FeatureToggle + public boolean displayNumbersFirst = false; + + @Expose + @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") + @ConfigEditorBoolean + @FeatureToggle + public boolean showMayorPerks = true; + + @Expose + @ConfigOption(name = "Hide consecutive empty lines", desc = "Hide lines that are empty and have an empty line above them.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideConsecutiveEmptyLines = true; + + @Expose + @ConfigOption(name = "Custom Title", desc = "What should be displayed as the title of the scoreboard.\nUse & for colors") + @ConfigEditorText + public Property customTitle = Property.of("&6&lSKYBLOCK"); + + @Expose + @ConfigOption(name = "Custom Footer", desc = "What should be displayed as the footer of the scoreboard.\nUse & for colors") + @ConfigEditorText + public Property customFooter = Property.of("&ewww.hypixel.net"); + + @Expose + public Position position = new Position(10, 80, false, true); + } + @Expose @ConfigOption(name = "Real Time", desc = "Display the current computer time, a handy feature when playing in full-screen mode.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java index a94a676a6350..f1cbc550363b 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/MiscConfig.java @@ -712,114 +712,6 @@ public static class KickDurationConfig { public Position position = new Position(400, 200, 1.3f); } - @Expose - @ConfigOption(name = "Custom Scoreboard", desc = "") - @Accordion - public MiscConfig.CustomScoreboard customScoreboard = new MiscConfig.CustomScoreboard(); - - public static class CustomScoreboard { - - @Expose - @ConfigOption( - name = "Enabled", - desc = "Show a custom scoreboard instead of the default one." //TODO: MAKE COOLER - ) - @ConfigEditorBoolean - @FeatureToggle - public boolean enabled = false; - - @Expose - @ConfigOption( - name = "Text Format", - desc = "Drag text to change the appearance of the overlay." - ) - @ConfigEditorDraggableList( - exampleText = { - "§6§lSKYBLOCK", - "§7♲ Blueberry", - "Purse: §652,763,737", - "Motes: §d64,647", - "Bank: §6249M", - "Bits: §b59,264", - "Copper: §c23,495", - "Gems: §a57,873", - "", - "§7⏣ §bVillage", - "Late Summer 11th, Year 311", - "§8m77CK", - "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234", - "", - "§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills", - "§7Current Event", - "§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff", - "", - "Heat: §c♨ 0", - "§9§lParty (4):\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n §7- §f J10a1n15", - "Power: Sighted", - "§ewww.hypixel.net", - } - ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21)); - - @Expose - @ConfigOption(name = "Hide Vanilla Scoreboard", desc = "Hide the vanilla scoreboard.") - @ConfigEditorBoolean - @FeatureToggle - public boolean hideVanillaScoreboard = false; - - @Expose - @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") - @ConfigEditorSlider( - minValue = 1, - maxValue = 25, // why do I even set it so high - minStep = 1 - ) - public Property maxPartyList = Property.of(4); - - @Expose - @ConfigOption(name = "Hide lines with no info", desc = "Hide lines that have no info to display, like hiding the party when not being in one.") - @ConfigEditorBoolean - @FeatureToggle - public boolean hideEmptyLines = true; - - @Expose - @ConfigOption(name = "Hide Info not relevant to location", desc = "Hide lines that are not relevant to the current location, like hiding copper while not in garden") - @ConfigEditorBoolean - @FeatureToggle - public boolean hideIrrelevantLines = true; - - @Expose - @ConfigOption(name = "Display Numbers First", desc = "Determines whether the number or line name displays first. " + - "§eNote: Will not update the preview above!") - @ConfigEditorBoolean - @FeatureToggle - public boolean displayNumbersFirst = false; - - @Expose - @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") - @ConfigEditorBoolean - @FeatureToggle - public boolean showMayorPerks = true; - - @Expose - @ConfigOption(name = "Hide consecutive empty lines", desc = "Hide lines that are empty and have an empty line above them.") - @ConfigEditorBoolean - @FeatureToggle - public boolean hideConsecutiveEmptyLines = true; - - @Expose - @ConfigOption(name = "Custom Title", desc = "What should be displayed as the title of the scoreboard.\nUse & for colors") - @ConfigEditorText - public Property customTitle = Property.of("&6&lSKYBLOCK"); - - @Expose - @ConfigOption(name = "Custom Footer", desc = "What should be displayed as the footer of the scoreboard.\nUse & for colors") - @ConfigEditorText - public Property customFooter = Property.of("&ewww.hypixel.net"); - - @Expose - public Position position = new Position(10, 80, false, true); - } @Expose @ConfigOption(name = "Exp Bottles", desc = "Hides all the experience orbs lying on the ground.") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt index 60daf59f117b..51957a3ab418 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt @@ -47,7 +47,7 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import java.util.function.Supplier -private val config get() = SkyHanniMod.feature.misc.customScoreboard +private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList>() private var partyCount = 0 From 878682b12a70dcf9b42e6ddc6df8b00eefbe0835 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 12 Nov 2023 22:58:59 +0100 Subject: [PATCH 072/225] + Cool new files --- .../java/at/hannibal2/skyhanni/SkyHanniMod.kt | 2 +- .../features/misc/CustomScoreboard.kt | 631 ------------------ .../misc/customscoreboard/CustomScoreboard.kt | 224 +++++++ .../misc/customscoreboard/Elements.kt | 285 ++++++++ .../features/misc/customscoreboard/Events.kt | 149 +++++ 5 files changed, 659 insertions(+), 632 deletions(-) delete mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index a1c41e4d111c..a6b99b50d197 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -224,7 +224,7 @@ import at.hannibal2.skyhanni.features.misc.SkyBlockKickDuration import at.hannibal2.skyhanni.features.misc.SuperpairsClicksAlert import at.hannibal2.skyhanni.features.misc.TimeFeatures import at.hannibal2.skyhanni.features.misc.TpsCounter -import at.hannibal2.skyhanni.features.misc.CustomScoreboard +import at.hannibal2.skyhanni.features.misc.customscoreboard.CustomScoreboard import at.hannibal2.skyhanni.features.misc.compacttablist.AdvancedPlayerList import at.hannibal2.skyhanni.features.misc.compacttablist.TabListReader import at.hannibal2.skyhanni.features.misc.compacttablist.TabListRenderer diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt deleted file mode 100644 index 51957a3ab418..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CustomScoreboard.kt +++ /dev/null @@ -1,631 +0,0 @@ -// -// Requested by alpaka8123 (https://discord.com/channels/997079228510117908/1162844830360146080) -// Done by J10a1n15, with lots of help from hanni, and snippets from item tracker features <3 -// -// I'm also like really sorry for anyone who has to look at this code, it looks kinda bad -// - -// -// TODO LIST -// V1 RELEASE -// - the things that arent done yet (EVENTS SOON) -// -// V2 RELEASE -// - Soulflow API -// - Bank API -// - Custom Scoreboard Background -// - quiver -// - beacon power -// - skyblock level -// - -package at.hannibal2.skyhanni.features.misc - -import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.HypixelData -import at.hannibal2.skyhanni.data.IslandType -import at.hannibal2.skyhanni.data.MaxwellAPI -import at.hannibal2.skyhanni.data.MayorElection -import at.hannibal2.skyhanni.data.PartyAPI -import at.hannibal2.skyhanni.data.PurseAPI -import at.hannibal2.skyhanni.data.ScoreboardData -import at.hannibal2.skyhanni.data.SlayerAPI -import at.hannibal2.skyhanni.events.GuiRenderEvent -import at.hannibal2.skyhanni.events.LorenzTickEvent -import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay -import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter -import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems -import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase -import at.hannibal2.skyhanni.utils.StringUtils.matches -import at.hannibal2.skyhanni.utils.TabListData -import at.hannibal2.skyhanni.utils.TimeUtils.formatted -import io.github.moulberry.notenoughupdates.util.SkyBlockTime -import net.minecraft.client.Minecraft -import net.minecraftforge.client.GuiIngameForge -import net.minecraftforge.client.event.RenderGameOverlayEvent -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import java.util.function.Supplier - -private val config get() = SkyHanniMod.feature.gui.customScoreboard -private var display = emptyList>() -private var partyCount = 0 - -// Stats / Numbers -private var purse = "0" -private var motes = "0" -private var bank = "0" -private var bits = "0" -private var copper = "0" -private var gems = "0" -private var location = "None" -private var lobbyCode = "None" -private var heat = "0" -private var mithrilPowder = "0" -private var gemstonePowder = "0" - - -enum class CustomScoreboardElements ( - // displayLine: The line that is displayed on the scoreboard - private val displayLine: Supplier>?, - - // islands: The islands that this line is displayed on - private val islands: List, - - // visibilityOption: The option that is used to hide this line - use 0 to only display on the listed islands, 1 to hide on the listed islands - private val visibilityOption : Int, - - // index: The index of the line - val index: Int -){ - SKYBLOCK( - { - listOf(config.customTitle.get().toString().replace("&", "§")) - }, - listOf(), - 0, - 0 - ), - PROFILE( - { - listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) - }, - listOf(), - 0, - 1 - ), - PURSE( - { - when { - config.hideEmptyLines && purse == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§6$purse Purse") - else -> listOf("Purse: §6$purse") - } - }, - listOf(IslandType.THE_RIFT), - 1, - 2 - ), - MOTES( - { - when { - motes == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§d$motes Motes") - else -> listOf("Motes: §d$motes") - } - }, - listOf(IslandType.THE_RIFT), - 0, - 3 - ), - BANK( - { - when { - bank == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§6$bank Bank") - else -> listOf("Bank: §6$bank") - } - }, - listOf(IslandType.THE_RIFT), - 1, - 4 - ), - BITS( - { - when { - bits == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§b$bits Bits") - else -> listOf("Bits: §b$bits") - } - }, - listOf(IslandType.THE_RIFT), - 1, - 5 - ), - COPPER( - { - when { - copper == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§c$copper Copper") - else -> listOf("Copper: §c$copper") - } - }, - listOf(IslandType.GARDEN), - 0, - 6 - ), - GEMS( - { - when { - gems == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§a$gems Gems") - else -> listOf("Gems: §a$gems") - } - }, - listOf(IslandType.THE_RIFT), - 1, - 7 - ), - EMPTY_LINE( - { - listOf("") - }, - listOf(), - 0, - 8 - ), - LOCATION( - { - listOf(location) - }, - listOf(), - 0, - 9 - ), - SKYBLOCK_TIME( - { - listOf(SkyBlockTime.now().formatted(false)) - }, - listOf(), - 0, - 10 - ), - LOBBY_CODE( - { - listOf("§8$lobbyCode") - }, - listOf(), - 0, - 11 - ), - POWDER( - { - when (config.displayNumbersFirst){ - true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") - false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") - } - }, - listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES), - 0, - 12 - ), - EMPTY_LINE2( - { - listOf("") - }, - listOf(), - 0, - 13 - ), - SLAYER( - { - listOf( - (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") - ) + ( - " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" - ) + ( - " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" - ) - }, - listOf(IslandType.HUB, IslandType.SPIDER_DEN, IslandType.THE_PARK, IslandType.THE_END, IslandType.CRIMSON_ISLE, IslandType.THE_RIFT), - 0, - 14 - ), - CURRENT_EVENT( - { - Events.getFirstEvent().getLine() - }, - listOf(), - 0, - 15 - ), - MAYOR( - { - listOf( - MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "" - ) + (if (config.showMayorPerks) { - MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" } ?: emptyList() - } else { - emptyList() - }) - }, - listOf(IslandType.THE_RIFT), - 1, - 16 - ), - EMPTY_LINE3( - { - listOf("") - }, - listOf(), - 0, - 17 - ), - HEAT( - { - when { - heat == "0" -> listOf("") - config.displayNumbersFirst -> listOf(if (heat == "0") "§c♨ 0 Heat" else "§c♨ $heat Heat") - else -> listOf(if (heat == "0") "Heat: §c♨ 0" else "Heat: $heat") - } - }, - listOf(IslandType.CRYSTAL_HOLLOWS), - 0, - 18 - ), - PARTY( - { - val partyTitle : List = if (PartyAPI.partyMembers.isEmpty() && config.hideEmptyLines) { - listOf("") - } else { - val title = if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" - val partyList = PartyAPI.partyMembers - .takeWhile { partyCount < config.maxPartyList.get() } - .map { - partyCount++ - " §7- §7$it" - } - .toTypedArray() - listOf(title, *partyList) - } - - partyTitle - }, - listOf(IslandType.CATACOMBS, IslandType.DUNGEON_HUB, IslandType.KUUDRA_ARENA, IslandType.CRIMSON_ISLE), - 0, - 19 - ), - MAXWELL( - { - when (MaxwellAPI.currentPower == null) { - true -> listOf("§c§lPlease visit Maxwell!") - false -> - when (config.displayNumbersFirst) - { - true -> listOf("${MaxwellAPI.currentPower?.power} Power") - false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") - } - } - }, - listOf(IslandType.THE_RIFT), - 1, - 20 - ), - WEBSITE( - { - listOf(config.customFooter.get().toString().replace("&", "§")) - }, - listOf(), - 0, - 21 - ); - - fun getLine(): List { - return displayLine?.get() ?: emptyList() - } - - fun isVisible(): Boolean { - if (!config.hideIrrelevantLines) return true - if (islands.isEmpty()) return true - return when (visibilityOption) { - 0 -> islands.contains(HypixelData.skyBlockIsland) - 1 -> !islands.contains(HypixelData.skyBlockIsland) - else -> true - } - } -} - -private enum class Events(private val displayLine: Supplier>, private val showWhen: () -> Boolean){ - NONE( - { - when { - config.hideEmptyLines -> listOf("") - else -> listOf("§cNo Event") - } - }, - { - false - } - ), - DUNGEONS( - { - listOf("§cDungeons Event") - }, - { - HypixelData.skyBlockIsland == IslandType.CATACOMBS - } - ), - KUUDRA( - { - listOf("§cKuudra Event") - }, - { - HypixelData.skyBlockIsland == IslandType.KUUDRA_ARENA - } - ), - JACOB( - { - listOf("§cJacob Event") - }, - { - false - } - ), - WINTER( - { - listOf("§bWinter Event") - }, - { - false - } - ), - SPOOKY( - { - listOf(ScoreboardData.sidebarLines.first { it.startsWith("§6Spooky Festival§f") }) + // Time - (getFooter().split("\n").first { it.startsWith("§r§r§7Your Candy:") }) // Candy - }, - { - ScoreboardData.sidebarLines.any { it.startsWith("§6Spooky Festival§f") } - } - ), - MARINA( - { - listOf("§bFishing Festival: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival")?.removePrefix(" Ends In: ")) - }, - { - TabListData.getTabList().any { it.startsWith("§e§lEvent: §r§bFishing Festival") } - } - ), - NEW_YEAR( - { - listOf(ScoreboardData.sidebarLines.first { it.startsWith("§dNew Year Event!§f") }) - }, - { - ScoreboardData.sidebarLines.any { it.startsWith("§dNew Year Event!§f") } - } - ), - ORINGO( - { - listOf("§6Oringo Event") - }, - { - false - } - ), - MINING_EVENTS( - { - val list = mutableListOf() - - // Mining Fiesta - if (TabListData.getTabList().any { it.startsWith("§6Mining Festival§f") }) { - list += "§6Mining Fiesta: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta")?.removePrefix(" Ends In: ") - } - - // Wind - if (ScoreboardData.sidebarLines.first { it == "§9Wind Compass" }.isNotEmpty()){ - list += "§9Wind Compass" - list += ScoreboardData.sidebarLines.nextAfter("§9Wind Compass") ?: "§7No Wind Compass for some reason" - } - - // Better Together - if (ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:") }.isNotEmpty()){ - list += "§9Better Together" - list += ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:")} - } - - list - }, - { - HypixelData.skyBlockIsland == IslandType.DWARVEN_MINES || HypixelData.skyBlockIsland == IslandType.CRYSTAL_HOLLOWS - } - ), - DAMAGE( - { - listOf(ScoreboardData.sidebarLines.first { "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) }) + - (ScoreboardData.sidebarLines.firstOrNull { "Your Damage: §c\\d{1,3}(,\\d{3})*(\\.\\d+)?".toPattern().matches(it) } ?: "") - }, - { - ScoreboardData.sidebarLines.any { "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) } - } - ), - ESSENCE( - { - listOf(ScoreboardData.sidebarLines.first { it.startsWith("Essence: ") }) - }, - { - ScoreboardData.sidebarLines.any { it.startsWith("Essence: ") } - } - ); - - fun getLine(): List { - return displayLine.get() - } - - companion object { - fun getFirstEvent(): Events { - return getAllEventsToDisplay().firstOrNull() ?: NONE - } - - fun getAllEventsToDisplay(): List { - return entries.filter { it.showWhen.invoke() } - } - } -} - -class CustomScoreboard { - @SubscribeEvent - fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { - if (!isCustomScoreboardEnabled()) return - config.position.renderStringsAndItems(display, posLabel = "Custom Scoreboard") - } - - @SubscribeEvent - fun onTick(event: LorenzTickEvent) { - // Draws the custom scoreboard - display = drawScoreboard() - - // Resets Party count - partyCount = 0 - - // Gets some values for the tablist - for (line in TabListData.getTabList()){ - if (line.startsWith(" Gems: §r§a")){ - gems = line.removePrefix(" Gems: §r§a") - } - if (line.startsWith(" Bank: §r§6")){ - bank = line.removePrefix(" Bank: §r§6") - } - if (line.startsWith(" §r§fMithril Powder: §r§2")){ - mithrilPowder = line.removePrefix(" §r§fMithril Powder: §r§2") - } - if (line.startsWith(" §r§fGemstone Powder: §r§d")){ - gemstonePowder = line.removePrefix(" §r§fGemstone Powder: §r§d") - } - } - - // Gets some values for the scoreboard - for (line in ScoreboardData.sidebarLinesFormatted){ - if (line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ")){ - location = line - } - if (line.startsWith("Motes: §d")){ - motes = line.removePrefix("Motes: §d") - } - if (extractLobbyCode(line) is String ){ - lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of color code) - } - if (line.startsWith("Heat: ")){ - heat = line.removePrefix("Heat: ") - } - if (line.startsWith("Bits: §b")){ - bits = line.removePrefix("Bits: §b") - } - if (line.startsWith("Copper: §c")){ - copper = line.removePrefix("Copper: §c") - } - } - purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) - } - - private fun drawScoreboard() = buildList> { - val lineMap = HashMap>() - for (element in CustomScoreboardElements.entries) { - lineMap[element.index] = if (element.isVisible()) element.getLine() else listOf("") - } - - return formatDisplay(lineMap) - } - - private fun formatDisplay(lineMap: HashMap>): MutableList> { - val newList = mutableListOf>() - for (index in config.textFormat) { - lineMap[index]?.let { - // Hide consecutive empty lines - if (config.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull()?.get(0) == "") { - continue - } - - // Adds empty lines - if(it[0] == ""){ - newList.add(listOf("")) - continue - } - - // Does not display this line - if(it[0] == ""){ - continue - } - - // Multiline support - if (it.size > 1) { - for (item in it) { - newList.add(listOf(item)) - } - continue - } - - newList.add(it) - } - } - - return newList - } - - // Thank you Apec for showing that the ElementType of the stupid scoreboard is FUCKING HELMET WTF - @SubscribeEvent - fun onRenderScoreboard(event: RenderGameOverlayEvent.Post){ - if (event.type == RenderGameOverlayEvent.ElementType.HELMET) { - GuiIngameForge.renderObjective = !isHideVanillaScoreboardEnabled() - } - } - - private fun isCustomScoreboardEnabled() : Boolean { - return config.enabled && LorenzUtils.inSkyBlock - } - - private fun isHideVanillaScoreboardEnabled() : Boolean { - return config.hideVanillaScoreboard && LorenzUtils.inSkyBlock - } -} - -private fun translateMayorNameToColor(input: String) : String { - return when (input) { - // Normal Mayors - "Aatrox" -> "§3$input" - "Cole" -> "§e$input" - "Diana" -> "§2$input" - "Diaz" -> "§6$input" - "Finnegan" -> "§c$input" - "Foxy" -> "§d$input" - "Marina" -> "§b$input" - "Paul" -> "§c$input" - - // Special Mayors - "Scorpius" -> "§d$input" - "Jerry" -> "§d$input" - "Derpy" -> "§d$input" - "Dante" -> "§d$input" - else -> "§cUnknown Mayor: §7$input" - } -} - -private fun extractLobbyCode(input: String): String? { - val regex = Regex("§(\\d{3}/\\d{2}/\\d{2}) §([A-Za-z0-9]+)$") - val matchResult = regex.find(input) - return matchResult?.groupValues?.lastOrNull() -} - -private fun getProfileTypeAsSymbol(): String { - return when { - HypixelData.ironman -> "§7♲ " // Ironman - HypixelData.stranded -> "§a☀ " // Stranded - HypixelData.bingo -> ScoreboardData.sidebarLines.firstOrNull { it.contains("Bingo") }?.substring(0, 3) + "Ⓑ " // Bingo - gets the first 3 chars of " §9Ⓑ §9Bingo" (you are unable to get the Ⓑ for some reason) - else -> "§e" // Default case - } -} - -private fun getFooter() : String{ - val tabList = Minecraft.getMinecraft().ingameGUI.tabList as AccessorGuiPlayerTabOverlay - if (tabList.footer_skyhanni == null) return "" - return tabList.footer_skyhanni.formattedText -} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt new file mode 100644 index 000000000000..30dfa013b661 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -0,0 +1,224 @@ +// +// Requested by alpaka8123 (https://discord.com/channels/997079228510117908/1162844830360146080) +// Done by J10a1n15, with lots of help from hanni, and snippets from item tracker features <3 +// +// I'm also like really sorry for anyone who has to look at this code, it looks kinda bad +// + +// +// TODO LIST +// V1 RELEASE +// - the things that arent done yet (EVENTS SOON) +// +// V2 RELEASE +// - Soulflow API +// - Bank API +// - Custom Scoreboard Background +// - quiver +// - beacon power +// - skyblock level +// + +package at.hannibal2.skyhanni.features.misc.customscoreboard + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.HypixelData +import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.data.MaxwellAPI +import at.hannibal2.skyhanni.data.MayorElection +import at.hannibal2.skyhanni.data.PartyAPI +import at.hannibal2.skyhanni.data.PurseAPI +import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.data.SlayerAPI +import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.events.LorenzTickEvent +import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter +import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems +import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase +import at.hannibal2.skyhanni.utils.StringUtils.matches +import at.hannibal2.skyhanni.utils.TabListData +import at.hannibal2.skyhanni.utils.TimeUtils.formatted +import io.github.moulberry.notenoughupdates.util.SkyBlockTime +import net.minecraft.client.Minecraft +import net.minecraftforge.client.GuiIngameForge +import net.minecraftforge.client.event.RenderGameOverlayEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import java.util.function.Supplier + +private val config get() = SkyHanniMod.feature.gui.customScoreboard +private var display = emptyList>() +var partyCount = 0 + +// Stats / Numbers +var purse = "0" +var motes = "0" +var bank = "0" +var bits = "0" +var copper = "0" +var gems = "0" +var location = "None" +var lobbyCode = "None" +var heat = "0" +var mithrilPowder = "0" +var gemstonePowder = "0" + + +class CustomScoreboard { + @SubscribeEvent + fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { + if (!isCustomScoreboardEnabled()) return + config.position.renderStringsAndItems(display, posLabel = "Custom Scoreboard") + } + + @SubscribeEvent + fun onTick(event: LorenzTickEvent) { + // Draws the custom scoreboard + display = drawScoreboard() + + // Resets Party count + partyCount = 0 + + // Gets some values for the tablist + for (line in TabListData.getTabList()){ + if (line.startsWith(" Gems: §r§a")){ + gems = line.removePrefix(" Gems: §r§a") + } + if (line.startsWith(" Bank: §r§6")){ + bank = line.removePrefix(" Bank: §r§6") + } + if (line.startsWith(" §r§fMithril Powder: §r§2")){ + mithrilPowder = line.removePrefix(" §r§fMithril Powder: §r§2") + } + if (line.startsWith(" §r§fGemstone Powder: §r§d")){ + gemstonePowder = line.removePrefix(" §r§fGemstone Powder: §r§d") + } + } + + // Gets some values for the scoreboard + for (line in ScoreboardData.sidebarLinesFormatted){ + if (line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ")){ + location = line + } + if (line.startsWith("Motes: §d")){ + motes = line.removePrefix("Motes: §d") + } + if (extractLobbyCode(line) is String ){ + lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of color code) + } + if (line.startsWith("Heat: ")){ + heat = line.removePrefix("Heat: ") + } + if (line.startsWith("Bits: §b")){ + bits = line.removePrefix("Bits: §b") + } + if (line.startsWith("Copper: §c")){ + copper = line.removePrefix("Copper: §c") + } + } + purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) + } + + private fun drawScoreboard() = buildList> { + val lineMap = HashMap>() + for (element in Elements.entries) { + lineMap[element.index] = if (element.isVisible()) element.getLine() else listOf("") + } + + return formatDisplay(lineMap) + } + + private fun formatDisplay(lineMap: HashMap>): MutableList> { + val newList = mutableListOf>() + for (index in config.textFormat) { + lineMap[index]?.let { + // Hide consecutive empty lines + if (config.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull()?.get(0) == "") { + continue + } + + // Adds empty lines + if(it[0] == ""){ + newList.add(listOf("")) + continue + } + + // Does not display this line + if(it[0] == ""){ + continue + } + + // Multiline support + if (it.size > 1) { + for (item in it) { + newList.add(listOf(item)) + } + continue + } + + newList.add(it) + } + } + + return newList + } + + // Thank you Apec for showing that the ElementType of the stupid scoreboard is FUCKING HELMET WTF + @SubscribeEvent + fun onRenderScoreboard(event: RenderGameOverlayEvent.Post){ + if (event.type == RenderGameOverlayEvent.ElementType.HELMET) { + GuiIngameForge.renderObjective = !isHideVanillaScoreboardEnabled() + } + } + + private fun isCustomScoreboardEnabled() : Boolean { + return config.enabled && LorenzUtils.inSkyBlock + } + + private fun isHideVanillaScoreboardEnabled() : Boolean { + return config.hideVanillaScoreboard && LorenzUtils.inSkyBlock + } +} + +fun translateMayorNameToColor(input: String) : String { + return when (input) { + // Normal Mayors + "Aatrox" -> "§3$input" + "Cole" -> "§e$input" + "Diana" -> "§2$input" + "Diaz" -> "§6$input" + "Finnegan" -> "§c$input" + "Foxy" -> "§d$input" + "Marina" -> "§b$input" + "Paul" -> "§c$input" + + // Special Mayors + "Scorpius" -> "§d$input" + "Jerry" -> "§d$input" + "Derpy" -> "§d$input" + "Dante" -> "§d$input" + else -> "§cUnknown Mayor: §7$input" + } +} + +private fun extractLobbyCode(input: String): String? { + val regex = Regex("§(\\d{3}/\\d{2}/\\d{2}) §([A-Za-z0-9]+)$") + val matchResult = regex.find(input) + return matchResult?.groupValues?.lastOrNull() +} + +fun getProfileTypeAsSymbol(): String { + return when { + HypixelData.ironman -> "§7♲ " // Ironman + HypixelData.stranded -> "§a☀ " // Stranded + HypixelData.bingo -> ScoreboardData.sidebarLines.firstOrNull { it.contains("Bingo") }?.substring(0, 3) + "Ⓑ " // Bingo - gets the first 3 chars of " §9Ⓑ §9Bingo" (you are unable to get the Ⓑ for some reason) + else -> "§e" // Default case + } +} + +fun getFooter() : String{ + val tabList = Minecraft.getMinecraft().ingameGUI.tabList as AccessorGuiPlayerTabOverlay + if (tabList.footer_skyhanni == null) return "" + return tabList.footer_skyhanni.formattedText +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt new file mode 100644 index 000000000000..31aab9982096 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -0,0 +1,285 @@ +package at.hannibal2.skyhanni.features.misc.customscoreboard + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.HypixelData +import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.data.MaxwellAPI +import at.hannibal2.skyhanni.data.MayorElection +import at.hannibal2.skyhanni.data.PartyAPI +import at.hannibal2.skyhanni.data.SlayerAPI +import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase +import at.hannibal2.skyhanni.utils.TimeUtils.formatted +import io.github.moulberry.notenoughupdates.util.SkyBlockTime +import java.util.function.Supplier + +private val config get() = SkyHanniMod.feature.gui.customScoreboard + +enum class Elements ( + // displayLine: The line that is displayed on the scoreboard + private val displayLine: Supplier>?, + + // islands: The islands that this line is displayed on + private val islands: List, + + // visibilityOption: The option that is used to hide this line - use 0 to only display on the listed islands, 1 to hide on the listed islands + private val visibilityOption : Int, + + // index: The index of the line + val index: Int +){ + SKYBLOCK( + { + listOf(config.customTitle.get().toString().replace("&", "§")) + }, + listOf(), + 0, + 0 + ), + PROFILE( + { + listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) + }, + listOf(), + 0, + 1 + ), + PURSE( + { + when { + config.hideEmptyLines && purse == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§6$purse Purse") + else -> listOf("Purse: §6$purse") + } + }, + listOf(IslandType.THE_RIFT), + 1, + 2 + ), + MOTES( + { + when { + motes == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§d$motes Motes") + else -> listOf("Motes: §d$motes") + } + }, + listOf(IslandType.THE_RIFT), + 0, + 3 + ), + BANK( + { + when { + bank == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§6$bank Bank") + else -> listOf("Bank: §6$bank") + } + }, + listOf(IslandType.THE_RIFT), + 1, + 4 + ), + BITS( + { + when { + bits == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§b$bits Bits") + else -> listOf("Bits: §b$bits") + } + }, + listOf(IslandType.THE_RIFT), + 1, + 5 + ), + COPPER( + { + when { + copper == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§c$copper Copper") + else -> listOf("Copper: §c$copper") + } + }, + listOf(IslandType.GARDEN), + 0, + 6 + ), + GEMS( + { + when { + gems == "0" -> listOf("") + config.displayNumbersFirst -> listOf("§a$gems Gems") + else -> listOf("Gems: §a$gems") + } + }, + listOf(IslandType.THE_RIFT), + 1, + 7 + ), + EMPTY_LINE( + { + listOf("") + }, + listOf(), + 0, + 8 + ), + LOCATION( + { + listOf(location) + }, + listOf(), + 0, + 9 + ), + SKYBLOCK_TIME( + { + listOf(SkyBlockTime.now().formatted(false)) + }, + listOf(), + 0, + 10 + ), + LOBBY_CODE( + { + listOf("§8$lobbyCode") + }, + listOf(), + 0, + 11 + ), + POWDER( + { + when (config.displayNumbersFirst){ + true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") + false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") + } + }, + listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES), + 0, + 12 + ), + EMPTY_LINE2( + { + listOf("") + }, + listOf(), + 0, + 13 + ), + SLAYER( + { + listOf( + (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") + ) + ( + " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" + ) + ( + " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" + ) + }, + listOf(IslandType.HUB, IslandType.SPIDER_DEN, IslandType.THE_PARK, IslandType.THE_END, IslandType.CRIMSON_ISLE, IslandType.THE_RIFT), + 0, + 14 + ), + CURRENT_EVENT( + { + Events.getFirstEvent().getLine() + }, + listOf(), + 0, + 15 + ), + MAYOR( + { + listOf( + MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "" + ) + (if (config.showMayorPerks) { + MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" } ?: emptyList() + } else { + emptyList() + }) + }, + listOf(IslandType.THE_RIFT), + 1, + 16 + ), + EMPTY_LINE3( + { + listOf("") + }, + listOf(), + 0, + 17 + ), + HEAT( + { + when { + heat == "0" -> listOf("") + config.displayNumbersFirst -> listOf(if (heat == "0") "§c♨ 0 Heat" else "§c♨ $heat Heat") + else -> listOf(if (heat == "0") "Heat: §c♨ 0" else "Heat: $heat") + } + }, + listOf(IslandType.CRYSTAL_HOLLOWS), + 0, + 18 + ), + PARTY( + { + val partyTitle : List = if (PartyAPI.partyMembers.isEmpty() && config.hideEmptyLines) { + listOf("") + } else { + val title = if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" + val partyList = PartyAPI.partyMembers + .takeWhile { partyCount < config.maxPartyList.get() } + .map { + partyCount++ + " §7- §7$it" + } + .toTypedArray() + listOf(title, *partyList) + } + + partyTitle + }, + listOf(IslandType.CATACOMBS, IslandType.DUNGEON_HUB, IslandType.KUUDRA_ARENA, IslandType.CRIMSON_ISLE), + 0, + 19 + ), + MAXWELL( + { + when (MaxwellAPI.currentPower == null) { + true -> listOf("§c§lPlease visit Maxwell!") + false -> + when (config.displayNumbersFirst) + { + true -> listOf("${MaxwellAPI.currentPower?.power} Power") + false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") + } + } + }, + listOf(IslandType.THE_RIFT), + 1, + 20 + ), + WEBSITE( + { + listOf(config.customFooter.get().toString().replace("&", "§")) + }, + listOf(), + 0, + 21 + ); + + fun getLine(): List { + return displayLine?.get() ?: emptyList() + } + + fun isVisible(): Boolean { + if (!config.hideIrrelevantLines) return true + if (islands.isEmpty()) return true + return when (visibilityOption) { + 0 -> islands.contains(HypixelData.skyBlockIsland) + 1 -> !islands.contains(HypixelData.skyBlockIsland) + else -> true + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt new file mode 100644 index 000000000000..4b4a3d612fac --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -0,0 +1,149 @@ +package at.hannibal2.skyhanni.features.misc.customscoreboard + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.HypixelData +import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter +import at.hannibal2.skyhanni.utils.StringUtils.matches +import at.hannibal2.skyhanni.utils.TabListData +import java.util.function.Supplier + +private val config get() = SkyHanniMod.feature.gui.customScoreboard + +enum class Events(private val displayLine: Supplier>, private val showWhen: () -> Boolean){ + NONE( + { + when { + config.hideEmptyLines -> listOf("") + else -> listOf("§cNo Event") + } + }, + { + false + } + ), + DUNGEONS( + { + listOf("§cDungeons Event") + }, + { + HypixelData.skyBlockIsland == IslandType.CATACOMBS + } + ), + KUUDRA( + { + listOf("§cKuudra Event") + }, + { + HypixelData.skyBlockIsland == IslandType.KUUDRA_ARENA + } + ), + JACOB( + { + listOf("§cJacob Event") + }, + { + false + } + ), + WINTER( + { + listOf("§bWinter Event") + }, + { + false + } + ), + SPOOKY( + { + listOf(ScoreboardData.sidebarLines.first { it.startsWith("§6Spooky Festival§f") }) + // Time + (getFooter().split("\n").first { it.startsWith("§r§r§7Your Candy:") }) // Candy + }, + { + ScoreboardData.sidebarLines.any { it.startsWith("§6Spooky Festival§f") } + } + ), + MARINA( + { + listOf("§bFishing Festival: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival")?.removePrefix(" Ends In: ")) + }, + { + TabListData.getTabList().any { it.startsWith("§e§lEvent: §r§bFishing Festival") } + } + ), + NEW_YEAR( + { + listOf(ScoreboardData.sidebarLines.first { it.startsWith("§dNew Year Event!§f") }) + }, + { + ScoreboardData.sidebarLines.any { it.startsWith("§dNew Year Event!§f") } + } + ), + ORINGO( + { + listOf("§6Oringo Event") + }, + { + false + } + ), + MINING_EVENTS( + { + val list = mutableListOf() + + // Mining Fiesta + if (TabListData.getTabList().any { it.startsWith("§6Mining Festival§f") }) { + list += "§6Mining Fiesta: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta")?.removePrefix(" Ends In: ") + } + + // Wind + if (ScoreboardData.sidebarLines.first { it == "§9Wind Compass" }.isNotEmpty()){ + list += "§9Wind Compass" + list += ScoreboardData.sidebarLines.nextAfter("§9Wind Compass") ?: "§7No Wind Compass for some reason" + } + + // Better Together + if (ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:") }.isNotEmpty()){ + list += "§9Better Together" + list += ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:")} + } + + list + }, + { + HypixelData.skyBlockIsland == IslandType.DWARVEN_MINES || HypixelData.skyBlockIsland == IslandType.CRYSTAL_HOLLOWS + } + ), + DAMAGE( + { + listOf(ScoreboardData.sidebarLines.first { "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) }) + + (ScoreboardData.sidebarLines.firstOrNull { "Your Damage: §c\\d{1,3}(,\\d{3})*(\\.\\d+)?".toPattern().matches(it) } ?: "") + }, + { + ScoreboardData.sidebarLines.any { "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) } + } + ), + ESSENCE( + { + listOf(ScoreboardData.sidebarLines.first { it.startsWith("Essence: ") }) + }, + { + ScoreboardData.sidebarLines.any { it.startsWith("Essence: ") } + } + ); + + fun getLine(): List { + return displayLine.get() + } + + companion object { + fun getFirstEvent(): Events { + return getAllEventsToDisplay().firstOrNull() ?: NONE + } + + fun getAllEventsToDisplay(): List { + return entries.filter { it.showWhen.invoke() } + } + } +} From 5bd52330ba4898fb3f0a2f295a4671169450d463 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 12 Nov 2023 23:05:26 +0100 Subject: [PATCH 073/225] shorter enabled commands --- .../features/misc/customscoreboard/CustomScoreboard.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 30dfa013b661..7c21010bb41d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -172,13 +172,9 @@ class CustomScoreboard { } } - private fun isCustomScoreboardEnabled() : Boolean { - return config.enabled && LorenzUtils.inSkyBlock - } + private fun isCustomScoreboardEnabled() = config.enabled && LorenzUtils.inSkyBlock - private fun isHideVanillaScoreboardEnabled() : Boolean { - return config.hideVanillaScoreboard && LorenzUtils.inSkyBlock - } + private fun isHideVanillaScoreboardEnabled() = config.hideVanillaScoreboard && LorenzUtils.inSkyBlock } fun translateMayorNameToColor(input: String) : String { From 92bc6bbc39c55373914a4084e0c96642ba8bd3e5 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 12 Nov 2023 23:15:31 +0100 Subject: [PATCH 074/225] added debug cmd, typos --- .../skyhanni/config/commands/Commands.kt | 5 ++++ .../misc/customscoreboard/CustomScoreboard.kt | 28 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt index 50966377047d..365545f73f8e 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -34,6 +34,7 @@ import at.hannibal2.skyhanni.features.minion.MinionFeatures import at.hannibal2.skyhanni.features.misc.CollectionTracker import at.hannibal2.skyhanni.features.misc.LockMouseLook import at.hannibal2.skyhanni.features.misc.MarkedPlayerManager +import at.hannibal2.skyhanni.features.misc.customscoreboard.CustomScoreboard import at.hannibal2.skyhanni.features.misc.discordrpc.DiscordRPCManager import at.hannibal2.skyhanni.features.misc.massconfiguration.DefaultConfigFeatures import at.hannibal2.skyhanni.features.misc.visualwords.VisualWordGui @@ -318,6 +319,10 @@ object Commands { "shcopyactionbar", "Copies the actionbar to the clipboard" ) { CopyActionBar.command(it) } + registerCommand( + "shcopycustomscoreboard", + "Copies the custom scoreboard to the clipboard" + ) { CustomScoreboard.copyScoreboard(it) } } private fun internalCommands() { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 7c21010bb41d..9f95ed4db9ee 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -22,6 +22,7 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.ActionBarStatsData import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.MaxwellAPI @@ -35,9 +36,12 @@ import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter +import at.hannibal2.skyhanni.utils.LorenzUtils.transformIf +import at.hannibal2.skyhanni.utils.OSUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.StringUtils.matches +import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.TabListData import at.hannibal2.skyhanni.utils.TimeUtils.formatted import io.github.moulberry.notenoughupdates.util.SkyBlockTime @@ -49,6 +53,7 @@ import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList>() +private var cache = emptyList>() var partyCount = 0 // Stats / Numbers @@ -80,7 +85,7 @@ class CustomScoreboard { // Resets Party count partyCount = 0 - // Gets some values for the tablist + // Gets some values from the tablist for (line in TabListData.getTabList()){ if (line.startsWith(" Gems: §r§a")){ gems = line.removePrefix(" Gems: §r§a") @@ -96,7 +101,7 @@ class CustomScoreboard { } } - // Gets some values for the scoreboard + // Gets some values from the scoreboard for (line in ScoreboardData.sidebarLinesFormatted){ if (line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ")){ location = line @@ -126,6 +131,8 @@ class CustomScoreboard { lineMap[element.index] = if (element.isVisible()) element.getLine() else listOf("") } + cache = lineMap.values.toList() + return formatDisplay(lineMap) } @@ -175,6 +182,23 @@ class CustomScoreboard { private fun isCustomScoreboardEnabled() = config.enabled && LorenzUtils.inSkyBlock private fun isHideVanillaScoreboardEnabled() = config.hideVanillaScoreboard && LorenzUtils.inSkyBlock + + companion object { + fun copyScoreboard(args: Array) { + var string = "" + + for (index in config.textFormat) { + cache[index].let { + for (line in it){ + string = string + line + "\n" + } + } + } + + OSUtils.copyToClipboard(string) + LorenzUtils.chat("§e[SkyHanni] Custom Scoreboard copied into your clipboard!") + } + } } fun translateMayorNameToColor(input: String) : String { From 3f3baaf69c9692001663ee275737c350c88a4b4c Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 12 Nov 2023 23:21:58 +0100 Subject: [PATCH 075/225] No longer getting stuff when config is disabled --- .../skyhanni/features/misc/customscoreboard/CustomScoreboard.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 9f95ed4db9ee..507a3063a4b4 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -79,6 +79,8 @@ class CustomScoreboard { @SubscribeEvent fun onTick(event: LorenzTickEvent) { + if (!isCustomScoreboardEnabled()) return + // Draws the custom scoreboard display = drawScoreboard() From 787fa43b77b5b89924429546f4072ad407e5d61a Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 12 Nov 2023 23:30:52 +0100 Subject: [PATCH 076/225] clean up --- .../misc/customscoreboard/CustomScoreboard.kt | 40 ++++++------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 507a3063a4b4..bf922b273ccf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -89,39 +89,23 @@ class CustomScoreboard { // Gets some values from the tablist for (line in TabListData.getTabList()){ - if (line.startsWith(" Gems: §r§a")){ - gems = line.removePrefix(" Gems: §r§a") - } - if (line.startsWith(" Bank: §r§6")){ - bank = line.removePrefix(" Bank: §r§6") - } - if (line.startsWith(" §r§fMithril Powder: §r§2")){ - mithrilPowder = line.removePrefix(" §r§fMithril Powder: §r§2") - } - if (line.startsWith(" §r§fGemstone Powder: §r§d")){ - gemstonePowder = line.removePrefix(" §r§fGemstone Powder: §r§d") + when { + line.startsWith(" Gems: §r§a") -> gems = line.removePrefix(" Gems: §r§a") + line.startsWith(" Bank: §r§6") -> bank = line.removePrefix(" Bank: §r§6") + line.startsWith(" §r§fMithril Powder: §r§2") -> mithrilPowder = line.removePrefix(" §r§fMithril Powder: §r§2") + line.startsWith(" §r§fGemstone Powder: §r§d") -> gemstonePowder = line.removePrefix(" §r§fGemstone Powder: §r§d") } } // Gets some values from the scoreboard for (line in ScoreboardData.sidebarLinesFormatted){ - if (line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ")){ - location = line - } - if (line.startsWith("Motes: §d")){ - motes = line.removePrefix("Motes: §d") - } - if (extractLobbyCode(line) is String ){ - lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of color code) - } - if (line.startsWith("Heat: ")){ - heat = line.removePrefix("Heat: ") - } - if (line.startsWith("Bits: §b")){ - bits = line.removePrefix("Bits: §b") - } - if (line.startsWith("Copper: §c")){ - copper = line.removePrefix("Copper: §c") + when { + line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ") -> location = line + line.startsWith("Motes: §d") -> motes = line.removePrefix("Motes: §d") + extractLobbyCode(line) is String -> lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of color code) + line.startsWith("Heat: ") -> heat = line.removePrefix("Heat: ") + line.startsWith("Bits: §b") -> bits = line.removePrefix("Bits: §b") + line.startsWith("Copper: §c") -> copper = line.removePrefix("Copper: §c") } } purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) From 40fbd5dd9e975f68d6431edcd2894c89cb28eb95 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 12 Nov 2023 23:46:17 +0100 Subject: [PATCH 077/225] todo update --- .../skyhanni/features/misc/customscoreboard/CustomScoreboard.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index bf922b273ccf..d272758f0d54 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -9,8 +9,10 @@ // TODO LIST // V1 RELEASE // - the things that arent done yet (EVENTS SOON) +// - change from renderitemsandstrings to renderstrings or smth idk // // V2 RELEASE +// - icons maybe // - Soulflow API // - Bank API // - Custom Scoreboard Background From 6cef0f4b3c607f7eeaa76522dd7ace29e1389ed2 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 13 Nov 2023 16:03:46 +0100 Subject: [PATCH 078/225] fixed a lot of things --- .../features/misc/customscoreboard/Events.kt | 66 +++++++++++++------ 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 4b4a3d612fac..efcb6fe10aa3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -23,7 +23,7 @@ enum class Events(private val displayLine: Supplier>, private val s false } ), - DUNGEONS( + DUNGEONS( // not tested { listOf("§cDungeons Event") }, @@ -31,7 +31,7 @@ enum class Events(private val displayLine: Supplier>, private val s HypixelData.skyBlockIsland == IslandType.CATACOMBS } ), - KUUDRA( + KUUDRA( // not tested { listOf("§cKuudra Event") }, @@ -39,15 +39,31 @@ enum class Events(private val displayLine: Supplier>, private val s HypixelData.skyBlockIsland == IslandType.KUUDRA_ARENA } ), - JACOB( + JACOB( // not tested { - listOf("§cJacob Event") + val list = mutableListOf() + + // Contest + if (ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") }) { + list += ScoreboardData.sidebarLines.first { it.startsWith("§e○ §f") } + list += ScoreboardData.sidebarLines.nextAfter("§e○ §f") ?: "§7No Ranking" + list += ScoreboardData.sidebarLines.nextAfter("§e○ §f", 2) ?: "§7No Amount for next" + } + + // Medals + if (ScoreboardData.sidebarLines.any { it.startsWith("§6§lGOLD §fmedals: ") }) { + list += ScoreboardData.sidebarLines.first { it.startsWith("§6§lGOLD §fmedals: ") } + list += ScoreboardData.sidebarLines.first { it.startsWith("§f§lSILVER §fmedals: ") } + list += ScoreboardData.sidebarLines.first { it.startsWith("§c§lBRONZE §fmedals: ") } + } + + list }, { - false + ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") } || ScoreboardData.sidebarLines.any { it.startsWith("§6§lGOLD §fmedals: ") } } ), - WINTER( + WINTER( // not tested { listOf("§bWinter Event") }, @@ -55,7 +71,7 @@ enum class Events(private val displayLine: Supplier>, private val s false } ), - SPOOKY( + SPOOKY( // not tested { listOf(ScoreboardData.sidebarLines.first { it.startsWith("§6Spooky Festival§f") }) + // Time (getFooter().split("\n").first { it.startsWith("§r§r§7Your Candy:") }) // Candy @@ -64,7 +80,7 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLines.any { it.startsWith("§6Spooky Festival§f") } } ), - MARINA( + MARINA( // not tested { listOf("§bFishing Festival: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival")?.removePrefix(" Ends In: ")) }, @@ -72,7 +88,7 @@ enum class Events(private val displayLine: Supplier>, private val s TabListData.getTabList().any { it.startsWith("§e§lEvent: §r§bFishing Festival") } } ), - NEW_YEAR( + NEW_YEAR( // not tested { listOf(ScoreboardData.sidebarLines.first { it.startsWith("§dNew Year Event!§f") }) }, @@ -80,15 +96,15 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLines.any { it.startsWith("§dNew Year Event!§f") } } ), - ORINGO( + ORINGO( // works { - listOf("§6Oringo Event") + listOf(ScoreboardData.sidebarLines.first { it.startsWith("§aTraveling Zoo") }) }, { - false + ScoreboardData.sidebarLines.any { it.startsWith("§aTraveling Zoo") } } ), - MINING_EVENTS( + MINING_EVENTS( // not sure { val list = mutableListOf() @@ -98,33 +114,41 @@ enum class Events(private val displayLine: Supplier>, private val s } // Wind - if (ScoreboardData.sidebarLines.first { it == "§9Wind Compass" }.isNotEmpty()){ + if (ScoreboardData.sidebarLines.any { it == "§9Wind Compass" }){ list += "§9Wind Compass" list += ScoreboardData.sidebarLines.nextAfter("§9Wind Compass") ?: "§7No Wind Compass for some reason" } // Better Together - if (ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:") }.isNotEmpty()){ + if (ScoreboardData.sidebarLines.any { it.startsWith("Nearby Players:") }){ list += "§9Better Together" list += ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:")} } - list + // Mithril + if (ScoreboardData.sidebarLines.any { it.startsWith("Event: ")}){ + list += ScoreboardData.sidebarLines.first { it.startsWith("Event: ")}.removePrefix("Event: ") + " §rin " + ScoreboardData.sidebarLines.first { it.startsWith("Zone: ")}.removePrefix("Zone: ") + } + + if (list.size == 0) when (config.hideEmptyLines){ + true -> listOf("") + false -> listOf("§cNo Mining Event") + } else list }, { HypixelData.skyBlockIsland == IslandType.DWARVEN_MINES || HypixelData.skyBlockIsland == IslandType.CRYSTAL_HOLLOWS } ), - DAMAGE( + DAMAGE( // not sure { listOf(ScoreboardData.sidebarLines.first { "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) }) + - (ScoreboardData.sidebarLines.firstOrNull { "Your Damage: §c\\d{1,3}(,\\d{3})*(\\.\\d+)?".toPattern().matches(it) } ?: "") + (ScoreboardData.sidebarLines.first { "Your Damage: §c\\d{1,3}(,\\d{3})*(\\.\\d+)?".toPattern().matches(it) }) }, { - ScoreboardData.sidebarLines.any { "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) } + ScoreboardData.sidebarLines.any { "Your Damage: §c\\d{1,3}(,\\d{3})*(\\.\\d+)?".toPattern().matches(it) } } ), - ESSENCE( + ESSENCE( // works { listOf(ScoreboardData.sidebarLines.first { it.startsWith("Essence: ") }) }, @@ -142,7 +166,7 @@ enum class Events(private val displayLine: Supplier>, private val s return getAllEventsToDisplay().firstOrNull() ?: NONE } - fun getAllEventsToDisplay(): List { + private fun getAllEventsToDisplay(): List { return entries.filter { it.showWhen.invoke() } } } From 7f1186a84e857a1e14a82ef2fa6cbe98169e99a1 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 13 Nov 2023 21:02:26 +0100 Subject: [PATCH 079/225] i want to find the creator of regex rn and do smth to them --- .../misc/customscoreboard/Elements.kt | 2 +- .../features/misc/customscoreboard/Events.kt | 30 ++++++++----------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 31aab9982096..603eeaa5228c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -182,7 +182,7 @@ enum class Elements ( ), CURRENT_EVENT( { - Events.getFirstEvent().getLine() + Events.getFirstEvent().getLines() }, listOf(), 0, diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index efcb6fe10aa3..f86f5a2b3e51 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -12,7 +12,7 @@ import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard enum class Events(private val displayLine: Supplier>, private val showWhen: () -> Boolean){ - NONE( + NONE( // maybe use default state tablist: "Events: smth" idk { when { config.hideEmptyLines -> listOf("") @@ -51,10 +51,10 @@ enum class Events(private val displayLine: Supplier>, private val s } // Medals - if (ScoreboardData.sidebarLines.any { it.startsWith("§6§lGOLD §fmedals: ") }) { - list += ScoreboardData.sidebarLines.first { it.startsWith("§6§lGOLD §fmedals: ") } - list += ScoreboardData.sidebarLines.first { it.startsWith("§f§lSILVER §fmedals: ") } - list += ScoreboardData.sidebarLines.first { it.startsWith("§c§lBRONZE §fmedals: ") } + if (ScoreboardData.sidebarLines.any { it.startsWith("§6§lGOLD §fmedals:") }) { + list += ScoreboardData.sidebarLines.first { it.startsWith("§6§lGOLD §fmedals:") } + list += ScoreboardData.sidebarLines.first { it.startsWith("§f§lSILVER §fmedals:") } + list += ScoreboardData.sidebarLines.first { it.startsWith("§c§lBRONZE §fmedals:") } } list @@ -96,7 +96,7 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLines.any { it.startsWith("§dNew Year Event!§f") } } ), - ORINGO( // works + ORINGO( { listOf(ScoreboardData.sidebarLines.first { it.startsWith("§aTraveling Zoo") }) }, @@ -139,16 +139,16 @@ enum class Events(private val displayLine: Supplier>, private val s HypixelData.skyBlockIsland == IslandType.DWARVEN_MINES || HypixelData.skyBlockIsland == IslandType.CRYSTAL_HOLLOWS } ), - DAMAGE( // not sure + DAMAGE( // WHY THE FUCK DOES THE REGEX NOT WORK { - listOf(ScoreboardData.sidebarLines.first { "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) }) + - (ScoreboardData.sidebarLines.first { "Your Damage: §c\\d{1,3}(,\\d{3})*(\\.\\d+)?".toPattern().matches(it) }) + listOf(ScoreboardData.sidebarLines.first { it.startsWith("Protector HP: §a") || it.startsWith("Dragon HP: §a") }) + //{ "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) }) + + (ScoreboardData.sidebarLines.first{ it.startsWith("Your Damage: §c") }) //{ "Your Damage: §c\\d{1,3}(,\\d{3})*(\\.\\d+)?".toPattern().matches(it) }) }, { - ScoreboardData.sidebarLines.any { "Your Damage: §c\\d{1,3}(,\\d{3})*(\\.\\d+)?".toPattern().matches(it) } + ScoreboardData.sidebarLines.any { it.startsWith("Your Damage: §c") } } ), - ESSENCE( // works + ESSENCE( { listOf(ScoreboardData.sidebarLines.first { it.startsWith("Essence: ") }) }, @@ -157,17 +157,13 @@ enum class Events(private val displayLine: Supplier>, private val s } ); - fun getLine(): List { + fun getLines(): List { return displayLine.get() } companion object { fun getFirstEvent(): Events { - return getAllEventsToDisplay().firstOrNull() ?: NONE - } - - private fun getAllEventsToDisplay(): List { - return entries.filter { it.showWhen.invoke() } + return entries.firstOrNull { it.showWhen() } ?: NONE } } } From ccd1defed773fe29f88db6e85ac1330e805eb3d4 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 13 Nov 2023 21:03:49 +0100 Subject: [PATCH 080/225] obv kidding I would never do bad things --- .../skyhanni/features/misc/customscoreboard/Events.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index f86f5a2b3e51..812223c4281a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -139,10 +139,10 @@ enum class Events(private val displayLine: Supplier>, private val s HypixelData.skyBlockIsland == IslandType.DWARVEN_MINES || HypixelData.skyBlockIsland == IslandType.CRYSTAL_HOLLOWS } ), - DAMAGE( // WHY THE FUCK DOES THE REGEX NOT WORK + DAMAGE( { - listOf(ScoreboardData.sidebarLines.first { it.startsWith("Protector HP: §a") || it.startsWith("Dragon HP: §a") }) + //{ "(Protector|Dragon) HP: §a\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)? §c❤".toPattern().matches(it) }) + - (ScoreboardData.sidebarLines.first{ it.startsWith("Your Damage: §c") }) //{ "Your Damage: §c\\d{1,3}(,\\d{3})*(\\.\\d+)?".toPattern().matches(it) }) + listOf(ScoreboardData.sidebarLines.first { it.startsWith("Protector HP: §a") || it.startsWith("Dragon HP: §a") }) + + (ScoreboardData.sidebarLines.first{ it.startsWith("Your Damage: §c") }) }, { ScoreboardData.sidebarLines.any { it.startsWith("Your Damage: §c") } From 1bb4b3749c9d36f1e725f42e6f6f6b4c859f313b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 14 Nov 2023 22:13:45 +0100 Subject: [PATCH 081/225] WHY THE FUCK DOES THE ! DO SMTH FUNKY WITH .STARTSWITH --- .../features/misc/customscoreboard/Events.kt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 812223c4281a..6f5eae6d3259 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -45,22 +45,23 @@ enum class Events(private val displayLine: Supplier>, private val s // Contest if (ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") }) { + list += "§eJacob's Contest" list += ScoreboardData.sidebarLines.first { it.startsWith("§e○ §f") } list += ScoreboardData.sidebarLines.nextAfter("§e○ §f") ?: "§7No Ranking" list += ScoreboardData.sidebarLines.nextAfter("§e○ §f", 2) ?: "§7No Amount for next" } // Medals - if (ScoreboardData.sidebarLines.any { it.startsWith("§6§lGOLD §fmedals:") }) { - list += ScoreboardData.sidebarLines.first { it.startsWith("§6§lGOLD §fmedals:") } - list += ScoreboardData.sidebarLines.first { it.startsWith("§f§lSILVER §fmedals:") } - list += ScoreboardData.sidebarLines.first { it.startsWith("§c§lBRONZE §fmedals:") } + if (ScoreboardData.sidebarLines.any { it.trim().startsWith("§6§lGOLD §fmedals:") }) { + list += ScoreboardData.sidebarLines.first { it.trim().startsWith("§6§lGOLD §fmedals:") } + list += ScoreboardData.sidebarLines.first { it.trim().startsWith("§f§lSILVER §fmedals:") } + list += ScoreboardData.sidebarLines.first { it.trim().startsWith("§c§lBRONZE §fmedals:") } } list }, { - ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") } || ScoreboardData.sidebarLines.any { it.startsWith("§6§lGOLD §fmedals: ") } + ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") } || ScoreboardData.sidebarLines.any { it.trim().startsWith("§6§lGOLD §fmedals: ") } } ), WINTER( // not tested @@ -90,10 +91,10 @@ enum class Events(private val displayLine: Supplier>, private val s ), NEW_YEAR( // not tested { - listOf(ScoreboardData.sidebarLines.first { it.startsWith("§dNew Year Event!§f") }) + listOf(ScoreboardData.sidebarLines.first { it.contains("§dNew Year Event") }) }, { - ScoreboardData.sidebarLines.any { it.startsWith("§dNew Year Event!§f") } + ScoreboardData.sidebarLines.any { it.contains("§dNew Year Event") } } ), ORINGO( From 4ae652919731ca2b1a1d28749111faa1e849884f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 15 Nov 2023 22:26:22 +0100 Subject: [PATCH 082/225] bing bong, contains gone --- .../misc/customscoreboard/CustomScoreboard.kt | 14 -------------- .../features/misc/customscoreboard/Events.kt | 4 ++-- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index d272758f0d54..a1e7a7de5307 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -24,34 +24,20 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.ActionBarStatsData import at.hannibal2.skyhanni.data.HypixelData -import at.hannibal2.skyhanni.data.IslandType -import at.hannibal2.skyhanni.data.MaxwellAPI -import at.hannibal2.skyhanni.data.MayorElection -import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.data.PurseAPI import at.hannibal2.skyhanni.data.ScoreboardData -import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter -import at.hannibal2.skyhanni.utils.LorenzUtils.transformIf import at.hannibal2.skyhanni.utils.OSUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems -import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase -import at.hannibal2.skyhanni.utils.StringUtils.matches -import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.TabListData -import at.hannibal2.skyhanni.utils.TimeUtils.formatted -import io.github.moulberry.notenoughupdates.util.SkyBlockTime import net.minecraft.client.Minecraft import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList>() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 6f5eae6d3259..a7ee55a5fb1a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -91,10 +91,10 @@ enum class Events(private val displayLine: Supplier>, private val s ), NEW_YEAR( // not tested { - listOf(ScoreboardData.sidebarLines.first { it.contains("§dNew Year Event") }) + listOf(ScoreboardData.sidebarLines.first { it.startsWith("§dNew Year Event") }) }, { - ScoreboardData.sidebarLines.any { it.contains("§dNew Year Event") } + ScoreboardData.sidebarLines.any { it.startsWith("§dNew Year Event") } } ), ORINGO( From fd698fd34fa4f5c8fe6877c69fa8f2ec02481bdf Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 16 Nov 2023 13:53:12 +0100 Subject: [PATCH 083/225] now using better method for rendering --- .../misc/customscoreboard/CustomScoreboard.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index a1e7a7de5307..19d4b84e758f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -9,7 +9,6 @@ // TODO LIST // V1 RELEASE // - the things that arent done yet (EVENTS SOON) -// - change from renderitemsandstrings to renderstrings or smth idk // // V2 RELEASE // - icons maybe @@ -32,6 +31,7 @@ import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.OSUtils +import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.TabListData import net.minecraft.client.Minecraft @@ -40,7 +40,7 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent private val config get() = SkyHanniMod.feature.gui.customScoreboard -private var display = emptyList>() +private var display = emptyList() private var cache = emptyList>() var partyCount = 0 @@ -62,7 +62,7 @@ class CustomScoreboard { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!isCustomScoreboardEnabled()) return - config.position.renderStringsAndItems(display, posLabel = "Custom Scoreboard") + config.position.renderStrings(display, posLabel = "Custom Scoreboard") } @SubscribeEvent @@ -99,7 +99,7 @@ class CustomScoreboard { purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) } - private fun drawScoreboard() = buildList> { + private fun drawScoreboard() = buildList { val lineMap = HashMap>() for (element in Elements.entries) { lineMap[element.index] = if (element.isVisible()) element.getLine() else listOf("") @@ -110,18 +110,18 @@ class CustomScoreboard { return formatDisplay(lineMap) } - private fun formatDisplay(lineMap: HashMap>): MutableList> { - val newList = mutableListOf>() + private fun formatDisplay(lineMap: HashMap>): MutableList { + val newList = mutableListOf() for (index in config.textFormat) { lineMap[index]?.let { // Hide consecutive empty lines - if (config.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull()?.get(0) == "") { + if (config.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull() == "") { continue } // Adds empty lines if(it[0] == ""){ - newList.add(listOf("")) + newList.add("") continue } @@ -133,12 +133,12 @@ class CustomScoreboard { // Multiline support if (it.size > 1) { for (item in it) { - newList.add(listOf(item)) + newList.add(item.toString()) } continue } - newList.add(it) + newList.add(it[0].toString()) } } From 813e1ed3a062b1daf050560fd68c0018385d971f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 16 Nov 2023 14:21:29 +0100 Subject: [PATCH 084/225] fixed https://github.com/hannibal002/SkyHanni/pull/699#discussion_r1395319392 --- .../skyhanni/features/misc/customscoreboard/Events.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index a7ee55a5fb1a..822f9fa29d17 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -86,7 +86,7 @@ enum class Events(private val displayLine: Supplier>, private val s listOf("§bFishing Festival: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival")?.removePrefix(" Ends In: ")) }, { - TabListData.getTabList().any { it.startsWith("§e§lEvent: §r§bFishing Festival") } + TabListData.getTabList().any { it.startsWith("§e§lEvent: §r§bFishing Festival") } && TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival")?.startsWith(" Ends In: ") == true } ), NEW_YEAR( // not tested @@ -110,7 +110,7 @@ enum class Events(private val displayLine: Supplier>, private val s val list = mutableListOf() // Mining Fiesta - if (TabListData.getTabList().any { it.startsWith("§6Mining Festival§f") }) { + if (TabListData.getTabList().any { it.startsWith("§6Mining Fiesta§f") } && TabListData.getTabList().nextAfter("§6Mining Fiesta§f")?.startsWith(" Ends In: ") == true){ list += "§6Mining Fiesta: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta")?.removePrefix(" Ends In: ") } From 60578afd7b9330df94ee280ad1fd93cac9f391ac Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 16 Nov 2023 14:23:59 +0100 Subject: [PATCH 085/225] (festplatte) formatieren --- .../misc/customscoreboard/CustomScoreboard.kt | 63 ++++++++++--------- .../misc/customscoreboard/Elements.kt | 25 +++++--- .../features/misc/customscoreboard/Events.kt | 38 ++++++----- 3 files changed, 75 insertions(+), 51 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 983e2f97a0a9..2b97ddb99e75 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -75,21 +75,25 @@ class CustomScoreboard { partyCount = 0 // Gets some values from the tablist - for (line in TabListData.getTabList()){ + for (line in TabListData.getTabList()) { when { line.startsWith(" Gems: §r§a") -> gems = line.removePrefix(" Gems: §r§a") line.startsWith(" Bank: §r§6") -> bank = line.removePrefix(" Bank: §r§6") - line.startsWith(" §r§fMithril Powder: §r§2") -> mithrilPowder = line.removePrefix(" §r§fMithril Powder: §r§2") - line.startsWith(" §r§fGemstone Powder: §r§d") -> gemstonePowder = line.removePrefix(" §r§fGemstone Powder: §r§d") + line.startsWith(" §r§fMithril Powder: §r§2") -> mithrilPowder = + line.removePrefix(" §r§fMithril Powder: §r§2") + + line.startsWith(" §r§fGemstone Powder: §r§d") -> gemstonePowder = + line.removePrefix(" §r§fGemstone Powder: §r§d") } } // Gets some values from the scoreboard - for (line in ScoreboardData.sidebarLinesFormatted){ + for (line in ScoreboardData.sidebarLinesFormatted) { when { line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ") -> location = line line.startsWith("Motes: §d") -> motes = line.removePrefix("Motes: §d") - extractLobbyCode(line) is String -> lobbyCode = extractLobbyCode(line)!!.substring(1) //removes first char (number of color code) + extractLobbyCode(line) is String -> lobbyCode = + extractLobbyCode(line)!!.substring(1) //removes first char (number of color code) line.startsWith("Heat: ") -> heat = line.removePrefix("Heat: ") line.startsWith("Bits: §b") -> bits = line.removePrefix("Bits: §b") line.startsWith("Copper: §c") -> copper = line.removePrefix("Copper: §c") @@ -119,13 +123,13 @@ class CustomScoreboard { } // Adds empty lines - if(it[0] == ""){ + if (it[0] == "") { newList.add("") continue } // Does not display this line - if(it[0] == ""){ + if (it[0] == "") { continue } @@ -146,7 +150,7 @@ class CustomScoreboard { // Thank you Apec for showing that the ElementType of the stupid scoreboard is FUCKING HELMET WTF @SubscribeEvent - fun onRenderScoreboard(event: RenderGameOverlayEvent.Post){ + fun onRenderScoreboard(event: RenderGameOverlayEvent.Post) { if (event.type == RenderGameOverlayEvent.ElementType.HELMET) { GuiIngameForge.renderObjective = !isHideVanillaScoreboardEnabled() } @@ -162,7 +166,7 @@ class CustomScoreboard { for (index in config.textFormat) { cache[index].let { - for (line in it){ + for (line in it) { string = string + line + "\n" } } @@ -174,24 +178,24 @@ class CustomScoreboard { } } -fun translateMayorNameToColor(input: String) : String { +fun translateMayorNameToColor(input: String): String { return when (input) { // Normal Mayors - "Aatrox" -> "§3$input" - "Cole" -> "§e$input" - "Diana" -> "§2$input" - "Diaz" -> "§6$input" - "Finnegan" -> "§c$input" - "Foxy" -> "§d$input" - "Marina" -> "§b$input" - "Paul" -> "§c$input" + "Aatrox" -> "§3$input" + "Cole" -> "§e$input" + "Diana" -> "§2$input" + "Diaz" -> "§6$input" + "Finnegan" -> "§c$input" + "Foxy" -> "§d$input" + "Marina" -> "§b$input" + "Paul" -> "§c$input" // Special Mayors - "Scorpius" -> "§d$input" - "Jerry" -> "§d$input" - "Derpy" -> "§d$input" - "Dante" -> "§d$input" - else -> "§cUnknown Mayor: §7$input" + "Scorpius" -> "§d$input" + "Jerry" -> "§d$input" + "Derpy" -> "§d$input" + "Dante" -> "§d$input" + else -> "§cUnknown Mayor: §7$input" } } @@ -203,14 +207,17 @@ private fun extractLobbyCode(input: String): String? { fun getProfileTypeAsSymbol(): String { return when { - HypixelData.ironman -> "§7♲ " // Ironman - HypixelData.stranded -> "§a☀ " // Stranded - HypixelData.bingo -> ScoreboardData.sidebarLines.firstOrNull { it.contains("Bingo") }?.substring(0, 3) + "Ⓑ " // Bingo - gets the first 3 chars of " §9Ⓑ §9Bingo" (you are unable to get the Ⓑ for some reason) - else -> "§e" // Default case + HypixelData.ironman -> "§7♲ " // Ironman + HypixelData.stranded -> "§a☀ " // Stranded + HypixelData.bingo -> ScoreboardData.sidebarLines.firstOrNull { it.contains("Bingo") }?.substring( + 0, + 3 + ) + "Ⓑ " // Bingo - gets the first 3 chars of " §9Ⓑ §9Bingo" (you are unable to get the Ⓑ for some reason) + else -> "§e" // Default case } } -fun getFooter() : String{ +fun getFooter(): String { val tabList = Minecraft.getMinecraft().ingameGUI.tabList as AccessorGuiPlayerTabOverlay if (tabList.footer_skyhanni == null) return "" return tabList.footer_skyhanni.formattedText diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 603eeaa5228c..1f0c2b39eb0e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -14,7 +14,7 @@ import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard -enum class Elements ( +enum class Elements( // displayLine: The line that is displayed on the scoreboard private val displayLine: Supplier>?, @@ -22,11 +22,11 @@ enum class Elements ( private val islands: List, // visibilityOption: The option that is used to hide this line - use 0 to only display on the listed islands, 1 to hide on the listed islands - private val visibilityOption : Int, + private val visibilityOption: Int, // index: The index of the line val index: Int -){ +) { SKYBLOCK( { listOf(config.customTitle.get().toString().replace("&", "§")) @@ -149,7 +149,7 @@ enum class Elements ( ), POWDER( { - when (config.displayNumbersFirst){ + when (config.displayNumbersFirst) { true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") } @@ -176,7 +176,14 @@ enum class Elements ( " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" ) }, - listOf(IslandType.HUB, IslandType.SPIDER_DEN, IslandType.THE_PARK, IslandType.THE_END, IslandType.CRIMSON_ISLE, IslandType.THE_RIFT), + listOf( + IslandType.HUB, + IslandType.SPIDER_DEN, + IslandType.THE_PARK, + IslandType.THE_END, + IslandType.CRIMSON_ISLE, + IslandType.THE_RIFT + ), 0, 14 ), @@ -224,10 +231,11 @@ enum class Elements ( ), PARTY( { - val partyTitle : List = if (PartyAPI.partyMembers.isEmpty() && config.hideEmptyLines) { + val partyTitle: List = if (PartyAPI.partyMembers.isEmpty() && config.hideEmptyLines) { listOf("") } else { - val title = if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" + val title = + if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" val partyList = PartyAPI.partyMembers .takeWhile { partyCount < config.maxPartyList.get() } .map { @@ -249,8 +257,7 @@ enum class Elements ( when (MaxwellAPI.currentPower == null) { true -> listOf("§c§lPlease visit Maxwell!") false -> - when (config.displayNumbersFirst) - { + when (config.displayNumbersFirst) { true -> listOf("${MaxwellAPI.currentPower?.power} Power") false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 822f9fa29d17..6fe0ae390ec4 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -5,13 +5,12 @@ import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter -import at.hannibal2.skyhanni.utils.StringUtils.matches import at.hannibal2.skyhanni.utils.TabListData import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard -enum class Events(private val displayLine: Supplier>, private val showWhen: () -> Boolean){ +enum class Events(private val displayLine: Supplier>, private val showWhen: () -> Boolean) { NONE( // maybe use default state tablist: "Events: smth" idk { when { @@ -61,7 +60,9 @@ enum class Events(private val displayLine: Supplier>, private val s list }, { - ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") } || ScoreboardData.sidebarLines.any { it.trim().startsWith("§6§lGOLD §fmedals: ") } + ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") } || ScoreboardData.sidebarLines.any { + it.trim().startsWith("§6§lGOLD §fmedals: ") + } } ), WINTER( // not tested @@ -83,10 +84,15 @@ enum class Events(private val displayLine: Supplier>, private val s ), MARINA( // not tested { - listOf("§bFishing Festival: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival")?.removePrefix(" Ends In: ")) + listOf( + "§bFishing Festival: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival") + ?.removePrefix(" Ends In: ") + ) }, { - TabListData.getTabList().any { it.startsWith("§e§lEvent: §r§bFishing Festival") } && TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival")?.startsWith(" Ends In: ") == true + TabListData.getTabList() + .any { it.startsWith("§e§lEvent: §r§bFishing Festival") } && TabListData.getTabList() + .nextAfter("§e§lEvent: §r§bFishing Festival")?.startsWith(" Ends In: ") == true } ), NEW_YEAR( // not tested @@ -110,28 +116,32 @@ enum class Events(private val displayLine: Supplier>, private val s val list = mutableListOf() // Mining Fiesta - if (TabListData.getTabList().any { it.startsWith("§6Mining Fiesta§f") } && TabListData.getTabList().nextAfter("§6Mining Fiesta§f")?.startsWith(" Ends In: ") == true){ - list += "§6Mining Fiesta: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta")?.removePrefix(" Ends In: ") + if (TabListData.getTabList().any { it.startsWith("§6Mining Fiesta§f") } && TabListData.getTabList() + .nextAfter("§6Mining Fiesta§f")?.startsWith(" Ends In: ") == true) { + list += "§6Mining Fiesta: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta") + ?.removePrefix(" Ends In: ") } // Wind - if (ScoreboardData.sidebarLines.any { it == "§9Wind Compass" }){ + if (ScoreboardData.sidebarLines.any { it == "§9Wind Compass" }) { list += "§9Wind Compass" list += ScoreboardData.sidebarLines.nextAfter("§9Wind Compass") ?: "§7No Wind Compass for some reason" } // Better Together - if (ScoreboardData.sidebarLines.any { it.startsWith("Nearby Players:") }){ + if (ScoreboardData.sidebarLines.any { it.startsWith("Nearby Players:") }) { list += "§9Better Together" - list += ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:")} + list += ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:") } } // Mithril - if (ScoreboardData.sidebarLines.any { it.startsWith("Event: ")}){ - list += ScoreboardData.sidebarLines.first { it.startsWith("Event: ")}.removePrefix("Event: ") + " §rin " + ScoreboardData.sidebarLines.first { it.startsWith("Zone: ")}.removePrefix("Zone: ") + if (ScoreboardData.sidebarLines.any { it.startsWith("Event: ") }) { + list += ScoreboardData.sidebarLines.first { it.startsWith("Event: ") } + .removePrefix("Event: ") + " §rin " + ScoreboardData.sidebarLines.first { it.startsWith("Zone: ") } + .removePrefix("Zone: ") } - if (list.size == 0) when (config.hideEmptyLines){ + if (list.size == 0) when (config.hideEmptyLines) { true -> listOf("") false -> listOf("§cNo Mining Event") } else list @@ -143,7 +153,7 @@ enum class Events(private val displayLine: Supplier>, private val s DAMAGE( { listOf(ScoreboardData.sidebarLines.first { it.startsWith("Protector HP: §a") || it.startsWith("Dragon HP: §a") }) + - (ScoreboardData.sidebarLines.first{ it.startsWith("Your Damage: §c") }) + (ScoreboardData.sidebarLines.first { it.startsWith("Your Damage: §c") }) }, { ScoreboardData.sidebarLines.any { it.startsWith("Your Damage: §c") } From cd9acb54e8fb317574c0ff4d2034688e1fb499d3 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 16 Nov 2023 14:24:56 +0100 Subject: [PATCH 086/225] what was that comment --- .../skyhanni/config/features/gui/CustomScoreboardConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java index 1af55478d2ea..d636d95d936a 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java @@ -18,7 +18,7 @@ public class CustomScoreboardConfig { @Expose @ConfigOption( name = "Enabled", - desc = "Show a custom scoreboard instead of the default one." //TODO: MAKE COOLER + desc = "Show a custom scoreboard instead of the default one." ) @ConfigEditorBoolean @FeatureToggle From 52bb7e2b0d39764d28ac8c21e962213886839314 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 17 Nov 2023 15:01:42 +0100 Subject: [PATCH 087/225] fixed mining fiesta --- .../skyhanni/features/misc/customscoreboard/Events.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 6fe0ae390ec4..0e2411b65fb3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -116,8 +116,8 @@ enum class Events(private val displayLine: Supplier>, private val s val list = mutableListOf() // Mining Fiesta - if (TabListData.getTabList().any { it.startsWith("§6Mining Fiesta§f") } && TabListData.getTabList() - .nextAfter("§6Mining Fiesta§f")?.startsWith(" Ends In: ") == true) { + if (TabListData.getTabList().any { it =="§e§lEvent: §r§6Mining Fiesta" } + && TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta")?.startsWith(" Ends In:") == true) { list += "§6Mining Fiesta: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta") ?.removePrefix(" Ends In: ") } From 72b4eb66c285325a5477419507f93d456736e336 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 18 Nov 2023 21:56:23 +0100 Subject: [PATCH 088/225] More not working jacob tries --- .../features/misc/customscoreboard/Events.kt | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 0e2411b65fb3..062f8fd2769d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -38,31 +38,33 @@ enum class Events(private val displayLine: Supplier>, private val s HypixelData.skyBlockIsland == IslandType.KUUDRA_ARENA } ), - JACOB( // not tested + JACOB_CONTEST( // not tested { val list = mutableListOf() - // Contest - if (ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") }) { - list += "§eJacob's Contest" - list += ScoreboardData.sidebarLines.first { it.startsWith("§e○ §f") } - list += ScoreboardData.sidebarLines.nextAfter("§e○ §f") ?: "§7No Ranking" - list += ScoreboardData.sidebarLines.nextAfter("§e○ §f", 2) ?: "§7No Amount for next" - } + list += "§eJacob's Contest" + list += ScoreboardData.sidebarLines.nextAfter("§eJacob's Contest") ?: "§7No Event" + list += ScoreboardData.sidebarLines.nextAfter("§eJacob's Contest", 2) ?: "§7No Ranking" + list += ScoreboardData.sidebarLines.nextAfter("§eJacob's Contest", 3) ?: "§7No Amount for next" - // Medals - if (ScoreboardData.sidebarLines.any { it.trim().startsWith("§6§lGOLD §fmedals:") }) { - list += ScoreboardData.sidebarLines.first { it.trim().startsWith("§6§lGOLD §fmedals:") } - list += ScoreboardData.sidebarLines.first { it.trim().startsWith("§f§lSILVER §fmedals:") } - list += ScoreboardData.sidebarLines.first { it.trim().startsWith("§c§lBRONZE §fmedals:") } - } + list + }, + { + ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") || it.startsWith("§6☘ §f") } + } + ), + JACOB_MEDALS( + { + val list = mutableListOf() + + list += ScoreboardData.sidebarLines.first { it.startsWith("§6§lGOLD §fmedals") } + list += ScoreboardData.sidebarLines.first { it.startsWith("§f§lSILVER §fmedals") } + list += ScoreboardData.sidebarLines.first { it.startsWith("§c§lBRONZE §fmedals")} list }, { - ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") } || ScoreboardData.sidebarLines.any { - it.trim().startsWith("§6§lGOLD §fmedals: ") - } + ScoreboardData.sidebarLines.any { it.startsWith("§6§lGOLD §fmedals") } } ), WINTER( // not tested @@ -95,7 +97,7 @@ enum class Events(private val displayLine: Supplier>, private val s .nextAfter("§e§lEvent: §r§bFishing Festival")?.startsWith(" Ends In: ") == true } ), - NEW_YEAR( // not tested + NEW_YEAR( { listOf(ScoreboardData.sidebarLines.first { it.startsWith("§dNew Year Event") }) }, @@ -111,13 +113,14 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLines.any { it.startsWith("§aTraveling Zoo") } } ), - MINING_EVENTS( // not sure + MINING_EVENTS( { val list = mutableListOf() // Mining Fiesta - if (TabListData.getTabList().any { it =="§e§lEvent: §r§6Mining Fiesta" } - && TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta")?.startsWith(" Ends In:") == true) { + if (TabListData.getTabList().any { it == "§e§lEvent: §r§6Mining Fiesta" } + && TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta") + ?.startsWith(" Ends In:") == true) { list += "§6Mining Fiesta: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§6Mining Fiesta") ?.removePrefix(" Ends In: ") } From 23c7befa00b0c3493f854299ba258bc02eb8c486 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 18 Nov 2023 23:58:03 +0100 Subject: [PATCH 089/225] jacob now works!! --- .../features/misc/customscoreboard/Events.kt | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 062f8fd2769d..4021a503253a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -43,28 +43,28 @@ enum class Events(private val displayLine: Supplier>, private val s val list = mutableListOf() list += "§eJacob's Contest" - list += ScoreboardData.sidebarLines.nextAfter("§eJacob's Contest") ?: "§7No Event" - list += ScoreboardData.sidebarLines.nextAfter("§eJacob's Contest", 2) ?: "§7No Ranking" - list += ScoreboardData.sidebarLines.nextAfter("§eJacob's Contest", 3) ?: "§7No Amount for next" + list += ScoreboardData.sidebarLinesFormatted.nextAfter("§eJacob's Contest") ?: "§7No Event" + list += ScoreboardData.sidebarLinesFormatted.nextAfter("§eJacob's Contest", 2) ?: "§7No Ranking" + list += ScoreboardData.sidebarLinesFormatted.nextAfter("§eJacob's Contest", 3) ?: "§7No Amount for next" list }, { - ScoreboardData.sidebarLines.any { it.startsWith("§e○ §f") || it.startsWith("§6☘ §f") } + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§e○ §f") || it.startsWith("§6☘ §f") } } ), JACOB_MEDALS( { val list = mutableListOf() - list += ScoreboardData.sidebarLines.first { it.startsWith("§6§lGOLD §fmedals") } - list += ScoreboardData.sidebarLines.first { it.startsWith("§f§lSILVER §fmedals") } - list += ScoreboardData.sidebarLines.first { it.startsWith("§c§lBRONZE §fmedals")} + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§6§lGOLD §fmedals") } + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§f§lSILVER §fmedals") } + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§c§lBRONZE §fmedals")} list }, { - ScoreboardData.sidebarLines.any { it.startsWith("§6§lGOLD §fmedals") } + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6§lGOLD §fmedals") } } ), WINTER( // not tested @@ -77,11 +77,11 @@ enum class Events(private val displayLine: Supplier>, private val s ), SPOOKY( // not tested { - listOf(ScoreboardData.sidebarLines.first { it.startsWith("§6Spooky Festival§f") }) + // Time + listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§6Spooky Festival§f") }) + // Time (getFooter().split("\n").first { it.startsWith("§r§r§7Your Candy:") }) // Candy }, { - ScoreboardData.sidebarLines.any { it.startsWith("§6Spooky Festival§f") } + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6Spooky Festival§f") } } ), MARINA( // not tested @@ -99,18 +99,18 @@ enum class Events(private val displayLine: Supplier>, private val s ), NEW_YEAR( { - listOf(ScoreboardData.sidebarLines.first { it.startsWith("§dNew Year Event") }) + listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§dNew Year Event") }) }, { - ScoreboardData.sidebarLines.any { it.startsWith("§dNew Year Event") } + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§dNew Year Event") } } ), ORINGO( { - listOf(ScoreboardData.sidebarLines.first { it.startsWith("§aTraveling Zoo") }) + listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§aTraveling Zoo") }) }, { - ScoreboardData.sidebarLines.any { it.startsWith("§aTraveling Zoo") } + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§aTraveling Zoo") } } ), MINING_EVENTS( @@ -126,21 +126,21 @@ enum class Events(private val displayLine: Supplier>, private val s } // Wind - if (ScoreboardData.sidebarLines.any { it == "§9Wind Compass" }) { + if (ScoreboardData.sidebarLinesFormatted.any { it == "§9Wind Compass" }) { list += "§9Wind Compass" - list += ScoreboardData.sidebarLines.nextAfter("§9Wind Compass") ?: "§7No Wind Compass for some reason" + list += ScoreboardData.sidebarLinesFormatted.nextAfter("§9Wind Compass") ?: "§7No Wind Compass for some reason" } // Better Together - if (ScoreboardData.sidebarLines.any { it.startsWith("Nearby Players:") }) { + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Nearby Players:") }) { list += "§9Better Together" - list += ScoreboardData.sidebarLines.first { it.startsWith("Nearby Players:") } + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Nearby Players:") } } // Mithril - if (ScoreboardData.sidebarLines.any { it.startsWith("Event: ") }) { - list += ScoreboardData.sidebarLines.first { it.startsWith("Event: ") } - .removePrefix("Event: ") + " §rin " + ScoreboardData.sidebarLines.first { it.startsWith("Zone: ") } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event: ") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Event: ") } + .removePrefix("Event: ") + " §rin " + ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Zone: ") } .removePrefix("Zone: ") } @@ -155,19 +155,19 @@ enum class Events(private val displayLine: Supplier>, private val s ), DAMAGE( { - listOf(ScoreboardData.sidebarLines.first { it.startsWith("Protector HP: §a") || it.startsWith("Dragon HP: §a") }) + - (ScoreboardData.sidebarLines.first { it.startsWith("Your Damage: §c") }) + listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Protector HP: §a") || it.startsWith("Dragon HP: §a") }) + + (ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Your Damage: §c") }) }, { - ScoreboardData.sidebarLines.any { it.startsWith("Your Damage: §c") } + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Damage: §c") } } ), ESSENCE( { - listOf(ScoreboardData.sidebarLines.first { it.startsWith("Essence: ") }) + listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Essence: ") }) }, { - ScoreboardData.sidebarLines.any { it.startsWith("Essence: ") } + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Essence: ") } } ); From fa9219221e8cb24a0d9965e68b812e0f6a5f714b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 19 Nov 2023 00:30:16 +0100 Subject: [PATCH 090/225] contest also works (ty hanniii) --- .../hannibal2/skyhanni/features/misc/customscoreboard/Events.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 4021a503253a..e158d1e73f15 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -38,7 +38,7 @@ enum class Events(private val displayLine: Supplier>, private val s HypixelData.skyBlockIsland == IslandType.KUUDRA_ARENA } ), - JACOB_CONTEST( // not tested + JACOB_CONTEST( { val list = mutableListOf() From a435b82e25e277fb77f929956c867206c40107b4 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 19 Nov 2023 15:55:14 +0100 Subject: [PATCH 091/225] Added dungeon "events" --- .../misc/customscoreboard/Elements.kt | 2 +- .../features/misc/customscoreboard/Events.kt | 59 ++++++++++++++++--- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 1f0c2b39eb0e..8953d3c49bc0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -248,7 +248,7 @@ enum class Elements( partyTitle }, - listOf(IslandType.CATACOMBS, IslandType.DUNGEON_HUB, IslandType.KUUDRA_ARENA, IslandType.CRIMSON_ISLE), + listOf(IslandType.DUNGEON_HUB, IslandType.KUUDRA_ARENA, IslandType.CRIMSON_ISLE), 0, 19 ), diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index e158d1e73f15..c092dc8d2456 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -4,6 +4,8 @@ import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons +import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData import java.util.function.Supplier @@ -24,10 +26,52 @@ enum class Events(private val displayLine: Supplier>, private val s ), DUNGEONS( // not tested { - listOf("§cDungeons Event") + val list = mutableListOf() + + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Auto-closing in:") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Auto-closing in:") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Starting in:") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Starting in:") } + } + + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Keys: ") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Keys: ") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Time Elapsed: ") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Time Elapsed: ") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§rCleared: ") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§rCleared: ") }.toString() + .replace("§r", "").replace("%", "%§") // for some reason this is broken + } + + val dungeonPlayers = TabListData.getTabList().first { it.trim().startsWith("§r§b§lParty §r§f(") } + .trim().removePrefix("§r§b§lParty §r§f(").removeSuffix(")").toInt() + + if (dungeonPlayers != 0 && list.any { it.startsWith("Cleared: ") }) { + list += "" + + if (dungeonPlayers == 1) { + list += "§3§lSolo" + } else { + for (i in 2..dungeonPlayers) { + list += ScoreboardData.sidebarLinesFormatted.nextAfter( + "§r" + list.first { it.startsWith("Cleared: ") }.replace("%§", "%"), + i + ) + ?: "§cNo Player found" + } + } + } + + if (list.size == 0) when (config.hideEmptyLines) { + true -> listOf("") + false -> listOf("§cNo Dungeon Data") + } else list }, { - HypixelData.skyBlockIsland == IslandType.CATACOMBS + IslandType.CATACOMBS.isInIsland() || inDungeons } ), KUUDRA( // not tested @@ -35,7 +79,7 @@ enum class Events(private val displayLine: Supplier>, private val s listOf("§cKuudra Event") }, { - HypixelData.skyBlockIsland == IslandType.KUUDRA_ARENA + IslandType.KUUDRA_ARENA.isInIsland() } ), JACOB_CONTEST( @@ -59,7 +103,7 @@ enum class Events(private val displayLine: Supplier>, private val s list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§6§lGOLD §fmedals") } list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§f§lSILVER §fmedals") } - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§c§lBRONZE §fmedals")} + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§c§lBRONZE §fmedals") } list }, @@ -72,7 +116,7 @@ enum class Events(private val displayLine: Supplier>, private val s listOf("§bWinter Event") }, { - false + IslandType.WINTER.isInIsland() } ), SPOOKY( // not tested @@ -128,7 +172,8 @@ enum class Events(private val displayLine: Supplier>, private val s // Wind if (ScoreboardData.sidebarLinesFormatted.any { it == "§9Wind Compass" }) { list += "§9Wind Compass" - list += ScoreboardData.sidebarLinesFormatted.nextAfter("§9Wind Compass") ?: "§7No Wind Compass for some reason" + list += ScoreboardData.sidebarLinesFormatted.nextAfter("§9Wind Compass") + ?: "§7No Wind Compass for some reason" } // Better Together @@ -150,7 +195,7 @@ enum class Events(private val displayLine: Supplier>, private val s } else list }, { - HypixelData.skyBlockIsland == IslandType.DWARVEN_MINES || HypixelData.skyBlockIsland == IslandType.CRYSTAL_HOLLOWS + IslandType.DWARVEN_MINES.isInIsland() || IslandType.CRYSTAL_HOLLOWS.isInIsland() } ), DAMAGE( From 1351fc7f33f14358297afa29627ba5a7812d2cdf Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 19 Nov 2023 16:04:29 +0100 Subject: [PATCH 092/225] Added objective --- .../features/gui/CustomScoreboardConfig.java | 1 + .../misc/customscoreboard/Elements.kt | 29 ++++++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java index d636d95d936a..1e30165fbe3e 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java @@ -45,6 +45,7 @@ public class CustomScoreboardConfig { "§8m77CK", "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234", "", + "Objective:\n§eUpdate SkyHanni", "§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills", "§7Current Event", "§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff", diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 8953d3c49bc0..2a669488679b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -6,7 +6,9 @@ import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.MaxwellAPI import at.hannibal2.skyhanni.data.MayorElection import at.hannibal2.skyhanni.data.PartyAPI +import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI +import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.TimeUtils.formatted import io.github.moulberry.notenoughupdates.util.SkyBlockTime @@ -166,6 +168,17 @@ enum class Elements( 0, 13 ), + OBJECTIVE( + { + when(config.hideEmptyLines){ + true -> listOf("Objective:") + (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") ?: "") + false -> listOf("Objective:") + (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") ?: "§cNo objective") + } + }, + listOf(), + 0, + 14 + ), SLAYER( { listOf( @@ -185,7 +198,7 @@ enum class Elements( IslandType.THE_RIFT ), 0, - 14 + 15 ), CURRENT_EVENT( { @@ -193,7 +206,7 @@ enum class Elements( }, listOf(), 0, - 15 + 16 ), MAYOR( { @@ -207,7 +220,7 @@ enum class Elements( }, listOf(IslandType.THE_RIFT), 1, - 16 + 17 ), EMPTY_LINE3( { @@ -215,7 +228,7 @@ enum class Elements( }, listOf(), 0, - 17 + 18 ), HEAT( { @@ -227,7 +240,7 @@ enum class Elements( }, listOf(IslandType.CRYSTAL_HOLLOWS), 0, - 18 + 19 ), PARTY( { @@ -250,7 +263,7 @@ enum class Elements( }, listOf(IslandType.DUNGEON_HUB, IslandType.KUUDRA_ARENA, IslandType.CRIMSON_ISLE), 0, - 19 + 20 ), MAXWELL( { @@ -265,7 +278,7 @@ enum class Elements( }, listOf(IslandType.THE_RIFT), 1, - 20 + 21 ), WEBSITE( { @@ -273,7 +286,7 @@ enum class Elements( }, listOf(), 0, - 21 + 22 ); fun getLine(): List { From 200eaf8a40af7cc233ec80abad936eef19e5beb0 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 19 Nov 2023 16:22:22 +0100 Subject: [PATCH 093/225] reordered config --- .../features/gui/CustomScoreboardConfig.java | 12 +-- .../misc/customscoreboard/Elements.kt | 102 +++++++++--------- 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java index 1e30165fbe3e..5227a9dcd05c 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java @@ -39,24 +39,24 @@ public class CustomScoreboardConfig { "Bits: §b59,264", "Copper: §c23,495", "Gems: §a57,873", + "Heat: §c♨ 0", "", "§7⏣ §bVillage", "Late Summer 11th, Year 311", "§8m77CK", - "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234", + "Power: Sighted", "", "Objective:\n§eUpdate SkyHanni", "§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills", - "§7Current Event", - "§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff", "", - "Heat: §c♨ 0", + "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234", + "§7Wide Range of Events\n(too much for this here)", + "§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff", "§9§lParty (4):\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n §7- §f J10a1n15", - "Power: Sighted", "§ewww.hypixel.net", } ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21)); + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22)); @Expose @ConfigOption(name = "Hide Vanilla Scoreboard", desc = "Hide the vanilla scoreboard.") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 2a669488679b..2819a158ca8f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -117,13 +117,25 @@ enum class Elements( 1, 7 ), + HEAT( + { + when { + heat == "0" -> listOf("") + config.displayNumbersFirst -> listOf(if (heat == "0") "§c♨ 0 Heat" else "§c♨ $heat Heat") + else -> listOf(if (heat == "0") "Heat: §c♨ 0" else "Heat: $heat") + } + }, + listOf(IslandType.CRYSTAL_HOLLOWS), + 0, + 8 + ), EMPTY_LINE( { listOf("") }, listOf(), 0, - 8 + 9 ), LOCATION( { @@ -131,7 +143,7 @@ enum class Elements( }, listOf(), 0, - 9 + 10 ), SKYBLOCK_TIME( { @@ -139,7 +151,7 @@ enum class Elements( }, listOf(), 0, - 10 + 11 ), LOBBY_CODE( { @@ -147,18 +159,22 @@ enum class Elements( }, listOf(), 0, - 11 + 12 ), - POWDER( + MAXWELL( { - when (config.displayNumbersFirst) { - true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") - false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") + when (MaxwellAPI.currentPower == null) { + true -> listOf("§c§lPlease visit Maxwell!") + false -> + when (config.displayNumbersFirst) { + true -> listOf("${MaxwellAPI.currentPower?.power} Power") + false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") + } } }, - listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES), - 0, - 12 + listOf(IslandType.THE_RIFT), + 1, + 13 ), EMPTY_LINE2( { @@ -166,7 +182,7 @@ enum class Elements( }, listOf(), 0, - 13 + 14 ), OBJECTIVE( { @@ -177,7 +193,7 @@ enum class Elements( }, listOf(), 0, - 14 + 15 ), SLAYER( { @@ -198,7 +214,26 @@ enum class Elements( IslandType.THE_RIFT ), 0, - 15 + 16 + ), + EMPTY_LINE3( + { + listOf("") + }, + listOf(), + 0, + 17 + ), + POWDER( + { + when (config.displayNumbersFirst) { + true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") + false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") + } + }, + listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES), + 0, + 18 ), CURRENT_EVENT( { @@ -206,7 +241,7 @@ enum class Elements( }, listOf(), 0, - 16 + 19 ), MAYOR( { @@ -220,27 +255,7 @@ enum class Elements( }, listOf(IslandType.THE_RIFT), 1, - 17 - ), - EMPTY_LINE3( - { - listOf("") - }, - listOf(), - 0, - 18 - ), - HEAT( - { - when { - heat == "0" -> listOf("") - config.displayNumbersFirst -> listOf(if (heat == "0") "§c♨ 0 Heat" else "§c♨ $heat Heat") - else -> listOf(if (heat == "0") "Heat: §c♨ 0" else "Heat: $heat") - } - }, - listOf(IslandType.CRYSTAL_HOLLOWS), - 0, - 19 + 20 ), PARTY( { @@ -263,21 +278,6 @@ enum class Elements( }, listOf(IslandType.DUNGEON_HUB, IslandType.KUUDRA_ARENA, IslandType.CRIMSON_ISLE), 0, - 20 - ), - MAXWELL( - { - when (MaxwellAPI.currentPower == null) { - true -> listOf("§c§lPlease visit Maxwell!") - false -> - when (config.displayNumbersFirst) { - true -> listOf("${MaxwellAPI.currentPower?.power} Power") - false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") - } - } - }, - listOf(IslandType.THE_RIFT), - 1, 21 ), WEBSITE( From b301bccebb67a86b4fa4114fc8c602b27bf3fdc9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 19 Nov 2023 16:32:35 +0100 Subject: [PATCH 094/225] fixed some issues --- .../skyhanni/features/misc/customscoreboard/CustomScoreboard.kt | 2 +- .../hannibal2/skyhanni/features/misc/customscoreboard/Events.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 2b97ddb99e75..1424880b7f62 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -129,7 +129,7 @@ class CustomScoreboard { } // Does not display this line - if (it[0] == "") { + if (it.any { i-> i == ""}) { continue } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index c092dc8d2456..030c084c62c9 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -185,7 +185,7 @@ enum class Events(private val displayLine: Supplier>, private val s // Mithril if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event: ") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Event: ") } - .removePrefix("Event: ") + " §rin " + ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Zone: ") } + .removePrefix("Event: ") + "\n§fin " + ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Zone: ") } .removePrefix("Zone: ") } From a35fc6a24d267939d3c7f1976c8db2752a2221c7 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 20 Nov 2023 21:16:31 +0100 Subject: [PATCH 095/225] Added Kuudra fight --- .../misc/customscoreboard/CustomScoreboard.kt | 2 - .../features/misc/customscoreboard/Events.kt | 40 ++++++++++++++++++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 1424880b7f62..1bdab542d4f5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -2,8 +2,6 @@ // Requested by alpaka8123 (https://discord.com/channels/997079228510117908/1162844830360146080) // Done by J10a1n15, with lots of help from hanni, and snippets from item tracker features <3 // -// I'm also like really sorry for anyone who has to look at this code, it looks kinda bad -// // // TODO LIST diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 030c084c62c9..9f04684d10b4 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -8,6 +8,7 @@ import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData +import net.minecraft.scoreboard.Score import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard @@ -74,9 +75,44 @@ enum class Events(private val displayLine: Supplier>, private val s IslandType.CATACOMBS.isInIsland() || inDungeons } ), - KUUDRA( // not tested + KUUDRA( // I really need more kuudra scoreboard data, I dont play kuudra { - listOf("§cKuudra Event") + val list = mutableListOf() + + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Auto-closing in:") }) { + ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Auto-closing in:") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Starting in:") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Starting in:") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Instance ShutdowIn:") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Instance ShutdowIn:") } + .replace("Instance ShutdowIn:", "Instance Shutdown In:") // for some reason this is broken + } + + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Time Elapsed: ") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Time Elapsed: ") } + } + list += "" + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§f§lWave: §c§l")}){ + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§f§lWave: §c§l") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§fTokens: ")}){ + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§fTokens: ") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Submerges In: §e")}){ + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Submerges In: §e") } + } + list += "" + if (ScoreboardData.sidebarLinesFormatted.any { it == "§fObjective:"}){ + list += "§fObjective:" + list += ScoreboardData.sidebarLinesFormatted.nextAfter("§fObjective:") ?: "§cNo Objective" + } + + if (list.size == 0) when (config.hideEmptyLines) { + true -> listOf("") + false -> listOf("§cNo Kuudra Data") + } else list }, { IslandType.KUUDRA_ARENA.isInIsland() From dfe968eb5de7aded75f651caa35e0f3617f6dc6b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 20 Nov 2023 21:32:42 +0100 Subject: [PATCH 096/225] Added server close & winter island event --- .../features/misc/customscoreboard/Events.kt | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 9f04684d10b4..f7d586e483fe 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -25,7 +25,15 @@ enum class Events(private val displayLine: Supplier>, private val s false } ), - DUNGEONS( // not tested + SERVER_CLOSE( + { + listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§cServer closing: ") }) + }, + { + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§cServer closing: ") } + } + ), + DUNGEONS( { val list = mutableListOf() @@ -149,7 +157,32 @@ enum class Events(private val displayLine: Supplier>, private val s ), WINTER( // not tested { - listOf("§bWinter Event") + val list = mutableListOf() + + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("North Stars: §d")}){ + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("North Stars: §d") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event Start: §a")}){ + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Event Start: §a") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Next Wave: §a")}){ + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Next Wave: §a") } + } + list += "" + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§cWave ")}){ + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§cWave ") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Magma Cubes Left§c")}){ + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Magma Cubes Left§c") } + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Total Damag §c")}){ + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Your Total Damag §c") }.replace("Damag", "Damage") + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Cube Damage§c")}){ + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Your Cube Damage§c") } + } + + list }, { IslandType.WINTER.isInIsland() @@ -164,7 +197,7 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6Spooky Festival§f") } } ), - MARINA( // not tested + MARINA( // not tested, should work { listOf( "§bFishing Festival: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival") From d8d38f3a7b0c04e1096312eb265e8197a826a6a9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 21 Nov 2023 17:17:20 +0100 Subject: [PATCH 097/225] Idk seems to be done --- .../features/misc/customscoreboard/CustomScoreboard.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 1bdab542d4f5..1e18872ee738 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -5,9 +5,6 @@ // // TODO LIST -// V1 RELEASE -// - the things that arent done yet (EVENTS SOON) -// // V2 RELEASE // - icons maybe // - Soulflow API From 5d97470973a24d97157bd70e684ddea79ee7e01a Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 21 Nov 2023 17:26:18 +0100 Subject: [PATCH 098/225] Removed !! --- .../skyhanni/features/misc/customscoreboard/CustomScoreboard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 1e18872ee738..518ab79decaa 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -88,7 +88,7 @@ class CustomScoreboard { line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ") -> location = line line.startsWith("Motes: §d") -> motes = line.removePrefix("Motes: §d") extractLobbyCode(line) is String -> lobbyCode = - extractLobbyCode(line)!!.substring(1) //removes first char (number of color code) + extractLobbyCode(line)?.substring(1) ?: "" //removes first char (number of color code) line.startsWith("Heat: ") -> heat = line.removePrefix("Heat: ") line.startsWith("Bits: §b") -> bits = line.removePrefix("Bits: §b") line.startsWith("Copper: §c") -> copper = line.removePrefix("Copper: §c") From c91bfc1cfee5de760b8e4868b6686bb1b131de6b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 21 Nov 2023 17:40:47 +0100 Subject: [PATCH 099/225] Made the time shorter --- .../config/features/gui/CustomScoreboardConfig.java | 2 +- .../skyhanni/features/misc/customscoreboard/Elements.kt | 2 +- src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java index 5227a9dcd05c..2755ce988a8a 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java @@ -42,7 +42,7 @@ public class CustomScoreboardConfig { "Heat: §c♨ 0", "", "§7⏣ §bVillage", - "Late Summer 11th, Year 311", + "Late Summer 11th", "§8m77CK", "Power: Sighted", "", diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 2819a158ca8f..957fede93390 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -147,7 +147,7 @@ enum class Elements( ), SKYBLOCK_TIME( { - listOf(SkyBlockTime.now().formatted(false)) + listOf(SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false)) }, listOf(), 0, diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt index 4b2446b38897..f92e9af36464 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt @@ -123,7 +123,7 @@ object TimeUtils { }.toLong().toDuration(DurationUnit.MILLISECONDS) } - fun SkyBlockTime.formatted(hoursAndMinutes : Boolean = true): String { + fun SkyBlockTime.formatted(yearElement: Boolean = true, hoursAndMinutesElement : Boolean = true): String { val hour = if (this.hour > 12) this.hour - 12 else this.hour val timeOfDay = if (this.hour > 11) "pm" else "am" // hooray for 12-hour clocks var minute = this.minute.toString() @@ -136,7 +136,9 @@ object TimeUtils { val daySuffix = SkyBlockTime.daySuffix(day) val year = this.year - if (!hoursAndMinutes) return "$month $day$daySuffix, Year $year" // Early Winter 1st Year 300 + if (!hoursAndMinutesElement && !yearElement) return "$month $day$daySuffix" // Early Winter 1st + if (!hoursAndMinutesElement) return "$month $day$daySuffix, Year $year" // Early Winter 1st Year 300 + if (!yearElement) return "$month $day$daySuffix, $hour:${minute}$timeOfDay" // Early Winter 1st, 12:03pm return "$month $day$daySuffix, Year $year $hour:${minute}$timeOfDay" // Early Winter 1st Year 300, 12:03pm } From b597d25600d10d0613aecc2f3c9c4f0159f7d6e1 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 21 Nov 2023 20:10:24 +0100 Subject: [PATCH 100/225] Added background --- .../misc/customscoreboard/CustomScoreboard.kt | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 518ab79decaa..e6f2282dbbc1 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -9,7 +9,6 @@ // - icons maybe // - Soulflow API // - Bank API -// - Custom Scoreboard Background // - quiver // - beacon power // - skyblock level @@ -18,6 +17,9 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsX +import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY +import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.PurseAPI import at.hannibal2.skyhanni.data.ScoreboardData @@ -29,6 +31,9 @@ import at.hannibal2.skyhanni.utils.OSUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings import at.hannibal2.skyhanni.utils.TabListData import net.minecraft.client.Minecraft +import net.minecraft.client.gui.Gui +import net.minecraft.client.gui.GuiScreen +import net.minecraft.client.gui.ScaledResolution import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -56,7 +61,24 @@ class CustomScoreboard { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!isCustomScoreboardEnabled()) return - config.position.renderStrings(display, posLabel = "Custom Scoreboard") + val position = config.position + val border = 5 + + val x = position.getAbsX() + val y = position.getAbsY() + + val elementWidth = position.getDummySize().x + val elementHeight = position.getDummySize().y + + GuiScreen.drawRect( + x - border, + y - border, + x + elementWidth + border * 2, + y + elementHeight + border * 2, + 0x66000000 + ) + + position.renderStrings(display, posLabel = "Custom Scoreboard") } @SubscribeEvent From e0746e0bc5f1de6488ce9258b97b7495d05a3558 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 23 Nov 2023 15:17:53 +0100 Subject: [PATCH 101/225] Option to align sb to the right --- .../features/gui/CustomScoreboardConfig.java | 6 ++++++ .../misc/customscoreboard/CustomScoreboard.kt | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java index 2755ce988a8a..16b37030b99b 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java @@ -92,6 +92,12 @@ public class CustomScoreboardConfig { @FeatureToggle public boolean displayNumbersFirst = false; + @Expose + @ConfigOption(name = "Align to the right", desc = "Align the scoreboard to the right side of the screen.") + @ConfigEditorBoolean + @FeatureToggle + public boolean alignRight = false; + @Expose @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index e6f2282dbbc1..7b7fd6ee655c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -17,6 +17,7 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.config.core.config.Position import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsX import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize @@ -70,6 +71,20 @@ class CustomScoreboard { val elementWidth = position.getDummySize().x val elementHeight = position.getDummySize().y + val scaledWidth = ScaledResolution(Minecraft.getMinecraft()).scaledWidth + + if (config.alignRight) { + position.set( + Position( + scaledWidth - elementWidth - (border * 2), + y, + position.getScale(), + position.isCenter + ) + ) + } + + GuiScreen.drawRect( x - border, y - border, @@ -146,7 +161,7 @@ class CustomScoreboard { } // Does not display this line - if (it.any { i-> i == ""}) { + if (it.any { i -> i == "" }) { continue } From d1dec5695081e05ef0a9e3b4475d1986a4ad0bd7 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 23 Nov 2023 16:41:57 +0100 Subject: [PATCH 102/225] Added customizeable background color --- .../config/features/gui/GUIConfig.java | 1 + .../CustomScoreboardConfig.java | 22 ++++++++++++++++++- .../misc/customscoreboard/CustomScoreboard.kt | 19 +++++++++------- 3 files changed, 33 insertions(+), 9 deletions(-) rename src/main/java/at/hannibal2/skyhanni/config/features/gui/{ => customscoreboard}/CustomScoreboardConfig.java (87%) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/GUIConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/GUIConfig.java index 251e49ae50d3..88bc3d267d24 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/GUIConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/GUIConfig.java @@ -2,6 +2,7 @@ import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.config.core.config.Position; +import at.hannibal2.skyhanni.config.features.gui.customscoreboard.CustomScoreboardConfig; import at.hannibal2.skyhanni.data.GuiEditManager; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.Accordion; diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java similarity index 87% rename from src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java rename to src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index 16b37030b99b..e3660719204b 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -1,9 +1,12 @@ -package at.hannibal2.skyhanni.config.features.gui; +package at.hannibal2.skyhanni.config.features.gui.customscoreboard; import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.config.core.config.Position; +import at.hannibal2.skyhanni.config.features.misc.compacttablist.AdvancedPlayerListConfig; import com.google.gson.annotations.Expose; +import io.github.moulberry.moulconfig.annotations.Accordion; import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; +import io.github.moulberry.moulconfig.annotations.ConfigEditorColour; import io.github.moulberry.moulconfig.annotations.ConfigEditorDraggableList; import io.github.moulberry.moulconfig.annotations.ConfigEditorSlider; import io.github.moulberry.moulconfig.annotations.ConfigEditorText; @@ -58,6 +61,23 @@ public class CustomScoreboardConfig { ) public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22)); + @Expose + @ConfigOption( + name = "Enabled", + desc = "Show a background behind the scoreboard." + ) + @ConfigEditorBoolean + @FeatureToggle + public boolean bgenabled = true; + + @Expose + @ConfigOption( + name = "Background Color", + desc = "The color of the background." + ) + @ConfigEditorColour + public String color = "0:102:0:0:0"; + @Expose @ConfigOption(name = "Hide Vanilla Scoreboard", desc = "Hide the vanilla scoreboard.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 7b7fd6ee655c..f5a42a032364 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -30,6 +30,7 @@ import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.OSUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings +import at.hannibal2.skyhanni.utils.SpecialColour import at.hannibal2.skyhanni.utils.TabListData import net.minecraft.client.Minecraft import net.minecraft.client.gui.Gui @@ -38,6 +39,7 @@ import net.minecraft.client.gui.ScaledResolution import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import java.awt.Color private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList() @@ -84,14 +86,15 @@ class CustomScoreboard { ) } - - GuiScreen.drawRect( - x - border, - y - border, - x + elementWidth + border * 2, - y + elementHeight + border * 2, - 0x66000000 - ) + if (config.bgenabled) { + GuiScreen.drawRect( + x - border, + y - border, + x + elementWidth + border * 2, + y + elementHeight + border * 2, + SpecialColour.specialToChromaRGB(config.color) + ) + } position.renderStrings(display, posLabel = "Custom Scoreboard") } From 5f58ba80f3719a6524fdbfd35c6e0af24f71edb9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 24 Nov 2023 18:19:30 +0100 Subject: [PATCH 103/225] Added accordions --- .../customscoreboard/BackgroundConfig.java | 26 +++++++ .../CustomScoreboardConfig.java | 67 +++---------------- .../gui/customscoreboard/DisplayConfig.java | 39 +++++++++++ .../InformationFilteringConfig.java | 26 +++++++ .../misc/customscoreboard/CustomScoreboard.kt | 11 +-- .../misc/customscoreboard/Elements.kt | 42 ++++++------ .../features/misc/customscoreboard/Events.kt | 8 +-- 7 files changed, 131 insertions(+), 88 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java create mode 100644 src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java create mode 100644 src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/InformationFilteringConfig.java diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java new file mode 100644 index 000000000000..eb6fa8c459ba --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java @@ -0,0 +1,26 @@ +package at.hannibal2.skyhanni.config.features.gui.customscoreboard; + +import at.hannibal2.skyhanni.config.FeatureToggle; +import com.google.gson.annotations.Expose; +import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; +import io.github.moulberry.moulconfig.annotations.ConfigEditorColour; +import io.github.moulberry.moulconfig.annotations.ConfigOption; + +public class BackgroundConfig { + @Expose + @ConfigOption( + name = "Enabled", + desc = "Show a background behind the scoreboard." + ) + @ConfigEditorBoolean + @FeatureToggle + public boolean enabled = true; + + @Expose + @ConfigOption( + name = "Background Color", + desc = "The color of the background." + ) + @ConfigEditorColour + public String color = "0:102:0:0:0"; +} diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index e3660719204b..df7f9ff6b496 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -62,27 +62,19 @@ public class CustomScoreboardConfig { public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22)); @Expose - @ConfigOption( - name = "Enabled", - desc = "Show a background behind the scoreboard." - ) - @ConfigEditorBoolean - @FeatureToggle - public boolean bgenabled = true; + @ConfigOption(name = "Display Options", desc = "") + @Accordion + public DisplayConfig displayConfig = new DisplayConfig(); @Expose - @ConfigOption( - name = "Background Color", - desc = "The color of the background." - ) - @ConfigEditorColour - public String color = "0:102:0:0:0"; + @ConfigOption(name = "Information Filtering", desc = "") + @Accordion + public InformationFilteringConfig informationFilteringConfig = new InformationFilteringConfig(); @Expose - @ConfigOption(name = "Hide Vanilla Scoreboard", desc = "Hide the vanilla scoreboard.") - @ConfigEditorBoolean - @FeatureToggle - public boolean hideVanillaScoreboard = false; + @ConfigOption(name = "Background Options", desc = "") + @Accordion + public BackgroundConfig backgroundConfig = new BackgroundConfig(); @Expose @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") @@ -93,53 +85,12 @@ public class CustomScoreboardConfig { ) public Property maxPartyList = Property.of(4); - @Expose - @ConfigOption(name = "Hide lines with no info", desc = "Hide lines that have no info to display, like hiding the party when not being in one.") - @ConfigEditorBoolean - @FeatureToggle - public boolean hideEmptyLines = true; - - @Expose - @ConfigOption(name = "Hide Info not relevant to location", desc = "Hide lines that are not relevant to the current location, like hiding copper while not in garden") - @ConfigEditorBoolean - @FeatureToggle - public boolean hideIrrelevantLines = true; - - @Expose - @ConfigOption(name = "Display Numbers First", desc = "Determines whether the number or line name displays first. " + - "§eNote: Will not update the preview above!") - @ConfigEditorBoolean - @FeatureToggle - public boolean displayNumbersFirst = false; - - @Expose - @ConfigOption(name = "Align to the right", desc = "Align the scoreboard to the right side of the screen.") - @ConfigEditorBoolean - @FeatureToggle - public boolean alignRight = false; - @Expose @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") @ConfigEditorBoolean @FeatureToggle public boolean showMayorPerks = true; - @Expose - @ConfigOption(name = "Hide consecutive empty lines", desc = "Hide lines that are empty and have an empty line above them.") - @ConfigEditorBoolean - @FeatureToggle - public boolean hideConsecutiveEmptyLines = true; - - @Expose - @ConfigOption(name = "Custom Title", desc = "What should be displayed as the title of the scoreboard.\nUse & for colors") - @ConfigEditorText - public Property customTitle = Property.of("&6&lSKYBLOCK"); - - @Expose - @ConfigOption(name = "Custom Footer", desc = "What should be displayed as the footer of the scoreboard.\nUse & for colors") - @ConfigEditorText - public Property customFooter = Property.of("&ewww.hypixel.net"); - @Expose public Position position = new Position(10, 80, false, true); } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java new file mode 100644 index 000000000000..acc099f099a8 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java @@ -0,0 +1,39 @@ +package at.hannibal2.skyhanni.config.features.gui.customscoreboard; + +import at.hannibal2.skyhanni.config.FeatureToggle; +import com.google.gson.annotations.Expose; +import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; +import io.github.moulberry.moulconfig.annotations.ConfigEditorText; +import io.github.moulberry.moulconfig.annotations.ConfigOption; +import io.github.moulberry.moulconfig.observer.Property; + +public class DisplayConfig { + @Expose + @ConfigOption(name = "Hide Vanilla Scoreboard", desc = "Hide the vanilla scoreboard.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideVanillaScoreboard = false; + + @Expose + @ConfigOption(name = "Display Numbers First", desc = "Determines whether the number or line name displays first. " + + "§eNote: Will not update the preview above!") + @ConfigEditorBoolean + @FeatureToggle + public boolean displayNumbersFirst = false; + + @Expose + @ConfigOption(name = "Align to the right", desc = "Align the scoreboard to the right side of the screen.") + @ConfigEditorBoolean + @FeatureToggle + public boolean alignRight = false; + + @Expose + @ConfigOption(name = "Custom Title", desc = "What should be displayed as the title of the scoreboard.\nUse & for colors.") + @ConfigEditorText + public Property customTitle = Property.of("&6&lSKYBLOCK"); + + @Expose + @ConfigOption(name = "Custom Footer", desc = "What should be displayed as the footer of the scoreboard.\nUse & for colors.") + @ConfigEditorText + public Property customFooter = Property.of("&ewww.hypixel.net"); +} diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/InformationFilteringConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/InformationFilteringConfig.java new file mode 100644 index 000000000000..d16c6368e0e5 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/InformationFilteringConfig.java @@ -0,0 +1,26 @@ +package at.hannibal2.skyhanni.config.features.gui.customscoreboard; + +import at.hannibal2.skyhanni.config.FeatureToggle; +import com.google.gson.annotations.Expose; +import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; +import io.github.moulberry.moulconfig.annotations.ConfigOption; + +public class InformationFilteringConfig { + @Expose + @ConfigOption(name = "Hide lines with no info", desc = "Hide lines that have no info to display, like hiding the party when not being in one.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideEmptyLines = true; + + @Expose + @ConfigOption(name = "Hide Info not relevant to location", desc = "Hide lines that are not relevant to the current location, like hiding copper while not in garden.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideIrrelevantLines = true; + + @Expose + @ConfigOption(name = "Hide consecutive empty lines", desc = "Hide lines that are empty and have an empty line above them.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideConsecutiveEmptyLines = true; +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index f5a42a032364..0a108a929ae0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -64,6 +64,7 @@ class CustomScoreboard { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!isCustomScoreboardEnabled()) return + if (display.isEmpty()) return val position = config.position val border = 5 @@ -75,7 +76,7 @@ class CustomScoreboard { val scaledWidth = ScaledResolution(Minecraft.getMinecraft()).scaledWidth - if (config.alignRight) { + if (config.displayConfig.alignRight) { position.set( Position( scaledWidth - elementWidth - (border * 2), @@ -86,13 +87,13 @@ class CustomScoreboard { ) } - if (config.bgenabled) { + if (config.backgroundConfig.enabled) { GuiScreen.drawRect( x - border, y - border, x + elementWidth + border * 2, y + elementHeight + border * 2, - SpecialColour.specialToChromaRGB(config.color) + SpecialColour.specialToChromaRGB(config.backgroundConfig.color) ) } @@ -153,7 +154,7 @@ class CustomScoreboard { for (index in config.textFormat) { lineMap[index]?.let { // Hide consecutive empty lines - if (config.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull() == "") { + if (config.informationFilteringConfig.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull() == "") { continue } @@ -193,7 +194,7 @@ class CustomScoreboard { private fun isCustomScoreboardEnabled() = config.enabled && LorenzUtils.inSkyBlock - private fun isHideVanillaScoreboardEnabled() = config.hideVanillaScoreboard && LorenzUtils.inSkyBlock + private fun isHideVanillaScoreboardEnabled() = (config.displayConfig.hideVanillaScoreboard && LorenzUtils.inSkyBlock) companion object { fun copyScoreboard(args: Array) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 957fede93390..9b54b2c545e8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -31,7 +31,7 @@ enum class Elements( ) { SKYBLOCK( { - listOf(config.customTitle.get().toString().replace("&", "§")) + listOf(config.displayConfig.customTitle.get().toString().replace("&", "§")) }, listOf(), 0, @@ -48,8 +48,8 @@ enum class Elements( PURSE( { when { - config.hideEmptyLines && purse == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§6$purse Purse") + config.informationFilteringConfig.hideEmptyLines && purse == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§6$purse Purse") else -> listOf("Purse: §6$purse") } }, @@ -60,8 +60,8 @@ enum class Elements( MOTES( { when { - motes == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§d$motes Motes") + config.informationFilteringConfig.hideEmptyLines && motes == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§d$motes Motes") else -> listOf("Motes: §d$motes") } }, @@ -72,8 +72,8 @@ enum class Elements( BANK( { when { - bank == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§6$bank Bank") + config.informationFilteringConfig.hideEmptyLines && bank == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§6$bank Bank") else -> listOf("Bank: §6$bank") } }, @@ -84,8 +84,8 @@ enum class Elements( BITS( { when { - bits == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§b$bits Bits") + config.informationFilteringConfig.hideEmptyLines && bits == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§b$bits Bits") else -> listOf("Bits: §b$bits") } }, @@ -96,8 +96,8 @@ enum class Elements( COPPER( { when { - copper == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§c$copper Copper") + config.informationFilteringConfig.hideEmptyLines && copper == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§c$copper Copper") else -> listOf("Copper: §c$copper") } }, @@ -108,8 +108,8 @@ enum class Elements( GEMS( { when { - gems == "0" -> listOf("") - config.displayNumbersFirst -> listOf("§a$gems Gems") + config.informationFilteringConfig.hideEmptyLines && gems == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§a$gems Gems") else -> listOf("Gems: §a$gems") } }, @@ -120,8 +120,8 @@ enum class Elements( HEAT( { when { - heat == "0" -> listOf("") - config.displayNumbersFirst -> listOf(if (heat == "0") "§c♨ 0 Heat" else "§c♨ $heat Heat") + config.informationFilteringConfig.hideEmptyLines && heat == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf(if (heat == "0") "§c♨ 0 Heat" else "§c♨ $heat Heat") else -> listOf(if (heat == "0") "Heat: §c♨ 0" else "Heat: $heat") } }, @@ -166,7 +166,7 @@ enum class Elements( when (MaxwellAPI.currentPower == null) { true -> listOf("§c§lPlease visit Maxwell!") false -> - when (config.displayNumbersFirst) { + when (config.displayConfig.displayNumbersFirst) { true -> listOf("${MaxwellAPI.currentPower?.power} Power") false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") } @@ -186,7 +186,7 @@ enum class Elements( ), OBJECTIVE( { - when(config.hideEmptyLines){ + when(config.informationFilteringConfig.hideEmptyLines){ true -> listOf("Objective:") + (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") ?: "") false -> listOf("Objective:") + (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") ?: "§cNo objective") } @@ -226,7 +226,7 @@ enum class Elements( ), POWDER( { - when (config.displayNumbersFirst) { + when (config.displayConfig.displayNumbersFirst) { true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") } @@ -259,7 +259,7 @@ enum class Elements( ), PARTY( { - val partyTitle: List = if (PartyAPI.partyMembers.isEmpty() && config.hideEmptyLines) { + val partyTitle: List = if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { listOf("") } else { val title = @@ -282,7 +282,7 @@ enum class Elements( ), WEBSITE( { - listOf(config.customFooter.get().toString().replace("&", "§")) + listOf(config.displayConfig.customFooter.get().toString().replace("&", "§")) }, listOf(), 0, @@ -294,7 +294,7 @@ enum class Elements( } fun isVisible(): Boolean { - if (!config.hideIrrelevantLines) return true + if (!config.informationFilteringConfig.hideIrrelevantLines) return true if (islands.isEmpty()) return true return when (visibilityOption) { 0 -> islands.contains(HypixelData.skyBlockIsland) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index f7d586e483fe..5b6fb6cb659d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -17,7 +17,7 @@ enum class Events(private val displayLine: Supplier>, private val s NONE( // maybe use default state tablist: "Events: smth" idk { when { - config.hideEmptyLines -> listOf("") + config.informationFilteringConfig.hideEmptyLines -> listOf("") else -> listOf("§cNo Event") } }, @@ -74,7 +74,7 @@ enum class Events(private val displayLine: Supplier>, private val s } } - if (list.size == 0) when (config.hideEmptyLines) { + if (list.size == 0) when (config.informationFilteringConfig.hideEmptyLines) { true -> listOf("") false -> listOf("§cNo Dungeon Data") } else list @@ -117,7 +117,7 @@ enum class Events(private val displayLine: Supplier>, private val s list += ScoreboardData.sidebarLinesFormatted.nextAfter("§fObjective:") ?: "§cNo Objective" } - if (list.size == 0) when (config.hideEmptyLines) { + if (list.size == 0) when (config.informationFilteringConfig.hideEmptyLines) { true -> listOf("") false -> listOf("§cNo Kuudra Data") } else list @@ -258,7 +258,7 @@ enum class Events(private val displayLine: Supplier>, private val s .removePrefix("Zone: ") } - if (list.size == 0) when (config.hideEmptyLines) { + if (list.size == 0) when (config.informationFilteringConfig.hideEmptyLines) { true -> listOf("") false -> listOf("§cNo Mining Event") } else list From c5675dafd68e2813b1d332c6fb3e42d72e60210d Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 24 Nov 2023 23:54:49 +0100 Subject: [PATCH 104/225] smaller changes --- .../features/misc/customscoreboard/CustomScoreboard.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 0a108a929ae0..fdd952ed428c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -6,12 +6,12 @@ // // TODO LIST // V2 RELEASE -// - icons maybe // - Soulflow API // - Bank API // - quiver // - beacon power // - skyblock level +// - more bg options (round, blurr, outline) // package at.hannibal2.skyhanni.features.misc.customscoreboard @@ -117,7 +117,6 @@ class CustomScoreboard { line.startsWith(" Bank: §r§6") -> bank = line.removePrefix(" Bank: §r§6") line.startsWith(" §r§fMithril Powder: §r§2") -> mithrilPowder = line.removePrefix(" §r§fMithril Powder: §r§2") - line.startsWith(" §r§fGemstone Powder: §r§d") -> gemstonePowder = line.removePrefix(" §r§fGemstone Powder: §r§d") } @@ -193,8 +192,7 @@ class CustomScoreboard { } private fun isCustomScoreboardEnabled() = config.enabled && LorenzUtils.inSkyBlock - - private fun isHideVanillaScoreboardEnabled() = (config.displayConfig.hideVanillaScoreboard && LorenzUtils.inSkyBlock) + private fun isHideVanillaScoreboardEnabled() = config.displayConfig.hideVanillaScoreboard && LorenzUtils.inSkyBlock companion object { fun copyScoreboard(args: Array) { From cd24666cb2fc49027198662739d6e10195e1555c Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 25 Nov 2023 14:49:33 +0100 Subject: [PATCH 105/225] updated some things --- .../CustomScoreboardConfig.java | 10 +++----- .../gui/customscoreboard/PartyConfig.java | 25 +++++++++++++++++++ .../misc/customscoreboard/Elements.kt | 4 +-- 3 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index df7f9ff6b496..47e375121977 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -77,13 +77,9 @@ public class CustomScoreboardConfig { public BackgroundConfig backgroundConfig = new BackgroundConfig(); @Expose - @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") - @ConfigEditorSlider( - minValue = 1, - maxValue = 25, // why do I even set it so high - minStep = 1 - ) - public Property maxPartyList = Property.of(4); + @ConfigOption(name = "Party Options", desc = "") + @Accordion + public PartyConfig partyConfig = new PartyConfig(); @Expose @ConfigOption(name = "Show Mayor Perks", desc = "Show the perks of the current mayor.") diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java new file mode 100644 index 000000000000..62936512cdf6 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java @@ -0,0 +1,25 @@ +package at.hannibal2.skyhanni.config.features.gui.customscoreboard; + +import at.hannibal2.skyhanni.config.FeatureToggle; +import com.google.gson.annotations.Expose; +import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; +import io.github.moulberry.moulconfig.annotations.ConfigEditorSlider; +import io.github.moulberry.moulconfig.annotations.ConfigOption; +import io.github.moulberry.moulconfig.observer.Property; + +public class PartyConfig { + @Expose + @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") + @ConfigEditorSlider( + minValue = 1, + maxValue = 25, // why do I even set it so high + minStep = 1 + ) + public Property maxPartyList = Property.of(4); + + @Expose + @ConfigOption(name = "Show Party everywhere", desc = "Show the party list everywhere.") + @ConfigEditorBoolean + @FeatureToggle + public boolean showPartyEverywhere = false; +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 9b54b2c545e8..df496b84bcdf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -21,7 +21,7 @@ enum class Elements( private val displayLine: Supplier>?, // islands: The islands that this line is displayed on - private val islands: List, + private val islands: List, //TODO USE SUPPLIER, WORKS BETTER FOR SHOW PARTY EVERWHERE // visibilityOption: The option that is used to hide this line - use 0 to only display on the listed islands, 1 to hide on the listed islands private val visibilityOption: Int, @@ -265,7 +265,7 @@ enum class Elements( val title = if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" val partyList = PartyAPI.partyMembers - .takeWhile { partyCount < config.maxPartyList.get() } + .takeWhile { partyCount < config.partyConfig.maxPartyList.get() } .map { partyCount++ " §7- §7$it" From 5b9e41b96ab923aaec980da41eb900f93b2f99b8 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:04:14 +0100 Subject: [PATCH 106/225] Improved element showwhen --- .../misc/customscoreboard/Elements.kt | 194 ++++++++++-------- 1 file changed, 106 insertions(+), 88 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index df496b84bcdf..b90e83682cf5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -17,32 +17,26 @@ import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard enum class Elements( - // displayLine: The line that is displayed on the scoreboard - private val displayLine: Supplier>?, - - // islands: The islands that this line is displayed on - private val islands: List, //TODO USE SUPPLIER, WORKS BETTER FOR SHOW PARTY EVERWHERE - - // visibilityOption: The option that is used to hide this line - use 0 to only display on the listed islands, 1 to hide on the listed islands - private val visibilityOption: Int, - - // index: The index of the line + private val displayLine: Supplier>, + private val showWhen: () -> Boolean, val index: Int ) { SKYBLOCK( { listOf(config.displayConfig.customTitle.get().toString().replace("&", "§")) }, - listOf(), - 0, + { + true + }, 0 ), PROFILE( { listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) }, - listOf(), - 0, + { + true + }, 1 ), PURSE( @@ -53,8 +47,9 @@ enum class Elements( else -> listOf("Purse: §6$purse") } }, - listOf(IslandType.THE_RIFT), - 1, + { + !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + }, 2 ), MOTES( @@ -65,8 +60,9 @@ enum class Elements( else -> listOf("Motes: §d$motes") } }, - listOf(IslandType.THE_RIFT), - 0, + { + listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + }, 3 ), BANK( @@ -77,8 +73,9 @@ enum class Elements( else -> listOf("Bank: §6$bank") } }, - listOf(IslandType.THE_RIFT), - 1, + { + !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + }, 4 ), BITS( @@ -89,8 +86,9 @@ enum class Elements( else -> listOf("Bits: §b$bits") } }, - listOf(IslandType.THE_RIFT), - 1, + { + !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + }, 5 ), COPPER( @@ -101,8 +99,9 @@ enum class Elements( else -> listOf("Copper: §c$copper") } }, - listOf(IslandType.GARDEN), - 0, + { + listOf(IslandType.GARDEN).contains(HypixelData.skyBlockIsland) + }, 6 ), GEMS( @@ -113,8 +112,9 @@ enum class Elements( else -> listOf("Gems: §a$gems") } }, - listOf(IslandType.THE_RIFT), - 1, + { + !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + }, 7 ), HEAT( @@ -125,40 +125,45 @@ enum class Elements( else -> listOf(if (heat == "0") "Heat: §c♨ 0" else "Heat: $heat") } }, - listOf(IslandType.CRYSTAL_HOLLOWS), - 0, + { + listOf(IslandType.CRYSTAL_HOLLOWS).contains(HypixelData.skyBlockIsland) + }, 8 ), EMPTY_LINE( { listOf("") }, - listOf(), - 0, + { + true + }, 9 ), LOCATION( { listOf(location) }, - listOf(), - 0, + { + true + }, 10 ), SKYBLOCK_TIME( { - listOf(SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false)) + listOf(SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false)) + }, + { + true }, - listOf(), - 0, 11 ), LOBBY_CODE( { listOf("§8$lobbyCode") }, - listOf(), - 0, + { + true + }, 12 ), MAXWELL( @@ -172,27 +177,33 @@ enum class Elements( } } }, - listOf(IslandType.THE_RIFT), - 1, + { + !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + }, 13 ), EMPTY_LINE2( { listOf("") }, - listOf(), - 0, + { + true + }, 14 ), OBJECTIVE( { - when(config.informationFilteringConfig.hideEmptyLines){ - true -> listOf("Objective:") + (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") ?: "") - false -> listOf("Objective:") + (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") ?: "§cNo objective") + when (config.informationFilteringConfig.hideEmptyLines) { + true -> listOf("Objective:") + (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") + ?: "") + + false -> listOf("Objective:") + (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") + ?: "§cNo objective") } }, - listOf(), - 0, + { + true + }, 15 ), SLAYER( @@ -205,23 +216,25 @@ enum class Elements( " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" ) }, - listOf( - IslandType.HUB, - IslandType.SPIDER_DEN, - IslandType.THE_PARK, - IslandType.THE_END, - IslandType.CRIMSON_ISLE, - IslandType.THE_RIFT - ), - 0, + { + listOf( + at.hannibal2.skyhanni.data.IslandType.HUB, + at.hannibal2.skyhanni.data.IslandType.SPIDER_DEN, + at.hannibal2.skyhanni.data.IslandType.THE_PARK, + at.hannibal2.skyhanni.data.IslandType.THE_END, + at.hannibal2.skyhanni.data.IslandType.CRIMSON_ISLE, + at.hannibal2.skyhanni.data.IslandType.THE_RIFT + ).contains(HypixelData.skyBlockIsland) + }, 16 ), EMPTY_LINE3( { listOf("") }, - listOf(), - 0, + { + true + }, 17 ), POWDER( @@ -231,16 +244,18 @@ enum class Elements( false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") } }, - listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES), - 0, + { + listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES).contains(HypixelData.skyBlockIsland) + }, 18 ), CURRENT_EVENT( { Events.getFirstEvent().getLines() }, - listOf(), - 0, + { + true + }, 19 ), MAYOR( @@ -253,53 +268,56 @@ enum class Elements( emptyList() }) }, - listOf(IslandType.THE_RIFT), - 1, + { + !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + }, 20 ), PARTY( { - val partyTitle: List = if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { - listOf("") - } else { - val title = - if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" - val partyList = PartyAPI.partyMembers - .takeWhile { partyCount < config.partyConfig.maxPartyList.get() } - .map { - partyCount++ - " §7- §7$it" - } - .toTypedArray() - listOf(title, *partyList) - } + val partyTitle: List = + if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { + listOf("") + } else { + val title = + if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" + val partyList = PartyAPI.partyMembers + .takeWhile { partyCount < config.partyConfig.maxPartyList.get() } + .map { + partyCount++ + " §7- §7$it" + } + .toTypedArray() + listOf(title, *partyList) + } partyTitle }, - listOf(IslandType.DUNGEON_HUB, IslandType.KUUDRA_ARENA, IslandType.CRIMSON_ISLE), - 0, + { + listOf( + IslandType.DUNGEON_HUB, + IslandType.KUUDRA_ARENA, + IslandType.CRIMSON_ISLE + ).contains(HypixelData.skyBlockIsland) + }, 21 ), WEBSITE( { listOf(config.displayConfig.customFooter.get().toString().replace("&", "§")) }, - listOf(), - 0, + { + true + }, 22 ); fun getLine(): List { - return displayLine?.get() ?: emptyList() + return displayLine.get() } fun isVisible(): Boolean { if (!config.informationFilteringConfig.hideIrrelevantLines) return true - if (islands.isEmpty()) return true - return when (visibilityOption) { - 0 -> islands.contains(HypixelData.skyBlockIsland) - 1 -> !islands.contains(HypixelData.skyBlockIsland) - else -> true - } + return showWhen() } } From e529624ca0c9836fb1b6d44f3feb42aadcd38782 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:15:02 +0100 Subject: [PATCH 107/225] Added title animation --- .../config/features/gui/customscoreboard/DisplayConfig.java | 6 ++++++ .../skyhanni/features/misc/customscoreboard/Elements.kt | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java index acc099f099a8..00df3ecf103e 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java @@ -32,6 +32,12 @@ public class DisplayConfig { @ConfigEditorText public Property customTitle = Property.of("&6&lSKYBLOCK"); + @Expose + @ConfigOption(name = "Use Hypixel's Title Animation", desc = "Will overwrite the custom title with Hypixel's title animation.") + @ConfigEditorBoolean + @FeatureToggle + public boolean useHypixelTitleAnimation = false; + @Expose @ConfigOption(name = "Custom Footer", desc = "What should be displayed as the footer of the scoreboard.\nUse & for colors.") @ConfigEditorText diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index b90e83682cf5..784a78dad893 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -23,7 +23,10 @@ enum class Elements( ) { SKYBLOCK( { - listOf(config.displayConfig.customTitle.get().toString().replace("&", "§")) + when (config.displayConfig.useHypixelTitleAnimation){ + true -> listOf(ScoreboardData.objectiveTitle) + false -> listOf(config.displayConfig.customTitle.get().toString().replace("&", "§")) + } }, { true From 664b90d4a152ddd8eacf3c9c181e2ad2eee1cb9a Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:24:28 +0100 Subject: [PATCH 108/225] Renamed/Changed some things --- .../misc/customscoreboard/CustomScoreboard.kt | 46 ++++--------------- .../features/misc/customscoreboard/Events.kt | 4 +- .../customscoreboard/InformationGetter.kt | 39 ++++++++++++++++ 3 files changed, 48 insertions(+), 41 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index fdd952ed428c..43d992579882 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -22,7 +22,6 @@ import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsX import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize import at.hannibal2.skyhanni.data.HypixelData -import at.hannibal2.skyhanni.data.PurseAPI import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.LorenzTickEvent @@ -31,15 +30,12 @@ import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.OSUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings import at.hannibal2.skyhanni.utils.SpecialColour -import at.hannibal2.skyhanni.utils.TabListData import net.minecraft.client.Minecraft -import net.minecraft.client.gui.Gui import net.minecraft.client.gui.GuiScreen import net.minecraft.client.gui.ScaledResolution import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import java.awt.Color private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList() @@ -105,39 +101,13 @@ class CustomScoreboard { if (!isCustomScoreboardEnabled()) return // Draws the custom scoreboard - display = drawScoreboard() - - // Resets Party count - partyCount = 0 - - // Gets some values from the tablist - for (line in TabListData.getTabList()) { - when { - line.startsWith(" Gems: §r§a") -> gems = line.removePrefix(" Gems: §r§a") - line.startsWith(" Bank: §r§6") -> bank = line.removePrefix(" Bank: §r§6") - line.startsWith(" §r§fMithril Powder: §r§2") -> mithrilPowder = - line.removePrefix(" §r§fMithril Powder: §r§2") - line.startsWith(" §r§fGemstone Powder: §r§d") -> gemstonePowder = - line.removePrefix(" §r§fGemstone Powder: §r§d") - } - } + display = createLines() - // Gets some values from the scoreboard - for (line in ScoreboardData.sidebarLinesFormatted) { - when { - line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ") -> location = line - line.startsWith("Motes: §d") -> motes = line.removePrefix("Motes: §d") - extractLobbyCode(line) is String -> lobbyCode = - extractLobbyCode(line)?.substring(1) ?: "" //removes first char (number of color code) - line.startsWith("Heat: ") -> heat = line.removePrefix("Heat: ") - line.startsWith("Bits: §b") -> bits = line.removePrefix("Bits: §b") - line.startsWith("Copper: §c") -> copper = line.removePrefix("Copper: §c") - } - } - purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) + // Get Information + InformationGetter().getInformation() } - private fun drawScoreboard() = buildList { + private fun createLines() = buildList { val lineMap = HashMap>() for (element in Elements.entries) { lineMap[element.index] = if (element.isVisible()) element.getLine() else listOf("") @@ -145,10 +115,10 @@ class CustomScoreboard { cache = lineMap.values.toList() - return formatDisplay(lineMap) + return formatLines(lineMap) } - private fun formatDisplay(lineMap: HashMap>): MutableList { + private fun formatLines(lineMap: HashMap>): MutableList { val newList = mutableListOf() for (index in config.textFormat) { lineMap[index]?.let { @@ -233,7 +203,7 @@ fun translateMayorNameToColor(input: String): String { } } -private fun extractLobbyCode(input: String): String? { +fun extractLobbyCode(input: String): String? { val regex = Regex("§(\\d{3}/\\d{2}/\\d{2}) §([A-Za-z0-9]+)$") val matchResult = regex.find(input) return matchResult?.groupValues?.lastOrNull() @@ -251,7 +221,7 @@ fun getProfileTypeAsSymbol(): String { } } -fun getFooter(): String { +fun getTablistFooter(): String { val tabList = Minecraft.getMinecraft().ingameGUI.tabList as AccessorGuiPlayerTabOverlay if (tabList.footer_skyhanni == null) return "" return tabList.footer_skyhanni.formattedText diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 5b6fb6cb659d..5f89834f3906 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -1,14 +1,12 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData -import net.minecraft.scoreboard.Score import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard @@ -191,7 +189,7 @@ enum class Events(private val displayLine: Supplier>, private val s SPOOKY( // not tested { listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§6Spooky Festival§f") }) + // Time - (getFooter().split("\n").first { it.startsWith("§r§r§7Your Candy:") }) // Candy + (getTablistFooter().split("\n").first { it.startsWith("§r§r§7Your Candy:") }) // Candy }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6Spooky Festival§f") } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt new file mode 100644 index 000000000000..354aeee0ac84 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -0,0 +1,39 @@ +package at.hannibal2.skyhanni.features.misc.customscoreboard + +import at.hannibal2.skyhanni.data.PurseAPI +import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.TabListData + +class InformationGetter { + fun getInformation(){ + // Resets Party count + partyCount = 0 + + // Gets some values from the tablist + for (line in TabListData.getTabList()) { + when { + line.startsWith(" Gems: §r§a") -> gems = line.removePrefix(" Gems: §r§a") + line.startsWith(" Bank: §r§6") -> bank = line.removePrefix(" Bank: §r§6") + line.startsWith(" §r§fMithril Powder: §r§2") -> mithrilPowder = + line.removePrefix(" §r§fMithril Powder: §r§2") + line.startsWith(" §r§fGemstone Powder: §r§d") -> gemstonePowder = + line.removePrefix(" §r§fGemstone Powder: §r§d") + } + } + + // Gets some values from the scoreboard + for (line in ScoreboardData.sidebarLinesFormatted) { + when { + line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ") -> location = line + line.startsWith("Motes: §d") -> motes = line.removePrefix("Motes: §d") + extractLobbyCode(line) is String -> lobbyCode = + extractLobbyCode(line)?.substring(1) ?: "" //removes first char (number of color code) + line.startsWith("Heat: ") -> heat = line.removePrefix("Heat: ") + line.startsWith("Bits: §b") -> bits = line.removePrefix("Bits: §b") + line.startsWith("Copper: §c") -> copper = line.removePrefix("Copper: §c") + } + } + purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) + } +} From 3cad62e849e30f0e5d58aceb13844afe30d1ec7d Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:25:53 +0100 Subject: [PATCH 109/225] Removed useless command --- .../skyhanni/config/commands/Commands.kt | 4 ---- .../misc/customscoreboard/CustomScoreboard.kt | 17 ----------------- 2 files changed, 21 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt index 9b6edde6c2a8..244304aedb6a 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -321,10 +321,6 @@ object Commands { "shcopyactionbar", "Copies the actionbar to the clipboard" ) { CopyActionBar.command(it) } - registerCommand( - "shcopycustomscoreboard", - "Copies the custom scoreboard to the clipboard" - ) { CustomScoreboard.copyScoreboard(it) } registerCommand( "readcropmilestonefromclipboard", "Read crop milestone from clipboard. This helps fixing wrong crop milestone data" diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 43d992579882..e9122276cdda 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -163,23 +163,6 @@ class CustomScoreboard { private fun isCustomScoreboardEnabled() = config.enabled && LorenzUtils.inSkyBlock private fun isHideVanillaScoreboardEnabled() = config.displayConfig.hideVanillaScoreboard && LorenzUtils.inSkyBlock - - companion object { - fun copyScoreboard(args: Array) { - var string = "" - - for (index in config.textFormat) { - cache[index].let { - for (line in it) { - string = string + line + "\n" - } - } - } - - OSUtils.copyToClipboard(string) - LorenzUtils.chat("§e[SkyHanni] Custom Scoreboard copied into your clipboard!") - } - } } fun translateMayorNameToColor(input: String): String { From fc1f06c5d4cedc7bdab82f38bd7473dcb903ca10 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:42:37 +0100 Subject: [PATCH 110/225] Added Center vertically --- .../gui/customscoreboard/DisplayConfig.java | 6 +++++ .../misc/customscoreboard/CustomScoreboard.kt | 25 +++++++++++-------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java index 00df3ecf103e..8ccb0d16b150 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java @@ -27,6 +27,12 @@ public class DisplayConfig { @FeatureToggle public boolean alignRight = false; + @Expose + @ConfigOption(name = "Align to the center vertically", desc = "Align the scoreboard to the center of the screen vertically.") + @ConfigEditorBoolean + @FeatureToggle + public boolean alignCenterVertically = false; + @Expose @ConfigOption(name = "Custom Title", desc = "What should be displayed as the title of the scoreboard.\nUse & for colors.") @ConfigEditorText diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index e9122276cdda..af3df243b23e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -71,17 +71,22 @@ class CustomScoreboard { val elementHeight = position.getDummySize().y val scaledWidth = ScaledResolution(Minecraft.getMinecraft()).scaledWidth - - if (config.displayConfig.alignRight) { - position.set( - Position( - scaledWidth - elementWidth - (border * 2), - y, - position.getScale(), - position.isCenter - ) + val scaledHeight = ScaledResolution(Minecraft.getMinecraft()).scaledHeight + + position.set( + Position( + when (config.displayConfig.alignRight) { + true -> scaledWidth - elementWidth - (border * 2) + false -> x + }, + when (config.displayConfig.alignCenterVertically) { + true -> scaledHeight / 2 - elementHeight / 2 + false -> y + }, + position.getScale(), + position.isCenter ) - } + ) if (config.backgroundConfig.enabled) { GuiScreen.drawRect( From 21366473ff5a34b88dcc0e71b520c9a7f4e564a0 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:55:50 +0100 Subject: [PATCH 111/225] Fixed line break in Mining events --- .../skyhanni/features/misc/customscoreboard/Events.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 5f89834f3906..21213997d3a7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -249,10 +249,11 @@ enum class Events(private val displayLine: Supplier>, private val s list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Nearby Players:") } } - // Mithril + // Zone Events if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event: ") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Event: ") } - .removePrefix("Event: ") + "\n§fin " + ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Zone: ") } + .removePrefix("Event: ") + list += "§fin " + ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Zone: ") } .removePrefix("Zone: ") } From 0bc1a8c75e01dc38ea51875c577d60a5d04bf9ee Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 25 Nov 2023 16:45:03 +0100 Subject: [PATCH 112/225] Smaller changes --- .../misc/customscoreboard/CustomScoreboard.kt | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index af3df243b23e..c644fe2f418b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -27,7 +27,6 @@ import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.OSUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings import at.hannibal2.skyhanni.utils.SpecialColour import net.minecraft.client.Minecraft @@ -40,7 +39,6 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList() private var cache = emptyList>() -var partyCount = 0 // Stats / Numbers var purse = "0" @@ -54,6 +52,7 @@ var lobbyCode = "None" var heat = "0" var mithrilPowder = "0" var gemstonePowder = "0" +var partyCount = 0 class CustomScoreboard { @@ -143,15 +142,8 @@ class CustomScoreboard { continue } - // Multiline support - if (it.size > 1) { - for (item in it) { - newList.add(item.toString()) - } - continue - } - - newList.add(it[0].toString()) + // Multiline and singular line support + newList.addAll(it.map { i -> i.toString() }) } } From 4eb7859057f66482415f7396976bb03589c87531 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 25 Nov 2023 19:02:50 +0100 Subject: [PATCH 113/225] added show party everywhere --- .../misc/customscoreboard/Elements.kt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 784a78dad893..ba367867a6c2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -8,6 +8,7 @@ import at.hannibal2.skyhanni.data.MayorElection import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI +import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.TimeUtils.formatted @@ -297,11 +298,19 @@ enum class Elements( partyTitle }, { - listOf( - IslandType.DUNGEON_HUB, - IslandType.KUUDRA_ARENA, - IslandType.CRIMSON_ISLE - ).contains(HypixelData.skyBlockIsland) + if(inDungeons){ + false // Hidden bc teammate health etc exists + } else { + if (config.partyConfig.showPartyEverywhere){ + true + } else { + listOf( + IslandType.DUNGEON_HUB, + IslandType.KUUDRA_ARENA, + IslandType.CRIMSON_ISLE + ).contains(HypixelData.skyBlockIsland) + } + } }, 21 ), From fb6d92f35afbca3411c4f8fa8ec5bcdd145ce718 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 26 Nov 2023 00:50:03 +0100 Subject: [PATCH 114/225] smthsmth shader --- .../misc/customscoreboard/CustomScoreboard.kt | 10 ++++--- .../RoundedRectangleShader.kt | 13 ++++++++++ .../skyhanni/utils/shader/ShaderManager.kt | 7 +++-- .../skyhanni/shaders/rounded_rectangle.fsh | 26 +++++++++++++++++++ 4 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt create mode 100644 src/main/resources/assets/skyhanni/shaders/rounded_rectangle.fsh diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index c644fe2f418b..ba2dc49b5e52 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -11,7 +11,7 @@ // - quiver // - beacon power // - skyblock level -// - more bg options (round, blurr, outline) +// - more bg options (round, blurr, outline), custom texturepack // package at.hannibal2.skyhanni.features.misc.customscoreboard @@ -29,7 +29,9 @@ import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings import at.hannibal2.skyhanni.utils.SpecialColour +import at.hannibal2.skyhanni.utils.shader.ShaderManager import net.minecraft.client.Minecraft +import net.minecraft.client.gui.Gui import net.minecraft.client.gui.GuiScreen import net.minecraft.client.gui.ScaledResolution import net.minecraftforge.client.GuiIngameForge @@ -87,15 +89,15 @@ class CustomScoreboard { ) ) - if (config.backgroundConfig.enabled) { - GuiScreen.drawRect( + /*if (config.backgroundConfig.enabled) { + Gui.drawRect( x - border, y - border, x + elementWidth + border * 2, y + elementHeight + border * 2, SpecialColour.specialToChromaRGB(config.backgroundConfig.color) ) - } + }*/ position.renderStrings(display, posLabel = "Custom Scoreboard") } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt new file mode 100644 index 000000000000..9ffaa887992c --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt @@ -0,0 +1,13 @@ +package at.hannibal2.skyhanni.features.misc.customscoreboard + +import at.hannibal2.skyhanni.utils.shader.Shader + +object RoundedRectangleShader : Shader("rounded_rectangle", "rounded_rectangle") { + + val INSTANCE: RoundedRectangleShader + get() = this + + override fun registerUniforms() { + + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt index 3dbec3c6e76a..7cc653c950db 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.utils.shader import at.hannibal2.skyhanni.features.chroma.ChromaShader +import at.hannibal2.skyhanni.features.misc.customscoreboard.RoundedRectangleShader import at.hannibal2.skyhanni.utils.LorenzUtils import net.minecraft.client.Minecraft import net.minecraft.util.ResourceLocation @@ -15,14 +16,16 @@ object ShaderManager { /** * For any future shaders add the object instance in this enum and - * in the when expression + * in the when-expression */ enum class Shaders(val shader: Shader) { - CHROMA(ChromaShader.INSTANCE); + CHROMA(ChromaShader.INSTANCE), + ROUNDED_RECTANGLE(RoundedRectangleShader.INSTANCE); companion object { fun getShaderInstance(shaderName: String): Shader? = when (shaderName) { "chroma" -> CHROMA.shader + "rounded_rectangle" -> ROUNDED_RECTANGLE.shader else -> { null } diff --git a/src/main/resources/assets/skyhanni/shaders/rounded_rectangle.fsh b/src/main/resources/assets/skyhanni/shaders/rounded_rectangle.fsh new file mode 100644 index 000000000000..062258d5ecc1 --- /dev/null +++ b/src/main/resources/assets/skyhanni/shaders/rounded_rectangle.fsh @@ -0,0 +1,26 @@ +#version 330 core + +uniform vec2 size; +uniform float radius; +uniform vec4 color; + +void main() { + vec2 position = gl_FragCoord.xy; + vec2 halfSize = size * 0.5; + + // Calculate distance to the closest point on the rectangle + vec2 dist = abs(position - halfSize); + + // Calculate distance to the closest point on the rounded corners + float cornerDistance = max(dist.x - halfSize.x + radius, dist.y - halfSize.y + radius); + + // Use smoothstep to create a smooth transition between the rectangle and the rounded corners + float smoothStep = 1.0 - smoothstep(0.0, radius, cornerDistance); + + // Use smoothstep to create a smooth transition between the rounded corners and the interior of the rectangle + float insideSmoothStep = smoothstep(radius, 0.0, cornerDistance); + + // Combine the results to get the final color + vec4 finalColor = mix(color, vec4(0.0, 0.0, 0.0, 0.0), smoothStep); + gl_FragColor = mix(finalColor, color, insideSmoothStep); +} From f4401e8f79a822ad5a256827c05c0a3f98c1f75b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 26 Nov 2023 13:08:28 +0100 Subject: [PATCH 115/225] Tried rounded rectangles with shaders --- .../misc/customscoreboard/CustomScoreboard.kt | 11 ++++-- .../RoundedRectangleShader.kt | 38 +++++++++++++++++++ .../skyhanni/utils/shader/ShaderHelper.kt | 18 +++++++++ .../skyhanni/utils/shader/Uniform.kt | 10 +++++ .../skyhanni/shaders/rounded_rectangle.fsh | 37 +++++++++--------- .../skyhanni/shaders/rounded_rectangle.vsh | 12 ++++++ 6 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 src/main/resources/assets/skyhanni/shaders/rounded_rectangle.vsh diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index ba2dc49b5e52..4eb459f56ac5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -61,7 +61,7 @@ class CustomScoreboard { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!isCustomScoreboardEnabled()) return - if (display.isEmpty()) return + val display = display ?: return val position = config.position val border = 5 @@ -88,8 +88,13 @@ class CustomScoreboard { position.isCenter ) ) - /*if (config.backgroundConfig.enabled) { + ShaderManager.enableShader("rounded_rectangle") + } else { + ShaderManager.disableShader() + }*/ + + if (config.backgroundConfig.enabled) { Gui.drawRect( x - border, y - border, @@ -97,7 +102,7 @@ class CustomScoreboard { y + elementHeight + border * 2, SpecialColour.specialToChromaRGB(config.backgroundConfig.color) ) - }*/ + } position.renderStrings(display, posLabel = "Custom Scoreboard") } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt index 9ffaa887992c..b7e77716a688 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt @@ -1,6 +1,16 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize +import at.hannibal2.skyhanni.utils.SpecialColour import at.hannibal2.skyhanni.utils.shader.Shader +import at.hannibal2.skyhanni.utils.shader.Uniform +import net.minecraft.client.Minecraft +import net.minecraft.client.gui.ScaledResolution +/* + DOES NOT WORK + */ +private val config get() = SkyHanniMod.feature.gui.customScoreboard object RoundedRectangleShader : Shader("rounded_rectangle", "rounded_rectangle") { @@ -8,6 +18,34 @@ object RoundedRectangleShader : Shader("rounded_rectangle", "rounded_rectangle") get() = this override fun registerUniforms() { + val size = config.position.getDummySize() + val screenWidth = ScaledResolution(Minecraft.getMinecraft()).scaledWidth + val screenHeight = ScaledResolution(Minecraft.getMinecraft()).scaledHeight + val border = 5 + registerUniform(Uniform.UniformType.VEC2, "v_texCoord") { + floatArrayOf(((size.x - border) / screenWidth).toFloat(), ((size.y - border) / screenHeight).toFloat()) + } + registerUniform(Uniform.UniformType.FLOAT, "width") { + ((size.x + border * 2) / screenWidth).toFloat() + } + + registerUniform(Uniform.UniformType.FLOAT, "height") { + ((size.y + border * 2) / screenHeight).toFloat() + } + + registerUniform(Uniform.UniformType.FLOAT, "roundness") { + 0.05f + } + + registerUniform(Uniform.UniformType.VEC4, "color") { + val color: Int = SpecialColour.specialToChromaRGB(config.backgroundConfig.color) + floatArrayOf( + ((color shr 16 and 255) / 255.0f), + ((color shr 8 and 255) / 255.0f), + ((color and 255) / 255.0f), + ((color shr 24 and 255) / 255.0f) + ) + } } } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt index 2576b42489ce..fca6c10134fd 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt @@ -135,6 +135,14 @@ class ShaderHelper { if (USING_ARB_SHADERS) ARBShaderObjects.glUniform1fARB(location, v0) else GL20.glUniform1f(location, v0) } + fun glUniform2f(uniformID: Int, fl: Float, fl1: Float) { + if (USING_ARB_SHADERS) ARBShaderObjects.glUniform2fARB(uniformID, fl, fl1) else GL20.glUniform2f( + uniformID, + fl, + fl1 + ) + } + fun glUniform3f(location: Int, v0: Float, v1: Float, v2: Float) { if (USING_ARB_SHADERS) ARBShaderObjects.glUniform3fARB(location, v0, v1, v2) else GL20.glUniform3f( location, @@ -144,6 +152,16 @@ class ShaderHelper { ) } + fun glUniform4f(location: Int, v0: Float, v1: Float, v2: Float, v3: Float) { + if (USING_ARB_SHADERS) ARBShaderObjects.glUniform4fARB(location, v0, v1, v2, v3) else GL20.glUniform4f( + location, + v0, + v1, + v2, + v3 + ) + } + fun glGetUniformLocation(program: Int, name: CharSequence): Int { return if (USING_ARB_SHADERS) ARBShaderObjects.glGetUniformLocationARB( program, diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt index d57398ea447b..a850f146f973 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt @@ -20,7 +20,9 @@ class Uniform( class UniformType { companion object { val FLOAT: UniformType = UniformType() + val VEC2: UniformType = UniformType() val VEC3: UniformType = UniformType() + val VEC4: UniformType = UniformType() val BOOL: UniformType = UniformType() } } @@ -33,10 +35,18 @@ class Uniform( if (!Objects.deepEquals(previousUniformValue, newUniformValue)) { when (uniformType) { UniformType.FLOAT -> ShaderHelper.glUniform1f(uniformID, (newUniformValue as Float)) + UniformType.VEC2 -> { + val values = newUniformValue as FloatArray + ShaderHelper.glUniform2f(uniformID, values[0], values[1]) + } UniformType.VEC3 -> { val values = newUniformValue as FloatArray ShaderHelper.glUniform3f(uniformID, values[0], values[1], values[2]) } + UniformType.VEC4 -> { + val values = newUniformValue as FloatArray + ShaderHelper.glUniform4f(uniformID, values[0], values[1], values[2], values[3]) + } UniformType.BOOL -> ShaderHelper.glUniform1f(uniformID, if (newUniformValue as Boolean) 1f else 0f) } diff --git a/src/main/resources/assets/skyhanni/shaders/rounded_rectangle.fsh b/src/main/resources/assets/skyhanni/shaders/rounded_rectangle.fsh index 062258d5ecc1..d05ab3cc37ca 100644 --- a/src/main/resources/assets/skyhanni/shaders/rounded_rectangle.fsh +++ b/src/main/resources/assets/skyhanni/shaders/rounded_rectangle.fsh @@ -1,26 +1,25 @@ -#version 330 core +precision mediump float; -uniform vec2 size; -uniform float radius; -uniform vec4 color; - -void main() { - vec2 position = gl_FragCoord.xy; - vec2 halfSize = size * 0.5; +varying vec2 v_texCoord; - // Calculate distance to the closest point on the rectangle - vec2 dist = abs(position - halfSize); +uniform float width; +uniform float height; +uniform float roundness; +uniform vec4 color; - // Calculate distance to the closest point on the rounded corners - float cornerDistance = max(dist.x - halfSize.x + radius, dist.y - halfSize.y + radius); +void main() +{ + // Calculate the distance from the center of the rectangle + vec2 center = vec2(width, height) * 0.5; + vec2 distance = abs(v_texCoord - center); - // Use smoothstep to create a smooth transition between the rectangle and the rounded corners - float smoothStep = 1.0 - smoothstep(0.0, radius, cornerDistance); + // Calculate the distance from the center to the corner of the rounded rectangle + float cornerRadius = min(roundness, min(width, height) * 0.5); + vec2 roundedDistance = max(distance - vec2(width, height) * 0.5 + cornerRadius, vec2(0.0)); - // Use smoothstep to create a smooth transition between the rounded corners and the interior of the rectangle - float insideSmoothStep = smoothstep(radius, 0.0, cornerDistance); + // Calculate the alpha value based on the distance from the center and the corner radius + float alpha = smoothstep(cornerRadius, cornerRadius + 0.01, length(roundedDistance)); - // Combine the results to get the final color - vec4 finalColor = mix(color, vec4(0.0, 0.0, 0.0, 0.0), smoothStep); - gl_FragColor = mix(finalColor, color, insideSmoothStep); + // Output the final color with alpha blending + gl_FragColor = vec4(color.rgb, color.a * alpha); } diff --git a/src/main/resources/assets/skyhanni/shaders/rounded_rectangle.vsh b/src/main/resources/assets/skyhanni/shaders/rounded_rectangle.vsh new file mode 100644 index 000000000000..b865faff62e6 --- /dev/null +++ b/src/main/resources/assets/skyhanni/shaders/rounded_rectangle.vsh @@ -0,0 +1,12 @@ +attribute vec4 position; +attribute vec2 texCoord; + +uniform mat4 modelViewProjection; + +varying vec2 v_texCoord; + +void main() +{ + gl_Position = modelViewProjection * position; + v_texCoord = texCoord; +} From 75bb4832ca7058fd7cc27754ebba7e92f79185fb Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 26 Nov 2023 18:07:28 +0100 Subject: [PATCH 116/225] Ability to use a custom image as background --- .../customscoreboard/BackgroundConfig.java | 9 +++++ .../misc/customscoreboard/CustomScoreboard.kt | 38 ++++++++++++++----- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java index eb6fa8c459ba..24b4d429ba3d 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java @@ -23,4 +23,13 @@ public class BackgroundConfig { ) @ConfigEditorColour public String color = "0:102:0:0:0"; + + @Expose + @ConfigOption( + name = "Use Custom Background Image", + desc = "Put that image into a resource pack, using the path skyhanni/scoreboard.png." + ) + @ConfigEditorBoolean + @FeatureToggle + public boolean useCustomBackgroundImage = false; } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 4eb459f56ac5..e83e3928e00d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -11,7 +11,7 @@ // - quiver // - beacon power // - skyblock level -// - more bg options (round, blurr, outline), custom texturepack +// - more bg options (round, blurr, outline) // package at.hannibal2.skyhanni.features.misc.customscoreboard @@ -29,14 +29,16 @@ import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings import at.hannibal2.skyhanni.utils.SpecialColour -import at.hannibal2.skyhanni.utils.shader.ShaderManager import net.minecraft.client.Minecraft import net.minecraft.client.gui.Gui -import net.minecraft.client.gui.GuiScreen import net.minecraft.client.gui.ScaledResolution +import net.minecraft.util.ResourceLocation import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent +import net.minecraftforge.fml.client.config.GuiUtils import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import io.github.moulberry.notenoughupdates.util.Utils.drawTexturedRect +import org.lwjgl.opengl.GL11 private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList() @@ -94,14 +96,30 @@ class CustomScoreboard { ShaderManager.disableShader() }*/ + val textureLocation = ResourceLocation("skyhanni", "scoreboard.png") + if (config.backgroundConfig.enabled) { - Gui.drawRect( - x - border, - y - border, - x + elementWidth + border * 2, - y + elementHeight + border * 2, - SpecialColour.specialToChromaRGB(config.backgroundConfig.color) - ) + if (config.backgroundConfig.useCustomBackgroundImage){ + Minecraft.getMinecraft().textureManager.bindTexture(textureLocation) + + // Draw the texture at the desired position + //drawTexturedRect(x + width - 4, y, 4, HEIGHT, GL11.GL_NEAREST); + drawTexturedRect( + (x - border).toFloat(), + (y - border).toFloat(), + (elementWidth + border * 2).toFloat(), + (elementHeight + border * 2).toFloat(), + GL11.GL_NEAREST + ) + } else { + Gui.drawRect( + x - border, + y - border, + x + elementWidth + border * 2, + y + elementHeight + border * 2, + SpecialColour.specialToChromaRGB(config.backgroundConfig.color) + ) + } } position.renderStrings(display, posLabel = "Custom Scoreboard") From f5e309c6f5c7d8005f4d0fb0971f66ab1853b900 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 26 Nov 2023 21:16:51 +0100 Subject: [PATCH 117/225] added funny rare texture when custom img bg is enabled --- .../misc/customscoreboard/CustomScoreboard.kt | 49 +++++++++++++----- .../skyhanni/rareScoreboardBackground.png | Bin 0 -> 168412 bytes 2 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/assets/skyhanni/rareScoreboardBackground.png diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index e83e3928e00d..e226e71e5b0d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -35,10 +35,10 @@ import net.minecraft.client.gui.ScaledResolution import net.minecraft.util.ResourceLocation import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent -import net.minecraftforge.fml.client.config.GuiUtils import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import io.github.moulberry.notenoughupdates.util.Utils.drawTexturedRect import org.lwjgl.opengl.GL11 +import kotlin.math.pow private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList() @@ -57,6 +57,7 @@ var heat = "0" var mithrilPowder = "0" var gemstonePowder = "0" var partyCount = 0 +var cooldown = 0 class CustomScoreboard { @@ -97,13 +98,26 @@ class CustomScoreboard { }*/ val textureLocation = ResourceLocation("skyhanni", "scoreboard.png") + val rareTextureLocation = ResourceLocation("skyhanni", "rareScoreboardBackground.png") - if (config.backgroundConfig.enabled) { - if (config.backgroundConfig.useCustomBackgroundImage){ - Minecraft.getMinecraft().textureManager.bindTexture(textureLocation) + if (config.backgroundConfig.enabled && config.backgroundConfig.useCustomBackgroundImage) { + if (cooldown > 0) { + cooldown-- + + // Display rare texture during cooldown + Minecraft.getMinecraft().textureManager.bindTexture(rareTextureLocation) + drawTexturedRect( + (x - border).toFloat(), + (y - border).toFloat(), + (elementWidth + border * 3).toFloat(), + (elementHeight + border * 3).toFloat(), + GL11.GL_NEAREST + ) + } else if (Math.random() < 1 / (1 - (1 / 86400.0).pow(1 / 20.0))) { + // Randomly switch to rare texture with a 1 in 86400 chance (once per day) + Minecraft.getMinecraft().textureManager.bindTexture(rareTextureLocation) + cooldown = 200 - // Draw the texture at the desired position - //drawTexturedRect(x + width - 4, y, 4, HEIGHT, GL11.GL_NEAREST); drawTexturedRect( (x - border).toFloat(), (y - border).toFloat(), @@ -112,14 +126,25 @@ class CustomScoreboard { GL11.GL_NEAREST ) } else { - Gui.drawRect( - x - border, - y - border, - x + elementWidth + border * 2, - y + elementHeight + border * 2, - SpecialColour.specialToChromaRGB(config.backgroundConfig.color) + // Draw the default texture + Minecraft.getMinecraft().textureManager.bindTexture(textureLocation) + drawTexturedRect( + (x - border).toFloat(), + (y - border).toFloat(), + (elementWidth + border * 3).toFloat(), + (elementHeight + border * 3).toFloat(), + GL11.GL_NEAREST ) } + } else if (config.backgroundConfig.enabled) { + // Draw a solid background with a specified color + Gui.drawRect( + x - border, + y - border, + x + elementWidth + border * 2, + y + elementHeight + border * 2, + SpecialColour.specialToChromaRGB(config.backgroundConfig.color) + ) } position.renderStrings(display, posLabel = "Custom Scoreboard") diff --git a/src/main/resources/assets/skyhanni/rareScoreboardBackground.png b/src/main/resources/assets/skyhanni/rareScoreboardBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..be62760b5ec245beecabc929d7d6eb7bb139f254 GIT binary patch literal 168412 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

_^y&@m;FwF4@b_{|E^zSix*@UtL!3)i4zq_ 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 (o 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

#HhW!+1z(IZLZ{`N=b|g|DRlJ;Kzs3 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�%faORee`bR+ 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 literal 0 HcmV?d00001 From 0947945ed43cadc4c136bed74626f87859d6fdd5 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 26 Nov 2023 21:36:18 +0100 Subject: [PATCH 118/225] Fixed kuudra island detection --- src/main/java/at/hannibal2/skyhanni/data/IslandType.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt b/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt index 3ab2130255e9..0863bbfe3ab0 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt @@ -5,7 +5,7 @@ enum class IslandType(val displayName: String, val apiName: String = "null") { PRIVATE_ISLAND("Private Island"), PRIVATE_ISLAND_GUEST("Private Island Guest"), THE_END("The End"), - KUUDRA_ARENA("Instanced"), + KUUDRA_ARENA("Kuudra"), CRIMSON_ISLE("Crimson Isle"), DWARVEN_MINES("Dwarven Mines"), DUNGEON_HUB("Dungeon Hub", "dungeon_hub"), From fb243c9cbdbbe3b7706df4e7d30e29f8694b324f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 26 Nov 2023 22:19:59 +0100 Subject: [PATCH 119/225] Fixed secret bg always being shown --- .../skyhanni/features/misc/customscoreboard/CustomScoreboard.kt | 2 +- .../features/misc/customscoreboard/RoundedRectangleShader.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index e226e71e5b0d..7a7a8b951920 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -113,7 +113,7 @@ class CustomScoreboard { (elementHeight + border * 3).toFloat(), GL11.GL_NEAREST ) - } else if (Math.random() < 1 / (1 - (1 / 86400.0).pow(1 / 20.0))) { + } else if (Math.random() * 86400.0 * 20 == 1.0) { // Randomly switch to rare texture with a 1 in 86400 chance (once per day) Minecraft.getMinecraft().textureManager.bindTexture(rareTextureLocation) cooldown = 200 diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt index b7e77716a688..372b5eb89438 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RoundedRectangleShader.kt @@ -8,7 +8,7 @@ import at.hannibal2.skyhanni.utils.shader.Uniform import net.minecraft.client.Minecraft import net.minecraft.client.gui.ScaledResolution /* - DOES NOT WORK + DOES NOT WORK, maybe someone can fix the rendering because I have no idea what the heck is going on ~ J10a1n15 */ private val config get() = SkyHanniMod.feature.gui.customScoreboard From f92c4408e0ad149fefeb00b9d02a46a01a9ed3ab Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 26 Nov 2023 22:30:12 +0100 Subject: [PATCH 120/225] Cleanup --- .../misc/customscoreboard/CustomScoreboard.kt | 80 +------------- .../misc/customscoreboard/RenderBackground.kt | 102 ++++++++++++++++++ 2 files changed, 103 insertions(+), 79 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 7a7a8b951920..c7612c0e23a2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -66,86 +66,8 @@ class CustomScoreboard { if (!isCustomScoreboardEnabled()) return val display = display ?: return val position = config.position - val border = 5 - val x = position.getAbsX() - val y = position.getAbsY() - - val elementWidth = position.getDummySize().x - val elementHeight = position.getDummySize().y - - val scaledWidth = ScaledResolution(Minecraft.getMinecraft()).scaledWidth - val scaledHeight = ScaledResolution(Minecraft.getMinecraft()).scaledHeight - - position.set( - Position( - when (config.displayConfig.alignRight) { - true -> scaledWidth - elementWidth - (border * 2) - false -> x - }, - when (config.displayConfig.alignCenterVertically) { - true -> scaledHeight / 2 - elementHeight / 2 - false -> y - }, - position.getScale(), - position.isCenter - ) - ) - /*if (config.backgroundConfig.enabled) { - ShaderManager.enableShader("rounded_rectangle") - } else { - ShaderManager.disableShader() - }*/ - - val textureLocation = ResourceLocation("skyhanni", "scoreboard.png") - val rareTextureLocation = ResourceLocation("skyhanni", "rareScoreboardBackground.png") - - if (config.backgroundConfig.enabled && config.backgroundConfig.useCustomBackgroundImage) { - if (cooldown > 0) { - cooldown-- - - // Display rare texture during cooldown - Minecraft.getMinecraft().textureManager.bindTexture(rareTextureLocation) - drawTexturedRect( - (x - border).toFloat(), - (y - border).toFloat(), - (elementWidth + border * 3).toFloat(), - (elementHeight + border * 3).toFloat(), - GL11.GL_NEAREST - ) - } else if (Math.random() * 86400.0 * 20 == 1.0) { - // Randomly switch to rare texture with a 1 in 86400 chance (once per day) - Minecraft.getMinecraft().textureManager.bindTexture(rareTextureLocation) - cooldown = 200 - - drawTexturedRect( - (x - border).toFloat(), - (y - border).toFloat(), - (elementWidth + border * 2).toFloat(), - (elementHeight + border * 2).toFloat(), - GL11.GL_NEAREST - ) - } else { - // Draw the default texture - Minecraft.getMinecraft().textureManager.bindTexture(textureLocation) - drawTexturedRect( - (x - border).toFloat(), - (y - border).toFloat(), - (elementWidth + border * 3).toFloat(), - (elementHeight + border * 3).toFloat(), - GL11.GL_NEAREST - ) - } - } else if (config.backgroundConfig.enabled) { - // Draw a solid background with a specified color - Gui.drawRect( - x - border, - y - border, - x + elementWidth + border * 2, - y + elementHeight + border * 2, - SpecialColour.specialToChromaRGB(config.backgroundConfig.color) - ) - } + RenderBackground().renderBackground() position.renderStrings(display, posLabel = "Custom Scoreboard") } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt new file mode 100644 index 000000000000..f3071bc447b6 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -0,0 +1,102 @@ +package at.hannibal2.skyhanni.features.misc.customscoreboard + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.config.core.config.Position +import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsX +import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY +import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize +import at.hannibal2.skyhanni.utils.SpecialColour +import io.github.moulberry.notenoughupdates.util.Utils +import net.minecraft.client.Minecraft +import net.minecraft.client.gui.Gui +import net.minecraft.client.gui.ScaledResolution +import net.minecraft.util.ResourceLocation +import org.lwjgl.opengl.GL11 + +private val config get() = SkyHanniMod.feature.gui.customScoreboard + +class RenderBackground { + fun renderBackground(){ + val position = config.position + val border = 5 + + val x = position.getAbsX() + val y = position.getAbsY() + + val elementWidth = position.getDummySize().x + val elementHeight = position.getDummySize().y + + val scaledWidth = ScaledResolution(Minecraft.getMinecraft()).scaledWidth + val scaledHeight = ScaledResolution(Minecraft.getMinecraft()).scaledHeight + + position.set( + Position( + when (config.displayConfig.alignRight) { + true -> scaledWidth - elementWidth - (border * 2) + false -> x + }, + when (config.displayConfig.alignCenterVertically) { + true -> scaledHeight / 2 - elementHeight / 2 + false -> y + }, + position.getScale(), + position.isCenter + ) + ) + /*if (config.backgroundConfig.enabled) { + ShaderManager.enableShader("rounded_rectangle") + } else { + ShaderManager.disableShader() + }*/ + + val textureLocation = ResourceLocation("skyhanni", "scoreboard.png") + val rareTextureLocation = ResourceLocation("skyhanni", "rareScoreboardBackground.png") + + if (config.backgroundConfig.enabled && config.backgroundConfig.useCustomBackgroundImage) { + if (cooldown > 0) { + cooldown-- + + // Display rare texture during cooldown + Minecraft.getMinecraft().textureManager.bindTexture(rareTextureLocation) + Utils.drawTexturedRect( + (x - border).toFloat(), + (y - border).toFloat(), + (elementWidth + border * 3).toFloat(), + (elementHeight + border * 3).toFloat(), + GL11.GL_NEAREST + ) + } else if (Math.random() * 86400.0 * 20 == 1.0) { + // Randomly switch to rare texture with a 1 in 86400 chance (once per day) + Minecraft.getMinecraft().textureManager.bindTexture(rareTextureLocation) + cooldown = 200 + + Utils.drawTexturedRect( + (x - border).toFloat(), + (y - border).toFloat(), + (elementWidth + border * 2).toFloat(), + (elementHeight + border * 2).toFloat(), + GL11.GL_NEAREST + ) + } else { + // Draw the default texture + Minecraft.getMinecraft().textureManager.bindTexture(textureLocation) + Utils.drawTexturedRect( + (x - border).toFloat(), + (y - border).toFloat(), + (elementWidth + border * 3).toFloat(), + (elementHeight + border * 3).toFloat(), + GL11.GL_NEAREST + ) + } + } else if (config.backgroundConfig.enabled) { + // Draw a solid background with a specified color + Gui.drawRect( + x - border, + y - border, + x + elementWidth + border * 2, + y + elementHeight + border * 2, + SpecialColour.specialToChromaRGB(config.backgroundConfig.color) + ) + } + } +} From 21c3540b9a12c23067666d80f0748f204117a7a0 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 26 Nov 2023 22:34:57 +0100 Subject: [PATCH 121/225] Fixed draggable list design --- .../features/gui/customscoreboard/CustomScoreboardConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index 47e375121977..28d099c8fbb4 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -53,9 +53,9 @@ public class CustomScoreboardConfig { "§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills", "", "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234", - "§7Wide Range of Events\n(too much for this here)", + "§7Wide Range of Events\n§7(too much for this here)", "§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff", - "§9§lParty (4):\n §7- §fhannibal2\n §7- §f Moulberry\n §7- §f Vahvl\n §7- §f J10a1n15", + "§9§lParty (4):\n §7- §fhannibal2\n §7- §fMoulberry\n §7- §fVahvl\n §7- §fJ10a1n15", "§ewww.hypixel.net", } ) From 0c282988fcad25bd6ccd93385dcb052b03dc1461 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 27 Nov 2023 15:23:01 +0100 Subject: [PATCH 122/225] Maybe fixed dungeon teammate event --- .../skyhanni/features/misc/customscoreboard/Events.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 21213997d3a7..486a5f8a2d46 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -57,12 +57,10 @@ enum class Events(private val displayLine: Supplier>, private val s .trim().removePrefix("§r§b§lParty §r§f(").removeSuffix(")").toInt() if (dungeonPlayers != 0 && list.any { it.startsWith("Cleared: ") }) { - list += "" - if (dungeonPlayers == 1) { list += "§3§lSolo" } else { - for (i in 2..dungeonPlayers) { + for (i in 1..dungeonPlayers) { list += ScoreboardData.sidebarLinesFormatted.nextAfter( "§r" + list.first { it.startsWith("Cleared: ") }.replace("%§", "%"), i From 31a75210c49c031da669fdec9cacfdbfcb60597d Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 27 Nov 2023 18:48:46 +0100 Subject: [PATCH 123/225] Fixed image getting colored weird (ty nea!) --- .../features/misc/customscoreboard/RenderBackground.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index f3071bc447b6..a8cfaf1dfc3a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -10,6 +10,7 @@ import io.github.moulberry.notenoughupdates.util.Utils import net.minecraft.client.Minecraft import net.minecraft.client.gui.Gui import net.minecraft.client.gui.ScaledResolution +import net.minecraft.client.renderer.GlStateManager import net.minecraft.util.ResourceLocation import org.lwjgl.opengl.GL11 @@ -52,6 +53,8 @@ class RenderBackground { val textureLocation = ResourceLocation("skyhanni", "scoreboard.png") val rareTextureLocation = ResourceLocation("skyhanni", "rareScoreboardBackground.png") + GlStateManager.color(1f,1f,1f, 1f) + if (config.backgroundConfig.enabled && config.backgroundConfig.useCustomBackgroundImage) { if (cooldown > 0) { cooldown-- From b7a035ff31773413df810919582f4a5c50de2b68 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 27 Nov 2023 18:56:44 +0100 Subject: [PATCH 124/225] Now using new pest scoreboard location thing --- .../skyhanni/features/misc/customscoreboard/Elements.kt | 3 ++- .../java/at/hannibal2/skyhanni/mixins/hooks/GuiIngameHook.kt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index ba367867a6c2..bf77eff977d2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -8,6 +8,7 @@ import at.hannibal2.skyhanni.data.MayorElection import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI +import at.hannibal2.skyhanni.mixins.hooks.replaceString import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase @@ -145,7 +146,7 @@ enum class Elements( ), LOCATION( { - listOf(location) + listOf(replaceString(location) ?: "") }, { true diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/hooks/GuiIngameHook.kt b/src/main/java/at/hannibal2/skyhanni/mixins/hooks/GuiIngameHook.kt index 4785c0da2ea8..4e61bc9d8d76 100644 --- a/src/main/java/at/hannibal2/skyhanni/mixins/hooks/GuiIngameHook.kt +++ b/src/main/java/at/hannibal2/skyhanni/mixins/hooks/GuiIngameHook.kt @@ -21,7 +21,7 @@ fun drawString( instance.drawString(it, x, y, color) } ?: 0 -private fun replaceString(text: String): String? { +fun replaceString(text: String): String? { if (SkyHanniMod.feature.misc.hideScoreboardNumbers && text.startsWith("§c") && text.length <= 4) { return null } From 21e4436910d93ac4ff113f61e0badf338d16a604 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 28 Nov 2023 14:44:39 +0100 Subject: [PATCH 125/225] Moved some things to a better location --- .../misc/customscoreboard/CustomScoreboard.kt | 15 --------------- .../features/misc/customscoreboard/Elements.kt | 14 ++++++++++++++ .../misc/customscoreboard/RenderBackground.kt | 1 + 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index c7612c0e23a2..211379732dbb 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -44,21 +44,6 @@ private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList() private var cache = emptyList>() -// Stats / Numbers -var purse = "0" -var motes = "0" -var bank = "0" -var bits = "0" -var copper = "0" -var gems = "0" -var location = "None" -var lobbyCode = "None" -var heat = "0" -var mithrilPowder = "0" -var gemstonePowder = "0" -var partyCount = 0 -var cooldown = 0 - class CustomScoreboard { @SubscribeEvent diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index bf77eff977d2..bc8a5e925722 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -18,6 +18,20 @@ import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard +// Stats / Numbers +var purse = "0" +var motes = "0" +var bank = "0" +var bits = "0" +var copper = "0" +var gems = "0" +var location = "None" +var lobbyCode = "None" +var heat = "0" +var mithrilPowder = "0" +var gemstonePowder = "0" +var partyCount = 0 + enum class Elements( private val displayLine: Supplier>, private val showWhen: () -> Boolean, diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index a8cfaf1dfc3a..1ff4c9177a56 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -15,6 +15,7 @@ import net.minecraft.util.ResourceLocation import org.lwjgl.opengl.GL11 private val config get() = SkyHanniMod.feature.gui.customScoreboard +private var cooldown = 0 class RenderBackground { fun renderBackground(){ From 99f78be7af2c2816f535d9a1ebe7b8ce3d58d1cf Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 28 Nov 2023 14:45:26 +0100 Subject: [PATCH 126/225] Maybe fixed a bug that happens on start up --- .../skyhanni/features/misc/customscoreboard/CustomScoreboard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 211379732dbb..11465e4d2aa5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -49,7 +49,7 @@ class CustomScoreboard { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!isCustomScoreboardEnabled()) return - val display = display ?: return + if (display.isEmpty()) return val position = config.position RenderBackground().renderBackground() From 61568eb45f19bb8eacab14d4f12b1fd2acdda83b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 28 Nov 2023 17:13:15 +0100 Subject: [PATCH 127/225] Candy now is 0 lines; changed Event NONE --- .../features/misc/customscoreboard/Events.kt | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 486a5f8a2d46..2dcc5cfbc812 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -12,17 +12,6 @@ import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard enum class Events(private val displayLine: Supplier>, private val showWhen: () -> Boolean) { - NONE( // maybe use default state tablist: "Events: smth" idk - { - when { - config.informationFilteringConfig.hideEmptyLines -> listOf("") - else -> listOf("§cNo Event") - } - }, - { - false - } - ), SERVER_CLOSE( { listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§cServer closing: ") }) @@ -79,7 +68,7 @@ enum class Events(private val displayLine: Supplier>, private val s IslandType.CATACOMBS.isInIsland() || inDungeons } ), - KUUDRA( // I really need more kuudra scoreboard data, I dont play kuudra + KUUDRA( { val list = mutableListOf() @@ -98,17 +87,17 @@ enum class Events(private val displayLine: Supplier>, private val s list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Time Elapsed: ") } } list += "" - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§f§lWave: §c§l")}){ + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§f§lWave: §c§l") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§f§lWave: §c§l") } } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§fTokens: ")}){ + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§fTokens: ") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§fTokens: ") } } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Submerges In: §e")}){ + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Submerges In: §e") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Submerges In: §e") } } list += "" - if (ScoreboardData.sidebarLinesFormatted.any { it == "§fObjective:"}){ + if (ScoreboardData.sidebarLinesFormatted.any { it == "§fObjective:" }) { list += "§fObjective:" list += ScoreboardData.sidebarLinesFormatted.nextAfter("§fObjective:") ?: "§cNo Objective" } @@ -155,26 +144,27 @@ enum class Events(private val displayLine: Supplier>, private val s { val list = mutableListOf() - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("North Stars: §d")}){ + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("North Stars: §d") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("North Stars: §d") } } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event Start: §a")}){ + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event Start: §a") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Event Start: §a") } } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Next Wave: §a")}){ + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Next Wave: §a") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Next Wave: §a") } } list += "" - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§cWave ")}){ + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§cWave ") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§cWave ") } } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Magma Cubes Left§c")}){ + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Magma Cubes Left§c") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Magma Cubes Left§c") } } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Total Damag §c")}){ - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Your Total Damag §c") }.replace("Damag", "Damage") + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Total Damag §c") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Your Total Damag §c") } + .replace("Damag", "Damage") } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Cube Damage§c")}){ + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Cube Damage§c") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Your Cube Damage§c") } } @@ -184,16 +174,18 @@ enum class Events(private val displayLine: Supplier>, private val s IslandType.WINTER.isInIsland() } ), - SPOOKY( // not tested + SPOOKY( { listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§6Spooky Festival§f") }) + // Time - (getTablistFooter().split("\n").first { it.startsWith("§r§r§7Your Candy:") }) // Candy + ("§r§r§7Your Candy: ") + + (getTablistFooter().split("\n").first { it.startsWith("§r§r§7Your Candy:") } + .removePrefix("§r§r§7Your Candy:") ?: "§cCandy not found") // Candy }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6Spooky Festival§f") } } ), - MARINA( // not tested, should work + MARINA( { listOf( "§bFishing Festival: " + TabListData.getTabList().nextAfter("§e§lEvent: §r§bFishing Festival") @@ -280,6 +272,17 @@ enum class Events(private val displayLine: Supplier>, private val s { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Essence: ") } } + ), + NONE( // maybe use default state tablist: "Events: smth" idk + { + when { + config.informationFilteringConfig.hideEmptyLines -> listOf("") + else -> listOf("§cNo Event") + } + }, + { + true + } ); fun getLines(): List { @@ -288,7 +291,7 @@ enum class Events(private val displayLine: Supplier>, private val s companion object { fun getFirstEvent(): Events { - return entries.firstOrNull { it.showWhen() } ?: NONE + return entries.first { it.showWhen() } } } } From c44aed2fb59e35801b3d698eb4e58df530118d5b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 28 Nov 2023 17:21:00 +0100 Subject: [PATCH 128/225] did ugly things in Events --- .../features/misc/customscoreboard/Events.kt | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 2dcc5cfbc812..c036dbb12bf6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -14,7 +14,7 @@ private val config get() = SkyHanniMod.feature.gui.customScoreboard enum class Events(private val displayLine: Supplier>, private val showWhen: () -> Boolean) { SERVER_CLOSE( { - listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§cServer closing: ") }) + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§cServer closing: ") } ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§cServer closing: ") } @@ -25,25 +25,25 @@ enum class Events(private val displayLine: Supplier>, private val s val list = mutableListOf() if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Auto-closing in:") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Auto-closing in:") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Auto-closing in:") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Starting in:") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Starting in:") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Starting in:") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Keys: ") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Keys: ") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Keys: ") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Time Elapsed: ") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Time Elapsed: ") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Time Elapsed: ") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§rCleared: ") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§rCleared: ") }.toString() + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§rCleared: ") }.toString() .replace("§r", "").replace("%", "%§") // for some reason this is broken } - val dungeonPlayers = TabListData.getTabList().first { it.trim().startsWith("§r§b§lParty §r§f(") } - .trim().removePrefix("§r§b§lParty §r§f(").removeSuffix(")").toInt() + val dungeonPlayers = TabListData.getTabList().firstOrNull{ it.trim().startsWith("§r§b§lParty §r§f(") } + ?.trim()?.removePrefix("§r§b§lParty §r§f(")?.removeSuffix(")")?.toInt() ?: 1 if (dungeonPlayers != 0 && list.any { it.startsWith("Cleared: ") }) { if (dungeonPlayers == 1) { @@ -51,7 +51,7 @@ enum class Events(private val displayLine: Supplier>, private val s } else { for (i in 1..dungeonPlayers) { list += ScoreboardData.sidebarLinesFormatted.nextAfter( - "§r" + list.first { it.startsWith("Cleared: ") }.replace("%§", "%"), + "§r" + (list.firstOrNull{ it.startsWith("Cleared: ") }?.replace("%§", "%") ?: "§cNo Dungeon Data"), i ) ?: "§cNo Player found" @@ -73,28 +73,28 @@ enum class Events(private val displayLine: Supplier>, private val s val list = mutableListOf() if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Auto-closing in:") }) { - ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Auto-closing in:") } + ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Auto-closing in:") } } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Starting in:") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Starting in:") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Starting in:") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Instance ShutdowIn:") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Instance ShutdowIn:") } - .replace("Instance ShutdowIn:", "Instance Shutdown In:") // for some reason this is broken + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Instance ShutdowIn:") } + ?.replace("Instance ShutdowIn:", "Instance Shutdown In:") ?: ""// for some reason this is broken } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Time Elapsed: ") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Time Elapsed: ") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Time Elapsed: ") } ?: "" } list += "" if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§f§lWave: §c§l") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§f§lWave: §c§l") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§f§lWave: §c§l") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§fTokens: ") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§fTokens: ") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§fTokens: ") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Submerges In: §e") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Submerges In: §e") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Submerges In: §e") } ?: "" } list += "" if (ScoreboardData.sidebarLinesFormatted.any { it == "§fObjective:" }) { @@ -130,9 +130,9 @@ enum class Events(private val displayLine: Supplier>, private val s { val list = mutableListOf() - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§6§lGOLD §fmedals") } - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§f§lSILVER §fmedals") } - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§c§lBRONZE §fmedals") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§6§lGOLD §fmedals") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§f§lSILVER §fmedals") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§c§lBRONZE §fmedals") } ?: "" list }, @@ -145,27 +145,27 @@ enum class Events(private val displayLine: Supplier>, private val s val list = mutableListOf() if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("North Stars: §d") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("North Stars: §d") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("North Stars: §d") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event Start: §a") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Event Start: §a") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Event Start: §a") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Next Wave: §a") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Next Wave: §a") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Next Wave: §a") } ?: "" } list += "" if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§cWave ") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§cWave ") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§cWave ") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Magma Cubes Left§c") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Magma Cubes Left§c") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Magma Cubes Left§c") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Total Damag §c") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Your Total Damag §c") } - .replace("Damag", "Damage") + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Your Total Damag §c") } + ?.replace("Damag", "Damage") ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Cube Damage§c") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Your Cube Damage§c") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Your Cube Damage§c") } ?: "" } list @@ -176,10 +176,10 @@ enum class Events(private val displayLine: Supplier>, private val s ), SPOOKY( { - listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§6Spooky Festival§f") }) + // Time + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§6Spooky Festival§f") } ?: "") + // Time ("§r§r§7Your Candy: ") + - (getTablistFooter().split("\n").first { it.startsWith("§r§r§7Your Candy:") } - .removePrefix("§r§r§7Your Candy:") ?: "§cCandy not found") // Candy + (getTablistFooter().split("\n").firstOrNull{ it.startsWith("§r§r§7Your Candy:") } + ?.removePrefix("§r§r§7Your Candy:") ?: "§cCandy not found") // Candy }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6Spooky Festival§f") } @@ -200,7 +200,7 @@ enum class Events(private val displayLine: Supplier>, private val s ), NEW_YEAR( { - listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§dNew Year Event") }) + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§dNew Year Event") } ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§dNew Year Event") } @@ -208,7 +208,7 @@ enum class Events(private val displayLine: Supplier>, private val s ), ORINGO( { - listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("§aTraveling Zoo") }) + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§aTraveling Zoo") } ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§aTraveling Zoo") } @@ -236,15 +236,15 @@ enum class Events(private val displayLine: Supplier>, private val s // Better Together if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Nearby Players:") }) { list += "§9Better Together" - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Nearby Players:") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Nearby Players:") } ?: "" } // Zone Events if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event: ") }) { - list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Event: ") } - .removePrefix("Event: ") - list += "§fin " + ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Zone: ") } - .removePrefix("Zone: ") + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Event: ") } + ?.removePrefix("Event: ") ?: "" + list += "§fin " + (ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Zone: ") } + ?.removePrefix("Zone: ") ?: "" ) } if (list.size == 0) when (config.informationFilteringConfig.hideEmptyLines) { @@ -258,8 +258,8 @@ enum class Events(private val displayLine: Supplier>, private val s ), DAMAGE( { - listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Protector HP: §a") || it.startsWith("Dragon HP: §a") }) + - (ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Your Damage: §c") }) + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Protector HP: §a") || it.startsWith("Dragon HP: §a") } ?: "" ) + + (ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Your Damage: §c") } ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Damage: §c") } @@ -267,7 +267,7 @@ enum class Events(private val displayLine: Supplier>, private val s ), ESSENCE( { - listOf(ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Essence: ") }) + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Essence: ") } ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Essence: ") } From 195ff56a98bb0edd57ab52fad09e48c53c20e594 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 28 Nov 2023 18:51:53 +0100 Subject: [PATCH 129/225] Changed some config text --- .../features/gui/customscoreboard/CustomScoreboardConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index 28d099c8fbb4..c26cdf18c062 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -21,7 +21,7 @@ public class CustomScoreboardConfig { @Expose @ConfigOption( name = "Enabled", - desc = "Show a custom scoreboard instead of the default one." + desc = "Show a custom scoreboard instead of the vanilla one." ) @ConfigEditorBoolean @FeatureToggle @@ -30,7 +30,7 @@ public class CustomScoreboardConfig { @Expose @ConfigOption( name = "Text Format", - desc = "Drag text to change the appearance of the overlay." + desc = "Drag text to change the appearance of the scoreboard." ) @ConfigEditorDraggableList( exampleText = { From f05b1afbd6b2512ba15c417966f250c4cfc8204e Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 28 Nov 2023 19:37:04 +0100 Subject: [PATCH 130/225] Maybe fixed untransparent rendering of other elements --- .../skyhanni/features/misc/customscoreboard/RenderBackground.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index 1ff4c9177a56..cc6b03cf857e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -102,5 +102,7 @@ class RenderBackground { SpecialColour.specialToChromaRGB(config.backgroundConfig.color) ) } + + GlStateManager.resetColor() } } From 1e8dc7525b0b2d6e8e4529f511c1b727f98003f9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 28 Nov 2023 19:56:54 +0100 Subject: [PATCH 131/225] Maybe fixed untransparent rendering of other elements Part2 --- .../features/misc/customscoreboard/RenderBackground.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index cc6b03cf857e..daa885f150d7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -54,6 +54,10 @@ class RenderBackground { val textureLocation = ResourceLocation("skyhanni", "scoreboard.png") val rareTextureLocation = ResourceLocation("skyhanni", "rareScoreboardBackground.png") + // Save the current color state + GlStateManager.pushMatrix(); + GlStateManager.pushAttrib(); + GlStateManager.color(1f,1f,1f, 1f) if (config.backgroundConfig.enabled && config.backgroundConfig.useCustomBackgroundImage) { @@ -103,6 +107,8 @@ class RenderBackground { ) } - GlStateManager.resetColor() + // Restore the original color state + GlStateManager.popMatrix(); + GlStateManager.popAttrib(); } } From bc3344d662ca66c4add66f6fea54a8bef9c806ff Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:44:56 +0100 Subject: [PATCH 132/225] Removed rare texture, added default texture --- .../misc/customscoreboard/RenderBackground.kt | 51 +++++-------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index daa885f150d7..8c09dffa9b76 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -18,7 +18,7 @@ private val config get() = SkyHanniMod.feature.gui.customScoreboard private var cooldown = 0 class RenderBackground { - fun renderBackground(){ + fun renderBackground() { val position = config.position val border = 5 @@ -52,50 +52,23 @@ class RenderBackground { }*/ val textureLocation = ResourceLocation("skyhanni", "scoreboard.png") - val rareTextureLocation = ResourceLocation("skyhanni", "rareScoreboardBackground.png") // Save the current color state GlStateManager.pushMatrix(); GlStateManager.pushAttrib(); - GlStateManager.color(1f,1f,1f, 1f) + GlStateManager.color(1f, 1f, 1f, 1f) - if (config.backgroundConfig.enabled && config.backgroundConfig.useCustomBackgroundImage) { - if (cooldown > 0) { - cooldown-- - - // Display rare texture during cooldown - Minecraft.getMinecraft().textureManager.bindTexture(rareTextureLocation) - Utils.drawTexturedRect( - (x - border).toFloat(), - (y - border).toFloat(), - (elementWidth + border * 3).toFloat(), - (elementHeight + border * 3).toFloat(), - GL11.GL_NEAREST - ) - } else if (Math.random() * 86400.0 * 20 == 1.0) { - // Randomly switch to rare texture with a 1 in 86400 chance (once per day) - Minecraft.getMinecraft().textureManager.bindTexture(rareTextureLocation) - cooldown = 200 - - Utils.drawTexturedRect( - (x - border).toFloat(), - (y - border).toFloat(), - (elementWidth + border * 2).toFloat(), - (elementHeight + border * 2).toFloat(), - GL11.GL_NEAREST - ) - } else { - // Draw the default texture - Minecraft.getMinecraft().textureManager.bindTexture(textureLocation) - Utils.drawTexturedRect( - (x - border).toFloat(), - (y - border).toFloat(), - (elementWidth + border * 3).toFloat(), - (elementHeight + border * 3).toFloat(), - GL11.GL_NEAREST - ) - } + if (config.backgroundConfig.enabled) { + // Draw the default texture + Minecraft.getMinecraft().textureManager.bindTexture(textureLocation) + Utils.drawTexturedRect( + (x - border).toFloat(), + (y - border).toFloat(), + (elementWidth + border * 3).toFloat(), + (elementHeight + border * 3).toFloat(), + GL11.GL_NEAREST + ) } else if (config.backgroundConfig.enabled) { // Draw a solid background with a specified color Gui.drawRect( From c22e18ca4e132ac57238c111435947eaed5e5138 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:46:08 +0100 Subject: [PATCH 133/225] forgot that --- .../skyhanni/rareScoreboardBackground.png | Bin 168412 -> 0 bytes .../resources/assets/skyhanni/scoreboard.png | Bin 0 -> 65859 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/assets/skyhanni/rareScoreboardBackground.png create mode 100644 src/main/resources/assets/skyhanni/scoreboard.png diff --git a/src/main/resources/assets/skyhanni/rareScoreboardBackground.png b/src/main/resources/assets/skyhanni/rareScoreboardBackground.png deleted file mode 100644 index be62760b5ec245beecabc929d7d6eb7bb139f254..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168412 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

_^y&@m;FwF4@b_{|E^zSix*@UtL!3)i4zq_ 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 (o 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

#HhW!+1z(IZLZ{`N=b|g|DRlJ;Kzs3 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�%faORee`bR+ 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 diff --git a/src/main/resources/assets/skyhanni/scoreboard.png b/src/main/resources/assets/skyhanni/scoreboard.png new file mode 100644 index 0000000000000000000000000000000000000000..acd9d85863a2d5e8ab5ed61fb65351ce60529423 GIT binary patch literal 65859 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

uvRFjpwfH1`ULDJ(HeI`-5wGf> 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 Date: Tue, 28 Nov 2023 23:08:53 +0100 Subject: [PATCH 134/225] Fixed background things --- .../skyhanni/features/misc/customscoreboard/RenderBackground.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index 8c09dffa9b76..4b0b7b9b6862 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -59,7 +59,7 @@ class RenderBackground { GlStateManager.color(1f, 1f, 1f, 1f) - if (config.backgroundConfig.enabled) { + if (config.backgroundConfig.enabled && config.backgroundConfig.useCustomBackgroundImage) { // Draw the default texture Minecraft.getMinecraft().textureManager.bindTexture(textureLocation) Utils.drawTexturedRect( From c74d09fd523aa1ef7d3602b37dae81661c432a5e Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 09:21:23 +0100 Subject: [PATCH 135/225] Maybe fixed untransparent bg in guieditmanager --- .../skyhanni/features/misc/customscoreboard/RenderBackground.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index 4b0b7b9b6862..75402585f2bd 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -58,6 +58,7 @@ class RenderBackground { GlStateManager.pushAttrib(); GlStateManager.color(1f, 1f, 1f, 1f) + GlStateManager.enableDepth() if (config.backgroundConfig.enabled && config.backgroundConfig.useCustomBackgroundImage) { // Draw the default texture From e7ee17fe9411336f0c49d290b4a64a36dc9bc572 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 14:48:44 +0100 Subject: [PATCH 136/225] Added ingame time --- .../CustomScoreboardConfig.java | 3 +- .../misc/customscoreboard/Elements.kt | 33 ++++++++++++------- .../at/hannibal2/skyhanni/utils/TimeUtils.kt | 29 +++++++++------- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index c26cdf18c062..aba93ad19af4 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -46,6 +46,7 @@ public class CustomScoreboardConfig { "", "§7⏣ §bVillage", "Late Summer 11th", + "§710:40pm", "§8m77CK", "Power: Sighted", "", @@ -59,7 +60,7 @@ public class CustomScoreboardConfig { "§ewww.hypixel.net", } ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22)); + public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)); @Expose @ConfigOption(name = "Display Options", desc = "") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index bc8a5e925722..688a438d8c82 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -167,7 +167,7 @@ enum class Elements( }, 10 ), - SKYBLOCK_TIME( + SKYBLOCK_TIME_DAY( { listOf(SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false)) }, @@ -176,6 +176,15 @@ enum class Elements( }, 11 ), + SKYBLOCK_TIME_MINUTE( + { + listOf("§7" + SkyBlockTime.now().formatted(dayAndMonthElement = false, yearElement = false)) + }, + { + true + }, + 12 + ), LOBBY_CODE( { listOf("§8$lobbyCode") @@ -183,7 +192,7 @@ enum class Elements( { true }, - 12 + 13 ), MAXWELL( { @@ -199,7 +208,7 @@ enum class Elements( { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) }, - 13 + 14 ), EMPTY_LINE2( { @@ -208,7 +217,7 @@ enum class Elements( { true }, - 14 + 15 ), OBJECTIVE( { @@ -223,7 +232,7 @@ enum class Elements( { true }, - 15 + 16 ), SLAYER( { @@ -245,7 +254,7 @@ enum class Elements( at.hannibal2.skyhanni.data.IslandType.THE_RIFT ).contains(HypixelData.skyBlockIsland) }, - 16 + 17 ), EMPTY_LINE3( { @@ -254,7 +263,7 @@ enum class Elements( { true }, - 17 + 18 ), POWDER( { @@ -266,7 +275,7 @@ enum class Elements( { listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES).contains(HypixelData.skyBlockIsland) }, - 18 + 19 ), CURRENT_EVENT( { @@ -275,7 +284,7 @@ enum class Elements( { true }, - 19 + 20 ), MAYOR( { @@ -290,7 +299,7 @@ enum class Elements( { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) }, - 20 + 21 ), PARTY( { @@ -327,7 +336,7 @@ enum class Elements( } } }, - 21 + 22 ), WEBSITE( { @@ -336,7 +345,7 @@ enum class Elements( { true }, - 22 + 23 ); fun getLine(): List { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt index f92e9af36464..715df4dcebc7 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt @@ -123,24 +123,31 @@ object TimeUtils { }.toLong().toDuration(DurationUnit.MILLISECONDS) } - fun SkyBlockTime.formatted(yearElement: Boolean = true, hoursAndMinutesElement : Boolean = true): String { + fun SkyBlockTime.formatted( + dayAndMonthElement: Boolean = true, + yearElement: Boolean = true, + hoursAndMinutesElement: Boolean = true + ): String { val hour = if (this.hour > 12) this.hour - 12 else this.hour - val timeOfDay = if (this.hour > 11) "pm" else "am" // hooray for 12-hour clocks - var minute = this.minute.toString() - if (minute.length != 2) { - minute = minute.padStart(2, '0') - } - + val timeOfDay = if (this.hour > 11) "pm" else "am" + val minute = this.minute.toString().padStart(2, '0') val month = SkyBlockTime.monthName(this.month) val day = this.day val daySuffix = SkyBlockTime.daySuffix(day) val year = this.year - if (!hoursAndMinutesElement && !yearElement) return "$month $day$daySuffix" // Early Winter 1st - if (!hoursAndMinutesElement) return "$month $day$daySuffix, Year $year" // Early Winter 1st Year 300 - if (!yearElement) return "$month $day$daySuffix, $hour:${minute}$timeOfDay" // Early Winter 1st, 12:03pm + val datePart = when { + !dayAndMonthElement && !yearElement -> "" + !yearElement -> "$month $day$daySuffix" + else -> "$month $day$daySuffix, Year $year" + } + val timePart = if (hoursAndMinutesElement) "$hour:$minute$timeOfDay" else "" - return "$month $day$daySuffix, Year $year $hour:${minute}$timeOfDay" // Early Winter 1st Year 300, 12:03pm + return if (datePart.isNotEmpty() && timePart.isNotEmpty()) { + "$datePart, $timePart" + } else { + "$datePart$timePart".trim() + } } } From a92c925124e061f6bd7e9883d216134f971bf4fb Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 14:51:28 +0100 Subject: [PATCH 137/225] beta 4 update --- .../skyhanni/data/GardenCropMilestonesFix.kt | 159 ++++++++++++++++++ .../at/hannibal2/skyhanni/data/OtherMod.kt | 42 +++++ .../features/garden/GardenCommands.kt | 57 +++++++ .../misc/customscoreboard/DrawBackground.kt | 38 +++++ .../jsonobjects/AnitaUpgradeCostsJson.java | 18 ++ .../utils/jsonobjects/ArmorDropsJson.java | 19 +++ .../skyhanni/utils/jsonobjects/BingoJson.java | 19 +++ .../utils/jsonobjects/BingoRanksJson.java | 10 ++ .../jsonobjects/ContributorListJson.java | 10 ++ .../CrimsonIsleReputationJson.java | 34 ++++ .../DanceRoomInstructionsJson.java | 10 ++ .../utils/jsonobjects/DicerDropsJson.java | 31 ++++ .../jsonobjects/DisabledFeaturesJson.java | 10 ++ .../utils/jsonobjects/EnigmaSoulsJson.java | 20 +++ .../jsonobjects/FishingProfitItemsJson.java | 12 ++ .../utils/jsonobjects/FriendsJson.java | 24 +++ .../utils/jsonobjects/GardenJson.java | 58 +++++++ .../HideNotClickableItemsJson.java | 30 ++++ .../skyhanni/utils/jsonobjects/ItemsJson.java | 14 ++ .../utils/jsonobjects/JacobContestsJson.java | 13 ++ .../utils/jsonobjects/KnownFeaturesJson.java | 12 ++ .../utils/jsonobjects/LocationFixJson.java | 27 +++ .../skyhanni/utils/jsonobjects/MayorJson.java | 70 ++++++++ .../utils/jsonobjects/ModGuiSwitcherJson.java | 25 +++ .../utils/jsonobjects/MultiFilterJson.java | 25 +++ .../utils/jsonobjects/ParkourJson.java | 23 +++ .../jsonobjects/PlayerChatFilterJson.java | 10 ++ .../utils/jsonobjects/RiftEffigiesJson.java | 11 ++ .../skyhanni/utils/jsonobjects/SacksJson.java | 10 ++ .../utils/jsonobjects/SeaCreatureJson.java | 33 ++++ .../SlayerProfitTrackerItemsJson.java | 12 ++ .../utils/jsonobjects/TabListJson.java | 11 ++ .../utils/jsonobjects/TrophyFishJson.java | 25 +++ .../utils/jsonobjects/VipVisitsJson.java | 10 ++ .../skyhanni/utils/jsonobjects/WarpsJson.java | 10 ++ .../skyhanni/rareScoreboardBackground.png | Bin 0 -> 168412 bytes 36 files changed, 942 insertions(+) create mode 100644 src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/data/OtherMod.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/GardenCommands.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/DrawBackground.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/AnitaUpgradeCostsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ArmorDropsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoRanksJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/CrimsonIsleReputationJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DanceRoomInstructionsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DicerDropsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DisabledFeaturesJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/EnigmaSoulsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FriendsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/HideNotClickableItemsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ItemsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/JacobContestsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/KnownFeaturesJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/LocationFixJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ModGuiSwitcherJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MultiFilterJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ParkourJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/PlayerChatFilterJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/RiftEffigiesJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SacksJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SlayerProfitTrackerItemsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TabListJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/VipVisitsJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/WarpsJson.java create mode 100644 src/main/resources/assets/skyhanni/rareScoreboardBackground.png diff --git a/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt b/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt new file mode 100644 index 000000000000..cad8fdddf831 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt @@ -0,0 +1,159 @@ +package at.hannibal2.skyhanni.data + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.config.ConfigManager +import at.hannibal2.skyhanni.events.CropMilestoneUpdateEvent +import at.hannibal2.skyhanni.features.garden.CropType +import at.hannibal2.skyhanni.utils.ItemUtils.getLore +import at.hannibal2.skyhanni.utils.ItemUtils.name +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.editCopy +import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter +import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import at.hannibal2.skyhanni.utils.NumberUtil.formatNumber +import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimalIfNeeded +import at.hannibal2.skyhanni.utils.OSUtils +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.StringUtils.matches +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import kotlinx.coroutines.launch +import net.minecraft.item.ItemStack + +object GardenCropMilestonesFix { + private val pattern = ".*§e(?.*)§6/§e(?.*)".toPattern() + + fun openInventory(inventoryItems: Map) { + if (SkyHanniMod.feature.garden.copyMilestoneData) { + fixForWrongData(inventoryItems) + } + } + + private fun fixForWrongData(inventoryItems: Map) { + val data = mutableListOf() + for ((_, stack) in inventoryItems) { + val crop = GardenCropMilestones.getCropTypeByLore(stack) ?: continue + checkForWrongData(stack, crop, data) + + CropMilestoneUpdateEvent().postAndCatch() + } + + if (data.isNotEmpty()) { + LorenzUtils.chat( + "Found §c${data.size} §ewrong crop milestone steps in the menu! " + + "Correct data got put into clipboard. " + + "Please share it on the §bSkyHanni Discord §ein the channel §b#share-data§e." + ) + OSUtils.copyToClipboard("```${data.joinToString("\n")}```") +// } else { +// LorenzUtils.chat("No wrong crop milestone steps found!") + } + } + + private fun checkForWrongData( + stack: ItemStack, + crop: CropType, + wrongData: MutableList + ) { + val name = stack.name ?: return + val rawNumber = name.removeColor().replace(crop.cropName, "").trim() + val realTier = if (rawNumber == "") 0 else rawNumber.romanToDecimalIfNeeded() + + val lore = stack.getLore() + val next = lore.nextAfter({ GardenCropMilestones.totalPattern.matches(it) }, 3) ?: return + val total = lore.nextAfter({ GardenCropMilestones.totalPattern.matches(it) }, 6) ?: return + +// debug(" ") +// debug("crop: $crop") +// debug("realTier: $realTier") + + val guessNextMax = GardenCropMilestones.getCropsForTier( + realTier + 1, + crop + ) - GardenCropMilestones.getCropsForTier(realTier, crop) +// debug("guessNextMax: ${guessNextMax.addSeparators()}") + val nextMax = pattern.matchMatcher(next) { + group("max").formatNumber() + } ?: return +// debug("nextMax real: ${nextMax.addSeparators()}") + if (nextMax != guessNextMax) { +// debug("wrong, add to list") + wrongData.add("$crop:$realTier:${nextMax.addSeparators()}") + } + + val guessTotalMax = GardenCropMilestones.getCropsForTier(46, crop) +// println("guessTotalMax: ${guessTotalMax.addSeparators()}") + val totalMax = pattern.matchMatcher(total) { + group("max").formatNumber() + } ?: return +// println("totalMax real: ${totalMax.addSeparators()}") + val totalOffBy = guessTotalMax - totalMax +// debug("$crop total offf by: ${totalOffBy.addSeparators()}") + } + +// fun debug(message: String) { +// if (SkyHanniMod.feature.dev.debug.enabled) { +// println(message) +// } +// } + + /** + * This helps to fix wrong crop milestone data + * This command reads the clipboard content, + * in the format of users sending crop milestone step data. + * + * The new data will be compared to the currently saved data, + * differences are getting replaced, and the result gets put into the clipboard. + * The clipboard context can be used to update the repo content. + */ + fun readDataFromClipboard() { + SkyHanniMod.coroutineScope.launch { + OSUtils.readFromClipboard()?.let { + handleInput(it) + } + } + } + + private var totalFixedValues = 0 + + private fun handleInput(input: String) { + println(" ") + var fixed = 0 + var alreadyCorrect = 0 + for (line in input.lines()) { + val split = line.replace("```", "").replace(".", ",").split(":") + if (split.size != 3) continue + val (rawCrop, tier, amount) = split + val crop = LorenzUtils.enumValueOf(rawCrop) + + if (tryFix(crop, tier.toInt(), amount.formatNumber().toInt())) { + fixed++ + } else { + alreadyCorrect++ + } + } + totalFixedValues += fixed + LorenzUtils.chat("Fixed: $fixed/$alreadyCorrect, total fixes: $totalFixedValues") + val s = ConfigManager.gson.toJsonTree(GardenCropMilestones.cropMilestoneData).toString() + OSUtils.copyToClipboard("\"crop_milestones\":$s,") + } + + private fun tryFix(crop: CropType, tier: Int, amount: Int): Boolean { + val guessNextMax = GardenCropMilestones.getCropsForTier(tier + 1, crop) - GardenCropMilestones.getCropsForTier( + tier, + crop + ) + if (guessNextMax.toInt() == amount) { + return false + } + GardenCropMilestones.cropMilestoneData = GardenCropMilestones.cropMilestoneData.editCopy { + fix(crop, this, tier, amount) + } + return true + } + + private fun fix(crop: CropType, map: MutableMap>, tier: Int, amount: Int) { + map[crop] = map[crop]!!.editCopy { + this[tier] = amount + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/data/OtherMod.kt b/src/main/java/at/hannibal2/skyhanni/data/OtherMod.kt new file mode 100644 index 000000000000..391d669752c1 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/data/OtherMod.kt @@ -0,0 +1,42 @@ +package at.hannibal2.skyhanni.data + +import at.hannibal2.skyhanni.config.ConfigManager +import com.google.gson.JsonObject +import java.io.BufferedReader + +enum class OtherMod(val modName: String, val configPath: String, val readKey: (BufferedReader) -> (String)) { + NEU("Not Enough Updates", "config/notenoughupdates/configNew.json", { reader -> + getJson(reader)["apiData"].asJsonObject["apiKey"].asString + }), + COW("Cowlection", "config/cowlection/do-not-share-me-with-other-players.cfg", { reader -> + val lines = reader.readText().split(System.lineSeparator()) + val line = lines.find { it.startsWith(" S:moo=") }!! + line.split("=")[1] + }), + DSM("Dankers SkyBlock Mod", "config/Danker's Skyblock Mod.cfg", { reader -> + val lines = reader.readText().split(System.lineSeparator()) + val line = lines.find { it.startsWith(" S:APIKey=") }!! + line.split("=")[1] + }), + DG("Dungeons Guide", "config/dungeonsguide/config.json", { reader -> + getJson(reader)["partykicker.apikey"].asJsonObject["apikey"].asString + }), + SKYTILS("Skytils", "config/skytils/config.toml", { reader -> + val lines = reader.readText().split(System.lineSeparator()) + val line = lines.find { it.startsWith(" hypixel_api_key = \"") }!! + line.split("\"")[1] + }), + HYPIXEL_API_KEY_MANAGER("Hypixel API Key Manager", "HypixelApiKeyManager/localdata.json", { reader -> + getJson(reader)["key"].asString + }), + SOOPY("Soopy Addons", "soopyAddonsData/apikey.txt", { reader -> + reader.readText() + }), + SBE("SkyBlock Extras", "config/SkyblockExtras.cfg", { reader -> + getJson(reader)["values"].asJsonObject["apiKey"].asString + }), +} + +fun getJson(reader: BufferedReader): JsonObject { + return ConfigManager.gson.fromJson(reader, com.google.gson.JsonObject::class.java) +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCommands.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCommands.kt new file mode 100644 index 000000000000..3ae6b81f6a65 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCommands.kt @@ -0,0 +1,57 @@ +package at.hannibal2.skyhanni.features.garden + +import at.hannibal2.skyhanni.events.LorenzKeyPressEvent +import at.hannibal2.skyhanni.events.MessageSendToServerEvent +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.NEUItems +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import net.minecraft.client.Minecraft +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class GardenCommands { + private val config get() = GardenAPI.config.gardenCommands + + // TODO repo + private val tpPlotPattern = "/tp (?.*)".toPattern() + + @SubscribeEvent + fun onMessageSendToServer(event: MessageSendToServerEvent) { + if (!config.warpCommands) return + if (!GardenAPI.inGarden()) return + + val message = event.message.lowercase() + + if (message == "/home") { + event.isCanceled = true + LorenzUtils.sendCommandToServer("warp garden") + LorenzUtils.chat("§aTeleported you to the spawn location!", prefix = false) + } + + if (message == "/barn") { + event.isCanceled = true + LorenzUtils.sendCommandToServer("tptoplot barn") + } + + tpPlotPattern.matchMatcher(message) { + event.isCanceled = true + val plotName = group("plot") + LorenzUtils.sendCommandToServer("tptoplot $plotName") + } + } + + @SubscribeEvent + fun onKeyClick(event: LorenzKeyPressEvent) { + if (!GardenAPI.inGarden()) return + if (Minecraft.getMinecraft().currentScreen != null) return + if (NEUItems.neuHasFocus()) return + + val command = when (event.keyCode) { + config.homeHotkey -> "warp garden" + config.sethomeHotkey -> "sethome" + config.barnHotkey -> "tptoplot barn" + + else -> return + } + LorenzUtils.sendCommandToServer(command) + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/DrawBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/DrawBackground.kt new file mode 100644 index 000000000000..8cd020ea0406 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/DrawBackground.kt @@ -0,0 +1,38 @@ +package at.hannibal2.skyhanni.features.misc.customscoreboard + +import net.minecraft.client.gui.Gui +import kotlin.math.sqrt + +object DrawBackground { + fun drawFilledRoundedRect(x: Int, y: Int, width: Int, height: Int, cornerRadius: Int, color: Int) { + /* + https://discord.com/channels/997079228510117908/1094190239532208228/1178102696742494229 + */ + + // big middle one + Gui.drawRect(x, y, x + width, y + height, color) + // top + Gui.drawRect(x, y, x + width, y - cornerRadius, color) + // right + Gui.drawRect(x + width, y, x + width + cornerRadius, y + height, color) + // bottom + Gui.drawRect(x, y + height, x + width, y + height + cornerRadius, color) + // left + Gui.drawRect(x, y, x - cornerRadius, y + height, color) + + // top left + for (newX in -cornerRadius * 2..cornerRadius * 2) { + for (newY in -cornerRadius * 2..cornerRadius * 2) { + val distance = sqrt((newX * newX + newY * newY).toDouble()) + if (distance <= cornerRadius) { + val alpha = (255 * (1.0 - distance / cornerRadius)).toInt() + if (alpha > 0) { + Gui.drawRect(x + newX, y + newY, x + newX + 1, y + newY + 1, color) + } + } + } + } + } + + // Function to draw a filled quarter circle +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/AnitaUpgradeCostsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/AnitaUpgradeCostsJson.java new file mode 100644 index 000000000000..09a2de7db9ba --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/AnitaUpgradeCostsJson.java @@ -0,0 +1,18 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.Map; + +public class AnitaUpgradeCostsJson { + @Expose + public Map level_price; + + public static class Price { + @Expose + public Integer gold_medals; + + @Expose + public Integer jacob_tickets; + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ArmorDropsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ArmorDropsJson.java new file mode 100644 index 000000000000..698bad3db170 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ArmorDropsJson.java @@ -0,0 +1,19 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; +import java.util.Map; + +public class ArmorDropsJson { + @Expose + public Map special_crops; + + public static class DropInfo { + @Expose + public String armor_type; + + @Expose + public List chance; + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoJson.java new file mode 100644 index 000000000000..810f6d3abfd1 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoJson.java @@ -0,0 +1,19 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; +import java.util.Map; + +public class BingoJson { + @Expose + public Map bingo_tips; + + public static class BingoTip { + @Expose + public String difficulty; + + @Expose + public List note; + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoRanksJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoRanksJson.java new file mode 100644 index 000000000000..49d7e662f49d --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoRanksJson.java @@ -0,0 +1,10 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.Map; + +public class BingoRanksJson { + @Expose + public Map ranks; +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java new file mode 100644 index 000000000000..8e5648f5e62b --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java @@ -0,0 +1,10 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class ContributorListJson { + @Expose + public List usernames; +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/CrimsonIsleReputationJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/CrimsonIsleReputationJson.java new file mode 100644 index 000000000000..9235680fb365 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/CrimsonIsleReputationJson.java @@ -0,0 +1,34 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; +import java.util.Map; + +public class CrimsonIsleReputationJson { + @Expose + public Map FISHING; + + @Expose + public Map RESCUE; + + @Expose + public Map FETCH; + + @Expose + public Map DOJO; + + @Expose + public Map MINIBOSS; + + @Expose + public Map KUUDRA; + + public static class ReputationQuest { + @Expose + public String item; + + @Expose + public List location; + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DanceRoomInstructionsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DanceRoomInstructionsJson.java new file mode 100644 index 000000000000..9316d8671f9c --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DanceRoomInstructionsJson.java @@ -0,0 +1,10 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class DanceRoomInstructionsJson { + @Expose + public List instructions; +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DicerDropsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DicerDropsJson.java new file mode 100644 index 000000000000..996a558eaf8e --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DicerDropsJson.java @@ -0,0 +1,31 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +public class DicerDropsJson { + @Expose + public DicerType MELON; + + @Expose + public DicerType PUMPKIN; + + public static class DicerType { + @Expose + @SerializedName("total chance") + public Integer totalChance; + + @Expose + public List drops; + } + + public static class DropInfo { + @Expose + public Integer chance; + + @Expose + public List amount; + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DisabledFeaturesJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DisabledFeaturesJson.java new file mode 100644 index 000000000000..45abedfa3da1 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DisabledFeaturesJson.java @@ -0,0 +1,10 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.Map; + +public class DisabledFeaturesJson { + @Expose + public Map features; +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/EnigmaSoulsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/EnigmaSoulsJson.java new file mode 100644 index 000000000000..5769520f5c41 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/EnigmaSoulsJson.java @@ -0,0 +1,20 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.utils.LorenzVec; +import com.google.gson.annotations.Expose; + +import java.util.List; +import java.util.Map; + +public class EnigmaSoulsJson { + @Expose + public Map> areas; + + public static class EnigmaPosition { + @Expose + public String name; + + @Expose + public LorenzVec position; + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java new file mode 100644 index 000000000000..d17fd7d30640 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java @@ -0,0 +1,12 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.utils.NEUInternalName; +import com.google.gson.annotations.Expose; + +import java.util.List; +import java.util.Map; + +public class FishingProfitItemsJson { + @Expose + public Map> categories; +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FriendsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FriendsJson.java new file mode 100644 index 000000000000..82482b6a68cb --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FriendsJson.java @@ -0,0 +1,24 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.Map; +import java.util.UUID; + +public class FriendsJson { + @Expose + public Map players; + + public static class PlayerFriends { + + @Expose + public Map friends; + + public static class Friend { + @Expose + public String name; + @Expose + public boolean bestFriend; + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java new file mode 100644 index 000000000000..7bc9cf7fa9a7 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java @@ -0,0 +1,58 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.features.garden.CropType; +import at.hannibal2.skyhanni.utils.LorenzRarity; +import at.hannibal2.skyhanni.utils.LorenzVec; +import com.google.gson.annotations.Expose; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Map; + +public class GardenJson { + @Expose + public List garden_exp; + + @Expose + public Map> crop_milestones; + + @Expose + public Map crop_milestone_community_help; + + @Expose + public Map visitors; + + @Expose + public Map organic_matter; + + @Expose + public Map fuel; + + public static class GardenVisitor { + @Expose + public LorenzRarity rarity; + + @Expose + public LorenzRarity new_rarity; + + @Nullable + @Expose + public LorenzVec position; + + /** + * Formatted as follows: + * - If this visitor is a player, get the encoded skin value + * - If this visitor is a mob, get their mob class name + */ + @Nullable + @Expose + public String skinOrType; + + @Nullable + @Expose + public String mode; + + @Expose + public List need_items; + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/HideNotClickableItemsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/HideNotClickableItemsJson.java new file mode 100644 index 000000000000..d4ac9c52b41f --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/HideNotClickableItemsJson.java @@ -0,0 +1,30 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class HideNotClickableItemsJson { + @Expose + public MultiFilterJson hide_npc_sell; + + @Expose + public MultiFilterJson hide_in_storage; + + @Expose + public MultiFilterJson hide_player_trade; + + @Expose + public MultiFilterJson not_auctionable; + + @Expose + public SalvageFilter salvage; + + public static class SalvageFilter { + @Expose + public List armor; + + @Expose + public List items; + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ItemsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ItemsJson.java new file mode 100644 index 000000000000..f3767191331a --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ItemsJson.java @@ -0,0 +1,14 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; +import java.util.Map; + +public class ItemsJson { + @Expose + public List crimson_armors; + + @Expose + public Map crimson_tiers; +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/JacobContestsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/JacobContestsJson.java new file mode 100644 index 000000000000..87d1e9a22ef4 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/JacobContestsJson.java @@ -0,0 +1,13 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.features.garden.CropType; +import com.google.gson.annotations.Expose; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class JacobContestsJson { + @Expose + public Map> contestTimes = new HashMap<>(); +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/KnownFeaturesJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/KnownFeaturesJson.java new file mode 100644 index 000000000000..bd5048cfbd0a --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/KnownFeaturesJson.java @@ -0,0 +1,12 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class KnownFeaturesJson { + @Expose + public Map> knownFeatures = new HashMap<>(); +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/LocationFixJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/LocationFixJson.java new file mode 100644 index 000000000000..802627e7a7cf --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/LocationFixJson.java @@ -0,0 +1,27 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.utils.LorenzVec; +import com.google.gson.annotations.Expose; + +import java.util.Map; + +public class LocationFixJson { + + @Expose + public Map locationFixes; + + public static class LocationFix { + @Expose + public LorenzVec a; + + @Expose + public LorenzVec b; + + @Expose + public String island_name; + + @Expose + public String real_location; + } + +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java new file mode 100644 index 000000000000..d2173c74bf43 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java @@ -0,0 +1,70 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.ArrayList; + +public class MayorJson { + @Expose + public boolean success; + @Expose + public long lastUpdated; + @Expose + public Mayor mayor; + @Expose + public Election current; + + public class Candidate { + @Expose + public String key; + @Expose + public String name; + @Expose + public ArrayList perks; + @Expose + public int votes; + + @Override + public String toString() { + return "Candidate{" + + "key='" + key + '\'' + + ", name='" + name + '\'' + + ", perks=" + perks + + ", votes=" + votes + + '}'; + } + } + + public class Election { + @Expose + public int year; + @Expose + public ArrayList candidates; + } + + public class Mayor { + @Expose + public String key; + @Expose + public String name; + @Expose + public ArrayList perks; + @Expose + public Election election; + } + + public static class Perk { + @Expose + public String name; + @Expose + public String description; + + @Override + public String toString() { + return "Perk{" + + "name='" + name + '\'' + + ", description='" + description + '\'' + + '}'; + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ModGuiSwitcherJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ModGuiSwitcherJson.java new file mode 100644 index 000000000000..078b1f6ad537 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ModGuiSwitcherJson.java @@ -0,0 +1,25 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ModGuiSwitcherJson { + + @Expose + public Map mods = new HashMap<>(); + + public static class Mod { + @Expose + public List description = new ArrayList<>(); + + @Expose + public String command = ""; + + @Expose + public List guiPath = new ArrayList<>(); + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MultiFilterJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MultiFilterJson.java new file mode 100644 index 000000000000..8704f91fbaf6 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MultiFilterJson.java @@ -0,0 +1,25 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class MultiFilterJson { + @Expose + public List equals; + + @Expose + public List startsWith; + + @Expose + public List endsWith; + + @Expose + public List contains; + + @Expose + public List containsWord; + + @Expose + public String description; +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ParkourJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ParkourJson.java new file mode 100644 index 000000000000..5ae2d40cae55 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ParkourJson.java @@ -0,0 +1,23 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.utils.LorenzVec; +import com.google.gson.annotations.Expose; + +import java.util.ArrayList; +import java.util.List; + +public class ParkourJson { + @Expose + public List locations; + + @Expose + public List shortCuts = new ArrayList<>(); + + public static class ShortCut { + @Expose + public int from; + + @Expose + public int to; + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/PlayerChatFilterJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/PlayerChatFilterJson.java new file mode 100644 index 000000000000..a65a2f8a1957 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/PlayerChatFilterJson.java @@ -0,0 +1,10 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class PlayerChatFilterJson { + @Expose + public List filters; +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/RiftEffigiesJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/RiftEffigiesJson.java new file mode 100644 index 000000000000..d914ef9344f2 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/RiftEffigiesJson.java @@ -0,0 +1,11 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.utils.LorenzVec; +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class RiftEffigiesJson { + @Expose + public List locations; +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SacksJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SacksJson.java new file mode 100644 index 000000000000..dfd2103efc4e --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SacksJson.java @@ -0,0 +1,10 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class SacksJson { + @Expose + public List sackList; +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java new file mode 100644 index 000000000000..04990d8d063f --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java @@ -0,0 +1,33 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.utils.LorenzRarity; +import com.google.gson.annotations.Expose; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.Map; + +public class SeaCreatureJson { + + public static Type TYPE = new TypeToken>() { + }.getType(); + + public static class Variant { + @Expose + public String chat_color; + @Expose + public Map sea_creatures; + } + + public static class SeaCreature { + @Expose + public String chat_message; + @Expose + public int fishing_experience; + @Expose + public Boolean rare; + @Expose + public LorenzRarity rarity; + } + +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SlayerProfitTrackerItemsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SlayerProfitTrackerItemsJson.java new file mode 100644 index 000000000000..37758220016b --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SlayerProfitTrackerItemsJson.java @@ -0,0 +1,12 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.utils.NEUInternalName; +import com.google.gson.annotations.Expose; + +import java.util.List; +import java.util.Map; + +public class SlayerProfitTrackerItemsJson { + @Expose + public Map> slayers; +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TabListJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TabListJson.java new file mode 100644 index 000000000000..03c256256767 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TabListJson.java @@ -0,0 +1,11 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class TabListJson { + + @Expose + public List sun_moon_symbols; +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java new file mode 100644 index 000000000000..6303c16be4fd --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java @@ -0,0 +1,25 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.features.fishing.trophy.TrophyRarity; +import com.google.gson.annotations.Expose; + +import java.util.Map; + +public class TrophyFishJson { + @Expose + public Map trophy_fish; + + public static class TrophyFishInfo { + @Expose + public String displayName; + + @Expose + public String description; + + @Expose + public Integer rate; + + @Expose + public Map fillet; + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/VipVisitsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/VipVisitsJson.java new file mode 100644 index 000000000000..c80f4953f2dc --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/VipVisitsJson.java @@ -0,0 +1,10 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class VipVisitsJson { + @Expose + public List vipVisits; +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/WarpsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/WarpsJson.java new file mode 100644 index 000000000000..e09bf3c9d40f --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/WarpsJson.java @@ -0,0 +1,10 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class WarpsJson { + @Expose + public List warpCommands; +} \ No newline at end of file diff --git a/src/main/resources/assets/skyhanni/rareScoreboardBackground.png b/src/main/resources/assets/skyhanni/rareScoreboardBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..be62760b5ec245beecabc929d7d6eb7bb139f254 GIT binary patch literal 168412 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

_^y&@m;FwF4@b_{|E^zSix*@UtL!3)i4zq_ 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 (o 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

#HhW!+1z(IZLZ{`N=b|g|DRlJ;Kzs3 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�%faORee`bR+ zb&-8}a|ZuIFp|}08jBqf93?od4RvzC>z15i4Ye@t1~AWbUaplA@wZsF&MCDdv3Tw zF9?wP`QE(g-nx;X0Ks!$VWc~0PVsk9B`qXqjjgFq$WT`B8}nH#Pg`30W1t-G$sDi7 zLfQ%=sfqPK)Z9gxLphqG#HE`eGi4whQ=~mhYmZRTCR-{*^6Pt(BId21dmjv; zi5|}MNQD@Aea~(S#swS(I9x=y_n_baC~Xlc2<^Tn8lk=lDrkfhg=xw+Z$xwDc=1P= z_Ti)x=JML0!hEFqA~5GUcqD32=!CGoH3M^H0`&|Zw?qJkn>RC^BL;Vwy(Q-p zbu@#PR?hLX7C`j&HNHE;X)u!E($opKCf}{)rUfF&yWoTLOD5 z@A2!=+sm&Il}~;UACBi@y?DkZjwS{czpdB?_Rx&$JdYX;X5DV@zuNA5`Gh* zmUd3br)i(e(9;&+dJ=JICe3sxk575rm`t3N zCpmcb@beD)c}k~|)F!*IhKI<=k$_;`<8&ihYGw<7XIUf73`lFDNz(_ydYij~bCW`^Oh z)jb6!D~Yr>B&#u4l%W`ZH$+FIwLQGLJoc5O90}K3gmgQrC^5Z}Z=w0I(Qa|CF>*Vb z4H%dx;(AgO#l_oC%v(^bwN~D;k5Cc&`1&zEeEUQE><2%Cm^S~QgVy2>1RJf@NgjG* zJ0wf4V1_ang3DX%ODSEYIUy99pne|J!or+rM~&~>S?CcQXl5{mczVphgu=Xu{5++r z0X2f)#2y#q;K<>^Iqbd1Jnu1ikMZJ_&mlMIf}yp3E~) z0Uq-l?jW3RtLJu^2exL+i_3&s^HSPut0CmJ3O_kxN>3G70J!wL7pKq&6+K#`S;xlC z$YZEe*1KS6vINn77OozX!^yXM@p0NV9;wr)Iex-!stefG-7lkuE$3hU5lMhcTe$b_Y7a{ze4K>t7WY?bePhH9!Jre*fin z{}M!G0^vWt_(%NX@BcC74*<8*OT66Q;&ysjG~AQhC;064GpmVGoK)8>p&IA{WWMsr zm4RFfBR=(F=AItZji1j0)dFbf7)Lo>A%UuA31pL?X#j{G{E^vs(W2^+oETjN*9rvE zsW!+L|BkV(d~d)?KHwyLGGyJ+!Ml*RW8{lc7xLK@G&6Nsnl2<%HPL_|{aRO0C5cpJ zPc*;{ml(!t<#GBdp12Z$EM9UOG_G(Mc-}S>h!E{VTrTAS=HMFM_s>_hXLHH@fz*jg+rE+z6CdfKXjc?sQ75#D)VMdJ_Dq+)H+Y+ z;M^sME&<+Q_B*hjvLJ}eni8+*qM10>#quJf5k6vR$EogCNb%e9^7Ue39pTtFl=oDc z?ZNOKa1#RqCF_k~Tfq-w`u;w`7&mBw*Z9uGcW^!0K={?}EBx~7U*e;$J_;331?9~S zR1jgsapdr>;ehky{g?QM-~R*t-IxEac>etU8J@*k?PEqw1)FdvC)HAJVxrm8vySWx z&BY;trff%udGz8#OcQai$+ilu5o)hXeZ`W1p!Nu@XHR`4lgwG-Fu)eup(HZ^Z@jK) zjuP0wVNGxVVT$X8OB$gLL9k_Tbizr3)QT6|F@X?3&Q)s(N!pY)r)+vkSm`+&uw82@ z6i;0lZ@~T~{QL^jE(mIgiTVk%4`#Rml%de@p9%V%vq<_yOo@t@@v^!cFbXk zC+pc|8#N>@2y3QggQ`#ceytBUw3p|oWQdiZWwROQtb9f{rvKODHAZ8?yzxO#E*wW2`a)=R0ONb}!d7wcwN;@egX)o0Ho%1#gn>bx=Nv}N7 zYkNLwdQEdm0wK{TNt}v?I7!TWP6*;aGXinH-~`W8u^C^qF3(c}e3lzDJks7zndm`6 zPSd(%G^*-AQWjLa3G-y!>RvE{(#tptCiy)OG&AgxjxUQTy92H;{b{BqR}g~1zO|GMNIG>;QgFTtlDxQW;$)I3+ZCVYd$UX zVt}Jywv{!)ZVPL-=8h1MOvjNf0odBJSD#dq`)dehQZRUm*Dxt}}j{&#a~8^+(G6lydA35N+VRD zG17>uXbxQ>^baER!0^yGRS*ymXOngSlpv^07h>v+5Q3}`<{3$P=Ecvn{>Sv!aCZ z44&r%!mP{fHIE)-l=Dk1PGfOpk{Kc(C5EWWRt6!C~JW+13asK zj9$-k-0wRJ2$ti@_lpb2p8>Mq*t;~(wBF;wpS z!BaHfDn3v!r-lvm1UXP!OuI|_%u4SrEjGpvKZlzj>ZCLPG$ajY7=tz<=abIU%eVo& zb4ICXVnS*|)nRlk2G55ZaulbnKkY zGdXW0Q)>WOa;>>l2Yt?Jy)mCzP_IZ)f;swQwyh*>VhOdkWRcNYzf)!61B|?kbU?5q zSe5BuXhoUbp@}i{3g-NtC>OwJms=+`f!f+&*%*X}ITx6}XjJJaYfj@W0ayru`+CnIK6AP?TqGW? zHD)OiNtj60jd2MX1Y>3gaR?wdlFR1V)Jhr*TO=ex zJ_$lg;YmAUgw5RmqXaZZS0Hy8*QN#lSLsk_@Qiuhndf0jxk-YRBIVvJ(W*JOv8IVs zf0b=oE(A<09 zO)A!)rR-&zRrxEH5=e}iU=U<3;f70K+65uEKA%_8dBklnyPye1kPD7L1BUUkJ@{h2 zhewF-5XabX8OMUXP3Khp9B7S8Kr<(YyGHn6J{J(~BM`o5UsjV`9&H6dAZmnDs}brv zH-`gM=B?Qg5uBrRu(st*n%DABfZ04t8cka#A1beTDon4rq*Rswoy}atE3yNIaUDa} zBLTtyK%aKQK=Lvrgi~ckxT=k_8rZ$mUe-E|lORMR3u|O^+usA=I7px5MhtEQaD{og z#XR3*o^I1k^liDZPh4#O*rxJ4^ASr#w{(q~_6`_|In>znt2dYzw`uD?eTKntRO54bge+;!%+_>`R@a&>>rl z9syHaS3eQ-dLb-V1ez&rm#TyV4~$Euv(1Gqr8`6ZlITQjxm)-W{nl8WXCIs|z)>4S z1VYhXYK@1|XA;~gXoQ~gR)=u2eRUvpCm+$wtT+O;y*MFn#meJ^m=Uj1V#Y)P`09(V zG%f_^m-wF?CO2W%czt9VJTqp5Q)CL7Wq?`}n-!oK@0}w!=RvMKEZfh!cs$rX0i30= zWz!^Q#w3~|@}_lD+pC0<=E|F%MkrfmYBzdT|Fwo!w?~T0M*C#-s-}6K?=bB>+^)2u z_$l1%G0%I<(;cRrha2~08&+h>q?m>~3_A}uRF;`e@bi7VwPK&grF^Ub1F0%1T1ZEz z;%^Se@Rl@A4iC8xk0_R~uphB3q;Cz9%wjd-JaR7ddpPK!)9=diq%$D^^F$a%#=ah7 zD$jW$4116LAY*KYxwh=Bg}Pq7`I2ZxYO`AV_p`@X6jwb+>t1683W5N^We5 zJt!FT{I*HsGlUP?wKOqmot})5!`wO)XNnI|GWQI0q zWqN7i#Uawm!hD#CdVMRhoe`h?|{_P zH`C~2{5!kQntqWd zxHulHgBm2y9OqTBcDOYxu)X$&nwN>yRZZsx*V70O?4`sM?ROg|R8TA^iI<&;JX)c=g4}1U5sqvz@Kk_;@{sB>(F26SNfHHrC;e+`U&Zg9Wbuk_(Y3G z03S9~87;s3F=6p&VRW;~{Cu9wC~-1!k^GOXfXWLVTd_lFw>ya@ZBif@!mN|7fa6(c zFuoDfz|o*47C)(RS5!n%~wClbpIFc{K6c9XZg|ebWr|8QFK&nC7;% z)tu*tNfsWA)_#{Z8KXSE6hKM&6GJmC*UeLS{uPdlZKf=s4$ujBe0kuJa@DeOHF2kl zd>84;;_1pR_$G7Q&7)_XW1;DH`PjA%k4FK$Y*60O=LS@PnF>L!2ds%|<@~uukPfx5yw-p|@2*U&(&8$G3VgKyZPy|E$DZLDSn0Kj*ltA&pHu_)bw*B7QAXl}NTO8~ z>|C+e_D`d!m&aE(@!xyzGMZ<5d_}Ed?qA0MvuM#GIyY&qSoqEP(K2$Jp$i33gY*`3 zR#%gcQkubxHL$2EI>IaJ2a*|n=Wuo1BD59X*AxY1`-)P&woB8C#Pto8zqfErSLsAj z>O1eQyiw$(i)uNq{?5HUS9(Ml>zX{7g9SN{j(_u5=gnl-pU&yc%dYD*#|*2odhhh4 z`fiSJ;K@4#Ev_YW^^fffFLYOrl5w_q8U*VkPv%R|K6N?N6#%sq0&N5;gl#LU72$c` zKV?ODk|lkfY077nJ&|WrIJ#z|?34VDQm}m~czh+h4xk#nY8ml@cDw6F=7udxetp72 zDYZxwvO=nC9&AeKFVsip+pDy?fUg(EndKfKwYz?uR!*>8f(IICJroF~-JL29w1B$M zc1+7OIiCue7uxVb1uwMW?KtpO54;@*9xvbU`0{)67yAAm>~978dw*H)@$wBXlIJ-7 z!chy3V*vZ3MeN|C@0UlrroO-NdmOAznum9{NjNPD-W%Prr5EHQZ6bWQvd2a&)JFr~ z27jbhcpPUA<2>KX+#bK-@$xUf{GQC;qyB|@Y&fo>W?d{7)QJJtfu0*+7|X^qUZ`J^ z)hS_4=atW7zi^#B)CPJ1dkYMMfLZz`&F)=|4P;7K{~?&hVRp2#ZSJ?o(#YK*qT|w_6^BvK16Tz%)YrUUz)oUpu-0 z!t3#hUALy51;J4Ndws{>`(L5{_J8vodSO~SwwtMDAIWpp-lQS=CHe+1ZAE17kh`o? zeNj&xW#hOKgfy=psDL>F8MlXLs<;tkKfx)L*ELAj`x$bX&D;n;zU^?2Yc()`KJh3-MjeLZ@q9 zhClU9s^lfYF5AkR1lJ(kr}w1VHIYY}7!*ea!1chfzl!qYTgr3$A`Ic+HRefapDOZv z=8=|h=|p=43M%|K>*FGszuQRznVX>LOI9IP{^h&6m0tT>%YpOpT;O0Qz!TaS45}nP zPqFY_I;;qlj+mu+(r^$Qm@N&;y`VKsVce{Im?s^d8Gn%XKeoSkrB5a0^8=#bCmHs- z;}rq)q`|%J?Y9*Z-vJv|muWNTz1Q~{2s;g7-Kop;5#S!n291=+{fkz#=mjd+Jv&)` zt;awPK(Sa!)HS0Z=o8*oi?%(=K;JGIER1 z(VUZi#kM6tSOGo&D$?%6R@Yl+BM2}{zwYR3M)UBy))T(3SYByn6{y2+Q3-RJXDfvf zfNZOGfugN@zQs88X*oxEJ%xn_*Ck_6+>60g-kcP&1Oz2zI~l&~6=_887k5kwhA!y5 zGV=Ed`y2!>0tV9fB_Q7|5B?_1H5NaM$v-l-;V_FBE4sI{tqMrLUF5BB)BVB zj7B)TD0#cqmAK*yD?%Qh2}AZV2mLcthdXL^=jJWc<$-C1&Z{ji*1k%<0M-vKc#(rF zmMzxE+=UwmKDabtfwrRF!KhrZ%NVLEQF#X)M+-!pXt6VKuoWT72BPLOlPjar6a1_z zLQ_b^7)n5JifAvB%D3ePp=PT^q}xrMwwr)J0}=n7V!cK$f~1$R3If0J(=IU?ze~Ft zFgQmx1w~hc+br3Xj#F0Y1YTe6!>MPv^@=b|g=L;e*|;ZU4FHmdp_^&3hF>%;0S8B#%hbv+uH<~RpJW9&b37=5D?^H+^TVOb(*9vy4BQh zUAKB>O>|6MMEKpePr2?m-oFE^k>YnVW+BAL5l`rpEbmu^MFgu*m7h5VP+ZEX8|{ZI z)0Stp3Phjhqlu_l?2ZxVnOOpntSeWyS(z)fNvMsh4gK$A@6+>SjT@m$-0>~bxhz*% zVNpT?=f$MCAm~r%>Ili}%8HUI&u3*99X45o4Jd72rhi8*bP{bL;=Du#Id$hY%Kc7Z z+r;X7s52vTsAHmi9MjYM96Nk1PxuN5p9QfqFwF9HrOVUK|zKfS`bn5(l4sJ zuDD{L?92Z6TqUyLvjQER50s`{?nF6!cVU zYav^j03KHfZ0CE7c1CCcPlf-~8db|`^zrs5TfY?y@9;*82>&XfmUj6Y^7pGa4nDwe zzp$`zyl$YI>mnq_a&83F>bIDXRpxIUGoLr8JQc?-E$Vv3TnE|L<+Qv?8j@)YsnaRg z=>wpWSny(qX~%5iVziFc1k?64al>aq3bV|u(dY&M7vZt7N@n07aOs0Ik3G~Nv~zh^ zYA8+2?@8vRl+TqvLEJ7=wsS(_OThQ>n~G~V|m?YVVEMLeFhkQR{k-4l+I`C zPm+>ut3CqkoQ?b$Y}Ln8dEX9gzr>YFf6l>PCXyFHkjQ}%WQHw4K@LN%J$2V9jR+5TP+3NA)fpSL33j(Je`j4c z3V}ASHl7QbMW`tfNwvvvOk)CSxFG#7f{guT3S{4<7OQ5zzqVpk2>bS~JK=Kw(jUZ@%Lb-4cEN6yC zsbZ7^uq)0APTx=~1K1mXN*Jcc%kMZ20%`>x?}6tp`V-qxt4;ykt$dSuj&*&J;m2nR zf^odh@&oe=UV&f}&o{S5e-_BxO=oTYD3Ja@YLmF%wVNVN}>d{Kcl0DpTF zgdKwRnj*Cb+<_1)qvqeC{z!vuIcJks)NY~#7%aj$N75&r%o6hsu5V4~b-#Pmc&;sq z{Bc#;^qkuYAiI>WN>Ypow-8dc>$_?{m-*du;A~va>(H~`NMrjAz9Ni;9c|jjM}S-b zQW=BhyuON>nW-Jkz?HnQcYL7o8*l*3ZMUS+d4TyH_4vE3-0A>Yt3k4HairF)l@HMI z9XlW^!ow8_Ct1!dgOK>A@#Z!V0_g<)Xrohoi6DBajj_%<8p03KpMs$L*KO;B$)=j7 z;#54}W6LP32^DTk-T9d^clSG^-}Y261Z7CgB1>p(L-?H>?$-j-afV5kNIk%ZymyE#oO23Cb~!Mx45 z$$$&&PzkdNGKhfhQRUP~UKno&i>r z0)Q%*-*8k9i_`&XGR~bvG|Vr7!S4SfkS5e(yX2>rLGuNZ@FsQjIJOMc` zbmoeIe;X*zNVuGY&y3a2KtHWM5kg%e_~mq)%rlMAX@Hg+C%-EVXIoM;9cPM!lSx=@ zXZ7`DD-7iY_zL0Xm|I-Hqu;vZU{RRHq?yF$gf3==Z?lNrqqz{NQ`Yt{qfi$J~vhrZ$jD1^6ID=#OQJ4=CLl zH@o7y0fPWP8z1WP#J+1kIOd~Z`I;@eO_@4D8y-Gefj*11F|@U+E7IMa1t#Tg@C*Zb z$#t&(F27y9xLl9&os!V!Hl4(1OeH%3V765*tLto(taZtLY1mGxg+p?AO$%}lmX!|AwS%&jK%W9emWRV^38(@VithdeXE z#-_PM5HK1SUF?Qs+|rA{G?t57Or3CZK0_tH@2RUQZFSQ6LtFMer@05iS((tXs~rMg zZ72PT0$0XVphAQ#UvrE+tTmg?=PN=gbYBNT;AAmeWR;)ZM-&gbpim-FbQ{bz_KroPv(ZI#0)T@3uGcH1+SG z2f`Kbd={X5M*5(v{TYeTCbRnjRnQ^&f@a!R=!B z>3t{zL7_z@0l~e==*n!dg0Sxi=mI@3O$D|6(db|VwIb3XY?n=EHA7peaN_YhV|@KR zos|1Kt=zo!B<13^b9NQs&SY-Fo=r)6ip5U1OL|Jv6pD7^qI#2Pz31oPCsbc`|3+t7 zwC$yWmDE8UpU*r=@r$koM+WY^jNfeny&H^@L!<&mA8;45zqht n01jnXNoGw=04e|g00;m8000000Mb*F00000NkvXXu0mjfKi8%@ literal 0 HcmV?d00001 From f433161d187cf3b009e9215c3d610950acbdc91c Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 14:55:23 +0100 Subject: [PATCH 138/225] fixed int limit in coins --- .../features/misc/customscoreboard/InformationGetter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 354aeee0ac84..38d6ddf52566 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -26,6 +26,7 @@ class InformationGetter { for (line in ScoreboardData.sidebarLinesFormatted) { when { line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ") -> location = line + line.startsWith("Purse: §6") || line.startsWith("Piggy: §6") -> purse = line.removePrefix("Purse: §6").removePrefix("Piggy: §6") line.startsWith("Motes: §d") -> motes = line.removePrefix("Motes: §d") extractLobbyCode(line) is String -> lobbyCode = extractLobbyCode(line)?.substring(1) ?: "" //removes first char (number of color code) @@ -34,6 +35,5 @@ class InformationGetter { line.startsWith("Copper: §c") -> copper = line.removePrefix("Copper: §c") } } - purse = LorenzUtils.formatInteger(PurseAPI.currentPurse.toInt()) } } From 54cc34f4e314852c71905e306eb9891064070f17 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 15:16:06 +0100 Subject: [PATCH 139/225] Revert "beta 4 update" This reverts commit a92c925124e061f6bd7e9883d216134f971bf4fb. --- .../skyhanni/data/GardenCropMilestonesFix.kt | 159 ------------------ .../at/hannibal2/skyhanni/data/OtherMod.kt | 42 ----- .../features/garden/GardenCommands.kt | 57 ------- .../misc/customscoreboard/DrawBackground.kt | 38 ----- .../jsonobjects/AnitaUpgradeCostsJson.java | 18 -- .../utils/jsonobjects/ArmorDropsJson.java | 19 --- .../skyhanni/utils/jsonobjects/BingoJson.java | 19 --- .../utils/jsonobjects/BingoRanksJson.java | 10 -- .../jsonobjects/ContributorListJson.java | 10 -- .../CrimsonIsleReputationJson.java | 34 ---- .../DanceRoomInstructionsJson.java | 10 -- .../utils/jsonobjects/DicerDropsJson.java | 31 ---- .../jsonobjects/DisabledFeaturesJson.java | 10 -- .../utils/jsonobjects/EnigmaSoulsJson.java | 20 --- .../jsonobjects/FishingProfitItemsJson.java | 12 -- .../utils/jsonobjects/FriendsJson.java | 24 --- .../utils/jsonobjects/GardenJson.java | 58 ------- .../HideNotClickableItemsJson.java | 30 ---- .../skyhanni/utils/jsonobjects/ItemsJson.java | 14 -- .../utils/jsonobjects/JacobContestsJson.java | 13 -- .../utils/jsonobjects/KnownFeaturesJson.java | 12 -- .../utils/jsonobjects/LocationFixJson.java | 27 --- .../skyhanni/utils/jsonobjects/MayorJson.java | 70 -------- .../utils/jsonobjects/ModGuiSwitcherJson.java | 25 --- .../utils/jsonobjects/MultiFilterJson.java | 25 --- .../utils/jsonobjects/ParkourJson.java | 23 --- .../jsonobjects/PlayerChatFilterJson.java | 10 -- .../utils/jsonobjects/RiftEffigiesJson.java | 11 -- .../skyhanni/utils/jsonobjects/SacksJson.java | 10 -- .../utils/jsonobjects/SeaCreatureJson.java | 33 ---- .../SlayerProfitTrackerItemsJson.java | 12 -- .../utils/jsonobjects/TabListJson.java | 11 -- .../utils/jsonobjects/TrophyFishJson.java | 25 --- .../utils/jsonobjects/VipVisitsJson.java | 10 -- .../skyhanni/utils/jsonobjects/WarpsJson.java | 10 -- .../skyhanni/rareScoreboardBackground.png | Bin 168412 -> 0 bytes 36 files changed, 942 deletions(-) delete mode 100644 src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt delete mode 100644 src/main/java/at/hannibal2/skyhanni/data/OtherMod.kt delete mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/GardenCommands.kt delete mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/DrawBackground.kt delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/AnitaUpgradeCostsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ArmorDropsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoRanksJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/CrimsonIsleReputationJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DanceRoomInstructionsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DicerDropsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DisabledFeaturesJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/EnigmaSoulsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FriendsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/HideNotClickableItemsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ItemsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/JacobContestsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/KnownFeaturesJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/LocationFixJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ModGuiSwitcherJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MultiFilterJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ParkourJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/PlayerChatFilterJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/RiftEffigiesJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SacksJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SlayerProfitTrackerItemsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TabListJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/VipVisitsJson.java delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/WarpsJson.java delete mode 100644 src/main/resources/assets/skyhanni/rareScoreboardBackground.png diff --git a/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt b/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt deleted file mode 100644 index cad8fdddf831..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt +++ /dev/null @@ -1,159 +0,0 @@ -package at.hannibal2.skyhanni.data - -import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.config.ConfigManager -import at.hannibal2.skyhanni.events.CropMilestoneUpdateEvent -import at.hannibal2.skyhanni.features.garden.CropType -import at.hannibal2.skyhanni.utils.ItemUtils.getLore -import at.hannibal2.skyhanni.utils.ItemUtils.name -import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.LorenzUtils.editCopy -import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter -import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators -import at.hannibal2.skyhanni.utils.NumberUtil.formatNumber -import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimalIfNeeded -import at.hannibal2.skyhanni.utils.OSUtils -import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher -import at.hannibal2.skyhanni.utils.StringUtils.matches -import at.hannibal2.skyhanni.utils.StringUtils.removeColor -import kotlinx.coroutines.launch -import net.minecraft.item.ItemStack - -object GardenCropMilestonesFix { - private val pattern = ".*§e(?.*)§6/§e(?.*)".toPattern() - - fun openInventory(inventoryItems: Map) { - if (SkyHanniMod.feature.garden.copyMilestoneData) { - fixForWrongData(inventoryItems) - } - } - - private fun fixForWrongData(inventoryItems: Map) { - val data = mutableListOf() - for ((_, stack) in inventoryItems) { - val crop = GardenCropMilestones.getCropTypeByLore(stack) ?: continue - checkForWrongData(stack, crop, data) - - CropMilestoneUpdateEvent().postAndCatch() - } - - if (data.isNotEmpty()) { - LorenzUtils.chat( - "Found §c${data.size} §ewrong crop milestone steps in the menu! " + - "Correct data got put into clipboard. " + - "Please share it on the §bSkyHanni Discord §ein the channel §b#share-data§e." - ) - OSUtils.copyToClipboard("```${data.joinToString("\n")}```") -// } else { -// LorenzUtils.chat("No wrong crop milestone steps found!") - } - } - - private fun checkForWrongData( - stack: ItemStack, - crop: CropType, - wrongData: MutableList - ) { - val name = stack.name ?: return - val rawNumber = name.removeColor().replace(crop.cropName, "").trim() - val realTier = if (rawNumber == "") 0 else rawNumber.romanToDecimalIfNeeded() - - val lore = stack.getLore() - val next = lore.nextAfter({ GardenCropMilestones.totalPattern.matches(it) }, 3) ?: return - val total = lore.nextAfter({ GardenCropMilestones.totalPattern.matches(it) }, 6) ?: return - -// debug(" ") -// debug("crop: $crop") -// debug("realTier: $realTier") - - val guessNextMax = GardenCropMilestones.getCropsForTier( - realTier + 1, - crop - ) - GardenCropMilestones.getCropsForTier(realTier, crop) -// debug("guessNextMax: ${guessNextMax.addSeparators()}") - val nextMax = pattern.matchMatcher(next) { - group("max").formatNumber() - } ?: return -// debug("nextMax real: ${nextMax.addSeparators()}") - if (nextMax != guessNextMax) { -// debug("wrong, add to list") - wrongData.add("$crop:$realTier:${nextMax.addSeparators()}") - } - - val guessTotalMax = GardenCropMilestones.getCropsForTier(46, crop) -// println("guessTotalMax: ${guessTotalMax.addSeparators()}") - val totalMax = pattern.matchMatcher(total) { - group("max").formatNumber() - } ?: return -// println("totalMax real: ${totalMax.addSeparators()}") - val totalOffBy = guessTotalMax - totalMax -// debug("$crop total offf by: ${totalOffBy.addSeparators()}") - } - -// fun debug(message: String) { -// if (SkyHanniMod.feature.dev.debug.enabled) { -// println(message) -// } -// } - - /** - * This helps to fix wrong crop milestone data - * This command reads the clipboard content, - * in the format of users sending crop milestone step data. - * - * The new data will be compared to the currently saved data, - * differences are getting replaced, and the result gets put into the clipboard. - * The clipboard context can be used to update the repo content. - */ - fun readDataFromClipboard() { - SkyHanniMod.coroutineScope.launch { - OSUtils.readFromClipboard()?.let { - handleInput(it) - } - } - } - - private var totalFixedValues = 0 - - private fun handleInput(input: String) { - println(" ") - var fixed = 0 - var alreadyCorrect = 0 - for (line in input.lines()) { - val split = line.replace("```", "").replace(".", ",").split(":") - if (split.size != 3) continue - val (rawCrop, tier, amount) = split - val crop = LorenzUtils.enumValueOf(rawCrop) - - if (tryFix(crop, tier.toInt(), amount.formatNumber().toInt())) { - fixed++ - } else { - alreadyCorrect++ - } - } - totalFixedValues += fixed - LorenzUtils.chat("Fixed: $fixed/$alreadyCorrect, total fixes: $totalFixedValues") - val s = ConfigManager.gson.toJsonTree(GardenCropMilestones.cropMilestoneData).toString() - OSUtils.copyToClipboard("\"crop_milestones\":$s,") - } - - private fun tryFix(crop: CropType, tier: Int, amount: Int): Boolean { - val guessNextMax = GardenCropMilestones.getCropsForTier(tier + 1, crop) - GardenCropMilestones.getCropsForTier( - tier, - crop - ) - if (guessNextMax.toInt() == amount) { - return false - } - GardenCropMilestones.cropMilestoneData = GardenCropMilestones.cropMilestoneData.editCopy { - fix(crop, this, tier, amount) - } - return true - } - - private fun fix(crop: CropType, map: MutableMap>, tier: Int, amount: Int) { - map[crop] = map[crop]!!.editCopy { - this[tier] = amount - } - } -} diff --git a/src/main/java/at/hannibal2/skyhanni/data/OtherMod.kt b/src/main/java/at/hannibal2/skyhanni/data/OtherMod.kt deleted file mode 100644 index 391d669752c1..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/data/OtherMod.kt +++ /dev/null @@ -1,42 +0,0 @@ -package at.hannibal2.skyhanni.data - -import at.hannibal2.skyhanni.config.ConfigManager -import com.google.gson.JsonObject -import java.io.BufferedReader - -enum class OtherMod(val modName: String, val configPath: String, val readKey: (BufferedReader) -> (String)) { - NEU("Not Enough Updates", "config/notenoughupdates/configNew.json", { reader -> - getJson(reader)["apiData"].asJsonObject["apiKey"].asString - }), - COW("Cowlection", "config/cowlection/do-not-share-me-with-other-players.cfg", { reader -> - val lines = reader.readText().split(System.lineSeparator()) - val line = lines.find { it.startsWith(" S:moo=") }!! - line.split("=")[1] - }), - DSM("Dankers SkyBlock Mod", "config/Danker's Skyblock Mod.cfg", { reader -> - val lines = reader.readText().split(System.lineSeparator()) - val line = lines.find { it.startsWith(" S:APIKey=") }!! - line.split("=")[1] - }), - DG("Dungeons Guide", "config/dungeonsguide/config.json", { reader -> - getJson(reader)["partykicker.apikey"].asJsonObject["apikey"].asString - }), - SKYTILS("Skytils", "config/skytils/config.toml", { reader -> - val lines = reader.readText().split(System.lineSeparator()) - val line = lines.find { it.startsWith(" hypixel_api_key = \"") }!! - line.split("\"")[1] - }), - HYPIXEL_API_KEY_MANAGER("Hypixel API Key Manager", "HypixelApiKeyManager/localdata.json", { reader -> - getJson(reader)["key"].asString - }), - SOOPY("Soopy Addons", "soopyAddonsData/apikey.txt", { reader -> - reader.readText() - }), - SBE("SkyBlock Extras", "config/SkyblockExtras.cfg", { reader -> - getJson(reader)["values"].asJsonObject["apiKey"].asString - }), -} - -fun getJson(reader: BufferedReader): JsonObject { - return ConfigManager.gson.fromJson(reader, com.google.gson.JsonObject::class.java) -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCommands.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCommands.kt deleted file mode 100644 index 3ae6b81f6a65..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCommands.kt +++ /dev/null @@ -1,57 +0,0 @@ -package at.hannibal2.skyhanni.features.garden - -import at.hannibal2.skyhanni.events.LorenzKeyPressEvent -import at.hannibal2.skyhanni.events.MessageSendToServerEvent -import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.NEUItems -import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher -import net.minecraft.client.Minecraft -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent - -class GardenCommands { - private val config get() = GardenAPI.config.gardenCommands - - // TODO repo - private val tpPlotPattern = "/tp (?.*)".toPattern() - - @SubscribeEvent - fun onMessageSendToServer(event: MessageSendToServerEvent) { - if (!config.warpCommands) return - if (!GardenAPI.inGarden()) return - - val message = event.message.lowercase() - - if (message == "/home") { - event.isCanceled = true - LorenzUtils.sendCommandToServer("warp garden") - LorenzUtils.chat("§aTeleported you to the spawn location!", prefix = false) - } - - if (message == "/barn") { - event.isCanceled = true - LorenzUtils.sendCommandToServer("tptoplot barn") - } - - tpPlotPattern.matchMatcher(message) { - event.isCanceled = true - val plotName = group("plot") - LorenzUtils.sendCommandToServer("tptoplot $plotName") - } - } - - @SubscribeEvent - fun onKeyClick(event: LorenzKeyPressEvent) { - if (!GardenAPI.inGarden()) return - if (Minecraft.getMinecraft().currentScreen != null) return - if (NEUItems.neuHasFocus()) return - - val command = when (event.keyCode) { - config.homeHotkey -> "warp garden" - config.sethomeHotkey -> "sethome" - config.barnHotkey -> "tptoplot barn" - - else -> return - } - LorenzUtils.sendCommandToServer(command) - } -} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/DrawBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/DrawBackground.kt deleted file mode 100644 index 8cd020ea0406..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/DrawBackground.kt +++ /dev/null @@ -1,38 +0,0 @@ -package at.hannibal2.skyhanni.features.misc.customscoreboard - -import net.minecraft.client.gui.Gui -import kotlin.math.sqrt - -object DrawBackground { - fun drawFilledRoundedRect(x: Int, y: Int, width: Int, height: Int, cornerRadius: Int, color: Int) { - /* - https://discord.com/channels/997079228510117908/1094190239532208228/1178102696742494229 - */ - - // big middle one - Gui.drawRect(x, y, x + width, y + height, color) - // top - Gui.drawRect(x, y, x + width, y - cornerRadius, color) - // right - Gui.drawRect(x + width, y, x + width + cornerRadius, y + height, color) - // bottom - Gui.drawRect(x, y + height, x + width, y + height + cornerRadius, color) - // left - Gui.drawRect(x, y, x - cornerRadius, y + height, color) - - // top left - for (newX in -cornerRadius * 2..cornerRadius * 2) { - for (newY in -cornerRadius * 2..cornerRadius * 2) { - val distance = sqrt((newX * newX + newY * newY).toDouble()) - if (distance <= cornerRadius) { - val alpha = (255 * (1.0 - distance / cornerRadius)).toInt() - if (alpha > 0) { - Gui.drawRect(x + newX, y + newY, x + newX + 1, y + newY + 1, color) - } - } - } - } - } - - // Function to draw a filled quarter circle -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/AnitaUpgradeCostsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/AnitaUpgradeCostsJson.java deleted file mode 100644 index 09a2de7db9ba..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/AnitaUpgradeCostsJson.java +++ /dev/null @@ -1,18 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.Map; - -public class AnitaUpgradeCostsJson { - @Expose - public Map level_price; - - public static class Price { - @Expose - public Integer gold_medals; - - @Expose - public Integer jacob_tickets; - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ArmorDropsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ArmorDropsJson.java deleted file mode 100644 index 698bad3db170..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ArmorDropsJson.java +++ /dev/null @@ -1,19 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; -import java.util.Map; - -public class ArmorDropsJson { - @Expose - public Map special_crops; - - public static class DropInfo { - @Expose - public String armor_type; - - @Expose - public List chance; - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoJson.java deleted file mode 100644 index 810f6d3abfd1..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoJson.java +++ /dev/null @@ -1,19 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; -import java.util.Map; - -public class BingoJson { - @Expose - public Map bingo_tips; - - public static class BingoTip { - @Expose - public String difficulty; - - @Expose - public List note; - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoRanksJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoRanksJson.java deleted file mode 100644 index 49d7e662f49d..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/BingoRanksJson.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.Map; - -public class BingoRanksJson { - @Expose - public Map ranks; -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java deleted file mode 100644 index 8e5648f5e62b..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; - -public class ContributorListJson { - @Expose - public List usernames; -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/CrimsonIsleReputationJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/CrimsonIsleReputationJson.java deleted file mode 100644 index 9235680fb365..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/CrimsonIsleReputationJson.java +++ /dev/null @@ -1,34 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; -import java.util.Map; - -public class CrimsonIsleReputationJson { - @Expose - public Map FISHING; - - @Expose - public Map RESCUE; - - @Expose - public Map FETCH; - - @Expose - public Map DOJO; - - @Expose - public Map MINIBOSS; - - @Expose - public Map KUUDRA; - - public static class ReputationQuest { - @Expose - public String item; - - @Expose - public List location; - } -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DanceRoomInstructionsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DanceRoomInstructionsJson.java deleted file mode 100644 index 9316d8671f9c..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DanceRoomInstructionsJson.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; - -public class DanceRoomInstructionsJson { - @Expose - public List instructions; -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DicerDropsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DicerDropsJson.java deleted file mode 100644 index 996a558eaf8e..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DicerDropsJson.java +++ /dev/null @@ -1,31 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; -import com.google.gson.annotations.SerializedName; - -import java.util.List; - -public class DicerDropsJson { - @Expose - public DicerType MELON; - - @Expose - public DicerType PUMPKIN; - - public static class DicerType { - @Expose - @SerializedName("total chance") - public Integer totalChance; - - @Expose - public List drops; - } - - public static class DropInfo { - @Expose - public Integer chance; - - @Expose - public List amount; - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DisabledFeaturesJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DisabledFeaturesJson.java deleted file mode 100644 index 45abedfa3da1..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/DisabledFeaturesJson.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.Map; - -public class DisabledFeaturesJson { - @Expose - public Map features; -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/EnigmaSoulsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/EnigmaSoulsJson.java deleted file mode 100644 index 5769520f5c41..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/EnigmaSoulsJson.java +++ /dev/null @@ -1,20 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import at.hannibal2.skyhanni.utils.LorenzVec; -import com.google.gson.annotations.Expose; - -import java.util.List; -import java.util.Map; - -public class EnigmaSoulsJson { - @Expose - public Map> areas; - - public static class EnigmaPosition { - @Expose - public String name; - - @Expose - public LorenzVec position; - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java deleted file mode 100644 index d17fd7d30640..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java +++ /dev/null @@ -1,12 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import at.hannibal2.skyhanni.utils.NEUInternalName; -import com.google.gson.annotations.Expose; - -import java.util.List; -import java.util.Map; - -public class FishingProfitItemsJson { - @Expose - public Map> categories; -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FriendsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FriendsJson.java deleted file mode 100644 index 82482b6a68cb..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FriendsJson.java +++ /dev/null @@ -1,24 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.Map; -import java.util.UUID; - -public class FriendsJson { - @Expose - public Map players; - - public static class PlayerFriends { - - @Expose - public Map friends; - - public static class Friend { - @Expose - public String name; - @Expose - public boolean bestFriend; - } - } -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java deleted file mode 100644 index 7bc9cf7fa9a7..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java +++ /dev/null @@ -1,58 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import at.hannibal2.skyhanni.features.garden.CropType; -import at.hannibal2.skyhanni.utils.LorenzRarity; -import at.hannibal2.skyhanni.utils.LorenzVec; -import com.google.gson.annotations.Expose; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.Map; - -public class GardenJson { - @Expose - public List garden_exp; - - @Expose - public Map> crop_milestones; - - @Expose - public Map crop_milestone_community_help; - - @Expose - public Map visitors; - - @Expose - public Map organic_matter; - - @Expose - public Map fuel; - - public static class GardenVisitor { - @Expose - public LorenzRarity rarity; - - @Expose - public LorenzRarity new_rarity; - - @Nullable - @Expose - public LorenzVec position; - - /** - * Formatted as follows: - * - If this visitor is a player, get the encoded skin value - * - If this visitor is a mob, get their mob class name - */ - @Nullable - @Expose - public String skinOrType; - - @Nullable - @Expose - public String mode; - - @Expose - public List need_items; - } -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/HideNotClickableItemsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/HideNotClickableItemsJson.java deleted file mode 100644 index d4ac9c52b41f..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/HideNotClickableItemsJson.java +++ /dev/null @@ -1,30 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; - -public class HideNotClickableItemsJson { - @Expose - public MultiFilterJson hide_npc_sell; - - @Expose - public MultiFilterJson hide_in_storage; - - @Expose - public MultiFilterJson hide_player_trade; - - @Expose - public MultiFilterJson not_auctionable; - - @Expose - public SalvageFilter salvage; - - public static class SalvageFilter { - @Expose - public List armor; - - @Expose - public List items; - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ItemsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ItemsJson.java deleted file mode 100644 index f3767191331a..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ItemsJson.java +++ /dev/null @@ -1,14 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; -import java.util.Map; - -public class ItemsJson { - @Expose - public List crimson_armors; - - @Expose - public Map crimson_tiers; -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/JacobContestsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/JacobContestsJson.java deleted file mode 100644 index 87d1e9a22ef4..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/JacobContestsJson.java +++ /dev/null @@ -1,13 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import at.hannibal2.skyhanni.features.garden.CropType; -import com.google.gson.annotations.Expose; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class JacobContestsJson { - @Expose - public Map> contestTimes = new HashMap<>(); -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/KnownFeaturesJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/KnownFeaturesJson.java deleted file mode 100644 index bd5048cfbd0a..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/KnownFeaturesJson.java +++ /dev/null @@ -1,12 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class KnownFeaturesJson { - @Expose - public Map> knownFeatures = new HashMap<>(); -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/LocationFixJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/LocationFixJson.java deleted file mode 100644 index 802627e7a7cf..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/LocationFixJson.java +++ /dev/null @@ -1,27 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import at.hannibal2.skyhanni.utils.LorenzVec; -import com.google.gson.annotations.Expose; - -import java.util.Map; - -public class LocationFixJson { - - @Expose - public Map locationFixes; - - public static class LocationFix { - @Expose - public LorenzVec a; - - @Expose - public LorenzVec b; - - @Expose - public String island_name; - - @Expose - public String real_location; - } - -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java deleted file mode 100644 index d2173c74bf43..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java +++ /dev/null @@ -1,70 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.ArrayList; - -public class MayorJson { - @Expose - public boolean success; - @Expose - public long lastUpdated; - @Expose - public Mayor mayor; - @Expose - public Election current; - - public class Candidate { - @Expose - public String key; - @Expose - public String name; - @Expose - public ArrayList perks; - @Expose - public int votes; - - @Override - public String toString() { - return "Candidate{" + - "key='" + key + '\'' + - ", name='" + name + '\'' + - ", perks=" + perks + - ", votes=" + votes + - '}'; - } - } - - public class Election { - @Expose - public int year; - @Expose - public ArrayList candidates; - } - - public class Mayor { - @Expose - public String key; - @Expose - public String name; - @Expose - public ArrayList perks; - @Expose - public Election election; - } - - public static class Perk { - @Expose - public String name; - @Expose - public String description; - - @Override - public String toString() { - return "Perk{" + - "name='" + name + '\'' + - ", description='" + description + '\'' + - '}'; - } - } -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ModGuiSwitcherJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ModGuiSwitcherJson.java deleted file mode 100644 index 078b1f6ad537..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ModGuiSwitcherJson.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ModGuiSwitcherJson { - - @Expose - public Map mods = new HashMap<>(); - - public static class Mod { - @Expose - public List description = new ArrayList<>(); - - @Expose - public String command = ""; - - @Expose - public List guiPath = new ArrayList<>(); - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MultiFilterJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MultiFilterJson.java deleted file mode 100644 index 8704f91fbaf6..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MultiFilterJson.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; - -public class MultiFilterJson { - @Expose - public List equals; - - @Expose - public List startsWith; - - @Expose - public List endsWith; - - @Expose - public List contains; - - @Expose - public List containsWord; - - @Expose - public String description; -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ParkourJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ParkourJson.java deleted file mode 100644 index 5ae2d40cae55..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ParkourJson.java +++ /dev/null @@ -1,23 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import at.hannibal2.skyhanni.utils.LorenzVec; -import com.google.gson.annotations.Expose; - -import java.util.ArrayList; -import java.util.List; - -public class ParkourJson { - @Expose - public List locations; - - @Expose - public List shortCuts = new ArrayList<>(); - - public static class ShortCut { - @Expose - public int from; - - @Expose - public int to; - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/PlayerChatFilterJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/PlayerChatFilterJson.java deleted file mode 100644 index a65a2f8a1957..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/PlayerChatFilterJson.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; - -public class PlayerChatFilterJson { - @Expose - public List filters; -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/RiftEffigiesJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/RiftEffigiesJson.java deleted file mode 100644 index d914ef9344f2..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/RiftEffigiesJson.java +++ /dev/null @@ -1,11 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import at.hannibal2.skyhanni.utils.LorenzVec; -import com.google.gson.annotations.Expose; - -import java.util.List; - -public class RiftEffigiesJson { - @Expose - public List locations; -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SacksJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SacksJson.java deleted file mode 100644 index dfd2103efc4e..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SacksJson.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; - -public class SacksJson { - @Expose - public List sackList; -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java deleted file mode 100644 index 04990d8d063f..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java +++ /dev/null @@ -1,33 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import at.hannibal2.skyhanni.utils.LorenzRarity; -import com.google.gson.annotations.Expose; -import com.google.gson.reflect.TypeToken; - -import java.lang.reflect.Type; -import java.util.Map; - -public class SeaCreatureJson { - - public static Type TYPE = new TypeToken>() { - }.getType(); - - public static class Variant { - @Expose - public String chat_color; - @Expose - public Map sea_creatures; - } - - public static class SeaCreature { - @Expose - public String chat_message; - @Expose - public int fishing_experience; - @Expose - public Boolean rare; - @Expose - public LorenzRarity rarity; - } - -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SlayerProfitTrackerItemsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SlayerProfitTrackerItemsJson.java deleted file mode 100644 index 37758220016b..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SlayerProfitTrackerItemsJson.java +++ /dev/null @@ -1,12 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import at.hannibal2.skyhanni.utils.NEUInternalName; -import com.google.gson.annotations.Expose; - -import java.util.List; -import java.util.Map; - -public class SlayerProfitTrackerItemsJson { - @Expose - public Map> slayers; -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TabListJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TabListJson.java deleted file mode 100644 index 03c256256767..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TabListJson.java +++ /dev/null @@ -1,11 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; - -public class TabListJson { - - @Expose - public List sun_moon_symbols; -} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java deleted file mode 100644 index 6303c16be4fd..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import at.hannibal2.skyhanni.features.fishing.trophy.TrophyRarity; -import com.google.gson.annotations.Expose; - -import java.util.Map; - -public class TrophyFishJson { - @Expose - public Map trophy_fish; - - public static class TrophyFishInfo { - @Expose - public String displayName; - - @Expose - public String description; - - @Expose - public Integer rate; - - @Expose - public Map fillet; - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/VipVisitsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/VipVisitsJson.java deleted file mode 100644 index c80f4953f2dc..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/VipVisitsJson.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; - -public class VipVisitsJson { - @Expose - public List vipVisits; -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/WarpsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/WarpsJson.java deleted file mode 100644 index e09bf3c9d40f..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/WarpsJson.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.hannibal2.skyhanni.utils.jsonobjects; - -import com.google.gson.annotations.Expose; - -import java.util.List; - -public class WarpsJson { - @Expose - public List warpCommands; -} \ No newline at end of file diff --git a/src/main/resources/assets/skyhanni/rareScoreboardBackground.png b/src/main/resources/assets/skyhanni/rareScoreboardBackground.png deleted file mode 100644 index be62760b5ec245beecabc929d7d6eb7bb139f254..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168412 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

_^y&@m;FwF4@b_{|E^zSix*@UtL!3)i4zq_ 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 (o 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

#HhW!+1z(IZLZ{`N=b|g|DRlJ;Kzs3 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�%faORee`bR+ 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 From ec5ae44850ea3618f846995fffb851c8743babaf Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 15:17:21 +0100 Subject: [PATCH 140/225] first try new config systen --- .../CustomScoreboardConfig.java | 67 +++++++++++-------- .../misc/customscoreboard/CustomScoreboard.kt | 2 +- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index aba93ad19af4..8d67627c114e 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -32,35 +32,46 @@ public class CustomScoreboardConfig { name = "Text Format", desc = "Drag text to change the appearance of the scoreboard." ) - @ConfigEditorDraggableList( - exampleText = { - "§6§lSKYBLOCK", - "§7♲ Blueberry", - "Purse: §652,763,737", - "Motes: §d64,647", - "Bank: §6249M", - "Bits: §b59,264", - "Copper: §c23,495", - "Gems: §a57,873", - "Heat: §c♨ 0", - "", - "§7⏣ §bVillage", - "Late Summer 11th", - "§710:40pm", - "§8m77CK", - "Power: Sighted", - "", - "Objective:\n§eUpdate SkyHanni", - "§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills", - "", - "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234", - "§7Wide Range of Events\n§7(too much for this here)", - "§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff", - "§9§lParty (4):\n §7- §fhannibal2\n §7- §fMoulberry\n §7- §fVahvl\n §7- §fJ10a1n15", - "§ewww.hypixel.net", + @ConfigEditorDraggableList() + + public List textFormat = new ArrayList<>(Arrays.asList(ScoreboardEntry.values())); + public enum ScoreboardEntry { + TITLE("§6§lSKYBLOCK"), + PROFILE("§7♲ Blueberry"), + PURSE("Purse: §652,763,737"), + MOTES("Motes: §d64,647"), + BANK("Bank: §6249M"), + BITS("Bits: §b59,264"), + COPPER("Copper: §c23,495"), + GEMS("Gems: §a57,873"), + HEAT("Heat: §c♨ 0"), + EMPTY_LINE(""), + LOCATION("§7⏣ §bVillage"), + DATE("Late Summer 11th"), + TIME("§710:40pm"), + LOBBY_CODE("§8m77CK"), + POWER("Power: Sighted"), + EMPTY_LINE2(""), + OBJECTIVE("Objective:\n§eUpdate SkyHanni"), + SLAYER("§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills"), + EMPTY_LINE3(""), + POWDER("§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234"), + EVENTS("§7Wide Range of Events\n§7(too much for this here)"), + MAYOR("§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff"), + PARTY("§9§lParty (4):\n §7- §fhannibal2\n §7- §fMoulberry\n §7- §fVahvl\n §7- §fJ10a1n15"), + FOOTER("§ewww.hypixel.net"); + + private final String str; + + ScoreboardEntry(String str) { + this.str = str; } - ) - public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)); + + @Override + public String toString() { + return str; + } + } @Expose @ConfigOption(name = "Display Options", desc = "") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 11465e4d2aa5..7770a31f9697 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -82,7 +82,7 @@ class CustomScoreboard { private fun formatLines(lineMap: HashMap>): MutableList { val newList = mutableListOf() for (index in config.textFormat) { - lineMap[index]?.let { + lineMap[index.ordinal]?.let { // Hide consecutive empty lines if (config.informationFilteringConfig.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull() == "") { continue From 889c09f9832c886d4c3df05c00f4e70af6d7f25d Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 15:18:54 +0100 Subject: [PATCH 141/225] removed remnant --- .../features/misc/customscoreboard/CustomScoreboard.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 7770a31f9697..9381a485c54c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -42,7 +42,6 @@ import kotlin.math.pow private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList() -private var cache = emptyList>() class CustomScoreboard { @@ -74,8 +73,6 @@ class CustomScoreboard { lineMap[element.index] = if (element.isVisible()) element.getLine() else listOf("") } - cache = lineMap.values.toList() - return formatLines(lineMap) } From 202e82751b063fce8323310d9c3b9fbecf745b55 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 15:30:59 +0100 Subject: [PATCH 142/225] added/removed empty space --- .../features/gui/customscoreboard/CustomScoreboardConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index 8d67627c114e..35c2969e9c3a 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -33,8 +33,8 @@ public class CustomScoreboardConfig { desc = "Drag text to change the appearance of the scoreboard." ) @ConfigEditorDraggableList() - public List textFormat = new ArrayList<>(Arrays.asList(ScoreboardEntry.values())); + public enum ScoreboardEntry { TITLE("§6§lSKYBLOCK"), PROFILE("§7♲ Blueberry"), From 006c3c6d63c249dc01db06d5dde24e0be3609e9e Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 19:52:01 +0100 Subject: [PATCH 143/225] Fixed goblin raid name --- .../hannibal2/skyhanni/features/misc/customscoreboard/Events.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index c036dbb12bf6..f5e4e1c80b54 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -242,7 +242,7 @@ enum class Events(private val displayLine: Supplier>, private val s // Zone Events if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event: ") }) { list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Event: ") } - ?.removePrefix("Event: ") ?: "" + ?.removePrefix("Event: ")?.replace("GLOBIRAID", "GOBLIN RAID") ?: "" list += "§fin " + (ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Zone: ") } ?.removePrefix("Zone: ") ?: "" ) } From 20ac6de820a8e178b3c808d5d7fd1af291ab0137 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 20:00:54 +0100 Subject: [PATCH 144/225] Fixed bottom being too low --- .../features/misc/customscoreboard/RenderBackground.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index 75402585f2bd..5a6aadfc15d2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -67,7 +67,7 @@ class RenderBackground { (x - border).toFloat(), (y - border).toFloat(), (elementWidth + border * 3).toFloat(), - (elementHeight + border * 3).toFloat(), + (elementHeight + border * 2).toFloat(), GL11.GL_NEAREST ) } else if (config.backgroundConfig.enabled) { @@ -76,7 +76,7 @@ class RenderBackground { x - border, y - border, x + elementWidth + border * 2, - y + elementHeight + border * 2, + y + elementHeight + border, SpecialColour.specialToChromaRGB(config.backgroundConfig.color) ) } From a7ef2a9629946496e638f7c4c24be1f47c9acce0 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 21:25:02 +0100 Subject: [PATCH 145/225] changed 1 small config thing --- .../features/gui/customscoreboard/CustomScoreboardConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index 35c2969e9c3a..fb8a07e5dc59 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -29,8 +29,8 @@ public class CustomScoreboardConfig { @Expose @ConfigOption( - name = "Text Format", - desc = "Drag text to change the appearance of the scoreboard." + name = "Appearance", + desc = "Drag text to change the appearance of the advanced scoreboard." // now supporting both custom & advanced search ) @ConfigEditorDraggableList() public List textFormat = new ArrayList<>(Arrays.asList(ScoreboardEntry.values())); From 1f1185b8ad382d2ce40c6af0c0167433bcef543e Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 30 Nov 2023 22:13:36 +0100 Subject: [PATCH 146/225] added a bit more funny comments --- .../features/misc/customscoreboard/CustomScoreboard.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 9381a485c54c..7f0cef64be6d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -1,6 +1,7 @@ // // Requested by alpaka8123 (https://discord.com/channels/997079228510117908/1162844830360146080) -// Done by J10a1n15, with lots of help from hanni, and snippets from item tracker features <3 +// Done by J10a1n15, with lots of help from hanni and more contribs <3 +// Also big thanks to the people that tested it before it released, saved me some time <3 // // From 04e8ba7c9705ed3d3e14eb82b630eb711369af7c Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 1 Dec 2023 06:56:53 +0100 Subject: [PATCH 147/225] Removed party count reset --- .../features/misc/customscoreboard/InformationGetter.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 38d6ddf52566..4056bcb826fc 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -7,9 +7,6 @@ import at.hannibal2.skyhanni.utils.TabListData class InformationGetter { fun getInformation(){ - // Resets Party count - partyCount = 0 - // Gets some values from the tablist for (line in TabListData.getTabList()) { when { From 06d4c5e10b1a5bf685970a0ca8d6c4b830a033bf Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 1 Dec 2023 06:57:39 +0100 Subject: [PATCH 148/225] Added back party count --- .../skyhanni/features/misc/customscoreboard/Elements.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 688a438d8c82..b0886ce6668c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -303,6 +303,9 @@ enum class Elements( ), PARTY( { + // Resets Party count + partyCount = 0 + val partyTitle: List = if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { listOf("") From 371bf19e1e664decf7a6d670d2c37bf0b3fe69ad Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:03:48 +0100 Subject: [PATCH 149/225] Resetting bits on profile switch --- .../features/misc/customscoreboard/InformationGetter.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 38d6ddf52566..7d169ff1631b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -2,8 +2,11 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.data.PurseAPI import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.events.PreProfileSwitchEvent +import at.hannibal2.skyhanni.events.ProfileJoinEvent import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.TabListData +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class InformationGetter { fun getInformation(){ @@ -36,4 +39,10 @@ class InformationGetter { } } } + + @SubscribeEvent + fun onProfileSwitch(event: ProfileJoinEvent) { + // Reset Bits - We need this bc if another profile has 0 bits, it won't show the bits line + bits = "0" + } } From 8c163a0f4d7b9a74c087b0e50021ac26cfaaa608 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 1 Dec 2023 14:26:59 +0100 Subject: [PATCH 150/225] Maybe added extra lines? Idk cant test it --- .../CustomScoreboardConfig.java | 4 +- .../misc/customscoreboard/Elements.kt | 17 +++- .../customscoreboard/InformationGetter.kt | 94 ++++++++++++++++++- 3 files changed, 106 insertions(+), 9 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index fb8a07e5dc59..e2ced4257829 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -59,7 +59,9 @@ public enum ScoreboardEntry { EVENTS("§7Wide Range of Events\n§7(too much for this here)"), MAYOR("§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff"), PARTY("§9§lParty (4):\n §7- §fhannibal2\n §7- §fMoulberry\n §7- §fVahvl\n §7- §fJ10a1n15"), - FOOTER("§ewww.hypixel.net"); + FOOTER("§ewww.hypixel.net"), + EXTRA("§7Extra lines the mod is not detecting") + ; private final String str; diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index b0886ce6668c..8cc1047ede96 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -31,6 +31,7 @@ var heat = "0" var mithrilPowder = "0" var gemstonePowder = "0" var partyCount = 0 +var extraLines = listOf() enum class Elements( private val displayLine: Supplier>, @@ -303,8 +304,8 @@ enum class Elements( ), PARTY( { - // Resets Party count - partyCount = 0 + // Resets Party count + partyCount = 0 val partyTitle: List = if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { @@ -349,7 +350,17 @@ enum class Elements( true }, 23 - ); + ), + EXTRA_LINES( + { + listOf("Undetected Lines (pls report):") + extraLines + }, + { + extraLines.isNotEmpty() + }, + 24 + ), + ; fun getLine(): List { return displayLine.get() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 66353f9d2885..7a7a313eda52 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -1,15 +1,15 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard -import at.hannibal2.skyhanni.data.PurseAPI import at.hannibal2.skyhanni.data.ScoreboardData -import at.hannibal2.skyhanni.events.PreProfileSwitchEvent +import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.events.ProfileJoinEvent -import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData +import net.minecraft.scoreboard.Score import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class InformationGetter { - fun getInformation(){ + fun getInformation() { // Gets some values from the tablist for (line in TabListData.getTabList()) { when { @@ -17,6 +17,7 @@ class InformationGetter { line.startsWith(" Bank: §r§6") -> bank = line.removePrefix(" Bank: §r§6") line.startsWith(" §r§fMithril Powder: §r§2") -> mithrilPowder = line.removePrefix(" §r§fMithril Powder: §r§2") + line.startsWith(" §r§fGemstone Powder: §r§d") -> gemstonePowder = line.removePrefix(" §r§fGemstone Powder: §r§d") } @@ -26,7 +27,9 @@ class InformationGetter { for (line in ScoreboardData.sidebarLinesFormatted) { when { line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ") -> location = line - line.startsWith("Purse: §6") || line.startsWith("Piggy: §6") -> purse = line.removePrefix("Purse: §6").removePrefix("Piggy: §6") + line.startsWith("Purse: §6") || line.startsWith("Piggy: §6") -> purse = + line.removePrefix("Purse: §6").removePrefix("Piggy: §6") + line.startsWith("Motes: §d") -> motes = line.removePrefix("Motes: §d") extractLobbyCode(line) is String -> lobbyCode = extractLobbyCode(line)?.substring(1) ?: "" //removes first char (number of color code) @@ -42,4 +45,85 @@ class InformationGetter { // Reset Bits - We need this bc if another profile has 0 bits, it won't show the bits line bits = "0" } + + @SubscribeEvent + fun onTick(event: LorenzTickEvent) { + val knownLines = listOf( + "§7⏣ ", + "§5ф ", + "Purse: §6", + "Piggy: §6", + "Motes: §d", + "Heat: ", + "Bits: §b", + "Copper: §c", + lobbyCode ?: "", + "§ewww.hyp", + "§ealpha.hyp", + "§cServer closing: ", + "Auto-closing in:", + "Starting in:", + "Keys: ", + "Time Elapsed:", + "§rCleared: ", + "Instance ShutdowIn:", + "Time Elapsed: ", + "§f§lWave: §c§l", + "§fTokens: ", + "Submerges In: §e", + "§fObjective:", + "Objective:", + "§eJacob's Contest", + "§6§lGOLD §fmedals", + "§f§lSILVER §fmedals", + "§c§lBRONZE §fmedals", + "North Stars: §d", + "Event Start: §a", + "Next Wave: §a", + "§cWave", + "Magma Cubes Left§c", + "Your Total Damag §c", + "Your Cube Damage§c", + "§6Spooky Festival§f", + "§dNew Year Event", + "§aTraveling Zoo", + "§9Wind Compass", + "Nearby Players:", + "Event: ", + "Zone: ", + "Protector HP: §a", + "Dragon HP: §a", + "Your Damage: §c", + "Essence: " + ) + + extraLines = ScoreboardData.sidebarLinesFormatted.filter { line -> !knownLines.any { line.startsWith(it) } } + + // filter empty lines + extraLines.filter { it.trim() == "" } + + // remove objectives + extraLines.filter { ScoreboardData.sidebarLinesFormatted.nextAfter("§fObjective:") == it } + extraLines.filter { ScoreboardData.sidebarLinesFormatted.nextAfter("Objective:") == it } + + // remove wind compass + extraLines.filter { ScoreboardData.sidebarLinesFormatted.nextAfter("§9Wind Compass") == it } + + // Remove dungeon teammates + val dungeonPlayers = TabListData.getTabList().firstOrNull { it.trim().startsWith("§r§b§lParty §r§f(") } + ?.trim()?.removePrefix("§r§b§lParty §r§f(")?.removeSuffix(")")?.toInt() ?: 1 + val clearedLine = ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§rCleared: ") }.toString() + + if (dungeonPlayers != 0) { + if (dungeonPlayers > 1) { + for (i in 1..dungeonPlayers) { + extraLines.filter { ScoreboardData.sidebarLinesFormatted.nextAfter(clearedLine, i) == it } + } + } + } + + // Remove jacobs contest + for (i in 1..3) + extraLines.filter { ScoreboardData.sidebarLinesFormatted.nextAfter("§eJacob's Contest", i) == it } + } } From 1afada56c6e19bbfa7062130906c3e3a42ab25d6 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:07:48 +0100 Subject: [PATCH 151/225] Fixed configeditor flickering --- .../skyhanni/features/misc/customscoreboard/RenderBackground.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index 5a6aadfc15d2..b3821a927874 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -58,7 +58,6 @@ class RenderBackground { GlStateManager.pushAttrib(); GlStateManager.color(1f, 1f, 1f, 1f) - GlStateManager.enableDepth() if (config.backgroundConfig.enabled && config.backgroundConfig.useCustomBackgroundImage) { // Draw the default texture From 4cb2a068526d62271c4c4cb9731d47e72f5dd813 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 1 Dec 2023 20:48:35 +0100 Subject: [PATCH 152/225] Fixed "cleared" line support for hypixel style --- .../skyhanni/features/misc/customscoreboard/Events.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index f5e4e1c80b54..29964272e969 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -37,8 +37,8 @@ enum class Events(private val displayLine: Supplier>, private val s if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Time Elapsed: ") }) { list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Time Elapsed: ") } ?: "" } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§rCleared: ") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§rCleared: ") }.toString() + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§rCleared: ") || it.startsWith("Cleared: ") }) { + list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§rCleared: ") || it.startsWith("Cleared:") }.toString() .replace("§r", "").replace("%", "%§") // for some reason this is broken } @@ -50,11 +50,14 @@ enum class Events(private val displayLine: Supplier>, private val s list += "§3§lSolo" } else { for (i in 1..dungeonPlayers) { - list += ScoreboardData.sidebarLinesFormatted.nextAfter( + list += ScoreboardData.sidebarLinesFormatted.nextAfter( // Bettermap Style "§r" + (list.firstOrNull{ it.startsWith("Cleared: ") }?.replace("%§", "%") ?: "§cNo Dungeon Data"), i ) - ?: "§cNo Player found" + ?: ScoreboardData.sidebarLinesFormatted.nextAfter( // Hypixel Style + list.firstOrNull{ it.startsWith("Cleared: ") }?.replace("%§", "%") ?: "§cNo Dungeon Data", + i + ) ?: "§cTeammate not found" } } } From f2821b73e4ab0dcd8a7f09d192a7eefbbc902bc5 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 2 Dec 2023 21:16:52 +0100 Subject: [PATCH 153/225] changed show party everywhere desc --- .../config/features/gui/customscoreboard/PartyConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java index 62936512cdf6..8c4469f4dbd0 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java @@ -18,7 +18,7 @@ public class PartyConfig { public Property maxPartyList = Property.of(4); @Expose - @ConfigOption(name = "Show Party everywhere", desc = "Show the party list everywhere.") + @ConfigOption(name = "Show Party everywhere", desc = "Show the party list everywhere.\nIf disabled, it will only show in Dungeon hub, Crimson Isle & Kuudra") @ConfigEditorBoolean @FeatureToggle public boolean showPartyEverywhere = false; From fdc4e2bbecbf2abf16b7c0ba6be3b80d343c336b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 2 Dec 2023 21:57:30 +0100 Subject: [PATCH 154/225] fixed bits on bingo, fixed extra information --- .../misc/customscoreboard/CustomScoreboard.kt | 11 +++++ .../misc/customscoreboard/Elements.kt | 7 +-- .../customscoreboard/InformationGetter.kt | 48 +++++++++++-------- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 7f0cef64be6d..ebd210353492 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -25,11 +25,14 @@ import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings import at.hannibal2.skyhanni.utils.SpecialColour +import at.hannibal2.skyhanni.utils.TabListData import net.minecraft.client.Minecraft import net.minecraft.client.gui.Gui import net.minecraft.client.gui.ScaledResolution @@ -113,6 +116,14 @@ class CustomScoreboard { } } + @SubscribeEvent + fun onChatMessage(event: LorenzChatEvent) { + // Reset Bits - We need this bc if another profile has 0 bits, it won't show the bits line + if (event.message.startsWith("§aYour profile was changed to:")) { + bits = "0" + } + } + private fun isCustomScoreboardEnabled() = config.enabled && LorenzUtils.inSkyBlock private fun isHideVanillaScoreboardEnabled() = config.displayConfig.hideVanillaScoreboard && LorenzUtils.inSkyBlock } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 8cc1047ede96..b6d3c372d97d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -10,6 +10,7 @@ import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.mixins.hooks.replaceString import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons +import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.TimeUtils.formatted @@ -107,7 +108,7 @@ enum class Elements( } }, { - !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + !listOf(IslandType.THE_RIFT, IslandType.CATACOMBS).contains(HypixelData.skyBlockIsland) }, 5 ), @@ -133,7 +134,7 @@ enum class Elements( } }, { - !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + !listOf(IslandType.THE_RIFT, IslandType.CATACOMBS).contains(HypixelData.skyBlockIsland) }, 7 ), @@ -353,7 +354,7 @@ enum class Elements( ), EXTRA_LINES( { - listOf("Undetected Lines (pls report):") + extraLines + listOf("§cUndetected Lines (pls report):") + extraLines }, { extraLines.isNotEmpty() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 7a7a313eda52..730e127f5941 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -1,8 +1,11 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.LorenzTickEvent +import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent import at.hannibal2.skyhanni.events.ProfileJoinEvent +import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData import net.minecraft.scoreboard.Score @@ -10,6 +13,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class InformationGetter { fun getInformation() { + val sidebarLines = ScoreboardData.sidebarLinesFormatted + // Gets some values from the tablist for (line in TabListData.getTabList()) { when { @@ -24,7 +29,7 @@ class InformationGetter { } // Gets some values from the scoreboard - for (line in ScoreboardData.sidebarLinesFormatted) { + for (line in sidebarLines) { when { line.startsWith(" §7⏣ ") || line.startsWith(" §5ф ") -> location = line line.startsWith("Purse: §6") || line.startsWith("Piggy: §6") -> purse = @@ -38,16 +43,7 @@ class InformationGetter { line.startsWith("Copper: §c") -> copper = line.removePrefix("Copper: §c") } } - } - @SubscribeEvent - fun onProfileSwitch(event: ProfileJoinEvent) { - // Reset Bits - We need this bc if another profile has 0 bits, it won't show the bits line - bits = "0" - } - - @SubscribeEvent - fun onTick(event: LorenzTickEvent) { val knownLines = listOf( "§7⏣ ", "§5ф ", @@ -57,6 +53,8 @@ class InformationGetter { "Heat: ", "Bits: §b", "Copper: §c", + "Late", + "Early", lobbyCode ?: "", "§ewww.hyp", "§ealpha.hyp", @@ -94,36 +92,46 @@ class InformationGetter { "Protector HP: §a", "Dragon HP: §a", "Your Damage: §c", - "Essence: " - ) + "Essence: ", + "§e☀", + "§b☽", + "Ⓑ", + "§a☀", + "§7♲", + "Slayer Quest" + ) - extraLines = ScoreboardData.sidebarLinesFormatted.filter { line -> !knownLines.any { line.startsWith(it) } } + extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } // filter empty lines - extraLines.filter { it.trim() == "" } + extraLines = extraLines.filter { it.isNotBlank() } // remove objectives - extraLines.filter { ScoreboardData.sidebarLinesFormatted.nextAfter("§fObjective:") == it } - extraLines.filter { ScoreboardData.sidebarLinesFormatted.nextAfter("Objective:") == it } + extraLines = extraLines.filter { sidebarLines.nextAfter("§fObjective:") != it } + extraLines = extraLines.filter { sidebarLines.nextAfter("Objective:") != it } // remove wind compass - extraLines.filter { ScoreboardData.sidebarLinesFormatted.nextAfter("§9Wind Compass") == it } + extraLines = extraLines.filter { sidebarLines.nextAfter("§9Wind Compass") != it } // Remove dungeon teammates val dungeonPlayers = TabListData.getTabList().firstOrNull { it.trim().startsWith("§r§b§lParty §r§f(") } ?.trim()?.removePrefix("§r§b§lParty §r§f(")?.removeSuffix(")")?.toInt() ?: 1 - val clearedLine = ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§rCleared: ") }.toString() + val clearedLine = sidebarLines.firstOrNull { it.startsWith("§rCleared: ") }.toString() if (dungeonPlayers != 0) { if (dungeonPlayers > 1) { for (i in 1..dungeonPlayers) { - extraLines.filter { ScoreboardData.sidebarLinesFormatted.nextAfter(clearedLine, i) == it } + extraLines = extraLines.filter { sidebarLines.nextAfter(clearedLine, i) != it } } } } // Remove jacobs contest for (i in 1..3) - extraLines.filter { ScoreboardData.sidebarLinesFormatted.nextAfter("§eJacob's Contest", i) == it } + extraLines = extraLines.filter { sidebarLines.nextAfter("§eJacob's Contest", i) != it } + + // Remove slayer + extraLines = extraLines.filter { sidebarLines.nextAfter("Slayer Quest", 1) != it } + extraLines = extraLines.filter { sidebarLines.nextAfter("Slayer Quest", 2) != it } } } From fbfa178a0e47fbf006d189970ce350b238e5e68f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 2 Dec 2023 22:18:21 +0100 Subject: [PATCH 155/225] added broodmother, fixed mining event names --- .../features/misc/customscoreboard/Events.kt | 17 ++++++++++++++++- .../misc/customscoreboard/InformationGetter.kt | 3 ++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 29964272e969..e54f4804efd7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -7,6 +7,7 @@ import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData +import net.minecraft.scoreboard.Score import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard @@ -201,6 +202,14 @@ enum class Events(private val displayLine: Supplier>, private val s .nextAfter("§e§lEvent: §r§bFishing Festival")?.startsWith(" Ends In: ") == true } ), + BROODMOTHER( + { + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§4Broodmother§7:") } ?: "") + }, + { + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§4Broodmother§7:") } + } + ), NEW_YEAR( { listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§dNew Year Event") } ?: "") @@ -244,8 +253,14 @@ enum class Events(private val displayLine: Supplier>, private val s // Zone Events if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event: ") }) { + val fixName = listOf( + "GLOBIRAID" to "GOBLIN RAID", + "MITHR GOURMAND" to "MITHRIL GOURMAND", + ) list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Event: ") } - ?.removePrefix("Event: ")?.replace("GLOBIRAID", "GOBLIN RAID") ?: "" + ?.removePrefix("Event: ")?.let { name -> + fixName.firstOrNull { it.first == name }?.second ?: name + } ?: "" list += "§fin " + (ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Zone: ") } ?.removePrefix("Zone: ") ?: "" ) } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 730e127f5941..8dd48d43b89f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -98,7 +98,8 @@ class InformationGetter { "Ⓑ", "§a☀", "§7♲", - "Slayer Quest" + "Slayer Quest", + "§4Broodmother§7:" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } From cd3c2c98d14cbdc3dd835b8db22ef3b297810fff Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 2 Dec 2023 22:45:47 +0100 Subject: [PATCH 156/225] added more gourmand lines --- .../features/misc/customscoreboard/Events.kt | 111 ++++++++++++------ .../customscoreboard/InformationGetter.kt | 5 +- 2 files changed, 76 insertions(+), 40 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index e54f4804efd7..0e15f14fd780 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -15,7 +15,8 @@ private val config get() = SkyHanniMod.feature.gui.customScoreboard enum class Events(private val displayLine: Supplier>, private val showWhen: () -> Boolean) { SERVER_CLOSE( { - listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§cServer closing: ") } ?: "") + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§cServer closing: ") } + ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§cServer closing: ") } @@ -26,24 +27,30 @@ enum class Events(private val displayLine: Supplier>, private val s val list = mutableListOf() if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Auto-closing in:") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Auto-closing in:") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Auto-closing in:") } + ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Starting in:") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Starting in:") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Starting in:") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Keys: ") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Keys: ") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Keys: ") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Time Elapsed: ") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Time Elapsed: ") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Time Elapsed: ") } + ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§rCleared: ") || it.startsWith("Cleared: ") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§rCleared: ") || it.startsWith("Cleared:") }.toString() + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { + it.startsWith("§rCleared: ") || it.startsWith( + "Cleared:" + ) + }.toString() .replace("§r", "").replace("%", "%§") // for some reason this is broken } - val dungeonPlayers = TabListData.getTabList().firstOrNull{ it.trim().startsWith("§r§b§lParty §r§f(") } + val dungeonPlayers = TabListData.getTabList().firstOrNull { it.trim().startsWith("§r§b§lParty §r§f(") } ?.trim()?.removePrefix("§r§b§lParty §r§f(")?.removeSuffix(")")?.toInt() ?: 1 if (dungeonPlayers != 0 && list.any { it.startsWith("Cleared: ") }) { @@ -52,11 +59,13 @@ enum class Events(private val displayLine: Supplier>, private val s } else { for (i in 1..dungeonPlayers) { list += ScoreboardData.sidebarLinesFormatted.nextAfter( // Bettermap Style - "§r" + (list.firstOrNull{ it.startsWith("Cleared: ") }?.replace("%§", "%") ?: "§cNo Dungeon Data"), + "§r" + (list.firstOrNull { it.startsWith("Cleared: ") }?.replace("%§", "%") + ?: "§cNo Dungeon Data"), i ) ?: ScoreboardData.sidebarLinesFormatted.nextAfter( // Hypixel Style - list.firstOrNull{ it.startsWith("Cleared: ") }?.replace("%§", "%") ?: "§cNo Dungeon Data", + list.firstOrNull { it.startsWith("Cleared: ") }?.replace("%§", "%") + ?: "§cNo Dungeon Data", i ) ?: "§cTeammate not found" } @@ -77,28 +86,32 @@ enum class Events(private val displayLine: Supplier>, private val s val list = mutableListOf() if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Auto-closing in:") }) { - ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Auto-closing in:") } + ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Auto-closing in:") } } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Starting in:") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Starting in:") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Starting in:") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Instance ShutdowIn:") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Instance ShutdowIn:") } - ?.replace("Instance ShutdowIn:", "Instance Shutdown In:") ?: ""// for some reason this is broken + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Instance ShutdowIn:") } + ?.replace("Instance ShutdowIn:", "Instance Shutdown In:") + ?: ""// for some reason this is broken } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Time Elapsed: ") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Time Elapsed: ") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Time Elapsed: ") } + ?: "" } list += "" if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§f§lWave: §c§l") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§f§lWave: §c§l") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§f§lWave: §c§l") } + ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§fTokens: ") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§fTokens: ") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§fTokens: ") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Submerges In: §e") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Submerges In: §e") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Submerges In: §e") } + ?: "" } list += "" if (ScoreboardData.sidebarLinesFormatted.any { it == "§fObjective:" }) { @@ -134,9 +147,12 @@ enum class Events(private val displayLine: Supplier>, private val s { val list = mutableListOf() - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§6§lGOLD §fmedals") } ?: "" - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§f§lSILVER §fmedals") } ?: "" - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§c§lBRONZE §fmedals") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§6§lGOLD §fmedals") } + ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§f§lSILVER §fmedals") } + ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§c§lBRONZE §fmedals") } + ?: "" list }, @@ -149,27 +165,32 @@ enum class Events(private val displayLine: Supplier>, private val s val list = mutableListOf() if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("North Stars: §d") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("North Stars: §d") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("North Stars: §d") } + ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event Start: §a") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Event Start: §a") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Event Start: §a") } + ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Next Wave: §a") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Next Wave: §a") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Next Wave: §a") } + ?: "" } list += "" if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§cWave ") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§cWave ") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§cWave ") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Magma Cubes Left§c") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Magma Cubes Left§c") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Magma Cubes Left§c") } + ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Total Damag §c") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Your Total Damag §c") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Total Damag §c") } ?.replace("Damag", "Damage") ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Cube Damage§c") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Your Cube Damage§c") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Cube Damage§c") } + ?: "" } list @@ -180,9 +201,10 @@ enum class Events(private val displayLine: Supplier>, private val s ), SPOOKY( { - listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§6Spooky Festival§f") } ?: "") + // Time + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§6Spooky Festival§f") } + ?: "") + // Time ("§r§r§7Your Candy: ") + - (getTablistFooter().split("\n").firstOrNull{ it.startsWith("§r§r§7Your Candy:") } + (getTablistFooter().split("\n").firstOrNull { it.startsWith("§r§r§7Your Candy:") } ?.removePrefix("§r§r§7Your Candy:") ?: "§cCandy not found") // Candy }, { @@ -204,7 +226,7 @@ enum class Events(private val displayLine: Supplier>, private val s ), BROODMOTHER( { - listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§4Broodmother§7:") } ?: "") + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§4Broodmother§7:") } ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§4Broodmother§7:") } @@ -212,7 +234,7 @@ enum class Events(private val displayLine: Supplier>, private val s ), NEW_YEAR( { - listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§dNew Year Event") } ?: "") + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§dNew Year Event") } ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§dNew Year Event") } @@ -220,7 +242,7 @@ enum class Events(private val displayLine: Supplier>, private val s ), ORINGO( { - listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("§aTraveling Zoo") } ?: "") + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§aTraveling Zoo") } ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§aTraveling Zoo") } @@ -248,7 +270,8 @@ enum class Events(private val displayLine: Supplier>, private val s // Better Together if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Nearby Players:") }) { list += "§9Better Together" - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Nearby Players:") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Nearby Players:") } + ?: "" } // Zone Events @@ -257,12 +280,18 @@ enum class Events(private val displayLine: Supplier>, private val s "GLOBIRAID" to "GOBLIN RAID", "MITHR GOURMAND" to "MITHRIL GOURMAND", ) - list += ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Event: ") } + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Event: ") } ?.removePrefix("Event: ")?.let { name -> fixName.firstOrNull { it.first == name }?.second ?: name } ?: "" - list += "§fin " + (ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Zone: ") } - ?.removePrefix("Zone: ") ?: "" ) + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Zone: ") }) { + list += "§fin " + (ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Zone: ") } + ?.removePrefix("Zone: ") ?: "") + } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Remaining: §a") }) { + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Remaining: §a") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Tasty Mithr: §c") } ?: "" + } } if (list.size == 0) when (config.informationFilteringConfig.hideEmptyLines) { @@ -276,8 +305,12 @@ enum class Events(private val displayLine: Supplier>, private val s ), DAMAGE( { - listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Protector HP: §a") || it.startsWith("Dragon HP: §a") } ?: "" ) + - (ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Your Damage: §c") } ?: "") + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { + it.startsWith("Protector HP: §a") || it.startsWith( + "Dragon HP: §a" + ) + } ?: "") + + (ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Damage: §c") } ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Damage: §c") } @@ -285,7 +318,7 @@ enum class Events(private val displayLine: Supplier>, private val s ), ESSENCE( { - listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull{ it.startsWith("Essence: ") } ?: "") + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Essence: ") } ?: "") }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Essence: ") } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 8dd48d43b89f..e54c121f7e5e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -99,7 +99,10 @@ class InformationGetter { "§a☀", "§7♲", "Slayer Quest", - "§4Broodmother§7:" + "§4Broodmother§7:", + "§7Give Tasty Mithril to Don!", + "Remaining: §a", + "Your Tasty Mithr: §c" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } From db918ed20e600fa12bf20fe3ff04c585d42d06c4 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 2 Dec 2023 23:53:11 +0100 Subject: [PATCH 157/225] fixed more extra lines --- .../features/misc/customscoreboard/InformationGetter.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index e54c121f7e5e..c63fa8646bdd 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -102,7 +102,8 @@ class InformationGetter { "§4Broodmother§7:", "§7Give Tasty Mithril to Don!", "Remaining: §a", - "Your Tasty Mithr: §c" + "Your Tasty Mithr: §c", + "§3§lSolo" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } From 719b92d1c4975c64b1a63e60a3563f381dad3da5 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:43:07 +0100 Subject: [PATCH 158/225] Fixed heat, fixed month in extra lines --- .../features/misc/customscoreboard/Elements.kt | 4 ++-- .../skyhanni/features/misc/customscoreboard/Events.kt | 3 +-- .../misc/customscoreboard/InformationGetter.kt | 10 ++++++++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index b6d3c372d97d..0529813bb07d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -142,8 +142,8 @@ enum class Elements( { when { config.informationFilteringConfig.hideEmptyLines && heat == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf(if (heat == "0") "§c♨ 0 Heat" else "§c♨ $heat Heat") - else -> listOf(if (heat == "0") "Heat: §c♨ 0" else "Heat: $heat") + config.displayConfig.displayNumbersFirst -> listOf(if (heat.removePrefix("§c♨ ") == "0") "§c♨ 0 Heat" else "$heat Heat") + else -> listOf(if (heat.removePrefix("§c♨ ") == "0") "Heat: §c♨ 0" else "Heat: $heat") } }, { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 0e15f14fd780..da2dfc28e826 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -270,8 +270,7 @@ enum class Events(private val displayLine: Supplier>, private val s // Better Together if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Nearby Players:") }) { list += "§9Better Together" - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Nearby Players:") } - ?: "" + list += " " + ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Nearby Players:") } } // Zone Events diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index c63fa8646bdd..77d0405140a8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -44,6 +44,10 @@ class InformationGetter { } } + if (sidebarLines.none { it.startsWith(("Heat: "))}){ + heat = "§c♨ 0" + } + val knownLines = listOf( "§7⏣ ", "§5ф ", @@ -53,8 +57,10 @@ class InformationGetter { "Heat: ", "Bits: §b", "Copper: §c", - "Late", - "Early", + "Spring", + "Summer", + "Autumn", + "Winter", lobbyCode ?: "", "§ewww.hyp", "§ealpha.hyp", From 8bd9e86c975ca1212b3e7cfff7da6ffa80063e72 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:48:10 +0100 Subject: [PATCH 159/225] Removed useless imports --- .../gui/customscoreboard/BackgroundConfig.java | 2 +- .../customscoreboard/CustomScoreboardConfig.java | 5 ----- .../misc/customscoreboard/CustomScoreboard.kt | 13 ------------- .../features/misc/customscoreboard/Elements.kt | 1 - .../features/misc/customscoreboard/Events.kt | 1 - .../misc/customscoreboard/InformationGetter.kt | 7 ------- 6 files changed, 1 insertion(+), 28 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java index 24b4d429ba3d..bc7007b5d2bb 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java @@ -27,7 +27,7 @@ public class BackgroundConfig { @Expose @ConfigOption( name = "Use Custom Background Image", - desc = "Put that image into a resource pack, using the path skyhanni/scoreboard.png." + desc = "Put that image into a resource pack, using the path \"skyhanni/scoreboard.png.\"" ) @ConfigEditorBoolean @FeatureToggle diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index e2ced4257829..faf6f560de61 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -2,16 +2,11 @@ import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.config.core.config.Position; -import at.hannibal2.skyhanni.config.features.misc.compacttablist.AdvancedPlayerListConfig; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.Accordion; import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; -import io.github.moulberry.moulconfig.annotations.ConfigEditorColour; import io.github.moulberry.moulconfig.annotations.ConfigEditorDraggableList; -import io.github.moulberry.moulconfig.annotations.ConfigEditorSlider; -import io.github.moulberry.moulconfig.annotations.ConfigEditorText; import io.github.moulberry.moulconfig.annotations.ConfigOption; -import io.github.moulberry.moulconfig.observer.Property; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index ebd210353492..7a65f8d63a84 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -18,10 +18,6 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.config.core.config.Position -import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsX -import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY -import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.events.GuiRenderEvent @@ -29,20 +25,11 @@ import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings -import at.hannibal2.skyhanni.utils.SpecialColour -import at.hannibal2.skyhanni.utils.TabListData import net.minecraft.client.Minecraft -import net.minecraft.client.gui.Gui -import net.minecraft.client.gui.ScaledResolution -import net.minecraft.util.ResourceLocation import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import io.github.moulberry.notenoughupdates.util.Utils.drawTexturedRect -import org.lwjgl.opengl.GL11 -import kotlin.math.pow private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 0529813bb07d..cfa6115fe938 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -10,7 +10,6 @@ import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.mixins.hooks.replaceString import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons -import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.TimeUtils.formatted diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index da2dfc28e826..ab726f604d5e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -7,7 +7,6 @@ import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData -import net.minecraft.scoreboard.Score import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 77d0405140a8..37ee200190ea 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -1,15 +1,8 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.data.ScoreboardData -import at.hannibal2.skyhanni.events.LorenzChatEvent -import at.hannibal2.skyhanni.events.LorenzTickEvent -import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent -import at.hannibal2.skyhanni.events.ProfileJoinEvent -import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData -import net.minecraft.scoreboard.Score -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class InformationGetter { fun getInformation() { From d4089514862f51d174b8edc5b1c75db4e9f0ad65 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 12:22:15 +0100 Subject: [PATCH 160/225] Fixed objective in extra lines --- .../features/misc/customscoreboard/InformationGetter.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 37ee200190ea..e0184186929c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -68,8 +68,8 @@ class InformationGetter { "§f§lWave: §c§l", "§fTokens: ", "Submerges In: §e", - "§fObjective:", - "Objective:", + "§fObjective", + "Objective", "§eJacob's Contest", "§6§lGOLD §fmedals", "§f§lSILVER §fmedals", @@ -111,8 +111,8 @@ class InformationGetter { extraLines = extraLines.filter { it.isNotBlank() } // remove objectives - extraLines = extraLines.filter { sidebarLines.nextAfter("§fObjective:") != it } - extraLines = extraLines.filter { sidebarLines.nextAfter("Objective:") != it } + extraLines = extraLines.filter { sidebarLines.nextAfter("§fObjective") != it } + extraLines = extraLines.filter { sidebarLines.nextAfter("Objective") != it } // remove wind compass extraLines = extraLines.filter { sidebarLines.nextAfter("§9Wind Compass") != it } From b91ed7cfde5ad0a820fb2dd190bd7c16bddf41f6 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 12:31:08 +0100 Subject: [PATCH 161/225] Hard coded color back to better together --- .../skyhanni/features/misc/customscoreboard/Events.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index ab726f604d5e..a53570f0cbfd 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -269,7 +269,8 @@ enum class Events(private val displayLine: Supplier>, private val s // Better Together if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Nearby Players:") }) { list += "§9Better Together" - list += " " + ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Nearby Players:") } + list += (" " + ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Nearby Players:") } + ?.replace("Nearby Players: ", "Nearby Players: §a")) } // Zone Events From e188b336e4170c48f12b0ff723d2b13da9669025 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:46:10 +0100 Subject: [PATCH 162/225] fixed party list limit --- .../config/features/gui/customscoreboard/PartyConfig.java | 2 +- .../skyhanni/features/misc/customscoreboard/Elements.kt | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java index 8c4469f4dbd0..56a68e2f0bfc 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/PartyConfig.java @@ -11,7 +11,7 @@ public class PartyConfig { @Expose @ConfigOption(name = "Max Party List", desc = "Max number of party members to show in the party list. (You are not included)") @ConfigEditorSlider( - minValue = 1, + minValue = 0, maxValue = 25, // why do I even set it so high minStep = 1 ) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index cfa6115fe938..db6e0b739e03 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -30,7 +30,6 @@ var lobbyCode = "None" var heat = "0" var mithrilPowder = "0" var gemstonePowder = "0" -var partyCount = 0 var extraLines = listOf() enum class Elements( @@ -304,9 +303,6 @@ enum class Elements( ), PARTY( { - // Resets Party count - partyCount = 0 - val partyTitle: List = if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { listOf("") @@ -314,9 +310,8 @@ enum class Elements( val title = if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" val partyList = PartyAPI.partyMembers - .takeWhile { partyCount < config.partyConfig.maxPartyList.get() } + .take(config.partyConfig.maxPartyList.get()) .map { - partyCount++ " §7- §7$it" } .toTypedArray() From 375c7ffb6dad39d46375b981fc1a57d8061340bd Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 15:03:50 +0100 Subject: [PATCH 163/225] fixed skyblock time when rain, added symbols --- .../features/misc/customscoreboard/Elements.kt | 13 +++++++++---- .../misc/customscoreboard/InformationGetter.kt | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index db6e0b739e03..cfc7d2c60818 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -39,7 +39,7 @@ enum class Elements( ) { SKYBLOCK( { - when (config.displayConfig.useHypixelTitleAnimation){ + when (config.displayConfig.useHypixelTitleAnimation) { true -> listOf(ScoreboardData.objectiveTitle) false -> listOf(config.displayConfig.customTitle.get().toString().replace("&", "§")) } @@ -178,7 +178,12 @@ enum class Elements( ), SKYBLOCK_TIME_MINUTE( { - listOf("§7" + SkyBlockTime.now().formatted(dayAndMonthElement = false, yearElement = false)) + val symbols = listOf("☔", "§e☀", "§b☽") + if (ScoreboardData.sidebarLinesFormatted.any { line -> symbols.any { line.contains(it) } }) { + listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } }) + } else { + listOf("§7" + SkyBlockTime.now().formatted(dayAndMonthElement = false, yearElement = false)) + } }, { true @@ -321,10 +326,10 @@ enum class Elements( partyTitle }, { - if(inDungeons){ + if (inDungeons) { false // Hidden bc teammate health etc exists } else { - if (config.partyConfig.showPartyEverywhere){ + if (config.partyConfig.showPartyEverywhere) { true } else { listOf( diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index e0184186929c..76f83235f33e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -94,6 +94,7 @@ class InformationGetter { "Essence: ", "§e☀", "§b☽", + "☔", "Ⓑ", "§a☀", "§7♲", From bc99d9b502eaa085e9d1043de9c0b053153402ba Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 16:07:36 +0100 Subject: [PATCH 164/225] Added villager count to objective --- .../features/misc/customscoreboard/Elements.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index cfc7d2c60818..73b265cf6a62 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -226,13 +226,17 @@ enum class Elements( ), OBJECTIVE( { - when (config.informationFilteringConfig.hideEmptyLines) { - true -> listOf("Objective:") + (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") - ?: "") + val objective = mutableListOf() - false -> listOf("Objective:") + (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") - ?: "§cNo objective") + objective += "Objective:" + + objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective").toString() + + if (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2)?.startsWith(" §7(§e") == true) { + objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2).toString() } + + objective }, { true From 21ef09ba785b0b2d51b29cfbcc50f3217d5d6218 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 16:09:05 +0100 Subject: [PATCH 165/225] Added villager line to filter --- .../skyhanni/features/misc/customscoreboard/InformationGetter.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 76f83235f33e..ba90d2c3ddbf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -114,6 +114,7 @@ class InformationGetter { // remove objectives extraLines = extraLines.filter { sidebarLines.nextAfter("§fObjective") != it } extraLines = extraLines.filter { sidebarLines.nextAfter("Objective") != it } + extraLines = extraLines.filter { sidebarLines.nextAfter("Objective", 2) != it } // remove wind compass extraLines = extraLines.filter { sidebarLines.nextAfter("§9Wind Compass") != it } From 5ec663507bc210d4eb439d2677b3abbab9ca547b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 16:10:40 +0100 Subject: [PATCH 166/225] fixed heat not disappearing --- .../skyhanni/features/misc/customscoreboard/Elements.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 73b265cf6a62..099dafc246d0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -139,9 +139,9 @@ enum class Elements( HEAT( { when { - config.informationFilteringConfig.hideEmptyLines && heat == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf(if (heat.removePrefix("§c♨ ") == "0") "§c♨ 0 Heat" else "$heat Heat") - else -> listOf(if (heat.removePrefix("§c♨ ") == "0") "Heat: §c♨ 0" else "Heat: $heat") + config.informationFilteringConfig.hideEmptyLines && heat == "§c♨ 0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf(if (heat == "§c♨ 0") "§c♨ 0 Heat" else "$heat Heat") + else -> listOf(if (heat == "§c♨ 0") "Heat: §c♨ 0" else "Heat: $heat") } }, { From 8a23e1ab32638a5b50539b64af063595261953ca Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 20:15:24 +0100 Subject: [PATCH 167/225] Added a better way for multiline objectives --- .../skyhanni/features/misc/customscoreboard/Elements.kt | 6 +++++- .../features/misc/customscoreboard/InformationGetter.kt | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 099dafc246d0..240b6f8d13e6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -32,6 +32,8 @@ var mithrilPowder = "0" var gemstonePowder = "0" var extraLines = listOf() +val extraObjectiveLines = listOf("§7(§e", "§f Mages", "§f Barbarians") + enum class Elements( private val displayLine: Supplier>, private val showWhen: () -> Boolean, @@ -232,7 +234,9 @@ enum class Elements( objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective").toString() - if (ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2)?.startsWith(" §7(§e") == true) { + if (extraObjectiveLines.any { + ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2)?.contains(it) == true + }) { objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2).toString() } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index ba90d2c3ddbf..e46fa74a95d8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -114,7 +114,7 @@ class InformationGetter { // remove objectives extraLines = extraLines.filter { sidebarLines.nextAfter("§fObjective") != it } extraLines = extraLines.filter { sidebarLines.nextAfter("Objective") != it } - extraLines = extraLines.filter { sidebarLines.nextAfter("Objective", 2) != it } + extraLines = extraLines.filter { sidebarLines.nextAfter("Objective", 2) != it && !extraObjectiveLines.contains(it)} // remove wind compass extraLines = extraLines.filter { sidebarLines.nextAfter("§9Wind Compass") != it } From ce6f234b0a5c0ce3acf9f62cfd145321cf49525d Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 22:23:25 +0100 Subject: [PATCH 168/225] Added string centering --- .../gui/customscoreboard/DisplayConfig.java | 6 + .../misc/customscoreboard/CustomScoreboard.kt | 30 ++--- .../misc/customscoreboard/Elements.kt | 115 +++++++++--------- .../hannibal2/skyhanni/utils/RenderUtils.kt | 15 +++ 4 files changed, 96 insertions(+), 70 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java index 8ccb0d16b150..5bc41c8c53ce 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java @@ -48,4 +48,10 @@ public class DisplayConfig { @ConfigOption(name = "Custom Footer", desc = "What should be displayed as the footer of the scoreboard.\nUse & for colors.") @ConfigEditorText public Property customFooter = Property.of("&ewww.hypixel.net"); + + @Expose + @ConfigOption(name = "Center Title and Footer", desc = "Center the title and footer.") + @ConfigEditorBoolean + @FeatureToggle + public boolean centerTitleAndFooter = true; } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 7a65f8d63a84..a2c63b90e35f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -25,14 +25,14 @@ import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings +import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsCenterSometimesInWidth import net.minecraft.client.Minecraft import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent private val config get() = SkyHanniMod.feature.gui.customScoreboard -private var display = emptyList() +private var display = emptyList>() class CustomScoreboard { @@ -44,7 +44,7 @@ class CustomScoreboard { RenderBackground().renderBackground() - position.renderStrings(display, posLabel = "Custom Scoreboard") + position.renderStringsCenterSometimesInWidth(display, posLabel = "Custom Scoreboard") } @SubscribeEvent @@ -58,37 +58,37 @@ class CustomScoreboard { InformationGetter().getInformation() } - private fun createLines() = buildList { - val lineMap = HashMap>() + private fun createLines() = buildList> { + val lineMap = HashMap>>() for (element in Elements.entries) { - lineMap[element.index] = if (element.isVisible()) element.getLine() else listOf("") + lineMap[element.index] = if (element.isVisible()) element.getPair() else listOf("" to false) } return formatLines(lineMap) } - private fun formatLines(lineMap: HashMap>): MutableList { - val newList = mutableListOf() - for (index in config.textFormat) { - lineMap[index.ordinal]?.let { + private fun formatLines(lineMap: HashMap>>): MutableList> { + val newList = mutableListOf>() + for (entry in config.textFormat) { + lineMap[entry.ordinal]?.let { // Hide consecutive empty lines - if (config.informationFilteringConfig.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull() == "") { + if (config.informationFilteringConfig.hideConsecutiveEmptyLines && it[0].first == "" && newList.last().first == "") { continue } // Adds empty lines - if (it[0] == "") { - newList.add("") + if (it[0].first == "") { + newList.add("" to false) continue } // Does not display this line - if (it.any { i -> i == "" }) { + if (it.any { i -> i.first == "" }) { continue } // Multiline and singular line support - newList.addAll(it.map { i -> i.toString() }) + newList.addAll(it.map { i -> i }) } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 240b6f8d13e6..17088c64fcfb 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -35,15 +35,18 @@ var extraLines = listOf() val extraObjectiveLines = listOf("§7(§e", "§f Mages", "§f Barbarians") enum class Elements( - private val displayLine: Supplier>, + private val displayPair: Supplier>>, private val showWhen: () -> Boolean, val index: Int ) { SKYBLOCK( { when (config.displayConfig.useHypixelTitleAnimation) { - true -> listOf(ScoreboardData.objectiveTitle) - false -> listOf(config.displayConfig.customTitle.get().toString().replace("&", "§")) + true -> listOf(ScoreboardData.objectiveTitle to config.displayConfig.centerTitleAndFooter) + false -> listOf( + config.displayConfig.customTitle.get().toString() + .replace("&", "§") to config.displayConfig.centerTitleAndFooter + ) } }, { @@ -53,7 +56,7 @@ enum class Elements( ), PROFILE( { - listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) + listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase() to false) }, { true @@ -63,9 +66,9 @@ enum class Elements( PURSE( { when { - config.informationFilteringConfig.hideEmptyLines && purse == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§6$purse Purse") - else -> listOf("Purse: §6$purse") + config.informationFilteringConfig.hideEmptyLines && purse == "0" -> listOf("" to false) + config.displayConfig.displayNumbersFirst -> listOf("§6$purse Purse" to false) + else -> listOf("Purse: §6$purse" to false) } }, { @@ -76,9 +79,9 @@ enum class Elements( MOTES( { when { - config.informationFilteringConfig.hideEmptyLines && motes == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§d$motes Motes") - else -> listOf("Motes: §d$motes") + config.informationFilteringConfig.hideEmptyLines && motes == "0" -> listOf("" to false) + config.displayConfig.displayNumbersFirst -> listOf("§d$motes Motes" to false) + else -> listOf("Motes: §d$motes" to false) } }, { @@ -89,9 +92,9 @@ enum class Elements( BANK( { when { - config.informationFilteringConfig.hideEmptyLines && bank == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§6$bank Bank") - else -> listOf("Bank: §6$bank") + config.informationFilteringConfig.hideEmptyLines && bank == "0" -> listOf("" to false) + config.displayConfig.displayNumbersFirst -> listOf("§6$bank Bank" to false) + else -> listOf("Bank: §6$bank" to false) } }, { @@ -102,9 +105,9 @@ enum class Elements( BITS( { when { - config.informationFilteringConfig.hideEmptyLines && bits == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§b$bits Bits") - else -> listOf("Bits: §b$bits") + config.informationFilteringConfig.hideEmptyLines && bits == "0" -> listOf("" to false) + config.displayConfig.displayNumbersFirst -> listOf("§b$bits Bits" to false) + else -> listOf("Bits: §b$bits" to false) } }, { @@ -115,9 +118,9 @@ enum class Elements( COPPER( { when { - config.informationFilteringConfig.hideEmptyLines && copper == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§c$copper Copper") - else -> listOf("Copper: §c$copper") + config.informationFilteringConfig.hideEmptyLines && copper == "0" -> listOf("" to false) + config.displayConfig.displayNumbersFirst -> listOf("§c$copper Copper" to false) + else -> listOf("Copper: §c$copper" to false) } }, { @@ -128,9 +131,9 @@ enum class Elements( GEMS( { when { - config.informationFilteringConfig.hideEmptyLines && gems == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§a$gems Gems") - else -> listOf("Gems: §a$gems") + config.informationFilteringConfig.hideEmptyLines && gems == "0" -> listOf("" to false) + config.displayConfig.displayNumbersFirst -> listOf("§a$gems Gems" to false) + else -> listOf("Gems: §a$gems" to false) } }, { @@ -141,9 +144,9 @@ enum class Elements( HEAT( { when { - config.informationFilteringConfig.hideEmptyLines && heat == "§c♨ 0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf(if (heat == "§c♨ 0") "§c♨ 0 Heat" else "$heat Heat") - else -> listOf(if (heat == "§c♨ 0") "Heat: §c♨ 0" else "Heat: $heat") + config.informationFilteringConfig.hideEmptyLines && heat == "§c♨ 0" -> listOf("" to false) + config.displayConfig.displayNumbersFirst -> listOf("$heat Heat" to false) + else -> listOf("Heat: $heat" to false) } }, { @@ -153,7 +156,7 @@ enum class Elements( ), EMPTY_LINE( { - listOf("") + listOf("" to false) }, { true @@ -162,7 +165,7 @@ enum class Elements( ), LOCATION( { - listOf(replaceString(location) ?: "") + listOf((replaceString(location) ?: "") to false) }, { true @@ -171,7 +174,7 @@ enum class Elements( ), SKYBLOCK_TIME_DAY( { - listOf(SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false)) + listOf(SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false) to false) }, { true @@ -182,9 +185,9 @@ enum class Elements( { val symbols = listOf("☔", "§e☀", "§b☽") if (ScoreboardData.sidebarLinesFormatted.any { line -> symbols.any { line.contains(it) } }) { - listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } }) + listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } } to false) } else { - listOf("§7" + SkyBlockTime.now().formatted(dayAndMonthElement = false, yearElement = false)) + listOf("§7" + SkyBlockTime.now().formatted(dayAndMonthElement = false, yearElement = false) to false) } }, { @@ -194,7 +197,7 @@ enum class Elements( ), LOBBY_CODE( { - listOf("§8$lobbyCode") + listOf("§8$lobbyCode" to false) }, { true @@ -204,11 +207,11 @@ enum class Elements( MAXWELL( { when (MaxwellAPI.currentPower == null) { - true -> listOf("§c§lPlease visit Maxwell!") + true -> listOf("§c§lPlease visit Maxwell!" to false) false -> when (config.displayConfig.displayNumbersFirst) { - true -> listOf("${MaxwellAPI.currentPower?.power} Power") - false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") + true -> listOf("${MaxwellAPI.currentPower?.power} Power" to false) + false -> listOf("Power: ${MaxwellAPI.currentPower?.power}" to false) } } }, @@ -219,7 +222,7 @@ enum class Elements( ), EMPTY_LINE2( { - listOf("") + listOf("" to false) }, { true @@ -232,7 +235,7 @@ enum class Elements( objective += "Objective:" - objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective").toString() + objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") ?: "" if (extraObjectiveLines.any { ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2)?.contains(it) == true @@ -240,7 +243,7 @@ enum class Elements( objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2).toString() } - objective + objective.map { it to false } }, { true @@ -250,11 +253,11 @@ enum class Elements( SLAYER( { listOf( - (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") + (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") to false ) + ( - " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" + " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" to false ) + ( - " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" + " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" to false ) }, { @@ -271,7 +274,7 @@ enum class Elements( ), EMPTY_LINE3( { - listOf("") + listOf("" to false) }, { true @@ -281,8 +284,8 @@ enum class Elements( POWDER( { when (config.displayConfig.displayNumbersFirst) { - true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") - false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") + true -> listOf("§9§lPowder" to false) + (" §7- §2$mithrilPowder Mithril" to false) + (" §7- §d$gemstonePowder Gemstone" to false) + false -> listOf("§9§lPowder" to false) + (" §7- §fMithril: §2$mithrilPowder" to false) + (" §7- §fGemstone: §d$gemstonePowder" to false) } }, { @@ -292,7 +295,7 @@ enum class Elements( ), CURRENT_EVENT( { - Events.getFirstEvent().getLines() + Events.getFirstEvent().getLines().map { it to false } }, { true @@ -301,13 +304,15 @@ enum class Elements( ), MAYOR( { - listOf( - MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "" + val mayorList: List> = listOf( + (MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "") to false ) + (if (config.showMayorPerks) { - MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" } ?: emptyList() + MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" to false } ?: emptyList() } else { emptyList() }) + + mayorList }, { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) @@ -316,16 +321,16 @@ enum class Elements( ), PARTY( { - val partyTitle: List = + val partyTitle: List> = if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { - listOf("") + listOf("" to false) } else { val title = - if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" + if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" to false else "§9§lParty (${PartyAPI.partyMembers.size})" to false val partyList = PartyAPI.partyMembers .take(config.partyConfig.maxPartyList.get()) .map { - " §7- §7$it" + " §7- §7$it" to false } .toTypedArray() listOf(title, *partyList) @@ -352,7 +357,7 @@ enum class Elements( ), WEBSITE( { - listOf(config.displayConfig.customFooter.get().toString().replace("&", "§")) + listOf(config.displayConfig.customFooter.get().toString().replace("&", "§") to config.displayConfig.centerTitleAndFooter) }, { true @@ -361,7 +366,7 @@ enum class Elements( ), EXTRA_LINES( { - listOf("§cUndetected Lines (pls report):") + extraLines + listOf("§cUndetected Lines (pls report):" to false) + extraLines.map { it to false } }, { extraLines.isNotEmpty() @@ -370,8 +375,8 @@ enum class Elements( ), ; - fun getLine(): List { - return displayLine.get() + fun getPair(): List> { + return displayPair.get() } fun isVisible(): Boolean { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt index 03f552e7af70..dcc2008da4c7 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt @@ -407,6 +407,21 @@ object RenderUtils { GuiEditManager.add(this, posLabel, longestX, offsetY) } + fun Position.renderStringsCenterSometimesInWidth(list: List>, extraSpace: Int = 0, posLabel: String) { + if (list.isEmpty()) return + + var offsetY = 0 + var longestX = 0 + for (pair in list) { + val x = renderString0(pair.first, offsetY = offsetY, centered = pair.second) + if (x > longestX) { + longestX = x + } + offsetY += 10 + extraSpace + } + GuiEditManager.add(this, posLabel, longestX, offsetY) + } + fun Position.renderRenderables( renderables: List, extraSpace: Int = 0, From 83644f4159cda61b7a87bfe40dec0fe0317f688e Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 22:24:06 +0100 Subject: [PATCH 169/225] Revert "Added string centering" This reverts commit ce6f234b0a5c0ce3acf9f62cfd145321cf49525d. --- .../gui/customscoreboard/DisplayConfig.java | 6 - .../misc/customscoreboard/CustomScoreboard.kt | 30 ++--- .../misc/customscoreboard/Elements.kt | 115 +++++++++--------- .../hannibal2/skyhanni/utils/RenderUtils.kt | 15 --- 4 files changed, 70 insertions(+), 96 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java index 5bc41c8c53ce..8ccb0d16b150 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java @@ -48,10 +48,4 @@ public class DisplayConfig { @ConfigOption(name = "Custom Footer", desc = "What should be displayed as the footer of the scoreboard.\nUse & for colors.") @ConfigEditorText public Property customFooter = Property.of("&ewww.hypixel.net"); - - @Expose - @ConfigOption(name = "Center Title and Footer", desc = "Center the title and footer.") - @ConfigEditorBoolean - @FeatureToggle - public boolean centerTitleAndFooter = true; } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index a2c63b90e35f..7a65f8d63a84 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -25,14 +25,14 @@ import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsCenterSometimesInWidth +import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings import net.minecraft.client.Minecraft import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent private val config get() = SkyHanniMod.feature.gui.customScoreboard -private var display = emptyList>() +private var display = emptyList() class CustomScoreboard { @@ -44,7 +44,7 @@ class CustomScoreboard { RenderBackground().renderBackground() - position.renderStringsCenterSometimesInWidth(display, posLabel = "Custom Scoreboard") + position.renderStrings(display, posLabel = "Custom Scoreboard") } @SubscribeEvent @@ -58,37 +58,37 @@ class CustomScoreboard { InformationGetter().getInformation() } - private fun createLines() = buildList> { - val lineMap = HashMap>>() + private fun createLines() = buildList { + val lineMap = HashMap>() for (element in Elements.entries) { - lineMap[element.index] = if (element.isVisible()) element.getPair() else listOf("" to false) + lineMap[element.index] = if (element.isVisible()) element.getLine() else listOf("") } return formatLines(lineMap) } - private fun formatLines(lineMap: HashMap>>): MutableList> { - val newList = mutableListOf>() - for (entry in config.textFormat) { - lineMap[entry.ordinal]?.let { + private fun formatLines(lineMap: HashMap>): MutableList { + val newList = mutableListOf() + for (index in config.textFormat) { + lineMap[index.ordinal]?.let { // Hide consecutive empty lines - if (config.informationFilteringConfig.hideConsecutiveEmptyLines && it[0].first == "" && newList.last().first == "") { + if (config.informationFilteringConfig.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull() == "") { continue } // Adds empty lines - if (it[0].first == "") { - newList.add("" to false) + if (it[0] == "") { + newList.add("") continue } // Does not display this line - if (it.any { i -> i.first == "" }) { + if (it.any { i -> i == "" }) { continue } // Multiline and singular line support - newList.addAll(it.map { i -> i }) + newList.addAll(it.map { i -> i.toString() }) } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 17088c64fcfb..240b6f8d13e6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -35,18 +35,15 @@ var extraLines = listOf() val extraObjectiveLines = listOf("§7(§e", "§f Mages", "§f Barbarians") enum class Elements( - private val displayPair: Supplier>>, + private val displayLine: Supplier>, private val showWhen: () -> Boolean, val index: Int ) { SKYBLOCK( { when (config.displayConfig.useHypixelTitleAnimation) { - true -> listOf(ScoreboardData.objectiveTitle to config.displayConfig.centerTitleAndFooter) - false -> listOf( - config.displayConfig.customTitle.get().toString() - .replace("&", "§") to config.displayConfig.centerTitleAndFooter - ) + true -> listOf(ScoreboardData.objectiveTitle) + false -> listOf(config.displayConfig.customTitle.get().toString().replace("&", "§")) } }, { @@ -56,7 +53,7 @@ enum class Elements( ), PROFILE( { - listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase() to false) + listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) }, { true @@ -66,9 +63,9 @@ enum class Elements( PURSE( { when { - config.informationFilteringConfig.hideEmptyLines && purse == "0" -> listOf("" to false) - config.displayConfig.displayNumbersFirst -> listOf("§6$purse Purse" to false) - else -> listOf("Purse: §6$purse" to false) + config.informationFilteringConfig.hideEmptyLines && purse == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§6$purse Purse") + else -> listOf("Purse: §6$purse") } }, { @@ -79,9 +76,9 @@ enum class Elements( MOTES( { when { - config.informationFilteringConfig.hideEmptyLines && motes == "0" -> listOf("" to false) - config.displayConfig.displayNumbersFirst -> listOf("§d$motes Motes" to false) - else -> listOf("Motes: §d$motes" to false) + config.informationFilteringConfig.hideEmptyLines && motes == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§d$motes Motes") + else -> listOf("Motes: §d$motes") } }, { @@ -92,9 +89,9 @@ enum class Elements( BANK( { when { - config.informationFilteringConfig.hideEmptyLines && bank == "0" -> listOf("" to false) - config.displayConfig.displayNumbersFirst -> listOf("§6$bank Bank" to false) - else -> listOf("Bank: §6$bank" to false) + config.informationFilteringConfig.hideEmptyLines && bank == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§6$bank Bank") + else -> listOf("Bank: §6$bank") } }, { @@ -105,9 +102,9 @@ enum class Elements( BITS( { when { - config.informationFilteringConfig.hideEmptyLines && bits == "0" -> listOf("" to false) - config.displayConfig.displayNumbersFirst -> listOf("§b$bits Bits" to false) - else -> listOf("Bits: §b$bits" to false) + config.informationFilteringConfig.hideEmptyLines && bits == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§b$bits Bits") + else -> listOf("Bits: §b$bits") } }, { @@ -118,9 +115,9 @@ enum class Elements( COPPER( { when { - config.informationFilteringConfig.hideEmptyLines && copper == "0" -> listOf("" to false) - config.displayConfig.displayNumbersFirst -> listOf("§c$copper Copper" to false) - else -> listOf("Copper: §c$copper" to false) + config.informationFilteringConfig.hideEmptyLines && copper == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§c$copper Copper") + else -> listOf("Copper: §c$copper") } }, { @@ -131,9 +128,9 @@ enum class Elements( GEMS( { when { - config.informationFilteringConfig.hideEmptyLines && gems == "0" -> listOf("" to false) - config.displayConfig.displayNumbersFirst -> listOf("§a$gems Gems" to false) - else -> listOf("Gems: §a$gems" to false) + config.informationFilteringConfig.hideEmptyLines && gems == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§a$gems Gems") + else -> listOf("Gems: §a$gems") } }, { @@ -144,9 +141,9 @@ enum class Elements( HEAT( { when { - config.informationFilteringConfig.hideEmptyLines && heat == "§c♨ 0" -> listOf("" to false) - config.displayConfig.displayNumbersFirst -> listOf("$heat Heat" to false) - else -> listOf("Heat: $heat" to false) + config.informationFilteringConfig.hideEmptyLines && heat == "§c♨ 0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf(if (heat == "§c♨ 0") "§c♨ 0 Heat" else "$heat Heat") + else -> listOf(if (heat == "§c♨ 0") "Heat: §c♨ 0" else "Heat: $heat") } }, { @@ -156,7 +153,7 @@ enum class Elements( ), EMPTY_LINE( { - listOf("" to false) + listOf("") }, { true @@ -165,7 +162,7 @@ enum class Elements( ), LOCATION( { - listOf((replaceString(location) ?: "") to false) + listOf(replaceString(location) ?: "") }, { true @@ -174,7 +171,7 @@ enum class Elements( ), SKYBLOCK_TIME_DAY( { - listOf(SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false) to false) + listOf(SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false)) }, { true @@ -185,9 +182,9 @@ enum class Elements( { val symbols = listOf("☔", "§e☀", "§b☽") if (ScoreboardData.sidebarLinesFormatted.any { line -> symbols.any { line.contains(it) } }) { - listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } } to false) + listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } }) } else { - listOf("§7" + SkyBlockTime.now().formatted(dayAndMonthElement = false, yearElement = false) to false) + listOf("§7" + SkyBlockTime.now().formatted(dayAndMonthElement = false, yearElement = false)) } }, { @@ -197,7 +194,7 @@ enum class Elements( ), LOBBY_CODE( { - listOf("§8$lobbyCode" to false) + listOf("§8$lobbyCode") }, { true @@ -207,11 +204,11 @@ enum class Elements( MAXWELL( { when (MaxwellAPI.currentPower == null) { - true -> listOf("§c§lPlease visit Maxwell!" to false) + true -> listOf("§c§lPlease visit Maxwell!") false -> when (config.displayConfig.displayNumbersFirst) { - true -> listOf("${MaxwellAPI.currentPower?.power} Power" to false) - false -> listOf("Power: ${MaxwellAPI.currentPower?.power}" to false) + true -> listOf("${MaxwellAPI.currentPower?.power} Power") + false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") } } }, @@ -222,7 +219,7 @@ enum class Elements( ), EMPTY_LINE2( { - listOf("" to false) + listOf("") }, { true @@ -235,7 +232,7 @@ enum class Elements( objective += "Objective:" - objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") ?: "" + objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective").toString() if (extraObjectiveLines.any { ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2)?.contains(it) == true @@ -243,7 +240,7 @@ enum class Elements( objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2).toString() } - objective.map { it to false } + objective }, { true @@ -253,11 +250,11 @@ enum class Elements( SLAYER( { listOf( - (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") to false + (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") ) + ( - " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" to false + " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" ) + ( - " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" to false + " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" ) }, { @@ -274,7 +271,7 @@ enum class Elements( ), EMPTY_LINE3( { - listOf("" to false) + listOf("") }, { true @@ -284,8 +281,8 @@ enum class Elements( POWDER( { when (config.displayConfig.displayNumbersFirst) { - true -> listOf("§9§lPowder" to false) + (" §7- §2$mithrilPowder Mithril" to false) + (" §7- §d$gemstonePowder Gemstone" to false) - false -> listOf("§9§lPowder" to false) + (" §7- §fMithril: §2$mithrilPowder" to false) + (" §7- §fGemstone: §d$gemstonePowder" to false) + true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") + false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") } }, { @@ -295,7 +292,7 @@ enum class Elements( ), CURRENT_EVENT( { - Events.getFirstEvent().getLines().map { it to false } + Events.getFirstEvent().getLines() }, { true @@ -304,15 +301,13 @@ enum class Elements( ), MAYOR( { - val mayorList: List> = listOf( - (MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "") to false + listOf( + MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "" ) + (if (config.showMayorPerks) { - MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" to false } ?: emptyList() + MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" } ?: emptyList() } else { emptyList() }) - - mayorList }, { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) @@ -321,16 +316,16 @@ enum class Elements( ), PARTY( { - val partyTitle: List> = + val partyTitle: List = if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { - listOf("" to false) + listOf("") } else { val title = - if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" to false else "§9§lParty (${PartyAPI.partyMembers.size})" to false + if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" val partyList = PartyAPI.partyMembers .take(config.partyConfig.maxPartyList.get()) .map { - " §7- §7$it" to false + " §7- §7$it" } .toTypedArray() listOf(title, *partyList) @@ -357,7 +352,7 @@ enum class Elements( ), WEBSITE( { - listOf(config.displayConfig.customFooter.get().toString().replace("&", "§") to config.displayConfig.centerTitleAndFooter) + listOf(config.displayConfig.customFooter.get().toString().replace("&", "§")) }, { true @@ -366,7 +361,7 @@ enum class Elements( ), EXTRA_LINES( { - listOf("§cUndetected Lines (pls report):" to false) + extraLines.map { it to false } + listOf("§cUndetected Lines (pls report):") + extraLines }, { extraLines.isNotEmpty() @@ -375,8 +370,8 @@ enum class Elements( ), ; - fun getPair(): List> { - return displayPair.get() + fun getLine(): List { + return displayLine.get() } fun isVisible(): Boolean { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt index dcc2008da4c7..03f552e7af70 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt @@ -407,21 +407,6 @@ object RenderUtils { GuiEditManager.add(this, posLabel, longestX, offsetY) } - fun Position.renderStringsCenterSometimesInWidth(list: List>, extraSpace: Int = 0, posLabel: String) { - if (list.isEmpty()) return - - var offsetY = 0 - var longestX = 0 - for (pair in list) { - val x = renderString0(pair.first, offsetY = offsetY, centered = pair.second) - if (x > longestX) { - longestX = x - } - offsetY += 10 + extraSpace - } - GuiEditManager.add(this, posLabel, longestX, offsetY) - } - fun Position.renderRenderables( renderables: List, extraSpace: Int = 0, From 110c5cacafe9dd703a4be444f4c01fb3e165be95 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:05:11 +0100 Subject: [PATCH 170/225] Fixed objective being null --- .../skyhanni/features/misc/customscoreboard/Elements.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 240b6f8d13e6..365311052a97 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -232,7 +232,7 @@ enum class Elements( objective += "Objective:" - objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective").toString() + objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") ?: "" if (extraObjectiveLines.any { ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2)?.contains(it) == true From 700e42c89b64331042971bd5ec2bbfb511978ec2 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:11:12 +0100 Subject: [PATCH 171/225] cleanup --- .../misc/customscoreboard/CustomScoreboard.kt | 50 ----------------- .../customscoreboard/CustomScoreboardUtils.kt | 53 +++++++++++++++++++ .../misc/customscoreboard/Elements.kt | 4 +- .../features/misc/customscoreboard/Events.kt | 2 +- .../customscoreboard/InformationGetter.kt | 1 + .../misc/customscoreboard/RenderBackground.kt | 1 - 6 files changed, 57 insertions(+), 54 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 7a65f8d63a84..9534f2d88a7c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -18,15 +18,11 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.HypixelData -import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.LorenzTickEvent -import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings -import net.minecraft.client.Minecraft import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -34,7 +30,6 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent private val config get() = SkyHanniMod.feature.gui.customScoreboard private var display = emptyList() - class CustomScoreboard { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { @@ -114,48 +109,3 @@ class CustomScoreboard { private fun isCustomScoreboardEnabled() = config.enabled && LorenzUtils.inSkyBlock private fun isHideVanillaScoreboardEnabled() = config.displayConfig.hideVanillaScoreboard && LorenzUtils.inSkyBlock } - -fun translateMayorNameToColor(input: String): String { - return when (input) { - // Normal Mayors - "Aatrox" -> "§3$input" - "Cole" -> "§e$input" - "Diana" -> "§2$input" - "Diaz" -> "§6$input" - "Finnegan" -> "§c$input" - "Foxy" -> "§d$input" - "Marina" -> "§b$input" - "Paul" -> "§c$input" - - // Special Mayors - "Scorpius" -> "§d$input" - "Jerry" -> "§d$input" - "Derpy" -> "§d$input" - "Dante" -> "§d$input" - else -> "§cUnknown Mayor: §7$input" - } -} - -fun extractLobbyCode(input: String): String? { - val regex = Regex("§(\\d{3}/\\d{2}/\\d{2}) §([A-Za-z0-9]+)$") - val matchResult = regex.find(input) - return matchResult?.groupValues?.lastOrNull() -} - -fun getProfileTypeAsSymbol(): String { - return when { - HypixelData.ironman -> "§7♲ " // Ironman - HypixelData.stranded -> "§a☀ " // Stranded - HypixelData.bingo -> ScoreboardData.sidebarLines.firstOrNull { it.contains("Bingo") }?.substring( - 0, - 3 - ) + "Ⓑ " // Bingo - gets the first 3 chars of " §9Ⓑ §9Bingo" (you are unable to get the Ⓑ for some reason) - else -> "§e" // Default case - } -} - -fun getTablistFooter(): String { - val tabList = Minecraft.getMinecraft().ingameGUI.tabList as AccessorGuiPlayerTabOverlay - if (tabList.footer_skyhanni == null) return "" - return tabList.footer_skyhanni.formattedText -} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt new file mode 100644 index 000000000000..3bd420ef4575 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt @@ -0,0 +1,53 @@ +package at.hannibal2.skyhanni.features.misc.customscoreboard + +import at.hannibal2.skyhanni.data.HypixelData +import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay +import net.minecraft.client.Minecraft + +object CustomScoreboardUtils { + fun translateMayorNameToColor(input: String): String { + return when (input) { + // Normal Mayors + "Aatrox" -> "§3$input" + "Cole" -> "§e$input" + "Diana" -> "§2$input" + "Diaz" -> "§6$input" + "Finnegan" -> "§c$input" + "Foxy" -> "§d$input" + "Marina" -> "§b$input" + "Paul" -> "§c$input" + + // Special Mayors + "Scorpius" -> "§d$input" + "Jerry" -> "§d$input" + "Derpy" -> "§d$input" + "Dante" -> "§d$input" + else -> "§cUnknown Mayor: §7$input" + } + } + + fun extractLobbyCode(input: String): String? { + val regex = Regex("§(\\d{3}/\\d{2}/\\d{2}) §([A-Za-z0-9]+)$") + val matchResult = regex.find(input) + return matchResult?.groupValues?.lastOrNull() + } + + fun getProfileTypeAsSymbol(): String { + return when { + HypixelData.ironman -> "§7♲ " // Ironman + HypixelData.stranded -> "§a☀ " // Stranded + HypixelData.bingo -> ScoreboardData.sidebarLines.firstOrNull { it.contains("Bingo") }?.substring( + 0, + 3 + ) + "Ⓑ " // Bingo - gets the first 3 chars of " §9Ⓑ §9Bingo" (you are unable to get the Ⓑ for some reason) + else -> "§e" // Default case + } + } + + fun getTablistFooter(): String { + val tabList = Minecraft.getMinecraft().ingameGUI.tabList as AccessorGuiPlayerTabOverlay + if (tabList.footer_skyhanni == null) return "" + return tabList.footer_skyhanni.formattedText + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 365311052a97..15e6655baa8d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -53,7 +53,7 @@ enum class Elements( ), PROFILE( { - listOf(getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) + listOf(CustomScoreboardUtils.getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) }, { true @@ -302,7 +302,7 @@ enum class Elements( MAYOR( { listOf( - MayorElection.currentCandidate?.name?.let { translateMayorNameToColor(it) } ?: "" + MayorElection.currentCandidate?.name?.let { CustomScoreboardUtils.translateMayorNameToColor(it) } ?: "" ) + (if (config.showMayorPerks) { MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" } ?: emptyList() } else { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index a53570f0cbfd..365debd38069 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -203,7 +203,7 @@ enum class Events(private val displayLine: Supplier>, private val s listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§6Spooky Festival§f") } ?: "") + // Time ("§r§r§7Your Candy: ") + - (getTablistFooter().split("\n").firstOrNull { it.startsWith("§r§r§7Your Candy:") } + (CustomScoreboardUtils.getTablistFooter().split("\n").firstOrNull { it.startsWith("§r§r§7Your Candy:") } ?.removePrefix("§r§r§7Your Candy:") ?: "§cCandy not found") // Candy }, { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index e46fa74a95d8..35af00202c10 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -3,6 +3,7 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData +import at.hannibal2.skyhanni.features.misc.customscoreboard.CustomScoreboardUtils.extractLobbyCode class InformationGetter { fun getInformation() { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index b3821a927874..b3fc17669e53 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -15,7 +15,6 @@ import net.minecraft.util.ResourceLocation import org.lwjgl.opengl.GL11 private val config get() = SkyHanniMod.feature.gui.customScoreboard -private var cooldown = 0 class RenderBackground { fun renderBackground() { From aed9c5ad2e2fa0879b9f8ac15f3881dfb837f44c Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 4 Dec 2023 12:14:24 +0100 Subject: [PATCH 172/225] Fixed new motes color?? Wth hypixel --- .../features/misc/customscoreboard/InformationGetter.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 35af00202c10..2112da7ddbb7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -29,7 +29,7 @@ class InformationGetter { line.startsWith("Purse: §6") || line.startsWith("Piggy: §6") -> purse = line.removePrefix("Purse: §6").removePrefix("Piggy: §6") - line.startsWith("Motes: §d") -> motes = line.removePrefix("Motes: §d") + line.startsWith("Motes: §5") -> motes = line.removePrefix("Motes: §5") extractLobbyCode(line) is String -> lobbyCode = extractLobbyCode(line)?.substring(1) ?: "" //removes first char (number of color code) line.startsWith("Heat: ") -> heat = line.removePrefix("Heat: ") @@ -47,7 +47,7 @@ class InformationGetter { "§5ф ", "Purse: §6", "Piggy: §6", - "Motes: §d", + "Motes: §5", "Heat: ", "Bits: §b", "Copper: §c", @@ -104,7 +104,8 @@ class InformationGetter { "§7Give Tasty Mithril to Don!", "Remaining: §a", "Your Tasty Mithr: §c", - "§3§lSolo" + "§3§lSolo", + "§fRift Dimension" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } From 3ca479b9927a2f2a867e6f62a186faca3dcf92b7 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 4 Dec 2023 12:15:34 +0100 Subject: [PATCH 173/225] Updated motes color in config --- .../features/gui/customscoreboard/CustomScoreboardConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index faf6f560de61..b2970e9bceb0 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -34,7 +34,7 @@ public enum ScoreboardEntry { TITLE("§6§lSKYBLOCK"), PROFILE("§7♲ Blueberry"), PURSE("Purse: §652,763,737"), - MOTES("Motes: §d64,647"), + MOTES("Motes: §564,647"), BANK("Bank: §6249M"), BITS("Bits: §b59,264"), COPPER("Copper: §c23,495"), From 572f2786e8d54841d2d8bc36aea97568b1db9074 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 4 Dec 2023 20:03:44 +0100 Subject: [PATCH 174/225] Added option to center title + footer --- .../gui/customscoreboard/DisplayConfig.java | 6 ++ .../misc/customscoreboard/CustomScoreboard.kt | 27 +++--- .../misc/customscoreboard/Elements.kt | 93 +++++++++++-------- .../hannibal2/skyhanni/utils/RenderUtils.kt | 46 +++++++++ 4 files changed, 122 insertions(+), 50 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java index 8ccb0d16b150..0d6dc888d412 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java @@ -33,6 +33,12 @@ public class DisplayConfig { @FeatureToggle public boolean alignCenterVertically = false; + @Expose + @ConfigOption(name = "Center Title and Footer", desc = "Center the title and footer to the scoreboard width.") + @ConfigEditorBoolean + @FeatureToggle + public boolean centerTitleAndFooter = false; + @Expose @ConfigOption(name = "Custom Title", desc = "What should be displayed as the title of the scoreboard.\nUse & for colors.") @ConfigEditorText diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 9534f2d88a7c..07dcc02f8fc6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -22,13 +22,14 @@ import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings +import at.hannibal2.skyhanni.utils.RenderUtils.AlignmentEnum +import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAlignedWidth import net.minecraftforge.client.GuiIngameForge import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent private val config get() = SkyHanniMod.feature.gui.customScoreboard -private var display = emptyList() +private var display = emptyList>() class CustomScoreboard { @SubscribeEvent @@ -39,7 +40,7 @@ class CustomScoreboard { RenderBackground().renderBackground() - position.renderStrings(display, posLabel = "Custom Scoreboard") + position.renderStringsAlignedWidth(display, posLabel = "Custom Scoreboard") } @SubscribeEvent @@ -53,37 +54,37 @@ class CustomScoreboard { InformationGetter().getInformation() } - private fun createLines() = buildList { - val lineMap = HashMap>() + private fun createLines() = buildList> { + val lineMap = HashMap>>() for (element in Elements.entries) { - lineMap[element.index] = if (element.isVisible()) element.getLine() else listOf("") + lineMap[element.index] = if (element.isVisible()) element.getPair() else listOf("" to AlignmentEnum.LEFT) } return formatLines(lineMap) } - private fun formatLines(lineMap: HashMap>): MutableList { - val newList = mutableListOf() + private fun formatLines(lineMap: HashMap>>): MutableList> { + val newList = mutableListOf>() for (index in config.textFormat) { lineMap[index.ordinal]?.let { // Hide consecutive empty lines - if (config.informationFilteringConfig.hideConsecutiveEmptyLines && it[0] == "" && newList.lastOrNull() == "") { + if (config.informationFilteringConfig.hideConsecutiveEmptyLines && it[0].first == "" && newList.last().first == "") { continue } // Adds empty lines - if (it[0] == "") { - newList.add("") + if (it[0].first == "") { + newList.add("" to AlignmentEnum.LEFT) continue } // Does not display this line - if (it.any { i -> i == "" }) { + if (it.any { i -> i.first == "" }) { continue } // Multiline and singular line support - newList.addAll(it.map { i -> i.toString() }) + newList.addAll(it.map { i -> i }) } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 15e6655baa8d..7bdc75130c20 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -11,6 +11,7 @@ import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.mixins.hooks.replaceString import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter +import at.hannibal2.skyhanni.utils.RenderUtils.AlignmentEnum import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.TimeUtils.formatted import io.github.moulberry.notenoughupdates.util.SkyBlockTime @@ -35,15 +36,21 @@ var extraLines = listOf() val extraObjectiveLines = listOf("§7(§e", "§f Mages", "§f Barbarians") enum class Elements( - private val displayLine: Supplier>, + private val displayPair: Supplier>>, private val showWhen: () -> Boolean, val index: Int ) { SKYBLOCK( { + val alignment = if (config.displayConfig.centerTitleAndFooter) { + AlignmentEnum.CENTER + } else { + AlignmentEnum.LEFT + } + when (config.displayConfig.useHypixelTitleAnimation) { - true -> listOf(ScoreboardData.objectiveTitle) - false -> listOf(config.displayConfig.customTitle.get().toString().replace("&", "§")) + true -> listOf(ScoreboardData.objectiveTitle to alignment) + false -> listOf(config.displayConfig.customTitle.get().toString().replace("&", "§") to alignment) } }, { @@ -53,7 +60,7 @@ enum class Elements( ), PROFILE( { - listOf(CustomScoreboardUtils.getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase()) + listOf(CustomScoreboardUtils.getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase() to AlignmentEnum.LEFT) }, { true @@ -66,7 +73,7 @@ enum class Elements( config.informationFilteringConfig.hideEmptyLines && purse == "0" -> listOf("") config.displayConfig.displayNumbersFirst -> listOf("§6$purse Purse") else -> listOf("Purse: §6$purse") - } + }.map { it to AlignmentEnum.LEFT } }, { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) @@ -79,7 +86,7 @@ enum class Elements( config.informationFilteringConfig.hideEmptyLines && motes == "0" -> listOf("") config.displayConfig.displayNumbersFirst -> listOf("§d$motes Motes") else -> listOf("Motes: §d$motes") - } + }.map { it to AlignmentEnum.LEFT } }, { listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) @@ -92,7 +99,7 @@ enum class Elements( config.informationFilteringConfig.hideEmptyLines && bank == "0" -> listOf("") config.displayConfig.displayNumbersFirst -> listOf("§6$bank Bank") else -> listOf("Bank: §6$bank") - } + }.map { it to AlignmentEnum.LEFT } }, { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) @@ -105,7 +112,7 @@ enum class Elements( config.informationFilteringConfig.hideEmptyLines && bits == "0" -> listOf("") config.displayConfig.displayNumbersFirst -> listOf("§b$bits Bits") else -> listOf("Bits: §b$bits") - } + }.map { it to AlignmentEnum.LEFT } }, { !listOf(IslandType.THE_RIFT, IslandType.CATACOMBS).contains(HypixelData.skyBlockIsland) @@ -118,7 +125,7 @@ enum class Elements( config.informationFilteringConfig.hideEmptyLines && copper == "0" -> listOf("") config.displayConfig.displayNumbersFirst -> listOf("§c$copper Copper") else -> listOf("Copper: §c$copper") - } + }.map { it to AlignmentEnum.LEFT } }, { listOf(IslandType.GARDEN).contains(HypixelData.skyBlockIsland) @@ -131,7 +138,7 @@ enum class Elements( config.informationFilteringConfig.hideEmptyLines && gems == "0" -> listOf("") config.displayConfig.displayNumbersFirst -> listOf("§a$gems Gems") else -> listOf("Gems: §a$gems") - } + }.map { it to AlignmentEnum.LEFT } }, { !listOf(IslandType.THE_RIFT, IslandType.CATACOMBS).contains(HypixelData.skyBlockIsland) @@ -144,7 +151,7 @@ enum class Elements( config.informationFilteringConfig.hideEmptyLines && heat == "§c♨ 0" -> listOf("") config.displayConfig.displayNumbersFirst -> listOf(if (heat == "§c♨ 0") "§c♨ 0 Heat" else "$heat Heat") else -> listOf(if (heat == "§c♨ 0") "Heat: §c♨ 0" else "Heat: $heat") - } + }.map { it to AlignmentEnum.LEFT } }, { listOf(IslandType.CRYSTAL_HOLLOWS).contains(HypixelData.skyBlockIsland) @@ -153,7 +160,7 @@ enum class Elements( ), EMPTY_LINE( { - listOf("") + listOf("" to AlignmentEnum.LEFT) }, { true @@ -162,7 +169,7 @@ enum class Elements( ), LOCATION( { - listOf(replaceString(location) ?: "") + listOf((replaceString(location) ?: "") to AlignmentEnum.LEFT) }, { true @@ -171,7 +178,9 @@ enum class Elements( ), SKYBLOCK_TIME_DAY( { - listOf(SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false)) + listOf( + SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false) to AlignmentEnum.LEFT + ) }, { true @@ -182,9 +191,12 @@ enum class Elements( { val symbols = listOf("☔", "§e☀", "§b☽") if (ScoreboardData.sidebarLinesFormatted.any { line -> symbols.any { line.contains(it) } }) { - listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } }) + listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } } to AlignmentEnum.LEFT) } else { - listOf("§7" + SkyBlockTime.now().formatted(dayAndMonthElement = false, yearElement = false)) + listOf( + "§7" + SkyBlockTime.now() + .formatted(dayAndMonthElement = false, yearElement = false) to AlignmentEnum.LEFT + ) } }, { @@ -194,7 +206,7 @@ enum class Elements( ), LOBBY_CODE( { - listOf("§8$lobbyCode") + listOf("§8$lobbyCode" to AlignmentEnum.LEFT) }, { true @@ -204,11 +216,11 @@ enum class Elements( MAXWELL( { when (MaxwellAPI.currentPower == null) { - true -> listOf("§c§lPlease visit Maxwell!") + true -> listOf("§c§lPlease visit Maxwell!" to AlignmentEnum.LEFT) false -> when (config.displayConfig.displayNumbersFirst) { - true -> listOf("${MaxwellAPI.currentPower?.power} Power") - false -> listOf("Power: ${MaxwellAPI.currentPower?.power}") + true -> listOf("${MaxwellAPI.currentPower?.power} Power" to AlignmentEnum.LEFT) + false -> listOf("Power: ${MaxwellAPI.currentPower?.power}" to AlignmentEnum.LEFT) } } }, @@ -219,7 +231,7 @@ enum class Elements( ), EMPTY_LINE2( { - listOf("") + listOf("" to AlignmentEnum.LEFT) }, { true @@ -240,7 +252,7 @@ enum class Elements( objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2).toString() } - objective + objective.map { it to AlignmentEnum.LEFT } }, { true @@ -250,11 +262,11 @@ enum class Elements( SLAYER( { listOf( - (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") + (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") to AlignmentEnum.LEFT ) + ( - " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" + " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" to AlignmentEnum.LEFT ) + ( - " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" + " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" to AlignmentEnum.LEFT ) }, { @@ -271,7 +283,7 @@ enum class Elements( ), EMPTY_LINE3( { - listOf("") + listOf("" to AlignmentEnum.LEFT) }, { true @@ -283,7 +295,7 @@ enum class Elements( when (config.displayConfig.displayNumbersFirst) { true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") - } + }.map { it to AlignmentEnum.LEFT } }, { listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES).contains(HypixelData.skyBlockIsland) @@ -292,7 +304,7 @@ enum class Elements( ), CURRENT_EVENT( { - Events.getFirstEvent().getLines() + Events.getFirstEvent().getLines().map { it to AlignmentEnum.LEFT } }, { true @@ -302,9 +314,10 @@ enum class Elements( MAYOR( { listOf( - MayorElection.currentCandidate?.name?.let { CustomScoreboardUtils.translateMayorNameToColor(it) } ?: "" + (MayorElection.currentCandidate?.name?.let { CustomScoreboardUtils.translateMayorNameToColor(it) } + ?: "") to AlignmentEnum.LEFT ) + (if (config.showMayorPerks) { - MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" } ?: emptyList() + MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" to AlignmentEnum.LEFT } ?: emptyList() } else { emptyList() }) @@ -316,9 +329,9 @@ enum class Elements( ), PARTY( { - val partyTitle: List = + val partyTitle: List> = if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { - listOf("") + listOf("" to AlignmentEnum.LEFT) } else { val title = if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" @@ -328,7 +341,7 @@ enum class Elements( " §7- §7$it" } .toTypedArray() - listOf(title, *partyList) + listOf(title, *partyList).map { it to AlignmentEnum.LEFT } } partyTitle @@ -352,7 +365,13 @@ enum class Elements( ), WEBSITE( { - listOf(config.displayConfig.customFooter.get().toString().replace("&", "§")) + val alignment = if (config.displayConfig.centerTitleAndFooter) { + AlignmentEnum.CENTER + } else { + AlignmentEnum.LEFT + } + + listOf(config.displayConfig.customFooter.get().toString().replace("&", "§") to alignment) }, { true @@ -361,7 +380,7 @@ enum class Elements( ), EXTRA_LINES( { - listOf("§cUndetected Lines (pls report):") + extraLines + listOf("§cUndetected Lines (pls report):" to AlignmentEnum.CENTER) + extraLines.map { it to AlignmentEnum.LEFT } }, { extraLines.isNotEmpty() @@ -370,8 +389,8 @@ enum class Elements( ), ; - fun getLine(): List { - return displayLine.get() + fun getPair(): List> { + return displayPair.get() } fun isVisible(): Boolean { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt index 03f552e7af70..0d88f24bb654 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt @@ -4,6 +4,7 @@ import at.hannibal2.skyhanni.config.core.config.Position import at.hannibal2.skyhanni.data.GuiEditManager import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsX import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY +import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize import at.hannibal2.skyhanni.events.GuiRenderItemEvent import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList @@ -392,6 +393,32 @@ object RenderUtils { return renderer.getStringWidth(display) } + // Aligns using the width of element to render + private fun Position.renderString0(string: String?, offsetX: Int = 0, offsetY: Int = 0, alignmentEnum: AlignmentEnum): Int { + val display = "§f$string" + GlStateManager.pushMatrix() + transform() + val minecraft = Minecraft.getMinecraft() + val renderer = minecraft.renderManager.fontRenderer + val width = this.getDummySize().x + + GlStateManager.translate(offsetX + 1.0, offsetY + 1.0, 0.0) + + val strLen: Int = renderer.getStringWidth(string) + val x2 = when (alignmentEnum) { + AlignmentEnum.LEFT -> offsetX.toFloat() + AlignmentEnum.CENTER -> offsetX + width / 2f - strLen / 2f + AlignmentEnum.RIGHT -> offsetX + width - strLen.toFloat() + } + GL11.glTranslatef(x2, 0f, 0f) + renderer.drawStringWithShadow(display, 0f, 0f, 0) + GL11.glTranslatef(-x2, 0f, 0f) + + GlStateManager.popMatrix() + + return renderer.getStringWidth(display) + } + fun Position.renderStrings(list: List, extraSpace: Int = 0, posLabel: String) { if (list.isEmpty()) return @@ -407,6 +434,25 @@ object RenderUtils { GuiEditManager.add(this, posLabel, longestX, offsetY) } + enum class AlignmentEnum { + LEFT, CENTER, RIGHT + } + + fun Position.renderStringsAlignedWidth(list: List>, extraSpace: Int = 0, posLabel: String){ + if (list.isEmpty()) return + + var offsetY = 0 + var longestX = 0 + for (pair in list) { + val x = renderString0(pair.first, offsetY = offsetY, alignmentEnum = pair.second) + if (x > longestX) { + longestX = x + } + offsetY += 10 + extraSpace + } + GuiEditManager.add(this, posLabel, longestX, offsetY) + } + fun Position.renderRenderables( renderables: List, extraSpace: Int = 0, From ab33e6fdd08a108fd3101a814d7603d6f1e84ad9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 4 Dec 2023 20:06:28 +0100 Subject: [PATCH 175/225] removed gemstone & mithril powder from extra lines --- .../features/misc/customscoreboard/InformationGetter.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 2112da7ddbb7..ab77b28e04bf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -105,7 +105,9 @@ class InformationGetter { "Remaining: §a", "Your Tasty Mithr: §c", "§3§lSolo", - "§fRift Dimension" + "§fRift Dimension", + "§d᠅ §fGemstone§f: §d", + "§2᠅ §fMithril§f: §2" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } From 709b12c1878be517e831f6473158498ce89b19f4 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 4 Dec 2023 20:11:08 +0100 Subject: [PATCH 176/225] fixed objective line when funny arrows --- .../skyhanni/features/misc/customscoreboard/Elements.kt | 8 ++++---- .../features/misc/customscoreboard/InformationGetter.kt | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 7bdc75130c20..a60539087571 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -242,14 +242,14 @@ enum class Elements( { val objective = mutableListOf() - objective += "Objective:" + objective += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Objective") } - objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective") ?: "" + objective += ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0]) ?: "" if (extraObjectiveLines.any { - ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2)?.contains(it) == true + ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2)?.contains(it) == true }) { - objective += ScoreboardData.sidebarLinesFormatted.nextAfter("Objective", 2).toString() + objective += ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2).toString() } objective.map { it to AlignmentEnum.LEFT } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index ab77b28e04bf..ebd0a12fe394 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -117,8 +117,9 @@ class InformationGetter { // remove objectives extraLines = extraLines.filter { sidebarLines.nextAfter("§fObjective") != it } - extraLines = extraLines.filter { sidebarLines.nextAfter("Objective") != it } - extraLines = extraLines.filter { sidebarLines.nextAfter("Objective", 2) != it && !extraObjectiveLines.contains(it)} + val objectiveLines = ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Objective") } + extraLines = extraLines.filter { sidebarLines.nextAfter(objectiveLines) != it } + extraLines = extraLines.filter { sidebarLines.nextAfter(objectiveLines, 2) != it && !extraObjectiveLines.contains(it)} // remove wind compass extraLines = extraLines.filter { sidebarLines.nextAfter("§9Wind Compass") != it } From 84d4769978280e420217f011122b70e1e7999232 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 4 Dec 2023 20:12:33 +0100 Subject: [PATCH 177/225] fixed green ) in villager line --- .../skyhanni/features/misc/customscoreboard/Elements.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index a60539087571..25c9a87c62ad 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -249,7 +249,7 @@ enum class Elements( if (extraObjectiveLines.any { ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2)?.contains(it) == true }) { - objective += ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2).toString() + objective += ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2).toString().replace(")", "§7)") } objective.map { it to AlignmentEnum.LEFT } From bd98e14003703d46f7d7d59b31b51898bd6e0f9a Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 4 Dec 2023 20:54:31 +0100 Subject: [PATCH 178/225] maybe fixed some issues with the scoreboard lines letter removing --- .../at/hannibal2/skyhanni/data/ScoreboardData.kt | 8 ++++---- .../features/misc/customscoreboard/Events.kt | 14 ++++++-------- .../misc/customscoreboard/InformationGetter.kt | 6 +++--- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt b/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt index 71d84328c94a..bdde046eb2ee 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt @@ -34,11 +34,11 @@ class ScoreboardData { fun formatLines(rawList: List): List { val list = mutableListOf() for (line in rawList) { - val seperator = splitIcons.find { line.contains(it) } ?: continue - val split = line.split(seperator) + val separator = splitIcons.find { line.contains(it) } ?: continue + val split = line.split(separator) val start = split[0] var end = split[1] - if (end.length >= 2) { + if (end.length >= 2 && end[0] == '§' && (end[1] in '0'..'9' || end[1] in 'a'..'f')) { end = end.substring(2) } list.add(start + end) @@ -93,4 +93,4 @@ class ScoreboardData { ScorePlayerTeam.formatPlayerName(scoreboard.getPlayersTeam(it.playerName), it.playerName) } } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 365debd38069..57b2f77fe710 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -46,7 +46,6 @@ enum class Events(private val displayLine: Supplier>, private val s "Cleared:" ) }.toString() - .replace("§r", "").replace("%", "%§") // for some reason this is broken } val dungeonPlayers = TabListData.getTabList().firstOrNull { it.trim().startsWith("§r§b§lParty §r§f(") } @@ -90,10 +89,9 @@ enum class Events(private val displayLine: Supplier>, private val s if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Starting in:") }) { list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Starting in:") } ?: "" } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Instance ShutdowIn:") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Instance ShutdowIn:") } - ?.replace("Instance ShutdowIn:", "Instance Shutdown In:") - ?: ""// for some reason this is broken + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Instance Shutdow") }) { + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Instance Shutdow") } + ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Time Elapsed: ") }) { @@ -183,9 +181,9 @@ enum class Events(private val displayLine: Supplier>, private val s list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Magma Cubes Left§c") } ?: "" } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Total Damag §c") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Total Damag §c") } - ?.replace("Damag", "Damage") ?: "" + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Total Dama") }) { + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Total Dama") } + ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Cube Damage§c") }) { list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Cube Damage§c") } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index ebd0a12fe394..28474dde571a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -64,7 +64,7 @@ class InformationGetter { "Keys: ", "Time Elapsed:", "§rCleared: ", - "Instance ShutdowIn:", + "Instance Shutdow", "Time Elapsed: ", "§f§lWave: §c§l", "§fTokens: ", @@ -80,7 +80,7 @@ class InformationGetter { "Next Wave: §a", "§cWave", "Magma Cubes Left§c", - "Your Total Damag §c", + "Your Total Damag", "Your Cube Damage§c", "§6Spooky Festival§f", "§dNew Year Event", @@ -103,7 +103,7 @@ class InformationGetter { "§4Broodmother§7:", "§7Give Tasty Mithril to Don!", "Remaining: §a", - "Your Tasty Mithr: §c", + "Your Tasty Mithr", "§3§lSolo", "§fRift Dimension", "§d᠅ §fGemstone§f: §d", From 42472c7dd3eac961e9299150bfe4754ba322ce7a Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 4 Dec 2023 23:14:33 +0100 Subject: [PATCH 179/225] better error handling when NoSuchElementException in getPair() --- .../skyhanni/features/misc/customscoreboard/Elements.kt | 9 +++++++-- .../features/misc/customscoreboard/InformationGetter.kt | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 25c9a87c62ad..372fd7ce0eb4 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -9,6 +9,7 @@ import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.mixins.hooks.replaceString +import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.RenderUtils.AlignmentEnum @@ -191,7 +192,7 @@ enum class Elements( { val symbols = listOf("☔", "§e☀", "§b☽") if (ScoreboardData.sidebarLinesFormatted.any { line -> symbols.any { line.contains(it) } }) { - listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } } to AlignmentEnum.LEFT) + listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } }.trim() to AlignmentEnum.LEFT) } else { listOf( "§7" + SkyBlockTime.now() @@ -390,7 +391,11 @@ enum class Elements( ; fun getPair(): List> { - return displayPair.get() + return try { + displayPair.get() + } catch (e: NoSuchElementException){ + listOf("" to AlignmentEnum.LEFT) + } } fun isVisible(): Boolean { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 28474dde571a..0c1444053aaf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData import at.hannibal2.skyhanni.features.misc.customscoreboard.CustomScoreboardUtils.extractLobbyCode @@ -144,5 +145,7 @@ class InformationGetter { // Remove slayer extraLines = extraLines.filter { sidebarLines.nextAfter("Slayer Quest", 1) != it } extraLines = extraLines.filter { sidebarLines.nextAfter("Slayer Quest", 2) != it } + extraLines = extraLines.filter { it != SlayerAPI.latestSlayerCategory } + extraLines = extraLines.filter { it != SlayerAPI.latestSlayerProgress } } } From 5c0c2c4833ad44ce16ba46bce152f079094e0335 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:54:18 +0100 Subject: [PATCH 180/225] fixed slayers --- .../features/misc/customscoreboard/InformationGetter.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 0c1444053aaf..69093c81f5f3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -108,7 +108,13 @@ class InformationGetter { "§3§lSolo", "§fRift Dimension", "§d᠅ §fGemstone§f: §d", - "§2᠅ §fMithril§f: §2" + "§2᠅ §fMithril§f: §2", + "Revenant Horror", + "Tarantula Broodfa", + "Sven Packm", + "Voidgloom Seraph", + "Inferno Demo", + "Combat XP", ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } From 64cd8c49310ccbcc15a187d9f60012f46fa99f65 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:56:26 +0100 Subject: [PATCH 181/225] Added flight duration --- .../skyhanni/features/misc/customscoreboard/Events.kt | 9 +++++++++ .../features/misc/customscoreboard/InformationGetter.kt | 1 + 2 files changed, 10 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 57b2f77fe710..f31564a49dbf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -157,6 +157,15 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6§lGOLD §fmedals") } } ), + FLIGHT_DURATION( + { + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Flight Duration:") }?.replace(":a", ":§a") + ?: "") + }, + { + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Flight Duration:") } + } + ), WINTER( // not tested { val list = mutableListOf() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 69093c81f5f3..001e7580fe18 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -115,6 +115,7 @@ class InformationGetter { "Voidgloom Seraph", "Inferno Demo", "Combat XP", + "Flight Duration:" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } From b770a30865b40845fb1f9508774314a309656b06 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:57:37 +0100 Subject: [PATCH 182/225] Added cleanup --- .../skyhanni/features/misc/customscoreboard/Events.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index f31564a49dbf..7e5eff8eb6ae 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -157,6 +157,15 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6§lGOLD §fmedals") } } ), + CLEAN_UP( + { + listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.trim().startsWith("§fCleanup§7:") } + ?: "") + }, + { + ScoreboardData.sidebarLinesFormatted.any { it.trim().startsWith("§fCleanup§7:") } + } + ), FLIGHT_DURATION( { listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Flight Duration:") }?.replace(":a", ":§a") From c7286cff486aeeff4718a6f47cec2f6bc0d748d1 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 5 Dec 2023 16:09:22 +0100 Subject: [PATCH 183/225] Added visiting --- .../CustomScoreboardConfig.java | 3 +- .../misc/customscoreboard/CustomScoreboard.kt | 2 +- .../misc/customscoreboard/Elements.kt | 40 +++++++++++-------- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index b2970e9bceb0..0708d1f917e2 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -28,7 +28,7 @@ public class CustomScoreboardConfig { desc = "Drag text to change the appearance of the advanced scoreboard." // now supporting both custom & advanced search ) @ConfigEditorDraggableList() - public List textFormat = new ArrayList<>(Arrays.asList(ScoreboardEntry.values())); + public List scoreboardEntries = new ArrayList<>(Arrays.asList(ScoreboardEntry.values())); public enum ScoreboardEntry { TITLE("§6§lSKYBLOCK"), @@ -42,6 +42,7 @@ public enum ScoreboardEntry { HEAT("Heat: §c♨ 0"), EMPTY_LINE(""), LOCATION("§7⏣ §bVillage"), + VISITING(" §a✌ §7(§a1§7/6)"), DATE("Late Summer 11th"), TIME("§710:40pm"), LOBBY_CODE("§8m77CK"), diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 07dcc02f8fc6..198df0c3e102 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -65,7 +65,7 @@ class CustomScoreboard { private fun formatLines(lineMap: HashMap>>): MutableList> { val newList = mutableListOf>() - for (index in config.textFormat) { + for (index in config.scoreboardEntries) { lineMap[index.ordinal]?.let { // Hide consecutive empty lines if (config.informationFilteringConfig.hideConsecutiveEmptyLines && it[0].first == "" && newList.last().first == "") { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 372fd7ce0eb4..b7db87dfac2d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -9,7 +9,6 @@ import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.mixins.hooks.replaceString -import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.RenderUtils.AlignmentEnum @@ -177,6 +176,15 @@ enum class Elements( }, 10 ), + VISITING( + { + listOf((ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith(" §a✌ §")} ?: "") to AlignmentEnum.LEFT) + }, + { + ScoreboardData.sidebarLinesFormatted.any { it.startsWith(" §a✌ §") } + }, + 11 + ), SKYBLOCK_TIME_DAY( { listOf( @@ -186,7 +194,7 @@ enum class Elements( { true }, - 11 + 12 ), SKYBLOCK_TIME_MINUTE( { @@ -203,7 +211,7 @@ enum class Elements( { true }, - 12 + 13 ), LOBBY_CODE( { @@ -212,7 +220,7 @@ enum class Elements( { true }, - 13 + 14 ), MAXWELL( { @@ -228,7 +236,7 @@ enum class Elements( { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) }, - 14 + 15 ), EMPTY_LINE2( { @@ -237,7 +245,7 @@ enum class Elements( { true }, - 15 + 16 ), OBJECTIVE( { @@ -258,7 +266,7 @@ enum class Elements( { true }, - 16 + 17 ), SLAYER( { @@ -280,7 +288,7 @@ enum class Elements( at.hannibal2.skyhanni.data.IslandType.THE_RIFT ).contains(HypixelData.skyBlockIsland) }, - 17 + 18 ), EMPTY_LINE3( { @@ -289,7 +297,7 @@ enum class Elements( { true }, - 18 + 19 ), POWDER( { @@ -301,7 +309,7 @@ enum class Elements( { listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES).contains(HypixelData.skyBlockIsland) }, - 19 + 20 ), CURRENT_EVENT( { @@ -310,7 +318,7 @@ enum class Elements( { true }, - 20 + 21 ), MAYOR( { @@ -326,7 +334,7 @@ enum class Elements( { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) }, - 21 + 22 ), PARTY( { @@ -349,7 +357,7 @@ enum class Elements( }, { if (inDungeons) { - false // Hidden bc teammate health etc exists + false // Hidden bc teammate health etc. exists } else { if (config.partyConfig.showPartyEverywhere) { true @@ -362,7 +370,7 @@ enum class Elements( } } }, - 22 + 23 ), WEBSITE( { @@ -377,7 +385,7 @@ enum class Elements( { true }, - 23 + 24 ), EXTRA_LINES( { @@ -386,7 +394,7 @@ enum class Elements( { extraLines.isNotEmpty() }, - 24 + 25 ), ; From 4347a3a2380958b7a89d9f22dcd94f064443ddca Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 5 Dec 2023 16:11:56 +0100 Subject: [PATCH 184/225] fixed wind time --- .../skyhanni/features/misc/customscoreboard/Events.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 7e5eff8eb6ae..62f459cfca7b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -157,7 +157,7 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6§lGOLD §fmedals") } } ), - CLEAN_UP( + GARDEN_CLEAN_UP( { listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.trim().startsWith("§fCleanup§7:") } ?: "") @@ -278,7 +278,7 @@ enum class Events(private val displayLine: Supplier>, private val s // Wind if (ScoreboardData.sidebarLinesFormatted.any { it == "§9Wind Compass" }) { list += "§9Wind Compass" - list += ScoreboardData.sidebarLinesFormatted.nextAfter("§9Wind Compass") + list += ScoreboardData.sidebarLinesFormatted.nextAfter("§9Wind Compass")?.replace("a", "§a") ?: "§7No Wind Compass for some reason" } From c01fbd077148b067f0e51e001f084dfaa6eb8e8f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:59:52 +0100 Subject: [PATCH 185/225] fixed some issues in getter --- .../features/misc/customscoreboard/InformationGetter.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 001e7580fe18..289bb1723e53 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -42,6 +42,9 @@ class InformationGetter { if (sidebarLines.none { it.startsWith(("Heat: "))}){ heat = "§c♨ 0" } + if (sidebarLines.none { it.startsWith(("Bits: §b"))}){ + bits = "0" + } val knownLines = listOf( "§7⏣ ", @@ -152,7 +155,5 @@ class InformationGetter { // Remove slayer extraLines = extraLines.filter { sidebarLines.nextAfter("Slayer Quest", 1) != it } extraLines = extraLines.filter { sidebarLines.nextAfter("Slayer Quest", 2) != it } - extraLines = extraLines.filter { it != SlayerAPI.latestSlayerCategory } - extraLines = extraLines.filter { it != SlayerAPI.latestSlayerProgress } } } From cadefbf0a16cad69b7ae0e1cfe06a4cef323a49a Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 5 Dec 2023 18:33:29 +0100 Subject: [PATCH 186/225] =?UTF-8?q?now=20supporting=20both=20=C2=A7d=20and?= =?UTF-8?q?=20=C2=A75=20as=20motes=20color?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/misc/customscoreboard/InformationGetter.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 289bb1723e53..700d42b22992 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -31,6 +31,7 @@ class InformationGetter { line.removePrefix("Purse: §6").removePrefix("Piggy: §6") line.startsWith("Motes: §5") -> motes = line.removePrefix("Motes: §5") + line.startsWith("Motes: §d") -> motes = line.removePrefix("Motes: §d") extractLobbyCode(line) is String -> lobbyCode = extractLobbyCode(line)?.substring(1) ?: "" //removes first char (number of color code) line.startsWith("Heat: ") -> heat = line.removePrefix("Heat: ") @@ -52,6 +53,7 @@ class InformationGetter { "Purse: §6", "Piggy: §6", "Motes: §5", + "Motes: §d", "Heat: ", "Bits: §b", "Copper: §c", From 3b5f452cb592694f180ed88b4d903dd55988fbf1 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 5 Dec 2023 22:24:46 +0100 Subject: [PATCH 187/225] fixed getter lag --- .../features/misc/customscoreboard/InformationGetter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 700d42b22992..01ddb211a1fb 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -130,7 +130,7 @@ class InformationGetter { // remove objectives extraLines = extraLines.filter { sidebarLines.nextAfter("§fObjective") != it } - val objectiveLines = ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Objective") } + val objectiveLines = ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Objective") } ?: "Objective" extraLines = extraLines.filter { sidebarLines.nextAfter(objectiveLines) != it } extraLines = extraLines.filter { sidebarLines.nextAfter(objectiveLines, 2) != it && !extraObjectiveLines.contains(it)} From c61c1b9425130d3e29dad6abbe63f600bed1f704 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 5 Dec 2023 23:13:24 +0100 Subject: [PATCH 188/225] moved a dot around --- .../config/features/gui/customscoreboard/BackgroundConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java index bc7007b5d2bb..5d95f8828a27 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java @@ -27,7 +27,7 @@ public class BackgroundConfig { @Expose @ConfigOption( name = "Use Custom Background Image", - desc = "Put that image into a resource pack, using the path \"skyhanni/scoreboard.png.\"" + desc = "Put that image into a resource pack, using the path \"skyhanni/scoreboard.png\"." ) @ConfigEditorBoolean @FeatureToggle From 2bbacd180b4bb980ce6e4ddd89004bee33ab1b8f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 6 Dec 2023 20:05:40 +0100 Subject: [PATCH 189/225] No longer rendering bg in guieditmanager --- .../features/misc/customscoreboard/RenderBackground.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt index b3fc17669e53..0ea68722baa3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/RenderBackground.kt @@ -2,6 +2,7 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.config.core.config.Position +import at.hannibal2.skyhanni.data.GuiEditManager import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsX import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize @@ -44,6 +45,9 @@ class RenderBackground { position.isCenter ) ) + + if (GuiEditManager.isInGui()) return + /*if (config.backgroundConfig.enabled) { ShaderManager.enableShader("rounded_rectangle") } else { From 9b1262d23186b7fecda62ce53d0ec33711560578 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 6 Dec 2023 21:13:05 +0100 Subject: [PATCH 190/225] New draggable list config system --- .../CustomScoreboardConfig.java | 46 +----------- .../misc/customscoreboard/CustomScoreboard.kt | 2 +- .../misc/customscoreboard/Elements.kt | 72 ++++++++++--------- 3 files changed, 42 insertions(+), 78 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index 0708d1f917e2..53e5306d4ed5 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -2,6 +2,7 @@ import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.config.core.config.Position; +import at.hannibal2.skyhanni.features.misc.customscoreboard.Elements; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.Accordion; import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; @@ -25,51 +26,10 @@ public class CustomScoreboardConfig { @Expose @ConfigOption( name = "Appearance", - desc = "Drag text to change the appearance of the advanced scoreboard." // now supporting both custom & advanced search + desc = "Drag text to change the appearance of the advanced scoreboard." // supporting both custom & advanced search ) @ConfigEditorDraggableList() - public List scoreboardEntries = new ArrayList<>(Arrays.asList(ScoreboardEntry.values())); - - public enum ScoreboardEntry { - TITLE("§6§lSKYBLOCK"), - PROFILE("§7♲ Blueberry"), - PURSE("Purse: §652,763,737"), - MOTES("Motes: §564,647"), - BANK("Bank: §6249M"), - BITS("Bits: §b59,264"), - COPPER("Copper: §c23,495"), - GEMS("Gems: §a57,873"), - HEAT("Heat: §c♨ 0"), - EMPTY_LINE(""), - LOCATION("§7⏣ §bVillage"), - VISITING(" §a✌ §7(§a1§7/6)"), - DATE("Late Summer 11th"), - TIME("§710:40pm"), - LOBBY_CODE("§8m77CK"), - POWER("Power: Sighted"), - EMPTY_LINE2(""), - OBJECTIVE("Objective:\n§eUpdate SkyHanni"), - SLAYER("§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills"), - EMPTY_LINE3(""), - POWDER("§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234"), - EVENTS("§7Wide Range of Events\n§7(too much for this here)"), - MAYOR("§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff"), - PARTY("§9§lParty (4):\n §7- §fhannibal2\n §7- §fMoulberry\n §7- §fVahvl\n §7- §fJ10a1n15"), - FOOTER("§ewww.hypixel.net"), - EXTRA("§7Extra lines the mod is not detecting") - ; - - private final String str; - - ScoreboardEntry(String str) { - this.str = str; - } - - @Override - public String toString() { - return str; - } - } + public List scoreboardEntries = new ArrayList<>(Arrays.asList(Elements.values())); @Expose @ConfigOption(name = "Display Options", desc = "") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 198df0c3e102..2bf7c158a89f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -57,7 +57,7 @@ class CustomScoreboard { private fun createLines() = buildList> { val lineMap = HashMap>>() for (element in Elements.entries) { - lineMap[element.index] = if (element.isVisible()) element.getPair() else listOf("" to AlignmentEnum.LEFT) + lineMap[element.ordinal] = if (element.isVisible()) element.getPair() else listOf("" to AlignmentEnum.LEFT) } return formatLines(lineMap) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index b7db87dfac2d..fd51b5961095 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -38,9 +38,9 @@ val extraObjectiveLines = listOf("§7(§e", "§f Mages", "§f Barbarians") enum class Elements( private val displayPair: Supplier>>, private val showWhen: () -> Boolean, - val index: Int + private val configLine : String ) { - SKYBLOCK( + TITLE( { val alignment = if (config.displayConfig.centerTitleAndFooter) { AlignmentEnum.CENTER @@ -56,7 +56,7 @@ enum class Elements( { true }, - 0 + "§6§lSKYBLOCK" ), PROFILE( { @@ -65,7 +65,7 @@ enum class Elements( { true }, - 1 + "§7♲ Blueberry" ), PURSE( { @@ -78,7 +78,7 @@ enum class Elements( { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) }, - 2 + "Purse: §652,763,737" ), MOTES( { @@ -91,7 +91,7 @@ enum class Elements( { listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) }, - 3 + "Motes: §d64,647" ), BANK( { @@ -104,7 +104,7 @@ enum class Elements( { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) }, - 4 + "Bank: §6249M" ), BITS( { @@ -117,7 +117,7 @@ enum class Elements( { !listOf(IslandType.THE_RIFT, IslandType.CATACOMBS).contains(HypixelData.skyBlockIsland) }, - 5 + "Bits: §b59,264" ), COPPER( { @@ -130,7 +130,7 @@ enum class Elements( { listOf(IslandType.GARDEN).contains(HypixelData.skyBlockIsland) }, - 6 + "Copper: §c23,495" ), GEMS( { @@ -143,7 +143,7 @@ enum class Elements( { !listOf(IslandType.THE_RIFT, IslandType.CATACOMBS).contains(HypixelData.skyBlockIsland) }, - 7 + "Gems: §a57,873" ), HEAT( { @@ -156,7 +156,7 @@ enum class Elements( { listOf(IslandType.CRYSTAL_HOLLOWS).contains(HypixelData.skyBlockIsland) }, - 8 + "Heat: §c♨ 0" ), EMPTY_LINE( { @@ -165,7 +165,7 @@ enum class Elements( { true }, - 9 + "" ), LOCATION( { @@ -174,7 +174,7 @@ enum class Elements( { true }, - 10 + "§7⏣ §bVillage" ), VISITING( { @@ -183,9 +183,9 @@ enum class Elements( { ScoreboardData.sidebarLinesFormatted.any { it.startsWith(" §a✌ §") } }, - 11 + " §a✌ §7(§a1§7/6)" ), - SKYBLOCK_TIME_DAY( + DATE( { listOf( SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false) to AlignmentEnum.LEFT @@ -194,9 +194,9 @@ enum class Elements( { true }, - 12 + "Late Summer 11th" ), - SKYBLOCK_TIME_MINUTE( + TIME( { val symbols = listOf("☔", "§e☀", "§b☽") if (ScoreboardData.sidebarLinesFormatted.any { line -> symbols.any { line.contains(it) } }) { @@ -211,7 +211,7 @@ enum class Elements( { true }, - 13 + "§710:40pm" ), LOBBY_CODE( { @@ -220,9 +220,9 @@ enum class Elements( { true }, - 14 + "§8m77CK" ), - MAXWELL( + POWER( { when (MaxwellAPI.currentPower == null) { true -> listOf("§c§lPlease visit Maxwell!" to AlignmentEnum.LEFT) @@ -236,7 +236,7 @@ enum class Elements( { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) }, - 15 + "Power: Sighted" ), EMPTY_LINE2( { @@ -245,7 +245,7 @@ enum class Elements( { true }, - 16 + "" ), OBJECTIVE( { @@ -266,7 +266,7 @@ enum class Elements( { true }, - 17 + "Objective:\n§eUpdate SkyHanni" ), SLAYER( { @@ -288,7 +288,7 @@ enum class Elements( at.hannibal2.skyhanni.data.IslandType.THE_RIFT ).contains(HypixelData.skyBlockIsland) }, - 18 + "§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills" ), EMPTY_LINE3( { @@ -297,7 +297,7 @@ enum class Elements( { true }, - 19 + "" ), POWDER( { @@ -309,16 +309,16 @@ enum class Elements( { listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES).contains(HypixelData.skyBlockIsland) }, - 20 + "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234" ), - CURRENT_EVENT( + EVENTS( { Events.getFirstEvent().getLines().map { it to AlignmentEnum.LEFT } }, { true }, - 21 + "§7Wide Range of Events\n§7(too much for this here)" ), MAYOR( { @@ -334,7 +334,7 @@ enum class Elements( { !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) }, - 22 + "§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff" ), PARTY( { @@ -370,9 +370,9 @@ enum class Elements( } } }, - 23 + "§9§lParty (4):\n §7- §fhannibal2\n §7- §fMoulberry\n §7- §fVahvl\n §7- §fJ10a1n15" ), - WEBSITE( + FOOTER( { val alignment = if (config.displayConfig.centerTitleAndFooter) { AlignmentEnum.CENTER @@ -385,19 +385,23 @@ enum class Elements( { true }, - 24 + "§ewww.hypixel.net" ), - EXTRA_LINES( + EXTRA( { listOf("§cUndetected Lines (pls report):" to AlignmentEnum.CENTER) + extraLines.map { it to AlignmentEnum.LEFT } }, { extraLines.isNotEmpty() }, - 25 + "§7Extra lines the mod is not detecting" ), ; + override fun toString() : String { + return configLine + } + fun getPair(): List> { return try { displayPair.get() From e8f2ead49de1097adac2bac00268f07945ca6780 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Wed, 6 Dec 2023 21:31:42 +0100 Subject: [PATCH 191/225] cleanup --- .../misc/customscoreboard/CustomScoreboard.kt | 3 ++- .../customscoreboard/CustomScoreboardUtils.kt | 4 ++-- .../misc/customscoreboard/Elements.kt | 19 +++++++++++-------- .../customscoreboard/InformationGetter.kt | 14 ++++++++------ 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 2bf7c158a89f..45ad3716719b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -57,7 +57,8 @@ class CustomScoreboard { private fun createLines() = buildList> { val lineMap = HashMap>>() for (element in Elements.entries) { - lineMap[element.ordinal] = if (element.isVisible()) element.getPair() else listOf("" to AlignmentEnum.LEFT) + lineMap[element.ordinal] = + if (element.isVisible()) element.getPair() else listOf("" to AlignmentEnum.LEFT) } return formatLines(lineMap) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt index 3bd420ef4575..fd696cd66868 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt @@ -6,7 +6,7 @@ import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay import net.minecraft.client.Minecraft object CustomScoreboardUtils { - fun translateMayorNameToColor(input: String): String { + fun mayorNameToColorCode(input: String): String { return when (input) { // Normal Mayors "Aatrox" -> "§3$input" @@ -33,7 +33,7 @@ object CustomScoreboardUtils { return matchResult?.groupValues?.lastOrNull() } - fun getProfileTypeAsSymbol(): String { + fun getProfileTypeSymbol(): String { return when { HypixelData.ironman -> "§7♲ " // Ironman HypixelData.stranded -> "§a☀ " // Stranded diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index fd51b5961095..598adc48547f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -38,7 +38,7 @@ val extraObjectiveLines = listOf("§7(§e", "§f Mages", "§f Barbarians") enum class Elements( private val displayPair: Supplier>>, private val showWhen: () -> Boolean, - private val configLine : String + private val configLine: String ) { TITLE( { @@ -60,7 +60,7 @@ enum class Elements( ), PROFILE( { - listOf(CustomScoreboardUtils.getProfileTypeAsSymbol() + HypixelData.profileName.firstLetterUppercase() to AlignmentEnum.LEFT) + listOf(CustomScoreboardUtils.getProfileTypeSymbol() + HypixelData.profileName.firstLetterUppercase() to AlignmentEnum.LEFT) }, { true @@ -178,7 +178,8 @@ enum class Elements( ), VISITING( { - listOf((ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith(" §a✌ §")} ?: "") to AlignmentEnum.LEFT) + listOf((ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith(" §a✌ §") } + ?: "") to AlignmentEnum.LEFT) }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith(" §a✌ §") } @@ -200,7 +201,8 @@ enum class Elements( { val symbols = listOf("☔", "§e☀", "§b☽") if (ScoreboardData.sidebarLinesFormatted.any { line -> symbols.any { line.contains(it) } }) { - listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } }.trim() to AlignmentEnum.LEFT) + listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } } + .trim() to AlignmentEnum.LEFT) } else { listOf( "§7" + SkyBlockTime.now() @@ -258,7 +260,8 @@ enum class Elements( if (extraObjectiveLines.any { ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2)?.contains(it) == true }) { - objective += ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2).toString().replace(")", "§7)") + objective += ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2).toString() + .replace(")", "§7)") } objective.map { it to AlignmentEnum.LEFT } @@ -323,7 +326,7 @@ enum class Elements( MAYOR( { listOf( - (MayorElection.currentCandidate?.name?.let { CustomScoreboardUtils.translateMayorNameToColor(it) } + (MayorElection.currentCandidate?.name?.let { CustomScoreboardUtils.mayorNameToColorCode(it) } ?: "") to AlignmentEnum.LEFT ) + (if (config.showMayorPerks) { MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" to AlignmentEnum.LEFT } ?: emptyList() @@ -398,14 +401,14 @@ enum class Elements( ), ; - override fun toString() : String { + override fun toString(): String { return configLine } fun getPair(): List> { return try { displayPair.get() - } catch (e: NoSuchElementException){ + } catch (e: NoSuchElementException) { listOf("" to AlignmentEnum.LEFT) } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 01ddb211a1fb..4ab5f747344a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -40,10 +40,10 @@ class InformationGetter { } } - if (sidebarLines.none { it.startsWith(("Heat: "))}){ + if (sidebarLines.none { it.startsWith(("Heat: ")) }) { heat = "§c♨ 0" } - if (sidebarLines.none { it.startsWith(("Bits: §b"))}){ + if (sidebarLines.none { it.startsWith(("Bits: §b")) }) { bits = "0" } @@ -61,7 +61,7 @@ class InformationGetter { "Summer", "Autumn", "Winter", - lobbyCode ?: "", + lobbyCode, "§ewww.hyp", "§ealpha.hyp", "§cServer closing: ", @@ -111,7 +111,7 @@ class InformationGetter { "Remaining: §a", "Your Tasty Mithr", "§3§lSolo", - "§fRift Dimension", + "§fRift Dimension", "§d᠅ §fGemstone§f: §d", "§2᠅ §fMithril§f: §2", "Revenant Horror", @@ -130,9 +130,11 @@ class InformationGetter { // remove objectives extraLines = extraLines.filter { sidebarLines.nextAfter("§fObjective") != it } - val objectiveLines = ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Objective") } ?: "Objective" + val objectiveLines = + ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Objective") } ?: "Objective" extraLines = extraLines.filter { sidebarLines.nextAfter(objectiveLines) != it } - extraLines = extraLines.filter { sidebarLines.nextAfter(objectiveLines, 2) != it && !extraObjectiveLines.contains(it)} + extraLines = + extraLines.filter { sidebarLines.nextAfter(objectiveLines, 2) != it && !extraObjectiveLines.contains(it) } // remove wind compass extraLines = extraLines.filter { sidebarLines.nextAfter("§9Wind Compass") != it } From 35ae08a46fe351bba3b1b24adf2230c0a160176d Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 7 Dec 2023 07:33:41 +0100 Subject: [PATCH 192/225] Todo for later --- .../skyhanni/features/misc/customscoreboard/Elements.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt index 598adc48547f..a47f1a1c9b0c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt @@ -35,6 +35,8 @@ var extraLines = listOf() val extraObjectiveLines = listOf("§7(§e", "§f Mages", "§f Barbarians") +// elements -> scoreboardElements + enum class Elements( private val displayPair: Supplier>>, private val showWhen: () -> Boolean, From 15deb0847e49a43bcbc1c5586302ac1055a51152 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 7 Dec 2023 14:55:44 +0100 Subject: [PATCH 193/225] New Elements name --- .../features/gui/customscoreboard/CustomScoreboardConfig.java | 4 ++-- .../features/misc/customscoreboard/CustomScoreboard.kt | 2 +- .../customscoreboard/{Elements.kt => ScoreboardElements.kt} | 4 +--- 3 files changed, 4 insertions(+), 6 deletions(-) rename src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/{Elements.kt => ScoreboardElements.kt} (99%) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index 53e5306d4ed5..bab7676ad729 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -2,7 +2,7 @@ import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.config.core.config.Position; -import at.hannibal2.skyhanni.features.misc.customscoreboard.Elements; +import at.hannibal2.skyhanni.features.misc.customscoreboard.ScoreboardElements; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.Accordion; import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; @@ -29,7 +29,7 @@ public class CustomScoreboardConfig { desc = "Drag text to change the appearance of the advanced scoreboard." // supporting both custom & advanced search ) @ConfigEditorDraggableList() - public List scoreboardEntries = new ArrayList<>(Arrays.asList(Elements.values())); + public List scoreboardEntries = new ArrayList<>(Arrays.asList(ScoreboardElements.values())); @Expose @ConfigOption(name = "Display Options", desc = "") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 45ad3716719b..14b78a5b68db 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -56,7 +56,7 @@ class CustomScoreboard { private fun createLines() = buildList> { val lineMap = HashMap>>() - for (element in Elements.entries) { + for (element in ScoreboardElements.entries) { lineMap[element.ordinal] = if (element.isVisible()) element.getPair() else listOf("" to AlignmentEnum.LEFT) } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt similarity index 99% rename from src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt rename to src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index a47f1a1c9b0c..6080117a3126 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Elements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -35,9 +35,7 @@ var extraLines = listOf() val extraObjectiveLines = listOf("§7(§e", "§f Mages", "§f Barbarians") -// elements -> scoreboardElements - -enum class Elements( +enum class ScoreboardElements( private val displayPair: Supplier>>, private val showWhen: () -> Boolean, private val configLine: String From 1c2fe9e708a738c4891a7852ed8c4d15f7264d4b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 7 Dec 2023 15:24:55 +0100 Subject: [PATCH 194/225] Added chat warning when unknown line --- .../customscoreboard/CustomScoreboardConfig.java | 6 ++++++ .../misc/customscoreboard/CustomScoreboardUtils.kt | 2 ++ .../misc/customscoreboard/InformationGetter.kt | 3 ++- .../misc/customscoreboard/ScoreboardElements.kt | 13 ++++++++++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index bab7676ad729..ed6bc257e207 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -57,6 +57,12 @@ public class CustomScoreboardConfig { @FeatureToggle public boolean showMayorPerks = true; + @Expose + @ConfigOption(name = "Unknown Lines warning", desc = "Gives a chat warning when unknown lines are found in the scoreboard.") + @ConfigEditorBoolean + @FeatureToggle + public boolean unknownLinesWarning = true; + @Expose public Position position = new Position(10, 80, false, true); } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt index fd696cd66868..23cf9e257a00 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt @@ -50,4 +50,6 @@ object CustomScoreboardUtils { if (tabList.footer_skyhanni == null) return "" return tabList.footer_skyhanni.formattedText } + + class UndetectedScoreboardLines(message: String) : Exception(message) } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 4ab5f747344a..14e24efb9437 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -120,7 +120,8 @@ class InformationGetter { "Voidgloom Seraph", "Inferno Demo", "Combat XP", - "Flight Duration:" + "Flight Duration:", + "§a✌ §" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index 6080117a3126..a0a519df73b3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -14,6 +14,7 @@ import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.RenderUtils.AlignmentEnum import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.TimeUtils.formatted +import at.hannibal2.skyhanni.test.command.ErrorManager import io.github.moulberry.notenoughupdates.util.SkyBlockTime import java.util.function.Supplier @@ -34,6 +35,7 @@ var gemstonePowder = "0" var extraLines = listOf() val extraObjectiveLines = listOf("§7(§e", "§f Mages", "§f Barbarians") +var amountOfExtraLines = 0 enum class ScoreboardElements( private val displayPair: Supplier>>, @@ -392,7 +394,16 @@ enum class ScoreboardElements( ), EXTRA( { - listOf("§cUndetected Lines (pls report):" to AlignmentEnum.CENTER) + extraLines.map { it to AlignmentEnum.LEFT } + if (amountOfExtraLines != extraLines.size && config.unknownLinesWarning) { + ErrorManager.logErrorWithData( + CustomScoreboardUtils.UndetectedScoreboardLines("CustomScoreboard detected unknown lines"), + "CustomScoreboard detected unknown lines", + "extraLines" to extraLines + ) + amountOfExtraLines = extraLines.size + } + + listOf("§cUndetected Lines:" to AlignmentEnum.LEFT) + extraLines.map { it to AlignmentEnum.LEFT } }, { extraLines.isNotEmpty() From 597e9b1c9491acb993c5299d3dc1af5e08ad37ab Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 7 Dec 2023 15:26:17 +0100 Subject: [PATCH 195/225] Finally added thunder --- .../features/misc/customscoreboard/InformationGetter.kt | 1 + .../features/misc/customscoreboard/ScoreboardElements.kt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 14e24efb9437..0edea73d48e7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -102,6 +102,7 @@ class InformationGetter { "§e☀", "§b☽", "☔", + "⚡", "Ⓑ", "§a☀", "§7♲", diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index a0a519df73b3..1d0180623fa8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -201,7 +201,7 @@ enum class ScoreboardElements( ), TIME( { - val symbols = listOf("☔", "§e☀", "§b☽") + val symbols = listOf("☔", "⚡", "§e☀", "§b☽") if (ScoreboardData.sidebarLinesFormatted.any { line -> symbols.any { line.contains(it) } }) { listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } } .trim() to AlignmentEnum.LEFT) From f3283a7992c329fedfffd7f3cbbd5b22882ad8a9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 7 Dec 2023 15:35:08 +0100 Subject: [PATCH 196/225] Added faq for custom background --- DISCORD_FAQ.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/DISCORD_FAQ.md b/DISCORD_FAQ.md index 997389a48824..14bcb1e125bc 100644 --- a/DISCORD_FAQ.md +++ b/DISCORD_FAQ.md @@ -29,5 +29,11 @@ _Frequently Asked Questions_ > 2. Delete ".minecraft\config\skyhanni\jacob_contests.json". > 3. Open minecraft. +> **9: How do I add a custom background for the Scoreboard?** +> 1. Obtain a background image and name it "scoreboard.png". +> 2. Put the image into a texturepack, with the path ".minecraft\resourcepacks\\assets\skyhanni\scoreboard.png". +> 3. Enable the texturepack in minecraft, then reload your game. +> 4. Do `/sh scoreboard background`, and toggle the Enable button. + *This FAQ was last updated on december 05th, 2023. If you believe there's something that should be added to this list, please tell us, so we can add it.* From 720be46c8b8ebd9386492976d062c276a0f4c6e3 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 7 Dec 2023 16:42:44 +0100 Subject: [PATCH 197/225] New loc for faq --- DISCORD_FAQ.md | 6 ------ .../features/gui/customscoreboard/BackgroundConfig.java | 9 +++++++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/DISCORD_FAQ.md b/DISCORD_FAQ.md index 14bcb1e125bc..997389a48824 100644 --- a/DISCORD_FAQ.md +++ b/DISCORD_FAQ.md @@ -29,11 +29,5 @@ _Frequently Asked Questions_ > 2. Delete ".minecraft\config\skyhanni\jacob_contests.json". > 3. Open minecraft. -> **9: How do I add a custom background for the Scoreboard?** -> 1. Obtain a background image and name it "scoreboard.png". -> 2. Put the image into a texturepack, with the path ".minecraft\resourcepacks\\assets\skyhanni\scoreboard.png". -> 3. Enable the texturepack in minecraft, then reload your game. -> 4. Do `/sh scoreboard background`, and toggle the Enable button. - *This FAQ was last updated on december 05th, 2023. If you believe there's something that should be added to this list, please tell us, so we can add it.* diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java index 5d95f8828a27..827f1a548dca 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/BackgroundConfig.java @@ -4,6 +4,7 @@ import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; import io.github.moulberry.moulconfig.annotations.ConfigEditorColour; +import io.github.moulberry.moulconfig.annotations.ConfigEditorInfoText; import io.github.moulberry.moulconfig.annotations.ConfigOption; public class BackgroundConfig { @@ -32,4 +33,12 @@ public class BackgroundConfig { @ConfigEditorBoolean @FeatureToggle public boolean useCustomBackgroundImage = false; + + @Expose + @ConfigOption( + name = "Custom Background", + desc = "Add an image named \"scoreboard.png\" to your texture pack at \"\\assets\\skyhanni\\scoreboard.png.\" Activate the texture pack in Minecraft, then reload the game." + ) + @ConfigEditorInfoText + public String useless; } From eb6a16c7ace15d841ed00e21a0e7d55678733d49 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Thu, 7 Dec 2023 18:33:59 +0100 Subject: [PATCH 198/225] Options to show all active events --- .../features/gui/customscoreboard/DisplayConfig.java | 6 ++++++ .../skyhanni/features/misc/customscoreboard/Events.kt | 9 ++++++--- .../features/misc/customscoreboard/ScoreboardElements.kt | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java index 0d6dc888d412..8db941f21f2d 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/DisplayConfig.java @@ -27,6 +27,12 @@ public class DisplayConfig { @FeatureToggle public boolean alignRight = false; + @Expose + @ConfigOption(name = "Show all active events", desc = "Show all active events in the scoreboard instead of one.") + @ConfigEditorBoolean + @FeatureToggle + public boolean showAllActiveEvents = false; + @Expose @ConfigOption(name = "Align to the center vertically", desc = "Align the scoreboard to the center of the screen vertically.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 62f459cfca7b..ebf8025e9280 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -347,7 +347,7 @@ enum class Events(private val displayLine: Supplier>, private val s } }, { - true + false } ); @@ -356,8 +356,11 @@ enum class Events(private val displayLine: Supplier>, private val s } companion object { - fun getFirstEvent(): Events { - return entries.first { it.showWhen() } + fun getEvent(): List { + if (config.displayConfig.showAllActiveEvents) { + return entries.filter { it.showWhen() } + } + return listOf(entries.firstOrNull { it.showWhen() } ?: NONE) } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index 1d0180623fa8..751c612f7762 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -318,7 +318,7 @@ enum class ScoreboardElements( ), EVENTS( { - Events.getFirstEvent().getLines().map { it to AlignmentEnum.LEFT } + Events.getEvent().flatMap { it.getLines().map { i -> i to AlignmentEnum.LEFT } } }, { true From a0d302c6519da7e6b48357f16821e19131d4031f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 14:30:21 +0100 Subject: [PATCH 199/225] Curious how that happened --- .../misc/customscoreboard/ScoreboardElements.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index 751c612f7762..a760a2cb9fd2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -285,12 +285,12 @@ enum class ScoreboardElements( }, { listOf( - at.hannibal2.skyhanni.data.IslandType.HUB, - at.hannibal2.skyhanni.data.IslandType.SPIDER_DEN, - at.hannibal2.skyhanni.data.IslandType.THE_PARK, - at.hannibal2.skyhanni.data.IslandType.THE_END, - at.hannibal2.skyhanni.data.IslandType.CRIMSON_ISLE, - at.hannibal2.skyhanni.data.IslandType.THE_RIFT + IslandType.HUB, + IslandType.SPIDER_DEN, + IslandType.THE_PARK, + IslandType.THE_END, + IslandType.CRIMSON_ISLE, + IslandType.THE_RIFT ).contains(HypixelData.skyBlockIsland) }, "§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills" From 3f2a734a57a1b12ab90ecc768cb9ee29c7277d9b Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 16:09:54 +0100 Subject: [PATCH 200/225] Added dojo --- .../features/misc/customscoreboard/Events.kt | 21 +++++++++++++++++++ .../customscoreboard/InformationGetter.kt | 4 +++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index ebf8025e9280..5d80766c0bb6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -125,6 +125,27 @@ enum class Events(private val displayLine: Supplier>, private val s IslandType.KUUDRA_ARENA.isInIsland() } ), + DOJO( + { + val list = mutableListOf() + + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Challenge: ") }) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Challenge: ") } + } + + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Points: ")}) { + list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Points: ") } + } + + if (list.size == 0) when (config.informationFilteringConfig.hideEmptyLines) { + true -> listOf("") + false -> listOf("§cNo Dojo Data") + } else list + }, + { + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Challenge: ")} + } + ), JACOB_CONTEST( { val list = mutableListOf() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 0edea73d48e7..8c06c6ee4a9d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -122,7 +122,9 @@ class InformationGetter { "Inferno Demo", "Combat XP", "Flight Duration:", - "§a✌ §" + "§a✌ §", + "Points: ", + "Challenge:" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } From 912b9ce74bf4c44804080d940493852c62dc5e06 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 16:56:10 +0100 Subject: [PATCH 201/225] Added current island --- .../features/misc/customscoreboard/ScoreboardElements.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index a760a2cb9fd2..fcc8d44b4dda 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -169,6 +169,15 @@ enum class ScoreboardElements( }, "" ), + ISLAND( + { + listOf(HypixelData.skyBlockIsland.toString().split("_").joinToString(" ") { it.firstLetterUppercase() } to AlignmentEnum.LEFT) + }, + { + true + }, + "Hub" + ), LOCATION( { listOf((replaceString(location) ?: "") to AlignmentEnum.LEFT) From 36b2d7baa9adb9773f003f17f2b75a788bb61e22 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 16:56:58 +0100 Subject: [PATCH 202/225] Small note --- .../features/misc/customscoreboard/ScoreboardElements.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index fcc8d44b4dda..f7707d0ac68c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -180,6 +180,7 @@ enum class ScoreboardElements( ), LOCATION( { + // replaceString() adds back the garden plots listOf((replaceString(location) ?: "") to AlignmentEnum.LEFT) }, { From 09dbddc0b5dbaeea69084a495063ba2d48fa7fb1 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 17:51:36 +0100 Subject: [PATCH 203/225] Fixed dungeon teammates --- .../features/misc/customscoreboard/Events.kt | 45 +++++++++---------- .../customscoreboard/InformationGetter.kt | 38 +++++++++------- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 5d80766c0bb6..8d53e50960e2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -45,27 +45,17 @@ enum class Events(private val displayLine: Supplier>, private val s it.startsWith("§rCleared: ") || it.startsWith( "Cleared:" ) - }.toString() + }.toString().replace("§r", "") } - val dungeonPlayers = TabListData.getTabList().firstOrNull { it.trim().startsWith("§r§b§lParty §r§f(") } - ?.trim()?.removePrefix("§r§b§lParty §r§f(")?.removeSuffix(")")?.toInt() ?: 1 - - if (dungeonPlayers != 0 && list.any { it.startsWith("Cleared: ") }) { - if (dungeonPlayers == 1) { - list += "§3§lSolo" - } else { - for (i in 1..dungeonPlayers) { - list += ScoreboardData.sidebarLinesFormatted.nextAfter( // Bettermap Style - "§r" + (list.firstOrNull { it.startsWith("Cleared: ") }?.replace("%§", "%") - ?: "§cNo Dungeon Data"), - i - ) - ?: ScoreboardData.sidebarLinesFormatted.nextAfter( // Hypixel Style - list.firstOrNull { it.startsWith("Cleared: ") }?.replace("%§", "%") - ?: "§cNo Dungeon Data", - i - ) ?: "§cTeammate not found" + if (ScoreboardData.sidebarLinesFormatted.any { lines -> + InformationGetter.dungeonClassList.any { + lines.startsWith(it) + } + }) { + list += ScoreboardData.sidebarLinesFormatted.filter { + InformationGetter.dungeonClassList.any { lines -> + it.startsWith(lines) } } } @@ -133,7 +123,7 @@ enum class Events(private val displayLine: Supplier>, private val s list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Challenge: ") } } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Points: ")}) { + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Points: ") }) { list += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Points: ") } } @@ -143,7 +133,7 @@ enum class Events(private val displayLine: Supplier>, private val s } else list }, { - ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Challenge: ")} + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Challenge: ") } } ), JACOB_CONTEST( @@ -189,8 +179,11 @@ enum class Events(private val displayLine: Supplier>, private val s ), FLIGHT_DURATION( { - listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Flight Duration:") }?.replace(":a", ":§a") - ?: "") + listOf( + ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Flight Duration:") } + ?.replace(":a", ":§a") + ?: "" + ) }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Flight Duration:") } @@ -325,8 +318,10 @@ enum class Events(private val displayLine: Supplier>, private val s ?.removePrefix("Zone: ") ?: "") } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Remaining: §a") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Remaining: §a") } ?: "" - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Tasty Mithr: §c") } ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Remaining: §a") } + ?: "" + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Tasty Mithr: §c") } + ?: "" } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 8c06c6ee4a9d..34e92f94df8d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -7,6 +7,25 @@ import at.hannibal2.skyhanni.utils.TabListData import at.hannibal2.skyhanni.features.misc.customscoreboard.CustomScoreboardUtils.extractLobbyCode class InformationGetter { + companion object { + val dungeonClassList = listOf( + "§e[M] ", + "§a[M] ", + "§c[M] ", + "§e[A] ", + "§a[A] ", + "§c[A] ", + "§e[B] ", + "§a[B] ", + "§c[B] ", + "§e[H] ", + "§a[H] ", + "§c[H] ", + "§e[T] ", + "§a[T] ", + "§c[T] ", + ) + } fun getInformation() { val sidebarLines = ScoreboardData.sidebarLinesFormatted @@ -47,7 +66,7 @@ class InformationGetter { bits = "0" } - val knownLines = listOf( + val knownLines = listOf( "§7⏣ ", "§5ф ", "Purse: §6", @@ -70,6 +89,7 @@ class InformationGetter { "Keys: ", "Time Elapsed:", "§rCleared: ", + "Cleared: ", "Instance Shutdow", "Time Elapsed: ", "§f§lWave: §c§l", @@ -124,7 +144,8 @@ class InformationGetter { "Flight Duration:", "§a✌ §", "Points: ", - "Challenge:" + "Challenge:", + *dungeonClassList.toTypedArray() ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } @@ -143,19 +164,6 @@ class InformationGetter { // remove wind compass extraLines = extraLines.filter { sidebarLines.nextAfter("§9Wind Compass") != it } - // Remove dungeon teammates - val dungeonPlayers = TabListData.getTabList().firstOrNull { it.trim().startsWith("§r§b§lParty §r§f(") } - ?.trim()?.removePrefix("§r§b§lParty §r§f(")?.removeSuffix(")")?.toInt() ?: 1 - val clearedLine = sidebarLines.firstOrNull { it.startsWith("§rCleared: ") }.toString() - - if (dungeonPlayers != 0) { - if (dungeonPlayers > 1) { - for (i in 1..dungeonPlayers) { - extraLines = extraLines.filter { sidebarLines.nextAfter(clearedLine, i) != it } - } - } - } - // Remove jacobs contest for (i in 1..3) extraLines = extraLines.filter { sidebarLines.nextAfter("§eJacob's Contest", i) != it } From 27f7c3a2fa34cca9011f2644645aaf214f9aa4dd Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 19:12:23 +0100 Subject: [PATCH 204/225] Show vanilla sb when custom is disabled --- .../skyhanni/features/misc/customscoreboard/CustomScoreboard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt index 14b78a5b68db..0592247aafa5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboard.kt @@ -109,5 +109,5 @@ class CustomScoreboard { } private fun isCustomScoreboardEnabled() = config.enabled && LorenzUtils.inSkyBlock - private fun isHideVanillaScoreboardEnabled() = config.displayConfig.hideVanillaScoreboard && LorenzUtils.inSkyBlock + private fun isHideVanillaScoreboardEnabled() = config.displayConfig.hideVanillaScoreboard && LorenzUtils.inSkyBlock && config.enabled } From 83e1424f5f4e2f42b472b96e77681583119abcbf Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 19:17:37 +0100 Subject: [PATCH 205/225] Added globe symbol infront of island --- .../features/misc/customscoreboard/ScoreboardElements.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index f7707d0ac68c..9d6160a200e5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -171,7 +171,7 @@ enum class ScoreboardElements( ), ISLAND( { - listOf(HypixelData.skyBlockIsland.toString().split("_").joinToString(" ") { it.firstLetterUppercase() } to AlignmentEnum.LEFT) + listOf("§7㋖ §a" + HypixelData.skyBlockIsland.toString().split("_").joinToString(" ") { it.firstLetterUppercase() } to AlignmentEnum.LEFT) }, { true From 5283fea63892c8ec1be8a875d445e85664e6719f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 19:17:54 +0100 Subject: [PATCH 206/225] Also to the config --- .../features/misc/customscoreboard/ScoreboardElements.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index 9d6160a200e5..7ba878b4a696 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -176,7 +176,7 @@ enum class ScoreboardElements( { true }, - "Hub" + "§7㋖ §aHub" ), LOCATION( { From 93986dbfa55731cc371e50c6de3c1edb89cccacd Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 21:26:42 +0100 Subject: [PATCH 207/225] Hide "Locked" from locked garden plots --- .../features/misc/customscoreboard/InformationGetter.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 34e92f94df8d..2948374174ae 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -145,7 +145,8 @@ class InformationGetter { "§a✌ §", "Points: ", "Challenge:", - *dungeonClassList.toTypedArray() + *dungeonClassList.toTypedArray(), + "§cLocked" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } From bfcf6ed4108490f956576eb61f8099b6c142c5b2 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 22:05:02 +0100 Subject: [PATCH 208/225] Added voting lines --- .../features/misc/customscoreboard/Events.kt | 22 ++++++++++++++++++- .../customscoreboard/InformationGetter.kt | 12 +++++++++- .../customscoreboard/ScoreboardElements.kt | 9 ++++++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 8d53e50960e2..6ba8888837a4 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -12,6 +12,26 @@ import java.util.function.Supplier private val config get() = SkyHanniMod.feature.gui.customScoreboard enum class Events(private val displayLine: Supplier>, private val showWhen: () -> Boolean) { + VOTING( + { + val list = mutableListOf() + + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§6Year ") && it.endsWith(" Votes") } ?: "" + if (ScoreboardData.sidebarLinesFormatted.nextAfter(list[0]) == "§7Waiting for") { + list += "§7Waiting for" + list += "§7your vote..." + } else { + for (i in 1 until 6) { + list += ScoreboardData.sidebarLinesFormatted.nextAfter(list[0], i) ?: "" + } + } + + list + }, + { + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6Year ") && it.endsWith(" Votes") } + } + ), SERVER_CLOSE( { listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§cServer closing: ") } @@ -189,7 +209,7 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Flight Duration:") } } ), - WINTER( // not tested + WINTER( { val list = mutableListOf() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 2948374174ae..ae986df4ce7e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -146,7 +146,11 @@ class InformationGetter { "Points: ", "Challenge:", *dungeonClassList.toTypedArray(), - "§cLocked" + "§cLocked", + "§fCleanup§7:", + "§6Year ", + "§7Waiting for", + "§7your vote..." ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } @@ -172,5 +176,11 @@ class InformationGetter { // Remove slayer extraLines = extraLines.filter { sidebarLines.nextAfter("Slayer Quest", 1) != it } extraLines = extraLines.filter { sidebarLines.nextAfter("Slayer Quest", 2) != it } + + // remove voting lines + val votedLine = sidebarLines.firstOrNull { it.startsWith("§6Year ") } ?: "§6Year " + for (i in 1 until 6) { + extraLines = extraLines.filter { sidebarLines.nextAfter(votedLine, i) != it } + } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index 7ba878b4a696..b7588a84df24 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -171,7 +171,9 @@ enum class ScoreboardElements( ), ISLAND( { - listOf("§7㋖ §a" + HypixelData.skyBlockIsland.toString().split("_").joinToString(" ") { it.firstLetterUppercase() } to AlignmentEnum.LEFT) + listOf( + "§7㋖ §a" + HypixelData.skyBlockIsland.toString().split("_") + .joinToString(" ") { it.firstLetterUppercase() } to AlignmentEnum.LEFT) }, { true @@ -416,7 +418,10 @@ enum class ScoreboardElements( listOf("§cUndetected Lines:" to AlignmentEnum.LEFT) + extraLines.map { it to AlignmentEnum.LEFT } }, { - extraLines.isNotEmpty() + if (extraLines.isNotEmpty()) { + amountOfExtraLines = 0 + } + false }, "§7Extra lines the mod is not detecting" ), From 954cb83cf7245fb740c21a0340308894dd9cfba2 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 22:42:56 +0100 Subject: [PATCH 209/225] Added cookie buff --- .../customscoreboard/CustomScoreboardUtils.kt | 2 +- .../features/misc/customscoreboard/Events.kt | 6 ++--- .../customscoreboard/ScoreboardElements.kt | 24 +++++++++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt index 23cf9e257a00..e97502150ac3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt @@ -48,7 +48,7 @@ object CustomScoreboardUtils { fun getTablistFooter(): String { val tabList = Minecraft.getMinecraft().ingameGUI.tabList as AccessorGuiPlayerTabOverlay if (tabList.footer_skyhanni == null) return "" - return tabList.footer_skyhanni.formattedText + return tabList.footer_skyhanni.formattedText.replace("§r", "") } class UndetectedScoreboardLines(message: String) : Exception(message) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 6ba8888837a4..2b14e8a2db17 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -252,9 +252,9 @@ enum class Events(private val displayLine: Supplier>, private val s { listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§6Spooky Festival§f") } ?: "") + // Time - ("§r§r§7Your Candy: ") + - (CustomScoreboardUtils.getTablistFooter().split("\n").firstOrNull { it.startsWith("§r§r§7Your Candy:") } - ?.removePrefix("§r§r§7Your Candy:") ?: "§cCandy not found") // Candy + ("§7Your Candy: ") + + (CustomScoreboardUtils.getTablistFooter().split("\n").firstOrNull { it.startsWith("§7Your Candy:") } + ?.removePrefix("§7Your Candy:") ?: "§cCandy not found") // Candy }, { ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6Spooky Festival§f") } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index b7588a84df24..fd2d68f19a04 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -254,6 +254,30 @@ enum class ScoreboardElements( }, "Power: Sighted" ), + COOKIE( + { + val timeLine = CustomScoreboardUtils.getTablistFooter().split("\n") + .nextAfter("§d§lCookie Buff") ?: "" + + listOf( + "§d§lCookie Buff" to AlignmentEnum.LEFT + ) + when (timeLine.contains("Not active")){ + true -> listOf(" §7- §cNot active" to AlignmentEnum.LEFT) + false -> listOf(" §7- §e${timeLine.substringAfter("§d§lCookie Buff").trim()}" to AlignmentEnum.LEFT) + } + }, + { + if (config.informationFilteringConfig.hideEmptyLines){ + CustomScoreboardUtils.getTablistFooter().split("\n").any { + CustomScoreboardUtils.getTablistFooter().split("\n").nextAfter("§d§lCookie Buff")?.contains(it) + ?: false + } + } else { + true + } + }, + "§d§lCookie Buff\n §f3days, 17hours" + ), EMPTY_LINE2( { listOf("" to AlignmentEnum.LEFT) From cb527170ce1b3a0bdc990f2ba525cc2eeb9ed759 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 22:43:20 +0100 Subject: [PATCH 210/225] Fixed that weird redstone line --- .../features/misc/customscoreboard/InformationGetter.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index ae986df4ce7e..f5071e503b78 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -150,7 +150,8 @@ class InformationGetter { "§fCleanup§7:", "§6Year ", "§7Waiting for", - "§7your vote..." + "§7your vote...", + "e: §e§b0%" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } From 5934f67da3c96206196f4cfcfb2ef0519c071292 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Fri, 8 Dec 2023 22:48:24 +0100 Subject: [PATCH 211/225] Fixed that weird redstone line, but regex --- .../features/misc/customscoreboard/InformationGetter.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index f5071e503b78..c667a475f72c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -1,7 +1,6 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.data.ScoreboardData -import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData import at.hannibal2.skyhanni.features.misc.customscoreboard.CustomScoreboardUtils.extractLobbyCode @@ -150,8 +149,7 @@ class InformationGetter { "§fCleanup§7:", "§6Year ", "§7Waiting for", - "§7your vote...", - "e: §e§b0%" + "§7your vote..." ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } @@ -183,5 +181,8 @@ class InformationGetter { for (i in 1 until 6) { extraLines = extraLines.filter { sidebarLines.nextAfter(votedLine, i) != it } } + + // remove that buggy redstone line wth hypixel + extraLines = extraLines.filter { "^\\s*e: §e§b(\\d{1,2}|100)%\$".toPattern().matcher(it).matches() } } } From 18ee82c0070164730fc603779bf0841290f1aee0 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 9 Dec 2023 14:00:39 +0100 Subject: [PATCH 212/225] fixed IndexOutOfBoundsException when empty event list --- .../features/misc/customscoreboard/ScoreboardElements.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index fd2d68f19a04..c0456dd2d3b6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -357,7 +357,7 @@ enum class ScoreboardElements( Events.getEvent().flatMap { it.getLines().map { i -> i to AlignmentEnum.LEFT } } }, { - true + Events.getEvent().isNotEmpty() }, "§7Wide Range of Events\n§7(too much for this here)" ), From 4006781c9a0c8405cfed0a786c948a87fd7cbe54 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 9 Dec 2023 15:51:07 +0100 Subject: [PATCH 213/225] fixed wrong color in dungeon teammate --- .../hannibal2/skyhanni/features/misc/customscoreboard/Events.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 2b14e8a2db17..66ea720cae2e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -77,7 +77,7 @@ enum class Events(private val displayLine: Supplier>, private val s InformationGetter.dungeonClassList.any { lines -> it.startsWith(lines) } - } + }.map { it.replace("[Lv", "§7[Lv") } } if (list.size == 0) when (config.informationFilteringConfig.hideEmptyLines) { From 8767d967260c2a2a309fd9b810bb50ecf87eeca9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 9 Dec 2023 16:04:43 +0100 Subject: [PATCH 214/225] maybe fixed all future color code problems in scoreboard lines --- .../java/at/hannibal2/skyhanni/data/ScoreboardData.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt b/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt index bdde046eb2ee..f7615b693428 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt @@ -38,7 +38,15 @@ class ScoreboardData { val split = line.split(separator) val start = split[0] var end = split[1] - if (end.length >= 2 && end[0] == '§' && (end[1] in '0'..'9' || end[1] in 'a'..'f')) { + // get last color code in start + val lastColorIndex = start.lastIndexOf('§') + val lastColor = when (lastColorIndex != -1 && lastColorIndex + 1 < start.length) { + true -> start[lastColorIndex] + "" + start[lastColorIndex + 1] + false -> "" + } + + // remove first color code from end, when it is the same as the last color code in start + if (end.length >= 2 && end[0] == '§' && (end[1] in '0'..'9' || end[1] in 'a'..'f') && end[1] == lastColor[1]) { end = end.substring(2) } list.add(start + end) From 55007619d29607a4d9f30cd4dbb10441edf6f5f2 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 9 Dec 2023 18:12:23 +0100 Subject: [PATCH 215/225] fixed extra lines not working --- .../misc/customscoreboard/InformationGetter.kt | 12 +++++------- .../misc/customscoreboard/ScoreboardElements.kt | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index c667a475f72c..d2af94866c72 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -149,7 +149,8 @@ class InformationGetter { "§fCleanup§7:", "§6Year ", "§7Waiting for", - "§7your vote..." + "§7your vote...", + "e: §e§b0%" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } @@ -159,11 +160,11 @@ class InformationGetter { // remove objectives extraLines = extraLines.filter { sidebarLines.nextAfter("§fObjective") != it } - val objectiveLines = + val objectiveLine = ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Objective") } ?: "Objective" - extraLines = extraLines.filter { sidebarLines.nextAfter(objectiveLines) != it } + extraLines = extraLines.filter { sidebarLines.nextAfter(objectiveLine) != it } extraLines = - extraLines.filter { sidebarLines.nextAfter(objectiveLines, 2) != it && !extraObjectiveLines.contains(it) } + extraLines.filter { sidebarLines.nextAfter(objectiveLine, 2) != it && !extraObjectiveLines.contains(it) } // remove wind compass extraLines = extraLines.filter { sidebarLines.nextAfter("§9Wind Compass") != it } @@ -181,8 +182,5 @@ class InformationGetter { for (i in 1 until 6) { extraLines = extraLines.filter { sidebarLines.nextAfter(votedLine, i) != it } } - - // remove that buggy redstone line wth hypixel - extraLines = extraLines.filter { "^\\s*e: §e§b(\\d{1,2}|100)%\$".toPattern().matcher(it).matches() } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index c0456dd2d3b6..45ae2ce739f0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -445,7 +445,7 @@ enum class ScoreboardElements( if (extraLines.isNotEmpty()) { amountOfExtraLines = 0 } - false + extraLines.isNotEmpty() }, "§7Extra lines the mod is not detecting" ), From d296c98e3372003f9e413ceb55ace79c42b3f20f Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 9 Dec 2023 18:19:38 +0100 Subject: [PATCH 216/225] fixed StringIndexOutOfBoundsException in new scoreboard color code remove thing --- .../java/at/hannibal2/skyhanni/data/ScoreboardData.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt b/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt index f7615b693428..963979d1b553 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt @@ -40,13 +40,13 @@ class ScoreboardData { var end = split[1] // get last color code in start val lastColorIndex = start.lastIndexOf('§') - val lastColor = when (lastColorIndex != -1 && lastColorIndex + 1 < start.length) { - true -> start[lastColorIndex] + "" + start[lastColorIndex + 1] - false -> "" + val lastColor = when { + lastColorIndex != -1 && lastColorIndex + 1 < start.length -> start[lastColorIndex] + "" + start[lastColorIndex + 1] + else -> "" } // remove first color code from end, when it is the same as the last color code in start - if (end.length >= 2 && end[0] == '§' && (end[1] in '0'..'9' || end[1] in 'a'..'f') && end[1] == lastColor[1]) { + if (end.length >= 2 && lastColor.isNotEmpty() && end[0] == '§' && (end[1] in '0'..'9' || end[1] in 'a'..'f') && end[1] == lastColor[1]) { end = end.substring(2) } list.add(start + end) From b5d30cb82ff93b503d5fd43c4f5564c216b538c0 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sat, 9 Dec 2023 18:27:27 +0100 Subject: [PATCH 217/225] Added trapper to events --- .../features/misc/customscoreboard/Events.kt | 19 +++++++++++++++++++ .../customscoreboard/InformationGetter.kt | 7 ++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 66ea720cae2e..8ecd252bf33c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -188,6 +188,25 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§6§lGOLD §fmedals") } } ), + TRAPPER( + { + val list = mutableListOf() + + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Pelts: §5") }) { + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Pelts: §5") } + ?: "" + } + if (ScoreboardData.sidebarLinesFormatted.any { it == "Tracker Mob Location:" }) { + list += "Tracker Mob Location:" + list += ScoreboardData.sidebarLinesFormatted.nextAfter("Tracker Mob Location:") ?: "" + } + + list + }, + { + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Pelts: §5") || it == "Tracker Mob Location:"} + } + ), GARDEN_CLEAN_UP( { listOf(ScoreboardData.sidebarLinesFormatted.firstOrNull { it.trim().startsWith("§fCleanup§7:") } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index d2af94866c72..f58df4ee4d90 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -150,7 +150,9 @@ class InformationGetter { "§6Year ", "§7Waiting for", "§7your vote...", - "e: §e§b0%" + "e: §e§b0%", + "Pelts: §5", + "Tracker Mob Location:" ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } @@ -182,5 +184,8 @@ class InformationGetter { for (i in 1 until 6) { extraLines = extraLines.filter { sidebarLines.nextAfter(votedLine, i) != it } } + + // remove trapper mob location + extraLines = extraLines.filter { sidebarLines.nextAfter("Tracker Mob Location:", 1) != it } } } From 65fcbfaf8f5540995ee59bbf37858970bb4f3eca Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 10 Dec 2023 00:12:20 +0100 Subject: [PATCH 218/225] Apparently powder has two different lines --- .../features/misc/customscoreboard/InformationGetter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index f58df4ee4d90..9ed155838be0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -132,8 +132,8 @@ class InformationGetter { "Your Tasty Mithr", "§3§lSolo", "§fRift Dimension", - "§d᠅ §fGemstone§f: §d", - "§2᠅ §fMithril§f: §2", + "§d᠅ §fGemstone", + "§2᠅ §fMithril", "Revenant Horror", "Tarantula Broodfa", "Sven Packm", From b404a15dbe3fcace39bd40e4e1d0601a407515e9 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 10 Dec 2023 16:43:46 +0100 Subject: [PATCH 219/225] Fixed winter event lines --- .../skyhanni/features/misc/customscoreboard/Events.kt | 8 ++++---- .../features/misc/customscoreboard/InformationGetter.kt | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 8ecd252bf33c..46383e1c3b3b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -248,16 +248,16 @@ enum class Events(private val displayLine: Supplier>, private val s if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§cWave ") }) { list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§cWave ") } ?: "" } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Magma Cubes Left§c") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Magma Cubes Left§c") } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Magma Cubes Left") }) { + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Magma Cubes Left") } ?: "" } if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Total Dama") }) { list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Total Dama") } ?: "" } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Cube Damage§c") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Cube Damage§c") } + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Cube Damage") }) { + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Cube Damage") } ?: "" } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 9ed155838be0..56ee100d0764 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -104,9 +104,9 @@ class InformationGetter { "Event Start: §a", "Next Wave: §a", "§cWave", - "Magma Cubes Left§c", + "Magma Cubes Left", "Your Total Damag", - "Your Cube Damage§c", + "Your Cube Damage", "§6Spooky Festival§f", "§dNew Year Event", "§aTraveling Zoo", From 74af1cebb68a8dbb5a77d82097e67e936d532e2c Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Sun, 10 Dec 2023 22:26:03 +0100 Subject: [PATCH 220/225] Merged two lines in CopyActionBar --- .../java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt b/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt index 8e94684af699..5b11513b04df 100644 --- a/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt +++ b/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt @@ -9,8 +9,7 @@ import at.hannibal2.skyhanni.utils.StringUtils.removeColor object CopyActionBar { fun command(args: Array) { val noColor = args.size == 1 && args[0] == "true" - var string = "" - string = ActionBarStatsData.actionBar.transformIf({noColor}) { removeColor() } + val string = ActionBarStatsData.actionBar.transformIf({noColor}) { removeColor() } OSUtils.copyToClipboard(string) LorenzUtils.chat("§e[SkyHanni] actionbar copied into your clipboard!") From d7874e5161e797cf106d7d9d5d9ddaaa0ed290c8 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 11 Dec 2023 18:54:20 +0100 Subject: [PATCH 221/225] Resolved walkers suggestion --- .../customscoreboard/CustomScoreboardUtils.kt | 9 + .../customscoreboard/ScoreboardElements.kt | 677 ++++++++---------- 2 files changed, 290 insertions(+), 396 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt index e97502150ac3..96d4347e6fa4 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/CustomScoreboardUtils.kt @@ -1,10 +1,14 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard +import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.mixins.transformers.AccessorGuiPlayerTabOverlay +import at.hannibal2.skyhanni.utils.RenderUtils.AlignmentEnum import net.minecraft.client.Minecraft +private val config get() = SkyHanniMod.feature.gui.customScoreboard + object CustomScoreboardUtils { fun mayorNameToColorCode(input: String): String { return when (input) { @@ -51,5 +55,10 @@ object CustomScoreboardUtils { return tabList.footer_skyhanni.formattedText.replace("§r", "") } + fun getTitleAndFooterAlignment() = when (config.displayConfig.centerTitleAndFooter) { + true -> AlignmentEnum.CENTER + false -> AlignmentEnum.LEFT + } + class UndetectedScoreboardLines(message: String) : Exception(message) } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index 45ae2ce739f0..f35ded626534 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -8,13 +8,14 @@ import at.hannibal2.skyhanni.data.MayorElection import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.data.SlayerAPI +import at.hannibal2.skyhanni.features.misc.customscoreboard.CustomScoreboardUtils.getTitleAndFooterAlignment import at.hannibal2.skyhanni.mixins.hooks.replaceString +import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.RenderUtils.AlignmentEnum import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.TimeUtils.formatted -import at.hannibal2.skyhanni.test.command.ErrorManager import io.github.moulberry.notenoughupdates.util.SkyBlockTime import java.util.function.Supplier @@ -42,413 +43,50 @@ enum class ScoreboardElements( private val showWhen: () -> Boolean, private val configLine: String ) { - TITLE( - { - val alignment = if (config.displayConfig.centerTitleAndFooter) { - AlignmentEnum.CENTER - } else { - AlignmentEnum.LEFT - } - - when (config.displayConfig.useHypixelTitleAnimation) { - true -> listOf(ScoreboardData.objectiveTitle to alignment) - false -> listOf(config.displayConfig.customTitle.get().toString().replace("&", "§") to alignment) - } - }, - { - true - }, - "§6§lSKYBLOCK" - ), - PROFILE( - { - listOf(CustomScoreboardUtils.getProfileTypeSymbol() + HypixelData.profileName.firstLetterUppercase() to AlignmentEnum.LEFT) - }, - { - true - }, - "§7♲ Blueberry" - ), - PURSE( - { - when { - config.informationFilteringConfig.hideEmptyLines && purse == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§6$purse Purse") - else -> listOf("Purse: §6$purse") - }.map { it to AlignmentEnum.LEFT } - }, - { - !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) - }, - "Purse: §652,763,737" - ), - MOTES( - { - when { - config.informationFilteringConfig.hideEmptyLines && motes == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§d$motes Motes") - else -> listOf("Motes: §d$motes") - }.map { it to AlignmentEnum.LEFT } - }, - { - listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) - }, - "Motes: §d64,647" - ), - BANK( - { - when { - config.informationFilteringConfig.hideEmptyLines && bank == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§6$bank Bank") - else -> listOf("Bank: §6$bank") - }.map { it to AlignmentEnum.LEFT } - }, - { - !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) - }, - "Bank: §6249M" - ), - BITS( - { - when { - config.informationFilteringConfig.hideEmptyLines && bits == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§b$bits Bits") - else -> listOf("Bits: §b$bits") - }.map { it to AlignmentEnum.LEFT } - }, - { - !listOf(IslandType.THE_RIFT, IslandType.CATACOMBS).contains(HypixelData.skyBlockIsland) - }, - "Bits: §b59,264" - ), - COPPER( - { - when { - config.informationFilteringConfig.hideEmptyLines && copper == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§c$copper Copper") - else -> listOf("Copper: §c$copper") - }.map { it to AlignmentEnum.LEFT } - }, - { - listOf(IslandType.GARDEN).contains(HypixelData.skyBlockIsland) - }, - "Copper: §c23,495" - ), - GEMS( - { - when { - config.informationFilteringConfig.hideEmptyLines && gems == "0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf("§a$gems Gems") - else -> listOf("Gems: §a$gems") - }.map { it to AlignmentEnum.LEFT } - }, - { - !listOf(IslandType.THE_RIFT, IslandType.CATACOMBS).contains(HypixelData.skyBlockIsland) - }, - "Gems: §a57,873" - ), - HEAT( - { - when { - config.informationFilteringConfig.hideEmptyLines && heat == "§c♨ 0" -> listOf("") - config.displayConfig.displayNumbersFirst -> listOf(if (heat == "§c♨ 0") "§c♨ 0 Heat" else "$heat Heat") - else -> listOf(if (heat == "§c♨ 0") "Heat: §c♨ 0" else "Heat: $heat") - }.map { it to AlignmentEnum.LEFT } - }, - { - listOf(IslandType.CRYSTAL_HOLLOWS).contains(HypixelData.skyBlockIsland) - }, - "Heat: §c♨ 0" - ), - EMPTY_LINE( - { - listOf("" to AlignmentEnum.LEFT) - }, - { - true - }, - "" - ), - ISLAND( - { - listOf( - "§7㋖ §a" + HypixelData.skyBlockIsland.toString().split("_") - .joinToString(" ") { it.firstLetterUppercase() } to AlignmentEnum.LEFT) - }, - { - true - }, - "§7㋖ §aHub" - ), - LOCATION( - { - // replaceString() adds back the garden plots - listOf((replaceString(location) ?: "") to AlignmentEnum.LEFT) - }, - { - true - }, - "§7⏣ §bVillage" - ), - VISITING( - { - listOf((ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith(" §a✌ §") } - ?: "") to AlignmentEnum.LEFT) - }, - { - ScoreboardData.sidebarLinesFormatted.any { it.startsWith(" §a✌ §") } - }, - " §a✌ §7(§a1§7/6)" - ), - DATE( - { - listOf( - SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false) to AlignmentEnum.LEFT - ) - }, - { - true - }, - "Late Summer 11th" - ), - TIME( - { - val symbols = listOf("☔", "⚡", "§e☀", "§b☽") - if (ScoreboardData.sidebarLinesFormatted.any { line -> symbols.any { line.contains(it) } }) { - listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } } - .trim() to AlignmentEnum.LEFT) - } else { - listOf( - "§7" + SkyBlockTime.now() - .formatted(dayAndMonthElement = false, yearElement = false) to AlignmentEnum.LEFT - ) - } - }, - { - true - }, - "§710:40pm" - ), - LOBBY_CODE( - { - listOf("§8$lobbyCode" to AlignmentEnum.LEFT) - }, - { - true - }, - "§8m77CK" - ), - POWER( - { - when (MaxwellAPI.currentPower == null) { - true -> listOf("§c§lPlease visit Maxwell!" to AlignmentEnum.LEFT) - false -> - when (config.displayConfig.displayNumbersFirst) { - true -> listOf("${MaxwellAPI.currentPower?.power} Power" to AlignmentEnum.LEFT) - false -> listOf("Power: ${MaxwellAPI.currentPower?.power}" to AlignmentEnum.LEFT) - } - } - }, - { - !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) - }, - "Power: Sighted" - ), - COOKIE( - { - val timeLine = CustomScoreboardUtils.getTablistFooter().split("\n") - .nextAfter("§d§lCookie Buff") ?: "" - - listOf( - "§d§lCookie Buff" to AlignmentEnum.LEFT - ) + when (timeLine.contains("Not active")){ - true -> listOf(" §7- §cNot active" to AlignmentEnum.LEFT) - false -> listOf(" §7- §e${timeLine.substringAfter("§d§lCookie Buff").trim()}" to AlignmentEnum.LEFT) - } - }, - { - if (config.informationFilteringConfig.hideEmptyLines){ - CustomScoreboardUtils.getTablistFooter().split("\n").any { - CustomScoreboardUtils.getTablistFooter().split("\n").nextAfter("§d§lCookie Buff")?.contains(it) - ?: false - } - } else { - true - } - }, - "§d§lCookie Buff\n §f3days, 17hours" - ), - EMPTY_LINE2( - { - listOf("" to AlignmentEnum.LEFT) - }, - { - true - }, - "" - ), - OBJECTIVE( - { - val objective = mutableListOf() - - objective += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Objective") } - - objective += ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0]) ?: "" - - if (extraObjectiveLines.any { - ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2)?.contains(it) == true - }) { - objective += ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2).toString() - .replace(")", "§7)") - } - - objective.map { it to AlignmentEnum.LEFT } - }, - { - true - }, - "Objective:\n§eUpdate SkyHanni" - ), + TITLE({ getTitleDisplayPair() }, { true }, "§6§lSKYBLOCK"), + PROFILE({ getProfileDisplayPair() }, { true }, "§7♲ Blueberry"), + PURSE({ getPurseDisplayPair() }, { getPurseShowWhen() }, "Purse: §652,763,737"), + MOTES({ getMotesDisplayPair() }, { getMotesShowWhen() }, "Motes: §d64,647"), + BANK({ getBankDisplayPair() }, { getBankShowWhen() }, "Bank: §6249M"), + BITS({ getBitsDisplayPair() }, { getBitsShowWhen() }, "Bits: §b59,264"), + COPPER({ getCopperDisplayPair() }, { getCopperShowWhen() }, "Copper: §c23,495"), + GEMS({ getGemsDisplayPair() }, { getGemsShowWhen() }, "Gems: §a57,873"), + HEAT({ getHeatDisplayPair() }, { getHeatShowWhen() }, "Heat: §c♨ 0"), + EMPTY_LINE({ getEmptyLineDisplayPair() }, { true }, ""), + ISLAND({ getIslandDisplayPair() }, { true }, "§7㋖ §aHub"), + LOCATION({ getLocationDisplayPair() }, { true }, "§7⏣ §bVillage"), + VISITING({ getVisitDisplayPair() }, { getVisitShowWhen() }, " §a✌ §7(§a1§7/6)"), + DATE({ getDateDisplayPair() }, { true }, "Late Summer 11th"), + TIME({ getTimeDisplayPair() }, { true }, "§710:40pm"), + LOBBY_CODE({ getLobbyDisplayPair() }, { true }, "§8m77CK"), + POWER({ getPowerDisplayPair() }, { getPowerShowWhen() }, "Power: Sighted"), + COOKIE({ getCookieDisplayPair() }, { getCookieShowWhen() }, "§d§lCookie Buff\n §f3days, 17hours"), + EMPTY_LINE2({ getEmptyLineDisplayPair() }, { true }, ""), + OBJECTIVE({ getObjectiveDisplayPair() }, { true }, "Objective:\n§eUpdate SkyHanni"), SLAYER( - { - listOf( - (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") to AlignmentEnum.LEFT - ) + ( - " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" to AlignmentEnum.LEFT - ) + ( - " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" to AlignmentEnum.LEFT - ) - }, - { - listOf( - IslandType.HUB, - IslandType.SPIDER_DEN, - IslandType.THE_PARK, - IslandType.THE_END, - IslandType.CRIMSON_ISLE, - IslandType.THE_RIFT - ).contains(HypixelData.skyBlockIsland) - }, + { getSlayerDisplayPair() }, + { getSlayerShowWhen() }, "§cSlayer\n §7- §cVoidgloom Seraph III\n §7- §e12§7/§c120 §7Kills" ), - EMPTY_LINE3( - { - listOf("" to AlignmentEnum.LEFT) - }, - { - true - }, - "" - ), + EMPTY_LINE3({ getEmptyLineDisplayPair() }, { true }, ""), POWDER( - { - when (config.displayConfig.displayNumbersFirst) { - true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") - false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") - }.map { it to AlignmentEnum.LEFT } - }, - { - listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES).contains(HypixelData.skyBlockIsland) - }, + { getPowderDisplayPair() }, + { getPowderShowWhen() }, "§9§lPowder\n §7- §fMithril: §254,646\n §7- §fGemstone: §d51,234" ), - EVENTS( - { - Events.getEvent().flatMap { it.getLines().map { i -> i to AlignmentEnum.LEFT } } - }, - { - Events.getEvent().isNotEmpty() - }, - "§7Wide Range of Events\n§7(too much for this here)" - ), + EVENTS({ getEventsDisplayPair() }, { getEventsShowWhen() }, "§7Wide Range of Events\n§7(too much for this here)"), MAYOR( - { - listOf( - (MayorElection.currentCandidate?.name?.let { CustomScoreboardUtils.mayorNameToColorCode(it) } - ?: "") to AlignmentEnum.LEFT - ) + (if (config.showMayorPerks) { - MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" to AlignmentEnum.LEFT } ?: emptyList() - } else { - emptyList() - }) - }, - { - !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) - }, + { getMayorDisplayPair() }, + { getMayorShowWhen() }, "§2Diana:\n §7- §eLucky!\n §7- §eMythological Ritual\n §7- §ePet XP Buff" ), PARTY( - { - val partyTitle: List> = - if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { - listOf("" to AlignmentEnum.LEFT) - } else { - val title = - if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" - val partyList = PartyAPI.partyMembers - .take(config.partyConfig.maxPartyList.get()) - .map { - " §7- §7$it" - } - .toTypedArray() - listOf(title, *partyList).map { it to AlignmentEnum.LEFT } - } - - partyTitle - }, - { - if (inDungeons) { - false // Hidden bc teammate health etc. exists - } else { - if (config.partyConfig.showPartyEverywhere) { - true - } else { - listOf( - IslandType.DUNGEON_HUB, - IslandType.KUUDRA_ARENA, - IslandType.CRIMSON_ISLE - ).contains(HypixelData.skyBlockIsland) - } - } - }, + { getPartyDisplayPair() }, + { getPartyShowWhen() }, "§9§lParty (4):\n §7- §fhannibal2\n §7- §fMoulberry\n §7- §fVahvl\n §7- §fJ10a1n15" ), - FOOTER( - { - val alignment = if (config.displayConfig.centerTitleAndFooter) { - AlignmentEnum.CENTER - } else { - AlignmentEnum.LEFT - } - - listOf(config.displayConfig.customFooter.get().toString().replace("&", "§") to alignment) - }, - { - true - }, - "§ewww.hypixel.net" - ), - EXTRA( - { - if (amountOfExtraLines != extraLines.size && config.unknownLinesWarning) { - ErrorManager.logErrorWithData( - CustomScoreboardUtils.UndetectedScoreboardLines("CustomScoreboard detected unknown lines"), - "CustomScoreboard detected unknown lines", - "extraLines" to extraLines - ) - amountOfExtraLines = extraLines.size - } - - listOf("§cUndetected Lines:" to AlignmentEnum.LEFT) + extraLines.map { it to AlignmentEnum.LEFT } - }, - { - if (extraLines.isNotEmpty()) { - amountOfExtraLines = 0 - } - extraLines.isNotEmpty() - }, - "§7Extra lines the mod is not detecting" - ), + FOOTER({ getFooterDisplayPair() }, { true }, "§ewww.hypixel.net"), + EXTRA({ getExtraDisplayPair() }, { getExtraShowWhen() }, "§7Extra lines the mod is not detecting"), ; override fun toString(): String { @@ -468,3 +106,250 @@ enum class ScoreboardElements( return showWhen() } } + + +private fun getTitleDisplayPair() = when (config.displayConfig.useHypixelTitleAnimation) { + true -> listOf(ScoreboardData.objectiveTitle to getTitleAndFooterAlignment()) + false -> listOf(config.displayConfig.customTitle.get().toString().replace("&", "§") to getTitleAndFooterAlignment()) +} + +private fun getProfileDisplayPair() = + listOf(CustomScoreboardUtils.getProfileTypeSymbol() + HypixelData.profileName.firstLetterUppercase() to AlignmentEnum.LEFT) + +private fun getPurseDisplayPair() = when { + config.informationFilteringConfig.hideEmptyLines && purse == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§6$purse Purse") + else -> listOf("Purse: §6$purse") +}.map { it to AlignmentEnum.LEFT } + +private fun getPurseShowWhen() = !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + +private fun getMotesDisplayPair() = when { + config.informationFilteringConfig.hideEmptyLines && motes == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§d$motes Motes") + else -> listOf("Motes: §d$motes") +}.map { it to AlignmentEnum.LEFT } + +private fun getMotesShowWhen() = listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + +private fun getBankDisplayPair() = when { + config.informationFilteringConfig.hideEmptyLines && bank == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§6$bank Bank") + else -> listOf("Bank: §6$bank") +}.map { it to AlignmentEnum.LEFT } + +private fun getBankShowWhen() = !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + +private fun getBitsDisplayPair() = when { + config.informationFilteringConfig.hideEmptyLines && bits == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§b$bits Bits") + else -> listOf("Bits: §b$bits") +}.map { it to AlignmentEnum.LEFT } + +private fun getBitsShowWhen() = !listOf(IslandType.THE_RIFT, IslandType.CATACOMBS).contains(HypixelData.skyBlockIsland) + +private fun getCopperDisplayPair() = when { + config.informationFilteringConfig.hideEmptyLines && copper == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§c$copper Copper") + else -> listOf("Copper: §c$copper") +}.map { it to AlignmentEnum.LEFT } + +private fun getCopperShowWhen() = listOf(IslandType.GARDEN).contains(HypixelData.skyBlockIsland) + +private fun getGemsDisplayPair() = when { + config.informationFilteringConfig.hideEmptyLines && gems == "0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf("§a$gems Gems") + else -> listOf("Gems: §a$gems") +}.map { it to AlignmentEnum.LEFT } + +private fun getGemsShowWhen() = !listOf(IslandType.THE_RIFT, IslandType.CATACOMBS).contains(HypixelData.skyBlockIsland) + +private fun getHeatDisplayPair() = when { + config.informationFilteringConfig.hideEmptyLines && heat == "§c♨ 0" -> listOf("") + config.displayConfig.displayNumbersFirst -> listOf(if (heat == "§c♨ 0") "§c♨ 0 Heat" else "$heat Heat") + else -> listOf(if (heat == "§c♨ 0") "Heat: §c♨ 0" else "Heat: $heat") +}.map { it to AlignmentEnum.LEFT } + +private fun getHeatShowWhen() = listOf(IslandType.CRYSTAL_HOLLOWS).contains(HypixelData.skyBlockIsland) + +private fun getEmptyLineDisplayPair() = listOf("" to AlignmentEnum.LEFT) + +private fun getIslandDisplayPair() = + listOf("§7㋖ §a" + HypixelData.skyBlockIsland.toString().split("_") + .joinToString(" ") { it.firstLetterUppercase() } to AlignmentEnum.LEFT) + +private fun getLocationDisplayPair() = + listOf((replaceString(location)?.trim() ?: "") to AlignmentEnum.LEFT) + + +private fun getVisitDisplayPair() = + listOf((ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith(" §a✌ §") }?.trim() + ?: "") to AlignmentEnum.LEFT) + +private fun getVisitShowWhen() = ScoreboardData.sidebarLinesFormatted.any { it.startsWith(" §a✌ §") } + +private fun getDateDisplayPair() = + listOf(SkyBlockTime.now().formatted(yearElement = false, hoursAndMinutesElement = false) to AlignmentEnum.LEFT) + + +private fun getTimeDisplayPair(): List> { + val symbols = listOf("☔", "⚡", "§e☀", "§b☽") + return if (ScoreboardData.sidebarLinesFormatted.any { line -> symbols.any { line.contains(it) } }) { + listOf(ScoreboardData.sidebarLinesFormatted.first { line -> symbols.any { line.contains(it) } } + .trim() to AlignmentEnum.LEFT) + } else { + listOf( + "§7" + SkyBlockTime.now() + .formatted(dayAndMonthElement = false, yearElement = false) to AlignmentEnum.LEFT + ) + } +} + +private fun getLobbyDisplayPair() = listOf("§8$lobbyCode" to AlignmentEnum.LEFT) + +private fun getPowerDisplayPair() = when (MaxwellAPI.currentPower == null) { + true -> listOf("§c§lPlease visit Maxwell!" to AlignmentEnum.LEFT) + false -> + when (config.displayConfig.displayNumbersFirst) { + true -> listOf("${MaxwellAPI.currentPower?.power} Power" to AlignmentEnum.LEFT) + false -> listOf("Power: ${MaxwellAPI.currentPower?.power}" to AlignmentEnum.LEFT) + } +} + +private fun getPowerShowWhen() = !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) + +private fun getCookieDisplayPair(): List> { + val timeLine = CustomScoreboardUtils.getTablistFooter().split("\n") + .nextAfter("§d§lCookie Buff") ?: "" + + return listOf( + "§d§lCookie Buff" to AlignmentEnum.LEFT + ) + when (timeLine.contains("Not active")) { + true -> listOf(" §7- §cNot active" to AlignmentEnum.LEFT) + false -> listOf(" §7- §e${timeLine.substringAfter("§d§lCookie Buff").trim()}" to AlignmentEnum.LEFT) + } +} + +private fun getCookieShowWhen() = when (config.informationFilteringConfig.hideEmptyLines) { + true -> CustomScoreboardUtils.getTablistFooter().split("\n").any { + CustomScoreboardUtils.getTablistFooter().split("\n").nextAfter("§d§lCookie Buff")?.contains(it) + ?: false + } + + false -> true +} + +private fun getObjectiveDisplayPair(): List> { + val objective = mutableListOf() + + objective += ScoreboardData.sidebarLinesFormatted.first { it.startsWith("Objective") } + + objective += ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0]) ?: "" + + if (extraObjectiveLines.any { + ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2)?.contains(it) == true + }) { + objective += ScoreboardData.sidebarLinesFormatted.nextAfter(objective[0], 2).toString() + .replace(")", "§7)") + } + + return objective.map { it to AlignmentEnum.LEFT } +} + +private fun getSlayerDisplayPair(): List> { + return listOf( + (if (SlayerAPI.hasActiveSlayerQuest()) "§cSlayer" else "") to AlignmentEnum.LEFT + ) + ( + " §7- §e${SlayerAPI.latestSlayerCategory.trim()}" to AlignmentEnum.LEFT + ) + ( + " §7- §e${SlayerAPI.latestSlayerProgress.trim()}" to AlignmentEnum.LEFT + ) +} + +private fun getSlayerShowWhen() = listOf( + IslandType.HUB, + IslandType.SPIDER_DEN, + IslandType.THE_PARK, + IslandType.THE_END, + IslandType.CRIMSON_ISLE, + IslandType.THE_RIFT +).contains(HypixelData.skyBlockIsland) + +private fun getPowderDisplayPair() = when (config.displayConfig.displayNumbersFirst) { + true -> listOf("§9§lPowder") + (" §7- §2$mithrilPowder Mithril") + (" §7- §d$gemstonePowder Gemstone") + false -> listOf("§9§lPowder") + (" §7- §fMithril: §2$mithrilPowder") + (" §7- §fGemstone: §d$gemstonePowder") +}.map { it to AlignmentEnum.LEFT } + +private fun getPowderShowWhen() = + listOf(IslandType.CRYSTAL_HOLLOWS, IslandType.DWARVEN_MINES).contains(HypixelData.skyBlockIsland) + +private fun getEventsDisplayPair() = Events.getEvent().flatMap { it.getLines().map { i -> i to AlignmentEnum.LEFT } } + +private fun getEventsShowWhen() = Events.getEvent().isNotEmpty() + +private fun getMayorDisplayPair(): List> { + return listOf( + (MayorElection.currentCandidate?.name?.let { CustomScoreboardUtils.mayorNameToColorCode(it) } + ?: "") to AlignmentEnum.LEFT + ) + (if (config.showMayorPerks) { + MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" to AlignmentEnum.LEFT } ?: emptyList() + } else { + emptyList() + }) +} + +private fun getMayorShowWhen() = + !listOf(IslandType.THE_RIFT).contains(HypixelData.skyBlockIsland) && MayorElection.currentCandidate != null + +private fun getPartyDisplayPair() = + if (PartyAPI.partyMembers.isEmpty() && config.informationFilteringConfig.hideEmptyLines) { + listOf("" to AlignmentEnum.LEFT) + } else { + val title = + if (PartyAPI.partyMembers.isEmpty()) "§9§lParty" else "§9§lParty (${PartyAPI.partyMembers.size})" + val partyList = PartyAPI.partyMembers + .take(config.partyConfig.maxPartyList.get()) + .map { + " §7- §7$it" + } + .toTypedArray() + listOf(title, *partyList).map { it to AlignmentEnum.LEFT } + } + +private fun getPartyShowWhen() = when (inDungeons) { + true -> false // Hidden bc the scoreboard lines already exist + false -> when (config.partyConfig.showPartyEverywhere) { + true -> true + false -> listOf( + IslandType.DUNGEON_HUB, + IslandType.KUUDRA_ARENA, + IslandType.CRIMSON_ISLE + ).contains(HypixelData.skyBlockIsland) + } +} + +private fun getFooterDisplayPair(): List> { + + + return listOf(config.displayConfig.customFooter.get().toString().replace("&", "§") to getTitleAndFooterAlignment()) +} + +private fun getExtraDisplayPair(): List> { + if (amountOfExtraLines != extraLines.size && config.unknownLinesWarning) { + ErrorManager.logErrorWithData( + CustomScoreboardUtils.UndetectedScoreboardLines("CustomScoreboard detected unknown lines"), + "CustomScoreboard detected unknown lines", + "extraLines" to extraLines + ) + amountOfExtraLines = extraLines.size + } + + return listOf("§cUndetected Lines:" to AlignmentEnum.LEFT) + extraLines.map { it to AlignmentEnum.LEFT } +} + +private fun getExtraShowWhen(): Boolean { + if (extraLines.isNotEmpty()) { + amountOfExtraLines = 0 + } + return extraLines.isNotEmpty() +} From e63b09d052474045d065bfc18d5f6ad637e6c0b2 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 11 Dec 2023 19:14:47 +0100 Subject: [PATCH 222/225] Time till next mayor --- .../CustomScoreboardConfig.java | 6 ++++++ .../hannibal2/skyhanni/data/MayorElection.kt | 17 ++++++++++++++++- .../customscoreboard/ScoreboardElements.kt | 19 ++++++++++++++----- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java index ed6bc257e207..3406d4f40171 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/CustomScoreboardConfig.java @@ -57,6 +57,12 @@ public class CustomScoreboardConfig { @FeatureToggle public boolean showMayorPerks = true; + @Expose + @ConfigOption(name = "Show Time till next mayor", desc = "Show the time till the next mayor is elected.") + @ConfigEditorBoolean + @FeatureToggle + public boolean showTimeTillNextMayor = true; + @Expose @ConfigOption(name = "Unknown Lines warning", desc = "Gives a chat warning when unknown lines are found in the scoreboard.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt b/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt index 93d277602c89..47db5feab168 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt @@ -2,11 +2,11 @@ package at.hannibal2.skyhanni.data import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.config.ConfigManager +import at.hannibal2.skyhanni.data.jsonobjects.local.MayorJson import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.utils.APIUtil import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.put -import at.hannibal2.skyhanni.data.jsonobjects.local.MayorJson import io.github.moulberry.notenoughupdates.util.SkyBlockTime import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -21,6 +21,7 @@ class MayorElection { var rawMayorData: MayorJson? = null var candidates = mapOf() var currentCandidate: MayorJson.Candidate? = null //todo: should it not be called currentMayor? + var timeTillNextMayor = 0L fun isPerkActive(mayor: String, perk: String) = currentCandidate?.let { currentCandidate -> currentCandidate.name == mayor && currentCandidate.perks.any { it.name == perk } @@ -33,9 +34,23 @@ class MayorElection { if (event.repeatSeconds(3)) { check() + getTimeTillNextMayor() } } + private fun getTimeTillNextMayor() { + var currentYear = SkyBlockTime.now().year + val month = 3 // Late Spring + // check if date is after 27th of Late Spring + if (SkyBlockTime.now().month >= month && SkyBlockTime.now().day > 27) { + // if so, next mayor will be in the next year + currentYear++ + } + val nextMayorTime = SkyBlockTime(currentYear, month, day = 27).toMillis() + + timeTillNextMayor = nextMayorTime - System.currentTimeMillis() + } + private fun check() { if (System.currentTimeMillis() > lastUpdate + 60_000 * 5) { lastUpdate = System.currentTimeMillis() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt index f35ded626534..13d0e1556b16 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/ScoreboardElements.kt @@ -15,6 +15,8 @@ import at.hannibal2.skyhanni.utils.LorenzUtils.inDungeons import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.RenderUtils.AlignmentEnum import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase +import at.hannibal2.skyhanni.utils.TimeUnit +import at.hannibal2.skyhanni.utils.TimeUtils import at.hannibal2.skyhanni.utils.TimeUtils.formatted import io.github.moulberry.notenoughupdates.util.SkyBlockTime import java.util.function.Supplier @@ -109,8 +111,8 @@ enum class ScoreboardElements( private fun getTitleDisplayPair() = when (config.displayConfig.useHypixelTitleAnimation) { - true -> listOf(ScoreboardData.objectiveTitle to getTitleAndFooterAlignment()) - false -> listOf(config.displayConfig.customTitle.get().toString().replace("&", "§") to getTitleAndFooterAlignment()) + true -> listOf(ScoreboardData.objectiveTitle to getTitleAndFooterAlignment()) + false -> listOf(config.displayConfig.customTitle.get().toString().replace("&", "§") to getTitleAndFooterAlignment()) } private fun getProfileDisplayPair() = @@ -183,8 +185,10 @@ private fun getLocationDisplayPair() = private fun getVisitDisplayPair() = - listOf((ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith(" §a✌ §") }?.trim() - ?: "") to AlignmentEnum.LEFT) + listOf( + (ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith(" §a✌ §") }?.trim() + ?: "") to AlignmentEnum.LEFT + ) private fun getVisitShowWhen() = ScoreboardData.sidebarLinesFormatted.any { it.startsWith(" §a✌ §") } @@ -290,7 +294,12 @@ private fun getEventsShowWhen() = Events.getEvent().isNotEmpty() private fun getMayorDisplayPair(): List> { return listOf( (MayorElection.currentCandidate?.name?.let { CustomScoreboardUtils.mayorNameToColorCode(it) } - ?: "") to AlignmentEnum.LEFT + ?: "") + + (if (config.showTimeTillNextMayor) { + "§7 (§e${TimeUtils.formatDuration(MayorElection.timeTillNextMayor, TimeUnit.DAY)}§7)" + } else { + "" + }) to AlignmentEnum.LEFT ) + (if (config.showMayorPerks) { MayorElection.currentCandidate?.perks?.map { " §7- §e${it.name}" to AlignmentEnum.LEFT } ?: emptyList() } else { From 728883383646bb2c375b87b59c07101c2cfa7f44 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 11 Dec 2023 20:02:44 +0100 Subject: [PATCH 223/225] fixed double prefix in CopyActionBar --- .../java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt b/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt index 5b11513b04df..bcbd164c01c7 100644 --- a/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt +++ b/src/main/java/at/hannibal2/skyhanni/test/command/CopyActionBar.kt @@ -12,6 +12,6 @@ object CopyActionBar { val string = ActionBarStatsData.actionBar.transformIf({noColor}) { removeColor() } OSUtils.copyToClipboard(string) - LorenzUtils.chat("§e[SkyHanni] actionbar copied into your clipboard!") + LorenzUtils.chat("Actionbar copied into your clipboard!") } } From b119de2260bf70d9bacb2f41ed4dbae7f95d9ff3 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 11 Dec 2023 20:55:37 +0100 Subject: [PATCH 224/225] Removed Next Wave soon! bc hypixel wont --- .../features/misc/customscoreboard/Events.kt | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 46383e1c3b3b..978db643f42e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -231,33 +231,34 @@ enum class Events(private val displayLine: Supplier>, private val s WINTER( { val list = mutableListOf() + val sidebarLines = ScoreboardData.sidebarLinesFormatted - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("North Stars: §d") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("North Stars: §d") } + if (sidebarLines.any { it.startsWith("North Stars: §d") }) { + list += sidebarLines.firstOrNull { it.startsWith("North Stars: §d") } ?: "" } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Event Start: §a") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Event Start: §a") } + if (sidebarLines.any { it.startsWith("Event Start: §a") }) { + list += sidebarLines.firstOrNull { it.startsWith("Event Start: §a") } ?: "" } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Next Wave: §a") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Next Wave: §a") } + if (sidebarLines.any { it.startsWith("Next Wave: §a") } && sidebarLines.none { it == "Next Wave: §aSoon!" }) { + list += sidebarLines.firstOrNull { it.startsWith("Next Wave: §a") } ?: "" } list += "" - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§cWave ") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§cWave ") } ?: "" + if (sidebarLines.any { it.startsWith("§cWave ") }) { + list += sidebarLines.firstOrNull { it.startsWith("§cWave ") } ?: "" } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Magma Cubes Left") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Magma Cubes Left") } + if (sidebarLines.any { it.startsWith("Magma Cubes Left") }) { + list += sidebarLines.firstOrNull { it.startsWith("Magma Cubes Left") } ?: "" } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Total Dama") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Total Dama") } + if (sidebarLines.any { it.startsWith("Your Total Dama") }) { + list += sidebarLines.firstOrNull { it.startsWith("Your Total Dama") } ?: "" } - if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Your Cube Damage") }) { - list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("Your Cube Damage") } + if (sidebarLines.any { it.startsWith("Your Cube Damage") }) { + list += sidebarLines.firstOrNull { it.startsWith("Your Cube Damage") } ?: "" } From 629ca221bf35df2784ab2f95bf0278e3077a5ca6 Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Mon, 11 Dec 2023 21:28:44 +0100 Subject: [PATCH 225/225] Added magmaboss --- .../features/misc/customscoreboard/Events.kt | 25 +++++++++++++++++++ .../customscoreboard/InformationGetter.kt | 11 ++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt index 978db643f42e..ec9460a12d50 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/Events.kt @@ -156,6 +156,31 @@ enum class Events(private val displayLine: Supplier>, private val s ScoreboardData.sidebarLinesFormatted.any { it.startsWith("Challenge: ") } } ), + MAGMA_BOSS( + { + val list = mutableListOf() + + if (ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§7Boss: §c")}){ + list += ScoreboardData.sidebarLinesFormatted.firstOrNull { it.startsWith("§7Boss: §c") } + ?: "" + } + + if (ScoreboardData.sidebarLinesFormatted.any { it == "§7Damage Soaked:"}) { + list += "§7Damage Soaked:" + list += ScoreboardData.sidebarLinesFormatted.nextAfter("§7Damage Soaked:") ?: "" + } + + if (ScoreboardData.sidebarLinesFormatted.any { it == "§6Kill the Magmas:"}){ + list += "§6Kill the Magmas:" + list += ScoreboardData.sidebarLinesFormatted.nextAfter("§6Kill the Magmas:") ?: "" + } + + list + }, + { + ScoreboardData.sidebarLinesFormatted.any { it.startsWith("§7Boss: §c") || it == "§6Kill the Magmas:" } + } + ), JACOB_CONTEST( { val list = mutableListOf() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt index 56ee100d0764..6d654f714874 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/customscoreboard/InformationGetter.kt @@ -1,9 +1,9 @@ package at.hannibal2.skyhanni.features.misc.customscoreboard import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.features.misc.customscoreboard.CustomScoreboardUtils.extractLobbyCode import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.TabListData -import at.hannibal2.skyhanni.features.misc.customscoreboard.CustomScoreboardUtils.extractLobbyCode class InformationGetter { companion object { @@ -152,7 +152,10 @@ class InformationGetter { "§7your vote...", "e: §e§b0%", "Pelts: §5", - "Tracker Mob Location:" + "Tracker Mob Location:", + "§7Boss: §c", + "§7Damage Soaked:", + "§6Kill the Magmas:", ) extraLines = sidebarLines.filter { line -> !knownLines.any { line.trim().contains(it) } } @@ -187,5 +190,9 @@ class InformationGetter { // remove trapper mob location extraLines = extraLines.filter { sidebarLines.nextAfter("Tracker Mob Location:", 1) != it } + + // magma boss + extraLines = extraLines.filter { sidebarLines.nextAfter("§7Damage Soaked:") != it } + extraLines = extraLines.filter { sidebarLines.nextAfter("§6Kill the Magmas:") != it } } }