From 4c3b896787d07b84c895a89f49f5dec4f42f0b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linnea=20Gr=C3=A4f?= Date: Sat, 13 Jan 2024 20:45:45 +0100 Subject: [PATCH 1/8] Internal: Ban imports (#595) Added options to ban specific imports in some packages. #595 --- .github/workflows/ban-imports.yaml | 23 +++++++++++++++++++++++ .github/workflows/illegal-imports.txt | 6 ++++++ 2 files changed, 29 insertions(+) create mode 100644 .github/workflows/ban-imports.yaml create mode 100644 .github/workflows/illegal-imports.txt diff --git a/.github/workflows/ban-imports.yaml b/.github/workflows/ban-imports.yaml new file mode 100644 index 000000000000..2d0020c85203 --- /dev/null +++ b/.github/workflows/ban-imports.yaml @@ -0,0 +1,23 @@ +name: Check banned imports +on: + - pull_request + - push + - workflow_dispatch +permissions: {} +jobs: + check-imports: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + name: Checkout code + - name: Check imports + run: | + while IFS=' ' read search banned; do + echo Banning $banned from $search + grep -nrE -- "import $banned" src/main/java/"$search"|sed -E 's/^(.*):([0-9]+):(.*)/::error file=\1,line=\2::Illegal \3/g'|tee -a temp + done<<<$(cat .github/workflows/illegal-imports.txt|sed -E 's/#.*//;/^$/d') + found=$(wc -l temp|cut -d ' ' -f 1) + echo Found "$found" invalid imports. Check the files tab for more information. + if [[ "$found" -ne 0 ]]; then + exit 1 + fi diff --git a/.github/workflows/illegal-imports.txt b/.github/workflows/illegal-imports.txt new file mode 100644 index 000000000000..97beefd29124 --- /dev/null +++ b/.github/workflows/illegal-imports.txt @@ -0,0 +1,6 @@ +# Ban some packages from importing some other packages. +# Lines starting with # are ignored +# Every other line needs to be in the format +# + +at/hannibal2/skyhanni/ scala. From 9896866cafdc2efc83d158e5c95493d935e689cf Mon Sep 17 00:00:00 2001 From: Vixid <52578495+VixidDev@users.noreply.github.com> Date: Sat, 13 Jan 2024 20:06:08 +0000 Subject: [PATCH 2/8] Add option to ignore chat in Everything Chroma (#690) Added option to ignore Everything Chroma in the chat. #690 --- .../config/features/chroma/ChromaConfig.java | 6 ++++++ .../skyhanni/mixins/hooks/FontRendererHook.kt | 7 +++++++ .../mixins/transformers/gui/MixinGuiNewChat.java | 12 ++++++++++++ 3 files changed, 25 insertions(+) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/chroma/ChromaConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/chroma/ChromaConfig.java index 7446063baa8d..45e2d12ac8eb 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/chroma/ChromaConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/chroma/ChromaConfig.java @@ -83,11 +83,17 @@ public String toString() { @ConfigEditorBoolean public boolean allChroma = false; + @Expose + @ConfigOption(name = "Ignore Chat", desc = "Prevents Everything Chroma from applying to the chat if you unironically use that feature...") + @ConfigEditorBoolean + public boolean ignoreChat = false; + private void resetChromaSettings() { SkyHanniMod.getFeature().chroma.chromaSize = 30f; SkyHanniMod.getFeature().chroma.chromaSpeed = 6f; SkyHanniMod.getFeature().chroma.chromaSaturation = 0.75f; SkyHanniMod.getFeature().chroma.allChroma = false; + SkyHanniMod.getFeature().chroma.ignoreChat = false; SkyHanniMod.getFeature().chroma.chromaDirection = Direction.FORWARD_RIGHT; } } diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt b/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt index d8a4e8344eb3..4959bda33580 100644 --- a/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt +++ b/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt @@ -4,6 +4,7 @@ import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.features.chroma.ChromaFontRenderer import at.hannibal2.skyhanni.mixins.transformers.AccessorFontRenderer import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.shader.ShaderManager import net.minecraft.client.Minecraft import net.minecraft.client.renderer.GlStateManager import org.spongepowered.asm.mixin.injection.callback.CallbackInfo @@ -24,6 +25,8 @@ object FontRendererHook { private var currentDrawState: ChromaFontRenderer? = null private var previewChroma = false + var cameFromChat = false + /** * Setups the [ChromaFontRenderer][at.hannibal2.skyhanni.features.chroma.ChromaFontRenderer] for rendering text * in chroma. This should only be used when you don't have control over the color code a string uses, or it @@ -61,6 +64,10 @@ object FontRendererHook { fun beginChromaRendering(text: String, shadow: Boolean) { if (!LorenzUtils.inSkyBlock) return if (!SkyHanniMod.feature.chroma.enabled) return + if (SkyHanniMod.feature.chroma.allChroma && SkyHanniMod.feature.chroma.ignoreChat && cameFromChat) { + endChromaFont() + return + } if (text == "§fPlease star the mod on GitHub!") { previewChroma = true diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/gui/MixinGuiNewChat.java b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/gui/MixinGuiNewChat.java index bc7ea90191fa..49d4f1949210 100644 --- a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/gui/MixinGuiNewChat.java +++ b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/gui/MixinGuiNewChat.java @@ -1,10 +1,12 @@ package at.hannibal2.skyhanni.mixins.transformers.gui; import at.hannibal2.skyhanni.features.chat.ChatPeek; +import at.hannibal2.skyhanni.mixins.hooks.FontRendererHook; import net.minecraft.client.gui.GuiNewChat; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(GuiNewChat.class) @@ -14,4 +16,14 @@ public class MixinGuiNewChat { public void onIsOpen(CallbackInfoReturnable cir) { if (ChatPeek.peek()) cir.setReturnValue(true); } + + @Inject(method = "drawChat", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;enableBlend()V", shift = At.Shift.AFTER)) + private void setTextRenderIsFromChat(int updateCounter, CallbackInfo ci) { + FontRendererHook.INSTANCE.setCameFromChat(true); + } + + @Inject(method = "drawChat", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;disableAlpha()V", shift = At.Shift.BEFORE)) + private void setTextRenderIsntFromChat(int updateCounter, CallbackInfo ci) { + FontRendererHook.INSTANCE.setCameFromChat(false); + } } From a4622cf06a41cac6eb012c798a9184462c804285 Mon Sep 17 00:00:00 2001 From: Walker Selby Date: Sat, 13 Jan 2024 14:07:37 -0600 Subject: [PATCH 3/8] Add SMP and Snow Particles to the Spam Filter (#820) Add SMP and Snow Particles to the Spam Filter. #820 --- .../java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt | 6 ++++++ 1 file changed, 6 insertions(+) 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 48e1b0175732..75e4527accd9 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt @@ -18,6 +18,12 @@ class ChatFilter { // player join "(?: §b>§c>§a>§r §r)?.* §6(?:joined|(?:spooked|slid) into) the lobby!(?:§r §a<§c<§b<)?".toPattern(), + // Hypixel SMP + "§2[\\s]*?§aYou can now create your own Hypixel SMP server![\\s]*?".toPattern(), + + // Snow Particles in the Lobby + "[\\s]*?.*§bFor the best experience, click the text below to enable Snow[\\s]§.*§bParticles in this lobby![\\s]*?.*§3§lClick to enable Snow Particles[\\s]*?".toPattern(), + // mystery box "§b✦ §r.* §r§7found a §r§e.* §r§bMystery Box§r§7!".toPattern(), "§b✦ §r.* §r§7found (a|an) §r.* §r§7in a §r§a(Holiday )?Mystery Box§r§7!".toPattern() From ff5863c2964cfe06c310725dd6b6fe0cd349e469 Mon Sep 17 00:00:00 2001 From: CalMWolfs <94038482+CalMWolfs@users.noreply.github.com> Date: Sat, 13 Jan 2024 10:19:49 -1000 Subject: [PATCH 4/8] fix gift detection (#875) Fixed Unique Gifting Opportunities working with Golden Gift. #875 --- .../UniqueGiftingOpportunitiesFeatures.kt | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/UniqueGiftingOpportunitiesFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/event/UniqueGiftingOpportunitiesFeatures.kt index a3bc56396f0e..78fbbe836162 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/UniqueGiftingOpportunitiesFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/UniqueGiftingOpportunitiesFeatures.kt @@ -5,6 +5,8 @@ import at.hannibal2.skyhanni.data.ProfileStorageData import at.hannibal2.skyhanni.data.WinterAPI import at.hannibal2.skyhanni.events.EntityCustomNameUpdateEvent import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.events.LorenzTickEvent +import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent import at.hannibal2.skyhanni.events.RenderMobColoredEvent import at.hannibal2.skyhanni.events.withAlpha import at.hannibal2.skyhanni.features.event.winter.UniqueGiftCounter @@ -14,7 +16,9 @@ import at.hannibal2.skyhanni.utils.InventoryUtils import at.hannibal2.skyhanni.utils.LorenzColor import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.StringUtils.matches import at.hannibal2.skyhanni.utils.getLorenzVec +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraft.client.entity.EntityPlayerSP import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.item.EntityArmorStand @@ -26,7 +30,17 @@ object UniqueGiftingOpportunitiesFeatures { private val playerList: MutableSet? get() = ProfileStorageData.playerSpecific?.winter?.playersThatHaveBeenGifted - private val pattern = "§6\\+1 Unique Gift given! To ([^§]+)§r§6!".toPattern() + private val patternGroup = RepoPattern.group("event.winter.uniquegifts") + private val giftedPattern by patternGroup.pattern( + "gifted", + "§6\\+1 Unique Gift given! To ([^§]+)§r§6!" + ) + private val giftNamePattern by patternGroup.pattern( + "giftname", + "(?:WHITE|RED|GREEN)_GIFT\$" + ) + + private var holdingGift = false private fun hasGiftedPlayer(player: EntityPlayer) = playerList?.contains(player.name) == true @@ -36,9 +50,7 @@ object UniqueGiftingOpportunitiesFeatures { private val config get() = SkyHanniMod.feature.event.winter.giftingOpportunities - private fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled && WinterAPI.isDecember() && - (InventoryUtils.itemInHandId.endsWith("_GIFT") - || !config.highlighWithGiftOnly) + private fun isEnabled() = holdingGift private val hasNotGiftedNametag = "§a§lꤥ" private val hasGiftedNametag = "§c§lꤥ" @@ -85,9 +97,25 @@ object UniqueGiftingOpportunitiesFeatures { @SubscribeEvent fun onChat(event: LorenzChatEvent) { - pattern.matchMatcher(event.message) { + giftedPattern.matchMatcher(event.message) { addGiftedPlayer(group(1)) UniqueGiftCounter.addUniqueGift() } } + + @SubscribeEvent + fun onTick(event: LorenzTickEvent) { + holdingGift = false + + if (!LorenzUtils.inSkyBlock) return + if (!config.enabled) return + if (!WinterAPI.isDecember()) return + + holdingGift = !config.highlighWithGiftOnly || giftNamePattern.matches(InventoryUtils.itemInHandId.asString()) + } + + @SubscribeEvent + fun onWorldChange(event: LorenzWorldChangeEvent) { + holdingGift = false + } } From 25cfb39d1a1e0c10e156934be6ce513923dd21b5 Mon Sep 17 00:00:00 2001 From: CalMWolfs <94038482+CalMWolfs@users.noreply.github.com> Date: Sat, 13 Jan 2024 10:21:15 -1000 Subject: [PATCH 5/8] don't allow uppercase keys plus more descriptive error (#913) Don't allow uppercase Repo Pattern keys and added a more descriptive error. #913 --- .../skyhanni/utils/repopatterns/RepoPatternManager.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/repopatterns/RepoPatternManager.kt b/src/main/java/at/hannibal2/skyhanni/utils/repopatterns/RepoPatternManager.kt index 5140aa186a3e..1aee38844e51 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/repopatterns/RepoPatternManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/repopatterns/RepoPatternManager.kt @@ -104,13 +104,13 @@ object RepoPatternManager { } } - val keyShape = Pattern.compile("^(?:[a-z0-9A-Z]+\\.)*[a-z0-9A-Z]+$") + val keyShape = Pattern.compile("^(?:[a-z0-9]+\\.)*[a-z0-9]+$") /** * Verify that a key has a valid shape or throw otherwise. */ fun verifyKeyShape(key: String) { - require(keyShape.matches(key)) + require(keyShape.matches(key)) { "pattern key: \"$key\" failed shape requirements" } } /** From ba42b3dc047c4b1cf4044f9a220dbc4cec6693eb Mon Sep 17 00:00:00 2001 From: alexia Date: Sat, 13 Jan 2024 21:21:55 +0100 Subject: [PATCH 6/8] Add earned mystery dust message to chat filter (#914) Added earned mystery dust message to chat filter. #914 --- .../java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 75e4527accd9..18849f415bca 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt @@ -26,7 +26,10 @@ class ChatFilter { // mystery box "§b✦ §r.* §r§7found a §r§e.* §r§bMystery Box§r§7!".toPattern(), - "§b✦ §r.* §r§7found (a|an) §r.* §r§7in a §r§a(Holiday )?Mystery Box§r§7!".toPattern() + "§b✦ §r.* §r§7found (a|an) §r.* §r§7in a §r§a(Holiday )?Mystery Box§r§7!".toPattern(), + + // mystery dust + "§b✦ §r§7You earned §r§b\\d+ §r§7Mystery Dust!".toPattern(), ) private val lobbyMessages = listOf( From 8a0ece570720660be2d8c7aa15b76252ed915d4b Mon Sep 17 00:00:00 2001 From: CalMWolfs <94038482+CalMWolfs@users.noreply.github.com> Date: Sat, 13 Jan 2024 10:35:49 -1000 Subject: [PATCH 7/8] cleanup, improve and convert PartyAPI to repo (#917) Cleanup, improve and convert PartyAPI to repo. #917 --- .../at/hannibal2/skyhanni/data/PartyAPI.kt | 97 +++++++++++++++---- 1 file changed, 76 insertions(+), 21 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/data/PartyAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/PartyAPI.kt index 90fe4783ebc3..daac67f16788 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/PartyAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/PartyAPI.kt @@ -8,24 +8,68 @@ import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.StringUtils.removeResets import at.hannibal2.skyhanni.utils.StringUtils.trimWhiteSpaceAndResets +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.random.Random object PartyAPI { - // TODO USE SH-REPO - private val youJoinedPartyPattern = "§eYou have joined (?.*)'s §eparty!".toPattern() - private val othersJoinedPartyPattern = "(?.*) §ejoined the party.".toPattern() - private val othersInThePartyPattern = "§eYou'll be partying with: (?.*)".toPattern() - private val otherLeftPattern = "(?.*) §ehas left the party.".toPattern() - private val otherKickedPattern = "(?.*) §ehas been removed from the party.".toPattern() - private val otherOfflineKickedPattern = "§eKicked (?.*) because they were offline.".toPattern() - private val otherDisconnectedPattern = - "(?.*) §ewas removed from your party because they disconnected.".toPattern() - private val transferPattern = "The party was transferred to .* because (?.*) left".toPattern() - private val disbandedPattern = ".* §ehas disbanded the party!".toPattern() - private val kickedPattern = "§eYou have been kicked from the party by .* §e".toPattern() - private val partyMembersStartPattern = "§6Party Members \\(\\d+\\)".toPattern() - private val partyMemberListPattern = "Party (?:Leader|Moderators|Members): (?.*)".toPattern() + private val patternGroup = RepoPattern.group("data.party") + private val youJoinedPartyPattern by patternGroup.pattern( + "you.joined", + "§eYou have joined (?.*)'s §eparty!" + ) + private val othersJoinedPartyPattern by patternGroup.pattern( + "others.joined", + "(?.*) §ejoined the party\\." + ) + private val othersInThePartyPattern by patternGroup.pattern( + "others.inparty", + "§eYou'll be partying with: (?.*)" + ) + private val otherLeftPattern by patternGroup.pattern( + "others.left", + "(?.*) §ehas left the party\\." + ) + private val otherKickedPattern by patternGroup.pattern( + "others.kicked", + "(?.*) §ehas been removed from the party\\." + ) + private val otherOfflineKickedPattern by patternGroup.pattern( + "others.offline", + "§eKicked (?.*) because they were offline\\." + ) + private val otherDisconnectedPattern by patternGroup.pattern( + "others.disconnect", + "(?.*) §ewas removed from your party because they disconnected\\." + ) + private val transferPattern by patternGroup.pattern( + "others.transfer", + "The party was transferred to .* because (?.*) left" + ) + private val disbandedPattern by patternGroup.pattern( + "others.disband", + ".* §ehas disbanded the party!" + ) + private val kickedPattern by patternGroup.pattern( + "you.kicked", + "§eYou have been kicked from the party by .* §e" + ) + private val partyMembersStartPattern by patternGroup.pattern( + "members.start", + "§6Party Members \\(\\d+\\)" + ) + private val partyMemberListPattern by patternGroup.pattern( + "members.list", + "Party (?:Leader|Moderators|Members): (?.*)" + ) + private val kuudraFinderJoinPattern by patternGroup.pattern( + "kuudrafinder.join", + "§dParty Finder §f> (?.*?) §ejoined the group! \\(§[a-fA-F0-9]+Combat Level \\d+§e\\)" + ) + private val dungeonFinderJoinPattern by patternGroup.pattern( + "dungeonfinder.join", + "§dParty Finder §f> (?.*?) §ejoined the dungeon group! \\(§[a-fA-F0-9].* Level \\d+§[a-fA-F0-9]\\)" + ) val partyMembers = mutableListOf() @@ -51,21 +95,27 @@ object PartyAPI { val message = event.message.trimWhiteSpaceAndResets().removeResets() // new member joined - youJoinedPartyPattern.matchMatcher(message) { val name = group("name").cleanPlayerName() - if (!partyMembers.contains(name)) partyMembers.add(name) + addPlayer(name) } othersJoinedPartyPattern.matchMatcher(message) { val name = group("name").cleanPlayerName() - if (!partyMembers.contains(name)) partyMembers.add(name) + addPlayer(name) } othersInThePartyPattern.matchMatcher(message) { for (name in group("names").split(", ")) { - val playerName = name.cleanPlayerName() - if (!partyMembers.contains(playerName)) partyMembers.add(playerName) + addPlayer(name.cleanPlayerName()) } } + kuudraFinderJoinPattern.matchMatcher(message) { + val name = group("name").cleanPlayerName() + addPlayer(name) + } + dungeonFinderJoinPattern.matchMatcher(message) { + val name = group("name").cleanPlayerName() + addPlayer(name) + } // one member got removed otherLeftPattern.matchMatcher(message) { @@ -111,9 +161,14 @@ object PartyAPI { partyMemberListPattern.matchMatcher(message.removeColor()) { for (name in group("names").split(" ● ")) { val playerName = name.replace(" ●", "").cleanPlayerName() - if (playerName == LorenzUtils.getPlayerName()) continue - if (!partyMembers.contains(playerName)) partyMembers.add(playerName) + addPlayer(playerName) } } } + + private fun addPlayer(playerName: String) { + if (partyMembers.contains(playerName)) return + if (playerName == LorenzUtils.getPlayerName()) return + partyMembers.add(playerName) + } } From 996424847ec9afbba9f4f8ec0e8bdc2e7d67ebb8 Mon Sep 17 00:00:00 2001 From: Empa <42304516+ItsEmpa@users.noreply.github.com> Date: Sat, 13 Jan 2024 21:46:44 +0100 Subject: [PATCH 8/8] fix hatcessory detection (#918) Fixed Crap Hat of Celebration not getting detected as accessory in Hide Not Clickable Items. #918 --- .../skyhanni/features/inventory/HideNotClickableItems.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/inventory/HideNotClickableItems.kt b/src/main/java/at/hannibal2/skyhanni/features/inventory/HideNotClickableItems.kt index aa93dfd72aad..37ca20f33f6f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/inventory/HideNotClickableItems.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/inventory/HideNotClickableItems.kt @@ -341,7 +341,7 @@ class HideNotClickableItems { if (ItemUtils.isSkyBlockMenuItem(stack)) return false reverseColor = true - if (stack.getLore().any { it.contains("ACCESSORY") || it.contains("HATCCESSORY") }) return false + if (stack.getLore().any { it.contains("ACCESSORY") || it.contains("HATCESSORY") }) return false hideReason = "This item is not an accessory!" return true