Всем доброго дня, у меня возник вопрос по внутренностям сервера. Решил я на досуге изучить java и покопать сборку Please login or register to view links, первый раз взялся изучать сервер айона, да и вообще сервер, и решил сразу же делом попытаться пофиксить известный мне баг, а именно: моб встает на одно место и не двигается/атакует после того, как 2 раза с коротким интервалом (где-то <3 сек) отагрится за препятствием, параметр cansee в geoКонфиге. Изучая структуру сервера, я пришел к выводу, что за поведение нпс отвечает некий ai2, но когда я закоментил все строки, которые отсылали к геодате и ничего не поменялось (мобы вели себя так, как будто геодата включена). Ну думаю ладно, попробую пойти от обратного, нашел единственный в сборке GeoService, в котором используется параметр cansee из конфигов, в нем был метод, который рассчитывает возможность видимости цели в игре. Что бы подтвердить свою догадку, я скомпилил сервер и в методе с расчетами стер всё, и поставил всегда true на выдачу. Захожу на сервер, и что я вижу? Ничего не поменялось! Мобы как отагривались за стенами, так и отагриваются, выключаю cansee в конфигах и перестают отагриватся, т.е. мои манипуляции не дали никакого эффекта. Так вот, скажите пожалуйста, как вообще связаны поведение мобов и геодата в сервере айона?
в правильном направлении ищешь , посмотри что в ядре отвечает за вкл\выкл cansee и от него отталкивайся . а вообще по сути гео двиг кривой нах (( , нужно полностью переписывать , вроде один чел занялся но хз что получится ( не Алекс )))
Перекопал весь сервер, но так и не смог понять, как нпс взаимодействуют с геодатой. Какие бы запросы к гео я не перестраивал, даже вручную задавал переменную cansee в конфигах через исходники (убирал считывание с файла), всё равно работает как надо.
Хочу сделать так, что бы в конфигах cansee было включено, а на деле не работало. Вроде бы разобрался, что и как связано, но на деле при изменении ничего не происходит. Пытался даже менять GeoDataConfig с Спойлер: 1 @Property(key = "gameserver.geodata.cansee.enable", defaultValue = "true") public static boolean CANSEE_ENABLE; на Спойлер: 2 final public static boolean CANSEE_ENABLE=false; но в игре ничего не изменилось. Это я уже объяснить не могу, т.к. конфиги больше никуда не пишутся, насколько я понял
Какие изменения ты хочешь увидеть?) Это проверка на препятствие,если тебе нужно исправить баг с зависанием мобов при частом отагре, это отдельно фиксить во всех сборках. Если ты хочешь чтобы мобы обходили препятствие - такого с роду в шаровых сборках не было никогда. Выруби canSee и мобы будут сквозь тексты ходить, но и игроки смогут дамажить сквозь тексты, тогда какой тебе смысл от гео будет? И что это за наркомания "в конфиге включено а не деле нет"
Я понял суть бага, он делает проверку cansee когда моб агрится, т.е. либо момент агра либо начало движения, т.к. если зайти за препятствие когда моб уже начал движение, то он отагрится только когда попытается атаковать/передвигаться ещё в вашу сторону. Но проблема в том, что все мои изменения в геосервисе и аи2 вообще не возымели эффекта, хотя я нашёл через компилер все обращения к cansee и почистил их. "в конфиге включено а на деле нет" я пытаюсь сделать, что бы понять, в правильном ли направлении иду
я если честно не понимаю чем тебе помочь потому что не понимаю что ты хочешь.Перерой всю сборку меняй аи там или сервисы осад может оно тебе поможет, потому что по моему мнению ты лезишь непонятно куда непонятно зачем. Формулируй мысль правильно. Пока
это ты про этот рейтинг говоришь, что неучам помогаешь и плюсики ставят? И что-ж это за форум такой хороший что рейтинг здеся имеет значение больше чем рейтинг знаний?)
Please login or register to view links, а сам то ты кто такой ? (хотя я догадываюсь ) Да фикс о котором ты говоришь есть в нормальных сборках и даже в шаре.
А ты кто ?) епт, было бы что править. Запускаем сборку в отладке, включаем логирование и смотрим по каким причинам моб ведет себя именно так и какие методы в этот момент работают\не работают в сборке. Дальше смотрим что может этому мешать и делаем следующее: В MoveTaskManager добавить метод: public Creature getCreature(Creature creature) { return movingCreatures.get(creature.getObjectId()); } В NpcMoveController в методе moveToTargetObject() под условием if (started.compareAndSet(false, true)) добавляем: else if (MoveTaskManager.getInstance().getCreature(owner) == null && owner.getAi2().getState() == AIState.FIGHT && owner.getTarget() != null) { owner.getAi2().onGeneralEvent(AIEventType.TARGET_GIVEUP); } Сложно пиздец да?
Проблема, как оказалось, была не в соурсах, а в папке, откуда я запускал клиент. Непонятно откуда, там оказался старый компил сервера под другим названием, и я его долго не замечал, а он всё это время грузился вместо нового, что я скидывал в libs, вот на сервере ничего и не менялось)