продажи предметов

Spokers

Пользователь
Сообщения
70
Решения
1
1) При пкм по табличке продаются блоки которые расположены в слотах быстрого действия, я не понимаю как сделать чтобы при пкм исчезли все блоки которые есть в инвентаре и остались инструменты.
2)Spigot 1.8
3)
Java:
        if (e.getClickedBlock().getState() instanceof Sign) {
            ItemStack air = new ItemStack(Material.AIR);
            double summary = .0;
            Inventory playerInventory = p.getInventory();
            for (int i = 0; i < 36; i++) {
                ItemStack item = playerInventory.getItem(i);
                if (Objects.nonNull(item)) {
                    if(p.getItemInHand().getType().equals(Material.SAND)||p.getItemInHand().getType().equals(Material.DIRT)) {
                    summary += 0.02 * item.getAmount();
                    playerInventory.setItem(i, air);
                    p.updateInventory();
                    }
                    else if(p.getItemInHand().getType().equals(Material.GRAVEL)||p.getItemInHand().getType().equals(Material.LAPIS_BLOCK)||p.getItemInHand().getType().equals(Material.ENDER_STONE)) {
                        summary += 0.03 * item.getAmount();
                        playerInventory.setItem(i, air);
                        p.updateInventory();
                    }
                    
                }
            }
 
Решение

Java:
float sum = 0.0F;
for (ItemStack item : playerInv) {
    if (item.getType().isBlock()) {
        //делаем что-либо с этим чертовым блоком
       sum+=2.5F;
    }
}
player.sendMessage("Нефига себя! Вы заработали целых "+sum);

Если у тебя есть определенные разрешенные блоки, то делаем так:
Java:
List<Material> allowedBlocks = new ArrayList<>();
static {
    allowedBlocks.add(Material.DIRT);  //это пример, список наполняй как хочешь, лучше не в статическом блоке
}

onClickedSing(PlayerInteractEvent e) {
    //...
        if (allowedBlocks.contains(item.getType())) {
            //что-то делаем
        }
    //...
}
playerInventory.setItem(i, air);
лучше использовать player.getInventory().removeItem(item)
Сделай обратную проверку в цикле for. То есть если предмет равен инструменту (придётся перечислить все инструменты, но это лучше, чем перечислять все блоки) то предмет игнорируется. Чтобы все предметы кроме инструментов продавались
Объединено

Java:
for (ItemStack item : инвентарь) {
    if (item.getType().equals(Material.IRON_SWORD)) return;
    playerInventory.removeItem(item);
    //забирает все предметы, кроме железных мечей
}
//можно, конечно, выделить именно блоки. тогда подойдёт массив
Material[] block = {Material.SAND, Material.DIRT}
for (ItemStack item : инвентарь) {
    for (ItemStack i : block) {
        if (item.getType().equals(i)) {
            //твой код
        }
    }
}
 
Последнее редактирование:
лучше использовать player.getInventory().removeItem(item)
Сделай обратную проверку в цикле for. То есть если предмет равен инструменту (придётся перечислить все инструменты, но это лучше, чем перечислять все блоки) то предмет игнорируется. Чтобы все предметы кроме инструментов продавались
Объединено

Java:
for (ItemStack item : инвентарь) {
    if (item.getType().equals(Material.IRON_SWORD)) return;
    playerInventory.removeItem(item);
    //забирает все предметы, кроме железных мечей
}
//можно, конечно, выделить именно блоки. тогда подойдёт массив
Material[] block = {Material.SAND, Material.DIRT}
for (ItemStack item : инвентарь) {
    for (ItemStack i : block) {
        if (item.getType().equals(i)) {
            //твой код
        }
    }
}
При первой продаже всё ок но если продать повторно то ничего не будет
 
Java:
            Inventory playerInv = p.getInventory();
            double summary = 0.0;
            double inb = pl.getDouble("users."+p.getName()+".balance");
            for (ItemStack item : playerInv) {
                if (item.getType().equals(Material.IRON_SWORD)) return;
                playerInv.removeItem(item);
                //забирает все предметы, кроме железных мечей
            }
            //можно, конечно, выделить именно блоки. тогда подойдёт массив
            Material[] block = {Material.SAND, Material.DIRT};
            for (ItemStack item : playerInv) {
                for (Material i : block) {
                    if (item.getType().equals(i)) {
                       p.sendMessage("Понимаю..");
                    }
                }
            }
 
[OFFTOPIC]Зачем ты используешь оба варианта одновременно?..[/OFFTOPIC]
Тк это цикл при каждой новой проверки новое сообщение о продаже использовал первый вариант твоего кода
Объединено

Тебе нужны именно ВСЕ блоки в инвентаре, верно? Или определенные блоки?
Объединено

В любом случае, есть такая вещь как Material#isBlock.
все
 
Java:
HashMap<Player, Boolean> check = new HashMap<Player, Integer>
check.put(player, 0)
for (ItemStack item : playerInv) {
    if (item.getType().equals(Material.IRON_SWORD)) return;
    playerInv.removeItem(item);
    check.put(player, 1)
}
if (check.get(player)) p.sendMessage(msg)
Так и так не работает
 

Java:
float sum = 0.0F;
for (ItemStack item : playerInv) {
    if (item.getType().isBlock()) {
        //делаем что-либо с этим чертовым блоком
       sum+=2.5F;
    }
}
player.sendMessage("Нефига себя! Вы заработали целых "+sum);

Если у тебя есть определенные разрешенные блоки, то делаем так:
Java:
List<Material> allowedBlocks = new ArrayList<>();
static {
    allowedBlocks.add(Material.DIRT);  //это пример, список наполняй как хочешь, лучше не в статическом блоке
}

onClickedSing(PlayerInteractEvent e) {
    //...
        if (allowedBlocks.contains(item.getType())) {
            //что-то делаем
        }
    //...
}
 
Назад
Сверху Снизу