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) { private fun gui(provider: MatteryLanguageProvider) {
with(provider.english) { with(provider.english) {
gui("quickmove_from.restock", "Restock from storage") 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_from.move", "Take all")
gui("quickmove_to.restock", "Restock to storage") 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_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") 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) { private fun gui(provider: MatteryLanguageProvider) {
with(provider.russian) { with(provider.russian) {
gui("quickmove_from.restock", "Быстрое пополнение из хранилища") gui("quickmove_from.restock", "Быстрое пополнение из хранилища")
gui("quickmove_from.restock_with_move", "Быстрое перемещение из хранилища") gui("quickmove_from.restock_with_move", "Быстрое складирование из хранилища")
gui("quickmove_from.move", "Взять всё") gui("quickmove_from.move", "Взять всё")
gui("quickmove_to.restock", "Быстрое пополнение в хранилище") gui("quickmove_to.restock", "Быстрое пополнение в хранилище")
gui("quickmove_to.restock_with_move", "Быстрое перемещение в хранилище") gui("quickmove_to.restock_with_move", "Быстрое складирование в хранилище")
gui("quickmove_to.move", "Переместить всё") gui("quickmove_to.move", "Переместить всё")
gui("quickmove.exchange", "Умный обмен с хранилищем")
gui("quickmove.exchange.desc", "Слоты с фильтрами заполняются до максимума, всё остальное быстро складируется из экзопака")
gui("quickmove_hint", "Правый клик чтоб увидеть все варианты") 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.network.chat.Component
import net.minecraft.world.entity.player.Inventory 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.MatteryScreen
import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel
import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls 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) val leftControls = DeviceControls(this, frame)
leftControls.dockOnLeft = true leftControls.dockOnLeft = true
leftControls.quickMoveButtons(menu.quickMoveFromStorage, QuickMoveInput.Mode.RESTOCK, true) leftControls.quickMoveButtons(menu.quickMoveFromStorage)
val leftInventoryControls = DeviceControls(this, inventoryFrame!!) val leftInventoryControls = DeviceControls(this, inventoryFrame!!)
leftInventoryControls.dockOnLeft = true leftInventoryControls.dockOnLeft = true
leftInventoryControls.quickMoveButtons(menu.quickMoveToStorage, QuickMoveInput.Mode.RESTOCK_WITH_MOVE, false) leftInventoryControls.quickMoveButtons(menu.quickMoveToStorage, menu.quickMoveFromStorage)
return frame return frame
} }

View File

@ -22,19 +22,27 @@ class QuickStackControlsPanel<out S : Screen>(
y: Float = 0f y: Float = 0f
) : EditablePanel<S>(screen, parent, x, y, 18f, 18f) { ) : EditablePanel<S>(screen, parent, x, y, 18f, 18f) {
private val grid = GridPanel(screen, this, columns = 1, rows = 1) private val grid = GridPanel(screen, this, columns = 1, rows = 1)
private val buttons = ArrayList<ButtonPanel<S>>() private val buttons = ArrayList<EditablePanel<S>>()
init { init {
grid.dock = Dock.FILL grid.dock = Dock.FILL
grid.layout = GridPanel.Layout.TOP_RIGHT grid.layout = GridPanel.Layout.TOP_RIGHT
grid.columnMajorOrder = true 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) { private inner class MainButton : ButtonPanel<S>(screen, grid, width = 18f, height = 18f) {
init { init {
dockMargin = DockProperty.bottom(1f) dockMargin = DockProperty.bottom(1f)
childrenOrder = -100 childrenOrder = -100000
tooltips.add(QuickMoveInput.Mode.RESTOCK_WITH_MOVE.textToStorage) tooltips.add(TranslatableComponent("otm.gui.quickmove.exchange"))
tooltips.add(TranslatableComponent("otm.gui.quickmove.exchange.desc").withStyle(ChatFormatting.GRAY))
tooltips.add(TextComponent("")) tooltips.add(TextComponent(""))
tooltips.add(TranslatableComponent("otm.gui.quickmove_hint").withStyle(ChatFormatting.GRAY)) tooltips.add(TranslatableComponent("otm.gui.quickmove_hint").withStyle(ChatFormatting.GRAY))
} }
@ -44,7 +52,7 @@ class QuickStackControlsPanel<out S : Screen>(
set(value) {} set(value) {}
override val icon: IGUIRenderable override val icon: IGUIRenderable
get() = Widgets18.RESTOCK_WITH_MOVE_TO_STORAGE get() = Widgets18.SMART_STORAGE_EXCHANGE
override fun test(value: Int): Boolean { override fun test(value: Int): Boolean {
return value == InputConstants.MOUSE_BUTTON_LEFT || value == InputConstants.MOUSE_BUTTON_RIGHT 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) { override fun onClick(mouseButton: Int) {
if (mouseButton == InputConstants.MOUSE_BUTTON_LEFT) { if (mouseButton == InputConstants.MOUSE_BUTTON_LEFT) {
PacketDistributor.sendToServer(QuickStackPacket(QuickMoveInput.Mode.RESTOCK_WITH_MOVE, true)) PacketDistributor.sendToServer(QuickStackPacket(QuickMoveInput.Mode.RESTOCK_WITH_MOVE, true))
PacketDistributor.sendToServer(QuickStackPacket(QuickMoveInput.Mode.RESTOCK, false))
} else { } else {
buttons.forEach { it.visible = !it.visible } buttons.forEach { it.visible = !it.visible }
if (buttons[0].visible) { if (buttons[0].visible) {
grid.columns = 2 grid.columns = 2
grid.rows = 3 grid.rows = 4
} else { } else {
grid.columns = 1 grid.columns = 1
grid.rows = 1 grid.rows = 1
@ -86,14 +95,14 @@ class QuickStackControlsPanel<out S : Screen>(
mode.iconFromStorage, mode.iconFromStorage,
onPress = IntConsumer { PacketDistributor.sendToServer(QuickStackPacket(mode, false)) }) onPress = IntConsumer { PacketDistributor.sendToServer(QuickStackPacket(mode, false)) })
button.childrenOrder = QuickMoveInput.Mode.entries.size + i button.childrenOrder = 1000 + i
button.dockMargin = DockProperty.bottomRight(1f) button.dockMargin = DockProperty.bottomRight(1f)
button.visible = false button.visible = false
button.tooltips.add(mode.textFromStorage) button.tooltips.add(mode.textFromStorage)
buttons.add(button) 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( val button = ButtonPanel.square18(
screen, grid, screen, grid,
mode.iconToStorage, 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.ItemStack
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import ru.dbotthepony.kommons.util.Delegate import ru.dbotthepony.kommons.util.Delegate
import ru.dbotthepony.kommons.util.Either
import ru.dbotthepony.kommons.util.value import ru.dbotthepony.kommons.util.value
import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity
import ru.dbotthepony.mc.otm.block.entity.RedstoneSetting 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() { object : FoldableButtonPanel() {
private val input = buttons[mainMode]!!
override fun performAction() { 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 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) {} set(value) {}
override val hasExtraButtons: Boolean override val hasExtraButtons: Boolean
get() = unfoldableSettings get() = true
override fun doMakeButtons(): List<EditablePanel<S>> { override fun doMakeButtons(): List<EditablePanel<S>> {
return buttons.entries var stream = buttons.entries
.stream() .stream()
.filter { (m, _) -> m != input.mode }
if (fromStorage == null)
stream = stream.filter { (m) -> m != QuickMoveInput.Mode.MOVE }
return stream
.map { (m, b) -> .map { (m, b) ->
square18( square18(
screen, screen,
this, this,
icon = if (isFromStorage) m.iconFromStorage else m.iconToStorage, icon = if (fromStorage == null) m.iconFromStorage else m.iconToStorage,
onPress = { b.clientInput() } onPress = { b.clientInput() }
).also { ).also {
if (isFromStorage) if (fromStorage == null)
it.tooltips.add(m.textFromStorage) it.tooltips.add(m.textFromStorage)
else else
it.tooltips.add(m.textToStorage) it.tooltips.add(m.textToStorage)
@ -578,21 +589,19 @@ class DeviceControls<out S : MatteryScreen<*>>(
} }
init { init {
if (isFromStorage) if (fromStorage == null)
tooltips.add(input.mode.textFromStorage) tooltips.add(QuickMoveInput.Mode.MOVE.textFromStorage)
else else {
tooltips.add(input.mode.textToStorage) tooltips.add(TranslatableComponent("otm.gui.quickmove.exchange"))
tooltips.add(TranslatableComponent("otm.gui.quickmove.exchange.desc").withStyle(ChatFormatting.GRAY))
}
if (unfoldableSettings) {
tooltips.add(TextComponent("")) tooltips.add(TextComponent(""))
tooltips.add(TranslatableComponent("otm.gui.quickmove_hint").withStyle(ChatFormatting.GRAY)) tooltips.add(TranslatableComponent("otm.gui.quickmove_hint").withStyle(ChatFormatting.GRAY))
} else {
makeButtons()
}
} }
override val icon: IGUIRenderable 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.network.chat.Component
import net.minecraft.world.entity.player.Inventory 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.render.RenderGravity
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import ru.dbotthepony.mc.otm.client.screen.panels.Dock 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) val leftControls = DeviceControls(this, frame)
leftControls.dockOnLeft = true leftControls.dockOnLeft = true
leftControls.quickMoveButtons(menu.quickMoveFromStorage, QuickMoveInput.Mode.RESTOCK, true) leftControls.quickMoveButtons(menu.quickMoveFromStorage)
val leftInventoryControls = DeviceControls(this, inventoryFrame!!) val leftInventoryControls = DeviceControls(this, inventoryFrame!!)
leftInventoryControls.dockOnLeft = true leftInventoryControls.dockOnLeft = true
leftInventoryControls.quickMoveButtons(menu.quickMoveToStorage, QuickMoveInput.Mode.RESTOCK_WITH_MOVE, false) leftInventoryControls.quickMoveButtons(menu.quickMoveToStorage, menu.quickMoveFromStorage)
return frame return frame
} }