Add mob drop viewer to item list
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
|
||||
* SPDX-FileCopyrightText: 2024 Linnea Gräf <nea@nea.moe>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
@@ -31,6 +32,7 @@ import net.minecraft.client.gui.screen.ingame.HandledScreen
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.text.Text
|
||||
import net.minecraft.util.Identifier
|
||||
import moe.nea.firmament.rei.recipes.SBMobDropRecipe
|
||||
|
||||
|
||||
class FirmamentReiPlugin : REIClientPlugin {
|
||||
@@ -62,6 +64,7 @@ class FirmamentReiPlugin : REIClientPlugin {
|
||||
override fun registerCategories(registry: CategoryRegistry) {
|
||||
registry.add(SBCraftingRecipe.Category)
|
||||
registry.add(SBForgeRecipe.Category)
|
||||
registry.add(SBMobDropRecipe.Category)
|
||||
}
|
||||
|
||||
override fun registerExclusionZones(zones: ExclusionZones) {
|
||||
@@ -77,6 +80,7 @@ class FirmamentReiPlugin : REIClientPlugin {
|
||||
SBForgeRecipe.Category.categoryIdentifier,
|
||||
SkyblockForgeRecipeDynamicGenerator
|
||||
)
|
||||
registry.registerDisplayGenerator(SBMobDropRecipe.Category.categoryIdentifier, SkyblockMobDropRecipeDynamicGenerator)
|
||||
}
|
||||
|
||||
override fun registerCollapsibleEntries(registry: CollapsibleEntryRegistry) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
|
||||
* SPDX-FileCopyrightText: 2024 Linnea Gräf <nea@nea.moe>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
@@ -30,6 +31,7 @@ import moe.nea.firmament.repo.RepoManager
|
||||
import moe.nea.firmament.util.FirmFormatters
|
||||
import moe.nea.firmament.util.HypixelPetInfo
|
||||
import moe.nea.firmament.util.SkyblockId
|
||||
import moe.nea.firmament.util.appendLore
|
||||
import moe.nea.firmament.util.petData
|
||||
import moe.nea.firmament.util.skyBlockId
|
||||
|
||||
@@ -54,6 +56,7 @@ data class SBItemStack(
|
||||
val neuItem: NEUItem?,
|
||||
val stackSize: Int,
|
||||
val petData: PetData?,
|
||||
val extraLore: List<Text> = emptyList(),
|
||||
) {
|
||||
constructor(skyblockId: SkyblockId, petData: PetData) : this(
|
||||
skyblockId,
|
||||
@@ -102,12 +105,13 @@ data class SBItemStack(
|
||||
}
|
||||
}
|
||||
|
||||
private val itemStack by lazy(LazyThreadSafetyMode.NONE) {
|
||||
private val itemStack: ItemStack by lazy(LazyThreadSafetyMode.NONE) {
|
||||
if (skyblockId == SkyblockId.COINS)
|
||||
return@lazy ItemCache.coinItem(stackSize)
|
||||
return@lazy ItemCache.coinItem(stackSize).also { it.appendLore(extraLore) }
|
||||
val replacementData = mutableMapOf<String, String>()
|
||||
injectReplacementDataForPets(replacementData)
|
||||
return@lazy neuItem.asItemStack(idHint = skyblockId, replacementData).copyWithCount(stackSize)
|
||||
.also { it.appendLore(extraLore) }
|
||||
}
|
||||
|
||||
fun asImmutableItemStack(): ItemStack {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
|
||||
* SPDX-FileCopyrightText: 2024 Linnea Gräf <nea@nea.moe>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
@@ -8,6 +9,7 @@ package moe.nea.firmament.rei
|
||||
|
||||
import io.github.moulberry.repo.data.NEUCraftingRecipe
|
||||
import io.github.moulberry.repo.data.NEUForgeRecipe
|
||||
import io.github.moulberry.repo.data.NEUMobDropRecipe
|
||||
import io.github.moulberry.repo.data.NEURecipe
|
||||
import java.util.*
|
||||
import me.shedaniel.rei.api.client.registry.display.DynamicDisplayGenerator
|
||||
@@ -16,6 +18,7 @@ import me.shedaniel.rei.api.common.display.Display
|
||||
import me.shedaniel.rei.api.common.entry.EntryStack
|
||||
import moe.nea.firmament.rei.recipes.SBCraftingRecipe
|
||||
import moe.nea.firmament.rei.recipes.SBForgeRecipe
|
||||
import moe.nea.firmament.rei.recipes.SBMobDropRecipe
|
||||
import moe.nea.firmament.repo.RepoManager
|
||||
|
||||
|
||||
@@ -27,6 +30,10 @@ val SkyblockForgeRecipeDynamicGenerator = neuDisplayGenerator<SBForgeRecipe, NEU
|
||||
SBForgeRecipe(it)
|
||||
}
|
||||
|
||||
val SkyblockMobDropRecipeDynamicGenerator = neuDisplayGenerator<SBMobDropRecipe, NEUMobDropRecipe> {
|
||||
SBMobDropRecipe(it)
|
||||
}
|
||||
|
||||
inline fun <D : Display, reified T : NEURecipe> neuDisplayGenerator(noinline mapper: (T) -> D) =
|
||||
object : DynamicDisplayGenerator<D> {
|
||||
override fun getRecipeFor(entry: EntryStack<*>): Optional<List<D>> {
|
||||
|
||||
113
src/main/kotlin/moe/nea/firmament/rei/recipes/SBMobDropRecipe.kt
Normal file
113
src/main/kotlin/moe/nea/firmament/rei/recipes/SBMobDropRecipe.kt
Normal file
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2024 Linnea Gräf <nea@nea.moe>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package moe.nea.firmament.rei.recipes
|
||||
|
||||
import io.github.moulberry.repo.data.NEUMobDropRecipe
|
||||
import me.shedaniel.math.Point
|
||||
import me.shedaniel.math.Rectangle
|
||||
import me.shedaniel.rei.api.client.gui.Renderer
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Widget
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Widgets
|
||||
import me.shedaniel.rei.api.client.registry.display.DisplayCategory
|
||||
import me.shedaniel.rei.api.common.category.CategoryIdentifier
|
||||
import me.shedaniel.rei.api.common.util.EntryStacks
|
||||
import net.minecraft.block.Blocks
|
||||
import net.minecraft.text.Text
|
||||
import net.minecraft.util.Identifier
|
||||
import moe.nea.firmament.Firmament
|
||||
import moe.nea.firmament.gui.entity.EntityRenderer
|
||||
import moe.nea.firmament.gui.entity.EntityWidget
|
||||
import moe.nea.firmament.rei.SBItemEntryDefinition
|
||||
|
||||
class SBMobDropRecipe(override val neuRecipe: NEUMobDropRecipe) : SBRecipe() {
|
||||
override fun getCategoryIdentifier(): CategoryIdentifier<*> = Category.categoryIdentifier
|
||||
|
||||
object Category : DisplayCategory<SBMobDropRecipe> {
|
||||
override fun getCategoryIdentifier(): CategoryIdentifier<SBMobDropRecipe> =
|
||||
CategoryIdentifier.of(Firmament.MOD_ID, "mob_drop_recipe")
|
||||
|
||||
override fun getTitle(): Text = Text.literal("Mob Drops")
|
||||
override fun getDisplayHeight(): Int {
|
||||
return 100
|
||||
}
|
||||
|
||||
override fun getIcon(): Renderer = EntryStacks.of(Blocks.ANVIL)
|
||||
override fun setupDisplay(display: SBMobDropRecipe, bounds: Rectangle): List<Widget> {
|
||||
return buildList {
|
||||
add(Widgets.createRecipeBase(bounds))
|
||||
val source = display.neuRecipe.render
|
||||
val entity = if (source.startsWith("@")) {
|
||||
EntityRenderer.constructEntity(Identifier(source.substring(1)))
|
||||
} else {
|
||||
EntityRenderer.applyModifiers(source, listOf())
|
||||
}
|
||||
if (entity != null) {
|
||||
val level = display.neuRecipe.level
|
||||
val fullMobName =
|
||||
if (level > 0) Text.translatable("firmament.recipe.mobs.name", level, display.neuRecipe.name)
|
||||
else Text.translatable("firmament.recipe.mobs.name.nolevel", display.neuRecipe.name)
|
||||
val tt = mutableListOf<Text>()
|
||||
tt.add((fullMobName))
|
||||
tt.add(Text.literal(""))
|
||||
if (display.neuRecipe.coins > 0) {
|
||||
tt.add(Text.stringifiedTranslatable("firmament.recipe.mobs.coins", display.neuRecipe.coins))
|
||||
}
|
||||
if (display.neuRecipe.combatExperience > 0) {
|
||||
tt.add(
|
||||
Text.stringifiedTranslatable(
|
||||
"firmament.recipe.mobs.combat",
|
||||
display.neuRecipe.combatExperience
|
||||
)
|
||||
)
|
||||
}
|
||||
if (display.neuRecipe.enchantingExperience > 0) {
|
||||
tt.add(
|
||||
Text.stringifiedTranslatable(
|
||||
"firmament.recipe.mobs.exp",
|
||||
display.neuRecipe.enchantingExperience
|
||||
)
|
||||
)
|
||||
}
|
||||
if (display.neuRecipe.extra != null)
|
||||
display.neuRecipe.extra.mapTo(tt) { Text.literal(it) }
|
||||
if (tt.size == 2)
|
||||
tt.removeAt(1)
|
||||
add(
|
||||
Widgets.withTooltip(
|
||||
EntityWidget(entity, Point(bounds.minX + 5, bounds.minY + 15)),
|
||||
tt
|
||||
)
|
||||
)
|
||||
}
|
||||
add(
|
||||
Widgets.createLabel(Point(bounds.minX + 15, bounds.minY + 5), Text.literal(display.neuRecipe.name))
|
||||
.leftAligned()
|
||||
)
|
||||
var x = bounds.minX + 60
|
||||
var y = bounds.minY + 20
|
||||
for (drop in display.neuRecipe.drops) {
|
||||
val lore = drop.extra.mapTo(mutableListOf()) { Text.literal(it) }
|
||||
if (drop.chance != null) {
|
||||
lore += listOf(Text.translatable("firmament.recipe.mobs.drops", drop.chance))
|
||||
}
|
||||
val item = SBItemEntryDefinition.getEntry(drop.dropItem)
|
||||
.value.copy(extraLore = lore)
|
||||
add(
|
||||
Widgets.createSlot(Point(x, y)).markOutput()
|
||||
.entries(listOf(SBItemEntryDefinition.getEntry(item)))
|
||||
)
|
||||
x += 18
|
||||
if (x > bounds.maxX - 30) {
|
||||
x = bounds.minX + 60
|
||||
y += 18
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user