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

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

Exception_Prototype

Активный участник
Пользователь
Баллы
96
Средствами Java требуется заспавнить жителя в n-ом месте.
Требуется (по возможности) дать ему нужное имя и (обязательно) указать какой товар и за какую цену он будет продавать.
 
Покапайся в исходниках bedwars-rel. Там есть это.
Или поковыряй исходники/используй api https://github.com/Cybermaxke/MerchantsAPI/wiki
Спасибо за подсказку, обязательно гляну и bedwars-rel и API этот .
Покапайся в исходниках bedwars-rel. Там есть это.
Или поковыряй исходники/используй api https://github.com/Cybermaxke/MerchantsAPI/wiki
Что странные вещи творятся.
Ошибку в консоли бьёт, мол файл не найден. http://joxi.ru/DmBDB6YfNG0bXA
Вот сам .jar файл, путь есть, файл есть, только странная надпись, что класс не имеет главного класса. http://joxi.ru/Q2K79OZs9KNDO2 http://joxi.ru/KAx9lykC4N3ypr
Не знаете, в чём может быть проблема?
 
Последнее редактирование:
Скорее всего этот API нужно добавлять в сам плагин.
Либо попрбуй добавить этот api в папку plugins на сервере.
 
https://github.com/Howaner/FakeMobs/tree/master/src/main/java/de/howaner/FakeMobs/merchant

Здесь есть что-то похожее.
Скорее всего этот API нужно добавлять в сам плагин.
Либо попрбуй добавить этот api в папку plugins на сервере.
Если api включить в плагин, и кинуть в плагины, будет кидать ошибку.
 
Java:
    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));
                            }
                        }
                    }
                }
            }
        }
      
    }
Не тестил
 
Java:
    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));
                            }
                        }
                    }
                }
            }
        }
     
    }
Не тестил
:eek: А зачем люди придумали оператор "И"?
 
if{}(if{}(if{}(if{}(if{}()))))
Обожаю лесенки. Лови пару неплохих вариантов. Выбирай любой.
Java:
@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. Лично мне нравится второй, но он не во всех случаях удобен.
Даже с && была бы такая каша. Там больно много проверок.
Выше привёл два варианта. Не такая уж и каша вроде...
 
В меру лесенок, вызовов методов и читаемости кода.
Java:
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));
   }
}
 
Последнее редактирование:
В меру лесенок, вызовов методов и читаемости кода.
Java:
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));
   }
}
Разве нельзя сразу энтити на тип проверить? e.getRightClicked().getType() ?
 
Разве нельзя сразу энтити на тип проверить? e.getRightClicked().getType() ?
+
К тому же instanceof очень медленный и рекомендуется к использованию только где без его никак
И ещё очень давно не видел выражений типа if (var == false),разве не проще для понимания if (!var)
 
Последнее редактирование:
Разве нельзя сразу энтити на тип проверить? e.getRightClicked().getType() ?
Сократил два вызова event.getRightClicked(); одним.
Конечно, с одной стороны это всего лишь геттер, но имеется объективная привычка представлять каждый вызываемый метод очень медленным.
К тому же instanceof очень медленный и рекомендуется к использованию только где без его никак
Медленнее, чем player.hasPermission (если я правильно себе представляю, он реализован поиском по hashmap-у)? Или медленнее, чем получение локации, её мира и её координат? С чем его предлагаешь поменять?
P.S. Не сказать, чтобы я прям эксперт в этой области, но сходу нагуглилась темка с обсуждением и сравнением скоростей instanceof и других подходов (следует прочитать несколько ответов, хотя бы до середины темы). Общий вывод — как минимум в последних версиях JVM нихрена он не медленный.
Разве не проще для понимания if (!var)
Если !var, то проще, а если !loc.getWorld().getName().equalsIgnoreCase("world"), то уже не настолько. Восклицательный знак визуально теряется в символах.
 
Последнее редактирование:
Обожаю лесенки. Лови пару неплохих вариантов. Выбирай любой.
Java:
@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. Лично мне нравится второй, но он не во всех случаях удобен.

Выше привёл два варианта. Не такая уж и каша вроде...
Насколько я помню, локации можно проверять через equals.
if (location.equals(location_2) {
 
Медленнее, чем player.hasPermission (если я правильно себе представляю, он реализован поиском по hashmap-у)? Или медленнее, чем получение локации, её мира и её координат? С чем его предлагаешь поменять?
P.S. Не сказать, чтобы я прям эксперт в этой области, но сходу нагуглилась темка с обсуждением и сравнением скоростей instanceof и других подходов (следует прочитать несколько ответов, хотя бы до середины темы). Общий вывод — как минимум в последних версиях JVM нихрена он не медленный.
Возможно я обладаю устаревшей информацией об instanceof, но в любом случае тут он совершенно не нужен, т.к. можно проверить Entity на тип не проверяя является ли он LivingEntity. Ибо метод Entity#getType() наследуется.

Я бы сделал как-то так:
Java:
if(event.getRightClicked().getType() != EntityType.VILLAGER)
   return;
LivingEntity entity = (LivingEntity) event.getRightClicked();

Если !var, то проще, а если !loc.getWorld().getName().equalsIgnoreCase("world"), то уже не настолько. Восклицательный знак визуально теряется в символах.
ИМХО, оба случая просты для понимания. Но тут уж дело каждого как писать.
Насколько я помню, локации можно проверять через equals.
if (location.equals(location_2) {
В принципе должно сработать, если существо не может поворачиваться в разные стороны
 
Последнее редактирование:
Возможно я обладаю устаревшей информацией об instanceof, но в любом случае тут он совершенно не нужен, т.к. можно проверить Entity на тип не проверяя является ли он LivingEntity. Ибо метод Entity#getType() наследуется.

Я бы сделал как-то так:
Java:
if(event.getRightClicked().getType() != EntityType.VILLAGER)
   return;
LivingEntity entity = (LivingEntity) event.getRightClicked();


ИМХО, оба случая просты для понимания. Но тут уж дело каждого как писать.

В принципе должно сработать, если существо не может поворачиваться в разные стороны
Можно создать локации без указания yaw и pitch.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх