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

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);
    }
}
 
Код:
public Entity getEntity() {
       for (Entity entity : entity.getLocation().getChunk().getEntities()) if (entity.getUniqueId().equals(this.entity.getUniqueId())) return entity;
       return null;
   }
Брать чанк используя зомби и искать его в нём. Гениально.
Используй своего entity, если ты в конструктор null не передал (надо проверять) - он не может быть null.
 
Брать чанк используя зомби и искать его в нём. Гениально.
Используй своего entity, если ты в конструктор null не передал (надо проверять) - он не может быть null.
Если я верну своего ентити, то после выгрузки чанков я получу шишку.

Точнее Entity при отгрузке чанка не удалится, потому что ссылка на зомби в мире тупо стирается, а найти его снова я не знаю как.
 
Последнее редактирование:
Первое, что приходит в голову, то помечай его как нибудь. Как минимум вешай какой-то кастомный тег в NBTмоба. При выгрузке чанка проверяй кто выгружается и удаляй. Но это так, первое, что в голову пришло.
 
Всем привет. Столкнулся с такой проблемой, которую частично решил. Мне необходимо сделать зомби, которые через некоторое время удаляться, но у меня никак не получается хранить того самого зомби. Пробовал 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);
    }
}
Вот код, надеюсь ты понимаешь что с ним делать
Код:
  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 - время
        }
    }
 
Если я верну своего ентити, то после выгрузки чанков я получу шишку.

Точнее Entity при отгрузке чанка не удалится, потому что ссылка на зомби в мире тупо стирается, а найти его снова я не знаю как.
Код от @CriticaMobslps должен работать, если вдруг тебе Bukkit даст шишку - пиши.
 
Не думаю, что это сработает, т.к из всего выше: ссылка на объект другая после выгрузки и загрузки чанка.
 
А что, если я в ивенте ChunkUnloadEvent буду проверять всех ентити в нем и отменять, если там есть мой зомби?
 
Да прекл то в том, что мне надо как-то ентити находить в мире, а разгруженные чанки спигот не хранит.

Тогда пусть если на момент сработки раннебла идет проверка на наличие зомби в мире - если есть - удалять, если нет - добавить UUID в список и отлавливать эвент подгрузки чанка
 
Да прекл то в том, что мне надо как-то ентити находить в мире, а разгруженные чанки спигот не хранит.
Ну так и в чем проблема, в разгруженном чанке нету энтитей соответсвенно в мире тоже
 
Назад
Верх