From 01d3cbf7b214943cbca93c0258eb80a4f9aad108 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 21 Mar 2025 21:58:56 +0700 Subject: [PATCH] Add "Smart exchange" button to quickstack controls --- .../mc/otm/datagen/lang/English.kt | 6 ++- .../mc/otm/datagen/lang/Russian.kt | 6 ++- .../screen/decorative/CargoCrateScreen.kt | 5 +- .../screen/panels/QuickStackControlsPanel.kt | 23 ++++++--- .../client/screen/panels/button/Buttons.kt | 51 +++++++++++-------- .../otm/compat/vanilla/VanillaChestScreen.kt | 5 +- 6 files changed, 60 insertions(+), 36 deletions(-) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index f67f598c9..582993b87 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -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") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index 3ca5d8e84..dacdff815 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -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", "Правый клик чтоб увидеть все варианты") diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/CargoCrateScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/CargoCrateScreen.kt index 1cae5b676..557704aa8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/CargoCrateScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/CargoCrateScreen.kt @@ -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 } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/QuickStackControlsPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/QuickStackControlsPanel.kt index 9eed2bfd8..c0616b598 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/QuickStackControlsPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/QuickStackControlsPanel.kt @@ -22,19 +22,27 @@ class QuickStackControlsPanel( y: Float = 0f ) : EditablePanel(screen, parent, x, y, 18f, 18f) { private val grid = GridPanel(screen, this, columns = 1, rows = 1) - private val buttons = ArrayList>() + private val buttons = ArrayList>() 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(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( 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( 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( 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, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt index 1df7a600b..d94a736cc 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt @@ -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>( } } - fun quickMoveButtons(buttons: Map, mainMode: QuickMoveInput.Mode, isFromStorage: Boolean, unfoldableSettings: Boolean = true) { + fun quickMoveButtons( + buttons: Map, + fromStorage: Map? = 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> { - 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>( } 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 } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/vanilla/VanillaChestScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/vanilla/VanillaChestScreen.kt index 5a990200d..a782b0535 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/vanilla/VanillaChestScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/vanilla/VanillaChestScreen.kt @@ -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 }