From bd3f0329d0e391bd84b5f9e3ff207d9dd9815853 Mon Sep 17 00:00:00 2001 From: Yasin Date: Mon, 9 Oct 2023 12:58:02 +0200 Subject: new pr because fixing merge conflict would take too long --- .../de/hysky/skyblocker/skyblock/FairySouls.java | 215 ++++++++++ .../hysky/skyblocker/skyblock/FancyStatusBars.java | 192 +++++++++ .../hysky/skyblocker/skyblock/FishingHelper.java | 62 +++ .../hysky/skyblocker/skyblock/HotbarSlotLock.java | 40 ++ .../hysky/skyblocker/skyblock/QuiverWarning.java | 66 +++ .../skyblocker/skyblock/StatusBarTracker.java | 109 +++++ .../hysky/skyblocker/skyblock/TeleportOverlay.java | 114 +++++ .../skyblocker/skyblock/barn/HungryHiker.java | 47 ++ .../skyblocker/skyblock/barn/TreasureHunter.java | 61 +++ .../skyblocker/skyblock/dungeon/CroesusHelper.java | 34 ++ .../skyblocker/skyblock/dungeon/DungeonBlaze.java | 152 +++++++ .../skyblock/dungeon/DungeonChestProfit.java | 169 ++++++++ .../skyblocker/skyblock/dungeon/DungeonMap.java | 61 +++ .../skyblock/dungeon/DungeonMapConfigScreen.java | 62 +++ .../skyblocker/skyblock/dungeon/LividColor.java | 42 ++ .../skyblocker/skyblock/dungeon/OldLever.java | 40 ++ .../hysky/skyblocker/skyblock/dungeon/Reparty.java | 94 ++++ .../skyblock/dungeon/StarredMobGlow.java | 56 +++ .../skyblocker/skyblock/dungeon/ThreeWeirdos.java | 39 ++ .../skyblocker/skyblock/dungeon/TicTacToe.java | 136 ++++++ .../hysky/skyblocker/skyblock/dungeon/Trivia.java | 100 +++++ .../skyblock/dungeon/secrets/DungeonMapUtils.java | 275 ++++++++++++ .../skyblock/dungeon/secrets/DungeonSecrets.java | 451 ++++++++++++++++++++ .../skyblocker/skyblock/dungeon/secrets/Room.java | 473 +++++++++++++++++++++ .../skyblock/dungeon/secrets/SecretWaypoint.java | 142 +++++++ .../skyblock/dungeon/terminal/ColorTerminal.java | 72 ++++ .../skyblock/dungeon/terminal/OrderTerminal.java | 58 +++ .../dungeon/terminal/StartsWithTerminal.java | 35 ++ .../skyblocker/skyblock/dwarven/DwarvenHud.java | 144 +++++++ .../skyblock/dwarven/DwarvenHudConfigScreen.java | 66 +++ .../hysky/skyblocker/skyblock/dwarven/Fetchur.java | 53 +++ .../hysky/skyblocker/skyblock/dwarven/Puzzler.java | 39 ++ .../skyblock/experiment/ChronomatronSolver.java | 129 ++++++ .../skyblock/experiment/ExperimentSolver.java | 60 +++ .../skyblock/experiment/SuperpairsSolver.java | 81 ++++ .../skyblock/experiment/UltrasequencerSolver.java | 80 ++++ .../skyblocker/skyblock/filters/AbilityFilter.java | 15 + .../skyblocker/skyblock/filters/AdFilter.java | 39 ++ .../skyblocker/skyblock/filters/AoteFilter.java | 15 + .../skyblocker/skyblock/filters/AutopetFilter.java | 35 ++ .../skyblocker/skyblock/filters/ComboFilter.java | 16 + .../skyblocker/skyblock/filters/HealFilter.java | 15 + .../skyblock/filters/ImplosionFilter.java | 15 + .../skyblock/filters/MoltenWaveFilter.java | 15 + .../skyblocker/skyblock/filters/ShowOffFilter.java | 18 + .../skyblock/filters/SimpleChatFilter.java | 17 + .../skyblock/filters/TeleportPadFilter.java | 16 + .../skyblocker/skyblock/item/AttributeShards.java | 59 +++ .../skyblocker/skyblock/item/BackpackPreview.java | 235 ++++++++++ .../skyblock/item/CompactorDeletorPreview.java | 92 ++++ .../item/CompactorPreviewTooltipComponent.java | 54 +++ .../skyblock/item/CustomArmorDyeColors.java | 82 ++++ .../skyblocker/skyblock/item/CustomArmorTrims.java | 154 +++++++ .../skyblocker/skyblock/item/CustomItemNames.java | 74 ++++ .../skyblocker/skyblock/item/ItemCooldowns.java | 115 +++++ .../skyblocker/skyblock/item/ItemProtection.java | 75 ++++ .../skyblock/item/ItemRarityBackgrounds.java | 109 +++++ .../skyblocker/skyblock/item/PriceInfoTooltip.java | 443 +++++++++++++++++++ .../skyblock/item/SkyblockItemRarity.java | 29 ++ .../hysky/skyblocker/skyblock/item/WikiLookup.java | 56 +++ .../skyblock/itemlist/ItemFixerUpper.java | 341 +++++++++++++++ .../skyblock/itemlist/ItemListWidget.java | 102 +++++ .../skyblocker/skyblock/itemlist/ItemRegistry.java | 137 ++++++ .../skyblock/itemlist/ItemStackBuilder.java | 154 +++++++ .../skyblock/itemlist/ResultButtonWidget.java | 65 +++ .../skyblock/itemlist/SearchResultsWidget.java | 228 ++++++++++ .../skyblock/itemlist/SkyblockCraftingRecipe.java | 60 +++ .../skyblocker/skyblock/quicknav/QuickNav.java | 80 ++++ .../skyblock/quicknav/QuickNavButton.java | 107 +++++ .../skyblocker/skyblock/rift/EffigyWaypoints.java | 71 ++++ .../skyblock/rift/HealingMelonIndicator.java | 27 ++ .../skyblocker/skyblock/rift/ManiaIndicator.java | 42 ++ .../skyblock/rift/MirrorverseWaypoints.java | 88 ++++ .../skyblocker/skyblock/rift/StakeIndicator.java | 27 ++ .../de/hysky/skyblocker/skyblock/rift/TheRift.java | 22 + .../skyblock/rift/TwinClawsIndicator.java | 43 ++ .../skyblocker/skyblock/shortcut/Shortcuts.java | 208 +++++++++ .../shortcut/ShortcutsConfigListWidget.java | 232 ++++++++++ .../skyblock/shortcut/ShortcutsConfigScreen.java | 113 +++++ .../skyblock/special/SpecialEffects.java | 96 +++++ .../skyblocker/skyblock/spidersden/Relics.java | 171 ++++++++ .../hysky/skyblocker/skyblock/tabhud/TabHud.java | 39 ++ .../tabhud/screenbuilder/ScreenBuilder.java | 179 ++++++++ .../tabhud/screenbuilder/ScreenMaster.java | 144 +++++++ .../tabhud/screenbuilder/pipeline/AlignStage.java | 83 ++++ .../screenbuilder/pipeline/CollideStage.java | 153 +++++++ .../screenbuilder/pipeline/PipelineStage.java | 14 + .../tabhud/screenbuilder/pipeline/PlaceStage.java | 94 ++++ .../tabhud/screenbuilder/pipeline/StackStage.java | 114 +++++ .../hysky/skyblocker/skyblock/tabhud/util/Ico.java | 60 +++ .../skyblock/tabhud/util/PlayerListMgr.java | 171 ++++++++ .../skyblock/tabhud/util/PlayerLocator.java | 87 ++++ .../skyblock/tabhud/util/ScreenConst.java | 13 + .../tabhud/widget/CameraPositionWidget.java | 37 ++ .../skyblock/tabhud/widget/CommsWidget.java | 63 +++ .../skyblock/tabhud/widget/ComposterWidget.java | 30 ++ .../skyblock/tabhud/widget/CookieWidget.java | 50 +++ .../skyblock/tabhud/widget/DungeonBuffWidget.java | 68 +++ .../skyblock/tabhud/widget/DungeonDeathWidget.java | 47 ++ .../tabhud/widget/DungeonDownedWidget.java | 44 ++ .../tabhud/widget/DungeonPlayerWidget.java | 103 +++++ .../tabhud/widget/DungeonPuzzleWidget.java | 57 +++ .../tabhud/widget/DungeonSecretWidget.java | 26 ++ .../tabhud/widget/DungeonServerWidget.java | 48 +++ .../skyblock/tabhud/widget/EffectWidget.java | 67 +++ .../skyblock/tabhud/widget/ElectionWidget.java | 104 +++++ .../skyblock/tabhud/widget/ErrorWidget.java | 32 ++ .../skyblock/tabhud/widget/EssenceWidget.java | 47 ++ .../skyblock/tabhud/widget/EventWidget.java | 35 ++ .../skyblock/tabhud/widget/FireSaleWidget.java | 68 +++ .../skyblock/tabhud/widget/ForgeWidget.java | 81 ++++ .../skyblock/tabhud/widget/GardenServerWidget.java | 54 +++ .../skyblock/tabhud/widget/GardenSkillsWidget.java | 80 ++++ .../tabhud/widget/GardenVisitorsWidget.java | 30 ++ .../skyblock/tabhud/widget/GuestServerWidget.java | 30 ++ .../skyblock/tabhud/widget/IslandGuestsWidget.java | 47 ++ .../skyblock/tabhud/widget/IslandOwnersWidget.java | 66 +++ .../skyblock/tabhud/widget/IslandSelfWidget.java | 43 ++ .../skyblock/tabhud/widget/IslandServerWidget.java | 32 ++ .../tabhud/widget/JacobsContestWidget.java | 62 +++ .../skyblock/tabhud/widget/MinionWidget.java | 151 +++++++ .../skyblock/tabhud/widget/ParkServerWidget.java | 30 ++ .../skyblock/tabhud/widget/PlayerListWidget.java | 71 ++++ .../skyblock/tabhud/widget/PowderWidget.java | 29 ++ .../skyblock/tabhud/widget/ProfileWidget.java | 28 ++ .../skyblock/tabhud/widget/QuestWidget.java | 33 ++ .../skyblock/tabhud/widget/ReputationWidget.java | 69 +++ .../skyblock/tabhud/widget/ServerWidget.java | 30 ++ .../skyblock/tabhud/widget/SkillsWidget.java | 78 ++++ .../skyblock/tabhud/widget/TrapperWidget.java | 25 ++ .../skyblock/tabhud/widget/UpgradeWidget.java | 51 +++ .../skyblock/tabhud/widget/VolcanoWidget.java | 59 +++ .../skyblocker/skyblock/tabhud/widget/Widget.java | 216 ++++++++++ .../tabhud/widget/component/Component.java | 31 ++ .../widget/component/IcoFatTextComponent.java | 45 ++ .../tabhud/widget/component/IcoTextComponent.java | 40 ++ .../widget/component/PlainTextComponent.java | 30 ++ .../tabhud/widget/component/PlayerComponent.java | 39 ++ .../tabhud/widget/component/ProgressComponent.java | 69 +++ .../tabhud/widget/component/TableComponent.java | 58 +++ .../skyblock/tabhud/widget/hud/HudCommsWidget.java | 73 ++++ .../tabhud/widget/rift/AdvertisementWidget.java | 35 ++ .../tabhud/widget/rift/GoodToKnowWidget.java | 69 +++ .../tabhud/widget/rift/RiftProfileWidget.java | 21 + .../tabhud/widget/rift/RiftProgressWidget.java | 123 ++++++ .../tabhud/widget/rift/RiftServerInfoWidget.java | 27 ++ .../tabhud/widget/rift/RiftStatsWidget.java | 43 ++ .../skyblock/tabhud/widget/rift/ShenWidget.java | 22 + 148 files changed, 12453 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/FairySouls.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/HotbarSlotLock.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/QuiverWarning.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/barn/HungryHiker.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/barn/TreasureHunter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonBlaze.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonChestProfit.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/OldLever.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/Reparty.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/StarredMobGlow.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/ThreeWeirdos.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/TicTacToe.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/Trivia.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/Room.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dwarven/Fetchur.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/dwarven/Puzzler.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/experiment/ChronomatronSolver.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/experiment/ExperimentSolver.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/experiment/SuperpairsSolver.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/AbilityFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/AdFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/AoteFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/AutopetFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/ComboFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/HealFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/ImplosionFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/MoltenWaveFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/ShowOffFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/SimpleChatFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/filters/TeleportPadFilter.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/AttributeShards.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/BackpackPreview.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/CompactorDeletorPreview.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/CompactorPreviewTooltipComponent.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorDyeColors.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorTrims.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/CustomItemNames.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/ItemCooldowns.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/ItemProtection.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/ItemRarityBackgrounds.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/PriceInfoTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockItemRarity.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/WikiLookup.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemFixerUpper.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemRegistry.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/itemlist/ResultButtonWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/itemlist/SkyblockCraftingRecipe.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/rift/EffigyWaypoints.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/rift/HealingMelonIndicator.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/rift/ManiaIndicator.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/rift/MirrorverseWaypoints.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/rift/StakeIndicator.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/rift/TwinClawsIndicator.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/shortcut/Shortcuts.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/spidersden/Relics.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/TabHud.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerLocator.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/ScreenConst.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CommsWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComposterWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CookieWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EffectWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ElectionWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ErrorWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EssenceWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EventWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ForgeWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/JacobsContestWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/MinionWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ParkServerWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PowderWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ProfileWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/QuestWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ReputationWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ServerWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/SkillsWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TrapperWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/UpgradeWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/VolcanoWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/Widget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/Component.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/TableComponent.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudCommsWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FairySouls.java b/src/main/java/de/hysky/skyblocker/skyblock/FairySouls.java new file mode 100644 index 00000000..24465e06 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/FairySouls.java @@ -0,0 +1,215 @@ +package de.hysky.skyblocker.skyblock; + +import com.google.common.collect.ImmutableSet; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.mojang.brigadier.CommandDispatcher; +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.config.SkyblockerConfig; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.NEURepo; +import de.hysky.skyblocker.utils.PosUtils; +import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.render.RenderHelper; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.text.Text; +import net.minecraft.util.DyeColor; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.util.*; +import java.util.concurrent.CompletableFuture; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +public class FairySouls { + private static final Logger LOGGER = LoggerFactory.getLogger(FairySouls.class); + private static CompletableFuture fairySoulsLoaded; + private static int maxSouls = 0; + private static final Map> fairySouls = new HashMap<>(); + private static final Map>> foundFairies = new HashMap<>(); + + @SuppressWarnings("UnusedReturnValue") + public static CompletableFuture runAsyncAfterFairySoulsLoad(Runnable runnable) { + if (fairySoulsLoaded == null) { + LOGGER.error("Fairy Souls have not being initialized yet! Please ensure the Fairy Souls module is initialized before modules calling this method in SkyblockerMod#onInitializeClient. This error can be safely ignore in a test environment."); + return CompletableFuture.completedFuture(null); + } + return fairySoulsLoaded.thenRunAsync(runnable); + } + + public static int getFairySoulsSize(@Nullable String location) { + return location == null ? maxSouls : fairySouls.get(location).size(); + } + + public static void init() { + loadFairySouls(); + ClientLifecycleEvents.CLIENT_STOPPING.register(FairySouls::saveFoundFairySouls); + ClientCommandRegistrationCallback.EVENT.register(FairySouls::registerCommands); + WorldRenderEvents.AFTER_TRANSLUCENT.register(FairySouls::render); + ClientReceiveMessageEvents.GAME.register(FairySouls::onChatMessage); + } + + private static void loadFairySouls() { + fairySoulsLoaded = NEURepo.runAsyncAfterLoad(() -> { + try (BufferedReader reader = new BufferedReader(new FileReader(NEURepo.LOCAL_REPO_DIR.resolve("constants").resolve("fairy_souls.json").toFile()))) { + for (Map.Entry fairySoulJson : JsonParser.parseReader(reader).getAsJsonObject().asMap().entrySet()) { + if (fairySoulJson.getKey().equals("//") || fairySoulJson.getKey().equals("Max Souls")) { + if (fairySoulJson.getKey().equals("Max Souls")) { + maxSouls = fairySoulJson.getValue().getAsInt(); + } + continue; + } + ImmutableSet.Builder fairySoulsForLocation = ImmutableSet.builder(); + for (JsonElement fairySoul : fairySoulJson.getValue().getAsJsonArray().asList()) { + fairySoulsForLocation.add(PosUtils.parsePosString(fairySoul.getAsString())); + } + fairySouls.put(fairySoulJson.getKey(), fairySoulsForLocation.build()); + } + LOGGER.debug("[Skyblocker] Loaded fairy soul locations"); + } catch (IOException e) { + LOGGER.error("[Skyblocker] Failed to load fairy soul locations", e); + } + + try (BufferedReader reader = new BufferedReader(new FileReader(SkyblockerMod.CONFIG_DIR.resolve("found_fairy_souls.json").toFile()))) { + for (Map.Entry foundFairiesForProfileJson : JsonParser.parseReader(reader).getAsJsonObject().asMap().entrySet()) { + Map> foundFairiesForProfile = new HashMap<>(); + for (Map.Entry foundFairiesForLocationJson : foundFairiesForProfileJson.getValue().getAsJsonObject().asMap().entrySet()) { + Set foundFairiesForLocation = new HashSet<>(); + for (JsonElement foundFairy : foundFairiesForLocationJson.getValue().getAsJsonArray().asList()) { + foundFairiesForLocation.add(PosUtils.parsePosString(foundFairy.getAsString())); + } + foundFairiesForProfile.put(foundFairiesForLocationJson.getKey(), foundFairiesForLocation); + } + foundFairies.put(foundFairiesForProfileJson.getKey(), foundFairiesForProfile); + } + LOGGER.debug("[Skyblocker] Loaded found fairy souls"); + } catch (FileNotFoundException ignored) { + } catch (IOException e) { + LOGGER.error("[Skyblocker] Failed to load found fairy souls", e); + } + }); + } + + private static void saveFoundFairySouls(MinecraftClient client) { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(SkyblockerMod.CONFIG_DIR.resolve("found_fairy_souls.json").toFile()))) { + JsonObject foundFairiesJson = new JsonObject(); + for (Map.Entry>> foundFairiesForProfile : foundFairies.entrySet()) { + JsonObject foundFairiesForProfileJson = new JsonObject(); + for (Map.Entry> foundFairiesForLocation : foundFairiesForProfile.getValue().entrySet()) { + JsonArray foundFairiesForLocationJson = new JsonArray(); + for (BlockPos foundFairy : foundFairiesForLocation.getValue()) { + foundFairiesForLocationJson.add(PosUtils.getPosString(foundFairy)); + } + foundFairiesForProfileJson.add(foundFairiesForLocation.getKey(), foundFairiesForLocationJson); + } + foundFairiesJson.add(foundFairiesForProfile.getKey(), foundFairiesForProfileJson); + } + SkyblockerMod.GSON.toJson(foundFairiesJson, writer); + writer.close(); + LOGGER.info("[Skyblocker] Saved found fairy souls"); + } catch (IOException e) { + LOGGER.error("[Skyblocker] Failed to write found fairy souls to file", e); + } + } + + private static void registerCommands(CommandDispatcher dispatcher, CommandRegistryAccess registryAccess) { + dispatcher.register(literal(SkyblockerMod.NAMESPACE) + .then(literal("fairySouls") + .then(literal("markAllInCurrentIslandFound").executes(context -> { + FairySouls.markAllFairiesOnCurrentIslandFound(); + context.getSource().sendFeedback(Text.translatable("skyblocker.fairySouls.markAllFound")); + return 1; + })) + .then(literal("markAllInCurrentIslandMissing").executes(context -> { + FairySouls.markAllFairiesOnCurrentIslandMissing(); + context.getSource().sendFeedback(Text.translatable("skyblocker.fairySouls.markAllMissing")); + return 1; + })))); + } + + private static void render(WorldRenderContext context) { + SkyblockerConfig.FairySouls fairySoulsConfig = SkyblockerConfigManager.get().general.fairySouls; + + if (fairySoulsConfig.enableFairySoulsHelper && fairySoulsLoaded.isDone() && fairySouls.containsKey(Utils.getLocationRaw())) { + for (BlockPos fairySoulPos : fairySouls.get(Utils.getLocationRaw())) { + boolean fairySoulNotFound = isFairySoulMissing(fairySoulPos); + if (!fairySoulsConfig.highlightFoundSouls && !fairySoulNotFound || fairySoulsConfig.highlightOnlyNearbySouls && fairySoulPos.getSquaredDistance(context.camera().getPos()) > 2500) { + continue; + } + float[] colorComponents = fairySoulNotFound ? DyeColor.GREEN.getColorComponents() : DyeColor.RED.getColorComponents(); + RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, fairySoulPos, colorComponents, 0.5F); + } + } + } + + private static void onChatMessage(Text text, boolean overlay) { + String message = text.getString(); + if (message.equals("You have already found that Fairy Soul!") || message.equals("§d§lSOUL! §fYou found a §dFairy Soul§f!")) { + markClosestFairyFound(); + } + } + + private static void markClosestFairyFound() { + if (!fairySoulsLoaded.isDone()) return; + PlayerEntity player = MinecraftClient.getInstance().player; + if (player == null) { + LOGGER.warn("[Skyblocker] Failed to mark closest fairy soul as found because player is null"); + return; + } + fairySouls.get(Utils.getLocationRaw()).stream() + .filter(FairySouls::isFairySoulMissing) + .min(Comparator.comparingDouble(fairySoulPos -> fairySoulPos.getSquaredDistance(player.getPos()))) + .filter(fairySoulPos -> fairySoulPos.getSquaredDistance(player.getPos()) <= 16) + .ifPresent(fairySoulPos -> { + initializeFoundFairiesForCurrentProfileAndLocation(); + foundFairies.get(Utils.getProfile()).get(Utils.getLocationRaw()).add(fairySoulPos); + }); + } + + private static boolean isFairySoulMissing(BlockPos fairySoulPos) { + Map> foundFairiesForProfile = foundFairies.get(Utils.getProfile()); + if (foundFairiesForProfile == null) { + return true; + } + Set foundFairiesForProfileAndLocation = foundFairiesForProfile.get(Utils.getLocationRaw()); + if (foundFairiesForProfileAndLocation == null) { + return true; + } + return !foundFairiesForProfileAndLocation.contains(fairySoulPos); + } + + public static void markAllFairiesOnCurrentIslandFound() { + initializeFoundFairiesForCurrentProfileAndLocation(); + foundFairies.get(Utils.getProfile()).get(Utils.getLocationRaw()).addAll(fairySouls.get(Utils.getLocationRaw())); + } + + public static void markAllFairiesOnCurrentIslandMissing() { + Map> foundFairiesForProfile = foundFairies.get(Utils.getProfile()); + if (foundFairiesForProfile != null) { + foundFairiesForProfile.remove(Utils.getLocationRaw()); + } + } + + private static void initializeFoundFairiesForCurrentProfileAndLocation() { + initializeFoundFairiesForProfileAndLocation(Utils.getProfile(), Utils.getLocationRaw()); + } + + private static void initializeFoundFairiesForProfileAndLocation(String profile, String location) { + foundFairies.computeIfAbsent(profile, profileKey -> new HashMap<>()); + foundFairies.get(profile).computeIfAbsent(location, locationKey -> new HashSet<>()); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java new file mode 100644 index 00000000..4cd356a8 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java @@ -0,0 +1,192 @@ +package de.hysky.skyblocker.skyblock; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.util.Identifier; + +public class FancyStatusBars { + private static final Identifier BARS = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/bars.png"); + + private final MinecraftClient client = MinecraftClient.getInstance(); + private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker; + + private final StatusBar[] bars = new StatusBar[]{ + new StatusBar(0, 16733525, 2), // Health Bar + new StatusBar(1, 5636095, 2), // Intelligence Bar + new StatusBar(2, 12106180, 1), // Defence Bar + new StatusBar(3, 8453920, 1), // Experience Bar + }; + + // Positions to show the bars + // 0: Hotbar Layer 1, 1: Hotbar Layer 2, 2: Right of hotbar + // Anything outside the set values hides the bar + private final int[] anchorsX = new int[3]; + private final int[] anchorsY = new int[3]; + + public FancyStatusBars() { + moveBar(0, 0); + moveBar(1, 0); + moveBar(2, 0); + moveBar(3, 0); + } + + private int fill(int value, int max) { + return (100 * value) / max; + } + + public boolean render(DrawContext context, int scaledWidth, int scaledHeight) { + var player = client.player; + if (!SkyblockerConfigManager.get().general.bars.enableBars || player == null || Utils.isInTheRift()) + return false; + anchorsX[0] = scaledWidth / 2 - 91; + anchorsY[0] = scaledHeight - 33; + anchorsX[1] = anchorsX[0]; + anchorsY[1] = anchorsY[0] - 10; + anchorsX[2] = (scaledWidth / 2 + 91) + 2; + anchorsY[2] = scaledHeight - 16; + + bars[0].update(statusBarTracker.getHealth()); + bars[1].update(statusBarTracker.getMana()); + int def = statusBarTracker.getDefense(); + bars[2].fill[0] = fill(def, def + 100); + bars[2].text = def; + bars[3].fill[0] = (int) (100 * player.experienceProgress); + bars[3].text = player.experienceLevel; + + // Update positions of bars from config + for (int i = 0; i < 4; i++) { + int configAnchorNum = switch (i) { + case 0 -> SkyblockerConfigManager.get().general.bars.barPositions.healthBarPosition.toInt(); + case 1 -> SkyblockerConfigManager.get().general.bars.barPositions.manaBarPosition.toInt(); + case 2 -> SkyblockerConfigManager.get().general.bars.barPositions.defenceBarPosition.toInt(); + case 3 -> SkyblockerConfigManager.get().general.bars.barPositions.experienceBarPosition.toInt(); + default -> 0; + }; + + if (bars[i].anchorNum != configAnchorNum) + moveBar(i, configAnchorNum); + } + + for (var bar : bars) { + bar.draw(context); + } + for (var bar : bars) { + bar.drawText(context); + } + return true; + } + + public void moveBar(int bar, int location) { + // Set the bar to the new anchor + bars[bar].anchorNum = location; + + // Count how many bars are in each location + int layer1Count = 0, layer2Count = 0, rightCount = 0; + for (int i = 0; i < 4; i++) { + switch (bars[i].anchorNum) { + case 0 -> layer1Count++; + case 1 -> layer2Count++; + case 2 -> rightCount++; + } + } + + // Set the bars width and offsetX according to their anchor and how many bars are on that layer + int adjustedLayer1Count = 0, adjustedLayer2Count = 0, adjustedRightCount = 0; + for (int i = 0; i < 4; i++) { + switch (bars[i].anchorNum) { + case 0 -> { + bars[i].bar_width = (172 - ((layer1Count - 1) * 11)) / layer1Count; + bars[i].offsetX = adjustedLayer1Count * (bars[i].bar_width + 11 + (layer1Count == 3 ? 0 : 1)); + adjustedLayer1Count++; + } + case 1 -> { + bars[i].bar_width = (172 - ((layer2Count - 1) * 11)) / layer2Count; + bars[i].offsetX = adjustedLayer2Count * (bars[i].bar_width + 11 + (layer2Count == 3 ? 0 : 1)); + adjustedLayer2Count++; + } + case 2 -> { + bars[i].bar_width = 50; + bars[i].offsetX = adjustedRightCount * (50 + 11); + adjustedRightCount++; + } + } + } + } + + private class StatusBar { + public final int[] fill; + public int offsetX; + private final int v; + private final int text_color; + public int anchorNum; + public int bar_width; + public Object text; + + private StatusBar(int i, int textColor, int fillNum) { + this.v = i * 9; + this.text_color = textColor; + this.fill = new int[fillNum]; + this.fill[0] = 100; + this.anchorNum = 0; + this.text = ""; + } + + public void update(StatusBarTracker.Resource resource) { + int max = resource.max(); + int val = resource.value(); + this.fill[0] = fill(val, max); + this.fill[1] = fill(resource.overflow(), max); + this.text = val; + } + + public void draw(DrawContext context) { + // Dont draw if anchorNum is outside of range + if (anchorNum < 0 || anchorNum > 2) return; + + // Draw the icon for the bar + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX, anchorsY[anchorNum], 0, v, 9, 9); + + // Draw the background for the bar + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10, anchorsY[anchorNum], 10, v, 2, 9); + for (int i = 2; i < bar_width - 2; i += 58) { + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + i, anchorsY[anchorNum], 12, v, Math.min(58, bar_width - 2 - i), 9); + } + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + bar_width - 2, anchorsY[anchorNum], 70, v, 2, 9); + + // Draw the filled part of the bar + for (int i = 0; i < fill.length; i++) { + int fill_width = this.fill[i] * (bar_width - 2) / 100; + if (fill_width >= 1) { + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum], 72 + i * 60, v, 1, 9); + } + for (int j = 1; j < fill_width - 1; j += 58) { + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], 73 + i * 60, v, Math.min(58, fill_width - 1 - j), 9); + } + if (fill_width == bar_width - 2) { + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + fill_width - 1, anchorsY[anchorNum], 131 + i * 60, v, 1, 9); + } + } + } + + public void drawText(DrawContext context) { + // Dont draw if anchorNum is outside of range + if (anchorNum < 0 || anchorNum > 2) return; + + TextRenderer textRenderer = client.textRenderer; + String text = this.text.toString(); + int x = anchorsX[anchorNum] + this.offsetX + 11 + (bar_width - textRenderer.getWidth(text)) / 2; + int y = anchorsY[anchorNum] - 3; + + final int[] offsets = new int[]{-1, 1}; + for (int i : offsets) { + context.drawText(textRenderer, text, x + i, y, 0, false); + context.drawText(textRenderer, text, x, y + i, 0, false); + } + context.drawText(textRenderer, text, x, y, text_color, false); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java new file mode 100644 index 00000000..6edb416e --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java @@ -0,0 +1,62 @@ +package de.hysky.skyblocker.skyblock; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.render.RenderHelper; +import de.hysky.skyblocker.utils.render.title.Title; +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.util.Formatting; +import net.minecraft.util.TypedActionResult; +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 Vec3d normalYawVector; + + public static void init() { + UseItemCallback.EVENT.register((player, world, hand) -> { + ItemStack stack = player.getStackInHand(hand); + if (stack.getItem() instanceof FishingRodItem) { + if (player.fishHook == null) { + start(player); + } else { + reset(); + } + } + return TypedActionResult.pass(stack); + }); + } + + public static void start(PlayerEntity player) { + startTime = System.currentTimeMillis(); + float yawRad = player.getYaw() * 0.017453292F; + normalYawVector = new Vec3d(-MathHelper.sin(yawRad), 0, MathHelper.cos(yawRad)); + } + + public static void reset() { + startTime = 0; + } + + public static void onSound(PlaySoundS2CPacket packet) { + String path = packet.getSound().value().getId().getPath(); + if (SkyblockerConfigManager.get().general.fishing.enableFishingHelper && startTime != 0 && System.currentTimeMillis() >= startTime + 2000 && ("entity.generic.splash".equals(path) || "entity.player.splash".equals(path))) { + 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.getPos().squaredDistanceTo(packet.getX(), packet.getY(), packet.getZ()) > 1D) { + RenderHelper.displayInTitleContainerAndPlaySound(title, 10); + reset(); + } + } else { + reset(); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/HotbarSlotLock.java b/src/main/java/de/hysky/skyblocker/skyblock/HotbarSlotLock.java new file mode 100644 index 00000000..13f09ec6 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/HotbarSlotLock.java @@ -0,0 +1,40 @@ +package de.hysky.skyblocker.skyblock; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.option.KeyBinding; +import org.lwjgl.glfw.GLFW; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; + +public class HotbarSlotLock { + public static KeyBinding hotbarSlotLock; + + public static void init() { + hotbarSlotLock = KeyBindingHelper.registerKeyBinding(new KeyBinding( + "key.hotbarSlotLock", + GLFW.GLFW_KEY_H, + "key.categories.skyblocker" + )); + } + + public static boolean isLocked(int slot) { + return SkyblockerConfigManager.get().general.lockedSlots.contains(slot); + } + + public static void handleDropSelectedItem(int slot, CallbackInfoReturnable cir) { + if (isLocked(slot)) cir.setReturnValue(false); + } + + public static void handleInputEvents(ClientPlayerEntity player) { + while (hotbarSlotLock.wasPressed()) { + List lockedSlots = SkyblockerConfigManager.get().general.lockedSlots; + int selected = player.getInventory().selectedSlot; + if (!isLocked(player.getInventory().selectedSlot)) lockedSlots.add(selected); + else lockedSlots.remove(Integer.valueOf(selected)); + SkyblockerConfigManager.save(); + } + } +} \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/skyblock/QuiverWarning.java b/src/main/java/de/hysky/skyblocker/skyblock/QuiverWarning.java new file mode 100644 index 00000000..a6c45d21 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/QuiverWarning.java @@ -0,0 +1,66 @@ +package de.hysky.skyblocker.skyblock; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.scheduler.Scheduler; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.hud.InGameHud; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.jetbrains.annotations.Nullable; + +public class QuiverWarning { + @Nullable + private static Type warning = null; + + public static void init() { + ClientReceiveMessageEvents.ALLOW_GAME.register(QuiverWarning::onChatMessage); + Scheduler.INSTANCE.scheduleCyclic(QuiverWarning::update, 10); + } + + public static boolean onChatMessage(Text text, boolean overlay) { + String message = text.getString(); + if (SkyblockerConfigManager.get().general.quiverWarning.enableQuiverWarning && message.endsWith("left in your Quiver!")) { + MinecraftClient.getInstance().inGameHud.setDefaultTitleFade(); + if (message.startsWith("You only have 50")) { + onChatMessage(Type.FIFTY_LEFT); + } else if (message.startsWith("You only have 10")) { + onChatMessage(Type.TEN_LEFT); + } else if (message.startsWith("You don't have any more")) { + onChatMessage(Type.EMPTY); + } + } + return true; + } + + private static void onChatMessage(Type warning) { + if (!Utils.isInDungeons()) { + MinecraftClient.getInstance().inGameHud.setTitle(Text.translatable(warning.key).formatted(Formatting.RED)); + } else if (SkyblockerConfigManager.get().general.quiverWarning.enableQuiverWarningInDungeons) { + MinecraftClient.getInstance().inGameHud.setTitle(Text.translatable(warning.key).formatted(Formatting.RED)); + QuiverWarning.warning = warning; + } + } + + public static void update() { + if (warning != null && SkyblockerConfigManager.get().general.quiverWarning.enableQuiverWarning && SkyblockerConfigManager.get().general.quiverWarning.enableQuiverWarningAfterDungeon && !Utils.isInDungeons()) { + InGameHud inGameHud = MinecraftClient.getInstance().inGameHud; + inGameHud.setDefaultTitleFade(); + inGameHud.setTitle(Text.translatable(warning.key).formatted(Formatting.RED)); + warning = null; + } + } + + private enum Type { + NONE(""), + FIFTY_LEFT("50Left"), + TEN_LEFT("10Left"), + EMPTY("empty"); + private final String key; + + Type(String key) { + this.key = "skyblocker.quiverWarning." + key; + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java b/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java new file mode 100644 index 00000000..c3483102 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java @@ -0,0 +1,109 @@ +package de.hysky.skyblocker.skyblock; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.text.Text; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StatusBarTracker { + private static final Pattern STATUS_HEALTH = Pattern.compile("§[6c](\\d+(,\\d\\d\\d)*)/(\\d+(,\\d\\d\\d)*)❤(?:(\\+§c(\\d+(,\\d\\d\\d)*). *)| *)"); + private static final Pattern DEFENSE_STATUS = Pattern.compile("§a(\\d+(,\\d\\d\\d)*)§a❈ Defense *"); + private static final Pattern MANA_USE = Pattern.compile("§b-(\\d+(,\\d\\d\\d)*) Mana \\(§\\S+(?:\\s\\S+)* *"); + private static final Pattern MANA_STATUS = Pattern.compile("§b(\\d+(,\\d\\d\\d)*)/(\\d+(,\\d\\d\\d)*)✎ (?:Mana|§3(\\d+(,\\d\\d\\d)*)ʬ) *"); + + private Resource health = new Resource(100, 100, 0); + private Resource mana = new Resource(100, 100, 0); + private int defense = 0; + + public void init() { + ClientReceiveMessageEvents.MODIFY_GAME.register(this::onOverlayMessage); + } + + public Resource getHealth() { + return this.health; + } + + public Resource getMana() { + return this.mana; + } + + public int getDefense() { + return this.defense; + } + + private int parseInt(Matcher m, int group) { + return Integer.parseInt(m.group(group).replace(",", "")); + } + + private void updateMana(Matcher m) { + int value = parseInt(m, 1); + int max = parseInt(m, 3); + int overflow = m.group(5) == null ? 0 : parseInt(m, 5); + this.mana = new Resource(value, max, overflow); + } + + private void updateHealth(Matcher m) { + int value = parseInt(m, 1); + int max = parseInt(m, 3); + int overflow = Math.max(0, value - max); + if (MinecraftClient.getInstance() != null && MinecraftClient.getInstance().player != null) { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + value = (int) (player.getHealth() * max / player.getMaxHealth()); + overflow = (int) (player.getAbsorptionAmount() * max / player.getMaxHealth()); + } + this.health = new Resource(Math.min(value, max), max, Math.min(overflow, max)); + } + + private String reset(String str, Matcher m) { + str = str.substring(m.end()); + m.reset(str); + return str; + } + + private Text onOverlayMessage(Text text, boolean overlay) { + if (!overlay || !Utils.isOnSkyblock() || !SkyblockerConfigManager.get().general.bars.enableBars || Utils.isInTheRift()) { + return text; + } + return Text.of(update(text.getString(), SkyblockerConfigManager.get().messages.hideMana)); + } + + public String update(String actionBar, boolean filterManaUse) { + var sb = new StringBuilder(); + Matcher matcher = STATUS_HEALTH.matcher(actionBar); + if (!matcher.lookingAt()) + return actionBar; + updateHealth(matcher); + if (matcher.group(5) != null) { + sb.append("§c❤"); + sb.append(matcher.group(5)); + } + actionBar = reset(actionBar, matcher); + if (matcher.usePattern(MANA_STATUS).lookingAt()) { + defense = 0; + updateMana(matcher); + actionBar = reset(actionBar, matcher); + } else { + if (matcher.usePattern(DEFENSE_STATUS).lookingAt()) { + defense = parseInt(matcher, 1); + actionBar = reset(actionBar, matcher); + } else if (filterManaUse && matcher.usePattern(MANA_USE).lookingAt()) { + actionBar = reset(actionBar, matcher); + } + if (matcher.usePattern(MANA_STATUS).find()) { + updateMana(matcher); + matcher.appendReplacement(sb, ""); + } + } + matcher.appendTail(sb); + String res = sb.toString().trim(); + return res.isEmpty() ? null : res; + } + + public record Resource(int value, int max, int overflow) { + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java new file mode 100644 index 00000000..e878d108 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java @@ -0,0 +1,114 @@ +package de.hysky.skyblocker.skyblock; + +import com.mojang.blaze3d.systems.RenderSystem; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.skyblock.item.PriceInfoTooltip; +import de.hysky.skyblocker.utils.render.RenderHelper; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.minecraft.block.BlockState; +import net.minecraft.client.MinecraftClient; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.BlockPos; + +public class TeleportOverlay { + private static final float[] COLOR_COMPONENTS = {118f / 255f, 21f / 255f, 148f / 255f}; + private static final MinecraftClient client = MinecraftClient.getInstance(); + + public static void init() { + WorldRenderEvents.AFTER_TRANSLUCENT.register(TeleportOverlay::render); + } + + private static void render(WorldRenderContext wrc) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.teleportOverlay.enableTeleportOverlays && client.player != null && client.world != null) { + ItemStack heldItem = client.player.getMainHandStack(); + String itemId = PriceInfoTooltip.getInternalNameFromNBT(heldItem, true); + NbtCompound nbt = heldItem.getNbt(); + + if (itemId != null) { + switch (itemId) { + case "ASPECT_OF_THE_LEECH_1" -> { + if (SkyblockerConfigManager.get().general.teleportOverlay.enableWeirdTransmission) { + render(wrc, 3); + } + } + case "ASPECT_OF_THE_LEECH_2" -> { + if (SkyblockerConfigManager.get().general.teleportOverlay.enableWeirdTransmission) { + render(wrc, 4); + } + } + case "ASPECT_OF_THE_END", "ASPECT_OF_THE_VOID" -> { + if (SkyblockerConfigManager.get().general.teleportOverlay.enableEtherTransmission && client.options.sneakKey.isPressed() && nbt != null && nbt.getCompound("ExtraAttributes").getInt("ethermerge") == 1) { + render(wrc, nbt, 57); + } else if (SkyblockerConfigManager.get().general.teleportOverlay.enableInstantTransmission) { + render(wrc, nbt, 8); + } + } + case "ETHERWARP_CONDUIT" -> { + if (SkyblockerConfigManager.get().general.teleportOverlay.enableEtherTransmission) { + render(wrc, nbt, 57); + } + } + case "SINSEEKER_SCYTHE" -> { + if (SkyblockerConfigManager.get().general.teleportOverlay.enableSinrecallTransmission) { + render(wrc, nbt, 4); + } + } + case "NECRON_BLADE", "ASTRAEA", "HYPERION", "SCYLLA", "VALKYRIE" -> { + if (SkyblockerConfigManager.get().general.teleportOverlay.enableWitherImpact) { + render(wrc, 10); + } + } + } + } + } + } + + /** + * Renders the teleport overlay with a given base range and the tuned transmission stat. + */ + private static void render(WorldRenderContext wrc, NbtCompound nbt, int baseRange) { + render(wrc, nbt != null && nbt.getCompound("ExtraAttributes").contains("tuned_transmission") ? baseRange + nbt.getCompound("ExtraAttributes").getInt("tuned_transmission") : baseRange); + } + + /** + * Renders the teleport overlay with a given range. Uses {@link MinecraftClient#crosshairTarget} if it is a block and within range. Otherwise, raycasts from the player with the given range. + * + * @implNote {@link MinecraftClient#player} and {@link MinecraftClient#world} must not be null when calling this method. + */ + private static void render(WorldRenderContext wrc, int range) { + if (client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.BLOCK && client.crosshairTarget instanceof BlockHitResult blockHitResult && client.crosshairTarget.squaredDistanceTo(client.player) < range * range) { + render(wrc, blockHitResult); + } else if (client.interactionManager != null && range > client.interactionManager.getReachDistance()) { + @SuppressWarnings("DataFlowIssue") + HitResult result = client.player.raycast(range, wrc.tickDelta(), false); + if (result.getType() == HitResult.Type.BLOCK && result instanceof BlockHitResult blockHitResult) { + render(wrc, blockHitResult); + } + } + } + + /** + * Renders the teleport overlay at the given {@link BlockHitResult}. + * + * @implNote {@link MinecraftClient#world} must not be null when calling this method. + */ + private static void render(WorldRenderContext wrc, BlockHitResult blockHitResult) { + BlockPos pos = blockHitResult.getBlockPos(); + @SuppressWarnings("DataFlowIssue") + BlockState state = client.world.getBlockState(pos); + if (!state.isAir() && client.world.getBlockState(pos.up()).isAir() && client.world.getBlockState(pos.up(2)).isAir()) { + RenderSystem.polygonOffset(-1f, -10f); + RenderSystem.enablePolygonOffset(); + + RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f); + + RenderSystem.polygonOffset(0f, 0f); + RenderSystem.disablePolygonOffset(); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/barn/HungryHiker.java b/src/main/java/de/hysky/skyblocker/skyblock/barn/HungryHiker.java new file mode 100644 index 00000000..abb4a76d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/barn/HungryHiker.java @@ -0,0 +1,47 @@ +package de.hysky.skyblocker.skyblock.barn; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.chat.ChatFilterResult; +import de.hysky.skyblocker.utils.chat.ChatPatternListener; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; + +public class HungryHiker extends ChatPatternListener { + + private static final Map foods; + + public HungryHiker() { super("^§e\\[NPC] Hungry Hiker§f: (The food I want is|(I asked for) food that is) ([a-zA-Z, '\\-]*\\.)$"); } + + @Override + public ChatFilterResult state() { + return SkyblockerConfigManager.get().locations.barn.solveHungryHiker ? ChatFilterResult.FILTER : ChatFilterResult.PASS; + } + + @Override + public boolean onMatch(Text message, Matcher matcher) { + MinecraftClient client = MinecraftClient.getInstance(); + if (client.player == null) return false; + String foodDescription = matcher.group(3); + String food = foods.get(foodDescription); + if (food == null) return false; + String middlePartOfTheMessageToSend = matcher.group(2) != null ? matcher.group(2) : matcher.group(1); + client.player.send