Skip to content
This repository has been archived by the owner on May 12, 2024. It is now read-only.

Commit

Permalink
Quick simple potion type check for Kit
Browse files Browse the repository at this point in the history
  • Loading branch information
Luna5ama committed Sep 16, 2023
1 parent d7977ee commit 69b51b3
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ object KitCommand : ClientCommand(
executeSafe {
val slots = player.inventorySlots
val array = List(36) {
slots[it].stack.item.registryName?.toString() ?: "minecraft:air"
Kit.ItemEntry.fromStack(slots[it].stack).toString()
}

val name = nameArg.value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ internal object AutoRegear : Module(

private fun doRegear(
openContainer: Container,
itemArray: Array<Item>
itemArray: Array<Kit.ItemEntry>
): Boolean {
val windowID = openContainer.windowId
val currentTime = System.currentTimeMillis()
Expand All @@ -349,7 +349,7 @@ internal object AutoRegear : Module(
if (currentTime <= moveTimeMap.get(slotTo.slotNumber)) continue

val targetItem = itemArray[index]
if (targetItem is ItemShulkerBox) continue
if (targetItem.item is ItemShulkerBox) continue

val isHotbar = index in playerSlot.size - 9 until playerSlot.size

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ internal object InventorySorter : Module(
private val postDelay by setting("Post Delay", 50, 0..1000, 1)

private val checkSet = DynamicBitSet()
private var itemArray: Array<Item>? = null
private var itemArray: Array<Kit.ItemEntry>? = null
private var lastTask: InventoryTask? = null
private var lastIndex = 35

Expand Down Expand Up @@ -73,7 +73,7 @@ internal object InventorySorter : Module(
}
}

private fun SafeClientEvent.runSorting(itemArray: Array<Item>) {
private fun SafeClientEvent.runSorting(itemArray: Array<Kit.ItemEntry>) {
val slots = mutableListOf<Slot>()
player.inventorySlots.filterNotTo(slots) { checkSet.contains(it.slotNumber - 9) }

Expand All @@ -82,13 +82,15 @@ internal object InventorySorter : Module(
if (checkSet.contains(index)) continue

val targetItem = itemArray[index]
if (targetItem == Items.AIR) continue
if (targetItem.item == Items.AIR) continue
val slotTo = slots[index]
val stackTo = slotTo.stack

val slot = if (stackTo.item != targetItem) {
val slot = if (!targetItem.equals(stackTo)) {
slots.find {
it.slotNumber != slotTo.slotNumber && it.stack.item == targetItem
it.slotNumber != slotTo.slotNumber && targetItem.equals(it.stack)
} ?: slots.find {
it.slotNumber != slotTo.slotNumber && targetItem.item == it.stack.item
}
} else {
slots.getMaxCompatibleStack(slotTo, targetItem)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import dev.luna5ama.trollhack.module.Category
import dev.luna5ama.trollhack.module.Module
import dev.luna5ama.trollhack.setting.settings.impl.collection.MapSetting
import dev.luna5ama.trollhack.util.BOOLEAN_SUPPLIER_FALSE
import dev.luna5ama.trollhack.util.inventory.regName
import net.minecraft.init.Items
import net.minecraft.item.Item
import net.minecraft.item.ItemStack
import java.util.*

internal object Kit : Module(
Expand All @@ -18,13 +20,51 @@ internal object Kit : Module(
val kitMap = setting(MapSetting("Kit", TreeMap<String, List<String>>(), BOOLEAN_SUPPLIER_FALSE))
var kitName by setting("Kit Name", "None")

fun getKitItemArray(): Array<Item>? {
fun getKitItemArray(): Array<ItemEntry>? {
val stringArray = kitMap.value[kitName.lowercase()] ?: return null

return Array(36) { index ->
stringArray.getOrNull(index)?.let {
Item.getByNameOrId(it)
} ?: Items.AIR
stringArray.getOrNull(index)?.let { ItemEntry.fromString(it) } ?: ItemEntry.EMPTY
}
}

data class ItemEntry(val item: Item, val name: String?) {
override fun toString(): String {
return "${item.regName} $name"
}

override fun equals(other: Any?): Boolean {
if (this === other) return true

return when (other) {
is ItemEntry -> item == other.item && (name == null || name == other.name)
is ItemStack -> item == other.item && (name == null || name == other.displayName)
is Item -> item == other
else -> false
}
}

override fun hashCode(): Int {
var result = item.hashCode()
result = 31 * result + (name?.hashCode() ?: 0)
return result
}

companion object {
@JvmField
val EMPTY = ItemEntry(Items.AIR, null)

fun fromString(string: String): ItemEntry {
val index = string.indexOf(' ')
val itemRegName = string.substring(0, if (index == -1) string.length else index)
val item = Item.getByNameOrId(itemRegName) ?: Items.AIR
val name = if (index == -1) null else string.substring(index + 1)
return ItemEntry(item, name)
}

fun fromStack(stack: ItemStack): ItemEntry {
return ItemEntry(stack.item, stack.displayName)
}
}
}
}
6 changes: 6 additions & 0 deletions src/main/kotlin/dev/luna5ama/trollhack/util/inventory/Item.kt
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ val Item.baseAttackDamage
else -> 1.0f
}

val Item.regName: String
get() = this.registryName?.toString() ?: "minecraft:air"

val ItemStack.regName: String
get() = this.item.regName

val ItemStack.durability: Int
get() = this.maxDamage - this.itemDamage

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.luna5ama.trollhack.util.inventory.slot

import dev.luna5ama.trollhack.module.modules.player.Kit
import dev.luna5ama.trollhack.util.inventory.id
import net.minecraft.block.Block
import net.minecraft.inventory.Slot
Expand Down Expand Up @@ -173,6 +174,39 @@ fun Iterable<Slot>.getMaxCompatibleStack(slotTo: Slot): Slot? {
return getMaxCompatibleStack(slotTo, slotTo.stack.item)
}

internal fun Iterable<Slot>.getMaxCompatibleStack(slotTo: Slot, targetItem: Kit.ItemEntry): Slot? {
var maxSlot: Slot? = null
var maxSize = 0

val stackTo = slotTo.stack
val isEmpty = stackTo.isEmpty
val neededSize = if (isEmpty) 64 else stackTo.maxStackSize - stackTo.count
if (neededSize <= 0) return null

for (slotFrom in this) {
if (slotFrom.slotNumber == slotTo.slotNumber) continue

val stackFrom = slotFrom.stack
if (!targetItem.equals(stackFrom)) continue

val size = stackFrom.count
if (!isEmpty && targetItem.equals(stackFrom)) {
if (!stackTo.isItemEqual(stackFrom)) continue
if (!ItemStack.areItemStackTagsEqual(stackTo, stackFrom)) continue
if (size == neededSize) return slotFrom
}

if (size == stackFrom.maxStackSize) {
return slotFrom
} else if (size > maxSize) {
maxSlot = slotFrom
maxSize = size
}
}

return maxSlot ?: getMaxCompatibleStack(slotTo, targetItem.item)
}

fun Iterable<Slot>.getMaxCompatibleStack(slotTo: Slot, targetItem: Item): Slot? {
var maxSlot: Slot? = null
var maxSize = 0
Expand Down

0 comments on commit 69b51b3

Please sign in to comment.