Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Draconic Sacrifice Tracker #2077

Open
wants to merge 21 commits into
base: beta
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package at.hannibal2.skyhanni.config.features.misc;

import at.hannibal2.skyhanni.config.core.config.Position;
import com.google.gson.annotations.Expose;
import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean;
import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorDraggableList;
import io.github.notenoughupdates.moulconfig.annotations.ConfigLink;
import io.github.notenoughupdates.moulconfig.annotations.ConfigOption;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.DRAGON_HORN;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.ESSENCES;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.HOLY_DRAGON_FRAGMENT;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.ITEMS_SACRIFICE;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.OLD_DRAGON_FRAGMENT;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.PROTECTOR_DRAGON_FRAGMENT;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.RITUAL_RESIDUE;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.STRONG_DRAGON_FRAGMENT;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.SUMMONING_EYE;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.SUPERIOR_DRAGON_FRAGMENT;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.TITLE;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.UNSTABLE_DRAGON_FRAGMENT;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.WISE_DRAGON_FRAGMENT;
import static at.hannibal2.skyhanni.config.features.misc.DraconicSacrificeTrackerConfig.DraconicSacrificeDisplayEntry.YOUNG_DRAGON_FRAGMENT;

public class DraconicSacrificeTrackerConfig {

@Expose
@ConfigOption(name = "Enable", desc = "Enable the Draconic sacrifice tracker.")
superhize marked this conversation as resolved.
Show resolved Hide resolved
@ConfigEditorBoolean
superhize marked this conversation as resolved.
Show resolved Hide resolved
public boolean enabled = true;

@Expose
@ConfigOption(name = "Only In Void Slate", desc = "Show the tracker only when inside the Void Slate area.")
@ConfigEditorBoolean
public boolean onlyInVoidSlate = true;

@Expose
@ConfigOption(
name = "Text Format",
desc = "Drag text to change the appearance of the overlay."
)
@ConfigEditorDraggableList
public List<DraconicSacrificeDisplayEntry> textFormat = new ArrayList<>(Arrays.asList(
TITLE,
ITEMS_SACRIFICE,
ESSENCES,
RITUAL_RESIDUE,
SUMMONING_EYE,
DRAGON_HORN,
YOUNG_DRAGON_FRAGMENT,
OLD_DRAGON_FRAGMENT,
STRONG_DRAGON_FRAGMENT,
WISE_DRAGON_FRAGMENT,
UNSTABLE_DRAGON_FRAGMENT,
PROTECTOR_DRAGON_FRAGMENT,
SUPERIOR_DRAGON_FRAGMENT,
HOLY_DRAGON_FRAGMENT
));

public enum DraconicSacrificeDisplayEntry {
TITLE("§e5§lDraconic Sacrifice Tracker"),
ITEMS_SACRIFICE("§6974 Items Sacrified"),
ESSENCES("§b8,945 §5Dragon Essences"),
RITUAL_RESIDUE("§b9 §5Ritual Residue"),
SUMMONING_EYE("§b4 §5Summoning Eye"),
DRAGON_HORN("§b1 §5Dragon Horn"),
DRAGON_CLAW("§b1 §5Dragon Claw"),
ENCHANTED_ENDER_PEARL("§b666 §aEnchanted Ender Pearl"),
ENCHANTED_EYE_OF_ENDER("§b412 §aEnchanted Eye Of Ender"),
ENCHANTED_END_STONE("§b50 §aEnchanted End Stone"),
ENCHANTED_OBSIDIAN("§b40 §aEnchanted Obsidian"),
YOUNG_DRAGON_FRAGMENT("§b99 §5Young Dragon Fragment"),
OLD_DRAGON_FRAGMENT("§b99 §5Old Dragon Fragment"),
STRONG_DRAGON_FRAGMENT("§b99 §5Strong Dragon Fragment"),
WISE_DRAGON_FRAGMENT("§b99 §5Wise Dragon Fragment"),
UNSTABLE_DRAGON_FRAGMENT("§b99 §5Unstable Dragon Fragment"),
PROTECTOR_DRAGON_FRAGMENT("§b99 §5Protector Dragon Fragment"),
SUPERIOR_DRAGON_FRAGMENT("§b99 §Superior Dragon Fragment"),
HOLY_DRAGON_FRAGMENT("§b99 §5Holy Dragon Fragment"),

;
private final String str;

DraconicSacrificeDisplayEntry(String str) {
this.str = str;
}

@Override
public String toString() {
return str;
}
}


@Expose
@ConfigLink(owner = DraconicSacrificeTrackerConfig.class, field = "enabled")
public Position position = new Position(201, 199, false, true);

}
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ public class MiscConfig {
@Accordion
public PatcherCoordsWaypointConfig patcherCoordsWaypoint = new PatcherCoordsWaypointConfig();

@Expose
@ConfigOption(name = "Dragonic Sacrifice Tracker", desc = "")
@Accordion
public DraconicSacrificeTrackerConfig draconicSacrificeTracker = new DraconicSacrificeTrackerConfig();
superhize marked this conversation as resolved.
Show resolved Hide resolved

@Expose
@ConfigOption(name = "Show Outside SB", desc = "Show these features outside of SkyBlock.")
@ConfigEditorDraggableList
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import at.hannibal2.skyhanni.features.inventory.wardrobe.WardrobeAPI;
import at.hannibal2.skyhanni.features.mining.fossilexcavator.ExcavatorProfitTracker;
import at.hannibal2.skyhanni.features.mining.powdertracker.PowderTracker;
import at.hannibal2.skyhanni.features.misc.DraconicSacrificeTracker;
import at.hannibal2.skyhanni.features.misc.trevor.TrevorTracker;
import at.hannibal2.skyhanni.features.rift.area.westvillage.VerminTracker;
import at.hannibal2.skyhanni.features.rift.area.westvillage.kloon.KloonTerminal;
Expand Down Expand Up @@ -638,6 +639,9 @@ public static class WardrobeStorage {
public Integer currentSlot = null;
}

@Expose
public DraconicSacrificeTracker.Data draconicSacrificeTracker = new DraconicSacrificeTracker.Data();

@Expose
public UpgradeReminder.CommunityShopUpgrade communityShopProfileUpgrade = null;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
package at.hannibal2.skyhanni.features.misc

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.CollectionUtils.addAsSingletonList
import at.hannibal2.skyhanni.utils.CollectionUtils.addOrPut
import at.hannibal2.skyhanni.utils.LocationUtils.isPlayerInside
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.NEUItems.getItemStack
import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators
import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher
import at.hannibal2.skyhanni.utils.renderables.Renderable
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker
import at.hannibal2.skyhanni.utils.tracker.TrackerData
import com.google.gson.annotations.Expose
import net.minecraft.util.AxisAlignedBB
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

@SkyHanniModule
object DraconicSacrificeTracker {

private val config get() = SkyHanniMod.feature.misc.draconicSacrificeTracker
private val patternGroup = RepoPattern.group("misc.draconicsacrifice")
private val sacrificeLoot by patternGroup.pattern(
"sacrifice",
"§c§lSACRIFICE! §r§eYou turned §r§\\w(?<item>.*) §r§einto §r§d(?<amount>\\d+) Dragon Essence§r§e!",
)
private val bonusLoot by patternGroup.pattern(
"bonus",
"§c§lBONUS LOOT! §r§eYou also received §r(?:§\\w(?<amount>\\d+)?x)?(?: §r)?(?<item>.*) §r§efrom your sacrifice!",
)

private val tracker = SkyHanniTracker("Draconic Sacrifice Tracker", { Data() }, { it.draconicSacrificeTracker }) {
formatDisplay(drawDisplay(it))
}
private val altarArea = AxisAlignedBB(-601.0, 4.0, -282.0, -586.0, 15.0, -269.0)

class Data : TrackerData() {

override fun reset() {
bonusRewards.clear()
itemsSacrifice = 0
essences = 0
}

@Expose
var itemsSacrifice = 0

@Expose
var essences = 0

@Expose
var bonusRewards: MutableMap<BonusReward, Long> = mutableMapOf();

Check failure on line 58 in src/main/java/at/hannibal2/skyhanni/features/misc/DraconicSacrificeTracker.kt

View workflow job for this annotation

GitHub Actions / Check Style

[ktlint] reported by reviewdog 🐶 Unnecessary semicolon Raw Output: src/main/java/at/hannibal2/skyhanni/features/misc/DraconicSacrificeTracker.kt:58:73: error: Unnecessary semicolon (standard:no-semi)
superhize marked this conversation as resolved.
Show resolved Hide resolved
}

private fun formatDisplay(map: List<List<Any>>): List<List<Any>> {
val newList = mutableListOf<List<Any>>()
for (index in config.textFormat) {
// TODO, change functionality to use enum rather than ordinals
newList.add(map[index.ordinal])
}
return newList
}

private fun drawDisplay(data: Data): List<List<Any>> = buildList {
addAsSingletonList(Renderable.string("§5§lDraconic Sacrifice Tracker"))
addAsSingletonList(Renderable.string("§6${data.itemsSacrifice.addSeparators()} Items Sacrified"))
addAsSingletonList(Renderable.string("§b${data.essences.addSeparators()} §5Dragon Essences"))

for (reward in BonusReward.entries) {
val count = data.bonusRewards[reward] ?: 0
add(
buildList {
add(Renderable.itemStack(reward.internalName.getItemStack()))
add("§b${count} ${reward.displayName}")
},
)
}
}

@SubscribeEvent
fun onChat(event: LorenzChatEvent) {
val msg = event.message
sacrificeLoot.matchMatcher(msg) {
val amount = group("amount").toInt()
tracker.modify {
it.itemsSacrifice += 1
it.essences += amount
}
}

bonusLoot.matchMatcher(msg) {
val item = group("item")
val amount = group("amount").toLongOrNull() ?: 1L
BonusReward.entries.find { it.displayName == item }?.let { reward ->
tracker.modify {
it.bonusRewards.addOrPut(reward, amount)
}
}
}

tracker.update()
}

@SubscribeEvent
fun onRender(event: GuiRenderEvent.GuiOverlayRenderEvent) {
if (!isEnabled()) return
if (config.onlyInVoidSlate && !altarArea.isPlayerInside()) return

tracker.renderDisplay(config.position)
}

private fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled

enum class BonusReward(
val internalName: NEUInternalName,
val displayName: String,
) {
RITUAL_RESIDUE("RITUAL_RESIDUE".asInternalName(), "§5Ritual Residue"),
SUMMONING_EYE("SUMMONING_EYE".asInternalName(), "§5Summoning Eye"),
DRAGON_HORN("DRAGON_HORN".asInternalName(), "§5Dragon Horn"),
DRAGON_CLAW("DRAGON_CLAW".asInternalName(), "§5Dragon Claw"),
ENCHANTED_ENDER_PEARL("ENCHANTED_ENDER_PEARL".asInternalName(), "§aEnchanted Ender Pearl"),
ENCHANTED_EYE_OF_ENDER("ENCHANTED_EYE_OF_ENDER".asInternalName(), "§aEnchanted Eye Of Ender"),
ENCHANTED_END_STONE("ENCHANTED_END_STONE".asInternalName(), "§aEnchanted End Stone"),
ENCHANTED_OBSIDIAN("ENCHANTED_OBSIDIAN".asInternalName(), "§aEnchanted Obsidian"),
YOUNG_DRAGON_FRAGMENT("YOUNG_FRAGMENT".asInternalName(), "§5Young Dragon Fragment"),
OLD_DRAGON_FRAGMENT("OLD_FRAGMENT".asInternalName(), "§5Old Dragon Fragment"),
STRONG_DRAGON_FRAGMENT("STRONG_FRAGMENT".asInternalName(), "§5Strong Dragon Fragment"),
WISE_DRAGON_FRAGMENT("WISE_FRAGMENT".asInternalName(), "§5Wise Dragon Fragment"),
UNSTABLE_DRAGON_FRAGMENT("UNSTABLE_FRAGMENT".asInternalName(), "§5Unstable Dragon Fragment"),
PROTECTOR_DRAGON_FRAGMENT("PROTECTOR_FRAGMENT".asInternalName(), "§5Protector Dragon Fragment"),
SUPERIOR_DRAGON_FRAGMENT("SUPERIOR_FRAGMENT".asInternalName(), "§5Superior Dragon Fragment"),
HOLY_DRAGON_FRAGMENT("HOLY_FRAGMENT".asInternalName(), "§5Holy Dragon Fragment"),
;

Check failure on line 140 in src/main/java/at/hannibal2/skyhanni/features/misc/DraconicSacrificeTracker.kt

View workflow job for this annotation

GitHub Actions / Check Style

[ktlint] reported by reviewdog 🐶 Unnecessary semicolon Raw Output: src/main/java/at/hannibal2/skyhanni/features/misc/DraconicSacrificeTracker.kt:140:9: error: Unnecessary semicolon (standard:no-semi)
}
}
Loading