1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Как забрать определенное количество предметов из инвентаря игрока.

Тема в разделе "Разработка плагинов для новичков", создана пользователем Denisska008, 9 мар 2021.

Статус темы:
Закрыта.
  1. Автор темы
    Denisska008

    Denisska008 Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Denisska008
    Видел подобные темы на баките, но это не совсем то что мне нужно. Мне нужен некий скрипт который будет забирать у игрока из инвентаря определенное количество предметов не в зависимости от их расположения в инвентаре и количества в слоте.
    Пример: "После выполнения команды у игрока забирается из инвентаря допустим 4 стака дубовых досок."
    Готов заплатить небольшую сумму за помощь.
     
  2. Sneyzi

    Sneyzi Активный участник Пользователь

    Баллы:
    76
    player.getInventory().removeItem(Material.STONE, 2);
     
  3. Veyn12

    Veyn12 Активный участник Пользователь Заблокирован

    Баллы:
    76
    Имя в Minecraft:
    Veynique
    Тут одна строчка, сколько ты платить собрался?)
     
  4. Автор темы
    Denisska008

    Denisska008 Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Denisska008
    Только толку от этой строчки ноль.
    Метод removeItem содержит в себе только ItemStack, а не Material и int.
     
  5. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Если лениво, по сути можешь просто скопировать код из самого крафтбаккита, только заменить там first(item, false) на first(item.getType()) и убрать мапу. Плюс немного адаптировать, если ты хочешь просто принимать в метод инвентарь, материал и количество.
    В идеале, ради великой и ужасной микрооптимизации, убрать метод first оттуда и перебирать инвентарь самому, ибо каждый раз этот метод ищет предметы с нуля. Комментарий "TODO: optimization" там стоит с самого введения метода, января 2011 года...
     
  6. Sneyzi

    Sneyzi Активный участник Пользователь

    Баллы:
    76
    player.getInventory().removeItem(new ItemStack(Material.STONE, 2));
     
  7. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Оно ж проигнорирует предметы с метой.
     
  8. Sneyzi

    Sneyzi Активный участник Пользователь

    Баллы:
    76
    Тогда так player.getInventory().remove(ItemStack);
     
  9. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    А это просто смотрит на полное соответствие и удаляет всё подходящее.
     
  10. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну, как то так.
    Код:
        public static boolean checkremove(Player p, ItemStack s, int c) {
            if (calc(p, s) >= c) {
                clear(p, s, c);
                return true;
            }
            return false;
        }
    
        public static int calc(Player p, ItemStack s) {
            int count = 0;
            for (int i = 0; i < p.getInventory().getSize(); i++) {
                ItemStack stack = p.getInventory().getItem(i);
                if (stack == null)
                    continue;
                if (Similar.has(stack, s, Similar.name, Similar.material)) {
                    count += stack.getAmount();
                }
            }
            return count;
        }
    
        public static void clear(Player p, ItemStack s, int c) {
            for (int i = 0; i < p.getInventory().getSize(); i++) {
                ItemStack stack = p.getInventory().getItem(i);
                if (stack == null)
                    continue;
                if (Similar.has(stack, s, Similar.name, Similar.material)) {
                    if (stack.getAmount() == 0)
                        break;
                    if (stack.getAmount() <= c) {
                        c = c - stack.getAmount();
                        stack.setAmount(-1);
                    }
                    if (stack.getAmount() > c) {
                        stack.setAmount(stack.getAmount() - c);
                        c = 0;
                    }
                }
            }
        }
    Similar.has это моя проверка по разным критериям. Напишешь там свою проверку по материалу.
     
  11. Автор темы
    Denisska008

    Denisska008 Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Denisska008
    Спасибо тебе добрый человек, если хочешь скинь реквизиты в лс отправлю небольшое вознаграждение.
    Тема закрыта.
     
Статус темы:
Закрыта.

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