diff --git a/build.gradle.kts b/build.gradle.kts index a5b6af8fb7c1..90e8ddd57d22 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,6 +165,7 @@ loom { if (SystemUtils.IS_OS_MAC_OSX) { vmArgs.remove("-XstartOnFirstThread") } + vmArgs.add("-Xmx4G") } "server" { isIdeConfigGenerated = false diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 7dd6e9515649..ac32e2eb1e8b 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.DungeonMilestonesDisplay import at.hannibal2.skyhanni.features.dungeon.DungeonRankTabListColor import at.hannibal2.skyhanni.features.dungeon.DungeonTeammateOutlines import at.hannibal2.skyhanni.features.dungeon.HighlightDungeonDeathmite +import at.hannibal2.skyhanni.features.dungeon.TerracottaPhase import at.hannibal2.skyhanni.features.event.UniqueGiftingOpportunitiesFeatures import at.hannibal2.skyhanni.features.event.diana.BurrowWarpHelper import at.hannibal2.skyhanni.features.event.diana.DianaProfitTracker @@ -198,6 +199,7 @@ import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorDropStatistics import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorFeatures import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorTimer import at.hannibal2.skyhanni.features.garden.visitor.HighlightVisitorsOutsideOfGarden +import at.hannibal2.skyhanni.features.garden.visitor.NPCVisitorFix import at.hannibal2.skyhanni.features.garden.visitor.VisitorListener import at.hannibal2.skyhanni.features.inventory.AuctionsHighlighter import at.hannibal2.skyhanni.features.inventory.ChestValue @@ -281,7 +283,6 @@ import at.hannibal2.skyhanni.features.misc.trevor.TrevorTracker import at.hannibal2.skyhanni.features.misc.update.UpdateManager import at.hannibal2.skyhanni.features.misc.visualwords.ModifyVisualWords import at.hannibal2.skyhanni.features.nether.PabloHelper -import at.hannibal2.skyhanni.features.nether.QuestItemHelper import at.hannibal2.skyhanni.features.nether.SulphurSkitterBox import at.hannibal2.skyhanni.features.nether.VolcanoExplosivityDisplay import at.hannibal2.skyhanni.features.nether.ashfang.AshfangBlazes @@ -352,6 +353,7 @@ import at.hannibal2.skyhanni.utils.EntityOutlineRenderer import at.hannibal2.skyhanni.utils.KeyboardManager import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.MinecraftConsoleFilter.Companion.initLogging +import at.hannibal2.skyhanni.utils.NEUItems import at.hannibal2.skyhanni.utils.NEUVersionCheck.checkIfNeuIsLoaded import at.hannibal2.skyhanni.utils.TabListData import at.hannibal2.skyhanni.utils.UtilsPatterns @@ -457,6 +459,7 @@ class SkyHanniMod { loadModule(FishingAPI) loadModule(FishingDetection) loadModule(LorenzUtils) + loadModule(NEUItems) // features loadModule(BazaarOrderHelper()) @@ -568,6 +571,7 @@ class SkyHanniMod { loadModule(MiscFeatures()) loadModule(SkyMartCopperPrice()) loadModule(GardenVisitorFeatures()) + loadModule(NPCVisitorFix) loadModule(GardenInventoryNumbers()) loadModule(GardenVisitorTimer()) loadModule(MinionXp()) @@ -696,7 +700,7 @@ class SkyHanniMod { loadModule(GlowingDroppedItems()) loadModule(DungeonTeammateOutlines()) loadModule(DungeonRankTabListColor()) - loadModule(QuestItemHelper()) + loadModule(TerracottaPhase()) loadModule(VolcanoExplosivityDisplay()) loadModule(PlayerChatSymbols()) loadModule(FixNEUHeavyPearls()) diff --git a/src/main/java/at/hannibal2/skyhanni/config/Storage.java b/src/main/java/at/hannibal2/skyhanni/config/Storage.java index 6e899692ca77..486ec53699f1 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/Storage.java +++ b/src/main/java/at/hannibal2/skyhanni/config/Storage.java @@ -314,6 +314,9 @@ public static class FarmingWeightConfig { @Expose public int lastFarmingWeightLeaderboard = -1; } + + @Expose + public Map npcVisitorLocations = new HashMap<>(); } @Expose 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 d6f3d2fbd855..a2820fbfc525 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -413,6 +413,7 @@ object Commands { registerCommand("pk", "Kick a specific party member") { PartyCommands.kick(it) } registerCommand("pt", "Transfer the party to another party member") { PartyCommands.transfer(it) } registerCommand("pp", "Promote a specific party member") { PartyCommands.promote(it) } + registerCommand("pd", "Disbands the party") { PartyCommands.disband() } } private fun commandHelp(args: Array) { diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/combat/MobsConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/combat/MobsConfig.java index 3514c6729464..552e64c2100e 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/combat/MobsConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/combat/MobsConfig.java @@ -7,7 +7,7 @@ public class MobsConfig { @Expose - @ConfigOption(name = "Area Boss", desc = "Highlight Golden Ghoul, Old Wolf, Voidling Extremist and Millenia-Aged Blaze.") + @ConfigOption(name = "Area Boss Highlighter", desc = "Highlight Golden Ghoul, Old Wolf, Voidling Extremist and Millenia-Aged Blaze.") @ConfigEditorBoolean @FeatureToggle public boolean areaBossHighlight = true; @@ -53,7 +53,7 @@ public class MobsConfig { @Expose @ConfigOption( - name = "Area Boss", + name = "Area Boss Timer", desc = "Show a timer when Golden Ghoul, Old Wolf, Voidling Extremist or Millenia-Aged Blaze respawns. " + "§cSometimes it takes 20-30 seconds to calibrate correctly." ) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/commands/CommandsConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/commands/CommandsConfig.java index f6ff5ade2fb7..4003cfb99d1f 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/commands/CommandsConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/commands/CommandsConfig.java @@ -19,7 +19,7 @@ public class CommandsConfig { public FandomWikiCommandConfig fandomWiki = new FandomWikiCommandConfig(); @ConfigOption(name = "Party Commands", desc = "Shortens party commands and allows tab-completing for them. " + - "\n§eCommands: /pt /pp /pko /pk §7SkyBlock command §e/pt §7to check the play time still works.") + "\n§eCommands: /pt /pp /pko /pk /pd §7SkyBlock command §e/pt §7to check the play time still works.") @Expose @ConfigEditorBoolean @FeatureToggle diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/crimsonisle/CrimsonIsleConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/crimsonisle/CrimsonIsleConfig.java index f46126ed6131..995d615282a7 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/crimsonisle/CrimsonIsleConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/crimsonisle/CrimsonIsleConfig.java @@ -26,14 +26,7 @@ public class CrimsonIsleConfig { public SulphurSkitterBoxConfig sulphurSkitterBoxConfig = new SulphurSkitterBoxConfig(); @Expose - @ConfigOption(name = "Quest Item Helper", desc = "When you open the fetch item quest in the town board, " + - "it shows a clickable chat message that will grab the items needed from the sacks.") - @ConfigEditorBoolean - @FeatureToggle - public boolean questItemHelper = false; - - @Expose - @ConfigOption(name = "Pablo NPC Helper", desc = "Similar to Quest Item Helper, shows a clickable message that grabs the flower needed from sacks.") + @ConfigOption(name = "Pablo NPC Helper", desc = "Shows a clickable message that grabs the flower needed from your sacks.") @ConfigEditorBoolean @FeatureToggle public boolean pabloHelper = false; diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/DungeonConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/DungeonConfig.java index 84cba4de76f2..0b1eecff69c5 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/DungeonConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/DungeonConfig.java @@ -86,6 +86,12 @@ public class DungeonConfig { @Accordion public LividFinderConfig lividFinder = new LividFinderConfig(); + + @Expose + @ConfigOption(name = "Terracotta Phase", desc = "") + @Accordion + public TerracottaPhaseConfig terracottaPhase = new TerracottaPhaseConfig(); + @Expose @ConfigOption(name = "Moving Skeleton Skulls", desc = "Highlight Skeleton Skulls when combining into an " + "orange Skeletor (not useful when combined with feature Hide Skeleton Skull).") diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/TerracottaPhaseConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/TerracottaPhaseConfig.java new file mode 100644 index 000000000000..b546bc8ec0a0 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/TerracottaPhaseConfig.java @@ -0,0 +1,20 @@ +package at.hannibal2.skyhanni.config.features.dungeon; + +import at.hannibal2.skyhanni.config.FeatureToggle; +import com.google.gson.annotations.Expose; +import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; +import io.github.moulberry.moulconfig.annotations.ConfigOption; + +public class TerracottaPhaseConfig { + + @Expose + @ConfigOption(name = "Hide Particles", desc = "Hide particles that spawn from terracottas during sadan fight.") + @ConfigEditorBoolean + @FeatureToggle + public boolean hideParticles = false; + + @Expose + @ConfigOption(name = "Hide Damage Splash", desc = "Hide damage splashes during the terracotta phase.") + @ConfigEditorBoolean + public boolean hideDamageSplash = false; +} diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/misc/EstimatedItemValueConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/misc/EstimatedItemValueConfig.java index 2513cd66bca3..4608f1023f07 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/misc/EstimatedItemValueConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/misc/EstimatedItemValueConfig.java @@ -47,6 +47,21 @@ public class EstimatedItemValueConfig { @FeatureToggle public boolean armor = true; + @Expose + @ConfigOption(name = "Ignore Helmet Skins", desc = "Ignore helmet Skins from the total value.") + @ConfigEditorBoolean + public boolean ignoreHelmetSkins = false; + + @Expose + @ConfigOption(name = "Ignore Armor Dyes", desc = "Ignore Armor Dyes from the total value.") + @ConfigEditorBoolean + public boolean ignoreArmorDyes = false; + + @Expose + @ConfigOption(name = "Ignore Runes", desc = "Ignore Runes from the total value.") + @ConfigEditorBoolean + public boolean ignoreRunes = false; + @Expose public Position itemPriceDataPos = new Position(140, 90, false, true); } diff --git a/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt b/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt index 231f059d1c76..646337a27c00 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt @@ -7,14 +7,16 @@ import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.utils.APIUtil import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.put +import at.hannibal2.skyhanni.utils.SimpleTimeMark import io.github.moulberry.notenoughupdates.util.SkyBlockTime import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.time.Duration.Companion.minutes class MayorElection { - private var lastUpdate = 0L + private var lastUpdate = SimpleTimeMark.farPast() private var dispatcher = Dispatchers.IO companion object { @@ -37,20 +39,20 @@ class MayorElection { } private fun check() { - if (System.currentTimeMillis() > lastUpdate + 60_000 * 5) { - lastUpdate = System.currentTimeMillis() - SkyHanniMod.coroutineScope.launch { - val url = "https://api.hypixel.net/v2/resources/skyblock/election" - val jsonObject = withContext(dispatcher) { APIUtil.getJSONResponse(url) } - rawMayorData = ConfigManager.gson.fromJson(jsonObject, MayorJson::class.java) - val data = rawMayorData ?: return@launch - val map = mutableMapOf() - map put data.mayor.election.getPairs() - data.current?.let { - map put data.current.getPairs() - } - candidates = map + if (lastUpdate.passedSince() < 20.minutes) return + lastUpdate = SimpleTimeMark.now() + + SkyHanniMod.coroutineScope.launch { + val url = "https://api.hypixel.net/v2/resources/skyblock/election" + val jsonObject = withContext(dispatcher) { APIUtil.getJSONResponse(url) } + rawMayorData = ConfigManager.gson.fromJson(jsonObject, MayorJson::class.java) + val data = rawMayorData ?: return@launch + val map = mutableMapOf() + map put data.mayor.election.getPairs() + data.current?.let { + map put data.current.getPairs() } + candidates = map } checkCurrentMayor() diff --git a/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt index 454074d3dad8..fe6dc189d83a 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt @@ -24,6 +24,7 @@ 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.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import com.google.gson.annotations.Expose import net.minecraft.item.ItemStack import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -35,12 +36,19 @@ object SackAPI { var inSackInventory = false - // TODO USE SH-REPO - private val sackPattern = "^(.* Sack|Enchanted .* Sack)$".toPattern() - private val numPattern = - "(?:(?:§[0-9a-f](?I{1,3})§7:)?|(?:§7Stored:)?) (?§[0-9a-f])(?[0-9.,kKmMbB]+)§7/(?\\d+(?:[0-9.,]+)?[kKmMbB]?)".toPattern() - private val gemstonePattern = - " §[0-9a-f](?[A-z]*): §[0-9a-f](?\\d+(?:\\.\\d+)?(?:(?:,\\d+)?)+[kKmM]?)(?: §[0-9a-f]\\(\\d+(?:\\.\\d+)?(?:(?:,\\d+)?)+[kKmM]?\\))?".toPattern() + private val patternGroup = RepoPattern.group("data.sacks") + private val sackPattern by patternGroup.pattern( + "sack", + "^(.* Sack|Enchanted .* Sack)\$" + ) + private val numPattern by patternGroup.pattern( + "number", + "(?:(?:§[0-9a-f](?I{1,3})§7:)?|(?:§7Stored:)?) (?§[0-9a-f])(?[0-9.,kKmMbB]+)§7/(?\\d+(?:[0-9.,]+)?[kKmMbB]?)" + ) + private val gemstonePattern by patternGroup.pattern( + "gemstone", + " §[0-9a-f](?[A-z]*): §[0-9a-f](?\\d+(?:\\.\\d+)?(?:(?:,\\d+)?)+[kKmM]?)(?: §[0-9a-f]\\(\\d+(?:\\.\\d+)?(?:(?:,\\d+)?)+[kKmM]?\\))?" + ) private var isRuneSack = false private var isGemstoneSack = false @@ -286,7 +294,7 @@ object SackAPI { return sackData[item] ?: return SackItem(0, 0, SackStatus.MISSING) } - sackData = sackData.editCopy { this[item] = SackItem(0, 0, SackStatus.OUTDATED) } + sackData = sackData.editCopy { this[item] = SackItem(0, 0, SackStatus.MISSING) } return sackData[item] ?: return SackItem(0, 0, SackStatus.MISSING) } diff --git a/src/main/java/at/hannibal2/skyhanni/data/jsonobjects/repo/CrimsonIsleReputationJson.java b/src/main/java/at/hannibal2/skyhanni/data/jsonobjects/repo/CrimsonIsleReputationJson.java index f349aef9a892..0ab0e52ff617 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/jsonobjects/repo/CrimsonIsleReputationJson.java +++ b/src/main/java/at/hannibal2/skyhanni/data/jsonobjects/repo/CrimsonIsleReputationJson.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.data.jsonobjects.repo; +import at.hannibal2.skyhanni.utils.NEUInternalName; import com.google.gson.annotations.Expose; import java.util.List; @@ -26,7 +27,7 @@ public class CrimsonIsleReputationJson { public static class ReputationQuest { @Expose - public String item; + public NEUInternalName item; @Expose public List location; diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt index 416f498428f8..ac0d3a6b8167 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt @@ -302,7 +302,7 @@ class ChatFilter { ) private val fireSalePatterns = listOf( "§c♨ §eFire Sales for .* §eare starting soon!".toPattern(), - "§c\\s*♨ .* (?:Skin|Rune) §e(?:for a limited time )?\\(.* §eleft\\)(?:§c|!)".toPattern(), + "§c\\s*♨ .* (?:Skin|Rune|Dye) §e(?:for a limited time )?\\(.* §eleft\\)(?:§c|!)".toPattern(), "§c♨ §eVisit the Community Shop in the next §c.* §eto grab yours! §a§l\\[WARP]".toPattern(), "§c♨ §eA Fire Sale for .* §eis starting soon!".toPattern(), "§c♨ §r§eFire Sale for .* §r§eended!".toPattern(), diff --git a/src/main/java/at/hannibal2/skyhanni/features/combat/damageindicator/DamageIndicatorManager.kt b/src/main/java/at/hannibal2/skyhanni/features/combat/damageindicator/DamageIndicatorManager.kt index 791fbf9e4421..dc00b93ef7ff 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/combat/damageindicator/DamageIndicatorManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/combat/damageindicator/DamageIndicatorManager.kt @@ -106,7 +106,7 @@ class DamageIndicatorManager { fun removeDamageIndicator(type: BossType) { data = data.editCopy { - values.removeIf {it.bossType == type} + values.removeIf { it.bossType == type } } } } @@ -642,6 +642,7 @@ class DamageIndicatorManager { } //Hit phase + var hitPhaseText: String? = null val armorStandHits = entity.getNameTagWith(3, " Hit") if (armorStandHits != null) { val maxHits = when (entityData.bossType) { @@ -655,23 +656,25 @@ class DamageIndicatorManager { group("hits").toInt() } ?: error("No hits number found in ender slayer name '${armorStandHits.name}'") - return NumberUtil.percentageColor(hits.toLong(), maxHits.toLong()).getChatColor() + "$hits Hits" + hitPhaseText = NumberUtil.percentageColor(hits.toLong(), maxHits.toLong()).getChatColor() + "$hits Hits" } //Laser phase if (config.enderSlayer.laserPhaseTimer && entity.ridingEntity != null) { - //TODO more tests, more exact values, better logic? idk make this working perfectly pls - val totalTimeAlive = 7.4.seconds + val totalTimeAlive = 8.2.seconds val ticksAlive = entity.ridingEntity.ticksExisted.ticks val remainingTime = totalTimeAlive - ticksAlive val formatDelay = formatDelay(remainingTime) - if (config.enderSlayer.showHealthDuringLaser) { + if (config.enderSlayer.showHealthDuringLaser || hitPhaseText != null) { entityData.nameSuffix = " §f$formatDelay" } else { return formatDelay } } + hitPhaseText?.let { + return it + } return result } diff --git a/src/main/java/at/hannibal2/skyhanni/features/commands/PartyCommands.kt b/src/main/java/at/hannibal2/skyhanni/features/commands/PartyCommands.kt index 79df780dbd4b..5f3217cdfbc6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/commands/PartyCommands.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/commands/PartyCommands.kt @@ -17,6 +17,12 @@ object PartyCommands { LorenzUtils.sendCommandToServer("party kickoffline") } + fun disband() { + if (!config.shortCommands) return + if (PartyAPI.partyMembers.isEmpty()) return + LorenzUtils.sendCommandToServer("party disband") + } + fun warp() { if (!config.shortCommands) return if (PartyAPI.partyMembers.isEmpty()) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHighlightClickedBlocks.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHighlightClickedBlocks.kt index d97f1b327f12..36c9f780d23c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHighlightClickedBlocks.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHighlightClickedBlocks.kt @@ -55,11 +55,6 @@ class DungeonHighlightClickedBlocks { else -> return } - // Water room - if (DungeonAPI.getRoomID() == "-60,-60") { - return - } - if (type == ClickedBlockType.WITHER_ESSENCE) { val text = BlockUtils.getTextureFromSkull(position.toBlockPos()) if (text != "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQ" + @@ -70,8 +65,8 @@ class DungeonHighlightClickedBlocks { } } - // TODO hide in water room -// if (nearWaterRoom() && type == ClickedBlockType.LEVER) return + val inWaterRoom = DungeonAPI.getRoomID() == "-60,-60" + if (inWaterRoom && type == ClickedBlockType.LEVER) return val color = getNextColor() val displayText = color.getChatColor() + "Clicked " + type.display diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/TerracottaPhase.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/TerracottaPhase.kt new file mode 100644 index 000000000000..9cc9929221d2 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/TerracottaPhase.kt @@ -0,0 +1,49 @@ +package at.hannibal2.skyhanni.features.dungeon + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.events.ReceiveParticleEvent +import at.hannibal2.skyhanni.features.combat.damageindicator.DamageIndicatorManager +import at.hannibal2.skyhanni.utils.LorenzUtils +import net.minecraft.entity.EntityLivingBase +import net.minecraftforge.client.event.RenderLivingEvent +import net.minecraftforge.fml.common.eventhandler.EventPriority +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class TerracottaPhase { + private val config get() = SkyHanniMod.feature.dungeon.terracottaPhase + + private var inTerracottaPhase = false + + @SubscribeEvent + fun onChat(event: LorenzChatEvent) { + if (!isEnabled()) return + + if (event.message == "§c[BOSS] Sadan§r§f: So you made it all the way here... Now you wish to defy me? Sadan?!") { + inTerracottaPhase = true + } + + if (event.message == "§c[BOSS] Sadan§r§f: ENOUGH!") { + inTerracottaPhase = false + } + } + + @SubscribeEvent(priority = EventPriority.HIGH) + fun onRenderLiving(event: RenderLivingEvent.Specials.Pre) { + if (isActive() && config.hideDamageSplash && DamageIndicatorManager.isDamageSplash(event.entity)) { + event.isCanceled = true + } + } + + @SubscribeEvent + fun onReceiveParticle(event: ReceiveParticleEvent) { + if (isActive() && config.hideParticles) { + event.isCanceled = true + } + } + + private fun isActive() = isEnabled() && inTerracottaPhase + + private fun isEnabled() = + LorenzUtils.inDungeons && DungeonAPI.inBossRoom && DungeonAPI.getCurrentBoss() == DungeonAPI.DungeonFloor.F6 +} 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 1a958a7aec6f..1ab640b2d547 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 @@ -489,7 +489,7 @@ class GardenVisitorFeatures { val visitorName = visitor.visitorName val entity = visitor.getEntity() if (entity == null) { - findNametag(visitorName.removeColor())?.let { + NPCVisitorFix.findNametag(visitorName.removeColor())?.let { findEntity(it, visitor) } } @@ -527,33 +527,6 @@ class GardenVisitorFeatures { } } - private fun findNametag(visitorName: String): EntityArmorStand? { - val foundVisitorNameTags = mutableListOf() - for (entity in EntityUtils.getEntities()) { - if (entity.name.removeColor() == visitorName) { - foundVisitorNameTags.add(entity) - } - } - - if (visitorName in listOf("Jacob", "Anita")) { - // Only detect jacob/anita npc if the "wrong" npc got found as well - if (foundVisitorNameTags.size != 2) return null - - for (tag in foundVisitorNameTags.toMutableList()) { - for (entity in EntityUtils.getEntities()) { - if (entity in foundVisitorNameTags) continue - val distance = entity.getLorenzVec().distance(tag.getLorenzVec()) - if (distance < 1.5 && entity.name == "§bSam") { - foundVisitorNameTags.remove(tag) - } - } - } - } - - if (foundVisitorNameTags.size != 1) return null - return foundVisitorNameTags[0] - } - private fun hasItemsInInventory(visitor: VisitorAPI.Visitor): Boolean { var ready = true for ((internalName, required) in visitor.shoppingList) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/NPCVisitorFix.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/NPCVisitorFix.kt new file mode 100644 index 000000000000..f4256010034c --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/NPCVisitorFix.kt @@ -0,0 +1,98 @@ +package at.hannibal2.skyhanni.features.garden.visitor + +import at.hannibal2.skyhanni.data.ProfileStorageData +import at.hannibal2.skyhanni.events.InventoryOpenEvent +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.events.garden.visitor.VisitorOpenEvent +import at.hannibal2.skyhanni.utils.DelayedRun +import at.hannibal2.skyhanni.utils.EntityUtils +import at.hannibal2.skyhanni.utils.LocationUtils.distanceTo +import at.hannibal2.skyhanni.utils.LocationUtils.distanceToPlayer +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.SimpleTimeMark +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.getLorenzVec +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern +import net.minecraft.entity.item.EntityArmorStand +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.seconds + +/** + * Fixing the visitor detection problem with Anita and Jacob, as those two are on the garden twice when visiting. + */ +object NPCVisitorFix { + private val storage get() = ProfileStorageData.profileSpecific?.garden + private val staticVisitors = listOf("Jacob", "Anita") + private val barnSkinChangePattern by RepoPattern.pattern("garden.barn.skin.change", "§aChanging Barn skin to §r.*") + + @SubscribeEvent + fun onInventoryOpen(event: InventoryOpenEvent) { + val name = staticVisitors.firstOrNull { event.inventoryName.contains(it) } ?: return + val nearest = findNametags(name).firstOrNull { it.distanceToPlayer() < 3 } ?: return + DelayedRun.runDelayed(200.milliseconds) { + saveStaticVisitor(name, nearest) + } + } + + private fun saveStaticVisitor(name: String, entity: EntityArmorStand) { + // clicked on the real visitor, ignoring + if (lastVisitorOpen.passedSince() < 1.seconds) return + + val storage = storage ?: return + + val location = entity.getLorenzVec() + storage.npcVisitorLocations[name]?.let { + // alrady stored + if (it.distance(location) < 1) return + } + + storage.npcVisitorLocations[name] = location + LorenzUtils.chat("Saved $name NPC location. Real $name visitors are now getting detected correctly.") + } + + private var lastVisitorOpen = SimpleTimeMark.farPast() + + @SubscribeEvent + fun onVisitorOpen(event: VisitorOpenEvent) { + lastVisitorOpen = SimpleTimeMark.now() + } + + @SubscribeEvent + fun onChat(event: LorenzChatEvent) { + barnSkinChangePattern.matchMatcher(event.message) { + storage?.npcVisitorLocations?.clear() + } + } + + fun findNametag(visitorName: String): EntityArmorStand? { + val nametags = findNametags(visitorName) + if (nametags.isEmpty()) return null + + if (visitorName !in staticVisitors) { + return nametags[0] + } + + val staticLocation = storage?.npcVisitorLocations?.get(visitorName) ?: return null + + for (entity in nametags.toMutableList()) { + val distance = entity.distanceTo(staticLocation) + if (distance < 3) { + nametags.remove(entity) + } + } + + return nametags.firstOrNull() + } + + private fun findNametags(visitorName: String): MutableList { + val foundVisitorNameTags = mutableListOf() + for (entity in EntityUtils.getEntities()) { + if (entity.name.removeColor() == visitorName) { + foundVisitorNameTags.add(entity) + } + } + return foundVisitorNameTags + } +} 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 2ff799e77eae..fbaed21a9abb 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 @@ -4,7 +4,6 @@ import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName import at.hannibal2.skyhanni.utils.ItemUtils.getItemName -import at.hannibal2.skyhanni.utils.ItemUtils.getItemNameOrNull import at.hannibal2.skyhanni.utils.ItemUtils.getItemRarityOrNull import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.ItemUtils.isRune @@ -437,28 +436,30 @@ object EstimatedItemValueCalculator { private fun addHelmetSkin(stack: ItemStack, list: MutableList): Double { val internalName = stack.getHelmetSkin() ?: return 0.0 - - val price = internalName.getPrice() - val name = internalName.getNameOrRepoError() - val displayname = name ?: "§c${internalName.asString()}" - list.add("§7Skin: $displayname §7(§6" + NumberUtil.format(price) + "§7)") - if (name == null) { - list.add(" §8(Not yet in NEU Repo)") - } - return price + return addCosmetic(internalName, list, "Skin", config.ignoreHelmetSkins) } private fun addArmorDye(stack: ItemStack, list: MutableList): Double { val internalName = stack.getArmorDye() ?: return 0.0 + return addCosmetic(internalName, list, "Dye", config.ignoreArmorDyes) + } + private fun addCosmetic( + internalName: NEUInternalName, + list: MutableList, + label: String, + shouldIgnorePrice: Boolean + ): Double { val price = internalName.getPrice() val name = internalName.getNameOrRepoError() val displayname = name ?: "§c${internalName.asString()}" - list.add("§7Dye: $displayname §7(§6" + NumberUtil.format(price) + "§7)") + val color = if (shouldIgnorePrice) "§7" else "§6" + list.add("§7$label: $displayname §7($color" + NumberUtil.format(price) + "§7)") if (name == null) { list.add(" §8(Not yet in NEU Repo)") } - return price + + return if (shouldIgnorePrice) 0.0 else price } private fun addEnrichment(stack: ItemStack, list: MutableList): Double { @@ -476,14 +477,7 @@ object EstimatedItemValueCalculator { if (stack.getInternalName().isRune()) return 0.0 val internalName = stack.getRune() ?: return 0.0 - val price = internalName.getPrice() - val name = internalName.getItemNameOrNull() - val displayname = name ?: "§c${internalName.asString()}" - list.add("§7Rune: $displayname §7(§6" + NumberUtil.format(price) + "§7)") - if (name == null) { - list.add(" §8(Not yet in NEU Repo)") - } - return price + return addCosmetic(internalName, list, "Rune", config.ignoreRunes) } private fun NEUInternalName.getNameOrRepoError(): String? { diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/QuestItemHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/QuestItemHelper.kt deleted file mode 100644 index 40439571b272..000000000000 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/QuestItemHelper.kt +++ /dev/null @@ -1,47 +0,0 @@ -package at.hannibal2.skyhanni.features.nether - -import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.IslandType -import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent -import at.hannibal2.skyhanni.utils.InventoryUtils -import at.hannibal2.skyhanni.utils.ItemUtils.name -import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland -import at.hannibal2.skyhanni.utils.SimpleTimeMark -import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher -import at.hannibal2.skyhanni.utils.StringUtils.removeColor -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import kotlin.time.Duration.Companion.hours - -class QuestItemHelper { - private val config get() = SkyHanniMod.feature.crimsonIsle - - private val itemCollectionPattern = ". (?[\\w ]+) x(?\\d+)".toPattern() - private var lastSentMessage = SimpleTimeMark.farPast() - - @SubscribeEvent - fun onInventoryOpen(event: InventoryFullyOpenedEvent) { - if (!isEnabled()) return - if (event.inventoryName != "Fetch") return - if (lastSentMessage.passedSince() < 1.hours) return - - for ((_, item) in event.inventoryItems) { - val (questItem, need) = itemCollectionPattern.matchMatcher(item.displayName.removeColor()) { - group("name") to group("amount").toInt() - } ?: continue - - val have = InventoryUtils.countItemsInLowerInventory { it.name?.contains(questItem) == true } - if (have >= need) break - - val missingAmount = need - have - LorenzUtils.clickableChat( - "Click here to grab x$missingAmount $questItem from sacks!", - "gfs $questItem $missingAmount" - ) - lastSentMessage = SimpleTimeMark.now() - break - } - } - - fun isEnabled() = IslandType.CRIMSON_ISLE.isInIsland() && config.questItemHelper -} 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 d8f52a641f7c..028e56c91cf5 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 @@ -12,7 +12,7 @@ import at.hannibal2.skyhanni.utils.LorenzColor import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList import at.hannibal2.skyhanni.utils.LorenzVec -import at.hannibal2.skyhanni.utils.NEUItems +import at.hannibal2.skyhanni.utils.NEUItems.getItemStack import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -71,15 +71,11 @@ class DailyKuudraBossHelper(private val reputationHelper: CrimsonIsleReputationH val result = if (tier.doneToday) "§aDone" else "§bTodo" val displayName = tier.getDisplayName() val displayItem = tier.displayItem - if (displayItem == null) { - display.addAsSingletonList(" $displayName: $result") - } else { - val lineList = mutableListOf() - lineList.add(" ") - lineList.add(NEUItems.getItemStack(displayItem)) - lineList.add("$displayName: $result") - display.add(lineList) - } + val lineList = mutableListOf() + lineList.add(" ") + lineList.add(displayItem.getItemStack()) + lineList.add("$displayName: $result") + display.add(lineList) } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/KuudraTier.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/KuudraTier.kt index 15d0086b8e0c..6a509a39124e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/KuudraTier.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/KuudraTier.kt @@ -1,13 +1,14 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.dailykuudra import at.hannibal2.skyhanni.utils.LorenzVec +import at.hannibal2.skyhanni.utils.NEUInternalName class KuudraTier( val name: String, - val displayItem: String?, + val displayItem: NEUInternalName, val location: LorenzVec?, val tierNumber: Int, var doneToday: Boolean = false ) { fun getDisplayName() = "Tier $tierNumber ($name)" -} \ No newline at end of file +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/DailyQuestHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/DailyQuestHelper.kt index 2b2de9187eb3..5b0dbc670867 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/DailyQuestHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/DailyQuestHelper.kt @@ -2,6 +2,8 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest import at.hannibal2.skyhanni.config.Storage import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.data.SackAPI +import at.hannibal2.skyhanni.data.SackStatus import at.hannibal2.skyhanni.events.GuiContainerEvent import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent import at.hannibal2.skyhanni.events.LorenzChatEvent @@ -26,14 +28,14 @@ import at.hannibal2.skyhanni.features.nether.reputationhelper.miniboss.CrimsonMi import at.hannibal2.skyhanni.test.GriffinUtils.drawWaypointFilled import at.hannibal2.skyhanni.utils.InventoryUtils import at.hannibal2.skyhanni.utils.InventoryUtils.getInventoryName -import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.LorenzColor import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.LorenzVec -import at.hannibal2.skyhanni.utils.NEUItems +import at.hannibal2.skyhanni.utils.NEUItems.getItemStack +import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText import at.hannibal2.skyhanni.utils.RenderUtils.highlight import net.minecraft.client.gui.inventory.GuiChest @@ -47,7 +49,6 @@ class DailyQuestHelper(val reputationHelper: CrimsonIsleReputationHelper) { private val questLoader = QuestLoader(this) val quests = mutableListOf() - private val sacksCache = mutableMapOf() var greatSpook = false @SubscribeEvent @@ -101,38 +102,6 @@ class DailyQuestHelper(val reputationHelper: CrimsonIsleReputationHelper) { } } } - if (chestName == "Sack of Sacks") { - val fetchQuest = getQuest() ?: return - if (fetchQuest.state != QuestState.ACCEPTED) return - - val fetchItem = fetchQuest.itemName - for (slot in chest.inventorySlots) { - if (slot == null) continue - if (slot.slotNumber != slot.slotIndex) continue - val stack = slot.stack ?: continue - if (stack.name!!.contains("Enchanted")) continue - - if (stack.getLore().any { it.contains(fetchItem) }) { - slot highlight LorenzColor.AQUA - } - } - } - if (chestName.contains("Nether Sack")) { - val fetchQuest = getQuest() ?: return - if (fetchQuest.state != QuestState.ACCEPTED) return - - val fetchItem = fetchQuest.itemName - for (slot in chest.inventorySlots) { - if (slot == null) continue - if (slot.slotNumber != slot.slotIndex) continue - val stack = slot.stack ?: continue - val itemName = stack.name ?: continue - - if (itemName.contains(fetchItem)) { - slot highlight LorenzColor.AQUA - } - } - } } @SubscribeEvent @@ -247,16 +216,23 @@ class DailyQuestHelper(val reputationHelper: CrimsonIsleReputationHelper) { } val sacksText = if (quest is FetchQuest && quest.state != QuestState.COLLECTED) { - val name = quest.itemName.uppercase().replace(" ", "_") - val amount = sacksCache.getOrDefault(name, 0) - val needAmount = quest.needAmount - val amountFormat = LorenzUtils.formatInteger(amount) - val color = if (amount >= needAmount) { - "§a" + val sackItem = SackAPI.fetchSackItem(quest.displayItem) + val sackStatus = sackItem.getStatus() + + if (sackStatus == SackStatus.OUTDATED) { + " §7(§eSack data outdated§7)" } else { - "§c" + val amountInSacks = sackItem.amount + val needAmount = quest.needAmount + + val color = if (amountInSacks >= needAmount) { + "§a" + } else { + "§c" + } + " §7($color${amountInSacks.addSeparators()} §7in sacks)" } - " §7($color$amountFormat §7in sacks)" + } else { "" } @@ -268,32 +244,21 @@ class DailyQuestHelper(val reputationHelper: CrimsonIsleReputationHelper) { } val result = mutableListOf() - val internalItemName = quest.displayItem + val item = quest.displayItem.getItemStack() val displayName = if (category == QuestCategory.FETCH || category == QuestCategory.FISHING) { - if (internalItemName != null) { - val name = NEUItems.getItemStack(internalItemName).name - if (category == QuestCategory.FISHING) { - name!!.split(" ").dropLast(1).joinToString(" ") - } else name - - } else { - quest.displayName - } + val name = item.name + if (category == QuestCategory.FISHING) { + name!!.split(" ").dropLast(1).joinToString(" ") + } else name } else quest.displayName val categoryName = category.displayName - if (internalItemName == null) { - result.add(" $stateText$categoryName: §f$displayName$progressText$sacksText") - } else { - result.add(" $stateText$categoryName: ") - try { - result.add(NEUItems.getItemStack(internalItemName)) - } catch (e: RuntimeException) { - e.printStackTrace() - } - result.add("§f$displayName$progressText$sacksText") - } + + result.add(" $stateText$categoryName: ") + result.add(item) + result.add("§f$displayName$progressText$sacksText") + return result } diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/DojoQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/DojoQuest.kt index afd7d33d4002..770f636a8f08 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/DojoQuest.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/DojoQuest.kt @@ -2,11 +2,12 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzVec +import at.hannibal2.skyhanni.utils.NEUInternalName class DojoQuest( val dojoName: String, location: LorenzVec?, - displayItem: String?, + displayItem: NEUInternalName, dojoRankGoal: String, state: QuestState ) : diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/FetchQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/FetchQuest.kt index 645b09fdcb0a..4e5991c593e6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/FetchQuest.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/FetchQuest.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest import at.hannibal2.skyhanni.utils.LorenzVec +import at.hannibal2.skyhanni.utils.NEUInternalName -class FetchQuest(val itemName: String, location: LorenzVec?, displayItem: String?, state: QuestState, needAmount: Int) : - ProgressQuest(displayItem, location, QuestCategory.FETCH, itemName, state, needAmount) \ No newline at end of file +class FetchQuest(val itemName: String, location: LorenzVec?, displayItem: NEUInternalName, state: QuestState, needAmount: Int) : + ProgressQuest(displayItem, location, QuestCategory.FETCH, itemName, state, needAmount) diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/ProgressQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/ProgressQuest.kt index 23155eebb06c..4f69ac986567 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/ProgressQuest.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/ProgressQuest.kt @@ -1,13 +1,14 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest import at.hannibal2.skyhanni.utils.LorenzVec +import at.hannibal2.skyhanni.utils.NEUInternalName abstract class ProgressQuest( - displayItem: String?, + displayItem: NEUInternalName, location: LorenzVec?, questCategory: QuestCategory, displayName: String, state: QuestState, val needAmount: Int, var haveAmount: Int = 0 -) : Quest(displayItem, location, questCategory, displayName, state) \ No newline at end of file +) : Quest(displayItem, location, questCategory, displayName, state) diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/Quest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/Quest.kt index e5cd68162839..4c4e7218fc3b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/Quest.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/Quest.kt @@ -1,12 +1,13 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest import at.hannibal2.skyhanni.utils.LorenzVec +import at.hannibal2.skyhanni.utils.NEUInternalName abstract class Quest( - val displayItem: String?, + val displayItem: NEUInternalName, val location: LorenzVec?, val category: QuestCategory, val internalName: String, var state: QuestState, val displayName: String = internalName -) \ No newline at end of file +) diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/RescueMissionQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/RescueMissionQuest.kt index fbb266296a83..6f1e21f482e5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/RescueMissionQuest.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/RescueMissionQuest.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest import at.hannibal2.skyhanni.utils.LorenzVec +import at.hannibal2.skyhanni.utils.NEUInternalName -class RescueMissionQuest(displayItem: String?, location: LorenzVec?, state: QuestState) : - Quest(displayItem, location, QuestCategory.RESCUE, "Rescue Mission", state, "Rescue the NPC") \ No newline at end of file +class RescueMissionQuest(displayItem: NEUInternalName, location: LorenzVec?, state: QuestState) : + Quest(displayItem, location, QuestCategory.RESCUE, "Rescue Mission", state, "Rescue the NPC") diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/TrophyFishQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/TrophyFishQuest.kt index 5b8a37a54915..65b90d30760e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/TrophyFishQuest.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/TrophyFishQuest.kt @@ -1,12 +1,13 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest import at.hannibal2.skyhanni.utils.LorenzVec +import at.hannibal2.skyhanni.utils.NEUInternalName class TrophyFishQuest( val fishName: String, location: LorenzVec?, - displayItem: String?, + displayItem: NEUInternalName, state: QuestState, needAmount: Int ) : - ProgressQuest(displayItem, location, QuestCategory.FISHING, fishName, state, needAmount) \ No newline at end of file + ProgressQuest(displayItem, location, QuestCategory.FISHING, fishName, state, needAmount) diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/UnknownQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/UnknownQuest.kt index 02819a28ddce..ae7338684b97 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/UnknownQuest.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/UnknownQuest.kt @@ -1,4 +1,6 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest +import at.hannibal2.skyhanni.utils.NEUInternalName + class UnknownQuest(unknownName: String) : - Quest(null, null, QuestCategory.UNKNOWN, unknownName, QuestState.NOT_ACCEPTED) \ No newline at end of file + Quest(NEUInternalName.MISSING_ITEM, null, QuestCategory.UNKNOWN, unknownName, QuestState.NOT_ACCEPTED) diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/CrimsonMiniBoss.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/CrimsonMiniBoss.kt index ad5255aacd40..f5292c9fb6f8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/CrimsonMiniBoss.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/CrimsonMiniBoss.kt @@ -1,12 +1,13 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.miniboss import at.hannibal2.skyhanni.utils.LorenzVec +import at.hannibal2.skyhanni.utils.NEUInternalName import java.util.regex.Pattern class CrimsonMiniBoss( val displayName: String, - val displayItem: String?, + val displayItem: NEUInternalName, val location: LorenzVec?, val pattern: Pattern, var doneToday: Boolean = false -) \ 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 a182fb0b1a58..86a0cf061081 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 @@ -75,15 +75,12 @@ class DailyMiniBossHelper(private val reputationHelper: CrimsonIsleReputationHel val result = if (miniBoss.doneToday) "§aDone" else "§bTodo" val displayName = miniBoss.displayName val displayItem = miniBoss.displayItem - if (displayItem == null) { - display.addAsSingletonList(" $displayName: $result") - } else { - val lineList = mutableListOf() - lineList.add(" ") - lineList.add(getItemStack(displayItem)) - lineList.add("§5$displayName§7: $result") - display.add(lineList) - } + + val lineList = mutableListOf() + lineList.add(" ") + lineList.add(displayItem.getItemStack()) + lineList.add("§5$displayName§7: $result") + display.add(lineList) } } } diff --git a/src/main/java/at/hannibal2/skyhanni/test/HighlightMissingRepoItems.kt b/src/main/java/at/hannibal2/skyhanni/test/HighlightMissingRepoItems.kt index 2419d6161d1f..e70a572df685 100644 --- a/src/main/java/at/hannibal2/skyhanni/test/HighlightMissingRepoItems.kt +++ b/src/main/java/at/hannibal2/skyhanni/test/HighlightMissingRepoItems.kt @@ -3,14 +3,11 @@ package at.hannibal2.skyhanni.test import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.events.GuiContainerEvent -import at.hannibal2.skyhanni.events.RepositoryReloadEvent import at.hannibal2.skyhanni.utils.ItemUtils.getInternalNameOrNull import at.hannibal2.skyhanni.utils.LorenzColor import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.MultiFilter import at.hannibal2.skyhanni.utils.NEUItems import at.hannibal2.skyhanni.utils.RenderUtils.highlight -import at.hannibal2.skyhanni.data.jsonobjects.repo.MultiFilterJson import net.minecraft.client.Minecraft import net.minecraft.client.gui.inventory.GuiChest import net.minecraft.client.gui.inventory.GuiInventory @@ -19,7 +16,6 @@ import net.minecraftforge.fml.common.eventhandler.EventPriority import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class HighlightMissingRepoItems { - private val ignoreItems = MultiFilter() @SubscribeEvent(priority = EventPriority.LOWEST) fun onBackgroundDrawn(event: GuiContainerEvent.BackgroundDrawnEvent) { @@ -41,7 +37,7 @@ class HighlightMissingRepoItems { for (slot in slots) { val internalName = slot.stack?.getInternalNameOrNull() ?: continue if (NEUItems.allInternalNames.contains(internalName)) continue - if (ignoreItems.match(internalName.asString())) continue + if (NEUItems.ignoreItemsFilter.match(internalName.asString())) continue slot highlight LorenzColor.RED } @@ -52,12 +48,6 @@ class HighlightMissingRepoItems { NEUItems.allItemsCache = NEUItems.readAllNeuItems() } - @SubscribeEvent - fun onRepoReload(event: RepositoryReloadEvent) { - val ignoredItems = event.getConstant("IgnoredItems") - ignoreItems.load(ignoredItems) - } - @SubscribeEvent fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) { event.move(3, "dev.highlightMissingRepo", "dev.debug.highlightMissingRepo") diff --git a/src/main/java/at/hannibal2/skyhanni/utils/APIUtil.kt b/src/main/java/at/hannibal2/skyhanni/utils/APIUtil.kt index 1801e7802f75..43f262d5be8f 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/APIUtil.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/APIUtil.kt @@ -71,9 +71,11 @@ object APIUtil { e.printStackTrace() } else { - ErrorManager.logError( - Error("$apiName error for url: '$urlString'", e), - "Failed to load data from $apiName" + ErrorManager.logErrorWithData( + e, "$apiName error for url: '$urlString'", + "apiName" to apiName, + "urlString" to urlString, + "returnedData" to retSrc ) } } @@ -83,9 +85,10 @@ object APIUtil { if (silentError) { throw throwable } else { - ErrorManager.logError( - Error("$apiName error for url: '$urlString'", throwable), - "Failed to load data from $apiName" + ErrorManager.logErrorWithData( + throwable, "$apiName error for url: '$urlString'", + "apiName" to apiName, + "urlString" to urlString, ) } } finally { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt index 38a503901566..d193896cf911 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt @@ -228,13 +228,13 @@ object LorenzUtils { fun formatPercentage(percentage: Double, format: String?): String = DecimalFormat(format).format(percentage * 100).replace(',', '.') + "%" - @Deprecated("old code", ReplaceWith("addSeparator()")) + @Deprecated("old code", ReplaceWith("addSeparators()")) fun formatInteger(i: Int): String = i.addSeparators() - @Deprecated("old code", ReplaceWith("addSeparator()")) + @Deprecated("old code", ReplaceWith("addSeparators()")) fun formatInteger(l: Long): String = l.addSeparators() - @Deprecated("old code", ReplaceWith("round() and addSeparator()")) + @Deprecated("old code", ReplaceWith("round() and addSeparators()")) fun formatDouble(d: Double, round: Int = 1): String { return d.round(round).addSeparators() } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt b/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt index 8a909f15e7b7..cd1838bdc3c2 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt @@ -1,6 +1,8 @@ package at.hannibal2.skyhanni.utils import at.hannibal2.skyhanni.config.ConfigManager +import at.hannibal2.skyhanni.data.jsonobjects.repo.MultiFilterJson +import at.hannibal2.skyhanni.events.RepositoryReloadEvent import at.hannibal2.skyhanni.features.bazaar.BazaarDataHolder import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.ItemBlink.checkBlinkItem @@ -29,8 +31,8 @@ import net.minecraft.init.Blocks import net.minecraft.init.Items import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import org.lwjgl.opengl.GL11 -import java.util.regex.Pattern object NEUItems { val manager: NEUManager get() = NotEnoughUpdates.INSTANCE.manager @@ -38,9 +40,10 @@ object NEUItems { private val multiplierCache = mutableMapOf>() private val recipesCache = mutableMapOf>() private val ingredientsCache = mutableMapOf>() - private val enchantmentNamePattern = Pattern.compile("^(?(?:§.)+)(?[^§]+) (?[IVXL]+)$") + var allItemsCache = mapOf() // item name -> internal name var allInternalNames = mutableListOf() + val ignoreItemsFilter = MultiFilter() private val fallbackItem by lazy { Utils.createItemStack( @@ -50,6 +53,12 @@ object NEUItems { ) } + @SubscribeEvent + fun onRepoReload(event: RepositoryReloadEvent) { + val ignoredItems = event.getConstant("IgnoredItems") + ignoreItemsFilter.load(ignoredItems) + } + // TODO remove @Deprecated("Use NEUInternalName rather than String", ReplaceWith("getInternalNameFromItemName()")) fun getRawInternalName(itemName: String): String { @@ -190,7 +199,8 @@ object NEUItems { fun NEUInternalName.getItemStack(): ItemStack = getItemStackOrNull() ?: run { - if (getPriceOrNull() == null) return@run fallbackItem + getPriceOrNull() ?: return@run fallbackItem + if (ignoreItemsFilter.match(this.asString())) return@run fallbackItem ErrorManager.logError( IllegalStateException("Something went wrong!"), "Encountered an error getting the item for §7$this§c. " + @@ -348,7 +358,7 @@ object NEUItems { // Taken and edited from NEU private fun resolveEnchantmentByName(enchantmentName: String) = - enchantmentNamePattern.matchMatcher(enchantmentName) { + UtilsPatterns.enchantmentNamePattern.matchMatcher(enchantmentName) { val name = group("name").trim { it <= ' ' } val ultimate = group("format").lowercase().contains("§l") ((if (ultimate && name != "Ultimate Wise") "ULTIMATE_" else "") diff --git a/src/main/java/at/hannibal2/skyhanni/utils/UtilsPatterns.kt b/src/main/java/at/hannibal2/skyhanni/utils/UtilsPatterns.kt index abd5a940e5c6..b381ddf1cdd0 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/UtilsPatterns.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/UtilsPatterns.kt @@ -30,6 +30,10 @@ object UtilsPatterns { "item.name.enchanted.book", ".{2}?Enchanted Book" ) + val enchantmentNamePattern by patternGroup.pattern( + "item.neuitems.enchantmentname", + "^(?(?:§.)+)(?[^§]+) (?[IVXL]+)$" + ) val potionPattern by patternGroup.pattern( "item.name.potion", @@ -40,7 +44,7 @@ object UtilsPatterns { "(?:§f§f)?§7\\[Lvl (?\\d+)] .*" ) - val seasonPattern by RepoPattern.pattern( + val seasonPattern by patternGroup.pattern( "skyblocktime.season", "(?:Early |Late )?(?Spring|Summer|Autumn|Winter)" )