Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Разработка плагинов для новичков' started by IcedwinterZ, Feb 6, 2017.

Thread Status:
Not open for further replies.
  1. Автор темы
    IcedwinterZ

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

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

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

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

    Trophy Points:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    setAmount?
     
  4. Автор темы
    IcedwinterZ

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

    Trophy Points:
    76
    Имя в Minecraft:
    IcedwinterZ
    ДА ТЫ ШО
     
  5. Blc_Dragon

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

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    ItemStack всегда не нулл
     
  11. Автор темы
    IcedwinterZ

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

    Trophy Points:
    76
    Имя в Minecraft:
    IcedwinterZ
    Даже и не знаю...
     
  12. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Это в nms не нулл, а в баките еще как нулл.
     
  13. Blc_Dragon

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

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    поверь мне когда inventory.getItem(int) он null может быть очень много раз. я лично проверял. и npe лично ловил когда проверял по getType()==AIR[DOUBLEPOST=1486395539,1486395382][/DOUBLEPOST]
    Куски исходников. Делай выводы
    Code:
    public interface Player extends HumanEntity, Conversable, CommandSender, OfflinePlayer, PluginMessageRecipient 
    Code:
    public interface HumanEntity extends LivingEntity, AnimalTamer, Permissible, InventoryHolder
    [DOUBLEPOST=1486395938][/DOUBLEPOST]
    Code:
    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;
        }
     
  14. Автор темы
    IcedwinterZ

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

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

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

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    Вспомнил про location.addVector
    Code:
    Location behindLoc = p.getLocation().add(p.getLocation().getDirection().multiply(-1));
    [DOUBLEPOST=1486397757,1486397311][/DOUBLEPOST]Замерил скорости.
    С вектором дольше ~ на 5000-7000 наносекунд
    (1 миллисекунда = 1000000 наносекунд[вроде])
     
Thread Status:
Not open for further replies.

Share This Page