Inverse of "Items Allowed in Hotbar": "Items Not Allowed in Hotbar"
Xetaxheb opened this issue ยท 1 comments
Have you asked for help in discord?
YES
Describe your desired feature.
As discussed here: https://discord.com/channels/861171785897738240/861178789921030144/1271198691134279802
Basically a text box after LOCKED_SLOTS_EMPTY_HOTBAR_BLACKLIST (items allowed in hotbar: default: "carryon") that allows for blacklisting matched items from going into the hotbar when LOCKED_SLOTS_EMPTY_HOTBAR_AS_SEMI_LOCKED==false (pick items directly into inventory: false)
If I put say, "minecraft:cobblestone", then any cobblestone would go into my inventory instead of my hotbar when picked up under the same circumstances (aka normally walking over the item) as "Pick items directly into inventory" would trigger.
A rough draft for edits I cannot test right now; I'm unsure what a lot of the existing code does so I don't know if there's more that needs adding/changing or if there's unnecessary parts (or even just a better place to put the check):
Configs.kt addition
val LOCKED_SLOTS_BLOCK_HOTBAR_BLACKLIST /**/ by handledString("botania:pebble", LockedSlotKeeper::updateBlocked)
LockedSlotKeeper.kt addition
private val blockHotbarBlackList: MutableSet<String> = mutableSetOf()
fun isBlocked(stack: ItemStack?): Boolean = stack != null && blockHotbarBlackList.find { s ->
s == stack.`(itemType)`.namespace || s == stack.`(itemType)`.itemId ||
s.isWildCard() && JWildcard.matches(s, stack.`(itemType)`.itemId)
} != null
fun updateBlocked() {
blockHotbarBlackList.clear()
LockedSlotsSettings.LOCKED_SLOTS_BLOCK_HOTBAR_BLACKLIST.value.split(",").forEach {
blockHotbarBlackList.add(it.trim())
}
}
LockedSlotKeeper.kt
L245 (adding another else if to L182's closing bracket)
-- }
++
} else if (this.emptyNonLockedSlots.isNotEmpty()
&& emptyNonLockedHotbarSlots.isNotEmpty()) {
fun checkHotbar(second: Boolean = false) {
val localSkipRemoveEmptyFor: MutableSet<Int> = skipRemoveEmptyFor.toMutableSet()
val secondString = if (second) {
"Second run: "
} else {
""
}
newlyFilled.clear()
(localEmptyNonLockedSlots - emptyNonLockedHotbarSlots).isEmpty().ifTrue {
return
}
emptyNonLockedHotbarSlots.forEach { slotId ->
if (Vanilla.container() !is PlayerContainer) {
Log.trace("Current container is: ${Vanilla.container().javaClass.name}" )
}
val stack = Vanilla.container().`(slots)`[slotId].`(vanillaStack)`
if (!stack.isEmpty) {
someThingChanged = true
if (!isBlocked(stack)) {
newlyFilled.add(slotId)
AutoRefillHandler.skipTick = true
Log.trace("${secondString}Item type: ${stack.`(itemType)`.itemId} is allowed in slot id $slotId")
} else if (!ignoredHotbarSlots.contains(slotId)) {
if (localEmptyNonLockedSlots.size > 0) {
AutoRefillHandler.skipTick = true
val targetSlot = localEmptyNonLockedSlots[0]
val hotBarSlot = slotId - 36
Log.trace("${secondString}Fast Swapping $slotId to $targetSlot")
ContainerClicker.swap(targetSlot,
hotBarSlot)
localEmptyNonLockedSlots.removeAt(0)
}
} else {
AutoRefillHandler.skipTick = true
Log.trace("${secondString}Removing $slotId from blocked")
ignoredHotbarSlots.remove(slotId)
newlyFilled.add(slotId)
}
}
}
if (newlyFilled.isNotEmpty()) {
Log.trace("Skip remove from empty is: $localSkipRemoveEmptyFor")
newlyFilled.removeAll(localSkipRemoveEmptyFor)
emptyNonLockedHotbarSlots.removeAll(newlyFilled)
}
}
skipRemoveEmptyFor.isNotEmpty().ifTrue {
emptyNonLockedHotbarSlots.addAll(skipRemoveEmptyFor)
}
checkHotbar()
ignoredHotbarSlots.addAll(skipRemoveEmptyFor)
//Yes doing the same thing twice...
//sometimes an item is picked up in the just freed slot and it remains in the hotbar.
//so we check twice to be sure
if (localEmptyNonLockedSlots.isNotEmpty()) {
checkHotbar(true)
}
skipRemoveEmptyFor.clear()
}