Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Добавить предмет в инвентарь

fedortik

Активный участник
Пользователь
Баллы
61
Имя в Minecraft
FEDORTIK
Добрый вечер, работяги. Вопрос.
Добавить предмет в инвентарь можно конечно функцией add. Но она не учитывает полноту инвентаря. Конечно можно проверить наличие свободного слота. Но есть ли готовое решение которое так же учитывает, что в инвентаре уже есть предмет этого типа и его amount < 64 ?
Написать свою функцию конечно не сложно, но может есть готовая функция в paper ?
 
Метод additems - это HashMap, проверяешь, если не пустая, то дропаешь рядом или делаешь то что тебе нужно
 
Метод Inventory::addItem возвращает HashMap<Integer, ItemStack> состоящий из предметов которые не поместились в инвентарь

Содержимое HashMap:
Ключ - индекс предмета из массива, переданного в метод addItem
Значение - сам предмет

При попытке выдать большее кол-во предмета, чем может поместиться в инвентарь, будет выдано лишь доступное кол-во предмета, а остаток попадет в результирующий HashMap

Пример обработки на Kotlin в виде простой команды для выдачи предметов самому себе:
Код:
object TestCommand : CommandExecutor {

    override fun onCommand(
        sender: CommandSender,
        command: Command,
        label: String,
        args: Array<out String>
    ): Boolean {

        if (sender !is Player) {
            sender.sendMessage("${ChatColor.RED}Command can only be run by a player")
            return true
        }

        if (args.size < 2) {
            sender.sendMessage("${ChatColor.RED}Use: /$label <material> <amount>")
            return true
        }

        val material = try {
            Material.valueOf(args[0].uppercase())
        } catch (ex: Exception) {
            sender.sendMessage("${ChatColor.RED}Invalid material: ${args[0]}")
            return false
        }

        val amount = args[1]
            .toIntOrNull()
            ?: run {
                sender.sendMessage("${ChatColor.RED}Invalid amount: ${args[1]}")
                return true
            }

        val couldNotFit = sender.inventory.addItem(
            ItemStack(material, amount)
        )

        couldNotFit.forEach { (index, item) ->
            sender.sendMessage("Could not fit item (type=${item.type.name}, amount=${item.amount}) at index $index")
        }

        return true
    }

}
 
Последнее редактирование:
Метод Inventory::addItem возвращает HashMap<Integer, ItemStack> состоящий из предметов которые не поместились в инвентарь

Содержимое HashMap:
Ключ - индекс предмета из массива, переданного в метод addItem
Значение - сам предмет

При попытке выдать большее кол-во предмета, чем может поместиться в инвентарь, будет выдано лишь доступное кол-во предмета, а остаток попадет в результирующий HashMap

Пример обработки на Kotlin в виде простой команды для выдачи предметов самому себе:
Код:
object TestCommand : CommandExecutor {

    override fun onCommand(
        sender: CommandSender,
        command: Command,
        label: String,
        args: Array<out String>
    ): Boolean {

        if (sender !is Player) {
            sender.sendMessage("${ChatColor.RED}Command can only be run by a player")
            return true
        }

        if (args.size < 2) {
            sender.sendMessage("${ChatColor.RED}Use: /$label <material> <amount>")
            return true
        }

        val material = try {
            Material.valueOf(args[0].uppercase())
        } catch (ex: Exception) {
            sender.sendMessage("${ChatColor.RED}Invalid material: ${args[0]}")
            return false
        }

        val amount = args[1]
            .toIntOrNull()
            ?: run {
                sender.sendMessage("${ChatColor.RED}Invalid amount: ${args[1]}")
                return true
            }

        val couldNotFit = sender.inventory.addItem(
            ItemStack(material, amount)
        )

        couldNotFit.forEach { (index, item) ->
            sender.sendMessage("Could not fit item (type=${item.type.name}, amount=${item.amount}) at index $index")
        }

        return true
    }

}
Благодарю за подробное объяснение
 

Поделиться этой страницей

Назад
Верх