feat: Add reforge recipes

This commit is contained in:
Linnea Gräf
2024-12-25 16:55:33 +01:00
parent ddebaf4790
commit c4997e2105
5 changed files with 65 additions and 21 deletions

View File

@@ -182,6 +182,7 @@ fun createIsolatedSourceSet(name: String, path: String = "compat/$name", isEnabl
classpath.from(configurations.getByName(ss.compileClasspathConfigurationName)) classpath.from(configurations.getByName(ss.compileClasspathConfigurationName))
} }
collectTranslations { collectTranslations {
// TODO: this does not work, somehow
this.classes.from(sourceSets.main.get().kotlin.classesDirectory) this.classes.from(sourceSets.main.get().kotlin.classesDirectory)
} }
return ss return ss

View File

@@ -6,6 +6,7 @@ import me.shedaniel.math.FloatingDimension
import me.shedaniel.math.Point import me.shedaniel.math.Point
import me.shedaniel.math.Rectangle import me.shedaniel.math.Rectangle
import me.shedaniel.rei.api.client.gui.Renderer import me.shedaniel.rei.api.client.gui.Renderer
import me.shedaniel.rei.api.client.gui.widgets.Label
import me.shedaniel.rei.api.client.gui.widgets.Widget import me.shedaniel.rei.api.client.gui.widgets.Widget
import me.shedaniel.rei.api.client.gui.widgets.Widgets import me.shedaniel.rei.api.client.gui.widgets.Widgets
import me.shedaniel.rei.api.client.registry.display.DisplayCategory import me.shedaniel.rei.api.client.registry.display.DisplayCategory
@@ -34,6 +35,7 @@ import moe.nea.firmament.util.AprilFoolsUtil
import moe.nea.firmament.util.FirmFormatters import moe.nea.firmament.util.FirmFormatters
import moe.nea.firmament.util.SkyblockId import moe.nea.firmament.util.SkyblockId
import moe.nea.firmament.util.gold import moe.nea.firmament.util.gold
import moe.nea.firmament.util.grey
import moe.nea.firmament.util.skyblock.ItemType import moe.nea.firmament.util.skyblock.ItemType
import moe.nea.firmament.util.skyblock.Rarity import moe.nea.firmament.util.skyblock.Rarity
import moe.nea.firmament.util.skyblock.SkyBlockItems import moe.nea.firmament.util.skyblock.SkyBlockItems
@@ -64,15 +66,15 @@ class SBReforgeRecipe(
override fun setupDisplay(display: SBReforgeRecipe, bounds: Rectangle): MutableList<Widget> { override fun setupDisplay(display: SBReforgeRecipe, bounds: Rectangle): MutableList<Widget> {
val list = mutableListOf<Widget>() val list = mutableListOf<Widget>()
list.add(Widgets.createRecipeBase(bounds)) list.add(Widgets.createRecipeBase(bounds))
// TODO: actual layout after christmas, probably val inputSlot = Widgets.createSlot(Point(bounds.minX + 10, bounds.centerY - 9))
list.add(Widgets.createSlot(Point(bounds.minX + 10, bounds.centerY - 9)) .markInput().entries(display.inputItems)
.markInput().entries(display.inputItems)) list.add(inputSlot)
if (display.reforgeStone != null) { if (display.reforgeStone != null) {
list.add(Widgets.createSlot(Point(bounds.minX + 10 + 24, bounds.centerY - 9 - 10)) list.add(Widgets.createSlot(Point(bounds.minX + 10 + 24, bounds.centerY - 9 - 10))
.markInput().entry(display.reforgeStone)) .markInput().entry(display.reforgeStone))
list.add(Widgets.withTooltip( list.add(Widgets.withTooltip(
Widgets.withTranslate(Widgets.wrapRenderer( Widgets.withTranslate(Widgets.wrapRenderer(
Rectangle(Point(bounds.minX + 10 + 24, bounds.centerY - 9 + 10), Dimension(18, 18)), Rectangle(Point(bounds.minX + 10 + 24, bounds.centerY - 9 + 10), Dimension(16, 16)),
SBItemEntryDefinition.getEntry(SkyBlockItems.REFORGE_ANVIL)), 0.0, 0.0, 150.0), SBItemEntryDefinition.getEntry(SkyBlockItems.REFORGE_ANVIL)), 0.0, 0.0, 150.0),
Rarity.entries.mapNotNull { rarity -> Rarity.entries.mapNotNull { rarity ->
display.reforge.reforgeCosts?.get(rarity)?.let { rarity to it } display.reforge.reforgeCosts?.get(rarity)?.let { rarity to it }
@@ -87,16 +89,41 @@ class SBReforgeRecipe(
val size = if (AprilFoolsUtil.isAprilFoolsDay) 1.2 else 0.6 val size = if (AprilFoolsUtil.isAprilFoolsDay) 1.2 else 0.6
val dimension = val dimension =
FloatingDimension(EntityWidget.defaultSize.width * size, EntityWidget.defaultSize.height * size) FloatingDimension(EntityWidget.defaultSize.width * size, EntityWidget.defaultSize.height * size)
list.add(EntityWidget( list.add(Widgets.withTooltip(
EntityWidget(
EntityType.VILLAGER.create(EntityRenderer.fakeWorld, SpawnReason.COMMAND) EntityType.VILLAGER.create(EntityRenderer.fakeWorld, SpawnReason.COMMAND)
?.also { it.villagerData = it.villagerData.withProfession(VillagerProfession.WEAPONSMITH) }, ?.also { it.villagerData = it.villagerData.withProfession(VillagerProfession.WEAPONSMITH) },
Point(bounds.minX + 10 + 24 + 8 - dimension.width / 2, bounds.centerY - dimension.height / 2), Point(bounds.minX + 10 + 24 + 8 - dimension.width / 2, bounds.centerY - dimension.height / 2),
dimension dimension
),
tr("firmament.recipecategory.reforge.basic",
"This is a basic reforge, available at the Blacksmith.").grey()
)) ))
// TODO: render a blacksmith entity or smth
} }
list.add(Widgets.createSlot(Point(bounds.minX + 10 + 24 + 24, bounds.centerY - 9)) list.add(Widgets.createSlot(Point(bounds.minX + 10 + 24 + 24, bounds.centerY - 9))
.markInput().entries(display.outputItems)) .markInput().entries(display.outputItems))
val statToLineMappings = mutableListOf<Pair<String, Label>>()
for ((i, statId) in display.reforge.statUniverse.withIndex()) {
val label = Widgets.createLabel(
Point(bounds.minX + 10 + 24 + 24 + 20, bounds.minY + 8 + i * 11),
SBItemStack.Companion.StatLine(SBItemStack.statIdToName(statId), null).reconstitute(7))
.horizontalAlignment(Label.LEFT_ALIGNED)
statToLineMappings.add(statId to label)
list.add(label)
}
fun updateStatLines() {
val entry = inputSlot.currentEntry?.castValue<SBItemStack>() ?: return
val stats = display.reforge.reforgeStats?.get(entry.rarity) ?: mapOf()
for ((stat, label) in statToLineMappings) {
label.message =
SBItemStack.Companion.StatLine(
SBItemStack.statIdToName(stat), null,
valueNum = stats[stat]
).reconstitute(7)
}
}
updateStatLines()
inputSlot.withEntriesListener { updateStatLines() }
return list return list
} }
} }

View File

@@ -36,6 +36,10 @@ data class Reforge(
) { ) {
val eligibleItems get() = allowOn ?: itemTypes ?: listOf() val eligibleItems get() = allowOn ?: itemTypes ?: listOf()
val statUniverse: Set<String> = Rarity.entries.flatMapTo(mutableSetOf()) {
reforgeStats?.get(it)?.keys ?: emptySet()
}
@Serializable(with = ReforgeEligibilityFilter.Serializer::class) @Serializable(with = ReforgeEligibilityFilter.Serializer::class)
sealed interface ReforgeEligibilityFilter { sealed interface ReforgeEligibilityFilter {
object ItemTypesSerializer : KSerializer<List<ReforgeEligibilityFilter>> { object ItemTypesSerializer : KSerializer<List<ReforgeEligibilityFilter>> {
@@ -108,7 +112,7 @@ data class Reforge(
@Serializable(with = RarityMapped.Serializer::class) @Serializable(with = RarityMapped.Serializer::class)
sealed interface RarityMapped<T> { sealed interface RarityMapped<T> {
fun get(rarity: Rarity): T? fun get(rarity: Rarity?): T?
class Serializer<T>( class Serializer<T>(
val values: KSerializer<T> val values: KSerializer<T>
@@ -140,14 +144,14 @@ data class Reforge(
@Serializable @Serializable
data class Direct<T>(val value: T) : RarityMapped<T> { data class Direct<T>(val value: T) : RarityMapped<T> {
override fun get(rarity: Rarity): T { override fun get(rarity: Rarity?): T {
return value return value
} }
} }
@Serializable @Serializable
data class PerRarity<T>(val values: Map<Rarity, T>) : RarityMapped<T> { data class PerRarity<T>(val values: Map<Rarity, T>) : RarityMapped<T> {
override fun get(rarity: Rarity): T? { override fun get(rarity: Rarity?): T? {
return values[rarity] return values[rarity]
} }
} }

View File

@@ -18,7 +18,6 @@ import moe.nea.firmament.util.FirmFormatters
import moe.nea.firmament.util.LegacyFormattingCode import moe.nea.firmament.util.LegacyFormattingCode
import moe.nea.firmament.util.ReforgeId import moe.nea.firmament.util.ReforgeId
import moe.nea.firmament.util.SkyblockId import moe.nea.firmament.util.SkyblockId
import moe.nea.firmament.util.blue
import moe.nea.firmament.util.directLiteralStringContent import moe.nea.firmament.util.directLiteralStringContent
import moe.nea.firmament.util.extraAttributes import moe.nea.firmament.util.extraAttributes
import moe.nea.firmament.util.getReforgeId import moe.nea.firmament.util.getReforgeId
@@ -179,21 +178,30 @@ data class SBItemStack constructor(
} }
fun formatValue() = fun formatValue() =
Text.literal(FirmFormatters.formatCommas(valueNum ?: 0.0, 1, includeSign = true) + statFormatting.postFix + " ") Text.literal(FirmFormatters.formatCommas(valueNum ?: 0.0,
1,
includeSign = true) + statFormatting.postFix + " ")
.setStyle(Style.EMPTY.withColor(statFormatting.color)) .setStyle(Style.EMPTY.withColor(statFormatting.color))
val statFormatting = formattingOverrides[statName] ?: StatFormatting("", Formatting.GREEN) val statFormatting = formattingOverrides[statName] ?: StatFormatting("", Formatting.GREEN)
fun reconstitute(): Text = private fun abbreviate(abbreviateTo: Int): String {
if (abbreviateTo >= statName.length) return statName
val segments = statName.split(" ")
return segments.joinToString(" ") {
it.substring(0, maxOf(1, abbreviateTo / segments.size))
}
}
fun reconstitute(abbreviateTo: Int = Int.MAX_VALUE): Text =
Text.literal("").setStyle(Style.EMPTY.withItalic(false)) Text.literal("").setStyle(Style.EMPTY.withItalic(false))
.append(Text.literal("$statName: ").grey()) .append(Text.literal("${abbreviate(abbreviateTo)}: ").grey())
.append(value ?: formatValue()) .append(value ?: formatValue())
.also { rest.forEach(it::append) } .also { rest.forEach(it::append) }
} }
private fun statIdToName(statId: String): String { fun statIdToName(statId: String): String {
return statId.split("_").joinToString(" ") { val segments = statId.split("_")
it.replaceFirstChar { it.uppercaseChar() } return segments.joinToString(" ") { it.replaceFirstChar { it.uppercaseChar() } }
}
} }
private fun parseStatLine(line: Text): StatLine? { private fun parseStatLine(line: Text): StatLine? {
@@ -271,6 +279,8 @@ data class SBItemStack constructor(
// TODO: avoid instantiating the item stack here // TODO: avoid instantiating the item stack here
val itemType: ItemType? get() = ItemType.fromItemStack(asImmutableItemStack()) val itemType: ItemType? get() = ItemType.fromItemStack(asImmutableItemStack())
val rarity: Rarity? get() = Rarity.fromItem(asImmutableItemStack())
private var itemStack_: ItemStack? = null private var itemStack_: ItemStack? = null
private val itemStack: ItemStack private val itemStack: ItemStack

View File

@@ -331,6 +331,8 @@
"firmament.recipe.mobs.name": "§8[§7Lv %d§8] §c%s", "firmament.recipe.mobs.name": "§8[§7Lv %d§8] §c%s",
"firmament.recipe.mobs.name.nolevel": "§c%s", "firmament.recipe.mobs.name.nolevel": "§c%s",
"firmament.recipe.novanilla": "Hypixel cannot super craft vanilla recipes", "firmament.recipe.novanilla": "Hypixel cannot super craft vanilla recipes",
"firmament.recipecategory.reforge": "Reforge",
"firmament.recipecategory.reforge.basic": "This is a basic reforge, available at the Blacksmith.",
"firmament.reiwarning": "Firmament needs RoughlyEnoughItems to display its item list!", "firmament.reiwarning": "Firmament needs RoughlyEnoughItems to display its item list!",
"firmament.reiwarning.disable": "Click here to disable this warning", "firmament.reiwarning.disable": "Click here to disable this warning",
"firmament.reiwarning.disabled": "Disabled the RoughlyEnoughItems warning. Keep in mind that you will not have an item list without REI.", "firmament.reiwarning.disabled": "Disabled the RoughlyEnoughItems warning. Keep in mind that you will not have an item list without REI.",