Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Опкоды, Формулы, Клиент

Важная информация

Опкоды, Формулы, Клиент Разбор и изучение взаимодействия клиента с сервером

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.11.2012, 21:11   #1
Easy
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
Easy На верном пути
По умолчанию Телепорт мобов

Подскажите, в каком направлении копать.
Есть например босс, Эхо Джайны в 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 посмотреть по номеру опкода, но там брекпоинты срабатывали только при отправки пакета от клиента.
То ли пакет не правильный и клиент его отвергает, то ли это вообще не тот пакет что нужен, то ли в клиенте при получении опкода, нет сравнения именно по числу, там же видимо как и в сервере, вызывается функция обработки опкода по полученному числу с сокета.

Если это тот пакет что нужен, подскажите хотя бы, может кто знает, по каким адресам можно найти обработку пакета в клиенте, входящего.
Easy вне форума   Ответить с цитированием
Старый 19.11.2012, 00:57   #2
RomanRom2
WowCore Dev
 
Аватар для RomanRom2
 
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
RomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всем
По умолчанию

вам нужно использовать MSG_MOVE_TELEPORT, формат точно такой же, как любой другой MOVE пакет.
RomanRom2 вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Easy (19.11.2012)
Старый 19.11.2012, 01:56   #3
Easy
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
Easy На верном пути
По умолчанию

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

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

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

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

Последний раз редактировалось Easy; 19.11.2012 в 02:29.
Easy вне форума   Ответить с цитированием
Старый 19.11.2012, 10:35   #4
Amaru
MaNGOS Dev
 
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
Amaru На верном пути
По умолчанию

Цитата:
Не подскажете ещё, во время прыжка у себя я вижу игрока нормально, а другие видят рывками мои прыжки. Это в какую сторону смотреть?
Сплайны?
Amaru вне форума   Ответить с цитированием
Старый 19.11.2012, 12:22   #5
Easy
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
Easy На верном пути
По умолчанию

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

Вот я смотрю, у Unit есть m_movementinfo (в Object) в котором есть позиция.
А есть просто m_position...
А флаги передвижения только в m_movementinfo.
Чем отличаются позиция в movementinfo от позиции в Unit.
Почему бы не сделать только в одном месте позицию?
Easy вне форума   Ответить с цитированием
Старый 20.11.2012, 01:32   #6
RomanRom2
WowCore Dev
 
Аватар для RomanRom2
 
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
RomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всем
По умолчанию

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

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

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

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

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

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

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

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

чем отличается плеер от юнита? правильно, ничем мувемент у них один.
RomanRom2 вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Easy (20.11.2012)
Старый 20.11.2012, 02:48   #7
Easy
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
Easy На верном пути
По умолчанию

Вот я и хотел узнать, стоит ли выбросить просто 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
То есть флаги вроде как передаются... Почему же клиент других игроков не рисует точно так путь полёта Завтра ещё поэкспериментирую, может лишние пакеты летят во время прыжка, которые показывают расчётные координаты сервера.
Easy вне форума   Ответить с цитированием
Старый 20.11.2012, 09:28   #8
Amaru
MaNGOS Dev
 
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
Amaru На верном пути
По умолчанию

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

Последний раз редактировалось Amaru; 20.11.2012 в 09:30.
Amaru вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Easy (20.11.2012)
Старый 20.11.2012, 11:38   #9
Easy
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
Easy На верном пути
По умолчанию

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

по поводу movementinfo япочти все под мангос переделал, так как я понял что когда тринити это выдрали у мангоса, они не туда это запихнули как минимум, у них пакеты исходящие не перемешиваются... вот только структуру эту я и не перенёс Сегодня попробую перенести.
Easy вне форума   Ответить с цитированием
Старый 20.11.2012, 16:26   #10
Easy
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
Easy На верном пути
По умолчанию

Да, перенёс ещё немного кода с мангоса в тринити по мовементам и прыжки теперь плавные
Всё таки плохо, когда в тринити копируют код, даже не думая что он делает и как работает
Всем спасибо за помощь!
Easy вне форума   Ответить с цитированием
Старый 20.11.2012, 16:47   #11
RomanRom2
WowCore Dev
 
Аватар для RomanRom2
 
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
RomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всем
По умолчанию

все мув пакеты нужно передавать как есть, со всеми флагами и соответствующими им дополнительными блоками. за исключением timestamp (у близзов оно называется m_moveStartTime), которое является одним из элементов синхронизации и расчитывается на сервере.
RomanRom2 вне форума   Ответить с цитированием
Старый 20.11.2012, 16:49   #12
Amaru
MaNGOS Dev
 
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
Amaru На верном пути
По умолчанию

Цитата:
Сообщение от Easy Посмотреть сообщение
Да, перенёс ещё немного кода с мангоса в тринити по мовементам и прыжки теперь плавные
Всё таки плохо, когда в тринити копируют код, даже не думая что он делает и как работает
Всем спасибо за помощь!
Тринити копировали не с мангоса, я уже точно не помню откуда. Идентичная Тринитям наработка была в Strawberry, но там не было этой фичи StatusInfo.
Amaru вне форума   Ответить с цитированием
Старый 20.11.2012, 17:05   #13
Easy
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
Easy На верном пути
По умолчанию

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

Я вот ещё заметил, что 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 в тринити похоже не заполняется, перед отправкой приходится заполнять...
Easy вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Телепорт в Логово Крыла Тьмы[s23460] Lightunit Баг-репорты 0 14.03.2011 09:39
Нет мобов, нет npc FreeZee Корзина 1 23.02.2011 14:46
[patch] Поднимаем мобов с дна Lightunit Отвергнутые патчи 11 25.09.2010 07:06
Передвижения мобов в отсутствие игрока brainreaver Корзина 3 05.08.2010 14:22
[9797][fix bug] телепорт вместо перелёта Chipleo Принятые патчи 1 27.04.2010 04:30


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot