diff --git a/CHANGELOG.md b/CHANGELOG.md index 55ce3f340d34..884017ef60f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # SkyHanni - Change Log -## Version 0.21.1 (unreleased) +## Version 0.21.1 ### New Features @@ -14,7 +14,6 @@ ### Changes - #### Garden Changes + Added mythic/Maeve visitor support. - walker & hannibal2 @@ -25,6 +24,12 @@ + Use the crop fortune from tab in Farming Fortune HUD. - alexia + Shows the last saved ff value in gray while switching tools instead of the question mark. - hannibal2 + Removed chat message that your crop milestone data is correct. - hannibal2 ++ Removed the message when crop milestones look different in the menu than stored SkyHanni data. - hannibal2 + + We already have the correct data now, and Hypixel rounds the numbers in the menu poorly. + + Only show the Total Crop Milestone info in crop milestone inventory when below tier 20. - hannibal2 + + Hypixel now has their own line for the same information for tier 20+ ++ Make the FF Display only visible while holding a farming tool in hand. - hannibal2 ++ Hide in crop milestone display the line with time remaining entirely when the milestone is maxed. - hannibal2 #### Other Changes @@ -32,6 +37,7 @@ + Add option to hide the chat message when toggling /shmouselock. - hannibal2 + Reminds to use the GUI Position Editor hotkey. - hannibal2 + Reminds every 30 minutes after using /sh gui or clicking the GUI edit button. ++ Added Bookworm Book to the Estimated Item Value feature. - jani ### Fixes @@ -52,6 +58,11 @@ + Added cooldown to prevent spam clicking on farming weight buttons to open many web pages. - hannibal2 + Fixed clickable farming weight GUI no longer opens #1000 in lb website. - hannibal2 + Fixed /ff upgrade suggests updating bustling reforge even when no farming armor is found. - hannibal2 ++ Fixed maxed sunder fortune in the /ff stats breakdown. - alexia ++ Fixed the farming contest summary not showing when the crop is buffed by Anita Talisman/Ring/Artifact. - hannibal2 ++ Fixed Farming Fortune Display not showing for non crop-specific tools. - hannibal2 ++ Fixed green thumb fortune in /ff to include Maeve. - hannibal2 ++ Fixed crops per second and time remaining not using the 100 base ff in their formula. - alexia #### Other Fixes @@ -64,6 +75,8 @@ + Fixed Sack Display sometimes not formatting a million correctly. - Hize + Fixed Estimated Item Value getting shown in stats breakdown menu. - hannibal2 + Fixed a bug with the ender chest and SkyHanni GUI editor. - hannibal2 ++ Fixed crimson isle faction icon in tab list showing twice and not going away fully when enabling the "hide faction" + option of advanced player list. - hannibal2 ### Technical Details @@ -80,6 +93,14 @@ + The new data gets compared to the currently saved data, differences are getting replaced and the result gets put into the clipboard. The clipboard context can be used to update the repo content. +### Removed Features + ++ Removed 100 Farming Fortune from "Show As Drop Multiplier" from all displays (also known as "base ff"). - hannibal2 + + This can cause some numbers to show 100 FF too much. Simply update the values to fix it. + + Those "base FF" values were never really part of your farming fortune stats. They are just a result of looking at + the crop drop formula. SkyHanni used those values to be more comparable with other Discord Bots and spreadsheets. + This also caused confusion, so we have removed it entirely now. + ## Version 0.21 ### New Features diff --git a/build.gradle.kts b/build.gradle.kts index b79a287b1560..5abe8290f963 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } group = "at.hannibal2.skyhanni" -version = "0.21.1.Beta.6" +version = "0.21.1" // Toolchains: java { diff --git a/src/main/java/SkyHanniInstallerFrame.java b/src/main/java/SkyHanniInstallerFrame.java index fa8868254b12..a9584dedfe31 100644 --- a/src/main/java/SkyHanniInstallerFrame.java +++ b/src/main/java/SkyHanniInstallerFrame.java @@ -166,8 +166,8 @@ private JLabel getPictureLabel() { margin = 5; BufferedImage myPicture = ImageIO.read(Objects.requireNonNull(getClass() - .getClassLoader() - .getResourceAsStream("assets/skyhanni/logo.png"), "Logo not found.")); + .getClassLoader() + .getResourceAsStream("assets/skyhanni/logo.png"), "Logo not found.")); Image scaled = myPicture.getScaledInstance(w - margin * 2, h - margin, Image.SCALE_SMOOTH); logo = new JLabel(new ImageIcon(scaled)); logo.setName("Logo"); @@ -222,8 +222,8 @@ private JTextArea getTextArea() { descriptionText.setOpaque(false); descriptionText.setPreferredSize(new Dimension(w - margin * 2, h - margin)); descriptionText.setText( - "This installer will copy SkyHanni into your forge mods folder for you, and replace any old versions that already exist. " + - "Close this if you prefer to do this yourself!"); + "This installer will copy SkyHanni into your forge mods folder for you, and replace any old versions that already exist. " + + "Close this if you prefer to do this yourself!"); descriptionText.setWrapStyleWord(true); y += h; @@ -251,7 +251,7 @@ private JTextArea getForgeTextArea() { forgeDescriptionText.setOpaque(false); forgeDescriptionText.setPreferredSize(new Dimension(w - margin * 2, h - margin)); forgeDescriptionText.setText( - "However, you still need to install Forge client in order to be able to run this mod. Click here to visit the download page for Forge 1.8.9!"); + "However, you still need to install Forge client in order to be able to run this mod. Click here to visit the download page for Forge 1.8.9!"); forgeDescriptionText.setForeground(Color.BLUE.darker()); forgeDescriptionText.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); forgeDescriptionText.setWrapStyleWord(true); @@ -315,8 +315,8 @@ private JButton getButtonFolder() { try { BufferedImage myPicture = ImageIO.read(Objects.requireNonNull(getClass() - .getClassLoader() - .getResourceAsStream("assets/skyhanni/folder.png"), "Folder icon not found.")); + .getClassLoader() + .getResourceAsStream("assets/skyhanni/folder.png"), "Folder icon not found.")); Image scaled = myPicture.getScaledInstance(w - 8, h - 6, Image.SCALE_SMOOTH); buttonChooseFolder = new JButton(new ImageIcon(scaled)); buttonChooseFolder.setName("ButtonFolder"); @@ -430,7 +430,7 @@ public void mouseClicked(MouseEvent e) { if (e.getSource() == getForgeTextArea()) { try { Desktop.getDesktop().browse(new URI( - "http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.8.9.html")); + "http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.8.9.html")); } catch (IOException | URISyntaxException ex) { showErrorPopup(ex); } @@ -519,10 +519,10 @@ private boolean findSkyHanniAndDelete(File[] files) { } catch (Exception ex) { ex.printStackTrace(); showErrorMessage("Was not able to delete the other SkyHanni files found in your mods folder!" + - System.lineSeparator() + - "Please make sure that your minecraft is currently closed and try again, or feel" + - System.lineSeparator() + - "free to open your mods folder and delete those files manually."); + System.lineSeparator() + + "Please make sure that your minecraft is currently closed and try again, or feel" + + System.lineSeparator() + + "free to open your mods folder and delete those files manually."); return true; } continue; @@ -667,10 +667,10 @@ private String getModIDFromInputStream(InputStream inputStream) { private File getThisFile() { try { return new File(SkyHanniInstallerFrame.class - .getProtectionDomain() - .getCodeSource() - .getLocation() - .toURI()); + .getProtectionDomain() + .getCodeSource() + .getLocation() + .toURI()); } catch (URISyntaxException ex) { showErrorPopup(ex); } @@ -700,4 +700,4 @@ public enum OperatingSystem { MACOS, UNKNOWN } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 57640d7668c6..bb591e353187 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -16,10 +16,12 @@ import at.hannibal2.skyhanni.data.EntityMovementData import at.hannibal2.skyhanni.data.FriendAPI import at.hannibal2.skyhanni.data.GardenComposterUpgradesData import at.hannibal2.skyhanni.data.GardenCropMilestones +import at.hannibal2.skyhanni.data.GardenCropMilestonesCommunityFix import at.hannibal2.skyhanni.data.GardenCropUpgrades import at.hannibal2.skyhanni.data.GuiEditManager import at.hannibal2.skyhanni.data.GuildAPI import at.hannibal2.skyhanni.data.HypixelData +import at.hannibal2.skyhanni.data.ItemAddManager import at.hannibal2.skyhanni.data.ItemClickData import at.hannibal2.skyhanni.data.ItemRenderBackground import at.hannibal2.skyhanni.data.ItemTipHelper @@ -119,6 +121,9 @@ import at.hannibal2.skyhanni.features.fishing.SeaCreatureMessageShortener import at.hannibal2.skyhanni.features.fishing.SharkFishCounter import at.hannibal2.skyhanni.features.fishing.ShowFishingItemName import at.hannibal2.skyhanni.features.fishing.ThunderSparksHighlight +import at.hannibal2.skyhanni.features.fishing.tracker.FishingProfitPlayerMoving +import at.hannibal2.skyhanni.features.fishing.tracker.FishingProfitTracker +import at.hannibal2.skyhanni.features.fishing.tracker.FishingTrackerCategoryManager import at.hannibal2.skyhanni.features.fishing.trophy.OdgerWaypoint import at.hannibal2.skyhanni.features.fishing.trophy.TrophyFishFillet import at.hannibal2.skyhanni.features.fishing.trophy.TrophyFishManager @@ -333,7 +338,7 @@ import org.apache.logging.log4j.Logger clientSideOnly = true, useMetadata = true, guiFactory = "at.hannibal2.skyhanni.config.ConfigGuiForgeInterop", - version = "0.21.1.Beta.6", + version = "0.21.1", ) class SkyHanniMod { @Mod.EventHandler @@ -364,6 +369,7 @@ class SkyHanniMod { loadModule(TabListData()) loadModule(RenderData()) loadModule(GardenCropMilestones) + loadModule(GardenCropMilestonesCommunityFix) loadModule(GardenCropUpgrades()) loadModule(VisitorListener()) loadModule(OwnInventoryData()) @@ -384,6 +390,7 @@ class SkyHanniMod { loadModule(EntityOutlineRenderer) loadModule(KeyboardManager) loadModule(AdvancedPlayerList) + loadModule(ItemAddManager()) // APIs loadModule(BazaarApi()) @@ -565,6 +572,9 @@ class SkyHanniMod { loadModule(PlayerTabComplete) loadModule(GetFromSacksTabComplete) loadModule(SlayerProfitTracker) + loadModule(FishingProfitTracker) + loadModule(FishingTrackerCategoryManager) + loadModule(FishingProfitPlayerMoving) loadModule(SlayerItemsOnGround()) loadModule(RestorePieceOfWizardPortalLore()) loadModule(QuickModMenuSwitch) diff --git a/src/main/java/at/hannibal2/skyhanni/api/CollectionAPI.kt b/src/main/java/at/hannibal2/skyhanni/api/CollectionAPI.kt index cd7fa0c59f97..ba9dc5327f83 100644 --- a/src/main/java/at/hannibal2/skyhanni/api/CollectionAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/api/CollectionAPI.kt @@ -2,8 +2,8 @@ package at.hannibal2.skyhanni.api import at.hannibal2.skyhanni.events.CollectionUpdateEvent import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent +import at.hannibal2.skyhanni.events.ItemAddEvent import at.hannibal2.skyhanni.events.ProfileJoinEvent -import at.hannibal2.skyhanni.events.entity.ItemAddInInventoryEvent import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.LorenzUtils @@ -69,9 +69,12 @@ class CollectionAPI { } @SubscribeEvent - fun onItemAdd(event: ItemAddInInventoryEvent) { - // TODO add support for replenish (higher collection than actual items in inv) + fun onItemAdd(event: ItemAddEvent) { val internalName = event.internalName + val (_, amount) = NEUItems.getMultiplier(internalName) + if (amount > 1) return + + // TODO add support for replenish (higher collection than actual items in inv) if (internalName.getItemStackOrNull() == null) { LorenzUtils.debug("CollectionAPI.addFromInventory: item is null for '$internalName'") return diff --git a/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt b/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt index ddd51b18fce6..5893fbf062c2 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt @@ -13,6 +13,7 @@ import at.hannibal2.skyhanni.utils.NEUItems import at.hannibal2.skyhanni.utils.jsonobjects.FriendsJson import at.hannibal2.skyhanni.utils.jsonobjects.JacobContestsJson import at.hannibal2.skyhanni.utils.jsonobjects.KnownFeaturesJson +import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker import com.google.gson.GsonBuilder import com.google.gson.JsonObject import com.google.gson.TypeAdapter @@ -37,6 +38,8 @@ import java.nio.file.StandardCopyOption import java.util.UUID import kotlin.concurrent.fixedRateTimer +typealias TrackerDisplayMode = SkyHanniTracker.DefaultDisplayMode + class ConfigManager { companion object { val gson = GsonBuilder().setPrettyPrinting() @@ -108,6 +111,15 @@ class ConfigManager { return IslandType.valueOf(reader.nextString().uppercase()) } }.nullSafe()) + .registerTypeAdapter(TrackerDisplayMode::class.java, object : TypeAdapter() { + override fun write(out: JsonWriter, value: TrackerDisplayMode) { + out.value(value.name) + } + + override fun read(reader: JsonReader): TrackerDisplayMode { + return TrackerDisplayMode.valueOf(reader.nextString()) + } + }.nullSafe()) .enableComplexMapKeySerialization() .create() diff --git a/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt b/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt index 0db542e12008..a8ec467d99a9 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt @@ -9,7 +9,7 @@ import com.google.gson.JsonPrimitive object ConfigUpdaterMigrator { val logger = LorenzLogger("ConfigMigration") - const val CONFIG_VERSION = 9 + const val CONFIG_VERSION = 10 fun JsonElement.at(chain: List, init: Boolean): JsonElement? { if (chain.isEmpty()) return this if (this !is JsonObject) return null diff --git a/src/main/java/at/hannibal2/skyhanni/config/Storage.java b/src/main/java/at/hannibal2/skyhanni/config/Storage.java index 8bdb581e7e27..55cdf27e9a4e 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/Storage.java +++ b/src/main/java/at/hannibal2/skyhanni/config/Storage.java @@ -6,6 +6,7 @@ import at.hannibal2.skyhanni.features.combat.ghostcounter.GhostData; import at.hannibal2.skyhanni.features.dungeon.DungeonAPI; import at.hannibal2.skyhanni.features.event.jerry.frozentreasure.FrozenTreasureTracker; +import at.hannibal2.skyhanni.features.fishing.tracker.FishingProfitTracker; import at.hannibal2.skyhanni.features.fishing.trophy.TrophyRarity; import at.hannibal2.skyhanni.features.garden.CropAccessory; import at.hannibal2.skyhanni.features.garden.CropType; @@ -20,6 +21,7 @@ import at.hannibal2.skyhanni.features.slayer.SlayerProfitTracker; import at.hannibal2.skyhanni.utils.LorenzVec; import at.hannibal2.skyhanni.utils.NEUInternalName; +import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker; import com.google.gson.annotations.Expose; import net.minecraft.item.ItemStack; @@ -50,6 +52,9 @@ public class Storage { @Expose public Boolean contestSendingAsked = false; + @Expose + public Map trackerDisplayModes = new HashMap<>(); + @Expose public Map players = new HashMap<>(); @@ -393,5 +398,15 @@ public static class DungeonStorage { @Expose public Map bosses = new HashMap<>(); } + + @Expose + public FishingStorage fishing = new FishingStorage(); + + public static class FishingStorage { + + @Expose + public FishingProfitTracker.Data fishingProfitTracker = new FishingProfitTracker.Data(); + + } } } 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 244304aedb6a..86d3aefb1def 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -4,7 +4,7 @@ import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.config.ConfigFileType import at.hannibal2.skyhanni.config.ConfigGuiManager import at.hannibal2.skyhanni.data.ChatManager -import at.hannibal2.skyhanni.data.GardenCropMilestonesFix +import at.hannibal2.skyhanni.data.GardenCropMilestonesCommunityFix import at.hannibal2.skyhanni.data.GuiEditManager import at.hannibal2.skyhanni.data.PartyAPI import at.hannibal2.skyhanni.features.bingo.BingoCardDisplay @@ -18,6 +18,7 @@ import at.hannibal2.skyhanni.features.event.diana.InquisitorWaypointShare import at.hannibal2.skyhanni.features.event.jerry.frozentreasure.FrozenTreasureTracker import at.hannibal2.skyhanni.features.fame.AccountUpgradeReminder import at.hannibal2.skyhanni.features.fame.CityProjectFeatures +import at.hannibal2.skyhanni.features.fishing.tracker.FishingProfitTracker import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.features.garden.GardenCropTimeCommand import at.hannibal2.skyhanni.features.garden.GardenNextJacobContest @@ -176,6 +177,7 @@ object Commands { ) { EnderNodeTracker.resetCommand(it) } registerCommand("shresetarmordroptracker", "Resets the Armor Drop Tracker") { ArmorDropTracker.resetCommand(it) } registerCommand("shresetfrozentreasuretracker", "Resets the Frozen Treasure Tracker") { FrozenTreasureTracker.resetCommand(it) } + registerCommand("shresetfishingtracker", "Resets the Frozen Treasure Tracker") { FishingProfitTracker.resetCommand(it) } registerCommand("shbingotoggle", "Toggle the bingo card display mode") { BingoCardDisplay.toggleCommand() } registerCommand( "shfarmingprofile", @@ -212,6 +214,10 @@ object Commands { "shclearminiondata", "Reset data about minion profit and the name display on the private island" ) { MinionFeatures.clearMinionData() } + registerCommand( + "shwhereami", + "Print current island in chat" + ) { SkyHanniDebugsAndTests.whereami() } registerCommand( "shconfig", "Search or reset config elements §c(warning, dangerous!)" @@ -324,7 +330,7 @@ object Commands { registerCommand( "readcropmilestonefromclipboard", "Read crop milestone from clipboard. This helps fixing wrong crop milestone data" - ) { GardenCropMilestonesFix.readDataFromClipboard() } + ) { GardenCropMilestonesCommunityFix.readDataFromClipboard() } } private fun internalCommands() { diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/fishing/BarnTimerConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/fishing/BarnTimerConfig.java index eb0577135c95..bf2609ed0b93 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/fishing/BarnTimerConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/fishing/BarnTimerConfig.java @@ -22,15 +22,31 @@ public class BarnTimerConfig { @Expose @ConfigOption( name = "Worm Fishing", - desc = "Show the Barn Fishing Timer even for worms or other sea creatures in the Crystal Hollows." + desc = "Show the Barn Fishing Timer in the Crystal Hollows." ) @ConfigEditorBoolean public boolean crystalHollows = true; + @Expose + @ConfigOption( + name = "Lava Fishing", + desc = "Show the Barn Fishing Timer in the Crimson Isle." + ) + @ConfigEditorBoolean + public boolean crimsonIsle = true; + + @Expose + @ConfigOption( + name = "Winter Fishing", + desc = "Show the Barn Fishing Timer on the Jerry's Workshop." + ) + @ConfigEditorBoolean + public boolean winterIsland = true; + @Expose @ConfigOption( name = "Stranded Fishing", - desc = "Show the Barn Fishing Timer even on all the different islands Stranded players can visit." + desc = "Show the Barn Fishing Timer on all the different islands that Stranded players can visit." ) @ConfigEditorBoolean public boolean forStranded = true; diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/fishing/FishingConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/fishing/FishingConfig.java index 13ef30f84aed..349f4882eb12 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/fishing/FishingConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/fishing/FishingConfig.java @@ -50,6 +50,11 @@ public class FishingConfig { @Accordion public RareCatchesConfig rareCatches = new RareCatchesConfig(); + @Expose + @ConfigOption(name = "Fishing Profit Tracker", desc = "") + @Accordion + public FishingProfitTrackerConfig fishingProfitTracker = new FishingProfitTrackerConfig(); + @Expose @ConfigOption( name = "Shark Fish Counter", diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/fishing/FishingProfitTrackerConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/fishing/FishingProfitTrackerConfig.java new file mode 100644 index 000000000000..5c6e9b5809bb --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/fishing/FishingProfitTrackerConfig.java @@ -0,0 +1,24 @@ +package at.hannibal2.skyhanni.config.features.fishing; + +import at.hannibal2.skyhanni.config.FeatureToggle; +import at.hannibal2.skyhanni.config.core.config.Position; +import com.google.gson.annotations.Expose; +import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; +import io.github.moulberry.moulconfig.annotations.ConfigOption; + +public class FishingProfitTrackerConfig { + + @Expose + @ConfigOption(name = "Enabled", desc = "Count all items you pick up while fishing.") + @ConfigEditorBoolean + @FeatureToggle + public boolean enabled = false; + + @Expose + public Position position = new Position(20, 20, false, true); + + @Expose + @ConfigOption(name = "Hide Moving", desc = "Hide the Fishing Profit Tracker while moving.") + @ConfigEditorBoolean + public boolean hideMoving = true; +} diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/garden/FarmingFortuneConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/garden/FarmingFortuneConfig.java index aadf97fee8b2..ff5f6c62d776 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/garden/FarmingFortuneConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/garden/FarmingFortuneConfig.java @@ -18,15 +18,6 @@ public class FarmingFortuneConfig { @FeatureToggle public boolean display = true; - @Expose - @ConfigOption( - name = "Show As Drop Multiplier", - desc = "Adds 100 to the displayed Farming Fortune so that it represents a drop multiplier rather than" + - " the chance for bonus drops. " - ) - @ConfigEditorBoolean - public boolean dropMultiplier = true; - @ConfigOption(name = "Farming Fortune Guide", desc = "Opens a guide that breaks down your Farming Fortune.\n§eCommand: /ff") @ConfigEditorButton(buttonText = "Open") public Runnable open = Commands::openFortuneGuide; diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/misc/MiscConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/misc/MiscConfig.java index 1ac453a8dce2..c9465ea2d9f6 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/misc/MiscConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/misc/MiscConfig.java @@ -87,6 +87,11 @@ public class MiscConfig { @Accordion public KickDurationConfig kickDuration = new KickDurationConfig(); + @Expose + @ConfigOption(name = "Tracker", desc = "Tracker Config") + @Accordion + public TrackerConfig tracker = new TrackerConfig(); + @Expose @ConfigOption(name = "Exp Bottles", desc = "Hides all the experience orbs lying on the ground.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/misc/TrackerConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/misc/TrackerConfig.java new file mode 100644 index 000000000000..613adde60872 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/misc/TrackerConfig.java @@ -0,0 +1,36 @@ +package at.hannibal2.skyhanni.config.features.misc; + +import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker; +import com.google.gson.annotations.Expose; +import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; +import io.github.moulberry.moulconfig.annotations.ConfigEditorDropdown; +import io.github.moulberry.moulconfig.annotations.ConfigOption; +import io.github.moulberry.moulconfig.observer.Property; + +public class TrackerConfig { + + @Expose + @ConfigOption(name = "Hide with Item Value", desc = "Hide all trackers while the Estimated Item Value is visible.") + @ConfigEditorBoolean + public boolean hideInEstimatedItemValue = true; + + @Expose + @ConfigOption(name = "Show Price From", desc = "Show price from Bazaar or NPC.") + @ConfigEditorDropdown(values = {"Instant Sell", "Sell Offer", "NPC"}) + public int priceFrom = 1; + + @Expose + @ConfigOption(name = "Default Display Mode", desc = "Change the display mode that gets shown on default.") + @ConfigEditorDropdown + public Property defaultDisplayMode = Property.of(SkyHanniTracker.DefaultDisplayMode.REMEMBER_LAST); + + @Expose + @ConfigOption(name = "Recent Drops", desc = "Highlight the amount in green on recently gained items.") + @ConfigEditorBoolean + public boolean showRecentDrops = true; + + @Expose + @ConfigOption(name = "Exclude Hidden", desc = "Exclude hidden items in the total price calculation.") + @ConfigEditorBoolean + public boolean excludeHiddenItemsInPrice = false; +} diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/slayer/ItemProfitTrackerConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/slayer/ItemProfitTrackerConfig.java index a7bc636db1e6..5fc67993bd79 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/slayer/ItemProfitTrackerConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/slayer/ItemProfitTrackerConfig.java @@ -4,7 +4,6 @@ import at.hannibal2.skyhanni.config.core.config.Position; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; -import io.github.moulberry.moulconfig.annotations.ConfigEditorDropdown; import io.github.moulberry.moulconfig.annotations.ConfigEditorSlider; import io.github.moulberry.moulconfig.annotations.ConfigOption; @@ -27,11 +26,6 @@ public class ItemProfitTrackerConfig { @FeatureToggle public boolean priceInChat = false; - @Expose - @ConfigOption(name = "Show Price From", desc = "Show price from Bazaar or NPC.") - @ConfigEditorDropdown(values = {"Instant Sell", "Sell Offer", "NPC"}) - public int priceFrom = 1; - @Expose @ConfigOption(name = "Minimum Price", desc = "Items below this price will not show up in chat.") @ConfigEditorSlider(minValue = 1, maxValue = 5_000_000, minStep = 1) diff --git a/src/main/java/at/hannibal2/skyhanni/data/EntityMovementData.kt b/src/main/java/at/hannibal2/skyhanni/data/EntityMovementData.kt index d67ae4a6373f..dec06dc8e200 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/EntityMovementData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/EntityMovementData.kt @@ -6,6 +6,7 @@ import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzVec import at.hannibal2.skyhanni.utils.getLorenzVec +import net.minecraft.client.Minecraft import net.minecraft.entity.Entity import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -24,6 +25,7 @@ class EntityMovementData { @SubscribeEvent fun onTick(event: LorenzTickEvent) { if (!LorenzUtils.inSkyBlock) return + addToTrack(Minecraft.getMinecraft().thePlayer) for (entity in entityLocation.keys) { if (entity.isDead) continue @@ -42,4 +44,4 @@ class EntityMovementData { fun onWorldChange(event: LorenzWorldChangeEvent) { entityLocation.clear() } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestones.kt b/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestones.kt index d810121ed348..610393906044 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestones.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestones.kt @@ -41,7 +41,7 @@ object GardenCropMilestones { } } CropMilestoneUpdateEvent().postAndCatch() - GardenCropMilestonesFix.openInventory(event.inventoryItems) + GardenCropMilestonesCommunityFix.openInventory(event.inventoryItems) } var cropMilestoneData: Map> = emptyMap() diff --git a/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt b/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesCommunityFix.kt similarity index 84% rename from src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt rename to src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesCommunityFix.kt index cad8fdddf831..f9990685d480 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesFix.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/GardenCropMilestonesCommunityFix.kt @@ -2,7 +2,7 @@ package at.hannibal2.skyhanni.data import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.config.ConfigManager -import at.hannibal2.skyhanni.events.CropMilestoneUpdateEvent +import at.hannibal2.skyhanni.events.RepositoryReloadEvent import at.hannibal2.skyhanni.features.garden.CropType import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.ItemUtils.name @@ -16,16 +16,34 @@ import at.hannibal2.skyhanni.utils.OSUtils import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import at.hannibal2.skyhanni.utils.StringUtils.matches import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.jsonobjects.GardenJson import kotlinx.coroutines.launch import net.minecraft.item.ItemStack +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -object GardenCropMilestonesFix { +object GardenCropMilestonesCommunityFix { private val pattern = ".*§e(?.*)§6/§e(?.*)".toPattern() + private var showWrongData = false + private var showWhenAllCorrect = false + + @SubscribeEvent + fun onRepoReload(event: RepositoryReloadEvent) { + val data = event.getConstant("Garden") + val map = data.crop_milestone_community_help ?: return + for ((key, value) in map) { + if (key == "show_wrong_data") { + showWrongData = value + } + if (key == "show_when_all_correct") { + showWhenAllCorrect = value + } + } + } fun openInventory(inventoryItems: Map) { - if (SkyHanniMod.feature.garden.copyMilestoneData) { - fixForWrongData(inventoryItems) - } + if (!showWrongData) return + if (!SkyHanniMod.feature.garden.copyMilestoneData) return + fixForWrongData(inventoryItems) } private fun fixForWrongData(inventoryItems: Map) { @@ -33,8 +51,6 @@ object GardenCropMilestonesFix { for ((_, stack) in inventoryItems) { val crop = GardenCropMilestones.getCropTypeByLore(stack) ?: continue checkForWrongData(stack, crop, data) - - CropMilestoneUpdateEvent().postAndCatch() } if (data.isNotEmpty()) { @@ -44,8 +60,10 @@ object GardenCropMilestonesFix { "Please share it on the §bSkyHanni Discord §ein the channel §b#share-data§e." ) OSUtils.copyToClipboard("```${data.joinToString("\n")}```") -// } else { -// LorenzUtils.chat("No wrong crop milestone steps found!") + } else { + if (showWhenAllCorrect) { + LorenzUtils.chat("No wrong crop milestone steps found!") + } } } diff --git a/src/main/java/at/hannibal2/skyhanni/data/GuiEditManager.kt b/src/main/java/at/hannibal2/skyhanni/data/GuiEditManager.kt index 3af97e0f966b..29a344b18478 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/GuiEditManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/GuiEditManager.kt @@ -24,7 +24,7 @@ import kotlin.time.Duration.Companion.minutes class GuiEditManager { - var lastHotkeyPressed = SimpleTimeMark.farPast() + private var lastHotkeyPressed = SimpleTimeMark.farPast() @SubscribeEvent fun onKeyClick(event: LorenzKeyPressEvent) { diff --git a/src/main/java/at/hannibal2/skyhanni/data/HypixelData.kt b/src/main/java/at/hannibal2/skyhanni/data/HypixelData.kt index 22beb125ea53..aa78bec09319 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/HypixelData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/HypixelData.kt @@ -190,6 +190,6 @@ class HypixelData { val displayName = objective.displayName val scoreboardTitle = displayName.removeColor() return scoreboardTitle.contains("SKYBLOCK") || - scoreboardTitle.contains("SKIBLOCK") // April 1st jokes are so funny + scoreboardTitle.contains("SKIBLOCK") // April 1st jokes are so funny } } diff --git a/src/main/java/at/hannibal2/skyhanni/data/ItemAddManager.kt b/src/main/java/at/hannibal2/skyhanni/data/ItemAddManager.kt new file mode 100644 index 000000000000..a05d8398f521 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/data/ItemAddManager.kt @@ -0,0 +1,67 @@ +package at.hannibal2.skyhanni.data + +import at.hannibal2.skyhanni.events.ItemAddEvent +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.events.SackChangeEvent +import at.hannibal2.skyhanni.events.entity.ItemAddInInventoryEvent +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName +import at.hannibal2.skyhanni.utils.SimpleTimeMark +import at.hannibal2.skyhanni.utils.StringUtils.matches +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.time.Duration.Companion.milliseconds + +class ItemAddManager { + enum class Source { + ITEM_ADD, + SACKS, + ; + } + + private val ARCHFIEND_DICE = "ARCHFIEND_DICE".asInternalName() + private val HIGH_CLASS_ARCHFIEND_DICE = "HIGH_CLASS_ARCHFIEND_DICE".asInternalName() + + private val diceRollChatPattern = + "§eYour §r§(5|6High Class )Archfiend Dice §r§erolled a §r§.(?.)§r§e! Bonus: §r§.(?.*)❤".toPattern() + + @SubscribeEvent + fun onSackChange(event: SackChangeEvent) { + if (!LorenzUtils.inSkyBlock) return + + for (sackChange in event.sackChanges) { + val change = sackChange.delta + if (change > 0) { + val internalName = sackChange.internalName + Source.SACKS.addItem(internalName, change) + } + } + } + + @SubscribeEvent + fun onItemAdd(event: ItemAddInInventoryEvent) { + if (!LorenzUtils.inSkyBlock) return + + val internalName = event.internalName + if (internalName == ARCHFIEND_DICE || internalName == HIGH_CLASS_ARCHFIEND_DICE) { + if (lastDiceRoll.passedSince() < 500.milliseconds) { + return + } + } + + Source.ITEM_ADD.addItem(internalName, event.amount) + } + + private fun Source.addItem(internalName: NEUInternalName, amount: Int) { + ItemAddEvent(internalName, amount, this).postAndCatch() + } + + private var lastDiceRoll = SimpleTimeMark.farPast() + + @SubscribeEvent + fun onChat(event: LorenzChatEvent) { + if (diceRollChatPattern.matches(event.message)) { + lastDiceRoll = SimpleTimeMark.now() + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/data/MinecraftData.kt b/src/main/java/at/hannibal2/skyhanni/data/MinecraftData.kt index bfcc8df5f4a9..56d565299659 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/MinecraftData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/MinecraftData.kt @@ -6,6 +6,7 @@ import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent import at.hannibal2.skyhanni.events.PacketEvent import at.hannibal2.skyhanni.events.PlaySoundEvent import at.hannibal2.skyhanni.events.ReceiveParticleEvent +import at.hannibal2.skyhanni.utils.DelayedRun import at.hannibal2.skyhanni.utils.InventoryUtils import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName import at.hannibal2.skyhanni.utils.LorenzUtils @@ -71,6 +72,7 @@ object MinecraftData { Minecraft.getMinecraft().thePlayer ?: return totalTicks++ LorenzTickEvent(totalTicks).postAndCatch() + DelayedRun.checkRuns() } @SubscribeEvent @@ -78,8 +80,8 @@ object MinecraftData { if (!LorenzUtils.inSkyBlock) return val hand = InventoryUtils.getItemInHand() val newItem = hand?.getInternalName() ?: NEUInternalName.NONE - if (newItem != InventoryUtils.itemInHandId) { - ItemInHandChangeEvent(newItem, hand).postAndCatch() + val oldItem = InventoryUtils.itemInHandId + if (newItem != oldItem) { InventoryUtils.recentItemsInHand.keys.removeIf { it + 30_000 > System.currentTimeMillis() } if (newItem != NEUInternalName.NONE) { @@ -87,6 +89,7 @@ object MinecraftData { } InventoryUtils.itemInHandId = newItem InventoryUtils.latestItemInHand = hand + ItemInHandChangeEvent(newItem, oldItem).postAndCatch() } } diff --git a/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt b/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt index 4c6058b26aa0..6e128b7769ad 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/OwnInventoryData.kt @@ -1,30 +1,29 @@ package at.hannibal2.skyhanni.data -import at.hannibal2.skyhanni.events.InventoryCloseEvent +import at.hannibal2.skyhanni.events.GuiContainerEvent import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent import at.hannibal2.skyhanni.events.OwnInventoryItemUpdateEvent import at.hannibal2.skyhanni.events.PacketEvent import at.hannibal2.skyhanni.events.entity.ItemAddInInventoryEvent import at.hannibal2.skyhanni.features.bazaar.BazaarApi +import at.hannibal2.skyhanni.features.bazaar.BazaarApi.Companion.isBazaarItem import at.hannibal2.skyhanni.utils.InventoryUtils import at.hannibal2.skyhanni.utils.ItemUtils.getInternalNameOrNull -import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.LorenzUtils.editCopy -import at.hannibal2.skyhanni.utils.NEUItems -import net.minecraft.item.ItemStack +import at.hannibal2.skyhanni.utils.LorenzUtils.addOrPut +import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.SimpleTimeMark +import net.minecraft.client.Minecraft import net.minecraft.network.play.server.S0DPacketCollectItem import net.minecraft.network.play.server.S2FPacketSetSlot import net.minecraftforge.fml.common.eventhandler.EventPriority import net.minecraftforge.fml.common.eventhandler.SubscribeEvent - -typealias SlotNumber = Int -typealias ItemName = String -typealias ItemData = Pair +import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds class OwnInventoryData { - private var items = mapOf() + private var itemAmounts = mapOf() private var dirty = false @SubscribeEvent(priority = EventPriority.LOW, receiveCanceled = true) @@ -47,90 +46,74 @@ class OwnInventoryData { @SubscribeEvent fun onTick(event: LorenzTickEvent) { if (!LorenzUtils.inSkyBlock) return - if (items.isEmpty()) { - initInventory() + if (itemAmounts.isEmpty()) { + itemAmounts = getCurrentItems() } if (!dirty) return - dirty = false - for ((slot, itemStack) in InventoryUtils.getItemsInOwnInventoryWithNull().withIndex()) { - val old = items[slot] - val new = itemStack.itemToPair() - if (old != new) { - item(slot, new, itemStack) - } + + val map = getCurrentItems() + for ((internalName, amount) in map) { + calculateDifference(internalName, amount) } + itemAmounts = map } - private fun initInventory() { - items = items.editCopy { - for ((slot, itemStack) in InventoryUtils.getItemsInOwnInventoryWithNull().withIndex()) { - this[slot] = itemStack.itemToPair() - } + private fun getCurrentItems(): MutableMap { + val map = mutableMapOf() + for (itemStack in InventoryUtils.getItemsInOwnInventory()) { + val internalName = itemStack.getInternalNameOrNull() ?: continue + map.addOrPut(internalName, itemStack.stackSize) } + return map } @SubscribeEvent fun onWorldChange(event: LorenzWorldChangeEvent) { - items = emptyMap() + itemAmounts = emptyMap() } - private fun ItemStack?.itemToPair(): ItemData = this?.let { (name ?: "null") to stackSize } ?: Pair("null", 0) - - private fun item(slot: SlotNumber, new: ItemData, itemStack: ItemStack?) { - val (oldItem, oldAmount) = items[slot] ?: Pair("null", 0) - val (name, amount) = new + private fun calculateDifference(internalName: NEUInternalName, newAmount: Int) { + val oldAmount = itemAmounts[internalName] ?: 0 - if (name == oldItem) { - val diff = amount - oldAmount - if (amount > oldAmount) { - add(itemStack, diff) - } - } else { - if (name != "null") { - add(itemStack!!, amount) - } - } - items = items.editCopy { - this[slot] = new + val diff = newAmount - oldAmount + if (diff > 0) { + addItem(internalName, diff) } } @SubscribeEvent - fun onInventoryClose(event: InventoryCloseEvent) { - BazaarApi.inBazaarInventory = false - lastClose = System.currentTimeMillis() + fun onInventoryClose(event: GuiContainerEvent.CloseWindowEvent) { + val item = Minecraft.getMinecraft().thePlayer.inventory.itemStack ?: return + val internalNameOrNull = item.getInternalNameOrNull() ?: return + ignoreItem(500.milliseconds) { it == internalNameOrNull } } - private var lastClose = 0L + @SubscribeEvent + fun onSlotClick(event: GuiContainerEvent.SlotClickEvent) { + if (BazaarApi.inBazaarInventory) { + ignoreItem(500.milliseconds) { it.isBazaarItem() } + } + } + + private fun ignoreItem(duration: Duration, condition: (NEUInternalName) -> Boolean) { + ignoredItemsUntil.add(IgnoredItem(condition, SimpleTimeMark.now() + duration)) + } - private fun add(item_: ItemStack?, add: Int) { - val item = item_ ?: return - val diffClose = System.currentTimeMillis() - lastClose - if (diffClose < 500) return + private val ignoredItemsUntil = mutableListOf() + class IgnoredItem(val condition: (NEUInternalName) -> Boolean, val blockedUntil: SimpleTimeMark) + + private fun addItem(internalName: NEUInternalName, add: Int) { val diffWorld = System.currentTimeMillis() - LorenzUtils.lastWorldSwitch if (diffWorld < 3_000) return - val internalName = item.getInternalNameOrNull() - - item.name?.let { - if (it == "§8Quiver Arrow") { - return - } - } + ignoredItemsUntil.removeIf { it.blockedUntil.isInPast() } + if (ignoredItemsUntil.any { it.condition(internalName) }) return - if (internalName == null) { - LorenzUtils.debug("OwnInventoryData add is empty for: '${item.name}'") - return - } if (internalName.startsWith("MAP-")) return - val (_, amount) = NEUItems.getMultiplier(internalName) - if (amount > 1) return - ItemAddInInventoryEvent(internalName, add).postAndCatch() } - } diff --git a/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt index 7079ae6fd517..3694bf672f86 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt @@ -6,12 +6,10 @@ import at.hannibal2.skyhanni.events.InventoryCloseEvent import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.SackChangeEvent -import at.hannibal2.skyhanni.features.fishing.trophy.TrophyFishManager -import at.hannibal2.skyhanni.features.fishing.trophy.TrophyFishManager.getFilletValue +import at.hannibal2.skyhanni.features.fishing.FishingAPI import at.hannibal2.skyhanni.features.fishing.trophy.TrophyRarity import at.hannibal2.skyhanni.features.inventory.SackDisplay import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName -import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName_old import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.LorenzUtils @@ -161,13 +159,8 @@ object SackAPI { if (savingSacks) setSackItem(item.internalName, item.stored.formatNumber()) item.price = if (isTrophySack) { - val internal = stack.getInternalName_old() - val trophyFishName = internal.substringBeforeLast("_") - .replace("_", "").lowercase() - val trophyRarityName = internal.substringAfterLast("_") - val info = TrophyFishManager.getInfo(trophyFishName) - val rarity = TrophyRarity.getByName(trophyRarityName) ?: TrophyRarity.BRONZE - val filletValue = (info?.getFilletValue(rarity) ?: 0) * stored.formatNumber() + val filletPerTrophy = FishingAPI.getFilletPerTrophy(stack.getInternalName()) + val filletValue = filletPerTrophy * stored.formatNumber() item.magmaFish = filletValue "MAGMA_FISH".asInternalName().sackPrice(filletValue.toString()) } else { diff --git a/src/main/java/at/hannibal2/skyhanni/data/SkillExperience.kt b/src/main/java/at/hannibal2/skyhanni/data/SkillExperience.kt index 78c25e79975e..470c8d171306 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/SkillExperience.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/SkillExperience.kt @@ -3,6 +3,7 @@ package at.hannibal2.skyhanni.data import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent import at.hannibal2.skyhanni.events.LorenzActionBarEvent import at.hannibal2.skyhanni.events.ProfileJoinEvent +import at.hannibal2.skyhanni.events.SkillExpGainEvent import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.LorenzUtils @@ -32,7 +33,14 @@ class SkillExperience { val neededForNextLevel = group("needed").formatNumber() val nextLevel = getLevelForExpExactly(neededForNextLevel) val baseExp = getExpForLevel(nextLevel - 1) - skillExp[skill] = baseExp + overflow + val totalExp = baseExp + overflow + skillExp[skill] = totalExp + SkillExpGainEvent(skill).postAndCatch() + } + val pattern = ".*§3+(?.+) (?.*) \\((?.*)%\\).*".toPattern() + pattern.matchMatcher(event.message) { + val skill = group("skill").lowercase() + SkillExpGainEvent(skill).postAndCatch() } } diff --git a/src/main/java/at/hannibal2/skyhanni/events/ItemAddEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/ItemAddEvent.kt new file mode 100644 index 000000000000..ad0c6355dfd3 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/events/ItemAddEvent.kt @@ -0,0 +1,7 @@ +package at.hannibal2.skyhanni.events + +import at.hannibal2.skyhanni.data.ItemAddManager +import at.hannibal2.skyhanni.utils.NEUInternalName + +class ItemAddEvent(val internalName: NEUInternalName, val amount: Int, val source: ItemAddManager.Source) : + LorenzEvent() diff --git a/src/main/java/at/hannibal2/skyhanni/events/ItemInHandChangeEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/ItemInHandChangeEvent.kt index 3f5b94b3c9ec..4ef39df43345 100644 --- a/src/main/java/at/hannibal2/skyhanni/events/ItemInHandChangeEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/events/ItemInHandChangeEvent.kt @@ -1,6 +1,5 @@ package at.hannibal2.skyhanni.events import at.hannibal2.skyhanni.utils.NEUInternalName -import net.minecraft.item.ItemStack -class ItemInHandChangeEvent(val internalName: NEUInternalName, val stack: ItemStack?) : LorenzEvent() \ No newline at end of file +class ItemInHandChangeEvent(val newItem: NEUInternalName, val oldItem: NEUInternalName) : LorenzEvent() diff --git a/src/main/java/at/hannibal2/skyhanni/events/RenderEntityOutlineEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/RenderEntityOutlineEvent.kt index 21e18bd6c90a..6a197de6ccd1 100644 --- a/src/main/java/at/hannibal2/skyhanni/events/RenderEntityOutlineEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/events/RenderEntityOutlineEvent.kt @@ -7,7 +7,7 @@ import net.minecraft.entity.item.EntityItemFrame import java.util.function.Consumer class RenderEntityOutlineEvent(theType: Type?, potentialEntities: HashSet?) : - LorenzEvent() { + LorenzEvent() { /** * The phase of the event (see [Type] @@ -115,4 +115,4 @@ class RenderEntityOutlineEvent(theType: Type?, potentialEntities: HashSet() + // TODO USE SH-REPO private val goalCompletePattern = "§6§lBINGO GOAL COMPLETE! §r§e(?.*)".toPattern() diff --git a/src/main/java/at/hannibal2/skyhanni/features/bingo/BingoNextStepHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/bingo/BingoNextStepHelper.kt index 8e74b434f7bb..2960b2d223f5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/bingo/BingoNextStepHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/bingo/BingoNextStepHelper.kt @@ -28,6 +28,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class BingoNextStepHelper { private val config get() = SkyHanniMod.feature.event.bingo.bingoCard private var dirty = true + // TODO USE SH-REPO private val crystalObtainedPattern = " *§r§e(?Topaz|Sapphire|Jade|Amethyst|Amber) Crystal".toPattern() private val itemIslandRequired = mutableMapOf() @@ -85,7 +86,7 @@ class BingoNextStepHelper { } if (!step.done && !parentDone && requirementsToDo == 0 && !currentSteps.contains(step)) { - currentSteps = currentSteps.editCopy { add(step) } + currentSteps = currentSteps.editCopy { add(step) } } } @@ -248,22 +249,22 @@ class BingoNextStepHelper { if (description == "Craft an Emerald Ring.") { return CraftStep("Emerald Ring") requires ( - ItemsStep( - "32x Enchanted Emerald", - "Emerald", - 160 * 32, - mapOf("Emerald" to 1, "Enchanted Emerald" to 160) - ) requires IslandType.DWARVEN_MINES.getStep()) + ItemsStep( + "32x Enchanted Emerald", + "Emerald", + 160 * 32, + mapOf("Emerald" to 1, "Enchanted Emerald" to 160) + ) requires IslandType.DWARVEN_MINES.getStep()) } if (description == "Obtain a Mathematical Hoe Blueprint.") { return CraftStep("Mathematical Hoe Blueprint") requires ( - ItemsStep( - "32x Jacob's Ticket", - "Jacob's Ticket", - 32, - mapOf("Jacob's Ticket" to 1) - ).addItemRequirements() requires IslandType.GARDEN.getStep()) + ItemsStep( + "32x Jacob's Ticket", + "Jacob's Ticket", + 32, + mapOf("Jacob's Ticket" to 1) + ).addItemRequirements() requires IslandType.GARDEN.getStep()) } crystalPattern.matchMatcher(description) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/bingo/MinionCraftHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/bingo/MinionCraftHelper.kt index 0dc99f5952cd..8657f76ee6bd 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/bingo/MinionCraftHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/bingo/MinionCraftHelper.kt @@ -23,6 +23,7 @@ import kotlin.time.Duration.Companion.seconds class MinionCraftHelper { private val config get() = SkyHanniMod.feature.event.bingo + // TODO USE SH-REPO private var minionNamePattern = "(?.*) Minion (?.*)".toPattern() private var display = emptyList() diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilterGui.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilterGui.kt index 3c1586d61825..b9a9a6e0b86e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilterGui.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilterGui.kt @@ -76,7 +76,7 @@ class ChatFilterGui(private val history: List { + private fun splitLine(comp: IChatComponent): List { return GuiUtilRenderComponents.splitText( comp, w - (ChatManager.ActionKind.maxLength + reasonMaxLength + 10 + 10), @@ -93,11 +93,11 @@ class ChatFilterGui(private val history: List() - var acceptMoreDescription = true + private var inBestiary = false + private var bestiaryDescription = mutableListOf() + private var acceptMoreDescription = true var command = "" private var blockedLines = 0 - var lastBorder: IChatComponent? = null - var lastEmpty: IChatComponent? = null + private var lastBorder: IChatComponent? = null + private var lastEmpty: IChatComponent? = null - var milestoneMessage: String? = null + private var milestoneMessage: String? = null - val milestonePattern = "^.+(§8\\d{1,3}➡§e\\d{1,3})$".toRegex() + private val milestonePattern = "^.+(§8\\d{1,3}➡§e\\d{1,3})$".toRegex() @SubscribeEvent fun onChatMessage(event: LorenzChatEvent) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/PlayerDeathMessages.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/PlayerDeathMessages.kt index 87692135e272..8448627f5c17 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/PlayerDeathMessages.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/PlayerDeathMessages.kt @@ -37,15 +37,17 @@ class PlayerDeathMessages { val message = event.message deathMessagePattern.matchMatcher(message) { val name = group("name") - if (SkyHanniMod.feature.markedPlayers.highlightInChat && !LorenzUtils.inDungeons && !LorenzUtils.inKuudraFight && MarkedPlayerManager.isMarkedPlayer(name)) { + if (SkyHanniMod.feature.markedPlayers.highlightInChat && + !LorenzUtils.inDungeons && !LorenzUtils.inKuudraFight && MarkedPlayerManager.isMarkedPlayer(name) + ) { val reason = group("reason").removeColor() LorenzUtils.chat(" §c☠ §e$name §7$reason", false) event.blockedReason = "marked_player_death" return } - - if (isHideFarDeathsEnabled() && System.currentTimeMillis() > lastTimePlayerSeen.getOrDefault(name, 0) + 30_000) { + val time = System.currentTimeMillis() > lastTimePlayerSeen.getOrDefault(name, 0) + 30_000 + if (isHideFarDeathsEnabled() && time) { event.blockedReason = "far_away_player_death" } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/WatchdogHider.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/WatchdogHider.kt index 739eaa123a9b..c5eefc603803 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/WatchdogHider.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/WatchdogHider.kt @@ -23,11 +23,13 @@ class WatchdogHider { startLineComponent = event.chatComponent blockedLines = 0 } + watchdogAnnouncementLine -> { ChatManager.retractMessage(startLineComponent, "watchdog") startLineComponent = null inWatchdog = true } + watchdogEndLine -> { event.blockedReason = "watchdog" inWatchdog = false diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/playerchat/PlayerChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/playerchat/PlayerChatFilter.kt index 9501b9d49360..ed1a256d5e25 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/playerchat/PlayerChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/playerchat/PlayerChatFilter.kt @@ -1,7 +1,6 @@ package at.hannibal2.skyhanni.features.chat.playerchat import at.hannibal2.skyhanni.events.RepositoryReloadEvent -import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.MultiFilter import at.hannibal2.skyhanni.utils.jsonobjects.PlayerChatFilterJson import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -40,6 +39,5 @@ class PlayerChatFilter { countCategories++ countFilters += filter.count() } - LorenzUtils.debug("Loaded $countFilters filters in $countCategories categories from repo") } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaFontRenderer.kt b/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaFontRenderer.kt index 981b7b33abb5..469fc2f3c370 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaFontRenderer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaFontRenderer.kt @@ -36,7 +36,7 @@ class ChromaFontRenderer(private val baseColor: Int) { } } - fun newChromaEnv() : ChromaFontRenderer { + fun newChromaEnv(): ChromaFontRenderer { if (ShaderHelper.areShadersSupported()) { ChromaShaderManager.begin() GlStateManager.shadeModel(GL11.GL_SMOOTH) @@ -44,7 +44,7 @@ class ChromaFontRenderer(private val baseColor: Int) { return this } - fun bindActualColor() : ChromaFontRenderer { + fun bindActualColor(): ChromaFontRenderer { GlStateManager.color( ColorUtils.getRed(baseColor).toFloat() / 255f, ColorUtils.getGreen(baseColor).toFloat() / 255f, @@ -54,7 +54,7 @@ class ChromaFontRenderer(private val baseColor: Int) { return this } - fun endChromaEnv() : ChromaFontRenderer { + fun endChromaEnv(): ChromaFontRenderer { if (ShaderHelper.areShadersSupported()) { ChromaShaderManager.end() GlStateManager.shadeModel(GL11.GL_FLAT) @@ -63,4 +63,4 @@ class ChromaFontRenderer(private val baseColor: Int) { } fun getChromaState() = chromaOn -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShader.kt b/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShader.kt index 00215b032d37..e7bedbdcd7e7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShader.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chroma/ChromaShader.kt @@ -22,7 +22,8 @@ object ChromaShader : Shader("chroma", "chroma") { SkyHanniMod.feature.chroma.chromaSize * (Minecraft.getMinecraft().displayWidth / 100f) } registerUniform(Uniform.UniformType.FLOAT, "timeOffset") { - var ticks = (MinecraftData.totalTicks / 2) + (Minecraft.getMinecraft() as AccessorMinecraft).timer.renderPartialTicks + var ticks = + (MinecraftData.totalTicks / 2) + (Minecraft.getMinecraft() as AccessorMinecraft).timer.renderPartialTicks ticks = when (SkyHanniMod.feature.chroma.chromaDirection) { 0, 2 -> ticks @@ -44,4 +45,4 @@ object ChromaShader : Shader("chroma", "chroma") { } } } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/combat/ghostcounter/GhostData.kt b/src/main/java/at/hannibal2/skyhanni/features/combat/ghostcounter/GhostData.kt index 69094b991a39..abcf2dbba722 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/combat/ghostcounter/GhostData.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/combat/ghostcounter/GhostData.kt @@ -6,16 +6,16 @@ import kotlin.math.roundToInt object GhostData { private var session = mutableMapOf( - Option.KILLS to 0.0, - Option.SORROWCOUNT to 0.0, - Option.VOLTACOUNT to 0.0, - Option.PLASMACOUNT to 0.0, - Option.GHOSTLYBOOTS to 0.0, - Option.BAGOFCASH to 0.0, - Option.TOTALDROPS to 0.0, - Option.SCAVENGERCOINS to 0.0, - Option.MAXKILLCOMBO to 0.0, - Option.SKILLXPGAINED to 0.0 + Option.KILLS to 0.0, + Option.SORROWCOUNT to 0.0, + Option.VOLTACOUNT to 0.0, + Option.PLASMACOUNT to 0.0, + Option.GHOSTLYBOOTS to 0.0, + Option.BAGOFCASH to 0.0, + Option.TOTALDROPS to 0.0, + Option.SCAVENGERCOINS to 0.0, + Option.MAXKILLCOMBO to 0.0, + Option.SKILLXPGAINED to 0.0 ) val bestiaryData = mutableMapOf().apply { @@ -34,11 +34,11 @@ object GhostData { 11 -> 750 12 -> 1_500 13 -> 2_000 - 14,15,16,17 -> 2_500 + 14, 15, 16, 17 -> 2_500 18 -> 3_000 - 19,20 -> 3_500 + 19, 20 -> 3_500 21 -> 25_000 - 22,23,24,25 -> 50_000 + 22, 23, 24, 25 -> 50_000 else -> 0 } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCleanEnd.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCleanEnd.kt index 07a4edf1813e..6e5fc27bd5e3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCleanEnd.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCleanEnd.kt @@ -90,7 +90,8 @@ class DungeonCleanEnd { && DungeonAPI.isOneOf("F3", "M3") && entity is EntityGuardian && entity.entityId != lastBossId - && Minecraft.getMinecraft().thePlayer.isSneaking) { + && Minecraft.getMinecraft().thePlayer.isSneaking + ) { return } diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCopilot.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCopilot.kt index 834cd8fd6661..1dcc92dabfba 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCopilot.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCopilot.kt @@ -11,73 +11,74 @@ import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderString -import at.hannibal2.skyhanni.utils.StringUtils.matchRegex +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import net.minecraft.entity.item.EntityArmorStand import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class DungeonCopilot { - var nextStep = "" - var searchForKey = false + private val config get() = SkyHanniMod.feature.dungeon.dungeonCopilot + + private val countdownPattern = + "(.*) has started the dungeon countdown. The dungeon will begin in 1 minute.".toPattern() + private val keyPatternsList = listOf( + "§eA §r§a§r§[6c]§r§[8c](?Wither|Blood) Key§r§e was picked up!".toPattern(), + "(.*) §r§ehas obtained §r§a§r§[6c]§r§[8c](?Wither|Blood) Key§r§e!".toPattern() + ) + private val witherDoorPattern = "(.*) opened a §r§8§lWITHER §r§adoor!".toPattern() + private val bloodDoorPattern = "§cThe §r§c§lBLOOD DOOR§r§c has been opened!".toPattern() + + private var nextStep = "" + private var searchForKey = false @SubscribeEvent fun onChatMessage(event: LorenzChatEvent) { if (!isEnabled()) return - val message = event.message + copilot(event.message)?.let { + event.blockedReason = it + } + } - if (message.matchRegex("(.*) has started the dungeon countdown. The dungeon will begin in 1 minute.")) { + private fun copilot(message: String): String? { + countdownPattern.matchMatcher(message) { changeNextStep("Ready up") } - if (message.endsWith("§a is now ready!")) { - var name = LorenzUtils.getPlayerName() - if (message.contains(name)) { - changeNextStep("Wait for the dungeon to start!") - } + + if (message.endsWith("§a is now ready!") && message.contains(LorenzUtils.getPlayerName())) { + changeNextStep("Wait for the dungeon to start!") } + // Key Pickup var foundKeyOrDoor = false - - //key pickup - if (message.matchRegex("(.*) §r§ehas obtained §r§a§r§6§r§8Wither Key§r§e!") || - message == "§eA §r§a§r§6§r§8Wither Key§r§e was picked up!" - ) { - changeNextStep("Open Wither Door") - foundKeyOrDoor = true - - } - if (message.matchRegex("(.*) §r§ehas obtained §r§a§r§c§r§cBlood Key§r§e!") || - message == "§eA §r§a§r§c§r§cBlood Key§r§e was picked up!" - ) { - changeNextStep("Open Blood Door") - foundKeyOrDoor = true + keyPatternsList.any { + it.matchMatcher(message) { + val key = group("key") + changeNextStep("Open $key Door") + foundKeyOrDoor = true + } != null } - - if (message.matchRegex("(.*) opened a §r§8§lWITHER §r§adoor!")) { + witherDoorPattern.matchMatcher(message) { changeNextStep("Clear next room") searchForKey = true foundKeyOrDoor = true } - if (message == "§cThe §r§c§lBLOOD DOOR§r§c has been opened!") { + bloodDoorPattern.matchMatcher(message) { changeNextStep("Wait for Blood Room to fully spawn") foundKeyOrDoor = true } - if (foundKeyOrDoor && SkyHanniMod.feature.dungeon.messageFilter.keysAndDoors) { - event.blockedReason = "dungeon_keys_and_doors" - } - + if (foundKeyOrDoor && SkyHanniMod.feature.dungeon.messageFilter.keysAndDoors) return "dungeon_keys_and_doors" - if (message == "§c[BOSS] The Watcher§r§f: That will be enough for now.") { - changeNextStep("Clear Blood Room") - } + if (message == "§c[BOSS] The Watcher§r§f: That will be enough for now.") changeNextStep("Clear Blood Room") if (message == "§c[BOSS] The Watcher§r§f: You have proven yourself. You may pass.") { - event.blockedReason = "dungeon copilot" changeNextStep("Enter Boss Room") + return "dungeon_copilot" } + return null } private fun changeNextStep(step: String) { @@ -126,14 +127,14 @@ class DungeonCopilot { } private fun isEnabled(): Boolean { - return LorenzUtils.inDungeons && SkyHanniMod.feature.dungeon.dungeonCopilot.enabled + return LorenzUtils.inDungeons && config.enabled } @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!isEnabled()) return - SkyHanniMod.feature.dungeon.dungeonCopilot.pos.renderString(nextStep, posLabel = "Dungeon Copilot") + config.pos.renderString(nextStep, posLabel = "Dungeon Copilot") } @SubscribeEvent @@ -142,4 +143,4 @@ class DungeonCopilot { event.move(3, "dungeon.copilotEnabled", "dungeon.dungeonCopilot.enabled") event.move(3, "dungeon.copilotPos", "dungeon.dungeonCopilot.pos") } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonDeathCounter.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonDeathCounter.kt index 88ab543f057d..36788e4b3520 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonDeathCounter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonDeathCounter.kt @@ -88,7 +88,10 @@ class DungeonDeathCounter { fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!isEnabled()) return - SkyHanniMod.feature.dungeon.deathCounterPos.renderString(DungeonMilestonesDisplay.color + display, posLabel = "Dungeon Death Counter") + SkyHanniMod.feature.dungeon.deathCounterPos.renderString( + DungeonMilestonesDisplay.color + display, + posLabel = "Dungeon Death Counter" + ) } private fun isEnabled(): Boolean { diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonFinderFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonFinderFeatures.kt index eceb28ad16f7..b824bc6a5276 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonFinderFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonFinderFeatures.kt @@ -26,7 +26,8 @@ class DungeonFinderFeatures { private val pricePattern = "([0-9]{2,3}K|[0-9]{1,3}M|[0-9]+\\.[0-9]M|[0-9] ?mil)".toRegex(RegexOption.IGNORE_CASE) private val carryPattern = "(carry|cary|carries|caries|comp|to cata [0-9]{2})".toRegex(RegexOption.IGNORE_CASE) private val memberPattern = "^ §.*?§.: §.([A-Z]+)§. \\(§.([0-9]+)§.\\)".toRegex(RegexOption.IGNORE_CASE) - private val ineligiblePattern = "^§c(Requires .*$|You don't meet the requirement!|Complete previous floor first!$)".toRegex() + private val ineligiblePattern = + "^§c(Requires .*$|You don't meet the requirement!|Complete previous floor first!$)".toRegex() private val classLevelPattern = " §.(?.*)§f: §e(?.*)§b \\(§e(?.*)§b\\)".toPattern() private val notePattern = "^(§7§7Note: |§f[^§])".toRegex() @@ -81,7 +82,7 @@ class DungeonFinderFeatures { if (!LorenzUtils.inSkyBlock || LorenzUtils.skyBlockArea != "Dungeon Hub") return if (event.inventoryName != "Catacombs Gate") return - val lore = event.inventoryItems[45]?.getLore() ?: return + val lore = event.inventoryItems[45]?.getLore() ?: return if (lore[0] == "§7View and select a dungeon class.") { selectedClass = lore[2].split(" ").last().removeColor() @@ -111,7 +112,7 @@ class DungeonFinderFeatures { } if (config.markPaidCarries) { - val note = slot.stack.getLore().filter { notePattern.containsMatchIn(it) }.joinToString(" ") ?: "" + val note = slot.stack.getLore().filter { notePattern.containsMatchIn(it) }.joinToString(" ") if (pricePattern.containsMatchIn(note) && carryPattern.containsMatchIn(note)) { slot highlight LorenzColor.RED diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHideItems.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHideItems.kt index c1f8826b4d46..801b28ab46d8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHideItems.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHideItems.kt @@ -27,6 +27,8 @@ class DungeonHideItems { private val hideParticles = mutableMapOf() private val movingSkeletonSkulls = mutableMapOf() + // TODO put in skull data repo part + private val soulWeaverHider = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmYyNGVkNjg3NTMwNGZhNGExZjBjNzg1YjJjYjZhNmE3MjU2M2U5ZjNlMjRlYTU1ZTE4MTc4NDUyMTE5YWE2NiJ9fX0=" private val blessingTexture = @@ -50,11 +52,7 @@ class DungeonHideItems { private fun isSkeletonSkull(entity: EntityArmorStand): Boolean { val itemStack = entity.inventory[4] - if (itemStack != null && itemStack.cleanName() == "Skeleton Skull") { - return true - } - - return false + return itemStack != null && itemStack.cleanName() == "Skeleton Skull" } @SubscribeEvent @@ -83,8 +81,7 @@ class DungeonHideItems { event.isCanceled = true } - val itemStack = head - if (itemStack != null && itemStack.cleanName() == "Superboom TNT") { + if (head != null && head.cleanName() == "Superboom TNT") { event.isCanceled = true hideParticles[entity] = System.currentTimeMillis() } @@ -241,4 +238,4 @@ class DungeonHideItems { event.move(3, "dungeon.hideHealerOrbs", "dungeon.objectHider.hideHealerOrbs") event.move(3, "dungeon.hideHealerFairy", "dungeon.objectHider.hideHealerFairy") } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonLividFinder.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonLividFinder.kt index 48a0a99258f2..0c5b4fc523a7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonLividFinder.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonLividFinder.kt @@ -80,7 +80,7 @@ object DungeonLividFinder { RenderLivingEntityHelper.setNoHurtTime(newLivid) { shouldHighlight() } } - fun shouldHighlight() = getLividAlive() != null && config.enabled + private fun shouldHighlight() = getLividAlive() != null && config.enabled private fun getLividAlive() = lividEntity?.let { if (!it.isDead && it.health > 0.5) it else null @@ -132,7 +132,7 @@ object DungeonLividFinder { gotBlinded = false } - fun inDungeon(): Boolean { + private fun inDungeon(): Boolean { if (!LorenzUtils.inDungeons) return false if (!DungeonAPI.inBossRoom) return false if (!DungeonAPI.isOneOf("F5", "M5")) return false diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonMilestonesDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonMilestonesDisplay.kt index 69b06c0ce76f..b3a6a1f5900f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonMilestonesDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonMilestonesDisplay.kt @@ -12,6 +12,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.concurrent.fixedRateTimer class DungeonMilestonesDisplay { + private val config get() = SkyHanniMod.feature.dungeon companion object { private var display = "" @@ -83,10 +84,8 @@ class DungeonMilestonesDisplay { fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!isEnabled()) return - SkyHanniMod.feature.dungeon.showMileStonesDisplayPos.renderString(color + display, posLabel = "Dungeon Milestone") + config.showMileStonesDisplayPos.renderString(color + display, posLabel = "Dungeon Milestone") } - private fun isEnabled(): Boolean { - return LorenzUtils.inDungeons && SkyHanniMod.feature.dungeon.showMilestonesDisplay - } -} \ No newline at end of file + private fun isEnabled() = LorenzUtils.inDungeons && config.showMilestonesDisplay +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonTeammateOutlines.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonTeammateOutlines.kt index de2ca07e2806..445b9676f30f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonTeammateOutlines.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonTeammateOutlines.kt @@ -32,8 +32,8 @@ class DungeonTeammateOutlines { val colorFormat = FontRenderer.getFormatFromString(team.colorPrefix) return if (colorFormat.length >= 2) - Minecraft.getMinecraft().fontRendererObj.getColorCode(colorFormat[1]); + Minecraft.getMinecraft().fontRendererObj.getColorCode(colorFormat[1]) else null } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/anniversary/Year300RaffleEvent.kt b/src/main/java/at/hannibal2/skyhanni/features/event/anniversary/Year300RaffleEvent.kt index 8395b02dac1d..71d8040f3842 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/anniversary/Year300RaffleEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/anniversary/Year300RaffleEvent.kt @@ -36,10 +36,8 @@ object Year300RaffleEvent { } } - fun isEnabled() = config.enableActiveTimer && - Instant.now().isBefore(SkyBlockTime(301).toInstant()) && - LorenzUtils.inSkyBlock - + fun isEnabled() = LorenzUtils.inSkyBlock && config.enableActiveTimer && + Instant.now().isBefore(SkyBlockTime(301).toInstant()) @SubscribeEvent fun onRender(event: GuiRenderEvent.GuiOverlayRenderEvent) { @@ -70,4 +68,4 @@ object Year300RaffleEvent { Renderable.string("§eTime Left: ${timeLeft.format()}") ) } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/diana/BurrowType.kt b/src/main/java/at/hannibal2/skyhanni/features/event/diana/BurrowType.kt index b7d589440490..ac52c5617132 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/diana/BurrowType.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/diana/BurrowType.kt @@ -3,8 +3,8 @@ package at.hannibal2.skyhanni.features.event.diana import at.hannibal2.skyhanni.utils.LorenzColor enum class BurrowType(val text: String, val color: LorenzColor) { - START("§aStart",LorenzColor.GREEN), - MOB("§cMob",LorenzColor.RED), - TREASURE("§6Treasure",LorenzColor.GOLD), - UNKNOWN("§fUnknown?!",LorenzColor.WHITE), -} \ No newline at end of file + START("§aStart", LorenzColor.GREEN), + MOB("§cMob", LorenzColor.RED), + TREASURE("§6Treasure", LorenzColor.GOLD), + UNKNOWN("§fUnknown?!", LorenzColor.WHITE), +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaAPI.kt index a9806ab2f45a..8c01d014113e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaAPI.kt @@ -15,7 +15,7 @@ object DianaAPI { fun hasSpadeInHand() = InventoryUtils.itemInHandId == spade private fun isRitualActive() = MayorElection.isPerkActive("Diana", "Mythological Ritual") || - MayorElection.isPerkActive("Jerry", "Perkpocalypse") || SkyHanniMod.feature.event.diana.alwaysDiana + MayorElection.isPerkActive("Jerry", "Perkpocalypse") || SkyHanniMod.feature.event.diana.alwaysDiana fun hasGriffinPet() = PetAPI.currentPet?.contains("Griffin") ?: false diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowParticleFinder.kt b/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowParticleFinder.kt index 486a19d805b4..1b23bb1de24a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowParticleFinder.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowParticleFinder.kt @@ -22,7 +22,7 @@ class GriffinBurrowParticleFinder { private val recentlyDugParticleBurrows = mutableListOf() private val burrows = mutableMapOf() - var lastDugParticleBurrow: LorenzVec? = null + private var lastDugParticleBurrow: LorenzVec? = null @SubscribeEvent(priority = EventPriority.LOW, receiveCanceled = true) fun onChatPacket(event: PacketEvent.ReceiveEvent) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/diana/SoopyGuessBurrow.kt b/src/main/java/at/hannibal2/skyhanni/features/event/diana/SoopyGuessBurrow.kt index ec0a1e2aed95..a0b34e328f80 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/diana/SoopyGuessBurrow.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/diana/SoopyGuessBurrow.kt @@ -23,23 +23,23 @@ import kotlin.math.sin */ class SoopyGuessBurrow { - var dingIndex = 0 - var lastDing = 0L - var lastDingPitch = 0f - var firstPitch = 0f - var lastParticlePoint: LorenzVec? = null - var lastParticlePoint2: LorenzVec? = null - var firstParticlePoint: LorenzVec? = null - var particlePoint: LorenzVec? = null - var guessPoint: LorenzVec? = null + private var dingIndex = 0 + private var lastDing = 0L + private var lastDingPitch = 0f + private var firstPitch = 0f + private var lastParticlePoint: LorenzVec? = null + private var lastParticlePoint2: LorenzVec? = null + private var firstParticlePoint: LorenzVec? = null + private var particlePoint: LorenzVec? = null + private var guessPoint: LorenzVec? = null - var lastSoundPoint: LorenzVec? = null - var locs = mutableListOf() + private var lastSoundPoint: LorenzVec? = null + private var locs = mutableListOf() - var dingSlope = mutableListOf() + private var dingSlope = mutableListOf() var distance: Double? = null - var distance2: Double? = null + private var distance2: Double? = null @SubscribeEvent fun onWorldChange(event: LorenzWorldChangeEvent) { @@ -280,4 +280,4 @@ class SoopyGuessBurrow { } private fun isEnabled() = DianaAPI.featuresEnabled() && SkyHanniMod.feature.event.diana.burrowsSoopyGuess -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingAPI.kt index 550388893d2c..027a4b6d0e9a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingAPI.kt @@ -1,10 +1,18 @@ package at.hannibal2.skyhanni.features.fishing import at.hannibal2.skyhanni.events.FishingBobberCastEvent +import at.hannibal2.skyhanni.events.ItemInHandChangeEvent +import at.hannibal2.skyhanni.events.SkillExpGainEvent +import at.hannibal2.skyhanni.features.fishing.tracker.FishingProfitTracker +import at.hannibal2.skyhanni.features.fishing.trophy.TrophyFishManager +import at.hannibal2.skyhanni.features.fishing.trophy.TrophyFishManager.getFilletValue +import at.hannibal2.skyhanni.features.fishing.trophy.TrophyRarity +import at.hannibal2.skyhanni.utils.DelayedRun import at.hannibal2.skyhanni.utils.InventoryUtils import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.NEUInternalName import at.hannibal2.skyhanni.utils.SimpleTimeMark import at.hannibal2.skyhanni.utils.StringUtils.removeColor import net.minecraft.client.Minecraft @@ -13,12 +21,14 @@ import net.minecraft.init.Blocks import net.minecraft.item.ItemStack import net.minecraftforge.event.entity.EntityJoinWorldEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.time.Duration.Companion.seconds object FishingAPI { private val lavaBlocks = listOf(Blocks.lava, Blocks.flowing_lava) private val waterBlocks = listOf(Blocks.water, Blocks.flowing_water) var lastCastTime = SimpleTimeMark.farPast() + var lastActiveFishingTime = SimpleTimeMark.farPast() @SubscribeEvent fun onJoinWorld(event: EntityJoinWorldEvent) { @@ -31,7 +41,31 @@ object FishingAPI { FishingBobberCastEvent(entity).postAndCatch() } - fun hasFishingRodInHand() = InventoryUtils.itemInHandId.asString().contains("ROD") + @SubscribeEvent + fun onItemInHandChange(event: ItemInHandChangeEvent) { + if (event.oldItem.isFishingRod()) { + lastActiveFishingTime = SimpleTimeMark.now() + } + if (event.newItem.isFishingRod()) { + DelayedRun.runDelayed(1.seconds) { + lastActiveFishingTime = SimpleTimeMark.now() + } + } + } + + @SubscribeEvent + fun onSkillExpGain(event: SkillExpGainEvent) { + val skill = event.skill + if (FishingProfitTracker.isEnabled()) { + if (skill != "fishing") { + lastActiveFishingTime = SimpleTimeMark.farPast() + } + } + } + + fun hasFishingRodInHand() = InventoryUtils.itemInHandId.isFishingRod() + + fun NEUInternalName.isFishingRod() = contains("ROD") fun ItemStack.isBait(): Boolean { val name = name ?: return false @@ -42,4 +76,14 @@ object FishingAPI { fun getAllowedBlocks() = if (isLavaRod()) lavaBlocks else waterBlocks + fun getFilletPerTrophy(internalName: NEUInternalName): Int { + val internal = internalName.asString() + val trophyFishName = internal.substringBeforeLast("_") + .replace("_", "").lowercase() + val trophyRarityName = internal.substringAfterLast("_") + val info = TrophyFishManager.getInfo(trophyFishName) + val rarity = TrophyRarity.getByName(trophyRarityName) ?: TrophyRarity.BRONZE + return info?.getFilletValue(rarity) ?: 0 + } + } diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingTimer.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingTimer.kt index fa2b9b824a1d..501b217f42f1 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingTimer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/FishingTimer.kt @@ -92,6 +92,10 @@ class FishingTimer { return true } + if (config.crimsonIsle && IslandType.CRIMSON_ISLE.isInIsland()) return true + + if (config.winterIsland && IslandType.WINTER.isInIsland()) return true + if (!IslandType.THE_FARMING_ISLANDS.isInIsland()) { return LocationUtils.playerLocation().distance(barnLocation) < 50 } diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/SeaCreatureManager.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/SeaCreatureManager.kt index c41129c5f26e..f0a3c54b1863 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/fishing/SeaCreatureManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/SeaCreatureManager.kt @@ -53,7 +53,6 @@ class SeaCreatureManager { } } SeaCreatureManager.allFishingMobs = allFishingMobs - LorenzUtils.debug("Loaded $counter sea creatures from repo") } diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/FishingProfitPlayerMoving.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/FishingProfitPlayerMoving.kt new file mode 100644 index 000000000000..ee19bab84907 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/FishingProfitPlayerMoving.kt @@ -0,0 +1,43 @@ +package at.hannibal2.skyhanni.features.fishing.tracker + +import at.hannibal2.skyhanni.events.EntityMoveEvent +import at.hannibal2.skyhanni.events.FishingBobberCastEvent +import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent +import net.minecraft.client.Minecraft +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +object FishingProfitPlayerMoving { + + private val lastSteps = mutableListOf() + var isMoving = true + + @SubscribeEvent + fun onEntityMove(event: EntityMoveEvent) { + if (!FishingProfitTracker.isEnabled() || !FishingProfitTracker.config.hideMoving) return + if (event.entity != Minecraft.getMinecraft().thePlayer) return + + val distance = event.newLocation.distanceIgnoreY(event.oldLocation) + if (distance < 0.1) { + lastSteps.clear() + return + } + lastSteps.add(distance) + if (lastSteps.size > 20) { + lastSteps.removeAt(0) + } + val total = lastSteps.sum() + if (total > 3) { + isMoving = true + } + } + + @SubscribeEvent + fun onBobberThrow(event: FishingBobberCastEvent) { + isMoving = false + } + + @SubscribeEvent + fun onWorldChange(event: LorenzWorldChangeEvent) { + isMoving = true + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/FishingProfitTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/FishingProfitTracker.kt new file mode 100644 index 000000000000..e6f2a9a926cc --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/FishingProfitTracker.kt @@ -0,0 +1,209 @@ +package at.hannibal2.skyhanni.features.fishing.tracker + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.FishingBobberCastEvent +import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.events.ItemAddEvent +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.features.fishing.FishingAPI +import at.hannibal2.skyhanni.utils.DelayedRun +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList +import at.hannibal2.skyhanni.utils.LorenzUtils.addButton +import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName +import at.hannibal2.skyhanni.utils.NumberUtil +import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import at.hannibal2.skyhanni.utils.NumberUtil.formatNumber +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.renderables.Renderable +import at.hannibal2.skyhanni.utils.tracker.ItemTrackerData +import at.hannibal2.skyhanni.utils.tracker.SkyHanniItemTracker +import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker +import com.google.gson.annotations.Expose +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.minutes + +typealias CategoryName = String + +object FishingProfitTracker { + val config get() = SkyHanniMod.feature.fishing.fishingProfitTracker + + private val coinsChatPattern = ".* CATCH! §r§bYou found §r§6(?.*) Coins§r§b\\.".toPattern() + + private val tracker = SkyHanniItemTracker( + "Fishing Profit Tracker", + { Data() }, + { it.fishing.fishingProfitTracker }) { drawDisplay(it) } + + class Data : ItemTrackerData() { + override fun resetItems() { + totalCatchAmount = 0 + } + + override fun getDescription(timesCaught: Long): List { + val percentage = timesCaught.toDouble() / totalCatchAmount + val catchRate = LorenzUtils.formatPercentage(percentage.coerceAtMost(1.0)) + + return listOf( + "§7Caught §e${timesCaught.addSeparators()} §7times.", + "§7Your catch rate: §c$catchRate" + ) + } + + override fun getCoinName(item: TrackedItem) = "§6Fished Coins" + + override fun getCoinDescription(item: TrackedItem): List { + val mobKillCoinsFormat = NumberUtil.format(item.totalAmount) + return listOf( + "§7You fished up §6$mobKillCoinsFormat coins §7already." + ) + } + + override fun getCustomPricePer(internalName: NEUInternalName): Double { + // TODO find better way to tell if the item is a trophy + val neuInternalNames = itemCategories["Trophy Fish"]!! + + return if (internalName in neuInternalNames) { + SkyHanniTracker.getPricePer(MAGMA_FISH) * FishingAPI.getFilletPerTrophy(internalName) + } else super.getCustomPricePer(internalName) + } + + @Expose + var totalCatchAmount = 0L + } + + private val ItemTrackerData.TrackedItem.timesCaught get() = timesGained + + private val MAGMA_FISH by lazy { "MAGMA_FISH".asInternalName() } + + private val nameAll: CategoryName = "All" + private var currentCategory: CategoryName = nameAll + + private fun getCurrentCategories(data: Data): Map { + val map = mutableMapOf() + map[nameAll] = data.items.size + for ((name, items) in itemCategories) { + val amount = items.count { it in data.items } + if (amount > 0) { + map[name] = amount + } + } + + return map + } + + private fun drawDisplay(data: Data): List> = buildList { + addAsSingletonList("§e§lFishing Profit Tracker") + val filter: (NEUInternalName) -> Boolean = addCategories(data) + + val profit = tracker.drawItems(data, filter, this) + + val fishedCount = data.totalCatchAmount + addAsSingletonList( + Renderable.hoverTips( + "§7Times fished: §e${fishedCount.addSeparators()}", + listOf("§7You catched §e${fishedCount.addSeparators()} §7times something.") + ) + ) + + val profitFormat = NumberUtil.format(profit) + val profitPrefix = if (profit < 0) "§c" else "§6" + + val profitPerCatch = profit / data.totalCatchAmount + val profitPerCatchFormat = NumberUtil.format(profitPerCatch) + + val text = "§eTotal Profit: $profitPrefix$profitFormat coins" + addAsSingletonList(Renderable.hoverTips(text, listOf("§7Profit per catch: $profitPrefix$profitPerCatchFormat"))) + + tracker.addPriceFromButton(this) + } + + private fun MutableList>.addCategories(data: Data): (NEUInternalName) -> Boolean { + val amounts = getCurrentCategories(data) + val list = amounts.keys.toList() + if (currentCategory !in list) { + currentCategory = nameAll + } + + if (tracker.isInventoryOpen()) { + addButton( + prefix = "§7Category: ", + getName = currentCategory + " §7(" + amounts[currentCategory] + ")", + onChange = { + val id = list.indexOf(currentCategory) + currentCategory = list[(id + 1) % list.size] + tracker.update() + } + ) + } + + val filter: (NEUInternalName) -> Boolean = if (currentCategory == nameAll) { + { true } + } else { + val items = itemCategories[currentCategory]!! + { it in items } + } + return filter + } + + @SubscribeEvent + fun onItemAdd(event: ItemAddEvent) { + if (!isEnabled()) return + DelayedRun.runDelayed(500.milliseconds) { + maybeAddItem(event.internalName, event.amount) + } + } + + @SubscribeEvent + fun onChat(event: LorenzChatEvent) { + coinsChatPattern.matchMatcher(event.message) { + val coins = group("coins").formatNumber() + tracker.addCoins(coins.toInt()) + addCatch() + } + } + + private fun addCatch() { + tracker.modify { + it.totalCatchAmount++ + } + } + + @SubscribeEvent + fun onRenderOverlay(event: GuiRenderEvent) { + if (!isEnabled()) return + if (!FishingAPI.hasFishingRodInHand()) return + if (FishingProfitPlayerMoving.isMoving && config.hideMoving) return + + tracker.renderDisplay(config.position) + } + + private fun maybeAddItem(internalName: NEUInternalName, amount: Int) { + if (FishingAPI.lastActiveFishingTime.passedSince() > 10.minutes) return + + if (!isAllowedItem(internalName)) { + LorenzUtils.debug("Ignored non-fishing item pickup: $internalName'") + return + } + + tracker.addItem(internalName, amount) + addCatch() + } + + private val itemCategories get() = FishingTrackerCategoryManager.itemCategories + + private fun isAllowedItem(internalName: NEUInternalName) = itemCategories.any { internalName in it.value } + + @SubscribeEvent + fun onBobberThrow(event: FishingBobberCastEvent) { + tracker.firstUpdate() + } + + fun resetCommand(args: Array) { + tracker.resetCommand(args, "shresetfishingtracker") + } + + fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/FishingTrackerCategoryManager.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/FishingTrackerCategoryManager.kt new file mode 100644 index 000000000000..a1a1067edcf4 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/tracker/FishingTrackerCategoryManager.kt @@ -0,0 +1,72 @@ +package at.hannibal2.skyhanni.features.fishing.tracker + +import at.hannibal2.skyhanni.events.RepositoryReloadEvent +import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName +import at.hannibal2.skyhanni.utils.jsonobjects.FishingProfitItemsJson +import io.github.moulberry.notenoughupdates.NotEnoughUpdates +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +object FishingTrackerCategoryManager { + + var itemCategories = mapOf>() + + private var shItemCategories = mapOf>() + private var neuItemCategories = mapOf>() + + @SubscribeEvent + fun onRepoReload(event: RepositoryReloadEvent) { + shItemCategories = event.getConstant("FishingProfitItems").categories + updateItemCategories() + } + + private fun updateItemCategories() { + itemCategories = shItemCategories + neuItemCategories + } + + @SubscribeEvent + fun onNeuRepoReload(event: io.github.moulberry.notenoughupdates.events.RepositoryReloadEvent) { + val totalDrops = mutableListOf() + val dropCategories = mutableMapOf>() + for ((seaCreature, data) in NotEnoughUpdates.INSTANCE.manager.itemInformation.filter { it.key.endsWith("_SC") }) { + val asJsonObject = data.getAsJsonArray("recipes")[0].asJsonObject + val drops = asJsonObject.getAsJsonArray("drops") + .map { it.asJsonObject.get("id").asString }.map { it.split(":").first() } + val asJsonArray = asJsonObject.get("extra") + val extra = asJsonArray?.let { + asJsonArray.asJsonArray.toList() + .map { it.toString() } + .filter { !it.contains("Fishing Skill") && !it.contains("Requirements:") && !it.contains("Fished from water") } + .joinToString(" + ") + } ?: "null" + val category = if (extra.contains("Fishing Festival")) { + "Fishing Festival" + } else if (extra.contains("Spooky Festival")) { + "Spooky Festival" + } else if (extra.contains("Jerry's Workshop")) { + "Jerry's Workshop" + } else if (extra.contains("Oasis")) { + "Oasis" + } else if (extra.contains("Magma Fields") || extra.contains("Precursor Remnants") || + extra.contains("Goblin Holdout") + ) { + "Crystal Hollows" + } else if (extra.contains("Crimson Isle Lava")) { + "Crimson Isle Lava" + } else { + if (extra.isNotEmpty()) { + println("unknown extra: $extra = $seaCreature ($drops)") + } + "Water" + } + " Sea Creatures" + for (drop in drops) { + if (drop !in totalDrops) { + totalDrops.add(drop) + dropCategories.getOrPut(category) { mutableListOf() }.add(drop.asInternalName()) + } + } + } + neuItemCategories = dropCategories + updateItemCategories() + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/CropType.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/CropType.kt index a684e7bacd24..423bdaed1db8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/CropType.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/CropType.kt @@ -17,7 +17,14 @@ enum class CropType( WHEAT("Wheat", "THEORETICAL_HOE_WHEAT", "CROPIE", 1.0, { ItemStack(Items.wheat) }), CARROT("Carrot", "THEORETICAL_HOE_CARROT", "CROPIE", 3.0, { ItemStack(Items.carrot) }, replenish = true), POTATO("Potato", "THEORETICAL_HOE_POTATO", "CROPIE", 3.0, { ItemStack(Items.potato) }, replenish = true), - NETHER_WART("Nether Wart", "THEORETICAL_HOE_WARTS", "FERMENTO", 2.5, { ItemStack(Items.nether_wart) }, replenish = true), + NETHER_WART( + "Nether Wart", + "THEORETICAL_HOE_WARTS", + "FERMENTO", + 2.5, + { ItemStack(Items.nether_wart) }, + replenish = true + ), PUMPKIN("Pumpkin", "PUMPKIN_DICER", "SQUASH", 1.0, { ItemStack(Blocks.pumpkin) }), MELON("Melon", "MELON_DICER", "SQUASH", 5.0, { ItemStack(Items.melon) }), COCOA_BEANS( @@ -69,4 +76,4 @@ enum class CropType( } } } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt index ac48b1ec2236..3e57bb199158 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt @@ -72,6 +72,7 @@ class FarmingFortuneDisplay { fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { if (!isEnabled()) return if (GardenAPI.hideExtraGuis()) return + if (GardenAPI.toolInHand == null) return config.pos.renderStringsAndItems(display, posLabel = "True Farming Fortune") } @@ -102,9 +103,7 @@ class FarmingFortuneDisplay { wrongTabCrop = GardenAPI.cropInHand != null && GardenAPI.cropInHand != currentCrop if (wrongTabCrop) { - farmingFortune = displayCrop.getLatestTrueFarmingFortune()?.let { - if (config.dropMultiplier) it else it - 100.0 - } ?: -1.0 + farmingFortune = displayCrop.getLatestTrueFarmingFortune() ?: -1.0 recentlySwitchedTool = false } else { farmingFortune = getCurrentFarmingFortune() @@ -118,7 +117,7 @@ class FarmingFortuneDisplay { if (GardenAPI.cropInHand == currentCrop) { if (!recentlySwitchedTool) { - latestFF?.put(currentCrop, getCurrentFarmingFortune(true)) + latestFF?.put(currentCrop, getCurrentFarmingFortune()) } } }) @@ -156,7 +155,6 @@ class FarmingFortuneDisplay { private var tabFortuneUniversal: Double = 0.0 private var tabFortuneCrop: Double = 0.0 - private val baseFortune: Double get() = if (config.dropMultiplier) 100.0 else 0.0 private val upgradeFortune: Double? get() = currentCrop?.getUpgradeLevel()?.let { it * 5.0 } private val accessoryFortune: Double? get() = currentCrop?.let { @@ -269,10 +267,7 @@ class FarmingFortuneDisplay { } } - fun getCurrentFarmingFortune(alwaysBaseFortune: Boolean = false): Double { - val baseFortune = if (alwaysBaseFortune) 100.0 else baseFortune - return baseFortune + tabFortuneUniversal + tabFortuneCrop - } + fun getCurrentFarmingFortune() = tabFortuneUniversal + tabFortuneCrop fun CropType.getLatestTrueFarmingFortune() = latestFF?.get(this) } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt index 01a6d38271e0..ee590806a524 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt @@ -51,6 +51,7 @@ object GardenAPI { private var inBarn = false val onBarnPlot get() = inBarn && inGarden() val storage get() = ProfileStorageData.profileSpecific?.garden + var totalAmountVisitorsExisting = 0 var gardenExp: Long? get() = storage?.experience set(value) { @@ -61,6 +62,17 @@ object GardenAPI { private val barnArea = AxisAlignedBB(35.5, 70.0, -4.5, -32.5, 100.0, -46.5) + // TODO USE SH-REPO + private val otherToolsList = listOf( + "DAEDALUS_AXE", + "BASIC_GARDENING_HOE", + "ADVANCED_GARDENING_AXE", + "BASIC_GARDENING_AXE", + "ADVANCED_GARDENING_HOE", + "ROOKIE_HOE", + "BINGHOE" + ) + @SubscribeEvent fun onSendPacket(event: PacketEvent.SendEvent) { if (!inGarden()) return @@ -122,19 +134,7 @@ object GardenAPI { } private fun isOtherTool(internalName: NEUInternalName): Boolean { - if (internalName.startsWith("DAEDALUS_AXE")) return true - - if (internalName.startsWith("BASIC_GARDENING_HOE")) return true - if (internalName.startsWith("ADVANCED_GARDENING_AXE")) return true - - if (internalName.startsWith("BASIC_GARDENING_AXE")) return true - if (internalName.startsWith("ADVANCED_GARDENING_HOE")) return true - - if (internalName.startsWith("ROOKIE_HOE")) return true - - if (internalName.startsWith("BINGHOE")) return true - - return false + return internalName.asString() in otherToolsList } fun inGarden() = IslandType.GARDEN.isInIsland() @@ -155,7 +155,7 @@ object GardenAPI { } fun hideExtraGuis() = ComposterOverlay.inInventory || AnitaMedalProfit.inInventory || - SkyMartCopperPrice.inInventory || FarmingContestAPI.inInventory || VisitorAPI.inInventory || FFGuideGUI.isInGui() + SkyMartCopperPrice.inInventory || FarmingContestAPI.inInventory || VisitorAPI.inInventory || FFGuideGUI.isInGui() fun clearCropSpeed() { storage?.cropsPerSecond?.clear() @@ -239,6 +239,7 @@ object GardenAPI { fun onRepoReload(event: RepositoryReloadEvent) { val data = event.getConstant("Garden") gardenExperience = data.garden_exp + totalAmountVisitorsExisting = data.visitors.size } private var gardenExperience = listOf() diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt index ef5d9a4299d6..c058e9fe6b91 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt @@ -326,7 +326,7 @@ object GardenNextJacobContest { SkyHanniMod.coroutineScope.launch { openPopupWindow( "Farming Contest soon!\n" + - "Crops: ${cropText.removeColor()}" + "Crops: ${cropText.removeColor()}" ) } } @@ -395,7 +395,7 @@ object GardenNextJacobContest { } private fun isEnabled() = LorenzUtils.inSkyBlock && config.display - && (GardenAPI.inGarden() || config.everywhere) + && (GardenAPI.inGarden() || config.everywhere) private fun isFetchEnabled() = isEnabled() && config.fetchAutomatically private fun isSendEnabled() = isFetchEnabled() && config.shareAutomatically != 2 // 2 = Disabled diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterAPI.kt index 299e02f4000f..50efa9e42e30 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterAPI.kt @@ -11,13 +11,15 @@ object ComposterAPI { var tabListData = mapOf() val composterUpgrades: MutableMap? get() = GardenAPI.storage?.composterUpgrades - fun ComposterUpgrade.getLevel(addOne: ComposterUpgrade?) = (composterUpgrades?.get(this) ?: 0) + if (addOne == this) 1 else 0 + fun ComposterUpgrade.getLevel(addOne: ComposterUpgrade?) = + (composterUpgrades?.get(this) ?: 0) + if (addOne == this) 1 else 0 fun getFuel() = tabListData[ComposterDisplay.DataType.FUEL]?.removeColor()?.formatNumber() ?: 0 fun getOrganicMatter() = tabListData[ComposterDisplay.DataType.ORGANIC_MATTER]?.removeColor()?.formatNumber() ?: 0 - fun maxOrganicMatter(addOne: ComposterUpgrade?) = 40_000 + ComposterUpgrade.ORGANIC_MATTER_CAP.getLevel(addOne) * 20_000 + fun maxOrganicMatter(addOne: ComposterUpgrade?) = + 40_000 + ComposterUpgrade.ORGANIC_MATTER_CAP.getLevel(addOne) * 20_000 fun multiDropChance(addOne: ComposterUpgrade?) = ComposterUpgrade.MULTI_DROP.getLevel(addOne) * 0.03 diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/FarmingContestAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/FarmingContestAPI.kt index c5bb8d2a8512..d2d866f36b3b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/FarmingContestAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/FarmingContestAPI.kt @@ -11,6 +11,7 @@ import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.addOrPut +import at.hannibal2.skyhanni.utils.LorenzUtils.nextAfter import at.hannibal2.skyhanni.utils.LorenzUtils.sortedDesc import at.hannibal2.skyhanni.utils.SimpleTimeMark import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher @@ -26,7 +27,7 @@ object FarmingContestAPI { var inContest = false var contestCrop: CropType? = null private var startTime = SimpleTimeMark.farPast() - private val sidebarCropPattern = "§e○ §f(?.*) §a.*".toPattern() + private val sidebarCropPattern = "(?:§e○|§6☘) §f(?.*) §a.*".toPattern() var inInventory = false @@ -69,20 +70,10 @@ object FarmingContestAPI { } private fun readCurrentCrop(): CropType? { - var next = false - for (line in ScoreboardData.sidebarLinesFormatted) { - if (line == "§eJacob's Contest") { - next = true - continue - } - if (next) { - sidebarCropPattern.matchMatcher(line) { - return CropType.getByName(group("crop")) - } - } + val line = ScoreboardData.sidebarLinesFormatted.nextAfter("§eJacob's Contest") ?: return null + return sidebarCropPattern.matchMatcher(line) { + CropType.getByName(group("crop")) } - - return null } @SubscribeEvent diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestFFNeededDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestFFNeededDisplay.kt index bcdc6b216ab7..3f03cbe4b350 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestFFNeededDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobContestFFNeededDisplay.kt @@ -81,10 +81,6 @@ class JacobContestFFNeededDisplay { add(listOf("§cThis is too low, showing 19.9 Blocks/second instead!")) blocksPerSecond = 19.9 } - if (blocksPerSecond < 1) { - addAsSingletonList("§cLow blocks per second!") - addAsSingletonList("§cFarm this crop for couple more seconds!") - } } addAsSingletonList("") @@ -96,25 +92,16 @@ class JacobContestFFNeededDisplay { add(listOf("§6Your ", crop.icon, "§6FF: $farmingFortune")) } addAsSingletonList("") - if (blocksPerSecond == null || trueFF == null) { - add(listOf("§cMissing data from above!")) - } else { - val predictedScore = (trueFF * blocksPerSecond * crop.baseDrops * 20 * 60 / 100).toInt().addSeparators() - add(listOf("§6Predicted ", crop.icon, "§6crops: $predictedScore")) - } - } - - private fun formatFarmingFortune(farmingFortune: Double): String { - var ff = farmingFortune - if (!config.farmingFortunes.dropMultiplier) { - ff -= 100 - if (ff < 100) { - ff = 0.0 - } + if (blocksPerSecond == null || trueFF == null) { + add(listOf("§cMissing data from above!")) + } else { + val predictedScore = (trueFF * blocksPerSecond * crop.baseDrops * 20 * 60 / 100).toInt().addSeparators() + add(listOf("§6Predicted ", crop.icon, "§6crops: $predictedScore")) } - return ceil(ff).addSeparators() } + private fun formatFarmingFortune(farmingFortune: Double) = ceil(farmingFortune).addSeparators() + private fun getLine(bracket: ContestBracket, map: Map, crop: CropType): String { val counter = map[bracket] ?: return " ${bracket.displayName}§f: §8Not found!" val blocksPerSecond = crop.getRealBlocksPerSecond() diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobFarmingContestsInventory.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobFarmingContestsInventory.kt index 25cfd12d7e13..dfc83e40458a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobFarmingContestsInventory.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/contest/JacobFarmingContestsInventory.kt @@ -52,10 +52,7 @@ class JacobFarmingContestsInventory { val name = item.name!! - if (foundEvents.contains(name)) { - } else { - foundEvents.add(name) - } + foundEvents.add(name) val time = FarmingContestAPI.getSbTimeFor(name) ?: continue FarmingContestAPI.addContest(time, item) if (config.realTime) { @@ -144,7 +141,11 @@ class JacobFarmingContestsInventory { @SubscribeEvent fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) { - event.move(3, "inventory.jacobFarmingContestHighlightRewards", "inventory.jacobFarmingContests.highlightRewards") + event.move( + 3, + "inventory.jacobFarmingContestHighlightRewards", + "inventory.jacobFarmingContests.highlightRewards" + ) event.move(3, "inventory.jacobFarmingContestHideDuplicates", "inventory.jacobFarmingContests.hideDuplicates") event.move(3, "inventory.jacobFarmingContestRealTime", "inventory.jacobFarmingContests.realTime") event.move(3, "inventory.jacobFarmingContestFinneganIcon", "inventory.jacobFarmingContests.finneganIcon") diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/CropMoneyDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/CropMoneyDisplay.kt index b63b02f27a4e..b780bbc0e45d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/CropMoneyDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/CropMoneyDisplay.kt @@ -276,8 +276,8 @@ object CropMoneyDisplay { val onlyNpcPrice = (!config.useCustomFormat && LorenzUtils.noTradeMode) || - (config.useCustomFormat && config.customFormat.size == 1 && - config.customFormat[0] == 2) + (config.useCustomFormat && config.customFormat.size == 1 && + config.customFormat[0] == 2) for ((internalName, amount) in multipliers.moveEntryToTop { isSeeds(it.key) }) { val crop = cropNames[internalName]!! diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/FarmingWeightDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/FarmingWeightDisplay.kt index 13125c34947f..fb9bdfaac210 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/FarmingWeightDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/FarmingWeightDisplay.kt @@ -519,7 +519,7 @@ class FarmingWeightDisplay { openWebsite(name, ignoreCooldown = true) } - var lastName = "" + private var lastName = "" private fun openWebsite(name: String, ignoreCooldown: Boolean = false) { if (!ignoreCooldown && lastOpenWebsite.passedSince() < 5.seconds && name == lastName) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt index dae3e129fd2e..76647517d247 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt @@ -165,15 +165,13 @@ object GardenCropMilestoneDisplay { Collections.singletonList("§e$haveFormat§8/§e$needFormat") } - val farmingFortune = FarmingFortuneDisplay.getCurrentFarmingFortune(true) + val farmingFortune = FarmingFortuneDisplay.getCurrentFarmingFortune() val speed = GardenCropSpeed.averageBlocksPerSecond - val farmingFortuneSpeed = (farmingFortune * crop.baseDrops * speed / 100).round(1).toInt() + val farmingFortuneSpeed = ((100.0 + farmingFortune) * crop.baseDrops * speed / 100).round(1).toInt() if (farmingFortuneSpeed > 0) { crop.setSpeed(farmingFortuneSpeed) - if (crop.isMaxed()) { - lineMap[3] = listOf("§7In §bMaxed") - } else { + if (!crop.isMaxed()) { val missing = need - have val missingTimeSeconds = missing / farmingFortuneSpeed val millis = missingTimeSeconds * 1000 diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/WildStrawberryDyeNotification.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/WildStrawberryDyeNotification.kt index 29fe278ae75d..d923efb6da23 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/WildStrawberryDyeNotification.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/WildStrawberryDyeNotification.kt @@ -15,7 +15,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.time.Duration.Companion.seconds class WildStrawberryDyeNotification { - var lastCloseTime = 0L + private var lastCloseTime = 0L val item by lazy { "DYE_WILD_STRAWBERRY".asInternalName() } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFStats.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFStats.kt index 255d94b24a5a..051e6ae3a9be 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFStats.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFStats.kt @@ -111,7 +111,7 @@ object FFStats { } in dicerCrops -> { - cropPage[FortuneStats.SUNDER] = Pair(FarmingFortuneDisplay.getSunderFortune(tool), 62.5) + cropPage[FortuneStats.SUNDER] = Pair(FarmingFortuneDisplay.getSunderFortune(tool), 75.0) if (toolHasBountiful?.get(crop) == true) { cropPage[FortuneStats.REFORGE] = Pair(FarmingFortuneDisplay.reforgeFortune, 10.0) } else { @@ -131,7 +131,7 @@ object FFStats { CropType.COCOA_BEANS -> { cropPage[FortuneStats.BASE_TOOL] = Pair(FarmingFortuneDisplay.getToolFortune(tool), 20.0) - cropPage[FortuneStats.SUNDER] = Pair(FarmingFortuneDisplay.getSunderFortune(tool), 62.5) + cropPage[FortuneStats.SUNDER] = Pair(FarmingFortuneDisplay.getSunderFortune(tool), 75.0) if (toolHasBountiful?.get(crop) == true) { cropPage[FortuneStats.REFORGE] = Pair(FarmingFortuneDisplay.reforgeFortune, 7.0) } else { diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/CropPage.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/CropPage.kt index cb20cc86a103..d9558cd2f5ed 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/CropPage.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/CropPage.kt @@ -1,4 +1,5 @@ package at.hannibal2.skyhanni.features.garden.fortuneguide.pages + import at.hannibal2.skyhanni.features.garden.fortuneguide.FFGuideGUI import at.hannibal2.skyhanni.features.garden.fortuneguide.FFGuideGUI.Companion.getItem import at.hannibal2.skyhanni.features.garden.fortuneguide.FFStats @@ -7,12 +8,19 @@ import at.hannibal2.skyhanni.features.garden.fortuneguide.FortuneStats import at.hannibal2.skyhanni.utils.GuiRenderUtils import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase -class CropPage: FFGuideGUI.FFGuidePage() { +class CropPage : FFGuideGUI.FFGuidePage() { override fun drawPage(mouseX: Int, mouseY: Int, partialTicks: Float) { for (item in FarmingItems.entries) { if (item.name == FFGuideGUI.currentCrop?.name) { - GuiRenderUtils.renderItemAndTip(FFGuideGUI.tooltipToDisplay, item.getItem(), FFGuideGUI.guiLeft + 172, FFGuideGUI.guiTop + 60, mouseX, mouseY) + GuiRenderUtils.renderItemAndTip( + FFGuideGUI.tooltipToDisplay, + item.getItem(), + FFGuideGUI.guiLeft + 172, + FFGuideGUI.guiTop + 60, + mouseX, + mouseY + ) } } @@ -21,9 +29,12 @@ class CropPage: FFGuideGUI.FFGuidePage() { var i = 0 FFStats.cropPage.forEach { (key, value) -> if (key == FortuneStats.CROP_TOTAL) { - val newLine = key.label.replace("Crop", FFGuideGUI.currentCrop?.name?.replace("_", " ")?.firstLetterUppercase()!!) - GuiRenderUtils.drawFarmingBar(newLine, key.tooltip, value.first, value.second, FFGuideGUI.guiLeft + 135, - FFGuideGUI.guiTop + 5, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + val newLine = + key.label.replace("Crop", FFGuideGUI.currentCrop?.name?.replace("_", " ")?.firstLetterUppercase()!!) + GuiRenderUtils.drawFarmingBar( + newLine, key.tooltip, value.first, value.second, FFGuideGUI.guiLeft + 135, + FFGuideGUI.guiTop + 5, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) } else { if (i % 2 == 0) { x = FFGuideGUI.guiLeft + 15 @@ -31,10 +42,12 @@ class CropPage: FFGuideGUI.FFGuidePage() { } else { x = FFGuideGUI.guiLeft + 255 } - i ++ - GuiRenderUtils.drawFarmingBar(key.label, key.tooltip, value.first, value.second, x, y, - 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + i++ + GuiRenderUtils.drawFarmingBar( + key.label, key.tooltip, value.first, value.second, x, y, + 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) } } } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/OverviewPage.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/OverviewPage.kt index 4e06ee1cb739..2fe623c744f5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/OverviewPage.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/OverviewPage.kt @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.features.garden.fortuneguide.pages +import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.features.garden.fortuneguide.FFGuideGUI import at.hannibal2.skyhanni.features.garden.fortuneguide.FFGuideGUI.Companion.currentArmor import at.hannibal2.skyhanni.features.garden.fortuneguide.FFGuideGUI.Companion.currentEquipment @@ -10,37 +11,49 @@ import at.hannibal2.skyhanni.features.garden.fortuneguide.FarmingItems import at.hannibal2.skyhanni.utils.GuiRenderUtils import at.hannibal2.skyhanni.utils.TimeUtils -class OverviewPage: FFGuideGUI.FFGuidePage() { +class OverviewPage : FFGuideGUI.FFGuidePage() { private var equipmentFF = mutableMapOf() private var armorFF = mutableMapOf() override fun drawPage(mouseX: Int, mouseY: Int, partialTicks: Float) { val timeUntilCakes = TimeUtils.formatDuration(FFStats.cakeExpireTime - System.currentTimeMillis()) - GuiRenderUtils.drawFarmingBar("§6Universal Farming Fortune", + GuiRenderUtils.drawFarmingBar( + "§6Universal Farming Fortune", "§7§2Farming fortune in that is\n§2applied to every crop\n§eNot the same as tab FF\n" + - "§eSee on the grass block page", FFStats.totalBaseFF[FFTypes.TOTAL] ?: 0, 1277, - FFGuideGUI.guiLeft + 15, FFGuideGUI.guiTop + 5, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + "§eSee on the grass block page", FFStats.totalBaseFF[FFTypes.TOTAL] ?: 0, 1277, + FFGuideGUI.guiLeft + 15, FFGuideGUI.guiTop + 5, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) var line = if (FFStats.baseFF[FFTypes.ANITA]!! < 0.0) "§cAnita buff not saved\n§eVisit Anita to set it!" else "§7§2Fortune for levelling your Anita extra crops\n§2You get 4☘ per buff level" - GuiRenderUtils.drawFarmingBar("§2Anita Buff", line, FFStats.baseFF[FFTypes.ANITA] ?: 0.0, 60, FFGuideGUI.guiLeft + 15, - FFGuideGUI.guiTop + 30, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + GuiRenderUtils.drawFarmingBar( + "§2Anita Buff", line, FFStats.baseFF[FFTypes.ANITA] ?: 0.0, 60, FFGuideGUI.guiLeft + 15, + FFGuideGUI.guiTop + 30, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) line = if (FFStats.baseFF[FFTypes.FARMING_LVL]!! < 0.0) "§cFarming level not saved\n§eOpen /skills to set it!" else "§7§2Fortune for levelling your farming skill\n§2You get 4☘ per farming level" - GuiRenderUtils.drawFarmingBar("§2Farming Level", line, FFStats.baseFF[FFTypes.FARMING_LVL] ?: 0.0, 240, FFGuideGUI.guiLeft + 15, - FFGuideGUI.guiTop + 55, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + GuiRenderUtils.drawFarmingBar( + "§2Farming Level", line, FFStats.baseFF[FFTypes.FARMING_LVL] ?: 0.0, 240, FFGuideGUI.guiLeft + 15, + FFGuideGUI.guiTop + 55, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) - line = if (FFStats.baseFF[FFTypes.COMMUNITY_SHOP]!! < 0.0) "§cCommunity upgrade level not saved\n§eVisit Elizabeth to set it!" - else "§7§2Fortune for community shop upgrades\n§2You get 4☘ per upgrade tier" - GuiRenderUtils.drawFarmingBar("§2Community upgrades", line, FFStats.baseFF[FFTypes.COMMUNITY_SHOP] ?: 0.0, - 40, FFGuideGUI.guiLeft + 15, FFGuideGUI.guiTop + 80, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + line = + if (FFStats.baseFF[FFTypes.COMMUNITY_SHOP]!! < 0.0) "§cCommunity upgrade level not saved\n§eVisit Elizabeth to set it!" + else "§7§2Fortune for community shop upgrades\n§2You get 4☘ per upgrade tier" + GuiRenderUtils.drawFarmingBar( + "§2Community upgrades", line, FFStats.baseFF[FFTypes.COMMUNITY_SHOP] ?: 0.0, + 40, FFGuideGUI.guiLeft + 15, FFGuideGUI.guiTop + 80, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) - line = if (FFStats.baseFF[FFTypes.PLOTS]!! < 0.0) "§cUnlocked plot count not saved\n§eOpen /desk and view your plots to set it!" - else "§7§2Fortune for unlocking garden plots\n§2You get 3☘ per plot unlocked" - GuiRenderUtils.drawFarmingBar("§2Garden Plots", line, FFStats.baseFF[FFTypes.PLOTS] ?: 0.0, 72, FFGuideGUI.guiLeft + 15, - FFGuideGUI.guiTop + 105, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + line = + if (FFStats.baseFF[FFTypes.PLOTS]!! < 0.0) "§cUnlocked plot count not saved\n§eOpen /desk and view your plots to set it!" + else "§7§2Fortune for unlocking garden plots\n§2You get 3☘ per plot unlocked" + GuiRenderUtils.drawFarmingBar( + "§2Garden Plots", line, FFStats.baseFF[FFTypes.PLOTS] ?: 0.0, 72, FFGuideGUI.guiLeft + 15, + FFGuideGUI.guiTop + 105, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) line = when (FFStats.cakeExpireTime) { -1L -> "§eYou have not eaten a cake since\n§edownloading this update, assuming the\n§ebuff is active!" @@ -49,8 +62,10 @@ class OverviewPage: FFGuideGUI.FFGuidePage() { if (FFStats.cakeExpireTime - System.currentTimeMillis() < 0 && FFStats.cakeExpireTime != -1L) { line = "§cYour cake buff has run out\nGo eat some cake!" } - GuiRenderUtils.drawFarmingBar("§2Cake Buff", line, FFStats.baseFF[FFTypes.CAKE] ?: 0.0, 5, FFGuideGUI.guiLeft + 15, - FFGuideGUI.guiTop + 130, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + GuiRenderUtils.drawFarmingBar( + "§2Cake Buff", line, FFStats.baseFF[FFTypes.CAKE] ?: 0.0, 5, FFGuideGUI.guiLeft + 15, + FFGuideGUI.guiTop + 130, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) val armorItem = when (currentArmor) { 1 -> FarmingItems.HELMET @@ -86,8 +101,10 @@ class OverviewPage: FFGuideGUI.FFGuidePage() { else -> 78.75 } } - GuiRenderUtils.drawFarmingBar("§2Total $word Fortune", line, armorFF[FFTypes.TOTAL] ?: 0, value, - FFGuideGUI.guiLeft + 135, FFGuideGUI.guiTop + 30, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + GuiRenderUtils.drawFarmingBar( + "§2Total $word Fortune", line, armorFF[FFTypes.TOTAL] ?: 0, value, + FFGuideGUI.guiLeft + 135, FFGuideGUI.guiTop + 30, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) line = if (currentArmor == 0) "§7§2The base fortune from your armor\n§2Select a piece for more info" else "§7§2Base fortune from your\n${armorItem.getItem().displayName}" @@ -98,9 +115,11 @@ class OverviewPage: FFGuideGUI.FFGuidePage() { 3 -> 35 else -> if (FFStats.usingSpeedBoots) 60 else 30 } - GuiRenderUtils.drawFarmingBar("§2Base $word Fortune", line, armorFF[FFTypes.BASE] ?: 0, + GuiRenderUtils.drawFarmingBar( + "§2Base $word Fortune", line, armorFF[FFTypes.BASE] ?: 0, value, FFGuideGUI.guiLeft + 135, - FFGuideGUI.guiTop + 55, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + FFGuideGUI.guiTop + 55, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) line = if (currentArmor == 0) "§7§2The fortune from your armor's ability\n§2Select a piece for more info" else "§7§2Ability fortune from your\n${armorItem.getItem().displayName}" @@ -117,9 +136,11 @@ class OverviewPage: FFGuideGUI.FFGuidePage() { } } - GuiRenderUtils.drawFarmingBar("§2$word Ability", line, armorFF[FFTypes.ABILITY] ?: 0, + GuiRenderUtils.drawFarmingBar( + "§2$word Ability", line, armorFF[FFTypes.ABILITY] ?: 0, value, FFGuideGUI.guiLeft + 135, - FFGuideGUI.guiTop + 80, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + FFGuideGUI.guiTop + 80, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) line = if (currentArmor == 0) "§7§2The fortune from your armor's reforge\n§2Select a piece for more info" else "§7§2Total fortune from your\n${armorItem.getItem().displayName}" @@ -128,9 +149,11 @@ class OverviewPage: FFGuideGUI.FFGuidePage() { } else if (currentArmor == 4) { if (FFStats.usingSpeedBoots) 25 else 30 } else 30 - GuiRenderUtils.drawFarmingBar("§2$word Reforge", line, armorFF[FFTypes.REFORGE] ?: 0, + GuiRenderUtils.drawFarmingBar( + "§2$word Reforge", line, armorFF[FFTypes.REFORGE] ?: 0, value, FFGuideGUI.guiLeft + 135, - FFGuideGUI.guiTop + 105, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + FFGuideGUI.guiTop + 105, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) var currentPet = FFStats.rabbitFF var petMaxFF = 60 @@ -139,20 +162,25 @@ class OverviewPage: FFGuideGUI.FFGuidePage() { currentPet = FFStats.elephantFF petMaxFF = 210 } + FarmingItems.MOOSHROOM_COW -> { currentPet = FFStats.mooshroomFF petMaxFF = 217 } + FarmingItems.BEE -> { currentPet = FFStats.beeFF petMaxFF = 90 } + else -> {} } - GuiRenderUtils.drawFarmingBar("§2Total Pet Fortune", "§7§2The total fortune from your pet and its item", + GuiRenderUtils.drawFarmingBar( + "§2Total Pet Fortune", "§7§2The total fortune from your pet and its item", currentPet[FFTypes.TOTAL] ?: 0, petMaxFF, FFGuideGUI.guiLeft + 105, - FFGuideGUI.guiTop + 155, 70, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + FFGuideGUI.guiTop + 155, 70, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) line = when (FFStats.currentPetItem) { "GREEN_BANDANA" -> "§7§2The fortune from your pet's item\n§2Grants 4☘ per garden level" @@ -160,8 +188,10 @@ class OverviewPage: FFGuideGUI.FFGuidePage() { "MINOS_RELIC" -> "§cGreen Bandana is better for fortune than minos relic!" else -> "No fortune boosting pet item" } - GuiRenderUtils.drawFarmingBar("§2Pet Item", line, currentPet[FFTypes.PET_ITEM] ?: 0, 60, FFGuideGUI.guiLeft + 185, - FFGuideGUI.guiTop + 155, 70, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + GuiRenderUtils.drawFarmingBar( + "§2Pet Item", line, currentPet[FFTypes.PET_ITEM] ?: 0, 60, FFGuideGUI.guiLeft + 185, + FFGuideGUI.guiTop + 155, 70, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) word = if (currentEquipment == 0) "Equipment" else "Piece" @@ -182,32 +212,46 @@ class OverviewPage: FFGuideGUI.FFGuidePage() { line = if (currentEquipment == 0) "§7§2Total fortune from all your equipment\n§2Select a piece for more info" else "§7§2Total fortune from your\n${equipmentItem.getItem().displayName}" - GuiRenderUtils.drawFarmingBar("§2Total $word Fortune", line, equipmentFF[FFTypes.TOTAL] ?: 0, + GuiRenderUtils.drawFarmingBar( + "§2Total $word Fortune", line, equipmentFF[FFTypes.TOTAL] ?: 0, if (currentEquipment == 0) 218 else 54.5, - FFGuideGUI.guiLeft + 255, FFGuideGUI.guiTop + 30, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + FFGuideGUI.guiLeft + 255, FFGuideGUI.guiTop + 30, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) line = if (currentEquipment == 0) "§7§2The base fortune from all your equipment\n§2Select a piece for more info" else "§7§2Total base fortune from your\n${equipmentItem.getItem().displayName}" - GuiRenderUtils.drawFarmingBar("§2$word Base Fortune", line, equipmentFF[FFTypes.BASE] ?: 0, + GuiRenderUtils.drawFarmingBar( + "§2$word Base Fortune", line, equipmentFF[FFTypes.BASE] ?: 0, if (currentEquipment == 0) 20 else 5, - FFGuideGUI.guiLeft + 255, FFGuideGUI.guiTop + 55, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + FFGuideGUI.guiLeft + 255, FFGuideGUI.guiTop + 55, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) - line = if (currentEquipment == 0) "§7§2The fortune from all of your equipment's abilities\n§2Select a piece for more info" - else "§7§2Total ability fortune from your\n${equipmentItem.getItem().displayName}" - GuiRenderUtils.drawFarmingBar("§2$word Ability", line, equipmentFF[FFTypes.ABILITY] ?: 0, + line = + if (currentEquipment == 0) "§7§2The fortune from all of your equipment's abilities\n§2Select a piece for more info" + else "§7§2Total ability fortune from your\n${equipmentItem.getItem().displayName}" + GuiRenderUtils.drawFarmingBar( + "§2$word Ability", line, equipmentFF[FFTypes.ABILITY] ?: 0, if (currentEquipment == 0) 60 else 15, - FFGuideGUI.guiLeft + 255, FFGuideGUI.guiTop + 80, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + FFGuideGUI.guiLeft + 255, FFGuideGUI.guiTop + 80, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) - line = if (currentEquipment == 0) "§7§2The fortune from all of your equipment's reforges\n§2Select a piece for more info" - else "§7§2Total reforge fortune from your\n${equipmentItem.getItem().displayName}" - GuiRenderUtils.drawFarmingBar("§2$word Reforge", line, equipmentFF[FFTypes.REFORGE] ?: 0, + line = + if (currentEquipment == 0) "§7§2The fortune from all of your equipment's reforges\n§2Select a piece for more info" + else "§7§2Total reforge fortune from your\n${equipmentItem.getItem().displayName}" + GuiRenderUtils.drawFarmingBar( + "§2$word Reforge", line, equipmentFF[FFTypes.REFORGE] ?: 0, if (currentEquipment == 0) 60 else 15, - FFGuideGUI.guiLeft + 255, FFGuideGUI.guiTop + 105, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + FFGuideGUI.guiLeft + 255, FFGuideGUI.guiTop + 105, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) - line = if (currentEquipment == 0) "§7§2The fortune from all of your equipment's enchantments\n§2Select a piece for more info" - else "§7§2Total enchantment fortune from your\n${equipmentItem.getItem().displayName}" - GuiRenderUtils.drawFarmingBar("§2$word Enchantment", line, equipmentFF[FFTypes.GREEN_THUMB] ?: 0, - if (currentEquipment == 0) 78 else 19.5, - FFGuideGUI.guiLeft + 255, FFGuideGUI.guiTop + 130, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay) + val maxGreenThumbFortune = GardenAPI.totalAmountVisitorsExisting.toDouble() / 4 + line = + if (currentEquipment == 0) "§7§2The fortune from all of your equipment's enchantments\n§2Select a piece for more info" + else "§7§2Total enchantment fortune from your\n${equipmentItem.getItem().displayName}" + GuiRenderUtils.drawFarmingBar( + "§2$word Enchantment", line, equipmentFF[FFTypes.GREEN_THUMB] ?: 0, + if (currentEquipment == 0) maxGreenThumbFortune * 4 else maxGreenThumbFortune, + FFGuideGUI.guiLeft + 255, FFGuideGUI.guiTop + 130, 90, mouseX, mouseY, FFGuideGUI.tooltipToDisplay + ) } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/UpgradePage.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/UpgradePage.kt index 6076efd21dcb..dd6664bc754a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/UpgradePage.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/UpgradePage.kt @@ -11,7 +11,7 @@ import net.minecraft.client.renderer.GlStateManager import net.minecraft.util.MathHelper import java.text.DecimalFormat -class UpgradePage: FFGuideGUI.FFGuidePage() { +class UpgradePage : FFGuideGUI.FFGuidePage() { private var pageScroll = 0 private var scrollVelocity = 0.0 private val maxNoInputFrames = 100 @@ -21,14 +21,36 @@ class UpgradePage: FFGuideGUI.FFGuidePage() { val adjustedY = FFGuideGUI.guiTop + 20 + pageScroll val inverseScale = 1 / 0.75f + // TODO fix duplicate drawString lines, add guiLeft, guiTop and inverseScale GlStateManager.scale(0.75f, 0.75f, 1f) - GuiRenderUtils.drawString("Upgrade", (FFGuideGUI.guiLeft + 45) * inverseScale, (FFGuideGUI.guiTop + 5) * inverseScale) - GuiRenderUtils.drawString("Item", (FFGuideGUI.guiLeft + 190) * inverseScale, (FFGuideGUI.guiTop + 5) * inverseScale) - GuiRenderUtils.drawString("FF increase", (FFGuideGUI.guiLeft + 240) * inverseScale, (FFGuideGUI.guiTop + 5) * inverseScale) - GuiRenderUtils.drawString("Cost/FF", (FFGuideGUI.guiLeft + 290) * inverseScale, (FFGuideGUI.guiTop + 5) * inverseScale) - GuiRenderUtils.drawString("Total", (FFGuideGUI.guiLeft + 330) * inverseScale, (FFGuideGUI.guiTop + 5) * inverseScale) + GuiRenderUtils.drawString( + "Upgrade", + (FFGuideGUI.guiLeft + 45) * inverseScale, + (FFGuideGUI.guiTop + 5) * inverseScale + ) + GuiRenderUtils.drawString( + "Item", + (FFGuideGUI.guiLeft + 190) * inverseScale, + (FFGuideGUI.guiTop + 5) * inverseScale + ) + GuiRenderUtils.drawString( + "FF increase", + (FFGuideGUI.guiLeft + 240) * inverseScale, + (FFGuideGUI.guiTop + 5) * inverseScale + ) + GuiRenderUtils.drawString( + "Cost/FF", + (FFGuideGUI.guiLeft + 290) * inverseScale, + (FFGuideGUI.guiTop + 5) * inverseScale + ) + GuiRenderUtils.drawString( + "Total", + (FFGuideGUI.guiLeft + 330) * inverseScale, + (FFGuideGUI.guiTop + 5) * inverseScale + ) - val upgradeList = if (FFGuideGUI.currentCrop == null) FortuneUpgrades.genericUpgrades else FortuneUpgrades.cropSpecificUpgrades + val upgradeList = + if (FFGuideGUI.currentCrop == null) FortuneUpgrades.genericUpgrades else FortuneUpgrades.cropSpecificUpgrades listLength = upgradeList.size for ((index, upgrade) in upgradeList.withIndex()) { if (adjustedY + 25 * index < FFGuideGUI.guiTop + 20) continue @@ -42,13 +64,40 @@ class UpgradePage: FFGuideGUI.FFGuidePage() { if (upgrade.itemQuantity != 1) { formattedUpgrade = "$formattedUpgrade §fx${upgrade.itemQuantity}" } - GuiRenderUtils.drawTwoLineString(upgrade.description, (FFGuideGUI.guiLeft + 15) * inverseScale, (adjustedY + 25 * index) * inverseScale) - GuiRenderUtils.renderItemAndTip(FFGuideGUI.tooltipToDisplay, upgradeItem, (FFGuideGUI.guiLeft + 155) * inverseScale, (adjustedY + 25 * index - 5) * inverseScale, - mouseX * inverseScale, mouseY * inverseScale, 0x00FFFFFF) - GuiRenderUtils.drawString(formattedUpgrade, (FFGuideGUI.guiLeft + 180) * inverseScale, (adjustedY + 25 * index) * inverseScale) - GuiRenderUtils.drawString("§a${DecimalFormat("0.##").format(upgrade.fortuneIncrease)}", (FFGuideGUI.guiLeft + 270) * inverseScale, (adjustedY + 25 * index) * inverseScale) - GuiRenderUtils.drawString("§6" + upgrade.costPerFF?.let { NumberUtil.format(it) }, (FFGuideGUI.guiLeft + 300) * inverseScale, (adjustedY + 25 * index) * inverseScale) - GuiRenderUtils.drawString(("§6" + upgrade.cost?.let { NumberUtil.format(it) }), (FFGuideGUI.guiLeft + 335) * inverseScale, (adjustedY + 25 * index) * inverseScale) + GuiRenderUtils.drawTwoLineString( + upgrade.description, + (FFGuideGUI.guiLeft + 15) * inverseScale, + (adjustedY + 25 * index) * inverseScale + ) + GuiRenderUtils.renderItemAndTip( + FFGuideGUI.tooltipToDisplay, + upgradeItem, + (FFGuideGUI.guiLeft + 155) * inverseScale, + (adjustedY + 25 * index - 5) * inverseScale, + mouseX * inverseScale, + mouseY * inverseScale, + 0x00FFFFFF + ) + GuiRenderUtils.drawString( + formattedUpgrade, + (FFGuideGUI.guiLeft + 180) * inverseScale, + (adjustedY + 25 * index) * inverseScale + ) + GuiRenderUtils.drawString( + "§a${DecimalFormat("0.##").format(upgrade.fortuneIncrease)}", + (FFGuideGUI.guiLeft + 270) * inverseScale, + (adjustedY + 25 * index) * inverseScale + ) + GuiRenderUtils.drawString( + "§6" + upgrade.costPerFF?.let { NumberUtil.format(it) }, + (FFGuideGUI.guiLeft + 300) * inverseScale, + (adjustedY + 25 * index) * inverseScale + ) + GuiRenderUtils.drawString( + ("§6" + upgrade.cost?.let { NumberUtil.format(it) }), + (FFGuideGUI.guiLeft + 335) * inverseScale, + (adjustedY + 25 * index) * inverseScale + ) } GlStateManager.scale(inverseScale, inverseScale, 1f) scrollScreen() diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/GardenCropMilestoneInventory.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/GardenCropMilestoneInventory.kt index 495696a3ec50..cb236050bc42 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/GardenCropMilestoneInventory.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/inventory/GardenCropMilestoneInventory.kt @@ -58,6 +58,8 @@ class GardenCropMilestoneInventory { val itemStack = event.itemStack ?: return val crop = GardenCropMilestones.getCropTypeByLore(itemStack) ?: return + val tier = GardenCropMilestones.getTierForCropCount(crop.getCounter(), crop) + if (tier > 20) return val maxTier = GardenCropMilestones.getMaxTier() val maxCounter = GardenCropMilestones.getCropsForTier(maxTier, crop) @@ -81,4 +83,4 @@ class GardenCropMilestoneInventory { event.move(3, "garden.numberAverageCropMilestone", "garden.number.averageCropMilestone") event.move(3, "garden.cropMilestoneTotalProgress", "garden.tooltipTweak.cropMilestoneTotalProgress") } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt index 9c56927fb754..4995decc82f0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt @@ -19,6 +19,7 @@ import at.hannibal2.skyhanni.features.garden.CropType.Companion.getByNameOrNull import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.features.garden.farming.GardenCropSpeed.getSpeed import at.hannibal2.skyhanni.mixins.hooks.RenderLivingEntityHelper +import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.EntityUtils import at.hannibal2.skyhanni.utils.InventoryUtils import at.hannibal2.skyhanni.utils.ItemBlink @@ -80,13 +81,20 @@ class GardenVisitorFeatures { val visitor = event.visitor val offerItem = visitor.offer!!.offerItem - for (line in offerItem.getLore()) { + val lore = offerItem.getLore() + for (line in lore) { if (line == "§7Items Required:") continue if (line.isEmpty()) break val pair = ItemUtils.readItemAmount(line) if (pair == null) { - LorenzUtils.error("Could not read item '$line'") + ErrorManager.logErrorStateWithData( + "Could not read items required in Visitor Inventory", "ItemUtils.readItemAmount returns null", + "line" to line, + "offerItem" to offerItem, + "lore" to lore, + "visitor" to visitor + ) continue } val (itemName, amount) = pair @@ -97,7 +105,7 @@ class GardenVisitorFeatures { readToolTip(visitor, offerItem) if (visitor.status == VisitorAPI.VisitorStatus.NEW) { - val alreadyReady = offerItem.getLore().any { it == "§eClick to give!" } == true + val alreadyReady = offerItem.getLore().any { it == "§eClick to give!" } if (alreadyReady) { VisitorAPI.changeStatus(visitor, VisitorAPI.VisitorStatus.READY, "inSacks") visitor.inSacks = true @@ -270,7 +278,6 @@ class GardenVisitorFeatures { if (visitor.lastLore.isEmpty()) { readToolTip(visitor, event.itemStack) - LorenzUtils.error("Reloaded the visitor data of that inventory, this should not happen.") } toolTip.addAll(visitor.lastLore) diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/HighlightVisitorsOutsideOfGarden.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/HighlightVisitorsOutsideOfGarden.kt index 026d263ee25a..a4d370e62fe7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/HighlightVisitorsOutsideOfGarden.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/HighlightVisitorsOutsideOfGarden.kt @@ -27,7 +27,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class HighlightVisitorsOutsideOfGarden { private var visitorJson = mapOf>() - val config get() = SkyHanniMod.feature.garden.visitors + private val config get() = SkyHanniMod.feature.garden.visitors @SubscribeEvent fun onRepoReload(event: RepositoryReloadEvent) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorAPI.kt index 1ad82a241a5d..f71ab6883859 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorAPI.kt @@ -153,7 +153,7 @@ object VisitorAPI { found = false continue } - val name = VisitorAPI.fromHypixelName(line) + val name = fromHypixelName(line) // Hide hypixel watchdog entries if (name.contains("§c") && !name.contains("Spaceman") && !name.contains("Grandma Wolf")) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorTooltipParser.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorTooltipParser.kt index 510e4f3b7908..851c5ece78ee 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorTooltipParser.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorTooltipParser.kt @@ -36,7 +36,7 @@ class VisitorTooltipParser { } } - return parsedData; + return parsedData } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/inventory/ChestValue.kt b/src/main/java/at/hannibal2/skyhanni/features/inventory/ChestValue.kt index 42b22741b1b1..f8817b43bb52 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/inventory/ChestValue.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/inventory/ChestValue.kt @@ -45,7 +45,7 @@ class ChestValue { if (InventoryUtils.openInventoryName() == "") return if (!config.showDuringEstimatedItemValue) { - if (EstimatedItemValue.currentlyShowing) return + if (EstimatedItemValue.isCurrentlyShowing()) return } if (inInventory) { @@ -126,11 +126,11 @@ class ChestValue { val textAmount = " §7x$amount:" val width = Minecraft.getMinecraft().fontRendererObj.getStringWidth(textAmount) val name = "${stack.displayName.reduceStringLength((config.nameLength - width), ' ')} $textAmount" - val price = "§b${(total).formatPrice()}" + val price = "§6${(total).formatPrice()}" val text = if (config.alignedDisplay) "$name $price" else - "${stack.displayName} §7x$amount: §b${total.formatPrice()}" + "${stack.displayName} §7x$amount: §6${total.formatPrice()}" newDisplay.add(buildList { val renderable = Renderable.hoverTips( text, @@ -144,7 +144,7 @@ class ChestValue { }) rendered++ } - newDisplay.addAsSingletonList("§6Total value : §b${totalPrice.formatPrice()}") + newDisplay.addAsSingletonList("§aTotal value: §6${totalPrice.formatPrice()} coins") } private fun sortedList() = when (config.sortingType) { @@ -197,7 +197,7 @@ class ChestValue { val key = "$internalName+$total" if (stack.item == Items.enchanted_book) total /= 2 - list.add("§aTotal: §6§l${total.formatPrice()}") + list.add("§aTotal: §6§l${total.formatPrice()} coins") if (total == 0.0) continue val item = chestItems.getOrPut(key) { Item(mutableListOf(), 0, stack, 0.0, list) diff --git a/src/main/java/at/hannibal2/skyhanni/features/inventory/HarpFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/inventory/HarpFeatures.kt index f210f857c3ef..0f8c3fe4af39 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/inventory/HarpFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/inventory/HarpFeatures.kt @@ -17,7 +17,7 @@ import kotlin.time.Duration.Companion.milliseconds // Delaying key presses by 300ms comes from NotEnoughUpdates object HarpFeatures { - val config get() = SkyHanniMod.feature.inventory.helper.harp + private val config get() = SkyHanniMod.feature.inventory.helper.harp private var lastClick = SimpleTimeMark.farPast() private object KeyIterable : Iterable { diff --git a/src/main/java/at/hannibal2/skyhanni/features/itemabilities/FireVeilWandParticles.kt b/src/main/java/at/hannibal2/skyhanni/features/itemabilities/FireVeilWandParticles.kt index 455efcef03de..abb0c0f4c708 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/itemabilities/FireVeilWandParticles.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/itemabilities/FireVeilWandParticles.kt @@ -18,7 +18,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class FireVeilWandParticles { private val config get() = SkyHanniMod.feature.itemAbilities.fireVeilWands - var lastClick = 0L + private var lastClick = 0L val item by lazy { "FIRE_VEIL_WAND".asInternalName() } diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/HighlightMiningCommissionMobs.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/HighlightMiningCommissionMobs.kt index 9b46318de08a..94726c6409a7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/HighlightMiningCommissionMobs.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/HighlightMiningCommissionMobs.kt @@ -93,5 +93,5 @@ class HighlightMiningCommissionMobs { } fun isEnabled() = config.highlightCommissionMobs && - (IslandType.DWARVEN_MINES.isInIsland() || IslandType.CRYSTAL_HOLLOWS.isInIsland()) + (IslandType.DWARVEN_MINES.isInIsland() || IslandType.CRYSTAL_HOLLOWS.isInIsland()) } diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalHollowsNamesInCore.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalHollowsNamesInCore.kt index af4d3abf9abc..b1682baadfde 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalHollowsNamesInCore.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalHollowsNamesInCore.kt @@ -12,7 +12,7 @@ import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class CrystalHollowsNamesInCore { - val config get() = SkyHanniMod.feature.mining + private val config get() = SkyHanniMod.feature.mining private val coreLocations = mapOf( LorenzVec(550, 116, 550) to "§8Precursor City", LorenzVec(552, 116, 474) to "§bMithril Deposits", @@ -20,7 +20,7 @@ class CrystalHollowsNamesInCore { LorenzVec(474, 116, 554) to "§6Goblin Hideout" ) - var showWaypoints = false + private var showWaypoints = false @SubscribeEvent fun onTick(event: LorenzTickEvent) { @@ -44,4 +44,4 @@ class CrystalHollowsNamesInCore { } fun isEnabled() = IslandType.CRYSTAL_HOLLOWS.isInIsland() && config.crystalHollowsNamesInCore -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/BrewingStandOverlay.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/BrewingStandOverlay.kt index d7bee2948ec1..cbcb52db7a0e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/BrewingStandOverlay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/BrewingStandOverlay.kt @@ -36,8 +36,8 @@ class BrewingStandOverlay { if (name.contains(" or ")) return event.stackTip = name - event.offsetX = event.offsetX + 3 + event.offsetX += 3 event.offsetY = -5 event.alignLeft = false } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CollectionTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CollectionTracker.kt index 1ddcb40e7265..e05571b6a311 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/CollectionTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CollectionTracker.kt @@ -170,7 +170,7 @@ class CollectionTracker { val currentlyInInventory = countCurrentlyInInventory() val diff = currentlyInInventory - lastAmountInInventory if (diff != 0 && diff > 0) { - gainItems(diff) + gainItems(diff) } lastAmountInInventory = currentlyInInventory diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/FixNEUHeavyPearls.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/FixNEUHeavyPearls.kt index 8f3920844859..b5ce08ba74bc 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/FixNEUHeavyPearls.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/FixNEUHeavyPearls.kt @@ -1,7 +1,7 @@ package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.events.SackChangeEvent +import at.hannibal2.skyhanni.events.ItemAddEvent import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName import io.github.moulberry.notenoughupdates.NotEnoughUpdates @@ -13,16 +13,14 @@ class FixNEUHeavyPearls { private val heavyPearl = "HEAVY_PEARL".asInternalName() @SubscribeEvent - fun onSackChange(event: SackChangeEvent) { + fun onSackChange(event: ItemAddEvent) { if (!isEnabled()) return - for (change in event.sackChanges) { - if (change.internalName == heavyPearl && change.delta == 3) { - val specific = NotEnoughUpdates.INSTANCE.config.getProfileSpecific() - if (System.currentTimeMillis() > specific.dailyHeavyPearlCompleted + 1.hours.inWholeMilliseconds) { - LorenzUtils.chat("Mark NEU Heavy Pearls as done.") - specific.dailyHeavyPearlCompleted = System.currentTimeMillis() - } + if (event.internalName == heavyPearl && event.amount == 3) { + val specific = NotEnoughUpdates.INSTANCE.config.getProfileSpecific() + if (System.currentTimeMillis() > specific.dailyHeavyPearlCompleted + 1.hours.inWholeMilliseconds) { + LorenzUtils.chat("Mark NEU Heavy Pearls as done.") + specific.dailyHeavyPearlCompleted = System.currentTimeMillis() } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/MiscFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/MiscFeatures.kt index 0d164b47710b..3b52ee4784b0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/MiscFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/MiscFeatures.kt @@ -11,7 +11,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent /** * I need these features in my dev env - */ + */ class MiscFeatures { @SubscribeEvent @@ -32,6 +32,7 @@ class MiscFeatures { EnumParticleTypes.EXPLOSION_HUGE, EnumParticleTypes.EXPLOSION_NORMAL, -> event.isCanceled = true + else -> {} } } @@ -50,4 +51,4 @@ class MiscFeatures { fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) { event.move(2, "mobs", "combat.mobs") } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/NonGodPotEffectDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/NonGodPotEffectDisplay.kt index f4ce726f4cc3..80c3b870d729 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/NonGodPotEffectDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/NonGodPotEffectDisplay.kt @@ -58,6 +58,7 @@ class NonGodPotEffectDisplay { GREAT_SPOOK("§fGreat Spook I", inventoryItemName = "§fGreat Spook Potion"), ; } + // TODO USE SH-REPO private var patternEffectsCount = "§7You have §e(?\\d+) §7non-god effects\\.".toPattern() private var totalEffectsCount = 0 diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/PlayerChatSymbols.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/PlayerChatSymbols.kt index c3d45cceeacd..5133e65beb14 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/PlayerChatSymbols.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/PlayerChatSymbols.kt @@ -72,13 +72,15 @@ class PlayerChatSymbols { if (!component.text_skyhanni().contains(rankAndName)) return false val oldText = component.text_skyhanni() - component.setText_skyhanni(component.text_skyhanni().replace(oldText, getNewText(emblemText, oldText, rankAndName))) + val newText = getNewText(emblemText, oldText, rankAndName) + component.setText_skyhanni(component.text_skyhanni().replace(oldText, newText)) return true } - private fun getNewText(emblemText: String, oldText: String, rankAndName: String): String = when (config.symbolLocation) { - 0 -> oldText.replace(rankAndName, "$emblemText $rankAndName") - 1 -> oldText.replace(rankAndName, "$rankAndName $emblemText ") - else -> oldText - } -} \ No newline at end of file + private fun getNewText(emblemText: String, oldText: String, rankAndName: String): String = + when (config.symbolLocation) { + 0 -> oldText.replace(rankAndName, "$emblemText $rankAndName") + 1 -> oldText.replace(rankAndName, "$rankAndName $emblemText ") + else -> oldText + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/QuickModMenuSwitch.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/QuickModMenuSwitch.kt index e6ce5d8f9cd4..9b6987fade9e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/QuickModMenuSwitch.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/QuickModMenuSwitch.kt @@ -52,7 +52,7 @@ object QuickModMenuSwitch { } } - class Mod(val name: String, val description: List, val command: String, val guiPath: List) { + class Mod(val name: String, val description: List, val command: String, private val guiPath: List) { fun isInGui() = guiPath.any { latestGuiPath.startsWith(it) } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/SkyBlockKickDuration.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/SkyBlockKickDuration.kt index d536b8f5329c..7ca34eafbd06 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/SkyBlockKickDuration.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/SkyBlockKickDuration.kt @@ -16,10 +16,10 @@ import kotlin.time.Duration.Companion.seconds class SkyBlockKickDuration { private val config get() = SkyHanniMod.feature.misc.kickDuration - var kickMessage = false - var showTime = false - var lastKickTime = SimpleTimeMark.farPast() - var hasWarned = false + private var kickMessage = false + private var showTime = false + private var lastKickTime = SimpleTimeMark.farPast() + private var hasWarned = false @SubscribeEvent fun onChat(event: LorenzChatEvent) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/SuperpairsClicksAlert.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/SuperpairsClicksAlert.kt index f4da6126b659..6ca018c9f8e7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/SuperpairsClicksAlert.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/SuperpairsClicksAlert.kt @@ -43,12 +43,12 @@ class SuperpairsClicksAlert { if ( // checks if we have succeeded in either minigame (event.inventoryName.contains("Chronomatron") - && ((event.inventoryItems[4]?.displayName?.removeColor() + && ((event.inventoryItems[4]?.displayName?.removeColor() ?.let { currentRoundRegex.find(it) } ?.groups?.get(1)?.value?.toInt() ?: -1) > roundsNeeded)) || (event.inventoryName.contains("Ultrasequencer") - && event.inventoryItems.entries + && event.inventoryItems.entries .filter { it.key < 45 } .any { it.value.stackSize > roundsNeeded }) ) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/TimeFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/TimeFeatures.kt index bcee7863fca7..4298edf210ce 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/TimeFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/TimeFeatures.kt @@ -32,7 +32,8 @@ class TimeFeatures { if (!LorenzUtils.inSkyBlock) return if (config.realTime) { - val currentTime = (if (config.realTimeFormatToggle) timeFormat12h else timeFormat24h).format(System.currentTimeMillis()) + val currentTime = + (if (config.realTimeFormatToggle) timeFormat12h else timeFormat24h).format(System.currentTimeMillis()) config.realTimePosition.renderString(currentTime, posLabel = "Real Time") } @@ -56,4 +57,4 @@ class TimeFeatures { event.move(2, "misc.timeConfigs.realTime", "gui.realTime") event.move(2, "misc.timeConfigs.realTimePos", "gui.realTimePosition") } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/compacttablist/AdvancedPlayerList.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/compacttablist/AdvancedPlayerList.kt index a521bb0ed885..7c96f4efa9d3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/compacttablist/AdvancedPlayerList.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/compacttablist/AdvancedPlayerList.kt @@ -73,8 +73,7 @@ object AdvancedPlayerList { playerData.levelText = levelText index++ if (name.size > index) { - val nameSuffix = name.drop(index).joinToString(" ") - playerData.nameSuffix = nameSuffix + var nameSuffix = name.drop(index).joinToString(" ") if (nameSuffix.contains("♲")) { playerData.ironman = true } else { @@ -82,13 +81,16 @@ object AdvancedPlayerList { } if (IslandType.CRIMSON_ISLE.isInIsland()) { playerData.faction = if (line.contains("§c⚒")) { + nameSuffix = nameSuffix.replace("§c⚒", "") CrimsonIsleFaction.BARBARIAN } else if (line.contains("§5ቾ")) { + nameSuffix = nameSuffix.replace("§5ቾ", "") CrimsonIsleFaction.MAGE } else { CrimsonIsleFaction.NONE } } + playerData.nameSuffix = nameSuffix } else { playerData.nameSuffix = "" } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/compacttablist/TabListReader.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/compacttablist/TabListReader.kt index 3f7f537ed0bc..a81205ce78e5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/compacttablist/TabListReader.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/compacttablist/TabListReader.kt @@ -13,6 +13,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent // heavily inspired by SBA code object TabListReader { private val config get() = SkyHanniMod.feature.misc.compactTabList + // TODO USE SH-REPO var hypixelAdvertisingString = "HYPIXEL.NET" private val godPotPattern = "You have a God Potion active! (?[\\w ]+)".toPattern() @@ -221,4 +222,4 @@ object TabListReader { } } } -} \ No newline at end of file +} 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 e95132ff760e..1418705851cc 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 @@ -371,8 +371,10 @@ enum class DiscordStatus(private val displayMessageSupplier: Supplier?) }), AFK({ - if (beenAfkFor.passedSince() > 5.minutes) "AFK for ${beenAfkFor.passedSince().format(maxUnits = 1, longName = true)}" - else AutoStatus.AFK.placeholderText + if (beenAfkFor.passedSince() > 5.minutes) { + val format = beenAfkFor.passedSince().format(maxUnits = 1, longName = true) + "AFK for $format" + } else AutoStatus.AFK.placeholderText }) ; diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValue.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValue.kt index a4fe36fdc31d..bfdd876c3471 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValue.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValue.kt @@ -38,7 +38,9 @@ object EstimatedItemValue { private val cache = mutableMapOf>>() private var lastToolTipTime = 0L var gemstoneUnlockCosts = HashMap>>() - var currentlyShowing = false + private var currentlyShowing = false + + fun isCurrentlyShowing() = currentlyShowing && Minecraft.getMinecraft().currentScreen != null @SubscribeEvent fun onRepoReload(event: RepositoryReloadEvent) { @@ -190,7 +192,7 @@ object EstimatedItemValue { } else { NumberUtil.format(totalPrice) } - list.add("§aTotal: §6§l$numberFormat") + list.add("§aTotal: §6§l$numberFormat coins") val newDisplay = mutableListOf>() for (line in list) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValueCalculator.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValueCalculator.kt index 93edf2416e55..f3e27957d099 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValueCalculator.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValueCalculator.kt @@ -22,6 +22,7 @@ import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getAbilityScrolls import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getArmorDye import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getAttributes +import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getBookwormBookCount import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getDrillUpgrades import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getDungeonStarCount import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getEnchantments @@ -84,6 +85,7 @@ object EstimatedItemValueCalculator { totalPrice += addTransmissionTuners(stack, list) totalPrice += addManaDisintegrators(stack, list) totalPrice += addPolarvoidBook(stack, list) + totalPrice += addBookwormBook(stack, list) // cosmetic totalPrice += addHelmetSkin(stack, list) @@ -339,6 +341,15 @@ object EstimatedItemValueCalculator { return price } + private fun addBookwormBook(stack: ItemStack, list: MutableList): Double { + val count = stack.getBookwormBookCount() ?: return 0.0 + + val tfHardcodedItemAgain = "BOOKWORM_BOOK".asInternalName() + val price = tfHardcodedItemAgain.getPrice() * count + list.add("§7Bookworm's Favorite Book: §e$count§7/§e5 §7(§6" + NumberUtil.format(price) + "§7)") + return price + } + private fun addSilex(stack: ItemStack, list: MutableList): Double { val tier = stack.getSilexCount() ?: return 0.0 diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorFeatures.kt index 6127266d9dff..318d4c1f0b3c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorFeatures.kt @@ -232,7 +232,9 @@ object TrevorFeatures { location = LorenzVec(location.x, TrevorSolver.averageHeight, location.z) } if (TrevorSolver.mobLocation == CurrentMobArea.FOUND) { - val displayName = if (TrevorSolver.currentMob == null) "Mob Location" else TrevorSolver.currentMob!!.mobName + val displayName = if (TrevorSolver.currentMob == null) "Mob Location" else { + TrevorSolver.currentMob!!.mobName + } location = TrevorSolver.mobCoordinates event.drawWaypointFilled(location.add(0, -2, 0), LorenzColor.GREEN.toColor(), true, true) event.drawDynamicText(location.add(0, 1, 0), displayName, 1.5) diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorTracker.kt index f2e36db59d19..59d44b1b77cf 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/trevor/TrevorTracker.kt @@ -17,7 +17,8 @@ object TrevorTracker { private val config get() = SkyHanniMod.feature.misc.trevorTheTrapper // TODO USE SH-REPO - private val selfKillMobPattern = "§aYour mob died randomly, you are rewarded §r§5(?.*) pelts§r§a.".toPattern() + private val selfKillMobPattern = + "§aYour mob died randomly, you are rewarded §r§5(?.*) pelts§r§a.".toPattern() private val killMobPattern = "§aKilling the animal rewarded you §r§5(?.*) pelts§r§a.".toPattern() private var display = emptyList>() @@ -78,7 +79,7 @@ object TrevorTracker { if (matcher.matches()) { val pelts = matcher.group("pelts").toInt() storage.peltsGained += pelts - storage.selfKillingAnimals += 1 + storage.selfKillingAnimals += 1 saveAndUpdate() } matcher = killMobPattern.matcher(event.message) @@ -94,7 +95,7 @@ object TrevorTracker { val storage = ProfileStorageData.profileSpecific?.trapperData ?: return storage.questsDone += 1 val rarity = matcher.group("rarity") - val foundRarity = TrapperMobRarity.values().firstOrNull { it.formattedName == rarity } ?: return + val foundRarity = TrapperMobRarity.entries.firstOrNull { it.formattedName == rarity } ?: return val old = storage.animalRarities[foundRarity] ?: 0 storage.animalRarities = storage.animalRarities.editCopy { this[foundRarity] = old + 1 } saveAndUpdate() diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/update/GuiOptionEditorUpdateCheck.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/update/GuiOptionEditorUpdateCheck.kt index 9d68aebde79d..b4e517734192 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/update/GuiOptionEditorUpdateCheck.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/update/GuiOptionEditorUpdateCheck.kt @@ -47,7 +47,7 @@ class GuiOptionEditorUpdateCheck(option: ProcessedOption) : GuiOptionEditor(opti val sameVersion = currentVersion.equals(nextVersion, true) TextRenderUtils.drawStringCenteredScaledMaxWidth( "${if (UpdateManager.updateState == UpdateManager.UpdateState.NONE) GREEN else RED}$currentVersion" + - if (nextVersion != null && !sameVersion) "➜ ${GREEN}${nextVersion}" else "", + if (nextVersion != null && !sameVersion) "➜ ${GREEN}${nextVersion}" else "", fr, widthRemaining / 4F, 10F, @@ -59,7 +59,7 @@ class GuiOptionEditorUpdateCheck(option: ProcessedOption) : GuiOptionEditor(opti GlStateManager.popMatrix() } - fun getButtonPosition(width: Int) = width - button.width + private fun getButtonPosition(width: Int) = width - button.width override fun getHeight(): Int { return 55 } @@ -85,4 +85,4 @@ class GuiOptionEditorUpdateCheck(option: ProcessedOption) : GuiOptionEditor(opti override fun fulfillsSearch(word: String): Boolean { return super.fulfillsSearch(word) || word in "download" || word in "update" } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/update/UpdateManager.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/update/UpdateManager.kt index ab32d9aa7149..2a35519e9a41 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/update/UpdateManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/update/UpdateManager.kt @@ -62,11 +62,11 @@ object UpdateManager { } } - fun isBetaRelease(): Boolean { + fun isCurrentlyBeta(): Boolean { return getCurrentVersion().contains("beta", ignoreCase = true) } - val config get() = SkyHanniMod.feature.about + private val config get() = SkyHanniMod.feature.about fun reset() { updateState = UpdateState.NONE @@ -82,7 +82,7 @@ object UpdateManager { } logger.log("Starting update check") var updateStream = config.updateStream.get() - if (updateStream == About.UpdateStream.RELEASES && isBetaRelease()) { + if (updateStream == About.UpdateStream.RELEASES && isCurrentlyBeta()) { updateStream = About.UpdateStream.BETA } activePromise = context.checkUpdate(updateStream.stream) @@ -119,7 +119,7 @@ object UpdateManager { }, MinecraftExecutor.OnThread) } - val context = UpdateContext( + private val context = UpdateContext( UpdateSource.githubUpdateSource("hannibal002", "SkyHanni"), UpdateTarget.deleteAndSaveInTheSameFolder(UpdateManager::class.java), CurrentVersion.ofTag(SkyHanniMod.version), @@ -137,5 +137,5 @@ object UpdateManager { NONE } - var potentialUpdate: PotentialUpdate? = null + private var potentialUpdate: PotentialUpdate? = null } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/visualwords/VisualWordGui.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/visualwords/VisualWordGui.kt index 49c22b26de82..a996d72774d8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/visualwords/VisualWordGui.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/visualwords/VisualWordGui.kt @@ -137,7 +137,11 @@ open class VisualWordGui : GuiScreen() { inBox = true } - drawUnmodifiedString("${index + 1}.", (guiLeft + 5) * inverseScale, (adjustedY + 10 + 30 * index) * inverseScale) + drawUnmodifiedString( + "${index + 1}.", + (guiLeft + 5) * inverseScale, + (adjustedY + 10 + 30 * index) * inverseScale + ) val top = adjustedY + 30 * index + 7 if (isPointInLastClicked(guiLeft + 335, top, 16, 16)) { @@ -167,7 +171,14 @@ open class VisualWordGui : GuiScreen() { } if (inBox) { - GuiRenderUtils.drawScaledRec(guiLeft, adjustedY + 30 * index, guiLeft + sizeX, adjustedY + 30 * index + 30, colorB, inverseScale) + GuiRenderUtils.drawScaledRec( + guiLeft, + adjustedY + 30 * index, + guiLeft + sizeX, + adjustedY + 30 * index + 30, + colorB, + inverseScale + ) } val statusBlock = if (phrase.enabled) { @@ -190,11 +201,27 @@ open class VisualWordGui : GuiScreen() { GlStateManager.scale(scale, scale, 1f) if (inBox) { - drawUnmodifiedString(phrase.phrase, (guiLeft + 15) * inverseScale, (adjustedY + 5 + 30 * index) * inverseScale) - drawUnmodifiedString(phrase.replacement, (guiLeft + 15) * inverseScale, (adjustedY + 15 + 30 * index) * inverseScale) + drawUnmodifiedString( + phrase.phrase, + (guiLeft + 15) * inverseScale, + (adjustedY + 5 + 30 * index) * inverseScale + ) + drawUnmodifiedString( + phrase.replacement, + (guiLeft + 15) * inverseScale, + (adjustedY + 15 + 30 * index) * inverseScale + ) } else { - drawUnmodifiedString(phrase.phrase.convertToFormatted(), (guiLeft + 15) * inverseScale, (adjustedY + 5 + 30 * index) * inverseScale) - drawUnmodifiedString(phrase.replacement.convertToFormatted(), (guiLeft + 15) * inverseScale, (adjustedY + 15 + 30 * index) * inverseScale) + drawUnmodifiedString( + phrase.phrase.convertToFormatted(), + (guiLeft + 15) * inverseScale, + (adjustedY + 5 + 30 * index) * inverseScale + ) + drawUnmodifiedString( + phrase.replacement.convertToFormatted(), + (guiLeft + 15) * inverseScale, + (adjustedY + 15 + 30 * index) * inverseScale + ) } } @@ -256,17 +283,46 @@ open class VisualWordGui : GuiScreen() { GlStateManager.scale(0.75f, 0.75f, 1f) - drawUnmodifiedString("§bThe top line of each section", (guiLeft + 10) * inverseScale, (guiTop + 12) * inverseScale) - drawUnmodifiedString("§bis the preview of the bottom text", (guiLeft + 10) * inverseScale, (guiTop + 22) * inverseScale) - - drawUnmodifiedString("§bTo get the Minecraft", (guiLeft + 220) * inverseScale, (guiTop + 12) * inverseScale) - drawUnmodifiedString("§b formatting character use \"&&\"", (guiLeft + 220) * inverseScale, (guiTop + 22) * inverseScale) - - drawUnmodifiedString(currentPhrase.phrase.convertToFormatted(), (guiLeft + 30) * inverseScale, (guiTop + 40) * inverseScale) + // TODO remove more code duplication + drawUnmodifiedString( + "§bThe top line of each section", + (guiLeft + 10) * inverseScale, + (guiTop + 12) * inverseScale + ) + drawUnmodifiedString( + "§bis the preview of the bottom text", + (guiLeft + 10) * inverseScale, + (guiTop + 22) * inverseScale + ) + + drawUnmodifiedString( + "§bTo get the Minecraft", + (guiLeft + 220) * inverseScale, + (guiTop + 12) * inverseScale + ) + drawUnmodifiedString( + "§b formatting character use \"&&\"", + (guiLeft + 220) * inverseScale, + (guiTop + 22) * inverseScale + ) + + drawUnmodifiedString( + currentPhrase.phrase.convertToFormatted(), + (guiLeft + 30) * inverseScale, + (guiTop + 40) * inverseScale + ) drawUnmodifiedString(currentPhrase.phrase, (guiLeft + 30) * inverseScale, (guiTop + 55) * inverseScale) - drawUnmodifiedString(currentPhrase.replacement.convertToFormatted(), (guiLeft + 30) * inverseScale, (guiTop + 95) * inverseScale) - drawUnmodifiedString(currentPhrase.replacement, (guiLeft + 30) * inverseScale, (guiTop + 110) * inverseScale) + drawUnmodifiedString( + currentPhrase.replacement.convertToFormatted(), + (guiLeft + 30) * inverseScale, + (guiTop + 95) * inverseScale + ) + drawUnmodifiedString( + currentPhrase.replacement, + (guiLeft + 30) * inverseScale, + (guiTop + 110) * inverseScale + ) GlStateManager.scale(inverseScale, inverseScale, 1f) } diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangBlazingSouls.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangBlazingSouls.kt index 74b94c0c9e37..8d7507e121c5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangBlazingSouls.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangBlazingSouls.kt @@ -65,5 +65,5 @@ class AshfangBlazingSouls { } private fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled && - DamageIndicatorManager.isBossSpawned(BossType.NETHER_ASHFANG) -} \ No newline at end of file + DamageIndicatorManager.isBossSpawned(BossType.NETHER_ASHFANG) +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangFreezeCooldown.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangFreezeCooldown.kt index 161df6a8c931..5fd7a3b778b6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangFreezeCooldown.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangFreezeCooldown.kt @@ -51,6 +51,6 @@ class AshfangFreezeCooldown { private fun isEnabled(): Boolean { return LorenzUtils.inSkyBlock && config.freezeCooldown && - DamageIndicatorManager.isBossSpawned(BossType.NETHER_ASHFANG) + DamageIndicatorManager.isBossSpawned(BossType.NETHER_ASHFANG) } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangGravityOrbs.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangGravityOrbs.kt index 68837bad4759..5b3fc60ded6a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangGravityOrbs.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangGravityOrbs.kt @@ -23,7 +23,7 @@ class AshfangGravityOrbs { private val config get() = SkyHanniMod.feature.crimsonIsle.ashfang.gravityOrbs private val texture = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV" + - "0L3RleHR1cmUvMWE2OWNjZjdhZDkwNGM5YTg1MmVhMmZmM2Y1YjRlMjNhZGViZjcyZWQxMmQ1ZjI0Yjc4Y2UyZDQ0YjRhMiJ9fX0=" + "0L3RleHR1cmUvMWE2OWNjZjdhZDkwNGM5YTg1MmVhMmZmM2Y1YjRlMjNhZGViZjcyZWQxMmQ1ZjI0Yjc4Y2UyZDQ0YjRhMiJ9fX0=" private val orbs = mutableListOf() @SubscribeEvent @@ -68,5 +68,5 @@ class AshfangGravityOrbs { } private fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled && - DamageIndicatorManager.isBossSpawned(BossType.NETHER_ASHFANG) -} \ No newline at end of file + DamageIndicatorManager.isBossSpawned(BossType.NETHER_ASHFANG) +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangHideDamageIndicator.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangHideDamageIndicator.kt index 99351747f8a3..157c260fa30c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangHideDamageIndicator.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangHideDamageIndicator.kt @@ -28,5 +28,5 @@ class AshfangHideDamageIndicator { private fun isEnabled() = LorenzUtils.inSkyBlock && SkyHanniMod.feature.crimsonIsle.ashfang.hide.damageSplash && - DamageIndicatorManager.isBossSpawned(BossType.NETHER_ASHFANG) -} \ No newline at end of file + DamageIndicatorManager.isBossSpawned(BossType.NETHER_ASHFANG) +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangNextResetCooldown.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangNextResetCooldown.kt index 42d98cdbb203..68c3d9382c97 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangNextResetCooldown.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangNextResetCooldown.kt @@ -60,6 +60,6 @@ class AshfangNextResetCooldown { private fun isEnabled(): Boolean { return LorenzUtils.inSkyBlock && config.nextResetCooldown && - DamageIndicatorManager.isBossSpawned(BossType.NETHER_ASHFANG) + DamageIndicatorManager.isBossSpawned(BossType.NETHER_ASHFANG) } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/DailyKuudraBossHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/DailyKuudraBossHelper.kt index 39e888adeb4b..a14da5859b20 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/DailyKuudraBossHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/DailyKuudraBossHelper.kt @@ -46,8 +46,8 @@ class DailyKuudraBossHelper(private val reputationHelper: CrimsonIsleReputationH if (!message.contains("KUUDRA DOWN!") || message.contains(":")) return for (line in ScoreboardData.sidebarLines) { - if(line.contains("Kuudra's") && line.contains("Hollow") && line.contains("(")){ - val tier = line.substringAfter("(T").substring(0,1).toInt() + if (line.contains("Kuudra's") && line.contains("Hollow") && line.contains("(")) { + val tier = line.substringAfter("(T").substring(0, 1).toInt() val kuudraTier = getByTier(tier)!! finished(kuudraTier) return @@ -129,4 +129,4 @@ class DailyKuudraBossHelper(private val reputationHelper: CrimsonIsleReputationH private fun getByDisplayName(name: String) = kuudraTiers.firstOrNull { it.name == name } private fun getByTier(number: Int) = kuudraTiers.firstOrNull { it.tierNumber == number } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/DailyMiniBossHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/DailyMiniBossHelper.kt index 10eae5816bed..52f5c23f47f6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/DailyMiniBossHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/DailyMiniBossHelper.kt @@ -13,7 +13,7 @@ import at.hannibal2.skyhanni.utils.LocationUtils import at.hannibal2.skyhanni.utils.LorenzColor import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList -import at.hannibal2.skyhanni.utils.NEUItems +import at.hannibal2.skyhanni.utils.NEUItems.getItemStack import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import at.hannibal2.skyhanni.utils.jsonobjects.CrimsonIsleReputationJson.ReputationQuest @@ -55,14 +55,10 @@ class DailyMiniBossHelper(private val reputationHelper: CrimsonIsleReputationHel } } - private fun needMiniBossQuest(miniBoss: CrimsonMiniBoss): Boolean { - val bossQuest = reputationHelper.questHelper.getQuest() - if (bossQuest != null && bossQuest.miniBoss == miniBoss && bossQuest.state == QuestState.ACCEPTED) { - return true - } - - return false - } + private fun needMiniBossQuest(miniBoss: CrimsonMiniBoss) = + reputationHelper.questHelper.getQuest()?.let { + it.miniBoss == miniBoss && it.state == QuestState.ACCEPTED + } ?: false private fun finished(miniBoss: CrimsonMiniBoss) { reputationHelper.questHelper.finishMiniBoss(miniBoss) @@ -84,7 +80,7 @@ class DailyMiniBossHelper(private val reputationHelper: CrimsonIsleReputationHel } else { val lineList = mutableListOf() lineList.add(" ") - lineList.add(NEUItems.getItemStack(displayItem)) + lineList.add(getItemStack(displayItem)) lineList.add("§5$displayName§7: $result") display.add(lineList) } @@ -123,4 +119,4 @@ class DailyMiniBossHelper(private val reputationHelper: CrimsonIsleReputationHel } private fun getByDisplayName(name: String) = miniBosses.firstOrNull { it.displayName == name } -} \ 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 index 507dc5953d1d..ab3fa40c1e32 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/RiftAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/RiftAPI.kt @@ -29,6 +29,7 @@ object RiftAPI { fun inLivingCave() = LorenzUtils.skyBlockArea == "Living Cave" fun inLivingStillness() = LorenzUtils.skyBlockArea == "Living Stillness" - fun inStillgoreChateau() = LorenzUtils.skyBlockArea == "Stillgore Château" || LorenzUtils.skyBlockArea == "Oubliette" + fun inStillgoreChateau() = LorenzUtils.skyBlockArea.let { it == "Stillgore Château" || it == "Oubliette" } + fun inDreadfarm() = LorenzUtils.skyBlockArea == "Dreadfarm" } diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/area/dreadfarm/RiftWiltedBerberisHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/area/dreadfarm/RiftWiltedBerberisHelper.kt index b39c6d0042c0..e17bd32ed7ac 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/area/dreadfarm/RiftWiltedBerberisHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/area/dreadfarm/RiftWiltedBerberisHelper.kt @@ -49,9 +49,9 @@ class RiftWiltedBerberisHelper { } } - fun nearestBerberis(location: LorenzVec): WiltedBerberis? { + private fun nearestBerberis(location: LorenzVec): WiltedBerberis? { return list.filter { it.currentParticles.distanceSq(location) < 8 } - .sortedBy { it.currentParticles.distanceSq(location) }.firstOrNull() + .minByOrNull { it.currentParticles.distanceSq(location) } } @SubscribeEvent diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveDefenseBlocks.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveDefenseBlocks.kt index 1257f8db4746..88b2939c82cc 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveDefenseBlocks.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveDefenseBlocks.kt @@ -77,9 +77,9 @@ class LivingCaveDefenseBlocks { // read new entity data val compareLocation = event.location.add(-0.5, -1.5, -0.5) entity = EntityUtils.getEntitiesNearby(compareLocation, 2.0) - .filter { isCorrectMob(it.name) } - .filter { !it.isAtFullHealth() } - .minByOrNull { it.distanceTo(compareLocation) } + .filter { isCorrectMob(it.name) } + .filter { !it.isAtFullHealth() } + .minByOrNull { it.distanceTo(compareLocation) } } val defenseBlock = entity?.let { DefenseBlock(it, location) } ?: return diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt index cabc094db4c8..cc237c6c520f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt @@ -67,7 +67,11 @@ class LivingCaveLivingMetalHelper { val percentage = diff.toDouble() / maxTime a.slope(b, 1 - percentage) } else b - event.drawWaypointFilled(location, LorenzColor.AQUA.toColor(), seeThroughBlocks = location.distanceToPlayer() < 10) + event.drawWaypointFilled( + location, + LorenzColor.AQUA.toColor(), + seeThroughBlocks = location.distanceToPlayer() < 10 + ) } @SubscribeEvent diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/area/wyldwoods/RiftLarva.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/area/wyldwoods/RiftLarva.kt index 7c994ea1bed5..5629972eab81 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/area/wyldwoods/RiftLarva.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/area/wyldwoods/RiftLarva.kt @@ -15,7 +15,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class RiftLarva { private val config get() = RiftAPI.config.area.wyldWoods.larvas private var hasHookInHand = false - val larvaSkullTexture = + private val larvaSkullTexture = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTgzYjMwZTlkMTM1YjA1MTkwZWVhMmMzYWM2MWUyYWI1NWEyZDgxZTFhNThkYmIyNjk4M2ExNDA4MjY2NCJ9fX0=" @SubscribeEvent diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/area/wyldwoods/RiftOdonata.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/area/wyldwoods/RiftOdonata.kt index 1093a8a69112..7d1e9b9ba61e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/area/wyldwoods/RiftOdonata.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/area/wyldwoods/RiftOdonata.kt @@ -16,7 +16,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class RiftOdonata { private val config get() = RiftAPI.config.area.wyldWoods.odonata private var hasBottleInHand = false - val odonataSkullTexture = + private val odonataSkullTexture = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWZkODA2ZGVmZGZkZjU5YjFmMjYwOWM4ZWUzNjQ2NjZkZTY2MTI3YTYyMzQxNWI1NDMwYzkzNThjNjAxZWY3YyJ9fX0=" private val emptyBottle by lazy { "EMPTY_ODONATA_BOTTLE".asInternalName() } diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/RiftHorsezookaHider.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/RiftHorsezookaHider.kt index 04c4ba332d80..b908f49f852f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/RiftHorsezookaHider.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/RiftHorsezookaHider.kt @@ -15,7 +15,7 @@ class RiftHorsezookaHider { if (!SkyHanniMod.feature.rift.horsezookaHider) return if (event.entity is EntityHorse && InventoryUtils.itemInHandId.equals("HORSEZOOKA")) { - event.isCanceled = true + event.isCanceled = true } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/motes/ShowMotesNpcSellPrice.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/motes/ShowMotesNpcSellPrice.kt index 53b7b56f91f9..47c002c926a0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/motes/ShowMotesNpcSellPrice.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/motes/ShowMotesNpcSellPrice.kt @@ -156,7 +156,7 @@ class ShowMotesNpcSellPrice { add("§6Value per: §d$valuePer Motes") add("§6Total in chest: §d${(value / valuePer).toInt()}") add("") - add("§6Total value: §d$price") + add("§6Total value: §d$price coins") } add(Renderable.hoverTips("§6${stack.displayName}: §b$price", tips, indexes = index, stack = stack)) }) diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerProfitTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerProfitTracker.kt index c05839ba6cca..7a49e4ddd4c6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerProfitTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerProfitTracker.kt @@ -1,108 +1,76 @@ package at.hannibal2.skyhanni.features.slayer import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.config.Storage import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.events.GuiRenderEvent -import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.events.ItemAddEvent import at.hannibal2.skyhanni.events.PurseChangeCause import at.hannibal2.skyhanni.events.PurseChangeEvent import at.hannibal2.skyhanni.events.RepositoryReloadEvent -import at.hannibal2.skyhanni.events.SackChangeEvent import at.hannibal2.skyhanni.events.SlayerChangeEvent import at.hannibal2.skyhanni.events.SlayerQuestCompleteEvent -import at.hannibal2.skyhanni.events.entity.ItemAddInInventoryEvent -import at.hannibal2.skyhanni.features.bazaar.BazaarApi.Companion.getBazaarData -import at.hannibal2.skyhanni.test.PriceSource -import at.hannibal2.skyhanni.utils.KeyboardManager import at.hannibal2.skyhanni.utils.LorenzLogger import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList -import at.hannibal2.skyhanni.utils.LorenzUtils.addSelector -import at.hannibal2.skyhanni.utils.LorenzUtils.sortedDesc import at.hannibal2.skyhanni.utils.NEUInternalName -import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName -import at.hannibal2.skyhanni.utils.NEUItems.getNpcPriceOrNull -import at.hannibal2.skyhanni.utils.NEUItems.getPriceOrNull import at.hannibal2.skyhanni.utils.NumberUtil import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators -import at.hannibal2.skyhanni.utils.SimpleTimeMark -import at.hannibal2.skyhanni.utils.StringUtils -import at.hannibal2.skyhanni.utils.StringUtils.matches import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.jsonobjects.SlayerProfitTrackerItemsJson import at.hannibal2.skyhanni.utils.renderables.Renderable -import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker -import at.hannibal2.skyhanni.utils.tracker.TrackerData +import at.hannibal2.skyhanni.utils.tracker.ItemTrackerData +import at.hannibal2.skyhanni.utils.tracker.SkyHanniItemTracker +import com.google.gson.JsonObject +import com.google.gson.JsonPrimitive import com.google.gson.annotations.Expose import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.seconds object SlayerProfitTracker { private val config get() = SkyHanniMod.feature.slayer.itemProfitTracker - private val diceRollChatPattern = - "§eYour §r§(5|6High Class )Archfiend Dice §r§erolled a §r§.(?.)§r§e! Bonus: §r§.(?.*)❤".toPattern() - - private val ARCHFIEND_DICE = "ARCHFIEND_DICE".asInternalName() - private val HIGH_CLASS_ARCHFIEND_DICE = "HIGH_CLASS_ARCHFIEND_DICE".asInternalName() - private var itemLogCategory = "" private var baseSlayerType = "" private val logger = LorenzLogger("slayer/profit_tracker") - private var lastClickDelay = 0L - private val trackers = mutableMapOf>() + private val trackers = mutableMapOf>() - class Data : TrackerData() { - override fun reset() { - items.clear() - mobKillCoins = 0 + class Data : ItemTrackerData() { + override fun resetItems() { slayerSpawnCost = 0 slayerCompletedCount = 0 } - @Expose - var items: MutableMap = HashMap() - - @Expose - var mobKillCoins: Long = 0 - @Expose var slayerSpawnCost: Long = 0 @Expose var slayerCompletedCount = 0 - class SlayerItem { - @Expose - var internalName: NEUInternalName? = null - - @Expose - var timesDropped: Long = 0 + override fun getDescription(timesDropped: Long): List { + val percentage = timesDropped.toDouble() / slayerCompletedCount + val perBoss = LorenzUtils.formatPercentage(percentage.coerceAtMost(1.0)) - @Expose - var totalAmount: Long = 0 + return listOf( + "§7Dropped §e${timesDropped.addSeparators()} §7times.", + "§7Your drop rate: §c$perBoss", + ) + } - @Expose - var hidden = false + override fun getCoinName(item: TrackedItem) = "§6Mob Kill Coins" - override fun toString() = "SlayerItem{" + - "internalName='" + internalName + '\'' + - ", timesDropped=" + timesDropped + - ", totalAmount=" + totalAmount + - ", hidden=" + hidden + - '}' + override fun getCoinDescription(item: TrackedItem): List { + val mobKillCoinsFormat = NumberUtil.format(item.totalAmount) + return listOf( + "§7Killing mobs gives you coins (more with scavenger).", + "§7You got §6$mobKillCoinsFormat coins §7way." + ) } - - override fun toString() = "SlayerProfitTracker.Data{" + - "items=" + items + - ", mobKillCoins=" + mobKillCoins + - ", slayerSpawnCost=" + slayerSpawnCost + - ", slayerCompletedCount=" + slayerCompletedCount + - '}' } + private val ItemTrackerData.TrackedItem.timesDropped get() = timesGained + private fun addSlayerCosts(price: Int) { getTracker()?.modify { it.slayerSpawnCost += price @@ -139,21 +107,14 @@ object SlayerProfitTracker { } private fun addMobKillCoins(coins: Int) { - getTracker()?.modify { - it.mobKillCoins += coins - } + getTracker()?.addCoins(coins) } private fun addItemPickup(internalName: NEUInternalName, stackSize: Int) { - getTracker()?.modify { - val slayerItem = it.items.getOrPut(internalName) { Data.SlayerItem() } - - slayerItem.timesDropped++ - slayerItem.totalAmount += stackSize - } + getTracker()?.addItem(internalName, stackSize) } - private fun getTracker(): SkyHanniTracker? { + private fun getTracker(): SkyHanniItemTracker? { if (itemLogCategory == "") return null return trackers.getOrPut(itemLogCategory) { @@ -162,7 +123,7 @@ object SlayerProfitTracker { itemLogCategory ) { Data() } } - SkyHanniTracker("$itemLogCategory Profit Tracker", { Data() }, getStorage) { drawDisplay(it) } + SkyHanniItemTracker("$itemLogCategory Profit Tracker", { Data() }, getStorage) { drawDisplay(it) } } } @@ -174,46 +135,14 @@ object SlayerProfitTracker { } @SubscribeEvent - fun onSackChange(event: SackChangeEvent) { - if (!isEnabled()) return - if (!SlayerAPI.isInCorrectArea) return - if (!SlayerAPI.hasActiveSlayerQuest()) return - - for (sackChange in event.sackChanges) { - val change = sackChange.delta - if (change > 0) { - val internalName = sackChange.internalName - addItem(internalName, change) - } - } - } - - @SubscribeEvent - fun onItemAdd(event: ItemAddInInventoryEvent) { + fun onItemAdd(event: ItemAddEvent) { if (!isEnabled()) return if (!SlayerAPI.isInCorrectArea) return if (!SlayerAPI.hasActiveSlayerQuest()) return val internalName = event.internalName - if (internalName == ARCHFIEND_DICE || internalName == HIGH_CLASS_ARCHFIEND_DICE) { - if (lastDiceRoll.passedSince() < 500.milliseconds) { - return - } - } - - addItem(internalName, event.amount) - } - - private var lastDiceRoll = SimpleTimeMark.farPast() - - @SubscribeEvent - fun onChat(event: LorenzChatEvent) { - if (diceRollChatPattern.matches(event.message)) { - lastDiceRoll = SimpleTimeMark.now() - } - } + val amount = event.amount - private fun addItem(internalName: NEUInternalName, amount: Int) { if (!isAllowedItem(internalName)) { LorenzUtils.debug("Ignored non-slayer item pickup: '$internalName' '$itemLogCategory'") return @@ -239,82 +168,19 @@ object SlayerProfitTracker { val tracker = getTracker() ?: return@buildList addAsSingletonList("§e§l$itemLogCategory Profit Tracker") - var profit = 0.0 - val map = mutableMapOf() - for ((internalName, itemProfit) in itemLog.items) { - val amount = itemProfit.totalAmount - - val price = (getPrice(internalName) * amount).toLong() - - val cleanName = SlayerAPI.getNameWithEnchantmentFor(internalName) - var name = cleanName - val priceFormat = NumberUtil.format(price) - val hidden = itemProfit.hidden - if (hidden) { - while (name.startsWith("§f")) { - name = name.substring(2) - } - name = StringUtils.addFormat(name, "§m") - } - val text = " §7${amount.addSeparators()}x $name§7: §6$priceFormat" - - val timesDropped = itemProfit.timesDropped - val percentage = timesDropped.toDouble() / itemLog.slayerCompletedCount - val perBoss = LorenzUtils.formatPercentage(percentage.coerceAtMost(1.0)) - - val renderable = if (tracker.isInventoryOpen()) Renderable.clickAndHover( - text, listOf( - "§7Dropped §e${timesDropped.addSeparators()} §7times.", - "§7Your drop rate: §c$perBoss", - "", - "§eClick to " + (if (hidden) "show" else "hide") + "!", - "§eControl + Click to remove this item!", - ) - ) { - if (System.currentTimeMillis() > lastClickDelay + 150) { - - if (KeyboardManager.isControlKeyDown()) { - itemLog.items.remove(internalName) - LorenzUtils.chat("Removed $cleanName §efrom slayer profit display.") - lastClickDelay = System.currentTimeMillis() + 500 - } else { - itemProfit.hidden = !hidden - lastClickDelay = System.currentTimeMillis() - } - tracker.update() - } - } else Renderable.string(text) - if (tracker.isInventoryOpen() || !hidden) { - map[renderable] = price - } - profit += price - } - val mobKillCoins = itemLog.mobKillCoins - if (mobKillCoins != 0L) { - val mobKillCoinsFormat = NumberUtil.format(mobKillCoins) - map[Renderable.hoverTips( - " §7Mob kill coins: §6$mobKillCoinsFormat", - listOf( - "§7Killing mobs gives you coins (more with scavenger)", - "§7You got §e$mobKillCoinsFormat §7coins in total this way" - ) - )] = mobKillCoins - profit += mobKillCoins - } + var profit = tracker.drawItems(itemLog, { true }, this) val slayerSpawnCost = itemLog.slayerSpawnCost if (slayerSpawnCost != 0L) { val mobKillCoinsFormat = NumberUtil.format(slayerSpawnCost) - map[Renderable.hoverTips( - " §7Slayer Spawn Costs: §c$mobKillCoinsFormat", - listOf("§7You paid §c$mobKillCoinsFormat §7in total", "§7for starting the slayer quests.") - )] = slayerSpawnCost + addAsSingletonList( + Renderable.hoverTips( + " §7Slayer Spawn Costs: §c$mobKillCoinsFormat", + listOf("§7You paid §c$mobKillCoinsFormat §7in total", "§7for starting the slayer quests.") + ) + ) profit += slayerSpawnCost } - for (text in map.sortedDesc().keys) { - addAsSingletonList(text) - } - val slayerCompletedCount = itemLog.slayerCompletedCount addAsSingletonList( Renderable.hoverTips( @@ -329,27 +195,21 @@ object SlayerProfitTracker { val profitPerBoss = profit / itemLog.slayerCompletedCount val profitPerBossFormat = NumberUtil.format(profitPerBoss) - val text = "§eTotal Profit: $profitPrefix$profitFormat" + val text = "§eTotal Profit: $profitPrefix$profitFormat coins" addAsSingletonList(Renderable.hoverTips(text, listOf("§7Profit per boss: $profitPrefix$profitPerBossFormat"))) - if (tracker.isInventoryOpen()) { - addSelector( - "", - getName = { type -> type.displayName }, - isCurrent = { it.ordinal == config.priceFrom }, - onChange = { - config.priceFrom = it.ordinal - tracker.update() - } - ) - } + tracker.addPriceFromButton(this) } - private fun getPrice(internalName: NEUInternalName) = when (config.priceFrom) { - 0 -> internalName.getBazaarData()?.sellPrice ?: internalName.getPriceOrNull() ?: 0.0 - 1 -> internalName.getBazaarData()?.buyPrice ?: internalName.getPriceOrNull() ?: 0.0 + val coinFormat: (ItemTrackerData.TrackedItem) -> Pair> = { item -> + val mobKillCoinsFormat = NumberUtil.format(item.totalAmount) + val text = " §6Mob kill coins§7: §6$mobKillCoinsFormat" + val lore = listOf( + "§7Killing mobs gives you coins (more with scavenger)", + "§7You got §e$mobKillCoinsFormat §7coins in total this way" + ) - else -> internalName.getNpcPriceOrNull() ?: 0.0 + text to lore } @SubscribeEvent @@ -360,6 +220,29 @@ object SlayerProfitTracker { getTracker()?.renderDisplay(config.pos) } + @SubscribeEvent + fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) { + event.move(10, "#profile.slayerProfitData", "#profile.slayerProfitData") { old -> + for (data in old.asJsonObject.entrySet().map { it.value.asJsonObject }) { + val items = data.get("items").asJsonObject + for (item in items.entrySet().map { it.value.asJsonObject }) { + val oldValue = item.get("timesDropped") + item.add("timesGained", oldValue) + } + + val coinAmount = data.get("mobKillCoins") + val coins = JsonObject() + coins.add("internalName", JsonPrimitive("SKYBLOCK_COIN")) + coins.add("timesDropped", JsonPrimitive(1)) + coins.add("totalAmount", coinAmount) + items.add("SKYBLOCK_COIN", coins) + } + + old + } + + } + fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled fun clearProfitCommand(args: Array) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerRngMeterDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerRngMeterDisplay.kt index 966b8bdaad1e..b26fd4c09a20 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerRngMeterDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerRngMeterDisplay.kt @@ -116,7 +116,8 @@ class SlayerRngMeterDisplay { val storage = getStorage() ?: return - val selectedItem = event.inventoryItems.values.find { item -> item.getLore().any { it.contains("§a§lSELECTED") } } + val selectedItem = + event.inventoryItems.values.find { item -> item.getLore().any { it.contains("§a§lSELECTED") } } if (selectedItem == null) { storage.itemGoal = "" storage.goalNeeded = -1 diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerType.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerType.kt index 4d5d9fa34f3f..44937dd7fb29 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerType.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerType.kt @@ -15,7 +15,4 @@ enum class SlayerType(val displayName: String, val clazz: Class<*>) { INFERNO("Inferno Demonlord", EntityBlaze::class.java), VAMPIRE("Riftstalker Bloodfiend", EntityOtherPlayerMP::class.java) ; - - companion object { - } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerFirePitsWarning.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerFirePitsWarning.kt index 4d14238805e6..74c15c271b2b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerFirePitsWarning.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerFirePitsWarning.kt @@ -51,6 +51,7 @@ class BlazeSlayerFirePitsWarning { -> { fireFirePits() } + else -> {} } } @@ -70,4 +71,4 @@ class BlazeSlayerFirePitsWarning { fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) { event.move(3, "slayer.firePitsWarning", "slayer.blazes.firePitsWarning") } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningMobManager.kt b/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningMobManager.kt index f2f0f874d887..6b4757e21cc2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningMobManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningMobManager.kt @@ -88,7 +88,7 @@ class SummoningMobManager { healthPattern.matchMatcher(name) { val playerName = LorenzUtils.getPlayerName() if (name.contains(playerName)) { - summoningMobNametags.add(it as EntityArmorStand) + summoningMobNametags.add(it) if (summoningMobNametags.size == summoningsSpawned) { searchArmorStands = false } diff --git a/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningSoulsName.kt b/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningSoulsName.kt index 8f0825188d64..6d206bf17948 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningSoulsName.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningSoulsName.kt @@ -18,12 +18,13 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class SummoningSoulsName { + // TODO repo private val texture = "ewogICJ0aW1lc3RhbXAiIDogMTYwMTQ3OTI2NjczMywKICAicHJvZmlsZUlkIiA6ICJmMzA1ZjA5NDI0NTg0ZjU" + - "4YmEyYjY0ZjAyZDcyNDYyYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJqcm9ja2EzMyIsCiAgInNpZ25hdH" + - "VyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgI" + - "nVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YWY0MDM1ZWMwZGMx" + - "NjkxNzc4ZDVlOTU4NDAxNzAyMjdlYjllM2UyOTQzYmVhODUzOTI5Y2U5MjNjNTk4OWFkIgogICAgfQogIH0KfQ" + "4YmEyYjY0ZjAyZDcyNDYyYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJqcm9ja2EzMyIsCiAgInNpZ25hdH" + + "VyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgI" + + "nVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YWY0MDM1ZWMwZGMx" + + "NjkxNzc4ZDVlOTU4NDAxNzAyMjdlYjllM2UyOTQzYmVhODUzOTI5Y2U5MjNjNTk4OWFkIgogICAgfQogIH0KfQ" private val souls = mutableMapOf() private val mobsLastLocation = mutableMapOf() @@ -89,4 +90,4 @@ class SummoningSoulsName { } private fun isEnabled() = LorenzUtils.inSkyBlock && SkyHanniMod.feature.combat.summonings.summoningSoulDisplay -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt b/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt index a2fc3ad7660c..d8a4e8344eb3 100644 --- a/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt +++ b/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt @@ -44,7 +44,7 @@ object FontRendererHook { * [FontRenderer#drawString()][net.minecraft.client.gui.FontRenderer.drawString] rather than a custom font renderer * */ - fun setupChromaFont() { + private fun setupChromaFont() { DRAW_CHROMA.startChroma() DRAW_CHROMA_SHADOW.startChroma() } @@ -52,7 +52,7 @@ object FontRendererHook { /** * See [setupChromaFont] */ - fun endChromaFont() { + private fun endChromaFont() { DRAW_CHROMA.endChroma() DRAW_CHROMA_SHADOW.endChroma() } @@ -98,7 +98,7 @@ object FontRendererHook { } @JvmStatic - fun forceWhiteColorCode(i1: Int) : Int { + fun forceWhiteColorCode(i1: Int): Int { if (!LorenzUtils.inSkyBlock) return i1 if (!SkyHanniMod.feature.chroma.enabled) return i1 @@ -141,8 +141,16 @@ object FontRendererHook { return if (LorenzUtils.inSkyBlock && !SkyHanniMod.feature.chroma.enabled) constant else "0123456789abcdefklmnorz" } + // TODO add better parameter names @JvmStatic - fun toggleChromaCondition_shouldResetStyles(text: String, shadow: Boolean, ci: CallbackInfo, i: Int, c0: Char, i1: Int): Boolean { + fun toggleChromaCondition_shouldResetStyles( + text: String, + shadow: Boolean, + ci: CallbackInfo, + i: Int, + c0: Char, + i1: Int + ): Boolean { if (!LorenzUtils.inSkyBlock) return false if (!SkyHanniMod.feature.chroma.enabled) return false if (i1 == 22) { @@ -151,4 +159,4 @@ object FontRendererHook { } return false } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinFontRenderer.java b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinFontRenderer.java index 2b3d87c5cafb..b8a759ed082b 100644 --- a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinFontRenderer.java +++ b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinFontRenderer.java @@ -37,8 +37,8 @@ public String insertZColorCode(String constant) { * Inject call to {@link FontRendererHook#restoreChromaState()} after 1st and 3rd fontrenderer.italicStyle = ___ call */ @Inject(method = "renderStringAtPos", at = { - @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/gui/FontRenderer;italicStyle:Z", ordinal = 0, shift = At.Shift.AFTER), - @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/gui/FontRenderer;italicStyle:Z", ordinal = 2, shift = At.Shift.AFTER)}) + @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/gui/FontRenderer;italicStyle:Z", ordinal = 0, shift = At.Shift.AFTER), + @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/gui/FontRenderer;italicStyle:Z", ordinal = 2, shift = At.Shift.AFTER)}) public void insertRestoreChromaState(CallbackInfo ci) { FontRendererHook.restoreChromaState(); } diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/gui/MixinGuiContainer.java b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/gui/MixinGuiContainer.java index ed106f6f140b..57fd96a7050c 100644 --- a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/gui/MixinGuiContainer.java +++ b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/gui/MixinGuiContainer.java @@ -52,12 +52,12 @@ private void onMouseClick(Slot slot, int slotId, int clickedButton, int clickTyp } @Inject(method = "drawScreen", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/player/InventoryPlayer;getItemStack()Lnet/minecraft/item/ItemStack;", - shift = At.Shift.BEFORE, - ordinal = 1 - ) + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/player/InventoryPlayer;getItemStack()Lnet/minecraft/item/ItemStack;", + shift = At.Shift.BEFORE, + ordinal = 1 + ) ) public void drawScreen_after(int mouseX, int mouseY, float partialTicks, CallbackInfo ci) { skyHanni$hook.onDrawScreenAfter(mouseX, mouseY, ci); diff --git a/src/main/java/at/hannibal2/skyhanni/test/SkyHanniConfigSearchResetCommand.kt b/src/main/java/at/hannibal2/skyhanni/test/SkyHanniConfigSearchResetCommand.kt index 0534c2a72bb6..6f1bc9f64b5b 100644 --- a/src/main/java/at/hannibal2/skyhanni/test/SkyHanniConfigSearchResetCommand.kt +++ b/src/main/java/at/hannibal2/skyhanni/test/SkyHanniConfigSearchResetCommand.kt @@ -182,7 +182,7 @@ object SkyHanniConfigSearchResetCommand { if (!classFilter(className)) continue val objectName = obj.getObjectName() if (obj !is Runnable && objectName.startsWith(className) && (objectName.startsWith("at.hannibal2.skyhanni.config.features.") || - objectName.startsWith("at.hannibal2.skyhanni.config.Storage")) + objectName.startsWith("at.hannibal2.skyhanni.config.Storage")) ) { "" } else { @@ -244,8 +244,7 @@ object SkyHanniConfigSearchResetCommand { if (this is Runnable) return "Runnable" // we don't use javaClass.simpleName since we want to catch edge cases - val name = javaClass.name - return when (name) { + return when (val name = javaClass.name) { "at.hannibal2.skyhanni.config.core.config.Position" -> "Position" "java.lang.Boolean" -> "Boolean" "java.lang.Integer" -> "Int" diff --git a/src/main/java/at/hannibal2/skyhanni/test/SkyHanniDebugsAndTests.kt b/src/main/java/at/hannibal2/skyhanni/test/SkyHanniDebugsAndTests.kt index e6cb3e84131c..de6ffef21371 100644 --- a/src/main/java/at/hannibal2/skyhanni/test/SkyHanniDebugsAndTests.kt +++ b/src/main/java/at/hannibal2/skyhanni/test/SkyHanniDebugsAndTests.kt @@ -62,11 +62,11 @@ class SkyHanniDebugsAndTests { val debugLogger = LorenzLogger("debug/test") - fun runn(compound: NBTTagCompound, text: String) { + private fun run(compound: NBTTagCompound, text: String) { print("$text'$compound'") for (s in compound.keySet) { val element = compound.getCompoundTag(s) - runn(element, "$text ") + run(element, "$text ") } } @@ -250,6 +250,14 @@ class SkyHanniDebugsAndTests { LorenzUtils.chat("stopped ${modules.size} listener classes.") } + fun whereami() { + if (LorenzUtils.inSkyBlock) { + LorenzUtils.chat("§eYou are currently in ${LorenzUtils.skyBlockIsland}.") + return + } + LorenzUtils.chat("§eYou are not in Skyblock.") + } + fun copyLocation(args: Array) { val location = LocationUtils.playerLocation() val x = LorenzUtils.formatDouble(location.x + 0.001).replace(",", ".") diff --git a/src/main/java/at/hannibal2/skyhanni/test/command/CopyNearbyParticlesCommand.kt b/src/main/java/at/hannibal2/skyhanni/test/command/CopyNearbyParticlesCommand.kt index fa7fc2e6ebfd..67b28f0aaffd 100644 --- a/src/main/java/at/hannibal2/skyhanni/test/command/CopyNearbyParticlesCommand.kt +++ b/src/main/java/at/hannibal2/skyhanni/test/command/CopyNearbyParticlesCommand.kt @@ -65,7 +65,7 @@ object CopyNearbyParticlesCommand { resultList.add("particle arguments: ${packet.particleArgs.asList()}") resultList.add("") resultList.add("") - counter ++ + counter++ } } } diff --git a/src/main/java/at/hannibal2/skyhanni/test/command/CopyScoreboardCommand.kt b/src/main/java/at/hannibal2/skyhanni/test/command/CopyScoreboardCommand.kt index 7436ac7f63dd..b940d19487bf 100644 --- a/src/main/java/at/hannibal2/skyhanni/test/command/CopyScoreboardCommand.kt +++ b/src/main/java/at/hannibal2/skyhanni/test/command/CopyScoreboardCommand.kt @@ -11,11 +11,11 @@ object CopyScoreboardCommand { val resultList = mutableListOf() val noColor = args.size == 1 && args[0] == "true" resultList.add("Title:") - resultList.add(ScoreboardData.objectiveTitle.transformIf({noColor}) { removeColor() }) + resultList.add(ScoreboardData.objectiveTitle.transformIf({ noColor }) { removeColor() }) resultList.add("") for (line in ScoreboardData.sidebarLinesFormatted) { - val scoreboardLine = line.transformIf({noColor}) { removeColor() } + val scoreboardLine = line.transformIf({ noColor }) { removeColor() } resultList.add("'$scoreboardLine'") } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/APIUtil.kt b/src/main/java/at/hannibal2/skyhanni/utils/APIUtil.kt index 5e935b407324..1801e7802f75 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/APIUtil.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/APIUtil.kt @@ -41,9 +41,13 @@ object APIUtil { .useSystemProperties() fun getJSONResponse(urlString: String, silentError: Boolean = false) = - getJSONResponseAsElement(urlString, silentError) as JsonObject + getJSONResponseAsElement(urlString, silentError) as JsonObject - fun getJSONResponseAsElement(urlString: String, silentError: Boolean = false, apiName: String = "Hypixel API"): JsonElement { + fun getJSONResponseAsElement( + urlString: String, + silentError: Boolean = false, + apiName: String = "Hypixel API" + ): JsonElement { val client = builder.build() try { client.execute(HttpGet(urlString)).use { response -> diff --git a/src/main/java/at/hannibal2/skyhanni/utils/BlockUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/BlockUtils.kt index 5a14cadf743a..5b8c8a0c0f46 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/BlockUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/BlockUtils.kt @@ -48,9 +48,9 @@ object BlockUtils { return result?.blockPos?.toLorenzVec() } - fun getBlockLookingAt(duration: Double = 10.0) = rayTrace( + fun getBlockLookingAt(distance: Double = 10.0) = rayTrace( LocationUtils.playerEyeLocation(), Minecraft.getMinecraft().thePlayer.lookVec.toLorenzVec(), - duration + distance ) -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/CachedItemData.kt b/src/main/java/at/hannibal2/skyhanni/utils/CachedItemData.kt index 8f05d64ecbac..9d00958f2a14 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/CachedItemData.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/CachedItemData.kt @@ -1,11 +1,24 @@ package at.hannibal2.skyhanni.utils data class CachedItemData( - /** -1 = not loaded */ var petCandies: Int? = -1, - /** "" = not loaded */ var heldItem: String? = "", - /** -1 = not loaded */ var sackInASack: Int? = -1, - /** null = not loaded */ var riftTransferable: Boolean? = null, - /** null = not loaded */ var riftExportable: Boolean? = null, - /** null = not loaded */ var itemRarityLastCheck: Long = 0L, // Cant use SimpleTimeMark here - /** null = not loaded */ var itemRarity: LorenzRarity? = null, -) \ No newline at end of file + // -1 = not loaded + var petCandies: Int? = -1, + + // "" = not loaded + var heldItem: String? = "", + + // -1 = not loaded + var sackInASack: Int? = -1, + + // null = not loaded + var riftTransferable: Boolean? = null, + + // null = not loaded + var riftExportable: Boolean? = null, + + // null = not loaded + var itemRarityLastCheck: Long = 0L, // Cant use SimpleTimeMark here + + // null = not loaded + var itemRarity: LorenzRarity? = null, +) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt b/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt new file mode 100644 index 000000000000..0fa9152cd0ad --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt @@ -0,0 +1,21 @@ +package at.hannibal2.skyhanni.utils + +import kotlin.time.Duration + +object DelayedRun { + val map = mutableMapOf<() -> Any, SimpleTimeMark>() + + fun runDelayed(duration: Duration, run: () -> Unit) { + map[run] = SimpleTimeMark.now() + duration + } + + fun checkRuns() { + map.entries.removeIf { (runnable, time) -> + val inPast = time.isInPast() + if (inPast) { + runnable() + } + inPast + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/EntityOutlineRenderer.kt b/src/main/java/at/hannibal2/skyhanni/utils/EntityOutlineRenderer.kt index fbe2f1e969ec..28fc08807cfa 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/EntityOutlineRenderer.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/EntityOutlineRenderer.kt @@ -104,13 +104,13 @@ object EntityOutlineRenderer { mc.renderManager.setRenderOutlines(true) // Enable outline mode - GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE); - GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL11.GL_REPLACE); - GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL13.GL_CONSTANT); - GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); - GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, GL11.GL_REPLACE); - GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE); - GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); + GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE) + GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL11.GL_REPLACE) + GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL13.GL_CONSTANT) + GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR) + GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, GL11.GL_REPLACE) + GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE) + GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA) // Render x-ray outlines first, ignoring the depth buffer bit if (!isXrayCacheEmpty()) { @@ -293,7 +293,7 @@ object EntityOutlineRenderer { // Only render the view entity when sleeping or in 3rd person mode if (entity === mc.renderViewEntity && !(mc.renderViewEntity is EntityLivingBase && (mc.renderViewEntity as EntityLivingBase).isPlayerSleeping || - mc.gameSettings.thirdPersonView != 0) + mc.gameSettings.thirdPersonView != 0) ) { false } else mc.theWorld.isBlockLoaded(BlockPos(entity)) && (mc.renderManager.shouldRender( @@ -339,7 +339,7 @@ object EntityOutlineRenderer { } } - fun isCacheEmpty() = isXrayCacheEmpty() && isNoXrayCacheEmpty() + private fun isCacheEmpty() = isXrayCacheEmpty() && isNoXrayCacheEmpty() private fun isXrayCacheEmpty() = entityRenderCache.xrayCache?.isEmpty() ?: true private fun isNoXrayCacheEmpty() = entityRenderCache.noXrayCache?.isEmpty() ?: true @@ -361,12 +361,12 @@ object EntityOutlineRenderer { */ @SubscribeEvent fun onTick(event: LorenzTickEvent) { - if (!(event.phase == EventPriority.NORMAL && isEnabled())) return; + if (!(event.phase == EventPriority.NORMAL && isEnabled())) return val renderGlobal = try { mc.renderGlobal as CustomRenderGlobal } catch (e: NoClassDefFoundError) { - ErrorManager.logError(e, "Unable to enable entity outlines, the required mixin is not loaded") + ErrorManager.logErrorWithData(e, "Unable to enable entity outlines, the required mixin is not loaded") isMissingMixin = true return } @@ -406,4 +406,4 @@ object EntityOutlineRenderer { var noXrayCache: HashMap?, var noOutlineCache: HashSet? ) -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/GuiRenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/GuiRenderUtils.kt index c485ec20bb8e..5e4a6345287d 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/GuiRenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/GuiRenderUtils.kt @@ -180,7 +180,15 @@ object GuiRenderUtils { ) } - fun renderItemAndTip(list: MutableList, item: ItemStack?, x: Int, y: Int, mouseX: Int, mouseY: Int, color: Int = 0xFF43464B.toInt()) { + fun renderItemAndTip( + list: MutableList, + item: ItemStack?, + x: Int, + y: Int, + mouseX: Int, + mouseY: Int, + color: Int = 0xFF43464B.toInt() + ) { GuiScreen.drawRect(x, y, x + 16, y + 16, color) if (item != null) { renderItemStack(item, x, y) @@ -276,8 +284,10 @@ object GuiRenderUtils { } fun drawScaledRec(left: Int, top: Int, right: Int, bottom: Int, colour: Int, inverseScale: Float) { - GuiScreen.drawRect((left * inverseScale).toInt(), (top * inverseScale).toInt(), - (right * inverseScale).toInt(), (bottom * inverseScale).toInt(), colour) + GuiScreen.drawRect( + (left * inverseScale).toInt(), (top * inverseScale).toInt(), + (right * inverseScale).toInt(), (bottom * inverseScale).toInt(), colour + ) } fun renderItemAndBackground(item: ItemStack, x: Int, y: Int, colour: Int) { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/InventoryUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/InventoryUtils.kt index 2a6b002af467..be29569a5453 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/InventoryUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/InventoryUtils.kt @@ -45,7 +45,7 @@ object InventoryUtils { fun inStorage() = openInventoryName().let { (it.contains("Storage") && !it.contains("Rift Storage")) - || it.contains("Ender Chest") || it.contains("Backpack") + || it.contains("Ender Chest") || it.contains("Backpack") } fun getItemInHand(): ItemStack? = Minecraft.getMinecraft().thePlayer.heldItem diff --git a/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt index fafb41c966bd..e6929d737c1c 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt @@ -6,9 +6,8 @@ import net.minecraft.util.AxisAlignedBB object LocationUtils { - fun canSee(a: LorenzVec, b: LorenzVec): Boolean { - return Minecraft.getMinecraft().theWorld.rayTraceBlocks(a.toVec3(), b.toVec3(), false, true, false) == null - } + fun canSee(a: LorenzVec, b: LorenzVec) = + Minecraft.getMinecraft().theWorld.rayTraceBlocks(a.toVec3(), b.toVec3(), false, true, false) == null fun playerLocation() = Minecraft.getMinecraft().thePlayer.getLorenzVec() diff --git a/src/main/java/at/hannibal2/skyhanni/utils/MinecraftConsoleFilter.kt b/src/main/java/at/hannibal2/skyhanni/utils/MinecraftConsoleFilter.kt index ee373d6b14e2..3aa432cde16f 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/MinecraftConsoleFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/MinecraftConsoleFilter.kt @@ -73,9 +73,9 @@ class MinecraftConsoleFilter(private val loggerConfigName: String) : Filter { } } if (loggerName == "AsmHelper" && filterConfig.filterAmsHelperTransformer) { - if (formattedMessage.startsWith("Transforming class ")) { - filterConsole("AsmHelper Transforming") - return Filter.Result.DENY + if (formattedMessage.startsWith("Transforming class ")) { + filterConsole("AsmHelper Transforming") + return Filter.Result.DENY } if (filterConfig.filterAsmHelperApplying && formattedMessage.startsWith("Applying AsmWriter ModifyWriter")) { filterConsole("AsmHelper Applying AsmWriter") @@ -118,7 +118,7 @@ class MinecraftConsoleFilter(private val loggerConfigName: String) : Filter { } } - if (thrown != null && filterConfig.filterScoreboardErrors) { + if (thrown != null && filterConfig.filterScoreboardErrors) { val cause = thrown.cause if (cause != null && cause.stackTrace.isNotEmpty()) { val first = cause.stackTrace[0] @@ -241,13 +241,25 @@ class MinecraftConsoleFilter(private val loggerConfigName: String) : Filter { fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) { event.move(3, "dev.printUnfilteredDebugs", "dev.minecraftConsoles.printUnfilteredDebugs") event.move(3, "dev.logUnfilteredFile", "dev.minecraftConsoles.logUnfilteredFile") - event.move(3, "dev.printUnfilteredDebugsOutsideSkyBlock", "dev.minecraftConsoles.printUnfilteredDebugsOutsideSkyBlock") + event.move( + 3, + "dev.printUnfilteredDebugsOutsideSkyBlock", + "dev.minecraftConsoles.printUnfilteredDebugsOutsideSkyBlock" + ) event.move(3, "dev.printFilteredReason", "dev.minecraftConsoles.printFilteredReason") event.move(3, "dev.filterChat", "dev.minecraftConsoles.consoleFilter.filterChat") event.move(3, "dev.filterGrowBuffer", "dev.minecraftConsoles.consoleFilter.filterGrowBuffer") event.move(3, "dev.filterUnknownSound", "dev.minecraftConsoles.consoleFilter.filterUnknownSound") - event.move(3, "dev.filterParticleVillagerHappy", "dev.minecraftConsoles.consoleFilter.filterParticleVillagerHappy") - event.move(3, "dev.filterAmsHelperTransformer", "dev.minecraftConsoles.consoleFilter.filterAmsHelperTransformer") + event.move( + 3, + "dev.filterParticleVillagerHappy", + "dev.minecraftConsoles.consoleFilter.filterParticleVillagerHappy" + ) + event.move( + 3, + "dev.filterAmsHelperTransformer", + "dev.minecraftConsoles.consoleFilter.filterAmsHelperTransformer" + ) event.move(3, "dev.filterAsmHelperApplying", "dev.minecraftConsoles.consoleFilter.filterAsmHelperApplying") event.move(3, "dev.filterBiomeIdBounds", "dev.minecraftConsoles.consoleFilter.filterBiomeIdBounds") event.move(3, "dev.filterScoreboardErrors", "dev.minecraftConsoles.consoleFilter.filterScoreboardErrors") diff --git a/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt b/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt index e5c45bab1d8a..007d9f1d5b51 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt @@ -185,8 +185,8 @@ object NEUItems { ErrorManager.logError( IllegalStateException("Something went wrong!"), "Encountered an error getting the item for §7$this§c. " + - "This may be because your NEU repo is outdated. Please ask in the SkyHanni " + - "Discord if this is the case" + "This may be because your NEU repo is outdated. Please ask in the SkyHanni " + + "Discord if this is the case" ) fallbackItem } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt b/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt index d03455ac9d7a..41e5f49232ff 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt @@ -204,6 +204,6 @@ object NumberUtil { } val Int.milion get() = this * 1_000_000.0 - val Int.bilion get() = this * 1_000_000_000.0 + private val Int.bilion get() = this * 1_000_000_000.0 val Double.milion get() = (this * 1_000_000.0).toLong() } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/ParkourHelper.kt b/src/main/java/at/hannibal2/skyhanni/utils/ParkourHelper.kt index c9903ffc2770..68f7a0d496e7 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/ParkourHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/ParkourHelper.kt @@ -53,7 +53,9 @@ class ParkourHelper( if (visible) { for ((index, location) in locations.withIndex()) { - if (location.offsetCenter().distanceToPlayer() < detectionRange && Minecraft.getMinecraft().thePlayer.onGround) { + val onGround = Minecraft.getMinecraft().thePlayer.onGround + val closeEnough = location.offsetCenter().distanceToPlayer() < detectionRange + if (closeEnough && onGround) { current = index } } @@ -146,4 +148,4 @@ class ParkourHelper( private fun colorForIndex(index: Int) = if (rainbowColor) { RenderUtils.chromaColor(4.seconds, offset = -index / 12f, brightness = 0.7f) } else monochromeColor -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt index 7e10b0351dea..03f552e7af70 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt @@ -374,14 +374,11 @@ object RenderUtils { val minecraft = Minecraft.getMinecraft() val renderer = minecraft.renderManager.fontRenderer - val x = offsetX - val y = offsetY - - GlStateManager.translate(x + 1.0, y + 1.0, 0.0) + GlStateManager.translate(offsetX + 1.0, offsetY + 1.0, 0.0) if (centered) { val strLen: Int = renderer.getStringWidth(string) - val x2 = x - strLen / 2f + val x2 = offsetX - strLen / 2f GL11.glTranslatef(x2, 0f, 0f) renderer.drawStringWithShadow(display, 0f, 0f, 0) GL11.glTranslatef(-x2, 0f, 0f) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/SkyBlockItemModifierUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/SkyBlockItemModifierUtils.kt index 8d600f70e061..9f65a71f12bc 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/SkyBlockItemModifierUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/SkyBlockItemModifierUtils.kt @@ -26,6 +26,8 @@ object SkyBlockItemModifierUtils { fun ItemStack.getPolarvoidBookCount() = getAttributeInt("polarvoid") + fun ItemStack.getBookwormBookCount() = getAttributeInt("bookworm_books") + fun ItemStack.getCultivatingCounter() = getAttributeLong("farmed_cultivating") fun ItemStack.getHoeCounter() = getAttributeLong("mined_crops") diff --git a/src/main/java/at/hannibal2/skyhanni/utils/SoundUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/SoundUtils.kt index 326283d92527..c9892a9bf1e7 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/SoundUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/SoundUtils.kt @@ -9,7 +9,7 @@ import net.minecraft.util.ResourceLocation object SoundUtils { private val beepSound by lazy { createSound("random.orb", 1f) } private val clickSound by lazy { createSound("gui.button.press", 1f) } - private val errorSound by lazy {createSound("mob.endermen.portal", 0f)} + private val errorSound by lazy { createSound("mob.endermen.portal", 0f) } val centuryActiveTimerAlert by lazy { createSound("skyhanni:centurytimer.active", 1f) } fun ISound.playSound() { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt index 2066b809bf06..d5365703a0b8 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt @@ -18,7 +18,8 @@ import java.util.regex.Pattern object StringUtils { // TODO USE SH-REPO private val playerChatPattern = "(?.*?)(?:§[f7r])*: .*".toPattern() - private val chatUsernamePattern = "^(?:§\\w\\[§\\w\\d+§\\w] )?(?:(?:§\\w)+\\S )?(?(?:§\\w\\[\\w.+] )?(?:§\\w)?(?\\w+))(?: (?:§\\w)?\\[.+?])?".toPattern() + private val chatUsernamePattern = + "^(?:§\\w\\[§\\w\\d+§\\w] )?(?:(?:§\\w)+\\S )?(?(?:§\\w\\[\\w.+] )?(?:§\\w)?(?\\w+))(?: (?:§\\w)?\\[.+?])?".toPattern() private val whiteSpaceResetPattern = "^(?:\\s|§r)*|(?:\\s|§r)*$".toPattern() private val whiteSpacePattern = "^\\s*|\\s*$".toPattern() private val resetPattern = "(?i)§R".toPattern() @@ -35,14 +36,18 @@ object StringUtils { return first + lowercase.substring(1) } - fun String.removeColor(): String { + private val formattingChars by lazy { "kmolnr".toCharArray() + "kmolnr".uppercase().toCharArray() } + + fun String.removeColor(keepFormatting: Boolean = false): String { val builder = StringBuilder(this.length) var counter = 0 while (counter < this.length) { if (this[counter] == '§') { - counter += 2 - continue + if (!keepFormatting || this[counter + 1] !in formattingChars) { + counter += 2 + continue + } } builder.append(this[counter]) counter++ @@ -131,7 +136,6 @@ object StringUtils { } } - fun String.removeWordsAtEnd(i: Int) = split(" ").dropLast(i).joinToString(" ") fun String.splitLines(width: Int): String { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/Timer.kt b/src/main/java/at/hannibal2/skyhanni/utils/Timer.kt index 55ea90b52302..2a6d1f5ab058 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/Timer.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/Timer.kt @@ -11,7 +11,7 @@ class Timer( private var started: SimpleTimeMark = SimpleTimeMark.now(), startPaused: Boolean = false -): Comparable { +) : Comparable { @Expose private var paused: SimpleTimeMark? = null @@ -40,4 +40,4 @@ class Timer( override fun compareTo(other: Timer): Int = remaining.compareTo(other.remaining) -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java index 6ab663941508..8e5648f5e62b 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/ContributorListJson.java @@ -1,4 +1,5 @@ package at.hannibal2.skyhanni.utils.jsonobjects; + import com.google.gson.annotations.Expose; import java.util.List; @@ -6,4 +7,4 @@ public class ContributorListJson { @Expose public List usernames; -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java new file mode 100644 index 000000000000..d17fd7d30640 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/FishingProfitItemsJson.java @@ -0,0 +1,12 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.utils.NEUInternalName; +import com.google.gson.annotations.Expose; + +import java.util.List; +import java.util.Map; + +public class FishingProfitItemsJson { + @Expose + public Map> categories; +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java index cc8bcd51d557..7bc9cf7fa9a7 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java @@ -16,6 +16,9 @@ public class GardenJson { @Expose public Map> crop_milestones; + @Expose + public Map crop_milestone_community_help; + @Expose public Map visitors; diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java index bc877658a73e..d2173c74bf43 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java @@ -27,11 +27,11 @@ public class Candidate { @Override public String toString() { return "Candidate{" + - "key='" + key + '\'' + - ", name='" + name + '\'' + - ", perks=" + perks + - ", votes=" + votes + - '}'; + "key='" + key + '\'' + + ", name='" + name + '\'' + + ", perks=" + perks + + ", votes=" + votes + + '}'; } } @@ -62,9 +62,9 @@ public static class Perk { @Override public String toString() { return "Perk{" + - "name='" + name + '\'' + - ", description='" + description + '\'' + - '}'; + "name='" + name + '\'' + + ", description='" + description + '\'' + + '}'; } } } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java index 52ed7f636f65..8053e87cb818 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/SeaCreatureJson.java @@ -9,7 +9,8 @@ public class SeaCreatureJson { - public static Type TYPE = new TypeToken>(){}.getType(); + public static Type TYPE = new TypeToken>() { + }.getType(); public static class Variant { @Expose diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt index 2a3321abce5d..9367e5ee13bf 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/Renderable.kt @@ -21,7 +21,7 @@ interface Renderable { val height: Int fun isHovered(posX: Int, posY: Int) = currentRenderPassMousePosition?.let { (x, y) -> x in (posX..posX + width) - && y in (posY..posY + height) // TODO: adjust for variable height? + && y in (posY..posY + height) // TODO: adjust for variable height? } ?: false /** @@ -35,7 +35,7 @@ interface Renderable { val list = mutableMapOf, List>() var currentRenderPassMousePosition: Pair? = null - private set + set fun withMousePosition(posX: Int, posY: Int, block: () -> T): T { val last = currentRenderPassMousePosition diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt index f198f7e7ae3d..7fb13ab86044 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/Shader.kt @@ -30,7 +30,7 @@ abstract class Shader(vertex: String, fragment: String) { if (linkStatus == GL11.GL_FALSE) { LorenzUtils.consoleLog( "Error occurred when linking program with Vertex Shader: $vertex and Fragment Shader: $fragment : " + - StringUtils.trim(ShaderHelper.glGetProgramInfoLog(shaderProgram, 1024)) + StringUtils.trim(ShaderHelper.glGetProgramInfoLog(shaderProgram, 1024)) ) } @@ -52,4 +52,4 @@ abstract class Shader(vertex: String, fragment: String) { fun registerUniform(uniformType: Uniform.UniformType, name: String, uniformValuesSupplier: Supplier) { uniforms.add(Uniform(this, uniformType, name, uniformValuesSupplier)) } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt index e554a409895b..2576b42489ce 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderHelper.kt @@ -1,7 +1,13 @@ package at.hannibal2.skyhanni.utils.shader import at.hannibal2.skyhanni.utils.LorenzUtils -import org.lwjgl.opengl.* +import org.lwjgl.opengl.ARBFragmentShader +import org.lwjgl.opengl.ARBShaderObjects +import org.lwjgl.opengl.ARBVertexShader +import org.lwjgl.opengl.ContextCapabilities +import org.lwjgl.opengl.GL11 +import org.lwjgl.opengl.GL20 +import org.lwjgl.opengl.GLContext /** * Class to check shaders support, OpenGL capabilities, and shader helper functions @@ -27,9 +33,9 @@ class ShaderHelper { // Check OpenGL 2.0 Capabilities val openGL20supported = capabilities.OpenGL20 SHADERS_SUPPORTED = openGL20supported || - capabilities.GL_ARB_vertex_shader && - capabilities.GL_ARB_fragment_shader && - capabilities.GL_ARB_shader_objects + capabilities.GL_ARB_vertex_shader && + capabilities.GL_ARB_fragment_shader && + capabilities.GL_ARB_shader_objects var log = "Shaders are" if (!SHADERS_SUPPORTED) log += " not" @@ -67,12 +73,18 @@ class ShaderHelper { if (USING_ARB_SHADERS) ARBShaderObjects.glLinkProgramARB(program) else GL20.glLinkProgram(program) } - fun glGetProgramInfoLog(program: Int, maxLength: Int) : String { - return if (USING_ARB_SHADERS) ARBShaderObjects.glGetInfoLogARB(program, maxLength) else GL20.glGetProgramInfoLog(program, maxLength) + fun glGetProgramInfoLog(program: Int, maxLength: Int): String { + return if (USING_ARB_SHADERS) ARBShaderObjects.glGetInfoLogARB( + program, + maxLength + ) else GL20.glGetProgramInfoLog(program, maxLength) } - fun glGetProgrami(program: Int, pname: Int) : Int { - return if (USING_ARB_SHADERS) ARBShaderObjects.glGetObjectParameteriARB(program, pname) else GL20.glGetProgrami(program, pname) + fun glGetProgrami(program: Int, pname: Int): Int { + return if (USING_ARB_SHADERS) ARBShaderObjects.glGetObjectParameteriARB( + program, + pname + ) else GL20.glGetProgrami(program, pname) } fun glUseProgram(program: Int) { @@ -80,27 +92,39 @@ class ShaderHelper { } fun glAttachShader(program: Int, shaderIn: Int) { - if (USING_ARB_SHADERS) ARBShaderObjects.glAttachObjectARB(program, shaderIn) else GL20.glAttachShader(program, shaderIn) + if (USING_ARB_SHADERS) ARBShaderObjects.glAttachObjectARB(program, shaderIn) else GL20.glAttachShader( + program, + shaderIn + ) } - fun glCreateShader(type: Int) : Int { + fun glCreateShader(type: Int): Int { return if (USING_ARB_SHADERS) ARBShaderObjects.glCreateShaderObjectARB(type) else GL20.glCreateShader(type) } fun glShaderSource(shader: Int, source: CharSequence) { - if (USING_ARB_SHADERS) ARBShaderObjects.glShaderSourceARB(shader, source) else GL20.glShaderSource(shader, source) + if (USING_ARB_SHADERS) ARBShaderObjects.glShaderSourceARB(shader, source) else GL20.glShaderSource( + shader, + source + ) } fun glCompileShader(shader: Int) { if (USING_ARB_SHADERS) ARBShaderObjects.glCompileShaderARB(shader) else GL20.glCompileShader(shader) } - fun glGetShaderi(shader: Int, pname: Int) : Int { - return if (USING_ARB_SHADERS) ARBShaderObjects.glGetObjectParameteriARB(shader, pname) else GL20.glGetShaderi(shader, pname) + fun glGetShaderi(shader: Int, pname: Int): Int { + return if (USING_ARB_SHADERS) ARBShaderObjects.glGetObjectParameteriARB( + shader, + pname + ) else GL20.glGetShaderi(shader, pname) } - fun glGetShaderInfoLog(shader: Int, maxLength: Int) : String { - return if (USING_ARB_SHADERS) ARBShaderObjects.glGetInfoLogARB(shader, maxLength) else GL20.glGetShaderInfoLog(shader, maxLength) + fun glGetShaderInfoLog(shader: Int, maxLength: Int): String { + return if (USING_ARB_SHADERS) ARBShaderObjects.glGetInfoLogARB( + shader, + maxLength + ) else GL20.glGetShaderInfoLog(shader, maxLength) } fun glDeleteShader(shader: Int) { @@ -112,13 +136,21 @@ class ShaderHelper { } fun glUniform3f(location: Int, v0: Float, v1: Float, v2: Float) { - if (USING_ARB_SHADERS) ARBShaderObjects.glUniform3fARB(location, v0, v1, v2) else GL20.glUniform3f(location, v0, v1, v2) + if (USING_ARB_SHADERS) ARBShaderObjects.glUniform3fARB(location, v0, v1, v2) else GL20.glUniform3f( + location, + v0, + v1, + v2 + ) } - fun glGetUniformLocation(program: Int, name: CharSequence) : Int { - return if (USING_ARB_SHADERS) ARBShaderObjects.glGetUniformLocationARB(program, name) else GL20.glGetUniformLocation(program, name) + fun glGetUniformLocation(program: Int, name: CharSequence): Int { + return if (USING_ARB_SHADERS) ARBShaderObjects.glGetUniformLocationARB( + program, + name + ) else GL20.glGetUniformLocation(program, name) } fun areShadersSupported() = SHADERS_SUPPORTED } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt index e7eb48f110bf..3dbec3c6e76a 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt @@ -21,7 +21,7 @@ object ShaderManager { CHROMA(ChromaShader.INSTANCE); companion object { - fun getShaderInstance(shaderName: String) : Shader? = when (shaderName) { + fun getShaderInstance(shaderName: String): Shader? = when (shaderName) { "chroma" -> CHROMA.shader else -> { null @@ -58,7 +58,7 @@ object ShaderManager { activeShader = null } - fun loadShader(type: ShaderType, fileName: String) : Int { + fun loadShader(type: ShaderType, fileName: String): Int { val resourceLocation = ResourceLocation("skyhanni:shaders/$fileName${type.extension}") val source = StringBuilder() @@ -73,8 +73,10 @@ object ShaderManager { ShaderHelper.glCompileShader(shaderID) if (ShaderHelper.glGetShaderi(shaderID, ShaderHelper.GL_COMPILE_STATUS) == 0) { - LorenzUtils.consoleLog("Error occurred when compiling shader $fileName${type.extension} : " + - StringUtils.trim(ShaderHelper.glGetShaderInfoLog(shaderID, 1024))) + LorenzUtils.consoleLog( + "Error occurred when compiling shader $fileName${type.extension} : " + + StringUtils.trim(ShaderHelper.glGetShaderInfoLog(shaderID, 1024)) + ) } return shaderID @@ -84,4 +86,4 @@ object ShaderManager { enum class ShaderType(val extension: String, val shaderType: Int) { VERTEX(".vsh", ShaderHelper.GL_VERTEX_SHADER), FRAGMENT(".fsh", ShaderHelper.GL_FRAGMENT_SHADER) -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt index e87ea3b22ab2..d57398ea447b 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/Uniform.kt @@ -37,9 +37,10 @@ class Uniform( val values = newUniformValue as FloatArray ShaderHelper.glUniform3f(uniformID, values[0], values[1], values[2]) } + UniformType.BOOL -> ShaderHelper.glUniform1f(uniformID, if (newUniformValue as Boolean) 1f else 0f) } previousUniformValue = newUniformValue } } -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/tracker/ItemTrackerData.kt b/src/main/java/at/hannibal2/skyhanni/utils/tracker/ItemTrackerData.kt new file mode 100644 index 000000000000..7aa2cf4f992c --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/tracker/ItemTrackerData.kt @@ -0,0 +1,53 @@ +package at.hannibal2.skyhanni.utils.tracker + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.SimpleTimeMark +import com.google.gson.annotations.Expose + +abstract class ItemTrackerData : TrackerData() { + + private val config get() = SkyHanniMod.feature.misc.tracker + + abstract fun resetItems() + + abstract fun getDescription(timesGained: Long): List + + abstract fun getCoinName(item: TrackedItem): String + + abstract fun getCoinDescription(item: TrackedItem): List + + open fun getCustomPricePer(internalName: NEUInternalName) = SkyHanniTracker.getPricePer(internalName) + + override fun reset() { + items.clear() + resetItems() + } + + fun additem(internalName: NEUInternalName, stackSize: Int) { + val item = items.getOrPut(internalName) { TrackedItem() } + + item.timesGained++ + item.totalAmount += stackSize + item.lastTimeUpdated = SimpleTimeMark.now() + } + + @Expose + var items: MutableMap = HashMap() + + class TrackedItem { + @Expose + var internalName: NEUInternalName? = null + + @Expose + var timesGained: Long = 0 + + @Expose + var totalAmount: Long = 0 + + @Expose + var hidden = false + + var lastTimeUpdated = SimpleTimeMark.farPast() + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt new file mode 100644 index 000000000000..f5510b13d3de --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt @@ -0,0 +1,151 @@ +package at.hannibal2.skyhanni.utils.tracker + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.config.Storage +import at.hannibal2.skyhanni.test.PriceSource +import at.hannibal2.skyhanni.utils.ItemUtils.nameWithEnchantment +import at.hannibal2.skyhanni.utils.KeyboardManager +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList +import at.hannibal2.skyhanni.utils.LorenzUtils.addSelector +import at.hannibal2.skyhanni.utils.LorenzUtils.sortedDesc +import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName +import at.hannibal2.skyhanni.utils.NEUItems.getItemStack +import at.hannibal2.skyhanni.utils.NumberUtil +import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.renderables.Renderable +import kotlin.time.Duration.Companion.seconds + +class SkyHanniItemTracker( + name: String, + createNewSession: () -> Data, + getStorage: (Storage.ProfileSpecific) -> Data, + drawDisplay: (Data) -> List>, +) : SkyHanniTracker(name, createNewSession, getStorage, drawDisplay) { + + companion object { + val SKYBLOCK_COIN by lazy { "SKYBLOCK_COIN".asInternalName() } + } + + private var lastClickDelay = 0L + + fun addCoins(coins: Int) { + addItem(SKYBLOCK_COIN, coins) + } + + fun addItem(internalName: NEUInternalName, stackSize: Int) { + modify { + it.additem(internalName, stackSize) + } + getSharedTracker()?.let { + val hidden = it.get(DisplayMode.TOTAL).items[internalName]!!.hidden + it.get(DisplayMode.SESSION).items[internalName]!!.hidden = hidden + } + + } + + fun addPriceFromButton(lists: MutableList>) { + if (isInventoryOpen()) { + lists.addSelector( + "", + getName = { type -> type.displayName }, + isCurrent = { it.ordinal == config.priceFrom }, + onChange = { + config.priceFrom = it.ordinal + update() + } + ) + } + } + + fun drawItems( + data: Data, + filter: (NEUInternalName) -> Boolean, + lists: MutableList> + ): Double { + var profit = 0.0 + val items = mutableMapOf() + for ((internalName, itemProfit) in data.items) { + if (!filter(internalName)) continue + + val amount = itemProfit.totalAmount + val pricePer = + if (internalName == SKYBLOCK_COIN) 1.0 else data.getCustomPricePer(internalName) + val price = (pricePer * amount).toLong() + val displayAmount = if (internalName == SKYBLOCK_COIN) itemProfit.timesGained else amount + + val cleanName = if (internalName == SKYBLOCK_COIN) { + data.getCoinName(itemProfit) + } else { + internalName.getItemStack().nameWithEnchantment ?: error("no name for $internalName") + } + + val priceFormat = NumberUtil.format(price) + val hidden = itemProfit.hidden + val newDrop = itemProfit.lastTimeUpdated.passedSince() < 10.seconds && config.showRecentDrops + val numberColor = if (newDrop) "§a§l" else "§7" + + var displayName = if (hidden) { + "§8§m" + cleanName.removeColor(keepFormatting = true).replace("§r", "") + } else cleanName + displayName = " $numberColor${displayAmount.addSeparators()}x $displayName§7: §6$priceFormat" + + val lore = buildLore(data, itemProfit, hidden, newDrop, internalName) + + val renderable = if (isInventoryOpen()) Renderable.clickAndHover(displayName, lore) { + if (System.currentTimeMillis() > lastClickDelay + 150) { + if (KeyboardManager.isControlKeyDown()) { + data.items.remove(internalName) + LorenzUtils.chat("§e[SkyHanni] Removed $cleanName §efrom Fishing Frofit Tracker.") + lastClickDelay = System.currentTimeMillis() + 500 + } else { + modify { + it.items[internalName]?.hidden = !hidden + } + lastClickDelay = System.currentTimeMillis() + } + update() + } + } else Renderable.string(displayName) + if (isInventoryOpen() || !hidden) { + items[renderable] = price + } + if (!hidden || !config.excludeHiddenItemsInPrice) { + profit += price + } + } + + for (text in items.sortedDesc().keys) { + lists.addAsSingletonList(text) + } + return profit + } + + private fun buildLore( + data: Data, + item: ItemTrackerData.TrackedItem, + hidden: Boolean, + newDrop: Boolean, + internalName: NEUInternalName + ) = buildList { + if (internalName == SKYBLOCK_COIN) { + addAll(data.getCoinDescription(item)) + } else { + addAll(data.getDescription(item.timesGained)) + } + add("") + if (newDrop) { + add("§aYou caught this item recently.") + add("") + } + add("§eClick to " + (if (hidden) "show" else "hide") + "!") + add("§eControl + Click to remove this item!") + if (SkyHanniMod.feature.dev.debug.enabled) { + add("") + add("§7${internalName}") + } + } + +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt index f882a268ec03..bc2db88e1925 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt @@ -1,10 +1,16 @@ package at.hannibal2.skyhanni.utils.tracker +import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.config.Storage import at.hannibal2.skyhanni.config.core.config.Position import at.hannibal2.skyhanni.data.ProfileStorageData +import at.hannibal2.skyhanni.features.bazaar.BazaarApi.Companion.getBazaarData +import at.hannibal2.skyhanni.features.misc.items.EstimatedItemValue import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList +import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.NEUItems.getNpcPriceOrNull +import at.hannibal2.skyhanni.utils.NEUItems.getPriceOrNull import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.SimpleTimeMark import at.hannibal2.skyhanni.utils.renderables.Renderable @@ -12,19 +18,31 @@ import net.minecraft.client.Minecraft import net.minecraft.client.gui.inventory.GuiInventory import kotlin.time.Duration.Companion.seconds -class SkyHanniTracker( +open class SkyHanniTracker( private val name: String, private val createNewSession: () -> Data, private val getStorage: (Storage.ProfileSpecific) -> Data, private val drawDisplay: (Data) -> List>, ) { private var inventoryOpen = false - private var displayMode = DisplayMode.TOTAL + private var displayMode: DisplayMode? = null private val currentSessions = mutableMapOf() private var display = emptyList>() private var sessionResetTime = SimpleTimeMark.farPast() private var dirty = false + companion object { + val config get() = SkyHanniMod.feature.misc.tracker + private val storedTrackers get() = SkyHanniMod.feature.storage.trackerDisplayModes + + fun getPricePer(name: NEUInternalName) = when (config.priceFrom) { + 0 -> name.getBazaarData()?.sellPrice ?: name.getPriceOrNull() ?: 0.0 + 1 -> name.getBazaarData()?.buyPrice ?: name.getPriceOrNull() ?: 0.0 + + else -> name.getNpcPriceOrNull() ?: 0.0 + } + } + fun isInventoryOpen() = inventoryOpen fun resetCommand(args: Array, command: String) { @@ -47,6 +65,8 @@ class SkyHanniTracker( } fun renderDisplay(position: Position) { + if (config.hideInEstimatedItemValue && EstimatedItemValue.isCurrentlyShowing()) return + val currentlyOpen = Minecraft.getMinecraft().currentScreen is GuiInventory if (inventoryOpen != currentlyOpen) { inventoryOpen = currentlyOpen @@ -55,7 +75,7 @@ class SkyHanniTracker( if (dirty) { display = getSharedTracker()?.let { - buildFinalDisplay(drawDisplay(it.get(displayMode))) + buildFinalDisplay(drawDisplay(it.get(getDisplayMode()))) } ?: emptyList() dirty = false } @@ -72,7 +92,7 @@ class SkyHanniTracker( if (inventoryOpen) { it.add(1, buildDisplayModeView()) } - if (inventoryOpen && displayMode == DisplayMode.SESSION) { + if (inventoryOpen && getDisplayMode() == DisplayMode.SESSION) { it.addAsSingletonList(buildSessionResetButton()) } } @@ -94,14 +114,15 @@ class SkyHanniTracker( private fun buildDisplayModeView() = LorenzUtils.buildSelector( "§7Display Mode: ", getName = { type -> type.displayName }, - isCurrent = { it == displayMode }, + isCurrent = { it == getDisplayMode() }, onChange = { displayMode = it + storedTrackers[name] = it update() } ) - private fun getSharedTracker() = ProfileStorageData.profileSpecific?.let { + protected fun getSharedTracker() = ProfileStorageData.profileSpecific?.let { SharedTracker(getStorage(it), currentSessions.getOrPut(it) { createNewSession() }) } @@ -113,6 +134,18 @@ class SkyHanniTracker( } } + private fun getDisplayMode() = displayMode ?: run { + val newValue = config.defaultDisplayMode.get().mode ?: storedTrackers[name] ?: DisplayMode.TOTAL + displayMode = newValue + newValue + } + + fun firstUpdate() { + if (display.isEmpty()) { + update() + } + } + class SharedTracker(private val total: Data, private val currentSession: Data) { fun modify(modifyFunction: (Data) -> Unit) { modifyFunction(total) @@ -130,4 +163,13 @@ class SkyHanniTracker( SESSION("This Session"), ; } + + enum class DefaultDisplayMode(val display: String, val mode: DisplayMode?) { + TOTAL("Total", DisplayMode.TOTAL), + SESSION("This Session", DisplayMode.SESSION), + REMEMBER_LAST("Remember Last", null), + ; + + override fun toString() = display + } } diff --git a/src/test/java/at/hannibal2/skyhanni/test/ItemUtilsTest.kt b/src/test/java/at/hannibal2/skyhanni/test/ItemUtilsTest.kt index 0ac8cc8de8c3..276e531592b6 100644 --- a/src/test/java/at/hannibal2/skyhanni/test/ItemUtilsTest.kt +++ b/src/test/java/at/hannibal2/skyhanni/test/ItemUtilsTest.kt @@ -5,18 +5,18 @@ import org.junit.jupiter.api.Test class ItemUtilsTest { - val items: MutableMap> = mutableMapOf( - "§5Hoe of Greatest Tilling" to Pair("§5Hoe of Greatest Tilling", 1), - "§fSilver medal §8x2" to Pair("§fSilver medal", 2), - "§aJacob's Ticket §8x32" to Pair("§aJacob's Ticket", 32), - "§9Delicate V" to Pair("§9Delicate V", 1), - " §81x §9Enchanted Sugar Cane" to Pair("§9Enchanted Sugar Cane", 1), - "§6Gold medal" to Pair("§6Gold medal", 1), - " §8+§319k §7Farming XP" to Pair("§7Farming XP", 19_000), - " §8+§215 §7Garden Experience" to Pair("§7Garden Experience", 15), - " §8+§c21 Copper" to Pair("Copper", 21), - " §8+§b10 Bits" to Pair("Bits", 10), - " §8+§37.2k §7Farming XP" to Pair("§7Farming XP", 7_200), + private val items: MutableMap> = mutableMapOf( + "§5Hoe of Greatest Tilling" to Pair("§5Hoe of Greatest Tilling", 1), + "§fSilver medal §8x2" to Pair("§fSilver medal", 2), + "§aJacob's Ticket §8x32" to Pair("§aJacob's Ticket", 32), + "§9Delicate V" to Pair("§9Delicate V", 1), + " §81x §9Enchanted Sugar Cane" to Pair("§9Enchanted Sugar Cane", 1), + "§6Gold medal" to Pair("§6Gold medal", 1), + " §8+§319k §7Farming XP" to Pair("§7Farming XP", 19_000), + " §8+§215 §7Garden Experience" to Pair("§7Garden Experience", 15), + " §8+§c21 Copper" to Pair("Copper", 21), + " §8+§b10 Bits" to Pair("Bits", 10), + " §8+§37.2k §7Farming XP" to Pair("§7Farming XP", 7_200), ) @Test @@ -31,4 +31,4 @@ class ItemUtilsTest { } } } -} \ No newline at end of file +} diff --git a/src/test/java/at/hannibal2/skyhanni/test/garden/VisitorToolTipParserTest.kt b/src/test/java/at/hannibal2/skyhanni/test/garden/VisitorToolTipParserTest.kt index 11b404e4c6be..cdb171aa6fb2 100644 --- a/src/test/java/at/hannibal2/skyhanni/test/garden/VisitorToolTipParserTest.kt +++ b/src/test/java/at/hannibal2/skyhanni/test/garden/VisitorToolTipParserTest.kt @@ -28,7 +28,7 @@ class VisitorToolTipParserTest { assert(parsedData.itemsNeeded.isNotEmpty()) { "Visitor items needed is ${parsedData.itemsNeeded.count()} instead of 1" } - assert(parsedData.itemsNeeded.get("§aEnchanted Hay Bale") == 28) { + assert(parsedData.itemsNeeded["§aEnchanted Hay Bale"] == 28) { "Visitor items needed does not contain '§aEnchanted Hay Bale'" } } @@ -52,7 +52,7 @@ class VisitorToolTipParserTest { ) for ((itemName, amount) in assertions) { - assert(parsedData.rewards.get(itemName) == amount) { + assert(parsedData.rewards[itemName] == amount) { "Visitor rewards does not contain '$itemName' with amount '$amount'" } } @@ -63,7 +63,7 @@ class VisitorToolTipParserTest { val parsedData = VisitorTooltipParser.parse(lore, GardenConfig() ) - val copper = parsedData.rewards.get("Copper") + val copper = parsedData.rewards["Copper"] assert(copper == 23) { "Visitor rewards does not contain 'Copper' with amount '23'" }