More quickstack controls

This commit is contained in:
DBotThePony 2025-03-21 14:31:59 +07:00
parent 9be8596a5f
commit dcff861e71
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 164 additions and 9 deletions

View File

@ -286,16 +286,12 @@ class ExopackInventoryScreen(menu: ExopackInventoryMenu) : MatteryScreen<Exopack
EffectListPanel(this, frame, menu.player, x - 56f, gridHeight = 6).tick()
val leftControls = DeviceControls(this, frame)
leftControls.dockOnLeft = true
leftControls.dockTop = 96f
val quickStack = QuickStackControlsPanel(this)
quickStack.dockNear = frame
quickStack.dockTop = 96f
quickStack.dock = Dock.LEFT
leftControls.addButton(ButtonPanel.square18(
this, leftControls,
icon = Widgets18.RESTOCK_WITH_MOVE_TO_STORAGE,
onPress = IntConsumer { PacketDistributor.sendToServer(QuickStackPacket(QuickMoveInput.Mode.RESTOCK_WITH_MOVE, true)) }).also {
it.tooltips.add(QuickMoveInput.Mode.RESTOCK_WITH_MOVE.textToStorage)
})
addPanel(quickStack)
return frame
}

View File

@ -0,0 +1,159 @@
package ru.dbotthepony.mc.otm.client.screen.panels
import com.mojang.blaze3d.platform.InputConstants
import net.minecraft.ChatFormatting
import net.minecraft.client.gui.screens.Screen
import net.neoforged.neoforge.network.PacketDistributor
import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.client.render.IGUIRenderable
import ru.dbotthepony.mc.otm.client.render.Widgets18
import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel
import ru.dbotthepony.mc.otm.client.screen.panels.util.GridPanel
import ru.dbotthepony.mc.otm.core.TextComponent
import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.menu.QuickMoveInput
import ru.dbotthepony.mc.otm.network.QuickStackPacket
import java.util.function.IntConsumer
class QuickStackControlsPanel<out S : Screen>(
screen: S,
parent: EditablePanel<*>? = null,
) : EditablePanel<S>(screen, parent, 0f, 0f, 18f, 18f) {
private val grid = GridPanel(screen, this, columns = 1, rows = 1)
private val buttons = ArrayList<ButtonPanel<S>>()
init {
grid.dock = Dock.FILL
grid.layout = GridPanel.Layout.TOP_LEFT
}
private inner class MainButton : ButtonPanel<S>(screen, grid, width = 18f, height = 18f) {
init {
dockMargin = DockProperty.left(1f)
childrenOrder = -100
tooltips.add(QuickMoveInput.Mode.RESTOCK_WITH_MOVE.textToStorage)
tooltips.add(TextComponent(""))
tooltips.add(TranslatableComponent("otm.gui.quickmove_hint").withStyle(ChatFormatting.GRAY))
}
override var isDisabled: Boolean
get() = minecraft.player!!.isSpectator
set(value) {}
override val icon: IGUIRenderable
get() = Widgets18.RESTOCK_WITH_MOVE_TO_STORAGE
override fun test(value: Int): Boolean {
return value == InputConstants.MOUSE_BUTTON_LEFT || value == InputConstants.MOUSE_BUTTON_RIGHT
}
override fun onClick(mouseButton: Int) {
if (mouseButton == InputConstants.MOUSE_BUTTON_LEFT) {
PacketDistributor.sendToServer(QuickStackPacket(QuickMoveInput.Mode.RESTOCK_WITH_MOVE, true))
} else {
buttons.forEach { it.visible = !it.visible }
if (buttons[0].visible) {
grid.columns = 2
grid.rows = 3
} else {
grid.columns = 1
grid.rows = 1
}
this@QuickStackControlsPanel.sizeToContents()
}
}
}
override fun mouseClickedInner(x: Double, y: Double, button: Int): Boolean {
return false
}
override fun sizeToContents() {
val oldWidth = width
val oldHeight = height
super.sizeToContents()
if (parent == null && dockNear == null) {
when (dock) {
Dock.LEFT -> x -= width - oldWidth
Dock.TOP -> y -= height - oldHeight
else -> {} // do nothing
}
}
}
override fun onParented(parent: EditablePanel<*>) {
super.onParented(parent)
dockNear = null
}
var dockNear: EditablePanel<*>? = null
override fun tickInner() {
super.tickInner()
val dockNear = dockNear
if (dockNear != null && parent == null && dock != Dock.NONE && dock != Dock.FILL) {
x = dockNear.absoluteX
y = dockNear.absoluteY
when (dock) {
Dock.LEFT -> {
x -= width + dockMargin.right
y += dockMargin.top
}
Dock.RIGHT -> {
x += width + dockMargin.left
y += dockMargin.top
}
Dock.TOP -> {
y -= height + dockMargin.bottom
x += dockMargin.left
}
Dock.BOTTOM -> {
y += height + dockMargin.top
x += dockMargin.left
}
else -> throw RuntimeException("you w0t m8?")
}
}
}
init {
for ((i, mode) in QuickMoveInput.Mode.entries.withIndex()) {
val button = ButtonPanel.square18(
screen, grid,
mode.iconFromStorage,
onPress = IntConsumer { PacketDistributor.sendToServer(QuickStackPacket(mode, false)) })
button.childrenOrder = QuickMoveInput.Mode.entries.size + i
button.dockMargin = DockProperty.left(1f)
button.visible = false
button.tooltips.add(mode.textFromStorage)
buttons.add(button)
}
for ((i, mode) in QuickMoveInput.Mode.entries.filter { it != QuickMoveInput.Mode.RESTOCK_WITH_MOVE }.withIndex()) {
val button = ButtonPanel.square18(
screen, grid,
mode.iconToStorage,
onPress = IntConsumer { PacketDistributor.sendToServer(QuickStackPacket(mode, true)) })
button.childrenOrder = i + 1
button.dockMargin = DockProperty.left(1f)
button.visible = false
button.tooltips.add(mode.textToStorage)
buttons.add(button)
}
MainButton()
}
}