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

Статус
Закрыто для дальнейших ответов.

Denisska008

Активный участник
Баллы
61
Имя в Minecraft
Denisska008
Видел подобные темы на баките, но это не совсем то что мне нужно. Мне нужен некий скрипт который будет забирать у игрока из инвентаря определенное количество предметов не в зависимости от их расположения в инвентаре и количества в слоте.
Пример: "После выполнения команды у игрока забирается из инвентаря допустим 4 стака дубовых досок."
Готов заплатить небольшую сумму за помощь.
 
player.getInventory().removeItem(Material.STONE, 2);
 
Тут одна строчка, сколько ты платить собрался?)
 
Если лениво, по сути можешь просто скопировать код из самого крафтбаккита, только заменить там first(item, false) на first(item.getType()) и убрать мапу. Плюс немного адаптировать, если ты хочешь просто принимать в метод инвентарь, материал и количество.
В идеале, ради великой и ужасной микрооптимизации, убрать метод first оттуда и перебирать инвентарь самому, ибо каждый раз этот метод ищет предметы с нуля. Комментарий "TODO: optimization" там стоит с самого введения метода, января 2011 года...
 
Ну, как то так.
Код:
    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 это моя проверка по разным критериям. Напишешь там свою проверку по материалу.
 
Ну, как то так.
Код:
    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 это моя проверка по разным критериям. Напишешь там свою проверку по материалу.

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