Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

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

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

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

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

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

    Ваши предложения?
     
  2. Хостинг MineCraft
    <
  3. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    getNearbyEntities
     
  4. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    Я знаю как отследить, прочитай топик[DOUBLEPOST=1486492073,1486491999][/DOUBLEPOST]Мне нужно узнать, через что лучше отслеживать, с минимальной нагрузкой
     
  5. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Юзай асинхронный шедулер и не будет вешать основной поток сервера.
     
  6. jusik

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

    Баллы:
    66
    Skype:
    louky94096
    Имя в Minecraft:
    Jusik
    Код:
          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()]);
            }
    Код:
    for (Entity entity : getNearbyEntities(loc, radius)){
    }
     
  7. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    Вопрос еще 1, как это будет реализовано, мне нужно, что бы постоянно мобы чекали игроков в радиусе 100 блоков, если игрок есть, устанавливать на его цель, если я буду чекать игроков, даже каждую секунду, это же огромная нагрузка, не так ли?
     
  8. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Да не то чтобы огромная. Каждая живая энтитя же каждые 10-60 тиков ищет других живых энтитей.
    А вообще я бы просто расширил nms класс и докидывал бы им свой таск в AI.
     
  9. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ничего докидывать не нужно по сути. Просто повысить им радиус обнаружения. В том же кастом нпс радиус до 64 увеличивается.
     
  10. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    А каким образом, что бы была минимальня нагрузка?[DOUBLEPOST=1486647374,1486647303][/DOUBLEPOST]
    Код этого метода можно?
     
  11. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    копай nms.
    Это одно дело. Другое дело если мобам надо следовать за каким либо определённым EntityType.
     
  12. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    Так каким образом МНЕ увеличивать радиус детекта у мобов?
    Пример не дашь?
     
  13. AtomicInteger

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

    Баллы:
    46
    Изменение логики мобов.
     
  14. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    Смотрел это, там можно скорость увеличить, но как увеличить радиус обнаружения
     
  15. AtomicInteger

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

    Баллы:
    46
    По аналогии, соотв.
     
  16. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    В NMS вообще не охото пока лезть ибо не умею с ним работать
     
  17. AtomicInteger

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

    Баллы:
    46
    Ага, то есть, напишите мне код, что бы я мог вставить и запустить.
     
  18. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    Какой наивный, я спрашиваю, как лучше это сделать, через ведро-шудуллер или еще как то, если через шудуллер, то как сделать его с минимальной нагрузкой, имею ввиду, не код, а интервал детекта и т.д
     
  19. AtomicInteger

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

    Баллы:
    46
    Уже ответили.Лучше всего изменять логику моба непосредственно в классе этого моба.Каждый моб это объект, у которого есть свой набор атрибутов.Этот набор выражен полями класса.Среди этих полей есть и нужное тебе, отвечающее за радиус обнаружения.Пример его изменения я указал по ссылке выше, тебе осталось только найти нужный параметр.Вот тебе для примера код класса Блейза:
    Код:
        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);
        }
    Видишь что-нибудь знакомое?
     
  20. Автор темы
    IcedwinterZ

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

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    Не вижу.

    Переопределить поля можно?
     
  21. AtomicInteger

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

    Баллы:
    46
    Вот тебе ещё код класса GenericAttributes:
    Код:
        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);
        }
    Это уже уровень абстракции пониже, чем выше.Конечно, остались и непонятные названия переменных, но глянув на логику работы с ними, понять как это работает не так уж и сложно.
     

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