aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/repo/recipes/SBReforgeRecipeRenderer.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/repo/recipes/SBReforgeRecipeRenderer.kt')
-rw-r--r--src/main/kotlin/repo/recipes/SBReforgeRecipeRenderer.kt167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/main/kotlin/repo/recipes/SBReforgeRecipeRenderer.kt b/src/main/kotlin/repo/recipes/SBReforgeRecipeRenderer.kt
new file mode 100644
index 0000000..c841dd9
--- /dev/null
+++ b/src/main/kotlin/repo/recipes/SBReforgeRecipeRenderer.kt
@@ -0,0 +1,167 @@
+package moe.nea.firmament.repo.recipes
+
+import io.github.moulberry.repo.NEURepository
+import me.shedaniel.math.Point
+import me.shedaniel.math.Rectangle
+import net.minecraft.network.chat.Component
+import net.minecraft.resources.ResourceLocation
+import net.minecraft.world.entity.EntitySpawnReason
+import net.minecraft.world.entity.EntityType
+import net.minecraft.world.entity.npc.VillagerProfession
+import net.minecraft.world.item.ItemStack
+import moe.nea.firmament.Firmament
+import moe.nea.firmament.gui.entity.EntityRenderer
+import moe.nea.firmament.repo.ExpensiveItemCacheApi
+import moe.nea.firmament.repo.Reforge
+import moe.nea.firmament.repo.ReforgeStore
+import moe.nea.firmament.repo.RepoItemTypeCache
+import moe.nea.firmament.repo.SBItemStack
+import moe.nea.firmament.util.FirmFormatters.formatCommas
+import moe.nea.firmament.util.MC
+import moe.nea.firmament.util.gold
+import moe.nea.firmament.util.grey
+import moe.nea.firmament.util.skyblock.Rarity
+import moe.nea.firmament.util.skyblock.SkyBlockItems
+import moe.nea.firmament.util.skyblockId
+import moe.nea.firmament.util.tr
+
+object SBReforgeRecipeRenderer : GenericRecipeRenderer<Reforge> {
+ @OptIn(ExpensiveItemCacheApi::class)
+ override fun render(
+ recipe: Reforge,
+ bounds: Rectangle,
+ layouter: RecipeLayouter,
+ mainItem: SBItemStack?
+ ) {
+ val inputSlot = layouter.createCyclingItemSlot(
+ bounds.minX + 10, bounds.centerY - 9,
+ if (mainItem != null) listOf(mainItem)
+ else generateAllItems(recipe),
+ RecipeLayouter.SlotKind.SMALL_INPUT
+ )
+ val outputSlut = layouter.createItemSlot(
+ bounds.minX + 10 + 24 + 24, bounds.centerY - 9,
+ null,
+ RecipeLayouter.SlotKind.SMALL_OUTPUT
+ )
+ val statLines = mutableListOf<Pair<String, RecipeLayouter.Updater<Component>>>()
+ for ((i, statId) in recipe.statUniverse.withIndex()) {
+ val label = layouter.createLabel(
+ bounds.minX + 10 + 24 + 24 + 20, bounds.minY + 8 + i * 11,
+ Component.empty()
+ )
+ statLines.add(statId to label)
+ }
+
+ fun updateOutput() {
+ val currentBaseItem = inputSlot.current()
+ outputSlut.update(currentBaseItem.copy(reforge = recipe.reforgeId))
+ val stats = recipe.reforgeStats?.get(currentBaseItem.rarity) ?: mapOf()
+ for ((stat, label) in statLines) {
+ label.update(
+ SBItemStack.Companion.StatLine(
+ SBItemStack.statIdToName(stat), null,
+ valueNum = stats[stat]
+ ).reconstitute(7)
+ )
+ }
+ }
+
+ if (recipe.reforgeStone != null) {
+ layouter.createItemSlot(
+ bounds.minX + 10 + 24, bounds.centerY - 9 - 10,
+ SBItemStack(recipe.reforgeStone),
+ RecipeLayouter.SlotKind.SMALL_INPUT
+ )
+ val d = Rectangle(
+ bounds.minX + 10 + 24, bounds.centerY - 9 + 10,
+ 16, 16
+ )
+ layouter.createItemSlot(
+ d.x, d.y,
+ SBItemStack(SkyBlockItems.REFORGE_ANVIL),
+ RecipeLayouter.SlotKind.DISPLAY
+ )
+ layouter.createTooltip(
+ d,
+ Rarity.entries.mapNotNull { rarity ->
+ recipe.reforgeCosts?.get(rarity)?.let { rarity to it }
+ }.map { (rarity, cost) ->
+ Component.literal("")
+ .append(rarity.text)
+ .append(": ")
+ .append(Component.literal("${formatCommas(cost, 0)} Coins").gold())
+ }
+ )
+ } else {
+ val entity = EntityType.VILLAGER.create(EntityRenderer.fakeWorld, EntitySpawnReason.COMMAND)
+ ?.also {
+ it.villagerData =
+ it.villagerData.withProfession(
+ MC.currentOrDefaultRegistries,
+ VillagerProfession.WEAPONSMITH
+ )
+ }
+ val dim = EntityRenderer.defaultSize
+ val d = Rectangle(
+ Point(bounds.minX + 10 + 24 + 8 - dim.width / 2, bounds.centerY - dim.height / 2),
+ dim
+ )
+ if (entity != null)
+ layouter.createEntity(
+ d,
+ entity
+ )
+ layouter.createTooltip(
+ d,
+ tr(
+ "firmament.recipecategory.reforge.basic",
+ "This is a basic reforge, available at the Blacksmith."
+ ).grey()
+ )
+ }
+ }
+
+ private fun generateAllItems(recipe: Reforge): List<SBItemStack> {
+ return recipe.eligibleItems.flatMap {
+ when (it) {
+ is Reforge.ReforgeEligibilityFilter.AllowsInternalName -> listOf(SBItemStack(it.internalName))
+ is Reforge.ReforgeEligibilityFilter.AllowsItemType ->
+ ReforgeStore.resolveItemType(it.itemType)
+ .flatMapTo(mutableSetOf()) { itemType ->
+ listOf(itemType, itemType.dungeonVariant)
+ }
+ .flatMapTo(mutableSetOf()) { itemType ->
+ RepoItemTypeCache.byItemType[itemType] ?: listOf()
+ }
+ .map { SBItemStack(it.skyblockId) }
+
+ is Reforge.ReforgeEligibilityFilter.AllowsVanillaItemType -> listOf()
+ }
+ }
+ }
+
+ override fun getInputs(recipe: Reforge): Collection<SBItemStack> {
+ val reforgeStone = recipe.reforgeStone ?: return emptyList()
+ return listOf(SBItemStack(reforgeStone))
+ }
+
+ override fun getOutputs(recipe: Reforge): Collection<SBItemStack> {
+ return listOf()
+ }
+
+ @OptIn(ExpensiveItemCacheApi::class)
+ override val icon: ItemStack
+ get() = SBItemStack(SkyBlockItems.REFORGE_ANVIL).asImmutableItemStack()
+ override val title: Component
+ get() = tr("firmament.recipecategory.reforge", "Reforge")
+ override val identifier: ResourceLocation
+ get() = Firmament.identifier("reforge_recipe")
+
+ override fun findAllRecipes(neuRepository: NEURepository): Iterable<Reforge> {
+ return ReforgeStore.allReforges
+ }
+
+ override val typ: Class<Reforge>
+ get() = Reforge::class.java
+}