Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Feature: Reforge helper #1437

Merged
merged 53 commits into from
Jun 23, 2024
Merged
Show file tree
Hide file tree
Changes from 43 commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
b5eec4d
ReforgeHelper
Thunderblade73 Apr 13, 2024
f5c2b9a
. fix
Thunderblade73 Apr 15, 2024
576aad9
fix ConfigManager
Thunderblade73 Apr 16, 2024
96e5b7f
fix repoPattern
Thunderblade73 Apr 16, 2024
7ccc984
added config links
Thunderblade73 Apr 16, 2024
7ad9082
Merge branch 'beta' into reforgeHelper-cleanup
Thunderblade73 Apr 24, 2024
cf021fe
Merge branch 'beta' into reforgeHelper-cleanup
Thunderblade73 May 7, 2024
7b65900
Merge branch 'beta' into reforgeHelper-cleanup
Thunderblade73 May 7, 2024
74a1c48
fix highlight
Thunderblade73 May 9, 2024
02858e3
Merge branch 'beta' into reforgeHelper-cleanup
Thunderblade73 May 29, 2024
b6fa540
Merge branch 'refs/heads/beta' into fork/Thunderblade73/reforgeHelper…
CalMWolfs Jun 1, 2024
ee1e99f
make it not crash
CalMWolfs Jun 1, 2024
5e1c9ba
cal suggestions
Thunderblade73 Jun 1, 2024
4030b04
Merge branch 'refs/heads/beta' into fork/Thunderblade73/reforgeHelper…
CalMWolfs Jun 2, 2024
c7135d6
use annotation
CalMWolfs Jun 2, 2024
22595da
show active
Thunderblade73 Jun 3, 2024
1921f07
Merge branch 'refs/heads/beta' into fork/Thunderblade73/reforgeHelper…
CalMWolfs Jun 4, 2024
0f19b78
some changes
CalMWolfs Jun 4, 2024
a9d7554
remove unused config things
CalMWolfs Jun 4, 2024
325a2a7
redundant setter
CalMWolfs Jun 4, 2024
40c640f
cal's cleanup
Thunderblade73 Jun 4, 2024
f318d78
minor changes
Thunderblade73 Jun 4, 2024
1bf0ea5
Merge branch 'refs/heads/beta' into fork/Thunderblade73/reforgeHelper…
CalMWolfs Jun 7, 2024
0197417
Merge branch 'refs/heads/beta' into reforgeHelper-cleanup
Thunderblade73 Jun 9, 2024
9b0b9e7
formatting
Thunderblade73 Jun 9, 2024
89e9e37
formatting
Thunderblade73 Jun 9, 2024
f17d264
Merge branch 'refs/heads/beta' into reforgeHelper-cleanup
Thunderblade73 Jun 9, 2024
cffeaf8
formatting
Thunderblade73 Jun 9, 2024
69161af
formatting
Thunderblade73 Jun 9, 2024
a1cf74e
formatting
Thunderblade73 Jun 9, 2024
b85ef45
Merge branch 'refs/heads/beta' into fork/Thunderblade73/reforgeHelper…
hannibal002 Jun 13, 2024
c00e39f
formatting
hannibal002 Jun 13, 2024
8ca993b
code cleanup
hannibal002 Jun 13, 2024
f0e7660
Merge branch 'refs/heads/beta' into fork/Thunderblade73/reforgeHelper…
hannibal002 Jun 14, 2024
01bdce4
Merge branch 'refs/heads/beta' into fork/Thunderblade73/reforgeHelper…
hannibal002 Jun 14, 2024
e86de97
Merge branch 'refs/heads/beta' into fork/Thunderblade73/reforgeHelper…
hannibal002 Jun 14, 2024
3e41b23
fix merge conflicts
hannibal002 Jun 14, 2024
38ac9d8
implemented small suggestions
Thunderblade73 Jun 15, 2024
7d1c92b
big suggestion implemented
Thunderblade73 Jun 15, 2024
225ad02
Update src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt
Thunderblade73 Jun 16, 2024
a9d0f4a
typo
Thunderblade73 Jun 16, 2024
4853caf
fix ability diff
Thunderblade73 Jun 16, 2024
607f28f
correctly now
Thunderblade73 Jun 16, 2024
42f3147
Merge branch 'refs/heads/beta' into fork/Thunderblade73/reforgeHelper…
hannibal002 Jun 23, 2024
29171da
code cleanup
hannibal002 Jun 23, 2024
fb372d2
suggestions
Thunderblade73 Jun 23, 2024
339e706
Merge branch 'refs/heads/beta' into fork/Thunderblade73/reforgeHelper…
hannibal002 Jun 23, 2024
e1137c8
formatting
hannibal002 Jun 23, 2024
74922ee
only show "Click to apply sorting" when truly clickable
hannibal002 Jun 23, 2024
9541cc8
only show "Click to select!" when truly clickable
hannibal002 Jun 23, 2024
e922a9c
extract function
hannibal002 Jun 23, 2024
4817717
code cleanup
hannibal002 Jun 23, 2024
a15b957
sort by
hannibal002 Jun 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
198 changes: 198 additions & 0 deletions src/main/java/at/hannibal2/skyhanni/api/ReforgeAPI.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
package at.hannibal2.skyhanni.api

import at.hannibal2.skyhanni.data.jsonobjects.repo.neu.NeuReforgeJson
import at.hannibal2.skyhanni.data.model.SkyblockStat
import at.hannibal2.skyhanni.data.model.SkyblockStatList
import at.hannibal2.skyhanni.events.NeuRepositoryReloadEvent
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.ItemCategory
import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName
import at.hannibal2.skyhanni.utils.ItemUtils.getItemCategoryOrNull
import at.hannibal2.skyhanni.utils.ItemUtils.itemNameWithoutColor
import at.hannibal2.skyhanni.utils.LorenzRarity
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NEUInternalName
import at.hannibal2.skyhanni.utils.json.BaseGsonBuilder
import at.hannibal2.skyhanni.utils.json.SkyHanniTypeAdapters
import com.google.gson.Gson
import com.google.gson.TypeAdapter
import com.google.gson.stream.JsonReader
import com.google.gson.stream.JsonWriter
import net.minecraft.item.ItemStack
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

@SkyHanniModule
object ReforgeAPI {
var reforgeList: List<Reforge> = emptyList()
private set(value) {
field = value
nonePowerStoneReforge = value.filterNot { it.isReforgeStone }
onlyPowerStoneReforge = value.filter { it.isReforgeStone }
}

var nonePowerStoneReforge: List<Reforge> = emptyList()
private set

var onlyPowerStoneReforge: List<Reforge> = emptyList()
private set

enum class ReforgeType {
SWORD,
BOW,
ARMOR,
CHESTPLATE,
HELMET,
CLOAK,
AXE,
HOE,
AXE_AND_HOE,
PICKAXE,
EQUIPMENT,
ROD,
SWORD_AND_ROD,
SPECIAL_ITEMS,
VACUUM
}

class Reforge(
val name: String,
val type: ReforgeType,
val stats: Map<LorenzRarity, SkyblockStatList>,
val reforgeStone: NEUInternalName? = null,
val specialItems: List<NEUInternalName>? = null,
val extraProperty: Map<LorenzRarity, String> = emptyMap(),
val costs: Map<LorenzRarity, Long>? = null,
) {

val isReforgeStone = reforgeStone != null

val rawReforgeStoneName = reforgeStone?.itemNameWithoutColor

val lowercaseName = name.lowercase()

fun isValid(itemStack: ItemStack) = isValid(itemStack.getItemCategoryOrNull(), itemStack.getInternalName())

fun isValid(itemCategory: ItemCategory?, internalName: NEUInternalName) = when (type) {
ReforgeType.SWORD -> setOf(
ItemCategory.SWORD,
ItemCategory.GAUNTLET,
ItemCategory.LONGSWORD,
ItemCategory.FISHING_WEAPON,
).contains(itemCategory)

ReforgeType.BOW -> itemCategory == ItemCategory.BOW || itemCategory == ItemCategory.SHORT_BOW
ReforgeType.ARMOR -> setOf(
ItemCategory.HELMET,
ItemCategory.CHESTPLATE,
ItemCategory.LEGGINGS,
ItemCategory.BOOTS,
).contains(itemCategory)

ReforgeType.CHESTPLATE -> itemCategory == ItemCategory.CHESTPLATE
ReforgeType.HELMET -> itemCategory == ItemCategory.HELMET
ReforgeType.CLOAK -> itemCategory == ItemCategory.CLOAK
ReforgeType.AXE -> itemCategory == ItemCategory.AXE
ReforgeType.HOE -> itemCategory == ItemCategory.HOE
ReforgeType.AXE_AND_HOE -> itemCategory == ItemCategory.HOE || itemCategory == ItemCategory.AXE
ReforgeType.PICKAXE ->
itemCategory == ItemCategory.PICKAXE ||
itemCategory == ItemCategory.DRILL ||
itemCategory == ItemCategory.GAUNTLET

ReforgeType.EQUIPMENT -> setOf(
ItemCategory.CLOAK,
ItemCategory.BELT,
ItemCategory.NECKLACE,
ItemCategory.BRACELET,
ItemCategory.GLOVES,
).contains(itemCategory)

ReforgeType.ROD -> itemCategory == ItemCategory.FISHING_ROD || itemCategory == ItemCategory.FISHING_WEAPON
ReforgeType.SWORD_AND_ROD -> setOf(
ItemCategory.SWORD,
ItemCategory.GAUNTLET,
ItemCategory.LONGSWORD,
ItemCategory.FISHING_ROD,
ItemCategory.FISHING_WEAPON,
).contains(itemCategory)

ReforgeType.VACUUM -> itemCategory == ItemCategory.VACUUM
ReforgeType.SPECIAL_ITEMS -> specialItems?.contains(internalName) ?: false
}

override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false

other as Reforge

if (name != other.name) return false
if (type != other.type) return false
if (stats != other.stats) return false
if (reforgeStone != other.reforgeStone) return false
if (specialItems != other.specialItems) return false
if (extraProperty != other.extraProperty) return false

return true
}

override fun hashCode(): Int {
var result = name.hashCode()
result = 31 * result + type.hashCode()
result = 31 * result + stats.hashCode()
result = 31 * result + (reforgeStone?.hashCode() ?: 0)
result = 31 * result + (specialItems?.hashCode() ?: 0)
result = 31 * result + extraProperty.hashCode()
return result
}

override fun toString(): String = "Reforge $name"
}

@SubscribeEvent
fun onNeuRepoReload(event: NeuRepositoryReloadEvent) {
val reforgeStoneData = event.readConstant<Map<String, NeuReforgeJson>>("reforgestones", reforgeGson).values
val reforgeData = event.readConstant<Map<String, NeuReforgeJson>>("reforges", reforgeGson).values
reforgeList = (reforgeStoneData + reforgeData).map(::mapReforge)
}

private val reforgeGson: Gson = BaseGsonBuilder.gson()
.registerTypeAdapter(SkyblockStat::class.java, SkyHanniTypeAdapters.SKYBLOCK_STAT.nullSafe())
.registerTypeAdapter(
SkyblockStatList::class.java,
object : TypeAdapter<SkyblockStatList>() {
override fun write(out: JsonWriter, value: SkyblockStatList) {
out.beginObject()
value.entries.forEach {
out.name(it.key.name.lowercase()).value(it.value)
}
out.endObject()
}

override fun read(reader: JsonReader): SkyblockStatList {
reader.beginObject()
val list = SkyblockStatList()
while (reader.hasNext()) {
val name = reader.nextName()
val value = reader.nextDouble()
list[SkyblockStat.valueOf(name.uppercase())] = value
}
reader.endObject()
return list
}
},
).create()

private fun mapReforge(it: NeuReforgeJson): Reforge {
val type = it.itemType
return Reforge(
name = it.reforgeName,
type = LorenzUtils.enumValueOf<ReforgeType>(type.first),
stats = it.reforgeStats ?: emptyMap(),
reforgeStone = it.internalName,
specialItems = type.second.takeIf { it.isNotEmpty() },
extraProperty = it.reforgeAbility,
costs = it.reforgeCosts,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ public static class HarpConfig {
@Accordion
public TiaRelayConfig tiaRelay = new TiaRelayConfig();

@Expose
@ConfigOption(name = "Reforge Helper", desc = "")
@Accordion
public ReforgeHelperConfig reforge = new ReforgeHelperConfig();

@Expose
@ConfigOption(name = "Enchanting", desc = "")
@Accordion
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package at.hannibal2.skyhanni.config.features.inventory.helper;

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

public class ReforgeHelperConfig {

@Expose
@ConfigLink(owner = ReforgeHelperConfig.class, field = "enabled")
public Position position = new Position(80, 85, true, true);

@Expose
@ConfigOption(name = "Enable", desc = "Enables the reforge helper.")
@ConfigEditorBoolean
@FeatureToggle
public boolean enabled = true;

@Expose
@ConfigOption(name = "Stones Hex Only", desc = "Displays reforge stones only when in Hex.")
@ConfigEditorBoolean
public boolean reforgeStonesOnlyHex = true;

@Expose
@ConfigOption(name = "Show Diff", desc = "Shows the difference of the new reforge to the current one in the slecetion list.")
@ConfigEditorBoolean
public boolean showDiff = false;

@Expose
@ConfigOption(name = "Hide chat", desc = "Hides the vanilla chat messages from reforging.")
@ConfigEditorBoolean
public boolean hideChat = false;
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
package at.hannibal2.skyhanni.data.jsonobjects.repo.neu

import at.hannibal2.skyhanni.data.model.SkyblockStatList
import at.hannibal2.skyhanni.utils.LorenzRarity
import at.hannibal2.skyhanni.utils.NEUInternalName
import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName
import at.hannibal2.skyhanni.utils.NEUItems
import com.google.gson.annotations.Expose
import com.google.gson.annotations.SerializedName
import net.minecraft.item.Item

data class NeuReforgeStoneJson(
@Expose val internalName: NEUInternalName,
data class NeuReforgeJson(
@Expose val internalName: NEUInternalName?,
@Expose val reforgeName: String,
@Expose @SerializedName("itemTypes") val rawItemTypes: Any,
@Expose val requiredRarities: List<LorenzRarity>,
@Expose val reforgeCosts: Map<LorenzRarity, Long>,
@Expose val reforgeStats: Map<LorenzRarity, Map<String, Double>>,
@Expose val reforgeCosts: Map<LorenzRarity, Long>?,
@Expose val reforgeStats: Map<LorenzRarity, SkyblockStatList>?,
@Expose @SerializedName("reforgeAbility") val rawReforgeAbility: Any?,
) {

private lateinit var reforgeAbilityField: Map<LorenzRarity, String>
private lateinit var itemTypeField: Pair<String, List<NEUInternalName>>

val reforgeAbility
get() = if (this::reforgeAbilityField.isInitialized) reforgeAbilityField
Expand All @@ -27,7 +32,7 @@ data class NeuReforgeStoneJson(

is Map<*, *> -> (this.rawReforgeAbility as? Map<String, String>)?.mapKeys {
LorenzRarity.valueOf(
it.key.uppercase().replace(" ", "_")
it.key.uppercase().replace(" ", "_"),
)
} ?: emptyMap()

Expand All @@ -36,28 +41,27 @@ data class NeuReforgeStoneJson(
reforgeAbilityField
}

/* used in ReforgeAPI which isn't in beta yet
val itemType: Pair<String, List<NEUInternalName>> by lazy {
val itemType: Pair<String, List<NEUInternalName>>
get() = if (this::itemTypeField.isInitialized) itemTypeField
else run {
val any = this.rawItemTypes
return@lazy when (any) {
return when (any) {
is String -> {
any.replace("/", "_AND_").uppercase() to emptyList()
}

is Map<*, *> -> {
val type = "SPECIAL_ITEMS"
val map = any as? Map<String, List<String>> ?: return@lazy type to emptyList()
val map = any as? Map<String, List<String>> ?: return type to emptyList()
val internalNames = map["internalName"]?.map { it.asInternalName() } ?: emptyList()
val itemType = map["itemid"]?.map {
NEUItems.getInternalNamesForItemId(Item.getByNameOrId(it))
}?.flatten()
?: emptyList()
}?.flatten() ?: emptyList()
type to (internalNames + itemType)
}

else -> throw IllegalStateException()
}
}
*/
}

Loading
Loading