From b2e1c53efabf3fc1d46f36feb674b615425d0b54 Mon Sep 17 00:00:00 2001 From: Cow Date: Tue, 29 Jun 2021 15:02:57 +0200 Subject: Added support for 'new' SkyBlock content - Added Enderman slayer and Voidling minions - Added support for HPB and master stars --- .../cowtipper/cowlection/command/MooCommand.java | 1 + .../de/cowtipper/cowlection/data/DataHelper.java | 18 ++++++++++++++-- .../cowtipper/cowlection/data/HySkyBlockStats.java | 2 +- .../de/cowtipper/cowlection/data/XpTables.java | 9 ++++++-- .../listener/skyblock/DungeonsListener.java | 17 ++++++++++----- .../java/de/cowtipper/cowlection/util/Utils.java | 24 +++++++++++++--------- 6 files changed, 51 insertions(+), 20 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/cowtipper/cowlection/command/MooCommand.java b/src/main/java/de/cowtipper/cowlection/command/MooCommand.java index 6e5cc0e..ceff45d 100644 --- a/src/main/java/de/cowtipper/cowlection/command/MooCommand.java +++ b/src/main/java/de/cowtipper/cowlection/command/MooCommand.java @@ -14,6 +14,7 @@ import de.cowtipper.cowlection.config.gui.MooConfigGui; import de.cowtipper.cowlection.data.*; import de.cowtipper.cowlection.data.HySkyBlockStats.Profile.Pet; import de.cowtipper.cowlection.handler.DungeonCache; +import de.cowtipper.cowlection.listener.skyblock.DungeonsListener; import de.cowtipper.cowlection.listener.skyblock.DungeonsPartyListener; import de.cowtipper.cowlection.search.GuiSearch; import de.cowtipper.cowlection.util.*; diff --git a/src/main/java/de/cowtipper/cowlection/data/DataHelper.java b/src/main/java/de/cowtipper/cowlection/data/DataHelper.java index cb81c0a..ee2abe3 100644 --- a/src/main/java/de/cowtipper/cowlection/data/DataHelper.java +++ b/src/main/java/de/cowtipper/cowlection/data/DataHelper.java @@ -34,7 +34,7 @@ public final class DataHelper { public static SkyBlockRarity getPetRarityByColorCode(String colorCode) { if (MYTHIC.rarityColor.toString().equals(colorCode)) { - // special case: Mystic Bat + // special case: Mystic pets return LEGENDARY; } for (SkyBlockRarity petRarity : getPetRarities()) { @@ -79,7 +79,9 @@ public final class DataHelper { BUILD_BATTLE("Build Battle"), DUELS("Duels"), SKYBLOCK("SkyBlock"), - PIT("Pit"); + PIT("Pit"), + REPLAY("Replay"), + SMP("SMP"); private final String cleanName; @@ -569,6 +571,18 @@ public final class DataHelper { minions.put("d0197c8a4eaca2e5cc1b287ac84c62ef8c9f63068218105292dd89c3f7e64596", "Revenant X"); minions.put("9cf6f95308bedb182b434aa73058aa8d69818b48900396cebc127c1bf7df6790", "Revenant XI"); + minions.put("3a851ed2ce5c2c0523af772d206d9555e2e1383ec87946e6ff4c51186e29ef7f", "Voidling I"); + minions.put("bc494af6b45980cb2b035007c25e1b4e169371c410fe5d2708daa4f695668fd2", "Voidling II"); + minions.put("4092f0e0e390f1d2382c908b0a8a90f988458ba8cfa13773f81faa6fc0c906f2", "Voidling III"); + minions.put("be983af1e4fd62b3ad436b00782a3faebb2e392827097eb96c652e2e5521e438", "Voidling IV"); + minions.put("527465fd028df45d67de911870cabbde33ee4c4f3ba2057c15465e94b495e22f", "Voidling V"); + minions.put("5936fa9d8f9319ff6b20e2d25520ba97e2bbe858d579a34392631515d49cd7eb", "Voidling VI"); + minions.put("6ed0ad0130e99a36cf7d78cae759965476f98025b1833cde5542f7dc42829400", "Voidling VII"); + minions.put("56140d9598bef25911b283649278ac1213697609be939676b8d944e9d63577bc", "Voidling VIII"); + minions.put("76a551138ea5378f71f3e6440a00dab112e60ff8b9784cd2010b3ac36123d5a6", "Voidling IX"); + minions.put("7d63d05501d38fac8b0969deb78b68a58fe03c3e0d78cdb84ef1a9a7513ee326", "Voidling X"); + minions.put("7334fc47a50b46ac9df7bf2ed712309ff0b029981368b22db0d539c88f83144f", "Voidling XI"); + minions.put("2fe009c5cfa44c05c88e5df070ae2533bd682a728e0b33bfc93fd92a6e5f3f64", "Skeleton I"); minions.put("3ab6f9c3c911879181dbf2468783348abc671346d5e8c34d118b2b7ece7c47c2", "Skeleton II"); minions.put("ccd9559dc31e4700aaf001e0e2f0bd3517f238af25decd8395f4621404ca4568", "Skeleton III"); diff --git a/src/main/java/de/cowtipper/cowlection/data/HySkyBlockStats.java b/src/main/java/de/cowtipper/cowlection/data/HySkyBlockStats.java index 8a3e067..2fa802b 100644 --- a/src/main/java/de/cowtipper/cowlection/data/HySkyBlockStats.java +++ b/src/main/java/de/cowtipper/cowlection/data/HySkyBlockStats.java @@ -209,7 +209,7 @@ public class HySkyBlockStats { Map slayerLevels = new EnumMap<>(XpTables.Slayer.class); for (XpTables.Slayer slayerBoss : XpTables.Slayer.values()) { SlayerBossDetails bossDetails = slayer_bosses.get(slayerBoss.name().toLowerCase()); - int slayerLevel = slayerBoss.getLevel(bossDetails.xp); + int slayerLevel = bossDetails != null ? slayerBoss.getLevel(bossDetails.xp) : 0; slayerLevels.put(slayerBoss, slayerLevel); } return slayerLevels; diff --git a/src/main/java/de/cowtipper/cowlection/data/XpTables.java b/src/main/java/de/cowtipper/cowlection/data/XpTables.java index efa576a..74abad5 100644 --- a/src/main/java/de/cowtipper/cowlection/data/XpTables.java +++ b/src/main/java/de/cowtipper/cowlection/data/XpTables.java @@ -140,7 +140,7 @@ public class XpTables { } public enum Slayer { - ZOMBIE, SPIDER, WOLF(true); + ZOMBIE, SPIDER, WOLF(true), ENDERMAN(true); private final boolean alternativeXpFormula; /** * Valid for Zombie + Spider @@ -260,7 +260,12 @@ public class XpTables { } public static int getLevel(String rarity, double exp) { - TreeSet xpToLevels = PET_XP.get(DataHelper.SkyBlockRarity.valueOf(rarity)); + DataHelper.SkyBlockRarity petRarity = DataHelper.SkyBlockRarity.valueOf(rarity); + if (petRarity == DataHelper.SkyBlockRarity.MYTHIC) { + // special case: Mystic pets + petRarity = DataHelper.SkyBlockRarity.LEGENDARY; + } + TreeSet xpToLevels = PET_XP.get(petRarity); if (xpToLevels != null) { return xpToLevels.headSet((int) exp, true).size(); } else { diff --git a/src/main/java/de/cowtipper/cowlection/listener/skyblock/DungeonsListener.java b/src/main/java/de/cowtipper/cowlection/listener/skyblock/DungeonsListener.java index 1ca65fa..9ae5d7e 100644 --- a/src/main/java/de/cowtipper/cowlection/listener/skyblock/DungeonsListener.java +++ b/src/main/java/de/cowtipper/cowlection/listener/skyblock/DungeonsListener.java @@ -31,8 +31,7 @@ import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.util.Constants; import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.eventhandler.*; import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.relauncher.Side; import org.lwjgl.input.Mouse; @@ -67,6 +66,7 @@ public class DungeonsListener { *
  • §7Health: §a+107 HP §8(+133.75 HP)
  • *
  • §7Defense: §a+130 §8(Heavy +65) §8(+162.5)
  • *
  • §7Speed: §a-1 §8(Heavy -1)
  • + *
  • §7Health: §a+432 HP §e(+60 HP) §9(Ancient +7 HP) §8(+1,032.48 HP)
  • * *
          * | Groups                     | Example matches   |
    @@ -74,14 +74,16 @@ public class DungeonsListener {
          * | Group `prefix`             | §7Crit Damage: §c |
          * | Group `statNonDungeon`     | +23               |
          * | Group `statNonDungeonUnit` | %                 |
    +     * | Group `statHpb`            | +60               |
          * | Group `colorReforge`       | §8                |
          * | Group `reforge`            | Heavy             |
          * | Group `statReforge`        | -3                |
    -     * | Group `statReforgeUnit`    | %                 |
          * | Group `colorDungeon`       | §8                |
    +     * | Group `statDungeon`        | +42               |
    +     * | Group `statDungeonUnit`    | %                 |
          * 
    */ - private final Pattern TOOLTIP_LINE_PATTERN = Pattern.compile("^(?(?:" + FORMATTING_CODE + ")+[A-Za-z ]+: " + FORMATTING_CODE + ")(?[+-]?[0-9]+)(?%| HP|)(?: (?" + FORMATTING_CODE + ")\\((?[A-Za-z]+) (?[+-]?[0-9]+)(?%| HP|)\\))?(?: (?" + FORMATTING_CODE + ")\\((?[+-]?[.0-9]+)(?%| HP|)\\))?$"); + private final Pattern TOOLTIP_LINE_PATTERN = Pattern.compile("^(?(?:" + FORMATTING_CODE + ")+[A-Za-z ]+: " + FORMATTING_CODE + ")(?[+-]?[0-9]+)(?%| HP|)(?: §e\\(\\+(?[0-9]+)(?: HP)?\\))?(?: (?" + FORMATTING_CODE + ")\\((?[A-Za-z]+) (?[+-]?[0-9]+)(?:%| HP|)\\))?(?: (?" + FORMATTING_CODE + ")\\((?[+-]?[.,0-9]+)(?%| HP|)\\))?$"); /** * Player deaths in dungeon: *
      @@ -190,6 +192,11 @@ public class DungeonsListener { statBase -= Integer.parseInt(lineMatcher.group("statReforge")); } + if (lineMatcher.group("statHpb") != null) { + // tooltip line has Hot Potato Book stats; subtract them from base stats + statBase -= Integer.parseInt(lineMatcher.group("statHpb")); + } + if (statBase == 0) { // don't redraw 0 stats tooltipIterator.remove(); @@ -198,7 +205,7 @@ public class DungeonsListener { String newToolTipLine = String.format("%s%+d%s", lineMatcher.group("prefix"), statBase, lineMatcher.group("statNonDungeonUnit")); if (lineMatcher.group("statDungeon") != null) { // tooltip line has dungeon stats; update them! - double statDungeon = Double.parseDouble(lineMatcher.group("statDungeon")); + double statDungeon = Double.parseDouble(lineMatcher.group("statDungeon").replace(",", "")); double dungeonStatModifier = statDungeon / statNonDungeon; // modified through skill level or gear essence upgrades if (extraAttributes.hasKey("dungeon_item_level")) { diff --git a/src/main/java/de/cowtipper/cowlection/util/Utils.java b/src/main/java/de/cowtipper/cowlection/util/Utils.java index f15b095..4b5c73c 100644 --- a/src/main/java/de/cowtipper/cowlection/util/Utils.java +++ b/src/main/java/de/cowtipper/cowlection/util/Utils.java @@ -347,18 +347,22 @@ public final class Utils { } } } - // remove essence upgrade indicators (✪) - String essenceUpgradeIndicator = EnumChatFormatting.GOLD + "✪"; - int essenceModifier = modifiedItemName.indexOf(essenceUpgradeIndicator); - while (essenceModifier > 0) { - if (strikethrough) { - modifiedItemName.replace(essenceModifier, essenceModifier + essenceUpgradeIndicator.length(), grayedOutFormatting + "✪"); + // remove or 'hide' essence upgrade indicators (✪) + replaceInStringBuilder(modifiedItemName, EnumChatFormatting.GOLD + "✪", grayedOutFormatting + "✪", strikethrough); + replaceInStringBuilder(modifiedItemName, EnumChatFormatting.RED + "✪", "" + EnumChatFormatting.DARK_GRAY + EnumChatFormatting.STRIKETHROUGH + "✪", strikethrough); + + return Pair.of(modifiedItemName.toString().trim(), reforge); + } + + private static void replaceInStringBuilder(StringBuilder sb, String search, String replacement, boolean replace) { + int hit = sb.indexOf(search); + while (hit > 0) { + if (replace) { + sb.replace(hit, hit + search.length(), replacement); } else { - modifiedItemName.delete(essenceModifier, essenceModifier + essenceUpgradeIndicator.length()); + sb.delete(hit, hit + search.length()); } - essenceModifier = modifiedItemName.indexOf(essenceUpgradeIndicator); + hit = sb.indexOf(search); } - - return Pair.of(modifiedItemName.toString().trim(), reforge); } } -- cgit