diff options
author | hannibal2 <24389977+hannibal00212@users.noreply.github.com> | 2023-04-25 22:50:26 +0200 |
---|---|---|
committer | hannibal2 <24389977+hannibal00212@users.noreply.github.com> | 2023-04-25 22:50:26 +0200 |
commit | 7917a6b60102edec628ec19d70c31b92c689e8f8 (patch) | |
tree | d1764e2e86b586c03733fe9e07a6171e86539ad6 | |
parent | af3567ad9f65f8495b889428c04da12f85d35aec (diff) | |
download | skyhanni-7917a6b60102edec628ec19d70c31b92c689e8f8.tar.gz skyhanni-7917a6b60102edec628ec19d70c31b92c689e8f8.tar.bz2 skyhanni-7917a6b60102edec628ec19d70c31b92c689e8f8.zip |
Added the command '/shcroptime <amount> <item>' that displays the estimated time it will take to gather the requested quantity of a particular item based on the current crop speed.
8 files changed, 92 insertions, 19 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 64a94ea62..cd6ebf128 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,7 @@ + Added **Composter Upgrades Overlay** - Show an overview of all composter stats, including time till organic matter and fuel is empty when fully filled and show a preview how these stats change when hovering over an upgrade + Hide crop money display, crop milestone display and garden visitor list while inside anita show, SkyMart or the composter inventory + Hide chat messages from the visitors in garden. (Except Beth and Spaceman) ++ Introduced a new command '/shcroptime <amount> <item>' that displays the estimated time it will take to gather the requested quantity of a particular item based on the current crop speed. ### Features from other Mods > *The following features are only there because I want them when testing SkyHanni features without other mods present.* diff --git a/FEATURES.md b/FEATURES.md index 69a91fc3f..200165d73 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -223,6 +223,7 @@ + **/shmarkplayer <player>** - marking a player with yellow color. + **/shtrackcollection <item>** - This tracks the number of items you collect, but it does not work with sacks. + **/shcropspeedmeter** - Helps calculate the real farming fortune with the formula crops broken per block. ++ **/shcroptime <amount> <item>** Displays the estimated time it will take to gather the requested quantity of a particular item based on the current crop speed. ## Misc - Allow to copy, paste, and mark selected text in signs (not visual, but it's working still) 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 4c3bdc573..e1a4533e7 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -8,6 +8,7 @@ import at.hannibal2.skyhanni.data.GuiEditManager import at.hannibal2.skyhanni.features.bingo.BingoCardDisplay import at.hannibal2.skyhanni.features.bingo.BingoNextStepHelper import at.hannibal2.skyhanni.features.event.diana.BurrowWarpHelper +import at.hannibal2.skyhanni.features.garden.GardenCropTimeCommand import at.hannibal2.skyhanni.features.garden.farming.CropSpeedMeter import at.hannibal2.skyhanni.features.misc.CollectionCounter import at.hannibal2.skyhanni.features.misc.MarkedPlayerManager @@ -55,6 +56,7 @@ object Commands { registerCommand("shtestgardenvisitors") { LorenzTest.testGardenVisitors() } registerCommand("shtogglehypixelapierrors") { APIUtil.toggleApiErrorMessages() } registerCommand("shcropspeedmeter") { CropSpeedMeter.toggle() } + registerCommand("shcroptime") { GardenCropTimeCommand.onCommand(it) } } private fun registerCommand(name: String, function: (Array<String>) -> Unit) { diff --git a/src/main/java/at/hannibal2/skyhanni/data/GardenCropUpgrades.kt b/src/main/java/at/hannibal2/skyhanni/data/GardenCropUpgrades.kt index 07b796b33..e5ece4acc 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/GardenCropUpgrades.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/GardenCropUpgrades.kt @@ -5,6 +5,7 @@ import at.hannibal2.skyhanni.events.CropUpgradeUpdateEvent import at.hannibal2.skyhanni.events.InventoryOpenEvent import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.features.garden.CropType +import at.hannibal2.skyhanni.features.garden.CropType.Companion.getByNameOrNull import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.StringUtils.removeColor @@ -17,7 +18,7 @@ class GardenCropUpgrades { @SubscribeEvent fun onChat(event: LorenzChatEvent) { chatUpgradePattern.matchEntire(event.message)?.groups?.let { matches -> - val crop = CropType.getByItemName(matches[1]!!.value) ?: return + val crop = getByNameOrNull(matches[1]!!.value) ?: return val level = matches[2]!!.value.toInt() crop.setUpgradeLevel(level) } 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 df86b08d1..ed6138082 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/CropType.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/CropType.kt @@ -33,18 +33,14 @@ enum class CropType( val multiplier by lazy { if (this == SUGAR_CANE || this == CACTUS) 2 else 1 } companion object { - fun getByNameOrNull(cropName: String) = values().firstOrNull { it.cropName == cropName } - - fun getByName(name: String) = getByNameOrNull(name) ?: throw RuntimeException("No valid crop type '$name'") - - - fun getByItemName(itemName: String): CropType? { + fun getByNameOrNull(itemName: String): CropType? { if (itemName == "Red Mushroom" || itemName == "Brown Mushroom") return MUSHROOM if (itemName == "Seeds") return WHEAT - - return getByNameOrNull(itemName) + return values().firstOrNull { it.cropName == itemName } } + fun getByName(name: String) = getByNameOrNull(name) ?: throw RuntimeException("No valid crop type '$name'") + fun IBlockState.getCropType(): CropType? { return when (block) { Blocks.wheat -> WHEAT diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropTimeCommand.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropTimeCommand.kt new file mode 100644 index 000000000..a598b6000 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenCropTimeCommand.kt @@ -0,0 +1,73 @@ +package at.hannibal2.skyhanni.features.garden + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.features.garden.GardenAPI.getSpeed +import at.hannibal2.skyhanni.features.garden.farming.CropMoneyDisplay +import at.hannibal2.skyhanni.utils.ItemUtils.name +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.sorted +import at.hannibal2.skyhanni.utils.NEUItems +import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.TimeUtils + +object GardenCropTimeCommand { + private val config get() = SkyHanniMod.feature.garden + + fun onCommand(args: Array<String>) { + if (!config.moneyPerHourDisplay) { + LorenzUtils.chat("§c[SkyHanni] §cshcroptime requires 'Show money per Hour' feature to be enabled to work!") + return + } + + if (args.size < 2) { + LorenzUtils.chat("§cUsage: /shcroptime <amount> <item>") + return + } + + val rawAmount = args[0] + val amount = try { + rawAmount.toInt() + } catch (e: NumberFormatException) { + LorenzUtils.chat("§cNot a valid number: '$rawAmount'") + return + } + + val rawSearchName = args.toMutableList().drop(1).joinToString(" ") + val searchName = rawSearchName.lowercase() + + val map = mutableMapOf<String, Long>() + for (entry in CropMoneyDisplay.multipliers) { + val internalName = entry.key + val itemName = NEUItems.getItemStack(internalName).name!! + if (itemName.removeColor().lowercase().contains(searchName)) { + val (baseId, baseAmount) = NEUItems.getMultiplier(internalName) + val baseName = NEUItems.getItemStack(baseId).name!! + val crop = CropType.getByName(baseName.removeColor()) + val speed = crop.getSpeed() + + val fullAmount = baseAmount.toLong() * amount.toLong() + val text = if (baseAmount == 1) { + "§e${amount.addSeparators()}x $itemName" + } else { + "§e${amount.addSeparators()}x $itemName §7(§e${fullAmount.addSeparators()}x $baseName§7)" + } + + if (speed == -1) { + map["$text §cNo speed data!"] = -1 + } else { + val missingTimeSeconds = fullAmount / speed + val duration = TimeUtils.formatDuration(missingTimeSeconds * 1000) + map["$text §b$duration"] = missingTimeSeconds + } + } + } + + if (map.isEmpty()) { + LorenzUtils.chat("§c[SkyHanni] §cNo crop item found for '$rawSearchName'") + return + } + + LorenzUtils.chat("§e[SkyHanni] Crop Speed for ${map.size} items:\n" + map.sorted().keys.joinToString("\n")) + } +}
\ No newline at end of file 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 599cd8ccb..1181170d0 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 @@ -6,6 +6,7 @@ import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.features.bazaar.BazaarApi import at.hannibal2.skyhanni.features.bazaar.BazaarData import at.hannibal2.skyhanni.features.garden.CropType +import at.hannibal2.skyhanni.features.garden.CropType.Companion.getByNameOrNull import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.features.garden.GardenAPI.getSpeed import at.hannibal2.skyhanni.features.garden.GardenNextJacobContest @@ -25,12 +26,15 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent class CropMoneyDisplay { + companion object { + var multipliers = mapOf<String, Int>() + } + private var display = mutableListOf<List<Any>>() private val config get() = SkyHanniMod.feature.garden private var tick = 0 private var loaded = false private var ready = false - private var multipliers = mapOf<String, Int>() private val cropNames = mutableMapOf<String, CropType>() // internalName -> cropName private var hasCropInHand = false private val toolHasBountiful: MutableMap<CropType, Boolean> get() = SkyHanniMod.feature.hidden.gardenToolHasBountiful @@ -304,7 +308,7 @@ class CropMoneyDisplay { val (newId, amount) = NEUItems.getMultiplier(internalName) val itemName = NEUItems.getItemStack(newId).name?.removeColor() ?: continue - val crop = CropType.getByItemName(itemName) + val crop = getByNameOrNull(itemName) crop?.let { map[internalName] = amount cropNames[internalName] = it 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 1bababdb1..33c4b0e5a 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 @@ -4,7 +4,7 @@ import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.TitleUtils import at.hannibal2.skyhanni.events.* -import at.hannibal2.skyhanni.features.garden.CropType +import at.hannibal2.skyhanni.features.garden.CropType.Companion.getByNameOrNull import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.features.garden.GardenAPI.getSpeed import at.hannibal2.skyhanni.mixins.hooks.RenderLivingEntityHelper @@ -313,7 +313,7 @@ class GardenVisitorFeatures { if (config.visitorExactAmountAndTime) { val multiplier = NEUItems.getMultiplier(internalName) val rawName = NEUItems.getItemStack(multiplier.first).name?.removeColor() ?: continue - CropType.getByItemName(rawName)?.let { + getByNameOrNull(rawName)?.let { val speed = it.getSpeed() val cropAmount = multiplier.second.toLong() * amount val formatAmount = LorenzUtils.formatInteger(cropAmount) @@ -481,12 +481,7 @@ class GardenVisitorFeatures { if (name == "Spaceman") return false if (name == "Beth") return false - if (visitors.keys.any { it.removeColor() == name }) { - println("blocked msg from '$name'") - return true - } - - return false + return visitors.keys.any { it.removeColor() == name } } private fun update() { |