diff options
8 files changed, 203 insertions, 7 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 89061d433..7b32558cc 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -106,6 +106,7 @@ import at.hannibal2.skyhanni.features.dungeon.DungeonTeammateOutlines import at.hannibal2.skyhanni.features.dungeon.HighlightDungeonDeathmite import at.hannibal2.skyhanni.features.event.UniqueGiftingOpportunitiesFeatures import at.hannibal2.skyhanni.features.event.diana.BurrowWarpHelper +import at.hannibal2.skyhanni.features.event.diana.DianaProfitTracker import at.hannibal2.skyhanni.features.event.diana.GriffinBurrowHelper import at.hannibal2.skyhanni.features.event.diana.GriffinBurrowParticleFinder import at.hannibal2.skyhanni.features.event.diana.GriffinPetWarning @@ -214,6 +215,7 @@ import at.hannibal2.skyhanni.features.mining.powdertracker.PowderTracker import at.hannibal2.skyhanni.features.minion.MinionCollectLogic import at.hannibal2.skyhanni.features.minion.MinionFeatures import at.hannibal2.skyhanni.features.minion.MinionXp +import at.hannibal2.skyhanni.features.misc.BetterSignEditing import at.hannibal2.skyhanni.features.misc.BrewingStandOverlay import at.hannibal2.skyhanni.features.misc.ButtonOnPause import at.hannibal2.skyhanni.features.misc.CollectionTracker @@ -233,7 +235,6 @@ import at.hannibal2.skyhanni.features.misc.MovementSpeedDisplay import at.hannibal2.skyhanni.features.misc.NonGodPotEffectDisplay import at.hannibal2.skyhanni.features.misc.ParticleHider import at.hannibal2.skyhanni.features.misc.PartyMemberOutlines -import at.hannibal2.skyhanni.features.misc.BetterSignEditing import at.hannibal2.skyhanni.features.misc.PatcherSendCoordinates import at.hannibal2.skyhanni.features.misc.PetCandyUsedDisplay import at.hannibal2.skyhanni.features.misc.PetExpTooltip @@ -498,6 +499,7 @@ class SkyHanniMod { loadModule(StatsTuning()) loadModule(NonGodPotEffectDisplay()) loadModule(SoopyGuessBurrow()) + loadModule(DianaProfitTracker()) loadModule(HighlightJerries()) loadModule(TheGreatSpook()) loadModule(GriffinBurrowHelper) diff --git a/src/main/java/at/hannibal2/skyhanni/config/Storage.java b/src/main/java/at/hannibal2/skyhanni/config/Storage.java index 3bfcdc860..a01c8d7e5 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/Storage.java +++ b/src/main/java/at/hannibal2/skyhanni/config/Storage.java @@ -5,6 +5,7 @@ import at.hannibal2.skyhanni.features.bingo.card.goals.BingoGoal; import at.hannibal2.skyhanni.features.combat.endernodetracker.EnderNodeTracker; import at.hannibal2.skyhanni.features.combat.ghostcounter.GhostData; import at.hannibal2.skyhanni.features.dungeon.DungeonAPI; +import at.hannibal2.skyhanni.features.event.diana.DianaProfitTracker; 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; @@ -435,5 +436,15 @@ public class Storage { public FishingProfitTracker.Data fishingProfitTracker = new FishingProfitTracker.Data(); } + + @Expose + public DianaStorage diana = new DianaStorage(); + + public static class DianaStorage { + + @Expose + public DianaProfitTracker.Data dianaProfitTracker = new DianaProfitTracker.Data(); + + } } } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/event/diana/DianaConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/event/diana/DianaConfig.java index b5d21bade..f7ccf58f6 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/event/diana/DianaConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/event/diana/DianaConfig.java @@ -57,4 +57,9 @@ public class DianaConfig { @ConfigOption(name = "Always Diana", desc = "Forcefully set the Diana event to be active. This is useful if the auto mayor detection fails.") @ConfigEditorBoolean public boolean alwaysDiana = false; + + @Expose + @ConfigOption(name = "Diana Profit Tracker", desc = "") + @Accordion + public DianaProfitTrackerConfig dianaProfitTracker = new DianaProfitTrackerConfig(); } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/event/diana/DianaProfitTrackerConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/event/diana/DianaProfitTrackerConfig.java new file mode 100644 index 000000000..2bffc2646 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/event/diana/DianaProfitTrackerConfig.java @@ -0,0 +1,20 @@ +package at.hannibal2.skyhanni.config.features.event.diana; + +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 DianaProfitTrackerConfig { + + @Expose + @ConfigOption(name = "Enabled", desc = "Count all items you pick up while doing Diana, " + + "keep track how often you dug burrows and calculates money per burrow.") + @ConfigEditorBoolean + @FeatureToggle + public boolean enabled = false; + + @Expose + public Position position = new Position(20, 20, false, true); +} diff --git a/src/main/java/at/hannibal2/skyhanni/data/jsonobjects/repo/DianaDrops.java b/src/main/java/at/hannibal2/skyhanni/data/jsonobjects/repo/DianaDrops.java new file mode 100644 index 000000000..050601c3d --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/data/jsonobjects/repo/DianaDrops.java @@ -0,0 +1,11 @@ +package at.hannibal2.skyhanni.data.jsonobjects.repo; + +import at.hannibal2.skyhanni.utils.NEUInternalName; +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class DianaDrops { + @Expose + public List<NEUInternalName> diana_drops; +} 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 8c01d0141..972ee4c3a 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 @@ -5,12 +5,14 @@ import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.MayorElection import at.hannibal2.skyhanni.data.PetAPI import at.hannibal2.skyhanni.utils.InventoryUtils +import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName +import net.minecraft.item.ItemStack object DianaAPI { - val spade by lazy { "ANCESTRAL_SPADE".asInternalName() } + private val spade by lazy { "ANCESTRAL_SPADE".asInternalName() } fun hasSpadeInHand() = InventoryUtils.itemInHandId == spade @@ -20,4 +22,8 @@ object DianaAPI { fun hasGriffinPet() = PetAPI.currentPet?.contains("Griffin") ?: false fun featuresEnabled() = IslandType.HUB.isInIsland() && isRitualActive() + + val ItemStack.isDianaSpade get() = getInternalName() == spade + + fun hasSpadeInInventory() = InventoryUtils.getItemsInOwnInventory().any { it.isDianaSpade } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaProfitTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaProfitTracker.kt new file mode 100644 index 000000000..a5d241b90 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaProfitTracker.kt @@ -0,0 +1,144 @@ +package at.hannibal2.skyhanni.features.event.diana + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.jsonobjects.repo.DianaDrops +import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.events.ItemAddEvent +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.events.RepositoryReloadEvent +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList +import at.hannibal2.skyhanni.utils.NEUInternalName +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.StringUtils.matches +import at.hannibal2.skyhanni.utils.renderables.Renderable +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern +import at.hannibal2.skyhanni.utils.tracker.ItemTrackerData +import at.hannibal2.skyhanni.utils.tracker.SkyHanniItemTracker +import com.google.gson.annotations.Expose +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class DianaProfitTracker { + private val config get() = SkyHanniMod.feature.event.diana.dianaProfitTracker + private var allowedDrops = listOf<NEUInternalName>() + + private val chatDugOutPattern by RepoPattern.pattern( + "diana.chat.burrow.dug", + "(§eYou dug out a Griffin Burrow!|§eYou finished the Griffin burrow chain!) .*" + ) + private val chatDugOutCoinsPattern by RepoPattern.pattern( + "diana.chat.coins", + "§6§lWow! §r§eYou dug out §r§6(?<coins>.*) coins§r§e!" + ) + + private val tracker = SkyHanniItemTracker( + "Diana Profit Tracker", + { Data() }, + { it.diana.dianaProfitTracker }) { drawDisplay(it) } + + class Data : ItemTrackerData() { + override fun resetItems() { + burrowsDug = 0 + } + + @Expose + var burrowsDug: Long = 0 + + override fun getDescription(timesDropped: Long): List<String> { + val percentage = timesDropped.toDouble() / burrowsDug + val perBurrow = LorenzUtils.formatPercentage(percentage.coerceAtMost(1.0)) + + return listOf( + "§7Dropped §e${timesDropped.addSeparators()} §7times.", + "§7Your drop chance per burrow: §c$perBurrow", + ) + } + + override fun getCoinName(item: TrackedItem) = "§6Dug Out Coins" + + override fun getCoinDescription(item: TrackedItem): List<String> { + val burrowDugCoinsFormat = NumberUtil.format(item.totalAmount) + return listOf( + "§7Digging treasures gave you", + "§6$burrowDugCoinsFormat coins §7in total." + ) + } + } + + private fun drawDisplay(data: Data): List<List<Any>> = buildList { + addAsSingletonList("§e§lDiana Profit Tracker") + + val profit = tracker.drawItems(data, { true }, this) + + val treasureCoins = data.burrowsDug + addAsSingletonList( + Renderable.hoverTips( + "§7Burrows dug: §e${treasureCoins.addSeparators()}", + listOf("§7You dug out griffin burrows §e${treasureCoins.addSeparators()} §7times.") + ) + ) + + val profitFormat = NumberUtil.format(profit) + val profitPrefix = if (profit < 0) "§c" else "§6" + + val profitPerBurrow = profit / data.burrowsDug + val profitPerBurrowFormat = NumberUtil.format(profitPerBurrow) + + val text = "§eTotal Profit: $profitPrefix$profitFormat coins" + addAsSingletonList( + Renderable.hoverTips( + text, + listOf("§7Profit per burrow: $profitPrefix$profitPerBurrowFormat") + ) + ) + + tracker.addPriceFromButton(this) + } + + @SubscribeEvent + fun onItemAdd(event: ItemAddEvent) { + if (!isEnabled()) return + + val internalName = event.internalName + + if (!isAllowedItem(internalName)) { + LorenzUtils.debug("Ignored non-diana item pickup: '$internalName'") + return + } + + tracker.addItem(internalName, event.amount) + } + + @SubscribeEvent + fun onChat(event: LorenzChatEvent) { + if (chatDugOutPattern.matches(event.message)) { + tracker.modify { + it.burrowsDug++ + } + } + chatDugOutCoinsPattern.matchMatcher(event.message) { + val coins = group("coins").formatNumber().toInt() + tracker.addCoins(coins) + } + } + + @SubscribeEvent + fun onRenderOverlay(event: GuiRenderEvent) { + if (!isEnabled()) return + + tracker.renderDisplay(config.position) + } + + private fun isAllowedItem(internalName: NEUInternalName): Boolean = internalName in allowedDrops + + @SubscribeEvent + fun onRepoReload(event: RepositoryReloadEvent) { + allowedDrops = event.getConstant<DianaDrops>("DianaDrops").diana_drops + } + + fun isEnabled() = + LorenzUtils.inSkyBlock && config.enabled && DianaAPI.featuresEnabled() && DianaAPI.hasSpadeInInventory() +} 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 a28358143..5c28738de 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 @@ -7,12 +7,11 @@ import at.hannibal2.skyhanni.events.BurrowDugEvent import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent import at.hannibal2.skyhanni.events.PacketEvent +import at.hannibal2.skyhanni.features.event.diana.DianaAPI.isDianaSpade import at.hannibal2.skyhanni.utils.BlockUtils.getBlockAt -import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName import at.hannibal2.skyhanni.utils.LorenzVec import at.hannibal2.skyhanni.utils.toLorenzVec import net.minecraft.init.Blocks -import net.minecraft.item.ItemStack import net.minecraft.network.play.server.S2APacketParticles import net.minecraftforge.fml.common.eventhandler.EventPriority import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -122,15 +121,13 @@ class GriffinBurrowParticleFinder { if (!config.burrowsSoopyGuess) return val pos = event.position - if (event.itemInHand?.isSpade != true || pos.getBlockAt() !== Blocks.grass) return + if (event.itemInHand?.isDianaSpade != true || pos.getBlockAt() !== Blocks.grass) return if (burrows.containsKey(pos)) { lastDugParticleBurrow = pos } } - private val ItemStack.isSpade get() = getInternalName() == DianaAPI.spade - class Burrow( var location: LorenzVec, var hasFootstep: Boolean = false, |