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

Помогите [Решено] Как призвать жителя с нужными торговыми принадлежностями?

Тема в разделе "Разработка плагинов для новичков", создана пользователем Exception_Prototype, 22 авг 2016.

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

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

    Баллы:
    46
    Средствами Java требуется заспавнить жителя в n-ом месте.
    Требуется (по возможности) дать ему нужное имя и (обязательно) указать какой товар и за какую цену он будет продавать.
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    up[DOUBLEPOST=1472122660,1472041015][/DOUBLEPOST]ап
     
  4. CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Работа с NBT стоит дорого.
     
  5. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    ууу, страшно звучит. НЕ просветит в двух словах, что это такое и с чем его едят?
     
  6. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Покапайся в исходниках bedwars-rel. Там есть это.[DOUBLEPOST=1472129191,1472129061][/DOUBLEPOST]Или поковыряй исходники/используй api https://github.com/Cybermaxke/MerchantsAPI/wiki
     
  7. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Спасибо за подсказку, обязательно гляну и bedwars-rel и API этот .[DOUBLEPOST=1472143455][/DOUBLEPOST]
    Что странные вещи творятся.
    Ошибку в консоли бьёт, мол файл не найден. http://joxi.ru/DmBDB6YfNG0bXA
    Вот сам .jar файл, путь есть, файл есть, только странная надпись, что класс не имеет главного класса. http://joxi.ru/Q2K79OZs9KNDO2 http://joxi.ru/KAx9lykC4N3ypr
    Не знаете, в чём может быть проблема?
     
    Последнее редактирование: 25 авг 2016
  8. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Скорее всего этот API нужно добавлять в сам плагин.[DOUBLEPOST=1472178657,1472175388][/DOUBLEPOST]Либо попрбуй добавить этот api в папку plugins на сервере.
     
  9. _EnderWorld_

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

    Баллы:
    78
    Имя в Minecraft:
    Steve
    https://github.com/Howaner/FakeMobs/tree/master/src/main/java/de/howaner/FakeMobs/merchant

    Здесь есть что-то похожее.[DOUBLEPOST=1472182871,1472182822][/DOUBLEPOST]
    Если api включить в плагин, и кинуть в плагины, будет кидать ошибку.
     
  10. _Dek_

    _Dek_ Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    NoName
  11. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Код:
        private double x = 1D;
        private double y = 100D;
        private double z = 1D;
      
        public void entity() {
            Location loc = new Location(Bukkit.getWorld("world"), x, y, z);
            LivingEntity  e = (LivingEntity) Bukkit.getWorld("world").spawnEntity(loc, EntityType.VILLAGER);
        }
        @EventHandler
        public void onInteract(PlayerInteractEntityEvent e) {
            Player p = e.getPlayer();
          
            if (!p.hasPermission("villager.interact")) return;
            if (e.getRightClicked() instanceof LivingEntity) {
                LivingEntity en = (LivingEntity) e.getRightClicked();
                if (en.getType() == EntityType.VILLAGER) {
                    if (en.getLocation().getX() == x) {
                        if (en.getLocation().getY() == y) {
                            if (en.getLocation().getZ() == z) {
                                if (en.getLocation().getWorld().getName().equalsIgnoreCase("world")) {
                                    e.setCancelled(true);
                                    Inventory i = Bukkit.createInventory(null, InventoryType.MERCHANT);
                                    i.setItem(0, new ItemStack(Material.APPLE));
                                    i.setItem(1, new ItemStack(Material.STONE));
                                }
                            }
                        }
                    }
                }
            }
          
        }
    Не тестил
     
  12. OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    :eek: А зачем люди придумали оператор "И"?
     
  13. CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Даже с && была бы такая каша. Там больно много проверок.
     
  14. Dymeth

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

    Баллы:
    76
    Обожаю лесенки. Лови пару неплохих вариантов. Выбирай любой.
    Код:
    @EventHandler
    public void onInteract1(PlayerInteractEntityEvent e) {
        Player p = e.getPlayer();
        if (p.hasPermission("villager.interact") &&
                e.getRightClicked() instanceof LivingEntity) {
            LivingEntity en = (LivingEntity) e.getRightClicked();
            if (en.getType() == EntityType.VILLAGER &&
                    en.getLocation().getX() == x &&
                    en.getLocation().getY() == y &&
                    en.getLocation().getZ() == z &&
                    en.getLocation().getWorld().getName().equalsIgnoreCase("world")) {
    
                e.setCancelled(true);
                Inventory i = Bukkit.createInventory(null, InventoryType.MERCHANT);
                i.setItem(0, new ItemStack(Material.APPLE));
                i.setItem(1, new ItemStack(Material.STONE));
            }
        }
    }
    
    @EventHandler
    public void onInteract2(PlayerInteractEntityEvent e) {
        Player p = e.getPlayer();
        if (!p.hasPermission("villager.interact")) return;
        if (!(e.getRightClicked() instanceof LivingEntity)) return;
        LivingEntity en = (LivingEntity) e.getRightClicked();
        if (en.getType() != EntityType.VILLAGER) return;
        if (en.getLocation().getX() != x) return;
        if (en.getLocation().getY() != y) return;
        if (en.getLocation().getZ() != z) return;
        if (!en.getLocation().getWorld().getName().equalsIgnoreCase("world")) return;
    
        e.setCancelled(true);
        Inventory i = Bukkit.createInventory(null, InventoryType.MERCHANT);
        i.setItem(0, new ItemStack(Material.APPLE));
        i.setItem(1, new ItemStack(Material.STONE));
    }
    
    P.S. Лично мне нравится второй, но он не во всех случаях удобен.
    Выше привёл два варианта. Не такая уж и каша вроде...
     
  15. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    В меру лесенок, вызовов методов и читаемости кода.
    Код:
    Entity entity = event.getRightClicked();
    if(entity instanceof LivingEntity == false)
       return;
    LivingEntity en = (LivingEntity)entity;
    if(en.getType() != EntityType.VILLAGER)
       return;
    
    Player player = event.getPlayer();
    if(player.hasPermission("villager.interact"))
    {
       Location loc = en.getLocation();
       if(loc.getWorld().getName().equalsIgnoreCase("world") == false)
          return;
       boolean testx = loc.getX() == x;
       boolean testy = loc.getY() == y;
       boolean testz = loc.getZ() == z;
       if(testx && testy && testz)
       {
          // Placeholder for street magic
          event.setCancelled(true);
          Inventory inv = Bukkit.createInventory(null, InventoryType.MERCHANT);
          inv.setItem(0, new ItemStack(Material.APPLE));
          inv.setItem(1, new ItemStack(Material.STONE));
       }
    }
     
    Последнее редактирование: 6 сен 2016
  16. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Разве нельзя сразу энтити на тип проверить? e.getRightClicked().getType() ?
     
  17. OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    +
    К тому же instanceof очень медленный и рекомендуется к использованию только где без его никак
    И ещё очень давно не видел выражений типа if (var == false),разве не проще для понимания if (!var)
     
    Последнее редактирование: 6 сен 2016
  18. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Сократил два вызова event.getRightClicked(); одним.
    Конечно, с одной стороны это всего лишь геттер, но имеется объективная привычка представлять каждый вызываемый метод очень медленным.
    Медленнее, чем player.hasPermission (если я правильно себе представляю, он реализован поиском по hashmap-у)? Или медленнее, чем получение локации, её мира и её координат? С чем его предлагаешь поменять?
    P.S. Не сказать, чтобы я прям эксперт в этой области, но сходу нагуглилась темка с обсуждением и сравнением скоростей instanceof и других подходов (следует прочитать несколько ответов, хотя бы до середины темы). Общий вывод — как минимум в последних версиях JVM нихрена он не медленный.
    Если !var, то проще, а если !loc.getWorld().getName().equalsIgnoreCase("world"), то уже не настолько. Восклицательный знак визуально теряется в символах.
     
    Последнее редактирование: 6 сен 2016
  19. CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Насколько я помню, локации можно проверять через equals.
    if (location.equals(location_2) {
     
  20. OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Возможно я обладаю устаревшей информацией об instanceof, но в любом случае тут он совершенно не нужен, т.к. можно проверить Entity на тип не проверяя является ли он LivingEntity. Ибо метод Entity#getType() наследуется.

    Я бы сделал как-то так:
    Код:
    if(event.getRightClicked().getType() != EntityType.VILLAGER)
       return;
    LivingEntity entity = (LivingEntity) event.getRightClicked();
    [DOUBLEPOST=1473143130,1473142939][/DOUBLEPOST]
    ИМХО, оба случая просты для понимания. Но тут уж дело каждого как писать.[DOUBLEPOST=1473144321][/DOUBLEPOST]
    В принципе должно сработать, если существо не может поворачиваться в разные стороны
     
    Последнее редактирование: 6 сен 2016
  21. CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Можно создать локации без указания yaw и pitch.
     
Статус темы:
Закрыта.

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