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

Статус
Закрыто для дальнейших ответов.
А будет ли такая локация эквивалентна локации с указанными yaw и pitch?
Не тестировал, если честно.
hashCode формируется по данным класса, соответственно если yaw и pitch первой локации не равен yaw и pitch второй локации, то hashCode локаций будет разный. Соответственно, location.equals(location_1) вернёт false.
 
Последнее редактирование:
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));
                            }
                        }
                    }
                }
            }
        }
  
    }
Не тестил
Эта проверка бессмысленная, энтити не блок и имеет свойство двигаться - ходить.
У энтити есть UUIDLeast UUIDMost, которые и делают его уникальным для проверки.
 
Последнее редактирование:
Не тестировал, если честно.
hashCode формируется по данным класса, соответственно если yaw и pitch первый локации не равен yaw и pitch второй локации, то hashCode локаций будет разный. Соответственно, location.equals(location_1) вернёт false.
Да, но ведь метод equals() может быть переопределен, хотя в случае с Location я этого не наблюдаю
 
Насколько я помню, локации можно проверять через equals.
if (location.equals(location_2) {
Я в коде вообще не разбирался. Я вообще не знаю, чем вы тут занимаетесь.
Могу лишь сказать, что Location.equls(Location) проверит вдобавок ещё и мир с yaw и pitch, что, возможно, и не нужно в данном случае...
 
Я в коде вообще не разбирался. Я вообще не знаю, чем вы тут занимаетесь.
Могу лишь сказать, что Location.equls(Location) проверит вдобавок ещё и мир с yaw и pitch, что, возможно, и не нужно в данном случае...
Уже писал в данной теме, что можно создать новый "Location" не указывая при этом yaw и pitch.
 
Уже писал в данной теме, что можно создать новый "Location" не указывая при этом yaw и pitch.
Я ж говорю, я в тред и код вообще не вникал.
Да, но ведь метод equals() может быть переопределен, хотя в случае с Location я этого не наблюдаю
upload_2016-9-7_5-30-49.png
UPD: Чуток почитал, что вы тут обсуждаете...
А будет ли такая локация эквивалентна локации с указанными yaw и pitch?
В этом случае yaw и pitch присваиваются нулевые значения. Соответственно если житель, на которого кликнули, не будет повёрнут, то Location.equals(Location) вернёт true.
 
Я ж говорю, я в тред и код вообще не вникал.

Посмотреть вложение 42946
UPD: Чуток почитал, что вы тут обсуждаете...

В этом случае yaw и pitch присваиваются нулевые значения. Соответственно если житель, на которого кликнули, не будет повёрнут, то Location.equals(Location) вернёт true.
Вся эта хрень сдохнет, если моб ходит. Вот так нужно искать своего неписа в мире.

Java:
    @EventHandler
    public void onPlayerInteract(PlayerInteractEntityEvent e) {
        CraftEntity ent = (CraftEntity) e.getRightClicked();
        NBTTagCompound nbt = new NBTTagCompound();
        String UUIDMost = ent.getHandle().e(nbt).get("UUIDMost").toString();
        String UUIDLeast = ent.getHandle().e(nbt).get("UUIDLeast").toString();
        if(UUIDMost.equals("3005458539731698347L") && UUIDLeast.equals("-6317738198714295249L")) {
            e.getPlayer().sendMessage("Это наш моб");
        } else {
            e.getPlayer().sendMessage("Это не наш бом");
        }
    }
 
Вся эта хрень сдохнет, если моб ходит. Вот так нужно искать своего неписа в мире.

Java:
    @EventHandler
    public void onPlayerInteract(PlayerInteractEntityEvent e) {
        CraftEntity ent = (CraftEntity) e.getRightClicked();
        NBTTagCompound nbt = new NBTTagCompound();
        String UUIDMost = ent.getHandle().e(nbt).get("UUIDMost").toString();
        String UUIDLeast = ent.getHandle().e(nbt).get("UUIDLeast").toString();
        if(UUIDMost.equals("3005458539731698347L") && UUIDLeast.equals("-6317738198714295249L")) {
            e.getPlayer().sendMessage("Это наш моб");
        } else {
            e.getPlayer().sendMessage("Это не наш бом");
        }
    }
NMS. Это не лучшее решение.
 
NMS. Это не лучшее решение.
Но единственное. Так нам без разницы где гуляет наш непис, мы его везде найдем.
Никто ж не виноват, что в ведре не реализован показ уидов.
Ну есть вариант с именем неписа, но это не самое уникальное значение.
Java:
    @EventHandler
    public void onPlayerInteract(PlayerInteractEntityEvent e) {
        Entity ent = e.getRightClicked();
        if(ent.getType()==EntityType.VILLAGER) {
            if(ent.getCustomName().equals("Торгаш")) {
                e.getPlayer().sendMessage("Это наш моб");
            } else {
                e.getPlayer().sendMessage("Это не наш бом");
            }
        }
    }
 
Последнее редактирование:
Но единственное. Так нам без разницы где гуляет наш непис, мы его везде найдем.
Никто ж не виноват, что в ведре не реализован показ уидов.
Ну есть вариант с именем неписа, но это не самое уникальное значение.
Java:
    @EventHandler
    public void onPlayerInteract(PlayerInteractEntityEvent e) {
        Entity ent = e.getRightClicked();
        if(ent.getType()==EntityType.VILLAGER) {
            if(ent.getCustomName().equals("Торгаш")) {
                e.getPlayer().sendMessage("Это наш моб");
            } else {
                e.getPlayer().sendMessage("Это не наш бом");
            }
        }
    }
Нужна проверка есть ли у моба имя, а то NPE вылезет.
 
Java:
    @EventHandler
    public void onPlayerInteract(PlayerInteractEntityEvent e) {
        Entity ent = e.getRightClicked();
        if(ent.getType()==EntityType.VILLAGER && ent.getCustomName().isEmpty()) {
            if(ent.getCustomName().equals("Торгаш")) {
                e.getPlayer().sendMessage("Это наш моб");
            } else {
                e.getPlayer().sendMessage("Это не наш бом");
            }
        }
    }
 
Нет, это временный уид при загрузке чанка. А первое, то просто номер моба.
Ну хз. Токо что проверил, пробовал разгружать и загружать чанки с мобом, рестартить сервер, но uuid так и не сменился
 
Нет, это временный уид при загрузке чанка. А первое, то просто номер моба.
P.s citizens плагин не юзайте, там же nms ааа страшна :D.
Я вот аналог ситизенса себе склепал.
Ну как аналог, ситизенс весит 700 кб, а мой "аналог" - 60. Чисто под конкретные задачи. Для меня вполне хватает, и главное, что нмс там нет.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх