Prioritize non-filtered slots when taking items first
This commit is contained in:
parent
bd4622fc0d
commit
85c4aa4dc4
@ -16,6 +16,37 @@ import ru.dbotthepony.mc.otm.core.util.asKey
|
|||||||
import ru.dbotthepony.mc.otm.core.util.asKeyOrNull
|
import ru.dbotthepony.mc.otm.core.util.asKeyOrNull
|
||||||
|
|
||||||
class QuickMoveInput(private val menu: MatteryMenu, val from: Collection<Slot>, val to: Collection<Slot>, val mode: Mode, val dontTouchFilteredSlots: Boolean = true) {
|
class QuickMoveInput(private val menu: MatteryMenu, val from: Collection<Slot>, val to: Collection<Slot>, val mode: Mode, val dontTouchFilteredSlots: Boolean = true) {
|
||||||
|
object HasItemComparator : Comparator<Slot> {
|
||||||
|
override fun compare(a: Slot, b: Slot): Int {
|
||||||
|
val hasItemA = a.item.isNotEmpty
|
||||||
|
val hasItemB = b.item.isNotEmpty
|
||||||
|
|
||||||
|
if (hasItemA == hasItemB)
|
||||||
|
return 0
|
||||||
|
else if (hasItemA)
|
||||||
|
return -1
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object HasFilterComparator : Comparator<Slot> {
|
||||||
|
override fun compare(a: Slot, b: Slot): Int {
|
||||||
|
val slotA = a.containerSlotOrNull()
|
||||||
|
val slotB = b.containerSlotOrNull()
|
||||||
|
|
||||||
|
val hasFilterA = slotA is IFilteredContainerSlot && slotA.hasFilter
|
||||||
|
val hasFilterB = slotB is IFilteredContainerSlot && slotB.hasFilter
|
||||||
|
|
||||||
|
if (hasFilterA == hasFilterB)
|
||||||
|
return 0
|
||||||
|
else if (hasFilterA)
|
||||||
|
return -1
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum class Mode(val iconFromStorage: AbstractMatterySprite, val iconToStorage: AbstractMatterySprite) {
|
enum class Mode(val iconFromStorage: AbstractMatterySprite, val iconToStorage: AbstractMatterySprite) {
|
||||||
RESTOCK(
|
RESTOCK(
|
||||||
Widgets18.RESTOCK_FROM_STORAGE,
|
Widgets18.RESTOCK_FROM_STORAGE,
|
||||||
@ -30,7 +61,14 @@ class QuickMoveInput(private val menu: MatteryMenu, val from: Collection<Slot>,
|
|||||||
|
|
||||||
for (key in intersect) {
|
for (key in intersect) {
|
||||||
val slotsTo = itemsTo[key]!!
|
val slotsTo = itemsTo[key]!!
|
||||||
itemsFrom[key]!!.forEach { moveItemStackTo(player, it, slotsTo) }
|
val slotsFrom = itemsFrom[key]!!
|
||||||
|
|
||||||
|
if (!dontTouchFilteredSlots) {
|
||||||
|
// touch filtered slots last
|
||||||
|
slotsFrom.sortWith(HasFilterComparator.reversed())
|
||||||
|
}
|
||||||
|
|
||||||
|
slotsFrom.forEach { moveItemStackTo(player, it, slotsTo) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -49,6 +87,12 @@ class QuickMoveInput(private val menu: MatteryMenu, val from: Collection<Slot>,
|
|||||||
for (key in intersect) {
|
for (key in intersect) {
|
||||||
val slotsTo = prioritySortSlots(itemsTo[key]!!, key.asItemStack())
|
val slotsTo = prioritySortSlots(itemsTo[key]!!, key.asItemStack())
|
||||||
val slotsFrom = itemsFrom[key]!!
|
val slotsFrom = itemsFrom[key]!!
|
||||||
|
|
||||||
|
if (!dontTouchFilteredSlots) {
|
||||||
|
// touch filtered slots last
|
||||||
|
slotsFrom.sortWith(HasFilterComparator.reversed())
|
||||||
|
}
|
||||||
|
|
||||||
slotsFrom.removeIf { moveItemStackTo(player, it, slotsTo, sort = false); it.item.isEmpty }
|
slotsFrom.removeIf { moveItemStackTo(player, it, slotsTo, sort = false); it.item.isEmpty }
|
||||||
var moveAny = false
|
var moveAny = false
|
||||||
slotsFrom.forEach { moveAny = moveItemStackTo(player, it, emptyTo, sort = false) || moveAny }
|
slotsFrom.forEach { moveAny = moveItemStackTo(player, it, emptyTo, sort = false) || moveAny }
|
||||||
@ -150,40 +194,20 @@ class QuickMoveInput(private val menu: MatteryMenu, val from: Collection<Slot>,
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun prioritySortSlots(slots: Collection<Slot>, filterItem: ItemStack? = null): MutableList<Slot> {
|
private val itemFilterSlotComparator = HasItemComparator.thenComparing(HasFilterComparator)
|
||||||
val sortedSlots = ArrayList(slots)
|
|
||||||
|
|
||||||
sortedSlots.removeIf {
|
fun <T : MutableList<Slot>> prioritySortSlotsInPlace(slots: T, filterItem: ItemStack? = null): T {
|
||||||
|
slots.removeIf {
|
||||||
val slot = it.containerSlotOrNull()
|
val slot = it.containerSlotOrNull()
|
||||||
it.isOverCapacity || filterItem != null && !it.mayPlace(filterItem) || slot is IFilteredContainerSlot && slot.isForbiddenForAutomation
|
it.isOverCapacity || filterItem != null && !it.mayPlace(filterItem) || slot is IFilteredContainerSlot && slot.isForbiddenForAutomation
|
||||||
}
|
}
|
||||||
|
|
||||||
sortedSlots.sortWith { a, b ->
|
slots.sortWith(itemFilterSlotComparator)
|
||||||
val hasItemA = a.item.isNotEmpty
|
return slots
|
||||||
val hasItemB = b.item.isNotEmpty
|
}
|
||||||
|
|
||||||
if (hasItemA && hasItemB)
|
fun prioritySortSlots(slots: Collection<Slot>, filterItem: ItemStack? = null): MutableList<Slot> {
|
||||||
return@sortWith 0
|
return prioritySortSlotsInPlace(ArrayList(slots), filterItem)
|
||||||
else if (hasItemA)
|
|
||||||
return@sortWith -1
|
|
||||||
else if (hasItemB)
|
|
||||||
return@sortWith 1
|
|
||||||
|
|
||||||
val slotA = a.containerSlotOrNull()
|
|
||||||
val slotB = b.containerSlotOrNull()
|
|
||||||
|
|
||||||
val hasFilterA = slotA is IFilteredContainerSlot && slotA.hasFilter
|
|
||||||
val hasFilterB = slotB is IFilteredContainerSlot && slotB.hasFilter
|
|
||||||
|
|
||||||
if (hasFilterA && hasFilterB || !hasFilterA && !hasFilterB)
|
|
||||||
return@sortWith 0
|
|
||||||
else if (hasFilterA)
|
|
||||||
return@sortWith -1
|
|
||||||
else
|
|
||||||
return@sortWith 1
|
|
||||||
}
|
|
||||||
|
|
||||||
return sortedSlots
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun moveItemStackToSlots(item: ItemStack, slots: Collection<Slot>, simulate: Boolean = false, sort: Boolean = true): ItemStack {
|
fun moveItemStackToSlots(item: ItemStack, slots: Collection<Slot>, simulate: Boolean = false, sort: Boolean = true): ItemStack {
|
||||||
|
Loading…
Reference in New Issue
Block a user