aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--FEATURES.md1
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/Garden.java68
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/Hidden.java3
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropMilestoneDisplay.kt12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/garden/GardenVisitorFeatures.kt104
6 files changed, 123 insertions, 66 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index eb1b58e72..d7c494f86 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,6 +21,7 @@
+ Added **Garden Crop Milestone Display** - Shows the progress and ETA until the next crop milestone is reached and the current crops/minute value. (Requires a tool with either a counter or cultivating enchantment)
+ Added **Best Crop Display** - Lists all crops and their ETA till next milestone. Sorts for best crop for getting garden level or skyblock level.
* Added **Copper Price** - Show the price for copper inside the visitor gui.
+* Added **Amount and Time** - Show the exact item amount and the remaining time when farmed manually. Especially useful for ironman.
### Features from other Mods
diff --git a/FEATURES.md b/FEATURES.md
index 225d50b7b..ed33e5eef 100644
--- a/FEATURES.md
+++ b/FEATURES.md
@@ -172,6 +172,7 @@
+ **Garden Crop Milestone Display** - Shows the progress and ETA until the next crop milestone is reached and the current crops/minute value. (Requires a tool with either a counter or cultivating enchantment)
+ **Best Crop Display** - Lists all crops and their ETA till next milestone. Sorts for best crop for getting garden level or skyblock level.
+ **Copper Price** - Show the price for copper inside the visitor gui.
++ **Amount and Time** - Show the exact item amount and the remaining time when farmed manually. Especially useful for ironman.
## Commands
- /wiki (using hypixel-skyblock.fandom.com instead of Hypixel wiki)
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java b/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java
index a50d9201d..74f48da48 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java
@@ -41,7 +41,7 @@ public class Garden {
public boolean visitorTimer = false;
@Expose
- @ConfigOption(name = "Visitor Timer", desc = "Timer when the next visitor will appear," +
+ @ConfigOption(name = "Visitor Timer", desc = "Timer when the next visitor will appear, " +
"and a number how many visitors are already waiting.")
@ConfigEditorBoolean
@ConfigAccordionId(id = 2)
@@ -78,56 +78,68 @@ public class Garden {
public boolean visitorNeedsOnlyWhenClose = false;
@Expose
- @ConfigOption(name = "Notification Chat", desc = "Show in chat when a new visitor is visiting your island.")
- @ConfigEditorBoolean
+ @ConfigOption(name = "Visitor Inventory", desc = "")
@ConfigAccordionId(id = 1)
- public boolean visitorNotificationChat = true;
+ @ConfigEditorAccordion(id = 4)
+ public boolean visitorInventory = false;
@Expose
- @ConfigOption(name = "Notification Title", desc = "Show a title when a new visitor is visiting your island.")
+ @ConfigOption(name = "Visitor Price", desc = "Show the bazaar price of the items required for the visitors.")
@ConfigEditorBoolean
- @ConfigAccordionId(id = 1)
- public boolean visitorNotificationTitle = true;
+ @ConfigAccordionId(id = 4)
+ public boolean visitorShowPrice = true;
@Expose
- @ConfigOption(name = "Highlight", desc = "Highlight visitor when the required items are in the inventory or the visitor is new and needs to checked what items it needs.")
+ @ConfigOption(name = "Amount and Time", desc = "Show the exact item amount and the remaining time when farmed manually. Especially useful for ironman.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 4)
+ public boolean visitorExactAmountAndTime = true;
+
+ @Expose
+ @ConfigOption(name = "Copper Price", desc = "Show the price for copper inside the visitor gui.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 4)
+ public boolean visitorCopperPrice = false;
+
+ @Expose
+ @ConfigOption(name = "Notification Chat", desc = "Show in chat when a new visitor is visiting your island.")
@ConfigEditorBoolean
@ConfigAccordionId(id = 1)
- public boolean visitorHighlight = true;
+ public boolean visitorNotificationChat = true;
@Expose
- @ConfigOption(name = "Visitor Price", desc = "Show the bazaar price of the items required for the visitors.")
+ @ConfigOption(name = "Notification Title", desc = "Show a title when a new visitor is visiting your island.")
@ConfigEditorBoolean
@ConfigAccordionId(id = 1)
- public boolean visitorShowPrice = true;
+ public boolean visitorNotificationTitle = true;
@Expose
- @ConfigOption(name = "Copper Price", desc = "Show the price for copper inside the visitor gui.")
+ @ConfigOption(name = "Highlight", desc = "Highlight visitor when the required items are in the inventory or the visitor is new and needs to checked what items it needs.")
@ConfigEditorBoolean
@ConfigAccordionId(id = 1)
- public boolean visitorCopperPrice = false;
+ public boolean visitorHighlight = true;
@Expose
@ConfigOption(name = "Numbers", desc = "")
- @ConfigEditorAccordion(id = 4)
+ @ConfigEditorAccordion(id = 5)
public boolean numbers = false;
@Expose
@ConfigOption(name = "Crop Milestone", desc = "Show the number of crop milestones in the inventory.")
@ConfigEditorBoolean
- @ConfigAccordionId(id = 4)
+ @ConfigAccordionId(id = 5)
public boolean numberCropMilestone = true;
@Expose
@ConfigOption(name = "Crop Upgrades", desc = "Show the number of upgrades in the crop upgrades inventory.")
@ConfigEditorBoolean
- @ConfigAccordionId(id = 4)
+ @ConfigAccordionId(id = 5)
public boolean numberCropUpgrades = true;
@Expose
- @ConfigOption(name = "Crop Milestone", desc = "")
- @ConfigEditorAccordion(id = 5)
- public boolean cropMilestone = false;
+ @ConfigOption(name = "Crop Milestones", desc = "")
+ @ConfigEditorAccordion(id = 6)
+ public boolean cropMilestones = false;
@Expose
@ConfigOption(
@@ -136,19 +148,19 @@ public class Garden {
"§cRequires a tool with either a counter or cultivating enchantment."
)
@ConfigEditorBoolean
- @ConfigAccordionId(id = 5)
+ @ConfigAccordionId(id = 6)
public boolean cropMilestoneProgress = true;
@Expose
@ConfigOption(name = "Display Position", desc = "")
@ConfigEditorButton(runnableId = "cropMilestoneProgress", buttonText = "Edit")
- @ConfigAccordionId(id = 5)
+ @ConfigAccordionId(id = 6)
public Position cropMilestoneProgressDisplayPos = new Position(-363, 12, false, true);
@Expose
@ConfigOption(name = "Best Crop", desc = "")
- @ConfigAccordionId(id = 5)
- @ConfigEditorAccordion(id = 6)
+ @ConfigAccordionId(id = 6)
+ @ConfigEditorAccordion(id = 7)
public boolean cropMilestoneNext = false;
@Expose
@@ -156,13 +168,13 @@ public class Garden {
name = "Best Display",
desc = "Lists all crops and their ETA till next milestone. Sorts for best crop for getting garden level or skyblock level.")
@ConfigEditorBoolean
- @ConfigAccordionId(id = 6)
+ @ConfigAccordionId(id = 7)
public boolean cropMilestoneBestDisplay = true;
@Expose
@ConfigOption(name = "Sort Type", desc = "Sort the crops by either garden exp or by skyblock exp.")
@ConfigEditorDropdown(values = {"Garden Exp", "SkyBlock Exp"})
- @ConfigAccordionId(id = 6)
+ @ConfigAccordionId(id = 7)
public int cropMilestoneBestType = 0;
@Expose
@@ -172,7 +184,7 @@ public class Garden {
maxValue = 10,
minStep = 1
)
- @ConfigAccordionId(id = 6)
+ @ConfigAccordionId(id = 7)
public int cropMilestoneShowOnlyBest = 10;
@Expose
@@ -180,13 +192,13 @@ public class Garden {
name = "Always On",
desc = "Show the Best Display always while on the garden.")
@ConfigEditorBoolean
- @ConfigAccordionId(id = 6)
+ @ConfigAccordionId(id = 7)
public boolean cropMilestoneBestAlwaysOn = false;
@Expose
@ConfigOption(name = "Display Position", desc = "")
@ConfigEditorButton(runnableId = "cropMilestoneNext", buttonText = "Edit")
- @ConfigAccordionId(id = 6)
+ @ConfigAccordionId(id = 7)
public Position cropMilestoneNextDisplayPos = new Position(-112, -143, false, true);
@Expose
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Hidden.java b/src/main/java/at/hannibal2/skyhanni/config/features/Hidden.java
index 81d2de77b..315be5382 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/Hidden.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/Hidden.java
@@ -38,4 +38,7 @@ public class Hidden {
@Expose
public Map<String, Long> gardenTimeTillNextCropMilestone = new HashMap<>();
+
+ @Expose
+ public Map<String, Integer> gardenCropsPerSecond = new HashMap<>();
}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropMilestoneDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropMilestoneDisplay.kt
index a57beed0e..62fced2f5 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropMilestoneDisplay.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropMilestoneDisplay.kt
@@ -30,6 +30,10 @@ class GardenCropMilestoneDisplay {
private val timeTillNextCrop: MutableMap<String, Long> get() = SkyHanniMod.feature.hidden.gardenTimeTillNextCropMilestone
private val config: Garden get() = SkyHanniMod.feature.garden
+ companion object {
+ val cropsPerSecond: MutableMap<String, Int> get() = SkyHanniMod.feature.hidden.gardenCropsPerSecond
+ }
+
@SubscribeEvent
fun onRenderOverlay(event: GuiRenderEvent.GameOverlayRenderEvent) {
if (!isEnabled()) return
@@ -45,6 +49,11 @@ class GardenCropMilestoneDisplay {
if (GardenCropMilestones.cropCounter.values.sum() == 0L) {
needsInventory = true
}
+ if (cropsPerSecond.isEmpty()) {
+ for (key in GardenCropMilestones.cropCounter.keys) {
+ cropsPerSecond[key] = -1
+ }
+ }
}
@SubscribeEvent
@@ -237,12 +246,13 @@ class GardenCropMilestoneDisplay {
progressDisplay.add(Collections.singletonList("§e$haveFormat§8/§e$needFormat"))
if (averageSpeedPerSecond != 0) {
+ cropsPerSecond[it] = averageSpeedPerSecond
val missing = need - have
val missingTimeSeconds = missing / averageSpeedPerSecond
val millis = missingTimeSeconds * 1000
timeTillNextCrop[it] = millis
val duration = TimeUtils.formatDuration(millis)
- progressDisplay.add(Collections.singletonList("§7In §b$duration"))
+ progressDisplay.add(Collections.singletonList("§7in §b$duration"))
val format = LorenzUtils.formatInteger(averageSpeedPerSecond * 60)
progressDisplay.add(Collections.singletonList("§7Crops/minute§8: §e$format"))
diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenVisitorFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenVisitorFeatures.kt
index a43f9671f..3eb69a2ef 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenVisitorFeatures.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenVisitorFeatures.kt
@@ -130,55 +130,85 @@ class GardenVisitorFeatures {
fun onTooltip(event: ItemTooltipEvent) {
if (!isEnabled()) return
if (!nearby) return
- if (!config.visitorShowPrice) return
if (!inVisitorInventory) return
val name = event.itemStack.name ?: return
if (name != "§aAccept Offer") return
- val list = event.toolTip
- var totalPrice = 0.0
- var amountDifferentItems = 0
- var endReached = false
- for ((i, l) in list.toMutableList().withIndex()) {
- val line = l.substring(4)
- if (line == "") {
- if (amountDifferentItems > 1) {
- val format = NumberUtil.format(totalPrice)
- list[1] = list[1] + "$line §f(§6Total §6$format§f)"
+ // TODO remove
+ try {
+ val list = event.toolTip
+ var totalPrice = 0.0
+ var amountItems = 0
+ var endReached = false
+ for ((i, l) in list.toMutableList().withIndex()) {
+ val line = l.substring(4)
+ if (line == "") {
+ if (config.visitorShowPrice) {
+ if (amountItems > 1) {
+ val format = NumberUtil.format(totalPrice)
+ list[1] = list[1] + "$line §f(§6Total §6$format§f)"
+ }
+ }
+ endReached = true
}
- endReached = true
- }
- if (i > 1 && !endReached) {
- val (itemName, amount) = ItemUtils.readItemAmount(line)
- if (itemName != null) {
- val internalName: String
- try {
- internalName = NEUItems.getInternalName(itemName)
- } catch (e: NullPointerException) {
- val message = "internal name is null: '$itemName'"
- println(message)
- LorenzUtils.error(message)
- e.printStackTrace()
- return
+ // Items Required
+ if (i > 1 && !endReached) {
+ val (itemName, amount) = ItemUtils.readItemAmount(line)
+ if (itemName != null) {
+ val internalName: String
+ try {
+ internalName = NEUItems.getInternalName(itemName)
+ } catch (e: NullPointerException) {
+ val message = "internal name is null: '$itemName'"
+ println(message)
+ LorenzUtils.error(message)
+ e.printStackTrace()
+ return
+ }
+ if (config.visitorShowPrice) {
+ val price = NEUItems.getPrice(internalName) * amount
+ totalPrice += price
+ val format = NumberUtil.format(price)
+ list[i] = "$line §7(§6$format§7)"
+ }
+ amountItems++
+
+ if (config.visitorExactAmountAndTime) {
+ val multiplier = NEUItems.getMultiplier(internalName)
+ val rawName = NEUItems.getItemStack(multiplier.first).name ?: continue
+ val crop = rawName.removeColor()
+ val cropAmount = multiplier.second.toLong() * amount
+ GardenCropMilestoneDisplay.cropsPerSecond[crop]?.let {
+ val formatAmount = LorenzUtils.formatInteger(cropAmount)
+ val formatName = "§e${formatAmount}§7x $crop "
+ val formatSpeed = if (it != -1) {
+ val missingTimeSeconds = cropAmount / it
+ val duration = TimeUtils.formatDuration(missingTimeSeconds * 1000)
+ "in §b$duration"
+ } else {
+ "§cno speed data!"
+ }
+ list.add(i + amountItems, " §7- $formatName($formatSpeed§7)")
+ }
+ }
}
- val price = NEUItems.getPrice(internalName) * amount
- totalPrice += price
- val format = NumberUtil.format(price)
- list[i] = "$line §7(§6$format§7)"
- amountDifferentItems++
}
- }
- if (config.visitorCopperPrice) {
- val matcher = copperPattern.matcher(line)
- if (matcher.matches()) {
- val coppers = matcher.group(1).replace(",", "").toInt()
- val pricePerCopper = NumberUtil.format((totalPrice / coppers).toInt())
- list[i] = list[i] + " §f(§7Copper price §6$pricePerCopper§f)"
+ if (config.visitorCopperPrice) {
+ val matcher = copperPattern.matcher(line)
+ if (matcher.matches()) {
+ val coppers = matcher.group(1).replace(",", "").toInt()
+ val pricePerCopper = NumberUtil.format((totalPrice / coppers).toInt())
+ list[i] = list[i] + " §f(§7Copper price §6$pricePerCopper§f)"
+ }
}
}
+
+ } catch (e: Exception) {
+ e.printStackTrace()
+ LorenzUtils.debug("crash!")
}
}