WIP: Reforge Recipes
This commit is contained in:
@@ -1,19 +1,22 @@
|
||||
package moe.nea.firmament.compat.rei
|
||||
|
||||
import me.shedaniel.math.Dimension
|
||||
import me.shedaniel.math.FloatingDimension
|
||||
import me.shedaniel.math.Point
|
||||
import me.shedaniel.math.Rectangle
|
||||
import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds
|
||||
import net.minecraft.client.gui.DrawContext
|
||||
import net.minecraft.client.gui.Drawable
|
||||
import net.minecraft.client.gui.Element
|
||||
import net.minecraft.client.gui.ParentElement
|
||||
import net.minecraft.entity.LivingEntity
|
||||
import moe.nea.firmament.gui.entity.EntityRenderer
|
||||
import moe.nea.firmament.util.ErrorUtil
|
||||
|
||||
|
||||
class EntityWidget(val entity: LivingEntity?, val point: Point) : WidgetWithBounds() {
|
||||
class EntityWidget(
|
||||
val entity: LivingEntity?,
|
||||
val point: Point,
|
||||
val size: FloatingDimension = FloatingDimension(defaultSize)
|
||||
) : WidgetWithBounds() {
|
||||
override fun children(): List<Element> {
|
||||
return emptyList()
|
||||
}
|
||||
@@ -22,18 +25,35 @@ class EntityWidget(val entity: LivingEntity?, val point: Point) : WidgetWithBoun
|
||||
|
||||
override fun render(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) {
|
||||
try {
|
||||
if (!hasErrored)
|
||||
EntityRenderer.renderEntity(entity!!, context, point.x, point.y, mouseX.toFloat(), mouseY.toFloat())
|
||||
context.matrices.push()
|
||||
if (!hasErrored) {
|
||||
context.matrices.translate(point.x.toDouble(), point.y.toDouble(), 0.0)
|
||||
val xScale = size.width / defaultSize.width.toDouble()
|
||||
val yScale = size.height / defaultSize.height.toDouble()
|
||||
context.matrices.scale(xScale.toFloat(), yScale.toFloat(), 1.0F)
|
||||
EntityRenderer.renderEntity(
|
||||
entity!!,
|
||||
context,
|
||||
0, 0,
|
||||
(mouseX - point.x) * xScale,
|
||||
(mouseY - point.y) * yScale)
|
||||
}
|
||||
} catch (ex: Exception) {
|
||||
ErrorUtil.softError("Failed to render constructed entity: $entity", ex)
|
||||
hasErrored = true
|
||||
} finally {
|
||||
context.matrices.pop()
|
||||
}
|
||||
if (hasErrored) {
|
||||
context.fill(point.x, point.y, point.x + 50, point.y + 80, 0xFFAA2222.toInt())
|
||||
context.fill(point.x, point.y, point.x + size.width.toInt(), point.y + size.height.toInt(), 0xFFAA2222.toInt())
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
val defaultSize = Dimension(50, 80)
|
||||
}
|
||||
|
||||
override fun getBounds(): Rectangle {
|
||||
return Rectangle(point, Dimension(50, 80))
|
||||
return Rectangle(point, size)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package moe.nea.firmament.compat.rei.recipes
|
||||
|
||||
import java.util.Optional
|
||||
import me.shedaniel.math.Dimension
|
||||
import me.shedaniel.math.FloatingDimension
|
||||
import me.shedaniel.math.Point
|
||||
import me.shedaniel.math.Rectangle
|
||||
import me.shedaniel.rei.api.client.gui.Renderer
|
||||
@@ -14,17 +16,27 @@ import me.shedaniel.rei.api.common.display.Display
|
||||
import me.shedaniel.rei.api.common.display.DisplaySerializer
|
||||
import me.shedaniel.rei.api.common.entry.EntryIngredient
|
||||
import me.shedaniel.rei.api.common.entry.EntryStack
|
||||
import net.minecraft.entity.EntityType
|
||||
import net.minecraft.entity.SpawnReason
|
||||
import net.minecraft.text.Text
|
||||
import net.minecraft.util.Identifier
|
||||
import net.minecraft.village.VillagerProfession
|
||||
import moe.nea.firmament.Firmament
|
||||
import moe.nea.firmament.compat.rei.EntityWidget
|
||||
import moe.nea.firmament.compat.rei.SBItemEntryDefinition
|
||||
import moe.nea.firmament.gui.entity.EntityRenderer
|
||||
import moe.nea.firmament.repo.Reforge
|
||||
import moe.nea.firmament.repo.ReforgeStore
|
||||
import moe.nea.firmament.repo.RepoItemTypeCache
|
||||
import moe.nea.firmament.repo.RepoManager
|
||||
import moe.nea.firmament.repo.SBItemStack
|
||||
import moe.nea.firmament.util.AprilFoolsUtil
|
||||
import moe.nea.firmament.util.FirmFormatters
|
||||
import moe.nea.firmament.util.SkyblockId
|
||||
import moe.nea.firmament.util.gold
|
||||
import moe.nea.firmament.util.skyblock.ItemType
|
||||
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
|
||||
|
||||
@@ -46,21 +58,44 @@ class SBReforgeRecipe(
|
||||
}
|
||||
|
||||
override fun getIcon(): Renderer {
|
||||
return SBItemEntryDefinition.getEntry(SkyblockId("REFORGE_ANVIL"))
|
||||
return SBItemEntryDefinition.getEntry(SkyBlockItems.REFORGE_ANVIL)
|
||||
}
|
||||
|
||||
override fun setupDisplay(display: SBReforgeRecipe, bounds: Rectangle): MutableList<Widget> {
|
||||
val list = mutableListOf<Widget>()
|
||||
list.add(Widgets.createRecipeBase(bounds))
|
||||
// TODO: actual layout after christmas, probably
|
||||
list.add(Widgets.createSlot(Point(bounds.minX + 10, bounds.centerY))
|
||||
list.add(Widgets.createSlot(Point(bounds.minX + 10, bounds.centerY - 9))
|
||||
.markInput().entries(display.inputItems))
|
||||
val stoneSlot = Widgets.createSlot(Point(bounds.minX + 38, bounds.centerY))
|
||||
.markInput()
|
||||
if (display.reforgeStone != null)
|
||||
stoneSlot.entry(display.reforgeStone)
|
||||
list.add(stoneSlot)
|
||||
list.add(Widgets.createSlot(Point(bounds.minX + 38 + 18, bounds.centerY))
|
||||
if (display.reforgeStone != null) {
|
||||
list.add(Widgets.createSlot(Point(bounds.minX + 10 + 24, bounds.centerY - 9 - 10))
|
||||
.markInput().entry(display.reforgeStone))
|
||||
list.add(Widgets.withTooltip(
|
||||
Widgets.withTranslate(Widgets.wrapRenderer(
|
||||
Rectangle(Point(bounds.minX + 10 + 24, bounds.centerY - 9 + 10), Dimension(18, 18)),
|
||||
SBItemEntryDefinition.getEntry(SkyBlockItems.REFORGE_ANVIL)), 0.0, 0.0, 150.0),
|
||||
Rarity.entries.mapNotNull { rarity ->
|
||||
display.reforge.reforgeCosts?.get(rarity)?.let { rarity to it }
|
||||
}.map { (rarity, cost) ->
|
||||
Text.literal("")
|
||||
.append(rarity.text)
|
||||
.append(": ")
|
||||
.append(Text.literal("${FirmFormatters.formatCommas(cost, 0)} Coins").gold())
|
||||
}
|
||||
))
|
||||
} else {
|
||||
val size = if (AprilFoolsUtil.isAprilFoolsDay) 1.2 else 0.6
|
||||
val dimension =
|
||||
FloatingDimension(EntityWidget.defaultSize.width * size, EntityWidget.defaultSize.height * size)
|
||||
list.add(EntityWidget(
|
||||
EntityType.VILLAGER.create(EntityRenderer.fakeWorld, SpawnReason.COMMAND)
|
||||
?.also { it.villagerData = it.villagerData.withProfession(VillagerProfession.WEAPONSMITH) },
|
||||
Point(bounds.minX + 10 + 24 + 8 - dimension.width / 2, bounds.centerY - dimension.height / 2),
|
||||
dimension
|
||||
))
|
||||
// TODO: render a blacksmith entity or smth
|
||||
}
|
||||
list.add(Widgets.createSlot(Point(bounds.minX + 10 + 24 + 24, bounds.centerY - 9))
|
||||
.markInput().entries(display.outputItems))
|
||||
return list
|
||||
}
|
||||
@@ -106,6 +141,7 @@ class SBReforgeRecipe(
|
||||
when (it) {
|
||||
is Reforge.ReforgeEligibilityFilter.AllowsInternalName ->
|
||||
listOfNotNull(RepoManager.getNEUItem(it.internalName))
|
||||
|
||||
is Reforge.ReforgeEligibilityFilter.AllowsItemType ->
|
||||
ReforgeStore.resolveItemType(it.itemType)
|
||||
.flatMap {
|
||||
|
||||
Reference in New Issue
Block a user