Improved, but not finished, android station GUI
This commit is contained in:
parent
f136760ace
commit
75fe096059
@ -31,6 +31,7 @@ import ru.dbotthepony.mc.otm.network.AndroidResearchRequestPacket
|
|||||||
import ru.dbotthepony.mc.otm.registry.MRegistry
|
import ru.dbotthepony.mc.otm.registry.MRegistry
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
|
import kotlin.properties.Delegates
|
||||||
|
|
||||||
private fun exploreTree(research: AndroidResearchType<*>, seen: MutableSet<AndroidResearchType<*>>, result: MutableList<AndroidResearchType<*>>) {
|
private fun exploreTree(research: AndroidResearchType<*>, seen: MutableSet<AndroidResearchType<*>>, result: MutableList<AndroidResearchType<*>>) {
|
||||||
if (!seen.add(research)) {
|
if (!seen.add(research)) {
|
||||||
@ -246,7 +247,7 @@ private class Tree(val node: AndroidResearchType<*>) : Iterable<Tree> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private open class AndroidResearchButton(
|
private class AndroidResearchButton(
|
||||||
parent: EditablePanel,
|
parent: EditablePanel,
|
||||||
private val node: AndroidResearch,
|
private val node: AndroidResearch,
|
||||||
private val lines: List<LinePos>,
|
private val lines: List<LinePos>,
|
||||||
@ -410,22 +411,38 @@ private open class AndroidResearchButton(
|
|||||||
class AndroidStationScreen constructor(p_97741_: AndroidStationMenu, p_97742_: Inventory, p_97743_: Component) :
|
class AndroidStationScreen constructor(p_97741_: AndroidStationMenu, p_97742_: Inventory, p_97743_: Component) :
|
||||||
MatteryScreen<AndroidStationMenu>(p_97741_, p_97742_, p_97743_) {
|
MatteryScreen<AndroidStationMenu>(p_97741_, p_97742_, p_97743_) {
|
||||||
|
|
||||||
private var canvas: DraggableCanvasPanel? = null
|
private fun makeCanvas(isPreview: Boolean): DraggableCanvasPanel {
|
||||||
private var research: FramePanel? = null
|
|
||||||
var hoveredResearch: AndroidResearch? = null
|
|
||||||
|
|
||||||
private fun openResearchTree() {
|
|
||||||
val window = minecraft!!.window
|
|
||||||
|
|
||||||
research = FramePanel(this, null, 0f, 0f, window.guiScaledWidth * 0.8f, window.guiScaledHeight * 0.8f, TranslatableComponent("otm.gui.android_research"))
|
|
||||||
|
|
||||||
val rows = Int2ObjectAVLTreeMap<EditablePanel>()
|
val rows = Int2ObjectAVLTreeMap<EditablePanel>()
|
||||||
|
|
||||||
canvas = object : DraggableCanvasPanel(this@AndroidStationScreen, research, width = (GRID_WIDTH * 22).toFloat(), height = 0f) {
|
val canvas = object : DraggableCanvasPanel(this@AndroidStationScreen, null) {
|
||||||
|
private val random = Random()
|
||||||
|
|
||||||
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
||||||
drawColor = RGBAColor.BLACK
|
drawColor = RGBAColor.BLACK
|
||||||
drawRect(stack, 0f, 0f, width, height)
|
drawRect(stack, 0f, 0f, width, height)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun mouseClickedInner(x: Double, y: Double, button: Int): Boolean {
|
||||||
|
if (isPreview) {
|
||||||
|
openResearchTree()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.mouseClickedInner(x, y, button)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun tick() {
|
||||||
|
super.tick()
|
||||||
|
|
||||||
|
if (isPreview) {
|
||||||
|
xOffset -= 1f
|
||||||
|
|
||||||
|
if (xOffset < -boundingWidth) {
|
||||||
|
xOffset = width
|
||||||
|
yOffset = random.nextFloat(-boundingHeight + 18f, 0f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
minecraft?.player?.getCapability(MatteryCapability.MATTERY_PLAYER)?.ifPresentK {
|
minecraft?.player?.getCapability(MatteryCapability.MATTERY_PLAYER)?.ifPresentK {
|
||||||
@ -475,7 +492,26 @@ class AndroidStationScreen constructor(p_97741_: AndroidStationMenu, p_97742_: I
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
canvas!!.dock = Dock.FILL
|
for (row in rows.values) {
|
||||||
|
row.sizeToContents()
|
||||||
|
row.acceptMouseInput = !isPreview
|
||||||
|
}
|
||||||
|
|
||||||
|
return canvas
|
||||||
|
}
|
||||||
|
|
||||||
|
private var research: FramePanel? = null
|
||||||
|
private var playerStrip: EditablePanel by Delegates.notNull()
|
||||||
|
var hoveredResearch: AndroidResearch? = null
|
||||||
|
|
||||||
|
private fun openResearchTree() {
|
||||||
|
val window = minecraft!!.window
|
||||||
|
|
||||||
|
research = FramePanel(this, null, 0f, 0f, window.guiScaledWidth * 0.8f, window.guiScaledHeight * 0.8f, TranslatableComponent("otm.gui.android_research"))
|
||||||
|
|
||||||
|
val researchCanvas = makeCanvas(false)
|
||||||
|
researchCanvas.dock = Dock.FILL
|
||||||
|
researchCanvas.parent = research
|
||||||
|
|
||||||
val bottom = EditablePanel(this, research, 0f, 0f, 0f, 20f)
|
val bottom = EditablePanel(this, research, 0f, 0f, 0f, 20f)
|
||||||
val close = ButtonPanel(this, bottom, 0f, 0f, 90f, 20f, TranslatableComponent("otm.container.matter_panel.close"))
|
val close = ButtonPanel(this, bottom, 0f, 0f, 90f, 20f, TranslatableComponent("otm.container.matter_panel.close"))
|
||||||
@ -486,7 +522,7 @@ class AndroidStationScreen constructor(p_97741_: AndroidStationMenu, p_97742_: I
|
|||||||
close.bind { research!!.remove() }
|
close.bind { research!!.remove() }
|
||||||
|
|
||||||
bottom.setDockMargin(0f, 0f, 4f, 4f)
|
bottom.setDockMargin(0f, 0f, 4f, 4f)
|
||||||
canvas!!.setDockMargin(4f, 4f, 4f, 4f)
|
researchCanvas.setDockMargin(4f, 4f, 4f, 4f)
|
||||||
|
|
||||||
research!!.toScreenCenter()
|
research!!.toScreenCenter()
|
||||||
addPanel(research!!)
|
addPanel(research!!)
|
||||||
@ -505,14 +541,48 @@ class AndroidStationScreen constructor(p_97741_: AndroidStationMenu, p_97742_: I
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun makeMainFrame(): FramePanel {
|
override fun makeMainFrame(): FramePanel {
|
||||||
val frame = super.makeMainFrame()!!
|
val frame = FramePanel(this, 200f, 100f, title)
|
||||||
|
|
||||||
WidePowerGaugePanel(this, frame, menu.powerWidget, LEFT_MARGIN, GAUGE_TOP_WITH_SLOT)
|
val stripLeft = EditablePanel(this, frame, width = AbstractSlotPanel.SIZE)
|
||||||
SlotPanel(this, frame, menu.batterySlot, LEFT_MARGIN, SLOT_TOP_UNDER_GAUGE)
|
|
||||||
SlotPanel(this, frame, menu.androidBattery, 38f, 17f)
|
|
||||||
|
|
||||||
val button = ButtonPanel(this, frame, 38f, 69f, 124f, 20f, TranslatableComponent("otm.gui.android_research"))
|
stripLeft.dock = Dock.LEFT
|
||||||
button.bind(this::openResearchTree)
|
stripLeft.dockRight = 3f
|
||||||
|
|
||||||
|
WidePowerGaugePanel(this, stripLeft, menu.powerWidget).also {
|
||||||
|
it.dock = Dock.TOP
|
||||||
|
}
|
||||||
|
|
||||||
|
SlotPanel(this, stripLeft, menu.batterySlot).also {
|
||||||
|
it.dock = Dock.TOP
|
||||||
|
it.dockTop = 4f
|
||||||
|
}
|
||||||
|
|
||||||
|
val playerStrip = EditablePanel(this, frame, height = 72f)
|
||||||
|
playerStrip.dock = Dock.TOP
|
||||||
|
|
||||||
|
val armorStrip = EditablePanel(this, playerStrip, width = AbstractSlotPanel.SIZE)
|
||||||
|
armorStrip.dock = Dock.LEFT
|
||||||
|
|
||||||
|
for (slot in menu.armorSlots) {
|
||||||
|
SlotPanel(this, armorStrip, slot).also { it.dock = Dock.TOP }
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityRendererPanel(this, playerStrip, minecraft!!.player!!).also {
|
||||||
|
it.dock = Dock.LEFT
|
||||||
|
}
|
||||||
|
|
||||||
|
val androidStrip = EditablePanel(this, playerStrip, width = AbstractSlotPanel.SIZE)
|
||||||
|
androidStrip.dock = Dock.LEFT
|
||||||
|
|
||||||
|
SlotPanel(this, androidStrip, menu.androidBattery).also { it.dock = Dock.TOP }
|
||||||
|
|
||||||
|
val preview = makeCanvas(true)
|
||||||
|
|
||||||
|
preview.parent = playerStrip
|
||||||
|
preview.height = 72f
|
||||||
|
preview.dock = Dock.TOP
|
||||||
|
|
||||||
|
this.playerStrip = playerStrip
|
||||||
|
|
||||||
return frame
|
return frame
|
||||||
}
|
}
|
||||||
|
@ -110,23 +110,7 @@ class ExoSuitInventoryScreen(menu: ExoSuitInventoryMenu) : MatteryScreen<ExoSuit
|
|||||||
panel.dock = Dock.TOP
|
panel.dock = Dock.TOP
|
||||||
}
|
}
|
||||||
|
|
||||||
val playerRectangle = object : EditablePanel(this@ExoSuitInventoryScreen, topLine, width = ENTITY_RECTANGLE.w) {
|
val playerRectangle = EntityRendererPanel(this, topLine, minecraft!!.player!!)
|
||||||
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
|
||||||
ENTITY_RECTANGLE.render(stack)
|
|
||||||
|
|
||||||
val renderX = absoluteX.toInt() + width.toInt() / 2
|
|
||||||
val renderY = absoluteY.toInt() + (height * 0.9f).toInt()
|
|
||||||
|
|
||||||
InventoryScreen.renderEntityInInventory(
|
|
||||||
renderX,
|
|
||||||
renderY,
|
|
||||||
30, // scale
|
|
||||||
renderX - mouseX,
|
|
||||||
absoluteY + height * 0.15f - mouseY,
|
|
||||||
minecraft!!.player!!
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
playerRectangle.dock = Dock.LEFT
|
playerRectangle.dock = Dock.LEFT
|
||||||
playerRectangle.setDockMargin(right = 3f)
|
playerRectangle.setDockMargin(right = 3f)
|
||||||
|
@ -10,6 +10,8 @@ import org.apache.logging.log4j.LogManager
|
|||||||
import ru.dbotthepony.mc.otm.client.render.popScissorRect
|
import ru.dbotthepony.mc.otm.client.render.popScissorRect
|
||||||
import ru.dbotthepony.mc.otm.client.render.pushScissorRect
|
import ru.dbotthepony.mc.otm.client.render.pushScissorRect
|
||||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.collections.ArrayList
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
|
|
||||||
@JvmRecord
|
@JvmRecord
|
||||||
@ -28,6 +30,10 @@ enum class Dock {
|
|||||||
NONE, LEFT, RIGHT, TOP, BOTTOM, FILL
|
NONE, LEFT, RIGHT, TOP, BOTTOM, FILL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum class DockResizeMode(val changeWidth: Boolean, val changeHeight: Boolean) {
|
||||||
|
ALL(true, true), NONE(false, false), WIDTH(true, false), HEIGHT(false, true)
|
||||||
|
}
|
||||||
|
|
||||||
open class EditablePanel @JvmOverloads constructor(
|
open class EditablePanel @JvmOverloads constructor(
|
||||||
val screen: MatteryScreen<*>,
|
val screen: MatteryScreen<*>,
|
||||||
parent: EditablePanel?,
|
parent: EditablePanel?,
|
||||||
@ -46,7 +52,7 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
|
|
||||||
field?.onUnParent(this)
|
field?.onUnParent(this)
|
||||||
field = value
|
field = value
|
||||||
needsInvalidation = true
|
layoutInvalidated = true
|
||||||
value?.onParent(this)
|
value?.onParent(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,8 +62,9 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
|
|
||||||
val old = field
|
val old = field
|
||||||
field = value
|
field = value
|
||||||
needsInvalidation = true
|
// layoutInvalidated = true
|
||||||
xPosUpdated(value, old)
|
xPosUpdated(value, old)
|
||||||
|
parent?.boundsInvalidated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
var y: Float = 0f
|
var y: Float = 0f
|
||||||
@ -66,8 +73,9 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
|
|
||||||
val old = field
|
val old = field
|
||||||
field = value
|
field = value
|
||||||
needsInvalidation = true
|
// layoutInvalidated = true
|
||||||
yPosUpdated(value, old)
|
yPosUpdated(value, old)
|
||||||
|
parent?.boundsInvalidated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
var width: Float = 10f
|
var width: Float = 10f
|
||||||
@ -78,8 +86,9 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
|
|
||||||
val old = field
|
val old = field
|
||||||
field = value
|
field = value
|
||||||
needsInvalidation = true
|
layoutInvalidated = true
|
||||||
widthUpdated(value, old)
|
widthUpdated(value, old)
|
||||||
|
parent?.boundsInvalidated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
var height: Float = 10f
|
var height: Float = 10f
|
||||||
@ -90,13 +99,33 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
|
|
||||||
val old = field
|
val old = field
|
||||||
field = value
|
field = value
|
||||||
needsInvalidation = true
|
layoutInvalidated = true
|
||||||
heightUpdated(value, old)
|
heightUpdated(value, old)
|
||||||
|
parent?.boundsInvalidated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Width to be utilized in docking code.
|
||||||
|
*
|
||||||
|
* Can only differ from [width] if [dockResize] is not [DockResizeMode.ALL] and not [DockResizeMode.WIDTH]
|
||||||
|
*/
|
||||||
|
var dockedWidth: Float = 0f
|
||||||
|
private set
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Height to be utilized in docking code.
|
||||||
|
*
|
||||||
|
* Can only differ from [height] if [dockResize] is not [DockResizeMode.ALL] and not [DockResizeMode.HEIGHT]
|
||||||
|
*/
|
||||||
|
var dockedHeight: Float = 0f
|
||||||
|
private set
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
protected val children = ArrayList<EditablePanel>()
|
protected val children = ArrayList<EditablePanel>()
|
||||||
private var needsInvalidation = true
|
val childrenView: List<EditablePanel> = Collections.unmodifiableList(children)
|
||||||
|
|
||||||
|
private var layoutInvalidated = true
|
||||||
|
private var boundsInvalidated = true
|
||||||
|
|
||||||
protected var visibleAsChildren: Boolean = true
|
protected var visibleAsChildren: Boolean = true
|
||||||
private set
|
private set
|
||||||
@ -110,8 +139,8 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
|
|
||||||
if (old != new) {
|
if (old != new) {
|
||||||
visibilityChanges(new, old)
|
visibilityChanges(new, old)
|
||||||
parent?.needsInvalidation = true
|
parent?.layoutInvalidated = true
|
||||||
needsInvalidation = true
|
layoutInvalidated = true
|
||||||
|
|
||||||
if (new) {
|
if (new) {
|
||||||
killFocus()
|
killFocus()
|
||||||
@ -130,24 +159,64 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
var scissor = false
|
var scissor = false
|
||||||
var dock = Dock.NONE
|
var dock = Dock.NONE
|
||||||
set(value) {
|
set(value) {
|
||||||
field = value
|
if (field != value) {
|
||||||
parent?.needsInvalidation = true
|
field = value
|
||||||
|
parent?.layoutInvalidated = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var dockResize = DockResizeMode.ALL
|
||||||
|
set(value) {
|
||||||
|
if (field != value) {
|
||||||
|
field = value
|
||||||
|
parent?.layoutInvalidated = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var dockMargin = DockProperty.EMPTY
|
var dockMargin = DockProperty.EMPTY
|
||||||
set(value) {
|
set(value) {
|
||||||
if (field != value) {
|
if (field != value) {
|
||||||
parent?.needsInvalidation = true
|
field = value
|
||||||
|
parent?.layoutInvalidated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
field = value
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var dockLeft: Float
|
||||||
|
get() = dockMargin.left
|
||||||
|
set(value) {
|
||||||
|
if (value != dockMargin.left) {
|
||||||
|
dockMargin = dockMargin.copy(left = value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var dockRight: Float
|
||||||
|
get() = dockMargin.right
|
||||||
|
set(value) {
|
||||||
|
if (value != dockMargin.right) {
|
||||||
|
dockMargin = dockMargin.copy(right = value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var dockTop: Float
|
||||||
|
get() = dockMargin.top
|
||||||
|
set(value) {
|
||||||
|
if (value != dockMargin.top) {
|
||||||
|
dockMargin = dockMargin.copy(top = value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var dockBottom: Float
|
||||||
|
get() = dockMargin.bottom
|
||||||
|
set(value) {
|
||||||
|
if (value != dockMargin.bottom) {
|
||||||
|
dockMargin = dockMargin.copy(bottom = value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var dockPadding = DockProperty.EMPTY
|
var dockPadding = DockProperty.EMPTY
|
||||||
set(value) {
|
set(value) {
|
||||||
if (field != value) {
|
if (field != value) {
|
||||||
parent?.needsInvalidation = true
|
field = value
|
||||||
|
parent?.layoutInvalidated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
field = value
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var acceptMouseInput = true
|
var acceptMouseInput = true
|
||||||
@ -228,7 +297,7 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
val font: Font get() = screen.font
|
val font: Font get() = screen.font
|
||||||
|
|
||||||
fun invalidateLayout() {
|
fun invalidateLayout() {
|
||||||
needsInvalidation = true
|
layoutInvalidated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun most3DHeight(): Float {
|
fun most3DHeight(): Float {
|
||||||
@ -252,7 +321,7 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
private fun onParent(child: EditablePanel) {
|
private fun onParent(child: EditablePanel) {
|
||||||
if (children.contains(child)) throw IllegalStateException("Already containing $child")
|
if (children.contains(child)) throw IllegalStateException("Already containing $child")
|
||||||
children.add(child)
|
children.add(child)
|
||||||
needsInvalidation = true
|
layoutInvalidated = true
|
||||||
updateVisible()
|
updateVisible()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,7 +329,7 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
val indexOf = children.indexOf(child)
|
val indexOf = children.indexOf(child)
|
||||||
if (indexOf == -1) throw IllegalStateException("Already not containing $child")
|
if (indexOf == -1) throw IllegalStateException("Already not containing $child")
|
||||||
children.removeAt(indexOf)
|
children.removeAt(indexOf)
|
||||||
needsInvalidation = true
|
layoutInvalidated = true
|
||||||
updateVisible()
|
updateVisible()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,9 +349,10 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
|
|
||||||
var depth = 0f
|
var depth = 0f
|
||||||
|
|
||||||
if (needsInvalidation) {
|
if (layoutInvalidated) {
|
||||||
needsInvalidation = false
|
|
||||||
performLayout()
|
performLayout()
|
||||||
|
} else if (boundsInvalidated) {
|
||||||
|
updateBounds()
|
||||||
}
|
}
|
||||||
|
|
||||||
val parent = this.parent
|
val parent = this.parent
|
||||||
@ -412,6 +482,8 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
* In almost all cases you want to call [invalidateLayout], and not this.
|
* In almost all cases you want to call [invalidateLayout], and not this.
|
||||||
*/
|
*/
|
||||||
open fun performLayout() {
|
open fun performLayout() {
|
||||||
|
layoutInvalidated = false
|
||||||
|
|
||||||
var left = dockPadding.left
|
var left = dockPadding.left
|
||||||
var right = dockPadding.right
|
var right = dockPadding.right
|
||||||
var top = dockPadding.top
|
var top = dockPadding.top
|
||||||
@ -424,57 +496,59 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
Dock.FILL -> {}
|
Dock.FILL -> {}
|
||||||
|
|
||||||
Dock.LEFT -> {
|
Dock.LEFT -> {
|
||||||
child.setPos(left + child.dockMargin.left, top + child.dockMargin.top)
|
child.x = left + child.dockMargin.left
|
||||||
|
child.y = top + child.dockMargin.top
|
||||||
|
|
||||||
left += child.width + child.dockMargin.left + child.dockMargin.right
|
left += child.width + child.dockMargin.left + child.dockMargin.right
|
||||||
child.height = (
|
|
||||||
Math.max(
|
child.dockedHeight = 1f.coerceAtLeast(height - top - bottom - child.dockMargin.top - child.dockMargin.bottom)
|
||||||
1f,
|
|
||||||
height - top - bottom - child.dockMargin.top - child.dockMargin.bottom
|
if (child.dockResize.changeHeight)
|
||||||
)
|
child.height = child.dockedHeight
|
||||||
)
|
else if (child.height != child.dockedHeight)
|
||||||
|
child.y += child.dockedHeight / 2f - child.height / 2f
|
||||||
}
|
}
|
||||||
|
|
||||||
Dock.RIGHT -> {
|
Dock.RIGHT -> {
|
||||||
child.setPos(
|
child.x = width - right - child.width - child.dockMargin.right
|
||||||
width - right - child.width - child.dockMargin.right,
|
child.y = top + child.dockMargin.top
|
||||||
top + child.dockMargin.top
|
|
||||||
)
|
|
||||||
|
|
||||||
right += child.width + child.dockMargin.left + child.dockMargin.right
|
right += child.width + child.dockMargin.left + child.dockMargin.right
|
||||||
child.height = (
|
|
||||||
Math.max(
|
child.dockedHeight = 1f.coerceAtLeast(height - top - bottom - child.dockMargin.top - child.dockMargin.bottom)
|
||||||
1f,
|
|
||||||
height - top - bottom - child.dockMargin.top - child.dockMargin.bottom
|
if (child.dockResize.changeHeight)
|
||||||
)
|
child.height = child.dockedHeight
|
||||||
)
|
else if (child.height != child.dockedHeight)
|
||||||
|
child.y += child.dockedHeight / 2f - child.height / 2f
|
||||||
}
|
}
|
||||||
|
|
||||||
Dock.TOP -> {
|
Dock.TOP -> {
|
||||||
child.setPos(left + child.dockMargin.left, top + child.dockMargin.top)
|
child.x = left + child.dockMargin.left
|
||||||
|
child.y = top + child.dockMargin.top
|
||||||
|
|
||||||
top += child.height + child.dockMargin.top + child.dockMargin.bottom
|
top += child.height + child.dockMargin.top + child.dockMargin.bottom
|
||||||
|
|
||||||
child.width = (
|
child.dockedWidth = 1f.coerceAtLeast(width - left - right - child.dockMargin.left - child.dockMargin.right)
|
||||||
Math.max(
|
|
||||||
1f,
|
if (child.dockResize.changeWidth)
|
||||||
width - left - right - child.dockMargin.left - child.dockMargin.right
|
child.width = child.dockedWidth
|
||||||
)
|
else if (child.width != child.dockedWidth)
|
||||||
)
|
child.x += child.dockedWidth / 2f - child.width / 2f
|
||||||
}
|
}
|
||||||
|
|
||||||
Dock.BOTTOM -> {
|
Dock.BOTTOM -> {
|
||||||
child.setPos(
|
child.x = left + child.dockMargin.left
|
||||||
left + child.dockMargin.left,
|
child.y = height - bottom - child.height - child.dockMargin.bottom
|
||||||
height - bottom - child.height - child.dockMargin.bottom
|
|
||||||
)
|
|
||||||
|
|
||||||
bottom += child.height + child.dockMargin.top + child.dockMargin.bottom
|
bottom += child.height + child.dockMargin.top + child.dockMargin.bottom
|
||||||
|
|
||||||
child.width = (
|
child.dockedWidth = 1f.coerceAtLeast(width - left - right - child.dockMargin.left - child.dockMargin.right)
|
||||||
Math.max(
|
|
||||||
1f,
|
if (child.dockResize.changeWidth)
|
||||||
width - left - right - child.dockMargin.left - child.dockMargin.right
|
child.width = child.dockedWidth
|
||||||
)
|
else if (child.width != child.dockedWidth)
|
||||||
)
|
child.x += child.dockedWidth / 2f - child.width / 2f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -489,15 +563,30 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
LOGGER.error("Unable to fit $child inside $this (FILL returned dimensions of $w $h)")
|
LOGGER.error("Unable to fit $child inside $this (FILL returned dimensions of $w $h)")
|
||||||
}
|
}
|
||||||
|
|
||||||
child.setDimensions(
|
child.x = left + child.dockMargin.left
|
||||||
left + child.dockMargin.left,
|
child.y = top + child.dockMargin.top
|
||||||
top + child.dockMargin.top,
|
|
||||||
Math.max(1f, w),
|
child.dockedWidth = w.coerceAtLeast(1f)
|
||||||
Math.max(1f, h)
|
child.dockedHeight = h.coerceAtLeast(1f)
|
||||||
)
|
|
||||||
|
if (child.dockResize.changeHeight)
|
||||||
|
child.height = child.dockedHeight
|
||||||
|
else if (child.height != child.dockedHeight)
|
||||||
|
child.y += child.dockedHeight / 2f - child.height / 2f
|
||||||
|
|
||||||
|
if (child.dockResize.changeWidth)
|
||||||
|
child.width = child.dockedWidth
|
||||||
|
else if (child.width != child.dockedWidth)
|
||||||
|
child.x += child.dockedWidth / 2f - child.width / 2f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateBounds()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun updateBounds() {
|
||||||
|
boundsInvalidated = false
|
||||||
|
|
||||||
boundingX = 0f
|
boundingX = 0f
|
||||||
boundingY = 0f
|
boundingY = 0f
|
||||||
boundingWidth = 0f
|
boundingWidth = 0f
|
||||||
@ -513,6 +602,30 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to tightly fit dimensions to all children
|
||||||
|
*
|
||||||
|
* Performs layout if required
|
||||||
|
*/
|
||||||
|
open fun sizeToContents() {
|
||||||
|
if (layoutInvalidated) {
|
||||||
|
performLayout()
|
||||||
|
}
|
||||||
|
|
||||||
|
var width = 1f
|
||||||
|
var height = 1f
|
||||||
|
|
||||||
|
for (child in children) {
|
||||||
|
if (child.isVisible()) {
|
||||||
|
width = width.coerceAtLeast(child.x + child.width)
|
||||||
|
height = height.coerceAtLeast(child.y + child.height)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.width = width
|
||||||
|
this.height = height
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val LOGGER = LogManager.getLogger()!!
|
private val LOGGER = LogManager.getLogger()!!
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,58 @@
|
|||||||
|
package ru.dbotthepony.mc.otm.client.screen.panels
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack
|
||||||
|
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
|
||||||
|
import net.minecraft.client.gui.screens.inventory.InventoryScreen
|
||||||
|
import net.minecraft.world.entity.LivingEntity
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.element
|
||||||
|
import ru.dbotthepony.mc.otm.client.screen.ExoSuitInventoryScreen
|
||||||
|
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||||
|
|
||||||
|
private fun calculateScale(width: Float, height: Float): Int {
|
||||||
|
val aspectRatio = width / height
|
||||||
|
|
||||||
|
if (aspectRatio.isNaN()) {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aspectRatio < 0.7083) {
|
||||||
|
return (width / 51f * 30f).toInt()
|
||||||
|
} else {
|
||||||
|
return (height / 72f * 30f).toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class EntityRendererPanel(
|
||||||
|
screen: MatteryScreen<*>,
|
||||||
|
parent: EditablePanel?,
|
||||||
|
val entity: LivingEntity,
|
||||||
|
x: Float = 0f,
|
||||||
|
y: Float = 0f,
|
||||||
|
width: Float = ENTITY_RECTANGLE.w,
|
||||||
|
height: Float = ENTITY_RECTANGLE.h,
|
||||||
|
var renderScale: Int = calculateScale(width, height)
|
||||||
|
) : EditablePanel(screen, parent, x, y, width, height) {
|
||||||
|
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
||||||
|
ExoSuitInventoryScreen.ENTITY_RECTANGLE.render(stack)
|
||||||
|
|
||||||
|
if (entity.isDeadOrDying) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val renderX = absoluteX.toInt() + width.toInt() / 2
|
||||||
|
val renderY = absoluteY.toInt() + (height * 0.9f).toInt()
|
||||||
|
|
||||||
|
InventoryScreen.renderEntityInInventory(
|
||||||
|
renderX,
|
||||||
|
renderY,
|
||||||
|
renderScale,
|
||||||
|
renderX - mouseX,
|
||||||
|
absoluteY + height * 0.15f - mouseY,
|
||||||
|
entity
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val ENTITY_RECTANGLE = AbstractContainerScreen.INVENTORY_LOCATION.element(25f, 7f, 51f, 72f)
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package ru.dbotthepony.mc.otm.menu
|
package ru.dbotthepony.mc.otm.menu
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList
|
||||||
import net.minecraft.world.SimpleContainer
|
import net.minecraft.world.SimpleContainer
|
||||||
import net.minecraft.world.entity.player.Inventory
|
import net.minecraft.world.entity.player.Inventory
|
||||||
import net.minecraft.world.entity.player.Player
|
import net.minecraft.world.entity.player.Player
|
||||||
@ -38,7 +39,10 @@ class AndroidStationMenu @JvmOverloads constructor(
|
|||||||
|
|
||||||
override val storageSlots = listOf(addSlot(androidBattery))
|
override val storageSlots = listOf(addSlot(androidBattery))
|
||||||
|
|
||||||
|
val armorSlots = makeArmorSlots()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
armorSlots.forEach(this::addSlot)
|
||||||
addInventorySlots()
|
addInventorySlots()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,12 +48,7 @@ class ExoSuitInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen
|
|||||||
mainInventorySlots = builder.build()
|
mainInventorySlots = builder.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
val armorSlots: List<EquipmentSlot> = ImmutableList.of(
|
val armorSlots: List<EquipmentSlot> = makeArmorSlots()
|
||||||
EquipmentSlot(net.minecraft.world.entity.EquipmentSlot.HEAD),
|
|
||||||
EquipmentSlot(net.minecraft.world.entity.EquipmentSlot.CHEST),
|
|
||||||
EquipmentSlot(net.minecraft.world.entity.EquipmentSlot.LEGS),
|
|
||||||
EquipmentSlot(net.minecraft.world.entity.EquipmentSlot.FEET),
|
|
||||||
)
|
|
||||||
|
|
||||||
val offhandSlot = object : InventorySlot(capability.ply.inventory, 40) {
|
val offhandSlot = object : InventorySlot(capability.ply.inventory, 40) {
|
||||||
override fun getNoItemIcon(): Pair<ResourceLocation, ResourceLocation> {
|
override fun getNoItemIcon(): Pair<ResourceLocation, ResourceLocation> {
|
||||||
|
@ -372,6 +372,13 @@ abstract class MatteryMenu @JvmOverloads protected constructor(
|
|||||||
super.addDataSlots(p_38885_)
|
super.addDataSlots(p_38885_)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun makeArmorSlots(): List<EquipmentSlot> = ImmutableList.of(
|
||||||
|
EquipmentSlot(net.minecraft.world.entity.EquipmentSlot.HEAD),
|
||||||
|
EquipmentSlot(net.minecraft.world.entity.EquipmentSlot.CHEST),
|
||||||
|
EquipmentSlot(net.minecraft.world.entity.EquipmentSlot.LEGS),
|
||||||
|
EquipmentSlot(net.minecraft.world.entity.EquipmentSlot.FEET),
|
||||||
|
)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val TEXTURE_EMPTY_SLOTS: List<ResourceLocation> = ImmutableList.of(
|
val TEXTURE_EMPTY_SLOTS: List<ResourceLocation> = ImmutableList.of(
|
||||||
InventoryMenu.EMPTY_ARMOR_SLOT_BOOTS,
|
InventoryMenu.EMPTY_ARMOR_SLOT_BOOTS,
|
||||||
|
@ -12,7 +12,9 @@ class LevelGaugeWidget(menu: MatteryMenu) : AbstractWidget(menu) {
|
|||||||
var maxLevel = {ImpreciseFraction.ONE }
|
var maxLevel = {ImpreciseFraction.ONE }
|
||||||
|
|
||||||
var levelContainer by menu.mSynchronizer.fraction()
|
var levelContainer by menu.mSynchronizer.fraction()
|
||||||
|
private set
|
||||||
var maxLevelContainer by menu.mSynchronizer.fraction()
|
var maxLevelContainer by menu.mSynchronizer.fraction()
|
||||||
|
private set
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
menu: MatteryMenu,
|
menu: MatteryMenu,
|
||||||
|
Loading…
Reference in New Issue
Block a user