Add "Smart exchange" button to quickstack controls

This commit is contained in:
DBotThePony 2025-03-21 21:58:56 +07:00
parent be2011cf96
commit 01d3cbf7b2
Signed by: DBot
GPG Key ID: DCC23B5715498507
6 changed files with 60 additions and 36 deletions

View File

@ -988,12 +988,14 @@ private fun androidFeatures(provider: MatteryLanguageProvider) {
private fun gui(provider: MatteryLanguageProvider) {
with(provider.english) {
gui("quickmove_from.restock", "Restock from storage")
gui("quickmove_from.restock_with_move", "Full restock from storage")
gui("quickmove_from.restock_with_move", "Quickstack from storage")
gui("quickmove_from.move", "Take all")
gui("quickmove_to.restock", "Restock to storage")
gui("quickmove_to.restock_with_move", "Full restock to storage")
gui("quickmove_to.restock_with_move", "Quickstack to storage")
gui("quickmove_to.move", "Deposit all")
gui("quickmove.exchange", "Smart exchange with storage")
gui("quickmove.exchange.desc", "Filtered slots get restocked, everything else gets quickstacked from Exopack")
gui("quickmove_hint", "Right click to show all variants")

View File

@ -981,12 +981,14 @@ private fun androidFeatures(provider: MatteryLanguageProvider) {
private fun gui(provider: MatteryLanguageProvider) {
with(provider.russian) {
gui("quickmove_from.restock", "Быстрое пополнение из хранилища")
gui("quickmove_from.restock_with_move", "Быстрое перемещение из хранилища")
gui("quickmove_from.restock_with_move", "Быстрое складирование из хранилища")
gui("quickmove_from.move", "Взять всё")
gui("quickmove_to.restock", "Быстрое пополнение в хранилище")
gui("quickmove_to.restock_with_move", "Быстрое перемещение в хранилище")
gui("quickmove_to.restock_with_move", "Быстрое складирование в хранилище")
gui("quickmove_to.move", "Переместить всё")
gui("quickmove.exchange", "Умный обмен с хранилищем")
gui("quickmove.exchange.desc", "Слоты с фильтрами заполняются до максимума, всё остальное быстро складируется из экзопака")
gui("quickmove_hint", "Правый клик чтоб увидеть все варианты")

View File

@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.client.screen.decorative
import net.minecraft.network.chat.Component
import net.minecraft.world.entity.player.Inventory
import ru.dbotthepony.kommons.util.Either
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel
import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls
@ -28,11 +29,11 @@ class CargoCrateScreen(menu: CargoCrateMenu, inventory: Inventory, title: Compon
val leftControls = DeviceControls(this, frame)
leftControls.dockOnLeft = true
leftControls.quickMoveButtons(menu.quickMoveFromStorage, QuickMoveInput.Mode.RESTOCK, true)
leftControls.quickMoveButtons(menu.quickMoveFromStorage)
val leftInventoryControls = DeviceControls(this, inventoryFrame!!)
leftInventoryControls.dockOnLeft = true
leftInventoryControls.quickMoveButtons(menu.quickMoveToStorage, QuickMoveInput.Mode.RESTOCK_WITH_MOVE, false)
leftInventoryControls.quickMoveButtons(menu.quickMoveToStorage, menu.quickMoveFromStorage)
return frame
}

View File

@ -22,19 +22,27 @@ class QuickStackControlsPanel<out S : Screen>(
y: Float = 0f
) : EditablePanel<S>(screen, parent, x, y, 18f, 18f) {
private val grid = GridPanel(screen, this, columns = 1, rows = 1)
private val buttons = ArrayList<ButtonPanel<S>>()
private val buttons = ArrayList<EditablePanel<S>>()
init {
grid.dock = Dock.FILL
grid.layout = GridPanel.Layout.TOP_RIGHT
grid.columnMajorOrder = true
// so row with main button contains only that button (visibly)
val fill = EditablePanel(screen, grid, width = 18f, height = 18f)
fill.childrenOrder = 999
fill.visible = false
fill.dockMargin = DockProperty.bottomRight(1f)
buttons.add(fill)
}
private inner class MainButton : ButtonPanel<S>(screen, grid, width = 18f, height = 18f) {
init {
dockMargin = DockProperty.bottom(1f)
childrenOrder = -100
tooltips.add(QuickMoveInput.Mode.RESTOCK_WITH_MOVE.textToStorage)
childrenOrder = -100000
tooltips.add(TranslatableComponent("otm.gui.quickmove.exchange"))
tooltips.add(TranslatableComponent("otm.gui.quickmove.exchange.desc").withStyle(ChatFormatting.GRAY))
tooltips.add(TextComponent(""))
tooltips.add(TranslatableComponent("otm.gui.quickmove_hint").withStyle(ChatFormatting.GRAY))
}
@ -44,7 +52,7 @@ class QuickStackControlsPanel<out S : Screen>(
set(value) {}
override val icon: IGUIRenderable
get() = Widgets18.RESTOCK_WITH_MOVE_TO_STORAGE
get() = Widgets18.SMART_STORAGE_EXCHANGE
override fun test(value: Int): Boolean {
return value == InputConstants.MOUSE_BUTTON_LEFT || value == InputConstants.MOUSE_BUTTON_RIGHT
@ -53,12 +61,13 @@ class QuickStackControlsPanel<out S : Screen>(
override fun onClick(mouseButton: Int) {
if (mouseButton == InputConstants.MOUSE_BUTTON_LEFT) {
PacketDistributor.sendToServer(QuickStackPacket(QuickMoveInput.Mode.RESTOCK_WITH_MOVE, true))
PacketDistributor.sendToServer(QuickStackPacket(QuickMoveInput.Mode.RESTOCK, false))
} else {
buttons.forEach { it.visible = !it.visible }
if (buttons[0].visible) {
grid.columns = 2
grid.rows = 3
grid.rows = 4
} else {
grid.columns = 1
grid.rows = 1
@ -86,14 +95,14 @@ class QuickStackControlsPanel<out S : Screen>(
mode.iconFromStorage,
onPress = IntConsumer { PacketDistributor.sendToServer(QuickStackPacket(mode, false)) })
button.childrenOrder = QuickMoveInput.Mode.entries.size + i
button.childrenOrder = 1000 + i
button.dockMargin = DockProperty.bottomRight(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()) {
for ((i, mode) in QuickMoveInput.Mode.entries.withIndex()) {
val button = ButtonPanel.square18(
screen, grid,
mode.iconToStorage,

View File

@ -6,6 +6,7 @@ import net.minecraft.network.chat.Component
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import ru.dbotthepony.kommons.util.Delegate
import ru.dbotthepony.kommons.util.Either
import ru.dbotthepony.kommons.util.value
import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity
import ru.dbotthepony.mc.otm.block.entity.RedstoneSetting
@ -542,33 +543,43 @@ class DeviceControls<out S : MatteryScreen<*>>(
}
}
fun quickMoveButtons(buttons: Map<QuickMoveInput.Mode, QuickMoveInput>, mainMode: QuickMoveInput.Mode, isFromStorage: Boolean, unfoldableSettings: Boolean = true) {
fun quickMoveButtons(
buttons: Map<QuickMoveInput.Mode, QuickMoveInput>,
fromStorage: Map<QuickMoveInput.Mode, QuickMoveInput>? = null
) {
object : FoldableButtonPanel() {
private val input = buttons[mainMode]!!
override fun performAction() {
input.clientInput()
if (fromStorage == null) {
buttons[QuickMoveInput.Mode.MOVE]!!.clientInput()
} else {
buttons[QuickMoveInput.Mode.RESTOCK_WITH_MOVE]!!.clientInput()
fromStorage[QuickMoveInput.Mode.RESTOCK]!!.clientInput()
}
}
override var isDisabled: Boolean
get() { return !input.input.test(minecraft.player ?: return false) }
get() { return !buttons.values.first().input.test(minecraft.player ?: return false) }
set(value) {}
override val hasExtraButtons: Boolean
get() = unfoldableSettings
get() = true
override fun doMakeButtons(): List<EditablePanel<S>> {
return buttons.entries
var stream = buttons.entries
.stream()
.filter { (m, _) -> m != input.mode }
if (fromStorage == null)
stream = stream.filter { (m) -> m != QuickMoveInput.Mode.MOVE }
return stream
.map { (m, b) ->
square18(
screen,
this,
icon = if (isFromStorage) m.iconFromStorage else m.iconToStorage,
icon = if (fromStorage == null) m.iconFromStorage else m.iconToStorage,
onPress = { b.clientInput() }
).also {
if (isFromStorage)
if (fromStorage == null)
it.tooltips.add(m.textFromStorage)
else
it.tooltips.add(m.textToStorage)
@ -578,21 +589,19 @@ class DeviceControls<out S : MatteryScreen<*>>(
}
init {
if (isFromStorage)
tooltips.add(input.mode.textFromStorage)
else
tooltips.add(input.mode.textToStorage)
if (unfoldableSettings) {
tooltips.add(TextComponent(""))
tooltips.add(TranslatableComponent("otm.gui.quickmove_hint").withStyle(ChatFormatting.GRAY))
} else {
makeButtons()
if (fromStorage == null)
tooltips.add(QuickMoveInput.Mode.MOVE.textFromStorage)
else {
tooltips.add(TranslatableComponent("otm.gui.quickmove.exchange"))
tooltips.add(TranslatableComponent("otm.gui.quickmove.exchange.desc").withStyle(ChatFormatting.GRAY))
}
tooltips.add(TextComponent(""))
tooltips.add(TranslatableComponent("otm.gui.quickmove_hint").withStyle(ChatFormatting.GRAY))
}
override val icon: IGUIRenderable
get() = if (isFromStorage) input.mode.iconFromStorage else input.mode.iconToStorage
get() = if (fromStorage == null) QuickMoveInput.Mode.MOVE.iconFromStorage else Widgets18.SMART_STORAGE_EXCHANGE
}
}

View File

@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.compat.vanilla
import net.minecraft.network.chat.Component
import net.minecraft.world.entity.player.Inventory
import ru.dbotthepony.kommons.util.Either
import ru.dbotthepony.mc.otm.client.render.RenderGravity
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import ru.dbotthepony.mc.otm.client.screen.panels.Dock
@ -31,11 +32,11 @@ class VanillaChestScreen(menu: AbstractVanillaChestMenu, inventory: Inventory, t
val leftControls = DeviceControls(this, frame)
leftControls.dockOnLeft = true
leftControls.quickMoveButtons(menu.quickMoveFromStorage, QuickMoveInput.Mode.RESTOCK, true)
leftControls.quickMoveButtons(menu.quickMoveFromStorage)
val leftInventoryControls = DeviceControls(this, inventoryFrame!!)
leftInventoryControls.dockOnLeft = true
leftInventoryControls.quickMoveButtons(menu.quickMoveToStorage, QuickMoveInput.Mode.RESTOCK_WITH_MOVE, false)
leftInventoryControls.quickMoveButtons(menu.quickMoveToStorage, menu.quickMoveFromStorage)
return frame
}