aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/actions/setup-normal-workspace/action.yml13
-rw-r--r--.github/scripts/process_detekt_sarif.sh37
-rw-r--r--.github/workflows/build.yml42
-rw-r--r--.github/workflows/check-style.yaml.disabled16
-rw-r--r--CONTRIBUTING.md5
-rw-r--r--build.gradle.kts56
-rw-r--r--detekt/baseline.xml339
-rw-r--r--detekt/build.gradle.kts13
-rw-r--r--detekt/detekt.yml127
-rw-r--r--detekt/src/main/kotlin/formatting/CustomCommentSpacing.kt51
-rw-r--r--detekt/src/main/kotlin/formatting/FormattingRuleSetProvider.kt17
-rw-r--r--detekt/src/main/kotlin/grammar/AvoidColour.kt38
-rw-r--r--detekt/src/main/kotlin/grammar/GrammarRuleSetProvider.kt17
-rw-r--r--detekt/src/main/kotlin/root.kt1
-rw-r--r--gradle/libs.versions.toml3
-rw-r--r--root.gradle.kts21
-rw-r--r--settings.gradle.kts1
-rw-r--r--sharedVariables/src/MinecraftVersion.kt3
-rw-r--r--src/main/java/at/hannibal2/skyhanni/events/RenderItemTooltipEvent.kt (renamed from src/main/java/at/hannibal2/skyhanni/events/RenderTooltipEvent.kt)2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/inventory/experimentationtable/SuperpairExperimentInformationDisplay.kt2
-rw-r--r--versions/1.8.9/detekt/baseline.xml339
21 files changed, 1085 insertions, 58 deletions
diff --git a/.github/actions/setup-normal-workspace/action.yml b/.github/actions/setup-normal-workspace/action.yml
new file mode 100644
index 000000000..a0781d53c
--- /dev/null
+++ b/.github/actions/setup-normal-workspace/action.yml
@@ -0,0 +1,13 @@
+name: 'Setup Java, Gradle and check out the source code'
+
+runs:
+ using: composite
+ steps:
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ distribution: 'temurin'
+ java-version: 21
+ cache: gradle
+ - name: Setup gradle
+ uses: gradle/actions/setup-gradle@v4
diff --git a/.github/scripts/process_detekt_sarif.sh b/.github/scripts/process_detekt_sarif.sh
new file mode 100644
index 000000000..7fb4f7e4e
--- /dev/null
+++ b/.github/scripts/process_detekt_sarif.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+# This script processes the Detekt SARIF file and outputs results in a format
+# suitable for annotation in CI/CD systems.
+
+SARIF_FILE="$1"
+
+# Check if SARIF file exists
+if [ ! -f "$SARIF_FILE" ]; then
+ echo "SARIF file not found: $SARIF_FILE"
+ exit 1
+fi
+
+# Define jq command to parse SARIF file
+read -r -d '' jq_command <<'EOF'
+.runs[].results[] |
+{
+ "full_path": .locations[].physicalLocation.artifactLocation.uri | sub("file://$(pwd)/"; ""),
+ "file_name": (.locations[].physicalLocation.artifactLocation.uri | split("/") | last),
+ "l": .locations[].physicalLocation,
+ "level": .level,
+ "message": .message.text,
+ "ruleId": .ruleId
+} |
+(
+ "::" + (.level) +
+ " file=" + (.full_path) +
+ ",line=" + (.l.region.startLine|tostring) +
+ ",title=" + (.ruleId) +
+ ",col=" + (.l.region.startColumn|tostring) +
+ ",endColumn=" + (.l.region.endColumn|tostring) +
+ "::" + (.message.text)
+)
+EOF
+
+# Run jq command to format the output
+jq -r "$jq_command" < "$SARIF_FILE"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 7c75f0eef..7e42909ee 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -18,15 +18,9 @@ jobs:
runs-on: ubuntu-latest
name: "Build and test"
steps:
- - uses: actions/checkout@v3
- - name: Set up JDK 21
- uses: actions/setup-java@v3
- with:
- java-version: 21
- distribution: temurin
- cache: gradle
- - name: Setup gradle
- uses: gradle/gradle-build-action@v2
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - uses: ./.github/actions/setup-normal-workspace
- name: Build with Gradle
run: ./gradlew assemble -x test --stacktrace
- uses: actions/upload-artifact@v3
@@ -42,19 +36,31 @@ jobs:
with:
name: "Test Results"
path: versions/1.8.9/build/reports/tests/test/
+ #detekt:
+ # name: Run detekt
+ # runs-on: ubuntu-latest
+
+ # steps:
+ # - name: Checkout code
+ # uses: actions/checkout@v4
+ # - uses: ./.github/actions/setup-normal-workspace
+ # - name: Run detekt
+ # run: |
+ # ./gradlew detekt --stacktrace
+ # - name: Annotate detekt failures
+ # if: ${{ !cancelled() }}
+ # run: |
+ # chmod +x .github/scripts/process_detekt_sarif.sh
+ # ./.github/scripts/process_detekt_sarif.sh versions/1.8.9/build/reports/detekt/detekt.sarif
+
+
preprocess:
runs-on: ubuntu-latest
name: "Build multi version"
steps:
- - uses: actions/checkout@v3
- - name: Set up JDK 21
- uses: actions/setup-java@v3
- with:
- java-version: 21
- distribution: temurin
- cache: gradle
- - name: Setup gradle
- uses: gradle/gradle-build-action@v2
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - uses: ./.github/actions/setup-normal-workspace
- name: Enable preprocessor
run: |
mkdir -p .gradle
diff --git a/.github/workflows/check-style.yaml.disabled b/.github/workflows/check-style.yaml.disabled
deleted file mode 100644
index ff172208f..000000000
--- a/.github/workflows/check-style.yaml.disabled
+++ /dev/null
@@ -1,16 +0,0 @@
-name: check-style
-on:
- - pull_request
-jobs:
- ktlint:
- name: Check Style
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v3
- name: Checkout code
- - name: ktlint
- uses: ScaCap/action-ktlint@master
- with:
- github_token: ${{ secrets.github_token }}
- reporter: github-pr-check
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index fc0f2d5c4..d68b88f9f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -97,6 +97,11 @@ format like "- #821" to illustrate the dependency.
- Follow the [Hypixel Rules](https://hypixel.net/rules).
- Use the coding conventions for [Kotlin](https://kotlinlang.org/docs/coding-conventions.html)
and [Java](https://www.oracle.com/java/technologies/javase/codeconventions-contents.html).
+- **My build is failing due to `detekt`, what do I do?**
+ - `detekt` is our code quality tool. It checks for code smells and style issues.
+ - If you have a build failure stating `Analysis failed with ... weighted issues.`, you can check `versions/[target version]/build/reports/detekt/` for a comprehensive list of issues.
+ - **There are valid reasons to deviate from the norm**
+ - If you have such a case, either use `@Supress("rule_name")`, or re-build the `baseline.xml` file, using `./gradlew detektBaseline`.
- Do not copy features from other mods. Exceptions:
- Mods that are paid to use.
- Mods that have reached their end of life. (Rip SBA, Dulkir and Soopy).
diff --git a/build.gradle.kts b/build.gradle.kts
index add2df4e7..b0e2af254 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -3,6 +3,8 @@ import at.skyhanni.sharedvariables.MultiVersionStage
import at.skyhanni.sharedvariables.ProjectTarget
import at.skyhanni.sharedvariables.SHVersionInfo
import at.skyhanni.sharedvariables.versionString
+import io.gitlab.arturbosch.detekt.Detekt
+import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask
import net.fabricmc.loom.task.RunGameTask
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
@@ -18,32 +20,12 @@ plugins {
kotlin("plugin.power-assert")
`maven-publish`
id("moe.nea.shot") version "1.0.0"
+ id("io.gitlab.arturbosch.detekt")
id("net.kyori.blossom")
}
val target = ProjectTarget.values().find { it.projectPath == project.path }!!
-repositories {
- mavenCentral()
- mavenLocal()
- maven("https://maven.minecraftforge.net") {
- metadataSources {
- artifact() // We love missing POMs
- }
- }
- maven("https://repo.spongepowered.org/maven/") // mixin
- maven("https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1") // DevAuth
- maven("https://jitpack.io") { // NotEnoughUpdates (compiled against)
- content {
- includeGroupByRegex("(com|io)\\.github\\..*")
- }
- }
- maven("https://repo.nea.moe/releases") // libautoupdate
- maven("https://maven.notenoughupdates.org/releases") // NotEnoughUpdates (dev env)
- maven("https://repo.hypixel.net/repository/Hypixel/") // mod-api
- maven("https://maven.teamresourceful.com/repository/thatgravyboat/") // DiscordIPC
-}
-
// Toolchains:
java {
toolchain.languageVersion.set(target.minecraftVersion.javaLanguageVersion)
@@ -178,10 +160,14 @@ dependencies {
exclude(module = "unspecified")
isTransitive = false
}
- testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
+ testImplementation("org.junit.jupiter:junit-jupiter:5.11.0")
testImplementation("io.mockk:mockk:1.12.5")
implementation("net.hypixel:mod-api:0.3.1")
+
+ detektPlugins("org.notenoughupdates:detektrules:1.0.0")
+ detektPlugins(project(":detekt"))
+ detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.7")
}
afterEvaluate {
@@ -350,3 +336,29 @@ publishing.publications {
}
}
}
+
+// Detekt: TODO: Uncomment this when we're ready to enforce
+/*detekt {
+ buildUponDefaultConfig = true // preconfigure defaults
+ config.setFrom(rootProject.layout.projectDirectory.file("detekt/detekt.yml")) // point to your custom config defining rules to run, overwriting default behavior
+ baseline = file(layout.projectDirectory.file("detekt/baseline.xml")) // a way of suppressing issues before introducing detekt
+ source.setFrom(project.sourceSets.named("main").map { it.allSource })
+}
+
+tasks.withType<Detekt>().configureEach {
+ reports {
+ html.required.set(true) // observe findings in your browser with structure and code snippets
+ xml.required.set(true) // checkstyle like format mainly for integrations like Jenkins
+ sarif.required.set(true) // standardized SARIF format (https://sarifweb.azurewebsites.net/) to support integrations with GitHub Code Scanning
+ md.required.set(true) // simple Markdown format
+ }
+}
+
+tasks.withType<Detekt>().configureEach {
+ jvmTarget = target.minecraftVersion.formattedJavaLanguageVersion
+ outputs.cacheIf { false } // Custom rules won't work if cached
+}
+tasks.withType<DetektCreateBaselineTask>().configureEach {
+ jvmTarget = target.minecraftVersion.formattedJavaLanguageVersion
+ outputs.cacheIf { false } // Custom rules won't work if cached
+}*/
diff --git a/detekt/baseline.xml b/detekt/baseline.xml
new file mode 100644
index 000000000..ac35c2f6d
--- /dev/null
+++ b/detekt/baseline.xml
@@ -0,0 +1,339 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+ <ManuallySuppressedIssues></ManuallySuppressedIssues>
+ <CurrentIssues>
+ <ID>AnnotationOnSeparateLine:GraphEditor.kt$GraphEditor$@Suppress("MapGetWithNotNullAssertionOperator") node.neighbours.map { GraphingEdge( translation[node]!!, translation[it.key]!!, ) }</ID>
+ <ID>AnnotationOnSeparateLine:GraphEditor.kt$GraphEditor$@Suppress("MapGetWithNotNullAssertionOperator") nodes[indexedTable[otherNode.id]!!]</ID>
+ <ID>ArrayPrimitive:CropMoneyDisplay.kt$CropMoneyDisplay$Array&lt;Double&gt;</ID>
+ <ID>ArrayPrimitive:CropMoneyDisplay.kt$CropMoneyDisplay$arrayOf(npcPrice)</ID>
+ <ID>ArrayPrimitive:CropMoneyDisplay.kt$CropMoneyDisplay$arrayOf(sellOffer)</ID>
+ <ID>ArrayPrimitive:LorenzVec.kt$Array&lt;Double&gt;</ID>
+ <ID>ArrayPrimitive:LorenzVec.kt$LorenzVec$Array&lt;Double&gt;</ID>
+ <ID>ArrayPrimitive:LorenzVec.kt$LorenzVec$Array&lt;Float&gt;</ID>
+ <ID>ArrayPrimitive:LorenzVec.kt$LorenzVec$arrayOf(x, y, z)</ID>
+ <ID>ArrayPrimitive:LorenzVec.kt$LorenzVec$arrayOf(x.toFloat(), y.toFloat(), z.toFloat())</ID>
+ <ID>CyclomaticComplexMethod:AdvancedPlayerList.kt$AdvancedPlayerList$fun newSorting(original: List&lt;String&gt;): List&lt;String&gt;</ID>
+ <ID>CyclomaticComplexMethod:CropMoneyDisplay.kt$CropMoneyDisplay$private fun calculateMoneyPerHour(debugList: MutableList&lt;List&lt;Any&gt;&gt;): Map&lt;NEUInternalName, Array&lt;Double&gt;&gt;</ID>
+ <ID>CyclomaticComplexMethod:CropMoneyDisplay.kt$CropMoneyDisplay$private fun drawDisplay(): List&lt;List&lt;Any&gt;&gt;</ID>
+ <ID>CyclomaticComplexMethod:DamageIndicatorManager.kt$DamageIndicatorManager$private fun checkThorn(realHealth: Long, realMaxHealth: Long): String?</ID>
+ <ID>CyclomaticComplexMethod:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$private fun addEnchantments(stack: ItemStack, list: MutableList&lt;String&gt;): Double</ID>
+ <ID>CyclomaticComplexMethod:GardenBestCropTime.kt$GardenBestCropTime$fun drawBestDisplay(currentCrop: CropType?): List&lt;List&lt;Any&gt;&gt;</ID>
+ <ID>CyclomaticComplexMethod:GardenCropMilestoneDisplay.kt$GardenCropMilestoneDisplay$private fun drawProgressDisplay(crop: CropType): List&lt;Renderable&gt;</ID>
+ <ID>CyclomaticComplexMethod:GardenVisitorFeatures.kt$GardenVisitorFeatures$private fun readToolTip(visitor: VisitorAPI.Visitor, itemStack: ItemStack?, toolTip: MutableList&lt;String&gt;)</ID>
+ <ID>CyclomaticComplexMethod:GhostCounter.kt$GhostCounter$private fun drawDisplay()</ID>
+ <ID>CyclomaticComplexMethod:GraphEditor.kt$GraphEditor$private fun input()</ID>
+ <ID>CyclomaticComplexMethod:GraphEditorBugFinder.kt$GraphEditorBugFinder$private fun asyncTest()</ID>
+ <ID>CyclomaticComplexMethod:IslandAreas.kt$IslandAreas$private fun buildDisplay()</ID>
+ <ID>CyclomaticComplexMethod:ItemDisplayOverlayFeatures.kt$ItemDisplayOverlayFeatures$private fun getStackTip(item: ItemStack): String?</ID>
+ <ID>CyclomaticComplexMethod:ItemNameResolver.kt$ItemNameResolver$internal fun getInternalNameOrNull(itemName: String): NEUInternalName?</ID>
+ <ID>CyclomaticComplexMethod:MinecraftConsoleFilter.kt$MinecraftConsoleFilter$override fun filter(event: LogEvent?): Filter.Result</ID>
+ <ID>CyclomaticComplexMethod:OverviewPage.kt$OverviewPage$private fun getPage(): Pair&lt;List&lt;List&lt;Renderable&gt;&gt;, List&lt;Renderable&gt;&gt;</ID>
+ <ID>CyclomaticComplexMethod:PacketTest.kt$PacketTest$private fun Packet&lt;*&gt;.print()</ID>
+ <ID>CyclomaticComplexMethod:ParkourHelper.kt$ParkourHelper$fun render(event: LorenzRenderWorldEvent)</ID>
+ <ID>CyclomaticComplexMethod:Renderable.kt$Renderable.Companion$internal fun shouldAllowLink(debug: Boolean = false, bypassChecks: Boolean): Boolean</ID>
+ <ID>CyclomaticComplexMethod:SkillProgress.kt$SkillProgress$private fun drawDisplay()</ID>
+ <ID>CyclomaticComplexMethod:VampireSlayerFeatures.kt$VampireSlayerFeatures$private fun EntityOtherPlayerMP.process()</ID>
+ <ID>CyclomaticComplexMethod:VisualWordGui.kt$VisualWordGui$override fun drawScreen(unusedX: Int, unusedY: Int, partialTicks: Float)</ID>
+ <ID>DestructuringDeclarationWithTooManyEntries:SackDisplay.kt$SackDisplay$val (internalName, rough, flawed, fine, roughPrice, flawedPrice, finePrice) = gem</ID>
+ <ID>Filename:AreaChangeEvents.kt$at.hannibal2.skyhanni.events.skyblock.AreaChangeEvents.kt</ID>
+ <ID>InjectDispatcher:ClipboardUtils.kt$ClipboardUtils$IO</ID>
+ <ID>InjectDispatcher:GardenNextJacobContest.kt$GardenNextJacobContest$IO</ID>
+ <ID>InjectDispatcher:HypixelBazaarFetcher.kt$HypixelBazaarFetcher$IO</ID>
+ <ID>InjectDispatcher:MayorAPI.kt$MayorAPI$IO</ID>
+ <ID>LongMethod:CopyNearbyEntitiesCommand.kt$CopyNearbyEntitiesCommand$fun command(args: Array&lt;String&gt;)</ID>
+ <ID>LongMethod:CropMoneyDisplay.kt$CropMoneyDisplay$private fun drawDisplay(): List&lt;List&lt;Any&gt;&gt;</ID>
+ <ID>LongMethod:DefaultConfigOptionGui.kt$DefaultConfigOptionGui$override fun drawScreen(mouseX: Int, mouseY: Int, partialTicks: Float)</ID>
+ <ID>LongMethod:GhostCounter.kt$GhostCounter$private fun drawDisplay()</ID>
+ <ID>LongMethod:GraphEditor.kt$GraphEditor$private fun input()</ID>
+ <ID>LongMethod:ItemDisplayOverlayFeatures.kt$ItemDisplayOverlayFeatures$private fun getStackTip(item: ItemStack): String?</ID>
+ <ID>LongMethod:MinecraftConsoleFilter.kt$MinecraftConsoleFilter$override fun filter(event: LogEvent?): Filter.Result</ID>
+ <ID>LongMethod:OverviewPage.kt$OverviewPage$private fun getPage(): Pair&lt;List&lt;List&lt;Renderable&gt;&gt;, List&lt;Renderable&gt;&gt;</ID>
+ <ID>LongMethod:RenderableTooltips.kt$RenderableTooltips$private fun drawHoveringText()</ID>
+ <ID>LongMethod:TabListRenderer.kt$TabListRenderer$private fun drawTabList()</ID>
+ <ID>LongMethod:VisualWordGui.kt$VisualWordGui$override fun drawScreen(unusedX: Int, unusedY: Int, partialTicks: Float)</ID>
+ <ID>LoopWithTooManyJumpStatements:AdvancedPlayerList.kt$AdvancedPlayerList$for</ID>
+ <ID>LoopWithTooManyJumpStatements:CropMoneyDisplay.kt$CropMoneyDisplay$for</ID>
+ <ID>LoopWithTooManyJumpStatements:CustomScoreboard.kt$CustomScoreboard$for</ID>
+ <ID>LoopWithTooManyJumpStatements:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$for</ID>
+ <ID>LoopWithTooManyJumpStatements:GardenComposterInventoryFeatures.kt$GardenComposterInventoryFeatures$for</ID>
+ <ID>LoopWithTooManyJumpStatements:GardenVisitorFeatures.kt$GardenVisitorFeatures$for</ID>
+ <ID>LoopWithTooManyJumpStatements:IslandAreas.kt$IslandAreas$for</ID>
+ <ID>LoopWithTooManyJumpStatements:RiftBloodEffigies.kt$RiftBloodEffigies$for</ID>
+ <ID>LoopWithTooManyJumpStatements:SkyBlockItemModifierUtils.kt$SkyBlockItemModifierUtils$for</ID>
+ <ID>LoopWithTooManyJumpStatements:SkyHanniConfigSearchResetCommand.kt$SkyHanniConfigSearchResetCommand$for</ID>
+ <ID>LoopWithTooManyJumpStatements:SuperpairsClicksAlert.kt$SuperpairsClicksAlert$for</ID>
+ <ID>MapGetWithNotNullAssertionOperator:NavigationHelper.kt$NavigationHelper$distances[node]!!</ID>
+ <ID>MatchingDeclarationName:AreaChangeEvents.kt$ScoreboardAreaChangeEvent : SkyHanniEvent</ID>
+ <ID>MaxLineLength:GraphEditor.kt$GraphEditor$@Suppress("MapGetWithNotNullAssertionOperator") nodes[indexedTable[otherNode.id]!!] to node.position.distance(otherNode.position)</ID>
+ <ID>MemberNameEqualsClassName:CaptureFarmingGear.kt$CaptureFarmingGear$fun captureFarmingGear()</ID>
+ <ID>MemberNameEqualsClassName:Commands.kt$Commands$// command -&gt; description private val commands = mutableListOf&lt;CommandInfo&gt;()</ID>
+ <ID>MemberNameEqualsClassName:FameRanks.kt$FameRanks$var fameRanks = emptyMap&lt;String, FameRank&gt;() private set</ID>
+ <ID>MemberNameEqualsClassName:FirstMinionTier.kt$FirstMinionTier$fun firstMinionTier( otherItems: Map&lt;NEUInternalName, Int&gt;, minions: MutableMap&lt;String, NEUInternalName&gt;, tierOneMinions: MutableList&lt;NEUInternalName&gt;, tierOneMinionsDone: MutableSet&lt;NEUInternalName&gt;, )</ID>
+ <ID>MemberNameEqualsClassName:LastServers.kt$LastServers$private val lastServers = mutableMapOf&lt;String, SimpleTimeMark&gt;()</ID>
+ <ID>MemberNameEqualsClassName:PestSpawn.kt$PestSpawn$private fun pestSpawn(amount: Int, plotNames: List&lt;String&gt;, unknownAmount: Boolean)</ID>
+ <ID>MemberNameEqualsClassName:Shimmy.kt$Shimmy.Companion$private fun shimmy(source: Any?, fieldName: String): Any?</ID>
+ <ID>MemberNameEqualsClassName:TestBingo.kt$TestBingo$var testBingo = false</ID>
+ <ID>MemberNameEqualsClassName:Text.kt$Text$fun text(text: String, init: IChatComponent.() -&gt; Unit = {})</ID>
+ <ID>NoNameShadowing:BucketedItemTrackerData.kt$BucketedItemTrackerData${ it.hidden = !it.hidden }</ID>
+ <ID>NoNameShadowing:BurrowWarpHelper.kt$BurrowWarpHelper${ it.startsWith("§bWarp to ") }</ID>
+ <ID>NoNameShadowing:ChunkedStat.kt$ChunkedStat.Companion${ it.showWhen() }</ID>
+ <ID>NoNameShadowing:ContributorManager.kt$ContributorManager${ it.isAllowed() }</ID>
+ <ID>NoNameShadowing:Graph.kt$Graph.Companion${ out.name("Name").value(it) }</ID>
+ <ID>NoNameShadowing:Graph.kt$Graph.Companion${ out.name("Tags") out.beginArray() for (tagName in it) { out.value(tagName) } out.endArray() }</ID>
+ <ID>NoNameShadowing:GraphEditorBugFinder.kt$GraphEditorBugFinder${ it.position.distanceSqToPlayer() }</ID>
+ <ID>NoNameShadowing:GuiOptionEditorUpdateCheck.kt$GuiOptionEditorUpdateCheck$width</ID>
+ <ID>NoNameShadowing:HoppityCollectionStats.kt$HoppityCollectionStats${ val displayAmount = it.amount.shortFormat() val operationFormat = when (milestoneType) { HoppityEggType.CHOCOLATE_SHOP_MILESTONE -&gt; "spending" HoppityEggType.CHOCOLATE_FACTORY_MILESTONE -&gt; "reaching" else -&gt; "" // Never happens } // List indexing is weird existingLore[replaceIndex - 1] = "§7Obtained by $operationFormat §6$displayAmount" existingLore[replaceIndex] = "§7all-time §6Chocolate." return existingLore }</ID>
+ <ID>NoNameShadowing:HotmData.kt$HotmData.Companion${ it.setCurrent(it.getTotal()) }</ID>
+ <ID>NoNameShadowing:LorenzVec.kt$LorenzVec.Companion$pitch</ID>
+ <ID>NoNameShadowing:LorenzVec.kt$LorenzVec.Companion$yaw</ID>
+ <ID>NoNameShadowing:Renderable.kt$Renderable.Companion.&lt;no name provided&gt;$posX</ID>
+ <ID>NoNameShadowing:Renderable.kt$Renderable.Companion.&lt;no name provided&gt;$posY</ID>
+ <ID>NoNameShadowing:Renderable.kt$Renderable.Companion.&lt;no name provided&gt;${ it.value?.contains(textInput.textBox, ignoreCase = true) ?: true }</ID>
+ <ID>NoNameShadowing:RenderableUtils.kt$RenderableUtils${ it != null }</ID>
+ <ID>NoNameShadowing:ReplaceRomanNumerals.kt$ReplaceRomanNumerals${ it.isValidRomanNumeral() &amp;&amp; it.removeFormatting().romanToDecimal() != 2000 }</ID>
+ <ID>NoNameShadowing:RepoManager.kt$RepoManager${ unsuccessfulConstants.add(it) }</ID>
+ <ID>NoNameShadowing:RepoPatternManager.kt$RepoPatternManager${ it == '.' }</ID>
+ <ID>NoNameShadowing:Shimmy.kt$Shimmy.Companion$source</ID>
+ <ID>NoNameShadowing:SkyHanniBucketedItemTracker.kt$SkyHanniBucketedItemTracker${ ItemPriceSource.entries[it.ordinal] }</ID>
+ <ID>ReturnCount:AnitaMedalProfit.kt$AnitaMedalProfit$private fun readItem(slot: Int, item: ItemStack, table: MutableList&lt;DisplayTableEntry&gt;)</ID>
+ <ID>ReturnCount:BingoNextStepHelper.kt$BingoNextStepHelper$private fun readDescription(description: String): NextStep?</ID>
+ <ID>ReturnCount:BroodmotherFeatures.kt$BroodmotherFeatures$private fun onStageUpdate()</ID>
+ <ID>ReturnCount:ChatPeek.kt$ChatPeek$@JvmStatic fun peek(): Boolean</ID>
+ <ID>ReturnCount:ChestValue.kt$ChestValue$private fun isValidStorage(): Boolean</ID>
+ <ID>ReturnCount:CollectionTracker.kt$CollectionTracker$fun command(args: Array&lt;String&gt;)</ID>
+ <ID>ReturnCount:CompactBingoChat.kt$CompactBingoChat$private fun onSkyBlockLevelUp(message: String): Boolean</ID>
+ <ID>ReturnCount:CrimsonMinibossRespawnTimer.kt$CrimsonMinibossRespawnTimer$private fun updateArea()</ID>
+ <ID>ReturnCount:CropMoneyDisplay.kt$CropMoneyDisplay$private fun drawDisplay(): List&lt;List&lt;Any&gt;&gt;</ID>
+ <ID>ReturnCount:DamageIndicatorManager.kt$DamageIndicatorManager$private fun checkThorn(realHealth: Long, realMaxHealth: Long): String?</ID>
+ <ID>ReturnCount:DamageIndicatorManager.kt$DamageIndicatorManager$private fun getCustomHealth( entityData: EntityData, health: Long, entity: EntityLivingBase, maxHealth: Long, ): String?</ID>
+ <ID>ReturnCount:EnchantParser.kt$EnchantParser$private fun parseEnchants( loreList: MutableList&lt;String&gt;, enchants: Map&lt;String, Int&gt;, chatComponent: IChatComponent?, )</ID>
+ <ID>ReturnCount:EstimatedItemValue.kt$EstimatedItemValue$private fun draw(stack: ItemStack): List&lt;List&lt;Any&gt;&gt;</ID>
+ <ID>ReturnCount:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$private fun calculateStarPrice( internalName: NEUInternalName, inputStars: Int, ): Pair&lt;EssenceItemUtils.EssenceUpgradePrice, Pair&lt;Int, Int&gt;&gt;?</ID>
+ <ID>ReturnCount:FishingAPI.kt$FishingAPI$fun seaCreatureCount(entity: EntityArmorStand): Int</ID>
+ <ID>ReturnCount:GardenVisitorFeatures.kt$GardenVisitorFeatures$private fun showGui(): Boolean</ID>
+ <ID>ReturnCount:GraphEditor.kt$GraphEditor$private fun input()</ID>
+ <ID>ReturnCount:HideNotClickableItems.kt$HideNotClickableItems$private fun hideSalvage(chestName: String, stack: ItemStack): Boolean</ID>
+ <ID>ReturnCount:IslandGraphs.kt$IslandGraphs$private fun handleTick()</ID>
+ <ID>ReturnCount:ItemDisplayOverlayFeatures.kt$ItemDisplayOverlayFeatures$private fun getStackTip(item: ItemStack): String?</ID>
+ <ID>ReturnCount:ItemNameResolver.kt$ItemNameResolver$internal fun getInternalNameOrNull(itemName: String): NEUInternalName?</ID>
+ <ID>ReturnCount:ItemPriceUtils.kt$ItemPriceUtils$fun NEUInternalName.getPriceOrNull( priceSource: ItemPriceSource = ItemPriceSource.BAZAAR_INSTANT_BUY, pastRecipes: List&lt;PrimitiveRecipe&gt; = emptyList(), ): Double?</ID>
+ <ID>ReturnCount:ItemUtils.kt$ItemUtils$private fun NEUInternalName.grabItemName(): String</ID>
+ <ID>ReturnCount:MinecraftConsoleFilter.kt$MinecraftConsoleFilter$override fun filter(event: LogEvent?): Filter.Result</ID>
+ <ID>ReturnCount:MiningEventTracker.kt$MiningEventTracker$private fun sendData(eventName: String, time: String?)</ID>
+ <ID>ReturnCount:MobDetection.kt$MobDetection$private fun entitySpawn(entity: EntityLivingBase, roughType: Mob.Type): Boolean</ID>
+ <ID>ReturnCount:MobFilter.kt$MobFilter$internal fun createSkyblockEntity(baseEntity: EntityLivingBase): MobResult</ID>
+ <ID>ReturnCount:MobFilter.kt$MobFilter$private fun armorStandOnlyMobs(baseEntity: EntityLivingBase, armorStand: EntityArmorStand): MobResult?</ID>
+ <ID>ReturnCount:MobFilter.kt$MobFilter$private fun exceptions(baseEntity: EntityLivingBase, nextEntity: EntityLivingBase?): MobResult?</ID>
+ <ID>ReturnCount:MobFinder.kt$MobFinder$private fun tryAddEntitySpider(entity: EntityLivingBase): EntityResult?</ID>
+ <ID>ReturnCount:MobFinder.kt$MobFinder$private fun tryAddRift(entity: EntityLivingBase): EntityResult?</ID>
+ <ID>ReturnCount:MultiFilter.kt$MultiFilter$fun matchResult(string: String): String?</ID>
+ <ID>ReturnCount:PacketTest.kt$PacketTest$private fun Packet&lt;*&gt;.print()</ID>
+ <ID>ReturnCount:PowderMiningChatFilter.kt$PowderMiningChatFilter$@Suppress("CyclomaticComplexMethod") fun block(message: String): String?</ID>
+ <ID>ReturnCount:PurseAPI.kt$PurseAPI$private fun getCause(diff: Double): PurseChangeCause</ID>
+ <ID>ReturnCount:QuestLoader.kt$QuestLoader$private fun addQuest(name: String, state: QuestState, needAmount: Int): Quest</ID>
+ <ID>ReturnCount:ShowFishingItemName.kt$ShowFishingItemName$fun inCorrectArea(): Boolean</ID>
+ <ID>ReturnCount:SkillAPI.kt$SkillAPI$fun onCommand(it: Array&lt;String&gt;)</ID>
+ <ID>ReturnCount:SkyHanniConfigSearchResetCommand.kt$SkyHanniConfigSearchResetCommand$private suspend fun setCommand(args: Array&lt;String&gt;): String</ID>
+ <ID>ReturnCount:TabComplete.kt$TabComplete$private fun customTabComplete(command: String): List&lt;String&gt;?</ID>
+ <ID>SpreadOperator:ItemUtils.kt$ItemUtils$(tag, displayName, *lore.toTypedArray())</ID>
+ <ID>SpreadOperator:LimboPlaytime.kt$LimboPlaytime$( itemID.getItemStack().item, ITEM_NAME, *createItemLore() )</ID>
+ <ID>SpreadOperator:Text.kt$Text$(*component.toTypedArray(), separator = separator)</ID>
+ <ID>TooManyFunctions:CollectionUtils.kt$CollectionUtils</ID>
+ <ID>TooManyFunctions:DailyQuestHelper.kt$DailyQuestHelper</ID>
+ <ID>TooManyFunctions:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator</ID>
+ <ID>TooManyFunctions:GuiRenderUtils.kt$GuiRenderUtils</ID>
+ <ID>TooManyFunctions:HypixelCommands.kt$HypixelCommands</ID>
+ <ID>TooManyFunctions:InventoryUtils.kt$InventoryUtils</ID>
+ <ID>TooManyFunctions:LocationUtils.kt$LocationUtils</ID>
+ <ID>TooManyFunctions:LorenzUtils.kt$LorenzUtils</ID>
+ <ID>TooManyFunctions:LorenzVec.kt$LorenzVec</ID>
+ <ID>TooManyFunctions:MobFinder.kt$MobFinder</ID>
+ <ID>TooManyFunctions:NumberUtil.kt$NumberUtil</ID>
+ <ID>TooManyFunctions:RegexUtils.kt$RegexUtils</ID>
+ <ID>TooManyFunctions:RenderUtils.kt$RenderUtils</ID>
+ <ID>TooManyFunctions:Renderable.kt$Renderable$Companion</ID>
+ <ID>TooManyFunctions:ScoreboardElements.kt$at.hannibal2.skyhanni.features.gui.customscoreboard.ScoreboardElements.kt</ID>
+ <ID>TooManyFunctions:ScoreboardEvent.kt$at.hannibal2.skyhanni.features.gui.customscoreboard.ScoreboardEvent.kt</ID>
+ <ID>TooManyFunctions:SkyBlockItemModifierUtils.kt$SkyBlockItemModifierUtils</ID>
+ <ID>TooManyFunctions:StringUtils.kt$StringUtils</ID>
+ <ID>UnsafeCallOnNullableType:BasketWaypoints.kt$BasketWaypoints$Basket.entries.minByOrNull { it.waypoint.distanceSqToPlayer() }!!</ID>
+ <ID>UnsafeCallOnNullableType:BasketWaypoints.kt$BasketWaypoints$notFoundBaskets.minByOrNull { it.waypoint.distanceSqToPlayer() }!!</ID>
+ <ID>UnsafeCallOnNullableType:BucketedItemTrackerData.kt$BucketedItemTrackerData$it.value[internalName]?.hidden!!</ID>
+ <ID>UnsafeCallOnNullableType:ChocolateFactoryDataLoader.kt$ChocolateFactoryDataLoader$upgradeCost!!</ID>
+ <ID>UnsafeCallOnNullableType:CollectionUtils.kt$CollectionUtils$this.merge(key, number, Double::plus)!!</ID>
+ <ID>UnsafeCallOnNullableType:CollectionUtils.kt$CollectionUtils$this.merge(key, number, Float::plus)!!</ID>
+ <ID>UnsafeCallOnNullableType:CollectionUtils.kt$CollectionUtils$this.merge(key, number, Int::plus)!!</ID>
+ <ID>UnsafeCallOnNullableType:CollectionUtils.kt$CollectionUtils$this.merge(key, number, Long::plus)!!</ID>
+ <ID>UnsafeCallOnNullableType:CombatUtils.kt$CombatUtils$a!!</ID>
+ <ID>UnsafeCallOnNullableType:CompactBestiaryChatMessage.kt$CompactBestiaryChatMessage$it.groups[1]!!</ID>
+ <ID>UnsafeCallOnNullableType:ConfigManager.kt$ConfigManager$file!!</ID>
+ <ID>UnsafeCallOnNullableType:CorpseTracker.kt$CorpseTracker$applicableKeys.first().key!!</ID>
+ <ID>UnsafeCallOnNullableType:CosmeticFollowingLine.kt$CosmeticFollowingLine$latestLocations[b]!!</ID>
+ <ID>UnsafeCallOnNullableType:CosmeticFollowingLine.kt$CosmeticFollowingLine$locations[b]!!</ID>
+ <ID>UnsafeCallOnNullableType:CropMoneyDisplay.kt$CropMoneyDisplay$cropNames[internalName]!!</ID>
+ <ID>UnsafeCallOnNullableType:DailyMiniBossHelper.kt$DailyMiniBossHelper$getByDisplayName(name)!!</ID>
+ <ID>UnsafeCallOnNullableType:DamageIndicatorManager.kt$DamageIndicatorManager$data.deathLocation!!</ID>
+ <ID>UnsafeCallOnNullableType:DefaultConfigFeatures.kt$DefaultConfigFeatures$resetSuggestionState[cat]!!</ID>
+ <ID>UnsafeCallOnNullableType:DefaultConfigOptionGui.kt$DefaultConfigOptionGui$resetSuggestionState[cat]!!</ID>
+ <ID>UnsafeCallOnNullableType:DicerRngDropTracker.kt$DicerRngDropTracker$event.toolItem!!</ID>
+ <ID>UnsafeCallOnNullableType:DiscordStatus.kt$ownerRegex.find(colorlessLine)!!</ID>
+ <ID>UnsafeCallOnNullableType:DungeonAPI.kt$DungeonAPI$dungeonFloor!!</ID>
+ <ID>UnsafeCallOnNullableType:EasterEggWaypoints.kt$EasterEggWaypoints$EasterEgg.entries.minByOrNull { it.waypoint.distanceSqToPlayer() }!!</ID>
+ <ID>UnsafeCallOnNullableType:EasterEggWaypoints.kt$EasterEggWaypoints$notFoundEggs.minByOrNull { it.waypoint.distanceSqToPlayer() }!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityMovementData.kt$EntityMovementData$entityLocation[entity]!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$entityRenderCache.noXrayCache!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$entityRenderCache.xrayCache!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$frameToCopy!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$frameToPaste!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$isAntialiasing!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$isFastRender!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$isShaders!!</ID>
+ <ID>UnsafeCallOnNullableType:FFGuideGUI.kt$FFGuideGUI$currentCrop!!</ID>
+ <ID>UnsafeCallOnNullableType:FarmingContestAPI.kt$FarmingContestAPI$contestCrop!!</ID>
+ <ID>UnsafeCallOnNullableType:FarmingContestAPI.kt$FarmingContestAPI$contests[bracket]!!</ID>
+ <ID>UnsafeCallOnNullableType:FarmingContestAPI.kt$FarmingContestAPI$currentCrop!!</ID>
+ <ID>UnsafeCallOnNullableType:FarmingWeightDisplay.kt$FarmingWeightDisplay$weightPerCrop[CropType.CACTUS]!!</ID>
+ <ID>UnsafeCallOnNullableType:FarmingWeightDisplay.kt$FarmingWeightDisplay$weightPerCrop[CropType.SUGAR_CANE]!!</ID>
+ <ID>UnsafeCallOnNullableType:FeatureToggleProcessor.kt$FeatureToggleProcessor$latestCategory!!</ID>
+ <ID>UnsafeCallOnNullableType:FeatureTogglesByDefaultAdapter.kt$FeatureTogglesByDefaultAdapter$gson!!</ID>
+ <ID>UnsafeCallOnNullableType:FishingProfitTracker.kt$FishingProfitTracker$itemCategories[currentCategory]!!</ID>
+ <ID>UnsafeCallOnNullableType:FishingProfitTracker.kt$FishingProfitTracker.Data$itemCategories["Trophy Fish"]!!</ID>
+ <ID>UnsafeCallOnNullableType:FortuneUpgrades.kt$FortuneUpgrades$nextTalisman.upgradeCost?.first!!</ID>
+ <ID>UnsafeCallOnNullableType:GardenComposterUpgradesData.kt$GardenComposterUpgradesData$ComposterUpgrade.getByName(name)!!</ID>
+ <ID>UnsafeCallOnNullableType:GardenCropMilestoneDisplay.kt$GardenCropMilestoneDisplay$cultivatingData[crop]!!</ID>
+ <ID>UnsafeCallOnNullableType:GardenCropMilestonesCommunityFix.kt$GardenCropMilestonesCommunityFix$map[crop]!!</ID>
+ <ID>UnsafeCallOnNullableType:GardenPlotIcon.kt$GardenPlotIcon$originalStack[index]!!</ID>
+ <ID>UnsafeCallOnNullableType:GhostCounter.kt$GhostCounter$storage?.totalMF!!</ID>
+ <ID>UnsafeCallOnNullableType:Graph.kt$Graph.Companion$position!!</ID>
+ <ID>UnsafeCallOnNullableType:Graph.kt$distances.distances[end]!!</ID>
+ <ID>UnsafeCallOnNullableType:GriffinBurrowHelper.kt$GriffinBurrowHelper$particleBurrows[targetLocation]!!</ID>
+ <ID>UnsafeCallOnNullableType:HoppityCallWarning.kt$HoppityCallWarning$acceptUUID!!</ID>
+ <ID>UnsafeCallOnNullableType:IslandGraphs.kt$IslandGraphs$currentTarget!!</ID>
+ <ID>UnsafeCallOnNullableType:ItemBlink.kt$ItemBlink$offsets[item]!!</ID>
+ <ID>UnsafeCallOnNullableType:ItemPickupLog.kt$ItemPickupLog$listToCheckAgainst[key]!!</ID>
+ <ID>UnsafeCallOnNullableType:ItemPickupLog.kt$ItemPickupLog$listToCheckAgainst[key]?.second!!</ID>
+ <ID>UnsafeCallOnNullableType:ItemStackTypeAdapterFactory.kt$ItemStackTypeAdapterFactory$gson!!</ID>
+ <ID>UnsafeCallOnNullableType:ItemUtils.kt$ItemUtils$itemAmountCache[input]!!</ID>
+ <ID>UnsafeCallOnNullableType:JacobContestTimeNeeded.kt$JacobContestTimeNeeded$map[crop]!!</ID>
+ <ID>UnsafeCallOnNullableType:KSerializable.kt$KotlinTypeAdapterFactory$kotlinClass.memberProperties.find { it.name == param.name }!!</ID>
+ <ID>UnsafeCallOnNullableType:KSerializable.kt$KotlinTypeAdapterFactory$param.name!!</ID>
+ <ID>UnsafeCallOnNullableType:LorenzEvent.kt$LorenzEvent$this::class.simpleName!!</ID>
+ <ID>UnsafeCallOnNullableType:MinionFeatures.kt$MinionFeatures$newMinion!!</ID>
+ <ID>UnsafeCallOnNullableType:MobFinder.kt$MobFinder$floor6GiantsSeparateDelay[uuid]!!</ID>
+ <ID>UnsafeCallOnNullableType:NavigationHelper.kt$NavigationHelper$distances[node]!!</ID>
+ <ID>UnsafeCallOnNullableType:NumberUtil.kt$NumberUtil$romanSymbols[this]!!</ID>
+ <ID>UnsafeCallOnNullableType:PositionList.kt$PositionList$configLink!!</ID>
+ <ID>UnsafeCallOnNullableType:ReminderManager.kt$ReminderManager$storage[args.drop(1).first()]!!</ID>
+ <ID>UnsafeCallOnNullableType:ReminderManager.kt$ReminderManager$storage[args.first()]!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderEntityOutlineEvent.kt$RenderEntityOutlineEvent$entitiesToChooseFrom!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderEntityOutlineEvent.kt$RenderEntityOutlineEvent$entitiesToOutline!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderGlobalHook.kt$RenderGlobalHook$camera!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderLivingEntityHelper.kt$RenderLivingEntityHelper$entityColorCondition[entity]!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderLivingEntityHelper.kt$RenderLivingEntityHelper$entityColorMap[entity]!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderUtils.kt$RenderUtils$it.name!!</ID>
+ <ID>UnsafeCallOnNullableType:RepoManager.kt$RepoManager$latestRepoCommit!!</ID>
+ <ID>UnsafeCallOnNullableType:RepoUtils.kt$RepoUtils$file!!</ID>
+ <ID>UnsafeCallOnNullableType:SackAPI.kt$SackAPI$match.groups[1]!!</ID>
+ <ID>UnsafeCallOnNullableType:SackAPI.kt$SackAPI$match.groups[2]!!</ID>
+ <ID>UnsafeCallOnNullableType:SackAPI.kt$SackAPI$match.groups[3]!!</ID>
+ <ID>UnsafeCallOnNullableType:SackAPI.kt$SackAPI$oldData!!</ID>
+ <ID>UnsafeCallOnNullableType:SimpleCommand.kt$SimpleCommand$tabRunnable!!</ID>
+ <ID>UnsafeCallOnNullableType:SkyHanniBucketedItemTracker.kt$SkyHanniBucketedItemTracker$it.get(DisplayMode.SESSION).getItemsProp()[internalName]!!</ID>
+ <ID>UnsafeCallOnNullableType:SkyHanniBucketedItemTracker.kt$SkyHanniBucketedItemTracker$it.get(DisplayMode.TOTAL).getItemsProp()[internalName]!!</ID>
+ <ID>UnsafeCallOnNullableType:SkyHanniMod.kt$SkyHanniMod.Companion$Loader.instance().indexedModList[MODID]!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$distance!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$distance2!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$firstParticlePoint?.distance(pos)!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$lastParticlePoint2!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$lastParticlePoint2?.distance(particlePoint!!)!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$particlePoint!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$particlePoint?.subtract(lastParticlePoint2!!)!!</ID>
+ <ID>UnsafeCallOnNullableType:SummoningSoulsName.kt$SummoningSoulsName$mobsName.getOrNull(nearestMob)!!</ID>
+ <ID>UnsafeCallOnNullableType:SuperpairsClicksAlert.kt$SuperpairsClicksAlert$match.groups[1]!!</ID>
+ <ID>UnsafeCallOnNullableType:TiaRelayWaypoints.kt$TiaRelayWaypoints$waypointName!!</ID>
+ <ID>UnsafeCallOnNullableType:Translator.kt$Translator$messageContentRegex.find(message)!!</ID>
+ <ID>UnsafeCallOnNullableType:TrevorFeatures.kt$TrevorFeatures$TrevorSolver.currentMob!!</ID>
+ <ID>UnsafeCallOnNullableType:TrevorSolver.kt$TrevorSolver$currentMob!!</ID>
+ <ID>UnsafeCallOnNullableType:TunnelsMaps.kt$TunnelsMaps$campfire.name!!</ID>
+ <ID>UnsafeCallOnNullableType:UpdateManager.kt$UpdateManager$potentialUpdate!!</ID>
+ <ID>UnsafeCallOnNullableType:VisitorRewardWarning.kt$VisitorRewardWarning$visitor.totalPrice!!</ID>
+ <ID>UnsafeCallOnNullableType:VisitorRewardWarning.kt$VisitorRewardWarning$visitor.totalReward!!</ID>
+ <ID>UnusedParameter:SkyHanniDebugsAndTests.kt$SkyHanniDebugsAndTests$args: Array&lt;String&gt;</ID>
+ <ID>UseIsNullOrEmpty:ItemUtils.kt$ItemUtils$name == null || name.isEmpty()</ID>
+ <ID>UseOrEmpty:SkyHanniDebugsAndTests.kt$SkyHanniDebugsAndTests$event.originalOre?.let { "$it " } ?: ""</ID>
+ <ID>VarCouldBeVal:AdvancedPlayerList.kt$AdvancedPlayerList$private var randomOrderCache = TimeLimitedCache&lt;String, Int&gt;(20.minutes)</ID>
+ <ID>VarCouldBeVal:BestiaryData.kt$BestiaryData$private var indexes = listOf( 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43 )</ID>
+ <ID>VarCouldBeVal:BucketedItemTrackerData.kt$BucketedItemTrackerData$@Expose private var bucketedItems: MutableMap&lt;E, MutableMap&lt;NEUInternalName, TrackedItem&gt;&gt; = HashMap()</ID>
+ <ID>VarCouldBeVal:CarnivalZombieShootout.kt$CarnivalZombieShootout$private var lastUpdate = Updates(SimpleTimeMark.farPast(), SimpleTimeMark.farPast())</ID>
+ <ID>VarCouldBeVal:ChocolateFactoryStrayTracker.kt$ChocolateFactoryStrayTracker$private var claimedStraysSlots = mutableListOf&lt;Int&gt;()</ID>
+ <ID>VarCouldBeVal:CompactBestiaryChatMessage.kt$CompactBestiaryChatMessage$private var bestiaryDescription = mutableListOf&lt;String&gt;()</ID>
+ <ID>VarCouldBeVal:CompactExperimentRewards.kt$CompactExperimentRewards$private var gainedRewards = mutableListOf&lt;String&gt;()</ID>
+ <ID>VarCouldBeVal:CraftRoomHolographicMob.kt$CraftRoomHolographicMob$private var entityToHolographicEntity = mapOf( EntityZombie::class.java to HolographicEntities.zombie, EntitySlime::class.java to HolographicEntities.slime, EntityCaveSpider::class.java to HolographicEntities.caveSpider, )</ID>
+ <ID>VarCouldBeVal:CustomWardrobe.kt$CustomWardrobe$private var guiName = "Custom Wardrobe"</ID>
+ <ID>VarCouldBeVal:Enchant.kt$Enchant$@Expose private var goodLevel = 0</ID>
+ <ID>VarCouldBeVal:Enchant.kt$Enchant$@Expose private var maxLevel = 0</ID>
+ <ID>VarCouldBeVal:Enchant.kt$Enchant.Stacking$@Expose @Suppress("unused") private var statLabel: String? = null</ID>
+ <ID>VarCouldBeVal:Enchant.kt$Enchant.Stacking$@Expose private var nbtNum: String? = null</ID>
+ <ID>VarCouldBeVal:Enchant.kt$Enchant.Stacking$@Expose private var stackLevel: TreeSet&lt;Int&gt;? = null</ID>
+ <ID>VarCouldBeVal:ErrorManager.kt$ErrorManager$private var cache = TimeLimitedSet&lt;Pair&lt;String, Int&gt;&gt;(10.minutes)</ID>
+ <ID>VarCouldBeVal:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$var comboPrice = combo.asInternalName().getPriceOrNull()</ID>
+ <ID>VarCouldBeVal:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$var internalName = removeKuudraArmorPrefix(stack.getInternalName().asString().removePrefix("VANQUISHED_"))</ID>
+ <ID>VarCouldBeVal:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$var nameColor = if (!useless) "§9" else "§7"</ID>
+ <ID>VarCouldBeVal:ExperimentsProfitTracker.kt$ExperimentsProfitTracker$private var currentBottlesInInventory = mutableMapOf&lt;NEUInternalName, Int&gt;()</ID>
+ <ID>VarCouldBeVal:ExperimentsProfitTracker.kt$ExperimentsProfitTracker$private var lastBottlesInInventory = mutableMapOf&lt;NEUInternalName, Int&gt;()</ID>
+ <ID>VarCouldBeVal:ExperimentsProfitTracker.kt$ExperimentsProfitTracker$private var lastSplashes = mutableListOf&lt;ItemStack&gt;()</ID>
+ <ID>VarCouldBeVal:FarmingWeightDisplay.kt$FarmingWeightDisplay$private var nextPlayers = mutableListOf&lt;UpcomingLeaderboardPlayer&gt;()</ID>
+ <ID>VarCouldBeVal:FlareDisplay.kt$FlareDisplay$private var flares = mutableListOf&lt;Flare&gt;()</ID>
+ <ID>VarCouldBeVal:FontRendererHook.kt$FontRendererHook$private var CHROMA_COLOR: Int = -0x1</ID>
+ <ID>VarCouldBeVal:FontRendererHook.kt$FontRendererHook$private var CHROMA_COLOR_SHADOW: Int = -0xAAAAAB</ID>
+ <ID>VarCouldBeVal:GardenPlotIcon.kt$GardenPlotIcon$private var cachedStack = mutableMapOf&lt;Int, ItemStack&gt;()</ID>
+ <ID>VarCouldBeVal:GardenPlotIcon.kt$GardenPlotIcon$private var originalStack = mutableMapOf&lt;Int, ItemStack&gt;()</ID>
+ <ID>VarCouldBeVal:GardenPlotMenuHighlighting.kt$GardenPlotMenuHighlighting$private var highlightedPlots = mutableMapOf&lt;GardenPlotAPI.Plot, PlotStatusType&gt;()</ID>
+ <ID>VarCouldBeVal:GardenVisitorColorNames.kt$GardenVisitorColorNames$private var visitorColors = mutableMapOf&lt;String, String&gt;() // name -&gt; color code</ID>
+ <ID>VarCouldBeVal:GhostData.kt$GhostData$private var session = mutableMapOf( Option.KILLS to 0.0, Option.SORROWCOUNT to 0.0, Option.VOLTACOUNT to 0.0, Option.PLASMACOUNT to 0.0, Option.GHOSTLYBOOTS to 0.0, Option.BAGOFCASH to 0.0, Option.TOTALDROPS to 0.0, Option.SCAVENGERCOINS to 0.0, Option.MAXKILLCOMBO to 0.0, Option.SKILLXPGAINED to 0.0 )</ID>
+ <ID>VarCouldBeVal:GraphEditor.kt$GraphEditor$var vector = LocationUtils.calculatePlayerFacingDirection()</ID>
+ <ID>VarCouldBeVal:HoppityCollectionStats.kt$HoppityCollectionStats$private var highlightMap = mutableMapOf&lt;String, LorenzColor&gt;()</ID>
+ <ID>VarCouldBeVal:HoppityEggLocations.kt$HoppityEggLocations$// TODO add gui/command to show total data/missing islands private var collectedEggStorage: MutableMap&lt;IslandType, MutableSet&lt;LorenzVec&gt;&gt; get() = ChocolateFactoryAPI.profileStorage?.collectedEggLocations ?: mutableMapOf() set(value) { ChocolateFactoryAPI.profileStorage?.collectedEggLocations = value }</ID>
+ <ID>VarCouldBeVal:HoppityNpc.kt$HoppityNpc$private var slotsToHighlight = mutableSetOf&lt;Int&gt;()</ID>
+ <ID>VarCouldBeVal:IslandAreas.kt$IslandAreas$var suffix = ""</ID>
+ <ID>VarCouldBeVal:ItemPickupLog.kt$ItemPickupLog$private var itemList = mutableMapOf&lt;Int, Pair&lt;ItemStack, Int&gt;&gt;()</ID>
+ <ID>VarCouldBeVal:ItemPickupLog.kt$ItemPickupLog$private var itemsAddedToInventory = mutableMapOf&lt;Int, PickupEntry&gt;()</ID>
+ <ID>VarCouldBeVal:ItemPickupLog.kt$ItemPickupLog$private var itemsRemovedFromInventory = mutableMapOf&lt;Int, PickupEntry&gt;()</ID>
+ <ID>VarCouldBeVal:LocationUtils.kt$LocationUtils$var yaw = LocationUtils.calculatePlayerYaw() + 180</ID>
+ <ID>VarCouldBeVal:LorenzLogger.kt$LorenzLogger.Companion$private var LOG_DIRECTORY = File("config/skyhanni/logs")</ID>
+ <ID>VarCouldBeVal:MobDetection.kt$MobDetection$private var shouldClear: AtomicBoolean = AtomicBoolean(false)</ID>
+ <ID>VarCouldBeVal:MobFinder.kt$MobFinder$private var floor2summonsDiedOnce = mutableListOf&lt;EntityOtherPlayerMP&gt;()</ID>
+ <ID>VarCouldBeVal:MobFinder.kt$MobFinder$private var floor6GiantsSeparateDelay = mutableMapOf&lt;UUID, Pair&lt;Long, BossType&gt;&gt;()</ID>
+ <ID>VarCouldBeVal:MobFinder.kt$MobFinder$private var guardians = mutableListOf&lt;EntityGuardian&gt;()</ID>
+ <ID>VarCouldBeVal:NeuReforgeJson.kt$NeuReforgeJson$private lateinit var itemTypeField: Pair&lt;String, List&lt;NEUInternalName&gt;&gt;</ID>
+ <ID>VarCouldBeVal:PowerStoneGuideFeatures.kt$PowerStoneGuideFeatures$private var missing = mutableMapOf&lt;Int, NEUInternalName&gt;()</ID>
+ <ID>VarCouldBeVal:PunchcardHighlight.kt$PunchcardHighlight$private var playerQueue = mutableListOf&lt;String&gt;()</ID>
+ <ID>VarCouldBeVal:QuiverWarning.kt$QuiverWarning$private var arrowsInInstance = mutableSetOf&lt;ArrowType&gt;()</ID>
+ <ID>VarCouldBeVal:ReforgeHelper.kt$ReforgeHelper$private var waitForChat = AtomicBoolean(false)</ID>
+ <ID>VarCouldBeVal:ReminderManager.kt$ReminderManager$private var listPage = 1</ID>
+ <ID>VarCouldBeVal:RepoPatternGui.kt$RepoPatternGui$private var searchCache = ObservableList(mutableListOf&lt;RepoPatternInfo&gt;())</ID>
+ <ID>VarCouldBeVal:RepoPatternManager.kt$RepoPatternManager$/** * Map containing all keys and their repo patterns. Used for filling in new regexes after an update, and for * checking duplicate registrations. */ private var usedKeys: NavigableMap&lt;String, CommonPatternInfo&lt;*, *&gt;&gt; = TreeMap()</ID>
+ <ID>VarCouldBeVal:RepoPatternManager.kt$RepoPatternManager$/** * Map containing the exclusive owner of a regex key */ private var exclusivity: MutableMap&lt;String, RepoPatternKeyOwner&gt; = mutableMapOf()</ID>
+ <ID>VarCouldBeVal:SeaCreatureFeatures.kt$SeaCreatureFeatures$private var entityIds = TimeLimitedSet&lt;Int&gt;(6.minutes)</ID>
+ <ID>VarCouldBeVal:SeaCreatureFeatures.kt$SeaCreatureFeatures$private var rareSeaCreatures = TimeLimitedSet&lt;Mob&gt;(6.minutes)</ID>
+ <ID>VarCouldBeVal:ShowFishingItemName.kt$ShowFishingItemName$private var itemsOnGround = TimeLimitedCache&lt;EntityItem, String&gt;(750.milliseconds)</ID>
+ <ID>VarCouldBeVal:SkyblockGuideHighlightFeature.kt$SkyblockGuideHighlightFeature.Companion$private var missing = mutableSetOf&lt;Int&gt;()</ID>
+ <ID>VarCouldBeVal:SlayerItemsOnGround.kt$SlayerItemsOnGround$private var itemsOnGround = TimeLimitedCache&lt;EntityItem, String&gt;(2.seconds)</ID>
+ <ID>VarCouldBeVal:SoopyGuessBurrow.kt$SoopyGuessBurrow$private var dingSlope = mutableListOf&lt;Float&gt;()</ID>
+ <ID>VarCouldBeVal:SoopyGuessBurrow.kt$SoopyGuessBurrow$private var locations = mutableListOf&lt;LorenzVec&gt;()</ID>
+ <ID>VarCouldBeVal:SuperpairExperimentInformationDisplay.kt$SuperpairExperimentInformationDisplay$// TODO remove string. use enum instead! maybe even create new data type instead of map of pairs private var found = mutableMapOf&lt;Pair&lt;Item?, ItemPair?&gt;, String&gt;()</ID>
+ <ID>VarCouldBeVal:SuperpairExperimentInformationDisplay.kt$SuperpairExperimentInformationDisplay$private var lastClicked = mutableListOf&lt;Pair&lt;Int, Int&gt;&gt;()</ID>
+ <ID>VarCouldBeVal:SuperpairExperimentInformationDisplay.kt$SuperpairExperimentInformationDisplay$private var toCheck = mutableListOf&lt;Pair&lt;Int, Int&gt;&gt;()</ID>
+ <ID>VarCouldBeVal:SuperpairExperimentInformationDisplay.kt$SuperpairExperimentInformationDisplay$private var uncoveredItems = mutableListOf&lt;Pair&lt;Int, String&gt;&gt;()</ID>
+ <ID>VarCouldBeVal:TiaRelayHelper.kt$TiaRelayHelper$private var resultDisplay = mutableMapOf&lt;Int, Int&gt;()</ID>
+ <ID>VarCouldBeVal:TiaRelayHelper.kt$TiaRelayHelper$private var sounds = mutableMapOf&lt;Int, Sound&gt;()</ID>
+ <ID>VarCouldBeVal:Translator.kt$Translator$var lang = config.languageCode.get()</ID>
+ <ID>VarCouldBeVal:TrevorFeatures.kt$TrevorFeatures$private var backupTrapperID: Int = 17</ID>
+ <ID>VarCouldBeVal:TrevorFeatures.kt$TrevorFeatures$private var trapperID: Int = 56</ID>
+ <ID>VarCouldBeVal:TrophyFishDisplay.kt$TrophyFishDisplay$private var recentlyDroppedTrophies = TimeLimitedCache&lt;NEUInternalName, TrophyRarity&gt;(5.seconds)</ID>
+ <ID>VarCouldBeVal:UserLuckBreakdown.kt$UserLuckBreakdown$private var fillerID = "STAINED_GLASS_PANE".asInternalName()</ID>
+ <ID>VarCouldBeVal:UserLuckBreakdown.kt$UserLuckBreakdown$private var limboID = "ENDER_PEARL".asInternalName()</ID>
+ <ID>VarCouldBeVal:UserLuckBreakdown.kt$UserLuckBreakdown$private var skillOverflowLuck = mutableMapOf&lt;SkillType, Int&gt;()</ID>
+ <ID>VarCouldBeVal:UserLuckBreakdown.kt$UserLuckBreakdown$private var skillsID = "DIAMOND_SWORD".asInternalName()</ID>
+ </CurrentIssues>
+</SmellBaseline>
diff --git a/detekt/build.gradle.kts b/detekt/build.gradle.kts
new file mode 100644
index 000000000..ce0de9ace
--- /dev/null
+++ b/detekt/build.gradle.kts
@@ -0,0 +1,13 @@
+plugins {
+ kotlin("jvm")
+ id("com.google.devtools.ksp")
+}
+
+dependencies {
+ implementation("io.gitlab.arturbosch.detekt:detekt-api:1.23.7")
+ ksp(libs.autoservice.ksp)
+ implementation(libs.autoservice.annotations)
+ implementation("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.7")
+ testImplementation("io.kotest:kotest-assertions-core:5.9.1")
+ testImplementation("io.gitlab.arturbosch.detekt:detekt-test:1.23.7")
+}
diff --git a/detekt/detekt.yml b/detekt/detekt.yml
new file mode 100644
index 000000000..1b7d3ab05
--- /dev/null
+++ b/detekt/detekt.yml
@@ -0,0 +1,127 @@
+
+config:
+ validation: true
+
+GrammarRules:
+ active: true
+ AvoidColour: # custom rule to prefer color to colour
+ active: true
+
+FormattingRules:
+ active: true
+ CustomCommentSpacing:
+ active: true
+
+
+style:
+ MagicNumber: # I, Linnea Gräf, of sound mind and body, disagree with disabling this rule
+ active: false
+ UnusedParameter:
+ active: true
+ ignoreAnnotated:
+ - 'SubscribeEvent'
+ - 'HandleEvent'
+ - 'Mod.EventHandler'
+ ReturnCount:
+ active: true
+ max: 5
+ excludeGuardClauses: true
+ ignoreAnnotated:
+ - 'SubscribeEvent'
+ - 'HandleEvent'
+ - 'Mod.EventHandler'
+ MaxLineLength:
+ active: true
+ maxLineLength: 140
+ excludeCommentStatements: true
+ LoopWithTooManyJumpStatements:
+ active: true
+ maxJumpCount: 3
+ UnnecessaryAbstractClass: # gets horrendously messed up with Event classes
+ active: false
+ UnusedPrivateMember: # gets tripped up by API methods
+ active: false
+ UnusedPrivateProperty: # loops that don't use their iterator
+ active: true
+ allowedNames: "^(unused|_)$"
+ UseCheckOrError:
+ active: false
+ ForbiddenComment: # every TODO gets flagged
+ active: false
+ DestructuringDeclarationWithTooManyEntries: # too aggressive
+ active: true
+ maxDestructuringEntries: 5
+
+formatting:
+ MaximumLineLength: # ktlint - handled by detekt
+ active: false
+ MultiLineIfElse:
+ active: false
+ ArgumentListWrapping: # ktlint - way too aggressive
+ active: false
+ NoBlankLineBeforeRbrace: # pedantic
+ active: false
+ NoConsecutiveBlankLines: # pedantic
+ active: false
+ NoEmptyFirstLineInMethodBlock: # pedantic
+ active: false
+ ParameterListWrapping: # pedantic, can be useful in compact code
+ active: false
+ CommentSpacing: # handled by custom rule
+ active: false
+ SpacingBetweenDeclarationsWithAnnotations: # nah
+ active: false
+ SpacingBetweenDeclarationsWithComments: # also nah
+ active: false
+
+complexity:
+ CyclomaticComplexMethod: # default threshold of 15, caught almost every complex method
+ active: true
+ threshold: 25
+ ignoreAnnotated:
+ - 'SubscribeEvent'
+ - 'HandleEvent'
+ - 'Mod.EventHandler'
+ LongParameterList: # too aggressive, classes can need a lot of params
+ active: false
+ NestedBlockDepth: # too aggressive
+ active: false
+ TooManyFunctions: # ktlint - also way too aggressive by default (11 on all file types)
+ active: true
+ thresholdInFiles: 15
+ thresholdInClasses: 20
+ thresholdInInterfaces: 20
+ thresholdInObjects: 20
+ thresholdInEnums: 11
+ ignoreAnnotated:
+ - 'SkyHanniModule'
+ ComplexCondition: # aggressive by default, at a complexity of 4
+ active: true
+ threshold: 6
+ LongMethod: # default max length of 60, caught way too much
+ active: true
+ threshold: 100
+ ignoreAnnotated:
+ - 'SubscribeEvent'
+ - 'HandleEvent'
+ - 'Mod.EventHandler'
+
+exceptions:
+ SwallowedException: # there are valid reasons to do this
+ active: false
+ ThrowingExceptionsWithoutMessageOrCause: # again, valid reasons
+ active: false
+ TooGenericExceptionCaught: # sometimes you just need to catch Exception
+ active: false
+ TooGenericExceptionThrown: # we don't have our own custom exceptions
+ active: false
+
+naming:
+ ConstructorParameterNaming: # pedantic
+ active: false
+
+potential-bugs:
+ DoubleMutabilityForCollection: # went crazy about all the mutable collections
+ active: false
+ HasPlatformType: # false positives on config get() methods
+ active: false
diff --git a/detekt/src/main/kotlin/formatting/CustomCommentSpacing.kt b/detekt/src/main/kotlin/formatting/CustomCommentSpacing.kt
new file mode 100644
index 000000000..aaf7896cf
--- /dev/null
+++ b/detekt/src/main/kotlin/formatting/CustomCommentSpacing.kt
@@ -0,0 +1,51 @@
+package at.hannibal2.skyhanni.detektrules.formatting
+
+import io.gitlab.arturbosch.detekt.api.CodeSmell
+import io.gitlab.arturbosch.detekt.api.Config
+import io.gitlab.arturbosch.detekt.api.Debt
+import io.gitlab.arturbosch.detekt.api.Entity
+import io.gitlab.arturbosch.detekt.api.Issue
+import io.gitlab.arturbosch.detekt.api.Rule
+import io.gitlab.arturbosch.detekt.api.Severity
+import org.jetbrains.kotlin.com.intellij.psi.PsiComment
+
+class CustomCommentSpacing(config: Config) : Rule(config) {
+ override val issue = Issue(
+ "CustomCommentSpacing",
+ Severity.Style,
+ "Enforces custom spacing rules for comments.",
+ Debt.FIVE_MINS
+ )
+
+ private val allowedPatterns = listOf(
+ "#if",
+ "#else",
+ "#elseif",
+ "#endif",
+ "$$"
+ )
+
+ override fun visitComment(comment: PsiComment) {
+ if (allowedPatterns.any { comment.text.contains(it) }) {
+ return
+ }
+
+ /**
+ * REGEX-TEST: // Test comment
+ * REGEX-TEST: /* Test comment */
+ */
+ val commentRegex = Regex("""^(?:\/{2}|\/\*)(?:\s.*|$)""", RegexOption.DOT_MATCHES_ALL)
+ if (!commentRegex.matches(comment.text)) {
+ report(
+ CodeSmell(
+ issue,
+ Entity.from(comment),
+ "Expected space after opening comment."
+ )
+ )
+ }
+
+ // Fallback to super (ostensibly a no-check)
+ super.visitComment(comment)
+ }
+}
diff --git a/detekt/src/main/kotlin/formatting/FormattingRuleSetProvider.kt b/detekt/src/main/kotlin/formatting/FormattingRuleSetProvider.kt
new file mode 100644
index 000000000..a0a969bcf
--- /dev/null
+++ b/detekt/src/main/kotlin/formatting/FormattingRuleSetProvider.kt
@@ -0,0 +1,17 @@
+package at.hannibal2.skyhanni.detektrules.formatting
+
+import com.google.auto.service.AutoService
+import io.gitlab.arturbosch.detekt.api.Config
+import io.gitlab.arturbosch.detekt.api.RuleSet
+import io.gitlab.arturbosch.detekt.api.RuleSetProvider
+
+@AutoService(RuleSetProvider::class)
+class FormattingRuleSetProvider : RuleSetProvider {
+ override val ruleSetId: String = "FormattingRules"
+
+ override fun instance(config: Config): RuleSet {
+ return RuleSet(ruleSetId, listOf(
+ CustomCommentSpacing(config)
+ ))
+ }
+}
diff --git a/detekt/src/main/kotlin/grammar/AvoidColour.kt b/detekt/src/main/kotlin/grammar/AvoidColour.kt
new file mode 100644
index 000000000..754148d36
--- /dev/null
+++ b/detekt/src/main/kotlin/grammar/AvoidColour.kt
@@ -0,0 +1,38 @@
+package at.hannibal2.skyhanni.detektrules.grammar
+
+import io.gitlab.arturbosch.detekt.api.CodeSmell
+import io.gitlab.arturbosch.detekt.api.Config
+import io.gitlab.arturbosch.detekt.api.Debt
+import io.gitlab.arturbosch.detekt.api.Entity
+import io.gitlab.arturbosch.detekt.api.Issue
+import io.gitlab.arturbosch.detekt.api.Rule
+import io.gitlab.arturbosch.detekt.api.Severity
+import org.jetbrains.kotlin.psi.KtStringTemplateExpression
+
+/**
+ * This rule reports all usages of the word "colour" in the codebase,
+ * preferring the 'American' spelling "color" - this will ignore any
+ * type annotations, i.e., `@ConfigEditorColour` will not be reported.
+ */
+class AvoidColour(config: Config) : Rule(config) {
+ override val issue = Issue(
+ "AvoidColour",
+ Severity.Style,
+ "Avoid using the word 'colour' in code, prefer 'color' instead.",
+ Debt.FIVE_MINS
+ )
+
+ override fun visitStringTemplateExpression(expression: KtStringTemplateExpression) {
+ val text = expression.text // Be aware .getText() returns the entire span of this template, including variable names contained within. This should be rare enough of a problem for us to not care about it.
+ if (text.contains("colour", ignoreCase = true)) {
+ report(
+ CodeSmell(
+ issue,
+ Entity.from(expression),
+ "Avoid using the word 'colour' in code, prefer 'color' instead."
+ )
+ )
+ }
+ super.visitStringTemplateExpression(expression)
+ }
+}
diff --git a/detekt/src/main/kotlin/grammar/GrammarRuleSetProvider.kt b/detekt/src/main/kotlin/grammar/GrammarRuleSetProvider.kt
new file mode 100644
index 000000000..957b20147
--- /dev/null
+++ b/detekt/src/main/kotlin/grammar/GrammarRuleSetProvider.kt
@@ -0,0 +1,17 @@
+package at.hannibal2.skyhanni.detektrules.grammar
+
+import com.google.auto.service.AutoService
+import io.gitlab.arturbosch.detekt.api.Config
+import io.gitlab.arturbosch.detekt.api.RuleSet
+import io.gitlab.arturbosch.detekt.api.RuleSetProvider
+
+@AutoService(RuleSetProvider::class)
+class GrammarRuleSetProvider : RuleSetProvider {
+ override val ruleSetId: String = "GrammarRules"
+
+ override fun instance(config: Config): RuleSet {
+ return RuleSet(ruleSetId, listOf(
+ AvoidColour(config)
+ ))
+ }
+}
diff --git a/detekt/src/main/kotlin/root.kt b/detekt/src/main/kotlin/root.kt
new file mode 100644
index 000000000..9b95a398f
--- /dev/null
+++ b/detekt/src/main/kotlin/root.kt
@@ -0,0 +1 @@
+package at.hannibal2.skyhanni.detektrules
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 634e49064..926ed0285 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -10,3 +10,6 @@ libautoupdate = { module = "moe.nea:libautoupdate", version.ref = "libautoupdate
headlessLwjgl = { module = "com.github.3arthqu4ke.HeadlessMc:headlessmc-lwjgl", version.ref = "headlessLwjgl" }
jbAnnotations = { module = "org.jetbrains:annotations", version.ref = "jbAnnotations" }
hotswapagentforge = { module = "moe.nea:hotswapagent-forge", version = "1.0.1" }
+autoservice_ksp = {module="dev.zacsweers.autoservice:auto-service-ksp",version="1.1.0"}
+autoservice_annotations = {module="com.google.auto.service:auto-service-annotations",version="1.1.1"}
+
diff --git a/root.gradle.kts b/root.gradle.kts
index 5baae39e2..010393942 100644
--- a/root.gradle.kts
+++ b/root.gradle.kts
@@ -9,11 +9,32 @@ plugins {
kotlin("plugin.power-assert") version "2.0.0" apply false
id("com.google.devtools.ksp") version "2.0.0-1.0.24" apply false
id("dev.architectury.architectury-pack200") version "0.1.3"
+ id("io.gitlab.arturbosch.detekt") version "1.23.7" apply false
}
allprojects {
group = "at.hannibal2.skyhanni"
version = "0.27.Beta.12"
+ repositories {
+ mavenCentral()
+ mavenLocal()
+ maven("https://maven.minecraftforge.net") {
+ metadataSources {
+ artifact() // We love missing POMs
+ }
+ }
+ maven("https://repo.spongepowered.org/maven/") // mixin
+ maven("https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1") // DevAuth
+ maven("https://jitpack.io") { // NotEnoughUpdates (compiled against)
+ content {
+ includeGroupByRegex("(com|io)\\.github\\..*")
+ }
+ }
+ maven("https://repo.nea.moe/releases") // libautoupdate
+ maven("https://maven.notenoughupdates.org/releases") // NotEnoughUpdates (dev env)
+ maven("https://repo.hypixel.net/repository/Hypixel/") // mod-api
+ maven("https://maven.teamresourceful.com/repository/thatgravyboat/") // DiscordIPC
+ }
}
preprocess {
diff --git a/settings.gradle.kts b/settings.gradle.kts
index adee2acba..987b70013 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -38,6 +38,7 @@ plugins {
MultiVersionStage.initFrom(file(".gradle/private.properties"))
include("annotation-processors")
+include("detekt")
rootProject.name = "SkyHanni"
rootProject.buildFileName = "root.gradle.kts"
diff --git a/sharedVariables/src/MinecraftVersion.kt b/sharedVariables/src/MinecraftVersion.kt
index 7384c8fbd..796cc0d70 100644
--- a/sharedVariables/src/MinecraftVersion.kt
+++ b/sharedVariables/src/MinecraftVersion.kt
@@ -16,6 +16,9 @@ enum class MinecraftVersion(
val javaLanguageVersion = JavaLanguageVersion.of(javaVersion)
+ val formattedJavaLanguageVersion: String
+ get() = if (javaVersion <= 8) "1.$javaVersion" else javaVersion.toString()
+
val versionNumber = run {
val parts = versionName.split('.').mapTo(mutableListOf()) { it.toInt() }
if (parts.size == 2) parts.add(0)
diff --git a/src/main/java/at/hannibal2/skyhanni/events/RenderTooltipEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/RenderItemTooltipEvent.kt
index ff9e6b448..f8cb98802 100644
--- a/src/main/java/at/hannibal2/skyhanni/events/RenderTooltipEvent.kt
+++ b/src/main/java/at/hannibal2/skyhanni/events/RenderItemTooltipEvent.kt
@@ -2,4 +2,4 @@ package at.hannibal2.skyhanni.events
import net.minecraft.item.ItemStack
-class RenderItemTooltipEvent(val stack: ItemStack) : LorenzEvent() \ No newline at end of file
+class RenderItemTooltipEvent(val stack: ItemStack) : LorenzEvent()
diff --git a/src/main/java/at/hannibal2/skyhanni/features/inventory/experimentationtable/SuperpairExperimentInformationDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/inventory/experimentationtable/SuperpairExperimentInformationDisplay.kt
index 86d7fca50..b1ee56659 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/inventory/experimentationtable/SuperpairExperimentInformationDisplay.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/inventory/experimentationtable/SuperpairExperimentInformationDisplay.kt
@@ -31,7 +31,7 @@ object SuperpairExperimentInformationDisplay {
data class Item(val index: Int, val name: String)
data class ItemPair(val first: Item, val second: Item)
- // TODO remove string. use enum instead! maybe even create new data type instaed of map of pairs
+ // TODO remove string. use enum instead! maybe even create new data type instead of map of pairs
private var found = mutableMapOf<Pair<Item?, ItemPair?>, String>()
private var toCheck = mutableListOf<Pair<Int, Int>>()
diff --git a/versions/1.8.9/detekt/baseline.xml b/versions/1.8.9/detekt/baseline.xml
new file mode 100644
index 000000000..ac35c2f6d
--- /dev/null
+++ b/versions/1.8.9/detekt/baseline.xml
@@ -0,0 +1,339 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+ <ManuallySuppressedIssues></ManuallySuppressedIssues>
+ <CurrentIssues>
+ <ID>AnnotationOnSeparateLine:GraphEditor.kt$GraphEditor$@Suppress("MapGetWithNotNullAssertionOperator") node.neighbours.map { GraphingEdge( translation[node]!!, translation[it.key]!!, ) }</ID>
+ <ID>AnnotationOnSeparateLine:GraphEditor.kt$GraphEditor$@Suppress("MapGetWithNotNullAssertionOperator") nodes[indexedTable[otherNode.id]!!]</ID>
+ <ID>ArrayPrimitive:CropMoneyDisplay.kt$CropMoneyDisplay$Array&lt;Double&gt;</ID>
+ <ID>ArrayPrimitive:CropMoneyDisplay.kt$CropMoneyDisplay$arrayOf(npcPrice)</ID>
+ <ID>ArrayPrimitive:CropMoneyDisplay.kt$CropMoneyDisplay$arrayOf(sellOffer)</ID>
+ <ID>ArrayPrimitive:LorenzVec.kt$Array&lt;Double&gt;</ID>
+ <ID>ArrayPrimitive:LorenzVec.kt$LorenzVec$Array&lt;Double&gt;</ID>
+ <ID>ArrayPrimitive:LorenzVec.kt$LorenzVec$Array&lt;Float&gt;</ID>
+ <ID>ArrayPrimitive:LorenzVec.kt$LorenzVec$arrayOf(x, y, z)</ID>
+ <ID>ArrayPrimitive:LorenzVec.kt$LorenzVec$arrayOf(x.toFloat(), y.toFloat(), z.toFloat())</ID>
+ <ID>CyclomaticComplexMethod:AdvancedPlayerList.kt$AdvancedPlayerList$fun newSorting(original: List&lt;String&gt;): List&lt;String&gt;</ID>
+ <ID>CyclomaticComplexMethod:CropMoneyDisplay.kt$CropMoneyDisplay$private fun calculateMoneyPerHour(debugList: MutableList&lt;List&lt;Any&gt;&gt;): Map&lt;NEUInternalName, Array&lt;Double&gt;&gt;</ID>
+ <ID>CyclomaticComplexMethod:CropMoneyDisplay.kt$CropMoneyDisplay$private fun drawDisplay(): List&lt;List&lt;Any&gt;&gt;</ID>
+ <ID>CyclomaticComplexMethod:DamageIndicatorManager.kt$DamageIndicatorManager$private fun checkThorn(realHealth: Long, realMaxHealth: Long): String?</ID>
+ <ID>CyclomaticComplexMethod:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$private fun addEnchantments(stack: ItemStack, list: MutableList&lt;String&gt;): Double</ID>
+ <ID>CyclomaticComplexMethod:GardenBestCropTime.kt$GardenBestCropTime$fun drawBestDisplay(currentCrop: CropType?): List&lt;List&lt;Any&gt;&gt;</ID>
+ <ID>CyclomaticComplexMethod:GardenCropMilestoneDisplay.kt$GardenCropMilestoneDisplay$private fun drawProgressDisplay(crop: CropType): List&lt;Renderable&gt;</ID>
+ <ID>CyclomaticComplexMethod:GardenVisitorFeatures.kt$GardenVisitorFeatures$private fun readToolTip(visitor: VisitorAPI.Visitor, itemStack: ItemStack?, toolTip: MutableList&lt;String&gt;)</ID>
+ <ID>CyclomaticComplexMethod:GhostCounter.kt$GhostCounter$private fun drawDisplay()</ID>
+ <ID>CyclomaticComplexMethod:GraphEditor.kt$GraphEditor$private fun input()</ID>
+ <ID>CyclomaticComplexMethod:GraphEditorBugFinder.kt$GraphEditorBugFinder$private fun asyncTest()</ID>
+ <ID>CyclomaticComplexMethod:IslandAreas.kt$IslandAreas$private fun buildDisplay()</ID>
+ <ID>CyclomaticComplexMethod:ItemDisplayOverlayFeatures.kt$ItemDisplayOverlayFeatures$private fun getStackTip(item: ItemStack): String?</ID>
+ <ID>CyclomaticComplexMethod:ItemNameResolver.kt$ItemNameResolver$internal fun getInternalNameOrNull(itemName: String): NEUInternalName?</ID>
+ <ID>CyclomaticComplexMethod:MinecraftConsoleFilter.kt$MinecraftConsoleFilter$override fun filter(event: LogEvent?): Filter.Result</ID>
+ <ID>CyclomaticComplexMethod:OverviewPage.kt$OverviewPage$private fun getPage(): Pair&lt;List&lt;List&lt;Renderable&gt;&gt;, List&lt;Renderable&gt;&gt;</ID>
+ <ID>CyclomaticComplexMethod:PacketTest.kt$PacketTest$private fun Packet&lt;*&gt;.print()</ID>
+ <ID>CyclomaticComplexMethod:ParkourHelper.kt$ParkourHelper$fun render(event: LorenzRenderWorldEvent)</ID>
+ <ID>CyclomaticComplexMethod:Renderable.kt$Renderable.Companion$internal fun shouldAllowLink(debug: Boolean = false, bypassChecks: Boolean): Boolean</ID>
+ <ID>CyclomaticComplexMethod:SkillProgress.kt$SkillProgress$private fun drawDisplay()</ID>
+ <ID>CyclomaticComplexMethod:VampireSlayerFeatures.kt$VampireSlayerFeatures$private fun EntityOtherPlayerMP.process()</ID>
+ <ID>CyclomaticComplexMethod:VisualWordGui.kt$VisualWordGui$override fun drawScreen(unusedX: Int, unusedY: Int, partialTicks: Float)</ID>
+ <ID>DestructuringDeclarationWithTooManyEntries:SackDisplay.kt$SackDisplay$val (internalName, rough, flawed, fine, roughPrice, flawedPrice, finePrice) = gem</ID>
+ <ID>Filename:AreaChangeEvents.kt$at.hannibal2.skyhanni.events.skyblock.AreaChangeEvents.kt</ID>
+ <ID>InjectDispatcher:ClipboardUtils.kt$ClipboardUtils$IO</ID>
+ <ID>InjectDispatcher:GardenNextJacobContest.kt$GardenNextJacobContest$IO</ID>
+ <ID>InjectDispatcher:HypixelBazaarFetcher.kt$HypixelBazaarFetcher$IO</ID>
+ <ID>InjectDispatcher:MayorAPI.kt$MayorAPI$IO</ID>
+ <ID>LongMethod:CopyNearbyEntitiesCommand.kt$CopyNearbyEntitiesCommand$fun command(args: Array&lt;String&gt;)</ID>
+ <ID>LongMethod:CropMoneyDisplay.kt$CropMoneyDisplay$private fun drawDisplay(): List&lt;List&lt;Any&gt;&gt;</ID>
+ <ID>LongMethod:DefaultConfigOptionGui.kt$DefaultConfigOptionGui$override fun drawScreen(mouseX: Int, mouseY: Int, partialTicks: Float)</ID>
+ <ID>LongMethod:GhostCounter.kt$GhostCounter$private fun drawDisplay()</ID>
+ <ID>LongMethod:GraphEditor.kt$GraphEditor$private fun input()</ID>
+ <ID>LongMethod:ItemDisplayOverlayFeatures.kt$ItemDisplayOverlayFeatures$private fun getStackTip(item: ItemStack): String?</ID>
+ <ID>LongMethod:MinecraftConsoleFilter.kt$MinecraftConsoleFilter$override fun filter(event: LogEvent?): Filter.Result</ID>
+ <ID>LongMethod:OverviewPage.kt$OverviewPage$private fun getPage(): Pair&lt;List&lt;List&lt;Renderable&gt;&gt;, List&lt;Renderable&gt;&gt;</ID>
+ <ID>LongMethod:RenderableTooltips.kt$RenderableTooltips$private fun drawHoveringText()</ID>
+ <ID>LongMethod:TabListRenderer.kt$TabListRenderer$private fun drawTabList()</ID>
+ <ID>LongMethod:VisualWordGui.kt$VisualWordGui$override fun drawScreen(unusedX: Int, unusedY: Int, partialTicks: Float)</ID>
+ <ID>LoopWithTooManyJumpStatements:AdvancedPlayerList.kt$AdvancedPlayerList$for</ID>
+ <ID>LoopWithTooManyJumpStatements:CropMoneyDisplay.kt$CropMoneyDisplay$for</ID>
+ <ID>LoopWithTooManyJumpStatements:CustomScoreboard.kt$CustomScoreboard$for</ID>
+ <ID>LoopWithTooManyJumpStatements:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$for</ID>
+ <ID>LoopWithTooManyJumpStatements:GardenComposterInventoryFeatures.kt$GardenComposterInventoryFeatures$for</ID>
+ <ID>LoopWithTooManyJumpStatements:GardenVisitorFeatures.kt$GardenVisitorFeatures$for</ID>
+ <ID>LoopWithTooManyJumpStatements:IslandAreas.kt$IslandAreas$for</ID>
+ <ID>LoopWithTooManyJumpStatements:RiftBloodEffigies.kt$RiftBloodEffigies$for</ID>
+ <ID>LoopWithTooManyJumpStatements:SkyBlockItemModifierUtils.kt$SkyBlockItemModifierUtils$for</ID>
+ <ID>LoopWithTooManyJumpStatements:SkyHanniConfigSearchResetCommand.kt$SkyHanniConfigSearchResetCommand$for</ID>
+ <ID>LoopWithTooManyJumpStatements:SuperpairsClicksAlert.kt$SuperpairsClicksAlert$for</ID>
+ <ID>MapGetWithNotNullAssertionOperator:NavigationHelper.kt$NavigationHelper$distances[node]!!</ID>
+ <ID>MatchingDeclarationName:AreaChangeEvents.kt$ScoreboardAreaChangeEvent : SkyHanniEvent</ID>
+ <ID>MaxLineLength:GraphEditor.kt$GraphEditor$@Suppress("MapGetWithNotNullAssertionOperator") nodes[indexedTable[otherNode.id]!!] to node.position.distance(otherNode.position)</ID>
+ <ID>MemberNameEqualsClassName:CaptureFarmingGear.kt$CaptureFarmingGear$fun captureFarmingGear()</ID>
+ <ID>MemberNameEqualsClassName:Commands.kt$Commands$// command -&gt; description private val commands = mutableListOf&lt;CommandInfo&gt;()</ID>
+ <ID>MemberNameEqualsClassName:FameRanks.kt$FameRanks$var fameRanks = emptyMap&lt;String, FameRank&gt;() private set</ID>
+ <ID>MemberNameEqualsClassName:FirstMinionTier.kt$FirstMinionTier$fun firstMinionTier( otherItems: Map&lt;NEUInternalName, Int&gt;, minions: MutableMap&lt;String, NEUInternalName&gt;, tierOneMinions: MutableList&lt;NEUInternalName&gt;, tierOneMinionsDone: MutableSet&lt;NEUInternalName&gt;, )</ID>
+ <ID>MemberNameEqualsClassName:LastServers.kt$LastServers$private val lastServers = mutableMapOf&lt;String, SimpleTimeMark&gt;()</ID>
+ <ID>MemberNameEqualsClassName:PestSpawn.kt$PestSpawn$private fun pestSpawn(amount: Int, plotNames: List&lt;String&gt;, unknownAmount: Boolean)</ID>
+ <ID>MemberNameEqualsClassName:Shimmy.kt$Shimmy.Companion$private fun shimmy(source: Any?, fieldName: String): Any?</ID>
+ <ID>MemberNameEqualsClassName:TestBingo.kt$TestBingo$var testBingo = false</ID>
+ <ID>MemberNameEqualsClassName:Text.kt$Text$fun text(text: String, init: IChatComponent.() -&gt; Unit = {})</ID>
+ <ID>NoNameShadowing:BucketedItemTrackerData.kt$BucketedItemTrackerData${ it.hidden = !it.hidden }</ID>
+ <ID>NoNameShadowing:BurrowWarpHelper.kt$BurrowWarpHelper${ it.startsWith("§bWarp to ") }</ID>
+ <ID>NoNameShadowing:ChunkedStat.kt$ChunkedStat.Companion${ it.showWhen() }</ID>
+ <ID>NoNameShadowing:ContributorManager.kt$ContributorManager${ it.isAllowed() }</ID>
+ <ID>NoNameShadowing:Graph.kt$Graph.Companion${ out.name("Name").value(it) }</ID>
+ <ID>NoNameShadowing:Graph.kt$Graph.Companion${ out.name("Tags") out.beginArray() for (tagName in it) { out.value(tagName) } out.endArray() }</ID>
+ <ID>NoNameShadowing:GraphEditorBugFinder.kt$GraphEditorBugFinder${ it.position.distanceSqToPlayer() }</ID>
+ <ID>NoNameShadowing:GuiOptionEditorUpdateCheck.kt$GuiOptionEditorUpdateCheck$width</ID>
+ <ID>NoNameShadowing:HoppityCollectionStats.kt$HoppityCollectionStats${ val displayAmount = it.amount.shortFormat() val operationFormat = when (milestoneType) { HoppityEggType.CHOCOLATE_SHOP_MILESTONE -&gt; "spending" HoppityEggType.CHOCOLATE_FACTORY_MILESTONE -&gt; "reaching" else -&gt; "" // Never happens } // List indexing is weird existingLore[replaceIndex - 1] = "§7Obtained by $operationFormat §6$displayAmount" existingLore[replaceIndex] = "§7all-time §6Chocolate." return existingLore }</ID>
+ <ID>NoNameShadowing:HotmData.kt$HotmData.Companion${ it.setCurrent(it.getTotal()) }</ID>
+ <ID>NoNameShadowing:LorenzVec.kt$LorenzVec.Companion$pitch</ID>
+ <ID>NoNameShadowing:LorenzVec.kt$LorenzVec.Companion$yaw</ID>
+ <ID>NoNameShadowing:Renderable.kt$Renderable.Companion.&lt;no name provided&gt;$posX</ID>
+ <ID>NoNameShadowing:Renderable.kt$Renderable.Companion.&lt;no name provided&gt;$posY</ID>
+ <ID>NoNameShadowing:Renderable.kt$Renderable.Companion.&lt;no name provided&gt;${ it.value?.contains(textInput.textBox, ignoreCase = true) ?: true }</ID>
+ <ID>NoNameShadowing:RenderableUtils.kt$RenderableUtils${ it != null }</ID>
+ <ID>NoNameShadowing:ReplaceRomanNumerals.kt$ReplaceRomanNumerals${ it.isValidRomanNumeral() &amp;&amp; it.removeFormatting().romanToDecimal() != 2000 }</ID>
+ <ID>NoNameShadowing:RepoManager.kt$RepoManager${ unsuccessfulConstants.add(it) }</ID>
+ <ID>NoNameShadowing:RepoPatternManager.kt$RepoPatternManager${ it == '.' }</ID>
+ <ID>NoNameShadowing:Shimmy.kt$Shimmy.Companion$source</ID>
+ <ID>NoNameShadowing:SkyHanniBucketedItemTracker.kt$SkyHanniBucketedItemTracker${ ItemPriceSource.entries[it.ordinal] }</ID>
+ <ID>ReturnCount:AnitaMedalProfit.kt$AnitaMedalProfit$private fun readItem(slot: Int, item: ItemStack, table: MutableList&lt;DisplayTableEntry&gt;)</ID>
+ <ID>ReturnCount:BingoNextStepHelper.kt$BingoNextStepHelper$private fun readDescription(description: String): NextStep?</ID>
+ <ID>ReturnCount:BroodmotherFeatures.kt$BroodmotherFeatures$private fun onStageUpdate()</ID>
+ <ID>ReturnCount:ChatPeek.kt$ChatPeek$@JvmStatic fun peek(): Boolean</ID>
+ <ID>ReturnCount:ChestValue.kt$ChestValue$private fun isValidStorage(): Boolean</ID>
+ <ID>ReturnCount:CollectionTracker.kt$CollectionTracker$fun command(args: Array&lt;String&gt;)</ID>
+ <ID>ReturnCount:CompactBingoChat.kt$CompactBingoChat$private fun onSkyBlockLevelUp(message: String): Boolean</ID>
+ <ID>ReturnCount:CrimsonMinibossRespawnTimer.kt$CrimsonMinibossRespawnTimer$private fun updateArea()</ID>
+ <ID>ReturnCount:CropMoneyDisplay.kt$CropMoneyDisplay$private fun drawDisplay(): List&lt;List&lt;Any&gt;&gt;</ID>
+ <ID>ReturnCount:DamageIndicatorManager.kt$DamageIndicatorManager$private fun checkThorn(realHealth: Long, realMaxHealth: Long): String?</ID>
+ <ID>ReturnCount:DamageIndicatorManager.kt$DamageIndicatorManager$private fun getCustomHealth( entityData: EntityData, health: Long, entity: EntityLivingBase, maxHealth: Long, ): String?</ID>
+ <ID>ReturnCount:EnchantParser.kt$EnchantParser$private fun parseEnchants( loreList: MutableList&lt;String&gt;, enchants: Map&lt;String, Int&gt;, chatComponent: IChatComponent?, )</ID>
+ <ID>ReturnCount:EstimatedItemValue.kt$EstimatedItemValue$private fun draw(stack: ItemStack): List&lt;List&lt;Any&gt;&gt;</ID>
+ <ID>ReturnCount:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$private fun calculateStarPrice( internalName: NEUInternalName, inputStars: Int, ): Pair&lt;EssenceItemUtils.EssenceUpgradePrice, Pair&lt;Int, Int&gt;&gt;?</ID>
+ <ID>ReturnCount:FishingAPI.kt$FishingAPI$fun seaCreatureCount(entity: EntityArmorStand): Int</ID>
+ <ID>ReturnCount:GardenVisitorFeatures.kt$GardenVisitorFeatures$private fun showGui(): Boolean</ID>
+ <ID>ReturnCount:GraphEditor.kt$GraphEditor$private fun input()</ID>
+ <ID>ReturnCount:HideNotClickableItems.kt$HideNotClickableItems$private fun hideSalvage(chestName: String, stack: ItemStack): Boolean</ID>
+ <ID>ReturnCount:IslandGraphs.kt$IslandGraphs$private fun handleTick()</ID>
+ <ID>ReturnCount:ItemDisplayOverlayFeatures.kt$ItemDisplayOverlayFeatures$private fun getStackTip(item: ItemStack): String?</ID>
+ <ID>ReturnCount:ItemNameResolver.kt$ItemNameResolver$internal fun getInternalNameOrNull(itemName: String): NEUInternalName?</ID>
+ <ID>ReturnCount:ItemPriceUtils.kt$ItemPriceUtils$fun NEUInternalName.getPriceOrNull( priceSource: ItemPriceSource = ItemPriceSource.BAZAAR_INSTANT_BUY, pastRecipes: List&lt;PrimitiveRecipe&gt; = emptyList(), ): Double?</ID>
+ <ID>ReturnCount:ItemUtils.kt$ItemUtils$private fun NEUInternalName.grabItemName(): String</ID>
+ <ID>ReturnCount:MinecraftConsoleFilter.kt$MinecraftConsoleFilter$override fun filter(event: LogEvent?): Filter.Result</ID>
+ <ID>ReturnCount:MiningEventTracker.kt$MiningEventTracker$private fun sendData(eventName: String, time: String?)</ID>
+ <ID>ReturnCount:MobDetection.kt$MobDetection$private fun entitySpawn(entity: EntityLivingBase, roughType: Mob.Type): Boolean</ID>
+ <ID>ReturnCount:MobFilter.kt$MobFilter$internal fun createSkyblockEntity(baseEntity: EntityLivingBase): MobResult</ID>
+ <ID>ReturnCount:MobFilter.kt$MobFilter$private fun armorStandOnlyMobs(baseEntity: EntityLivingBase, armorStand: EntityArmorStand): MobResult?</ID>
+ <ID>ReturnCount:MobFilter.kt$MobFilter$private fun exceptions(baseEntity: EntityLivingBase, nextEntity: EntityLivingBase?): MobResult?</ID>
+ <ID>ReturnCount:MobFinder.kt$MobFinder$private fun tryAddEntitySpider(entity: EntityLivingBase): EntityResult?</ID>
+ <ID>ReturnCount:MobFinder.kt$MobFinder$private fun tryAddRift(entity: EntityLivingBase): EntityResult?</ID>
+ <ID>ReturnCount:MultiFilter.kt$MultiFilter$fun matchResult(string: String): String?</ID>
+ <ID>ReturnCount:PacketTest.kt$PacketTest$private fun Packet&lt;*&gt;.print()</ID>
+ <ID>ReturnCount:PowderMiningChatFilter.kt$PowderMiningChatFilter$@Suppress("CyclomaticComplexMethod") fun block(message: String): String?</ID>
+ <ID>ReturnCount:PurseAPI.kt$PurseAPI$private fun getCause(diff: Double): PurseChangeCause</ID>
+ <ID>ReturnCount:QuestLoader.kt$QuestLoader$private fun addQuest(name: String, state: QuestState, needAmount: Int): Quest</ID>
+ <ID>ReturnCount:ShowFishingItemName.kt$ShowFishingItemName$fun inCorrectArea(): Boolean</ID>
+ <ID>ReturnCount:SkillAPI.kt$SkillAPI$fun onCommand(it: Array&lt;String&gt;)</ID>
+ <ID>ReturnCount:SkyHanniConfigSearchResetCommand.kt$SkyHanniConfigSearchResetCommand$private suspend fun setCommand(args: Array&lt;String&gt;): String</ID>
+ <ID>ReturnCount:TabComplete.kt$TabComplete$private fun customTabComplete(command: String): List&lt;String&gt;?</ID>
+ <ID>SpreadOperator:ItemUtils.kt$ItemUtils$(tag, displayName, *lore.toTypedArray())</ID>
+ <ID>SpreadOperator:LimboPlaytime.kt$LimboPlaytime$( itemID.getItemStack().item, ITEM_NAME, *createItemLore() )</ID>
+ <ID>SpreadOperator:Text.kt$Text$(*component.toTypedArray(), separator = separator)</ID>
+ <ID>TooManyFunctions:CollectionUtils.kt$CollectionUtils</ID>
+ <ID>TooManyFunctions:DailyQuestHelper.kt$DailyQuestHelper</ID>
+ <ID>TooManyFunctions:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator</ID>
+ <ID>TooManyFunctions:GuiRenderUtils.kt$GuiRenderUtils</ID>
+ <ID>TooManyFunctions:HypixelCommands.kt$HypixelCommands</ID>
+ <ID>TooManyFunctions:InventoryUtils.kt$InventoryUtils</ID>
+ <ID>TooManyFunctions:LocationUtils.kt$LocationUtils</ID>
+ <ID>TooManyFunctions:LorenzUtils.kt$LorenzUtils</ID>
+ <ID>TooManyFunctions:LorenzVec.kt$LorenzVec</ID>
+ <ID>TooManyFunctions:MobFinder.kt$MobFinder</ID>
+ <ID>TooManyFunctions:NumberUtil.kt$NumberUtil</ID>
+ <ID>TooManyFunctions:RegexUtils.kt$RegexUtils</ID>
+ <ID>TooManyFunctions:RenderUtils.kt$RenderUtils</ID>
+ <ID>TooManyFunctions:Renderable.kt$Renderable$Companion</ID>
+ <ID>TooManyFunctions:ScoreboardElements.kt$at.hannibal2.skyhanni.features.gui.customscoreboard.ScoreboardElements.kt</ID>
+ <ID>TooManyFunctions:ScoreboardEvent.kt$at.hannibal2.skyhanni.features.gui.customscoreboard.ScoreboardEvent.kt</ID>
+ <ID>TooManyFunctions:SkyBlockItemModifierUtils.kt$SkyBlockItemModifierUtils</ID>
+ <ID>TooManyFunctions:StringUtils.kt$StringUtils</ID>
+ <ID>UnsafeCallOnNullableType:BasketWaypoints.kt$BasketWaypoints$Basket.entries.minByOrNull { it.waypoint.distanceSqToPlayer() }!!</ID>
+ <ID>UnsafeCallOnNullableType:BasketWaypoints.kt$BasketWaypoints$notFoundBaskets.minByOrNull { it.waypoint.distanceSqToPlayer() }!!</ID>
+ <ID>UnsafeCallOnNullableType:BucketedItemTrackerData.kt$BucketedItemTrackerData$it.value[internalName]?.hidden!!</ID>
+ <ID>UnsafeCallOnNullableType:ChocolateFactoryDataLoader.kt$ChocolateFactoryDataLoader$upgradeCost!!</ID>
+ <ID>UnsafeCallOnNullableType:CollectionUtils.kt$CollectionUtils$this.merge(key, number, Double::plus)!!</ID>
+ <ID>UnsafeCallOnNullableType:CollectionUtils.kt$CollectionUtils$this.merge(key, number, Float::plus)!!</ID>
+ <ID>UnsafeCallOnNullableType:CollectionUtils.kt$CollectionUtils$this.merge(key, number, Int::plus)!!</ID>
+ <ID>UnsafeCallOnNullableType:CollectionUtils.kt$CollectionUtils$this.merge(key, number, Long::plus)!!</ID>
+ <ID>UnsafeCallOnNullableType:CombatUtils.kt$CombatUtils$a!!</ID>
+ <ID>UnsafeCallOnNullableType:CompactBestiaryChatMessage.kt$CompactBestiaryChatMessage$it.groups[1]!!</ID>
+ <ID>UnsafeCallOnNullableType:ConfigManager.kt$ConfigManager$file!!</ID>
+ <ID>UnsafeCallOnNullableType:CorpseTracker.kt$CorpseTracker$applicableKeys.first().key!!</ID>
+ <ID>UnsafeCallOnNullableType:CosmeticFollowingLine.kt$CosmeticFollowingLine$latestLocations[b]!!</ID>
+ <ID>UnsafeCallOnNullableType:CosmeticFollowingLine.kt$CosmeticFollowingLine$locations[b]!!</ID>
+ <ID>UnsafeCallOnNullableType:CropMoneyDisplay.kt$CropMoneyDisplay$cropNames[internalName]!!</ID>
+ <ID>UnsafeCallOnNullableType:DailyMiniBossHelper.kt$DailyMiniBossHelper$getByDisplayName(name)!!</ID>
+ <ID>UnsafeCallOnNullableType:DamageIndicatorManager.kt$DamageIndicatorManager$data.deathLocation!!</ID>
+ <ID>UnsafeCallOnNullableType:DefaultConfigFeatures.kt$DefaultConfigFeatures$resetSuggestionState[cat]!!</ID>
+ <ID>UnsafeCallOnNullableType:DefaultConfigOptionGui.kt$DefaultConfigOptionGui$resetSuggestionState[cat]!!</ID>
+ <ID>UnsafeCallOnNullableType:DicerRngDropTracker.kt$DicerRngDropTracker$event.toolItem!!</ID>
+ <ID>UnsafeCallOnNullableType:DiscordStatus.kt$ownerRegex.find(colorlessLine)!!</ID>
+ <ID>UnsafeCallOnNullableType:DungeonAPI.kt$DungeonAPI$dungeonFloor!!</ID>
+ <ID>UnsafeCallOnNullableType:EasterEggWaypoints.kt$EasterEggWaypoints$EasterEgg.entries.minByOrNull { it.waypoint.distanceSqToPlayer() }!!</ID>
+ <ID>UnsafeCallOnNullableType:EasterEggWaypoints.kt$EasterEggWaypoints$notFoundEggs.minByOrNull { it.waypoint.distanceSqToPlayer() }!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityMovementData.kt$EntityMovementData$entityLocation[entity]!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$entityRenderCache.noXrayCache!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$entityRenderCache.xrayCache!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$frameToCopy!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$frameToPaste!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$isAntialiasing!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$isFastRender!!</ID>
+ <ID>UnsafeCallOnNullableType:EntityOutlineRenderer.kt$EntityOutlineRenderer$isShaders!!</ID>
+ <ID>UnsafeCallOnNullableType:FFGuideGUI.kt$FFGuideGUI$currentCrop!!</ID>
+ <ID>UnsafeCallOnNullableType:FarmingContestAPI.kt$FarmingContestAPI$contestCrop!!</ID>
+ <ID>UnsafeCallOnNullableType:FarmingContestAPI.kt$FarmingContestAPI$contests[bracket]!!</ID>
+ <ID>UnsafeCallOnNullableType:FarmingContestAPI.kt$FarmingContestAPI$currentCrop!!</ID>
+ <ID>UnsafeCallOnNullableType:FarmingWeightDisplay.kt$FarmingWeightDisplay$weightPerCrop[CropType.CACTUS]!!</ID>
+ <ID>UnsafeCallOnNullableType:FarmingWeightDisplay.kt$FarmingWeightDisplay$weightPerCrop[CropType.SUGAR_CANE]!!</ID>
+ <ID>UnsafeCallOnNullableType:FeatureToggleProcessor.kt$FeatureToggleProcessor$latestCategory!!</ID>
+ <ID>UnsafeCallOnNullableType:FeatureTogglesByDefaultAdapter.kt$FeatureTogglesByDefaultAdapter$gson!!</ID>
+ <ID>UnsafeCallOnNullableType:FishingProfitTracker.kt$FishingProfitTracker$itemCategories[currentCategory]!!</ID>
+ <ID>UnsafeCallOnNullableType:FishingProfitTracker.kt$FishingProfitTracker.Data$itemCategories["Trophy Fish"]!!</ID>
+ <ID>UnsafeCallOnNullableType:FortuneUpgrades.kt$FortuneUpgrades$nextTalisman.upgradeCost?.first!!</ID>
+ <ID>UnsafeCallOnNullableType:GardenComposterUpgradesData.kt$GardenComposterUpgradesData$ComposterUpgrade.getByName(name)!!</ID>
+ <ID>UnsafeCallOnNullableType:GardenCropMilestoneDisplay.kt$GardenCropMilestoneDisplay$cultivatingData[crop]!!</ID>
+ <ID>UnsafeCallOnNullableType:GardenCropMilestonesCommunityFix.kt$GardenCropMilestonesCommunityFix$map[crop]!!</ID>
+ <ID>UnsafeCallOnNullableType:GardenPlotIcon.kt$GardenPlotIcon$originalStack[index]!!</ID>
+ <ID>UnsafeCallOnNullableType:GhostCounter.kt$GhostCounter$storage?.totalMF!!</ID>
+ <ID>UnsafeCallOnNullableType:Graph.kt$Graph.Companion$position!!</ID>
+ <ID>UnsafeCallOnNullableType:Graph.kt$distances.distances[end]!!</ID>
+ <ID>UnsafeCallOnNullableType:GriffinBurrowHelper.kt$GriffinBurrowHelper$particleBurrows[targetLocation]!!</ID>
+ <ID>UnsafeCallOnNullableType:HoppityCallWarning.kt$HoppityCallWarning$acceptUUID!!</ID>
+ <ID>UnsafeCallOnNullableType:IslandGraphs.kt$IslandGraphs$currentTarget!!</ID>
+ <ID>UnsafeCallOnNullableType:ItemBlink.kt$ItemBlink$offsets[item]!!</ID>
+ <ID>UnsafeCallOnNullableType:ItemPickupLog.kt$ItemPickupLog$listToCheckAgainst[key]!!</ID>
+ <ID>UnsafeCallOnNullableType:ItemPickupLog.kt$ItemPickupLog$listToCheckAgainst[key]?.second!!</ID>
+ <ID>UnsafeCallOnNullableType:ItemStackTypeAdapterFactory.kt$ItemStackTypeAdapterFactory$gson!!</ID>
+ <ID>UnsafeCallOnNullableType:ItemUtils.kt$ItemUtils$itemAmountCache[input]!!</ID>
+ <ID>UnsafeCallOnNullableType:JacobContestTimeNeeded.kt$JacobContestTimeNeeded$map[crop]!!</ID>
+ <ID>UnsafeCallOnNullableType:KSerializable.kt$KotlinTypeAdapterFactory$kotlinClass.memberProperties.find { it.name == param.name }!!</ID>
+ <ID>UnsafeCallOnNullableType:KSerializable.kt$KotlinTypeAdapterFactory$param.name!!</ID>
+ <ID>UnsafeCallOnNullableType:LorenzEvent.kt$LorenzEvent$this::class.simpleName!!</ID>
+ <ID>UnsafeCallOnNullableType:MinionFeatures.kt$MinionFeatures$newMinion!!</ID>
+ <ID>UnsafeCallOnNullableType:MobFinder.kt$MobFinder$floor6GiantsSeparateDelay[uuid]!!</ID>
+ <ID>UnsafeCallOnNullableType:NavigationHelper.kt$NavigationHelper$distances[node]!!</ID>
+ <ID>UnsafeCallOnNullableType:NumberUtil.kt$NumberUtil$romanSymbols[this]!!</ID>
+ <ID>UnsafeCallOnNullableType:PositionList.kt$PositionList$configLink!!</ID>
+ <ID>UnsafeCallOnNullableType:ReminderManager.kt$ReminderManager$storage[args.drop(1).first()]!!</ID>
+ <ID>UnsafeCallOnNullableType:ReminderManager.kt$ReminderManager$storage[args.first()]!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderEntityOutlineEvent.kt$RenderEntityOutlineEvent$entitiesToChooseFrom!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderEntityOutlineEvent.kt$RenderEntityOutlineEvent$entitiesToOutline!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderGlobalHook.kt$RenderGlobalHook$camera!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderLivingEntityHelper.kt$RenderLivingEntityHelper$entityColorCondition[entity]!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderLivingEntityHelper.kt$RenderLivingEntityHelper$entityColorMap[entity]!!</ID>
+ <ID>UnsafeCallOnNullableType:RenderUtils.kt$RenderUtils$it.name!!</ID>
+ <ID>UnsafeCallOnNullableType:RepoManager.kt$RepoManager$latestRepoCommit!!</ID>
+ <ID>UnsafeCallOnNullableType:RepoUtils.kt$RepoUtils$file!!</ID>
+ <ID>UnsafeCallOnNullableType:SackAPI.kt$SackAPI$match.groups[1]!!</ID>
+ <ID>UnsafeCallOnNullableType:SackAPI.kt$SackAPI$match.groups[2]!!</ID>
+ <ID>UnsafeCallOnNullableType:SackAPI.kt$SackAPI$match.groups[3]!!</ID>
+ <ID>UnsafeCallOnNullableType:SackAPI.kt$SackAPI$oldData!!</ID>
+ <ID>UnsafeCallOnNullableType:SimpleCommand.kt$SimpleCommand$tabRunnable!!</ID>
+ <ID>UnsafeCallOnNullableType:SkyHanniBucketedItemTracker.kt$SkyHanniBucketedItemTracker$it.get(DisplayMode.SESSION).getItemsProp()[internalName]!!</ID>
+ <ID>UnsafeCallOnNullableType:SkyHanniBucketedItemTracker.kt$SkyHanniBucketedItemTracker$it.get(DisplayMode.TOTAL).getItemsProp()[internalName]!!</ID>
+ <ID>UnsafeCallOnNullableType:SkyHanniMod.kt$SkyHanniMod.Companion$Loader.instance().indexedModList[MODID]!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$distance!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$distance2!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$firstParticlePoint?.distance(pos)!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$lastParticlePoint2!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$lastParticlePoint2?.distance(particlePoint!!)!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$particlePoint!!</ID>
+ <ID>UnsafeCallOnNullableType:SoopyGuessBurrow.kt$SoopyGuessBurrow$particlePoint?.subtract(lastParticlePoint2!!)!!</ID>
+ <ID>UnsafeCallOnNullableType:SummoningSoulsName.kt$SummoningSoulsName$mobsName.getOrNull(nearestMob)!!</ID>
+ <ID>UnsafeCallOnNullableType:SuperpairsClicksAlert.kt$SuperpairsClicksAlert$match.groups[1]!!</ID>
+ <ID>UnsafeCallOnNullableType:TiaRelayWaypoints.kt$TiaRelayWaypoints$waypointName!!</ID>
+ <ID>UnsafeCallOnNullableType:Translator.kt$Translator$messageContentRegex.find(message)!!</ID>
+ <ID>UnsafeCallOnNullableType:TrevorFeatures.kt$TrevorFeatures$TrevorSolver.currentMob!!</ID>
+ <ID>UnsafeCallOnNullableType:TrevorSolver.kt$TrevorSolver$currentMob!!</ID>
+ <ID>UnsafeCallOnNullableType:TunnelsMaps.kt$TunnelsMaps$campfire.name!!</ID>
+ <ID>UnsafeCallOnNullableType:UpdateManager.kt$UpdateManager$potentialUpdate!!</ID>
+ <ID>UnsafeCallOnNullableType:VisitorRewardWarning.kt$VisitorRewardWarning$visitor.totalPrice!!</ID>
+ <ID>UnsafeCallOnNullableType:VisitorRewardWarning.kt$VisitorRewardWarning$visitor.totalReward!!</ID>
+ <ID>UnusedParameter:SkyHanniDebugsAndTests.kt$SkyHanniDebugsAndTests$args: Array&lt;String&gt;</ID>
+ <ID>UseIsNullOrEmpty:ItemUtils.kt$ItemUtils$name == null || name.isEmpty()</ID>
+ <ID>UseOrEmpty:SkyHanniDebugsAndTests.kt$SkyHanniDebugsAndTests$event.originalOre?.let { "$it " } ?: ""</ID>
+ <ID>VarCouldBeVal:AdvancedPlayerList.kt$AdvancedPlayerList$private var randomOrderCache = TimeLimitedCache&lt;String, Int&gt;(20.minutes)</ID>
+ <ID>VarCouldBeVal:BestiaryData.kt$BestiaryData$private var indexes = listOf( 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43 )</ID>
+ <ID>VarCouldBeVal:BucketedItemTrackerData.kt$BucketedItemTrackerData$@Expose private var bucketedItems: MutableMap&lt;E, MutableMap&lt;NEUInternalName, TrackedItem&gt;&gt; = HashMap()</ID>
+ <ID>VarCouldBeVal:CarnivalZombieShootout.kt$CarnivalZombieShootout$private var lastUpdate = Updates(SimpleTimeMark.farPast(), SimpleTimeMark.farPast())</ID>
+ <ID>VarCouldBeVal:ChocolateFactoryStrayTracker.kt$ChocolateFactoryStrayTracker$private var claimedStraysSlots = mutableListOf&lt;Int&gt;()</ID>
+ <ID>VarCouldBeVal:CompactBestiaryChatMessage.kt$CompactBestiaryChatMessage$private var bestiaryDescription = mutableListOf&lt;String&gt;()</ID>
+ <ID>VarCouldBeVal:CompactExperimentRewards.kt$CompactExperimentRewards$private var gainedRewards = mutableListOf&lt;String&gt;()</ID>
+ <ID>VarCouldBeVal:CraftRoomHolographicMob.kt$CraftRoomHolographicMob$private var entityToHolographicEntity = mapOf( EntityZombie::class.java to HolographicEntities.zombie, EntitySlime::class.java to HolographicEntities.slime, EntityCaveSpider::class.java to HolographicEntities.caveSpider, )</ID>
+ <ID>VarCouldBeVal:CustomWardrobe.kt$CustomWardrobe$private var guiName = "Custom Wardrobe"</ID>
+ <ID>VarCouldBeVal:Enchant.kt$Enchant$@Expose private var goodLevel = 0</ID>
+ <ID>VarCouldBeVal:Enchant.kt$Enchant$@Expose private var maxLevel = 0</ID>
+ <ID>VarCouldBeVal:Enchant.kt$Enchant.Stacking$@Expose @Suppress("unused") private var statLabel: String? = null</ID>
+ <ID>VarCouldBeVal:Enchant.kt$Enchant.Stacking$@Expose private var nbtNum: String? = null</ID>
+ <ID>VarCouldBeVal:Enchant.kt$Enchant.Stacking$@Expose private var stackLevel: TreeSet&lt;Int&gt;? = null</ID>
+ <ID>VarCouldBeVal:ErrorManager.kt$ErrorManager$private var cache = TimeLimitedSet&lt;Pair&lt;String, Int&gt;&gt;(10.minutes)</ID>
+ <ID>VarCouldBeVal:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$var comboPrice = combo.asInternalName().getPriceOrNull()</ID>
+ <ID>VarCouldBeVal:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$var internalName = removeKuudraArmorPrefix(stack.getInternalName().asString().removePrefix("VANQUISHED_"))</ID>
+ <ID>VarCouldBeVal:EstimatedItemValueCalculator.kt$EstimatedItemValueCalculator$var nameColor = if (!useless) "§9" else "§7"</ID>
+ <ID>VarCouldBeVal:ExperimentsProfitTracker.kt$ExperimentsProfitTracker$private var currentBottlesInInventory = mutableMapOf&lt;NEUInternalName, Int&gt;()</ID>
+ <ID>VarCouldBeVal:ExperimentsProfitTracker.kt$ExperimentsProfitTracker$private var lastBottlesInInventory = mutableMapOf&lt;NEUInternalName, Int&gt;()</ID>
+ <ID>VarCouldBeVal:ExperimentsProfitTracker.kt$ExperimentsProfitTracker$private var lastSplashes = mutableListOf&lt;ItemStack&gt;()</ID>
+ <ID>VarCouldBeVal:FarmingWeightDisplay.kt$FarmingWeightDisplay$private var nextPlayers = mutableListOf&lt;UpcomingLeaderboardPlayer&gt;()</ID>
+ <ID>VarCouldBeVal:FlareDisplay.kt$FlareDisplay$private var flares = mutableListOf&lt;Flare&gt;()</ID>
+ <ID>VarCouldBeVal:FontRendererHook.kt$FontRendererHook$private var CHROMA_COLOR: Int = -0x1</ID>
+ <ID>VarCouldBeVal:FontRendererHook.kt$FontRendererHook$private var CHROMA_COLOR_SHADOW: Int = -0xAAAAAB</ID>
+ <ID>VarCouldBeVal:GardenPlotIcon.kt$GardenPlotIcon$private var cachedStack = mutableMapOf&lt;Int, ItemStack&gt;()</ID>
+ <ID>VarCouldBeVal:GardenPlotIcon.kt$GardenPlotIcon$private var originalStack = mutableMapOf&lt;Int, ItemStack&gt;()</ID>
+ <ID>VarCouldBeVal:GardenPlotMenuHighlighting.kt$GardenPlotMenuHighlighting$private var highlightedPlots = mutableMapOf&lt;GardenPlotAPI.Plot, PlotStatusType&gt;()</ID>
+ <ID>VarCouldBeVal:GardenVisitorColorNames.kt$GardenVisitorColorNames$private var visitorColors = mutableMapOf&lt;String, String&gt;() // name -&gt; color code</ID>
+ <ID>VarCouldBeVal:GhostData.kt$GhostData$private var session = mutableMapOf( Option.KILLS to 0.0, Option.SORROWCOUNT to 0.0, Option.VOLTACOUNT to 0.0, Option.PLASMACOUNT to 0.0, Option.GHOSTLYBOOTS to 0.0, Option.BAGOFCASH to 0.0, Option.TOTALDROPS to 0.0, Option.SCAVENGERCOINS to 0.0, Option.MAXKILLCOMBO to 0.0, Option.SKILLXPGAINED to 0.0 )</ID>
+ <ID>VarCouldBeVal:GraphEditor.kt$GraphEditor$var vector = LocationUtils.calculatePlayerFacingDirection()</ID>
+ <ID>VarCouldBeVal:HoppityCollectionStats.kt$HoppityCollectionStats$private var highlightMap = mutableMapOf&lt;String, LorenzColor&gt;()</ID>
+ <ID>VarCouldBeVal:HoppityEggLocations.kt$HoppityEggLocations$// TODO add gui/command to show total data/missing islands private var collectedEggStorage: MutableMap&lt;IslandType, MutableSet&lt;LorenzVec&gt;&gt; get() = ChocolateFactoryAPI.profileStorage?.collectedEggLocations ?: mutableMapOf() set(value) { ChocolateFactoryAPI.profileStorage?.collectedEggLocations = value }</ID>
+ <ID>VarCouldBeVal:HoppityNpc.kt$HoppityNpc$private var slotsToHighlight = mutableSetOf&lt;Int&gt;()</ID>
+ <ID>VarCouldBeVal:IslandAreas.kt$IslandAreas$var suffix = ""</ID>
+ <ID>VarCouldBeVal:ItemPickupLog.kt$ItemPickupLog$private var itemList = mutableMapOf&lt;Int, Pair&lt;ItemStack, Int&gt;&gt;()</ID>
+ <ID>VarCouldBeVal:ItemPickupLog.kt$ItemPickupLog$private var itemsAddedToInventory = mutableMapOf&lt;Int, PickupEntry&gt;()</ID>
+ <ID>VarCouldBeVal:ItemPickupLog.kt$ItemPickupLog$private var itemsRemovedFromInventory = mutableMapOf&lt;Int, PickupEntry&gt;()</ID>
+ <ID>VarCouldBeVal:LocationUtils.kt$LocationUtils$var yaw = LocationUtils.calculatePlayerYaw() + 180</ID>
+ <ID>VarCouldBeVal:LorenzLogger.kt$LorenzLogger.Companion$private var LOG_DIRECTORY = File("config/skyhanni/logs")</ID>
+ <ID>VarCouldBeVal:MobDetection.kt$MobDetection$private var shouldClear: AtomicBoolean = AtomicBoolean(false)</ID>
+ <ID>VarCouldBeVal:MobFinder.kt$MobFinder$private var floor2summonsDiedOnce = mutableListOf&lt;EntityOtherPlayerMP&gt;()</ID>
+ <ID>VarCouldBeVal:MobFinder.kt$MobFinder$private var floor6GiantsSeparateDelay = mutableMapOf&lt;UUID, Pair&lt;Long, BossType&gt;&gt;()</ID>
+ <ID>VarCouldBeVal:MobFinder.kt$MobFinder$private var guardians = mutableListOf&lt;EntityGuardian&gt;()</ID>
+ <ID>VarCouldBeVal:NeuReforgeJson.kt$NeuReforgeJson$private lateinit var itemTypeField: Pair&lt;String, List&lt;NEUInternalName&gt;&gt;</ID>
+ <ID>VarCouldBeVal:PowerStoneGuideFeatures.kt$PowerStoneGuideFeatures$private var missing = mutableMapOf&lt;Int, NEUInternalName&gt;()</ID>
+ <ID>VarCouldBeVal:PunchcardHighlight.kt$PunchcardHighlight$private var playerQueue = mutableListOf&lt;String&gt;()</ID>
+ <ID>VarCouldBeVal:QuiverWarning.kt$QuiverWarning$private var arrowsInInstance = mutableSetOf&lt;ArrowType&gt;()</ID>
+ <ID>VarCouldBeVal:ReforgeHelper.kt$ReforgeHelper$private var waitForChat = AtomicBoolean(false)</ID>
+ <ID>VarCouldBeVal:ReminderManager.kt$ReminderManager$private var listPage = 1</ID>
+ <ID>VarCouldBeVal:RepoPatternGui.kt$RepoPatternGui$private var searchCache = ObservableList(mutableListOf&lt;RepoPatternInfo&gt;())</ID>
+ <ID>VarCouldBeVal:RepoPatternManager.kt$RepoPatternManager$/** * Map containing all keys and their repo patterns. Used for filling in new regexes after an update, and for * checking duplicate registrations. */ private var usedKeys: NavigableMap&lt;String, CommonPatternInfo&lt;*, *&gt;&gt; = TreeMap()</ID>
+ <ID>VarCouldBeVal:RepoPatternManager.kt$RepoPatternManager$/** * Map containing the exclusive owner of a regex key */ private var exclusivity: MutableMap&lt;String, RepoPatternKeyOwner&gt; = mutableMapOf()</ID>
+ <ID>VarCouldBeVal:SeaCreatureFeatures.kt$SeaCreatureFeatures$private var entityIds = TimeLimitedSet&lt;Int&gt;(6.minutes)</ID>
+ <ID>VarCouldBeVal:SeaCreatureFeatures.kt$SeaCreatureFeatures$private var rareSeaCreatures = TimeLimitedSet&lt;Mob&gt;(6.minutes)</ID>
+ <ID>VarCouldBeVal:ShowFishingItemName.kt$ShowFishingItemName$private var itemsOnGround = TimeLimitedCache&lt;EntityItem, String&gt;(750.milliseconds)</ID>
+ <ID>VarCouldBeVal:SkyblockGuideHighlightFeature.kt$SkyblockGuideHighlightFeature.Companion$private var missing = mutableSetOf&lt;Int&gt;()</ID>
+ <ID>VarCouldBeVal:SlayerItemsOnGround.kt$SlayerItemsOnGround$private var itemsOnGround = TimeLimitedCache&lt;EntityItem, String&gt;(2.seconds)</ID>
+ <ID>VarCouldBeVal:SoopyGuessBurrow.kt$SoopyGuessBurrow$private var dingSlope = mutableListOf&lt;Float&gt;()</ID>
+ <ID>VarCouldBeVal:SoopyGuessBurrow.kt$SoopyGuessBurrow$private var locations = mutableListOf&lt;LorenzVec&gt;()</ID>
+ <ID>VarCouldBeVal:SuperpairExperimentInformationDisplay.kt$SuperpairExperimentInformationDisplay$// TODO remove string. use enum instead! maybe even create new data type instead of map of pairs private var found = mutableMapOf&lt;Pair&lt;Item?, ItemPair?&gt;, String&gt;()</ID>
+ <ID>VarCouldBeVal:SuperpairExperimentInformationDisplay.kt$SuperpairExperimentInformationDisplay$private var lastClicked = mutableListOf&lt;Pair&lt;Int, Int&gt;&gt;()</ID>
+ <ID>VarCouldBeVal:SuperpairExperimentInformationDisplay.kt$SuperpairExperimentInformationDisplay$private var toCheck = mutableListOf&lt;Pair&lt;Int, Int&gt;&gt;()</ID>
+ <ID>VarCouldBeVal:SuperpairExperimentInformationDisplay.kt$SuperpairExperimentInformationDisplay$private var uncoveredItems = mutableListOf&lt;Pair&lt;Int, String&gt;&gt;()</ID>
+ <ID>VarCouldBeVal:TiaRelayHelper.kt$TiaRelayHelper$private var resultDisplay = mutableMapOf&lt;Int, Int&gt;()</ID>
+ <ID>VarCouldBeVal:TiaRelayHelper.kt$TiaRelayHelper$private var sounds = mutableMapOf&lt;Int, Sound&gt;()</ID>
+ <ID>VarCouldBeVal:Translator.kt$Translator$var lang = config.languageCode.get()</ID>
+ <ID>VarCouldBeVal:TrevorFeatures.kt$TrevorFeatures$private var backupTrapperID: Int = 17</ID>
+ <ID>VarCouldBeVal:TrevorFeatures.kt$TrevorFeatures$private var trapperID: Int = 56</ID>
+ <ID>VarCouldBeVal:TrophyFishDisplay.kt$TrophyFishDisplay$private var recentlyDroppedTrophies = TimeLimitedCache&lt;NEUInternalName, TrophyRarity&gt;(5.seconds)</ID>
+ <ID>VarCouldBeVal:UserLuckBreakdown.kt$UserLuckBreakdown$private var fillerID = "STAINED_GLASS_PANE".asInternalName()</ID>
+ <ID>VarCouldBeVal:UserLuckBreakdown.kt$UserLuckBreakdown$private var limboID = "ENDER_PEARL".asInternalName()</ID>
+ <ID>VarCouldBeVal:UserLuckBreakdown.kt$UserLuckBreakdown$private var skillOverflowLuck = mutableMapOf&lt;SkillType, Int&gt;()</ID>
+ <ID>VarCouldBeVal:UserLuckBreakdown.kt$UserLuckBreakdown$private var skillsID = "DIAMOND_SWORD".asInternalName()</ID>
+ </CurrentIssues>
+</SmellBaseline>