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

Помогите Нахождение и удаление Entity

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

  1. Автор темы
    jamesg101

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

    Баллы:
    76
    Имя в Minecraft:
    jamesg101
    Всем привет. Столкнулся с такой проблемой, которую частично решил. Мне необходимо сделать зомби, которые через некоторое время удаляться, но у меня никак не получается хранить того самого зомби. Пробовал Entity, UUID, Location, даже чанк, на котором был Entity.

    Сейчас я храню Entity и через его локацию нахожу чанк, а в них всех ентити, сверяю UUID ентити и если он есть - удаляю. Частично - это работает, но иногда это возвращает null, при этом ентити живой.

    Помогите мне отыскать и удалить ентити.

    Код:
    public class ZombieClass {
    
        public static HashMap<UUID, ZombieClass> zombiesList = new HashMap<>();
    
        private Entity entity;
        private ZombieZoneClass zoneClass;
        private int deSpawnDelay;
    
        public ZombieClass(Entity entity, ZombieZoneClass zoneClass, int deSpawnDelay) {
            this.entity = entity;
            this.zoneClass = zoneClass;
            this.deSpawnDelay = deSpawnDelay;
            runTimer();
        }
    
        public Entity getEntity() {
            for (Entity entity : entity.getLocation().getChunk().getEntities()) if (entity.getUniqueId().equals(this.entity.getUniqueId())) return entity;
            return null;
        }
    
        public ZombieZoneClass getZoneClass() {
            return zoneClass;
        }
    
        public void runTimer() {
    
            BukkitRunnable runnable = new BukkitRunnable() {
    
                @Override
                public void run() {
    
                    if (!zombiesList.containsKey(entity.getUniqueId())) {
                        cancel();
                        return;
                    }
    
                    if (deSpawnDelay != 0) {
                        deSpawnDelay = deSpawnDelay - 1;
                        return;
                    }
    
                    if (getEntity() == null) {
                        Logger.log("Пустой ентити.");
                    } else getEntity().remove();
    
                    zoneClass.setZombieCount(zoneClass.getZombieCount() - 1);
                    zombiesList.remove(entity.getUniqueId());
                    cancel();
                }
            };
            runnable.runTaskTimer(Main.plugin, 1, 20);
        }
    }
     
  2. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Брать чанк используя зомби и искать его в нём. Гениально.
    Используй своего entity, если ты в конструктор null не передал (надо проверять) - он не может быть null.
     
  3. Автор темы
    jamesg101

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

    Баллы:
    76
    Имя в Minecraft:
    jamesg101
    Если я верну своего ентити, то после выгрузки чанков я получу шишку.

    Точнее Entity при отгрузке чанка не удалится, потому что ссылка на зомби в мире тупо стирается, а найти его снова я не знаю как.
     
    Последнее редактирование: 11 фев 2018
  4. Exception_Prototype

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

    Баллы:
    96
    Первое, что приходит в голову, то помечай его как нибудь. Как минимум вешай какой-то кастомный тег в NBTмоба. При выгрузке чанка проверяй кто выгружается и удаляй. Но это так, первое, что в голову пришло.
     
  5. CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    Вот код, надеюсь ты понимаешь что с ним делать
    Код:
      public static void zombie(Player p){
            // 10 является кол-вом зомби
            for(short i = 0; i < 10; i++){
                Zombie zombie = p.getWorld().spawn(p.getLocation(), Zombie.class);
                Bukkit.getScheduler().runTaskLater(Main.m, new Runnable() {
                  
                    @Override
                    public void run() {
                        zombie.remove();
                    }
                }, 200L); //200L - время
            }
        }
    
     
  6. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Код от @CriticaMobslps должен работать, если вдруг тебе Bukkit даст шишку - пиши.
     
  7. Автор темы
    jamesg101

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

    Баллы:
    76
    Имя в Minecraft:
    jamesg101
    Не думаю, что это сработает, т.к из всего выше: ссылка на объект другая после выгрузки и загрузки чанка.
     
  8. Автор темы
    jamesg101

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

    Баллы:
    76
    Имя в Minecraft:
    jamesg101
    А что, если я в ивенте ChunkUnloadEvent буду проверять всех ентити в нем и отменять, если там есть мой зомби?
     
  9. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Чем тебе uuid не нравится?
     
  10. Автор темы
    jamesg101

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

    Баллы:
    76
    Имя в Minecraft:
    jamesg101
    Да прекл то в том, что мне надо как-то ентити находить в мире, а разгруженные чанки спигот не хранит.
     
  11. AtomicScience

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

    Баллы:
    76
    Имя в Minecraft:
    AtomicScience
    Тогда пусть если на момент сработки раннебла идет проверка на наличие зомби в мире - если есть - удалять, если нет - добавить UUID в список и отлавливать эвент подгрузки чанка
     
  12. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ну так и в чем проблема, в разгруженном чанке нету энтитей соответсвенно в мире тоже
     

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