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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем IcedwinterZ, 6 фев 2017.

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

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

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

    Но это еще не все, есть еще одна проблема, не такая жирная, но все же,
    мне нужно получить кординату за спиной игрока. Как я это хочу сделать (но меня это не устраивает):
    Получать направление взгляда игрока, отнимать соответствующие кординаты... Дело в том, что в виде кода, это получается жирно, по крайней мере у меня.
    Как решать эту проблему? Есть решения лучше, или делать так как написано выше?
     
  2. xDark

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

    Баллы:
    96
    setAmount?
     
  3. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    ДА ТЫ ШО
     
  4. Blc_Dragon

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

    Баллы:
    76
    Код:
    /**
        * Удалит из инвентаря игрока нужное кол-во указанных вещей и вернет 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;
        }
    Код взял из своего плагина на магазин, и немного переделал, так что за работоспособность не отвечаю. если что подправишь, надеюсь поймешь где что и как
     
  5. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    Спасибо, честное слово, слушай, такой вопрос, а LivingEntity может быть плеером?
     
  6. Mr_RoboMan

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

    Баллы:
    123
    А посмотреть исходник Player.class религия запрещает?
     
  7. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    ДА! Прям черным по белому написано, не лезь туда ;D
     
  8. Mr_RoboMan

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

    Баллы:
    123
    Тогда прям не знаю.. Ну а включить логику, игрок - живой, или же нет?
     
  9. xDark

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

    Баллы:
    96
    ItemStack всегда не нулл
     
  10. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    Даже и не знаю...
     
  11. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooo
    Это в nms не нулл, а в баките еще как нулл.
     
  12. Blc_Dragon

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

    Баллы:
    76
    поверь мне когда inventory.getItem(int) он null может быть очень много раз. я лично проверял. и npe лично ловил когда проверял по getType()==AIR
    Куски исходников. Делай выводы
    Код:
    public interface Player extends HumanEntity, Conversable, CommandSender, OfflinePlayer, PluginMessageRecipient 
    Код:
    public interface HumanEntity extends LivingEntity, AnimalTamer, Permissible, InventoryHolder

    Код:
    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;
        }
     
  13. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    Пля, как тебя благодарить то?
     
  14. Blc_Dragon

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

    Баллы:
    76
    Вспомнил про location.addVector
    Код:
    Location behindLoc = p.getLocation().add(p.getLocation().getDirection().multiply(-1));

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

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