CompoundNBT и список всех Entity

Версия Minecraft
1.15.2
API
Forge
48
1
4
Спавню моба, ему добавляю compoundNBT, в котором строка с рандомным HashCode
Теперь мне нужно найти количество этих Entity в мире с таким же хешем в compound.
Есть идеи, как?

Пробовал:
Java:
 public int getCountEntities() {
        int count = 0;
        assert Minecraft.getInstance().world != null;
        Iterable<Entity> iterator = Minecraft.getInstance().world.getAllEntities();
        for (Entity ent : iterator) {
            if (ent instanceof MonsterEntity) {
                CompoundNBT compoundNBT = new CompoundNBT();
                ent.read(compoundNBT);
                if (compoundNBT.contains("hashSpawnCode")) {
                    String hashCodeEntity = compoundNBT.getString("hashSpawnCode");
                    if (hashCodeEntity.equals(hashCode)) {
                        count++;
                    }
                }
            }
        }
        return count;
    }
Но на Minecraft.getInstance().world.getAllEntities(); ловится null
 
7,099
324
1,509
А тебе это нужно сделать на клиенте?
Minecraft.getInstance().world - онли для клиента.
Попробуй брать мир из другого места
 
48
1
4
А тебе это нужно сделать на клиенте?
Minecraft.getInstance().world - онли для клиента.
Попробуй брать мир из другого места
Неоткуда его больше брать, я это делаю в TileEntity, у него там есть свой World, но в нём нет такого метода, для того, чтобы найти всех Entity.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Открой класс World и посмотри внимательно. У меня нет под рукой 1.15.2, но в 1.12 там есть список loadedEntityList.

P.S И вообще ты делаешь полную чушь. Читаешь сущность из пустого нбт, соответственно полностью её ломаешь.

1615651486728.png

Опиши свою задачу. Уверен что ты выбрал неправильное направление.
 
48
1
4
Открой класс World и посмотри внимательно. У меня нет под рукой 1.15.2, но в 1.12 там есть список loadedEntityList.

P.S И вообще ты делаешь полную чушь. Читаешь сущность из пустого нбт, соответственно полностью её ломаешь.

Посмотреть вложение 11450

Опиши свою задачу. Уверен что ты выбрал неправильное направление
Мне нужен блок, возле которого в радиусе должны спавниться монстры до максимально количества (допустим 10) если монстров 10, то спавн должен прекратиться, если убили одного, то один ещё должен заспавниться если двух убили, то два должны заспавниться и т.д., с одинаковым периодом спавна.

Ход моих мыслей:
Я прикрутил к нему TileEntity, который реализует интерфейс ITickableTileEntity
В методе tick() я вычитаю из переменной счётчика -1 до следующего спавна монстра и проверяю, если эта переменная равна 0, то спавнить монстра, затем обнуляю её.
Java:
@Override
    public void tick() {
        if (countEntity < 10) {
            if (timeOutSpawn == 0) {
                createEntity();
            }
            decrement();
        }
        countEntity = getCountEntity();
    }
Далее подумал, что можно добавить для каждого TileEntity свою генерацию HashCode. Этот хеш будет даваться уникально для каждых мобов, заспавненных своим TileEntity.
И решил проверять, если мобов с таким хешем в мире уже 10, то блок будет переставать их спавнить (точнее его тайл).
 
7,099
324
1,509
Ну так для твоей задачи getEntitiesWithinAABB как раз подойдет. А еще тайл может при спауне энтити запоминать ее id. Или моб может запоминать тайл, и уменьшать его счетчик при смерти
 
7,099
324
1,509
AABB - это область, в которой будут искаться сущности. Т.к метод не принимает координаты точки отсчета, то координаты AABB должны быть абсолютными
 

tox1cozZ

aka Agravaine
8,454
598
2,890
И я вроде читаю не сущность из NBT, а NBT из сущности)
Ты должен вызывать метод write у сущности, чтобы записать её данные в твой нбт тэг.

Ты делаешь по сути ванильный спавнер. Открой его тайл и посмотри как там сделано. Там так же есть лимит по количеству мобов.
 
Сверху