From 6ebe9fffba90f6adba1ee77097376e78bdd57ada Mon Sep 17 00:00:00 2001 From: olim88 Date: Sat, 26 Apr 2025 02:12:57 +0100 Subject: Fishing HUD and Notifications (#1183) * basic working widget * add config and clean up * support for double hook * add notifications and more settings * Add timer end notification * clean up * small tweak * enable in all locations seems that most places can be fished in so just enable it for all as it only show when you are fishing anyway * update new sea creatures * Clean up config and lang * Clean up fishing hud * Fix percentage --------- Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> --- .../config/categories/HelperCategory.java | 552 ++++++++++++--------- .../skyblocker/config/configs/HelperConfig.java | 25 + .../mixins/ClientPlayNetworkHandlerMixin.java | 4 +- .../hysky/skyblocker/skyblock/FishingHelper.java | 101 ---- .../skyblocker/skyblock/fishing/FishingHelper.java | 101 ++++ .../skyblock/fishing/FishingHudWidget.java | 89 ++++ .../skyblocker/skyblock/fishing/SeaCreature.java | 84 ++++ .../skyblock/fishing/SeaCreatureCategory.java | 22 + .../skyblock/fishing/SeaCreatureTracker.java | 173 +++++++ .../hysky/skyblocker/skyblock/tabhud/util/Ico.java | 2 + .../tabhud/widget/component/Components.java | 29 +- 11 files changed, 828 insertions(+), 354 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/fishing/FishingHelper.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/fishing/FishingHudWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/fishing/SeaCreature.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/fishing/SeaCreatureCategory.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/fishing/SeaCreatureTracker.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java index c0a643e1..6bc43655 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java @@ -3,48 +3,51 @@ package de.hysky.skyblocker.config.categories; import de.hysky.skyblocker.config.ConfigUtils; import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.skyblock.bazaar.BazaarHelper; +import de.hysky.skyblocker.skyblock.fishing.FishingHudWidget; +import de.hysky.skyblocker.skyblock.item.SkyblockItemRarity; +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen; +import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.waypoint.Waypoint; -import dev.isxander.yacl3.api.ConfigCategory; -import dev.isxander.yacl3.api.Option; -import dev.isxander.yacl3.api.OptionDescription; -import dev.isxander.yacl3.api.OptionGroup; +import dev.isxander.yacl3.api.*; import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder; +import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder; +import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; public class HelperCategory { - public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { - return ConfigCategory.createBuilder() - .name(Text.translatable("skyblocker.config.helpers")) + public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { + return ConfigCategory.createBuilder() + .name(Text.translatable("skyblocker.config.helpers")) - //Ungrouped Options - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.enableNewYearCakesHelper")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.enableNewYearCakesHelper.@Tooltip"))) - .binding(defaults.helpers.enableNewYearCakesHelper, - () -> config.helpers.enableNewYearCakesHelper, - newValue -> config.helpers.enableNewYearCakesHelper = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) + //Ungrouped Options + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.enableNewYearCakesHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.enableNewYearCakesHelper.@Tooltip"))) + .binding(defaults.helpers.enableNewYearCakesHelper, + () -> config.helpers.enableNewYearCakesHelper, + newValue -> config.helpers.enableNewYearCakesHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) - // Bits Helper - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.enableBitsHelper")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.enableBitsHelper.@Tooltip"))) - .binding(defaults.helpers.enableBitsTooltip, - () -> config.helpers.enableBitsTooltip, - newValue -> config.helpers.enableBitsTooltip = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) + // Bits Helper + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.enableBitsHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.enableBitsHelper.@Tooltip"))) + .binding(defaults.helpers.enableBitsTooltip, + () -> config.helpers.enableBitsTooltip, + newValue -> config.helpers.enableBitsTooltip = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) // Wardrobe Helper - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.enableWardrobeHelper")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.enableWardrobeHelper.@Tooltip"))) - .binding(defaults.helpers.enableWardrobeHelper, - () -> config.helpers.enableWardrobeHelper, - newValue -> config.helpers.enableWardrobeHelper = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.enableWardrobeHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.enableWardrobeHelper.@Tooltip"))) + .binding(defaults.helpers.enableWardrobeHelper, + () -> config.helpers.enableWardrobeHelper, + newValue -> config.helpers.enableWardrobeHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) // Date Calculator .option(Option.createBuilder() @@ -69,225 +72,278 @@ public class HelperCategory { .build()) .build()) - //Jerry Timer - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.jerry")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.jerry.enableJerryTimer")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.jerry.enableJerryTimer.@Tooltip"))) - .binding(defaults.helpers.jerry.enableJerryTimer, - () -> config.helpers.jerry.enableJerryTimer, - newValue -> config.helpers.jerry.enableJerryTimer = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .build()) + //Jerry Timer + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.jerry")) + .collapsed(true) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.jerry.enableJerryTimer")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.jerry.enableJerryTimer.@Tooltip"))) + .binding(defaults.helpers.jerry.enableJerryTimer, + () -> config.helpers.jerry.enableJerryTimer, + newValue -> config.helpers.jerry.enableJerryTimer = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) - //Experiments Solver - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.experiments")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.experiments.enableChronomatronSolver")) - .binding(defaults.helpers.experiments.enableChronomatronSolver, - () -> config.helpers.experiments.enableChronomatronSolver, - newValue -> config.helpers.experiments.enableChronomatronSolver = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.experiments.enableSuperpairsSolver")) - .binding(defaults.helpers.experiments.enableSuperpairsSolver, - () -> config.helpers.experiments.enableSuperpairsSolver, - newValue -> config.helpers.experiments.enableSuperpairsSolver = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.experiments.enableUltrasequencerSolver")) - .binding(defaults.helpers.experiments.enableUltrasequencerSolver, - () -> config.helpers.experiments.enableUltrasequencerSolver, - newValue -> config.helpers.experiments.enableUltrasequencerSolver = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .build()) + //Experiments Solver + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.experiments")) + .collapsed(true) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.experiments.enableChronomatronSolver")) + .binding(defaults.helpers.experiments.enableChronomatronSolver, + () -> config.helpers.experiments.enableChronomatronSolver, + newValue -> config.helpers.experiments.enableChronomatronSolver = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.experiments.enableSuperpairsSolver")) + .binding(defaults.helpers.experiments.enableSuperpairsSolver, + () -> config.helpers.experiments.enableSuperpairsSolver, + newValue -> config.helpers.experiments.enableSuperpairsSolver = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.experiments.enableUltrasequencerSolver")) + .binding(defaults.helpers.experiments.enableUltrasequencerSolver, + () -> config.helpers.experiments.enableUltrasequencerSolver, + newValue -> config.helpers.experiments.enableUltrasequencerSolver = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) - //Fishing Helper - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.fishing")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.fishing.enableFishingHelper")) - .binding(defaults.helpers.fishing.enableFishingHelper, - () -> config.helpers.fishing.enableFishingHelper, - newValue -> config.helpers.fishing.enableFishingHelper = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.fishing.enableFishingTimer")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.enableFishingTimer.@Tooltip"))) - .binding(defaults.helpers.fishing.enableFishingTimer, - () -> config.helpers.fishing.enableFishingTimer, - newValue -> config.helpers.fishing.enableFishingTimer = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.fishing.changeTimerColor")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.changeTimerColor.@Tooltip"))) - .binding(defaults.helpers.fishing.changeTimerColor, - () -> config.helpers.fishing.changeTimerColor, - newValue -> config.helpers.fishing.changeTimerColor = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.fishing.fishingTimerScale")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.fishingTimerScale.@Tooltip"))) - .binding(defaults.helpers.fishing.fishingTimerScale, - () -> config.helpers.fishing.fishingTimerScale, - newValue -> config.helpers.fishing.fishingTimerScale = newValue) - .controller(FloatFieldControllerBuilder::create) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.fishing.hideOtherPlayers")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.hideOtherPlayers.@Tooltip"))) - .binding(defaults.helpers.fishing.hideOtherPlayersRods, - () -> config.helpers.fishing.hideOtherPlayersRods, - newValue -> config.helpers.fishing.hideOtherPlayersRods = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .build()) + //Fishing Helper + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing")) + .collapsed(true) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.enableFishingHelper")) + .binding(defaults.helpers.fishing.enableFishingHelper, + () -> config.helpers.fishing.enableFishingHelper, + newValue -> config.helpers.fishing.enableFishingHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.enableFishingTimer")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.enableFishingTimer.@Tooltip"))) + .binding(defaults.helpers.fishing.enableFishingTimer, + () -> config.helpers.fishing.enableFishingTimer, + newValue -> config.helpers.fishing.enableFishingTimer = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.changeTimerColor")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.changeTimerColor.@Tooltip"))) + .binding(defaults.helpers.fishing.changeTimerColor, + () -> config.helpers.fishing.changeTimerColor, + newValue -> config.helpers.fishing.changeTimerColor = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.fishingTimerScale")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.fishingTimerScale.@Tooltip"))) + .binding(defaults.helpers.fishing.fishingTimerScale, + () -> config.helpers.fishing.fishingTimerScale, + newValue -> config.helpers.fishing.fishingTimerScale = newValue) + .controller(FloatFieldControllerBuilder::create) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.hideOtherPlayers")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.hideOtherPlayers.@Tooltip"))) + .binding(defaults.helpers.fishing.hideOtherPlayersRods, + () -> config.helpers.fishing.hideOtherPlayersRods, + newValue -> config.helpers.fishing.hideOtherPlayersRods = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(ButtonOption.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.hud.screen")) + .text(Text.translatable("text.skyblocker.open")) + .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new WidgetsConfigurationScreen(Location.HUB, FishingHudWidget.getInstance().getInternalID(), screen))) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.hud.onlyShowHudInBarn")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.hud.onlyShowHudInBarn.@Tooltip"))) + .binding(defaults.helpers.fishing.onlyShowHudInBarn, + () -> config.helpers.fishing.onlyShowHudInBarn, + newValue -> config.helpers.fishing.onlyShowHudInBarn = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.timerLength")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.timerLength.@Tooltip"))) + .binding(defaults.helpers.fishing.timerLength, + () -> config.helpers.fishing.timerLength, + newValue -> config.helpers.fishing.timerLength = newValue) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(1, 360).step(1)) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.seaCreatureTimerNotification")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.seaCreatureTimerNotification.@Tooltip"))) + .binding(defaults.helpers.fishing.seaCreatureTimerNotification, + () -> config.helpers.fishing.seaCreatureTimerNotification, + newValue -> config.helpers.fishing.seaCreatureTimerNotification = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.seaCreatureCap")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.seaCreatureCap.@Tooltip"))) + .binding(defaults.helpers.fishing.seaCreatureCap, + () -> config.helpers.fishing.seaCreatureCap, + newValue -> config.helpers.fishing.seaCreatureCap = newValue) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(1, 60).step(1)) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.seaCreatureCapNotification")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.seaCreatureCapNotification.@Tooltip"))) + .binding(defaults.helpers.fishing.seaCreatureCapNotification, + () -> config.helpers.fishing.seaCreatureCapNotification, + newValue -> config.helpers.fishing.seaCreatureCapNotification = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fishing.minimumNotificationRarity")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fishing.minimumNotificationRarity.@Tooltip"))) + .binding(defaults.helpers.fishing.minimumNotificationRarity, + () -> config.helpers.fishing.minimumNotificationRarity, + rarity -> config.helpers.fishing.minimumNotificationRarity = rarity == SkyblockItemRarity.DIVINE ? SkyblockItemRarity.UNKNOWN : rarity) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .build()) - //Fairy Souls Helper - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.fairySouls")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.fairySouls.enableFairySoulsHelper")) - .binding(defaults.helpers.fairySouls.enableFairySoulsHelper, - () -> config.helpers.fairySouls.enableFairySoulsHelper, - newValue -> config.helpers.fairySouls.enableFairySoulsHelper = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.fairySouls.highlightFoundSouls")) - .binding(defaults.helpers.fairySouls.highlightFoundSouls, - () -> config.helpers.fairySouls.highlightFoundSouls, - newValue -> config.helpers.fairySouls.highlightFoundSouls = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.fairySouls.highlightOnlyNearbySouls")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fairySouls.highlightOnlyNearbySouls.@Tooltip"))) - .binding(defaults.helpers.fairySouls.highlightOnlyNearbySouls, - () -> config.helpers.fairySouls.highlightOnlyNearbySouls, - newValue -> config.helpers.fairySouls.highlightOnlyNearbySouls = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .build()) + //Fairy Souls Helper + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fairySouls")) + .collapsed(true) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fairySouls.enableFairySoulsHelper")) + .binding(defaults.helpers.fairySouls.enableFairySoulsHelper, + () -> config.helpers.fairySouls.enableFairySoulsHelper, + newValue -> config.helpers.fairySouls.enableFairySoulsHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fairySouls.highlightFoundSouls")) + .binding(defaults.helpers.fairySouls.highlightFoundSouls, + () -> config.helpers.fairySouls.highlightFoundSouls, + newValue -> config.helpers.fairySouls.highlightFoundSouls = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.fairySouls.highlightOnlyNearbySouls")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.fairySouls.highlightOnlyNearbySouls.@Tooltip"))) + .binding(defaults.helpers.fairySouls.highlightOnlyNearbySouls, + () -> config.helpers.fairySouls.highlightOnlyNearbySouls, + newValue -> config.helpers.fairySouls.highlightOnlyNearbySouls = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) - //Chocolate Factory - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.chocolateFactory")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableChocolateFactoryHelper")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableChocolateFactoryHelper.@Tooltip"))) - .binding(defaults.helpers.chocolateFactory.enableChocolateFactoryHelper, - () -> config.helpers.chocolateFactory.enableChocolateFactoryHelper, - newValue -> config.helpers.chocolateFactory.enableChocolateFactoryHelper = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableEggFinder")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableEggFinder.@Tooltip"))) - .binding(defaults.helpers.chocolateFactory.enableEggFinder, - () -> config.helpers.chocolateFactory.enableEggFinder, - newValue -> config.helpers.chocolateFactory.enableEggFinder = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.sendEggFoundMessages")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.chocolateFactory.sendEggFoundMessages.@Tooltip"))) - .binding(defaults.helpers.chocolateFactory.sendEggFoundMessages, - () -> config.helpers.chocolateFactory.sendEggFoundMessages, - newValue -> config.helpers.chocolateFactory.sendEggFoundMessages = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.waypointType")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.uiAndVisuals.waypoints.waypointType.@Tooltip"))) - .binding(defaults.helpers.chocolateFactory.waypointType, - () -> config.helpers.chocolateFactory.waypointType, - newValue -> config.helpers.chocolateFactory.waypointType = newValue) - .controller(ConfigUtils::createEnumCyclingListController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableTimeTowerReminder")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableTimeTowerReminder.@Tooltip"))) - .binding(defaults.helpers.chocolateFactory.enableTimeTowerReminder, - () -> config.helpers.chocolateFactory.enableTimeTowerReminder, - newValue -> config.helpers.chocolateFactory.enableTimeTowerReminder = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.straySound")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.chocolateFactory.straySound.@Tooltip"))) - .binding(defaults.helpers.chocolateFactory.straySound, - () -> config.helpers.chocolateFactory.straySound, - newValue -> config.helpers.chocolateFactory.straySound = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .build()) + //Chocolate Factory + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.chocolateFactory")) + .collapsed(true) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableChocolateFactoryHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableChocolateFactoryHelper.@Tooltip"))) + .binding(defaults.helpers.chocolateFactory.enableChocolateFactoryHelper, + () -> config.helpers.chocolateFactory.enableChocolateFactoryHelper, + newValue -> config.helpers.chocolateFactory.enableChocolateFactoryHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableEggFinder")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableEggFinder.@Tooltip"))) + .binding(defaults.helpers.chocolateFactory.enableEggFinder, + () -> config.helpers.chocolateFactory.enableEggFinder, + newValue -> config.helpers.chocolateFactory.enableEggFinder = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.sendEggFoundMessages")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.chocolateFactory.sendEggFoundMessages.@Tooltip"))) + .binding(defaults.helpers.chocolateFactory.sendEggFoundMessages, + () -> config.helpers.chocolateFactory.sendEggFoundMessages, + newValue -> config.helpers.chocolateFactory.sendEggFoundMessages = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.waypointType")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.uiAndVisuals.waypoints.waypointType.@Tooltip"))) + .binding(defaults.helpers.chocolateFactory.waypointType, + () -> config.helpers.chocolateFactory.waypointType, + newValue -> config.helpers.chocolateFactory.waypointType = newValue) + .controller(ConfigUtils::createEnumCyclingListController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableTimeTowerReminder")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.chocolateFactory.enableTimeTowerReminder.@Tooltip"))) + .binding(defaults.helpers.chocolateFactory.enableTimeTowerReminder, + () -> config.helpers.chocolateFactory.enableTimeTowerReminder, + newValue -> config.helpers.chocolateFactory.enableTimeTowerReminder = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.chocolateFactory.straySound")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.chocolateFactory.straySound.@Tooltip"))) + .binding(defaults.helpers.chocolateFactory.straySound, + () -> config.helpers.chocolateFactory.straySound, + newValue -> config.helpers.chocolateFactory.straySound = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.carnival")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.carnival.catchAFishHelper")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.carnival.catchAFishHelper.@Tooltip"))) - .binding(defaults.helpers.carnival.catchAFishHelper, - () -> config.helpers.carnival.catchAFishHelper, - newValue -> config.helpers.carnival.catchAFishHelper = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.carnival.zombieShootoutHelper")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.carnival.zombieShootoutHelper.@Tooltip"))) - .binding(defaults.helpers.carnival.zombieShootoutHelper, - () -> config.helpers.carnival.zombieShootoutHelper, - newValue -> config.helpers.carnival.zombieShootoutHelper = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .build()) + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.carnival")) + .collapsed(true) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.carnival.catchAFishHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.carnival.catchAFishHelper.@Tooltip"))) + .binding(defaults.helpers.carnival.catchAFishHelper, + () -> config.helpers.carnival.catchAFishHelper, + newValue -> config.helpers.carnival.catchAFishHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.carnival.zombieShootoutHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.carnival.zombieShootoutHelper.@Tooltip"))) + .binding(defaults.helpers.carnival.zombieShootoutHelper, + () -> config.helpers.carnival.zombieShootoutHelper, + newValue -> config.helpers.carnival.zombieShootoutHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) - //Bazaar - .group(OptionGroup.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.bazaar")) - .collapsed(true) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.bazaar.enableBazaarHelper")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.bazaar.enableBazaarHelper.@Tooltip", BazaarHelper.getExpiringIcon(), BazaarHelper.getExpiredIcon(), BazaarHelper.getFilledIcon(69), BazaarHelper.getFilledIcon(100)))) - .binding(defaults.helpers.bazaar.enableBazaarHelper, - () -> config.helpers.bazaar.enableBazaarHelper, - newValue -> config.helpers.bazaar.enableBazaarHelper = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.itemPrice.enableItemPriceLookup")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.itemPrice.enableItemPriceLookup.@Tooltip"))) - .binding(defaults.helpers.itemPrice.enableItemPriceLookup, - () -> config.helpers.itemPrice.enableItemPriceLookup, - newValue -> config.helpers.itemPrice.enableItemPriceLookup = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.createBuilder() - .name(Text.translatable("skyblocker.config.helpers.itemPrice.enableItemPriceRefresh")) - .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.itemPrice.enableItemPriceRefresh.@Tooltip"))) - .binding(defaults.helpers.itemPrice.enableItemPriceRefresh, - () -> config.helpers.itemPrice.enableItemPriceRefresh, - newValue -> config.helpers.itemPrice.enableItemPriceRefresh = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(ConfigUtils.createShortcutToKeybindsScreen()) - .build()) - .build(); - } + //Bazaar + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.bazaar")) + .collapsed(true) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.bazaar.enableBazaarHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.bazaar.enableBazaarHelper.@Tooltip", BazaarHelper.getExpiringIcon(), BazaarHelper.getExpiredIcon(), BazaarHelper.getFilledIcon(69), BazaarHelper.getFilledIcon(100)))) + .binding(defaults.helpers.bazaar.enableBazaarHelper, + () -> config.helpers.bazaar.enableBazaarHelper, + newValue -> config.helpers.bazaar.enableBazaarHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.itemPrice.enableItemPriceLookup")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.itemPrice.enableItemPriceLookup.@Tooltip"))) + .binding(defaults.helpers.itemPrice.enableItemPriceLookup, + () -> config.helpers.itemPrice.enableItemPriceLookup, + newValue -> config.helpers.itemPrice.enableItemPriceLookup = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.itemPrice.enableItemPriceRefresh")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.itemPrice.enableItemPriceRefresh.@Tooltip"))) + .binding(defaults.helpers.itemPrice.enableItemPriceRefresh, + () -> config.helpers.itemPrice.enableItemPriceRefresh, + newValue -> config.helpers.itemPrice.enableItemPriceRefresh = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(ConfigUtils.createShortcutToKeybindsScreen()) + .build()) + .build(); + } } diff --git a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java index a2a4780e..4301282b 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java @@ -1,8 +1,12 @@ package de.hysky.skyblocker.config.configs; +import de.hysky.skyblocker.skyblock.item.SkyblockItemRarity; +import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.waypoint.Waypoint; import dev.isxander.yacl3.config.v2.api.SerialEntry; +import java.util.List; + public class HelperConfig { @SerialEntry @@ -80,6 +84,27 @@ public class HelperConfig { @SerialEntry public boolean hideOtherPlayersRods = false; + + @SerialEntry + public List fishingHudEnabledLocations = List.of(Location.values()); + + @SerialEntry + public boolean onlyShowHudInBarn = true; + + @SerialEntry + public int timerLength = 340; + + @SerialEntry + public boolean seaCreatureTimerNotification = true; + + @SerialEntry + public int seaCreatureCap = 30; + + @SerialEntry + public boolean seaCreatureCapNotification = true; + + @SerialEntry + public SkyblockItemRarity minimumNotificationRarity = SkyblockItemRarity.EPIC; } public static class FairySouls { diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java index 84aedae3..4a62bbde 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java @@ -9,8 +9,8 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.config.configs.SlayersConfig; import de.hysky.skyblocker.config.configs.UIAndVisualsConfig; import de.hysky.skyblocker.skyblock.CompactDamage; -import de.hysky.skyblocker.skyblock.FishingHelper; import de.hysky.skyblocker.skyblock.HealthBars; +import de.hysky.skyblocker.skyblock.fishing.FishingHelper; import de.hysky.skyblocker.skyblock.SmoothAOTE; import de.hysky.skyblocker.skyblock.chocolatefactory.EggFinder; import de.hysky.skyblocker.skyblock.crimson.dojo.DojoManager; @@ -22,6 +22,7 @@ import de.hysky.skyblocker.skyblock.dwarven.CrystalsChestHighlighter; import de.hysky.skyblocker.skyblock.dwarven.WishingCompassSolver; import de.hysky.skyblocker.skyblock.end.EnderNodes; import de.hysky.skyblocker.skyblock.end.TheEnd; +import de.hysky.skyblocker.skyblock.fishing.SeaCreatureTracker; import de.hysky.skyblocker.skyblock.slayers.SlayerManager; import de.hysky.skyblocker.skyblock.slayers.boss.demonlord.FirePillarAnnouncer; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager; @@ -78,6 +79,7 @@ public abstract class ClientPlayNetworkHandlerMixin extends ClientCommonNetworkH EggFinder.checkIfEgg(armorStandEntity); CorpseFinder.checkIfCorpse(armorStandEntity); HealthBars.healthBar(armorStandEntity); + SeaCreatureTracker.onEntitySpawn(armorStandEntity); try { //Prevent packet handling fails if something goes wrong so that entity trackers still update, just without compact damage numbers CompactDamage.compactDamage(armorStandEntity); } catch (Exception e) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java deleted file mode 100644 index dacce713..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java +++ /dev/null @@ -1,101 +0,0 @@ -package de.hysky.skyblocker.skyblock; - -import de.hysky.skyblocker.annotations.Init; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.utils.Utils; -import de.hysky.skyblocker.utils.render.RenderHelper; -import de.hysky.skyblocker.utils.render.title.Title; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; -import net.fabricmc.fabric.api.event.player.UseItemCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.FishingRodItem; -import net.minecraft.item.ItemStack; -import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; - -public class FishingHelper { - private static final Title title = new Title("skyblocker.fishing.reelNow", Formatting.GREEN); - private static long startTime; - private static long startTimeFish; - private static Vec3d normalYawVector; - - @Init - public static void init() { - UseItemCallback.EVENT.register((player, world, hand) -> { - ItemStack stack = player.getStackInHand(hand); - if (!Utils.isOnSkyblock()) { - return ActionResult.PASS; - } - if (stack.getItem() instanceof FishingRodItem) { - if (player.fishHook == null) { - start(player); - } else { - reset(); - } - } - return ActionResult.PASS; - }); - WorldRenderEvents.AFTER_TRANSLUCENT.register(FishingHelper::render); - } - - public static void start(PlayerEntity player) { - startTime = System.currentTimeMillis(); - startTimeFish = System.currentTimeMillis(); - float yawRad = player.getYaw() * 0.017453292F; - normalYawVector = new Vec3d(-MathHelper.sin(yawRad), 0, MathHelper.cos(yawRad)); - } - - public static void reset() { - startTime = 0; - startTimeFish = 0; - } - - public static void resetFish() { - startTimeFish = 0; - } - - public static void onSound(PlaySoundS2CPacket packet) { - SoundEvent sound = packet.getSound().value(); - if (SkyblockerConfigManager.get().helpers.fishing.enableFishingHelper && startTimeFish != 0 && System.currentTimeMillis() >= startTimeFish + 2000 && (sound.id().equals(SoundEvents.ENTITY_GENERIC_SPLASH.id()) || sound.id().equals(SoundEvents.ENTITY_PLAYER_SPLASH.id()))) { - ClientPlayerEntity player = MinecraftClient.getInstance().player; - if (player != null && player.fishHook != null) { - Vec3d soundToFishHook = player.fishHook.getPos().subtract(packet.getX(), 0, packet.getZ()); - if (Math.abs(normalYawVector.x * soundToFishHook.z - normalYawVector.z * soundToFishHook.x) < 0.2D && Math.abs(normalYawVector.dotProduct(soundToFishHook)) < 4D && player.squaredDistanceTo(packet.getX(), packet.getY(), packet.getZ()) > 1D) { - RenderHelper.displayInTitleContainerAndPlaySound(title, 10); - resetFish(); - } - } else { - reset(); - } - } - } - - public static void render(WorldRenderContext context) { - if (SkyblockerConfigManager.get().helpers.fishing.enableFishingTimer && startTime != 0) { - ClientPlayerEntity player = MinecraftClient.getInstance().player; - if (player != null && player.fishHook != null) { - float time = (int) ((System.currentTimeMillis() - startTime) / 100f) / 10f; //leave 1dp in seconds - float scale = SkyblockerConfigManager.get().helpers.fishing.fishingTimerScale; - Vec3d pos = player.fishHook.getPos().add(0, 0.4 + scale / 10, 0); - - Text text; - if (time >= 20 && SkyblockerConfigManager.get().helpers.fishing.changeTimerColor) { - text = Text.literal(String.valueOf(time)).formatted(Formatting.GREEN); - } else { - text = Text.literal(String.valueOf(time)); - } - - RenderHelper.renderText(context, text, pos, scale, true); - } - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fishing/FishingHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/fishing/FishingHelper.java new file mode 100644 index 00000000..901dccfc --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/fishing/FishingHelper.java @@ -0,0 +1,101 @@ +package de.hysky.skyblocker.skyblock.fishing; + +import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.render.RenderHelper; +import de.hysky.skyblocker.utils.render.title.Title; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.fabricmc.fabric.api.event.player.UseItemCallback; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.FishingRodItem; +import net.minecraft.item.ItemStack; +import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +public class FishingHelper { + private static final Title title = new Title("skyblocker.fishing.reelNow", Formatting.GREEN); + private static long startTime; + private static long startTimeFish; + private static Vec3d normalYawVector; + + @Init + public static void init() { + UseItemCallback.EVENT.register((player, world, hand) -> { + ItemStack stack = player.getStackInHand(hand); + if (!Utils.isOnSkyblock()) { + return ActionResult.PASS; + } + if (stack.getItem() instanceof FishingRodItem) { + if (player.fishHook == null) { + start(player); + } else { + reset(); + } + } + return ActionResult.PASS; + }); + WorldRenderEvents.AFTER_TRANSLUCENT.register(FishingHelper::render); + } + + public static void start(PlayerEntity player) { + startTime = System.currentTimeMillis(); + startTimeFish = System.currentTimeMillis(); + float yawRad = player.getYaw() * 0.017453292F; + normalYawVector = new Vec3d(-MathHelper.sin(yawRad), 0, MathHelper.cos(yawRad)); + } + + public static void reset() { + startTime = 0; + startTimeFish = 0; + } + + public static void resetFish() { + startTimeFish = 0; + } + + public static void onSound(PlaySoundS2CPacket packet) { + SoundEvent sound = packet.getSound().value(); + if (SkyblockerConfigManager.get().helpers.fishing.enableFishingHelper && startTimeFish != 0 && System.currentTimeMillis() >= startTimeFish + 2000 && (sound.id().equals(SoundEvents.ENTITY_GENERIC_SPLASH.id()) || sound.id().equals(SoundEvents.ENTITY_PLAYER_SPLASH.id()))) { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + if (player != null && player.fishHook != null) { + Vec3d soundToFishHook = player.fishHook.getPos().subtract(packet.getX(), 0, packet.getZ()); + if (Math.abs(normalYawVector.x * soundToFishHook.z - normalYawVector.z * soundToFishHook.x) < 0.2D && Math.abs(normalYawVector.dotProduct(soundToFishHook)) < 4D && player.squaredDistanceTo(packet.getX(), packet.getY(), packet.getZ()) > 1D) { + RenderHelper.displayInTitleContainerAndPlaySound(title, 10); + resetFish(); + } + } else { + reset(); + } + } + } + + public static void render(WorldRenderContext context) { + if (SkyblockerConfigManager.get().helpers.fishing.enableFishingTimer && startTime != 0) { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + if (player != null && player.fishHook != null) { + float time = (int) ((System.currentTimeMillis() - startTime) / 100f) / 10f; //leave 1dp in seconds + float scale = SkyblockerConfigManager.get().helpers.fishing.fishingTimerScale; + Vec3d pos = player.fishHook.getPos().add(0, 0.4 + scale / 10, 0); + + Text text; + if (time >= 20 && SkyblockerConfigManager.get().helpers.fishing.changeTimerColor) { + text = Text.literal(String.valueOf(time)).formatted(Formatting.GREEN); + } else { + text = Text.literal(String.valueOf(time)); + } + + RenderHelper.renderText(context, text, pos, scale, true); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fishing/FishingHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/fishing/FishingHudWidget.java new file mode 100644 index 00000000..eb0cc331 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/fishing/FishingHudWidget.java @@ -0,0 +1,89 @@ +package de.hysky.skyblocker.skyblock.fishing; + +import de.hysky.skyblocker.annotations.RegisterWidget; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen; +import de.hysky.skyblocker.skyblock.tabhud.util.Ico; +import de.hysky.skyblocker.skyblock.tabhud.widget.ComponentBasedWidget; +import de.hysky.skyblocker.skyblock.tabhud.widget.component.Components; +import de.hysky.skyblocker.utils.ColorUtils; +import de.hysky.skyblocker.utils.Location; +import de.hysky.skyblocker.utils.Utils; +import it.unimi.dsi.fastutil.objects.ObjectFloatPair; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.Vec3d; + +import java.util.Set; + +@RegisterWidget +public class FishingHudWidget extends ComponentBasedWidget { + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + private static final Vec3d BARN_LOCATION = new Vec3d(108, 89, -252); + + private static FishingHudWidget instance; + + public static FishingHudWidget getInstance() { + return instance; + } + + public FishingHudWidget() { + super(Text.literal("Fishing").formatted(Formatting.DARK_AQUA, Formatting.BOLD), Formatting.DARK_AQUA.getColorValue(), "hud_fishing"); + instance = this; + } + + @Override + public Set availableLocations() { + return Set.of(Location.values()); + } + + @Override + public void setEnabledIn(Location location, boolean enabled) { + if (enabled) { + SkyblockerConfigManager.get().helpers.fishing.fishingHudEnabledLocations.add(location); + } else { + SkyblockerConfigManager.get().helpers.fishing.fishingHudEnabledLocations.remove(location); + } + } + + @Override + public boolean isEnabledIn(Location location) { + return SkyblockerConfigManager.get().helpers.fishing.fishingHudEnabledLocations.contains(location); + } + + @Override + public boolean shouldRender(Location location) { + if (super.shouldRender(location) && SeaCreatureTracker.isCreaturesAlive()) { + if (Utils.getLocation() == Location.HUB && SkyblockerConfigManager.get().helpers.fishing.onlyShowHudInBarn) { + return isBarnFishing(); + } + return true; + } + return false; + } + + @Override + public void updateContent() { + if (MinecraftClient.getInstance().currentScreen instanceof WidgetsConfigurationScreen) { + addComponent(Components.progressComponent(Ico.SALMON_BUCKET, Text.of("Alive Creatures"), Text.of("3/5"), 60, ColorUtils.percentToColor(40))); + addComponent(Components.progressComponent(Ico.CLOCK, Text.of("Time Left"), Text.of("1m"), 60f / SkyblockerConfigManager.get().helpers.fishing.timerLength * 100)); + return; + } + + ObjectFloatPair timer = SeaCreatureTracker.getTimerText(SeaCreatureTracker.getOldestSeaCreatureAge()); + int seaCreatureCap = SeaCreatureTracker.getSeaCreatureCap(); + float seaCreaturePercent = (float) SeaCreatureTracker.seaCreatureCount() / seaCreatureCap * 100; + addComponent(Components.progressComponent(Ico.TROPICAL_FISH_BUCKET, Text.of("Alive Creatures"), Text.of(SeaCreatureTracker.seaCreatureCount() + "/" + seaCreatureCap), seaCreaturePercent, ColorUtils.percentToColor(100 - seaCreaturePercent))); + addComponent(Components.progressComponent(Ico.CLOCK, Text.of("Time Left"), timer.left(), timer.rightFloat())); + } + + @Override + public Text getDisplayName() { + return Text.literal("Fishing Hud"); + } + + private static boolean isBarnFishing() { + return CLIENT.player != null && CLIENT.player.squaredDistanceTo(BARN_LOCATION) < 2500; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fishing/SeaCreature.java b/src/main/java/de/hysky/skyblocker/skyblock/fishing/SeaCreature.java new file mode 100644 index 00000000..626c7df7 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/fishing/SeaCreature.java @@ -0,0 +1,84 @@ +package de.hysky.skyblocker.skyblock.fishing; + +import de.hysky.skyblocker.skyblock.item.SkyblockItemRarity; + +public enum SeaCreature { + NIGHT_SQUID("Night Squid", "Pitch darkness reveals a Night Squid.", SkyblockItemRarity.COMMON, SeaCreatureCategory.PARK), + AGARIMOO("Agarimoo", "Your Chumcap Bucket trembles, it's an Agarimoo.", SkyblockItemRarity.RARE, SeaCreatureCategory.CHUMCAP), + CARROT_KING("Carrot King", "Is this even a fish? It's the Carrot King!", SkyblockItemRarity.RARE, SeaCreatureCategory.CARROT), + SQUID("Squid", "A Squid appeared.", SkyblockItemRarity.COMMON, SeaCreatureCategory.WATER), + SEA_WALKER("Sea Walker", "You caught a Sea Walker.", SkyblockItemRarity.COMMON, SeaCreatureCategory.WATER), + SEA_GUARDIAN("Sea Guardian", "You stumbled upon a Sea Guardian.", SkyblockItemRarity.COMMON, SeaCreatureCategory.WATER), + SEA_ARCHER("Sea Archer", "You reeled in a Sea Archer.", SkyblockItemRarity.UNCOMMON, SeaCreatureCategory.WATER), + RIDER_OF_THE_DEEP("Rider of the Deep", "The Rider of the Deep has emerged.", SkyblockItemRarity.UNCOMMON, SeaCreatureCategory.WATER), + SEA_WITCH("Sea Witch", "It looks like you've disrupted the Sea Witch's brewing session. Watch out, she's furious!", SkyblockItemRarity.UNCOMMON, SeaCreatureCategory.WATER), + CATFISH("Catfish", "Huh? A Catfish!", SkyblockItemRarity.RARE, SeaCreatureCategory.WATER), + SEA_LEECH("Sea Leech", "Gross! A Sea Leech!", SkyblockItemRarity.RARE, SeaCreatureCategory.WATER), + GUARDIAN_DEFENDER("Guardian Defender", "You've discovered a Guardian Defender of the sea.", SkyblockItemRarity.EPIC, SeaCreatureCategory.WATER), + DEEP_SEA_PROTECTOR("Deep Sea Protector", "You have awoken the Deep Sea Protector, prepare for a battle!", SkyblockItemRarity.EPIC, SeaCreatureCategory.WATER), + WATER_HYDRA("Water Hydra", "The Water Hydra has come to test your strength.", SkyblockItemRarity.LEGENDARY, SeaCreatureCategory.WATER), + THE_SEA_EMPEROR("The Sea Emperor", "The Sea Emperor arises from the depths.", SkyblockItemRarity.LEGENDARY, SeaCreatureCategory.WATER), + FROZEN_STEVE("Frozen Steve", "Frozen Steve fell into the pond long ago, never to resurface...until now!", SkyblockItemRarity.COMMON, SeaCreatureCategory.WINTER_ISLAND), + FROSTY("Frosty", "It's a snowman! He looks harmless.", SkyblockItemRarity.COMMON, SeaCreatureCategory.WINTER_ISLAND), + GRINCH("Grinch", "The Grinch stole Jerry's §rGifts...get§r them back!", SkyblockItemRarity.UNCOMMON, SeaCreatureCategory.WINTER_ISLAND), + NUTCRACKER("Nutcracker", "You found a forgotten Nutcracker laying beneath the ice.", SkyblockItemRarity.LEGENDARY, SeaCreatureCategory.WINTER_ISLAND), + YETI("Yeti", "What is this creature!?", SkyblockItemRarity.LEGENDARY, SeaCreatureCategory.WINTER_ISLAND), + REINDRAKE("Reindrake", "A Reindrake forms from the depths.", SkyblockItemRarity.LEGENDARY, SeaCreatureCategory.WINTER_ISLAND), + SCARECROW("Scarecrow", "Phew! It's only a Scarecrow.", SkyblockItemRarity.COMMON, SeaCreatureCategory.SPOOKY), + NIGHTMARE("Nightmare", "You hear trotting from beneath the waves, you caught a Nightmare.", SkyblockItemRarity.RARE, SeaCreatureCategory.SPOOKY), + WEREWOLF("Werewolf", "It must be a full moon, a Werewolf appears.", SkyblockItemRarity.EPIC, SeaCreatureCategory.SPOOKY), + PHANTOM_FISHER("Phantom Fisher", "The spirit of a long lost Phantom Fisher has come to haunt you.", SkyblockItemRarity.LEGENDARY, SeaCreatureCategory.SPOOKY), + GRIM_REAPER("Grim Reaper", "This can't be! The manifestation of death himself!", SkyblockItemRarity.LEGENDARY, SeaCreatureCategory.SPOOKY), + NURSE_SHARK("Nurse Shark", "A tiny fin emerges from the water, you've caught a Nurse Shark.", SkyblockItemRarity.COMMON, SeaCreatureCategory.SHARK), + BLUE_SHARK("Blue Shark", "You spot a fin as blue as the water it came from, it's a Blue Shark.", SkyblockItemRarity.UNCOMMON, SeaCreatureCategory.SHARK), + TIGER_SHARK("Tiger Shark", "A striped beast bounds from the depths, the wild Tiger Shark!", SkyblockItemRarity.EPIC, SeaCreatureCategory.SHARK), + GREAT_WHITE_SHARK("Great White Shark", "Hide no longer, a Great White Shark has tracked your scent and thirsts for your blood!", SkyblockItemRarity.LEGENDARY, SeaCreatureCategory.SHARK), + OASIS_SHEEP("Oasis Sheep", "An Oasis Sheep appears from the water.", SkyblockItemRarity.UNCOMMON, SeaCreatureCategory.OASIS), + OASIS_RABBIT("Oasis Rabbit", "An O