diff options
31 files changed, 532 insertions, 186 deletions
| diff --git a/.github/workflows/buildrelease.yml b/.github/workflows/buildrelease.yml index b062d079..8dca761f 100644 --- a/.github/workflows/buildrelease.yml +++ b/.github/workflows/buildrelease.yml @@ -42,12 +42,13 @@ jobs:            CHANGELOG=$(sed '/___/Q' CHANGELOG.md)            CHANGELOG=$(echo "$CHANGELOG" | sed 1d) -          CHANGELOGtmp="${CHANGELOG//'%'/'%25'}" -          CHANGELOGtmp="${CHANGELOGtmp//$'\n'/'%0A'}" -          CHANGELOGtmp="${CHANGELOGtmp//$'\r'/'%0D'}" -                      # changelog for Github release -          echo "changelog=$CHANGELOGtmp" >> $GITHUB_OUTPUT +          delimiter="$(openssl rand -hex 8)" +          { +            echo "changelog<<${delimiter}" +            echo "$CHANGELOGtmp" +            echo "${delimiter}" +          } >> $GITHUB_OUTPUT            #echo "Changelog:\n$CHANGELOG" # for debugging @@ -61,12 +62,13 @@ jobs:            # Store the highlight_section in the CHANGELOG variable            CHANGELOG=$(echo -n "$highlight_section") -          CHANGELOG="${CHANGELOG//'%'/'%25'}" -          CHANGELOG="${CHANGELOG//$'\n'/'%0A'}" -          CHANGELOG="${CHANGELOG//$'\r'/'%0D'}" -                      # changelog for rest -          echo "changelog_highlight=$CHANGELOG" >> $GITHUB_OUTPUT +          delimiter="$(openssl rand -hex 8)" +          { +            echo "changelog_highlight<<${delimiter}" +            echo "$CHANGELOG" +            echo "${delimiter}" +          } >> $GITHUB_OUTPUT        - uses: actions/github-script@v7          id: fname diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b05e805..19e396b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,79 @@ +# Release 1.18.0 + +## Highlight +* **New Dungeon Solvers**: +  * Silverfish Solvers by @kevinthegreat1 +  * Ice Fill Solvers by @kevinthegreat1 +  * Boulder Solver by @LifeIsAParadox +* **Crystal Hollows Feature**: +  * Crystal Hollows Map by @olim88 and @AzureAaron +  * Waypoints for special locations by @olim88 and @AzureAaron +  * Powder HUD by @olim88 and @AzureAaron +    * Mithril +    * Gemstone +* **Kuudra Features** by @AzureAaron +  * Kuudra waypoints +  * No arrow poison warning +  * Low arrow poison warning +* **Search overlays for bz and ah** by @olim88 +* **End HUD Widget** by @viciscat +  * Zealots +    * *Since last eye* +    * *Total zealots kills* +    * *Avg kills per eye* +  * Endstone Protector +    * *stage* +    * *Location* +* **Garden Features**: +  * Visitor helper by @esteban4567890 +    * easy way to buy items that visitors require from bazaar by clicking the text +  * Disable title and chat messages for Melon/Pumpkin Dicer by @Ghost-3 +* **Improve Item Protection feature** by @LifeIsAParadox +  * protect item with shortcut "v" +  * indicator in form of a star + +## What's Changed +* Nothing to see here by @kevinthegreat1 in https://github.com/SkyblockerMod/Skyblocker/pull/526 +* Crystal hollows fetures by @olim88 in https://github.com/SkyblockerMod/Skyblocker/pull/523 +* Beacon Highlighter performance fix + Fix fire sales widget by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/521 +* Fix chest value not getting price data under certain circumstances by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/522 +* Update mayor cache every 20 minutes by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/525 +* Update IF conflict by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/529 +* Remove 1.20.2 from version selection menu in issue templates by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/530 +* Add the missing starter commission to the Dwarven HUD. by @Kaluub in https://github.com/SkyblockerMod/Skyblocker/pull/532 +* Kuudra Features by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/519 +* Disable title and chat messages for Melon/Pumpkin Dicer by @Ghost-3 in https://github.com/SkyblockerMod/Skyblocker/pull/534 +* Add Visitor helper by @esteban4567890 in https://github.com/SkyblockerMod/Skyblocker/pull/535 +* Search overlays for bz and ah by @olim88 in https://github.com/SkyblockerMod/Skyblocker/pull/537 +* Add End HUD Widget by @viciscat in https://github.com/SkyblockerMod/Skyblocker/pull/524 +* Boulder Solver by @LifeIsAParadox in https://github.com/SkyblockerMod/Skyblocker/pull/540 +* Item Quality (dungeon drops) by @Fluboxer in https://github.com/SkyblockerMod/Skyblocker/pull/541 +* Treasure Hoarder Puncher Commission fix by @Ghost-3 in https://github.com/SkyblockerMod/Skyblocker/pull/542 +* center table components in tabhud by @btwonion in https://github.com/SkyblockerMod/Skyblocker/pull/543 +* Check all door blocks and fix fairy room door by @kevinthegreat1 in https://github.com/SkyblockerMod/Skyblocker/pull/536 +* Show the diff in the Powders widget by @Ghost-3 in https://github.com/SkyblockerMod/Skyblocker/pull/544 +* Add Item Floor Tier to tooltip by @Fluboxer in https://github.com/SkyblockerMod/Skyblocker/pull/546 +* Better location management by @Ghost-3 in https://github.com/SkyblockerMod/Skyblocker/pull/547 +* Small search overlay changes by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/548 +* Fix powder hud not updating when commissions hud is disabled by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/550 +* Improve secrets caching behaviour by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/545 +* Spider's Den Server Widget by @Ghost-3 in https://github.com/SkyblockerMod/Skyblocker/pull/553 +* Fix beacon highlights persisting after the boss dies by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/554 +* use mod-publish-plugin by @LifeIsAParadox in https://github.com/SkyblockerMod/Skyblocker/pull/556 +* Add Silverfish and Ice Fill Solvers by @kevinthegreat1 in https://github.com/SkyblockerMod/Skyblocker/pull/533 +* Fix discoveries index by @kevinthegreat1 in https://github.com/SkyblockerMod/Skyblocker/pull/557 +* Support the local memory cache for the API by @AzureAaron in https://github.com/SkyblockerMod/Skyblocker/pull/558 +* 4 small changes by @LifeIsAParadox in https://github.com/SkyblockerMod/Skyblocker/pull/561 +* Improve Item Protection feature by @LifeIsAParadox in https://github.com/SkyblockerMod/Skyblocker/pull/562 + +## New Contributors +* @olim88 made their first contribution in https://github.com/SkyblockerMod/Skyblocker/pull/523 +* @Ghost-3 made their first contribution in https://github.com/SkyblockerMod/Skyblocker/pull/534 +* @esteban4567890 made their first contribution in https://github.com/SkyblockerMod/Skyblocker/pull/535 +* @Fluboxer made their first contribution in https://github.com/SkyblockerMod/Skyblocker/pull/541 + +**Full Changelog**: https://github.com/SkyblockerMod/Skyblocker/compare/v1.17.0...v1.18.0 +___  # Release 1.17.0  ## Highlight diff --git a/FEATURES.md b/FEATURES.md index b442a56f..987c4fd9 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -5,16 +5,19 @@  - **Starred Mob Glow**  - **Croesus Helper**  - **Puzzle Solver:** -    - *Three Weirdos* -    - *Blaze* -    - *Creeper Beams* -    - *Quiz - Ouro the Omniscient* -    - *Tic Tac Toe* -    - *Waterboard* -    - *Terminal:* -        - *Order* -        - *Coloured Items* -        - *Item Name* +  - *Three Weirdos* +  - *Blaze* +  - *Creeper Beams* +  - *Quiz - Ouro the Omniscient* +  - *Tic Tac Toe* +  - *Waterboard* +  - *Silverfish* +  - *Ice Fill* +  - *Boulder* +  - Terminal: +    - *Order* +    - *Coloured Items* +    - *Item Name*  - **Rare Drop Special Effects**  - **Chest Profit Calculator**  - **F3/M3 Fire Freeze Staff Timer** @@ -27,6 +30,16 @@  - **resourcepack recoloring textures in dungeons**  - **score title and sound** +### Kuudra Features +- **Kuudra waypoints** +  - *Supplies* +  - *Supply Piles* +  - *Fuel Cells* +  - *Safe Spots* +  - *Pearl* +- **No arrow poison warning** +- **Low arrow poison warning** +  ### Item and Armor Customization:  - *Item Renaming*  - *Custom Armor Dye Colors* @@ -34,17 +47,25 @@  ### Health and Status Bars:  - **Bars:** -    - *Health and absorption* -    - *Mana* -    - *Defense* -    - *XP* +  - *Health and absorption* +  - *Mana* +  - *Defense* +  - *XP* -### Dwarven Mines: +### Dwarven Mines / Crystal Hollows:  - **Dwarven Mines Solver:** -    - *Fetchur* -    - *Puzzler* +  - Fetchur +  - Puzzler +- **Crystal Hollows** +  - Crystal Hollows Map +    - *Shows players location in Crystal Hollows* +    - *Highlights important waypoints in Crystal Hollows* +  - Crystal Hollows Waypoints +    - *Shows waypoints for special locations* +    - *Find locations in chat messages*  - **Commission HUD** -    - *Provides information on Dwarven Mines quests* +  - *Provides information on Dwarven Mines quests* +- **Powder HUD**  ### Rift Features:  - **Mirrorverse Waypoints** @@ -64,6 +85,11 @@    - Beacon Highlighting    - Nukekubi Head Highlighting +### Garden Features: +- **Visitor Helper** +  - buy items that visitors require from bazaar by clicking the text +- **Disable title and chat messages for Melon/Pumpkin Dicer** +  ### Visual Enhancements:  - **Fancy Tab HUD:** Fully configurable with a resource pack.  - **1.8 Hitbox for Lever and Farmland** @@ -74,37 +100,48 @@    - Circle or Square  - **Item Cooldown Display**  - **Configure Fire-Overlay Height** +- **End HUD Widget** +  - Zealots +    - *Since last eye* +    - *Total zealots kills* +    - *Avg kills per eye* +  - Endstone Protector +    - *stage* +    - *Location*  ### User Interface Enhancements: +- **Search overlays for bz and ah**  - **Attribute Shard Info Display**  - **Drill Fuel and Pickonimbus 2000 in Item Durability Bar**  - **Hotbar Slot Lock Keybind:** Select the hotbar slot you want to lock/unlock and press the lock button.  - **Item Tooltip:** (Provides information on) -    - *NPC Prices* -    - *Motes Prices* -    - *bazaar (average, lowest bin)* -    - *Auction House* -    - *Museum* -    - *Exotic Armor Identifier* +  - *NPC Sell Prices* +  - *Motes Prices* +  - *bazaar (average, lowest bin)* +  - *Auction House* +  - *Museum* +  - *Exotic Armor Identifier* +  - *Item Quality*  +  - **  - **Quicknav:** (Fully customizeable) Fast navigation between pets, armor, enderchest, skill, collection, crafting, enchant, anvil, warp dungeon, and warp hub.  - **Recipe Book:** Lists all Skyblock items in the vanilla recipe book, allowing you to see the recipe of the item.  - **Backpack Preview:** After clicking your backpack or enderchest once, you can hover over the backpack or enderchest and hold Shift to preview its contents.  ### Barn Features:  - **Barn Solver:** -    - *Treasure Hunter* -    - *Hungry Hiker* +  - *Treasure Hunter* +  - *Hungry Hiker*  ### Chat Features:  - **Hide Messages:** -    - *Ability Cooldown* -    - *Heal* -    - *Aspect of the End (AOTE)* -    - *Implosion* -    - *Molten Wave* -    - *`/show command`* -    - *Teleport Pad Messages* -    - *Sky Mall* +  - *Ability Cooldown* +  - *Heal* +  - *Aspect of the End (AOTE)* +  - *Implosion* +  - *Molten Wave* +  - *`/show command`* +  - *Teleport Pad Messages* +  - *Sky Mall*  ### Miscellaneous Solvers:  - **Experiments Solvers** @@ -31,7 +31,10 @@ Installation guide is [here](https://github.com/SkyblockerMod/Skyblocker/wiki/in    - *Quiz - Ouro the Omniscient*    - *Tic Tac Toe*    - *Waterboard* -  - *Terminal:* +  - *Silverfish* +  - *Ice Fill* +  - *Boulder* +  - Terminal:      - *Order*      - *Coloured Items*      - *Item Name* @@ -47,6 +50,16 @@ Installation guide is [here](https://github.com/SkyblockerMod/Skyblocker/wiki/in  - **resourcepack recoloring textures in dungeons**  - **score title and sound** +### Kuudra Features +- **Kuudra waypoints** +  - *Supplies* +  - *Supply Piles* +  - *Fuel Cells* +  - *Safe Spots* +  - *Pearl* +- **No arrow poison warning** +- **Low arrow poison warning** +  ### Item and Armor Customization:  - *Item Renaming*  - *Custom Armor Dye Colors* @@ -59,19 +72,20 @@ Installation guide is [here](https://github.com/SkyblockerMod/Skyblocker/wiki/in    - *Defense*    - *XP* -### Dwarven Mines: +### Dwarven Mines / Crystal Hollows:  - **Dwarven Mines Solver:** -  - *Fetchur* -  - *Puzzler* -- **Commission/Powder HUD** +  - Fetchur +  - Puzzler +- **Crystal Hollows** +  - Crystal Hollows Map +    - *Shows players location in Crystal Hollows* +    - *Highlights important waypoints in Crystal Hollows* +  - Crystal Hollows Waypoints +    - *Shows waypoints for special locations* +    - *Find locations in chat messages* +- **Commission HUD**    - *Provides information on Dwarven Mines quests* -  - *Provides information on powder amounts* -- **Crystal Hollows Waypoints** -  - *show waypoints for special location* -  - *find locations in chat messages* -- **Crystal Hollows Map HUD** -  - *Shows players location in crystal hollows* -  - *Shows important waypoints in crystal hollows* +- **Powder HUD**  ### Rift Features:  - **Mirrorverse Waypoints** @@ -91,6 +105,11 @@ Installation guide is [here](https://github.com/SkyblockerMod/Skyblocker/wiki/in    - Beacon Highlighting    - Nukekubi Head Highlighting +### Garden Features: +- **Visitor Helper** +  - buy items that visitors require from bazaar by clicking the text +- **Disable title and chat messages for Melon/Pumpkin Dicer** +  ### Visual Enhancements:  - **Fancy Tab HUD:** Fully configurable with a resource pack.  - **1.8 Hitbox for Lever and Farmland** @@ -101,18 +120,29 @@ Installation guide is [here](https://github.com/SkyblockerMod/Skyblocker/wiki/in    - Circle or Square  - **Item Cooldown Display**  - **Configure Fire-Overlay Height** +- **End HUD Widget** +  - Zealots +    - *Since last eye* +    - *Total zealots kills* +    - *Avg kills per eye* +  - Endstone Protector +    - *stage* +    - *Location*  ### User Interface Enhancements: +- **Search overlays for bz and ah**  - **Attribute Shard Info Display**  - **Drill Fuel and Pickonimbus 2000 in Item Durability Bar**  - **Hotbar Slot Lock Keybind:** Select the hotbar slot you want to lock/unlock and press the lock button.  - **Item Tooltip:** (Provides information on) -  - *NPC Prices* +  - *NPC Sell Prices*    - *Motes Prices*    - *bazaar (average, lowest bin)*    - *Auction House*    - *Museum*    - *Exotic Armor Identifier* +  - *Item Quality* +  - **  - **Quicknav:** (Fully customizeable) Fast navigation between pets, armor, enderchest, skill, collection, crafting, enchant, anvil, warp dungeon, and warp hub.  - **Recipe Book:** Lists all Skyblock items in the vanilla recipe book, allowing you to see the recipe of the item.  - **Backpack Preview:** After clicking your backpack or enderchest once, you can hover over the backpack or enderchest and hold Shift to preview its contents. @@ -223,9 +253,15 @@ information.  |:--------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------:|----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|  |                                [Grayray75](https://github.com/Grayray75)                                 |                                [alexiayaa](https://github.com/alexiayaa)                                 | [KhafraDev](https://github.com/KhafraDev)                                                                | [btwonion](https://github.com/btwonion)                                                                | -| [<img alt="KhafraDev" src="https://github.com/Kaluub.png" width="100">](https://github.com/Kaluub) | [<img alt="KhafraDev" src="https://github.com/Emirlol.png" width="100">](https://github.com/Emirlol) | [<img alt="KhafraDev" src="https://github.com/Thsgun.png" width="100">](https://github.com/Thsgun) | -|----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------| -| [Kaluub](https://github.com/Kaluub)                                                                | [Emirlol](https://github.com/Emirlol)                                                                | [Thsgun](https://github.com/Thsgun)                                                                |       + +| [<img alt="KhafraDev" src="https://github.com/Kaluub.png" width="100">](https://github.com/Kaluub) | [<img alt="KhafraDev" src="https://github.com/Emirlol.png" width="100">](https://github.com/Emirlol) | [<img alt="KhafraDev" src="https://github.com/LegendaryLilac.png" width="100">](https://github.com/LegendaryLilac) | [<img alt="KhafraDev" src="https://github.com/olim88.png" width="100">](https://github.com/olim88) | +|----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------| +| [Kaluub](https://github.com/Kaluub)                                                                | [Emirlol](https://github.com/Emirlol)                                                                | [LegendaryLilac](https://github.com/LegendaryLilac)                                                                | [olim88](https://github.com/olim88)                                                                | + +| [<img alt="Ghost-3" src="https://github.com/Ghost-3.png" width="100">](https://github.com/Ghost-3) | [<img alt="esteban4567890" src="https://github.com/esteban4567890.png" width="100">](https://github.com/esteban4567890) | [<img alt="Fluboxer" src="https://github.com/Fluboxer.png" width="100">](https://github.com/Fluboxer) | +|----------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------| +| [Ghost-3](https://github.com/Ghost-3)                                                              | [esteban4567890](https://github.com/esteban4567890)                                                                     | [Fluboxer](https://github.com/Fluboxer)                                                               | +       ### Translators diff --git a/gradle.properties b/gradle.properties index 07340c99..6cf73016 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,7 +34,7 @@ jgit_version = 6.8.0.202311291450-r  commons_math_version = 3.6.1  # Mod Properties -mod_version = 1.17.0 +mod_version = 1.18.0  maven_group = de.hysky  archives_base_name = skyblocker  modrinth_id=y6DuFGwJ diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index dca41bd1..36ef5a4f 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -18,6 +18,7 @@ import de.hysky.skyblocker.skyblock.dwarven.CrystalsLocationsManager;  import de.hysky.skyblocker.skyblock.dwarven.DwarvenHud;  import de.hysky.skyblocker.skyblock.end.BeaconHighlighter;  import de.hysky.skyblocker.skyblock.end.TheEnd; +import de.hysky.skyblocker.skyblock.garden.VisitorHelper;  import de.hysky.skyblocker.skyblock.item.*;  import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview;  import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; @@ -139,6 +140,7 @@ public class SkyblockerMod implements ClientModInitializer {          ItemProtection.init();          CreeperBeams.init();          Boulder.init(); +        VisitorHelper.init();          ItemRarityBackgrounds.init();          MuseumItemCache.init();          SecretsTracker.init(); diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java index 713a9fbd..b4e520e2 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -178,9 +178,6 @@ public class SkyblockerConfig {  		public boolean dungeonQuality = true;  		@SerialEntry -		public boolean visitorHelper = true; - -		@SerialEntry  		public TabHudConf tabHud = new TabHudConf();  		@SerialEntry @@ -468,10 +465,10 @@ public class SkyblockerConfig {  	public static class FlameOverlay {  		@SerialEntry -		public float flameHeight = 0f; +		public int flameHeight = 100;  		@SerialEntry -		public float flameOpacity = 0f; +		public int flameOpacity = 100;  	}  	public static class SearchOverlay { @@ -1094,6 +1091,9 @@ public class SkyblockerConfig {  	public static class Garden {  		@SerialEntry  		public boolean dicerTitlePrevent = true; + +		@SerialEntry +		public boolean visitorHelper = true;  	}  	public static class Slayer { diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java index 8a7d832c..afd688d8 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java @@ -86,13 +86,6 @@ public class GeneralCategory {  								newValue -> config.general.dungeonQuality = newValue)  						.controller(ConfigUtils::createBooleanController)  						.build()) -				.option(Option.<Boolean>createBuilder() -						.name(Text.translatable("text.autoconfig.skyblocker.option.general.visitorHelper")) -						.binding(defaults.general.visitorHelper, -								() -> config.general.visitorHelper, -								newValue -> config.general.visitorHelper = newValue) -						.controller(ConfigUtils::createBooleanController) -						.build())  				//Tab Hud  				.group(OptionGroup.createBuilder() @@ -642,19 +635,21 @@ public class GeneralCategory {  				.group(OptionGroup.createBuilder()  						.name(Text.translatable("text.autoconfig.skyblocker.option.general.flameOverlay"))  						.collapsed(true) -						.option(Option.<Float>createBuilder() +						.option(Option.<Integer>createBuilder()  								.name(Text.translatable("text.autoconfig.skyblocker.option.general.flameOverlay.flameHeight")) +								.description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.flameOverlay.flameHeight.@Tooltip")))  								.binding(defaults.general.flameOverlay.flameHeight,  										() -> config.general.flameOverlay.flameHeight,  										newValue -> config.general.flameOverlay.flameHeight = newValue) -								.controller(opt -> FloatSliderControllerBuilder.create(opt).range(0.0f, 0.5f).step(0.01f)) +								.controller(opt -> IntegerSliderControllerBuilder.create(opt).range(0, 100).step(1))  								.build()) -						.option(Option.<Float>createBuilder() +						.option(Option.<Integer>createBuilder()  								.name(Text.translatable("text.autoconfig.skyblocker.option.general.flameOverlay.flameOpacity")) +								.description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.flameOverlay.flameOpacity.@Tooltip")))  								.binding(defaults.general.flameOverlay.flameOpacity,  										() -> config.general.flameOverlay.flameOpacity,  										newValue -> config.general.flameOverlay.flameOpacity = newValue) -								.controller(opt -> FloatSliderControllerBuilder.create(opt).range(0.0f, 0.8f).step(0.1f)) +								.controller(opt -> IntegerSliderControllerBuilder.create(opt).range(0, 100).step(1))  								.build())  						.build()) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java index 75c83a9b..d97513f8 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java @@ -153,6 +153,13 @@ public class LocationsCategory {  										newValue -> config.locations.garden.dicerTitlePrevent = newValue)  								.controller(ConfigUtils::createBooleanController)  								.build()) +						.option(Option.<Boolean>createBuilder() +								.name(Text.translatable("text.autoconfig.skyblocker.option.general.visitorHelper")) +								.binding(defaults.locations.garden.visitorHelper, +										() -> config.locations.garden.visitorHelper, +										newValue -> config.locations.garden.visitorHelper = newValue) +								.controller(ConfigUtils::createBooleanController) +								.build())  						.build())  				.build();  	} diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java index 8a1af570..7d2f849e 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java @@ -1,6 +1,7 @@  package de.hysky.skyblocker.mixin;  import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.systems.RenderSystem;  import de.hysky.skyblocker.SkyblockerMod;  import de.hysky.skyblocker.config.SkyblockerConfigManager;  import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver; @@ -16,11 +17,9 @@ import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview;  import de.hysky.skyblocker.utils.ItemUtils;  import de.hysky.skyblocker.utils.Utils;  import de.hysky.skyblocker.utils.render.gui.ContainerSolver; -import net.minecraft.client.MinecraftClient;  import net.minecraft.client.gui.DrawContext;  import net.minecraft.client.gui.screen.Screen;  import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.item.TooltipContext;  import net.minecraft.inventory.SimpleInventory;  import net.minecraft.item.Item;  import net.minecraft.item.ItemStack; @@ -29,6 +28,7 @@ import net.minecraft.screen.ScreenHandler;  import net.minecraft.screen.slot.Slot;  import net.minecraft.screen.slot.SlotActionType;  import net.minecraft.text.Text; +import net.minecraft.util.Identifier;  import org.jetbrains.annotations.NotNull;  import org.jetbrains.annotations.Nullable;  import org.spongepowered.asm.mixin.Final; @@ -42,6 +42,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;  import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;  import java.util.Map; +import java.util.Set;  import java.util.regex.Matcher;  @Mixin(HandledScreen.class) @@ -52,6 +53,34 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen      @Unique      private static final int OUT_OF_BOUNDS_SLOT = -999; +    @Unique +    private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png"); + +    @Unique +    private static final Set<String> FILLER_ITEMS = Set.of( +            " ", // Empty menu item +            "Locked Page", +            "Quick Crafting Slot", +            "Locked Backpack Slot 2", //Regular expressions won't be utilized here since the search by contains is based on plain text rather than regex syntax +            "Locked Backpack Slot 3", +            "Locked Backpack Slot 4", +            "Locked Backpack Slot 5", +            "Locked Backpack Slot 6", +            "Locked Backpack Slot 7", +            "Locked Backpack Slot 8", +            "Locked Backpack Slot 9", +            "Locked Backpack Slot 10", +            "Locked Backpack Slot 11", +            "Locked Backpack Slot 12", +            "Locked Backpack Slot 13", +            "Locked Backpack Slot 14", +            "Locked Backpack Slot 15", +            "Locked Backpack Slot 16", +            "Locked Backpack Slot 17", +            "Locked Backpack Slot 18", +            "Preparing" +    ); +      @Shadow      @Nullable      protected Slot focusedSlot; @@ -66,22 +95,21 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen      @Inject(at = @At("HEAD"), method = "keyPressed")      public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) { -        if (this.client != null && this.focusedSlot != null && keyCode != 256 && !this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) { -            WikiLookup.openWiki(this.focusedSlot, client.player); +        if (this.client != null && this.focusedSlot != null && keyCode != 256) { +            //wiki lookup +            if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) { +                WikiLookup.openWiki(this.focusedSlot, client.player); +            } +            //item protection +            if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && ItemProtection.itemProtection.matchesKey(keyCode, scanCode)) { +                ItemProtection.handleKeyPressed(this.focusedSlot.getStack()); +            }          }      } -    @Inject(at = @At("RETURN"), method = "render") -    public void skyblocker$renderScreen(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { -        if (!Utils.isOnSkyblock()) return; - -        if (SkyblockerConfigManager.get().general.visitorHelper && (Utils.getLocationRaw().equals("garden") && !getTitle().getString().contains("Logbook") || getTitle().getString().startsWith("Bazaar"))) -            VisitorHelper.renderScreen(this.getTitle().getString(), context, textRenderer, handler, mouseX, mouseY); -    } -      @Inject(at = @At("HEAD"), method = "mouseClicked")      public void skyblocker$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) { -        if (SkyblockerConfigManager.get().general.visitorHelper && (Utils.getLocationRaw().equals("garden") && !getTitle().getString().contains("Logbook") || getTitle().getString().startsWith("Bazaar"))) +        if (SkyblockerConfigManager.get().locations.garden.visitorHelper && (Utils.getLocationRaw().equals("garden") && !getTitle().getString().contains("Logbook") || getTitle().getString().startsWith("Bazaar")))              VisitorHelper.onMouseClicked(mouseX, mouseY, button, this.textRenderer);      } @@ -121,6 +149,9 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen          return skyblocker$experimentSolvers$getStack(slot, stack);      } +    /** +     * Redirects getStack calls to account for different stacks in experiment solvers. +     */      @Unique      private ItemStack skyblocker$experimentSolvers$getStack(Slot slot, @NotNull ItemStack stack) {          ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); @@ -131,81 +162,84 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen          return stack;      } -    @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V")) -    private void skyblocker$experimentSolvers$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { -        if (slot != null) { -            ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); -            if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { -                if (experimentSolver instanceof ChronomatronSolver chronomatronSolver) { -                    Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal()); -                    if ((slot.getStack().isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(slot.getStack().getItem()) == item) && chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) { -                        chronomatronSolver.setState(ExperimentSolver.State.END); -                    } -                } else if (experimentSolver instanceof SuperpairsSolver superpairsSolver) { -                    superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex()); -                    superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY); -                } else if (experimentSolver instanceof UltrasequencerSolver ultrasequencerSolver && slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot()) { -                    int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1; -                    ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().map(Map.Entry::getKey).ifPresentOrElse(ultrasequencerSolver::setUltrasequencerNextSlot, () -> ultrasequencerSolver.setState(ExperimentSolver.State.END)); -                } -            } -        } -    } -      /**       * The naming of this method in yarn is half true, its mostly to handle slot/item interactions (which are mouse or keyboard clicks)       * For example, using the drop key bind while hovering over an item will invoke this method to drop the players item       */ -    @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At("HEAD"), cancellable = true) -    private void skyblocker$onSlotInteract(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { -        if (Utils.isOnSkyblock()) { -            // When you try and drop the item by picking it up then clicking outside of the screen -            if (slotId == OUT_OF_BOUNDS_SLOT) { -                ItemStack cursorStack = this.handler.getCursorStack(); - -                if (ItemProtection.isItemProtected(cursorStack)) ci.cancel(); -            } - -            if (slot != null) { -                // When you click your drop key while hovering over an item -                if (actionType == SlotActionType.THROW) { -                    ItemStack stack = slot.getStack(); +    @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V"), cancellable = true) +    private void skyblocker$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { +        if (!Utils.isOnSkyblock()) return; -                    if (ItemProtection.isItemProtected(stack)) ci.cancel(); -                } +        // Item Protection +        // When you try and drop the item by picking it up then clicking outside the screen +        if (slotId == OUT_OF_BOUNDS_SLOT && ItemProtection.isItemProtected(this.handler.getCursorStack())) { +            ci.cancel(); +            return; +        } -                //Prevent salvaging -                if (this.getTitle().getString().equals("Salvage Items")) { -                    ItemStack stack = slot.getStack(); +        if (slot == null) return; +        String title = getTitle().getString(); +        ItemStack stack = skyblocker$experimentSolvers$getStack(slot, slot.getStack()); +        ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); -                    if (ItemProtection.isItemProtected(stack)) ci.cancel(); +        // Prevent clicks on filler items +        if (SkyblockerConfigManager.get().general.hideEmptyTooltips && FILLER_ITEMS.contains(stack.getName().getString()) && +                // Allow clicks in Ultrasequencer and Superpairs +                (!UltrasequencerSolver.INSTANCE.getName().matcher(title).matches() || SkyblockerConfigManager.get().general.experiments.enableUltrasequencerSolver)) { +            ci.cancel(); +            return; +        } +        // Item Protection +        // When you click your drop key while hovering over an item +        if (actionType == SlotActionType.THROW && ItemProtection.isItemProtected(stack)) { +            ci.cancel(); +            return; +        } +        // Prevent salvaging +        if (title.equals("Salvage Items") && ItemProtection.isItemProtected(stack)) { +            ci.cancel(); +            return; +        } +        if (this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) { +            VisitorHelper.onSlotClick(slot, slotId, title); + +            // Prevent selling to NPC shops +            ItemStack sellStack = this.handler.slots.get(49).getStack(); +            if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getNbtTooltip(sellStack, text -> text.contains("buyback")) != null) { +                if (slotId != 49 && ItemProtection.isItemProtected(stack)) { +                    ci.cancel(); +                    return;                  } +            } +        } - -                if (this.client != null && this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) { -                    VisitorHelper.onSlotClick(slot, slotId, this.getTitle().getString()); - -                    //Prevent selling to NPC shops -                    ItemStack sellItem = this.handler.slots.get(49).getStack(); - -                    if (sellItem.getName().getString().equals("Sell Item") || skyblocker$doesLoreContain(sellItem, this.client, "buyback")) { -                        ItemStack stack = slot.getStack(); - -                        if (ItemProtection.isItemProtected(stack)) ci.cancel(); -                    } +        // Experiment Solvers +        if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { +            if (experimentSolver instanceof ChronomatronSolver chronomatronSolver) { +                Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal()); +                if ((stack.isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) && chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) { +                    chronomatronSolver.setState(ExperimentSolver.State.END);                  } +            } else if (experimentSolver instanceof SuperpairsSolver superpairsSolver) { +                superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex()); +                superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY); +            } else if (experimentSolver instanceof UltrasequencerSolver ultrasequencerSolver && slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot()) { +                int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1; +                ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().map(Map.Entry::getKey).ifPresentOrElse(ultrasequencerSolver::setUltrasequencerNextSlot, () -> ultrasequencerSolver.setState(ExperimentSolver.State.END));              } +            return;          }      } -    //TODO make this a util method somewhere else, eventually -    private static boolean skyblocker$doesLoreContain(ItemStack stack, MinecraftClient client, String searchString) { -        return stack.getTooltip(client.player, TooltipContext.BASIC).stream().map(Text::getString).anyMatch(line -> line.contains(searchString)); -    } -      @Inject(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawItem(Lnet/minecraft/item/ItemStack;III)V"))      private void skyblocker$drawItemRarityBackground(DrawContext context, Slot slot, CallbackInfo ci) {          if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds)              ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y); +        // Item protection +        if (ItemProtection.isItemProtected(slot.getStack())) { +            RenderSystem.enableBlend(); +            context.drawTexture(ITEM_PROTECTION, slot.x, slot.y, 0, 0, 16, 16, 16, 16); +            RenderSystem.disableBlend(); +        }      }  } diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java index 88be60cd..5e3daf3c 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java @@ -3,6 +3,7 @@ package de.hysky.skyblocker.mixin;  import com.llamalad7.mixinextras.injector.ModifyExpressionValue;  import com.llamalad7.mixinextras.sugar.Local;  import com.mojang.blaze3d.systems.RenderSystem; +import de.hysky.skyblocker.SkyblockerMod;  import de.hysky.skyblocker.config.SkyblockerConfigManager;  import de.hysky.skyblocker.skyblock.FancyStatusBars;  import de.hysky.skyblocker.skyblock.dungeon.DungeonMap; @@ -10,6 +11,7 @@ import de.hysky.skyblocker.skyblock.dungeon.DungeonScore;  import de.hysky.skyblocker.skyblock.dungeon.DungeonScoreHUD;  import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;  import de.hysky.skyblocker.skyblock.item.ItemCooldowns; +import de.hysky.skyblocker.skyblock.item.ItemProtection;  import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds;  import de.hysky.skyblocker.utils.Utils;  import net.fabricmc.api.EnvType; @@ -38,6 +40,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;  public abstract class InGameHudMixin {      @Unique      private static final Supplier<Identifier> SLOT_LOCK_ICON = () -> SkyblockerConfigManager.get().general.itemProtection.slotLockStyle.tex; + +    @Unique +    private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png");      @Unique      private static final Pattern DICER_TITLE_BLACKLIST = Pattern.compile(".+? DROP!"); @@ -56,12 +61,19 @@ public abstract class InGameHudMixin {      @Inject(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IIFLnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V", ordinal = 0))      public void skyblocker$renderHotbarItemLockOrRarityBg(float tickDelta, DrawContext context, CallbackInfo ci, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y, @Local PlayerEntity player) {          if (Utils.isOnSkyblock()) { +            // slot lock              if (SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) ItemRarityBackgrounds.tryDraw(player.getInventory().main.get(index), context, x, y);              if (HotbarSlotLock.isLocked(index)) {                  RenderSystem.enableBlend();                  context.drawTexture(SLOT_LOCK_ICON.get(), x, y, 0, 0, 16, 16, 16, 16);                  RenderSystem.disableBlend();              } +            //item protection +            if (ItemProtection.isItemProtected(player.getInventory().main.get(index))){ +                RenderSystem.enableBlend(); +                context.drawTexture(ITEM_PROTECTION, x, y, 0, 0, 16, 16, 16, 16); +                RenderSystem.disableBlend(); +            }          }      } diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java index b957603a..4775ce2d 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java @@ -11,12 +11,12 @@ public class InGameOverlayRendererMixin {      @ModifyArg(method = "renderFireOverlay", index = 2, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/BufferBuilder;vertex(Lorg/joml/Matrix4f;FFF)Lnet/minecraft/client/render/VertexConsumer;"))      private static float configureFlameHeight(float y) { -        return y - SkyblockerConfigManager.get().general.flameOverlay.flameHeight; +        return y - (0.5f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameHeight / 200.0f));      }      @ModifyArg(method = "renderFireOverlay", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/VertexConsumer;color(FFFF)Lnet/minecraft/client/render/VertexConsumer;"))      private static float configureFlameOpacity(float opacity) { -        return opacity - SkyblockerConfigManager.get().general.flameOverlay.flameOpacity; +        return opacity - (0.8f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameOpacity / 125.0f));      }  } diff --git a/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java index cf8aab78..dd671b2e 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java @@ -1,6 +1,7 @@  package de.hysky.skyblocker.mixin;  import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; +import de.hysky.skyblocker.skyblock.item.ItemProtection;  import de.hysky.skyblocker.utils.JoinWorldPlaceholderScreen;  import de.hysky.skyblocker.utils.ReconfiguringPlaceholderScreen;  import de.hysky.skyblocker.utils.Utils; @@ -34,6 +35,7 @@ public abstract class MinecraftClientMixin {      public void skyblocker$handleInputEvents(CallbackInfo ci) {          if (Utils.isOnSkyblock()) {              HotbarSlotLock.handleInputEvents(player); +            ItemProtection.handleHotbarKeyPressed(player);          }      } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java b/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java index 746235b7..4e87b237 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/experiment/UltrasequencerSolver.java @@ -12,9 +12,10 @@ import java.util.List;  import java.util.Map;  public class UltrasequencerSolver extends ExperimentSolver { +    public static final UltrasequencerSolver INSTANCE = new UltrasequencerSolver();      private int ultrasequencerNextSlot; -    public UltrasequencerSolver() { +    private UltrasequencerSolver() {          super("^Ultrasequencer \\(\\w+\\)$");      } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java index 3c049f69..4fd9eeb3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java @@ -1,13 +1,17 @@  package de.hysky.skyblocker.skyblock.garden; +import de.hysky.skyblocker.config.SkyblockerConfigManager;  import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;  import de.hysky.skyblocker.utils.NEURepoManager; +import de.hysky.skyblocker.utils.Utils;  import de.hysky.skyblocker.utils.scheduler.MessageScheduler;  import io.github.moulberry.repo.data.NEUItem;  import it.unimi.dsi.fastutil.objects.Object2IntMap;  import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;  import net.minecraft.client.font.TextRenderer;  import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.ingame.HandledScreen;  import net.minecraft.item.ItemStack;  import net.minecraft.nbt.NbtCompound;  import net.minecraft.nbt.NbtElement; @@ -32,11 +36,20 @@ public class VisitorHelper {      private static final Map<String, ItemStack> itemCache = new HashMap<>();      private static final int TEXT_START_X = 4;      private static final int TEXT_START_Y = 4; +    private static final int TEXT_INDENT = 8;      private static final int LINE_SPACING = 3; +    public static void init() { +        ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { +            String title = screen.getTitle().getString(); +            if (SkyblockerConfigManager.get().locations.garden.visitorHelper && screen instanceof HandledScreen<?> handledScreen && (Utils.getLocationRaw().equals("garden") && !title.contains("Logbook") || title.startsWith("Bazaar"))) { +                ScreenEvents.afterRender(screen).register((screen_, context, mouseX, mouseY, delta) -> renderScreen(title, context, client.textRenderer, handledScreen.getScreenHandler(), mouseX, mouseY)); +            } +        }); +    } +      public static void renderScreen(String title, DrawContext context, TextRenderer textRenderer, ScreenHandler handler, int mouseX, int mouseY) { -        if (handler.getCursorStack() == ItemStack.EMPTY) -            processVisitorItem(title, handler); +        if (handler.getCursorStack() == ItemStack.EMPTY) processVisitorItem(title, handler);          drawScreenItems(context, textRenderer, mouseX, mouseY);      } @@ -51,9 +64,9 @@ public class VisitorHelper {              for (Object2IntMap.Entry<String> itemEntry : visitorEntry.getValue().object2IntEntrySet()) {                  String itemText = itemEntry.getKey(); -                textWidth = textRenderer.getWidth(itemText); +                textWidth = textRenderer.getWidth(itemText + " x" + itemEntry.getIntValue()); -                if (isMouseOverText(mouseX, mouseY, TEXT_START_X, yPosition, textWidth, textHeight)) { +                if (isMouseOverText(mouseX, mouseY, TEXT_START_X + TEXT_INDENT, yPosition, textWidth, textHeight)) {                      MessageScheduler.INSTANCE.sendMessageAfterCooldown("/bz " + itemText);                      return;                  } @@ -107,6 +120,8 @@ public class VisitorHelper {      }      private static void drawScreenItems(DrawContext context, TextRenderer textRenderer, int mouseX, int mouseY) { +        context.getMatrices().push(); +        context.getMatrices().translate(0, 0, 200);          int index = 0;          for (Map.Entry<String, Object2IntMap<String>> visitorEntry : itemMap.entrySet()) {              String visitorName = visitorEntry.getKey(); @@ -117,6 +132,7 @@ public class VisitorHelper {                  index = drawItemEntryWithHover(context, textRenderer, itemEntry, index, mouseX, mouseY);              }          } +        context.getMatrices().pop();      }      private static int drawItemEntryWithHover(DrawContext context, TextRenderer textRenderer, Map.Entry<String, Integer> itemEntry, int index, int mouseX, int mouseY) { @@ -145,15 +161,19 @@ public class VisitorHelper {      private static void drawItemEntryWithHover(DrawContext context, TextRenderer textRenderer, ItemStack stack, int amount, int index, int mouseX, int mousseY) {          Text text = Serialization.fromJson(stack.getSubNbt("display").getString("Name")).append(" x" + amount); -        drawTextWithOptionalUnderline(context, textRenderer, text, TEXT_START_X + 8, TEXT_START_Y + (index * (LINE_SPACING + textRenderer.fontHeight)), mouseX, mousseY); -        context.drawItem(stack, TEXT_START_X + 10 + textRenderer.getWidth(text), TEXT_START_Y + (index * (LINE_SPACING + textRenderer.fontHeight)) - textRenderer.fontHeight + 5); +        drawTextWithOptionalUnderline(context, textRenderer, text, TEXT_START_X + TEXT_INDENT, TEXT_START_Y + (index * (LINE_SPACING + textRenderer.fontHeight)), mouseX, mousseY); +        // drawItem adds 150 to the z, which puts our z at 350, above the item in the slot (250) and their text (300) and below the cursor stack (382) and their text (432) +        context.drawItem(stack, TEXT_START_X + TEXT_INDENT + 2 + textRenderer.getWidth(text), TEXT_START_Y + (index * (LINE_SPACING + textRenderer.fontHeight)) - textRenderer.fontHeight + 5);      }      private static void drawTextWithOptionalUnderline(DrawContext context, TextRenderer textRenderer, Text text, int x, int y, int mouseX, int mouseY) { +        context.getMatrices().push(); +        context.getMatrices().translate(0, 0, 150); // This also puts our z at 350          context.drawText(textRenderer, text, x, y, -1, true);          if (isMouseOverText(mouseX, mouseY, x, y, textRenderer.getWidth(text), textRenderer.fontHeight)) {              context.drawHorizontalLine(x, x + textRenderer.getWidth(text), y + textRenderer.fontHeight, -1);          } +        context.getMatrices().pop();      }      private static boolean isMouseOverText(double mouseX, double mouseY, int x, int y, int width, int height) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/ItemProtection.java b/src/main/java/de/hysky/skyblocker/skyblock/item/ItemProtection.java index 2d929c28..7e04652c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/ItemProtection.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/ItemProtection.java @@ -10,13 +10,25 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;  import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;  import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;  import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.option.KeyBinding;  import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.entity.player.PlayerEntity;  import net.minecraft.item.ItemStack;  import net.minecraft.text.Text; +import org.lwjgl.glfw.GLFW;  public class ItemProtection { +	public static KeyBinding itemProtection;  	public static void init() { +		itemProtection = KeyBindingHelper.registerKeyBinding(new KeyBinding( +				"key.itemProtection", +				GLFW.GLFW_KEY_V, +				"key.categories.skyblocker" +		));  		ClientCommandRegistrationCallback.EVENT.register(ItemProtection::registerCommand);  	} @@ -61,4 +73,46 @@ public class ItemProtection {  		return Command.SINGLE_SUCCESS;  	} + +	public static void handleKeyPressed(ItemStack heldItem) { +		PlayerEntity playerEntity = MinecraftClient.getInstance().player; +		if (playerEntity == null){ +			return; +		} +		if (!Utils.isOnSkyblock()) { +			playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.itemProtection.unableToProtect"))); +			return; +		} + +        if (heldItem.isEmpty()) { +			playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.itemProtection.noItemUuid"))); +            return; +        } + +		String itemUuid = ItemUtils.getItemUuid(heldItem); +		if (!itemUuid.isEmpty()) { +			ObjectOpenHashSet<String> protectedItems = SkyblockerConfigManager.get().general.protectedItems; + +			if (!protectedItems.contains(itemUuid)) { +				protectedItems.add(itemUuid); +				SkyblockerConfigManager.save(); + +				playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.itemProtection.added", heldItem.getName()))); +			} else { +				protectedItems.remove(itemUuid); +				SkyblockerConfigManager.save(); + +				playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.itemProtection.removed", heldItem.getName()))); +			} +		} else { +			playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.itemProtection.noItemUuid"))); +		} +	} + +	public static void handleHotbarKeyPressed(ClientPlayerEntity player) { +		while (itemProtection.wasPressed()) { +			ItemStack heldItem = player.getMainHandStack(); +			handleKeyPressed(heldItem); +		} +	}  } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index d5be7eee..fbef1bcb 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -51,7 +51,7 @@ public class ItemTooltip {          boolean bazaarOpened = lines.stream().anyMatch(each -> each.getString().contains("Buy price:") || each.getString().contains("Sell price:"));          if (TooltipInfoType.NPC.isTooltipEnabledAndHasOrNullWarning(internalID)) { -            lines.add(Text.literal(String.format("%-21s", "NPC Price:")) +            lines.add(Text.literal(String.format("%-21s", "NPC Sell Price:"))                      .formatted(Formatting.YELLOW)                      .append(getCoinsMessage(TooltipInfoType.NPC.getData().get(internalID).getAsDouble(), count)));          } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java index 6f40f5a8..309ba9ca 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java @@ -1,16 +1,19 @@  package de.hysky.skyblocker.skyblock.tabhud.widget;  import de.hysky.skyblocker.skyblock.tabhud.util.Ico; +import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;  import net.minecraft.text.MutableText;  import net.minecraft.text.Text;  import net.minecraft.util.Formatting; +import java.util.regex.Pattern; +  // this widget shows info about the secrets of the dungeon  public class DungeonSecretWidget extends Widget { -    private static final MutableText TITLE = Text.literal("Discoveries").formatted(Formatting.DARK_PURPLE, -            Formatting.BOLD); +    private static final MutableText TITLE = Text.literal("Discoveries").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); +    private static final Pattern DISCOVERIES = Pattern.compile("Discoveries: (\\d+)");      public DungeonSecretWidget() {          super(TITLE, Formatting.DARK_PURPLE.getColorValue()); @@ -18,9 +21,12 @@ public class DungeonSecretWidget extends Widget {      @Override      public void updateContent() { -        this.addSimpleIcoText(Ico.CHEST, "Secrets:", Formatting.YELLOW, 31); -        this.addSimpleIcoText(Ico.SKULL, "Crypts:", Formatting.YELLOW, 32); - +        if (PlayerListMgr.regexAt(31, DISCOVERIES) != null) { +            this.addSimpleIcoText(Ico.CHEST, "Secrets:", Formatting.YELLOW, 32); +            this.addSimpleIcoText(Ico.SKULL, "Crypts:", Formatting.YELLOW, 33); +        } else { +            this.addSimpleIcoText(Ico.CHEST, "Secrets:", Formatting.YELLOW, 31); +            this.addSimpleIcoText(Ico.SKULL, "Crypts:", Formatting.YELLOW, 32); +        }      } -  } diff --git a/src/main/java/de/hysky/skyblocker/utils/Http.java b/src/main/java/de/hysky/skyblocker/utils/Http.java index 17079d15..58deced2 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Http.java +++ b/src/main/java/de/hysky/skyblocker/utils/Http.java @@ -53,7 +53,7 @@ public class Http {  		String body = new String(decodedInputStream.readAllBytes());  		HttpHeaders headers = response.headers(); -		return new ApiResponse(body, response.statusCode(), getCacheStatus(headers), getAge(headers)); +		return new ApiResponse(body, response.statusCode(), getCacheStatuses(headers), getAge(headers));  	}  	public static HttpHeaders sendHeadRequest(String url) throws IOException, InterruptedException { @@ -115,12 +115,12 @@ public class Http {  	}  	/** -	 * Returns the cache status of the resource +	 * Returns the cache statuses of the resource. All possible cache status values conform to Cloudflare's.  	 *  -	 * @see <a href="https://developers.cloudflare.com/cache/concepts/default-cache-behavior/#cloudflare-cache-responses">Cloudflare Cache Docs</a> +	 * @see <a href="https://developers.cloudflare.com/cache/concepts/cache-responses/">Cloudflare Cache Docs</a>  	 */ -	private static String getCacheStatus(HttpHeaders headers) { -		return headers.firstValue("CF-Cache-Status").orElse("UNKNOWN"); +	private static String[] getCacheStatuses(HttpHeaders headers) { +		return new String[] { headers.firstValue("CF-Cache-Status").orElse("UNKNOWN"), headers.firstValue("Local-Cache-Status").orElse("UNKNOWN") };  	}  	private static int getAge(HttpHeaders headers) { @@ -128,7 +128,7 @@ public class Http {  	}  	//TODO If ever needed, we could just replace cache status with the response headers and go from there -	public record ApiResponse(String content, int statusCode, String cacheStatus, int age) implements AutoCloseable { +	public record ApiResponse(String content, int statusCode, String[] cacheStatuses, int age) implements AutoCloseable {  		public boolean ok() {  			return statusCode == 200; @@ -139,7 +139,7 @@ public class Http {  		}  		public boolean cached() { -			return cacheStatus.equals("HIT"); +			return cacheStatuses[0].equals("HIT") || cacheStatuses[1].equals("HIT");  		}  		@Override diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java index a81c25f7..460f34dd 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java @@ -44,7 +44,7 @@ public class ContainerSolverManager {                  new CroesusProfit(),                  new ChronomatronSolver(),                  new SuperpairsSolver(), -                new UltrasequencerSolver() +                UltrasequencerSolver.INSTANCE          };      } diff --git a/src/main/resources/assets/skyblocker/lang/en_ca.json b/src/main/resources/assets/skyblocker/lang/en_ca.json index 416f9d9b..0ff8018b 100644 --- a/src/main/resources/assets/skyblocker/lang/en_ca.json +++ b/src/main/resources/assets/skyblocker/lang/en_ca.json @@ -31,5 +31,6 @@      "skyblocker.tips.customArmorDyeColors": "Apply a custom dye colour to your leather armour with /skyblocker custom dyeColor",      "skyblocker.tips.customArmorTrims": "You can set custom armour trims on your armour using /skyblocker custom armorTrim.",      "text.autoconfig.skyblocker.option.locations.dungeons.lividColor.enableLividColorTitle": "Enable Livid Colour Title", -    "text.autoconfig.skyblocker.option.locations.dungeons.lividColor.enableLividColorTitle.@Tooltip": "Display the livid colour in the title during the Livid boss fight." +    "text.autoconfig.skyblocker.option.locations.dungeons.lividColor.enableLividColorTitle.@Tooltip": "Display the livid colour in the title during the Livid boss fight.", +    "skyblocker.end.hud.protectorLocations.center": "Centre"  } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 63ff4fca..f5875feb 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -5,6 +5,7 @@    "key.skyblocker.defaultTgl": "Switch tab HUD to default view",    "key.skyblocker.toggleA": "Toggle tab HUD to screen A",    "key.wikiLookup": "Wiki Lookup", +  "key.itemProtection": "Protect Item",    "text.skyblocker.open": "Open",    "text.skyblocker.quit_config": "Changes Not Saved", @@ -132,7 +133,9 @@    "text.autoconfig.skyblocker.option.general.teleportOverlay.enableWitherImpact": "Enable Wither Impact Overlay",    "text.autoconfig.skyblocker.option.general.flameOverlay": "Flame Overlay",    "text.autoconfig.skyblocker.option.general.flameOverlay.flameHeight": "Flame Height", +  "text.autoconfig.skyblocker.option.general.flameOverlay.flameHeight.@Tooltip": "100%  default height\n0%     off",    "text.autoconfig.skyblocker.option.general.flameOverlay.flameOpacity": "Flame Opacity", +  "text.autoconfig.skyblocker.option.general.flameOverlay.flameOpacity.@Tooltip": "100%  default opacity\n0%     off",    "text.autoconfig.skyblocker.option.general.searchOverlay": "Search Overlay",    "text.autoconfig.skyblocker.option.general.searchOverlay.enableBazaar": "Enable For Bazaar",    "text.autoconfig.skyblocker.option.general.searchOverlay.enableBazaar.@Tooltip": "Show custom search overlay when searching in bazaar.", diff --git a/src/main/resources/assets/skyblocker/lang/es_es.json b/src/main/resources/assets/skyblocker/lang/es_es.json index 297afc81..d74ac193 100644 --- a/src/main/resources/assets/skyblocker/lang/es_es.json +++ b/src/main/resources/assets/skyblocker/lang/es_es.json @@ -63,7 +63,6 @@      "text.autoconfig.skyblocker.option.locations.dwarvenMines.enableDrillFuel": "Habilitar Combustible del Taladro",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.solveFetchur": "Resolver Fetchur",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud": "Interfaz de Dwarven", -    "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enabled": "Habilitado",      "text.autoconfig.skyblocker.category.messages": "Mensajes",      "text.autoconfig.skyblocker.option.messages.chatFilterResult.PASS": "Deshabilitado",      "text.autoconfig.skyblocker.option.messages.chatFilterResult.FILTER": "Filtro", diff --git a/src/main/resources/assets/skyblocker/lang/fr_fr.json b/src/main/resources/assets/skyblocker/lang/fr_fr.json index 7c71081f..679f2507 100644 --- a/src/main/resources/assets/skyblocker/lang/fr_fr.json +++ b/src/main/resources/assets/skyblocker/lang/fr_fr.json @@ -49,7 +49,6 @@      "text.autoconfig.skyblocker.option.locations.dwarvenMines.solveFetchur": "Décoder les requêtes de Fetchur",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.solvePuzzler": "Résoudre le puzzle de Puzzler",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud": "ATH mine des nains", -    "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enabled": "Activé",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground": "Activer l'arrière-plan",      "text.autoconfig.skyblocker.category.messages": "Messages",      "text.autoconfig.skyblocker.option.messages.hideAbility": "Cacher le rechargement des capacités", @@ -112,6 +111,42 @@      "key.skyblocker.toggleB": "Basculer l'onglet HUD vers l'écran B",      "key.skyblocker.toggleA": "Basculer l'onglet HUD vers l'écran A",      "text.autoconfig.skyblocker.option.general.shortcuts.enableShortcuts": "Activer les Raccourcis", -    "text.autoconfig.skyblocker.option.general.shortcuts.enableShortcuts.@Tooltip": "Marche seulement sur Hypixel. Edite les raccourcis avec \"/skyblocker shortcuts\". Au moins une des options suivantes doit être activée pour que ceci prenne effet.", -    "text.autoconfig.skyblocker.option.general.shortcuts.enableCommandShortcuts": "Activer les Commandes Raccourcis" +    "text.autoconfig.skyblocker.option.general.shortcuts.enableShortcuts.@Tooltip": "Marche partout, même en Vanilla ! Edite les raccourcis avec \"/skyblocker shortcuts\". Au moins une des options suivantes doit être activée pour que ceci prenne effet.", +    "text.autoconfig.skyblocker.option.general.shortcuts.enableCommandShortcuts": "Activer les Commandes Raccourcis", +    "text.autoconfig.skyblocker.option.general.mythologicalRitual": "Aide pour le Rituel Mythologique", +    "text.autoconfig.skyblocker.option.general.mythologicalRitual.enableMythologicalRitualHelper": "Activer l'aide du Rituel Mythologique", +    "text.autoconfig.skyblocker.option.general.itemCooldown.enableItemCooldowns": "Activer le Temps de Recharge de l'item", +    "text.autoconfig.skyblocker.option.general.shortcuts.enableCommandArgShortcuts": "Activer les Raccourcis d'Argument de Commande", +    "text.autoconfig.skyblocker.option.general.itemTooltip.enableMuseumInfo": "Activer l'Info du Musée", +    "text.autoconfig.skyblocker.option.general.itemTooltip.enableObtainedDate": "Activer Date Obtenue", +    "text.autoconfig.skyblocker.option.general.fairySouls.highlightOnlyNearbySouls": "Accentuer seulement les fairy souls proches", +    "text.autoconfig.skyblocker.option.general.fairySouls.highlightFoundSouls": "Accentuer les fairy souls trouvées", +    "text.autoconfig.skyblocker.option.general.itemTooltip.enableExoticTooltip": "Activer l'info-bulle exotique", +    "text.autoconfig.skyblocker.option.general.itemTooltip.enableExoticTooltip.@Tooltip": "Affiche le type d'exotique en dessous du nom de l'item si une pièce d'armure est exotique.", +    "text.autoconfig.skyblocker.option.general.etherwarpOverlay": "Overlay de l'Etherwarp", +    "text.autoconfig.skyblocker.option.general.shortcuts.enableCommandArgShortcuts.@Tooltip": "Raccourcis qui remplacent un ou plus de mot(s)/argument(s) d'une commande qui a plusieurs mots/arguments. Edite les raccourcis avec \"/skyblocker shortcuts\". Les raccourcis doivent être activés pour que ceci prenne effet.", +    "text.autoconfig.skyblocker.option.general.fairySouls.highlightOnlyNearbySouls.@Tooltip": "Lorsque cette option est activée, seules les fairy souls situées dans un rayon de 50 blocs sont mises en évidence", +    "text.autoconfig.skyblocker.option.general.tabHud.plainPlayerNames.@Tooltip": "Activer pour afficher les pseudos des joueurs sans aucune mise en forme sur les îles publiques.", +    "text.autoconfig.skyblocker.option.general.waypoints.enableWaypoints": "Activer les Waypoints", +    "text.autoconfig.skyblocker.option.general.waypoints": "Waypoints", +    "text.autoconfig.skyblocker.option.general.waypoints.waypointType": "Type de Waypoint", +    "text.skyblocker.open": "Ouvrir", +    "text.skyblocker.quit_config": "Les modifications ne sont pas sauvegardées", +    "text.skyblocker.quit_config_sure": "Êtes-vous sur de vouloir arrêter d'éditer la config ? Vos changements ne seront pas sauvegardés !", +    "text.autoconfig.skyblocker.option.general.tabHud.nameSorting": "Méthode de tri des Pseudos des Joueurs", +    "text.autoconfig.skyblocker.option.general.itemTooltip.enableMuseumInfo.@Tooltip": "If cet item est donnable au musée, alors la catégorie de cet item dans le musée sera affiché. Il affiche aussi un marqueur indiquant si vous avez donné l'item a votre musée ou non (Cadeaux pas pris en charge pour l'instant).\n\nAssurez vous d'activer l'API du musée pour des informations précises !", +    "text.autoconfig.skyblocker.option.general.shortcuts.config": "Configuration des raccourcis...", +    "text.skyblocker.quit_discard": "Quitter et Abandonner les Modifications", +    "text.autoconfig.skyblocker.option.general.shortcuts.enableCommandShortcuts.@Tooltip": "Raccourcis pour les commandes d'un seul mot. Edite les raccourcis avec \"/skyblocker shortcuts\". Les raccourcis doivent être activés pour que ceci prenne effet.", +    "text.autoconfig.skyblocker.option.general.quiverWarning": "Avertissement du Carquois", +    "text.autoconfig.skyblocker.option.general.quiverWarning.enableQuiverWarningAfterDungeon": "Activer l'Avertissement du Carquois après un Donjon", +    "text.autoconfig.skyblocker.option.general.quiverWarning.enableQuiverWarning": "Activer l'Avertissement du Carquois", +    "text.autoconfig.skyblocker.option.general.quiverWarning.enableQuiverWarningInDungeons": "Activer l'Avertissement du Carquois en Donjons", +    "text.autoconfig.skyblocker.option.general.tabHud.nameSorting.@Tooltip": "Ordre alphabétique tri les pseudos alphabétiquement alors que Par défaut n'a pas d'ordre particulier.", +    "text.autoconfig.skyblocker.option.general.compactorDeletorPreview": "Activer l'Aperçu du Compacteur/Supprimeur", +    "text.autoconfig.skyblocker.option.general.enableTips": "Activer les Conseils", +    "text.autoconfig.skyblocker.option.general.waypoints.waypointType.@Tooltip": "Waypoint : Affiche une accentuation et faisceau de beacon.\n\nWaypoint avec contour : Affiche un waypoint ET un contour.\n\nAccentuation : Affiche seulement une accentuation.\n\nAccentuation avec contour : Affiche une accentuation ET un contour.\n\nContour : Affiche seulement un contour.", +    "text.autoconfig.skyblocker.option.general.waypoints.waypointType.generalNote": "\n\n\nCette option ne s'applique pas a tout les waypoints. Certains waypoints comme les waypoints pour secrets ont leur propre configuration.", +    "text.autoconfig.skyblocker.option.general.tabHud.plainPlayerNames": "Noms de Joueurs Clairs", +    "text.autoconfig.skyblocker.option.general.itemInfoDisplay": "Affichage des infos d'item"  } diff --git a/src/main/resources/assets/skyblocker/lang/ja_jp.json b/src/main/resources/assets/skyblocker/lang/ja_jp.json index 7448b95c..19e8a52c 100644 --- a/src/main/resources/assets/skyblocker/lang/ja_jp.json +++ b/src/main/resources/assets/skyblocker/lang/ja_jp.json @@ -46,7 +46,6 @@      "text.autoconfig.skyblocker.option.locations.dwarvenMines.solveFetchur": "Fetchurの要求アイテムの表示",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.solvePuzzler": "Puzzler Puzzleのソルバー",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud": "ドワーフマインでのHUD", -    "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enabled": "有効",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground": "バックグラウンド表示を有効にする",      "text.autoconfig.skyblocker.category.messages": "メッセージ",      "text.autoconfig.skyblocker.option.messages.hideAbility": "アビリティのクールダウンを非表示にする", diff --git a/src/main/resources/assets/skyblocker/lang/ko_kr.json b/src/main/resources/assets/skyblocker/lang/ko_kr.json index d5357715..4fa1e135 100644 --- a/src/main/resources/assets/skyblocker/lang/ko_kr.json +++ b/src/main/resources/assets/skyblocker/lang/ko_kr.json @@ -62,7 +62,6 @@      "text.autoconfig.skyblocker.option.locations.dwarvenMines.solveFetchur": "Fetchur 해결",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.solvePuzzler": "Puzzler 퍼즐 해결",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud": "Dwarven HUD", -    "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enabled": "활성화됨",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground": "배경 활성화",      "text.autoconfig.skyblocker.category.messages": "메시지",      "text.autoconfig.skyblocker.option.messages.chatFilterResult.PASS": "비활성화됨", diff --git a/src/main/resources/assets/skyblocker/lang/pt_br.json b/src/main/resources/assets/skyblocker/lang/pt_br.json index 02e52b02..ac7e0a6c 100644 --- a/src/main/resources/assets/skyblocker/lang/pt_br.json +++ b/src/main/resources/assets/skyblocker/lang/pt_br.json @@ -171,7 +171,7 @@      "text.autoconfig.skyblocker.option.general.wikiLookup.officialWiki.@Tooltip": "Usar a wiki oficial em vez da wiki do Fandom.",      "text.autoconfig.skyblocker.option.general.itemInfoDisplay.itemRarityBackgrounds": "Fundos de Raridade de Item",      "text.autoconfig.skyblocker.option.general.itemInfoDisplay.itemRarityBackgrounds.@Tooltip": "Mostra um fundo colorido atrás de um item, a cor representa a raridade do item.", -    "text.autoconfig.skyblocker.option.locations.dungeons.mapScreen": "Configuração da posição do mapa da dungeon...", +    "text.autoconfig.skyblocker.option.locations.dungeons.mapScreen": "Configuração da posição do Mapa da Dungeon e Pontuação...",      "text.autoconfig.skyblocker.option.locations.dungeons.solveThreeWeirdos": "Guia para Puzzle dos Three Weridos",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[0]": "Simples: Exibe nome e porcentagem.",      "text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.neutralThreshold": "Limite neutro", @@ -201,7 +201,6 @@      "text.autoconfig.skyblocker.option.locations.dungeons.lividColor.lividColorText": "Texto da cor do Livid",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.solvePuzzler": "Guia para puzzle do Puzzler",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud": "Interface da mina dos anões", -    "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enabled": "Ativado",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style": "Estilo para a interface",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[2]": "\nClássico: Exibe nome e porcentagem em uma caixa super simples.",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground": "Ativar fundo", @@ -283,5 +282,8 @@      "text.autoconfig.skyblocker.option.quickNav.button.clickEvent": "Evento ao clicar",      "text.autoconfig.skyblocker.option.general.waypoints.enableWaypoints": "Ativar Waypoints",      "text.autoconfig.skyblocker.option.general.waypoints.waypointType": "Tipo de Waypoint", -    "text.autoconfig.skyblocker.option.general.waypoints.waypointType.generalNote": "\n\n\nEssa opção não aplica para todos os waypoints. Alguns waypoints como waypoints secretos tem seu próprio opção de tipo de waypoint." +    "text.autoconfig.skyblocker.option.general.waypoints.waypointType.generalNote": "\n\n\nEssa opção não aplica para todos os waypoints. Alguns waypoints como waypoints secretos tem seu próprio opção de tipo de waypoint.", +    "text.autoconfig.skyblocker.option.general.mythologicalRitual": "Assistente de Ritual Mitológico", +    "text.autoconfig.skyblocker.option.general.mythologicalRitual.enableMythologicalRitualHelper": "Ativar Assistente de Ritual Mitológico", +    "text.autoconfig.skyblocker.option.general.enableTips": "Ativar Dicas"  } diff --git a/src/main/resources/assets/skyblocker/lang/ru_ru.json b/src/main/resources/assets/skyblocker/lang/ru_ru.json index b84ae0fe..00bf4025 100644 --- a/src/main/resources/assets/skyblocker/lang/ru_ru.json +++ b/src/main/resources/assets/skyblocker/lang/ru_ru.json @@ -89,7 +89,6 @@      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[0]": "Упрощенный: Показывает название и процент выполнения.",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[2]": "\nКлассический: Показывает название и процент выполнения в простом тёмном квадрате.",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground": "Включить Фон", -    "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enabled": "Включить",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud": "Dwarven HUD (Интерфейс Гномьих Шахт)",      "text.autoconfig.skyblocker.option.messages.hideMana.@Tooltip": "Выглядит лучше, когда включены полоски Skyblocker (здоровья, маны и т.д.)",      "text.autoconfig.skyblocker.option.locations.barn": "Barn (Ферма)", diff --git a/src/main/resources/assets/skyblocker/lang/tr_tr.json b/src/main/resources/assets/skyblocker/lang/tr_tr.json index b46463fb..000bf1a3 100644 --- a/src/main/resources/assets/skyblocker/lang/tr_tr.json +++ b/src/main/resources/assets/skyblocker/lang/tr_tr.json @@ -39,7 +39,6 @@      "text.autoconfig.skyblocker.option.messages.hideMana.@Tooltip": "FancyBar ile daha iyi bir deneyim sunar",      "text.autoconfig.skyblocker.option.general.hideEmptyTooltips": "Menülerdeki boş eşya açıklamalarını gizle",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground": "Arka planı göster", -    "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enabled": "Etkinleştir",      "text.autoconfig.skyblocker.option.general.itemTooltip.avg.@Tooltip": "Kaç günlük ortalamanın gösterileceğini seçebilirsiniz",      "text.autoconfig.skyblocker.option.general.itemTooltip.enableLowestBIN": "En düşük BIN fiyatını göster",      "text.autoconfig.skyblocker.option.richPresence.enableRichPresence": "Aktif", diff --git a/src/main/resources/assets/skyblocker/lang/zh_cn.json b/src/main/resources/assets/skyblocker/lang/zh_cn.json index 4d058bf1..c5d3bccb 100644 --- a/src/main/resources/assets/skyblocker/lang/zh_cn.json +++ b/src/main/resources/assets/skyblocker/lang/zh_cn.json @@ -64,7 +64,6 @@      "text.autoconfig.skyblocker.option.locations.dwarvenMines.solveFetchur": "解决Fetchur的迷题",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.solvePuzzler": "解决Puzzler的迷题",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud": "矮人矿井 HUD", -    "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enabled": "启用",      "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground": "启用背景",      "text.autoconfig.skyblocker.category.messages": "消息",      "text.autoconfig.skyblocker.option.messages.chatFilterResult.PASS": "禁用", @@ -157,5 +156,32 @@      "text.autoconfig.skyblocker.option.general.waypoints.waypointType": "路径点类型",      "text.skyblocker.open": "开启",      "text.autoconfig.skyblocker.option.general.wikiLookup.enableWikiLookup": "启用 wiki 查阅功能", -    "text.autoconfig.skyblocker.option.general.wikiLookup.enableWikiLookup.@Tooltip": "指针悬停于物品之下按 F4 键打开 wiki 相关条目" +    "text.autoconfig.skyblocker.option.general.wikiLookup.enableWikiLookup.@Tooltip": "指针悬停于物品之下按 F4 键打开 wiki 相关条目", +    "text.autoconfig.skyblocker.option.general.mythologicalRitual": "神话仪式助手", +    "text.autoconfig.skyblocker.option.general.mythologicalRitual.enableMythologicalRitualHelper": "开启神话仪式助手", +    "text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enablePearlWaypoints": "启用珍珠路径点", +    "text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableAotvWaypoints": "启用瞬息之刃路径点", +    "text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableFairySoulWaypoints": "启用仙女之魂路径点", +    "text.autoconfig.skyblocker.option.locations.spidersDen.relics": "遗物助手", +    "text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreMessage": "启用地牢 %d 分数提示信息", +    "text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScoreMessage.@Tooltip": "在地牢中达到 %d 分时发送提示信息", +    "text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableEntranceWaypoints": "启用入口路径点", +    "text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableChestWaypoints": "启用箱子路径点", +    "text.autoconfig.skyblocker.option.general.itemCooldown": "物品冷却提示", +    "text.autoconfig.skyblocker.option.general.itemCooldown.enableItemCooldowns": "启用物品冷却提示", +    "text.autoconfig.skyblocker.option.general.specialEffects.rareDungeonDropEffects.@Tooltip": "为地牢稀有掉落添加特殊的视觉效果!", +    "text.autoconfig.skyblocker.option.locations.spidersDen": "蜘蛛巢穴", +    "text.autoconfig.skyblocker.option.locations.spidersDen.relics.enableRelicsHelper": "启用遗物助手", +    "text.autoconfig.skyblocker.option.locations.spidersDen.relics.highlightFoundRelics": "高亮已发现的遗物", +    "text.autoconfig.skyblocker.option.general.compactorDeletorPreview": "启用个人压缩器/删除器预览", +    "text.autoconfig.skyblocker.option.general.itemInfoDisplay.itemRarityBackgrounds.@Tooltip": "将物品背景颜色改为其稀有度所对应的颜色", +    "text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore": "地牢分数", +    "skyblocker.wikiLookup.noArticleFound": "§r无法找到此物品的 wiki 相关条目...", +    "text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableWitherWaypoints": "启用凋灵精粹路径点", +    "text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableBatWaypoints": "启用蝙蝠路径点", +    "text.autoconfig.skyblocker.option.general.betterPartyFinder": "更好的组队查找", +    "text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableRoomMatching.@Tooltip": "关闭此选项可节省约20MB左右的内存,但是秘密路径点和§l部分谜题助手功能§r需要启用该选项", +    "text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableItemWaypoints": "启用物品路径点", +    "text.autoconfig.skyblocker.option.general.quiverWarning.enableQuiverWarningAfterDungeon": "在地牢结束后启用箭袋提示", +    "text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableLeverWaypoints": "启用拉杆路径点"  } diff --git a/src/main/resources/assets/skyblocker/textures/gui/item_protection.png b/src/main/resources/assets/skyblocker/textures/gui/item_protection.pngBinary files differ new file mode 100644 index 00000000..b76fe034 --- /dev/null +++ b/src/main/resources/assets/skyblocker/textures/gui/item_protection.png | 
