From 3c67250aa4e6f925698c1f45856c62cbdf4299b7 Mon Sep 17 00:00:00 2001 From: Fix3d Date: Sat, 29 Apr 2023 13:44:19 +0300 Subject: [PATCH 01/22] https://github.com/BiscuitDevelopment/SkyblockAddons/pull/684 and https://github.com/BiscuitDevelopment/SkyblockAddons/pull/689 with some other changes --- .../skyblockaddons/SkyblockAddons.java | 9 ++- .../skyblockaddons/config/ConfigValues.java | 1 - .../biscuit/skyblockaddons/core/Feature.java | 17 ++++- .../biscuit/skyblockaddons/core/Location.java | 23 +++++- .../skyblockaddons/core/SkyblockDate.java | 3 +- .../core/dungeons/DungeonManager.java | 15 +++- .../EntityOutlines/FeatureTrackerQuest.java | 4 +- .../features/discordrpc/DiscordStatus.java | 10 ++- .../dungeonmap/DungeonMapManager.java | 10 +-- .../features/slayertracker/SlayerBoss.java | 9 ++- .../features/slayertracker/SlayerDrop.java | 46 +++++++++++- .../features/slayertracker/SlayerTracker.java | 3 +- .../features/tablist/TabListParser.java | 2 +- .../skyblockaddons/gui/IslandWarpGui.java | 4 + .../skyblockaddons/gui/SettingsGui.java | 6 ++ .../gui/buttons/ButtonSelect.java | 5 +- .../listeners/RenderListener.java | 69 +++++++++++++----- .../skyblockaddons/utils/ActionBarParser.java | 23 +++--- .../skyblockaddons/utils/EnumUtils.java | 4 +- .../skyblockaddons/utils/ItemUtils.java | 2 - .../skyblockaddons/utils/TextUtils.java | 24 ++++-- .../biscuit/skyblockaddons/utils/Utils.java | 20 ++--- .../utils/data/DataConstants.java | 4 +- .../skyblockaddons/utils/data/DataUtils.java | 1 + .../utils/data/RemoteFileRequest.java | 4 +- .../assets/skyblockaddons/islands/garden.png | Bin 0 -> 34974 bytes src/main/resources/compactorItems.json | 12 +++ src/main/resources/lang/en_US.json | 6 +- .../skyblockaddons/TextUtilsTests.java | 2 +- 29 files changed, 251 insertions(+), 87 deletions(-) create mode 100644 src/main/resources/assets/skyblockaddons/islands/garden.png diff --git a/src/main/java/codes/biscuit/skyblockaddons/SkyblockAddons.java b/src/main/java/codes/biscuit/skyblockaddons/SkyblockAddons.java index 3352d7736..3b448767b 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/SkyblockAddons.java +++ b/src/main/java/codes/biscuit/skyblockaddons/SkyblockAddons.java @@ -22,10 +22,7 @@ import codes.biscuit.skyblockaddons.misc.scheduler.NewScheduler; import codes.biscuit.skyblockaddons.misc.scheduler.Scheduler; import codes.biscuit.skyblockaddons.newgui.GuiManager; -import codes.biscuit.skyblockaddons.utils.EnumUtils; -import codes.biscuit.skyblockaddons.utils.InventoryUtils; -import codes.biscuit.skyblockaddons.utils.SkyblockAddonsMessageFactory; -import codes.biscuit.skyblockaddons.utils.Utils; +import codes.biscuit.skyblockaddons.utils.*; import codes.biscuit.skyblockaddons.utils.data.DataUtils; import codes.biscuit.skyblockaddons.utils.gson.GsonInitializableTypeAdapter; import codes.biscuit.skyblockaddons.utils.gson.PatternAdapter; @@ -191,6 +188,10 @@ public void init(FMLInitializationEvent e) { usingLabymod = utils.isModLoaded("labymod"); usingOofModv1 = utils.isModLoaded("refractionoof", "1.0"); usingPatcher = utils.isModLoaded("patcher"); + + if (!this.configValues.isEnabled(Feature.NUMBER_SEPARATORS)) { + TextUtils.NUMBER_FORMAT.setGroupingUsed(false); + } } @Mod.EventHandler diff --git a/src/main/java/codes/biscuit/skyblockaddons/config/ConfigValues.java b/src/main/java/codes/biscuit/skyblockaddons/config/ConfigValues.java index 0f527385b..116ee8a37 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/config/ConfigValues.java +++ b/src/main/java/codes/biscuit/skyblockaddons/config/ConfigValues.java @@ -515,7 +515,6 @@ private , F extends Enum> void deserializeEnumEnumMapFromID } } - @SuppressWarnings("unchecked") private , N extends Number> void deserializeEnumNumberMapFromID(Map map, String path, Class keyClass, Class numberClass) { deserializeEnumNumberMapFromID(loadedConfig, map, path, keyClass, numberClass); } diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java b/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java index adcd6f0ff..9879c4395 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java @@ -211,11 +211,18 @@ public enum Feature { SHOW_SKYBLOCK_ITEM_ID(213, "settings.showSkyblockItemId", null, true), RESET_SALVAGED_ESSENCES_AFTER_LEAVING_MENU(214, "settings.resetSalvagedEssencesAfterLeavingMenu", null, false), CHANGE_DUNGEON_MAP_ZOOM_WITH_KEYBOARD(215, "settings.changeDungeonMapZoomWithKeyboard", null, false), + // Release 1.7 PLAYER_SYMBOLS_IN_CHAT(216, "settings.showPlayerSymbolsInChat", null, false, EnumUtils.FeatureSetting.SHOW_PROFILE_TYPE, EnumUtils.FeatureSetting.SHOW_NETHER_FACTION), CRIMSON_ARMOR_ABILITY_STACKS(217, "settings.crimsonArmorAbilityStacks", new GuiFeatureData(EnumUtils.DrawType.TEXT, ColorCode.GOLD), false), HIDE_TRUE_DEFENSE(218, "settings.hideTrueDefense", new GuiFeatureData(ColorCode.RED), false), SHOW_PROFILE_TYPE(219, "settings.showProfileType", false), SHOW_NETHER_FACTION(220,"settings.showNetherFaction", false), + // Release Fix3dll + NUMBER_SEPARATORS(221, "settings.numberSeparators", null, false), + HIDE_WHEN_NOT_IN_CRIMSON(222, null, false), + INFERNO_SLAYER_TRACKER(223, "settings.infernoSlayerTracker", new GuiFeatureData(EnumUtils.DrawType.SLAYER_TRACKERS, ColorCode.WHITE), false, EnumUtils.FeatureSetting.COLOUR_BY_RARITY, EnumUtils.FeatureSetting.TEXT_MODE, EnumUtils.FeatureSetting.HIDE_WHEN_NOT_IN_CRIMSON), + INFERNO_COLOR_BY_RARITY(224, null, false), + INFERNO_TEXT_MODE(225, null, true), WARNING_TIME(-1, "settings.warningDuration", null, false), WARP_ADVANCED_MODE(-1, "settings.advancedMode", null, true), @@ -252,6 +259,10 @@ public enum Feature { REPEAT_SLAYER_BOSS_WARNING, ROTATE_MAP, CENTER_ROTATION_ON_PLAYER, MAP_ZOOM, BASE_STAT_BOOST_COLOR_BY_RARITY, SHOW_PLAYER_HEADS_ON_MAP, SHOW_GLOWING_ITEMS_ON_ISLAND, SKILL_ACTIONS_LEFT_UNTIL_NEXT_LEVEL, REVENANT_COLOR_BY_RARITY, TARANTULA_COLOR_BY_RARITY, SVEN_COLOR_BY_RARITY, REVENANT_TEXT_MODE, TARANTULA_TEXT_MODE, SVEN_TEXT_MODE, + DRAGON_STATS_TRACKER_COLOR_BY_RARITY, HIDE_WHEN_NOT_IN_CASTLE, HIDE_WHEN_NOT_IN_SPIDERS_DEN, HIDE_WHEN_NOT_IN_END, + ENDERMAN_COLOR_BY_RARITY, ENDERMAN_TEXT_MODE, HIDE_WHEN_NOT_IN_CRIMSON, INFERNO_COLOR_BY_RARITY, INFERNO_TEXT_MODE, + HIDE_WHEN_NOT_IN_CRYPTS, SHOW_PERSONAL_COMPACTOR_PREVIEW, SHOW_SKILL_PERCENTAGE_INSTEAD_OF_XP, + SHOW_SKILL_XP_GAINED, SHOW_SALVAGE_ESSENCES_COUNTER, HEALING_CIRCLE_OPACITY, COOLDOWN_PREDICTION, ENCHANTMENTS_HIGHLIGHT, DRAGON_STATS_TRACKER_COLOR_BY_RARITY, HIDE_WHEN_NOT_IN_CASTLE, HIDE_WHEN_NOT_IN_SPIDERS_DEN, HIDE_WHEN_NOT_IN_CRYPTS, SHOW_PERSONAL_COMPACTOR_PREVIEW, SHOW_SKILL_PERCENTAGE_INSTEAD_OF_XP, SHOW_SKILL_XP_GAINED, SHOW_SALVAGE_ESSENCES_COUNTER, HEALING_CIRCLE_OPACITY, COOLDOWN_PREDICTION, ENCHANTMENTS_HIGHLIGHT, @@ -274,7 +285,7 @@ public enum Feature { SLAYER_INDICATOR, POWER_ORB_STATUS_DISPLAY, ZEALOT_COUNTER, TICKER_CHARGES_DISPLAY, TAB_EFFECT_TIMERS, SHOW_TOTAL_ZEALOT_COUNT, SHOW_SUMMONING_EYE_COUNT, SHOW_AVERAGE_ZEALOTS_PER_EYE, BIRCH_PARK_RAINMAKER_TIMER, ENDSTONE_PROTECTOR_DISPLAY, BAIT_LIST, DUNGEONS_MAP_DISPLAY, SHOW_DUNGEON_MILESTONE, DUNGEONS_COLLECTED_ESSENCES_DISPLAY, REVENANT_SLAYER_TRACKER, TARANTULA_SLAYER_TRACKER, SVEN_SLAYER_TRACKER, DRAGON_STATS_TRACKER, DUNGEON_DEATH_COUNTER, - ROCK_PET_TRACKER, DOLPHIN_PET_TRACKER, DUNGEONS_SECRETS_DISPLAY, CANDY_POINTS_COUNTER, DRILL_FUEL_TEXT, + ROCK_PET_TRACKER, DOLPHIN_PET_TRACKER, DUNGEONS_SECRETS_DISPLAY, CANDY_POINTS_COUNTER, DRILL_FUEL_TEXT, INFERNO_SLAYER_TRACKER, TREVOR_TRACKED_ENTITY_PROXIMITY_INDICATOR, FETCHUR_TODAY, VOIDGLOOM_SLAYER_TRACKER, OTHER_DEFENCE_STATS, SPIRIT_SCEPTRE_DISPLAY, FARM_EVENT_TIMER, CRIMSON_ARMOR_ABILITY_STACKS, HIDE_TRUE_DEFENSE)); @@ -283,7 +294,7 @@ public enum Feature { */ @Getter private static final Set generalTabFeatures = new LinkedHashSet<>(Arrays.asList(TEXT_STYLE, WARNING_TIME, CHROMA_SPEED, CHROMA_MODE, - CHROMA_SIZE, TURN_ALL_FEATURES_CHROMA, CHROMA_SATURATION, CHROMA_BRIGHTNESS, USE_NEW_CHROMA_EFFECT, DEVELOPER_MODE)); + CHROMA_SIZE, TURN_ALL_FEATURES_CHROMA, CHROMA_SATURATION, CHROMA_BRIGHTNESS, USE_NEW_CHROMA_EFFECT, NUMBER_SEPARATORS, DEVELOPER_MODE)); private static final int ID_AT_PREVIOUS_UPDATE = 199; @@ -313,7 +324,7 @@ public enum Feature { } /** - * Called when a features enable state is changed. + * Called right after a feature's enable state is changed. */ public void onToggle() { if (this.id == DEVELOPER_MODE.id) { diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/Location.java b/src/main/java/codes/biscuit/skyblockaddons/core/Location.java index 53d3bbf3e..6d85ef10f 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/Location.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/Location.java @@ -13,6 +13,8 @@ public enum Location { // TODO: Jsonify all of these ISLAND("Your Island"), // TODO RPC GUEST_ISLAND("'s Island", "island"), // TODO RPC + GARDEN("The Garden"), + GARDEN_PLOT("Plot"), //TODO RPC // Hub AUCTION_HOUSE("Auction House"), @@ -113,11 +115,16 @@ public enum Location { OVERGROWN_MUSHROOM_CAVE("Overgrown Mushroom Cave"), JAKES_HOUSE("Jake's House"), SHEPHERDS_KEEP("Shepherds Keep"), - TRAPPERS_DEN("Trappers Den"), + TRAPPERS_DEN("Trapper's Den"), + // Spider's Den SPIDERS_DEN("Spider's Den"), - - BLAZING_FORTRESS("Blazing Fortress"), + SPIDER_MOUND("Spider Mound"), + ARACHNES_BURROW("Arachne's Burrow"), + ARACHNES_SANCTUARY("Arachnes's Sanctuary"), + GRANDMAS_HOUSE("Grandma's House"), + ARCHAEOLOGISTS_CAMP("Archaeologist's Camp"), + GRAVEL_MINES("Gravel Mines"), // The End THE_END("The End"), @@ -127,8 +134,18 @@ public enum Location { VOID_SLATE("Void Slate"), // Jerry's workshop + // TODO check is it correct JERRY_POND("Jerry Pond"), // TODO RPC JERRYS_WORKSHOP("Jerry's Workshop"), // TODO RPC + MOUNT_JERRY("Mount Jerry"), + GARYS_SHACK("Gary's Shack"), + GLACIAL_CAVE("Glacial Cave"), + TERRYS_SHACK("Terry's Shack"), + HOT_SPRINGS("Hot Springs"), + REFLECTIVE_POND("Reflective Pond"), + SUNKEN_JERRY_POND("Sunken Jerry Pond"), + SHERRYS_SHOWROOM("Sherry's Showroom"), + EINARYS_EMPORIUM("Einary's Emporium"), // Dungeons THE_CATACOMBS("The Catacombs"), // TODO RPC diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/SkyblockDate.java b/src/main/java/codes/biscuit/skyblockaddons/core/SkyblockDate.java index 36a2b6b46..5ba9b8454 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/SkyblockDate.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/SkyblockDate.java @@ -2,7 +2,6 @@ import codes.biscuit.skyblockaddons.utils.TextUtils; -import java.text.DecimalFormat; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -120,7 +119,7 @@ public String toString() { monthName, DAY + TextUtils.getOrdinalSuffix(DAY), HOUR, - TextUtils.NUMBER_FORMAT.format(MINUTE), + TextUtils.formatNumber(MINUTE), PERIOD); } } diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java b/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java index 91df723fe..d3805f229 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java @@ -9,7 +9,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.network.NetworkPlayerInfo; +import org.apache.logging.log4j.Logger; +import java.text.ParseException; import java.util.EnumMap; import java.util.HashMap; import java.util.List; @@ -22,13 +24,13 @@ * This class contains a set of utility methods for Skyblock Dungeons. */ public class DungeonManager { - - private static final Pattern PATTERN_MILESTONE = Pattern.compile("^.+?(Healer|Tank|Mage|Archer|Berserk) Milestone .+?([❶-❿]).+?§r§.(\\d+)§.§7 .+?"); + private static final Logger logger = SkyblockAddons.getLogger(); + private static final Pattern PATTERN_MILESTONE = Pattern.compile("^.+?(Healer|Tank|Mage|Archer|Berserk) Milestone .+?([❶-❿]).+?§r§.(\\d,.)§.§7 .+?"); private static final Pattern PATTERN_COLLECTED_ESSENCES = Pattern.compile("§.+?(\\d+) (Wither|Spider|Undead|Dragon|Gold|Diamond|Ice) Essence"); private static final Pattern PATTERN_BONUS_ESSENCE = Pattern.compile("^§.+?[^You] .+?found a .+?(Wither|Spider|Undead|Dragon|Gold|Diamond|Ice) Essence.+?"); private static final Pattern PATTERN_SALVAGE_ESSENCES = Pattern.compile("\\+(?[0-9]+) (?Wither|Spider|Undead|Dragon|Gold|Diamond|Ice) Essence!"); private static final Pattern PATTERN_SECRETS = Pattern.compile("§7([0-9]+)/([0-9]+) Secrets"); - private static final Pattern PATTERN_PLAYER_LINE = Pattern.compile("^§.\\[(?.)] (?[\\w§]+) (?:§.)*?§(?.)(?[\\w]+)(?:§c❤)?"); + private static final Pattern PATTERN_PLAYER_LINE = Pattern.compile("^§.\\[(?.)] (?[\\w§]+) (?:§.)*?§(?.)(?[\\w,]+)(?:§c❤)?"); private static final Pattern PLAYER_LIST_INFO_DEATHS_PATTERN = Pattern.compile("Deaths: \\((?\\d+)\\)"); /** The last dungeon server the player played on */ @@ -223,7 +225,12 @@ public void updateDungeonPlayer(String scoreboardLine) { if (healthText.equals("DEAD")) { health = 0; } else { - health = Integer.parseInt(healthText); + try { + health = TextUtils.NUMBER_FORMAT.parse(healthText).intValue(); + } catch (ParseException ex) { + logger.error("Failed to parse player "+ name + " health: " + healthText, ex); + return; + } } for (DungeonPlayer player: teammates.values()) { diff --git a/src/main/java/codes/biscuit/skyblockaddons/features/EntityOutlines/FeatureTrackerQuest.java b/src/main/java/codes/biscuit/skyblockaddons/features/EntityOutlines/FeatureTrackerQuest.java index 67ff79d56..8802ec2bd 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/features/EntityOutlines/FeatureTrackerQuest.java +++ b/src/main/java/codes/biscuit/skyblockaddons/features/EntityOutlines/FeatureTrackerQuest.java @@ -42,7 +42,7 @@ public class FeatureTrackerQuest { Location.SHEPHERDS_KEEP, Location.OVERGROWN_MUSHROOM_CAVE, Location.JAKES_HOUSE, Location.TREASURE_HUNTER_CAMP); private static final Pattern TRACKED_ANIMAL_NAME_PATTERN = Pattern.compile("\\[Lv[0-9]+] (?[a-zA-Z]+) (?[a-zA-Z]+) .*❤"); - private static final Pattern TREVOR_FIND_ANIMAL_PATTERN = Pattern.compile("\\[NPC] Trevor The Trapper: You can find your [A-Z]+ animal near the [a-zA-Z ]+."); + private static final Pattern TREVOR_FIND_ANIMAL_PATTERN = Pattern.compile("\\[NPC] Trevor: You can find your [A-Z]+ animal near the [a-zA-Z ]+."); private static final Pattern ANIMAL_DIED_PATTERN = Pattern.compile("Your mob died randomly, you are rewarded [0-9]+ pelts?."); private static final Pattern ANIMAL_KILLED_PATTERN = Pattern.compile("Killing the animal rewarded you [0-9]+ pelts?."); @@ -190,7 +190,7 @@ public void onNameTagRender(Pre e) { if (SkyblockAddons.getInstance().getConfigValues().isEnabled(Feature.TREVOR_THE_TRAPPER_FEATURES) && !e.isCanceled() && SkyblockAddons.getInstance().getConfigValues().isEnabled(Feature.TREVOR_SHOW_QUEST_COOLDOWN) && CooldownManager.isOnCooldown("TREVOR_THE_TRAPPER_RETURN")) { - Pattern p = Pattern.compile("Trevor The Trapper"); + Pattern p = Pattern.compile("Trevor"); String s = TextUtils.stripColor(entity.getCustomNameTag()); if (p.matcher(s).matches()) { String str = Utils.MESSAGE_PREFIX_SHORT + Translations.getMessage("messages.worldRenderedCooldownTime", diff --git a/src/main/java/codes/biscuit/skyblockaddons/features/discordrpc/DiscordStatus.java b/src/main/java/codes/biscuit/skyblockaddons/features/discordrpc/DiscordStatus.java index 840391cb8..f95ca0403 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/features/discordrpc/DiscordStatus.java +++ b/src/main/java/codes/biscuit/skyblockaddons/features/discordrpc/DiscordStatus.java @@ -36,9 +36,9 @@ public enum DiscordStatus implements ButtonSelect.SelectItem { String coinString = " Coin"; if (coins == 1) { - return TextUtils.formatDouble(coins) + coinString; + return TextUtils.formatNumber(coins) + coinString; } else { - return TextUtils.formatDouble(coins) + coinString + 's'; + return TextUtils.formatNumber(coins) + coinString + 's'; } }), @@ -48,9 +48,9 @@ public enum DiscordStatus implements ButtonSelect.SelectItem { String bitString = " Bit"; if (bits == 1) { - return TextUtils.formatDouble(bits) + bitString; + return TextUtils.formatNumber(bits) + bitString; } else { - return TextUtils.formatDouble(bits) + bitString + 's'; + return TextUtils.formatNumber(bits) + bitString + 's'; } }), @@ -107,6 +107,8 @@ public enum DiscordStatus implements ButtonSelect.SelectItem { if (slayerQuest == EnumUtils.SlayerQuest.REVENANT_HORROR) return DiscordStatus.valueOf("REVENANT").displayMessageSupplier.get(); if (slayerQuest == EnumUtils.SlayerQuest.SVEN_PACKMASTER) return DiscordStatus.valueOf("SVEN").displayMessageSupplier.get(); if (slayerQuest == EnumUtils.SlayerQuest.TARANTULA_BROODFATHER) return DiscordStatus.valueOf("TARANTULA").displayMessageSupplier.get(); + if (slayerQuest == EnumUtils.SlayerQuest.VOIDGLOOM_SERAPH) return DiscordStatus.valueOf("VOIDGLOOM").displayMessageSupplier.get(); + if (slayerQuest == EnumUtils.SlayerQuest.INFERNO_DEMONLORD) return DiscordStatus.valueOf("INFERNO").displayMessageSupplier.get(); } if ("AUTO_STATUS".equals(main.getConfigValues().getDiscordAutoDefault().name())) { // Avoid self reference. diff --git a/src/main/java/codes/biscuit/skyblockaddons/features/dungeonmap/DungeonMapManager.java b/src/main/java/codes/biscuit/skyblockaddons/features/dungeonmap/DungeonMapManager.java index bf6a574a5..255ab6ab7 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/features/dungeonmap/DungeonMapManager.java +++ b/src/main/java/codes/biscuit/skyblockaddons/features/dungeonmap/DungeonMapManager.java @@ -59,9 +59,9 @@ public class DungeonMapManager { /** The factor the player's coordinates are multiplied by to calculate their map marker coordinates */ private static final float COORDINATE_FACTOR = 1.33F; - /** {@link EntityPlayerSP#lastReportedPosX} */ + /** {@code EntityPlayerSP#lastReportedPosX} */ static final Field lastReportedPosX; - /** {@link EntityPlayerSP#lastReportedPosZ} */ + /** {@code EntityPlayerSP#lastReportedPosZ} */ static final Field lastReportedPosZ; private static MapData mapData; @@ -505,9 +505,9 @@ public static void decreaseZoomByStep() { } /** - * Returns the map zoom factor from {@link codes.biscuit.skyblockaddons.config.ConfigValues#mapZoom}. + * Returns the map zoom factor from {@code codes.biscuit.skyblockaddons.config.ConfigValues#mapZoom}. * - * @return the map zoom factor from {@link codes.biscuit.skyblockaddons.config.ConfigValues#mapZoom} + * @return the map zoom factor from {@code codes.biscuit.skyblockaddons.config.ConfigValues#mapZoom} */ public static float getMapZoom() { return main.getConfigValues().getMapZoom().getValue(); @@ -526,7 +526,7 @@ public static void setDenormalizedMapZoom(float value){ } /** - * Sets the map zoom factor in {@link codes.biscuit.skyblockaddons.config.ConfigValues#mapZoom}. + * Sets the map zoom factor in {@code codes.biscuit.skyblockaddons.config.ConfigValues#mapZoom}. * The new value must be between 0.5f and 5f inclusive. * * @param value the new map zoom factor diff --git a/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerBoss.java b/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerBoss.java index 315dfae07..6904180f2 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerBoss.java +++ b/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerBoss.java @@ -8,6 +8,7 @@ import java.util.Locale; import static codes.biscuit.skyblockaddons.features.slayertracker.SlayerDrop.*; +import static codes.biscuit.skyblockaddons.features.slayertracker.SlayerDrop.SUBZERO_INVERTER; public enum SlayerBoss { @@ -23,8 +24,12 @@ public enum SlayerBoss { VOIDGLOOM("Enderman", NULL_SPHERE, TWILIGHT_ARROW_POISON, ENDERSNAKE_RUNE, SUMMONING_EYE, MANA_STEAL_ONE, TRANSMISSION_TUNER, NULL_ATOM, HAZMAT_ENDERMAN, POCKET_ESPRESSO_MACHINE, SMARTY_PANTS_ONE, END_RUNE, HANDY_BLOOD_CHALICE, SINFUL_DICE, EXCEEDINGLY_RARE_ENDER_ARTIFACT_UPGRADER, VOID_CONQUEROR_ENDERMAN_SKIN, - ETHERWARP_MERGER, JUDGEMENT_CORE, ENCHANT_RUNE, ENDER_SLAYER_SEVEN); - + ETHERWARP_MERGER, JUDGEMENT_CORE, ENCHANT_RUNE, ENDER_SLAYER_SEVEN), + + INFERNO("Blaze", DERELICT_ASHE, LAVATEARS_RUNE, WISP_ICE_FLAVORED_WATER, BUNDLE_OF_MAGMA, MANA_DISINTEGRATOR, + SCORCHED_BOOKS, KELVIN_INVERTER, BLAZE_ROD_DISTILLATE, GLOWSTONE_DISTILLATE, MAGMA_CREAM_DISTILLATE, NETHER_WART_DISTILLATE, + GABAGOOL_DISTILLATE, SCORCHED_POWER_CRYSTAL, ARCHFIEND_DICE, FIRE_ASPECT, FIERY_BURST_RUNE, FLAWED_OPAL_GEMSTONE, + DUPLEX, HIGH_CLASS_ARCHFIEND_DICE, WILSON_ENGINEERING_PLANS, SUBZERO_INVERTER); @Getter private final List drops; diff --git a/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerDrop.java b/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerDrop.java index 981a720e9..e9c706f4a 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerDrop.java +++ b/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerDrop.java @@ -67,7 +67,30 @@ public enum SlayerDrop { ETHERWARP_MERGER("Etherwarp Merger", "ETHERWARP_MERGER", ItemRarity.EPIC, "209e7834-3376-36e1-84eb-da13ef083836", "3e5314f4919691ccbf807743dae47ae45ac2e3ff08f79eecdd452fe602eff7f6"), JUDGEMENT_CORE("Judgement Core", "JUDGEMENT_CORE", ItemRarity.LEGENDARY, "ed896594-8655-3212-933e-c67bca300084", "2f3ddd7f81089c85b26ed597675519f03a1dcd6d1713e0cfc66afb8743cbe0"), ENCHANT_RUNE("Enchant Rune", "RUNE", "ENCHANT", ItemRarity.LEGENDARY, "1a34ecd4-6a5f-35aa-b5d3-617be4684d9a", "59ffacec6ee5a23d9cb24a2fe9dc15b24488f5f71006924560bf12148421ae6d"), - ENDER_SLAYER_SEVEN("Enchanted Book", "ENCHANTED_BOOK", ItemRarity.RARE, "ender_slayer", 7); + ENDER_SLAYER_SEVEN("Enchanted Book", "ENCHANTED_BOOK", ItemRarity.RARE, "ender_slayer", 7), + + // Blaze Drops + DERELICT_ASHE(Items.gunpowder, "Derelict Ashe", "DERELICT_ASHE", ItemRarity.UNCOMMON, true), + LAVATEARS_RUNE("Lavatears Rune I", "RUNE", "LAVATEARS", ItemRarity.LEGENDARY, "9a960dcb-e362-3642-bf8e-510574a20cd7", "4f01ec6331a3bc30a8204ec56398d08ca38788556bca9b81d776f6238d567367"), + WISP_ICE_FLAVORED_WATER(Items.potionitem, "Wisp's Ice-Flavored Water I Splash Potion", "POTION", ItemRarity.COMMON), + BUNDLE_OF_MAGMA("Bundle of Magma Arrows", "ARROW_BUNDLE_MAGMA", ItemRarity.EPIC, "17c69624-a342-3d09-a976-d0c155aaafec", "68392651a1a4cbb5982b13ace0829a75b98c11e13b68868fe349aea24014ffbd"), + MANA_DISINTEGRATOR("Mana Disintegrator", "MANA_DISINTEGRATOR", ItemRarity.RARE, "b9d84e23-a8e5-3992-bace-b6f3b32e34d8", "818f83eb64f438e3f6ae3a5c2dea8ed10303bad85ac34a798659a275aa096506"), + SCORCHED_BOOKS("Scorched Books", "SCORCHED_BOOKS", ItemRarity.MYTHIC, "d15a5bd9-33f1-3336-9679-9d4887b84e9c", "46ee7e906686abd5ec192b079314c45f1fb8171d9e13caa4cf9f63afc2263fd5"), + KELVIN_INVERTER("Kelvin Inverter", "KELVIN_INVERTER", ItemRarity.RARE, "be00aa7f-9080-3862-8d7d-2c6e4cbfd7c8", "b247f2658aebbb2766046624da85ee04cd2b18a8252045d4260bd81d62c7b6d8"), + BLAZE_ROD_DISTILLATE("Blaze Rod Distillate", "BLAZE_ROD_DISTILLATE", ItemRarity.RARE, "8056c161-527f-3c65-87c7-6c6240874d2e", "41e813a3a380e3eb201c24b9661f6edb39bdf42a88989f81a90f771997d6f5cd"), + GLOWSTONE_DISTILLATE("Glowstone Distillate", "GLOWSTONE_DUST_DISTILLATE", ItemRarity.RARE, "2f04f258-da20-330c-a415-f03d3b8ffd91", "18a2be157f2380931d697f1169af4eac09cfddaa4e052b53d76ef1cfd19cdaf"), + MAGMA_CREAM_DISTILLATE("Magma Cream Distillate", "MAGMA_CREAM_DISTILLATE", ItemRarity.RARE, "c95d296c-9b74-3f50-b97e-2108f6f86e6a", "41e813a3a380e3eb201c24b9661f6edb39bdf42a88989f81a90f771997d6f5cd"), + NETHER_WART_DISTILLATE("Nether Wart Distillate", "NETHER_STALK_DISTILLATE", ItemRarity.RARE, "57e7938b-2d98-3ede-86fb-48ba0d3deb4e", "7aff47f07df632bdafbf0b4ab8f3227d1f94c89aefaa28c5a3463b4ca5bfe6c5"), + GABAGOOL_DISTILLATE("Gabagool Distillate", "CRUDE_GABAGOOL_DISTILLATE", ItemRarity.RARE, "e33f8341-3ece-364c-a26b-a1d3b460645f", "595231147189ac4b9f53487ce35ba0205bf377f3986c0e5ceb942e77f1c39cc"), + SCORCHED_POWER_CRYSTAL("Scorched Power Crystal", "SCORCHED_POWER_CRYSTAL", ItemRarity.LEGENDARY, "3c4d9142-a59b-4e72-8f48-5e48b1650163", "2cf0ccf5a5f97097262e773bbf65c4d7d9a39938015bf00de4918620f034f9b0"), + ARCHFIEND_DICE("Archfiend Dice", "ARCHFIEND_DICE", ItemRarity.EPIC, "9c3c19b2-84e6-3eb6-8aec-450e133a569a", "6e22c298e7c6336af17909ac1f1ee6834b58b1a3cc99aba255ca7eaeb476173"), + FIRE_ASPECT("Enchanted Book", "ENCHANTED_BOOK", ItemRarity.COMMON, "fire_aspect", 3), + FIERY_BURST_RUNE("Fiery Burst Rune I", "RUNE", "FIERY_BURST", ItemRarity.LEGENDARY, "983fd05e-d9e2-3dbc-9185-28e3138ccb34", "8d620e4e3d3abfed6ad81a58a56bcd085d9e9efc803cabb21fa6c9e3969e2d2e"), + FLAWED_OPAL_GEMSTONE("Flawed Opal Gemstone", "FLAWED_OPAL_GEM", ItemRarity.UNCOMMON, "f1fa016a-e25d-3e5b-90c5-b9928ecf14c4", "eadc3bcdd7c701b63f8b8b4a96e429316a08388669d9a98c1a98791729b961df"), + DUPLEX("Enchanted Book", "ENCHANTED_BOOK", ItemRarity.COMMON, "ultimate_reiterate", 1), + HIGH_CLASS_ARCHFIEND_DICE("High Class Archfiend Dice", "HIGH_CLASS_ARCHFIEND_DICE", ItemRarity.LEGENDARY, "9c3c19b2-84e6-3eb6-8aec-450e133a569a"/*change*/, "915f7c313bca9c2f958e68ab14ab393867d67503affff8f20cb13fbe917fd31"), + WILSON_ENGINEERING_PLANS(Items.paper, "Wilson's Engineering Plans", "WILSON_ENGINEERING_PLANS", ItemRarity.LEGENDARY, true), + SUBZERO_INVERTER("Subzero Inverter", "SUBZERO_INVERTER", ItemRarity.LEGENDARY, "5ab20327-b51e-36b3-b65a-a772bc225067", "1cf677ca6209961e81beeb3aa274e0ec8d21d36778e5a94b80b1d8425b04ac6e"); @Getter private final String skyblockID; @@ -185,6 +208,27 @@ public enum SlayerDrop { internalItemTranslations.put("judgementCore", "Judgement Core"); internalItemTranslations.put("enchantRune", "Enchant Rune"); internalItemTranslations.put("enderSlayerSeven", "Ender Slayer 7"); + internalItemTranslations.put("derelictAshe", "Derelict Ashe"); + internalItemTranslations.put("lavatearsRune", "Lavatears Rune"); + internalItemTranslations.put("wispIceFlavored", "Wisp's Ice-Flavored Water"); + internalItemTranslations.put("bundleOfMagmaArrows", "Bundle of Magma Arrows"); + internalItemTranslations.put("manaDisintegrator", "Mana Disintegrator"); + internalItemTranslations.put("scorchedBooks", "Scorched Books"); + internalItemTranslations.put("kelvinInverter", "Kelvin Inverter"); + internalItemTranslations.put("blazeRodDisillate", "Blaze Rod Distillate"); + internalItemTranslations.put("glowstoneDistillate", "Glowstone Distillate"); + internalItemTranslations.put("magmaCreamDistillate", "Magma Cream Distillate"); + internalItemTranslations.put("netherWartDistillate", "Nether Wart Distillate"); + internalItemTranslations.put("gabagoolDistillate", "Gabagool Distillate"); + internalItemTranslations.put("scorchedPowerCrystal", "Scorched Power Crystal"); + internalItemTranslations.put("archfiendDice", "Archfiend Dice"); + internalItemTranslations.put("fireAspect", "Fire Aspect 3"); + internalItemTranslations.put("fieryBurstRune", "Fiery Burst Rune"); + internalItemTranslations.put("flawedOpalGemstone", "Flawed Opal Gemstone"); + internalItemTranslations.put("duplex", "Duplex 1"); + internalItemTranslations.put("highClassArchfiendDice", "High Class Archfiend Dice"); + internalItemTranslations.put("wilsonEngineeringPlans", "Wilson's Engineering Plans"); + internalItemTranslations.put("subzeroInverter", "Subzero Inverter"); } public String getDisplayName() { diff --git a/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerTracker.java b/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerTracker.java index c0c0a016d..39d9f5d03 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerTracker.java +++ b/src/main/java/codes/biscuit/skyblockaddons/features/slayertracker/SlayerTracker.java @@ -43,7 +43,8 @@ public boolean isTrackerEnabled() { return main.getConfigValues().isEnabled(Feature.REVENANT_SLAYER_TRACKER) || main.getConfigValues().isEnabled(Feature.TARANTULA_SLAYER_TRACKER) || main.getConfigValues().isEnabled(Feature.SVEN_SLAYER_TRACKER) || - main.getConfigValues().isEnabled(Feature.VOIDGLOOM_SLAYER_TRACKER); + main.getConfigValues().isEnabled(Feature.VOIDGLOOM_SLAYER_TRACKER) || + main.getConfigValues().isEnabled(Feature.INFERNO_SLAYER_TRACKER); } /** diff --git a/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListParser.java b/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListParser.java index 4aaec7543..1c26da856 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListParser.java +++ b/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListParser.java @@ -284,4 +284,4 @@ public static void combineColumnsToRender(List columns, RenderC } } } -} +} \ No newline at end of file diff --git a/src/main/java/codes/biscuit/skyblockaddons/gui/IslandWarpGui.java b/src/main/java/codes/biscuit/skyblockaddons/gui/IslandWarpGui.java index 6366bd8ba..82eefd630 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/gui/IslandWarpGui.java +++ b/src/main/java/codes/biscuit/skyblockaddons/gui/IslandWarpGui.java @@ -307,6 +307,7 @@ public enum Island { THE_BARN("The Barn", 1125, 800), HUB("Hub", 300, 724), PRIVATE_ISLAND("Private Island", 275, 1122), + GARDEN("Garden", 50, 1000), DUNGEON_HUB("Dungeon Hub", 1500, 1050); private final String label; @@ -353,6 +354,8 @@ public enum Island { @Getter public enum Marker { PRIVATE_ISLAND("home", Translations.getMessage("warpMenu.home"), Island.PRIVATE_ISLAND, true, 72, 90), + + GARDEN("garden", Translations.getMessage("warpMenu.spawn"), Island.GARDEN, true, 160, 70), HUB("hub", Translations.getMessage("warpMenu.spawn"), Island.HUB, true, 600, 200), CASTLE("castle", "Castle", Island.HUB, 130, 80), @@ -381,6 +384,7 @@ public enum Marker { THE_BARN("barn", Translations.getMessage("warpMenu.spawn"), Island.THE_BARN, true, 140, 150), MUSHROOM_DESERT("desert", Translations.getMessage("warpMenu.spawn"), Island.MUSHROOM_DESERT, true, 210, 295), + TRAPPER("trapper", "Trapper's Hut", Island.MUSHROOM_DESERT, true, 300, 200), GOLD_MINE("gold", Translations.getMessage("warpMenu.spawn"), Island.GOLD_MINE, true, 86, 259), diff --git a/src/main/java/codes/biscuit/skyblockaddons/gui/SettingsGui.java b/src/main/java/codes/biscuit/skyblockaddons/gui/SettingsGui.java index 8f7dd1035..34fccd5ff 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/gui/SettingsGui.java +++ b/src/main/java/codes/biscuit/skyblockaddons/gui/SettingsGui.java @@ -416,6 +416,9 @@ public void sliderUpdated(float value) { } else if (feature == Feature.VOIDGLOOM_SLAYER_TRACKER) { settingFeature = Feature.ENDERMAN_COLOR_BY_RARITY; + } else if (feature == Feature.INFERNO_SLAYER_TRACKER) { + settingFeature = Feature.INFERNO_COLOR_BY_RARITY; + } else if (feature == Feature.DRAGON_STATS_TRACKER) { settingFeature = Feature.DRAGON_STATS_TRACKER_COLOR_BY_RARITY; } @@ -440,6 +443,9 @@ public void sliderUpdated(float value) { } else if (feature == Feature.VOIDGLOOM_SLAYER_TRACKER) { settingFeature = Feature.ENDERMAN_TEXT_MODE; + } else if (feature == Feature.INFERNO_SLAYER_TRACKER) { + settingFeature = Feature.INFERNO_TEXT_MODE; + } else if (feature == Feature.DRAGON_STATS_TRACKER_TEXT_MODE) { settingFeature = Feature.DRAGON_STATS_TRACKER_TEXT_MODE; } diff --git a/src/main/java/codes/biscuit/skyblockaddons/gui/buttons/ButtonSelect.java b/src/main/java/codes/biscuit/skyblockaddons/gui/buttons/ButtonSelect.java index d4544a8dd..22e4c0f7d 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/gui/buttons/ButtonSelect.java +++ b/src/main/java/codes/biscuit/skyblockaddons/gui/buttons/ButtonSelect.java @@ -1,6 +1,7 @@ package codes.biscuit.skyblockaddons.gui.buttons; import codes.biscuit.skyblockaddons.SkyblockAddons; +import codes.biscuit.skyblockaddons.core.Translations; import codes.biscuit.skyblockaddons.utils.ColorCode; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; @@ -93,12 +94,12 @@ public void drawButton(Minecraft minecraft, int mouseX, int mouseY) { int leftColor = SkyblockAddons.getInstance().getUtils().getDefaultColor(isOverLeftButton(mouseX, mouseY) ? 200 : 90); int rightColor = SkyblockAddons.getInstance().getUtils().getDefaultColor(isOverRightButton(mouseX, mouseY) ? 200 : 90); - String name = itemList.get(index).getName(); + String name = Translations.getMessage(itemList.get(index).getName()); String trimmedName = minecraft.fontRendererObj.trimStringToWidth(name, textWidth); if (!name.equals(trimmedName)) { trimmedName = ellipsize(trimmedName); } - String description = itemList.get(index).getDescription(); + String description = Translations.getMessage(itemList.get(index).getDescription()); // background / text area drawRect(xPosition, yPosition, endX, yPosition + height, color); // left button diff --git a/src/main/java/codes/biscuit/skyblockaddons/listeners/RenderListener.java b/src/main/java/codes/biscuit/skyblockaddons/listeners/RenderListener.java index 095215fc9..e09b39375 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/listeners/RenderListener.java +++ b/src/main/java/codes/biscuit/skyblockaddons/listeners/RenderListener.java @@ -43,6 +43,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityArmorStand; import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.monster.*; import net.minecraft.entity.monster.EntityCaveSpider; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.monster.EntitySpider; @@ -67,7 +68,7 @@ import java.awt.*; import java.math.BigDecimal; import java.math.RoundingMode; -import java.text.DecimalFormat; +import java.text.ParseException; import java.util.List; import java.util.*; @@ -117,6 +118,7 @@ public class RenderListener { private static EntityCaveSpider caveSpider; private static EntityWolf sven; private static EntityEnderman enderman; + private static EntityBlaze inferno; private final SkyblockAddons main = SkyblockAddons.getInstance(); @@ -314,7 +316,7 @@ private void renderWarnings(ScaledResolution scaledResolution) { break; case NO_ARROWS_LEFT_ALERT: if (arrowsLeft != -1) { - Translations.getMessage("messages.noArrowsLeft", TextUtils.NUMBER_FORMAT.format(arrowsLeft)); + Translations.getMessage("messages.noArrowsLeft", TextUtils.formatNumber(arrowsLeft)); } break; } @@ -673,22 +675,22 @@ public void drawText(Feature feature, float scale, Minecraft mc, ButtonLocation String text; int color = main.getConfigValues().getColor(feature); if (feature == Feature.MANA_TEXT) { - text = NUMBER_FORMAT.format(getAttribute(Attribute.MANA)) + "/" + NUMBER_FORMAT.format(getAttribute(Attribute.MAX_MANA)); + text = TextUtils.formatNumber(getAttribute(Attribute.MANA)) + "/" + TextUtils.formatNumber(getAttribute(Attribute.MAX_MANA)); } else if (feature == Feature.OVERFLOW_MANA) { if (getAttribute(Attribute.OVERFLOW_MANA) != 0 || buttonLocation != null) { - text = getAttribute(Attribute.OVERFLOW_MANA) + "ʬ"; + text = TextUtils.formatNumber(getAttribute(Attribute.OVERFLOW_MANA)) + "ʬ"; } else { return; } } else if (feature == Feature.HEALTH_TEXT) { - text = NUMBER_FORMAT.format(getAttribute(Attribute.HEALTH)) + "/" + NUMBER_FORMAT.format(getAttribute(Attribute.MAX_HEALTH)); + text = TextUtils.formatNumber(getAttribute(Attribute.HEALTH)) + "/" + TextUtils.formatNumber(getAttribute(Attribute.MAX_HEALTH)); } else if (feature == Feature.CRIMSON_ARMOR_ABILITY_STACKS) { text = getCrimsonArmorAbilityStacks(); if (text == null) return; } else if (feature == Feature.DEFENCE_TEXT) { - text = NUMBER_FORMAT.format(getAttribute(Attribute.DEFENCE)); + text = TextUtils.formatNumber(getAttribute(Attribute.DEFENCE)); } else if (feature == Feature.OTHER_DEFENCE_STATS) { text = main.getPlayerListener().getActionBarParser().getOtherDefense(); @@ -700,13 +702,13 @@ public void drawText(Feature feature, float scale, Minecraft mc, ButtonLocation } } else if (feature == Feature.EFFECTIVE_HEALTH_TEXT) { - text = NUMBER_FORMAT.format(Math.round(getAttribute(Attribute.HEALTH) * (1 + getAttribute(Attribute.DEFENCE) / 100F))); + text = TextUtils.formatNumber(Math.round(getAttribute(Attribute.HEALTH) * (1 + getAttribute(Attribute.DEFENCE) / 100F))); } else if (feature == Feature.DRILL_FUEL_TEXT) { if (!ItemUtils.isDrill(mc.thePlayer.getHeldItem())) { return; } - text = (getAttribute(Attribute.FUEL) + "/" + getAttribute(Attribute.MAX_FUEL)).replaceAll("000$", "k"); + text = TextUtils.formatNumber(getAttribute(Attribute.FUEL)) + "/" + TextUtils.formatNumber(getAttribute(Attribute.MAX_FUEL));//.replaceAll("000$", "k"); } else if (feature == Feature.DEFENCE_PERCENTAGE) { double doubleDefence = getAttribute(Attribute.DEFENCE); double percentage = ((doubleDefence / 100) / ((doubleDefence / 100) + 1)) * 100; //Taken from https://hypixel.net/threads/how-armor-works-and-the-diminishing-return-of-higher-defence.2178928/ @@ -714,7 +716,7 @@ public void drawText(Feature feature, float scale, Minecraft mc, ButtonLocation text = bigDecimal + "%"; } else if (feature == Feature.SPEED_PERCENTAGE) { - String walkSpeed = NUMBER_FORMAT.format(Minecraft.getMinecraft().thePlayer.capabilities.getWalkSpeed() * 1000); + String walkSpeed = TextUtils.formatNumber(Minecraft.getMinecraft().thePlayer.capabilities.getWalkSpeed() * 1000); text = walkSpeed.substring(0, Math.min(walkSpeed.length(), 3)); if (text.endsWith(".")) text = text.substring(0, text.indexOf('.')); //remove trailing periods @@ -726,7 +728,7 @@ public void drawText(Feature feature, float scale, Minecraft mc, ButtonLocation if (buttonLocation == null) { if (healthUpdate != null) { color = healthUpdate > 0 ? ColorCode.GREEN.getColor() : ColorCode.RED.getColor(); - text = (healthUpdate > 0 ? "+" : "-") + NUMBER_FORMAT.format(Math.abs(healthUpdate)); + text = (healthUpdate > 0 ? "+" : "-") + TextUtils.formatNumber(Math.abs(healthUpdate)); } else { return; } @@ -948,10 +950,10 @@ public void drawText(Feature feature, float scale, Minecraft mc, ButtonLocation text = Integer.toString(deaths); } else if (feature == Feature.ROCK_PET_TRACKER) { - text = String.valueOf(main.getPersistentValuesManager().getPersistentValues().getOresMined()); + text = TextUtils.formatNumber(main.getPersistentValuesManager().getPersistentValues().getOresMined()); } else if (feature == Feature.DOLPHIN_PET_TRACKER) { - text = String.valueOf(main.getPersistentValuesManager().getPersistentValues().getSeaCreaturesKilled()); + text = TextUtils.formatNumber(main.getPersistentValuesManager().getPersistentValues().getSeaCreaturesKilled()); } else if (feature == Feature.DUNGEONS_SECRETS_DISPLAY) { if (buttonLocation == null && !main.getUtils().isInDungeon()) { @@ -1179,10 +1181,15 @@ public void drawText(Feature feature, float scale, Minecraft mc, ButtonLocation renderItem(dungeonMilestone.getDungeonClass().getItem(), x, y); FontRendererHook.setupFeatureFont(feature); DrawUtils.drawText(text, x + 18, y, color); - double amount = Double.parseDouble(dungeonMilestone.getValue()); - DecimalFormat formatter = new DecimalFormat("#,###"); - DrawUtils.drawText(formatter.format(amount), x + 18 + mc.fontRendererObj.getStringWidth(text) / 2F - - mc.fontRendererObj.getStringWidth(formatter.format(amount)) / 2F, y + 9, color); + Number amount; + try { + amount = NUMBER_FORMAT.parse(dungeonMilestone.getValue()); + } catch (ParseException e) { + amount = -1; + } + String formattedAmount = TextUtils.formatNumber(amount); + DrawUtils.drawText(formattedAmount, x + 18 + mc.fontRendererObj.getStringWidth(text) / 2F + - mc.fontRendererObj.getStringWidth(formattedAmount) / 2F, y + 9, color); FontRendererHook.endFeatureFont(); } else if (feature == Feature.DUNGEONS_COLLECTED_ESSENCES_DISPLAY) { @@ -1525,7 +1532,7 @@ public void drawSlayerTrackers(Feature feature, Minecraft mc, float scale, Butto slayerBoss = SlayerBoss.REVENANT; } else if (feature == Feature.TARANTULA_SLAYER_TRACKER) { if (buttonLocation == null && config.isEnabled(Feature.HIDE_WHEN_NOT_IN_SPIDERS_DEN) && - (quest != EnumUtils.SlayerQuest.TARANTULA_BROODFATHER || location != Location.SPIDERS_DEN)) { + (quest != EnumUtils.SlayerQuest.TARANTULA_BROODFATHER || (location != Location.SPIDER_MOUND && location != Location.ARACHNES_BURROW && location != Location.ARACHNES_SANCTUARY))) { return; } @@ -1550,6 +1557,15 @@ public void drawSlayerTrackers(Feature feature, Minecraft mc, float scale, Butto colorByRarity = config.isEnabled(Feature.ENDERMAN_COLOR_BY_RARITY); textMode = config.isEnabled(Feature.ENDERMAN_TEXT_MODE); slayerBoss = SlayerBoss.VOIDGLOOM; + } else if (feature == Feature.INFERNO_SLAYER_TRACKER) { + if (buttonLocation == null && config.isEnabled(Feature.HIDE_WHEN_NOT_IN_CRIMSON) && + (quest != EnumUtils.SlayerQuest.INFERNO_DEMONLORD || (location != Location.CRIMSON_ISLE && location != Location.STRONGHOLD && location != Location.SMOLDERING_TOMB && location != Location.THE_WASTELAND))) { + return; + } + + colorByRarity = config.isEnabled(Feature.INFERNO_COLOR_BY_RARITY); + textMode = config.isEnabled(Feature.INFERNO_TEXT_MODE); + slayerBoss = SlayerBoss.INFERNO; } else { return; } @@ -1636,6 +1652,9 @@ public void drawSlayerTrackers(Feature feature, Minecraft mc, float scale, Butto } else if (feature == Feature.VOIDGLOOM_SLAYER_TRACKER) { entityRenderY = 25; textCenterX = 20; + } else if (feature == Feature.INFERNO_SLAYER_TRACKER) { + entityRenderY = 25; + textCenterX = 20; } else { entityRenderY = 36; textCenterX = 15; @@ -1717,6 +1736,16 @@ public void drawSlayerTrackers(Feature feature, Minecraft mc, float scale, Butto drawEntity(enderman, (x + 15) / .7F, (y + 51) / .7F, -30); GlStateManager.scale(1 / .7, 1 / .7, 1); + } else if (feature == Feature.INFERNO_SLAYER_TRACKER) { + if (inferno == null) { + inferno = new EntityBlaze(Utils.getDummyWorld()); + inferno.setOnFire(true); + + } + GlStateManager.color(1, 1, 1, 1); + inferno.ticksExisted = (int) main.getNewScheduler().getTotalTicks(); + drawEntity(inferno, x + 15, y + 53, -15); + } else { if (sven == null) { sven = new EntityWolf(Utils.getDummyWorld()); @@ -2234,18 +2263,18 @@ private void drawDetailedPowerOrbStatus(Minecraft mc, float scale, ButtonLocatio double healIncrease = powerOrb.getHealIncrease() * 100; List display = new LinkedList<>(); - display.add(String.format("§c+%s ❤/s", TextUtils.formatDouble(healthRegen))); + display.add(String.format("§c+%s ❤/s", TextUtils.formatNumber(healthRegen))); if (powerOrb.getManaRegen() > 0) { float maxMana = main.getUtils().getAttributes().get(Attribute.MAX_MANA).getValue(); float manaRegen = (float) Math.floor(maxMana / 50); manaRegen = (float) (manaRegen + manaRegen * powerOrb.getManaRegen()); - display.add(String.format("§b+%s ✎/s", TextUtils.formatDouble(manaRegen))); + display.add(String.format("§b+%s ✎/s", TextUtils.formatNumber(manaRegen))); } if (powerOrb.getStrength() > 0) { display.add(String.format("§4+%d ❁", powerOrb.getStrength())); } if (healIncrease > 0) { - display.add(String.format("§2+%s%% Healing", TextUtils.formatDouble(healIncrease))); + display.add(String.format("§2+%s%% Healing", TextUtils.formatNumber(healIncrease))); } Optional longestLine = display.stream().max(Comparator.comparingInt(String::length)); diff --git a/src/main/java/codes/biscuit/skyblockaddons/utils/ActionBarParser.java b/src/main/java/codes/biscuit/skyblockaddons/utils/ActionBarParser.java index 7e5175eb5..094d3c63d 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/utils/ActionBarParser.java +++ b/src/main/java/codes/biscuit/skyblockaddons/utils/ActionBarParser.java @@ -51,7 +51,7 @@ public class ActionBarParser { private static final Pattern COLLECTIONS_CHAT_PATTERN = Pattern.compile("\\+(?[0-9,.]+) (?[A-Za-z]+) (?\\((((?[0-9.,kM]+)/(?[0-9.,kM]+))|((?[0-9.,]+)%))\\))"); - private static final Pattern SKILL_GAIN_PATTERN_S = Pattern.compile("\\+(?[0-9,.]+) (?[A-Za-z]+) (?\\((((?[0-9.,]+)/(?[0-9.,]+))|((?[0-9.]+)%))\\))"); + private static final Pattern SKILL_GAIN_PATTERN_S = Pattern.compile("\\+(?[0-9,.]+) (?[A-Za-z]+) (?\\((((?[0-9.,]+)/(?[0-9.,]+))|((?[0-9.,]+)%))\\))"); private static final Pattern MANA_PATTERN_S = Pattern.compile("(?[0-9,.]+)/(?[0-9,.]+)✎(| Mana| (?-?[0-9,.]+)ʬ)"); private static final Pattern DEFENSE_PATTERN_S = Pattern.compile("(?[0-9,.]+)❈ Defense(?( (?\\|\\|\\|))?( {2}(?T[0-9,.]+!?))?.*)?"); private static final Pattern HEALTH_PATTERN_S =Pattern.compile("(?[0-9,.]+)/(?[0-9,.]+)❤(?\\+(?[0-9,.]+)[▆▅▄▃▂▁])?"); @@ -259,22 +259,25 @@ private String parseCrimsonArmorAbilityStack(String section) { private String parseHealth(String healthSection) { // Normal: §c1390/1390❤ // With Wand: §c1390/1390❤+§c30▅ - final boolean separateDisplay = main.getConfigValues().isEnabled(Feature.HEALTH_BAR) || main.getConfigValues().isEnabled(Feature.HEALTH_TEXT); + final boolean separateDisplay = main.getConfigValues().isEnabled(Feature.HEALTH_BAR) + || main.getConfigValues().isEnabled(Feature.HEALTH_TEXT); String returnString = healthSection; float newHealth; float maxHealth; String stripped = TextUtils.stripColor(healthSection); Matcher m = HEALTH_PATTERN_S.matcher(stripped); - if (separateDisplay && m.matches()) { + if ((main.getConfigValues().isEnabled(Feature.EFFECTIVE_HEALTH_TEXT) || separateDisplay) && m.matches()) { newHealth = parseFloat(m.group("health")); maxHealth = parseFloat(m.group("maxHealth")); - if (m.group("wand") != null) { - // Jank way of doing this for now - returnString = "";// "§c"+ m.group("wand"); - stringsToRemove.add(stripped.substring(0, m.start("wand"))); - } else { - stringsToRemove.add(healthSection); - returnString = ""; + if (separateDisplay) { + if (m.group("wand") != null) { + // Jank way of doing this for now + returnString = "";// "§c"+ m.group("wand"); + stringsToRemove.add(stripped.substring(0, m.start("wand"))); + } else { + stringsToRemove.add(healthSection); + returnString = ""; + } } healthLock = false; boolean postSetLock = main.getUtils().getAttributes().get(Attribute.MAX_HEALTH).getValue() != maxHealth || diff --git a/src/main/java/codes/biscuit/skyblockaddons/utils/EnumUtils.java b/src/main/java/codes/biscuit/skyblockaddons/utils/EnumUtils.java index 600c960c0..1fc0e17a7 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/utils/EnumUtils.java +++ b/src/main/java/codes/biscuit/skyblockaddons/utils/EnumUtils.java @@ -215,6 +215,7 @@ public enum FeatureSetting { CHANGE_DUNGEON_MAP_ZOOM_WITH_KEYBOARD("settings.changeDungeonMapZoomWithKeyboard", 215), SHOW_PROFILE_TYPE( "settings.showProfileType", 219), SHOW_NETHER_FACTION("settings.showNetherFaction", 220), + HIDE_WHEN_NOT_IN_CRIMSON("settings.hideWhenNotDoingQuest", 222), ZEALOT_SPAWN_AREAS_ONLY("settings.zealotSpawnAreasOnly", -1), DISCORD_RP_STATE(0), @@ -294,7 +295,8 @@ public enum FeatureCredit { TIMOLOB("TimoLob", "github.com/TimoLob", Feature.BROOD_MOTHER_ALERT), NOPOTHEGAMER("NopoTheGamer", "twitch.tv/nopothegamer", Feature.BAL_BOSS_ALERT), CATFACE("CatFace","github.com/CattoFace",Feature.PLAYER_SYMBOLS_IN_CHAT), - HANNIBAL2("Hannibal2", "github.com/hannibal00212", Feature.CRIMSON_ARMOR_ABILITY_STACKS, Feature.HIDE_TRUE_DEFENSE); + HANNIBAL2("Hannibal2", "github.com/hannibal00212", Feature.CRIMSON_ARMOR_ABILITY_STACKS, Feature.HIDE_TRUE_DEFENSE), + JASON54("jason54jg", "github.com/jason54jg", Feature.INFERNO_SLAYER_TRACKER, Feature.INFERNO_COLOR_BY_RARITY, Feature.INFERNO_TEXT_MODE); private final Set features; private final String author; diff --git a/src/main/java/codes/biscuit/skyblockaddons/utils/ItemUtils.java b/src/main/java/codes/biscuit/skyblockaddons/utils/ItemUtils.java index 5d517a316..8878ad0b1 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/utils/ItemUtils.java +++ b/src/main/java/codes/biscuit/skyblockaddons/utils/ItemUtils.java @@ -42,9 +42,7 @@ public class ItemUtils { * This expression matches the line with a Skyblock item's rarity and item type that's at the end of its lore. */ private static final Pattern ITEM_TYPE_AND_RARITY_PATTERN = Pattern.compile("§l(?[A-Z]+) ?(?[A-Z ]+)?(?:§[0-9a-f]§l§ka)?$"); - @SuppressWarnings({"FieldMayBeFinal", "MismatchedQueryAndUpdateOfCollection"}) @Setter private static Map compactorItems; - @SuppressWarnings({"FieldMayBeFinal", "MismatchedQueryAndUpdateOfCollection"}) @Setter private static Map containers; diff --git a/src/main/java/codes/biscuit/skyblockaddons/utils/TextUtils.java b/src/main/java/codes/biscuit/skyblockaddons/utils/TextUtils.java index a75a28747..0f3be7377 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/utils/TextUtils.java +++ b/src/main/java/codes/biscuit/skyblockaddons/utils/TextUtils.java @@ -1,6 +1,7 @@ package codes.biscuit.skyblockaddons.utils; import codes.biscuit.skyblockaddons.SkyblockAddons; +import codes.biscuit.skyblockaddons.core.Feature; import com.google.gson.JsonObject; import net.minecraft.util.IChatComponent; @@ -21,7 +22,11 @@ public class TextUtils { * Hypixel uses US number format. */ public static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance(Locale.US); - + /** + * Number format with thousands separators disabled, used for displaying numbers in Hypixel's old (no separators) + * style + */ + public static final NumberFormat NUMBER_FORMAT_NO_GROUPING = NumberFormat.getInstance(Locale.US); private static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)§[0-9A-FK-ORZ]"); private static final Pattern STRIP_ICONS_PATTERN = Pattern.compile("[♲Ⓑ⚒ቾ]+"); private static final Pattern STRIP_PREFIX_PATTERN = Pattern.compile("\\[[^\\[\\]]*\\]"); @@ -41,17 +46,26 @@ public class TextUtils { suffixes.put(1_000_000, "M"); suffixes.put(1_000_000_000, "B"); NUMBER_FORMAT.setMaximumFractionDigits(2); + NUMBER_FORMAT_NO_GROUPING.setMaximumFractionDigits(2); + NUMBER_FORMAT_NO_GROUPING.setGroupingUsed(false); } /** - * Formats a double number to look better with commas every 3 digits and up to two decimal places. + * Formats a number to look better with commas every 3 digits (if the {@code NUMBER_SEPARATORS} mod feature is enabled) + * and up to two decimal places. * For example: {@code 1,006,789.5} * * @param number Number to format * @return Formatted string */ - public static String formatDouble(double number) { - return NUMBER_FORMAT.format(number); + public static String formatNumber(Number number) { + // This null check is here for TextUtilsTests + if (SkyblockAddons.getInstance() == null || + SkyblockAddons.getInstance().getConfigValues().isEnabled(Feature.NUMBER_SEPARATORS)) { + return NUMBER_FORMAT.format(number); + } else { + return NUMBER_FORMAT_NO_GROUPING.format(number); + } } /** @@ -177,7 +191,7 @@ public static String convertMagnitudes(String text) throws ParseException { parsedDouble *= 1_000_000_000_000L; } - matcher.appendReplacement(sb, NUMBER_FORMAT.format(parsedDouble)); + matcher.appendReplacement(sb, TextUtils.formatNumber(parsedDouble)); } matcher.appendTail(sb); diff --git a/src/main/java/codes/biscuit/skyblockaddons/utils/Utils.java b/src/main/java/codes/biscuit/skyblockaddons/utils/Utils.java index 6646dc7b6..b33f29fbd 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/utils/Utils.java +++ b/src/main/java/codes/biscuit/skyblockaddons/utils/Utils.java @@ -89,7 +89,7 @@ public class Utils { /** * Matches the active slayer quest type line on the Skyblock scoreboard */ - private static final Pattern SLAYER_TYPE_REGEX = Pattern.compile("(?Tarantula Broodfather|Revenant Horror|Sven Packmaster|Voidgloom Seraph) (?[IV]+)"); + private static final Pattern SLAYER_TYPE_REGEX = Pattern.compile("(?Tarantula Broodfather|Revenant Horror|Sven Packmaster|Voidgloom Seraph|Inferno Demonlord) (?[IV]+)"); /** * Matches the active slayer quest progress line on the Skyblock scoreboard */ @@ -139,6 +139,11 @@ public class Utils { */ @Getter private Location location = Location.UNKNOWN; + /** + * Custom garden plot name + */ + @Getter private String customPlotName = ""; + /** * The skyblock profile that the player is currently on. Ex. "Grapefruit" */ @@ -281,7 +286,6 @@ public void parseSidebar() { String strippedScoreboardLine = ScoreboardManager.getStrippedScoreboardLines().get(lineNumber); Matcher matcher; - //noinspection RedundantSuppression switch (lineNumber) { case 0: // Server ID @@ -325,6 +329,11 @@ public void parseSidebar() { location = loopLocation; foundLocation = true; break; + } else if (loopLocation == Location.GARDEN_PLOT && strippedScoreboardLine.contains("Plot:")) { + // TODO RPC + location = Location.GARDEN; + foundLocation = true; + break; } } } @@ -499,9 +508,6 @@ private void parseSlayerProgress(String line) { } } - private void onCoinsChange(double coinsChange) { - } - public int getDefaultColor(float alphaFloat) { int alpha = (int) alphaFloat; return new Color(150, 236, 255, alpha).getRGB(); @@ -793,10 +799,6 @@ private void parseCoins(String strippedScoreboardLine) { try { double oldCoins = purse; purse = TextUtils.NUMBER_FORMAT.parse(matcher.group("coins")).doubleValue(); - - if (oldCoins != purse) { - onCoinsChange(purse - oldCoins); - } } catch (NumberFormatException | ParseException e) { purse = 0; } diff --git a/src/main/java/codes/biscuit/skyblockaddons/utils/data/DataConstants.java b/src/main/java/codes/biscuit/skyblockaddons/utils/data/DataConstants.java index c4aa0cbf9..b747ab547 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/utils/data/DataConstants.java +++ b/src/main/java/codes/biscuit/skyblockaddons/utils/data/DataConstants.java @@ -1,7 +1,7 @@ package codes.biscuit.skyblockaddons.utils.data; class DataConstants { - static final String CDN_BASE_URL = "https://cdn.jsdelivr.net/gh/BiscuitDevelopment/SkyblockAddons-Data@%s/"; - static final String FALLBACK_CDN_BASE_URL = "https://fastly.jsdelivr.net/gh/BiscuitDevelopment/SkyblockAddons-Data@%s/"; + static final String CDN_BASE_URL = "https://cdn.jsdelivr.net/gh/Fix3dll/SkyblockAddons-Data@%s/"; + static final String FALLBACK_CDN_BASE_URL = "https://fastly.jsdelivr.net/gh/Fix3dll/SkyblockAddons-Data@%s/"; static final String GITHUB_BASE_URL = "https://raw.githubusercontent.com/BiscuitDevelopment/SkyblockAddons-Data/main/"; } diff --git a/src/main/java/codes/biscuit/skyblockaddons/utils/data/DataUtils.java b/src/main/java/codes/biscuit/skyblockaddons/utils/data/DataUtils.java index 360c31c9b..89807648a 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/utils/data/DataUtils.java +++ b/src/main/java/codes/biscuit/skyblockaddons/utils/data/DataUtils.java @@ -409,6 +409,7 @@ private static void registerRemoteRequests() { if (SkyblockAddons.getInstance().getConfigValues().getLanguage() != Language.ENGLISH) { remoteRequests.add(new LocalizedStringsRequest(SkyblockAddons.getInstance().getConfigValues().getLanguage())); } + // TODO fork and update data repo remoteRequests.add(new EnchantedItemListsRequest()); remoteRequests.add(new ContainersRequest()); remoteRequests.add(new CompactorItemsRequest()); diff --git a/src/main/java/codes/biscuit/skyblockaddons/utils/data/RemoteFileRequest.java b/src/main/java/codes/biscuit/skyblockaddons/utils/data/RemoteFileRequest.java index 71ae880b3..89b69bc5f 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/utils/data/RemoteFileRequest.java +++ b/src/main/java/codes/biscuit/skyblockaddons/utils/data/RemoteFileRequest.java @@ -69,6 +69,8 @@ protected boolean isDone() { private static String getVersionedCDNBaseURL() { return String.format(DataUtils.useFallbackCDN ? DataConstants.FALLBACK_CDN_BASE_URL : DataConstants.CDN_BASE_URL, - SkyblockAddons.VERSION.substring(0, StringUtils.ordinalIndexOf(SkyblockAddons.VERSION, ".", 2))); + //SkyblockAddons.VERSION.substring(0, StringUtils.ordinalIndexOf(SkyblockAddons.VERSION, ".", 2)) + "main" + ); } } diff --git a/src/main/resources/assets/skyblockaddons/islands/garden.png b/src/main/resources/assets/skyblockaddons/islands/garden.png new file mode 100644 index 0000000000000000000000000000000000000000..32327fc28450f21170b04bdc0b002a7174b23bed GIT binary patch literal 34974 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 Date: Sat, 29 Apr 2023 14:16:18 +0300 Subject: [PATCH 02/22] add crimson essence --- .../biscuit/skyblockaddons/core/EssenceType.java | 3 ++- .../core/dungeons/DungeonManager.java | 4 ++-- .../assets/skyblockaddons/essences/crimson.png | Bin 0 -> 3636 bytes 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/skyblockaddons/essences/crimson.png diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/EssenceType.java b/src/main/java/codes/biscuit/skyblockaddons/core/EssenceType.java index 1a5b54ca5..25a73c6e4 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/EssenceType.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/EssenceType.java @@ -14,7 +14,8 @@ public enum EssenceType { DRAGON, GOLD, DIAMOND, - ICE; + ICE, + CRIMSON; private String niceName; @Getter private ResourceLocation resourceLocation; diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java b/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java index d3805f229..8bd8eeb0c 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java @@ -27,8 +27,8 @@ public class DungeonManager { private static final Logger logger = SkyblockAddons.getLogger(); private static final Pattern PATTERN_MILESTONE = Pattern.compile("^.+?(Healer|Tank|Mage|Archer|Berserk) Milestone .+?([❶-❿]).+?§r§.(\\d,.)§.§7 .+?"); private static final Pattern PATTERN_COLLECTED_ESSENCES = Pattern.compile("§.+?(\\d+) (Wither|Spider|Undead|Dragon|Gold|Diamond|Ice) Essence"); - private static final Pattern PATTERN_BONUS_ESSENCE = Pattern.compile("^§.+?[^You] .+?found a .+?(Wither|Spider|Undead|Dragon|Gold|Diamond|Ice) Essence.+?"); - private static final Pattern PATTERN_SALVAGE_ESSENCES = Pattern.compile("\\+(?[0-9]+) (?Wither|Spider|Undead|Dragon|Gold|Diamond|Ice) Essence!"); + private static final Pattern PATTERN_BONUS_ESSENCE = Pattern.compile("^§.+?[^You] .+?found a .+?(Wither|Spider|Undead|Dragon|Gold|Diamond|Ice|Crimson) Essence.+?"); + private static final Pattern PATTERN_SALVAGE_ESSENCES = Pattern.compile("\\+(?[0-9]+) (?Wither|Spider|Undead|Dragon|Gold|Diamond|Ice|Crimson) Essence!"); private static final Pattern PATTERN_SECRETS = Pattern.compile("§7([0-9]+)/([0-9]+) Secrets"); private static final Pattern PATTERN_PLAYER_LINE = Pattern.compile("^§.\\[(?.)] (?[\\w§]+) (?:§.)*?§(?.)(?[\\w,]+)(?:§c❤)?"); private static final Pattern PLAYER_LIST_INFO_DEATHS_PATTERN = Pattern.compile("Deaths: \\((?\\d+)\\)"); diff --git a/src/main/resources/assets/skyblockaddons/essences/crimson.png b/src/main/resources/assets/skyblockaddons/essences/crimson.png new file mode 100644 index 0000000000000000000000000000000000000000..0d22de7b8a1c21ac65b54aeb52a4ac1eba572562 GIT binary patch literal 3636 zcmV-44$JY0P)cP#geC9so%j07V=CMjHS} z8302Y07M!9LKy}|7XU&R06rK5F&Ypi9U3_m13VM}HWdjt6b3gF0525;FAxAM5dbR? z1S}8$A`%NQ4FDb!5GfD>FAV@46A&p503r|vD+~Z64F)O;03!_sDGLA@5Dgd*4I>N$ z9t{c}4F)I)03`_k9}5H{2>=%j3Lgpt7z_s*3j`Gm3Lyso9|!;w37o}f=d!VfLFcfogcvT z8#M8InfxzJFEmk-qOnAqK+eGm9$u=v96_+z-Pzfh=Vjh@wzcO1IKy)G$DEmYo|)Y} zn~C-wOG`^FzIxW8yZZ9qk}Gm+_N-lZi}tK-cWd_a@;i5k!rQk$d3o->as?DlO|@Xp zTB&ctp1WJ9_pGIMqU@DBxjk#GeHV7!o!FjAevjyvS1wKwef8ESCBJtMcS~_}Bt}PJ z;r_n3b?cLn-@AvqW$w-&rhR|E_?E<;rE;5g={D`soyeZ0bJupwUE4Kx5_^`?UD|=W zv;%hndzRKM#M;`qbEvT2pO`>}6BCWb$Sk!x{|fB=ehCHchU0sd-VN-f8`$d~qwQH6 zZp~i1HLzLzk@l<|x3rsXiN;Mn${sGieR~-fb~=N&@JNi}!qHixaQMd`TbCErv%C!5 zLWsdZ6#NAW|HX4yI6N$b2)1Y8ZUO9tTL8Nn)ODu%SuZTyBHW(ExOKa7>vkg;RZOF* zt0&4GY|rA{mECYxb`(T&CQ2Lg0>d3>_m$tdbKY~y-Cd&aJoVQ%Z{o6{pMFXzFXlUN z@A;1B=D?P{p1@;aKDMKr;Mz4IzWWZihlCKG_RQA}Yp$v=!=AfQ{He@_J$L61-Cnqb zuRZg3>vsK(R`$wm*mbY^xpM1v<@U5^A@0f!8)#wI-O3KzNby{ES9ZhgWw*#<@#7 zaF=#s%egt+FK1_oZg6@E+@+mJjbFVY3N?EzUsyofUA;>5w%J)68O8oSMv5LW^b8J; zjiJJk5!`{r))rB1moJm81=z1%C3;)=6xhr92KFKY0~?lOBe0K*;0`Rdwuq*xxnU30 z?4=vn>mM~z-A**S${e)~>oHxkmu_G$-N0_R@u(>6wOa$5)h|hA`<8YiUPF$n^{zLqpGVX#t2w3m0K%RZryHl zgvxFdR(95HpUvfV*hGo~6m@c@;g*GlyRxGWoZC@hZnwByGwA7yzH4Q8rCf-Go5a#I z5&VfozG7)(vC*oDUK91p!$V?H{{8o!ZgOn#w992(!=AhIhheW?&#=qE(X}#EZP@jCPF-X;d0AASgSJEFg*UA7a`e&YtQ-Xili z(;nq^<}FmG26nA|*LLYP?ONVh+gbPMsBhj9X9xYV+@0pG?I2$+?a^*s{$+%{+a-1h z+@*bcn+UcM?lY>+zYMpZouQ(GgU64F{Cfr`57Z%Om-~!qEzRu*2l-cEFVjk3Z|Fwt zoVQcQ65;EWZeXuddCktc(K!t4`-^&LyuEg7c60h9?FroE*b-+q-O`TdmoqbI+{~!B zx*Bf3MC1v(#1hzixSKdS#*gO_c6b!I$jx8|K0lwxZHYt{`>}^z<-@w2b-xdGTVp71 zKX%!TIY?#a-S5NQj_4n0NAteip4jcoTi}e{$4-Ux|Ao67XIv5X&p-DaXXD+v93RSd z+oyf(ta~8btxW{=I*+hVJMFxCpotr{mgM%<+_;^y_75Mz?GbL`&@t(zdT2^}dv1Dc z+32-tk8rOadXI{|a62*S35zbgdp&48Z^xd_ZHq*_y&Gxg-NV6ddkkgm-59&YJsj?K zMgQJ$Dtm+tW?;(4_X(+*qD3iZ5@pX^(Ip ztoTHtVnKf++>TFS4vWhc_knK=ZPA|2ZHq*_{o}_tJL}G}V7EPnrnRSayQ2Tbqg3_? z_pb+D>n&Uc@hIH>rw%$iOzpOeEe-7GK+nU6$=%jb z@#Ms5-}kYz?lq@7`Z^1@-F=2M?_OiQ9&Rb$Y|S3y9&)-nb)9cU+2zp--hSe6|M@5T zUfJ9oqqS_dQtzSl?eEsxIdvgqWgkjxx4XaKcc&ed*L$eNKIF7h3utlfFMQl^Z1J%3 z|3f3Y_2de|jYmaGqgM8{Wy0?Znhhejtp+&0l9hyZPvEv&-)+9ol)fcxNu`_`7vE{CtL!sRl!ZX1BQA5BR|v z&!3ZZ4((G3?D&I&Lfq4=8@86z_V(QFRSTQlna^}x8*KW!!}4>N-JOfs-J9`lzm*~n zd&K|H%l2%t41lt!|GLCS-Lkt=;0DJo9`FDBt@B>^Ao#`>Q9eI^T=3S7&K> z*eyG-xu1BnmN>g(6=pB7n`!4ZySq|}(~ql<6tTSU+b}oVLoK`L2itwzZv)+yu_c+k z9k+E<?e@%DcK%9lN0&gW`sw}uvCj*5W?X+Iw)2;6TdtOf z%N3K_6S#xU`m@=O1Ke*?xC75uwAkyQc}$&9@>~s}{WnS6!S{snvZIq>>RG!b2!y#K z?!#qS@nP&VeUCq{Rl?rhbC0d!+zsxl7`MWi%-!f- zmLE>z{!UwW+Fgm?eWUw_o<`WSDKuO97v$k~E&p!jPH>;x5WDt)G)>(}?oI4#&)xD& z+ve^>_k;GaSM@zUp2VH(9^BgXonKLB0S(pdh0000 Date: Sat, 29 Apr 2023 14:17:25 +0300 Subject: [PATCH 03/22] add crimson essence to collected essences --- .../biscuit/skyblockaddons/core/dungeons/DungeonManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java b/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java index 8bd8eeb0c..ea7090307 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java @@ -26,7 +26,7 @@ public class DungeonManager { private static final Logger logger = SkyblockAddons.getLogger(); private static final Pattern PATTERN_MILESTONE = Pattern.compile("^.+?(Healer|Tank|Mage|Archer|Berserk) Milestone .+?([❶-❿]).+?§r§.(\\d,.)§.§7 .+?"); - private static final Pattern PATTERN_COLLECTED_ESSENCES = Pattern.compile("§.+?(\\d+) (Wither|Spider|Undead|Dragon|Gold|Diamond|Ice) Essence"); + private static final Pattern PATTERN_COLLECTED_ESSENCES = Pattern.compile("§.+?(\\d+) (Wither|Spider|Undead|Dragon|Gold|Diamond|Ice|Crimson) Essence"); private static final Pattern PATTERN_BONUS_ESSENCE = Pattern.compile("^§.+?[^You] .+?found a .+?(Wither|Spider|Undead|Dragon|Gold|Diamond|Ice|Crimson) Essence.+?"); private static final Pattern PATTERN_SALVAGE_ESSENCES = Pattern.compile("\\+(?[0-9]+) (?Wither|Spider|Undead|Dragon|Gold|Diamond|Ice|Crimson) Essence!"); private static final Pattern PATTERN_SECRETS = Pattern.compile("§7([0-9]+)/([0-9]+) Secrets"); From 35a4a6981c2cdd24d7754885ea8448f3f006b51d Mon Sep 17 00:00:00 2001 From: Fix3d Date: Sat, 29 Apr 2023 16:22:45 +0300 Subject: [PATCH 04/22] fix dungeon milestone parsing --- .../biscuit/skyblockaddons/core/dungeons/DungeonManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java b/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java index ea7090307..74e02e638 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/dungeons/DungeonManager.java @@ -25,7 +25,7 @@ */ public class DungeonManager { private static final Logger logger = SkyblockAddons.getLogger(); - private static final Pattern PATTERN_MILESTONE = Pattern.compile("^.+?(Healer|Tank|Mage|Archer|Berserk) Milestone .+?([❶-❿]).+?§r§.(\\d,.)§.§7 .+?"); + private static final Pattern PATTERN_MILESTONE = Pattern.compile("^.+?(Healer|Tank|Mage|Archer|Berserk) Milestone .+?([❶-❿]).+?§r§.([\\d,]+)"); private static final Pattern PATTERN_COLLECTED_ESSENCES = Pattern.compile("§.+?(\\d+) (Wither|Spider|Undead|Dragon|Gold|Diamond|Ice|Crimson) Essence"); private static final Pattern PATTERN_BONUS_ESSENCE = Pattern.compile("^§.+?[^You] .+?found a .+?(Wither|Spider|Undead|Dragon|Gold|Diamond|Ice|Crimson) Essence.+?"); private static final Pattern PATTERN_SALVAGE_ESSENCES = Pattern.compile("\\+(?[0-9]+) (?Wither|Spider|Undead|Dragon|Gold|Diamond|Ice|Crimson) Essence!"); From ab307e07479bdfdfbd036dd7b1844ff22f57260d Mon Sep 17 00:00:00 2001 From: Fix3d Date: Sat, 29 Apr 2023 17:40:05 +0300 Subject: [PATCH 05/22] update dependencies --- .gitignore | 1 + build.gradle | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index fb4ca741a..b70eec8d7 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ run Thumbs.db bytecode .vscode +logs diff --git a/build.gradle b/build.gradle index 99f367e33..e3db2682c 100644 --- a/build.gradle +++ b/build.gradle @@ -4,9 +4,9 @@ import java.text.ParseException plugins { id 'java' - id 'gg.essential.loom' version '0.10.0.5' + id 'gg.essential.loom' version '0.10.0.+' id 'dev.architectury.architectury-pack200' version '0.1.3' - id 'io.freefair.lombok' version "6.6.1" + id 'io.freefair.lombok' version "8.0.1" id 'com.github.johnrengelman.shadow' version '7.1.2' id 'net.kyori.blossom' version '1.3.1' } @@ -97,7 +97,7 @@ dependencies { minecraft("com.mojang:minecraft:${project.minecraftVersion}") mappings("de.oceanlabs.mcp:mcp_stable:${project.mappings}") forge("net.minecraftforge:forge:${project.forgeVersion}") - runtimeOnly('me.djtheredstoner:DevAuth-forge-legacy:1.1.0') + runtimeOnly('me.djtheredstoner:DevAuth-forge-legacy:1.1.2') // Discord RPC for Java https://github.com/jagrosh/DiscordIPC bundle('com.github.ILikePlayingGames:DiscordIPC:-SNAPSHOT') { @@ -110,7 +110,7 @@ dependencies { exclude module: 'gson' because 'Different version conflicts with Minecraft\'s GSON' } - testImplementation('org.junit.jupiter:junit-jupiter:5.9.1') + testImplementation('org.junit.jupiter:junit-jupiter:5.9.3') } tasks.withType(JavaCompile).configureEach { From fa6192f39bf5d9ee6d78aa627974f76e54b9ca7c Mon Sep 17 00:00:00 2001 From: Serhan Date: Sat, 29 Apr 2023 17:48:50 +0300 Subject: [PATCH 06/22] Update build.yml --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8b7f6406d..a6396617c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,7 @@ name: Build on: push: branches: - - stable + - unofficial-fixes - main paths: - '**.java' @@ -55,4 +55,4 @@ jobs: uses: actions/upload-artifact@v2 with: name: SkyblockAddons v${{ env.project_version }}+${{ env.ORG_GRADLE_PROJECT_buildNumber }} - path: build/libs/* \ No newline at end of file + path: build/libs/* From 4511cea879d2513eddb466c37c5653164e338fa2 Mon Sep 17 00:00:00 2001 From: Fix3d Date: Sat, 29 Apr 2023 18:37:45 +0300 Subject: [PATCH 07/22] new enchants --- src/main/resources/enchants.json | 913 +++++++++++++++++-------------- 1 file changed, 502 insertions(+), 411 deletions(-) diff --git a/src/main/resources/enchants.json b/src/main/resources/enchants.json index 3cd43d215..2dd6c0df9 100644 --- a/src/main/resources/enchants.json +++ b/src/main/resources/enchants.json @@ -1,731 +1,822 @@ { "NORMAL": { "aiming": { - "loreName": "Aiming", - "nbtName": "aiming", - "goodLevel": 5, - "maxLevel": 5 - }, - "dragon tracer": { - "loreName": "Dragon Tracer", - "nbtName": "aiming", "goodLevel": 5, - "maxLevel": 5 + "loreName": "Aiming", + "maxLevel": 5, + "nbtName": "aiming" }, "angler": { - "loreName": "Angler", - "nbtName": "angler", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Angler", + "maxLevel": 6, + "nbtName": "angler" }, "aqua affinity": { - "loreName": "Aqua Affinity", - "nbtName": "aqua_affinity", "goodLevel": 1, - "maxLevel": 1 + "loreName": "Aqua Affinity", + "maxLevel": 1, + "nbtName": "aqua_affinity" }, "bane of arthropods": { - "loreName": "Bane of Arthropods", - "nbtName": "bane_of_arthropods", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Bane of Arthropods", + "maxLevel": 7, + "nbtName": "bane_of_arthropods" }, "big brain": { - "loreName": "Big Brain", - "nbtName": "big_brain", "goodLevel": 5, - "maxLevel": 5 + "loreName": "Big Brain", + "maxLevel": 5, + "nbtName": "big_brain" }, "blast protection": { - "loreName": "Blast Protection", - "nbtName": "blast_protection", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Blast Protection", + "maxLevel": 7, + "nbtName": "blast_protection" }, "blessing": { - "loreName": "Blessing", - "nbtName": "blessing", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Blessing", + "maxLevel": 6, + "nbtName": "blessing" }, "caster": { - "loreName": "Caster", - "nbtName": "caster", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Caster", + "maxLevel": 6, + "nbtName": "caster" }, "cayenne": { - "loreName": "Cayenne", - "nbtName": "cayenne", "goodLevel": 4, - "maxLevel": 5 + "loreName": "Cayenne", + "maxLevel": 5, + "nbtName": "cayenne" }, "chance": { - "loreName": "Chance", - "nbtName": "chance", "goodLevel": 3, - "maxLevel": 5 + "loreName": "Chance", + "maxLevel": 5, + "nbtName": "chance" + }, + "charm": { + "goodLevel": 4, + "loreName": "Charm", + "maxLevel": 5, + "nbtName": "charm" }, "cleave": { - "loreName": "Cleave", - "nbtName": "cleave", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Cleave", + "maxLevel": 6, + "nbtName": "cleave" + }, + "corruption": { + "goodLevel": 4, + "loreName": "Corruption", + "maxLevel": 5, + "nbtName": "corruption" }, "counter-strike": { - "loreName": "Counter-Strike", - "nbtName": "counter_strike", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Counter-Strike", + "maxLevel": 5, + "nbtName": "counter_strike" }, "critical": { - "loreName": "Critical", - "nbtName": "critical", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Critical", + "maxLevel": 7, + "nbtName": "critical" }, "cubism": { - "loreName": "Cubism", - "nbtName": "cubism", "goodLevel": 5, - "maxLevel": 6 - }, - "charm": { - "loreName": "Charm", - "nbtName": "charm", - "goodLevel": 4, - "maxLevel": 5 + "loreName": "Cubism", + "maxLevel": 6, + "nbtName": "cubism" }, - "corruption": { - "loreName": "Corruption", - "nbtName": "corruption", - "goodLevel": 4, - "maxLevel": 5 + "dedication": { + "goodLevel": 3, + "loreName": "Dedication", + "maxLevel": 4, + "nbtName": "dedication" }, "delicate": { - "loreName": "Delicate", - "nbtName": "delicate", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Delicate", + "maxLevel": 5, + "nbtName": "delicate" }, "depth strider": { - "loreName": "Depth Strider", - "nbtName": "depth_strider", "goodLevel": 3, - "maxLevel": 3 + "loreName": "Depth Strider", + "maxLevel": 3, + "nbtName": "depth_strider" }, "divine gift": { - "loreName": "Divine Gift", - "nbtName": "divine_gift", "goodLevel": 3, - "maxLevel": 3 + "loreName": "Divine Gift", + "maxLevel": 3, + "nbtName": "divine_gift" }, "dragon hunter": { - "loreName": "Dragon Hunter", - "nbtName": "dragon_hunter", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Dragon Hunter", + "maxLevel": 5, + "nbtName": "dragon_hunter" + }, + "dragon tracer": { + "goodLevel": 5, + "loreName": "Dragon Tracer", + "maxLevel": 5, + "nbtName": "aiming" }, "efficiency": { - "loreName": "Efficiency", - "nbtName": "efficiency", "goodLevel": 5, - "maxLevel": 10 + "loreName": "Efficiency", + "maxLevel": 10, + "nbtName": "efficiency" }, "ender slayer": { - "loreName": "Ender Slayer", - "nbtName": "ender_slayer", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Ender Slayer", + "maxLevel": 7, + "nbtName": "ender_slayer" }, "execute": { - "loreName": "Execute", - "nbtName": "execute", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Execute", + "maxLevel": 6, + "nbtName": "execute" }, "experience": { - "loreName": "Experience", - "nbtName": "experience", "goodLevel": 3, - "maxLevel": 4 + "loreName": "Experience", + "maxLevel": 5, + "nbtName": "experience" }, "feather falling": { - "loreName": "Feather Falling", - "nbtName": "feather_falling", "goodLevel": 5, - "maxLevel": 10 + "loreName": "Feather Falling", + "maxLevel": 10, + "nbtName": "feather_falling" + }, + "ferocious mana": { + "goodLevel": 9, + "loreName": "Ferocious Mana", + "maxLevel": 10, + "nbtName": "ferocious_mana" }, "fire aspect": { - "loreName": "Fire Aspect", - "nbtName": "fire_aspect", "goodLevel": 2, - "maxLevel": 3 + "loreName": "Fire Aspect", + "maxLevel": 3, + "nbtName": "fire_aspect" }, "fire protection": { - "loreName": "Fire Protection", - "nbtName": "fire_protection", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Fire Protection", + "maxLevel": 7, + "nbtName": "fire_protection" }, "first strike": { - "loreName": "First Strike", - "nbtName": "first_strike", "goodLevel": 4, - "maxLevel": 5 + "loreName": "First Strike", + "maxLevel": 5, + "nbtName": "first_strike" }, "flame": { - "loreName": "Flame", - "nbtName": "flame", "goodLevel": 1, - "maxLevel": 2 + "loreName": "Flame", + "maxLevel": 2, + "nbtName": "flame" }, "fortune": { - "loreName": "Fortune", - "nbtName": "fortune", "goodLevel": 3, - "maxLevel": 4 + "loreName": "Fortune", + "maxLevel": 4, + "nbtName": "fortune" }, "frail": { - "loreName": "Frail", - "nbtName": "frail", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Frail", + "maxLevel": 6, + "nbtName": "frail" }, "frost walker": { - "loreName": "Frost Walker", - "nbtName": "frost_walker", "goodLevel": 2, - "maxLevel": 2 - }, - "ferocious mana": { - "loreName": "Ferocious Mana", - "nbtName": "ferocious_mana", - "goodLevel": 9, - "maxLevel": 10 + "loreName": "Frost Walker", + "maxLevel": 2, + "nbtName": "frost_walker" }, "giant killer": { - "loreName": "Giant Killer", - "nbtName": "giant_killer", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Giant Killer", + "maxLevel": 7, + "nbtName": "giant_killer" }, - "growth": { - "loreName": "Growth", - "nbtName": "growth", - "goodLevel": 5, - "maxLevel": 7 + "green thumb": { + "goodLevel": 4, + "loreName": "Green Thumb", + "maxLevel": 5, + "nbtName": "green_thumb" }, - "harvesting": { - "loreName": "Harvesting", - "nbtName": "harvesting", + "growth": { "goodLevel": 5, - "maxLevel": 6 + "loreName": "Growth", + "maxLevel": 7, + "nbtName": "growth" }, "hardened mana": { - "loreName": "Hardened Mana", - "nbtName": "hardened_mana", "goodLevel": 9, - "maxLevel": 10 + "loreName": "Hardened Mana", + "maxLevel": 10, + "nbtName": "hardened_mana" + }, + "harvesting": { + "goodLevel": 5, + "loreName": "Harvesting", + "maxLevel": 6, + "nbtName": "harvesting" }, "impaling": { - "loreName": "Impaling", - "nbtName": "impaling", "goodLevel": 3, - "maxLevel": 3 + "loreName": "Impaling", + "maxLevel": 3, + "nbtName": "impaling" }, "infinite quiver": { - "loreName": "Infinite Quiver", - "nbtName": "infinite_quiver", "goodLevel": 5, - "maxLevel": 10 + "loreName": "Infinite Quiver", + "maxLevel": 10, + "nbtName": "infinite_quiver" }, "knockback": { - "loreName": "Knockback", - "nbtName": "knockback", "goodLevel": 2, - "maxLevel": 2 + "loreName": "Knockback", + "maxLevel": 2, + "nbtName": "knockback" }, "lethality": { - "loreName": "Lethality", - "nbtName": "lethality", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Lethality", + "maxLevel": 6, + "nbtName": "lethality" }, "life steal": { - "loreName": "Life Steal", - "nbtName": "life_steal", "goodLevel": 3, - "maxLevel": 5 + "loreName": "Life Steal", + "maxLevel": 5, + "nbtName": "life_steal" }, "looting": { - "loreName": "Looting", - "nbtName": "looting", "goodLevel": 3, - "maxLevel": 5 + "loreName": "Looting", + "maxLevel": 5, + "nbtName": "looting" }, "luck": { - "loreName": "Luck", - "nbtName": "luck", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Luck", + "maxLevel": 7, + "nbtName": "luck" }, "luck of the sea": { - "loreName": "Luck Of The Sea", - "nbtName": "luck_of_the_sea", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Luck Of The Sea", + "maxLevel": 6, + "nbtName": "luck_of_the_sea" }, "lure": { - "loreName": "Lure", - "nbtName": "lure", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Lure", + "maxLevel": 6, + "nbtName": "lure" }, "magnet": { - "loreName": "Magnet", - "nbtName": "magnet", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Magnet", + "maxLevel": 6, + "nbtName": "magnet" }, "mana steal": { - "loreName": "Mana Steal", - "nbtName": "mana_steal", "goodLevel": 0, - "maxLevel": 3 + "loreName": "Mana Steal", + "maxLevel": 3, + "nbtName": "mana_steal" }, "mana vampire": { - "loreName": "Mana Vampire", - "nbtName": "mana_vampire", "goodLevel": 9, - "maxLevel": 10 + "loreName": "Mana Vampire", + "maxLevel": 10, + "nbtName": "mana_vampire" }, "overload": { - "loreName": "Overload", - "nbtName": "overload", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Overload", + "maxLevel": 5, + "nbtName": "overload" }, "piercing": { - "loreName": "Piercing", - "nbtName": "piercing", "goodLevel": 1, - "maxLevel": 1 + "loreName": "Piercing", + "maxLevel": 1, + "nbtName": "piercing" + }, + "piscary": { + "goodLevel": 5, + "loreName": "Piscary", + "maxLevel": 6, + "nbtName": "piscary" }, "power": { - "loreName": "Power", - "nbtName": "power", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Power", + "maxLevel": 7, + "nbtName": "power" }, "pristine": { - "loreName": "Pristine", - "nbtName": "pristine", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Pristine", + "maxLevel": 5, + "nbtName": "pristine" }, "projectile protection": { - "loreName": "Projectile Protection", - "nbtName": "projectile_protection", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Projectile Protection", + "maxLevel": 7, + "nbtName": "projectile_protection" }, "prosecute": { - "loreName": "Prosecute", - "nbtName": "PROSECUTE", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Prosecute", + "maxLevel": 6, + "nbtName": "PROSECUTE" + }, + "prosperity": { + "goodLevel": 4, + "loreName": "Prosperity", + "maxLevel": 5, + "nbtName": "prosperity" }, "protection": { - "loreName": "Protection", - "nbtName": "protection", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Protection", + "maxLevel": 7, + "nbtName": "protection" }, "punch": { - "loreName": "Punch", - "nbtName": "punch", "goodLevel": 2, - "maxLevel": 2 + "loreName": "Punch", + "maxLevel": 2, + "nbtName": "punch" }, "rainbow": { - "loreName": "Rainbow", - "nbtName": "rainbow", "goodLevel": 1, - "maxLevel": 2 + "loreName": "Rainbow", + "maxLevel": 2, + "nbtName": "rainbow" }, "rejuvenate": { - "loreName": "Rejuvenate", - "nbtName": "rejuvenate", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Rejuvenate", + "maxLevel": 5, + "nbtName": "rejuvenate" }, "replenish": { - "loreName": "Replenish", - "nbtName": "replenish", "goodLevel": 1, - "maxLevel": 1 + "loreName": "Replenish", + "maxLevel": 1, + "nbtName": "replenish" }, "respiration": { - "loreName": "Respiration", - "nbtName": "respiration", "goodLevel": 3, - "maxLevel": 3 + "loreName": "Respiration", + "maxLevel": 3, + "nbtName": "respiration" }, "respite": { - "loreName": "Respite", - "nbtName": "respite", "goodLevel": 5, - "maxLevel": 5 + "loreName": "Respite", + "maxLevel": 5, + "nbtName": "respite" }, "scavenger": { - "loreName": "Scavenger", - "nbtName": "scavenger", "goodLevel": 3, - "maxLevel": 5 + "loreName": "Scavenger", + "maxLevel": 5, + "nbtName": "scavenger" }, "sharpness": { - "loreName": "Sharpness", - "nbtName": "sharpness", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Sharpness", + "maxLevel": 7, + "nbtName": "sharpness" }, "silk touch": { - "loreName": "Silk Touch", - "nbtName": "silk_touch", "goodLevel": 1, - "maxLevel": 1 + "loreName": "Silk Touch", + "maxLevel": 1, + "nbtName": "silk_touch" }, "smarty pants": { - "loreName": "Smarty Pants", - "nbtName": "smarty_pants", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Smarty Pants", + "maxLevel": 5, + "nbtName": "smarty_pants" }, "smelting touch": { - "loreName": "Smelting Touch", - "nbtName": "smelting_touch", "goodLevel": 1, - "maxLevel": 1 + "loreName": "Smelting Touch", + "maxLevel": 1, + "nbtName": "smelting_touch" }, "smite": { - "loreName": "Smite", - "nbtName": "smite", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Smite", + "maxLevel": 7, + "nbtName": "smite" + }, + "smoldering": { + "goodLevel": 4, + "loreName": "Smoldering", + "maxLevel": 5, + "nbtName": "smoldering" }, "snipe": { - "loreName": "Snipe", - "nbtName": "snipe", "goodLevel": 3, - "maxLevel": 4 + "loreName": "Snipe", + "maxLevel": 4, + "nbtName": "snipe" }, "spiked hook": { - "loreName": "Spiked Hook", - "nbtName": "spiked_hook", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Spiked Hook", + "maxLevel": 6, + "nbtName": "spiked_hook" + }, + "strong mana": { + "goodLevel": 9, + "loreName": "Strong Mana", + "maxLevel": 10, + "nbtName": "strong_mana" }, "sugar rush": { - "loreName": "Sugar Rush", - "nbtName": "sugar_rush", "goodLevel": 0, - "maxLevel": 3 + "loreName": "Sugar Rush", + "maxLevel": 3, + "nbtName": "sugar_rush" + }, + "sunder": { + "goodLevel": 5, + "loreName": "Sunder", + "maxLevel": 5, + "nbtName": "sunder" }, "syphon": { - "loreName": "Syphon", - "nbtName": "syphon", "goodLevel": 3, - "maxLevel": 5 - }, - "smoldering": { - "loreName": "Smoldering", - "nbtName": "smoldering", - "goodLevel": 4, - "maxLevel": 5 - }, - "strong mana": { - "loreName": "Strong Mana", - "nbtName": "strong_mana", - "goodLevel": 9, - "maxLevel": 10 + "loreName": "Syphon", + "maxLevel": 5, + "nbtName": "syphon" }, "tabasco": { - "loreName": "Tabasco", - "nbtName": "tabasco", "goodLevel": 2, - "maxLevel": 3 + "loreName": "Tabasco", + "maxLevel": 3, + "nbtName": "tabasco" }, "thorns": { - "loreName": "Thorns", - "nbtName": "thorns", "goodLevel": 3, - "maxLevel": 3 + "loreName": "Thorns", + "maxLevel": 3, + "nbtName": "thorns" }, "thunderbolt": { - "loreName": "Thunderbolt", - "nbtName": "thunderbolt", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Thunderbolt", + "maxLevel": 6, + "nbtName": "thunderbolt" }, "thunderlord": { - "loreName": "Thunderlord", - "nbtName": "thunderlord", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Thunderlord", + "maxLevel": 7, + "nbtName": "thunderlord" }, "titan killer": { - "loreName": "Titan Killer", - "nbtName": "titan_killer", "goodLevel": 5, - "maxLevel": 7 + "loreName": "Titan Killer", + "maxLevel": 7, + "nbtName": "titan_killer" }, "triple-strike": { - "loreName": "Triple-Strike", - "nbtName": "triple_strike", "goodLevel": 4, - "maxLevel": 5 + "loreName": "Triple-Strike", + "maxLevel": 5, + "nbtName": "triple_strike" }, "true protection": { - "loreName": "True Protection", - "nbtName": "true_protection", "goodLevel": 0, - "maxLevel": 1 + "loreName": "True Protection", + "maxLevel": 1, + "nbtName": "true_protection" }, "turbo-cacti": { - "loreName": "Turbo-Cacti", - "nbtName": "turbo_cactus", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Turbo-Cacti", + "maxLevel": 5, + "nbtName": "turbo_cactus" }, "turbo-cane": { - "loreName": "Turbo-Cane", - "nbtName": "turbo_cane", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Turbo-Cane", + "maxLevel": 5, + "nbtName": "turbo_cane" }, "turbo-carrot": { - "loreName": "Turbo-Carrot", - "nbtName": "turbo_carrot", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Turbo-Carrot", + "maxLevel": 5, + "nbtName": "turbo_carrot" }, "turbo-cocoa": { - "loreName": "Turbo-Cocoa", - "nbtName": "turbo_coco", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Turbo-Cocoa", + "maxLevel": 5, + "nbtName": "turbo_coco" }, "turbo-melon": { - "loreName": "Turbo-Melon", - "nbtName": "turbo_melon", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Turbo-Melon", + "maxLevel": 5, + "nbtName": "turbo_melon" }, "turbo-mushrooms": { - "loreName": "Turbo-Mushrooms", - "nbtName": "turbo_mushrooms", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Turbo-Mushrooms", + "maxLevel": 5, + "nbtName": "turbo_mushrooms" }, "turbo-potato": { - "loreName": "Turbo-Potato", - "nbtName": "turbo_potato", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Turbo-Potato", + "maxLevel": 5, + "nbtName": "turbo_potato" }, "turbo-pumpkin": { - "loreName": "Turbo-Pumpkin", - "nbtName": "turbo_pumpkin", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Turbo-Pumpkin", + "maxLevel": 5, + "nbtName": "turbo_pumpkin" }, "turbo-warts": { - "loreName": "Turbo-Warts", - "nbtName": "turbo_warts", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Turbo-Warts", + "maxLevel": 5, + "nbtName": "turbo_warts" }, "turbo-wheat": { - "loreName": "Turbo-Wheat", - "nbtName": "turbo_wheat", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Turbo-Wheat", + "maxLevel": 5, + "nbtName": "turbo_wheat" }, "vampirism": { - "loreName": "Vampirism", - "nbtName": "vampirism", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Vampirism", + "maxLevel": 6, + "nbtName": "vampirism" }, "venomous": { - "loreName": "Venomous", - "nbtName": "venomous", "goodLevel": 5, - "maxLevel": 6 + "loreName": "Venomous", + "maxLevel": 6, + "nbtName": "venomous" }, "vicious": { + "goodLevel": 0, "loreName": "Vicious", - "nbtName": "vicious", + "maxLevel": 5, + "nbtName": "vicious" + } + }, + "STACKING": { + "champion": { + "goodLevel": 0, + "loreName": "Champion", + "maxLevel": 10, + "nbtName": "champion", + "nbtNum": "champion_combat_xp", + "stackLevel": [ + 0, + 100000, + 1000000, + 1500000, + 2000000, + 250000, + 2500000, + 3000000, + 50000, + 500000 + ], + "statLabel": "championCombatXp" + }, + "compact": { + "goodLevel": 0, + "loreName": "Compact", + "maxLevel": 10, + "nbtName": "compact", + "nbtNum": "compact_blocks", + "stackLevel": [ + 0, + 100, + 1000000, + 1500, + 15000, + 150000, + 500, + 5000, + 50000, + 500000 + ], + "statLabel": "compactedBlocks" + }, + "cultivating": { "goodLevel": 0, - "maxLevel": 5 + "loreName": "Cultivating", + "maxLevel": 10, + "nbtName": "cultivating", + "nbtNum": "farmed_cultivating", + "stackLevel": [ + 0, + 1000, + 100000, + 100000000, + 1500000, + 20000000, + 25000, + 300000, + 5000, + 5000000 + ], + "statLabel": "cultivatedCrops" + }, + "expertise": { + "goodLevel": 0, + "loreName": "Expertise", + "maxLevel": 10, + "nbtName": "expertise", + "nbtNum": "expertise_kills", + "stackLevel": [ + 0, + 100, + 1000, + 10000, + 15000, + 250, + 2500, + 50, + 500, + 5500 + ], + "statLabel": "expertiseKills" + }, + "hecatomb": { + "goodLevel": 0, + "loreName": "Hecatomb", + "maxLevel": 10, + "nbtName": "hecatomb", + "nbtNum": "hecatomb_s_runs", + "stackLevel": [ + 0, + 10, + 100, + 2, + 20, + 30, + 40, + 5, + 60, + 80 + ], + "statLabel": "hecatombsSRuns" } }, "ULTIMATE": { "bank": { - "loreName": "Bank", - "nbtName": "ultimate_bank", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Bank", + "maxLevel": 5, + "nbtName": "ultimate_bank" + }, + "bobbin time": { + "goodLevel": 3, + "loreName": "Bobbin' Time", + "maxLevel": 5, + "nbtName": "ultimate_bobbin_time" }, "chimera": { - "loreName": "Chimera", - "nbtName": "ultimate_chimera", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Chimera", + "maxLevel": 5, + "nbtName": "ultimate_chimera" }, "combo": { - "loreName": "Combo", - "nbtName": "ultimate_combo", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Combo", + "maxLevel": 5, + "nbtName": "ultimate_combo" }, "duplex": { - "loreName": "Duplex", - "nbtName": "ultimate_reiterate", - "goodLevel": 0, - "maxLevel": 5 - }, - "flash": { - "loreName": "Flash", - "nbtName": "ultimate_flash", - "goodLevel": 0, - "maxLevel": 5 - }, - "last stand": { - "loreName": "Last Stand", - "nbtName": "ultimate_last_stand", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Duplex", + "maxLevel": 5, + "nbtName": "ultimate_reiterate" }, "fatal tempo": { + "goodLevel": 0, "loreName": "Fatal Tempo", - "nbtName": "ultimate_fatal_tempo", + "maxLevel": 5, + "nbtName": "ultimate_fatal_tempo" + }, + "flash": { "goodLevel": 0, - "maxLevel": 5 + "loreName": "Flash", + "maxLevel": 5, + "nbtName": "ultimate_flash" }, "habanero tactics": { - "loreName": "Habanero Tactics", - "nbtName": "ultimate_habanero_tactics", "goodLevel": 4, - "maxLevel": 5 + "loreName": "Habanero Tactics", + "maxLevel": 5, + "nbtName": "ultimate_habanero_tactics" }, "inferno": { - "loreName": "Inferno", - "nbtName": "ultimate_inferno", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Inferno", + "maxLevel": 5, + "nbtName": "ultimate_inferno" }, - "ultimate jerry": { - "loreName": "Ultimate Jerry", - "nbtName": "ultimate_jerry", + "last stand": { "goodLevel": 0, - "maxLevel": 5 + "loreName": "Last Stand", + "maxLevel": 5, + "nbtName": "ultimate_last_stand" }, "legion": { - "loreName": "Legion", - "nbtName": "ultimate_legion", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Legion", + "maxLevel": 5, + "nbtName": "ultimate_legion" }, "no pain no gain": { - "loreName": "No Pain No Gain", - "nbtName": "ultimate_no_pain_no_gain", "goodLevel": 0, - "maxLevel": 5 + "loreName": "No Pain No Gain", + "maxLevel": 5, + "nbtName": "ultimate_no_pain_no_gain" }, "one for all": { - "loreName": "One For All", - "nbtName": "ultimate_one_for_all", "goodLevel": 0, - "maxLevel": 5 + "loreName": "One For All", + "maxLevel": 5, + "nbtName": "ultimate_one_for_all" }, "rend": { - "loreName": "Rend", - "nbtName": "ultimate_rend", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Rend", + "maxLevel": 5, + "nbtName": "ultimate_rend" }, "soul eater": { - "loreName": "Soul Eater", - "nbtName": "ultimate_soul_eater", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Soul Eater", + "maxLevel": 5, + "nbtName": "ultimate_soul_eater" }, "swarm": { + "goodLevel": 0, "loreName": "Swarm", - "nbtName": "ultimate_swarm", + "maxLevel": 5, + "nbtName": "ultimate_swarm" + }, + "ultimate jerry": { "goodLevel": 0, - "maxLevel": 5 + "loreName": "Ultimate Jerry", + "maxLevel": 5, + "nbtName": "ultimate_jerry" }, "ultimate wise": { - "loreName": "Ultimate Wise", - "nbtName": "ultimate_wise", "goodLevel": 0, - "maxLevel": 5 + "loreName": "Ultimate Wise", + "maxLevel": 5, + "nbtName": "ultimate_wise" }, "wisdom": { - "loreName": "Wisdom", - "nbtName": "ultimate_wisdom", "goodLevel": 0, - "maxLevel": 5 - } - }, - "STACKING": { - "compact": { - "loreName": "Compact", - "nbtName": "compact", - "nbtNum": "compact_blocks", - "goodLevel": 0, - "maxLevel": 10, - "statLabel": "compactedBlocks", - "stackLevel": [0, 100, 500, 1500, 5000, 15000, 50000, 150000, 500000, 1000000] - }, - "cultivating": { - "loreName": "Cultivating", - "nbtName": "cultivating", - "nbtNum": "farmed_cultivating", - "goodLevel": 0, - "maxLevel": 10, - "statLabel": "cultivatedCrops", - "stackLevel": [0, 1000, 5000, 25000, 100000, 300000, 1500000, 5000000, 20000000, 100000000] - }, - "expertise": { - "loreName": "Expertise", - "nbtName": "expertise", - "nbtNum": "expertise_kills", - "goodLevel": 0, - "maxLevel": 10, - "statLabel": "expertiseKills", - "stackLevel": [0, 50, 100, 250, 500, 1000, 2500, 5500, 10000, 15000] - }, - "hecatomb": { - "loreName": "Hecatomb", - "nbtName": "hecatomb", - "nbtNum": "hecatomb_s_runs", - "goodLevel": 0, - "maxLevel": 10, - "statLabel": "hecatombsSRuns", - "stackLevel": [0, 2, 5, 10, 20, 30, 40, 60, 80, 100] - }, - "champion": { - "loreName": "Champion", - "nbtName": "champion", - "nbtNum": "champion_combat_xp", - "goodLevel": 0, - "maxLevel": 10, - "statLabel": "championCombatXp", - "stackLevel": [0, 50000, 100000, 250000, 500000, 1000000, 1500000, 2000000, 2500000, 3000000] + "loreName": "Wisdom", + "maxLevel": 5, + "nbtName": "ultimate_wisdom" } } -} +} \ No newline at end of file From 758955218bbf2294bafbaf238655d22d19f9158d Mon Sep 17 00:00:00 2001 From: Serhan Date: Sat, 29 Apr 2023 19:30:49 +0300 Subject: [PATCH 08/22] Update build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a6396617c..36d6720a5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,7 @@ name: Build on: push: branches: - - unofficial-fixes + - unofficial-update - main paths: - '**.java' From 8315ab7b8b5046fd40dccc07353d5c3d5eaab8dd Mon Sep 17 00:00:00 2001 From: Fix3d Date: Sat, 29 Apr 2023 19:48:31 +0300 Subject: [PATCH 09/22] update goodLevel --- src/main/resources/enchants.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/enchants.json b/src/main/resources/enchants.json index 2dd6c0df9..201a462e4 100644 --- a/src/main/resources/enchants.json +++ b/src/main/resources/enchants.json @@ -97,7 +97,7 @@ "nbtName": "cubism" }, "dedication": { - "goodLevel": 3, + "goodLevel": 0, "loreName": "Dedication", "maxLevel": 4, "nbtName": "dedication" @@ -217,7 +217,7 @@ "nbtName": "giant_killer" }, "green thumb": { - "goodLevel": 4, + "goodLevel": 0, "loreName": "Green Thumb", "maxLevel": 5, "nbtName": "green_thumb" @@ -747,7 +747,7 @@ "nbtName": "ultimate_flash" }, "habanero tactics": { - "goodLevel": 4, + "goodLevel": 0, "loreName": "Habanero Tactics", "maxLevel": 5, "nbtName": "ultimate_habanero_tactics" From 06cc55e42ac91a583d277abb4cb772c2ee7a8d91 Mon Sep 17 00:00:00 2001 From: Serhan Date: Sat, 29 Apr 2023 20:40:35 +0300 Subject: [PATCH 10/22] Update build.yml --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 36d6720a5..c7d832990 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -52,7 +52,7 @@ jobs: if: ${{ env.UPLOAD_ARTIFACT_ENABLED || contains(github.event.inputs.upload_artifact, 'yes') }} env: project_version: ${{ steps.read_project_version.outputs.value }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: - name: SkyblockAddons v${{ env.project_version }}+${{ env.ORG_GRADLE_PROJECT_buildNumber }} + name: SkyblockAddons v${{ env.project_version }} path: build/libs/* From 0210cd1491df3d386c710d4a41cf6c0eb553b76c Mon Sep 17 00:00:00 2001 From: Serhan Date: Sat, 29 Apr 2023 22:12:15 +0300 Subject: [PATCH 11/22] Update build.yml --- .github/workflows/build.yml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c7d832990..c2ac10112 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,25 +2,17 @@ name: Build on: push: - branches: - - unofficial-update - - main + branches: [ unofficial-update ] paths: - '**.java' pull_request: - branches: - - main + branches: [ unofficial-update ] paths: - '**.java' - workflow_dispatch: - inputs: - upload_artifact: - description: 'Upload artifact to this run? [yes | no]' - required: false - default: 'no' + jobs: build: - name: Build + name: Unofficial if: ${{ !contains(github.head_ref, 'translations/') }} runs-on: ubuntu-latest env: @@ -43,13 +35,13 @@ jobs: run: ./gradlew build --no-daemon - name: Read Project Version id: read_project_version - if: ${{ env.UPLOAD_ARTIFACT_ENABLED || contains(github.event.inputs.upload_artifact, 'yes') }} + if: ${{ env.UPLOAD_ARTIFACT_ENABLED }} uses: christian-draeger/read-properties@1.0.1 with: path: gradle.properties property: version - name: Upload Artifact - if: ${{ env.UPLOAD_ARTIFACT_ENABLED || contains(github.event.inputs.upload_artifact, 'yes') }} + if: ${{ env.UPLOAD_ARTIFACT_ENABLED }} env: project_version: ${{ steps.read_project_version.outputs.value }} uses: actions/upload-artifact@v3 From d4f19b52b64927814f703fc2e498c85f1536d0fe Mon Sep 17 00:00:00 2001 From: Fix3d Date: Sun, 30 Apr 2023 02:02:15 +0300 Subject: [PATCH 12/22] remove tab effect timers and fix compact tab list not shows god potion --- .../skyblockaddons/config/ConfigValues.java | 2 +- .../biscuit/skyblockaddons/core/Feature.java | 5 +- .../features/tablist/TabListParser.java | 19 +-- .../features/tabtimers/TabEffect.java | 39 ------ .../features/tabtimers/TabEffectManager.java | 124 ------------------ .../listeners/PlayerListener.java | 21 --- .../listeners/RenderListener.java | 119 ----------------- .../skyblockaddons/utils/EnumUtils.java | 2 +- 8 files changed, 14 insertions(+), 317 deletions(-) delete mode 100644 src/main/java/codes/biscuit/skyblockaddons/features/tabtimers/TabEffect.java delete mode 100644 src/main/java/codes/biscuit/skyblockaddons/features/tabtimers/TabEffectManager.java diff --git a/src/main/java/codes/biscuit/skyblockaddons/config/ConfigValues.java b/src/main/java/codes/biscuit/skyblockaddons/config/ConfigValues.java index 116ee8a37..ce690154a 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/config/ConfigValues.java +++ b/src/main/java/codes/biscuit/skyblockaddons/config/ConfigValues.java @@ -146,7 +146,7 @@ public void loadValues() { Language configLanguage = Language.getFromPath(languageKey); if (configLanguage != null) { setLanguage(configLanguage); // TODO Will this crash? -// language.setValue(configLanguage); + //language.setValue(configLanguage); } } } catch (Exception ex) { diff --git a/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java b/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java index 9879c4395..a8f72843e 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java +++ b/src/main/java/codes/biscuit/skyblockaddons/core/Feature.java @@ -70,7 +70,6 @@ public enum Feature { POWER_ORB_STATUS_DISPLAY(65, "settings.powerOrbDisplay", new GuiFeatureData(EnumUtils.DrawType.POWER_ORB_DISPLAY, null), false, EnumUtils.FeatureSetting.POWER_ORB_DISPLAY_STYLE), ZEALOT_COUNTER(66, "settings.zealotCounter", new GuiFeatureData(EnumUtils.DrawType.TEXT, ColorCode.DARK_AQUA), false, EnumUtils.FeatureSetting.ZEALOT_SPAWN_AREAS_ONLY), TICKER_CHARGES_DISPLAY(67, "settings.tickerChargesDisplay", new GuiFeatureData(EnumUtils.DrawType.TICKER, null), false), - TAB_EFFECT_TIMERS(68, "settings.tabEffectTimers", new GuiFeatureData(EnumUtils.DrawType.TAB_EFFECT_TIMERS, ColorCode.WHITE), true), NO_ARROWS_LEFT_ALERT(69, "settings.noArrowsLeftAlert", new GuiFeatureData(ColorCode.RED), false), CAKE_BAG_PREVIEW(71, "settings.showCakeBagPreview", null, true), REPEAT_FULL_INVENTORY_WARNING(73, null, true), @@ -282,7 +281,7 @@ public enum Feature { private static final Set guiFeatures = new LinkedHashSet<>(Arrays.asList(DRILL_FUEL_BAR, SKILL_PROGRESS_BAR, MANA_BAR, HEALTH_BAR, MANA_TEXT, OVERFLOW_MANA, DEFENCE_ICON, DEFENCE_TEXT, EFFECTIVE_HEALTH_TEXT, DEFENCE_PERCENTAGE, HEALTH_TEXT, SKELETON_BAR, HEALTH_UPDATES, ITEM_PICKUP_LOG, DARK_AUCTION_TIMER, SKILL_DISPLAY, SPEED_PERCENTAGE, - SLAYER_INDICATOR, POWER_ORB_STATUS_DISPLAY, ZEALOT_COUNTER, TICKER_CHARGES_DISPLAY, TAB_EFFECT_TIMERS, SHOW_TOTAL_ZEALOT_COUNT, SHOW_SUMMONING_EYE_COUNT, + SLAYER_INDICATOR, POWER_ORB_STATUS_DISPLAY, ZEALOT_COUNTER, TICKER_CHARGES_DISPLAY, SHOW_TOTAL_ZEALOT_COUNT, SHOW_SUMMONING_EYE_COUNT, SHOW_AVERAGE_ZEALOTS_PER_EYE, BIRCH_PARK_RAINMAKER_TIMER, ENDSTONE_PROTECTOR_DISPLAY, BAIT_LIST, DUNGEONS_MAP_DISPLAY, SHOW_DUNGEON_MILESTONE, DUNGEONS_COLLECTED_ESSENCES_DISPLAY, REVENANT_SLAYER_TRACKER, TARANTULA_SLAYER_TRACKER, SVEN_SLAYER_TRACKER, DRAGON_STATS_TRACKER, DUNGEON_DEATH_COUNTER, ROCK_PET_TRACKER, DOLPHIN_PET_TRACKER, DUNGEONS_SECRETS_DISPLAY, CANDY_POINTS_COUNTER, DRILL_FUEL_TEXT, INFERNO_SLAYER_TRACKER, @@ -403,8 +402,6 @@ public void draw(float scale, Minecraft mc, ButtonLocation buttonLocation) { main.getRenderListener().drawScorpionFoilTicker(mc, scale, buttonLocation); } else if (guiFeatureData.getDrawType() == EnumUtils.DrawType.PROXIMITY_INDICATOR) { FeatureTrackerQuest.drawTrackerLocationIndicator(mc, scale, buttonLocation); - } else if (guiFeatureData.getDrawType() == EnumUtils.DrawType.TAB_EFFECT_TIMERS) { - main.getRenderListener().drawPotionEffectTimers(scale, buttonLocation); } else if (guiFeatureData.getDrawType() == EnumUtils.DrawType.BAIT_LIST_DISPLAY) { main.getRenderListener().drawBaitList(mc, scale, buttonLocation); } else if (guiFeatureData.getDrawType() == EnumUtils.DrawType.DUNGEONS_MAP) { diff --git a/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListParser.java b/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListParser.java index 1c26da856..7042f0d1f 100644 --- a/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListParser.java +++ b/src/main/java/codes/biscuit/skyblockaddons/features/tablist/TabListParser.java @@ -5,7 +5,6 @@ import codes.biscuit.skyblockaddons.core.Location; import codes.biscuit.skyblockaddons.core.SkillType; import codes.biscuit.skyblockaddons.features.spookyevent.SpookyEventManager; -import codes.biscuit.skyblockaddons.features.tabtimers.TabEffectManager; import codes.biscuit.skyblockaddons.utils.TextUtils; import lombok.Getter; import net.minecraft.client.Minecraft; @@ -26,8 +25,9 @@ public class TabListParser { public static String HYPIXEL_ADVERTISEMENT_CONTAINS = "HYPIXEL.NET"; - private static final Pattern GOD_POTION_PATTERN = Pattern.compile("You have a God Potion active! (?\\d{0,2}:?\\d{1,2}:\\d{2})"); + private static final Pattern GOD_POTION_PATTERN = Pattern.compile("You have a God Potion active! (?(?:\\d+(?: Hours| Minutes|m \\d+s))|(?:\\d+s))"); private static final Pattern ACTIVE_EFFECTS_PATTERN = Pattern.compile("Active Effects(?:§.)*(?:\\n(?:§.)*§7.+)*"); + private static final Pattern EFFECT_COUNT_PATTERN = Pattern.compile("You have (?[0-9]+) active effects\\."); private static final Pattern COOKIE_BUFF_PATTERN = Pattern.compile("Cookie Buff(?:§.)*(?:\\n(§.)*§7.+)*"); private static final Pattern UPGRADES_PATTERN = Pattern.compile("(?§e[A-Za-z ]+)(? §f[0-9dhms ]+)"); private static final Pattern RAIN_TIME_PATTERN_S = Pattern.compile("Rain: (?