diff options
27 files changed, 622 insertions, 138 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index b2fd4438b..15dce9578 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,25 @@ # SkyHanni - Change Log -## Version 0.18.BETA +## Version 0.19 (unreleased) ### New Features -+ Added Visitor Drop Counter to track all the drops from visitors. -+ Added **Contest Time Needed** - Show the time and missing FF for every crop inside Jacob's Farming Contest inventory. ++ Added **Rift Timer** + + Show the remaining rift time, max time, percentage, and extra time changes. ++ **Rift Highlight Guide** + + Highlight things to do in the Rift Guide. + +## Version 0.18 (2023-06-19) + +### New Features ++ Added **Visitor Drop Counter** (Contributed by CalMWolfs) + + Counts up all the drops that you get from visitors + + Count each rarity of visitor Accepted + + Count copper, farming exp and coins spent + + Setting to show number or drop first + + Setting to show as the icon instead of the name + + Setting to show only on the barn plot ++ Added **Contest Time Needed** + + Show the time and missing FF for every crop inside Jacob's Farming Contest inventory. + Added **Garden Start Location** + Show the start waypoint for your farm with the currently holding tool. + Auto-detects the start of the farm when farming for the first time @@ -14,7 +29,10 @@ + Sortable by price or items stored (both desc/asc) + Option to show prices from Bazaar or NPC + Added Farming Fortune Breakdown for Armor and Equipment (Contributed by CalMWolfs) + + Run /ff to open the menu + Works with: Base Stats, Reforge Bonus, Ability Fortune and Green Thumb + + Breakdown for the true farming fortune from each crop + + Ability to select a single piece of armor or equipment + Added Server Restart Title + Added Jacob Contest Stats Summary + Showing Blocks per Second and total Blocks clicked after a farming contest in chat @@ -28,7 +46,7 @@ + Supports tab completing for warp points when typing /warp + Supports party members, friends (need to visit all friend list pages), player on the same server + Supports these commands: /p, /party, /pt (party transfer), /f, /friend /msg, /w, /tell, /boop, /visit, /invite, /ah, /pv (NEU's Profile Viewer), /shmarkplayer (SkyHanni's Mark Player feature) - + Supports VIP /visit suggestions (currently PortalHub and prtlhub, if you know similar islands, tell us please) + + Supports VIP /visit suggestions (e.g. PortalHub or Hubportal) + Added Item Profit Tracker (Slayer only) + Count items collected and how much you pay while doing slayer, calculates final profit + Shows the price of the item collected in chat (default disabled) @@ -36,15 +54,51 @@ + Show item name and price over items laying on ground (only in slayer areas) + Added Broken Hyperion Warning (Slayer only) + Warns when right-clicking with a Wither Impact weapon (e.g. Hyperion) no longer gains combat exp - (Kill a mob with melee-hits to fix this hypixel bug) + + Kill a mob with melee-hits to fix this hypixel bug + + Only while doing slayer + Added Piece of Wizard Portal show earned by player name (Contributed by HiZe) -+ City Project Daily Reminder - Remind every 24 hours to participate ++ City Project Daily Reminder + + Remind every 24 hours to participate + Added Quick Mod Menu Switching (default disabled) + Allows for easy navigation between one Mod Config and another + Default disabled + Detects your SkyBlock Mod automatically + Does detect Chat Triggers and OneConfig itself, but no single mods that require these libraries -+ Added **Arachne Chat Hider** - Hide chat messages about the Arachne Fight while outside of Arachne's Sanctuary ++ Added **Arachne Chat Hider** + + Hide chat messages about the Arachne Fight while outside of Arachne's Sanctuary ++ Added **Contest Time Needed** + + Show the time and missing FF for every crop inside Jacob's Farming Contest inventory ++ Added **Sack Item Display** (Contributed by HiZe) + + Added price display next to sack items + + Can be disabled + + Sortable by price or items stored (both desc/asc) + + Option to show prices from Bazaar or NPC ++ Added profile id chat hider ++ Added Garden Crop Start Location + + Show the start waypoint for your farm with the currently holding tool. + + Auto-detects the start of the farm when farming for the first time + + Option to manually set the waypoint with `/shcropstartlocation` ++ Added Pet Candies Used number + + Works even after Hypixel removed the `10 pet candies applied` line ++ Added Estimated Armor Value display + + Shows the price of all 4 armor pieces combined inside the wardrobe ++ Added Garden Plot Icon (Contributed by HiZe) + + Select an item from the inventory to replace the icon in the Configure Plots inventory + + Change the Edit mode in the bottom right corner in the Configure Plots inventory ++ Showing fished item names ++ Show numbers of Pocket Sack-In-A-Sack applied on a sack (Default disabled, contributed by HiZe) ++ Added a warning when finding a visitor with a rare reward + + Show message in chat, over the visitor and prevents refusing ++ Added composter empty timer for outside garden ++ Added title warning when picking up an expensive slayer item ++ Added **RNG Meter Display** + + Display number of bosses needed until the next RNG Meter item drops + + Warn when no item is set in the RNG Meter + + Hide the RNG Meter message from chat if the current item is selected ++ Added **Ghost Counter** (Contributed by HiZe) + + Shows number of ghosts killed in the Mist in Dwarven Mines + + Shows kill combo, coins per scavenger, all item drops, bestiarity, magic find and more + + Each display line is highly customizable ### Changes + Added Options for displays Crop Milestone and Best Crop Time. @@ -57,95 +111,173 @@ + Derpy double health support + More fair detection logic + Added extra setting to allow/block clicks for the 'hide not clickable' feature ++ Disabled hide far particles feature in M7 boss fight. This will fix M7 boss fight features from other mods ++ Added support for multiple players/profiles: + + SkyHanni saves all profile specific data now separately (e.g., garden data, crimson isle reputation progress, minion display text on the island) + + Config toggles and GUI elements stay synced between all profiles ++ Reworked Hide Armor + + More options + = Fixed Movement bugs with Depth Strider enchantment + = Fixed compatibility issues with other mods + Note: The hide armor config got reset, if you want to use it, you have to enable it again) ++ Added support for maxed out crop milestones ++ Showing total price for visitor items needed ++ Warning when BPS in Jacob contest ff needed display is below 1 ++ More Discord Rich Presence features (Contributed by NetheriteMiner) + + Option "Profile" not only shows the profile name but also the profile type and SkyBlock level + + Option "Dynamic" now also supports stacking enchantments ++ Highlight the item in bazaar search result inventory when clicking on an item list (Contributed by CalMWolfs) ### Fixes -= Fixed typos in Trevor Trapper texts (Contributed by CalMWolfs) -= Fixed Hypixel bug that the equipment lore talks about "kills" instead of "visitors" (Contributed by CalMWolfs) ++ Fixed typos in Trevor Trapper texts (Contributed by CalMWolfs) ++ Fixed Hypixel bug that the equipment lore talks about "kills" instead of "visitors" (Contributed by CalMWolfs) ++ Fixed reforge stone 'warped' not detected in item price display ++ Hotkey to open SkyHanni Position Editor no longer works inside signs + +### Removals +- Removed Garden Recent Teleport Pads display ## Version 0.17 (2023-05-11) ### Features -+ Added **Time to Kill** - Show the time it takes to kill the Slayer boss. ++ Added **Time to Kill** + + Show the time it takes to kill the Slayer boss. + Added skill and collection level as item stack. -+ Added **Auction Highlighter** - Highlight own items that are sold in green and that are expired in red. ++ Added **Auction Highlighter** + + Highlight own items that are sold in green and that are expired in red. + Added support for tier 1 minions and title send for the minion craft helper. + Added Chicken head Timer. + Added **rancher boots** speed display. -+ Added **Unclaimed Rewards** - Highlight contests with unclaimed rewards in the jacob inventory. -+ Added **Duplicate Hider** - Hides duplicate farming contests in the inventory. -+ Added **Contest Time** - Adds the real time format to the farming contest description. -+ Added **Hide Repeated Catches** - Delete past catches of the same trophy fish from chat. - (contributed by appable) -+ Added **Trophy Counter Design** - Change the way trophy fish messages gets displayed in the chat. - (contributed by appable) -+ Added **CH Join** - Helps buy a Pass for accessing the Crystal Hollows if needed. -+ Added **Estimated Item Value** - Displays an estimated item value for the item you hover over. ++ Added **Unclaimed Rewards** + + Highlight contests with unclaimed rewards in the jacob inventory. ++ Added **Duplicate Hider** + + Hides duplicate farming contests in the inventory. ++ Added **Contest Time** + + Adds the real time format to the farming contest description. ++ Added **Hide Repeated Catches** (contributed by appable) + + Delete past catches of the same trophy fish from chat ++ Added **Trophy Counter Design** (contributed by appable) + + Change the way trophy fish messages gets displayed in the chat ++ Added **CH Join** + + Helps buy a Pass for accessing the Crystal Hollows if needed ++ Added **Estimated Item Value** + + Displays an estimated item value for the item you hover over + Added Arachne to damage indicator. -+ Added **Arachne Minis Hider** - Hides the nametag above arachne minis. -+ Added **Arachne Boss Highlighter** - Highlight the arachne boss in red and mini bosses and orange. -+ Added **Discord RPC** - Showing stats like Location, Purse, Bits, Purse or Held Item at Discord Rich Presence. - (contributed by NetheriteMiner) ++ Added **Arachne Minis Hider** + + Hides the nametag above arachne minis ++ Added **Arachne Boss Highlighter** + + Highlight the arachne boss in red and mini bosses and orange. ++ Added **Discord RPC** (contributed by NetheriteMiner) + + Showing stats like Location, Purse, Bits, Purse or Held Item at Discord Rich Presence ### Garden Features -+ Added **Copper Price** - Show copper to coin prices inside the Sky Mart inventory. -+ Added **Visitor Display** - Show all items needed for the visitors. -+ Added **Visitor Highlight** - Highlight visitor when the required items are in the inventory or the visitor is new and needs to checked what items it needs. -+ Added **Show Price** - Show the bazaar price of the items required for the visitors. -+ Added **Crop Milestone** Number - Show the number of the crop milestone in the inventory. -+ Added **Crop Upgrades** Number - Show the number of upgrades in the crop upgrades inventory. -+ Added **Visitor Timer** - Timer when the next visitor will appear, and a number how many visitors are already waiting. -+ Added **Visitor Notification** - Show as title and in chat when a new visitor is visiting your island. -+ Added **Plot Price** - Show the price of the plot in coins when inside the Configure Plots inventory. -+ Added **Garden Crop Milestone Display** - Shows the progress and ETA until the next crop milestone is reached and the current crops/minute value. (Requires a tool with either a counter or cultivating enchantment) -+ Added **Best Crop Display** - Lists all crops and their ETA till next milestone. Sorts for best crop for getting garden level or skyblock level. -+ Added **Copper Price** - Show the price for copper inside the visitor gui. -+ Added **Amount and Time** - Show the exact item amount and the remaining time when farmed manually. Especially useful for ironman. -+ Added **Custom Keybinds** - Use custom keybinds while having a farming tool or Daedalus Axe in the hand in the garden. ++ Added **Copper Price** + + Show copper to coin prices inside the Sky Mart inventory. ++ Added **Visitor Display** + + Show all items needed for the visitors. ++ Added **Visitor Highlight** + + Highlight visitor when the required items are in the inventory or the visitor is new and needs to checked what items it needs ++ Added **Show Price** + + Show the bazaar price of the items required for the visitors. ++ Added **Crop Milestone** Number + + Show the number of the crop milestone in the inventory. ++ Added **Crop Upgrades** Number + + Show the number of upgrades in the crop upgrades inventory. ++ Added **Visitor Timer** + + Timer when the next visitor will appear, and a number how many visitors are already waiting. ++ Added **Visitor Notification** + + Show as title and in chat when a new visitor is visiting your island. ++ Added **Plot Price** + + Show the price of the plot in coins when inside the Configure Plots inventory. ++ Added **Garden Crop Milestone Display** + + Shows the progress and ETA until the next crop milestone is reached and the current crops/minute value. (Requires a tool with either a counter or cultivating enchantment) ++ Added **Best Crop Display** + + Lists all crops and their ETA till next milestone. Sorts for best crop for getting garden level or skyblock level. ++ Added **Copper Price** + + Show the price for copper inside the visitor gui. ++ Added **Amount and Time** + + Show the exact item amount and the remaining time when farmed manually. Especially useful for ironman. ++ Added **Custom Keybinds** + + Use custom keybinds while having a farming tool or Daedalus Axe in the hand in the garden. + Added Desk shortcut in SkyBlock Menu. -+ Added **Garden Level Display** - Show the current garden level and progress to the next level. ++ Added **Garden Level Display** + + Show the current garden level and progress to the next level. + Added **Farming Weight and Leaderboard**, provided by the elite skyblock farmers. + Added farming weight next leaderboard position eta. -+ Added **Dicer Counter** - Count RNG drops for Melon Dicer and Pumpkin Dicer. -+ Added **Optimal Speed** - Show the optimal speed for your current tool in the hand. (Ty MelonKingDE for the values) ++ Added **Dicer Counter** + + Count RNG drops for Melon Dicer and Pumpkin Dicer. ++ Added **Optimal Speed** + + Show the optimal speed for your current tool in the hand. (Ty MelonKingDE for the values) + Also available to select directly in the rancher boots overlay (contributed by nea) -+ Added **Warn When Close** - Warn with title and sound when the next crop milestone upgrade happens in 5 seconds. Useful for switching to a different pet for leveling. -+ Added **Money per Hour** - Displays the money per hour YOU get with YOUR crop/minute value when selling the items to bazaar. ++ Added **Warn When Close** + + Warn with title and sound when the next crop milestone upgrade happens in 5 seconds + + Useful for switching to a different pet for leveling ++ Added **Money per Hour** + + Displays the money per hour YOU get with YOUR crop/minute value when selling the items to bazaar. + Added farming contest timer. + Added wrong fungi cutter mode warning. + Added show the price per garden experience inside the visitor gui. + Added support for mushroom cow pet perk. (Counting and updating mushroom collection when breaking crops with mushroom blocks, added extra gui for time till crop milestones) + Added blocks/second display to crop milestone gui and made all crop milestone gui elements customizable/toggleable. + Added farming armor drops counter. -+ Added **Colored Name** - Show the visitor name in the color of the rarity. -+ Added **Visitor Item Preview** - Show the base type for the required items next to new visitors (Note that some visitors may require any crop) -+ Added **Teleport Pad Compact Name** - Hide the 'Warp to' and 'No Destination' texts over teleport pads. -+ Added **Money per Hour Advanced stats** - Show not only Sell Offer price but also Instant Sell price and NPC Sell price (Suggestion: Enable Compact Price as well for this) -+ Added **Anita Medal Profit** - Helps to identify profitable items to buy at the Anita item shop and potential profit from selling the item at the auction house. -+ Added **Composter Compact Display** - Displays the compost data from the tab list in a compact form as gui element. -+ Added **Composter Upgrade Price** - Show the price for the composter upgrade in the lore -+ Added **Highlight Upgrade** - Highlight Upgrades that can be bought right now. -+ Added **Number Composter Upgrades** - Show the number of upgrades in the composter upgrades inventory. -+ Added **Composter Inventory Numbers** - Show the amount of Organic Matter, Fuel and Composts Available while inside the composter inventory. -+ Added **True Farming Fortune - Displays** current farming fortune, including crop-specific bonuses. (contributed by appable) -+ Added **Tooltip Tweaks Compact Descriptions** - Hides redundant parts of reforge descriptions, generic counter description, and Farmhand perk explanation. (contributed by appable) -+ Added **Tooltip Tweaks Breakdown Hotkey** - When the keybind is pressed, show a breakdown of all fortune sources on a tool. (contributed by appable) -+ Added **Tooltip Tweaks Tooltip Format** - Show crop-specific farming fortune in tooltip. (contributed by appable) -+ Added command **/shcropspeedmeter** - Helps calculate the real farming fortune with the formula crops broken per block. -+ Added **Compost Low Notification** - Shows a notification as title when organic matter/fuel is low. -+ Added **Jacob's Contest Warning** - Show a warning shortly before a new jacob contest starts. -+ Added **Inventory Numbers** - Show the number of the teleport pads inside the 'Change Destination' inventory as stack size. -+ Added **Composter Overlay** - Show the cheapest items for organic matter and fuel, show profit per compost/hour/day and time per compost -+ Added **Composter Upgrades Overlay** - Show an overview of all composter stats, including time till organic matter and fuel is empty when fully filled and show a preview how these stats change when hovering over an upgrade ++ Added **Colored Name** + + Show the visitor name in the color of the rarity. ++ Added **Visitor Item Preview** + + Show the base type for the required items next to new visitors (Note that some visitors may require any crop) ++ Added **Teleport Pad Compact Name** + + Hide the 'Warp to' and 'No Destination' texts over teleport pads. ++ Added **Money per Hour Advanced stats** + + Show not only Sell Offer price but also Instant Sell price and NPC Sell price + + Suggestion: Enable Compact Price as well for this ++ Added **Anita Medal Profit** + + Helps to identify profitable items to buy at the Anita item shop and potential profit from selling the item at the auction house. ++ Added **Composter Compact Display** + + Displays the compost data from the tab list in a compact form as gui element. ++ Added **Composter Upgrade Price** + + Show the price for the composter upgrade in the lore ++ Added **Highlight Upgrade** + + Highlight Upgrades that can be bought right now. ++ Added **Number Composter Upgrades** + + Show the number of upgrades in the composter upgrades inventory. ++ Added **Composter Inventory Numbers** + + Show the amount of Organic Matter, Fuel and Composts Available while inside the composter inventory. ++ Added **True Farming Fortune + + Displays** current farming fortune, including crop-specific bonuses. (contributed by appable) ++ Added **Tooltip Tweaks Compact Descriptions** + + Hides redundant parts of reforge descriptions, generic counter description, and Farmhand perk explanation. (contributed by appable) ++ Added **Tooltip Tweaks Breakdown Hotkey** + + When the keybind is pressed, show a breakdown of all fortune sources on a tool. (contributed by appable) ++ Added **Tooltip Tweaks Tooltip Format** + + Show crop-specific farming fortune in tooltip. (contributed by appable) ++ Added command **/shcropspeedmeter** + + Helps calculate the real farming fortune with the formula crops broken per block. ++ Added **Compost Low Notification** + + Shows a notification as title when organic matter/fuel is low. ++ Added **Jacob's Contest Warning** + + Show a warning shortly before a new jacob contest starts. ++ Added **Inventory Numbers** + + Show the number of the teleport pads inside the 'Change Destination' inventory as stack size. ++ Added **Composter Overlay** + + Show the cheapest items for organic matter and fuel, show profit per compost/hour/day and time per compost ++ Added **Composter Upgrades Overlay** + + Show an overview of all composter stats, including time till organic matter and fuel is empty when fully filled and show a preview how these stats change when hovering over an upgrade + Hide crop money display, crop milestone display and garden visitor list while inside anita show, SkyMart or the composter inventory + Hide chat messages from the visitors in garden. (Except Beth and Spaceman) + Introduced a new command '/shcroptime <amount> <item>' that displays the estimated time it will take to gather the requested quantity of a particular item based on the current crop speed. + Show the average crop milestone in the crop milestone inventory. -+ Added **FF for Contest** - Show the minimum needed Farming Fortune for reaching a medal in the Jacob's Farming Contest inventory. -+ Added **yaw and pitch display** - Shows yaw and pitch with customizable precision while holding a farm tool. Automatically fades out if there is no movement for a customizable duration (Contributed by Sefer) ++ Added **FF for Contest** + + Show the minimum needed Farming Fortune for reaching a medal in the Jacob's Farming Contest inventory. ++ Added **yaw and pitch display** + + Shows yaw and pitch with customizable precision while holding a farm tool. Automatically fades out if there is no movement for a customizable duration (Contributed by Sefer) + Added warning when 6th visitors is ready (Contributed by CalMWolfs) ### Features from other Mods > *The following features are only there because I want them when testing SkyHanni features without other mods present.* + Added Hide explosions. -+ Added **Enderman Teleportation Hider** - Stops the enderman teleportation animation (Like in SBA) -+ Added **Fire Overlay Hider** - Hide the fire overlay (Like in Skytils) ++ Added **Enderman Teleportation Hider** + + Stops the enderman teleportation animation (Like in SBA) ++ Added **Fire Overlay Hider** + + Hide the fire overlay (Like in Skytils) ### Changes + Reworked reputation helper design in the crimson isle. @@ -156,9 +288,9 @@ + Fixed a bug that caused fire veil particle `hider/redline drawer` to not always detect the right click correctly. + Removed `Fixing Skytils custom Damage Splash` (Skytils has already fixed this bug. Additionally, this option enabled and skytils' damage splash disabled caused the hypixel damage splash to not show the tailing commas at all) + Fixed bug with particles that blocks NotEnoughUpdates' Fishing features. -+ Hopefully fixed incompatibility with skytils' hide cheap coins feature. ++ Hopefully fixed incompatibility with skytils `hide cheap coins` feature. + Fixed dungeon milestone messages getting wrongfully formatted. -+ Fixed bazaar features not working for items with an - (turbo farming books and triple strike) ++ Fixed bazaar features not working for items with an `-` (turbo farming books and triple strike) + Fixed Crab Hat of Celebration not being detected as an accessory correctly. + Added support for soopy's \[hand] feature diff --git a/FEATURES.md b/FEATURES.md index 2089efb3f..c21599543 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -20,7 +20,8 @@ - Scan messages sent by players in all-chat for blacklisted words and greys out the message. - Chat peeking (holding key to display chat without opening the chat gui) - Compact Potion Effect Messages -- **Arachne Chat Hider** - Hide chat messages about the Arachne Fight while outside of Arachne's Sanctuary +- **Arachne Chat Hider** + - Hide chat messages about the Arachne Fight while outside of Arachne's Sanctuary ## Dungeon - Clicked Blocks (Showing the block behind walls AFTER clicked on a chest, wither essence or a lever) @@ -65,6 +66,11 @@ + **Unclaimed Rewards** - Highlight contests with unclaimed rewards in the jacob inventory. + **Duplicate Hider** - Hides duplicate farming contests in the inventory. + **Contest Time** - Adds the real time format to the farming contest description. ++ Added Pet Candies Used number + + Works even after Hypixel removed the `10 pet candies applied` line ++ Added Estimated Armor Value display + + Shows the price of all 4 armor pieces combined inside the wardrobe ++ Show numbers of Pocket Sack-In-A-Sack applied on a sack (Default disabled, contributed by HiZe) ## Item Abilities - Show the cooldown of items in the inventory. @@ -114,6 +120,7 @@ - **Odger waypoint** - Show the Odger waypoint when trophy fishes are in the inventory and no lava rod in hand. + **Hide Repeated Catches** - Delete past catches of the same trophy fish from chat. - (Thanks appable0 + **Trophy Counter Design** - Change the way trophy fish messages gets displayed in the chat. - (Thanks appable0) ++ Showing fished item names ## Damage Indicator - Show the remaining health of selected bosses in the game in a bigger GUI. @@ -150,7 +157,13 @@ + Show item name and price over items laying on ground (only in slayer areas) + **Broken Hyperion Warning** + Warns when right-clicking with a Wither Impact weapon (e.g. Hyperion) no longer gains combat exp - (Kill a mob with melee-hits to fix this hypixel bug) + + Kill a mob with melee-hits to fix this hypixel bug + + Only works while doing slayer ++ Title warning when picking up an expensive slayer item ++ Added **RNG Meter Display** + + Display number of bosses needed until the next RNG Meter item drops + + Warn when no item is set in the RNG Meter + + Hide the RNG Meter message from chat if the current item is selected ### Diana + Show burrows near you. @@ -240,6 +253,28 @@ + Option to manually set the waypoint with /shcropstartlocation + Jacob Contest Stats Summary + Showing Blocks per Second and total Blocks clicked after a farming contest in chat ++ Added **Contest Time Needed** + + Show the time and missing FF for every crop inside Jacob's Farming Contest inventory ++ Added Garden Crop Start Location + + Show the start waypoint for your farm with the currently holding tool. + + Auto-detects the start of the farm when farming for the first time + + Option to manually set the waypoint with `/shcropstartlocation` ++ Added Farming Fortune Breakdown for Armor and Equipment (Contributed by CalMWolfs) + + Run /ff to open the menu + + Works with: Base Stats, Reforge Bonus, Ability Fortune and Green Thumb + + Breakdown for the true farming fortune from each crop + + Ability to select a single piece of armor or equipment ++ Added Garden Plot Icon (Contributed by HiZe) + + Select an item from the inventory to replace the icon in the Configure Plots inventory + + Change the Edit mode in the bottom right corner in the Configure Plots inventory ++ Show a warning when finding a **visitor with a rare reward** + + Show message in chat, over the visitor and prevents refusing + +## The Rift ++ **Rift Timer** + + Show the remaining rift time, max time, percentage, and extra time changes. ++ **Highlight Guide** + + Highlight things to do in the Rift Guide. ## Commands + **/wiki <search term>** - using hypixel-skyblock.fandom.com instead of Hypixel wiki. @@ -251,19 +286,19 @@ + SkyBlock Command `/tp` to check the play time still works ## Misc -- Allow to copy, paste, and mark selected text in signs (not visual, but it's working still) -- Pet Display (showing the currently selected pet as GUI element, without any fancy XP or level or percentage, but with auto-pet support) -- Hiding exp Bottles lying on the ground. -- **Real Time** - Display the current computer time, a handy feature when playing in full-screen mode. -- Highlight the voidling extremist in pink color. -- Highlight millenia aged blaze color in red -- Option to hide all damage splashes, from anywhere in Skyblock. -- Hide armor or just helmet of other player or yourself -- Display the active non-god potion effects. -- Wishing compass uses amount display. -- Brewing Stand Overlay. -- Crimson Isle Reputation Helper. -- Red Scoreboard Numbers - Hides the red numbers in the scoreboard sidebar on the right side of the screen. ++ Allow to copy, paste, and mark selected text in signs (not visual, but it's working still) ++ Pet Display (showing the currently selected pet as GUI element, without any fancy XP or level or percentage, but with auto-pet support) ++ Hiding exp Bottles lying on the ground. ++ **Real Time** - Display the current computer time, a handy feature when playing in full-screen mode. ++ Highlight the voidling extremist in pink color. ++ Highlight millenia aged blaze color in red ++ Option to hide all damage splashes, from anywhere in Skyblock. ++ Hide armor or just helmet of other player or yourself ++ Display the active non-god potion effects. ++ Wishing compass uses amount display. ++ Brewing Stand Overlay. ++ Crimson Isle Reputation Helper. ++ Red Scoreboard Numbers - Hides the red numbers in the scoreboard sidebar on the right side of the screen. + **Tia Relay Waypoint** - Show the next Relay waypoint for Tia The Fairy, where maintenance for the abiphone network needs to be done. + **Tia Relay Helper** - Helps with solving the sound puzzle. + **Hide dead entities** - Similar to Skytil's feature for inside dungeon, but for everywhere. @@ -284,10 +319,19 @@ + Supports tab completing for warp points when typing /warp + Supports party members, friends (need to visit all friend list pages), player on the same server + Supports these commands: /p, /party, /pt (party transfer), /f, /friend /msg, /w, /tell, /boop, /visit, /invite, /ah, /pv (NEU's Profile Viewer), /shmarkplayer (SkyHanni's Mark Player feature) - + Supports VIP /visit suggestions (currently PortalHub and prtlhub, if you know similar islands, tell us please) + + Supports VIP /visit suggestions (e.g. PortalHub or Hubportal) + Piece of Wizard Portal show earned by player name (Contributed by HiZe) + Quick Mod Menu Switching (default disabled) + Allows for easy navigation between one Mod Config and another + Default disabled + Detects your SkyBlock Mod automatically - + Does detect Chat Triggers and OneConfig itself, but no single mods that require these libraries
\ No newline at end of file + + Does detect Chat Triggers and OneConfig itself, but no single mods that require these libraries ++ **Sack Item Display** (Contributed by HiZe) + + Added price display next to sack items + + Can be disabled + + Sortable by price or items stored (both desc/asc) + + Option to show prices from Bazaar or NPC ++ Added **Ghost Counter** (Contributed by HiZe) + + Shows number of ghosts killed in the Mist in Dwarven Mines + + Shows kill combo, coins per scavenger, all item drops, bestiarity, magic find and more + + Each display line is highly customizable
\ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 36ac1ea6f..19b85e44d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,7 @@ plugins { } group = "at.hannibal2.skyhanni" -version = "0.18.Beta.21" +version = "0.18" // Toolchains: java { diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 5eb0eec1b..f79a02ba6 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -59,6 +59,9 @@ import at.hannibal2.skyhanni.features.mobs.AshfangMinisNametagHider import at.hannibal2.skyhanni.features.mobs.MobHighlight import at.hannibal2.skyhanni.features.nether.ashfang.* import at.hannibal2.skyhanni.features.nether.reputationhelper.CrimsonIsleReputationHelper +import at.hannibal2.skyhanni.features.rift.HighlightRiftGuide +import at.hannibal2.skyhanni.features.rift.RiftAPI +import at.hannibal2.skyhanni.features.rift.RiftTimer import at.hannibal2.skyhanni.features.slayer.* import at.hannibal2.skyhanni.features.slayer.blaze.BlazeSlayerClearView import at.hannibal2.skyhanni.features.slayer.blaze.BlazeSlayerDaggerHelper @@ -94,7 +97,7 @@ import org.apache.logging.log4j.Logger clientSideOnly = true, useMetadata = true, guiFactory = "at.hannibal2.skyhanni.config.ConfigGuiForgeInterop", - version = "0.18.Beta.21", + version = "0.18", ) class SkyHanniMod { @Mod.EventHandler @@ -144,6 +147,7 @@ class SkyHanniMod { loadModule(PartyAPI()) loadModule(SlayerAPI) loadModule(PurseAPI()) + loadModule(RiftAPI) // features loadModule(BazaarOrderHelper()) @@ -301,6 +305,8 @@ class SkyHanniMod { loadModule(FrozenTreasureTracker()) loadModule(SlayerRngMeterDisplay()) loadModule(GhostCounter) + loadModule(RiftTimer()) + loadModule(HighlightRiftGuide()) init() diff --git a/src/main/java/at/hannibal2/skyhanni/config/Features.java b/src/main/java/at/hannibal2/skyhanni/config/Features.java index d80195e71..02c4f9a80 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/Features.java +++ b/src/main/java/at/hannibal2/skyhanni/config/Features.java @@ -116,6 +116,10 @@ public class Features extends Config { public Garden garden = new Garden(); @Expose + @Category(name = "The Rift", desc = "Features for The Rift dimension.") + public RiftConfig rift = new RiftConfig(); + + @Expose @Category(name = "Ghost Counter", desc = "Ghost Counter settings.") public GhostCounter ghostCounter = new GhostCounter(); diff --git a/src/main/java/at/hannibal2/skyhanni/config/Storage.java b/src/main/java/at/hannibal2/skyhanni/config/Storage.java index ca852e482..ccae2ce25 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/Storage.java +++ b/src/main/java/at/hannibal2/skyhanni/config/Storage.java @@ -195,6 +195,9 @@ public class Storage { public long cakeExpiring = -1L; @Expose + public boolean carrotFortune = false; + + @Expose public Map<FarmingItems, ItemStack> farmingItems = new HashMap<>(); } diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt index ebcb72d28..59b850784 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -125,9 +125,9 @@ object Commands { } private fun createCommand(function: (Array<String>) -> Unit) = - object : ProcessCommandRunnable() { - override fun processCommand(sender: ICommandSender?, args: Array<out String>) { - function(args.asList().toTypedArray()) - } + object : ProcessCommandRunnable() { + override fun processCommand(sender: ICommandSender?, args: Array<out String>) { + function(args.asList().toTypedArray()) } + } }
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java b/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java index 25e3ba97b..fa2c310de 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.commands; +import at.hannibal2.skyhanni.test.command.CopyErrorCommand; import net.minecraft.command.CommandBase; import net.minecraft.command.ICommandSender; import net.minecraft.util.BlockPos; @@ -7,7 +8,7 @@ import net.minecraft.util.BlockPos; import java.util.List; /** - @author Moulberry + * @author Moulberry **/ public class SimpleCommand extends CommandBase { @@ -50,7 +51,11 @@ public class SimpleCommand extends CommandBase { @Override public void processCommand(ICommandSender sender, String[] args) { - runnable.processCommand(sender, args); + try { + runnable.processCommand(sender, args); + } catch (Throwable e) { + CopyErrorCommand.INSTANCE.logError(e, "Error while running command /" + commandName); + } } @Override diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Bingo.java b/src/main/java/at/hannibal2/skyhanni/config/features/Bingo.java index 53ebf93e1..b9270b03c 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/Bingo.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/Bingo.java @@ -35,7 +35,7 @@ public class Bingo { @ConfigOption( name = "Show Guide", desc = "Show tips and difficulty for bingo goals inside the bingo card inventory.\n" + - "§7(§eData from Bingo Splash Community§7)" + "§eData from Bingo Splash Community§7, made by §cMayxo" ) @ConfigEditorBoolean public boolean bingoSplashGuide = true; diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java b/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java index c53508dac..84a792a09 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java @@ -1196,12 +1196,24 @@ public class Garden { public int timeout = 5; @Expose - @ConfigOption(name = "Always Shown", desc = "Always show the Yaw and Pitch overlay, ignoring the timeout.") + @ConfigOption(name = "Show Without Tool", desc = "Does not require you to hold a tool for the overlay to show.") + @ConfigEditorBoolean + public boolean showWithoutTool = false; + + @Expose + @ConfigOption(name = "Show Outside Garden", desc = "The overlay will work outside of the garden.") + @ConfigEditorBoolean + public boolean showEverywhere = false; + + @Expose + @ConfigOption(name = "Ignore Timeout", desc = "Ignore the timeout after not moving mouse.") @ConfigEditorBoolean public boolean showAlways = false; @Expose public Position pos = new Position(445, 225, false, true); + @Expose + public Position posOutside = new Position(445, 225, false, true); } @Expose diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/RiftConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/RiftConfig.java new file mode 100644 index 000000000..0477920a2 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/RiftConfig.java @@ -0,0 +1,42 @@ +package at.hannibal2.skyhanni.config.features; + +import at.hannibal2.skyhanni.config.core.config.Position; +import com.google.gson.annotations.Expose; +import io.github.moulberry.moulconfig.annotations.Accordion; +import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; +import io.github.moulberry.moulconfig.annotations.ConfigOption; + +public class RiftConfig { + + @ConfigOption(name = "Rift Timer", desc = "") + @Accordion + @Expose + public RiftTimerConfig timer = new RiftTimerConfig(); + + public static class RiftTimerConfig { + + @Expose + @ConfigOption(name = "Enabled", desc = "Show the remaining rift time, max time, percentage, and extra time changes.") + @ConfigEditorBoolean + public boolean enabled = true; + + @Expose + @ConfigOption(name = "Max time", desc = "Show max time.") + @ConfigEditorBoolean + public boolean maxTime = true; + + @Expose + @ConfigOption(name = "Percentage", desc = "Show percentage.") + @ConfigEditorBoolean + public boolean percentage = true; + + @Expose + public Position timerPosition = new Position(10, 10, false, true); + + } + + @Expose + @ConfigOption(name = "Highlight Guide", desc = "Highlight things to do in the Rift Guide.") + @ConfigEditorBoolean + public boolean highlightGuide = true; +} diff --git a/src/main/java/at/hannibal2/skyhanni/data/EntityMovementData.kt b/src/main/java/at/hannibal2/skyhanni/data/EntityMovementData.kt index 30f88f48e..b5a2d2b92 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/EntityMovementData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/EntityMovementData.kt @@ -21,8 +21,6 @@ class EntityMovementData { } } - var tick = 0 - @SubscribeEvent fun onTick(event: TickEvent.ClientTickEvent) { if (!LorenzUtils.inSkyBlock) return diff --git a/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt b/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt index 7935bf985..91f2bed9a 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt @@ -19,6 +19,7 @@ enum class IslandType(val displayName: String, val apiName: String = "null") { GARDEN_GUEST("Garden Guest"), SPIDER_DEN("Spider's Den"), WINTER("Jerry's Workshop"), //todo confirm + THE_RIFT("The Rift"), NONE(""), UNKNOWN("???"), diff --git a/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt b/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt index ddd208db1..7c4cfd7c1 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt @@ -1,11 +1,10 @@ package at.hannibal2.skyhanni.data import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.config.ConfigManager import at.hannibal2.skyhanni.utils.APIUtil import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.jsonobjects.MayorJson -import com.google.gson.GsonBuilder -import io.github.moulberry.moulconfig.observer.PropertyTypeAdapterFactory import io.github.moulberry.notenoughupdates.util.SkyBlockTime import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -17,10 +16,6 @@ class MayorElection { private var tick = 0 private var lastUpdate = 0L - private val gson = GsonBuilder().setPrettyPrinting() - .registerTypeAdapterFactory(PropertyTypeAdapterFactory()) - .create() - companion object { var rawMayorData: MayorJson? = null var candidates = mapOf<Int, MayorJson.Candidate>() @@ -52,7 +47,7 @@ class MayorElection { SkyHanniMod.coroutineScope.launch { val url = "https://api.hypixel.net/resources/skyblock/election" val jsonObject = withContext(Dispatchers.IO) { APIUtil.getJSONResponse(url) } - rawMayorData = gson.fromJson(jsonObject, MayorJson::class.java) + rawMayorData = ConfigManager.gson.fromJson(jsonObject, MayorJson::class.java) val data = rawMayorData ?: return@launch val map = mutableMapOf<Int, MayorJson.Candidate>() map put data.mayor.election.getPairs() diff --git a/src/main/java/at/hannibal2/skyhanni/data/repo/RepoManager.kt b/src/main/java/at/hannibal2/skyhanni/data/repo/RepoManager.kt index 2dc65f358..e1d6aa933 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/repo/RepoManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/repo/RepoManager.kt @@ -1,10 +1,9 @@ package at.hannibal2.skyhanni.data.repo import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.config.ConfigManager import at.hannibal2.skyhanni.events.RepositoryReloadEvent import at.hannibal2.skyhanni.utils.LorenzUtils -import com.google.gson.Gson -import com.google.gson.GsonBuilder import com.google.gson.JsonObject import net.minecraft.client.Minecraft import org.apache.commons.io.FileUtils @@ -15,7 +14,7 @@ import java.util.concurrent.CompletableFuture import java.util.concurrent.atomic.AtomicBoolean class RepoManager(private val configLocation: File) { - val gson: Gson = GsonBuilder().setPrettyPrinting().create() + private val gson get() = ConfigManager.gson private var latestRepoCommit: String? = null private val repoLocation: File = File(configLocation, "repo") diff --git a/src/main/java/at/hannibal2/skyhanni/data/repo/RepoUtils.kt b/src/main/java/at/hannibal2/skyhanni/data/repo/RepoUtils.kt index 3e67adcac..9719c70ff 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/repo/RepoUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/repo/RepoUtils.kt @@ -79,17 +79,13 @@ object RepoUtils { fun <T> getConstant(repo: File, constant: String, gson: Gson, clazz: Class<T>?): T? { if (repo.exists()) { val jsonFile = File(repo, "constants/$constant.json") - try { - BufferedReader( - InputStreamReader( - FileInputStream(jsonFile), - StandardCharsets.UTF_8 - ) - ).use { reader -> - return gson.fromJson(reader, clazz) - } - } catch (e: Exception) { - return null + BufferedReader( + InputStreamReader( + FileInputStream(jsonFile), + StandardCharsets.UTF_8 + ) + ).use { reader -> + return gson.fromJson(reader, clazz) } } return null diff --git a/src/main/java/at/hannibal2/skyhanni/events/RepositoryReloadEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/RepositoryReloadEvent.kt index 5cfd59aa1..39d187326 100644 --- a/src/main/java/at/hannibal2/skyhanni/events/RepositoryReloadEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/events/RepositoryReloadEvent.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.events import at.hannibal2.skyhanni.data.repo.RepoUtils +import at.hannibal2.skyhanni.test.command.CopyErrorCommand import com.google.gson.Gson import com.google.gson.JsonObject import java.io.File @@ -8,6 +9,10 @@ import java.io.File class RepositoryReloadEvent(val repoLocation: File, val gson: Gson): LorenzEvent() { fun getConstant(constant: String) = getConstant<JsonObject>(constant) - inline fun <reified T : Any> getConstant(constant: String) = + inline fun <reified T : Any> getConstant(constant: String) = try { RepoUtils.getConstant(repoLocation, constant, gson, T::class.java) + } catch (e: Exception) { + CopyErrorCommand.logError(Exception("Repo parsing error while trying to read constant '$constant'", e), "Error reading repo data") + null + } }
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/bazaar/BazaarBestSellMethod.kt b/src/main/java/at/hannibal2/skyhanni/features/bazaar/BazaarBestSellMethod.kt index fa11ee786..a2106bf15 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/bazaar/BazaarBestSellMethod.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/bazaar/BazaarBestSellMethod.kt @@ -58,7 +58,7 @@ class BazaarBestSellMethod { val result = NumberUtil.format(totalDiff.toInt()) val name = NEUItems.getItemStack(internalName).nameWithEnchantment - return "§b$name§f sell difference: §e$result coins" + return "$name§7 sell difference: §6$result coins" } catch (e: Error) { e.printStackTrace() return "" @@ -72,7 +72,5 @@ class BazaarBestSellMethod { SkyHanniMod.feature.bazaar.bestSellMethodPos.renderString(display, posLabel = "Bazaar Best Sell Method") } - private fun isEnabled(): Boolean { - return LorenzUtils.inSkyBlock && SkyHanniMod.feature.bazaar.bestSellMethod - } + private fun isEnabled() = LorenzUtils.inSkyBlock && SkyHanniMod.feature.bazaar.bestSellMethod }
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenYawAndPitch.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenYawAndPitch.kt index 59356f30d..f569a0f21 100755 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenYawAndPitch.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenYawAndPitch.kt @@ -3,6 +3,7 @@ package at.hannibal2.skyhanni.features.garden import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.events.GardenToolChangeEvent import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.round import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings import net.minecraft.client.Minecraft @@ -16,8 +17,10 @@ class GardenYawAndPitch { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GameOverlayRenderEvent) { - if (!isEnabled()) return - if (GardenAPI.toolInHand == null) return + if (!LorenzUtils.inSkyBlock) return + if (!config.enabled) return + if (!GardenAPI.inGarden() && !config.showEverywhere) return + if (GardenAPI.toolInHand == null && !config.showWithoutTool) return val player = Minecraft.getMinecraft().thePlayer @@ -38,13 +41,15 @@ class GardenYawAndPitch { "§aYaw: §f${yaw.toDouble().round(config.yawPrecision)}", "§aPitch: §f${pitch.toDouble().round(config.pitchPrecision)}", ) - config.pos.renderStrings(displayList, posLabel = "Yaw and Pitch") + if (GardenAPI.inGarden()) { + config.pos.renderStrings(displayList, posLabel = "Yaw and Pitch") + } else { + config.posOutside.renderStrings(displayList, posLabel = "Yaw and Pitch") + } } @SubscribeEvent fun onGardenToolChange(event: GardenToolChangeEvent) { lastChange = System.currentTimeMillis() } - - private fun isEnabled() = GardenAPI.inGarden() && config.enabled -} +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt index 2da6f89b5..d52535f0d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt @@ -191,7 +191,6 @@ class CaptureFarmingGear { } } - //todo pet level up @SubscribeEvent fun onChat(event: LorenzChatEvent) { if (!LorenzUtils.inSkyBlock) return @@ -226,5 +225,8 @@ class CaptureFarmingGear { if (msg == "Yum! You gain +5☘ Farming Fortune for 48 hours!") { hidden.cakeExpiring = System.currentTimeMillis() + 172800000 } + if (msg == "CARROTS EXPORTATION COMPLETE!") { + hidden.carrotFortune = true + } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordStatus.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordStatus.kt index 20f203bb7..d114913bb 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordStatus.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordStatus.kt @@ -108,7 +108,7 @@ enum class DiscordStatus(private val displayMessageSupplier: Supplier<String>?) } if (coins == "1") { lastKnownDisplayStrings[PURSE] = "1 Coin" - } else if (coins != "") { + } else if (coins != "" && coins != null) { lastKnownDisplayStrings[PURSE] = "$coins Coins" } lastKnownDisplayStrings[PURSE] ?: "" diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/HighlightRiftGuide.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/HighlightRiftGuide.kt new file mode 100644 index 000000000..a8bf69fba --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/HighlightRiftGuide.kt @@ -0,0 +1,63 @@ +package at.hannibal2.skyhanni.features.rift + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.GuiContainerEvent +import at.hannibal2.skyhanni.events.InventoryCloseEvent +import at.hannibal2.skyhanni.events.InventoryOpenEvent +import at.hannibal2.skyhanni.utils.InventoryUtils +import at.hannibal2.skyhanni.utils.ItemUtils.getLore +import at.hannibal2.skyhanni.utils.LorenzColor +import at.hannibal2.skyhanni.utils.RenderUtils.highlight +import net.minecraftforge.fml.common.eventhandler.EventPriority +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class HighlightRiftGuide { + private val config get() = SkyHanniMod.feature.rift + private var inInventory = false + private var highlightedItems = listOf<Int>() + + @SubscribeEvent + fun onInventoryOpen(event: InventoryOpenEvent) { + inInventory = false + + if (!isEnabled()) return + + val inGuide = event.inventoryItems[40]?.getLore()?.let { + if (it.size == 1) { + it[0] == "§7To Rift Guide" + } else false + } ?: false + if (!inGuide) return + + val highlightedItems = mutableListOf<Int>() + for ((slot, stack) in event.inventoryItems) { + val lore = stack.getLore() + if (lore.isNotEmpty()) { + if (lore.last() == "§8✖ Not completed yet!") { + highlightedItems.add(slot) + } + } + } + inInventory = true + this.highlightedItems = highlightedItems + } + + @SubscribeEvent + fun onInventoryClose(event: InventoryCloseEvent) { + inInventory = false + } + + @SubscribeEvent(priority = EventPriority.LOW) + fun onBackgroundDrawn(event: GuiContainerEvent.BackgroundDrawnEvent) { + if (!isEnabled()) return + if (!inInventory) return + + for (slot in InventoryUtils.getItemsInOpenChest()) { + if (slot.slotIndex in highlightedItems) { + slot highlight LorenzColor.YELLOW + } + } + } + + fun isEnabled() = RiftAPI.inRift() && config.highlightGuide +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/RiftAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/RiftAPI.kt new file mode 100644 index 000000000..ea2f929e6 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/RiftAPI.kt @@ -0,0 +1,8 @@ +package at.hannibal2.skyhanni.features.rift + +import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.utils.LorenzUtils + +object RiftAPI { + fun inRift() = LorenzUtils.inIsland(IslandType.THE_RIFT) +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/RiftTimer.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/RiftTimer.kt new file mode 100644 index 000000000..6fe16c981 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/RiftTimer.kt @@ -0,0 +1,98 @@ +package at.hannibal2.skyhanni.features.rift + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.events.LorenzActionBarEvent +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.TimeUtils +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class RiftTimer { + private val config get() = SkyHanniMod.feature.rift.timer + private var display = listOf<String>() + private var maxTime = 0L + private var latestTime = 0L + private val changes = mutableMapOf<Long, String>() + + @SubscribeEvent + fun onJoinWorld(ignored: WorldEvent.Load) { + display = emptyList() + } + + @SubscribeEvent + fun onChatMessage(event: LorenzChatEvent) { + if (!isEnabled()) return + + val message = event.message + " §r§7You have §r§a(?<time>.*)ф §r§7left before the rift collapses!".toPattern().matchMatcher(message) { + val time = group("time") + maxTime = formatTime(time) + } + } + + @SubscribeEvent + fun onActionBar(event: LorenzActionBarEvent) { + if (!isEnabled()) return + + val message = event.message + for (entry in message.split(" ")) { + "§(?<color>[a7])(?<time>.*)ф Left.*".toPattern().matchMatcher(entry) { + val color = group("color") + if (color == "7") { + display = emptyList() + return + } + val time = group("time") + val currentTime = formatTime(time) + update(currentTime) + } + } + } + + private fun formatTime(time: String) = TimeUtils.getMillis(time.replace("m", "m ")) + + private fun update(currentTime: Long) { + if (currentTime == latestTime) return + val diff = (currentTime - latestTime) + 1000 + latestTime = currentTime + addDiff(diff) + + val currentFormat = TimeUtils.formatDuration(currentTime) + val percentage = LorenzUtils.formatPercentage(currentTime.toDouble() / maxTime) + val percentageFormat = if (config.percentage) " §7($percentage)" else "" + val maxTimeFormat = if (config.maxTime) "§7/§b" + TimeUtils.formatDuration(maxTime) else "" + val color = if (currentTime <= 60_000) "§c" else if (currentTime <= 60_000 * 5) "§e" else "§b" + val firstLine = "§eRift Timer: $color$currentFormat$maxTimeFormat$percentageFormat" + + display = buildList { + add(firstLine) + changes.keys.removeIf { System.currentTimeMillis() > it + 4_000 } + for (entry in changes.values) { + add(entry) + } + } + } + + private fun addDiff(diff: Long) { + val diffFormat = if (diff > 0) { + "§a+${TimeUtils.formatDuration(diff)}" + } else if (diff < 0) { + "§c-${TimeUtils.formatDuration(-diff)}" + } else return + + changes[System.currentTimeMillis()] = diffFormat + } + + @SubscribeEvent + fun onRenderOverlay(event: GuiRenderEvent.GameOverlayRenderEvent) { + if (!isEnabled()) return + + config.timerPosition.renderStrings(display, posLabel = "Rift Timer") + } + + fun isEnabled() = RiftAPI.inRift() && config.enabled +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerItemProfitTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerItemProfitTracker.kt index c04d662e2..9faa3511b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerItemProfitTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerItemProfitTracker.kt @@ -196,7 +196,7 @@ object SlayerItemProfitTracker { val renderable = if (inventoryOpen) Renderable.clickAndHover( text, listOf( - "§7Dropped §e$timesDropped §7times.", + "§7Dropped §e${timesDropped.addSeparators()} §7times.", "§7Your drop rate: §c$perBoss", "", "§eClick to " + (if (hidden) "show" else "hide") + "!", @@ -250,8 +250,8 @@ object SlayerItemProfitTracker { val slayerCompletedCount = itemLog.slayerCompletedCount addAsSingletonList( Renderable.hoverTips( - "§7Bosses killed: §e$slayerCompletedCount", - listOf("§7You killed the $itemLogCategory boss", "§e$slayerCompletedCount §7times.") + "§7Bosses killed: §e${slayerCompletedCount.addSeparators()}", + listOf("§7You killed the $itemLogCategory boss", "§e${slayerCompletedCount.addSeparators()} §7times.") ) ) diff --git a/src/main/java/at/hannibal2/skyhanni/test/command/CopyErrorCommand.kt b/src/main/java/at/hannibal2/skyhanni/test/command/CopyErrorCommand.kt index a8c6660f3..ccaeee6ef 100644 --- a/src/main/java/at/hannibal2/skyhanni/test/command/CopyErrorCommand.kt +++ b/src/main/java/at/hannibal2/skyhanni/test/command/CopyErrorCommand.kt @@ -4,12 +4,14 @@ import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.OSUtils import com.google.common.cache.CacheBuilder +import net.minecraft.client.Minecraft import java.util.* import java.util.concurrent.TimeUnit object CopyErrorCommand { // random id -> error message private val errorMessages = mutableMapOf<String, String>() + private val fullErrorMessages = mutableMapOf<String, String>() private var cache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).build<Pair<String, Int>, Unit>() @@ -20,22 +22,34 @@ object CopyErrorCommand { return } - LorenzUtils.chat(errorMessages[array[0]]?.let { + val id = array[0] + val fullErrorMessage = LorenzUtils.isControlKeyDown() + val errorMessage = if (fullErrorMessage) { + fullErrorMessages[id] + } else { + errorMessages[id] + } + val name = if (fullErrorMessage) "Ful error" else "Error" + LorenzUtils.chat(errorMessage?.let { OSUtils.copyToClipboard(it) - "§e[SkyHanni] Error copied into the clipboard, please report it on the SkyHanni discord!" + "§e[SkyHanni] $name copied into the clipboard, please report it on the SkyHanni discord!" } ?: "§c[SkyHanni] Error id not found!") } fun logError(error: Throwable, message: String) { + Minecraft.getMinecraft().thePlayer ?: throw Error(message, error) + val pair = error.stackTrace[0].let { it.fileName to it.lineNumber } if (cache.getIfPresent(pair) != null) return cache.put(pair, Unit) - val stackTrace = error.stackTraceToString().removeSpam() + val fullStackTrace = error.getExactStackTrace(true).joinToString("\n") + val stackTrace = error.getExactStackTrace(false).joinToString("\n").removeSpam() val randomId = UUID.randomUUID().toString() - errorMessages[randomId] = - "```\nSkyHanni ${SkyHanniMod.version}: $message\n \n$stackTrace```" + errorMessages[randomId] = "```\nSkyHanni ${SkyHanniMod.version}: $message\n \n$stackTrace\n```" + fullErrorMessages[randomId] = + "```\nSkyHanni ${SkyHanniMod.version}: $message\n(full stack trace)\n \n$fullStackTrace\n```" LorenzUtils.clickableChat( "§c[SkyHanni ${SkyHanniMod.version}]: $message. Click here to copy the error into the clipboard.", @@ -44,12 +58,57 @@ object CopyErrorCommand { } } +private fun Throwable.getExactStackTrace(full: Boolean, parent: List<String> = emptyList()): List<String> = buildList { + add("Caused by " + javaClass.name + ": $message") + + val breakAfter = listOf( + "at net.minecraftforge.client.ClientCommandHandler.executeCommand(", + ) + val replace = mapOf( + "io.mouberry,notenoughupdates" to "NEU", + "at.hannibal2.skyhanni" to "SH", + ) + + for (traceElement in stackTrace) { + var text = "\tat $traceElement" + if (!full) { + if (text in parent) { + println("broke at: $text") + break + } + } + if (!full) { + for ((from, to) in replace) { + text = text.replace(from, to) + } + } + add(text) + if (!full) { + if (breakAfter.any { text.contains(it) }) { + println("breakAfter: $text") + break + } + } + } + + cause?.let { + addAll(it.getExactStackTrace(full, this)) + } +} + private fun String.removeSpam(): String { val ignored = listOf( "at io.netty.", "at net.minecraft.network.", "at net.minecraftforge.fml.common.network.handshake.", "at java.lang.Thread.run", + "at com.google.gson.internal.", + "at net.minecraftforge.fml.common.eventhandler.", + "at java.util.concurrent.", + "at sun.reflect.", + "at net.minecraft.client.Minecraft.addScheduledTask(", + "at java.lang.reflect.", + "at at.hannibal2.skyhanni.config.commands.Commands\$", ) - return split("\r\n\t").filter { line -> !ignored.any { line.startsWith(it) } }.joinToString("\n") + return split("\n").filter { line -> !ignored.any { line.contains(it) } }.joinToString("\n") } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt index 054b8509c..bc50ea0e6 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt @@ -372,4 +372,13 @@ object LorenzUtils { && tileSign.signText[2].unformattedText.removeColor() == "Set your" && tileSign.signText[3].unformattedText.removeColor() == "speed cap!") } + + fun inIsland(island: IslandType) = inSkyBlock && skyBlockIsland == island + + fun <K, N : Number> MutableMap<K, N>.addOrPut(item: K, amount: N) { + val old = this[item] ?: 0 + val d = old.toDouble() + amount.toDouble() + @Suppress("UNCHECKED_CAST") + this[item] = d as N + } }
\ No newline at end of file |