Помогите Отслеживание энтити в радиусе, наиболее оптимальное решение

IcedwinterZ

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
IcedwinterZ
Как мне регулярно отслеживать энтити в радиусе, при этом не коцая производительность, код не нужен, просто ваше мнение, наиболее оптимального решения этой задачи?

Лично я, хотел через PlayerMoveEvent потом, забил на это дело, потому-что его юзает АнтиЧит, и что будет с сервером проверять я конечно не стал...

Потом хотел по шудуллеру проверять всех игроков, позже, чекать энтитей в радиусе (мне это решение показалось еще более не рациональным, и как и в первом случае, я забил на него)...

Ваши предложения?
 
JavaScript:
      public static Entity[] getNearbyEntities(Location l, int radius) {
            int chunkRadius = radius < 16 ? 1 : (radius - (radius % 16)) / 16;
            HashSet <Entity> radiusEntities = new HashSet < Entity > ();
       
            for (int chX = 0 - chunkRadius; chX <= chunkRadius; chX++) {
                for (int chZ = 0 - chunkRadius; chZ <= chunkRadius; chZ++) {
                    int x = (int) l.getX(), y = (int) l.getY(), z = (int) l.getZ();
                    for (Entity e: new Location(l.getWorld(), x + (chX * 16), y, z + (chZ * 16)).getChunk().getEntities()) {
                        if (e.getLocation().distance(l) <= radius && e.getLocation().getBlock() != l.getBlock())
                            radiusEntities.add(e);
                    }
                }
            }
       
            return radiusEntities.toArray(new Entity[radiusEntities.size()]);
        }
JavaScript:
for (Entity entity : getNearbyEntities(loc, radius)){
}
 
Юзай асинхронный шедулер и не будет вешать основной поток сервера.
Вопрос еще 1, как это будет реализовано, мне нужно, что бы постоянно мобы чекали игроков в радиусе 100 блоков, если игрок есть, устанавливать на его цель, если я буду чекать игроков, даже каждую секунду, это же огромная нагрузка, не так ли?
 
это же огромная нагрузка, не так ли?
Да не то чтобы огромная. Каждая живая энтитя же каждые 10-60 тиков ищет других живых энтитей.
А вообще я бы просто расширил nms класс и докидывал бы им свой таск в AI.
 
Да не то чтобы огромная. Каждая живая энтитя же каждые 10-60 тиков ищет других живых энтитей.
А вообще я бы просто расширил nms класс и докидывал бы им свой таск в AI.
Ничего докидывать не нужно по сути. Просто повысить им радиус обнаружения. В том же кастом нпс радиус до 64 увеличивается.
 
Код этого метода можно?
копай nms.
Ничего докидывать не нужно по сути. Просто повысить им радиус обнаружения. В том же кастом нпс радиус до 64 увеличивается.
Это одно дело. Другое дело если мобам надо следовать за каким либо определённым EntityType.
 
Ага, то есть, напишите мне код, что бы я мог вставить и запустить.
Какой наивный, я спрашиваю, как лучше это сделать, через ведро-шудуллер или еще как то, если через шудуллер, то как сделать его с минимальной нагрузкой, имею ввиду, не код, а интервал детекта и т.д
 
Какой наивный, я спрашиваю, как лучше это сделать, через ведро-шудуллер или еще как то, если через шудуллер, то как сделать его с минимальной нагрузкой, имею ввиду, не код, а интервал детекта и т.д
Уже ответили.Лучше всего изменять логику моба непосредственно в классе этого моба.Каждый моб это объект, у которого есть свой набор атрибутов.Этот набор выражен полями класса.Среди этих полей есть и нужное тебе, отвечающее за радиус обнаружения.Пример его изменения я указал по ссылке выше, тебе осталось только найти нужный параметр.Вот тебе для примера код класса Блейза:
Java:
    protected void initAttributes() {
        super.initAttributes();
        this.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(6.0D);
        this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.23000000417232513D);
        this.getAttributeInstance(GenericAttributes.FOLLOW_RANGE).setValue(48.0D);
    }
Видишь что-нибудь знакомое?
 
Вот тебе ещё код класса GenericAttributes:
Java:
    static {
        maxHealth = (new AttributeRanged((IAttribute)null, "generic.maxHealth", 20.0D, 0.1D, SpigotConfig.maxHealth)).a("Max Health").a(true);
        FOLLOW_RANGE = (new AttributeRanged((IAttribute)null, "generic.followRange", 32.0D, 0.0D, 2048.0D)).a("Follow Range");
        c = (new AttributeRanged((IAttribute)null, "generic.knockbackResistance", 0.0D, 0.0D, 1.0D)).a("Knockback Resistance");
        MOVEMENT_SPEED = (new AttributeRanged((IAttribute)null, "generic.movementSpeed", 0.699999988079071D, 0.0D, SpigotConfig.movementSpeed)).a("Movement Speed").a(true);
        ATTACK_DAMAGE = new AttributeRanged((IAttribute)null, "generic.attackDamage", 2.0D, 0.0D, SpigotConfig.attackDamage);
    }
Это уже уровень абстракции пониже, чем выше.Конечно, остались и непонятные названия переменных, но глянув на логику работы с ними, понять как это работает не так уж и сложно.
 
Назад
Верх