Телепорт мобов
Подскажите, в каком направлении копать.
Есть например босс, Эхо Джайны в 4.3.4. У неё есть спелл "Скачок" 101812, да и любого другого с этим эффектом, например блинка мага Цитата:
То етсь визуально она в клиенте остаётся на месте, но бить её уже нельзя. Так как сервер считает что она далеко. Если начать идти то она сразу появится на том месте и начнет идти к игроку. Я так понял по коду, что опкод MSG_MOVE_HEARTBEAT должен обновить состояние моба. Он вроде как отправляется. Проверил парсером пакетов, с сервера этот пакет идёт только для игрока. С клиента парсер не открывал, писал что не верный пакет. Удалил отправку перед пакетом PackGUID() парсер стал открывать, показывает правильный ID моба и координаты куда он переместился, но в клиенте не какой реакции... Пытался в IDA посмотреть по номеру опкода, но там брекпоинты срабатывали только при отправки пакета от клиента. То ли пакет не правильный и клиент его отвергает, то ли это вообще не тот пакет что нужен, то ли в клиенте при получении опкода, нет сравнения именно по числу, там же видимо как и в сервере, вызывается функция обработки опкода по полученному числу с сокета. Если это тот пакет что нужен, подскажите хотя бы, может кто знает, по каким адресам можно найти обработку пакета в клиенте, входящего. |
вам нужно использовать MSG_MOVE_TELEPORT, формат точно такой же, как любой другой MOVE пакет.
|
Я думал в эту сторону. Просто этот пакет только для класса Player Отправляется. Я и думал что он для мобов не подойдёт. Попробую отправить для моба. Спасибо!
Всё действительно получилось! Ещё раз спасибо! А почему тогда и в мангосе и в тринити после спеллеффекта SPELL_EFFECT_LEAP = 29 идёт выбор, для игрока отправляется MSG_MOVE_TELEPORT а для моба MSG_MOVE_HEARTBEAT? MSG_MOVE_HEARTBEAT получается вообще ен нужно отправлять для моба? Это видимо из прошлых реализаций осталось... Не подскажете ещё, во время прыжка у себя я вижу игрока нормально, а другие видят рывками мои прыжки. Это в какую сторону смотреть? :) |
Цитата:
|
Ну я думаю это сокрей всего связанно с опкодом или флагом.
При получении CMSG_MOVE_JUMP мы отсылаем всем игрокам SMSG_PLAYER_MOVE. И уже клиент должен построить плавность прыжка. Не передаются же с сервера попиксельно расёт перемещения игрока. Вот я смотрю, у Unit есть m_movementinfo (в Object) в котором есть позиция. А есть просто m_position... А флаги передвижения только в m_movementinfo. Чем отличаются позиция в movementinfo от позиции в Unit. Почему бы не сделать только в одном месте позицию? |
Вот я и хотел узнать, стоит ли выбросить просто m_position, так как по сути из за того что сейчас координаты в двух разных переменных хранятся, сервер работает с m_position а в пакеты вставляются с m_movement, приходится перед отправкой m_movement, да и при получении :) синхронизировать переменные, значит просто перепишу Get..., Set.., UpdatePosition... на movement.
А вот по поводу прыжков, я всё же думаю тут беда с флагами возможна. Вот я прыгнул, на сервер ушел пакет Цитата:
В парсере пакетов пишет MOVEFLAG_ROOT. Чар у меня в клиенте летит плавно. То есть здесь явно нет передачи с сервера координат полёта, клиент сам рассчитывает, при приземлении может быть небольшое дёрганье, вот тут как раз видимо из за синхронизации. По поводу синхронизации картинки между клиентами я прочёл много... так как делал сервер для флешь игрушки небольшой. Но тут вопрос не в том что картинка не совпадает. А в том что картинка идёт рывками. Раньше же, даже хотя бы в 3.3.5 не было такого. Да, рассихнронизации была, за прыжок разок дёргался бывало чар или после приземления, но пока летел было плавно. Сейчас же он вообще не летит! Он просто дёргается, пропадает появляется в другом месте несколько раз за прыжок. Видимо с сервера летят пакеты игрокам с местоположением. Сейчас при получении любого MOVE пакета, уходит опкод MSG_PLAYER_MOVE с теми же данными. То етсь на прыжок ушел пакет Цитата:
|
Цитата:
Подергивание при приземлении - это результат рассинхронизации (или, маловероятно, неверных флагов) и обработки СMSG_MOVE_FALL_LAND, которые шлется при касании земли после падения. Касательно дерганий во время прыжка - таких не замечал. Вообще, вижу здесь шифрующегося юзера тринитей, так что признавайся - так это или нет xD Вижу вот по какой причине: Вроде бы с 4.2.x пакеты движений и SMSG_UPDATE_OBJECT стали битстримиться, также если раньше они передавали всю возможною информацию о движении объекта, то потом - только частично, с необходимыми для конкретной ситуации данными. Таким образом, клиент шлет флаги в начале пакета, затем в зависимости от них сервер идентифицирует данные. Флаги выглядят так: Код:
struct StatusInfo Как выяснилось, наличие или отутсвие MOVEFLAG_FALLING никак не связано с присутствием fall information в пакете, а так как в тринитях об этом не знают, то и получается, что либо не она не шлется, когда она нужна, либо шлется неверная. Поэтому я и замутил эту штуку со StatusInfo. |
Я не шифруюсь, я раньше в темах писал что тринити юзаю :)
Просто там спрашивать не у кого, то ли не кто не знает то ли просто не кто не отвечает :) А По поводу телепорта мобов, я компили мангос и проверял, тоже не работало, вот и не написал что тринити. А вот прыжки... да, что то я не проверил в мангосе. по поводу movementinfo япочти все под мангос переделал, так как я понял что когда тринити это выдрали у мангоса, они не туда это запихнули как минимум, у них пакеты исходящие не перемешиваются... вот только структуру эту я и не перенёс :) Сегодня попробую перенести. |
Да, перенёс ещё немного кода с мангоса в тринити по мовементам и прыжки теперь плавные :)
Всё таки плохо, когда в тринити копируют код, даже не думая что он делает и как работает :) Всем спасибо за помощь! |
все мув пакеты нужно передавать как есть, со всеми флагами и соответствующими им дополнительными блоками. за исключением timestamp (у близзов оно называется m_moveStartTime), которое является одним из элементов синхронизации и расчитывается на сервере.
|
Цитата:
|
Вообщем я не думаю что тринити это сделано само, и те у кого они даже взяли, раз там сделано так же, то они тоже сделали не сами, раз оно у них есть но не работает значит они при копировании не до конца понимали как оно должно работать :)
Я вот ещё заметил, что Timestamp в пакетах от клиента не соответствует Timestamp пакетов от сервера :) Цитата:
Цитата:
В тринити класс WorldObject наследует класс Position чреез класс WorldLocation. Так же как и Transport. А значит вся инфа в movementinfo о положении юнитов и транспорта дублируется, но из за наследования нужно много кда перелопатить что бы все переделать :) А структура movement в тринити похоже не заполняется, перед отправкой приходится заполнять... |
Текущее время: 13:14. Часовой пояс GMT +3. |
ru-mangos.ru - Русское сообщество MaNGOS