Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Опкоды, Формулы, Клиент (http://mangos.ytdb.ru/forumdisplay.php?f=9)
-   -   Телепорт мобов (http://mangos.ytdb.ru/showthread.php?t=6449)

Easy 18.11.2012 21:11

Телепорт мобов
 
Подскажите, в каком направлении копать.
Есть например босс, Эхо Джайны в 4.3.4. У неё есть спелл "Скачок" 101812, да и любого другого с этим эффектом, например блинка мага
Цитата:

Effect 0: Id 29 (SPELL_EFFECT_LEAP)
BasePoints = 0
Targets (1, 46) (TARGET_UNIT_CASTER, TARGET_DEST_NEARBY_ENTRY)
При срабатывании спелла, она перемещается только на сервере.
То етсь визуально она в клиенте остаётся на месте, но бить её уже нельзя. Так как сервер считает что она далеко. Если начать идти то она сразу появится на том месте и начнет идти к игроку.

Я так понял по коду, что опкод MSG_MOVE_HEARTBEAT должен обновить состояние моба.
Он вроде как отправляется. Проверил парсером пакетов, с сервера этот пакет идёт только для игрока.
С клиента парсер не открывал, писал что не верный пакет. Удалил отправку перед пакетом PackGUID() парсер стал открывать, показывает правильный ID моба и координаты куда он переместился, но в клиенте не какой реакции...
Пытался в IDA посмотреть по номеру опкода, но там брекпоинты срабатывали только при отправки пакета от клиента.
То ли пакет не правильный и клиент его отвергает, то ли это вообще не тот пакет что нужен, то ли в клиенте при получении опкода, нет сравнения именно по числу, там же видимо как и в сервере, вызывается функция обработки опкода по полученному числу с сокета.

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

RomanRom2 19.11.2012 00:57

вам нужно использовать MSG_MOVE_TELEPORT, формат точно такой же, как любой другой MOVE пакет.

Easy 19.11.2012 01:56

Я думал в эту сторону. Просто этот пакет только для класса Player Отправляется. Я и думал что он для мобов не подойдёт. Попробую отправить для моба. Спасибо!

Всё действительно получилось! Ещё раз спасибо!

А почему тогда и в мангосе и в тринити после спеллеффекта SPELL_EFFECT_LEAP = 29
идёт выбор, для игрока отправляется MSG_MOVE_TELEPORT а для моба MSG_MOVE_HEARTBEAT?
MSG_MOVE_HEARTBEAT получается вообще ен нужно отправлять для моба? Это видимо из прошлых реализаций осталось...

Не подскажете ещё, во время прыжка у себя я вижу игрока нормально, а другие видят рывками мои прыжки. Это в какую сторону смотреть? :)

Amaru 19.11.2012 10:35

Цитата:

Не подскажете ещё, во время прыжка у себя я вижу игрока нормально, а другие видят рывками мои прыжки. Это в какую сторону смотреть?
Сплайны?

Easy 19.11.2012 12:22

Ну я думаю это сокрей всего связанно с опкодом или флагом.
При получении CMSG_MOVE_JUMP мы отсылаем всем игрокам SMSG_PLAYER_MOVE.
И уже клиент должен построить плавность прыжка. Не передаются же с сервера попиксельно расёт перемещения игрока.

Вот я смотрю, у Unit есть m_movementinfo (в Object) в котором есть позиция.
А есть просто m_position...
А флаги передвижения только в m_movementinfo.
Чем отличаются позиция в movementinfo от позиции в Unit.
Почему бы не сделать только в одном месте позицию?

RomanRom2 20.11.2012 01:32

чем отличается плеер от моба? правильно, ничем (объектную плеерскую надстройку не будет считать здесь). для этого юнита можно отправлять любые плеерские опкоды. можно хоть MSG_MOVE_STOP слать, с шагом 100 ярдов - и будет телепорт.

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

насколько я мог понять, сейчас все эти пакеты обрабатываются вообще одним обработчиком. с небольшими дополнительными "вставками" для некоторых опкодов. телепорт как раз в их числе.

изначально мув данные передавались внутри А9 и был соответствующий кейз в клиенте (стадия альфы 2004 и последующие некоторые беты). потом стали добавлять "новые фичи", связанные с мувементом, в виде новых опкодов. вполне резонно было вынести мув блок из А9 в отдельный обработчик и объеденить старые и новые опкоды. в новом варианте видимо по привычке часть данных А9 называют мувблоком, хотя формально их там давно нет, это ошибка.

один из транков моего сервера поддерживает альфу 0.5.3, что называется чисто на поржать :pardon:

причем я не стал тут реализовывать флаги и дополнительные блоки. вломы =)))

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

насчет m_movementInfo: "просто" m_position - выкинуть, правильно - разместить в m_movementInfo, в одном месте, все правильно.

чем отличается плеер от юнита? правильно, ничем :yes3: мувемент у них один.

Easy 20.11.2012 02:48

Вот я и хотел узнать, стоит ли выбросить просто m_position, так как по сути из за того что сейчас координаты в двух разных переменных хранятся, сервер работает с m_position а в пакеты вставляются с m_movement, приходится перед отправкой m_movement, да и при получении :) синхронизировать переменные, значит просто перепишу Get..., Set.., UpdatePosition... на movement.

А вот по поводу прыжков, я всё же думаю тут беда с флагами возможна.
Вот я прыгнул, на сервер ушел пакет
Цитата:

ClientToServer: MSG_MOVE_JUMP (0x7A06) Length: 49 ConnectionIndex: 0 Time: 11/19/2012 10:17:38.000 Number: 1399
Has timestamp: 0
Has transport: 0
Has pitch: 1
Has fall data: 1
Has Spline: 0
Has Spline Elevation: 1
Movement Flags: Root (2048)
Extra Movement Flags: InterpolateTurning (2048)
Timestamp: 6413937
Fall Cos: -0.07919062
Fall Sin: 0.9968595
Horizontal Speed: 0
Vertical Speed: -7.955547
Fall time: 0
Guid: Full: 0x00000002 Type: Player Low: 2 Name: Test
Position: X: 3043.357 Y: 524.4659 Z: 21.29399 O: 1.65007
По поводу флага Root не уверен, в мангосе и тринити флаг называется MOVEFLAG_FALLING
В парсере пакетов пишет MOVEFLAG_ROOT.

Чар у меня в клиенте летит плавно.
То есть здесь явно нет передачи с сервера координат полёта, клиент сам рассчитывает, при приземлении может быть небольшое дёрганье, вот тут как раз видимо из за синхронизации.
По поводу синхронизации картинки между клиентами я прочёл много... так как делал сервер для флешь игрушки небольшой.
Но тут вопрос не в том что картинка не совпадает. А в том что картинка идёт рывками. Раньше же, даже хотя бы в 3.3.5 не было такого. Да, рассихнронизации была, за прыжок разок дёргался бывало чар или после приземления, но пока летел было плавно.
Сейчас же он вообще не летит! Он просто дёргается, пропадает появляется в другом месте несколько раз за прыжок.
Видимо с сервера летят пакеты игрокам с местоположением.

Сейчас при получении любого MOVE пакета, уходит опкод MSG_PLAYER_MOVE с теми же данными. То етсь на прыжок ушел пакет
Цитата:

ServerToClient: SMSG_PLAYER_MOVE (0x79A2) Length: 29 ConnectionIndex: 0 Time: 11/19/2012 10:17:38.000 Number: 1400
Has spline data: 0
Extra Movement Flags: InterpolateTurning (2048)
Movement flags: Root (2048)
Timestamp: 129861
Guid: Full: 0x00000002 Type: Player Low: 2 Name: Test
Position: X: 3043.357 Y: 524.4659 Z: 21.29399 O: 1.65007
То есть флаги вроде как передаются... Почему же клиент других игроков не рисует точно так путь полёта :) Завтра ещё поэкспериментирую, может лишние пакеты летят во время прыжка, которые показывают расчётные координаты сервера.

Amaru 20.11.2012 09:28

Цитата:

Чар у меня в клиенте летит плавно.
То есть здесь явно нет передачи с сервера координат полёта, клиент сам рассчитывает, при приземлении может быть небольшое дёрганье, вот тут как раз видимо из за синхронизации.
Когда сам прыгаешь - да, тут сервер не играет роли. Когда видишь других прыгающих - это, само собой, то что пришло с сервера.
Подергивание при приземлении - это результат рассинхронизации (или, маловероятно, неверных флагов) и обработки СMSG_MOVE_FALL_LAND, которые шлется при касании земли после падения.

Касательно дерганий во время прыжка - таких не замечал. Вообще, вижу здесь шифрующегося юзера тринитей, так что признавайся - так это или нет xD

Вижу вот по какой причине:
Вроде бы с 4.2.x пакеты движений и SMSG_UPDATE_OBJECT стали битстримиться, также если раньше они передавали всю возможною информацию о движении объекта, то потом - только частично, с необходимыми для конкретной ситуации данными.
Таким образом, клиент шлет флаги в начале пакета, затем в зависимости от них сервер идентифицирует данные.

Флаги выглядят так:
Код:

        struct StatusInfo
        {
            StatusInfo() : hasFallData(false), hasFallDirection(false), hasOrientation(false),
                hasPitch(false), hasSpline(false), hasSplineElevation(false),
                hasTimeStamp(false), hasTransportTime2(false), hasTransportTime3(false) { }
            bool hasFallData        : 1;
            bool hasFallDirection  : 1;
            bool hasOrientation    : 1;
            bool hasPitch          : 1;
            bool hasSpline          : 1;
            bool hasSplineElevation : 1;
            bool hasTimeStamp      : 1;
            bool hasTransportTime2  : 1;
            bool hasTransportTime3  : 1;
        };

В мангосе такая штука хранится в MovementInfo и она же посылается в SMSG_PLAYER_MOVE, в тринитях она не хранится, а додумывается на основе имеющихся данных - мув флагов и тп.
Как выяснилось, наличие или отутсвие MOVEFLAG_FALLING никак не связано с присутствием fall information в пакете, а так как в тринитях об этом не знают, то и получается, что либо не она не шлется, когда она нужна, либо шлется неверная. Поэтому я и замутил эту штуку со StatusInfo.

Easy 20.11.2012 11:38

Я не шифруюсь, я раньше в темах писал что тринити юзаю :)
Просто там спрашивать не у кого, то ли не кто не знает то ли просто не кто не отвечает :)
А По поводу телепорта мобов, я компили мангос и проверял, тоже не работало, вот и не написал что тринити. А вот прыжки... да, что то я не проверил в мангосе.

по поводу movementinfo япочти все под мангос переделал, так как я понял что когда тринити это выдрали у мангоса, они не туда это запихнули как минимум, у них пакеты исходящие не перемешиваются... вот только структуру эту я и не перенёс :) Сегодня попробую перенести.

Easy 20.11.2012 16:26

Да, перенёс ещё немного кода с мангоса в тринити по мовементам и прыжки теперь плавные :)
Всё таки плохо, когда в тринити копируют код, даже не думая что он делает и как работает :)
Всем спасибо за помощь!

RomanRom2 20.11.2012 16:47

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

Amaru 20.11.2012 16:49

Цитата:

Сообщение от Easy (Сообщение 30045)
Да, перенёс ещё немного кода с мангоса в тринити по мовементам и прыжки теперь плавные :)
Всё таки плохо, когда в тринити копируют код, даже не думая что он делает и как работает :)
Всем спасибо за помощь!

Тринити копировали не с мангоса, я уже точно не помню откуда. Идентичная Тринитям наработка была в Strawberry, но там не было этой фичи StatusInfo.

Easy 20.11.2012 17:05

Вообщем я не думаю что тринити это сделано само, и те у кого они даже взяли, раз там сделано так же, то они тоже сделали не сами, раз оно у них есть но не работает значит они при копировании не до конца понимали как оно должно работать :)

Я вот ещё заметил, что Timestamp в пакетах от клиента не соответствует Timestamp пакетов от сервера :)
Цитата:

ClientToServer: MSG_MOVE_JUMP (0x7A06) Length: 49 ConnectionIndex: 0 Time: 11/20/2012 13:41:05.000 Number: 381
Timestamp: 18570979
Цитата:

ServerToClient: SMSG_PLAYER_MOVE (0x79A2) Length: 49 ConnectionIndex: 0 Time: 11/20/2012 13:41:05.000 Number: 383
Timestamp: 228764
Но вроде бы работает...

В тринити класс WorldObject наследует класс Position чреез класс WorldLocation. Так же как и Transport.
А значит вся инфа в movementinfo о положении юнитов и транспорта дублируется, но из за наследования нужно много кда перелопатить что бы все переделать :) А структура movement в тринити похоже не заполняется, перед отправкой приходится заполнять...


Текущее время: 13:14. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS