Добрый вечер, решил переписать flytype-скилы (Rush Impact, Shadow Step, Warp и тд) и на последнем этапе столкнулся с проблемой некорректной обработки движения после использования Charge-скилов.
Баг актуален для всех сборок на базе l2p (Так же актуально для l2gw) даже если не трогать изначальный код.
В чем суть:
Если после окончания каста (после срабатывания clearCastVars() и finishFly()) начать отбегать то подключается nextAction.MOVE (обрабатывается в PlayableAI). По окончанию бега если персонаж на стороне клиента не добегает до точки то его возвращает в последние координаты после каста (в координаты, что находится в переменной _flyLoc и возвращается функцией getFlyLoc()).
Соответственно бежать можно бесконечно и по итогу персонаж все равно окажется на "левых" координатах. При этом после окончания бега сработает пакет validatePosition и переместит/портанет персонажа в зависимости от diff между клиентом и сервером.
Данного бага не было на лайве лостворлда (в шарных сурсах он остался)
Подробней как это проявляется:
Собственно вопрос - кто-то фиксил этот момент? Такое чувство что он зарыт где-то в мув-листе
По наблюдениям - если заблокировать пакет Die то все ок.
В дебаге смены локации никаких отклонений нет, блокировка ValidatePosition и ValidateLocation ничего не дает (соотв они тут не при чем)
По наблюдениям - если заблокировать пакет Die то все ок.
В дебаге смены локации никаких отклонений нет, блокировка ValidatePosition и ValidateLocation ничего не дает (соотв они тут не при чем)
Взял l2gw, заблокировал ValidatePosition и ValidateLocation скриптом в хлапе
Код:
If ((FromClient) or (FromServer){нужное оставить}) and ((pck[1]=#$59) or (pck[1]=#$79)) then pck:='';
Проблему это никак не решает.
P.S: Но этой проблемы и не видно тк на gw анимация до конца не прорисовывается (персонаж должен откидывать мечь назад). Что бы она появилась достаточно набить инвентарь до перегруза например.
Убрал валидейтлокейшн и все заработало как надо. Т.е для большинства сборок этот момент решается банальным удалением ValidateLocation в finishFly и мелкими правками в ValidatePosition. В лостах ситуация аналогична? (Не могу проверить тк лень апать лостов до 8 явы)
Для примера взял фестов, форкнул все функции каста скилов, передвижения персонажа, базовые ai, пакеты валидации и передвижения, результат нулевой.
На чистом ft при блокировке пакетов все работает хорошо.
Чет приуныл, даже не представляю в какую сторону еще можно смотреть
Поставил чистые сурсы на которых начинал, зашел с клиента хф - при блокировке пакета ValidateLocation так же все работает.
Вообщем тема не актуальна, скорее всего при переходе до линдвиора закосячил с опкодами серверных пакетов и вместо нужных отсылаются левые.
Для костыльного фикса убрать вызов валидации локации в finishFly()
В ValidatePosition добавить исключения для CHARGE-скилов (См сурсы лостов)
В getFlyLoc для CHARGE-скилов поставить applyOffset(target.getLoc(), 45).
Для оффлайк - придется переписывать валидацию при передвижении персонажей оффлайк.
Нашел проблему - т.к я работаю с ГоДом проблема была в пакете FlyToLocation, который на клиенте ГоДа полностью переработан корейцами. Тк я включил старую анимацию раша MIX в Skillgrp словил баг. Скорее всего FlyToLocation считал полетом весь процесс передвижения и по окончанию портал в позицию цели.
В ГоДе клиент недопускает недолета чардж-скилами. В ХФ этот момент никак не контролируется этим пакетом.
Вернул анимацию DI рашу и спарсив култаймы с оффскриптов попутно переписав оффлайк-моменты отправки ValidateLocation изменив мувинг и ValidatePosition получил идеально работающий оффлайк-раш без единого бага но по ГоДу.
Так же для ГоД-разрабов - в MagicSkillUse и FlyToLoc необходимо шифтить координату Z на colRadius/2 иначе персонаж будет "проседать" по окончанию каста.
P.S: Если кто-то объяснит причем тут colRadius/2 был бы благодарен тк связи координаты Z и радиуса коллизии не пойму но на ОБТ Эртейи РПГ именно так.