Помогите Убрать предмет из инвентаря и про координаты

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

IcedwinterZ

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
IcedwinterZ
Мне нужно убрать N кол-во предметов, из инвентаря игрока, и если предметы есть, то возвращать true, соответственно, если нет - false, это как должно собственно работать.
Как это работает у меня:
Предметы есть, шлет нах*й, нет - шлет на*уй. Происходит это так, он парсит, до того слота, пока не появится этот предмет, дальше, если его не хватает в этом слоте, я иду.... но при этом, куча таких предметов есть в след. слотах, кто знает, как это реализовать, кто так делал поделитесь решением.

Но это еще не все, есть еще одна проблема, не такая жирная, но все же,
мне нужно получить кординату за спиной игрока. Как я это хочу сделать (но меня это не устраивает):
Получать направление взгляда игрока, отнимать соответствующие кординаты... Дело в том, что в виде кода, это получается жирно, по крайней мере у меня.
Как решать эту проблему? Есть решения лучше, или делать так как написано выше?
 
Java:
/**
    * Удалит из инвентаря игрока нужное кол-во указанных вещей и вернет true если вещей хватило
    * Если вещей недостаточно то вернет false  удаление не будет произведено
    * @param p Игрок
    * @param amm Кол-во
    * @param item Вещь
    * @return
    */
    public static boolean sellItem(Player p, int amm, ItemStack item) {
        int totalamm = 0; //общее количество вещей в инвентаре
        for (int a = 0; a<p.getInventory().getSize(); a++) { //считаем эти вещи
            if (p.getInventory().getItem(a)!=null){
                /*весь ItemStack можно описать тремя параметрами. item.getData, item.getItemMeta и item.getAmmaount.
                *При item.equas(item2)ammount тоже сравнивается, поэтому видим такое сравнение
                */
                if (p.getInventory().getItem(a).getData().equals(item.getData())
                        &&p.getInventory().getItem(a).getItemMeta().equals(item.getItemMeta())){
                    totalamm += p.getInventory().getItem(a).getAmount();
                }
            }
        }
        if (totalamm==0) {
            return false;
        }
        if (totalamm<amm) {
            return false;
        }
        int ammountleft =amm; //эта переменная не очень нужна, но мне с ней удобнее
        for (int a = 0; a<p.getInventory().getSize(); a++) {
            if (ammountleft==0){return true;}
            if (p.getInventory().getItem(a)==null) continue;
            if (p.getInventory().getItem(a).getData().equals(item.getData())&&p.getInventory().getItem(a).getItemMeta().equals(item.getItemMeta())) {
                if (p.getInventory().getItem(a).getAmount()<ammountleft) {
                    ammountleft-=p.getInventory().getItem(a).getAmount();
                    p.getInventory().setItem(a, new ItemStack(Material.AIR));
                }
                if (p.getInventory().getItem(a)!=null&&p.getInventory().getItem(a).getAmount()==ammountleft) {
                    p.getInventory().setItem(a, new ItemStack(Material.AIR));
                    return true;
                }
             
                if (p.getInventory().getItem(a).getAmount()>ammountleft&&p.getInventory().getItem(a)!=null) {
                    p.getInventory().getItem(a).setAmount(p.getInventory().getItem(a).getAmount()-ammountleft);
                    return true;
                }
            }
        }
        return false;
    }

Код взял из своего плагина на магазин, и немного переделал, так что за работоспособность не отвечаю. если что подправишь, надеюсь поймешь где что и как
 
Java:
/**
    * Удалит из инвентаря игрока нужное кол-во указанных вещей и вернет true если вещей хватило
    * Если вещей недостаточно то вернет false  удаление не будет произведено
    * @param p Игрок
    * @param amm Кол-во
    * @param item Вещь
    * @return
    */
    public static boolean sellItem(Player p, int amm, ItemStack item) {
        int totalamm = 0; //общее количество вещей в инвентаре
        for (int a = 0; a<p.getInventory().getSize(); a++) { //считаем эти вещи
            if (p.getInventory().getItem(a)!=null){
                /*весь ItemStack можно описать тремя параметрами. item.getData, item.getItemMeta и item.getAmmaount.
                *При item.equas(item2)ammount тоже сравнивается, поэтому видим такое сравнение
                */
                if (p.getInventory().getItem(a).getData().equals(item.getData())
                        &&p.getInventory().getItem(a).getItemMeta().equals(item.getItemMeta())){
                    totalamm += p.getInventory().getItem(a).getAmount();
                }
            }
        }
        if (totalamm==0) {
            return false;
        }
        if (totalamm<amm) {
            return false;
        }
        int ammountleft =amm; //эта переменная не очень нужна, но мне с ней удобнее
        for (int a = 0; a<p.getInventory().getSize(); a++) {
            if (ammountleft==0){return true;}
            if (p.getInventory().getItem(a)==null) continue;
            if (p.getInventory().getItem(a).getData().equals(item.getData())&&p.getInventory().getItem(a).getItemMeta().equals(item.getItemMeta())) {
                if (p.getInventory().getItem(a).getAmount()<ammountleft) {
                    ammountleft-=p.getInventory().getItem(a).getAmount();
                    p.getInventory().setItem(a, new ItemStack(Material.AIR));
                }
                if (p.getInventory().getItem(a)!=null&&p.getInventory().getItem(a).getAmount()==ammountleft) {
                    p.getInventory().setItem(a, new ItemStack(Material.AIR));
                    return true;
                }
            
                if (p.getInventory().getItem(a).getAmount()>ammountleft&&p.getInventory().getItem(a)!=null) {
                    p.getInventory().getItem(a).setAmount(p.getInventory().getItem(a).getAmount()-ammountleft);
                    return true;
                }
            }
        }
        return false;
    }

Код взял из своего плагина на магазин, и немного переделал, так что за работоспособность не отвечаю. если что подправишь, надеюсь поймешь где что и как
Спасибо, честное слово, слушай, такой вопрос, а LivingEntity может быть плеером?
 
Java:
/**
    * Удалит из инвентаря игрока нужное кол-во указанных вещей и вернет true если вещей хватило
    * Если вещей недостаточно то вернет false  удаление не будет произведено
    * @param p Игрок
    * @param amm Кол-во
    * @param item Вещь
    * @return
    */
    public static boolean sellItem(Player p, int amm, ItemStack item) {
        int totalamm = 0; //общее количество вещей в инвентаре
        for (int a = 0; a<p.getInventory().getSize(); a++) { //считаем эти вещи
            if (p.getInventory().getItem(a)!=null){
                /*весь ItemStack можно описать тремя параметрами. item.getData, item.getItemMeta и item.getAmmaount.
                *При item.equas(item2)ammount тоже сравнивается, поэтому видим такое сравнение
                */
                if (p.getInventory().getItem(a).getData().equals(item.getData())
                        &&p.getInventory().getItem(a).getItemMeta().equals(item.getItemMeta())){
                    totalamm += p.getInventory().getItem(a).getAmount();
                }
            }
        }
        if (totalamm==0) {
            return false;
        }
        if (totalamm<amm) {
            return false;
        }
        int ammountleft =amm; //эта переменная не очень нужна, но мне с ней удобнее
        for (int a = 0; a<p.getInventory().getSize(); a++) {
            if (ammountleft==0){return true;}
            if (p.getInventory().getItem(a)==null) continue;
            if (p.getInventory().getItem(a).getData().equals(item.getData())&&p.getInventory().getItem(a).getItemMeta().equals(item.getItemMeta())) {
                if (p.getInventory().getItem(a).getAmount()<ammountleft) {
                    ammountleft-=p.getInventory().getItem(a).getAmount();
                    p.getInventory().setItem(a, new ItemStack(Material.AIR));
                }
                if (p.getInventory().getItem(a)!=null&&p.getInventory().getItem(a).getAmount()==ammountleft) {
                    p.getInventory().setItem(a, new ItemStack(Material.AIR));
                    return true;
                }
            
                if (p.getInventory().getItem(a).getAmount()>ammountleft&&p.getInventory().getItem(a)!=null) {
                    p.getInventory().getItem(a).setAmount(p.getInventory().getItem(a).getAmount()-ammountleft);
                    return true;
                }
            }
        }
        return false;
    }

Код взял из своего плагина на магазин, и немного переделал, так что за работоспособность не отвечаю. если что подправишь, надеюсь поймешь где что и как
ItemStack всегда не нулл
 
ItemStack всегда не нулл
поверь мне когда inventory.getItem(int) он null может быть очень много раз. я лично проверял. и npe лично ловил когда проверял по getType()==AIR
Спасибо, честное слово, слушай, такой вопрос, а LivingEntity может быть плеером?

Куски исходников. Делай выводы
Java:
public interface Player extends HumanEntity, Conversable, CommandSender, OfflinePlayer, PluginMessageRecipient

Java:
public interface HumanEntity extends LivingEntity, AnimalTamer, Permissible, InventoryHolder

мне нужно получить кординату за спиной игрока
Java:
private Location getBehindLoc(Player p){
        /*
        * Подключаю стандартную тригонометрию
        */
        double y = p.getLocation().getPitch()*Math.PI/180*-1; 
        double xz = (p.getLocation().getYaw()+90)*Math.PI/180;
       
        /*
        * Расчет локации сзади игрока.
        * Общее смещение (т.е. суммарное расстояние смещения) = 1 блок.
        * Если необходимо смещение не на 1 блок а на другое число,
        * то нужно умножать вычитаемое на необходимое смещение 
        */
        double newY = p.getLocation().getY()-Math.sin(y);
        double newX = p.getLocation().getX()-Math.cos(y)*Math.cos(xz);
        double newZ = p.getLocation().getZ()-Math.cos(y)*Math.sin(xz);
        Location behindLoc = new Location(p.getLocation().getWorld(), newX, newY, newZ);
        return behindLoc;
    }
 
поверь мне когда inventory.getItem(int) он null может быть очень много раз. я лично проверял. и npe лично ловил когда проверял по getType()==AIR


Куски исходников. Делай выводы
Java:
public interface Player extends HumanEntity, Conversable, CommandSender, OfflinePlayer, PluginMessageRecipient

Java:
public interface HumanEntity extends LivingEntity, AnimalTamer, Permissible, InventoryHolder


Java:
private Location getBehindLoc(Player p){
        /*
        * Подключаю стандартную тригонометрию
        */
        double y = p.getLocation().getPitch()*Math.PI/180*-1;
        double xz = (p.getLocation().getYaw()+90)*Math.PI/180;
      
        /*
        * Расчет локации сзади игрока.
        * Общее смещение (т.е. суммарное расстояние смещения) = 1 блок.
        * Если необходимо смещение не на 1 блок а на другое число,
        * то нужно умножать вычитаемое на необходимое смещение
        */
        double newY = p.getLocation().getY()-Math.sin(y);
        double newX = p.getLocation().getX()-Math.cos(y)*Math.cos(xz);
        double newZ = p.getLocation().getZ()-Math.cos(y)*Math.sin(xz);
        Location behindLoc = new Location(p.getLocation().getWorld(), newX, newY, newZ);
        return behindLoc;
    }
Пля, как тебя благодарить то?
 
Вспомнил про location.addVector
Java:
Location behindLoc = p.getLocation().add(p.getLocation().getDirection().multiply(-1));

Замерил скорости.
С вектором дольше ~ на 5000-7000 наносекунд
(1 миллисекунда = 1000000 наносекунд[вроде])
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх